Premýšlali ste niekedy nad tým, aké práva má váš vytvorený súbor, prípadne, aké práva prístupu môžem použiť, čo je to vôbec UAC, ako funguje právo spustenia "Ako Administrátor" a ako to všetko zneužiť?

 

 

V tomto článku popíšem, akým spôsobom obísť bezpečnostné riešenia samotného systému a tým zdokonaliť, či pridať vyššie možnosti prístupu nášmu programu.


Pokiaľ si zdatný programátor, ktorý už napísal neaký ten nástroj, prípadne sa zamýšlal nad prístupom, či zásahom do systému, určite si narazil na problém prístupových práv. Čo to tie práva ale sú a ako ich obísť??

Samotný systém beží v niekoľkých režímoch, čo som už v minulosti popísal. Najnižším je Jadro kernelu, vrstva z ktorej sa spúšťajú ovladače. Najvrchnejšou vrstvou je Aplikačná vrstva, klasické spuštanie pod desktopom.

Skvelý popis vrstiev je na obrázku zo stránky (http://minnie.tuhs.org):




Narozdiel od XP, aktuálne OS spoločnosti MicroSoft disponujú UAC (User Account Control).
Ide o technológiu, ktorá obmedzuje práva aplikáciám, ktoré chcú neakým spôsobom modifikovať systém. Režímy UAC umožňuje OS nastaviť do niekoľkých režímov, od vypnutia, po neustále dotazovanie.
Viacej k UAC - >> Článok <<

Samotné UAC sa dá noblesným spôsobom zničiť cez registry. Avšak prístup do registry môžme mať prvotne zakázaný ešte pred tým, než k nim chceme pristupovať.

 

Windows Integrity Levels

Windows Integrity Levels, sú úrovne prístupu, ktorými disponujú napríklad Win8, Vista.
Tieto levely sa viažú pre prístup k procesom alebo vláknam (zaujímavé pri hookovaní, či rušení).
Pri písaní aplikácií je nutné sa oboznámiť s prekážkami, ktoré tieto úrovne prinášajú.
Celkovo je 5 úrovňových prístupov - od najnižšej úrovne: Untrusted, Low integrity, Medium integrity, High integrity, System integrity.

Princíp úrovní spočíva v tom, že objekty s nižšou úrovňou nemajú oprávnenie pristupovať k objektom vyššej úrovne.
Proces spustený s úrovňou Medium Integrity sa nemôže dotazovať na proces/vlákno s vyššou úrovňou, napríklad, System Integrity.
Dotazovanie o prístup by skončil událosťou Access_Denied.

Pokiaľ spustíme aplikáciu bežným spôsobom, beží v Medium Integrity Level.
Aplikácia, ktorú spustíme "Ako Administrátor" prípadne v móde "Elevate", bude bežať v Hight Integrity Level.

Je však možné, aby program spustený v Hight Integrity mohol za bežných okolností pristupovať k procesom či vláknam úrovne System Integrity Level ? ... Nie ...

Ak nie, tak ako je možné napísať aplikáciu, ktorá nám k tejto úrovni pristupovať bude???


Spúštame sa ako Administrátor

Isto každý pozná možnosť <pravé tlačítko myši> --> Run as Administrátor.
Táto možnosť spustenia nám umožňuje spustiť aplikáciu ako správca, a teda systému potvrdzujeme, že vieme, o akú aplikáciu ide.

Aplikácia bude bežať v mode Hight Integrity.

Ako však samotnému systému prikázať, že chceme náš program označiť ako spustiteľný rovno s administrátoským oprávnením?


Nastavujeme právo ELEVATE
Narozdiel od možnosti "spustiť ako správca" sa táto možnosť líši ikonkou, ktorá sa objaví pri ikone programu:

Ako nastaviť túto možnosť pre náš program spočíva v nastavení priamo vo vývojovom prostredí Visual Studio:
Nastavenie (Properties) projektu, (nie solutions!) --> Configuration Properties --> Linker --> Manifest File.
Nastavíme podľa môjho:




A zároveň:
Manifest Tool --> Input and Output





Možno prekvapím, ale toto nestačí. Nestačí to, pokiaľ chceme písať aplikácie, ktoré budú mať ešte väčšie práva prístupu, ako len administrátor.

Áno, ak by sme chceli práva Authority SYSTEM, napíšeme si a zavedieme driver.
Toto si ukážeme v inom článku.

Avšak, nikdy sa nestalo nikomu z vás, že vo Visual Studiu napísal program, napríklad prístupu cez WinAPI, ktorý mal cez spustenie z Visual Studio plné práva (pracoval ako mal), no pri spustení dvojklikom pod desktopom, prípadne
"ako Admin", mal práva obmedzené, či nemohol získať prístup k zdrojom, ku ktorým cez Visual mohol?


Pristupujeme k System Integrity level

Za normálnych okolností nemajú aplikácie, procesy či vlákna pŕavo pristupovať k objektom System Integrity. Teda, pokiaľ sa nejedná o drivere, či časti systému zavedených ako služby. Samotný spustený proces nemá také silné vlastnosti než ovladač zavedený pred samotným načítaním vyšších vrstiev než kernelu a nemôže prevziať kontrolu napríklad na antivirmi či sa skryť v systéme, infikovať súbory jadra systému atď. . To si ukážeme možno neskôr.

Môžeme si však cez WinAPI vydobyť práva System Integrity Level pre procesy spustené hoc aj pod desktopom a pristupovať k objektom najvyššieho levelu.
Väčšina sa už dovtipila, že týmto spôsobom môžeme písať aplikácie, ktoré môžu prevziať kontrolu nad spomínanými objektmi a už isto je jasné, že zhadzovanie/rušenie/hookovanie je len malá obnož toho, čo vieme dokázať.

Je zrejme jasné, že následovné použitie WinAPI je z hľadiska spomínaných možností nebezpečné na zneužitie :D

Pri prístupe k najvyššiemu levelu slúži takzvané právo - SeDebugPrivilege



Napíšem funkciu, ktorá využitím SeDebugPrivil. vydobí pre aplikáciu najvyšší level prístupu:


int DebugPrivilege() { HANDLE dHandle; TOKEN_PRIVILEGES dPrivileges; TOKEN_ELEVATION dElevation; LUID dLuid;
if (!::OpenProcessToken(::GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&dHandle)) { return ::GetLastError(); }
if (!::LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&dLuid)) { return ::GetLastError(); }
dPrivileges.PrivilegeCount = 1; dPrivileges.Privileges[0].Luid = dLuid; dPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!::AdjustTokenPrivileges(dHandle, FALSE, &dPrivileges,sizeof(dPrivileges),NULL,NULL)) { return ::GetLastError(); }
::CloseHandle(dHandle);
}


Funkcia vracia prípadnú, chybovú hodnotu.

 

-----------------------------------------------------------------

Celá funkcia je zakonpovaná do headeru WinAPI.h WinAPI.h


#include "WinAPI.h" //https://www.netbot.sk/sk/14-blog-headers/31-winapi

int _cdecl main (void) 
{
  ::Diall_WinApi::WinApi::GetInstance()->SystemIntegrity(::Diall_WinApi::Privilege::ENABLE); 

return 0; }