세 번째 예제는 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에서 메모리 제한을 비활성화한다.
원하는 크래시가 안 나왔기 때문에 다른 글 참조해서 분석해봐야겠다..
크래시 분류
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/antonio-morales/Fuzzing101/tree/main/Exercise%203
'background > fuzzing' 카테고리의 다른 글
[fuzzing101] Exercise 3 - TCPdump (CVE-2017-13028) (2) (0) | 2024.04.05 |
---|---|
[fuzzing101] Exercise 2 - libexif (CVE-2009-3895 & CVE-2012-2836) (2) (1) | 2024.04.01 |
[fuzzing101] Exercise 2 - libexif (CVE-2009-3895 & CVE-2012-2836) (1) (0) | 2024.03.30 |
[fuzzing101] Exercise 1 - Xpdf (CVE-2019-13288) (0) | 2024.03.27 |