Nginx
Last updated
Last updated
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)
Web uygulamalarınız, ağınız ve bulutunuz hakkında bir hacker perspektifi edinin
Gerçek iş etkisi olan kritik, istismar edilebilir güvenlik açıklarını bulun ve raporlayın. Saldırı yüzeyini haritalamak, ayrıcalıkları artırmanıza izin veren güvenlik sorunlarını bulmak ve temel kanıtları toplamak için otomatik istismarları kullanmak için 20'den fazla özel aracımızı kullanın, böylece sıkı çalışmanızı ikna edici raporlara dönüştürün.
Nginx sunucusunu yapılandırırken, root direktifi dosyaların sunulduğu temel dizini tanımlayarak kritik bir rol oynar. Aşağıdaki örneği düşünün:
Bu yapılandırmada, /etc/nginx
kök dizin olarak belirlenmiştir. Bu ayar, /hello.txt
gibi belirtilen kök dizin içindeki dosyalara erişim sağlar. Ancak, yalnızca belirli bir konum (/hello.txt
) tanımlandığını belirtmek önemlidir. Kök konumu için (location / {...}
) herhangi bir yapılandırma yoktur. Bu eksiklik, kök direktifinin küresel olarak uygulanması anlamına gelir ve kök yolu /
altındaki dosyalara erişim sağlar.
Bu yapılandırmadan kaynaklanan kritik bir güvenlik dikkati vardır. GET /nginx.conf
gibi basit bir GET
isteği, /etc/nginx/nginx.conf
konumundaki Nginx yapılandırma dosyasını sunarak hassas bilgileri açığa çıkarabilir. Kökü daha az hassas bir dizine, örneğin /etc
olarak ayarlamak bu riski azaltabilir, ancak yine de diğer kritik dosyalara, diğer yapılandırma dosyalarına, erişim günlüklerine ve hatta HTTP temel kimlik doğrulaması için kullanılan şifrelenmiş kimlik bilgilerine istenmeyen erişim izni verebilir.
Nginx yapılandırma dosyalarında, "location" direktifleri için dikkatli bir inceleme gereklidir. Yerel Dosya Dahil Etme (LFI) olarak bilinen bir zafiyet, aşağıdaki gibi bir yapılandırma aracılığıyla istemeden tanıtılabilir:
Bu yapılandırma, sunucunun /imgs../flag.txt
gibi istekleri, hedef dizin dışındaki dosyalara erişim girişimi olarak yorumlaması nedeniyle LFI saldırılarına açıktır ve bu da /path/images/../flag.txt
olarak çözülmektedir. Bu hata, saldırganların web üzerinden erişilememesi gereken dosyaları sunucunun dosya sisteminden almasına olanak tanır.
Bu güvenlik açığını azaltmak için yapılandırma şu şekilde ayarlanmalıdır:
Daha fazla bilgi: https://www.acunetix.com/vulnerabilities/web/path-traversal-via-misconfigured-nginx-alias/
Accunetix testleri:
Aşağıdaki sayfayı kontrol ederek şu gibi direktifleri nasıl atlayacağınızı öğrenin:
Zayıf değişkenler $uri
ve $document_uri
ve bunlar $request_uri
ile değiştirilerek düzeltilebilir.
Bir regex de şu şekilde zayıf olabilir:
location ~ /docs/([^/])? { … $1 … }
- Zayıf
location ~ /docs/([^/\s])? { … $1 … }
- Zayıf değil (boşlukları kontrol ediyor)
location ~ /docs/(.*)? { … $1 … }
- Zayıf değil
Nginx yapılandırmasındaki bir zayıflık aşağıdaki örnekle gösterilmektedir:
HTTP isteklerinde \r (Carriage Return) ve \n (Line Feed) karakterleri yeni satır karakterlerini belirtir ve URL kodlu formları %0d%0a
olarak temsil edilir. Bu karakterleri yanlış yapılandırılmış bir sunucuya yapılan bir isteğe (örneğin, http://localhost/%0d%0aDetectify:%20clrf
) dahil etmek, sunucunun Detectify
adında yeni bir başlık oluşturmasına neden olur. Bu, $uri değişkeninin URL kodlu yeni satır karakterlerini çözmesi nedeniyle gerçekleşir ve yanıt içinde beklenmeyen bir başlık oluşur:
CRLF enjeksiyonu ve yanıt bölme riskleri hakkında daha fazla bilgi edinin https://blog.detectify.com/2019/06/14/http-response-splitting-exploitations-and-mitigations/.
Ayrıca bu teknik bu konuşmada açıklanmıştır bazı savunmasız örnekler ve tespit mekanizmaları ile. Örneğin, bu yanlış yapılandırmayı bir kara kutu perspektifinden tespit etmek için bu istekleri kullanabilirsiniz:
https://example.com/%20X
- Herhangi bir HTTP kodu
https://example.com/%20H
- 400 Bad Request
Eğer savunmasızsa, ilki "X" herhangi bir HTTP yöntemi olarak dönecek ve ikincisi H geçerli bir yöntem olmadığından bir hata dönecektir. Böylece sunucu şunları alacak: GET / H HTTP/1.1
ve bu hata tetiklenecektir.
Diğer tespit örnekleri şunlar olabilir:
http://company.tld/%20HTTP/1.1%0D%0AXXXX:%20x
- Herhangi bir HTTP kodu
http://company.tld/%20HTTP/1.1%0D%0AHost:%20x
- 400 Bad Request
O konuşmada sunulan bazı savunmasız yapılandırmalar şunlardı:
$uri
'nin son URL'de olduğu gibi ayarlandığını not edin.
Tekrar $uri
'nin URL'de (bu sefer bir parametre içinde) olduğunu not edin.
Şimdi AWS S3'te
Kullanıcı tarafından sağlanan verilerin, belirli koşullar altında Nginx değişkeni olarak ele alınabileceği keşfedilmiştir. Bu davranışın nedeni biraz belirsiz kalmakla birlikte, nadir ya da doğrulaması basit değildir. Bu anomali, HackerOne'da yayınlanan bir güvenlik raporunda vurgulanmıştır, buradan görüntülenebilir. Hata mesajı üzerindeki daha fazla araştırma, bunun Nginx'in kod tabanındaki SSI filtre modülünde meydana geldiğini belirlemiş ve Sunucu Tarafı Dahil Etmelerin (SSI) kök neden olduğunu ortaya çıkarmıştır.
Bu yanlış yapılandırmayı tespit etmek için, değişken yazdırmasını test etmek amacıyla bir referer başlığı ayarlamayı içeren aşağıdaki komut çalıştırılabilir:
Bu yanlış yapılandırma için sistemler arasında yapılan taramalar, bir kullanıcının Nginx değişkenlerini yazdırabileceği birden fazla örneği ortaya çıkardı. Ancak, savunmasız örneklerin sayısındaki azalma, bu sorunu düzeltme çabalarının bir ölçüde başarılı olduğunu göstermektedir.
Nginx, arka uç tarafından üretilen hataların ve HTTP başlıklarının yakalanmasına olanak tanıyan proxy_pass
aracılığıyla bir özellik sunar; bu, dahili hata mesajlarını ve başlıkları gizlemeyi amaçlar. Bu, Nginx'in arka uç hatalarına yanıt olarak özel hata sayfaları sunmasıyla gerçekleştirilir. Ancak, Nginx geçersiz bir HTTP isteğiyle karşılaştığında zorluklar ortaya çıkar. Böyle bir istek, alındığı gibi arka uca iletilir ve arka ucun ham yanıtı, Nginx'in müdahalesi olmadan doğrudan istemciye gönderilir.
Bir uWSGI uygulamasını içeren örnek bir senaryoyu düşünün:
Bunu yönetmek için Nginx yapılandırmasında belirli direktifler kullanılır:
proxy_intercept_errors: Bu direktif, Nginx'in 300'den büyük bir durum koduna sahip arka uç yanıtları için özel bir yanıt sunmasını sağlar. Örneğimiz olan uWSGI uygulaması için, 500 Hatası
yanıtının Nginx tarafından yakalanıp işlenmesini garanti eder.
proxy_hide_header: İsminden de anlaşılacağı gibi, bu direktif belirtilen HTTP başlıklarını istemciden gizler, gizliliği ve güvenliği artırır.
Geçerli bir GET
isteği yapıldığında, Nginx bunu normal şekilde işler ve herhangi bir gizli başlık ifşa etmeden standart bir hata yanıtı döner. Ancak, geçersiz bir HTTP isteği bu mekanizmayı atlayarak, gizli başlıklar ve hata mesajları da dahil olmak üzere ham arka uç yanıtlarının ifşasına neden olur.
Varsayılan olarak, Nginx'in merge_slashes
direktifi açık
olarak ayarlanmıştır; bu, bir URL'deki birden fazla ileri eğik çizgiyi tek bir eğik çizgiye sıkıştırır. Bu özellik, URL işleme sürecini kolaylaştırırken, Nginx'in arkasındaki uygulamalarda, özellikle yerel dosya dahil etme (LFI) saldırılarına yatkın olanlarda, güvenlik açıklarını gizleyebilir. Güvenlik uzmanları Danny Robinson ve Rotem Bar, Nginx'in ters proxy olarak hareket ettiği durumlarda bu varsayılan davranışla ilişkili potansiyel riskleri vurgulamışlardır.
Bu tür riskleri azaltmak için, bu güvenlik açıklarına duyarlı uygulamalar için merge_slashes
direktifini kapatmak önerilir. Bu, Nginx'in URL yapısını değiştirmeden uygulamaya istekleri iletmesini sağlar ve böylece temel güvenlik sorunlarını gizlemez.
Daha fazla bilgi için Danny Robinson ve Rotem Bar bağlantısını kontrol edin.
bu yazıda gösterildiği gibi, web sunucusundan gelen yanıtta mevcut olan belirli başlıklar, Nginx proxy'sinin davranışını değiştirecektir. Bunları belgelerde kontrol edebilirsiniz:
X-Accel-Redirect
: Nginx'e bir isteği belirtilen bir konuma dahili olarak yönlendirmesini belirtir.
X-Accel-Buffering
: Nginx'in yanıtı tamponlayıp tamponlamayacağını kontrol eder.
X-Accel-Charset
: X-Accel-Redirect kullanıldığında yanıt için karakter setini ayarlar.
X-Accel-Expires
: X-Accel-Redirect kullanıldığında yanıtın son kullanma süresini ayarlar.
X-Accel-Limit-Rate
: X-Accel-Redirect kullanıldığında yanıtlar için transfer hızını sınırlar.
Örneğin, X-Accel-Redirect
başlığı, nginx'de dahili bir yönlendirme oluşturur. Yani, root /
gibi bir nginx yapılandırmasına sahip olmak ve web sunucusundan X-Accel-Redirect: .env
ile bir yanıt almak, nginx'in /.env
içeriğini göndermesine neden olacaktır (Path Traversal).
Nginx yapılandırmasında, map
direktifi genellikle yetkilendirme kontrolü rolü oynar. Yaygın bir hata, varsayılan bir değer belirtmemektir; bu da yetkisiz erişime yol açabilir. Örneğin:
default
olmadan, kötü niyetli bir kullanıcı /map-poc
içindeki tanımsız URI'ye erişerek güvenliği atlayabilir. Nginx kılavuzu bu tür sorunları önlemek için bir varsayılan değer ayarlamayı önerir.
Nginx'e karşı DNS spoofing belirli koşullar altında mümkündür. Bir saldırgan, Nginx tarafından kullanılan DNS sunucusunu biliyorsa ve DNS sorgularını kesebiliyorsa, DNS kayıtlarını sahteleyebilir. Ancak, Nginx localhost (127.0.0.1) kullanacak şekilde yapılandırılmışsa, bu yöntem etkisizdir. Nginx, bir DNS sunucusunu aşağıdaki gibi belirtmeye izin verir:
proxy_pass
ve internal
Direktifleriproxy_pass
direktifi, istekleri diğer sunuculara, ister dahili ister harici olarak yönlendirmek için kullanılır. internal
direktifi, belirli konumların yalnızca Nginx içinde erişilebilir olmasını sağlar. Bu direktifler kendiliğinden zafiyet oluşturmasa da, yapılandırmaları güvenlik açıklarını önlemek için dikkatli bir şekilde incelenmelidir.
Eğer nginx sunucusu Upgrade ve Connection başlıklarını geçirecek şekilde yapılandırılmışsa, korunan/dahili uç noktalarına erişmek için bir h2c Smuggling saldırısı gerçekleştirilebilir.
Bu zafiyet, bir saldırganın proxy_pass
uç noktası ile doğrudan bir bağlantı kurmasına (bu durumda http://backend:9999
) izin verecektir; bu içeriğin nginx tarafından kontrol edilmeyeceği anlamına gelir.
/flag
çalmak için zayıf yapılandırma örneği buradan:
Not edin ki proxy_pass
belirli bir yol olan http://backend:9999/socket.io
adresine işaret etse bile bağlantı http://backend:9999
ile kurulacaktır, bu nedenle o iç uç noktası içinde herhangi bir başka yolla iletişim kurabilirsiniz. Bu nedenle, proxy_pass URL'sinde bir yol belirtilip belirtilmediği önemli değildir.
Detectify, bu makalede tartışılan bazı yanlış yapılandırmalarla kendi savunmasız Nginx test sunucunuzu Docker kullanarak kurabileceğiniz bir GitHub deposu oluşturmuştur ve bunları kendiniz bulmayı deneyebilirsiniz!
https://github.com/detectify/vulnerable-nginx
Gixy, Nginx yapılandırmasını analiz etmek için bir araçtır. Gixy'nin ana hedefi, güvenlik yanlış yapılandırmalarını önlemek ve hata tespitini otomatikleştirmektir.
Nginxpwner, yaygın Nginx yanlış yapılandırmalarını ve güvenlik açıklarını aramak için basit bir araçtır.
Web uygulamalarınız, ağınız ve bulutunuz hakkında bir hacker perspektifi edinin
Gerçek iş etkisi olan kritik, istismar edilebilir güvenlik açıklarını bulun ve raporlayın. Saldırı yüzeyini haritalamak, ayrıcalıkları artırmanıza izin veren güvenlik sorunlarını bulmak ve temel kanıtları toplamak için otomatik istismarları kullanmak için 20'den fazla özel aracımızı kullanın, böylece sıkı çalışmanızı ikna edici raporlara dönüştürebilirsiniz.
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)