Denna artikel är skriven av Tomas Rzepka på WithSecure.
Microsoft Endpoint Configuration Manager (CM), även känd som System Center Configuration Manager (SCCM), används i stor utsträckning av organisationer för att hantera sin Windows-miljö för att möjliggöra enkel registrering av servrar och arbetsstationer, distribuera programvara och generisk hantering av Windows-systemen i deras IT-miljö. Configuration Manager innehåller ofta information som kan användas av en angripare för att hitta nya attackvägar eller referenser som tillåter laterala rörelser.
Under NetSec-uppdrag på kundsajter stöter vi ofta på CM-nätverksresurser och det är ofta chansartat att försöka söka i dessa resurser efter intressant information såsom referenser lagrade i skript. För att försöka åtgärda detta gjordes en del forskning för att ta reda på hur filstrukturen implementerades och ett verktyg skapades för att göra det lättare att extrahera intressant information från dessa andelar.
Distributionspunkter
Distributionspunkt (distribution point) är namnet på CM-tjänsten som distribuerar innehåll till klienter. Innehåll kan nås via SMB eller HTTP(S). För att hitta vilken CM-distributionspunkt som är konfigurerad på en domänklient eller server kan följande registernyckel läsas (PowerShell):
PS> (Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\SMS\DP -Name ManagementPoints).ManagementPoints
Som standard exponerar CM-distributionspunkter filresurser som innehåller operativsystem-images, skript och programvara som ska distribueras med Software Center och Operating System Deployment (OSD). Standardresursen är dold och heter SCCMContentLib$. Resursen är som standard läsbar av alla användare och kan innehålla känslig information som till exempel referenser i skript eller konfigurationsfiler, certifikat med privata nycklar eller annan information som kan ge en angripare en fördel. För att se alla resurser på en fjärrdator kan kommandot net view användas.
Innehållsbibliotek
CM Content Library (SCCMContentLibrary$ share) har ett speciellt sätt att lagra filer som Microsoft har dokumenterat här: https://techcommunity.microsoft.com/t5/configuration-manager-archive/understanding-the-configuration-manager-content-library /ba-p/273349
TLDR är vad SCCMContentLib$\DataLib mappen innehåller .INI-filer. .INI-filen heter det ursprungliga filnamnet + .INI och filen innehåller en SHA256-hash av originalfilen, själva filen lagras i SCCMContentLib$\FileLib i formatet av <mappnamn: 4 första tecknen i hashen>\<fullständig hash för filen som filnamn>.
CMLoot
För att göra processen att upptäcka innehåll och ladda ner intressanta filer enklare utvecklades PowerShell-skriptet CMLoot. CMLoot utför en inventering av alla tillgängliga .INI-filer och lagrar dem lokalt i en textfil. Inventeringen används sedan för att söka efter intressanta filtillägg, välja vilka filer du vill ladda ner och CMLoot kommer att ladda ner filerna och återställa det ursprungliga filnamnet.
För att skapa en inventeringsfil, kör Invoke-CMLootInventory:
Skriptet hämtar alla .INI-filer i DataLib-katalogen och lägger dem i en textfil som kan tolkas manuellt eller av CMLoot själv.
När inventeringen har skapats är det möjligt att hämta filer på ett antal olika sätt; en enda fil, typ av tillägg eller genom att använda GridSelect. En varning kan vara på sin plats då GridSelect kan använda upp RAM-resurser om stora inventeringsfiler öppnas.
Ladda ner en enda fil genom att kopiera en rad i inventeringstexten och kör Invoke-CMLootDownload med -SingleFile-alternativet:
Ladda ner alla filer med ett visst filtillägg genom att använda alternativet -Extension:
Filer laddas som standard ned till CMLootOut i mappen från vilken du kör skriptet, kan ändras med parametern -OutFolder. Filer sparas i formatet <mapp: filtillägg>\<första 4 tecknen i hash_original filnamn>.
Vad du ska leta efter
Nedan är några av de saker du bör titta efter när du undersöker en CM-nätverksresurs.
- Credentials
- Usernames / Passwords
- Grep for: 'DOMAIN\', '@domain.tld' or 'password='
- Certificates
- Find extensions: pfx,p12,pem,key
- Connection strings
- For inspiration, see https://www.connectionstrings.com/
- API keys
- Grep for: 'APIKEY', 'API_KEY', 'API_SECRET' or use Regex to find key data
- Information on resources
- Interesting file shares
- Scripts fetching files from UNC paths otherwise hard to discover
- Application configuration
- API endpoints / network ports
- Grep for: 'http://', 'https://', etc.
- Extra mile
- Reverse engineer published applications – find bugs 😈
- Hardcoded credentials
- .NET Remoting Services, Java Serialization, etc.
Åtkomstkontroll
Det är möjligt att ställa in ACL för paket i CM genom att använda funktionen "Manage Access Accounts". I exemplet nedan ska endast användare i gruppen sccm_secretapp kunna komma åt applikationspaketet "SecretApp".
Om en användare som inte tillhör gruppen sccm_secretapp försöker komma åt mappen där .INI-filen för SecretApp finns nekas åtkomst som förväntat.
Men om processen är omvänd och vi istället vänder oss till FileLib som innehåller de faktiska filerna är det möjligt att komma åt filen som vilken domänanvändare som helst. Det finns också en .INI-fil i FileLib, som innehåller en identifierare som pekar tillbaka till innehållsmappen i DataLib.
Mappar som har låsts med en ACL indikerar att den kan innehålla intressant information. CMLoot-Inventory kommer att upptäcka när DataLib-mappar är otillgängliga och lagra en referens till dem i en separat textfil (<inventoryfilename>_noaccess.txt).
Cmdlet CMLoot-Hunt kan sedan användas för att leta efter originalfilerna i FileLib och ladda ner dem.
CMLootHunt kan inte bestämma filändelsen för filer som kopierats från FileLib eftersom det inte är möjligt att komma åt DataLib-mappen där det ursprungliga filnamnet kan hittas. Så filnamnet blir filens SHA256.
För att avgöra vilken typ av fil det är, kan kommandofilen *nix användas.
Filkommandot i exemplet ovan visar att filen är ett "Composite Document File V2 Document"..."Windows Installer". Så den här filen är förmodligen en .MSI-fil.
Extrahera MSI-filer
.MSI-filer är installationspaket för Windows som kan extraheras med msiextract. CMLoot kan utföra en fil eller bulkextraktion av MSI-filer genom att använda Invoke-CMLootExtract cmdlet:
Filer kommer att extraheras i undermappar till sökvägen som innehåller .MSI-filerna. När extraheringen är klar är det möjligt att bläddra i innehållet i .MSI-filen och ta reda på om den innehåller någon intressant information.
Det är också möjligt att extrahera enstaka .MSI-filer. Som med exemplet "Access control" ovan extraheras filen och referenser finns i filen SecretApp.exe.config.
Slutsats
Det här verktyget och teknikerna har använts på flera uppdrag för red team- och penetrationstester för att hitta nya referenser som möjliggör lateral rörelse och uppnå målen.
Configuration Manager innehåller ofta information som kan användas av en angripare för att hitta nya attackvägar eller referenser som tillåter laterala rörelser. Se till att CM-miljön inte innehåller känslig information.
CMLoot kan laddas ner här:
https://github.com/1njected/CMLoot