Web Crackme

  • Hey Leute ;)


    Ich habe da ein Problem...
    Ich wollte mal ein Programm cracken das die Seriel online checkt und nicht lokal mit einem Algorithmus. Bei crackmes.com habe ich ein kleines Crackme gefunden, das ein TCP Paket zum Server schickt und es auswertet. Wenn die Seriel stimmt, kommt eine Messagebox das die Serial okay ist. Wenn nicht dann kommt eine Badboy Message... Mit WPE Pro habe ich das Paket ein wenig geändert. So das eigentlich(!) die Messagebox mit der Goodboy Message kommen sollte(!) ;) Es könnte schon sein, dass ich hier ein Fehler gemacht habe.
    Es kann aber auch das C# Programm sein.
    Außerdem habe ich meine Windows Host Datei geändert. Also die IP vom Server zu der Loopback-Adresse. Damit das Paket nicht zum Server gesendet wird sondern lokal an mein PC.
    Ich denke ich habe überall ein Fehler dirn ....
    Ich hoffe einer von euch kann mir weiterhelfen.


    Hier ist mein "crack" (komplette source mit binary im dubug Ordner)
    http://www.megaupload.com/?d=8N0P4B5L



    und hier das Crackme
    http://www.megaupload.com/?d=GXMC9P55

  • Ich mir deine Source jetzt nicht angeguggt, aber in deinem Ansatz scheinen schon Fehler zu sein.


    Also das Crackme sendet ein PHP GET an ein PHP Skript auf einem Server. Also macht redirecten mit der Host Datei kein Sinn, da höchstens der connect Call umgeleitet wird, wenn aber im Packet Header (siehe HTTP Protokoll) die IP nicht stimmt failed das ganze an der Stelle.
    Mit WPE das Packet ändern geht vermutlich auch nicht, da recv (vermutlich) nur gecalled wird wenn das Tool in der Check Methode ist.


    Ab hier im Expander Lösungsmöglichkeiten:

  • Anscheinend interessiert die IP im Packet Header doch nicht viel, oder sie wird auch automatisch umgeleitet, weiß ich jetzt nicht, müsste man in WPE mal abchecken.


    Im Prinzip macht der dasselbe wie ich mit der ersten Methode nur etwas vereinfachter ^^
    Der Connect Hook macht im Prinzip dasselbe wie das ändern der Hosts Datei, nur ich ändere das send zum eigenen WebServer und er erstellt nen eigenen Server. Ich hab gar nicht gewusst das man so ohne weiteres nen WebServer emulieren kann, wieder etwas dazu gelernt :)


    Du kannst dass natürlich auch so machen, wie er. Entweder connect hooken (schönere Variante) oder hosts Datei ändern und einen eigenen Server emulieren der das gewünschte Packet zurück sendet.


    Ich schau gleich mal in deinen Quellcode rein, wo der Fehler liegt


    //edit:
    Die Datei, auf die Sie zugreifen möchten, ist derzeit leider nicht verfügbar. Bitte versuchen Sie es später erneut.
    kommt bei dem DL von deinem Code

  • Aus i-einem Grund breakt mein BP auf der connect API nicht. Wie .Net bei einem HttpWebRequest connected, kann ich dir auch nicht sagen, auf jedenfall funktioniert deshalb die Umleitung per hosts Datei bzw. connect Hook auch nicht. .Net debuggen ist sowieso scheiße ^^, am besten du suchst dir ein CrackMe in nativem Code. .Net würd ich immer versuchen in Reflector zu decompilen und darüber was herauszufinden bzw. zu ändern.


    Dein Code dürfte soweit auch stimmen, bis auf den Port und das receiven. Der Port muss 80 sein, weil du ja einen WebServer emulieren willst (HTTP Port ist 80). Und bei deiner receive Methode bin ich mir nicht sicher ob das ns.Read blockiert, hab noch nie mit einem NetworkStream gearbeitet, wenn ja dann stimmt das so für ein Packet. Aber normalerweiße wird die Verbindung wieder geschlossen nach dem der Request abgeschlossen wurde. Also musst du prüfen ob was empfangen wurde, wenn ja Packet senden und dann die Verbindung schließen und nochmal accept callen und dann dasselbe nochmal.

  • Mit dem Reflector zu decompilen ist doch irgendwann mal langweilig.
    Und Port 80 kann ich nicht benutzen. Jedesmal kommt ein Fehler das der Port reserviert bzw. Benutzt wird.



    Also so wirkliche Fehler konntest du jetzt auch nicht finden ?
    Mal gucken. Werde wohl mal diesen AMrK anschreiben.

  • Nein, hatte ich nicht. Aber eben grade versuchst. Port ist offen aber das Programm connected sich einfach nicht auf mein emulierten crack "server".


    Hier nochmal die source: (Ist total komisch verschoben und Formatiert hier im Forum ...)


    Code
    1. using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.Net.Sockets;
    2. namespace Web_Crackme_Crack{ class Program { static void Main(string[] args) { //Console ändern Console.SetWindowSize(80, 60); Console.BackgroundColor = ConsoleColor.White; Console.ForegroundColor = ConsoleColor.Black; Console.Clear();
    3. // Variablen StringBuilder klartext = new StringBuilder(); StringBuilder modiefied = new StringBuilder(); bool connected = false; int receivedDataLength; byte[] data = new byte[1024]; string untouchetpacket = "485454502F312E3120323030204F4B0D0A5365727665723A206E67696E782F302E362E33320D0A446174653A205468752C2031342041707220323031312031343A33353A323120474D540D0A436F6E74656E742D547970653A20746578742F68746D6C0D0A5472616E736665722D456E636F64696E673A206368756E6B65640D0A436F6E6E656374696F6E3A206B6565702D616C6976650D0A582D506F77657265642D42793A205048502F352E322E362D312B6C656E6E7931300D0A0D0A350D0A66616C73650D0A300D0A0D0A"; string modifiedpacket = "485454502F312E3120323030204F4B0D0A5365727665723A206E67696E782F302E362E33320D0A446174653A205468752C2031342041707220323031312031343A33353A323120474D540D0A436F6E74656E742D547970653A20746578742F68746D6C0D0A5472616E736665722D456E636F64696E673A206368756E6B65640D0A436F6E6E656374696F6E3A206B6565702D616C6976650D0A582D506F77657265642D42793A205048502F352E322E362D312B6C656E6E7931300D0A0D0A340D0A74727565000D0A300D0A0D0A"; string sendpacket = "";
    4. // Normales Packet in Klartext for (int i = 0; i <= untouchetpacket.Length - 2; i += 2) { klartext.Append(Convert.ToString(Convert.ToChar(Int32.Parse(untouchetpacket.Substring(i, 2), System.Globalization.NumberStyles.HexNumber)))).ToString(); } // Modefiziertes Packet in Klartext for (int i = 0; i <= modifiedpacket.Length - 2; i += 2) { sendpacket = modiefied.Append(Convert.ToString(Convert.ToChar(Int32.Parse(modifiedpacket.Substring(i, 2), System.Globalization.NumberStyles.HexNumber)))).ToString(); }
    5. // Pakete anzeigen ... Console.WriteLine("Packet: \n" + untouchetpacket + "\n"); Console.WriteLine("Packet (ASCII): \n" + klartext + "\n"); Console.WriteLine("Packet to crack: \n" + modifiedpacket + "\n"); Console.WriteLine("Packet to crack (ASCII)... (send back to Client): \n" + sendpacket + "\n");
    6. // TCP Listerner TcpListener socket = new TcpListener(IPAddress.Any, 8080); socket.Start();
    7. // Clients akzeptieren (Warten) TcpClient client = socket.AcceptTcpClient(); NetworkStream ns = client.GetStream(); data = Encoding.ASCII.GetBytes(sendpacket); ns.Write(data, 0, data.Length);
    8. // Wenn connected dann Paket senden an den client while (connected == false) { data = new byte[1024]; receivedDataLength = ns.Read(data, 0, data.Length); Console.WriteLine(Encoding.ASCII.GetString(data, 0, receivedDataLength)); ns.Write(data, 0, receivedDataLength); connected = true; } // Normale Consolenausgabe Console.WriteLine("\nSuccessfully cracked ;)");
    9. // Networkstream Schließen ns.Close(); // TCP Client schließen client.Close(); // TCP Listener Schließen socket.Stop(); } }}


    und meine Host datei:
    127.0.0.1 213.229.72.62



    Mir ist gerade aufgefallen, dass wenn ich die IP 213.229.72.62 im Browser eingebe ich nicht auf 127.0.0.1 umgeleitet werde.
    Ist das der Fehler ?

  • Ich sag ja, da wird connect nicht gecalled, deshalb wirst du auch nicht umgeleitet.


    Das mit dem Port 80 ist merkwürdig, hast du sonst noch i-was offen, was einen WebServer emulieren könnte? Z.B. Apache?

  • Ne ich mein nicht dass du einen Server mittels Apache simulieren sollst. ich wollte nur wisse ob du etwas derartiges geöffnet hast, das würde dann nämlich erklären warum du keinen Socket auf den Port 80 binden kannst.

  • Skype, Xammp etc. nichts läuft.
    Außer IIS7. Bekomme es aber irgentwie nicht aus.


    // EDIT:
    IIS7 Deaktiviert. Port 80 ist jetzt frei. Trotzdem funktioniert es noch nicht.


    // EDIT 2:
    Glaube es liegt wirklich an der Host datei.
    Weil man kann irgentwie nur eine url bzw. fqdn auf eine andere adresse zuweisen.
    Also :
    127.0.0.1 google.de
    und nicht
    127.0.0.1 74.125.79.147

  • Also ich hab den Thread jetzt mal überflogen und werde euch über ein paar Mysterien des sniffens und redirecten aufklären :D


    Zuerst fang ich mal mit der Hosts-File an:
    Die Hosts-File ist keine Datei zum Umleiten von Verbindungen! Das muss euch erstmal klar werden... in der Hosts-File gehören nur DNS (Domain Name System) -Namen, also sowas wie www.google.de ... Die Hosts-File ist dazu da um Computernamen/DNS-Namen in die IP-Adressen aufzulösen... Hier ein Beispiel:
    Wenn ihr auf www.google.de geht, wird nicht ein paket an www.google.de geschickt... nein... zuerst werden Name-Server nach "www.google.de" gefragt... diese geben auch dann die dazugehörige IP und mit dieser IP wird dann die TCP-Verbindung hergestellt... die Hosts-File macht im Prinzip genau dasselbe, nur lokal... also wenn ihr auf www.google.de geht, wird zuerst die Hosts-File nach diesem Namen durchsucht und falls er gefunden wird, wird die eingetragene IP verwendet...
    Man kann also keine Weiterleitung von einer IP zu einer anderen IP machen ;)
    Jetzt ist die Frage, wie man an den DNS-Namen eines Servers rankommt...
    Dazu benutzt man Tools wie "Reverse IP". Wie der Name schon sagt, passiert hier das Ganze genau andersrum: Man gibt eine IP ein und erhällt einen DNS-Namen, welchen man dann per Hosts-File redirecten kann...
    Beispiel: IP vom Forum ist: 178.63.55.73
    Über http://www.domaintools.com/res…ip/?hostname=178.63.55.73 bekommt man dann http://www.stagetwo.eu und http://www.stagetwo.eu raus :)


    Jetzt aber zurück zu der CrackMe:
    Hier wird es schwieriger, denn nicht jede IP hat auch einen DNS-Namen (ist ja logisch, denn DNS-Namen sind nicht notwendig um einen Server zu haben ;))... Das ist leider auch bei dem Server der CrackMe (213.229.72.62) der fall...


    Allgemein ist die Hosts-File eher ungeeignet für public Releases, da nicht jeder Zugriff auf diese hat und es umständlich für den Endanwender ist ;)



    Daher war die Idee mit dem Hooken schon die bessere...
    Hier muss man wie oben bereits geschrieben sich endscheiden ob man das Senden oder das Empfangen manipulieren möchte...
    Mein Senden muss man einfach nur einmalig die Verbindungsinformationen abändern (von der IP 213.229.72.62 auf 127.0.0.1). Dann baut man sich nen kleinen HTTP-Server und schon hat man das Problem ausser Welt :)
    Das manipulieren des Empfangens ist umständlicher, brauch aber keinen extra Server... hier müssteste du bei jedem Recv überprüfen, was für ein Paket dein Client jetzt erwartet und es dementsprechend nach deinem belieben manipulieren... Ist aber auch nicht die Welt :)


    Ich habe gelesen, dass ihr momentan beim Hooken Probleme habt und habe deswegen noch eine letzte Alternative :)
    File Manipulation:
    File Manipulation ist wie der Name sagt, dass manipulieren/bearbeiten von Dateien. Ihr könnt es in etwa gleichsetzten mit "OllyDBG öffnen, Code durchwühlen, passende stelle JMP'en, speichern"... Nur das es viel simpler ist. Ihr müsst euch nur klar werden was ihr wollt... und das ist nicht die Verbindung weiterleiten auf euren eigenen Server ;) Es ist eine Verbindung zu eurem Server... Jetzt fragt ihr euch vielleicht, was das für einen Unterschied macht und was ich fürn sinnlosen Quatsch von mir gebe, aber es ist ganz einfach: Ihr ändert einfach die Ziel-IP :D
    D.h. ihr nehmt euch einen Hex-Editor (PSPad ist meine erste Wahl) und öffnet damit die File. Dort sucht ihr jetzt nach der IP.... nicht als kompletten String, sondern nach den ersten Buchstaben ("2"), denn ich weiß aus Erfahrung, dass komplette aneinanderhängende Strings selten sind ... Ihr sucht also solange nach der 2, bis ihr ein Muster entdeckt, was eure IP ist... in unserem Fall sollte der Text ca so aussehen: 2.1.3...2.2.9...7.2...6.2 oder als Hex: 3200 3100 3300 2E00 3200 3200 3900 2E00 3700 3200 2E00 3600 3200 ... Nun müsst ihr nurnoch die einzelnen Zahlen durch eure Ziel IP ersetzten: 1.2.7...0.0.0...0.0...0.1


    Dann richtet ihr euch einen kleinen Server ein (ich hab gerade zum Testen einfach Xampp genommen und mir eine Datei namens "wrpMtPBbrG9yzKNqSmxyB8KJWIpM24.php" erstellt, die einfach nur true ausgibt und schon war ich drin... das könnt ihr natürlich aber auch selbst Programmieren :)


    Falls ihr Probleme habt einfach Posten und zur Sicherheit habe ich euch die gecrackte Datei mal rangehängt (VT):Web CrackMe 1_redirected.zip


    Viel Spaß euch noch und bei Fragen einfach posten :)

  • Thanks AMrK und dongdong ;)


    Ich habe das jetzt so gemacht.
    Ich habe im Hex editor die IP geändert. So wie es AMrK gemacht hat.
    Danach habe ich die exe gestarted und bei Alive stand Offline und ich konnte nichts eingeben ...
    Dann habe ich mir das Programm nochmal bei WPE Pro angeguckt.
    Das Alive Packet habe ich gefunden.
    Also sende ich erst das alive packet. Das tool funktioniert. Danach schicke ich das Paket mit der True antwort ;)
    It works;)


    http://image.cp-g.de/pics/4da96c3bbabd2.jpg.html


    Danke leute ;)

  • Danke für den aufschlussreichen Post AMrK, das mit der Hosts Datei wusste ich z.B. nicht ;)


    Allerdings stimmt der Teil mit dem IP String nicht ganz. Der String hängt schon zusammen, ist nur Unicode, deshalb sind auch die 00'en dazwischen. Ich weiß gerade nicht wie ein String aussehen sollte, der nicht an einem hängt, das Programm wüsste ja gar nicht wo der String anfängt und endet bzw. zwischendrin aufhört und i-wo anders weitergeht. Also sucht man im Hex-Editor am besten zuerst nach dem ASCII String und wenn man da nichts gefunden hat nach dem String im UNICODE Format.
    Bei dieser Methode muss der string allerdings auch im Klartext in der Datei stehen. Wenn der String gecryptet gespeichert wird, wenn die Datei z.B. gepackt oder gecryptet ist, findet man wiederrum nichts. Deshalb würde ich einen Hook im allgemeinen vorziehen :)


    Ich weiß mittlerweile auch warum mein BP auf der connect API nicht getriggered hat. Anstatt connect wird WSAConnect benutzt :)

  • du missverstehst mich... man kann soweit ich das gesehen hab mit pspad nur nach ascii-strings suchen... ich fand nur einfach die informationen über ascii 1 byte, unicode 2 byte etc überflüssig in dem zusammenhang, da man nur wissen muss, das man nicht nach einem ascii string suchen darf^^ aber trotzdem danke für die genauere erklärung ;)