Gesamter Traffic über DNS tunneln mit OzymanDNS

An öffentlichen Plätzen oder in Cafes gibt es oft öffentliche Hotspots. Manchmal verlangen diese eine Registrierung oder sind nur nutzbar, wenn man bezahlt. Interessant dabei ist, dass DNS-Anfragen auch ohne Anmeldung aufgelöst werden. Jetzt kann man den gesamten Traffic über DNS tunneln und so ohne Anmeldung im Internet surfen.

Voraussetzung

  • Ein DNS-Server
  • Ein Server, welcher für den Tunnel verantwortlich ist
  • Ein Client
  • Die Software OzymanDNS von Dan Kaminsky

Übersicht


Einrichtung DNS-Server

Auf dem DNS-Server eine Zonendelegierung angelegt:

dnstunnel.example.org.          IN      NS      ns.server2.example.org.
ns.server2.example.org.         IN      A       42.23.05.21

Die IP-Adresse 42.23.05.21 entspricht dabei dem Server, welcher für den DNS-Tunnel verantwortlich ist.

Installation der Software OzymanDNS

Auf dem Tunnel-Server und auf dem Client muss die Software OzymanDNS von Dan Kaminsky installiert werden. Als Voraussetzung für diese Software werden Perl-Bibliotheken für DNS und für die Base32/Base64 Codierung benötigt. Folgendermassen können diese über die Paketverwaltung installiert werden:

Arch Linux

sudo pacman -S perl-net-dns
yaourt -S perl-mime-base32
yaourt -S perl-mime-base64

Debian

sudo aptitude install libnet-dns-perl
sudo aptitude install libmime-base32-perl
sudo aptitude install libmime-base64-perl

Dann wird die Software heruntergeladen (Auf dem Tunnel-Server und auf dem Client):

$ wget http://s3.amazonaws.com/dmk/ozymandns_src_0.1.tgz

Und danach entpackt:

$ tar -xvzf ozymandns_src_0.1.tgz
aska.pl
droute.pl
geta.pl
nomde.pl
glance.c

Einrichtung Tunnel-Server

Auf dem Tunnel-Server wird die Software OzymanDNS von Dan Kaminsky gestartet.

$ sudo ./nomde.pl -i 0.0.0.0 dnstunnel.example.org

Verwenden des Tunnels

Der Client kann jetzt ganz einfach eine SSH-Verbindung zum Tunnel-Server herstellen. Dabei ist zu beachten, dass die Subdomain sshdns vor die Tunnel-Domäne geschrieben wird und dass man als Host den localhost angibt:

$ ssh -o ProxyCommand="./droute.pl sshdns.dnstunnel.example.org" username_server2@localhost

Jetzt hat man bereits eine SSH-Session auf den Tunnel-Server offen.

Verwenden des Tunnels als SOCKS-Proxy

Mit SSH kann man ganz einfach einen SOCKS-Proxy erstellen:

$ ssh -D 8080 -N -f -o ProxyCommand="./droute.pl sshdns.dnstunnel.example.org username_server2@localhost

Im Webbrowser kann jetzt als SOCKS-Proxy localhost auf Port 8080 eingetragen werden.

Was wird übertragen

Mit tcpdump sieht man sehr gut, dass der gesamte Traffic über DNS TXT-Ressource-Records ausgetauscht wird:

emanuel@discordia:~
$ sudo tcpdump port domain
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes
19:55:01.972425 IP 10.0.0.100.53055 > homeserver.duss.xy.domain: 16680+ TXT? 4744-24063.id-31410.down.sshdns.dnstunnel.example.org. (61)
19:55:01.972788 IP 10.0.0.100.45578 > homeserver.duss.xy.domain: 21284+ PTR? 10.0.0.10.in-addr.arpa. (40)
19:55:01.978312 IP homeserver.duss.xy.domain > 10.0.0.100.45578: 21284* 1/1/1 PTR homeserver.duss.xy. (98)
19:55:01.978381 IP 10.0.0.100.57785 > homeserver.duss.xy.domain: 17573+ PTR? 100.0.0.10.in-addr.arpa. (41)
19:55:01.986232 IP homeserver.duss.xy.domain > 10.0.0.100.57785: 17573 NXDomain* 0/1/0 (106)
19:55:01.989063 IP 10.0.0.100.34507 > homeserver.duss.xy.domain: 155+ TXT? 23848-14105.id-52787.down.sshdns.dnstunnel.example.org. (62)
19:55:02.113795 IP homeserver.duss.xy.domain > 10.0.0.100.53055: 16680 1/1/0 TXT `` `` (96)
19:55:02.127387 IP homeserver.duss.xy.domain > 10.0.0.100.34507: 155 1/1/0 TXT `` `` (97)
19:55:04.686581 IP 10.0.0.100.39743 > homeserver.duss.xy.domain: 27552+ TXT? 4744-46997.id-31410.down.sshdns.dnstunnel.example.org. (61)
19:55:04.823762 IP homeserver.duss.xy.domain > 10.0.0.100.39743: 27552 1/1/0 TXT `` `` (96)
19:55:06.005887 IP 10.0.0.100.37415 > homeserver.duss.xy.domain: 64196+ TXT? 23848-57440.id-52787.down.sshdns.dnstunnel.example.org. (62)
19:55:06.183955 IP homeserver.duss.xy.domain > 10.0.0.100.37415: 64196 1/1/0 TXT `` `` (97)
19:55:08.019211 IP homeserver.duss.xy.domain > 10.0.0.100.37457: 55047 1/13/0 A 174.143.142.58 (271)
19:55:08.043757 IP homeserver.duss.xy.domain > 10.0.0.100.37457: 61460 0/1/0 (94)
19:55:08.701239 IP 10.0.0.100.51678 > homeserver.duss.xy.domain: 27523+ TXT? 4744-698.id-31410.down.sshdns.dnstunnel.example.org. (59)
19:55:08.840241 IP homeserver.duss.xy.domain > 10.0.0.100.51678: 27523 1/1/0 TXT `` `` (94)
19:55:10.021281 IP 10.0.0.100.48429 > homeserver.duss.xy.domain: 48196+ TXT? 23848-40142.id-52787.down.sshdns.dnstunnel.example.org. (62)
19:55:10.161332 IP homeserver.duss.xy.domain > 10.0.0.100.48429: 48196 1/1/0 TXT `` `` (97)
19:55:12.717222 IP 10.0.0.100.36828 > homeserver.duss.xy.domain: 35283+ TXT? 4744-24488.id-31410.down.sshdns.dnstunnel.example.org. (61)
19:55:12.856288 IP homeserver.duss.xy.domain > 10.0.0.100.36828: 35283 1/1/0 TXT `` `` (96)
19:55:14.036261 IP 10.0.0.100.46071 > homeserver.duss.xy.domain: 6736+ TXT? 23848-52187.id-52787.down.sshdns.dnstunnel.example.org. (62)
19:55:14.174095 IP homeserver.duss.xy.domain > 10.0.0.100.46071: 6736 1/1/0 TXT `` `` (97)
19:55:16.734383 IP 10.0.0.100.52763 > homeserver.duss.xy.domain: 26146+ TXT? 4744-8838.id-31410.down.sshdns.dnstunnel.example.org. (60)
19:55:18.052329 IP 10.0.0.100.58725 > homeserver.duss.xy.domain: 17293+ TXT? 23848-45884.id-52787.down.sshdns.dnstunnel.example.org. (62)
19:55:18.195326 IP homeserver.duss.xy.domain > 10.0.0.100.58725: 17293 1/1/0 TXT `` `` (97)
19:55:18.752778 IP 10.0.0.100.57793 > homeserver.duss.xy.domain: 27305+ TXT? 4744-2538.id-31410.down.sshdns.dnstunnel.example.org. (60)
19:55:18.891504 IP homeserver.duss.xy.domain > 10.0.0.100.57793: 27305 1/1/0 TXT `` `` (95)
19:55:22.069854 IP 10.0.0.100.52682 > homeserver.duss.xy.domain: 45231+ TXT? 23848-21518.id-52787.down.sshdns.dnstunnel.example.org. (62)
19:55:22.208718 IP homeserver.duss.xy.domain > 10.0.0.100.52682: 45231 1/1/0 TXT `` `` (97)
19:55:22.767600 IP 10.0.0.100.43772 > homeserver.duss.xy.domain: 56593+ TXT? 4744-12830.id-31410.down.sshdns.dnstunnel.example.org. (61)
19:55:22.964026 IP homeserver.duss.xy.domain > 10.0.0.100.43772: 56593 1/1/0 TXT `` `` (96)
19:55:26.085406 IP 10.0.0.100.57741 > homeserver.duss.xy.domain: 39143+ TXT? 23848-26195.id-52787.down.sshdns.dnstunnel.example.org. (62)
19:55:26.225206 IP homeserver.duss.xy.domain > 10.0.0.100.57741: 39143 1/1/0 TXT `` `` (97)
19:55:26.786028 IP 10.0.0.100.57263 > homeserver.duss.xy.domain: 18543+ TXT? 4744-39657.id-31410.down.sshdns.dnstunnel.example.org. (61)
19:55:26.931594 IP homeserver.duss.xy.domain > 10.0.0.100.57263: 18543 1/1/0 TXT `` `` (96)

Weitere Tipps und Tricks

  • Zum schnellen Umschalten der Proxy-Einstellungen eignet sich das Firefox-Plugin FoxyProxy
  • Da die Verbindung nicht sehr schnell ist, kann man mit dem Firefox-Plugin User Agent Switcher den User Agent auf z. B. iPhone ändern, was die Auswirkung hat, dass oft eine mobile Version der Seite geladen wird.
  • Mit ssh -C kann man die Verbindung komprimieren und somit den zu übertragenen Traffic verkleinern
  • Mit der Software tsocks kann man jedes Programm mit einem vorgegebenen Proxy starten

Weitere Informationen und Links

14 thoughts on “Gesamter Traffic über DNS tunneln mit OzymanDNS”

  1. Das heisst, de normali Endawender cha ezig ganz eifach e lokale Socks-Proxy mit SSH iirechte, wo aber alles i DNS TXT Ressource Records duet verkapsle! 😀

    Ech findes höchscht interessant und apropos Enigma: Ja es isch verschlösslet (ned de DNS-Traffic, sondern de SSH-Tunnel (wo ja im DNS-Traffic beinhaltet isch)). ^^

    Reply
  2. ssh -o ProxyCommand=”./droute.pl sshdns.dnstunnel.example.org” username_server2@localhost

    wenn ich mich über putty und droute zum server connecte, dann sehe ich am server alle connect versuche, aber es die ssh session startet nicht. Muss man da not etwas spezielles machen?

    Der einzige Port der am Server offen ist ist port 53 – aber das sollte doch reichen oder?

    Reply
      • ja klar 🙂
        ich sehe am Server ja auch die eingehenden requests.

        ich habe es jetzt mit droute auf der kommandozeile (windows) versucht und ich erhalte binär zeichen retour, als wenn droute die Daten nicht decodieren würde

        Reply
        • Der DNS-Server scheint richtig konfiguriert zu sein, sonst würden keine Requests auf dem “ssh-over-dns”-Server auftauchen. Eine Firewall nehme ich an ist keine (auf dem Server und auf dem Client) aktiviert.

          Und ssh funktioniert sonst auf der Windows-Kommandozeile? Dort gibt es keine Kodierungsprobleme oder so…

          Was ist, wenn du den SOCKS5-Proxy in der Kommandozeile startest? Kannst Du dann im Browser den Proxy eintragen und eine Verbindung ins Internet herstellen?

          $ ssh -D 8080 -N -f -o ProxyCommand="./droute.pl sshdns.dnstunnel.example.org username_server2@localhost

          Emanuel

          Reply
  3. UDP connection from ::ffff:xxxxxxx:61185 to ::
    query 30105: (13838-34918.id-44148.down.sshdns.dns.xxxxx.com, IN, TXT) –
    13838-34918.id-44148.down.sshdns.dns.xxxxxx.com. 0 IN TXT “Hi: Wed Aug 8 16:12:09 CEST 2012”
    NOERROR
    ;; id = 30105
    ;; qr = 1 opcode = QUERY aa = 1 tc = 0 rd = 1
    ;; ra = 0 ad = 0 cd = 0 rcode = NOERROR
    ;; qdcount = 1 ancount = 1 nscount = 0 arcount = 0

    Reply
  4. Hallo,

    vielen Dank für diese hilfreiche Anleitung, dank ihr bin ich jetzt schon ein genzes Stück weiter 🙂
    Eine Verbindung kommt endlich zustande, aber ich habe jetzt das Problem, dass am Client der Proxy-Server die Verbindung zurückweist bzw. verweigert. Was kann da das Problem sein? Ich weiß absolut nicht mehr weiter :/

    Server läuft unter Debian, Client unter Ubuntu. Mit Windows als Client konnte ich keine Verbindung aufbauen. (Weiß jemand, wie ich das machen könnte?)

    Hier noch, was die nomde.pl bei eingehender Verbindung des Clients antwortet:

    UDP connection from 217.237.150.44:2709 to 0.0.0.0
    query 65454: (0-10573.id-8352.down.sshdns.****.dnstunnel.de, IN, TXT) –
    0-10573.id-8352.down.sshdns.****.dnstunnel.de. 0 IN TXT “” “”
    pending.0-10573.id-8352.down.sshdns.****.dnstunnel.de. 0 IN A0.0.0.0
    NOERROR
    ;; id = 65454
    ;; qr = 1 opcode = QUERY aa = 1 tc = 0 rd = 0
    ;; ra = 0 ad = 0 cd = 0 rcode = NOERROR
    ;; qdcount = 1 ancount = 1 nscount = 0 arcount = 1

    Maximum reply length as advertosed in EDNS from 217.237.150.44:2709: 512
    Writing response – done
    Waiting for connections…

    Bitte habt Verständnis, dass ich die Domain etwas zensieren musste.
    Kann mir vielleicht jemand bei meinem Proxy-Problem weiterhelfen? Wäre ich sehr froh 🙂
    Fahre nämlich in Kürze in Urlaub und würde DNS-Tunneling da gerne nutzen 😉

    Danke!

    Reply
  5. Hi Emanuel,
    For my project I will use Ozymandns to transfer the payload Meterpreter over the DNS. Do you know if is it possible to use Ozymandns without use an ssh connection? Only a shell with STDIN – STDOUT?

    Reply
    • Hi Nakai

      So you want to transfer meterpreter to your target? I’m not sure if I understand you correctly, but you already have shell access on your target?

      I’m not sure if ozymandns can do it, but if you use dns2tcp from the offical Debian repo, you can create a “normal” SOCKS Proxy which runs over dns. With the wrapper tsocks, you can use every tool (eg. netcat or even telnet) with a SOCKS Proxy (And maybe so transfer your payload?).

      Best regards
      Emanuel

      Reply
  6. Exactly, we start with the principe that a connection between the handler and the victim is already created and meterpreter is already running. What we want to do is transfer the communication (the data of a Meterpreter session) inside DNS packets. I don’t understand too well what do you mean when you say “use a normal Proxy” and what would be the role of netcat or telnet. Because what we want is really a basic tool that we can use to transfer from the server what he receives in STDIN and send it via DNS to the client that he can use it in STDOUT.

    Is not possible to do a basic tunnel DNS like I said? without ssh and only STDIN-STDOUT? Cause I’ve seen the DNScat2 that use this principe, but the source code in github doesn’t work anymore.

    Nakai

    Reply

Leave a Reply to Semironie Cancel reply