Sociálne siete

SecIT.sk na Facebooku SecIT.sk na Google+ SecIT.sk na Twitteri

Podporte nás


V prípade, že Vám obsah nášho portálu niekedy nejakým spôsobom pomohol, či bol pre Vás prínosom prosím podporte jeho chod ľubovoľnou čiastkou. Ďakujeme!

Štítky

Vyhľadávanie

You are here

Domov
Upozornenie: Obsah je licenčne chránený a bez písomných súhlasov autora článku a vlastníka webovej stránky nesmie byť v žiadnej forme ďalej kopírovaný a šírený v pôvodnom, či v akokoľvek upravenom stave.

Do kernelu bez driveru

Jeden z méně známých způsobů, jak se dostat do Ring 0.

Všichni občas litujeme toho, že normální aplikace ve Windows nemohou provádět některé specifické věci - jednoduše proto, že k tomu nemají prostředky nebo oprávnění. Jako příklad uvedu komunikace s hardware pomocí I/O portů či monitorování spuštění nového procesu (resp. ukončení běžícího procesu). Je pravda, že i normální aplikace může komunikovat s hardwarem pomocí I/O portů, leč velmi vám nedoporučuji to používat, protože díky multitaskingu a multithreadingu pravděpodobně dostanete systém do nestabilního stavu. Monitorovat procesy z normální aplikace samozřejmě lze, ale není to úplně triviální. Mnohem lepší je napsat si ovladač. Jádro Windows ovladačům umožňuje velmi snadno zjistit, že byl nějaký proces vytvořen či ukončen.

Nyní se asi smiřujete s tím, že pokud chcete do své aplikace implementovat nějakou z výše popsaných věcí, bude třeba napsat ovladač jádra. Ano, ovladač by byl tím nejsprávnějším řešením, ale můžete se bez něj obejít (ale bude to o dost složitější než takový ovladač napsat :-)). Postup, který nastíním v tomto článku funguje na Windows XP SP2 (a měl by fungovat i na starších NTčkách) a na Vistách už pravděpodobně fungovat nebude.

Celá technika je založena na jednoduchém faktu - normální aplikace mohou číst a zapisovat do fyzické paměti. A není to nic složitého - fyzickou paměť nám zpřítupňuje namapovaný soubor (section) s názvem \\Device\\PhysicalMemory. Pomocí nativních API funkcí k němu můžete získat přístup, namapovat požadované části fyzické paměti a začít se čtením či zápisem. Potřebujete k tomu minimálně administrátorská práva, jinak jakýkoliv pokus o přístup k \\Device\\PhysicalMemory skončí odpovědí STATUS_ACCESS_DENIED.

Když můžeme zapisovat do fyzické paměti, je už vše celkem triviální (alespoň myšlenkově). Ve fyzické paměti se bude určitě nacházet hlavní modul jádra - např. ntoskrnl.exe. Vyhlédneme si v něm nějakou delší funkci, kterou můžeme nepřímo zavolat z naší aplikace (to jsou například všechny NtXXX funkce). Tato funkce by se neměla často používat. Potom její signaturu můžeme vyhledávat ve fyzické paměti. Čím delší siganturu hledáme, tím je větší pravděpodobnost, že bude ve fyzické paměti jenom jednou. Je tu několik háčků - naše funkce se může nacházet ve stránkovacím souboru a ne v RAM. Tuto skutečnost můžeme změnit tak, že ji zavoláme se špatnými parametry, takže voláním nic nepokazíme, jen funkci přesuneme do RAM.

Jakmile signaturu najdeme, víme, kde ve fyzické paměti naše funkce je. Nyní ji přepíšeme naším kódem. A tím jsme hotovi, stačí teď jedno volání a náš kód je vykonán.

Myšlenka s využitím objektu \\Device\\PhysicalMemory není moje. Před několika lety ji popsal crazylord v článku "Playing with Windows /dev/(k)mem". Moje technika je trochu odlišná a myslím, že i o něco málo bezpečnější než jeho.

Z článku jednoznačně vyplývá, že firewally a systémy HIPS by neměly hlídat jen funkce NtLoadDriver a NtSetSystemInformation, ale i objekt \\Device\\PhysicalMemory, protože i takovým způsobem se lze dostat do Ring 0. Problém může být v tom, že k \\Device\\PhysicalMemory se lze dostat i pomocí symbolických odkazů (SymbolicLink).

V jednom z odstavců výše jsem psal, že zde jsou určité problémy, které musíte vyřešit, chcete-li tuto techniku implementovat, a uvedl jsem jenom jeden - se stránkovacím souborem. O dalších problémech zde mluvit nebudu, nechám je na vás, pokud se rozhodnete tuto metodu vyzkoušet. Žádná legitimní aplikace by ji NEMĚLA používat, pokud to není BEZPODMÍNEČNĚ NUTNÉ. Mnohem jednodušší a "správnější" je napsat ovladač jádra. Tento článek nemá sloužit k tomu, aby každý, kdo jej přečte, okamžitě napsal virus, jenž nepozorovaně propašuje svůj kód do jádra. Cílem tohoto článku je ukázat, že tu tato možnost je a že se dá zneužít.


Podporte nás


Páčil sa Vám tento článok? Ak áno, prosím podporte nás ľubovoľnou čiastkou. Ďakujeme!


ITC manažer Security-portal.cz Soom.cz
Hoax.cz Antivirove centrum Crypto-world.info