[SYSTEM HACKING] Peach Fuzzer를 통해 Application 분석 2 - Application Fuzzing for Exploit
Peach Fuzzer를 이용한 프로그램 Fuzzing 에 대한 내용을 다룹니다. 설치 방법은 아래 포스팅 참고하셔서 진행하시면 됩니다.
[SYSTEM HACKING] Peach Fuzzer를 통해 Application 분석 1 - Install Peach Fuzzer
Peach Fuzzer는 여러 플랫폼을 공통으로 지원하는 Fuzzer 입니다. 파일로만 봐도 Linux, Windows , MacOS까지 두루두루 다 지원합니다.
ls
Aga.Controls.dll PacketDotNet.dll Peach.Core.Test.OS.Windows.dll PeachLinuxCrashHandler.exe.config SuperSocket.SocketBase.dll Be.Windows.Forms.HexBox.dll Peach.Core.ComContainer.exe Peach.Core.Test.OS.Windows.dll.mdb PeachLinuxCrashHandler.exe.mdb SuperSocket.SocketBase.pdb Be.Windows.Forms.HexBox.dll.config Peach.Core.ComContainer.exe.config Peach.Core.Test.OS.Windows.xml PeachMinset.exe SuperWebSocket.dll CrashableServer Peach.Core.ComContainer.exe.mdb Peach.Core.Test.dll PeachMinset.exe.config SuperWebSocket.pdb CrashingFileConsumer Peach.Core.OS.Linux.dll Peach.Core.Test.dll.mdb PeachMinset.exe.mdb bblocks32.so CrashingProgram Peach.Core.OS.Linux.dll.mdb Peach.Core.Test.xml PeachNetworkFuzzer.exe cedge32.so Ionic.Zip.dll Peach.Core.OS.Linux.xml Peach.Core.WindowsDebugInstance.exe PeachNetworkFuzzer.exe.config gdb IronPython.Modules.dll Peach.Core.OS.OSX.dll Peach.Core.WindowsDebugInstance.exe.config PeachNetworkFuzzer.exe.mdb log4net.dll IronPython.dll Peach.Core.OS.OSX.dll.mdb Peach.Core.WindowsDebugInstance.exe.mdb PeachValidator.exe nunit.framework.dll IronRuby.Libraries.Yaml.dll Peach.Core.OS.OSX.xml Peach.Core.dll PeachValidator.exe.config peach IronRuby.Libraries.dll Peach.Core.OS.Windows.dll Peach.Core.dll.mdb PeachValidator.exe.mdb peach-3.1.124-linux-x86-debug.zip IronRuby.dll Peach.Core.OS.Windows.dll.mdb Peach.Core.xml PeachXmlGenerator.exe peach.xsd Lib Peach.Core.OS.Windows.xml Peach.exe PeachXmlGenerator.exe.config pin Microsoft.Dynamic.dll Peach.Core.Test.OS.Linux.dll Peach.exe.config PeachXmlGenerator.exe.mdb samples Microsoft.Scripting.Metadata.dll Peach.Core.Test.OS.Linux.dll.mdb Peach.exe.mdb Renci.SshNet.dll samples_png Microsoft.Scripting.dll Peach.Core.Test.OS.Linux.xml PeachFuzzBang.exe SharpPcap.dll template.xml NLog.config.template Peach.Core.Test.OS.OSX.dll PeachFuzzBang.exe.config SharpPcap.dll.config testFile.xml NLog.dll Peach.Core.Test.OS.OSX.dll.mdb PeachFuzzBang.exe.mdb SuperSocket.Common.dll Newtonsoft.Json.dll Peach.Core.Test.OS.OSX.xml PeachLinuxCrashHandler.exe SuperSocket.Common.p
Peach Fuzzer를 이용하여 Application Fuzzing 하기
PeachFuzzer는 미리 타겟 프로그램과 설정을 xml 파일로 지정하고, 해당 XML 파일을 Peach의 인자값으로 넘겨 Fuzzing 을 수행하게 됩니다.
XML에서 사용되는 속성은 아래와 같습니다.
Data Model: defines the protocol or file format we want to fuzz. State Model: used for controlling the flow of the fuzzing process. Publisher: I/O interface that we can use to read data from a file/socket, write data to a file/socket, etc. Mutators: takes an existing input test case and changes it a little bit to make it invalid. Agents: the Peach process that needs to run on the target system, which is used to restart the fuzzed server if it crashes. Monitors: are used to capture the network traffic, attaching a debugger to the target process, etc. Logger: saves the crashes and input test cases into a file for later analysis.
1. Fuzzing 을 위한 XML 파일 작성
vim noon.xml
<?xml version="1.0" encoding="utf-8"?>
<Peach xmlns="http://peachfuzzer.com/2012/Peach" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://peachfuzzer.com/2012/Peach ../peach.xsd">
<DataModel name="TestTemplate">
<String name="TheString" value="Hello World!" />
</DataModel>
<StateModel name="State" initialState="Initial">
<State name="Initial">
<Action name="SendValue1" type="output">
<DataModel ref="TestTemplate" />
</Action>
<Action name="SendValue2" type="output">
<DataModel ref="TestTemplate" />
</Action>
</State>
</StateModel>
<Agent name="LocalAgent">
<Monitor class="LinuxDebugger">
<Param name="Executable" value="./CrashableServer" />
<Param name="Arguments" value="127.0.0.1 4244" />
</Monitor>
</Agent>
<Test name="Default">
<Agent ref="LocalAgent" />
<StateModel ref="State"/>
<Publisher class="Tcp">
<Param name="Host" value="127.0.0.1" />
<Param name="Port" value="8080" />
</Publisher>
<Logger class="Filesystem">
<Param name="Path" value="Logs" />
</Logger>
</Test>
</Peach>
<!-- end -->
2. peach 명령을 통해 Fuzzing 실행
./peach –debug noon.xml
[[ Peach v3.1.124.0 [[ Copyright (c) Michael Eddington
[*] Test ‘Default’ starting with random seed 21414. Peach.Core.Agent.Agent StartMonitor: Monitor LinuxDebugger Peach.Core.Agent.Agent SessionStarting: Monitor Peach.Core.OS.Linux.Agent.Monitors.LinuxDebugger Wrote gdb commands to ‘/tmp/gdb.2gN1C8/gdb.cmd’ Peach.Core.OS.Linux.Agent.Monitors.LinuxDebugger _Start(): Starting gdb process Establishing the listener…
establish listener error: 98 [Inferior 1 (process 11801) exited with code 03]
[R1,-,-] Performing iteration Peach.Core.Engine runTest: Performing recording iteration. Peach.Core.OS.Linux.Agent.Monitors.LinuxDebugger _Start(): Starting gdb process Establishing the listener…
establish listener error: 98
Program received signal SIGINT, Interrupt. 0xf7ea8794 in _exit () from /lib/i386-linux-gnu/libc.so.6 Crash detected, running exploitable. File “/home/noon/Noon/Peach_Fuzzer/gdb/exploitable/exploitable.py”, line 170 print “\n”.join(disas[max(pos-5,0):pos+5]) ^ SyntaxError: invalid syntax Peach.Core.Dom.Action Run: Adding action to controlRecordingActionsExecuted Peach.Core.Dom.Action ActionType.Output Peach.Core.Publishers.TcpClientPublisher start() Peach.Core.Publishers.TcpClientPublisher open() Peach.Core.Publishers.TcpClientPublisher output(12 bytes) Peach.Core.Publishers.TcpClientPublisher
00000000 48 65 6C 6C 6F 20 57 6F 72 6C 64 21 Hello World!
Peach.Core.Dom.Action Run: Adding action to controlRecordingActionsExecuted Peach.Core.Dom.Action ActionType.Output Peach.Core.Publishers.TcpClientPublisher output(12 bytes) Peach.Core.Publishers.TcpClientPublisher
00000000 48 65 6C 6C 6F 20 57 6F 72 6C 64 21 Hello World!
Peach.Core.Publishers.TcpClientPublisher close() Peach.Core.Publishers.TcpClientPublisher Shutting down connection to 127.0.0.1:8080 Peach.Core.Publishers.TcpClientPublisher Read 1732 bytes from 127.0.0.1:8080 Peach.Core.Publishers.TcpClientPublisher
00000000 48 54 54 50 2F 31 2E 31 20 32 30 30 20 4F 4B 0D HTTP/1.1 200 OK· 00000010 0A 43 6F 6E 6E 65 63 74 69 6F 6E 3A 20 63 6C 6F ·Connection: clo 00000020 73 65 0D 0A 43 61 63 68 65 2D 63 6F 6E 74 72 6F se··Cache-contro 00000030 6C 3A 20 6E 6F 2D 63 61 63 68 65 0D 0A 50 72 61 l: no-cache··Pra 00000040 67 6D 61 3A 20 6E 6F 2D 63 61 63 68 65 0D 0A 43 gma: no-cache··C 00000050 61 63 68 65 2D 63 6F 6E 74 72 6F 6C 3A 20 6E 6F ache-control: no 00000060 2D 73 74 6F 72 65 0D 0A 58 2D 46 72 61 6D 65 2D -store··X-Frame- 00000070 4F 70 74 69 6F 6E 73 3A 20 44 45 4E 59 0D 0A 0D Options: DENY··· 00000080 0A 3C 68 74 6D 6C 3E 3C 68 65 61 64 3E 3C 74 69 ·<html><head><ti 00000090 74 6C 65 3E 42 75 72 70 20 53 75 69 74 65 20 46 tle>Burp Suite F 000000A0 72 65 65 20 45 64 69 74 69 6F 6E 3C 2F 74 69 74 ree Edition</tit 000000B0 6C 65 3E 0D 0A 3C 73 74 79 6C 65 20 74 79 70 65 le>··<style type 000000C0 3D 22 74 65 78 74 2F 63 73 73 22 3E 0D 0A 62 6F =”text/css”>··bo 000000D0 64 79 20 7B 20 62 61 63 6B 67 72 6F 75 6E 64 3A dy { background: 000000E0 20 23 64 65 64 65 64 65 3B 20 66 6F 6E 74 2D 66 #dedede; font-f 000000F0 61 6D 69 6C 79 3A 20 41 72 69 61 6C 2C 20 73 61 amily: Arial, sa 00000100 6E 73 2D 73 65 72 69 66 3B 20 63 6F 6C 6F 72 3A ns-serif; color: 00000110 20 23 34 30 34 30 34 32 3B 20 2D 77 65 62 6B 69 #404042; -webki 00000120 74 2D 66 6F 6E 74 2D 73 6D 6F 6F 74 68 69 6E 67 t-font-smoothing 00000130 3A 20 61 6E 74 69 61 6C 69 61 73 65 64 3B 20 7D : antialiased; …snip..
./Logs/각각 xml 이름의 폴더 하단에 log 데이터가 저장됩니다. Burp Suite 를 켜놓고, Burp Port 에 대해 테스트를 진행해서, burp에도 데이터가 굉장히 많이 넘어왔더군요..
이런 형태로, XML을 지정하고 peach를 통해 xml을 파싱하여 Fuzzing 작업이 동작합니다. TCP/WEB 이외에도 여러가지 포맷을 지원하고, 플랫폼 또한 영향받지 않아 넓은 형태의 Fuzzing 작업을 수행할 수 있네요.
Peach Fuzzer XML 문법(Syntax)
초반에 진행하던 중 가장 막힌 부분이 Peach Fuzzer 만의 문법(?)을 익히는게 어려웠습니다. XML 문법을 따라가지만, 각각 속성 별 의미가 다르고 타겟이나 플랫폼에 따라 다양한 형태의 속성 값들을 사용해야 하기 때문에 어느정도 Tutorial 문서에 많이 의존할 수 밖에 없었습니다.
peach fuzzer 설치 경로 하단의 samples 디렉토리 안 xml 파일들을 보시면 대략적인 구조는 이해가 가실 겁니다.
크게 분류를 나누어 보자면
General Conf : Fuzzing 자체 전반적인 설정 Data Modeling : 데이터 모델링 State Modeling : 상태 모델링 Agents : Fuzzing Data 수집을 위한 Agent 에 대한 내용입니다. Test : 테스트 Target에 대한 내용입니다.
로 구성됩니다. General Conf, Data Modeling,State Modeling 이 3부분은 Sample 파일이나 Tutorial 보시면 좀 편합니다.
주로 테스트에서 다뤄야할 부분은 Agents, Test 부분인데요.
일단 Agents 부터 볼까합니다. Agents는 Fuzzing 되는 데이터를 수집하고 분석하는 부분을 나타내며, 크게 각각 OS별 Monitor로 구성되어 있습니다. Windows Monitors Windows Debugger Monitor Cleanup Registry Monitor Page Heap Monitor Popup Watcher Monitor Windows Service Monitor OS X Monitors OS X Crash Wrangler Monitor OS X Crash Reporter Monitor Linux Monitors Linux Crash Monitor Cross Platform Monitors CanaKit Relay Monitor Cleanup Folder Monitor IpPower9258 Monitor Memory Monitor Pcap Network Monitor Ping Monitor Process Launcher Monitor Process Killer Monitor Save File Monitor Socket Listener Monitor SSH Monitor SSH Downloader Monitor Vmware Control Monitor
요기서 LinuxCrash Monitor를 기준으로 보면 아래와 같이
<Agent name="Local">
<Monitor class="LinuxCrashMonitor"/>
<Monitor class="Process">
<Param name="Executable" value="./CrashingProgram" /> <!-- 수집프로그램 -->
<Param name="StartOnCall" value="Start" /> <!-- ?? -->
<Param name="Arguments" value="fuzzed.bin" /> <!-- 인자값 -->
</Monitor>
</Agent>
제가 위에서 사용했던건 LocalAgent의 LinuxDebugger를 사용했고, 이친구는 수집서버 지정 후 인자값으로 서버에 필요한 파라미터를 넘겼습니다.
<Agent name="LocalAgent">
<Monitor class="LinuxDebugger">
<Param name="Executable" value="./CrashableServer" />
<Param name="Arguments" value="127.0.0.1 4244" />
</Monitor>
</Agent>
이런식으로 각각 OS,상황에 맞는 Agent와 Monitor를 지정하여 세팅합니다.
두번째는 Test 속성인데요. 테스트는 2가지로 나누어 볼 수 있습니다. Test - Configure a StateModel along with a combination of Publishers, Loggers, Agents, etc. Publishers - I/O interface for interacting with the fuzzing target. Loggers - Method of collecting fuzzing information used to analyze Faults.
Publishers 는 IO 입출력 관련하여 target에 fuzzing 될 데이터를 지정하는 부분이고 Logger 를 Fuzzing을 통해 얻어진 결과를 어떻게 처리할 지 지정하는 부분입니다.
여기서 Publisher 종류는 보면 아래와 같습니다.
Publishers Com Console ConsoleHex File FilePerIteration Http Null RawEther RawIPv4 RawIPv6 RawV4 RawV6 Remote TcpClient TcpListener Udp WebService
각각 종류 별 Publishers를 지원하고, XML 파일에서 지정하여 사용 가능합니다. 제가 사용했던 부분을 보면 아래와 같네요.
<Test name="Default">
<Agent ref="LocalAgent" />
<StateModel ref="State"/>
<Publisher class="Tcp">
<Param name="Host" value="127.0.0.1" />
<Param name="Port" value="8080" />
</Publisher>
<Logger class="Filesystem">
<Param name="Path" value="Logs" />
</Logger>
</Test>
일단 해당 Test 속성에서 Agent를 아까 만들어둔 LocalAgent로 지정하고 Publisher는 TCP로 지정하였습니다. 그다음 파라미터로 테스트를 위한 Burp의 IP/Port 를 지정하였죠.
추가로 Logger는 Filesystem 클래스로 지정하고, Path라는 파라미터에 Logs 디렉토리를 지정해 주었습니다. 이로써 Fuzzing 된 데이터는 실행 디렉토리 하단 Logs 디렉토리에 저장되게 되지요.
제 글만 보고 Peach Fuzzer를 잘 다룰수는 없다고 생각됩니다.. 생각보다 복잡한 Fuzzer이지만, 활용성이 넓기 때문에 잘 이용하면 되게 좋은 툴로 보이네요.
Guide Page 첨부하니, 참고하면서 분석해보세요 : ) http://community.peachfuzzer.com/v3/PeachPit.html
[SYSTEM HACKING] Peach Fuzzer를 통해 Application 분석 1 - Install Peach Fuzzer [SYSTEM HACKING] Peach Fuzzer를 통해 Application 분석 2 - Application Fuzzing for Exploit [SYSTEM HACKING] Peach Fuzzer의 GUI 모드 - Peach3 Fuzz Bang(Run Peach Fuzzer on GUI Interface)
Reference
http://community.peachfuzzer.com