2010-01-17:

GDT and LDT in Windows kernel vulnerability exploitation

medium:x86:assembler:windows:win32:exploit:security
Kilka tygodni temu gościł u mnie j00ru, co, jak można się domyślić, skończyło się kilkoma ciekawymi pomysłami. Jednym z pomysłów było wykorzystanie mechanizmu call-gate'ów w pisaniu exploitów na kernel/drivery pod Windows, a konkretniej chodzi o wykorzystanie write-what-where do przekształcenia LDT w Call-Gate, i tym sposobem podniesienie uprawnień kodu z user-land do ring 0. Efektem tychże rozważań jest "papierek" oraz kilka PoC, które można ściągnąć poniżej.

Jeszcze zanim przejdę do linków, chciałbym gorąco podziękować Unavowed'owi za masę czasu jaką poświęcił na korektę poniższego papierka oraz jego konwersję na LaTeX (papierek zaczął być tworzony w OO.org, potem został przerobiony pod Word 2007, a pod sam koniec wylądował w LaTeX'ie). Podziękowania należą się również Agnieszce 'Sorrento Aishikami' Zerce za równoległą korektę :)

GDT and LDT in Windows kernel vulnerability exploitation by Matthew "j00ru" Jurczyk and Gynvael Coldwind
PDF: call_gate_exploitation.pdf (680KB)
PoC: ldtsource.zip (13kb) (plik jest również dołączony do PDF'a)

Spis treści:
1. Abstract
2. The need of a stable exploit path
3. Windows GDT and LDT
4. Creating a Call-Gate entry in LDT
4.1. 4-byte write-what-where exploitation
4.2. 1-byte write-what-where exploitation
4.3. Custom LDT goes User Mode
5. Summary
+ References
+ Attachments

Wszelkie komentarze mile widziane, za równo u mnie, jak i na blogu j00ru! :)

Update (17 Stycznia 2010, 19:32 GMT+1): Zauważyliśmy, że jeden z exploitów PoC zawartych w paczce zawiera stary eksperymentalny kod, zamiast nowego. W związku z czym przed chwilą podmieniłem paczkę na prawidłową. Przepraszamy za zamieszanie :)
MD5 starego zbugowanego (ldt)sources.zip / pdf: 95f1b1551e34d7f28789fa17693f0c17 / 6cb745e451be165f49a66876557cb518
MD5 nowego prawidłowego (ldt)sources.zip / pdf: 63657de78b1a2a35b46fc29aa8df81cf / 6840185722dc69048e0bf5434f19d5cb

Update 2: Zainteresowanych zachęcam na rzucenia okiem na dyskusję na forum woodmann.com.

Comments:

2010-01-17 12:21:16 = przemoc
{
Ładny "papierek". Jak będę wolniejszy to go uważnie przeanalizuje.

Co dwie głowy to nie jedna. Powinniście częściej takie wspólne sesje organizować.

BTW. LaTeXa nie znamy? :) Najwyższy czas to naprawić...
}
2010-01-17 13:10:25 = Gynvael Coldwind
{
@przemoc
Thx! Jak będziesz miał chwilę aby przeanalizować to daj znać, komentarze bardzo mile widziane ;>

Co do tego typu sesji, to się z Tobą w 100% zgadzam hehe ;>

Co do LaTeXa (wczoraj mnie poinformowano że powinienem pisać LaTecha, bo to nie X tylko Chi ;>), to masz rację. Trochę tego liznąłem na studiach (praca inż. etc), natomiast widzę że mam straszne braki jeśli o to chodzi. A jest bardzo wygodny jak się skacze między różnymi OSami (Linux / Windows), szczególnie że nawet OO.org który jest "wszędzie" nie zawsze ogarnia takie przeniesienia (różnica wersji między repo ubuntu a official website się kłania na przykład).
}
2010-01-17 13:44:10 = przemoc
{
Dla uściślenia. Pisze się LaTeX (komenda LaTeX generuje kapitaliki, z tymże A i E są na różnej wysokości), natomiast czyta się to /lejtek/, /lejtech/, a Polsce po prostu /latech/ czy /latek/. X symbolizuje tu Chi, stąd taka wymowa, co już wiesz. Natomiast jeżeli chodzi o /k/ to jest to niby pochodna angielskiej wymowy Chi, choć sięgając głębiej, można stwierdzić, że wzięło się to ze starożytnej greki, gdzie Chi było spółgłoską zwartą miękkopodniebienną bezdźwięczną (/k/) wymawianą z silnym przydechem (tzw. aspiracją). Formalnie więc /k/ jest poprawniejsze, ale w Polsce siłą rzeczy /ch/ jest chyba częściej używane.
}
2010-01-18 00:50:08 = Gynvael Coldwind
{
@przemoc
Dzięki za wyjaśnienie sprawy ;>
Mam nieodparte wrażenie, że skomplikowanie LaTeXa zaczyna się już w nazwie ;>
}
2010-01-21 07:25:16 = _krzywy
{
Nie dałem rady całego przeczytać ale z tego co mi się rzuciło w oczy to w bookmarksach jest 4-byte write a w treści jest 1 byte write.
}
2010-01-21 07:26:17 = _krzywy
{
Sorry za poprzedni comment. Acrobat skoczył mi nie w to miejsce. Zawsze zaczynam od środka :D
}

Add a comment:

Nick:
URL (optional):
Math captcha: 2 ∗ 2 + 8 =