#_____________________________________       ______________________________________#
#___________________________________           ____________________________________#
#___________________________ 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
*/