June 25, 2022 4:00 PM (GMT+2) - Kevin Denis & Antide Petit

Plusieurs fois par an, ZDI organise un concours appelé Pwn2Own dans lequel des chercheurs en sécurité doivent prendre le contrôle de matériel et logiciel grand public. Cette conférence explique la démarche utilisée par Mitsurugi et xarkes lors de ce concours pour obtenir une RCE depuis Internet dans le routeur wifi grand public Netgear R6700v3.

Voici la présentation qui sera faite pendant LEHACK:

La présentation débute par les difficultés de ce genre de recherche : il s'agit de routeurs grands publics qui ont des fonctions de sécurité, et qui ont déjà été audités, puisqu'il s'agit de leur 3e participation à Pwn2Own. Seule une interface d'administration est accessible à l'utilisateur, et il n'y a pas de "shell" ou d'invite de commande pour le chercheur en sécurité voulant analyser le produit. De plus, il s'agit d'un concours où plusieurs équipes travaillent en parallèle sur le même sujet, et les cibles sont mises à jour jusqu'à la veille de l'épreuve.

Le travail débute par le choix du composant logiciel à attaquer, et sur l'ajout de capacités de debug comme un accès shell, l'accès aux fichiers et l'ajout d'un debugger.

Une recherche de vulnérabilités permet d'en trouver une dans un service chargé d'effectuer du filtrage parental. En effet ce service va récupérer des bases de filtrage sur internet, et ne valide pas correctement le format de message renvoyé par le serveur de mise à jour. Il est rapidement vérifié qu'un crash se produit lorsque l'attaquant prend la place du serveur de mise à jour et renvoie un mauvais message.

Bien que les mises à jour soient téléchargées en TLS, il est possible de remplacer le serveur de mise à jour grâce à une erreur de développement. Différentes stratégies d'exploitation sont possibles, en s'appuyant sur l'absence de défense en profondeur du produit (pas de stack cookie, pas d'ASLR complet). Il a été choisi d'utiliser une RCE via un unique gadget en cherchant par force brute une adresse dans la mémoire heap pour exécuter la commande system() avec une chaîne contrôlée par l'attaquant. Les scripts permettant l'attaque sont alors présentés (la démonstration n'est pas faite en live).

Enfin, la soumission à ZDI est expliquée avec la participation au Pwn2Own, suivi du correctif du constructeur, et de l'analyse du patch supprimant la vulnérabilité. Un compte-rendu du concours Pwn2Own est présenté lors des dernières slides.

Référence du concours: - https://www.zerodayinitiative.com/blog/2021/8/11/pwn2own-austin-2021-phones-printers-nas-and-more

Référence de la vulnérabilité: - https://www.synacktiv.com/publications/pwn2own-austin-2021-defeating-the-netgear-r6700v3.html - CVE-2022-27646 - CVE-2022-27644

🇫🇷 PWNING A NETGEAR ROUTER FROM WAN MITM STYLE

Pwn2Own

Hacking contest, you hack the device, you get it. You register in advance, choose a device have 30 days to work on it and then do it live. Multiple participants will be on the same chosen device, teams are randomly selected for order of appearance and first team to hack get the device + a better reward.

Device to hack: Netgear R6700v3

After some inspection they noticed that the router will always fetch for update on startup. The code responsible for this is below:

Untitled

The function that named updating_database located at 0xCE38 parses a /tmp/circleinfo.txt file in order to check if there is any update to apply. The parsing reads each line of the text file, then writes data in two stack variables without checking their size, resulting in a classical stack buffer overflow.

Untitled

The function located at 0xE2D8 named retrieve_circleinfo_txt fetches the circleinfo.txt file from a remote server and copies it in the /tmp folder. The function url_retrieve (at 0xC904) is used to download files. The download is done through an https server, but the function doesn’t check the certificate:

The -k option given to curl explicitly prevents the certificate check. In other words, it means that anybody can impersonate the update server.

They are the DHCP server for the Netgear. But can also be the DNS server and the https update server (thanks to the curl -k any self signed certificate will be accepted).

Untitled

Serve a file containing 1000 ‘A’ followed by a space and one more ‘A’:

Untitled