Aller au contenu principal

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

VueFichiers ReactFonction
OverviewOverview.jsxétat global, dernières sorties
TerminalTerminalView.jsx, Shell.jsxcommandes interactives
FichiersFileExplorer.jsxnavigation, preview, download, upload vers dossier courant
TransfertsTransferView.jsxupload/download manuel avec progression
CaptureCaptureView.jsxscreenshot
DecryptDecryptView.jsx, crypto.jsdéchiffrement manuel de flux Wireshark
HistoriqueHistoryView.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, done ou error.

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
  • PDF
  • 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_offset côté backend correspond aux octets reçus depuis le module
  • tx_offset cô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.