Simovits

Rostig Potatis del 1 – Historiska potatisar

Veckans blogginlägg kommer inte att handla om King Edward, utan om en känd familj av exploateringsverktyg som är användbara för privilegieeskalering i Windows-miljöer. Syftet med denna första del är att introducera potatisarna, och ett vanligt scenario där de kommer till användning. Nästa bloggdel kommer att visa hur en potatis kan skrivas i programmeringsspråket Rust.

Check your privileges

En olycka kommer sällan ensam, och en sårbarhet upptäcks sällan allena. Det är långt ifrån ovanligt att en serie missöden, eller framgångar beroende på vems perspektiv man anlägger, leder en penetrationstestare fram till ett skal på en Windows-server.

Fel sorts skal.
Rätt sorts skal.

Föreställ er till exempel följande fiktiva scenario:

  1. Ett penetrationstest av en webbapplikation leder till upptäckt av SQL-injektion, där godtyckliga databasfrågor kan stickas in i den legitima affärslogiken.
  2. Applikationen loggar in som administratör i databasservern, som visar sig köra Microsoft SQL Server på en Windows-server.
  3. Genom ett enkelt handgrepp aktiveras xp_cmdshell, en lagrad procedur som gör det möjligt att köra kommandon mot det underliggande operativsystemet genom SQL-frågor.

Penetrationstestaren har nu kontroll över databasservern, och går nu vidare till att se hur denna nya position kan hota organisationen som har begärt penetrationstestet.

Penetrationstestning väcker ofta existensiella frågor som “vem är jag” och “vilka rättigheter har jag till systemet jag precis har brutit mig in i?”. Frågor som är betydligt lättare att besvara i IT-världen:

whoami och whoami /priv

Skärmbilden kan tyckas vara en ordsallad, men det är endast en detalj i den som kommer att behandlas vidare idag: “SeImpersonatePrivilege“.
Det är en av två privilegier som kan ge en angripare obegränsad åtkomst till operativsystemet som “NT AUTHORITY\SYSTEM”, där det andra privilegiet är SeAssignPrimaryTokenPrivilege.

Privilegiet ger Microsoft SQL Server-kontot rätten att agera åt andra användare efter att de har autentiserat till en tjänst under kontots kontroll. Det är ett vanligt och legitimt verksamhetsscenario. Så vanligt att rättigheten faktiskt ges till SQL-serverns servicekonto automatiskt vid uppsättning. Detsamma gäller för Internet Information Services (IIS), en vanlig webbserver i Windows-miljöer.

Vad är då problemet?

SeImpersonate är vad våra engelsktalande vänner skulle kalla “a can of worms”. Rättigheten innebär att om en angripare kontrollerar ett konto med privilegiet konfigurerat, och kan förmå ett högre privilegierat konto att autentisera till en tjänst som kör under SeImpersonate-kontot, kan köra godtycklig kod i skepnaden av det högre privilegierade kontot.

Tid för potatis

Först, en historielektion.

Grunden till potatisfamiljen lades när James Forshaw på Googles research-grupp “Project Zero” rapporterade9 en sårbarhet 2014, där Windows Defender kunde luras att autentisera sig över WebDAV till en skadlig server, som återspelade autentiseringen till systemets CIFS-tjänst. Forshaws Proof-of-Concept visade hur en fil kunde skrivas till filsystemet med systemkontots rättigheter.

Stephen Breen utvecklade attacken vidare till den första potatisen, HotPotato1 (eller helt enkelt Potato). Attacken byggde på NBNS-spoofing, där en klient lurades att autentisera till en skadlig server för att hämta proxy-inställningar (WPAD). Denna autentisering vidarebefodrades till SMB, där godtycklig kod kördes.

Microsoft satte stopp för HotPotato i och med bulletin MS16-07510 där vidarebefodring av autentisering på det sätt som missbrukats inte längre tilläts.

Stephen Breen utvecklade då RottenPotato11 och RottenPotatoNG, vilket var de första potatisarna som började utnyttja SeImpersonate-privilegier. RottenPotato utnyttjar en odditet i hur COM-objekt beter sig när de lyfts ut ur IStorage. Systemkontot kan förmås att ansluta till en godtycklig adress i syfte att inhämta information om hur objektet ska bindas från den så kallade OXID-resolvern. Detta används för att lura systemkontot att först ansluta till en skadlig OXID-resolver, som i sin tur lurar kontot att autentisera till en named pipe under SeImpersonate-kontots kontroll.

RottenPotato kan slutligen stjäla systemkontots token och köra godtycklig kod i dess namn.

Andrea Pierini12 vidareutvecklade RottenPotato till LonelyPotato och JuicyPotato, som var mer flexibla och fungerade även på system som saknade vitala delar i RottenPotatos attackkedja.

RoguePotato skapades av Antonio Cocomazzi efter att Microsoft infört en begränsning i Windows Server 2019 och Windows 10, som innebär att en viktig del i föregående potatisars attackkedja stoppades.

Begränsningen innebär att OXID-resolvern endast får anropas över port 135, en port som redan är i bruk på alla Windows-system. Tidigare potatisar går då bet eftersom de inte längre kan använda sin skadliga OXID-resolver.

RoguePotato kringgick begränsningen genom att använda ett externt system under angriparens kontroll som språngbräda. Angriparens system lyssnar på port 135 och sänder tillbaka trafiken till det ursprunliga systemet på en godtycklig port där en falsk OXID-resolver väntar. RoguePotato introducerade även en ny metod för att stjäla en token från systemkontot.

Efter att Andrea och Antonio öppnat för nya sätt att skapa potatisar kan det konstateras att Microsoft inte har vunnit kampen mot exploateringsverktygen. Efter RoguePotato, som idag fungerar mot ett fullt uppdaterat Windows-system, har fler potatisar sett dagens ljus:

Och säkerligen många fler.

Impersonation

Micah Van Deusen beskriver i sin artikel4 hur SeImpersonate och SeAssignPrimaryTokenPrivilege används av potatisarna för att missbruka stulna tokens. Han har även skrivit GenericPotato, som till skillnad från de flesta andra potatisar är byggd i C#. Bloggaren och säkerhetskonsulten itm4n har också beskrivit teknikerna i sin artikel som beskriver arbetet bakom det potatislika verktyget PrintSpoofer.

I korthet finns det framförallt två funktioner i Windows-API:et som kan missbrukas av de som har ovan två nämnda privilegier. CreateProcessWithTokenW5 och CreateProcessAsUserA6.

CreateProcessWithTokenW kan användas av de som har SEImpersonate-privilegiet, och är väldigt lik Windows-API:ets CreateProcess-funktion. Nedan följer funktionssignaturen:

CreateProcessWithTokenW

Den första parametern är en referens till den token som stulits från det högprivilegierade kontot, och övriga används på samma vis som i CreateProcess.

CreateProcessAsUserA gör ungefär samma sak, men för de som har privilegiet SeAssignPrimaryTokenPrivilege.

För en mer detaljerad redogörelse för hur Impersonation fungerar rekommenderas Micahs och itm4ns artiklar .

Att stjäla tokens

Så det enda som krävs för att kunna anropa CreateProcessWithTokenW och erhålla de metaforiska nycklarna till kungariket är en handle till en stulen token.

Hur stjäl man då tokens? På den här punkten skiljer sig potatisarna åt, men något förenklad har de traditionellt byggt på samma idé.

Exploit tools of the Potato family are all based on the same idea: relaying a network authentication from a loopback TCP endpoint to an NTLM negotiator. To do so, they trick the NT AUTHORITY\SYSTEM account into connecting and authenticating to an RPC server they control by leveraging some peculiarities of the IStorage COM interface.

itm4n – https://itm4n.github.io/printspoofer-abusing-impersonate-privileges/

Hälften av ovan citat är strikt sett bara sant från och med RottenPotato, men det är länge sedan Microsoft släppte säkerhetsfixen som stoppade HotPotato.

Det är möjligt att som RottenPotato använda QuerySecurityContextToken13 för att hämta en token ur den säkerhetskontext som skapas när systemkontot autentiserar över NTLM.

Som itm4n skriver i sin artkel finns det funktioner i Windows-API:et som kan användas för att stjäla tokens. RpcImpersonateClient gör att en RPC-server kan utöva impersonation mot en klient, och ImpersonateNamedPipeClient erbjuder samma möjlighet för pipe-servrar.

Exakta implementationer skiljer sig åt och är bortom denna artikels omfattning, men en mer teknisk djupdykning kommer i uppföljande blogginlägg.

Demonstration av RoguePotato

Nedan demonstreras ett angrepp mot Microsoft SQL Server 2019 på operativsystemet Windows Server 2022. Både operativsystemet och SQL-servern är fullt uppdaterade. Startpunkten är ett skal under servicekontot “NT SERVICE\MSSQLSERVER”. Attacken sker med hjälp av RoguePotato.

RoguePotato lurar “NT AUTHORITY\SYSTEM” att ansluta mot port 135 på det angripande systemet. Trafiken leds tillbaka till port 9999 på SQL-servern där RoguePotato lyssnar. System-kontots token stjäls och används för att starta netcat, som i sin tur skickar över ett skal till det angripande systemet.
Skal under kontot “NT AUTHORITY\SYSTEM” fångas på det angripande systemet.

Och med denna demonstration är blogginlägget slut för denna vecka.

Länkar

  1. HotPotato – https://foxglovesecurity.com/2016/01/16/hot-potato/
  2. RoguePotato – https://github.com/antonioCoco/RoguePotato
  3. https://decoder.cloud/2020/05/11/no-more-juicypotato-old-story-welcome-roguepotato/
  4. The power of SeImpersonation – https://micahvandeusen.com/the-power-of-seimpersonation/
  5. https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createprocesswithtokenw
  6. https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessasusera
  7. https://itm4n.github.io/printspoofer-abusing-impersonate-privileges/
  8. https://github.com/leechristensen/SpoolSample
  9. https://bugs.chromium.org/p/project-zero/issues/detail?id=222&redir=1
  10. https://docs.microsoft.com/en-us/security-updates/securitybulletins/2016/ms16-075
  11. https://foxglovesecurity.com/2016/09/26/rotten-potato-privilege-escalation-from-service-accounts-to-system/
  12. https://github.com/decoder-it/
  13. https://docs.microsoft.com/en-us/windows/win32/api/sspi/nf-sspi-querysecuritycontexttoken
  14. Snäckskalsbild – https://www.pexels.com/@monicore/