11/26/2015

[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> 내 <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


HAHWUL

Security engineer, Gopher and H4cker!

Share: | Coffee Me:

0 개의 댓글:

Post a Comment