Cobalt Strike: Decrypting C2 Traffic With A "Leaked" Private Key
Hallo, Lidia Stavens hier, senior handel bij de internetstormcentrum. In deze video gaan we kijken naar wat koble strijkstof. Ik zal je hier laten zien hoe je onder een aantal condities kunt krippen en past koble strijk C2-traffic. Brad Duncan op zijn Malware-traffic analyse heeft veel Malware samples en traffic die ze genereren. In het begin van de jaren van februari posted hij deze sample hier met een pick-up file van koble strijk-traffic. Het is over Http maar het is kript. Maar deze hier kunnen we kripten en ik zal je explainen waarom en hoe we de kripting kunnen doen. Een paar uur geleden ontdekte ik wat private kies voor koble strijk op het virus totale. Laten we jullie een beetje over de kripting van de kripting voor koble strijk. Waarschijnlijk als de kripting over Http, HTTPS of even DNS is, als een beacon communicaties met een server, het zal met meta data senden en meta data ontdekte een username, een computername, andere data en ook het belangrijkste, de raw key. En de raw key is een random sequentie van 16 bytes van waar de AES en HMAC keys zijn. En dat meta data is kript door RSA encryption. Dus de beacon hier heeft een publiek key en de server heeft een private key. De beacon generert een AES key, maakt dat in de meta data en kript het met een publiek key en dan kan de server het kript omdat het de private key heeft. Dan weet het de AES key en dan kan het senden commanden. Als resultaat op de get request, commanden zijn AES en kripten. En de beacon kan de resultaat van die commanden ook AES en kripten. De AES key is uniek voor elk instantie van een beacon. In de eerste keer rijdt een beacon. 16 random bytes zijn genererd. En van dat de key is deraagd. Zodat je bijvoorbeeld een memoriedump of een voelkontrol van de beacon hebt, dan kan je de AES key uitstekten, maar anders heb je de AES key niet. En een andere manier om de key te vinden is om de private key te hebben en dan de kripten te doen en dan heb je de AES key. Maar op normaal circumstances heb je geen accesse naar de server. En dus heb je geen accesse naar de private key.  Dus wat ik een paar weken geleden ontdekte, is dat er raar rook software pakketjes van koppelstreek die op de internet zijn, op de darkweb, maar ook op de virus totale. Sommigen zijn er ook op de virus totale. En ze containeren een private key. En op de virus totale heb ik 6 private keys gevonden zoals dat. En die private keys, gelukkig voor ons, twee van die zijn vaak gebruikt door criminals. Dus die zijn populair pakketjes met criminals. In een recente fingerprinting heb ik koppelstreek servers op de internet. Ik heb de fingerprinting meer dan 2500. Wel, let's say, rond een kwartier, wanneer ik de test heb, was een kwartier met twee van die 6 private keys gebruikt. Dus in theorie, als we het kunnen extrapoleren, zouden we een kwartier van de koppelstreek kippen als we natuurlijk de koppelstreek kippen. En ik ga nu nu explainen hoe we dit kunnen doen. Nu, de keys, ik heb ze in mijn 1.768 tool in de JSON file. Dus hier, bijvoorbeeld, je hebt de licent ID en hoe vaak die licent ID's zijn. En bijvoorbeeld, als het 0 is, het is trial or pirated, dat is een gegeven. En dan heb ik hier ook publieke keys. En hier zie je een publieke key. En dan hier, onder verbouwen, de korrespondeerde private key. En ik heb 6 interesse zoals dit. En dus dit is gebruikt van mijn 1.768 tool dat is gebruikt om de software te analyseren. Maar het is ook gebruikt van een nieuwe tool die ik geleerd heb dat kan decrypt metadaten. Nu, dit capture file hier van Brad, ik downloade het en heb het open. En hier, ik filterte op HTTP en de IPv4 adres van dat koppelstreek server. Hier, de eerste request die je hebt, dat is een request van een stager shellcode, een klein stuk shellcode, om de volle beacon te downloaden dat je hier kunt zien. About 200 kilobytes, dat is de volle beacon die is downloaden. En dan, van hier om, heb je C2-traffic. Dus een request-answer. Request-answer enzovoort. Hier kun je zien dat de content-length is 0. Dat betekent dat voor de eerste request dat er was, er waren geen commanden. En als we een beetje opkomen, zien we een post. Oké, hier hebben we de post. Dus laten we zien, hier hebben we een get-response.  Hier, nu kun je zien dat de content-length is 48. De data die je ziet hier, dat is de command, maar dat is AES-encrypted. We kunnen niet weten wat het is wanneer we het decrypten kunnen. En hier, dit is de resultaar, dit is ook decrypte. Hoe kunnen we decrypte in dit geval? Nou, als je hier naar een request gaat, dan kun je zien een cookie. Nu, dit koble-strike beacon hier is geconfigurerd met een default profil. En in dat geval, de metadata is encrypte met RSA, met een publieke key. En is dan converteerd in base64. En dan is het transmittet hier als een cookieheader. Dus dit is de base64 encoded en encrypte metadata. Ik kan dit copy copy deze value en dan gebruik ik mijn tool cs voor koble-strike decrypte metadata. En als argument kan ik de metadata geven. Je kunt meer dan één argument geven. En dan is het decrypte. Nu, waarom kan mijn tool decrypte omdat deze metadata hier encrypte met een van de zes publieke keyen waarop ik een private key heb gevonden. Dus mijn tool zal alle andere private keyen proberen te proberen. Het vindt in de JSON file, de 768 JSON file. En dan proberen ze uit. En dan, als het een header vindt, hier 0000 beef, met een metadata. Meta data zal informatie zoals een computername, een username, maar heel belangrijk voor ons, de raw key. Dit is de raw AS key waarin we deze traffic decrypte. Dus let's copy deze key en nu kunnen we een andere tool gebruiken. Dat heb ik al opgepubliekt maar ik heb een kleine update hier omdat er wat encoding issues waren, niet encrypting hier, maar encoding, UTF encoding, en ik fixe dat. Dus, de tool, ik geef het de raw key. En dan zal ik ook een filter een wireshark filter een display filter zodat het het traffic is, alleen de traffic die we zien hier zoals dit. En dan geef ik het de pickup file. En nu kunnen we decrypte en passen de commands en de resultaten van de communicatie hier tussen de beacon en de team server. Oké, nu de eerste hier, de HMAC signature is in valid. Dus niet alleen is data encrypte met AES, maar het is ook gezien met HMAC.  En voor deze pakket 6703, het is niet valid en dat is normaal, omdat het eigenlijk geen C2 communicatie is. Dat is eigenlijk de beacon die downloadt. Dus we kunnen dat ingeyen. Maar hier zie je pakket 9383. Dus dat is deze hier. 9383, zoals je kunt zien 48 bytes hier. Hier. Als ik decrypte, dan is dit een sleep command. Voor 100 milliseconds met een jitter factor van 90%. Dus dit is eigenlijk een sleep interactive command. Nog een andere command. 53, die is voor het moment onkend voor mij. Maar als ik op de resultaten kijk, dit is een directe list. Dus command 53, dat moet zijn list files. En hier zie je de communicatie. En we kunnen gewoon gaan. Morgen known commands, hier programdata. En dan hier zie je een directe list voor programdata. Dus dit is waarschijnlijk een directe command. Command 5 is waarschijnlijk een directe command. Andere command. Dit is een post command. Dit is waarschijnlijk ook een directe command. Dit is een error. Hier zie je iets zoals waarschijnlijk. Dit is waarschijnlijk een command om een waarschijnlijk command te executeren of een andere waarschijnlijk command. En de operator of de criminal must have some made some mistake, because you can see er are waarschijnlijk errors in our sendback. Hier een andere command en het is domain trust. Dit is voor cmdc, conspeccy, cmdc en dit is ook een fail. Een netview command hier, een error. En hier command 100 zie je een interne IP address en netmask mijn adres. Dit is een command om de netwerk configuratie te laten zien. En dan hier port scanner. Dus een executable is transmittend en dan heb je een port scanner. Dat is iets wat ik al heb gezien. Dus de logiek om een port scanner te doen is niet in de software zelf. Het moet worden downloaden van de server. En hier zie je de uitgang van dat port scanner. Een andere directeurlisting voor programma data dat ik niet weet wat het is. Ik heb het te bevinden. Een andere listing van drive z en een listing van drive d. Dus de operator hier is kijken wat we op die machine kunnen zijn. Directeur van drive c en een known command. Een directeur van user's folder. Folder $winreagent recycle bin in een van de recycle bins per vlog. Windows. 