 Hallo, ik ben Stavensir, vriend van de Internet Stormcentrum. Xavier heeft een geweldige enthousiast over Houdini, het remote access tool, een heel oud remote access tool. En hij is in een javascript dropper. En het is ontbouwd als base64, maar het is geen standard base64. En Xavier kijkt door de script om de decoding functie te vinden en kan de base64 de opviscated base64 bestaan. Ik ga nu dat ook doen, maar ik ga niet de decoder gebruiken. Ik ga een statistische analysie van de encoded payload proberen te proberen. Ik heb de sample hier. En hier komt de payload, het lijkt op base64. Als Xavier zegt, is het een heel simpel en geweldige trick om speciale encodingen te vinden. Dus payloads in insite scripts. En dat is om je script de lijn van de script te zorgden door de lengte, zodat de langste lijn zijn aan het einde. En dat is iets wat je kunt doen met mijn stringstools. Stringstools werken typisch van binary data, maar het werkt ook op text files, zoals script. En met option L kun je de langste lijn laten zien. Dus hier heb je de langste lijn. En hier heb je de langste lijn. Dus door de command te raken zoals dat, zie je dat je iets moet verder investigeren. Een ander method dat ik gebruik om baseloads zoals dat te vinden, is mijn base64-tomtoen te gebruiken. En die bezoeken voor encodingslijn base64 in binary data of ook texten. Maar het is niet alleen limiter om base64. Het heeft alle soorten encodings. Dus ik zal zeggen alle encodings en ik wil een unieke list. Ik wil geen redundancy dubbelen van wat hier gevonden is. En dus dit is ook een soorten bilenks. En hier kunnen we een heel lang string zien. 787.000 karakters. En het is een variant van base85. Nu, het is waarschijnlijk niet eigenlijk base85. Want hier in deze column zie je de nummer van unieke karakters die dit hebben gebruikt om encodings. En dus hoewel het syntactisch valide base85 is, zijn er alleen 63 karakters gebruikt. Dus dit is meer waarschijnlijk een variant van base64 die niet bezoek is door de toon. En dat is wat we nu gaan doen. We gaan nu proberen uit te veranderen hoe we dit kunnen decodeen. Dus eerst hier ga ik een command maken om deze payload te extracten. Dus met strings l heb ik de lange strings aan de eind. Dus met tail en 1. Ik heb nu hier half de payload, de unieke line met de payload. Zoals je kunt zien begint met return. En dan een unieke quote om de javascript string te starten. En zo. En dan hier klaar met een unieke quote. En dan een semicolon. Dus we gaan eruit doen en dan blijf het payload zelf. Voor dat ga ik mijn researchtool gebruiken. De search voor regelaar expressions. En ik ga search voor een unieke quote, gevolgd door een karakter die niet een unieke quote is. En dit wil ik op een keer of meer dan een keer. En dan klaar met een unieke quote. En dat geeft me de javascript. Dus je ziet hier, de semicolon is gegaan. En nu, ik wil ook weer met een unieke quote doen. Dus dat is iets wat je ook kunt doen met een researchtool. Dus je maakt gewoon een capture groep om de expression dat je wilt hier. Dus dat is wat ik wil. Alles dat is niet een unieke quote. En dan, als je een capture groep gebruikt, dan zal de researchtool uitgeven de resultaat, de match van de capture groep en niet de complete match. Dus de unieke quotes gaan zo. Oké. Dus nu, finally, by doing this, I have extracted the payload. Now I'm going to use my tool byte stats to perform some statistics. Oké. So we have 78000 characters, 65 unique characters. So this could indeed be base 64. They are all printable, nothing binary in here, but there is some white space. Now I'm going to use an extra option, or that gives me the ranges of the different sequences that are being used. So that's what you see here. So what we have here, which characters are being used, the digits, all the digits, all the lower case letters and all the uppercase letters except uppercase a. So this looks very much like base 64. What is missing is the uppercase a and also the plus and the slash. And at the end you can also have an equal. So those are missing. But what is present and what is not part of standard base 64 is here the exclamation and the ampersand. Oké. And then here you also have a new line and a carriage return. But that is actually the output from our research. If I do a byte stat all to see all the values. So here those are all values that are not present. Oké. So here you see the new line and the carriage return they both appear only once. So that's actually a byproduct of our research at the end of line. We can ignore that. And then here you see exclamation mark and the ampersand both appearing 53 times. Which is a bit old. I would expect if they encode different bits that they would not have the same frequency. Oké. So now I'm going to try to figure out a bit more about the exclamation mark and the ampersand. What characters can be found around that. I'm going to use my research tool again. I'm going to make a list of unique matches. I don't want any doubles. And so I will look for two characters. Any characters and then the exclamation mark and then again any two characters. And then I will see what I see around the exclamation mark. And here now you can see that exclamation mark. Here you can have what appears to be a various letters in front of it. But after it it has always like it looks the ampersand character. So I'm going to double check that and make a matching group here around this. And indeed so I have only one. So if there is an exclamation mark then it is fold by an ampersand. Now I'm going to look at the ampersand. Same reasoning but for the ampersand. And here it looks that each time you find an ampersand there is an exclamation mark in front of it. So let's validate this. And indeed. So the reason why I have the same frequency is because it appears they are appearing both together. So to double check that I'm going to do a search and replace with SED. So I'm going to search for exclamation mark ampersand and replace that with nothing globally. And then I'm going to make my byte stats again with a range. And indeed now the ampersand and the exclamation mark are gone. So they appear always in pair like that. Ok Now I did away here. I just removed them. Let's just try if removing them gives me something that I can decode with base64 then. Apparently not. I don't have any output. Although for my statistics it looks like it should be a valid base64. What's probably going on here is that it doesn't have the right length. A base64 string the length of a valid base64 string is always a multiple of 4. And that's probably not the case here. So I'm going to force this with my p-option. This does Python processing of the strings before they are decoded and you give it a Python expression. And I have a function l4 stands for length4 that truncates any string so that its length is a multiple of 4. And then indeed here it finds the base64 string decodes it and I see something recognizable a try statement from javascript for example. So let's select that one and see what we have. Ok, no null bytes but we do have control bytes and high bytes. So there is binary data here inside not only printable binary which is unusual for javascript. So let's do an askidump so we see the try and inside the try there is something that looks like another base64 string. Ok, but then here all of a sudden we switch to binary data. So that's normal and here again base64 see all of a sudden a switch so I am wrong with my hypothesis here that I should just delete the exclamation mark ampersand it probably represents a valid base64 character. Now remember when we made the statistics we saw that the letter a was missing and also the plus and the slash. Also the equal but we are not going to consider that because that's at the end of a base64 string for padding. So what I am going to do now is replace the exclamation mark ampersand with a and try if I can have a valid decoding with that. And that already gives indeed now something that is recognized and then if I select this I have no null bytes, no control bytes no high bytes. So this looks more like it is a valid javascript script and indeed it is a valid javascript script that appears to contain base64 data. So that is how here with statistical analysis I was able to find out that exclamation mark ampersand is present into the encoded string and that it should be replaced by letter a. This was simple here because that's the only obfuscation that was made. All the other characters of base64 were left untouched. If many of them are also replaced by something else it becomes way more difficult to do the decoding. And I have an example of that too. That's something I will write up in an upcoming blog post. Now of course decoding this here. It's way easier to do the decoding if you have the decoder. Then you just get for this into the code. That doesn't work. So let's look for replace and indeed here you have the code and replace with that. But my example here what I wanted to show you is how you do that if you don't have the decoder. That's something I have to do from time to time that I have a payload. I'm given a payload for analysis and they can't give me the decoder. Either they don't know the decoder or they are unable to obtain it and then I try to find out methods to do the decoding without the decoder. Ok. En nu een klein ding. Sinds we kunnen decode dit. En het contains meer base64 meer base64 data. Ik ga ook zoeken voor dat. En zo, inderdaad we hebben base64 die decode is iets readable en de rest niet. Dus het is waarschijnlijk base64 hier in. Dus laten we kijken wat we hebben. Het was een lange stroom dus laten we zeggen een lengte van 100. En hier heb ik de 2 de array prototype en hier de decoder. Dus laten we de eerste selecten doen. En dit is een javascript die er heel veel als de eerst javascript die we bekijken op de sample-fondsaview. En nu kijken we naar de 2e. En dit is eigenlijk de Houdini remote access tool in vbscript met hier de IP address en de port en hier de code die is wel readable. Dit code hier dus dit sample was niet op het virus totaal dus ik heb het tot virus totaal en ook op de malwarebazaar.