49
RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Embed Size (px)

Citation preview

Page 1: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

RAW SocketsRAW Sockets

Anwendungen in Rechnernetzen

Tobias Wawryniuk

Page 2: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

Vorgeschichte: Sockets

• Was ist ein Socket?– Ursprung im 4.2 BSD System – Schnittstelle für Zugriff auf Netzwerkdienste

• Bereitstellung als ‚file descriptor‘• I/O- Handling wie bei Dateien

– Verbindungspunkte zwischen entfernten Anwendungen

• Socket := Port + Protokollflag + Adresse

Page 3: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

Sockets Windows vs. UNIX

• Windows:– Eigener Datentyp (SOCKET)– Winsock 1.1 – in Anlehnung an BSD Sockets– Winsock 2 – Erweiterungen für diverse Protokolle

• UNIX:– ‚file descriptor‘ – Abstraktion im Dateisystem-Stil– Funktionen wie ‚read()‘ und ‚write()‘ möglich– IPC - interprocess communication

Page 4: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

Internet Socket

• Stream Socket SOCK_STREAM– verbindungsorientiert– Verbindungsaufbau / -abbau– Flusskontrolle

• Datagram Sockets SOCK_DGRAM– verbindungslos– Reihenfolge und Empfang wird nicht gesichert

Beide: Multiplexing, Demultiplexing durch Ports

Page 5: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

RAW Socket

• Was ist nun ein RAW-Socket?

– Zugriff auf Ebene der Vermittlungsschicht• Empfang von Paketen, die nicht TCP od. UDP sind• Kontrolle über Einträge der Headerfelder• Eigene Transportprotokolle implementierbar

Page 6: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

RAW Socket – MS Windows

• Einschränkungen mit Windows XP SP 2und Winsock 2– Empfang von IP-Paketen mit RAW Sockets

möglich– TCP-Pakete können nicht gesendet werden– UDP-Pakete müssen eine ‚lokale‘ IP-Adresse

habenQuelle: Michael Howard's Web Log

Page 7: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

RAW Sockets – UNIX

• Process, der RAW Socket erstellen will benötigt superuser (root UID=0) Rechte

• Empfang und Senden von Datagrammen

• für RAW Socket wird ein Protokoll spezifiziert

Page 8: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

OSI-Standard – TCP/IP-Standard

application layer (7)

presentation layer (6)

session layer (5)

transport layer (4)

network layer (3)

data link layer (2)

physical layer (1)

application layer (4)

transport layer (3)

internet layer (2)

network (access) layer (1)

ETH , TR

IP

TCP, UDP

Page 9: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

TCP / IP Stack

• konkrete Implementierung des TCP / IP Standards

• Diensterbringer für die Anwendungschicht– Programme, die über IP netzwerken wollen– Dienste wie ftp, http, smtp, etc.

• Dienstnutzer der Netzwerkschicht– z.B. Ethernet oder TokenRing

Page 10: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

Sockets - Programmierung

• socket(…)– connect(…)– bind(…)– listen(…)– send(…) / sendto(…)– recv(…) / recvfrom(…)

• close(…)

Page 11: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

RAW-Sockets: Socket anlegen

• int socket(int domain, int type, int protocol)– domain: PF_LOCAL, PF_INET, PF_IPX, …– type: SOCK_STREAM, SOCK_DGRAM

SOCK_RAW, …– protocol: IPPROTO_ICMP, IPPROTO_TCP,

IPPROTO_NONE, IPPROTO_RAW,

» RFC 1700 Assigned Numbers

Page 12: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

RAW Sockets: Socket anlegen

• RAW-Socket auf Ebene des network layers• int socket(PF_INET, SOCK_RAW, int protocol);

• RAW-Socket auf Ebene des data link layers• int socket(PF_PACKET, SOCK_RAW, int protocol);

– SOCK_PACKET gilt als veraltet

• Socket schließen:• int close(int fd);

Page 13: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

RAW-Sockets: Optionen festlegen

• int setsockopts(int s, int level, int optname,void *optval, socklen_t *optlen);

– level: Art bzw. Bereich der Option• SOL_SOCKET … direkt auf Socket bezogen• IPPROTO_IP ….. Option bezieht sich auf Internet

Protokoll

– optname: Identifizierung der Option• IP_HDRINCL ….. vor Payload im Puffer befindet sich

der Header

– IPPROTO_RAW impliziert IP_HDRINCL

Page 14: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

RAW Sockets – UNIX

Page 15: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

RAW-Socket: Verbindung aufbauen

• int connect(int sockfd, const struct sockaddr *serv_addr,socklen_t addrlen);

– optional; je nach Verwendungszweck– Struktur der Adresse wird durch Adressraum des

Sockets bestimmt– Portnummer in struct sockaddr_in spezifiziert

Protokoll, wird beim Senden nicht berücksichtig

Page 16: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

RAW-Socket: struct sockaddr

Page 17: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

Network Byte Order

• Interpretation der Bits und Bytes– little-endian

• höherwertigstes Oktett ist rechts• niederwertigstes Oktett ist links

– big-endian• höherwertigste Oktett ist links• niederwertigste Oktett ist rechts• analoges gilt für die Bits im Oktett

Page 18: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

Network Byte Order

• Sicherstellen der Konvertierung relevanter Werte (bei mehreren Oktetten)

• Funktionen:– uint32_t htonl(uint32_t hostlong);– uint16_t htons(uint16_t hostshort);– uint32_t ntohl(uint32_t netshort);– uint16_t ntohs(uint16_t netshort);

Page 19: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

RAW-Sockets: Hello World

Page 20: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

Diagramm des IP-Headers

• Diagramm des IP

Page 21: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

Beispiel 1 – Ping request/reply

• Request senden, auf Antwort warten– Endlosschleife (UNIX)– Zählschleife (Windows)

• IP-Header muss nicht modifiziert werden

• Sequenznummer erhöhen

• ICMP Checksumme zurücksetzen

Page 22: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

RAW-Sockets: IP-Header erstellen

• für Beispiel angepasste Funktion– keine Optionen,– viele Felder werden vom Kernel gesetzt

Page 23: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

ICMP Header

• Request: Typ 0x08• Reply: Typ 0x00• Code: 0x00• Identifier: Zuordnung von reply zu request• Sequence Number: Erhöhung bei neuem request

Page 24: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

RAW-Sockets: ICMP-Header setzen

Page 25: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk
Page 26: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk
Page 27: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

RAW-Sockets: Paket senden

• ssize_t send(int s, const void *buf, size_t len, int flags);

• ssize_t sendto(send(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);

– Flags hier nicht nötig, z.B. MSG_DONTROUTE

Page 28: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

RAW-Sockets: Pakete empfangen

• ssize_t recv(int s, void *buf, size_t len,int flags);

• ssize_t recvfrom(int s, void *buf, size_t len,int flags, struct aockaddr *from,socklen_t *fromlen);

– Flags hier ebenfalls nicht notwendig*– Paket testen, ob Prozess Empfänger ist

Page 29: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

RAW-Socktes: PingCode

Page 30: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk
Page 31: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

Prüfsummen

• zum Berechnen der Prüfsumme ist das Feld selbst auf 0 gesetzt

• Felder werden in der Regel als 16-Bit Worte aufgefasst

• 1-er Komplement der Summe aller 1-er Komplemente der 16-Bit-Worte

– ICMP: über ICMP-Header (incl. Datenbereich bei Typ 8 und 3)

Page 32: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

Beispiel 2 – TCP - Flooder

• Flooder: Server/ Dienst mit Anfagen überfluten -> DoS-Attacke

• TCP – Verbindungsaufbau nach3 – Wege – Handshake– (1) Verbindungswunsch vom Client– (2) Bestätigung / Akzeptanz vom Server– (3) Bestätigung vom Client

Page 33: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk
Page 34: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

TCP Header

• Prüfsumme:– pseudo header, tcp header und payload

Page 35: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

RAW-Sockets: TCP-Header erstellen

• ebenfalls beispielhafte Funktion– Sequenz und Acknowledge Nummer hier keine

Bedeutung, da ja nur ein Paket gesendet werden soll

– Offset ist statisch,da im auch keineOptionen sind

Page 36: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

TCP-Flooder Code

Page 37: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk
Page 38: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk
Page 39: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

UDP-Header

Page 40: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

Prüfsummen bei TCP und UDP

• Wird in der Regel aus Header und Payload gebildet

• weiterhin wird ein Pseudo-Header verwendet, bestehend aus:– IP-Adressen aus dem IP-Header– Zero-Padding (ein Oktett)– Protokollnummer (TCP / UDP) – Gesamtlänge (TCP / UDP)

Page 41: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

Beispiel 3 – TCP - Sniffer

• Pakete, die an einem Interface ankommen werden aufgenommen

• RAW-Socket erhält eine Kopie

• int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addlen);

Page 42: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

TCP - SnifferCode

Page 43: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

TCP-Sniffer Output

Page 44: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

Page 45: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

Die Alternative: TLI

• TLI – Transport Layer Interface– eingeführt von AT&T mit System V Release 3.0

(Streams I/O Systems) [1986]– Bindeglied zwischen:

• transport endpoints (miteinander kommunizierende (User-)Prozesse)

• transport provider (z.B. TCP / IP )

– vom Diensterbringer unabhängig• Strukturen: t_netbuf, t_bind, t_call, t_info• Funktionen: t_open, t_bind(), t_connect(), …

– Standardisiert unter XTI, X/Open

Page 46: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

Fazit

• Sinnvoller Einsatz:– für neue (eigene) Protokolle– Protokolle ohne direkte Benutzerschnittstelle

• Ab Linux 2.2 können alle Header-Felder per Socketoption gesetzt/gelesen werden

Page 47: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

Literatur / Quellen

• Printmedien / PDF– Netzwerkprogrammierung unter LINUX und UNIX– Embedded Internet in der Industrieautomation– Beej’s Guide to Network Programming Using Internet Sockets (PDF)– Netzwerkprogrammierung mit BSD-Sockets (PDF)– Programmierung in der Unix-Umgebung

• Webseiten:– http://www.wikipedia.de; 31.10.2006– http://www.codeproject.com/csharp/pktcap.asp– http://en.wikipedia.org/wiki/Internet_socket– http://en.wikipedia.org/wiki/Raw_socket– http://www.zotteljedi.de/doc/socket-tipps/index.html

Page 48: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

Tobias Wawryniuk

Literatur / Quellen

• LINUX ManPages– Section 7 – socket– Section 7 – raw– Section 7 – ip– Section 7 – icmp

• RFC – Request For Comment– RFC 791 - Internet Protocol– RFC 793 - Transmission Control Protocol– RFC 768 - User Datagram Protocoll– RFC 1700 - Internet Assigned Numbers

Page 49: RAW Sockets Anwendungen in Rechnernetzen Tobias Wawryniuk

RAW SocketsRAW Sockets

Haben Sie Fragen?