#_____________________________________ ______________________________________#
#___________________________________ ____________________________________#
#___________________________ I C M P T u n n e l i n g __________________________#
#_________________________________ Quick & Dirty __________________________________#
#___________________________________ v.1.0 ____________________________________#
#_____________________________________ ______________________________________#
_____
Eine Einfuehrung in ICMP und Tunneling.
Index:
- [0x01] # Was ist Tunneling?
- [0x02] # Was ist ICMP?
- [0x03] # Was geht im Detail vor?
- [0x04] # Wann kann ich diese Technik anwenden?
- [0x05] # Was ist dafuer noetig?
- [0x06] # Wie genau kann ich ICMP Tunnels bauen/verwenden?
- [0x07] # Post Scriptum
- [0x01] # Was ist Tunneling?
Tunneling an sich ist eine Methode um Protokolle in anderen Protokollen zu
verstecken. Daraus ergeben sich IP Tunnels welche als eine virtuelle
Punkt-zu-Punkt Verbindung zwischen zwei, durch beliebig viele Netzwerke
voneinander getrennten Nodes gesehen werden koennen.
In unserem Fall nutzt ein Node eines Intranets die Eigenschaften
[Payload/Header/...] eines in dem Netzwerk erlaubten Protokolls, um den
eigentlich durch die Konfiguration entsprechender Netzwerk Devices 'verbotenen'
Traffic passieren zu lassen.
Der Grund dieser 'Heimlichtuerei' ist in den meisten Faellen ein laestiges,
restriktives Gateway welches bestimmten Verkehr aus dem Intranet in das Internet
[und vice-versa] mit Hilfe von Packetfiltern/Proxies/[...] reglementiert bzw.
blockiert.
Es ergibt sich so eine Unzahl von Moeglichkeiten Traffic aus fremden Netzwerken,
in denen man 'zu Gast' ist raus/reinzuschleusen, da sich theoretisch
fast jedes Protokoll durch jedes andere tunneln laesst.
Der einzig effektiv limitierende Faktor ist, dass das Gateway das jeweilige
Tunnel-Protokoll passieren lassen muss.
- [0x02] # Was ist ICMP?
An sich ist es die Aufgabe des [I]nternet [C]ontrol [M]essage [P]rotocol [RFC 792]
Fehler bzw. Diagnosedaten fuer IP zu uebermitteln. Dies ist der Fall, wenn zum
Beispiel eine Destination nicht erreichbar ist, der Reassemblierungsprozess
fehlgeschlagen ist oder die Pruefsumme im IP Header nicht uebereinstimmt.
Abgesehen davon definiert ICMP auch eine Reihe von Steuernachrichten fuer
Router um zum Beispiel dem Quellhost mitzuteilen, dass es eine bessere Route
zum Ziel gibt [ICMP-Redirect].
Fuer jede dieser Meldungen gibt es einen Messagetyp, der durch eine Ziffer
repraesentiert wird.
Der ICMP-Pakettyp 'echo request' wird, um ein Beispiel zu nennen der Zahl 8
zugeordnet.
Der Aufbau eines ICMP Packets:
_bit 0 7___bit 8 15___bit 16 23___bit 24 31_
|__ Typ __|__ Code __|______ Pruefsumme _____|
| |
|__________ 32 bit Daten [optional] _________|
Da uns Messagetyp 8 und 0 im Laufe dieses Tutorials noch intensiv bechaeftigen
werden, bedarf es an dieser Stelle einer etwas ausfuehrlicheren Erlaeuterung:
/*
Echo Request [Code 8] und Echo Reply [Code 0] werden
hauptsaechlich benutzt um den Zustand eines Netzwerks
bzw. eines dessen Hosts zu bestimmen.
Das bekannte Tool ping bedient sich eines Echo Requests
mit der IP-Adresse des Zielhosts und der Eigenen. Ist
dieser Host aktiv, so sollte ['Stealth' Modus] dieser
einen Echo Reply zurueckschicken. Zusaetzlich werden
meist vom Absender Sequenznummer und Zeitstempel
mitgeschickt um etwaige Packetverluste oder die
[R]ound [T]rip [T]ime bestimmen zu koennen.
*/
ICMP wird bis auf wenige Ausnahmen [ping/traceroute/...] vom Benutzer in erster
Instanz nicht verwendet.
Weiters ist noch auf eine signifikante Eigenschaft dieses Protokolles hinzuweisen,
die durch fehlerhafte ICMP-[Fehler]Pakete entstehende Fehlerendlosschleifen,
unmoeglich macht. ICMP ist so konzipiert, dass dessen eigene Dateneinheiten unter
keinen Umstaenden Fehlermeldungen ausloesen koennen.
Da es ICMP unter anderem an diesem Diagnoselayer mangelt, ist es - wie UDP - als
unzuverlaessig einzustufen.
- [0x03] # Was geht im Detail vor?
In dem optionalen Datenfeld der ICMP Messages werden TCP Daten versteckt
und zum Server weitergeleitet, der diese dann weiterverarbeitet und das
Ergebnis auf die selber Weise wieder zurueckschicht.
Folgender Veruchsaufbau:
Der Client befindet sich in einem Netzwerk in dem er weder TCP noch UDP benutzen
kann. Jedoch gelingt ein Ping auf entfernte Hosts im Internet.
Er tritt mit dem Server nur durch 'echo requests' in verbindung.
Der Server ist ein mit dem Internet verbundener Computer, der so konfiguriert
wurde, dass er alle hereinkommenden 'echo requests' auf TCP Daten im 32 bit
langen Datenteil [welcher eigentlich fuer Informationen bezueglich der Request
Session reserviert waere] der ICMP Message untersucht.
Als Antwort schickt er stets 'echo replies'.
Hier eine schematische Darstellung dieses Vorgangs:
[_ Client _] [_ Server _]
^ ^ //
. . //
. I C M P . //
. . //
. . //
____.___.___//
| . /|
| Internet \| T C P
|____________|\
\\
\\
\\
\\
\\
[_ Ziel-Server _]
Um die TCP Daten von den regulaeren echo traffic seperieren zu koennen wurde die
ein zusaetzliches Feld eingefuehrt das sich 'magic number' nennt.
So kann man sich ein Packet des PingTunnel Protokolls [ohne ICMP/IP Header]
vorstellen:
______________________________________________________________
|_ Magic Number _|_ IP _|_ Port _|_ Status _|_ Acknowledgment _|
|_ Laenge _|_ Sequenznummer _|_ Reserviert _|_ ... Daten ... _|
Um den Prozess auch netzwerktechnisch veranschaulichen zu koennen, wird
vom Term 'stoerimpuls' ein Hex Dump gemacht, der wird mit Hilfe von
ping in ein 'echo request' gepackt und weggeschickt.
Mit einem Sniffer wird der entstehende Traffic mitgeschnitten.
michael@benevivere> echo "stoerimpuls" | xxd -
0000000: 7374 6f65 7269 6d70 756c 730a stoerimpuls.
michael@benevivere> ping -p '20000073746f6572696d70756c73' stoerimpuls.net -c 1
PATTERN: 0x20000073746f6572696d70756c73
PING stoerimpuls.net (127.0.0.1) 56(84) bytes of data.
64 bytes from stoerimpuls.net: icmp_seq=1 ttl=64 time=0.084 ms
--- stoerimpuls.net ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.084/0.084/0.084/0.000 ms
root@benevivere> tcpdump -nN -xX -s 1500 "icmp" -i lo
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 1500 bytes
21:43:57.754330 IP stoerimpuls.net > stoerimpuls.net: icmp 64: echo request seq 1
0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E.
0x0010: 0054 0000 4000 4001 3ca7 7f00 0001 7f00 .T..@.@.<.......
0x0020: 0001 0800 b38a ff45 0001 7d0d 4a46 6a82 .......E..}.JFj.
0x0030: 0b00 696d 7075 6c73 2000 0073 746f 6572 ..impuls...stoer
0x0040: 696d 7075 6c73 2000 0073 746f 6572 696d impuls...stoerim
0x0050: 7075 6c73 2000 0073 746f 6572 696d 7075 puls...stoerimpu
0x0060: 6c73 ls
21:43:57.754366 IP stoerimpuls.net > stoerimpuls.net: icmp 64: echo reply seq 1
0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E.
0x0010: 0054 210a 0000 4001 5b9d 7f00 0001 7f00 .T!...@.[.......
0x0020: 0001 0000 bb8a ff45 0001 7d0d 4a46 6a82 .......E..}.JFj.
0x0030: 0b00 696d 7075 6c73 2000 0073 746f 6572 ..impuls...stoer
0x0040: 696d 7075 6c73 2000 0073 746f 6572 696d impuls...stoerim
0x0050: 7075 6c73 2000 0073 746f 6572 696d 7075 puls...stoerimpu
0x0060: 6c73 ls
- [0x04] # Wann kann ich diese Technik anwenden?
Wem ist es noch nicht passiert, dass man auf Reisen zufaellig auf ein offenes
WLAN gestossen ist, das zwar ausgehende ICMP aber kein TCP oder UDP Packete
ohne zusaetzliche Authentifizierung [im Browser/...] erlaubt?!
Besonders in Hotels und Cafes sind deratige Methoden sehr beliebt geworden.
In diesem Fall bedient man sich nur zu gern des ICMP Tunnelings um zu
surfen, Mails zu checken etc. - ergo: Alles was man mit TCP so anstellen
kann.
- [0x05] # Was ist dafuer noetig?
+ Client: Der Computer, von welchem aus Sie ins Internet wollen.
+ Server: Ein mit dem Internet verbundener PC, der ICMP akzeptiert.
+ Administratorrechte auf beiden Systemen.
+ PingTunnel oder aehnliches.
- [0x06] # Wie genau kann ich ICMP Tunnels bauen/verwenden?
i. ICMP Verfuegbarkeit feststellen
Zuerst wird gecheckt ob ICMP 'ping/echo requests' mit den vorhandenen Privilegien
in dem Netzwerk ueberhaut gestattet sind.
Ein einfacher ping auf einen entfernten Rechner sollte dafuer genuegen.
michael@client> ping -c1 google.com
PING google.com (64.233.187.99) 56(84) bytes of data.
64 bytes from jc-in-f99.google.com (64.233.187.99): icmp_seq=1 ttl=241 time=170 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 170.524/170.524/170.524/0.000 ms
ii. PingTunnel Installation
In diesem speziellen Fall wird das von Daniel Stodle geschriebene Tool
'PingTunnel' verwendet.
Die Installation dieses Programmes erfolgt auf dem Client und Server Rechner
folgendermassen:
michael@client> wget http://www.cs.uit.no/~daniels/PingTunnel/PingTunnel-0.61.tar.gz
--15:34:22-- http://www.cs.uit.no/%7Edaniels/PingTunnel/PingTunnel-0.61.tar.gz
=> `PingTunnel-0.61.tar.gz'
Auflösen des Hostnamen »www.cs.uit.no«.... 129.242.16.40
Verbindungsaufbau zu www.cs.uit.no[129.242.16.40]:80... verbunden.
HTTP Anforderung gesendet, warte auf Antwort... 200 OK
Länge: 53,433 [application/x-gzip]
100%[=======================================================>] 53,433 7.12K/s ETA 00:00
15:34:30 (7.07 KB/s) - »PingTunnel-0.61.tar.gz« gespeichert [53433/53433]
michael@client> tar xzf PingTunnel-0.61.tar.gz
michael@client> cd PingTunnel/ && ls
root@client> make && make install
iii. Tunnel bauen
Nun wird auf dem Server der Proxy gestartet und der Output nach tunnel.log
anstatt nach stdout geschickt.
root@server> ptunnel -f tunnel.log &
Wenn sie nun von dem Clienten aus eine Verbindung zu Ihrem ssh server aufbauen
wollten, so muessen Sie zuerst folgendes Kommando ausfuehren um den Tunnel
aufzubauen.
root@client> ptunnel -p ihr.tunnel.server.at -lp 9999 -da ssh.server.at -dp 22 &
Starting ptunnel v 0.60.
(c) 2004-2005 Daniel Stoedle, daniels@cs.uit.no
Relaying packets from incoming TCP streams.
[1] 11194
root@client>
iv. Tunnels benutzen
Die eigentliche Benutzung des existierenden Tunnels gestaltet sich
herrlich trivial.
Um Programme unseren Tunnel zu benutzen zu lassen, werden sie einfach
mit dem Port 9999 auf localhost verbunden.
Das sieht dann in etwa so aus:
michael@benevivere> ssh 127.0.0.1 -p9999
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
RSA key fingerprint is 8b:79:51:d4:99:10:ca:5c:14:61:07:f5:92:62:fb:0b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '127.0.0.1' (RSA) to the list of known hosts.
Password:
Linux ssh.server.at 2.6.8-2-k7 #1 Thu May 19 18:03:29 JST 2005 i686 GNU/Linux
michael@ssh.server.at>
Dieser Vorgang ist fuer andere TCP basierenden Dienste analog auszufuehren.
v. Authentifizierung beim Proxy
Da theoretisch jeder, der in Kenntnis der IP ihres Proxies ist ihn auch
benutzen koennte, ist die Verwendung irgendeiner Form der Authenfizierung
dringstens anzuraten.
Bei dem Tool PingTunnel erledigt dies der -x Switch:
root@server> ptunnel -x stoerimpuls -f tunnel.log &
root@client> ptunnel -x stoerimpuls -p ihr.tunnel.server.at -lp 9999 -da ssh.server.at -dp 22 &
- [0x07] # Post Scriptum
Potenziell nuetzliche Links:
+ http://www.ietf.org/rfc/rfc792.txt
+ http://www.ietf.org/rfc/rfc793.txt
+ http://www.cs.uit.no/~daniels/PingTunnel/
Dieses Tutorial erhebt keinerlei Anspruch auf Vollstaendigkeit oder Fehlerfreiheit
in jedweglicher Hinsicht und soll lediglich Neulingen einen kleinen Einblick in
diese Materie geben.
Konstruktive Kritik ist erwuenscht.
DON'T PANIC - IF YOU DO NOT UNDERSTAND - ASK!!
/*
- [c] by Michael R. Dornkasch
- root [at] stoerimpuls.net
- stoerimpuls.net
- Have [ph]un
*/