ChatGPT, le chatbot basé sur l’intelligence artificielle d’OpenAI a fait parler de lui pendant plusieurs mois. On entend ainsi régulièrement que ChatGPT (et l’IA en général) va nous mettre au chômage.
Avant de poser la vaste question de savoir si ChatGPT peut effectuer tout le travail d’un pentesteur avec la même qualité, il est plus raisonnable de commencer par une question technique bien plus simple : ChatGPT peut-il résoudre un simple challenge de buffer overflow ?
Le but de cet article étant d’étudier le comportement de ChatGPT et non de résoudre un challenge de buffer overflow, nous n’allons donc pas expliquer certains termes techniques.
Avant de commencer, il ne faut pas oublier le message que l’on peut souvent avoir dès que l’on demande comment exploiter des vulnérabilités:
Vous êtes peut-être familier avec ce type de réponse. En effet, ChatGPT considère le « Hacking » comme un acte malveillant, puisqu’il est généralement associé à ce type d’acte. Il refusera donc de donner une réponse à certaines de nos questions. Nous allons donc devoir contourner cette sécurité en posant des questions détournées.
Mettons-nous dans la place d’un débutant qui n’a jamais exploité un buffer overflow !
Nous demandons donc à ChatGPT si le bout de code du challenge est vulnérable.
Première victoire : la vulnérabilité est détectée !
En effet, ChatGPT détecte l’utilisation de ‘scanf’ pour lire un buffer sans contrôle de taille. En plus, il repère la fonction ‘callMeMaybe’ qui simplifie l’exécution de code après avoir exploité le buffer overflow. À la fin, ChatGPT suggère quelques améliorations sur le code.
Nous remarquons donc qu’il est capable d’avoir une vision globale sur le code et arrive à faire le lien entre la vulnérabilité et ‘callMeMaybe’.
Nous continuons notre approche naïve, comme si nous ne lui faisions pas confiance et nous demandons un PoC pour être sûrs que la vulnérabilité existe vraiment.
ChatGPT nous donne donc une chaine de caractères composée de 300 ‘A’. Effectivement, le programme s’arrête avec une erreur de type 'Segmentation Fault'.
Continuons donc l’investigation.
ChatGPT nous conseille alors d’utiliser GDB pour détecter la source de ce crash. Il nous donne ensuite une longue liste de commandes à exécuter dans gdb (omis dans la capture ci-dessus). Mais malheureusement, c’est un échec.
Quand nous lui décrivons le problème, ChatGPT repère directement la cause et nous donne une commande pour compiler le programme avec les ‘symbols’ gdb.
Cependant, après plusieurs allers-retours, ChatGPT se met à tourner en rond et se retrouve bloqué. La seule information utile qu’il ait fournie était la génération d’une chaine de caractère cyclique qui permet de faciliter le débogage.
Laissons cela de côté pour plus tard et essayons de recadrer la conversation en lui demandant la façon la plus rapide pour investiguer l’erreur de segmentation.
Il semblerait que ChatGPT ait réussi à revenir sur les rails. Il nous suggère même quelques commandes à exécuter.
Après avoir reçu le contenu des registres, ChatGPT détecte une chaine de caractère familière ‘saaacaac’, elle correspond à la chaine de caractères cyclique que nous avons générée avec pwntools.
N’oublions pas pourquoi nous sommes ici, ChatGPT nous avait dit qu’il nous fallait réussir à appeler ‘callMeMaybe’. Nous lui demandons donc comment faire.
Il répond par quelques détails et fournit une session GDB pour extraire l’adresse de `callMeMaybe`.
Une fois ces commandes exécutées dans GDB, nous lui transmettons leur résultat en lui demandait une commande permettant de l’exploiter.
L’exécution de la commande échoue et même après plusieurs questions, ChatGPT ne semble pas comprendre pourquoi. Nous décidons donc de l’aider.
Après ce coup de main, ChatGPT suggère de rajouter des caractères dans notre print jusqu’à déclencher le breakpoint.
Nous essayons de l’aider à trouver une meilleure façon de faire en lui proposant d’utiliser la fonction ‘cyclic’ de pwntools.
Les 6 questions qui suivent nous permettent d’avoir la bonne longueur en utilisant cette fonction.
Nous avons ainsi un programme python qui génère la bonne payload. Il ne nous reste plus qu’à l’exécuter.
Cependant, le terminal ne nous donne pas la main en tant que root. Dans les faits, un bash en tant que root est bien lancé, mais il se ferme avant que nous ayons pu écrire des commandes.
Nous essayons donc encore une fois de l’aider à détecter le problème mais sans succès.
Un autre coup de pouce est nécessaire.
Avec une indication plus claire, ChatGPT décide de changer de stratégie et de repartir sur le programme utilisant pwntools. Ce qui n’est pas une mauvaise idée, mais la fonction ‘interact’ ne fonctionne pas, il faudra la remplacer par ‘interactive’ pour réussir à exploiter la vulnérabilité. Ce qu’il n’a pas réussi à trouver malgré nos différentes tentatives.
En conclusion, le temps perdu dans la conversation nous a convaincu que l’utilisation de ChatGPT pour une tâche de bout en bout par un novice est déconseillée. Il a eu besoin de plusieurs indices pour être mis sur la bonne voie, ce qui nous invite à ne recommander son utilisation que pour des questions claires et directes.
Le second problème rencontré est l’inexactitude de certaines informations qu’il nous fournit, il est donc conseillé de faire un ‘fact-checking’ à l’aide d’un moteur de recherche et/ou avoir une connaissance sur le sujet.