들어가며
TCPdump는 패킷 분석 도구이다. TCPdump 4.9.2에서 발생하는 CVE-2017-13028을 분석한다.
CVE-2017-13028는 OOB(Out-of-bounds) 취약점이다. 버퍼 범위 바깥의 인덱스에 접근할 때 발생하며, BOOTP 패킷(Bootstrap Protocol)에서 발생한다.
공격자는 서비스 거부를 발생시키거나 프로세스 메모리에서 의도하지 않은 중요 정보를 탈취할 수 있다.
준비
1-day 실습이므로 취약점이 발생했던 같은 환경을 준비한다. 또는 다음의 내용을 학습할 수 있다.
- Ubuntu 20.04(https://releases.ubuntu.com/20.04/)
- afl-fuzz(Fuzzer)
- GDB(크래시 분석 디버깅 도구)
다음의 내용을 학습한다.
- 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’
'Reversing' 카테고리의 다른 글
[Fuzzing 101] 퍼징으로 1-day 취약점 분석하기(LibXML) (0) | 2022.08.05 |
---|---|
[Fuzzing 101] 퍼징으로 1-day 취약점 분석하기(LibTIFF) (0) | 2022.08.01 |
[Fuzzing 101] 퍼징으로 1-day 취약점 분석하기(libexif) (0) | 2022.07.24 |
[리버싱] DynamoRIO, Lighthouse로 코드커버리지 분석하기 (0) | 2022.07.19 |
[GDB] 사용법 (0) | 2022.07.15 |