Solyaris #5: Im Kernelspace UDP Packete senden

| | Comments (0) | TrackBacks (0)
UDP Packete, welche von einem Netzwerkinterface empfangen werden, abzufangen ist einfach:
inetsw[ip_protox[IPPROTO_UDP]].pr_input = input_hook_udp;
UDP Packete, welche von einem Prozess gesendet werden, abzufangen ist auch einfach:
inetsw[ip_protox[IPPROTO_UDP]].pr_usrreqs->pru_send = udp_send_hook;
So konnte ich sehr schnell den DNS Channel mit "Packet Exchange" implementieren. Den Packetinhalt auszutauschen erschien mir aber zu komplex, umständlich und unsicher, also wollte ich direkt vom input_hook_udp() die Antwort zurücksenden.
Ich habe die letzten paar Tage den Kernel studiert und bemerkt, dass das doch nicht so trivial ist wie ichs mir vorgestellt habe.
Letzendlich habe ich darauf verzichtet, einen eigenen Socket zu erstellen und wollte udp_output() benutzen (nicht etwa ip_output()). udp_output() braucht aber als Parameter einen Thread, welchen aber die Funktion input_hook_udp() nicht besitzt.
Mithilfe der unten aufgezählten Bücher fand ich schlussendlich heraus, wie ich an den Thread td kommen kann:
Einfach über alle vorhandenen Prozesse laufen (curthread->td_proc->p_list), und auf jedem solchen Thread all seine Files (proc->p_fd) die Sockets finden, und vergleichen ob der Prozess den richtigen Socket besitzt. Richtig heisst: identisch mit inpcb->inp_socket (inpcb kann man leicht min inpcb_lookup_hash() finden).

Nebenbei bemerkte ich aber, dass die udp_output() Funktion nur beschränkt auf die Thread Struktur zugreift, eigentlich nur auf td.td_ucred. Ein einfaches Fake-Argument (welches nur aussagt, dass der Fake-Thread nicht Jailed ist):

struct thread td;
struct ucred cred;
cred.cr_prison = NULL;
td.td_ucred = &cred;

und schon läufts mit udp_output(). Eine sehr viel einfachere Lösung als die Doppelschleife der korrekten Lösung, und um einiges performanter


Unglaublich nützliche Bücher:

TCP/IP Illustrated Volume 1: The Protocols (W. Richard Stevens) (amazon)
Beschreibt detailiert viele Protokolle, unter anderem DNS. Sehr nützlich um Covert Channels zu implementieren.

TCP/IP Illustrated Volume 2: The Implementation (W. Richard Stevens) (1995) (amazon)
The Design and Implementatiuon of the 4.4BSD Operating System (McKusick, Bostic, Karels, Quarterman) (1996) (amazon)
Ich finde es erstaunlich, fast schon unglaublich, dass die Beschreibung von 4.4BSD (aus dem FreeBSD entstanden ist) und seiner TCP/IP Implementierung heute noch in FreeBSD 6.3 ohne Probleme als Referenz gebraucht werden kann. Der Code hat sich fast nicht verändert, er wurde bloss erweitert; die wichtigsten Funktionen heissen immer noch gleich, die Parameter sind diesselben oder nur leicht anders. Und dass bei Büchern und Software, die über 10 Jahre alt sind (eine Ewigkeit in der Informatik).

Ich freue mich, dass diese exzellenten Standardwerke immer noch aktuell sind.

0 TrackBacks

Listed below are links to blogs that reference this entry: Solyaris #5: Im Kernelspace UDP Packete senden.

TrackBack URL for this entry: http://www.broken.ch/mt/mt-tb.cgi/12

Leave a comment

About this Entry

This page contains a single entry by dobin published on September 14, 2008 3:05 AM.

Moviezz was the previous entry in this blog.

Solyaris #6: DNS PoC Screenshots is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.

Pages