Spuštění nepodepsaného EXE souboru jako podepsaného

Při pentestech se velmi často člověk dostane do situace, kdy potřebuje spustit vlastní aplikaci tak, jako by byla digitálně podepsaná, i když ve skutečnosti není. Tento trik umožňuje spustit nepodepsaný EXE soubor tak, jako by byl podepsaný, aniž by ji jakkoliv upravoval.

Pokud spustíme na moderních verzích systému Windows aplikaci, která požaduje vyšší než uživatelské oprávnění, jednou z ochran proti případnému malware je kontrola digitálního podpisu. Nepodepsaná aplikace způsobí na systémech Windows 7 zobrazení modálního okna (viz obrázek níže). Vizuálně se jedná o okno žluté barvy, jehož cílem je upozornit svou barvou i méně zdatné uživatele na skutečnost, že zde nemusí být něco v pořádku. Uživatel v závislosti na svém uvážení následně může aplikaci umožnit další běh nebo ji ukončit.

Nepodepsaná aplikace spouštěná pod administrátorskými právy

Naproti tomu validně digitálně podepsaná aplikace zobrazuje na Windows 7 zelenomodré okno (na Windows 10 modré), které vyloženě vybízí myslet si, že aplikace je naprosto v pořádku (viz obrázek níže). Co když ale potřebujeme, aby se ideálně každá aplikace tvářila jako digitálně podepsaná a ještě k tomu nějakou autoritou jako je například sám Microsoft? Paradoxně je to jednodušší než se může zdát.

Podepsaná aplikace spouštěná pod administrátorskými právy

Využijeme vlastnosti Windows API funkce ShellExecute[1]. Windows API funkce ShellExecute umožňuje provádět akce na souborech podobně jako Příkazová řádka. Má následující prototyp:

HINSTANCE ShellExecuteA(
HWND hwnd,
LPCSTR lpOperation,
LPCSTR lpFile,
LPCSTR lpParameters,
LPCSTR lpDirectory,
INT nShowCmd
);

Pro nás důležité jsou parametry lpOperation, lpFile, lpParameters a lpDirectory (případně i nShowCmd – záleží na požadavcích). Nejdůležitější je parametr lpOperation udávající, co má funkce s daným souborem provést. Jedna z možných hodnot je „runas“, jenž spustí příkaz s administrátorskými právy. To ale znamená, že během tohoto procesu dojde k aktivaci UAC (User Account Control[2]). Jedná se přesně o to okno, které jsme popisovali výše. Uživatel si tak může pročíst, jaká aplikace se spouští a kdo je jejím autorem. Pojďme dále. Parametr lpFile odkazuje na soubor, který bude předán ke zpracování. Takže pokud budeme chtít spustit kalkulačku, zadáme „calc.exe“. Nyní nám tedy kalkulačka poběží s právy administrátora. To se ostatně dočteme i v UAC dialogu. Parametr lpParameters uchovává parametry předávané aplikaci v parametru lpFile. Její využití tedy zavisí na tom, zda spouštěná aplikace potřebuje parametry (v našem případě je potřebovat bude 😉 ). Parametr lpDirectory udává adresář, který bude defaultní pro danou operaci. Poslední parametr, nShowCmd, specifikuje vizuální styl okna spouštěné aplikace.

Když nyní dáme všechny věci dohromady, jsme schopni spustit libovolnou aplikaci s právy administrátora (uživatel musí odsouhlasit UAC dialog). Jak tedy docílit toho, aby si uživatel myslel, že spouští podepsanou aplikaci? Pojďme se obecně zamyslet nad tím, jak probíhá proces spouštění aplikace. Pokud aplikace vyžaduje administrátorská práva, systém si ověří, zda již pod administrátorskými právy neběží. Pokud neběží, zobrazí se UAC dialog, který musí uživatel odsouhlasit. Když tak učiní, aplikace již poběží pod administrátorským účtem. Pokud UAC dialog zamítne, dojde k ukončení spouštění aplikace. V případě, že ale aplikace již pod administrátorskými právy běží, UAC dialog se znovu nezobrazí a aplikace se rovnou spustí. Z toho vyplývá, že potřebujeme mít aplikaci běžící pod administrátorským účtem a máme vyhráno. Nejjednodušším řešením je zřetězit více aplikací za sebe, protože budou spouštěny postupně jedna za druhou. Jakmile první aplikace získá administrátorská práva, každá další aplikace již bude přímo spuštěna bez UAC dialogu. My využijeme jako první aplikaci systémovou aplikaci cmd.exe. Té předáme jako argument řetězec „/c“ a cestu k souboru, který chceme spustit. Dejme tomu, že by půjde o systémovou kalkulačku. Příkaz tedy bude vypadat následovně:

cmd.exe /c calc.exe

Nyní tento příkaz převedeme do API funkce ShellExecute:

#include <tchar.h>
#include <windows.h>
int main(){
	ShellExecute(NULL, _T("runas"), _T("cmd.exe"), _T("/c calc.exe"), _T("C:\\Windows\\System32\\"), SW_HIDE);
	return 0;
}

Pokud spustíme místo cmd.exe přímo calc.exe, bude vypadat UAC dialog následovně

UAC dialog při spuštění systémové kalkulačky pod administrátorskými právy

My však spouštíme kalkulačku přes cmd.exe, takže UAC dialog se bude týkat aplikace cmd.exe, nikoliv calc.exe.

UAC dialog při spouštění systémové kalukačky přes cmd.exe pod administrátorskými právy

Pro nás je důležité, jaké informace se dočteme o publisherovi: Microsoft Windows. A okno je modré, takže je aplikace podepsaná. Paráda 🙂

Pokud bychom se chtěli vydat mírně složitější cestu, můžeme si vybrat Windows API funkci ShellExecuteEx[3], která je pokročilejší sestrou Windows API funkce ShellExecute. Zásadní rozdíl mezi těmito funkcemi je ten, že ShellExecuteEx přijímá pouze jediný argument a tím je pointer na strukturu SHELLEXECUTEINFO[4]. Tato struktura poskytuje bohatší rozhraní pro přesnější definici, jak se má aplikace spouštět. Bez hlubšího vysvětlování přikládám pouze zdrojový kód. Pouze zdůrazním, že pro kompilaci tohoto příkladu je třeba přilinkovat knihovnu psapi.lib pro VisualC++ a libpsapi.a pro MinGW.

#include <tchar.h>
#include <windows.h>
#include <psapi.h>
int main(int argc, char *argv[]){
    TCHAR process_path[MAX_PATH];
    TCHAR *arg = _T("/c calc.exe");
    SHELLEXECUTEINFO sei = {0};
    sei.cbSize = sizeof(sei);
    sei.hwnd = NULL;
    sei.lpVerb = _T("runas");
    sei.lpFile = _T("cmd.exe");
    sei.lpParameters = arg;
    sei.nShow = SW_HIDE;
    ShellExecuteEx(&sei);
    return 0;
}

Poznámka: Jsem si vědom skutečnosti, že by bylo vhodné před prvním použitím Windows API funkcí ShellExecute a ShellExecuteEx inicializovat COM STA, ale v tomto případě to není nezbytně důležité. Pro případné zájemce však přikládám odkaz [5].

Existují i další podepsané systémové aplikace (a většina je jich vhodnějších a lepších), které je možné využít pro oklamání uživatelů.

[1] – ShellExecute
[2] – User_Account_Control
[3] – ShellExecuteEx
[4] – SHELLEXECUTEINFO
[5] – CoInitializeEx

1 názor na “Spuštění nepodepsaného EXE souboru jako podepsaného”

Napsat komentář: czybph0 Zruš odpověď

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..