Windows NT: Privilege Escalation | Part 1

Hier in diesem Artikel wird auf Deutsch beschrieben, wie man eine Privilege Escalation in WIndows 10 durchführen kann. Der Angriffsvektor ist dabei ein schlecht programmierter Treiber. Der Treiber EVD ist ein Projekt von “HackSys Team” und ist extra dafür erschaffen worden, Schwachstellen aufzuweisen.

Was macht das unternehmen schwierig?

  • Die Sicherheit von PC’s wird immer besser. Viele der Exploits funkionnieren nur auf Windows 7 zuverlässig. Aber viele Leute verwenden auch immer noch Windows 7. Zudem hat Windows 7 das EOL erreicht, was soviel heisst, wie “Es gibt keine Sicherheitsupdates mehr”.
    • Vorallem auch Hardware hat immer die besseren Sicherheisfeatures. CPU’s bekommen immer bessere Features, um sich gegen Exploits zu schützen, vorallem auch im Ring 0. Hier ist noch eine Sammlung von neuen Sicherheisfetures (SMEP,DEP,KASLR.CFG)
  • Kernelmode Exploits sind immer schwieriger durchzuführen als Usermode Exploits. Im Kernelmode gibt es keine zweite Chance: Der Exploit muss beim ersten Versuch klappen, da sonst einfach das gesamte System crasht und man einen Bluescreen bekommt.

Also: Wir wollen die Schwachstelle StackOverflow ausnutzen. Zum Glück haben wird den Source Code und können uns genau ansehen, wo das Problem denn liegt

Unten ist der Handler für den IOCTL Code. Er leitet den Inputbuffer des Aufrufes (UserBuffer) und die Grösse des Buffers (Size) direkt an die Funktion TriggerBufferOverflowStack weiter.

Hier haben wird dann die vermeintliche Funktion. Nun sieht man, dass auf

  • Linie 74: Hier wird ein Buffer alloziiert mit fester Grösse (BUFFER_SIZE = 512 Bytes) und auf Null initialisert. Dies geschieht hier auf dem Stack (Was man eigenlich nicht machen sollte, da der Stack sonst schon sehr beschränkt ist)
  • Linie 94: Der übergebene UserBuffer in den Kernel Buffer kopiert wird. Das Problem hierbei ist nur, dass als Grösse SIze angegeben wird, was die Grösse des Userbuffers ist und nicht die Grösse der Kernel-Buffers.

Defintion RtlCopyMemory:

void RtlCopyMemory(
   void*       Destination,
   const void* Source,
   size_t      Length
);

Es gibt hier keinerlei Sicherheitschecks. Die angegebene Länge length wird einfach kopiert.

Wenn man also einen UserBuffer übergibt, welcher grösser als 512 Bytes ist, werden zwangsläufig Daten überschrieben. Nun, da sich der Buffer noch auf dem Stack befindet, haben wir ein Szenario, welches sich leicht exploiten lässt, indem man den Returnpointer überschreibt.

Man merke an, dass in der Deklaration noch das Attribut “safebuffers” verwendet wird, was Sicherheitschecks gegen StackOverflows deaktiviert, sonst wäre es um einiges komplizierter, da der Overflow sonst erkennt werden würde und das System sofort einen BugCheck einleiten würde.

So: Nun können wir ja mal anfangen, einen Payload zu schreiben.

Den Offset müssen wir noch herausfinden. Er soll so gewählt werden, dass er geraden neben dem Returnpointer ist. Um dies zu tun, führt kein Weg an Kernel Debugging vorbei :). Hierzu muss man zuerst das Kerneldebugging aufsetzen. Ich verwende hierzu einen seperaten alten Laptop über USB, da mein PC zu schwach ist, eine VM laufen zu lassen. (Wenn ihr nicht wisst wie man das Debugging aufsetzt, gibt es hier eine Anleitung)

weiter gehts dann im Part 2.

1 thought on “Windows NT: Privilege Escalation | Part 1

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.