Firewall Piercing/Beispiele/Zugriff per SSH via SOCKS-Proxy getarnt mit SSH auf Port 443

Aus UUGRN

Lage[Bearbeiten]

Ausgangspunkte für dieses Beispiel sind

  • Der Zugriff vom lokalen Netz aus auf das (freie) Internet ist durch Firewalls beschränkt
  • erlaubt sind ausgehend nur HTTP und HTTPS (80,443)
  • alternativ: es existiert ein Proxy Server für HTTP/HTTPS
  • Zugriffe auf das Internet werden protokolliert (Verkehrsanalyse, zB Proxy-Logfiles, Firewall-Logs)
  • es soll mit SSH auf (einen/mehrere) Zielrechner zugegriffen werden, die ihrerseits durch Firewallregeln o.ä. beschränkt sind
  • es sollen möglichst wenige Spuren im Firewall/Proxy Log erscheinen
  • Zugriffe per SSH sollen als solche nicht erkennbar sein (Achtung!)

Wir benötigen[Bearbeiten]

  • einen ssh-Daemon auf einem Server im Internet, der auf Port 443 lauscht
  • auf dem lokalen Rechner entweder
    • PuTTY
    • openssh, bsd-netcat

Vorgehensweise[Bearbeiten]

Jumphost als SOCKS Proxy[Bearbeiten]

Vereinfacht gehen wir davon aus, dass ein TCP-Connect von intern via Firewall möglich ist, d.h. dass kein Proxy-Zwang existiert. Es soll eine SSH-Vebindung zu unserem Sprunghost aufgebaut werden, welche im Folgenden dann als SOCKS-Proxy verwendet werden wird.

Nach dem (einmaligen) Verbindungsaufbau steht uns ein SOCKS-Server auf 127.0.0.1 Port 1080 zur Verfügung, nicht nur für andere/weitere SSH Sessions sondern auch für alle anderen Programme, die SOCKS-Proxy Support aben, Beispielsweise Mailclients, Webbrowser (mit SOCKS-Support), Instant Messenger, ...

In der Verkehrsanalyse sieht man hier lediglich Datenpakete einer einzigen verschlüsselten TCP-Connection auf Port 443.


OpenSSH[Bearbeiten]

Wir legen dazu ein passendes "Profil" an, bei OpenSSH geht das wie folgt:

in ~/.ssh/config folgenden Abschnitt hinzufügen
Host jumphost
        Hostname shell.uugrn.org
        Port 443
        User meinusername
        TCPKeepAlive yes
        DynamicForward 127.0.0.1:1080
Verbindungsaufbau
$ ssh -N jumphost &

Diese SSH-Session schieben wir in den Hintergrund, damit wir sie bei Bedarf einfach wieder nach vorne holen (Jobcontrol) und/oder killen können. Der Parameter "-f" würde das "&" ersetzen, hier verlieren wir allerdings den Prozess aus der Jobcontrol unserer Shell.

PuTTY[Bearbeiten]

Wir legen in PuTTY ein neues Profil mit dem Namen "jumphost" an. Das Profil zeigt auf den Hostname "shell.uugrn.org" mit dem Port 443. In den Verbindungseinstellungen können wir ein "Dynamic Port Forwarding" aktivieren und verwenden im Dialogfeld hier 1080 als TCP-Port dafür.


SSH via SOCKS[Bearbeiten]

Für häufig genutzte SSH Zugriffe auf irgendwelche Server legt man am besten auch hier wieder Profile an.

Datenspuren[Bearbeiten]

Die Verkehrsanalyse zwischen dem lokalen Rechner und dem Jumphost weiss nichts von der Verbindung zu strange.uugrn.org:22 und wird auch keine entsprechenden Daten liefern können, da die Verbindung verschlüsselt ist.

Allerdings ist auch die Verkehrsanalyse im Zielnetz (bei strange.uugrn.org) nicht in der Lage zu ermitteln, dass der SSH-Client via SOCKS-Proxy arbeitet, strange.uugrn.org sieht lediglich die TCP-Connection ab shell.uugrn.org (jumphost).


OpenSSH[Bearbeiten]

in ~/.ssh/config
Host charm.socks
        Hostname charm.uugrn.org
        Port 22
        User meinusername
        ProxyCommand /bin/netcat -X 4 -x 127.0.0.1:1080 %h %p

Host strange.socks
        Hostname strange.uugrn.org
        Port 22
        User meinusername
        ProxyCommand /bin/netcat -X 4 -x 127.0.0.1:1080 %h %p

Host top.socks
        Hostname top.uugrn.org
        Port 22
        User meinusername
        ProxyCommand /bin/netcat -X 4 -x 127.0.0.1:1080 %h %p

ProxyCommand ist hier das bsd-netcat, welches bei Debian in /bin/nc liegt. Mit "-X" und "-x" definieren wir, dass der Zugriff auf Host Port (%h %p) via SOCKS-4-Proxy erfolgen soll.

Genutzt werden kann es wie folgt:

$ ssh [options] strange.socks [remote commands]
Beispiel
$ ssh strange.socks 'echo $SSH_CONNECTION'
195.49.138.100 55798 62.157.153.57 22

Dieser Aufruf bestätigt uns, dass die Verbindung tatsächlich über shell.uugrn.org (195.49.138.100) auf strange.uugrn.org (62.157.153.57) Port 22 reingekommen ist.

PuTTY[Bearbeiten]

Analog dazu verfahren wir hier mit PuTTY und konfigurieren für die jeweilige Session, z.B. strange.socks