안녕하세요. 오늘 포스팅할 주제는 Boofuzz Fuzzing입니다.
Boofuzz는 네트워크 프로토콜 퍼징 프레임워크 입니다.
AFL++ 은 소스코드가 있는 바이너리에 대한 퍼징에서 유리하다면 Boofuzz는 네트워크 프로토콜에 대해서 장점을 가집니다.
예를들면, IoT/임베디드 기기나, 프로토콜 구조에 맞춰서 퍼징을 할 경우 유리합니다.
간단하게 BooFuzz와 AFL++의 차이에 대해 표로 작성해보겠습니다.
| BooFuzz | AFL++ | |
| 작동 원리 | 프로토콜 구조에 맞춰서 데이터를 생성하여 전송 | 유효한 Seed값의 비트를 이용해 Mutatioon하여 주입 |
| 사전 지식 | 프로토콜 구조를 알고, 스크립트로 정의가 필요함 | 입력 데이터 샘플 필요 |
| 피드백 방식 | Black-Box : 대상의 크래시 여부만 확인 | Grey-Box : 코드의 어느 부분이 실행되었는지 실시간 추적 |
| 주 사용처 | 네트워크 프로토콜 | 파일 파싱 라이브러리, 바이너리 프로그램 |
| 속도 | 상대적으로 느림(네트워크 대기 필요) | 매우 빠름 |
BooFuzz의 장점은 다음과 같습니다.
- 소스 코드가 없어도 됨
- 복잡한 상태 기반 프로토콜 처리 가능
- Python으로 작성되므로 높은 커스터마이징 능력
- 웹 인터페이스를 제공하여, 시각적으로 파악하기가 편함
BooFuzz의 단점입니다.
- 사용자가 직접 프로토콜의 구조를 정의해야하고, 정의가 부정확할경우 퍼징 효과 ↓
- 블라인드 퍼징이므로, 프로그램의 깊은 코드 경로를 찾을 때 AFL에 비해 효율이 떨어짐
제가 최근에 AFL과 angr을 결합한 하이브리드 퍼징에 관한 논문을 읽고있는데, 나중에 포스팅할거지만 해당 논문은 깊은 코드 경로를 찾기 위해 퍼징이 잘 못하는 specific input찾는걸 angr에 넘기고, 특정 compartment에 대한 탐색을 AFL++로 탐색하는 하이브리드 퍼징 툴인 Drill에 대한 논문입니다.
BooFuzz가 네트워크 프로토콜 대상으로 퍼징이 가능한 게 엄청난 강점이란 생각이 들지만, 깊은 코드 경로를 찾지 못하는 점이 최신 트렌드나 AI와의 결합성에 대해서는 좀 약점이 뚜렷하다는 생각이 듭니다.
BooFuzz의 설치입니다
BooFuzz는 pwntools와 마찬가지로 파이썬 라이브러리기 때문에 가상환경으로 진행해주는게 좋습니다.
python3 -m venv Boofuzz
pip install boofuzz
퍼징을 테스트하기 위한 테스트 서버 파일을 만들겠습니다.
다음과 같이 기본적으로 데이터를 받고, 출력하는 간단한 코드입니다.
위의 서버에는 딱히 취약점이 존재하지 않습니다.
다음으로 퍼징코드를 만들어보겠습니다.
위의 코드로 퍼징 툴을 불러옵니다.
세션을 설정해서 아까 127.0.0.1:9999로 연결을 열고
프로토콜을 정의합니다.
여기서 s_로 시작하는 함수들이 패킷을 블록 조립하듯이 만들어줍니다.
fuzzable=True로 설정되어있거나 fuzzable이 설정되지 않은 값에 대해서만 값을 변경하면서 퍼징을 진행합니다.
위와 같은 코드의 경우 "HELLO @@@@@\n"의 방식으로 퍼징이 진행됩니다.
처음에는 "HELLO WORLD"를 보내다가 퍼징 횟수가 쌓일수록 변형이 많이 될 것입니다.
연결하고 퍼징을 시작합니다.

첫번째 터미널에 test 서버를 열어줬습니다.

두번째 터미널에 퍼징 테스트 파일을 실행시켜주면 순식간에 몇백개의 로그가 찍히게 됩니다.
두 터미널 창을 같이 보면

이렇게 됩니다.
순식간에 120개가 넘는 공격을 보내네요
로컬 주소를 입력하면 웹 인터페이스도 확인할 수 있습니다.

127.0.0.1:26000 주소를 입력하면 사이트에 접속해서 정보를 확인할 수 있습니다.
이제 서버파일을 살짝 변경해서 취약점을 만들어보겠습니다.
데이터 길이가 500 이상일 시 서버를 닫는 코드를 추가했습니다.

퍼징이 20번도 되기 전에 크래시가 발생하는 모습입니다.
제가 서버 파일을 그냥 client.close()를 써서 CRASH가 기록되진 않네요.
일단 이렇게 간단하게 Boofuzz를 이용한 퍼징을 실습해보았습니다.
한번 써보니까 동작하는게 이해가 잘되네요.
아무런 정보 없이 퍼징만으로 쉘을 획득하거나 하는건 상당히 힘들어 보이지만, 특정 지점에서 버퍼오버플로우가 발생한다던가 하는 정보가 있을경우 규격을 미리 설정 해주고, 랜덤값을 마구 넣어서 버퍼오버플로우의 주소값 맞추기나 이런걸 할 땐 상당히 쓸만해 보입니다.
저번에 프로젝트로 시도하다 만 펌웨어 분석이 있는데 조금 다듬어서 펌웨어 분석에 써볼만하지 않을까 싶습니다만 서버가 계속 죽고 살아나고 해야하기때문에 실제 환경 구축을 어떻게 할지도 고민을 해봐야겠습니다.
읽어주셔서 감사합니다~
'취약점분석 > Fuzzing' 카테고리의 다른 글
| Hybrid Fuzzing - 2 ( SymCC + AFL ) (0) | 2026.01.15 |
|---|---|
| Hybrid Fuzzing - 1 ( 실패일지 ) (0) | 2026.01.15 |
| SymCC Fuzzing - 1 ( Symbolic executor ) (0) | 2026.01.11 |
| [Fuzzing] AFL++ Fuzzing (0) | 2026.01.08 |