[Fuzzing 101] 퍼징으로 1-day 취약점 분석하기(tcpdump)

들어가며

TCPdump는 패킷 분석 도구이다. TCPdump 4.9.2에서 발생하는 CVE-2017-13028을 분석한다.

CVE-2017-13028는 OOB(Out-of-bounds) 취약점이다. 버퍼 범위 바깥의 인덱스에 접근할 때 발생하며, BOOTP 패킷(Bootstrap Protocol)에서 발생한다.

공격자는 서비스 거부를 발생시키거나 프로세스 메모리에서 의도하지 않은 중요 정보를 탈취할 수 있다.

준비

1-day 실습이므로 취약점이 발생했던 같은 환경을 준비한다. 또는 다음의 내용을 학습할 수 있다.

다음의 내용을 학습한다.

  • ASAN(Address Sanitizer), 런타임 메모리 에러 탐지 도구
  • 퍼징을 위해 ASAN을 사용하는 방법
  • ASAN을 이용한 크래시 분석 방법

Download and Build

1. 대상 프로그램 다운 및 빌드

cd $HOME
mkdir fuzzing_tcpdump && cd fuzzing_tcpdump/

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

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

 

2. tcpdump가 libpcap.a의 로컬 경로를 찾기 위해 파일의 이름을 변경해야한다.

mv libpcap-libpcap-1.8.0/ libpcap-1.8.0
mv libpcap-libpcap-1.8.0/ libpcap-1.8.0

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

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

 

3. 실행확인

실행 시 tcpdump version 4.9.2, libpcap version 1.8.0 확인

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

Seed corpus creation

./tests 폴더 내에 많은 .pcap 파일 예제를 확인할 수 있다. 아래의 명령으로 예제 파일 확인 가능하다.

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

Address Sanitizer

ASan(Address Sanitizer)는 C와 C++를 위한 메모리 에러 탐색기이다. Google에 의해 개발되었고 2011년 5월 처음으로 릴리즈되었다.

컴파일러 설치 모듈과 런타임 라이브러리로 구성되어 있다. 힙, 스택 및 글로벌 객체에 대한 OOB 접근 뿐만 아니라 UAF(Use after Free), double free, 메모리 leak 등의 버그를 찾을 수 있다.

Address Sanitizer는 오픈 소스 이며 버전 3.1부터 LLVM 컴파일러 도구 체인과 통합되어 있다. 원래 LLVM용 프로젝트로 개발되었지만 GCC로도 포팅되어 4.8 버전 이상에 포함되어 있다.

자세한 정보는 https://clang.llvm.org/docs/AddressSanitizer.html 에서 확인할 수 있다.

Build with ASan

tcpdump와 libpcap을 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

 

configure과 make를 호출하기 전 AFL_USE_ASAN=1을 설정한다.

cd $HOME/fuzzing_tcpdump/libpcap-1.8.0/
export LLVM_CONFIG="llvm-config-11"
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

Fuzzing

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 @@

Triage

ASan으로 빌드된 프로그램을 디버깅하는 것은 이전 실습보다 쉽다. 프로그램에 충돌 파일만 인자로 주고 실행하면 된다.

$HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r '/home/antonio/fuzzing_tcpdump/out/default/crashes/id:000001,sig:06,src:010578,time:24952968,execs:15373398,op:havoc,rep:4’

 

반응형