background/fuzzing

[fuzzing101] Exercise 3 - TCPdump (CVE-2017-13028) (1)

ssongk 2024. 4. 4. 02:12

세 번째 예제는 TCPdump 패킷 분석기 퍼징이다.

목표는 TCPdump 4.9.2에서 CVE-2017-13028에 대한 크래시/PoC를 찾는 것이다.

 

CVE-2017-13028은 BOOTP 패킷(부트스트랩 프로토콜)을 통해 트리거될 수 있는 OOB read 취약점이다.
https://www.cvedetails.com/cve/CVE-2017-13028/

 

근데 설명을 보면 4.9.2에 패치된 걸로 나와있다.

그래서 4.9.1로 설치하고 진행했다.

 

환경


해당 예제는 ubuntu 20.04 버전을 권장하고 있으며
vmware 파일을 제공하고 있다.

https://drive.google.com/file/d/1_m1x-SHcm7Muov2mlmbbt8nkrMYp0Q3K/view?usp=sharing

(pw: fuzz)

 

타겟 다운로드 및 빌드



프로젝트 디렉터리 생성

cd $HOME
mkdir fuzzing_tcpdump && cd fuzzing_tcpdump/

 

tcpdump 4.9.1 다운로드

wget https://github.com/the-tcpdump-group/tcpdump/archive/refs/tags/tcpdump-4.9.2.tar.gz
tar -xzvf tcpdump-4.9.2.tar.gz

 

tcpdump에 필요한 크로스 플랫폼 라이브러리인 libpcap가 필요하므로

libpcap-1.8.0.tar.gz 다운로드

wget https://github.com/the-tcpdump-group/libpcap/archive/refs/tags/libpcap-1.8.0.tar.gz
tar -xzvf libpcap-1.8.0.tar.gz

 

libpcap-libpcap-1.8.0을 libpcap-1.8.0로 rename한다.

(안 하면 tcpdump가 libpcap.a 로컬 경로 못 찾음)

mv libpcap-libpcap-1.8.0/ libpcap-1.8.0

 

libpcap 빌드 및 설치

cd $HOME/fuzzing_tcpdump/libpcap-1.8.0/
./configure --enable-shared=no
make

 

tcpdump 빌드 및 설치

cd $HOME/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/
./configure --prefix="$HOME/fuzzing_tcpdump/install/"
make
make install

 

설치된 버전 확인

$HOME/fuzzing_tcpdump/install/sbin/tcpdump -h

 

 

Seed corpus


"./tests"에 많은 .pcacp 예제가 있다.

다음 명령줄을 사용하여 이러한 .pcap 파일을 실행할 수 있다.

$HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r [.pcap file]

 

 

AddressSanitizer (ASan)


AddressSanitizer(ASan)는 C 및 C++용 빠른 메모리 오류 감지기이다.

컴파일러 계측 모듈과 런타임 라이브러리로 구성되며

힙, 스택 및 전역 개체에 대한 OOB, use-after-free, double-free 및 메모리 누수 버그를 찾을 수 있다.

AddressSanitizer는 오픈 소스이며 버전 3.1부터 LLVM 컴파일러 도구 체인과 통합되어 있다.

원래 LLVM용 프로젝트로 개발되었으나 GCC로 포팅되어 GCC 버전 >= 4.8에 포함되었다고 한다.

아래 링크에서 더 자세한 내용을 확인할 수 있다.

https://clang.llvm.org/docs/AddressSanitizer.html

 

 

ASan을 활성화하여 빌드


이전에 컴파일된 모든 개체 파일과 실행 파일을 정리한다.

rm -r $HOME/fuzzing_tcpdump/install
cd $HOME/fuzzing_tcpdump/libpcap-1.8.0/
make clean

cd $HOME/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/
make clean

 

ASAN이 활성화된 tcpdump 및 libpcap를 빌드한다.

(혹시 이전 libexif 때 처럼 버전 이슈 날까봐 11말고 12로 했다)

cd $HOME/fuzzing_tcpdump/libpcap-1.8.0/
export LLVM_CONFIG="llvm-config-12"
CC=afl-clang-lto ./configure --enable-shared=no --prefix="$HOME/fuzzing_tcpdump/install/"
AFL_USE_ASAN=1 make

cd $HOME/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/
AFL_USE_ASAN=1 CC=afl-clang-lto ./configure --prefix="$HOME/fuzzing_tcpdump/install/"
AFL_USE_ASAN=1 make
AFL_USE_ASAN=1 make install

 

 

퍼징


afl-fuzz -m none -i $HOME/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/tests/ -o $HOME/fuzzing_tcpdump/out/ -s 123 -- $HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r @@

64비트 시스템의 ASAN은 많은 가상 메모리를 요청한다.

그래서 "-m none" 옵션으로 AFL에서 메모리 제한을 비활성화한다.

 

하루 돌려도 bootp 관련 크래시가 안 나옴 ㅡㅡ

 

원하는 크래시가 안 나왔기 때문에 다른 글 참조해서 분석해봐야겠다..

 

 

크래시 분류


ASan으로 구축된 프로그램을 디버깅하는 것은 이전 연습보다 훨씬 쉽다.

프로그램에 크래시 파일을 던지기만 하면 된다.

$HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r '/home/antonio/fuzzing_tcpdump/out/default/crashes/id:000000,sig:06,src:002318+001583,time:10357087,op:splice,rep:8'

 

공식 수정 사항:

https://github.com/the-tcpdump-group/tcpdump/commit/85078eeaf4bf8fcdc14a4e79b516f92b6ab520fc#diff-05f854a9033643de07f0d0059bc5b98f3b314eeb1e2499ea1057e925e6501ae8L381

 


 

https://github.com/antonio-morales/Fuzzing101/tree/main/Exercise%203

 

Fuzzing101/Exercise 3 at main · antonio-morales/Fuzzing101

An step by step fuzzing tutorial. A GitHub Security Lab initiative - antonio-morales/Fuzzing101

github.com