Frontend attaquant
Le frontend est une application React/Vite située dans:
attacking_program/frontend/
Flask sert frontend/dist/ si le build existe, sinon le dossier source.
Le frontend n'implémente pas le protocole kernel. Il affiche l'état et envoie des requêtes HTTP au backend. Le backend est celui qui gère la socket, la crypto et les offsets.
Démarrage
Dans la VM attaquante:
~/open-attacker-dashboard.sh
URL:
http://192.168.100.1:8080
Le bouton ou raccourci "Page victime" pointe vers:
http://192.168.100.1:8080/freecloude
Polling de statut
App.jsx appelle:
GET /api/rootkit/status
toutes les 3 secondes. Ce statut alimente:
- listener lié ou non
- connexion détectée
- besoin de mot de passe
- peer pending ou actif
- cwd distant
- offsets crypto
- historique des événements.
Authentification
Quand status.needs_password vaut true, AuthGate affiche un formulaire:
{ "password": "<secret>" }
envoyé à:
POST /api/rootkit/authenticate
Le mot de passe n'est pas injecté dans le payload HTTP. Il doit correspondre au secret saisi côté victime pendant le parcours freecloude.py, lorsque le loader lance l'installateur freecloude.sh.
Après authentification réussie, le frontend ne garde pas la socket. Il voit seulement l'état retourné par /api/rootkit/status.
Vues
| Vue | Fichiers React | Fonction |
|---|---|---|
| Overview | Overview.jsx | état global, dernières sorties |
| Terminal | TerminalView.jsx, Shell.jsx | commandes interactives |
| Fichiers | FileExplorer.jsx | navigation, preview, download, upload vers dossier courant |
| Transferts | TransferView.jsx | upload/download manuel avec progression |
| Capture | CaptureView.jsx | screenshot |
| Decrypt | DecryptView.jsx, crypto.js | déchiffrement manuel de flux Wireshark |
| Historique | HistoryView.jsx | événements backend |
Terminal
Une commande part vers:
POST /api/rootkit/command
Le frontend garde un historique local avec:
- commande
- cwd
- sortie
- exit code
- état
running,doneouerror.
Commandes de test utiles:
whoami && id && hostname
uname -a
ip -brief addr
pwd && ls -la
Explorateur de fichiers
Exploration:
POST /api/rootkit/explore
Aperçu:
POST /api/rootkit/preview-file
Le frontend choisit un rendu selon le contenu:
- texte UTF-8
- image
- binaire non prévisualisable.
L'aperçu est limité côté backend. Les gros fichiers doivent passer par Download.
Transferts
Upload streamé:
POST /api/rootkit/upload-progress
Download streamé:
POST /api/rootkit/download-file-progress
Ces routes renvoient des lignes JSON successives. Le frontend met à jour la barre de progression à chaque événement.
Archive dossier:
POST /api/rootkit/download-directory
Le frontend reçoit content_base64, crée un Blob et déclenche le téléchargement navigateur.
Capture
Route:
POST /api/rootkit/screenshot
Si le backend renvoie content_base64, la vue affiche l'image et permet de télécharger le PNG.
La réussite dépend de la session graphique victime et des outils disponibles:
gnome-screenshot
scrot
import
xwd + convert
Vue Decrypt
La vue Decrypt reproduit la crypto:
sortie[i] = entrée[i] ^ key[(offset + i) % 16]
Elle accepte:
- hex
- base64
- texte brut.
Elle peut utiliser rx_offset, tx_offset depuis le statut, ou un offset manuel. Cela sert à vérifier une capture Wireshark du port 4444.
Rappel de sens:
rx_offsetcôté backend correspond aux octets reçus depuis le moduletx_offsetcôté backend correspond aux octets envoyés vers le module.
États verrouillés
Tant que status.connected est faux:
- les commandes sont désactivées
- les transferts sont désactivés
- l'exploration est désactivée
- la vue affiche si la session attend une connexion ou un mot de passe.
Cela évite d'envoyer des requêtes qui échoueraient immédiatement côté backend.
Build frontend
Dans un environnement de développement:
cd attacking_program/frontend
npm install
npm run build
Le build produit:
attacking_program/frontend/dist/
Pour comprendre les limites et le protocole derrière les vues, voir Backend attaquant et Chiffrement.