
PoC zum Auslösen eines Pufferüberlaufs über CVE-2020-0796
./CVE-2020-0796.py servername
Dieses Skript verbindet sich mit dem Zielhost und komprimiert die Authentifizierungsanfrage mit einem falsch gesetzten Offset-Feld im Transformations-Header, was dazu führt, dass der Dekomprimierer einen Pufferüberlauf erleidet und das Ziel zum Absturz bringt.
Dies enthält eine Modifikation des hervorragenden smbprotocol mit hinzugefügter Unterstützung für SMB 3.1.1-Komprimierung/Dekomprimierung (nur LZNT1). Die meisten Ergänzungen befinden sich in smbprotocol/connection.py. Eine Version von lznt1 ist enthalten, modifiziert für Python 3.
Der Komprimierungs-Transformations-Header befindet sich in der Klasse SMB2CompressionTransformHeader. Die Funktion _compress wird aufgerufen, um Tree-Anfragen zu komprimieren. Hier wird das Offset-Feld auf den maximalen Wert gesetzt, um den Absturz auszulösen.
def _compress(self, b_data, session):
header = SMB2CompressionTransformHeader()
header['original_size'] = len(b_data)
header['offset'] = 4294967295
header['data'] = smbprotocol.lznt1.compress(b_data)
CVE-2020-0796 ist ein Fehler in Windows 10 1903/1909, der die neue SMB3-Komprimierungsfähigkeit betrifft. Das SMB-Protokoll Version 3.1.1 führt die Möglichkeit ein, dass ein Client oder Server Komprimierungsfähigkeiten ankündigen und SMB3-Nachrichten selektiv komprimieren kann, wenn dies vorteilhaft ist. Um dies zu erreichen, müssen sowohl Client als auch Server beim Aushandeln einer SMB-Sitzung eine SMB2_COMPRESSION_CAPABILITIES wie in MS-SMB2 2.2.3.1.3 dokumentiert, enthalten.
Sobald eine Sitzung mit dieser Fähigkeit ausgehandelt wurde, können entweder der Client oder der Server bestimmte SMB-Nachrichten selektiv komprimieren. Dazu wird das gesamte SMB-Paket komprimiert und ein transformierter Header vorangestellt, wie in MS-SMB2 2.2.42 dokumentiert. Dieser Header ist eine kleine (16 Bytes) Struktur mit einem Magic-Wert, der Größe der unkomprimierten Daten, dem verwendeten Komprimierungsalgorithmus und einem Offset-Wert.
CVE-2020-0796 wird durch fehlende Bereichsprüfungen in diesem Offset-Wert verursacht, der direkt an mehrere Unterroutinen übergeben wird. Die Übergabe eines großen Werts führt zu einem Pufferüberlauf und bringt den Kernel zum Absturz. Mit weiterer Arbeit könnte dies zu einem RCE-Exploit weiterentwickelt werden.