IP/TCP Packete

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
slartibartfas
User
Beiträge: 6
Registriert: Donnerstag 29. August 2013, 22:02

Grüezi Wohl

Eine frage und ernsthaft, ohne jegliche hintergedanken und verbreite ich hier "doofe" ideen so löscht diesen Faden und beantwortet es per PM.

Ich habe die Tage einen Netzwerk-Packete "RAW_SOCK" Sniffer gebastelt, nur um zu sehen ob es klappt und ich es richtig verstanden habe, es hat geklappt.

Jetzt die frage:

Könnte ich rein theorethisch, selber Packete, ein ip und ein tcp bauen und versenden, an jede IP die mir grad so beliebt und auch "online" ist. evtl. sogar mit befehlen drin, die das jeweilige OS, "sofern bekannt" versteht ?

Also eig. ist es möglich befehle, aufgeteilt in packeten zu versenden? ein packet, hat ja nur eine bestimmte anzahl an "grösse" deshalb, müssten es ja zwangseise mehrere sein.

Also bitte nicht falsch verstehen, es kamm mir nur der gedanke, ob es möglich ist und nicht die absicht es zu tun. Ich interessiere mich sehr für Netzwerk-programmierung und behersche einigermasen C und mehr dafür Python. Auch wen es möglich ist werde ich dies nicht tun, ich denke einfach, für mich als Hobby Programmierer und nicht Studierter, ist der gedanke zu simpel, als es funktionieren könnte.

Freundlichst grüsse ich Euch

Der Slartibartfas

Geheiligt sei die 42 ! ;)
BlackJack

@slartibartfas: UDP-Pakete und TCP-Verbindungen kannst Du auch ohne „raw” Sockets erstellen und verschicken. Das sind schliesslich ganz normale Vorgänge die alle mögliche Client-Software macht. Natürlich könntest Du UDP und TCP mit rohen Paketen auch nachbauen wenn's Dir Spass macht. Aber warum sollte man das tun wollen wenn es das schon fertig gibt?

Was Du da von „Befehlen”, erzählst die grösser als ein UDP-Paket sind, ist mir ein Rätsel.
slartibartfas
User
Beiträge: 6
Registriert: Donnerstag 29. August 2013, 22:02

BlackJack hat geschrieben: Was Du da von „Befehlen”, erzählst die grösser als ein UDP-Paket sind, ist mir ein Rätsel.
Ah ok, ja wen es eine reihe von befehlen sein sollte, müsste man es ja aufteilen, da ein packet eine bestimmte grösse hat und man da nicht einen ganzen roman reinpacken kann ;)

Wie gesagt es ist nur ein hobby von mir und bin kein studierter ;)

über tipps zur entsprechender Literatur wäre ich übrigends auch dankbar. Kaufe ungern einfach drauflos Bücher. ;)
BlackJack

@slartibartfas: Okay, mir wäre auch ein Rätsel was das für „Befehle” sein sollten die in ein Paket passen. Ich denke Du hast da ein paar falsche Vorstellungen. Man kann so allgemein keine „Befehle” an ein Betriebssystem senden die ausgeführt werden. Es gibt viele verschiedene Client/Server-Software die über UDP und/oder TCP kommunizieren. Das ist aber alles keine Magie sondern in der Regel gut dokumentiert, solange es keine proprietären Protokolle sind.

Das was Du schreibst ist viel zu schwammig. Was willst Du denn *konkret* machen? Einfach irgendwelche „Befehle” verschicken ist ja kein Selbstzweck. Welches konkrete Problem willst Du lösen?
cruzer*
User
Beiträge: 21
Registriert: Mittwoch 4. September 2013, 10:50

Hallo,
ich befasse mich mit einer ähnlichen Frage.

Ich möchte ein DNS-Anfrage über einen RAW socket senden. Ja ich weiß es geht ganz einfach über einen DGRAM Socket. Ich möchte aber einen RAW Socket verwenden.

Also muss ich auf meine DNS-Anfrage die ich schon habe einen UDP Header legen und darüber einen IP Header und ab die Post.
Ich habe gelesen, dass es mit dpkt sehr einfach sein soll, finde aber leider nirgends etwas dazu. Kennt jemand eine gute dpkt Dokumentation oder kann mir weiterhelfen?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das Modul bietet doch eine direkte Abbildung auf die Spezifikation. Du musst einfach nur die entsprechenden Header erstellen und schachteln. Auf der Projektseite ist das doch auch gleich das Beispiel. Ein ICMP-Paket in einem IP-Paket.
Das Leben ist wie ein Tennisball.
cruzer*
User
Beiträge: 21
Registriert: Mittwoch 4. September 2013, 10:50

Okay damit kann ich ein IP Paket erstellen aber woher weiß ich was ich für:

Code: Alles auswählen

>>> icmp = ICMP(type=8, data=ICMP.Echo(id=123, seq=1, data='foobar'))
einsetzten muss? also data ist klar, da kommt meine DNS Query rein. Aber der rest?

Also anstelle von icmp

Code: Alles auswählen

from dpkt.udp import UDP

udp = UDP(dport=53, sport = 2112, data = DNSQUERY)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dann schaust du dir am besten jetzt mal das OSI-Modell an und sucht heraus, auf welchem Layer sich DNS befindet (ich vermute einfach mal auf dem Application Layer). Die Header bis Layer 3 musst du dann nur noch verschachteln.
Das Leben ist wie ein Tennisball.
cruzer*
User
Beiträge: 21
Registriert: Mittwoch 4. September 2013, 10:50

So ich habe nun meine IP Header + Daten, den UDP Header + Daten und die DNS Query

Jedoch wird keine DNS Anfrage gesendet (getestet mit Wireshark).
Wo ist mein Fehler?

Code: Alles auswählen

SOURCE_PORT = random.randint(1025,65556)
DEST_PORT = 53
QUERY_DNS = '\xde\xa3\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08facebook\x03com\x00\x00\x01\x00\x01'

def creatPacket(dest_ip, ttl):
    saddr = socket.inet_aton(getNetworkIp())
    dest = socket.inet_aton(dest_ip)

    ip = IP(src=saddr , dst = dest, p = 17, ttl=ttl)

    udp = UDP(dport = DEST_PORT, sport=SOURCE_PORT, data = QUERY_DNS)

    ip.data = udp
    ip.len +=len(ip.data)
    pkt = str(ip)
    return pkt 


def getNetworkIp():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(('google.com', 0))
    return s.getsockname()[0]


s = socket.socket(socket.AF_INET, socket.SOCK_RAW)
s.settimeout(4)
s.sendto(creatPacket("8.8.8.8", 30),('8.8.8.8',53))
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Startest du dein Programm mit den benötigten Rechten? Nich jedes Programm darf einfach über raw sockets Daten verschicken oder gar empfangen.
Das Leben ist wie ein Tennisball.
cruzer*
User
Beiträge: 21
Registriert: Mittwoch 4. September 2013, 10:50

ich starte es über cmd mit Adminrechten.

Code: Alles auswählen

>>> pkt
'E\x00\x00:\x00\x00\x00\x00@\x11\xe9\xf5\xc0\xa8\xc0\x05\x08\x08\x08\x08\x08\xa4\x005\x00\x08\x0ct\xde\xa3\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08facebook\x03com\x00\x00\x01\x00\x01'
>>> IP(pkt)
IP(src='\xc0\xa8\xc0\x05', dst='\x08\x08\x08\x08', sum=59893, len=58, p=17, data=UDP(dport=53, sum=3188, sport=2212, data='\xde\xa3\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x08facebook\x03com\x00\x00\x01\x00\x01'))
cruzer*
User
Beiträge: 21
Registriert: Mittwoch 4. September 2013, 10:50

Falls jemand das selbe Problem hat, habe den Fehler gefunden.

dpkt.udp.UDP rechnet die Länge der Daten nicht mit ein.
also fehlt:

Code: Alles auswählen

udp = UDP(dport = DEST_PORT, sport=SOURCE_PORT, data = QUERY_DNS)
udp.ulen += len(QUERY_DNS)
Antworten