
Binäranalyse und Ausnutzung von CVE-2019-1663, einem Pufferüberlauf in der Webverwaltung von Cisco-Routern, einschließlich Ursachenanalyse, Exploit-Schritten und ROP-Gadget-Entdeckung.
Autor: Corentin Wolff
Die Schwachstelle stammt von der Funktion 0x0002BF64, die die strcpy-Funktion missbraucht, was sie anfällig für Pufferüberlauf-Angriffe macht. Zur Klarheit wurde diese Funktion in Login umbenannt. Nachfolgend ein Ausschnitt, der das Problem veranschaulicht:
undefined4 Login(char *param_1, char *param_2, char *param_3, int param_4) { ... }
In diesem Ausschnitt wird die strcpy-Funktion unsachgemäß verwendet, was eine Pufferüberlauf-Schwachstelle verursacht:
if (param_4 == 0) {
iVar2 = strncmp(acStack_fa, "enc=", 4);
if (iVar2 != 0) {
strcpy(acStack_15e, acStack_fa);
strcpy(acStack_1c2, param_2);
goto LAB_0002c264;
}
}
Dieser Teil des Codes überprüft den Benutzernamen:
if (iVar2 != 0) {
syslog(6, "Web management login failed, user=%s\n", param_1);
}
Der Parameter param_1 wird als Feld für den Benutzernamen identifiziert.
Ebenso entspricht param_2 dem Passwort, während param_3 als httpd_user identifiziert wird.
Die Variable login_flag stellt Verbindungszustände dar:
0 → Login-Fehler
1 → Admin-Login erfolgreich
2 → Admin-Login aufgrund einer bestehenden Sitzung verweigert
3 → Admin-Login erzwingt Abmeldung
Die Schwachstelle ist ein Pufferüberlauf, der durch unsachgemäße Verwendung der strcpy-Funktion verursacht wird.
Die strcpy-Funktion überprüft nicht die Größe des Quellstrings gegen die Kapazität des Zielpuffers. Dies ermöglicht das Überschreiben benachbarter Speicherbereiche.
CVE-2019-1663 nutzt das Fehlen einer Eingabegrößenvalidierung in bestimmten Cisco-Router-Modellen aus.
a. Keine Längenprüfung: Nicht bereinigte Benutzereingabe wird an strcpy übergeben.
b. Speicherüberlauf: Überschüssige Daten überschreiben kritische Speicherbereiche.
c. Willkürliche Codeausführung: Angreifer injizieren und führen schädlichen Code aus.
d. Voraussetzungen für die Ausnutzung: Zugriff auf den Web-Konfigurationsserver des Routers.
e. Auswirkung: Privilegierter Zugriff, der Netzwerkspionage, Verkehrsumleitung, Malware-Installation oder Hintertüren ermöglicht.
&enc=1&user=cisco&pwd=AAAA...AAAAZZZZ&sel_lang=EN
Dies löst einen Segmentierungsfehler aus. Durch Bestimmen der optimalen Puffergröße können Angreifer schädlichen Code injizieren und ausführen.
ibc.so.0/ELF/ARM)> disasm_address 0x00034410
Instructions
============
0x00034410: pop {r0, pc}
(libc.so.0/ELF/ARM)> disasm_address 0x00041304
Instructions
============
0x00041304: mov r2, r0
(libc.so.0/ELF/ARM)> search %mov r2, r0%
[INFO] Searching for gadgets: %mov r2, r0%
[INFO] File: libc.so.0
0x00041304: mov r2, r0; mov r0, sp; blx r2;
MITRE CWE-120: Puffer kopieren ohne Größenprüfung der Eingabe
https://cwe.mitre.org/data/definitions/120.html
MITRE CWE-787: Schreiben außerhalb der Grenzen
https://cwe.mitre.org/data/definitions/787.html
OWASP Übersicht über Pufferüberläufe
https://owasp.org/www-community/vulnerabilities/Buffer_Overflow
„Pufferüberlauf“ auf Microsoft Learn
https://learn.microsoft.com/en-us/cpp/security/security-best-practices-for-c-cpp
CERT Sichere Codierungsstandards - STR31-C
https://wiki.sei.cmu.edu/confluence/display/c/STR31-C.+Guarantee+that+storage+for+strings+has+sufficient+space+for+character+data+and+the+null+terminator
Ausnutzen von CVE-2019-1663 - Write-up von Quentin Kaiser
https://quentinkaiser.be/exploitdev/2019/08/30/exploit-cve-2019-1663