Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2021-34730 — Dépassement de pile UPnP Cisco RV110w | Kitploit
Outils/GitHubGitHub/badmonkey7/cve-2021-34730
Sécurité des Systèmes EmbarquésSécurité IoTAnalyse des VulnérabilitésExploitationRétro-ingénierieDébogueursSécurité RéseauHacking MatérielAnalyse de MicrologicielExploitation de Binaires
GitHub
28727il y a 5 ansVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager
badmonkey7/cve-2021-34730

CVE-2021-34730

Dépassement de pile UPnP Cisco RV110w

Voir le dépôt

Analyse de la faille 0day UPnP du Cisco RV110W

Introduction

UPnP est très populaire ces derniers temps. J'avais justement un Cisco RV110W sous la main. En août 2021, Cisco a officiellement divulgué un 0day concernant UPnP dans la série RV, mais les détails précis n'ont pas été publiés. J'ai donc voulu utiliser cet appareil pour déboguer et analyser cette vulnérabilité. L'avis de vulnérabilité est disponible sur le site officiel.

Préparation

Tout d'abord, j'ai mis à jour le firmware vers la dernière version 1.2.2.8. Ensuite, le problème à résoudre était de savoir comment déboguer et localiser la vulnérabilité. Commençons par régler le problème du débogage : la première étape consiste à obtenir un shell sur l'appareil. Cependant, le dernier firmware ne fournit pas d'interface de débogage. J'ai donc obtenu les droits de débogage du dernier firmware via le port série UART et en modifiant le paquet de firmware. La méthode détaillée est décrite dans un article que j'ai écrit précédemment : Débogage de routeurs : getshell.

Préparation au débogage

Le Cisco RV110W est basé sur une architecture mipsel, il faut donc d'abord trouver un gdb-server correspondant. On peut le compiler soi-même en croisé ou utiliser une version compilée par quelqu'un d'autre. Ici, je recommande gdb-static-cross.

Localisation de la vulnérabilité

L'avis officiel indique que la vulnérabilité se trouve dans le service UPnP. Tout d'abord, allez dans l'interface d'administration, puis dans FireWall > Basic Settings pour activer la configuration UPnP.

Untitled

Ensuite, j'ai scanné les ports avec nmap : aucun port UPnP n'est apparu, mais les tests ont montré qu'UPnP était bien activé.

Untitled

J'ai utilisé UPnPy pour tester et exploiter la vulnérabilité.

import socket
msg = \
    b'M-SEARCH * HTTP/1.1\r\n' \
    b'HOST:239.255.255.250:1900\r\n' \
    b'ST:upnp:rootdevice\r\n' \
    b'MX:2\r\n' \
    b'MAN:"ssdp:discover"\r\n' \
    b'\r\n'

# Set up UDP socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
s.bind((b"192.168.2.100",23333)) #本机IP
s.settimeout(2)
s.sendto(msg, (b'239.255.255.250', 1900))
addr = ('192.168.2.1', 1900) # 网关IP
try:
    while True:
        data, addr = s.recvfrom(65507)
        print(addr,data)

except socket.timeout:
    pass

J'ai bien reçu une réponse UPnP et le processus UPnP correspondant est présent dans les processus de l'appareil.

Untitled

Analyse des services

UPnP est un standard de protocole générique. La plupart des fabricants l'implémentent selon ce standard, de sorte que de nombreuses actions sont identiques. Il est néanmoins nécessaire d'analyser les services fournis par l'appareil pour localiser et exploiter la vulnérabilité. J'ai donc utilisé UPnPy pour collecter les informations.

import upnpy
import socket

import requests
from upnpy.ssdp.SSDPDevice import SSDPDevice
msg = \
    b'M-SEARCH * HTTP/1.1\r\n' \
    b'HOST:239.255.255.250:1900\r\n' \
    b'ST:upnp:rootdevice\r\n' \
    b'MX:2\r\n' \
    b'MAN:"ssdp:discover"\r\n' \
    b'\r\n'

# Set up UDP socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
s.bind((b"192.168.2.100",23333))
s.settimeout(2)
s.sendto(msg, (b'239.255.255.250', 1900))
addr = ('192.168.2.1', 1900)
data = b""
try:
    while True:
        data, addr = s.recvfrom(65507)
        print(addr,data)
except socket.timeout:
    pass

# data = b'HTTP/1.1 200 OK\r\nCache-Control: max-age=120\r\nDate: Fri, 01 Jan 2010 00:44:16 GMT\r\nExt: \r\nLocation: http://192.168.2.1:1780/InternetGatewayDevice.xml\r\nServer: POSIX UPnP/1.0 linux/5.70.48.16\r\nST: upnp:rootdevice\r\nUSN: uuid:31474a87-67ea-dae4-2f73-f157fb06d22b::upnp:rootdevice\r\n\r\n'
# data = b'HTTP/1.1 200 OK\r\nCache-Control: max-age=3600\r\nST: upnp:rootdevice\r\nUSN: uuid:824ff22b-8c7d-41c5-a131-8c3bad401726::upnp:rootdevice\r\nEXT:\r\nServer:  Unspecified, UPnP/1.0, Unspecified\r\nLocation: http://192.168.3.1:56688/rootDesc.xml\r\n\r\n'

device = SSDPDevice(addr, data.decode())
services = device.get_services()

services_id = [services[i].id.split(":")[-1] for i in range(len(services))]

for id in services_id:
    service = device[id]
    actions = service.get_actions()
    for action in actions:
        for argument in action.arguments:
            print(id,action.name,argument.name)

On obtient ainsi une série d'informations sur les services, dont certaines ci-dessous :

WANIPConn1 AddPortMapping NewRemoteHost
WANIPConn1 AddPortMapping NewExternalPort
WANIPConn1 AddPortMapping NewProtocol
WANIPConn1 AddPortMapping NewInternalPort
WANIPConn1 AddPortMapping NewInternalClient
WANIPConn1 AddPortMapping NewEnabled
WANIPConn1 AddPortMapping NewPortMappingDescription
WANIPConn1 AddPortMapping NewLeaseDuration
WANIPConn1 DeletePortMapping NewRemoteHost
WANIPConn1 DeletePortMapping NewExternalPort
WANIPConn1 DeletePortMapping NewProtocol
WANIPConn1 GetExternalIPAddress NewExternalIPAddress

Ces services peuvent être globalement classés en services de type get, de type set, et quelques services de type delete. L'un des objectifs principaux d'UPnP étant d'exposer des appareils du réseau interne au réseau public, une certaine configuration est nécessaire (mappage de ports, etc.). Puisqu'il faut configurer, les paramètres et les informations de configuration sont indispensables, et ces paramètres sont précisément ceux des services de type set.

Localisation des services

Comme le fabricant n'a pas implémenté tous les services, il faut rétro-concevoir le firmware soi-même. Tout d'abord, localisons upnp_mainloop.

Untitled

Toute la logique de traitement est implémentée dans upnp_dispatch. En poursuivant l'analyse, on découvre des parties de traitement des requêtes SSDP et HTTP.

Untitled

ssdp_process correspond aux requêtes M-Search lors de la découverte, et upnp_http_process au traitement des requêtes HTTP. Comme les appels de service normaux sont tous des requêtes HTTP, on peut supposer que upnp_http_process est susceptible de contenir une vulnérabilité. Un exemple d'appel de service est illustré ci-dessous.

Untitled

Dans upnp_http_process, on trouve un appel à upnp_http_fsm_emgine.

Untitled

En poursuivant l'analyse, on constate que plusieurs fonctions à l'adresse off_45ab80 sont exécutées.

Untitled

Ces fonctions assurent l'initialisation et l'analyse de l'en-tête du protocole. La dernière fonction est upnp_http_fsm_dispatch ; je suppose qu'elle exécute la fonction de service correspondante.

Télécharger l’outil