An Obfuscated Beacon - Extra XOR Layer
Hallo, ddstevenseer, seniorhandler bij de internetstormzetter. Ik heb een koppelstrijkssample gegeven, een beacon, dat mijn tool 1768.py niet de configuratie kunnen extracteren. Dus dat is mijn tool, de sample en dat is de uitgang dat je krijgt. Nu gaan we eens kijken naar dat file, het moet een pf file zijn. En inderdaad, het is, maar het heeft ook een overlay. De low overlay is rond 256 kilobytes en het betreft 91 procent van het file, eigenlijk bijna 92 procent, het is een hoge entropy. Dus dat is waarschijnlijk waar de beacon houdt, want als het file zelf, het pf file, zonder de overlay, laten we zeggen een paar van 10 kilobytes, dat is niet mogelijk om een volledig stagelijke beacon binnen te houden, want dat is rond 250k. Laten we eens kijken naar de overlays, sorry, op de sections. En inderdaad, je hebt veel sections, maar de grootste hier, met de code is 10k en oké, je kunt houdt, je kunt hier een schelcode hier, een stagelschelcode, maar je kunt niet een volledig beacon in het. Dus laten we eens kijken naar de overlay, want dat is waar het zal zijn. Dus ik krijg de overlay en laten we een haringlink encoded askidump doen. Oké, hier zie ik een repeaten sequence. Het is al interessant. En laten we eens kijken naar het begin. Oké, ik zie dit. Nou, ik heb dit opgemoet, dit is iets te doen met de compiler die gebruikt was, maar voor de rest vind je niets betekend. Ik ga dit door mijn stroomkommand, hier een binary dump, zie je, niet veel interessant hier. Dus wat is hier waarschijnlijk gebeurt, is dat de pfile hier is ontdekend en dat het encoded is xor. En dat is waarom op het eind dat je hier deze repeaten sequence ziet, want op het eind van een pfile zijn er usually een aantal null bytes, value 00. En als je xor 000 sequence, null byte sequence, als je xor dat met een kiep, eind je eigenlijk met een kiep. Dus als dit encoded is xor, dan is dit hier de kiep. En dus het is repeaten hier. Je ziet 1 naar links, dus dat is 16, dat is 2, dus de kiep is 18 karakters. Nou, de ding dat ik heb is een tool die een kiep met xor encoded kan doen.  Dus je moet het een noon plaintext geven en dan het gaat proberen te vinden de noon plaintext die encoded is en de kiep van de encoder van dat noon plaintext met de actuale data van de overleving hier. En ik heb mijn tool hier, xor kpa update, zodat het een paar plaintext voor cobblestrike, dus een van die is cskey. Dus dit is een noon plaintext voor de header van de publieke kiep in de configuratie met xor. Dus 2e. Dus let's run this. Oké en hier heb je verschillende kiepen en de meest gelukkige kiep is naast het eind, want dit is de kie hier dat de tool vond, de xor decryptie kiep. En als het dat kiep gebruikt om dat plaintext te decodeen, dan heeft het nog 15 extra bytes over, dus dat betekent dat de kiep is vergeten en het is erg gelukkig dat de correcte kiep was gevonden. Als we dat hebben, wat we kunnen doen, is de option D om de decoding te doen en dan zal het decodeen met de meest gelukkige kiep, de laatste kiep, en uitvoeren dit als binary. En ik ga dit opnemen die, laten we eerst de be checken, om te zien of we met de be file aanbieden. En ik denk dat het niet begint, omdat je dat header hebt. Dus ik ga proberen om de be file te loceren. Oké, geen be file was gevonden. Laten we eens kijken naar de kiepen. Oké, ja en decoding heeft gewerkt, want nu hebben we 3 be kiepen en we hebben dat niet gehad. Dus ik zal dit nu in mijn kogelstrijk becan analyseren tool. En inderdaad, hier is de configuratie gevonden en extracteerd. Nou, een beetje meer over de non-plaintext texten hier. Als je een help doet, hier heb je de verschillende plaintext dat ik heb gezien voor deze tool. Je kunt natuurlijk op jouw eigen plaintext, geen probleem, in een tekstfile bijvoorbeeld. Maar je kunt ook zeggen, ik wil een van de pre-defined kiepen gebruiken. En dus dit is de plaintext van een header van de kogelstrijk kiepen die niet exor encoded is.  Dus value 4, config item 7, sorry 7, dat is de publieke kie, type 3, een lengte hier van exodesmo 100 bytes en dan hier heb je de kie, de publieke kie, de start, wat, eigenlijk, deze part is altijd dezelfde en dat is de header, met bijvoorbeeld de ID. En dus dat is de kieping die niet exor encoded is en dan heb je twee andere kiepen die exor encoded met dot en een met i. Dat zijn de twee kiepen die je vaak in de kogelstrijk begint te vinden. Nou, als ik de analysie van dit sample deed, heb ik geen exor kph gebruikt hier, want dan was het niet kunnen doen de decoding. Eerst had ik het update tot Python 3, ik heb niet deze kiezen hier, dus wat ik hier deed, was gebruiken mijn translate tool in een andere method en laten ik je laten zien. Dus een ASCII dump of de overlay en hier, dus dit bijvoorbeeld. En dan hier twee extra bytes, zoals dit, dat is een gelukkige kie, want hier zie je het repeat, zoals dit. Nou, natuurlijk, als ik dit zeg, is dit een gelukkige kie en begint met 28, kan het ook zijn dat het eigenlijk begint met een 0, zoals dit en dat 28 is aan het einde enzovoort. Dus je moet proberen verschillende rotationen van dat kie. Dus dat kan ik doen met mijn translate tool. Dus een full read, omdat we op alle data gaan acteren, niet byte per byte. Dus lambda function data en je hebt een exor decoding function en coding function in translate.py dat je kunt gebruiken. Dus je geeft het data en je geeft het kie. Ja, dus ik heb eigenlijk de kie nodig. Laten we dat weer doen. Oké, dus en let's assume dat dit de kie is. Laten we dit copy. Dus een binary dump. Pipe dit in translate, lambda function en ik gebruik exor. Dat is een built-in function in translate.py, mijn translationscript dat dus exor decoding en coding. Dus je geeft het data. Je geeft het de kie en dus hier 28 en dan heb ik die twee byte 2 nodig, want het is 18 bytes long. En nu, dit is een kleine update dat ik maakte met mijn tool, de function exor. Je had het een binary string gegeven. Exadecimal was niet een optie, nu is het.  Maar als je het exadecimal als een kie geeft, moet je een 3e per meter exadecimal passen. Dat moet echt zijn. En als we dit doen, we gaan de translation doen en de exor encoding met deze kie. En laten we dit passen op strings.py, dus kijken wat we metvinden. Dat is niet de correcte kie. Want we hebben niets dat is correct. Nou, zoals ik heb gezegd, mijn arbitrair is hier te beginnen met 28, maar het kan ook zijn dat de kie eigenlijk begint met a. Dat is de kie a0, 0, 9 en zo, 3d en dan eind 28. Oké, nou, dat is een rotation van de kie en dat is ook een parameter dat ik geïmpelde een extra optie hier in exor en dat is dat je kunt zeggen dat je een rotation wilt doen op de kie. Op de default, de rotation is 0, dus er is geen rotation, maar hier gaan we een rotation van 1, dus dat betekent dat we schijven, we roteren alle bytes, één positie naar de link en dan de byte hier, dat in het begin endt op de einde. Dus laten we dit proberen. Oké, dat werkt niet en dan gewoon doen trial en error. 2, 3, 4, roteren 5 bytes. Laten we 6 bytes proberen. Oké, en nu hebben we decoded. Dus de kie is roterend voor 6 bytes, dus 1, nou 0, 1, 2, 3, 4, 5, 6, dus hier, 27, 0, e, dat is het begin van de kie. Oké, we kunnen dit bekijken en we hebben een decoding. En als we terug naar exor kpa, hier, sorry, exor kpa, let's gewoon exor kpa op het met de naam cs kie dot. De kie begint ook te beginnen met 27, 0, e. Dus exor kpa kan het kie vinden omdat je het de noon plaintext geeft en dan gebruikt dat noon plaintext te exor de data en als je exor encoded data met noon plaintext, wat je met dat noon plaintext eindt, is eigenlijk de kie, de exor kie. Nu, dit werkt als de exor kie is kleiner dan de de noon plaintext. Als de exor kie is groter langer dan de noon plaintext, dan werkt het niet. Want je probeert te vinden repetities van de kie. Dat is wat exor kpa doet. Nu, een laatste ding. 