퍼징(fuzzing)이란 무엇인가?
어플리케이션에 무작위 변수를 무차별 적으로 대입하여 시스템을 fuzz 시키는것
이를 통해 시스템의 취약점은 찾을 수 있다.
두가지의 fuzzing 방법
Mutation vs. Generation
Mutation의 경우 입력값을 순수하게 랜덤으로 돌려 무작위로 append하거나 replace 한다
Generation의 경우는 입력 값의 포맷을 이해하고 범위를 제한 해주는 대입
|구분 | Mutation | Generation|
|장점 | 이해 필요x | 이해만 한다면 시간 절약 가능 |
| 단점 | 경계값이 불 분명함 | 어려운 난이도|
따라서 상황에 따라 적절한 방법을 섞어 사용해야 할것이다(눕인 나는 mutation만..)
그렇다면 퍼징을 하는 방법은?
현재 퍼징을 할 수 있는 수 많은 파이썬 모듈들이 오픈소스로 풀려있다 따라서 깃허브를 뒤지다보면 쉽게 찾을 수 있다
- afl-python: enables American fuzzy lop fork server and instrumentation for pure-Python code
- Sulley: fuzzer development and fuzz testing framework consisting of multiple extensible components
- Peach Fuzzing Platform: extensible fuzzing framework for generation and mutation based fuzzing (v2 was written in Python)
- antiparser: fuzz testing and fault injection API
- TAOF, (The Art of Fuzzing) including ProxyFuzz, a man-in-the-middle non-deterministic network fuzzer
- untidy: general purpose XML fuzzer
- Powerfuzzer: highly automated and fully customizable web fuzzer (HTTP protocol based application fuzzer)
- SMUDGE
- Mistress: probe file formats on the fly and protocols with malformed data, based on pre-defined patterns
- Fuzzbox: multi-codec media fuzzer
- Forensic Fuzzing Tools: generate fuzzed files, fuzzed file systems, and file systems containing fuzzed files in order to test the robustness of forensics tools and examination systems
- Windows IPC Fuzzing Tools: tools used to fuzz applications that use Windows Interprocess Communication mechanisms
- WSBang: perform automated security testing of SOAP based web services
- Construct: library for parsing and building of data structures (binary or textual). Define your data structures in a declarative manner
- fuzzer.py (feliam): simple fuzzer by Felipe Andres Manzano
- Fusil: Python library used to write fuzzing programs
출처: https://github.com/dloss/python-pentest-tools
하지만 본격적으로 툴을 사용하기전에 간단한 코딩을 통해 원리를 파악하는 것이 더 중요하다고 생각한다
따라서 기본적인 예제를 통해 원리를 익힐 것이다
https://www.slideshare.net/CodeEngn/2012-codeengn-conference-06-beist-everyone-has-his-or-her-own-fuzzer
codeengn에서 발표된 fuzz에 대해 도움이 될 수 있는 자료를 찾았다
원리는 간단하지만 근본 적인 fuzz 알고리즘을 이해 시켜 줄 수 있는 예시이다
import os, sys, random
def go():
return random.randrange(0, 0x100)
while 1:
filesize = os.path.getsize("./fuz.bin")
fp = open("./fuz.bin", "rb++")
tmpoffset = random.randrange(0, filesize)
fp.seek(tmpoffset, 0)
fp.write("%c%c%c%c" % (go(), go(), go(), go()))#입력값 삽입
fp.close()
os.system("./fuz.bin")#실행
실제로 위의 10줄 짜리 코드가 크래쉬를 일으키는 것을 볼 수 있었다.
향후
Tool 을 사용하여 실제로 오류가 난 지점을 벡터로 활용해 원하는 작업을 실행하는 방법을 강구하고 실습 해볼 것