Gratis Internet (3): DNS Tunnel unter Windows

Aus NOBAQ
Zur Navigation springenZur Suche springen

Der letzte Teil des Beitrags beschäftigt sich mit dem Clientzugriff unter Windows. Während ich im Artikel Gratis Internet (1): Australien, DNS- und ICMP-Tunnel bzw. Gratis Internet (2): DNS Tunnel und auth. NS mit einer statischen IP ausführlich erklärt habe, wie man einen DNS Tunnel unter Linux aufbauen kann erkläre ich hier nun die Vorgehensweise für Windows. Wieso? Wenn man unterwegs ist und in die Situation kommen sollte, einen DNS Tunnel zu benötigen ist die Wahrscheinlichkeit sehr hoch, dass man einfach nur ein Windows zu Verfügung hat. Deswegen erweitere ich hier gleich meine Anforderungen:

  • Der Client soll unter Windows (ab NT) funktionieren
  • Der Client soll keine Administratorrechte benötigen
  • Der Client soll nicht installiert werden müssen
  • Der Client soll nicht unnötig viele Libraries erfordern
  • Der Client soll möglichst klein sein (wenige MB), sodass man ihn bequem auf einem USB Stick mitnehmen kann

Obwohl ich nicht mehr geglaubt habe dass ich alle diese Anforderungen erfüllen kann, ist es mir dann doch gelungen….


Aufgabenteilung

Prinzipiell erfordert der DNS Tunnel zwei Programme: droute.pl von Ozymandns und ein weiteres Programm, das die Daten irgendwie verarbeitet. Problematisch genug dabei ist, dass Ozymandns mit Perl geschrieben ist. Denn Windows bringen standardmäßig kein Perl mit und Cygwin bzw. ActiveState bedeuten zu viel Aufwand für “ad-hoc”-Lösungen unterwegs. Ich habe bereits mit dem Gedanken gespielt, das Programm nach plain Win-API zu portieren….

Der zweite Teil ist der ssh-Client. Auch hier gibt es das Problem, dass PuTTY, plink & Co die ProxyCommand Option von Openssh nicht kennen. Alle OpenSSH Portierungen die ich gefunden habe benötigten eine Installation mit Administratorrechten und basierten auf cygwin, was mehrere Anforderungen nicht erfüllt hat.


Die Lösung für ssh

Ich habe viel überlegt, welche einfachen Möglichkeiten es unter Windows als Alternative zu ssh geben könnte. Statt auf dem Server ssh zu starten, könnte ich z.B. mit dante einen SOCKS Proxy (mit Authentifizierung) installieren. Auf Clientseite (Windows) bräuchte es dann noch ein Programm, das STDIN/STDOUT von droute.pl (für das es noch keine Lösung gab!) in ein Socket zu konvertieren.

Aber alle diese Lösungen waren mir zu aufwendig und zu wenig erfolgversprechend. Ich habe das ganze Internet nach SSH Clients für Windows abgesucht die eine ProxyCommand-Option bieten könnten, aber nichts gefunden.

Niemals aber hätte ich gedacht, dass ich bei der Entwicklungsversion von PuTTY nachschauen könnte! Darauf bin ich erst zufällig in einem Forum gestoßen, in dem Simon Tatham selbst auf die Developerversion von PuTTY verwiesen hat. Und tatsächlich: Diese Version (z.Z. http://www.tartarus.org/~simon/putty-snapshots/x86/putty.exe) hat das benötigte Kommando tatsächlich eingebaut!

Das vereint nun alle Vorteile: SSH unterstützt Kompression, Tunneling mit SOCKS. PuTTY ist klein, kompakt, läuft überall, braucht nicht installiert werden und erfordert keine Administratorrechte.


Die Lösung für Ozymandns

Da nun das ssh-Problem gelöst war, war klar, dass ich eine Lösung für droute.pl finden musste. ActiveState Perl oder Cygwin zu installieren war einfach keine Lösung.

Eine lange Recherche brachte mich auf eine Windows Portierung: http://presence.irev.net/hacks/ozymandns_win_0.1.zip. Doch diese funktionierte nicht, da eine cygperl-DLL benötigt wurde. Nach nochmaliger langer Recherche habe ich dann diese gefunden aber auch dann funktionierte es nicht. Die Anwendung wurde offenbar mit CYGWIN’s Perl und PAR gebaut…

Zuerst aber musste ich die Funktion sowieso so überprüfen. Cygwin hatte ich zwar sowieso installiert aber irgendwie funktionierte das gerade nicht. Ausserdem war mir das zu mühsam. Also habe ich ActiveState Perl installiert und versucht das Programm damit zum Laufen zu bekommen. Mit dem eingebauten Package Manager sind die benötigten Perlmodule schnell installiert. Obwohl droute.pl offenbar nach der Installation der benötigten Module funktionierte, tat es das nicht mehr, wenn man als Parameter die Tunneldomain nimmt (dort müsste dann normalerweise die ssh-Meldung erscheinen):

Your vendor has not defined Fcntl macro F_GETFL, used at D:\DNS-Tunnel\test\droute.pl line 64.

Das Problem ist folgender Code:

# set STDIN to nonblock
$flags='';
fcntl($infile, F_GETFL, $flags) or die "1\n";
$flags |= O_NONBLOCK;
fcntl($infile, F_SETFL, $flags) or die "2\n";

Er sorgt dafür, dass STDIN nonblocking gemacht wird, d.h. jede Operation auf STDIN soll nicht blockieren. Da aber die Kommandozeile/Terminalemulation unter Windows komplett anders funktioniert als in UNIX geht das mit Windows nicht. Cygwin würde es aber hingegen simulieren, trotzdem wollte ich die Änderungen für ActiveState Perl machen, da mir das eleganter schien.

Die einzige Stelle, wo auf STDIN zugegriffen wird, ist der Lesethread:

$read_queue = Thread::Queue->new;
$read_thread = threads->new(\&reader);
sub reader {
	while(1){
		if($read_queue->pending < 32){
			my $data="";
			$error=sysread(STDIN, $data, 110);
			if(length($data)){ $read_queue->enqueue($data);}
			if(undef $error) {exit(1);}
		}
		usleep(50 * 1000);
	}
}

Hier fällt sofort auf, dass es komplett unsinnig ist, STDIN nonblocking zu setzen, da man nur einen höheren Resourcenverbrauch hat. Dass sysread blockiert ist nicht weiter schlimm, da der Lesevorgang ohnehin in einem eigenen Thread abläuft. Vermutlich ist das Nonblockingsetzen ein Relikt, bevor der Entwickler von ozymandns den Thread hinzugefügt hat. Also habe ich den Code einfach auskommentiert und, siehe da: BINGO:

D:\DNS-Tunnel>perl droute.pl -r 195.3.96.67 sshdns.passwort.tunnel.nobaq.net.
SSH-1.99-OpenSSH_4.3p2 Debian-9

Es erscheint der SSH Prompt! Wichtig ist hier anzumerken dass man explizit einen DNS Server (hier den der TU Graz) angeben muss, sonst funktioniert es nicht.


Wie wird aus der Perl Datei eine exe?

Jetzt bleibt noch das große Problem dass das komplette ActiveState Perl nebst Modulen installiert sein muss. Eine kleine google Recherche brachte sofort das Ergebnis: Das kommerzielle http://www.indigostar.com/perl2exe.htm kann Perl Dateien in exe Dateien compilieren. Problem: Es funktionierte mit der aktuellen ActiveState Perl Version nicht. Also nahm ich den anderen Weg: PAR. Dieses Perlmodul macht das gleiche, nur packt zusätzlich alle abhängigen Module mit ein. Es funktioniert wie jar-Dateien unter Java. Das PAR Modul selbst war schnell installiert. Aber um eine exe-Datei erstellen zu können braucht man den PAR Packer “pp” der natürlich nicht bei ActiveState dabei ist. Nach ein bisschen google-Recherche hab ichs dann gefunden: Das Repository auf http://www.bribes.org/perl/ppm/package.xml bietet das gesuchte Paket an und installiert “pp.pl”. Mit dem einfachen pp Befehl habe ich dann aus der geänderten droute.pl eine droute.exe erstellt:

pp droute.pl -o droute.exe

Die resultierende Datei ist 2.7MB groß und beinhaltet in einer ZIP File den Perl Interpreter und alle benötigten Module. Zusätzlich hab ich noch dig incl. der benötigten Libraries eingebaut was unterwegs das Debugging vereinfachen könnte. Ich stelle hier alles was benötigt wird zum Download zu Verfügung: Media:dns-tunnel.zip


Anleitung zur Verwendung

Zuerst das PuTTY aufrufen, zu Connection –> Proxy gehen und folgende Einstellungen machen:

Putty2.png

Danach wird der lokale SOCKS5 Proxy aktiviert, um beliebige Programme tunneln zu können (”dynamisches Forwarding”). Als Alternative können auch statische Portforwardings gewählt werden. Das Ergebnis sieht man hier:

Putty3.png

Da die Verbindung über DNS sehr langsam ist lohnt sich das Einschalten der DNS Komprimierung:

Putty4.png

Zu guter Letzt stellt man die Verbindung her indem man als Host “domain.invalid.” eingibt. Damit stellt man sicher dass der Host ungültig ist. Und der ist ja für die Verbindung egal, da diese ja sowieso über droute.exe geht:

Putty1.png

Nach einem Klick auf “Open” stellt man die Verbindung her, gibt Benutzernamen und Passwort ein und man ist per SSH am Remoteserver.

Nun kann man in eine beliebige Anwendung, z.B. Firefox gehen und den lokalen SOCKS5 Proxy als Proxyserver einstellen:

Firefox.PNG

...und schon surft man - sehr langsam aber doch - gratis am jedem WLAN Hotspot :-)

Kommentare

  1.
     Dennis sagt,
     am 13. Jan. 2008
     Hey,
     das aktuelle Putty hat’s auch schon drin. Mir fehlte wohl echt die nötige Perl-Kenntnis…
     Applaus!!!
     Hoffentlich finden das nicht zu viele Leute, sonst wirds bald das Netz überlasten und dann abgestellt werden,
     also nicht mehr lange funktionieren...
     Liebe Grüße,
     Dennis