Challenge3

  • Hab ich da etwas falsch verstanden? Ich geben nach dem Telnet gangsta 2000 folgendes sinngemäß ein:
    UID PASSW
    Als Ergebnis bekomme ich aber weder eine Fehlermeldung noch sonst was, sondern nur Connection closed by foreign host. Hab ich da bzgl. Benutzername und Passwort etwas falsch verstanden

  • Quote

    The main difference to the previous challenges, however, is that the server is remote and you do not get any feedback from it once you send packets to it.

    das passt schon so.

  • Nagut, ich dachte mit Feedback seien zB "Absturzmeldungen" (Segfault etc.) gemeint. Aber wenn man sich anmeldet, sollte man doch eine "reguläre" Serverantwort bekommen. Wozu verwendet man dann überhaupt die Benutzerdaten?

  • Da hast wohl Recht. Danke für die Info.

    Eine Frage, wenn ich noch darf. Damit ich das im gdb ausprobieren kann, hab ich die auth.c und dazugehörige Funktionen ersetzt, weil die wird ja nicht angeboten. Ich kann das ganze auch korrekt lokal starten und mich lokal verbinden, aber wenn ich es im gdb laufen lassen will (run server 3100) kommt folgende Fehlermeldung vom gdb:


    No executable file specified.
    Use the "file" or "exec-file" command.

  • Ja so würd ichs auch machen, aber dann kommt die Fehlermeldung:

    Failed to read a valid object file image from memory.

    wie gesagt wenn ichs direkt ausführe, dann gehts.

  • da ist bei mir noch gegangen...


    jetzt kommt bei mir immer:

    Code
    1. Starting program: /home/uebungen/inetsec/inetsec.../challenge3/server 200
    2. Failed to read a valid object file image from memory.
    3. error: bind: Permission denied
    4. Program exited with code 01.
  • Also bei mir hats da überhaupt etwas. Wenn ich die while Schleife deaktiviere, beendet gdb das Programm sofort und zB p$ eip gitb "no registers" aus, wenn mit telnet die Verbindung aufgebaut wird.

    Verwende ich das Programm mit while Schleife, so kommt es ja nie zu Ende und ich kann mir den Stack auch nicht anschauen. Gehe ich es step für step durch, dann stürzt es jedoch ab.

    Mach ich da etwas falsch oder muss man in einer bestimmten Zeile einen breakpoint setzen? Wenn ich zB eingebe break strcpy und dann eine Verbindung mache und Zeichen übertrage, dann gelangt gdb nie zu diesem strcpy.

  • Hallo,


    Quote

    \x90 zählt er als 4 Zeichen statt als 1 Byte.


    du lässt server im gdb rennen, connectest (o gott was für ein wort) dich mit telnet localhost <port> und gibst \x90 ein? dann empfängt der server '\', 'x', '9', '0'. also 4 zeichen. (wie du richtig schreibst...)
    es ist aber sowieso wenig praktikabel, shellcode mit telnet zu füttern. die naheliegende lösung dafür wäre, ein clientprogramm zu schreiben, das idealerweise auch gleichzeitig den shellcode generiert und dann dem server schickt...;)


    frank99: du deaktivierst die while-schleife im server? warum?



    viel erfolg,
    onkel_keks

    [chaas4747]: What the hell is a defence?
    [dermalin3k]:
    It's that wall in deyard between dehouses.

  • Hallo,

    frank99: du deaktivierst die while-schleife im server? warum?




    Naja es funktioniert mit deaktivierter while Schleife eh nicht. Das Problem ist, dass mit while(1) das Programm ja ständig läuft. Ich schaff es dann nicht im gdb zB den übergelaufenen Stack abzufragen.

  • was meinst du mit abfragen? wenn du einen buffer overflow zustande bringst, wirst du das ziemlich sicher bemerken - normalerweise bekommt man dann einen segmentation fault weil die adresse (noch) nicht passt. wenn dein server einfach weiter macht, läuft der buffer wahrscheinlich nicht über.
    setz doch einfach im gdb einen breakpoint auf die verwundbare codezeile im server, lass ihn laufen, verbinde dich (zb über eine parallele ssh-session) mit dem lauschenden server und versuch, den puffer zum überlaufen zu bringen.
    btw: hast du das fork-zeug in deiner lokalen server.c - version disabled?

    [chaas4747]: What the hell is a defence?
    [dermalin3k]:
    It's that wall in deyard between dehouses.

  • Die Frage ist nur, wie finde ich heraus, welche Zeile im Executable der verwundbaren Zeile im .c entspricht.

    Nein, das Fork hab ich nicht geändert, nur die Prüfung bzgl. uid. Mit disableden fork gehts, vielen DANK! Aber wozu ist das fork eigentlich?

  • Quote

    Die Frage ist nur, wie finde ich heraus, welche Zeile im Executable der verwundbaren Zeile im .c entspricht.


    wenn man gcc gaaanz lieb mit einem '-g' darum bittet, sieht man im gdb mit 'l' (oder 'list') den sourcecode inkl. zeilennummer und kann breakpoints auf zeilennummern setzen.


    Quote

    Aber wozu ist das fork eigentlich?


    damit der serverprozess schneller neue requests beantworten kann - indem ein eigener prozess für das handeln von eingegangenen requests geforkt wird, kann der ursprüngliche server gleich wieder zum lauschen übergehen.

    [chaas4747]: What the hell is a defence?
    [dermalin3k]:
    It's that wall in deyard between dehouses.

  • Irgendwie will mich das nicht :/



    ich kann server.c am bandit ohne Probleme "exploiten", mit und ohne FORK.
    Benutzername und Passwort geb ich auch an :/


    wenn ich jetzt aber auf gangsta das ganze versuche geht nichts...
    versuch schon seit gestern Abend auf gangsta mit unterschiedlichen speicher Adressen rum aber bis jetzt ohne Erfolg... (hab 0xbfff2cb0 bis 0xc000b346 durchprobiert) auch die adressen hab ich bei unterschiedlichen Adressen starten lassen. :/


    irgendwer ne Idee?

  • Was versuchst du denn mit deinem shellcode auszufuehren? Mein erster Versuch ist daran gescheitert dass es am bandit ein executable gibt dass es am gangsta nicht gibt ...


    cheers, a.

  • Also ich versuche /bin/sh auszuführen und an einen Port zu binden.


    Willst du damit sagen das es dort /bin/sh vl gar nicht gibt?