
현재 완전히 다시 작성 중입니다. 초점은 우선 stdin에서만 입력을 받는 대화형 리눅스 애플리케이션에 맞춰질 것입니다. Shellphish의 Driller 및 Fuzzer 기능을 사용하려고 시도 중입니다.
현재 상태의 autoPwn은 제한된 형태로 이 작업을 수행합니다. autoPwn ./binary를 실행한 다음 Start 옵션을 선택하기만 하면 됩니다.
여기서 모든 종속성 문제를 고려할 때, autoPwn을 실행하는 가장 쉬운 방법은 Docker 빌드를 사용하는 것입니다. --security-opt 및 --cap-add 문을 제거할 수 있지만 일부 퍼징 기능이 작동하지 않을 수 있습니다.
$ sudo docker pull bannsec/autoPwn
$ sudo docker run -it -v $PWD:/mount --security-opt="apparmor=unconfined" --cap-add=SYS_PTRACE -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix/ bannsec/autopwn
Docker 빌드에서는 모든 것이 준비되어 있어야 합니다. 다음 명령으로 도구를 간단히 시작할 수 있습니다:
$ autoPwn ./file
autoPwn은 프로젝트를 퍼징하기 위한 소스 컴파일을 더 쉽게 만들어 줍니다. 이를 돕기 위해 autoPwnCompile이 만들어졌습니다. 소스 코드를 지정하고 옵션을 제공하면 퍼징할 준비가 된 실행 파일이 출력됩니다.
usage: autoPwnCompile [-h] [--file FILE] [--ASAN | --MSAN] [--UBSAN]
[--fuzzer FUZZER]
Compile source to binaries for use in autoPwn.
optional arguments:
-h, --help show this help message and exit
--file FILE Single file to compile.
--ASAN Enable ASAN (default off)
--MSAN Enable MSAN (default off)
--UBSAN Enable UBSAN (default off)
--fuzzer FUZZER (optional) What fuzzer to compile for. Options are:
['AFL']. Default is AFL.
다음은 autoPwn의 이전 버전에 대한 내용입니다..
autoPwn은 단순한 스크립트에 붙인 거창한 이름입니다. afl-fuzz로 퍼징할 때 동일한 작업을 계속 반복한다는 것을 알게 되었습니다. 그래서 다음과 같은 기능을 수행하는 스크립트를 만들고자 했습니다:
현재까지 스크립트는 처음 5가지를 수행할 수 있습니다. 6번째는 아직 개발 중이며, angr 기호 실행 엔진을 활용하여 가능한 초기 경로를 생성하려고 시도 중입니다. 그 시점이 되면 스크립트는 이론적으로 간단한 퍼징 작업을 완전히 자동화할 수 있을 것입니다.
TUCTF의 "WoO2"라는 최근 챌린지를 살펴보겠습니다. 필요한 익스플로잇을 반드시 찾는 것은 아니지만, autoPwn이 경로 발견을 간소화하는 데 어떻게 사용될 수 있는지 보여줍니다.
프로그램 기본 실행 과정입니다:
$ ./e67eb287f23011a40ef5bd5c2ad2f48ca97834cf
Welcome! I don't think we're in Kansas anymore.
We're about to head off on an adventure!
Select some animals you want to bring along.
Menu Options:
1: Bring a lion
2: Bring a tiger
3: Bring a bear
4: Delete Animal
5: Exit
Enter your choice:
1
Choose the type of lion you want:
1: Congo Lion
2: Barbary Lion
1
Enter name of lion:
Test
Menu Options:
1: Bring a lion
2: Bring a tiger
3: Bring a bear
4: Delete Animal
5: Exit
Enter your choice:
5
간단한 입력 테스트 케이스를 만들어 봅시다:
$ cat in/1
1
1
Test
5
이제 퍼저를 쉽게 시작할 수 있습니다:
$ autoPwn
Setting up fuzz configuration
Target Binary (full or relative path): e67eb287f23011a40ef5bd5c2ad2f48ca97834cf
Command line args:
Number of cores (default: 8):
Test Case Dir (default: 'in/'):
Test Case Dir (default: 'out/'):
Max memory (default: 200): 4096
Starting fuzz
autoPwn> s
status check tool for afl-fuzz by <[email protected]>
Individual fuzzers
==================
>>> SESSION007 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION000 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION002 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION006 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION004 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION001 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION005 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION003 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
Summary stats
=============
Fuzzers alive : 8
Total run time : 0 days, 0 hours
Total execs : 0 million
Cumulative speed : 8 execs/sec
Pending paths : 8 faves, 8 total
Pending per fuzzer : 1 faves, 1 total (on average)
Crashes found : 0 locally unique
autoPwn> h
autoPwn
s == fuzzer (s)tatus
e == collect (e)xploits
a == collect (a)ll paths
m == (m)inimize corpus
q == (q)uit
여기서 발생한 일은 스크립트가 몇 가지 기본값(사용 가능한 코어 수 결정 포함)을 생성한 것입니다. QEMU에서 실행하기 위해 추가 메모리가 필요했기 때문에 기본값 하나를 변경했습니다. autoPwn은 설정 파일을 생성하여 afl-utils (https://github.com/rc0r/afl-utils)에 전달했습니다. 설정 파일에서는 CPU 선호도도 설정하여 기본적으로 최적의 퍼징이 이루어지도록 했습니다.
이 시점에서 컴퓨터는 퍼징을 열심히 수행하고 있습니다. 하지만 퍼징의 핵심 측면 중 하나는 코퍼스를 최소화하는 것입니다. 이러한 점을 고려하여 autoPwn은 afl-fuzz 인스턴스를 모니터링하여 변이 시리즈가 완료되는 시점을 감지합니다. 완료되면 퍼징을 중지하고(최적은 아니지만 지금은 괜찮습니다), 코퍼스를 최소화한 후 퍼징을 다시 시작합니다. 이 모든 과정이 사람의 개입 없이 자동으로 이루어지므로, 실행해두고 잊을 수 있습니다.
어느 시점에 afl이 찾은 경로를 확인하고 싶을 수 있습니다. "a" 명령을 실행하면 autoPwn이 알려진 모든 경로를 복사하고, 코퍼스를 최소화한 후 각 케이스 자체를 최소화하여 출력 디렉터리에 제공합니다.