• inet_addr(char *ip_addr)

    “I don’t really care which Linux distribution they use, as long as it’s free. Free as in freedom, not as in free beer, by the way. Free as in free beer would be very cool anyway.”



  • I have a weird problem here (feel free to answer in german).


    I couldn't implement the checksum. It sounds stupid, but every function that I would come up with didn't match what wireshark was expecting.
    So i thought "let's not reinvent the wheel/let's steal somebody else's code". I ended up embedding chunks of wireshark code into my file :D
    You have no idea how ugly it is but that code is supposed to work, right? Wireshark has two functions: one function is concerned with checking if the checksum is right (if the procedure ends with 0xFFFF) and the other can infer the right checksum if the result of the first is different than 0xFFFF. For some unknown reason (i guess it happens when you blindly use somebody else's code and you write some dirty lines of C to interface with it) the second function doesn't work, while the first works correctly.
    So i ended up having a decision procedure for the correctness of the checksum: given the small search space (2^16), bruteforcing the checksum is easy.
    I wrote a simple python test script to send MANY spoofed packets to myself and wireshark was happy with the checksum of all of them.
    I moved the file to the server lab, sent a packet to master and it was accepted. Time to submit the solution...
    "Your solution did not send the correct UDP packet to our server :-("
    I really don't know what is wrong with my program. I would understand if the grading system would say "this is an ugly hack, i could write the same thing in 2 lines of code!", but i'm pretty sure the packets are sent correctly :-)
    Anybody had that error and ended up finding that something else was the cause? Or should i really accept that the grading bot is able to generate in 10 seconds a packet with an invalid checksum while i wasn't able to generate it in 5 minutes?


    Thanks

  • fixed the wireshark checksum calculator, now I don't bruteforce anymore. Flooded myself with 30000 packets (with random IPs and port except for the target which has to be 127.0.0.0/24), all packets have valid checksum. The grading system still complains :-(
    From bandit, packets are not accepted by master if the source is not 193.168.0.0/8, but i think this is more of a firewall policy than a problem... i can use any source address when i flood myself.

  • so does master.inetsec.edu accept your packets now?
    as for the grading robot problem: try to clone the answer packet from the dump files provided on the course website (spoof.dump and dns.dump). you should be able to create identical packets with your code except for the ethernet header, obviously. diff is your friend here. or fc, for that matter). if there is anything different in the packets generated by your program, this might be the error.

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

  • fixed the wireshark checksum calculator, now I don't bruteforce anymore. Flooded myself with 30000 packets (with random IPs and port except for the target which has to be 127.0.0.0/24), all packets have valid checksum. The grading system still complains :-(
    From bandit, packets are not accepted by master if the source is not 193.168.0.0/8, but i think this is more of a firewall policy than a problem... i can use any source address when i flood myself.


    on your local host you are using 127.0.0.1 as the destination address. did you also implement it to take the destination from the arguments of dnsspoof?

    “I don’t really care which Linux distribution they use, as long as it’s free. Free as in freedom, not as in free beer, by the way. Free as in free beer would be very cool anyway.”



  • this is the packet that i generate with:
    ./dnsspoof 80.80.80.80 128.130.60.24 10000 100.100.100.100

    and here is the spoof.dump packet:

    As you can see, they are identical except for the ethernet frame.
    The packets are correctly accepted by the master.inetsec.edu server and displayed as valid lab dns replies, yet i still get a negative response from the grading bot.
    I was wondering if
    1) i have to support hostnames as well
    2) i have to do sanity checks for the arguments (now i just check argument number
    3) i have to suppress all output

  • Ich habe mir gerade die Aufgabenstellung durchgelesen, jedoch sind mir einige Dinge unklar:
    - Wird hier immer nach der IP Addresse von inetsec.seclab.tuwien.ac.at gefragt?
    - Erhalten wir das zu verändernde Paket (immer) von dns.dump oder geht es hier (nur) um Antworten zu diesem spezifischen dns.dump?

  • Quote


    I was wondering if
    1) i have to support hostnames as well
    2) i have to do sanity checks for the arguments (now i just check argument number
    3) i have to suppress all output

    1) - no
    2) and 3) maybe. my working program did not produce any output to stdout (except in case of an error). and i checked for the proper formatting of the arguments.



    Quote


    - Wird hier immer nach der IP Addresse von inetsec.seclab.tuwien.ac.at gefragt?

    es scheint auf master.inetsec.edu eine firewall o.ä. zu geben, angeblich (da von mir ungetestet) werden auf der website nur pakete angezeigt, deren source-ip im selben netz liegen wie master.
    edit: ach so, jetzt verstehe ich was du meinst. also rein prinzipiell ist es egal, nach welcher adresse gefragt wurde. du sollst nur - unabhängig von einem dns request - ein dns reply paket generieren. mit einer durch kommandozeilenparameter festgelegten antwort-ip.


    Quote


    - Erhalten wir das zu verändernde Paket (immer) von dns.dump oder geht es hier (nur) um Antworten zu diesem spezifischen dns.dump?

    du sollst kein paket verändern sondern eines erstellen/generieren - nämlich ein DNS reply. ich hab als dns id die id von dns.dump genommen (hardcoded); falls die frage noch auftaucht.


    viel erfolg
    onkel_keks

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

    Edited once, last by onkel_keks ().

  • 1) - no
    2) and 3) maybe. my working program did not produce any output to stdout (except in case of an error). and i checked for the proper formatting of the arguments.


    switched to inet_aton to check for correctness and removed output, the program is still incorrect :-(
    I'm really running out of ideas...

  • Maybe try generating packets with different ip addresses, different ports etc. and see if the checksum is always valid. how do you use those wireshark functions? are you linking some module or did you rip the code, i.e. copy/paste the source? (btw: its really not that difficult to code the algo but hey - interesting approach :p)

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

  • [...]es scheint auf master.inetsec.edu eine firewall o.ä. zu geben, angeblich (da von mir ungetestet) werden auf der website nur pakete angezeigt, deren source-ip im selben netz liegen wie master.
    edit: ach so, jetzt verstehe ich was du meinst. also rein prinzipiell ist es egal, nach welcher adresse gefragt wurde. du sollst nur - unabhängig von einem dns request - ein dns reply paket generieren. mit einer durch kommandozeilenparameter festgelegten antwort-ip.

    Erstmal danke für die Hilfe, jetzt wird mir die ganze Sache etwas klarer... Woher aber kenne ich dann die genauen UDP Daten (bspw. den hostname nach dem der dns server gefragt worden ist)?


    du sollst kein paket verändern sondern eines erstellen/generieren - nämlich ein DNS reply. ich hab als dns id die id von dns.dump genommen (hardcoded); falls die frage noch auftaucht.


    viel erfolg
    onkel_keks

    Was genau meinst du mit der DNS ID? Ich nehme mal an du meinst die Transaction IDs des DNS Replys?
    Woher kenne ich die ID des IP Headers?
    Muss der IP Header bzgl. Checksumme ebenso korrekt sein?


    Danke erneut :)

  • Maybe try generating packets with different ip addresses, different ports etc. and see if the checksum is always valid. how do you use those wireshark functions? are you linking some module or did you rip the code, i.e. copy/paste the source? (btw: its really not that difficult to code the algo but hey - interesting approach :p)


    that's what i did: i flooded myself calling dnsspoof 30000 times and ended up with 100% correct checksums.


    Code
    1. import commands
    2. from random import randrange as r
    3. for i in range(300000):
    4. comm = "sudo ./dnsspoof %d.%d.%d.%d %d.%d.%d.%d %d %d.%d.%d.%d" % (r(1,254), r(1,254),r(1,254),r(1,254),127,r(1,254),r(1,254),r(1,254),r(1,65300),r(1,254),r(1,254),r(1,255),r(1,255))
    5. output = commands.getoutput(comm)


    As you can see, the distribution should not be that biased :-)


    You can't include any other sources because the grading bot uses a specified makefile. I embedded the code of the checksummer (which had very few dependencies that needed to be included themselves, just a structure and a couple of typedefs) and read the udp dissector to understand how i could build up the arguments needed for the checksum calculation.
    I know the algorithm is supposed to be easy, that's why i feel dumb :-)

  • So, jetzt hat's mich auch bei der checksum erwischt :shiner:


    Also - ich habe einen Algorithmus für die IP Header Checksum (der funktioniert laut Wireshark). Diesen hab ich auch verwendet, um damit die UDP Checksum zu erzeugen - dh einfach mit UDP Pseudo Header + UDP Header gefüttert. Ohne Datensegment funktionierte das auch noch...


    Jetzt hab ich nur mehr das UDP Packet vergrößert und die Daten angehängt und die UDP Checksum stimmt mir nicht mehr :wein:


    Könnte das vielleicht wer bestätigen, ob beide den gleichen Algorithmus verwenden (IP und UDP). Ich glaube zwar, dass mein Fehler irgendwo beim Daten anhängen liegt, habe aber noch nix gefunden. Achja und das Padding Byte bringt bei mir auch nix. Zumindest bekam ich, bei sowohl mit und ohne Padding, idente Checksums. :confused:

  • Drago:

    Quote


    Woher aber kenne ich dann die genauen UDP Daten (bspw. den hostname nach dem der dns server gefragt worden ist)?


    musst du gar nicht kennen. wie gesagt geht es hier nur darum, ein dns reply packet zu generieren; du musst kein ganzes dns hijacking durchziehen. du schickst quasi eine antwort ohne jemals eine frage bekommen zu haben. wie manche leute das auch im alltag tun...:p
    und ja, mit ID mein ich die transaction id.


    Quote


    Woher kenne ich die ID des IP Headers?


    Meinst du das identification feld? das dient nur zur identifikation bei fragmentierung, die hier nicht auftritt. siehe beliebige ip-header-doku.



    BruceBerry:
    well there must be some reason why the bot rejects your solution (at least i hope so). have you tried compiling with -Wall option? no warnings?
    if there are indeed no warnings, you might want to consider contacting one of those "gurus" at iseclab.


    Mulambo:
    ich hab bei beiden den gleichen algorithmus bei udp und ip checksum (~(1's complement)). hast du auf die endianness geachtet?

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

  • Danke mal, aber ich sollte überall htons() verwendet haben. Mein Packet sieht ganz genau so aus wie das vom spoof.dump (im Wireshark - bis auf die ersten paar Bytes vor dem IP Header). Der einzige Unterschied ist die Checksum, welche bei mir 0xa2c4 ist ... Ja, ich weiß, der Wert sagt so ned viel aus :)

  • ich versuch grad das packet vom dns.dump nachzubaun, das einzige was ich richtig hin bekomme ist der ip-header, vorher und nachher zeigt wireshark nur mehr 0x00 an :confused: (im udp datagram hab ich fast sicher noch byteorder fehler aber daran solls nicht liegen, oder?)
    weiters kann ich bei der ip-checksum eintragen was ich will, am wireshark kommt immer die richtige an.


    hier der dump (es wird die richtige anzahl von bytes übertragen)


    hat jemand einen tipp für mich?


    EDIT: hat sich erledigt, war gestern wohl schon zu spät fürs zählen...

  • EDIT: Hab grade bestanden, aber kA warum es nicht ging... Bei mir kam kein einziges Paket auf dem master an und der robot hat trotzdem nicht gemeckert. Ich komm mir mit der Frage jetzt zwar blöd vor, aber die IP vom master ist doch 193.168.0.1:10000 :confused:
    kA warum es sonst nicht angekommen wäre ....



    Achja und was bei mir NICHT ging war das beenden des Programms mit exit(0). Deswegen hat bei mir der grading robot das Programm nicht akzeptiert. Blöder Fehler :D

  • Bei mir hat master komischerweise auch nix angezeigt, auch wenns der Robot am Schluss akzeptiert hat. Debugging war also dementsprechend eher mühsam.


    Ich hatte den Fehler, dass ich die Checksum zu früh berechnet hab, bevor ich alle Felder im Packet gesetzt habe.

    "Sausen Sie mit mir ins Laplace-Land" - KAISER 4ever :D

  • Drago:
    BruceBerry:
    well there must be some reason why the bot rejects your solution (at least i hope so). have you tried compiling with -Wall option? no warnings?
    if there are indeed no warnings, you might want to consider contacting one of those "gurus" at iseclab.


    no warnings. i already sent it to the seclab guys, i hope they can at least tell me what test on the grading bot is failing :-(