RAW Sockets

Werbung
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
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
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
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
Tobias Wawryniuk
RAW Socket – MS Windows
• Einschränkungen mit Windows XP SP 2
und 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
haben
Quelle: Michael Howard's Web Log
RAW Sockets – UNIX
Tobias Wawryniuk
• 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
Tobias Wawryniuk
OSI-Standard – TCP/IP-Standard
application layer (7)
application layer (4)
presentation layer (6)
session layer (5)
transport layer (4)
TCP, UDP
transport layer (3)
network layer (3)
IP
internet layer (2)
data link layer (2)
ETH , TR
network (access)
layer (1)
physical layer (1)
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
Tobias Wawryniuk
Sockets - Programmierung
• socket(…)
– connect(…)
– bind(…)
– listen(…)
– send(…) / sendto(…)
– recv(…) / recvfrom(…)
• close(…)
Tobias Wawryniuk
RAW-Sockets: Socket anlegen
• int socket(int domain, int type, int protocol)
– domain:
– type:
– protocol:
PF_LOCAL, PF_INET, PF_IPX, …
SOCK_STREAM, SOCK_DGRAM
SOCK_RAW, …
IPPROTO_ICMP, IPPROTO_TCP,
IPPROTO_NONE, IPPROTO_RAW,
…
» RFC 1700 Assigned Numbers
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);
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
RAW Sockets – UNIX
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
Tobias Wawryniuk
RAW-Socket: struct sockaddr
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
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);
Tobias Wawryniuk
RAW-Sockets: Hello World
Tobias Wawryniuk
Diagramm des IP-Headers
• Diagramm des IP
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
Tobias Wawryniuk
RAW-Sockets: IP-Header erstellen
• für Beispiel angepasste Funktion
– keine Optionen,
– viele Felder werden vom Kernel gesetzt
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
Tobias Wawryniuk
RAW-Sockets: ICMP-Header setzen
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
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
Tobias Wawryniuk
RAW-Socktes: PingCode
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)
Tobias Wawryniuk
Beispiel 2 – TCP - Flooder
• Flooder: Server/ Dienst mit Anfagen
überfluten -> DoS-Attacke
• TCP – Verbindungsaufbau nach
3 – Wege – Handshake
– (1)
– (2)
– (3)
Verbindungswunsch vom Client
Bestätigung / Akzeptanz vom Server
Bestätigung vom Client
Tobias Wawryniuk
TCP Header
• Prüfsumme:
– pseudo header, tcp header und payload
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 keine
Optionen sind
Tobias Wawryniuk
TCP-Flooder Code
Tobias Wawryniuk
UDP-Header
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)
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);
Tobias Wawryniuk
TCP - SnifferCode
Tobias Wawryniuk
TCP-Sniffer Output
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
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
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
Tobias Wawryniuk
Literatur / Quellen
• LINUX ManPages
–
–
–
–
Section 7 – socket
Section 7 – raw
Section 7 – ip
Section 7 – icmp
• RFC – Request For Comment
–
–
–
–
RFC 791
RFC 793
RFC 768
RFC 1700
- Internet Protocol
- Transmission Control Protocol
- User Datagram Protocoll
- Internet Assigned Numbers
RAW Sockets
Haben Sie Fragen?
Herunterladen