Q&A Klassiker: SSH Brute-Force
Kategorie: Q&A · Channel: #klassiker
Format: BĂŒhnenspiel â Admin · Angreifer · Kunde
Die Situation
Uhrzeit: 02:14 Uhr
Alarm: Monitoring â auth.log GröĂe > 500MB
fail2ban: 847 IPs in letzter Stunde gesperrt
Symptom: SSH-Login dauert ungewöhnlich lange
Kunde: kein direkter Kundenkontakt â internes Problem
aber: wenn Server kompromittiert â Kundendaten in Gefahr
đšâđ» Admin-Perspektive: Was sehe ich, was tue ich?
Schritt 1: Lagebild â wie massiv ist der Angriff?
# Wie viele fehlgeschlagene Logins gerade?
grep "Failed password" /var/log/auth.log | wc -l
# Wie schnell kommen sie rein?
grep "Failed password" /var/log/auth.log | \
awk '{print $1, $2}' | uniq -c | tail -20
# â zeigt Anzahl pro Minute
# Welche IPs greifen an?
grep "Failed password" /var/log/auth.log | \
awk '{print $11}' | sort | uniq -c | sort -rn | head -20
# Welche Usernames werden probiert?
grep "Invalid user" /var/log/auth.log | \
awk '{print $8}' | sort | uniq -c | sort -rn | head -20
# typisch: root, admin, ubuntu, pi, test, oracle, postgres...
# fail2ban Status
fail2ban-client status sshd
# â zeigt aktuelle Banned IPs und Gesamtzahl
Schritt 2: Wurde eine Verbindung erfolgreich hergestellt?
# Das ist die kritische Frage!
# Erfolgreiche Logins prĂŒfen:
grep "Accepted" /var/log/auth.log
grep "session opened" /var/log/auth.log
# Wer ist gerade eingeloggt?
who
w
last | head -20
# Aktive SSH-Verbindungen:
ss -tnp | grep :22
# Unbekannte Prozesse die der Angreifer gestartet haben könnte:
ps aux | grep -v "^root\|^www-data\|^mysql\|^nobody"
# â unbekannte User mit Prozessen = Warnsignal!
# Netzwerkverbindungen nach auĂen prĂŒfen:
ss -tnp | grep ESTABLISHED
netstat -tnp | grep -v "127.0.0.1\|10.0."
# â unbekannte externe Verbindungen = Warnsignal!
Schritt 3: SofortmaĂnahme â Angriff eindĂ€mmen
# Option A: IP-Bereich sofort sperren (wenn Angriff von einer Region)
iptables -I INPUT 1 -s 1.2.3.0/24 -j DROP
# Option B: SSH nur noch aus Management-Netz
iptables -I INPUT 1 -p tcp --dport 22 \
! -s 10.0.0.0/19 -j DROP
# Option C: SSH-Port temporĂ€r schlieĂen
# â ïž NUR wenn IPMI-Zugang verfĂŒgbar!
iptables -I INPUT 1 -p tcp --dport 22 -j DROP
# Dann: Reparatur via IPMI-Konsole
# fail2ban Ban-Zeit erhöhen (sofort wirksam):
fail2ban-client set sshd bantime 86400 # 24 Stunden
fail2ban-client set sshd maxretry 2 # nach 2 Fehlern sperren
Schritt 4: HĂ€rtung â wenn noch nicht geschehen
# PasswordAuthentication deaktivieren â SOFORT
# Schritt 1: Sicherstellen dass eigener Key hinterlegt ist
cat ~/.ssh/authorized_keys # muss vorhanden sein!
# Schritt 2: Config Àndern
vi /etc/ssh/sshd_config
# PasswordAuthentication no
# PermitRootLogin no
# MaxAuthTries 3
# Schritt 3: Syntax prĂŒfen
sshd -t
# Schritt 4: In ZWEITER Session testen, dann reload
systemctl reload sshd
# Schritt 5: Sofort testen ob Key-Login noch funktioniert!
ssh -i ~/.ssh/id_ed25519 adminuser@10.0.1.50
Schritt 5: War der Angriff erfolgreich? â Forensik
# Rootkit-Check (schnell):
find / -name ".*" -type f 2>/dev/null | grep -v ".cache\|.config\|.local"
# â versteckte Dateien (Punkt am Anfang) auĂerhalb von Home
# SUID/SGID Dateien â wurden neue hinzugefĂŒgt?
find / -perm /4000 -o -perm /2000 2>/dev/null | sort
# Normalzustand kennen â mit frĂŒherer Liste vergleichen
# Cronjobs prĂŒfen â wurde etwas hinzugefĂŒgt?
crontab -l
crontab -l -u root
ls -la /etc/cron.*
cat /etc/crontab
# Neue User angelegt?
awk -F: '$3 >= 1000 {print $1, $3}' /etc/passwd
# â unbekannte UIDs = Warnsignal
# Letzte DateiÀnderungen:
find /etc /bin /sbin /usr/bin /usr/sbin \
-newer /var/log/auth.log -type f 2>/dev/null
# Systemd-Services prĂŒfen:
systemctl list-units --state=active --type=service | \
grep -v "^UNIT\|loaded\|exited"
Schritt 6: auth.log GröĂe reduzieren
# auth.log ist 500MB â zuerst verstehen warum
wc -l /var/log/auth.log
# Rotation erzwingen:
logrotate -f /etc/logrotate.d/rsyslog
# rsyslog Rate-Limiting fĂŒr Auth-Meldungen:
# /etc/rsyslog.d/50-default.conf:
# auth,authpriv.* /var/log/auth.log
# FĂŒr fail2ban reichen die letzten Stunden:
# fail2ban liest die Datei live â alte EintrĂ€ge können rotiert werden
đŠč Angreifer-Perspektive: Wie gehe ich vor?
Phase 1: Reconnaissance
Ziel: herausfinden ob SSH offen ist und welche Version lÀuft
nmap -sV -p 22 10.0.1.50
# â SSH-2.0-OpenSSH_9.2p1 Debian-2+deb12u2
# Was verrÀt der Banner?
nc 10.0.1.50 22
# SSH-2.0-OpenSSH_9.2p1 Debian-2+deb12u2
# â Debian-Version bekannt â bekannte CVEs prĂŒfbar
Phase 2: Credential Stuffing / Dictionary Attack
Typische Tools:
hydra -l root -P /wordlists/rockyou.txt ssh://10.0.1.50
medusa -h 10.0.1.50 -u admin -P passwords.txt -M ssh
ncrack -p 22 --user root -P common_passwords.txt 10.0.1.50
Was ich probiere:
- root / root
- root / toor
- admin / admin
- ubuntu / ubuntu
- pi / raspberry
- test / test
- oracle / oracle
- postgres / postgres
Phase 3: Was ich suche nach Erfolg
1. Persistenz sichern:
â eigenen Key in authorized_keys eintragen
â neuen User anlegen: useradd -m -s /bin/bash sysbackup
â Cronjob fĂŒr Reverse-Shell
2. Privilege Escalation:
â sudo -l (was darf der User?)
â SUID-Binaries (find / -perm /4000)
â Kernel-Exploits (uname -a â bekannte CVEs)
3. Lateral Movement:
â ~/.ssh/known_hosts lesen â welche anderen Server sind bekannt?
â SSH-Keys kopieren â andere Server versuchen
â Netzwerk scannen: nmap 10.0.1.0/24
Was mich am meisten aufhÀlt
â PasswordAuthentication no â dictionary attacks nutzlos
â fail2ban mit kurzer Ban-Zeit â IP sofort gesperrt
â Port 22 nur aus MGMT-Netz â ich komme gar nicht ran
â SSH-SchlĂŒssel + Passphrase â selbst bei Key-Diebstahl nutzlos
â Nur Port-Change (2222) â hilft wenig, nmap findet es trotzdem
đ Kunden-Perspektive: Was erlebe ich?
Direkte Auswirkung auf Kunden:
â Solange nur Brute-Force (kein Erfolg): keine direkte Auswirkung
â Bei erfolgreichem Einbruch:
- Kundendaten kompromittiert â DSGVO-Meldepflicht 72h!
- Server als Spam-Relay genutzt â IP auf Blacklists
- Crypto-Miner â Server zu langsam â Dienste trĂ€ge
- Ransomware â Totalausfall
DSGVO-Kontext bei Erfolg:
Wenn personenbezogene Daten kompromittiert wurden:
72-Stunden-Frist:
â Meldung an Datenschutzbehörde (BSI / Landesdatenschutzbeauftragter)
â Information betroffener Kunden wenn hohes Risiko
Dokumentation die erstellt werden muss:
- Wann wurde der Angriff bemerkt?
- Welche Daten waren betroffen?
- Welche MaĂnahmen wurden ergriffen?
- Wann wurde die LĂŒcke geschlossen?
đŻ Erkenntnis â Drei Perspektiven zusammen
| Perspektive |
Kernaussage |
| đšâđ» Admin |
grep "Accepted" /var/log/auth.log ist die erste kritische Frage |
| đŠč Angreifer |
PasswordAuthentication no macht Dictionary Attacks sofort nutzlos |
| đ Kunde |
Kein Kundenproblem solange kein Einbruch â danach: DSGVO 72h |
đ§ PrĂ€vention â die vollstĂ€ndige Checkliste
# 1. PasswordAuthentication no â wichtigste MaĂnahme
# 2. PermitRootLogin no
# 3. MaxAuthTries 3
# 4. Port 22 nur aus MGMT-Netz per iptables
# 5. fail2ban aktiv mit:
# - maxretry 3
# - bantime 24h
# - ignoreip = eigenes Netz
# 6. SSH-Banner deaktivieren (kein OS-Fingerprint):
# Banner none
# DebianBanner no
# 7. Monitoring: Alert wenn auth.log > 100MB
# 8. Monitoring: Alert wenn fail2ban > 50 Bans/Stunde
# 9. known_hosts regelmĂ€Ăig prĂŒfen
# 10. Keine privaten Keys auf Servern (nur Public Keys!)
đ Schnellreferenz: SSH Brute-Force â Einzeiler
# Angriff bewerten
grep "Failed password" /var/log/auth.log | wc -l
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head
grep "Accepted" /var/log/auth.log # Erfolgreiche Logins!
# SofortmaĂnahmen
fail2ban-client status sshd # Status
fail2ban-client set sshd bantime 86400 # 24h sperren
iptables -I INPUT 1 -p tcp --dport 22 ! -s 10.0.0.0/19 -j DROP
# Forensik
who && w && last | head -20 # wer ist drin?
ss -tnp | grep :22 # aktive Sessions
find /etc/cron* /var/spool/cron -type f -newer /var/log/auth.log # neue Cronjobs?
awk -F: '$3 >= 1000 {print $1, $3}' /etc/passwd # neue User?