Forum: PC-Programmierung RAW Sockets Linux


von raw (Gast)


Lesenswert?

Hallo zusammen,


ich bin gerade dabei ein Tool zur Netzwerkanalyse unter Linux zu 
schreiben.
Mir gelingt nun nur einen Teil des Netzverkehrs zu loggen.

Ein Linux Board habe ich an Router über Ethernet angeschlossen.

Am Windows PC werden verschiedene Aktionen gemacht,ja meistens www.HTTP 
Requests
, die aber nicht geloggt werden können.
Auch sehe ich nicht alle von Linux Board HTTP Responses( auf board läuft 
Webserver)

Geht es so was auf Linux mit RAW Sockets?

socket( AF_PACKET , SOCK_RAW , htons(ETH_P_ALL))
recvfrom(sock_raw , buffer , 65536 , 0 , &saddr , 
(socklen_t*)&saddr_size)

Ich habe noch da ein Verständnisproblem.
Hat jemand schon Erfahrungen mit RAW Sockets sammeln können?

Gruß& Danke
raw

von Georg A. (georga)


Lesenswert?

> Mir gelingt nun nur einen Teil des Netzverkehrs zu loggen.

Welcher Verkehr? Der, der von und zu dem Board geht, auf dem auch der 
Logger läuft? Anderen sieht man bis auf Ausnahmen eh nicht...

> Geht es so was auf Linux mit RAW Sockets?

Prinzipiell ja, siehe tcpdump. Schau doch einfach mal in dessen Source.

von Konrad S. (maybee)


Lesenswert?

Der Router wird an den Ethernet-Anschlüssen als Switch arbeiten, d.h. 
dein Linux-Board sieht nur den Traffic, an dem das Board beteiligt ist 
und Broadcasts.

von cpap (Gast)


Lesenswert?


von raw (Gast)


Lesenswert?

PC Linux mit RAW Ethernet Logger -----Router------PC Windows(WLAN)
                                        |
                                        |
                                        |
                                     Internet


Ich würde gerne Pakets zwischen PC Windows und Internet über Router 
loggen.

Mit Putty von PC Windows baue eine eine TCPIP Verbindung auf.
Auf PC Linux läuft ein Websever. Und ich kann loggen, HTTP Requestes von 
PC Windows.
Respones mit Info wie Rückgabewerten sehe ich aber nicht, die werden 
nicht aufgezeichnet.


Ich dachte, mit RAW Sockets kann ich komplett alles aufzeichnen.

von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

Hallo,

RawSockets heisst erstmal nur, das du ohne Protokoll wie TCP/IP 
arbeitest.
Das ist ja auch gewünscht, wenn Du alles mitloggen willst.
Aber warum selber programmieren? Kennst Du Wireshark?

Auf welchem der drei Geräte läuft den der Logger?

Aber wie gesagt, Nimm Wireshark.

Gruß

Olaf

von Konrad S. (maybee)


Lesenswert?

raw schrieb:
> Ich dachte, mit RAW Sockets kann ich komplett alles aufzeichnen.

Aber nur das, was der Router dem Linux-Board zukommen lässt. Und der 
Traffic zwischen Windows-PC und Internet geht das Linux-Board nunmal 
nichts an. Nimm zwischen Windows-PC und Linux-Board einen Hub oder einen 
Manageable Switch, dann klappt das Mithören.

von Konrad S. (maybee)


Lesenswert?

Olaf Dreyer schrieb:
> Aber wie gesagt, Nimm Wireshark.

Das ist die einfachste Lösung.

von Student (Gast)


Lesenswert?

Konrad S. schrieb:
> raw schrieb:
>> Ich dachte, mit RAW Sockets kann ich komplett alles aufzeichnen.
>
> Aber nur das, was der Router dem Linux-Board zukommen lässt. Und der
> Traffic zwischen Windows-PC und Internet geht das Linux-Board nunmal
> nichts an. Nimm zwischen Windows-PC und Linux-Board einen Hub oder einen
> Manageable Switch, dann klappt das Mithören.

Oder verwende auf der Linux-Kiste ein Tool namens arpspoof (ist in 
dsniff enthalten) um die arp-tables im Windows-Kasten zu manipulieren. 
Dann kannst du gemütlich alles von deiner Linus-Maschine aus sehen.
Funktioniert hervorragend, wenn du nicht gerade ein iOS Device mit iOS 7 
oder Mac mit OS X 10.9 arpspoofen willst. Ich habe keine Ahnung, warum 
das nicht funktioniert, aber es funktioniert nicht... Hat hier jemand 
eine Ahnung, woran das liegen könnte?

von dsdsdadasda (Gast)


Lesenswert?

1. wireshark ist das einfachste. wenn irgendwie möglich verwende das 
wireshark, es gibt massenweise doku dazu und es ist einfach zu bedienen.


2. ansonsten gibt es libpcap, mit dieser Lib kannst du recht einfach 
Pakete analysieren.

3. wenn du es per hand machen willst, ist das natürlich auch möglich. 
allerdings ist das nicht ganz so einfach wie man es von normalen tcp 
sockets kennt.
--Zitat: siehe Buch "Hacking- The Art of Exploitation"--
While this program will capture packets, it isn’t reliable and will miss
some packets, especially when there is a lot of traffic. Also, it only 
captures
TCP packets—to capture UDP or ICMP packets, additional raw sockets need
to be opened for each. Another big problem with raw sockets is that they 
are
notoriously inconsistent between systems. Raw socket code for Linux most
likely won’t work on BSD or Solaris. This makes multiplatform 
programming
with raw sockets nearly impossible.
--Zitat Ende--

mit folgendem syscall bekommst du deinen raw socket für tcp pakete:
1
sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_TCP))

Danach einfach mit recv und den üblichen Verdächtigen arbeiten.

Beim Analysieren musst du die Strukturen von IP, TCP, UDP Paketen nicht 
neu erfinden. Du findest diese in /usr/include/netinet.

Zum Beispiel gibts dort die Struktur von einem IP Paket zu finden:
1
struct ip
2
  {
3
#if __BYTE_ORDER == __LITTLE_ENDIAN
4
    unsigned int ip_hl:4;               /* header length */
5
    unsigned int ip_v:4;                /* version */
6
#endif
7
#if __BYTE_ORDER == __BIG_ENDIAN
8
    unsigned int ip_v:4;                /* version */
9
    unsigned int ip_hl:4;               /* header length */
10
#endif
11
    u_int8_t ip_tos;                    /* type of service */
12
    u_short ip_len;                     /* total length */
13
    u_short ip_id;                      /* identification */
14
    u_short ip_off;                     /* fragment offset field */
15
#define IP_RF 0x8000                    /* reserved fragment flag */
16
#define IP_DF 0x4000                    /* dont fragment flag */
17
#define IP_MF 0x2000                    /* more fragments flag */
18
#define IP_OFFMASK 0x1fff               /* mask for fragmenting bits */
19
    u_int8_t ip_ttl;                    /* time to live */
20
    u_int8_t ip_p;                      /* protocol */
21
    u_short ip_sum;                     /* checksum */
22
    struct in_addr ip_src, ip_dst;      /* source and dest address */
23
  };

von raw (Gast)


Lesenswert?

Vielen Danke für Eure Antworten, ich habe gerade libpcap heruntergeladen 
und bin sehr gespannt, wie ich mit der Lib weiter komme.

von Frank K. (fchk)


Lesenswert?

raw schrieb:
> PC Linux mit RAW Ethernet Logger -----Router------PC Windows(WLAN)
>                                         |
>                                         |
>                                         |
>                                      Internet
>
>
> Ich würde gerne Pakets zwischen PC Windows und Internet über Router
> loggen.

Das geht so nicht! Punkt.

Dein Aufbau sieht nämlich in Wirklichkeit so aus
1
PC Linux ---1-Switch-2---WLAN-AP.....PC Windows
2
                |
3
                3
4
                |
5
              Router
6
                |
7
              Modem
8
                |
9
             Internet

Switch, Router, WLAN AP und Modem werden sich bei Dir möglicherweise in 
einem einzigen Gerät befinden.

Der Switch weiß, an welchem Port welches Gerät hängt. Wenn der "PC 
Windows" ein Paket ins Internet schickt, weiß der Switch, dass das 
Paket, das an Port 2 reinkommt, an Port 3 geschickt werden muss, und er 
weiß auch, dass die Antwort auf dieses Paket auch wieder zurück an Port 
2 geschickt werden muss. Die Daten kommen also gar nicht an Port 1 raus, 
und dadurch kann der Linux-Rechner die auch nicht sehen.

Du kannst das Problem aber lösen. Das wird Dich zwar 80€ kosten, aber es 
geht. Du brauchst dafür einen managebaren(!) Ethernet Switch wie den HP 
Procurve 1810-24G v2 (J9802A). Die billigen für 10-30 Euro können das 
NICHT! Der Procurve hat eine sogenannte "Port Mirroring" Funktion, d.h. 
er kann alle Pakete, die auf einem Port rein- oder rausgehen, 
duplizieren und die Duplikate auf einem anderen Port ausleiten. Nur so 
kann dann Dein Linux-Analyse-PC die Paket überhaupt sehen. Du musst 
natürlich sicherstellen, dass die Pakete tatsächlich über diesen Switch 
gehen, d.h. der Windows-PC muss per Kabel an diesem Switch angeschlossen 
sein.
1
             Procurve
2
PC Linux -----Switch-----PC Windows
3
                |
4
                1
5
                |
6
           Router Switch-2---WLAN-AP....
7
                |
8
                3
9
                |
10
              Router
11
                |
12
              Modem
13
                |
14
             Internet

Früher (so vor 20 Jahren) gab es Ethernet Hubs. Das waren dumme 
Sternverteiler ohne eigene Intelligenz, die ein einem Port 
hereinkommende Pakete etwas verstärkt an allen Ports ausgegeben haben. 
Die gab es nur für 10 MBit Ethernet und selten auch für 100 MBit 
Ethernet, aber speziell die für 100 MBit Ethernet bekommt man praktisch 
nicht mehr. Mit einem Hub ging das ganze früher auch. Heutzutage gibts 
keine Hubs mehr, weil Switches wesentlich effizienter sind, im Gegensatz 
zu Hubs auch den Vollduplexbetrieb (senden und empfangen gleichzeitig) 
erlauben, und weil spätestens Gigabit Ethernet ohnehin nur noch 
vollduplex ist und damit immer einen Switch erfordert.

So, jetzt kannst Du aufhören, den Fehler in Deiner Software zu suchen.

fchk

von debug (Gast)


Lesenswert?

Eventuell verfügt dein Router über Port Mirroring. Damit kann der 
Verkehr an einem oder mehreren Ethernet-Ports zusätzlich auch zu einem 
anderen Port gesendet werden - also einmal die Doku zum Router wälzen 
(auch die zum CLI).

von Konrad S. (maybee)


Lesenswert?

Frank K. schrieb:
> Früher (so vor 20 Jahren) gab es Ethernet Hubs.

Und wegen genau solcher Problemstellungen werde ich meinen alten Hub 
auch nicht so schnell wegwerfen. :-)

von Florian H. (heeen)


Lesenswert?

Was du brauchst ist arp spoofing um deinem PC glauben zu lassen, die ip 
adresse deines routers gehört zur mac adresse deines messrechners. der 
kann dann die pakete an deinen router weiterleiten. Versuchs mal mit 
ettercap.
Könnte aber problematisch sein wenn der switch in deinem router steckt 
und der die eigene mac adresse fest verdrahtet hat.

: Bearbeitet durch User
von CC (Gast)


Lesenswert?

Du kannst auch versuchen, das auf dem Router (openwrt o.ä.) laufen zu 
lassen...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.