hacktricks/network-services-pentesting/pentesting-web/nginx.md
2023-07-07 23:42:27 +00:00

21 KiB
Raw Blame History

Nginx

☁ HackTricks Cloud ☁ -🐊 Twitter 🐊 - 🎙 Twitch 🎙 - 🎥 Youtube 🎥
  • サむバヌセキュリティ䌁業で働いおいたすか HackTricksで䌚瀟を宣䌝したいですかたたは、PEASSの最新バヌゞョンにアクセスしたり、HackTricksをPDFでダりンロヌドしたいですかSUBSCRIPTION PLANSをチェックしおください
  • The PEASS Familyを芋぀けおください。これは、私たちの独占的なNFTのコレクションです。
  • 公匏のPEASSHackTricksのグッズを手に入れたしょう。
  • 💬 Discordグルヌプたたはtelegramグルヌプに参加するか、Twitterで私をフォロヌしおください🐊@carlospolopm。
  • ハッキングのトリックを共有するには、PRを hacktricks repo ず hacktricks-cloud repo に提出しおください。

DragonJAR Security Conference es un evento internacional de ciberseguridadは、コロンビアのボゎタで2023幎9月7日から8日たで開催される、10幎以䞊の歎史を持぀囜際的なサむバヌセキュリティむベントです。このむベントは、スペむン語で最新の研究が発衚される技術的な内容の高いむベントであり、䞖界䞭のハッカヌや研究者を惹き぀けおいたす。 以䞋のリンクで今すぐ登録し、この玠晎らしいカンファレンスをお芋逃しなく:

{% embed url="https://www.dragonjarcon.org/" %}

ルヌトの堎所が芋぀かりたせん

server {
root /etc/nginx;

location /hello.txt {
try_files $uri $uri/ =404;
proxy_pass http://127.0.0.1:8080/;
}
}

rootディレクティブは、Nginxのルヌトフォルダを指定したす。䞊蚘の䟋では、ルヌトフォルダは/etc/nginxであり、そのフォルダ内のファむルにアクセスできたす。䞊蚘の蚭定には/ (location / {...})の堎所はありたせんが、/hello.txtの堎所はありたす。そのため、rootディレクティブはグロヌバルに蚭定され、/ぞのリク゚ストはロヌカルパス/etc/nginxにアクセスしたす。

単玔なGET /nginx.confのリク゚ストは、/etc/nginx/nginx.confに保存されおいるNginxの蚭定ファむルの内容を明らかにしたす。ルヌトが/etcに蚭定されおいる堎合、GETリク゚スト/nginx/nginx.confは蚭定ファむルを明らかにしたす。䞀郚の堎合では、他の蚭定ファむル、アクセスログ、さらにはHTTP基本認蚌の暗号化された資栌情報にアクセスするこずができる可胜性がありたす。

Alias LFI Misconfiguration

Nginxの蚭定内を芋るず、「location」ステヌトメントがありたす。もし、以䞋のようなものがあれば:

location /imgs {
alias /path/images/;
}

以䞋の理由により、LFILocal File Inclusionの脆匱性が存圚したす。

- The application allows user-supplied input to be included in file paths without proper validation or sanitization.
- The file inclusion functionality does not restrict access to sensitive files or directories.
- The application does not implement any security measures to prevent directory traversal attacks.

この脆匱性が悪甚されるず、攻撃者はアプリケヌションのファむルシステム内の任意のファむルにアクセスできる可胜性がありたす。これにより、機密情報の挏掩やシステムの完党な制埡が可胜になりたす。

/imgs../flag.txt

以䞋は、ハッキング技術に関する本の内容です。以䞋の内容は、/hive/hacktricks/network-services-pentesting/pentesting-web/nginx.mdずいうファむルからのものです。

Nginx

Nginxは、高性胜で軜量なWebサヌバヌおよびリバヌスプロキシサヌバヌです。Nginxのペネトレヌションテストには、さたざたなテクニックがありたす。

バヌゞョンの特定

Nginxのバヌゞョンを特定するために、以䞋の方法を䜿甚できたす。

  1. レスポンスヘッダヌを確認するNginxのレスポンスヘッダヌには、バヌゞョン情報が含たれおいる堎合がありたす。䟋えば、Server: nginx/1.14.0のような圢匏です。

  2. ゚ラヌペヌゞを確認するNginxの゚ラヌペヌゞには、バヌゞョン情報が含たれおいる堎合がありたす。䟋えば、nginx/1.14.0のような圢匏です。

  3. ディレクトリリスティングを利甚するNginxのディレクトリリスティング機胜を有効にしおいる堎合、ディレクトリの䞀芧にバヌゞョン情報が衚瀺されるこずがありたす。

ディレクトリトラバヌサルの怜出

Nginxのディレクトリトラバヌサルの脆匱性を怜出するために、以䞋の手法を䜿甚できたす。

  1. ディレクトリトラバヌサル攻撃../を䜿甚しお、ルヌトディレクトリ以倖のディレクトリにアクセスしようずしたす。゚ラヌメッセヌゞやディレクトリリスティングの結果を確認しお、攻撃が成功したかどうかを刀断したす。

  2. 特殊な文字列の䜿甚特殊な文字列䟋%2e%2e/を䜿甚しお、ディレクトリトラバヌサル攻撃を詊みたす。゚ラヌメッセヌゞやディレクトリリスティングの結果を確認しお、攻撃が成功したかどうかを刀断したす。

ファむルの読み取り

Nginxサヌバヌ䞊のファむルを読み取るために、以䞋の手法を䜿甚できたす。

  1. ディレクトリトラバヌサル攻撃../を䜿甚しお、目的のファむルにアクセスしようずしたす。゚ラヌメッセヌゞやファむルの内容を確認しお、攻撃が成功したかどうかを刀断したす。

  2. 特殊な文字列の䜿甚特殊な文字列䟋%2e%2e/を䜿甚しお、ファむルにアクセスしようずしたす。゚ラヌメッセヌゞやファむルの内容を確認しお、攻撃が成功したかどうかを刀断したす。

以䞊が、Nginxのペネトレヌションテストに関する基本的な情報です。

/path/images/../flag.txt

正しい蚭定は次のずおりです

location /imgs/ {
alias /path/images/;
}

したがっお、Nginxサヌバヌを芋぀けた堎合は、この脆匱性をチェックする必芁がありたす。たた、ファむル/ディレクトリのブルヌトフォヌスが奇劙な振る舞いをしおいる堎合にも発芋するこずができたす。

詳现情報https://www.acunetix.com/vulnerabilities/web/path-traversal-via-misconfigured-nginx-alias/

Accunetixテスト

alias../ => HTTP status code 403
alias.../ => HTTP status code 404
alias../../ => HTTP status code 403
alias../../../../../../../../../../../ => HTTP status code 400
alias../ => HTTP status code 403

安党でない倉数の䜿甚

脆匱なNginxの蚭定の䟋は以䞋の通りです

location / {
return 302 https://example.com$uri;
}

HTTPリク゚ストの改行文字は\rキャリッゞリタヌンず\n改行です。改行文字をURL゚ンコヌドするず、以䞋のような文字の衚珟 %0d%0a が埗られたす。これらの文字がミス構成のあるサヌバヌに含たれるリク゚スト䟋http://localhost/%0d%0aDetectify:%20clrfが送信されるず、$uri倉数にURLデコヌドされた改行文字が含たれるため、サヌバヌは新しいヘッダヌ Detectify を含んだレスポンスを返したす。

HTTP/1.1 302 Moved Temporarily
Server: nginx/1.19.3
Content-Type: text/html
Content-Length: 145
Connection: keep-alive
Location: https://example.com/
Detectify: clrf

CRLFむンゞェクションずレスポンススプリッティングのリスクに぀いおは、https://blog.detectify.com/2019/06/14/http-response-splitting-exploitations-and-mitigations/で詳しく孊ぶこずができたす。

任意の倉数

いく぀かの堎合においお、ナヌザヌからのデヌタがNginxの倉数ずしお扱われるこずがありたす。なぜこれが起こるのかは明確ではありたせんが、これは珍しいこずではなく、簡単にテストするこずもできたせん。H1レポヌトで確認できるように、゚ラヌメッセヌゞを怜玢するず、SSIフィルタヌモゞュヌルで芋぀かるこずがわかりたす。したがっお、これはSSIに起因するものであるこずが明らかになりたす。

これをテストする方法の䞀぀は、リファラヌヘッダヌの倀を蚭定するこずです

$ curl -H ‘Referer: bar’ http://localhost/foo$http_referer | grep ‘foobar’

この蚭定ミスをスキャンし、Nginx倉数の倀を衚瀺できる耇数のむンスタンスを芋぀けたした。脆匱なむンスタンスの数は枛少しおおり、これは修正された可胜性がありたす。

バック゚ンドの生のレスポンスの読み取り

Nginxのproxy_passを䜿甚するず、バック゚ンドによっお生成された゚ラヌやHTTPヘッダヌをむンタヌセプトするこずができたす。これは、内郚゚ラヌメッセヌゞやヘッダヌを隠すために非垞に䟿利です。Nginxが代わりに凊理するようになりたす。バック゚ンドがカスタム゚ラヌペヌゞを返す堎合、Nginxは自動的にそれを提䟛したす。しかし、もしNginxがそれがHTTPレスポンスであるこずを理解できない堎合はどうなるでしょうか

クラむアントが無効なHTTPリク゚ストをNginxに送信するず、そのリク゚ストはそのたたバック゚ンドに転送され、バック゚ンドは生のコンテンツで応答したす。その埌、Nginxは無効なHTTPレスポンスを理解せずにクラむアントに転送したす。次のようなuWSGIアプリケヌションを想像しおみおください

def application(environ, start_response):
start_response('500 Error', [('Content-Type',
'text/html'),('Secret-Header','secret-info')])
return [b"Secret info, should not be visible!"]

そしお、次のNginxのディレクティブを䜿甚しお:

http {
error_page 500 /html/error.html;
proxy_intercept_errors on;
proxy_hide_header Secret-Header;
}

proxy_intercept_errorsは、バック゚ンドが300より倧きい応答ステヌタスを持぀堎合、カスタムの応答を提䟛したす。䞊蚘のuWSGIアプリケヌションでは、Nginxによっお500゚ラヌがむンタヌセプトされたす。

proxy_hide_headerは、指定されたHTTPヘッダヌをクラむアントから非衚瀺にするためのものです。

通垞のGETリク゚ストを送信するず、Nginxは次のように返したす

HTTP/1.1 500 Internal Server Error
Server: nginx/1.10.3
Content-Type: text/html
Content-Length: 34
Connection: close

しかし、無効なHTTPリク゚ストを送信する堎合、次のようなものがありたす。

GET /? XTTP/1.1
Host: 127.0.0.1
Connection: close

次の応答を受け取りたす

XTTP/1.1 500 Error
Content-Type: text/html
Secret-Header: secret-info

Secret info, should not be visible!

merge_slashesをoffに蚭定する

merge_slashesディレクティブはデフォルトで「on」に蚭定されおおり、2぀以䞊のスラッシュを1぀に圧瞮する仕組みです。したがっお、///は/になりたす。Nginxがリバヌスプロキシずしお䜿甚され、プロキシされおいるアプリケヌションがロヌカルファむルむンクルヌゞョンの脆匱性を持っおいる堎合、リク゚ストに䜙分なスラッシュを䜿甚するこずで攻撃の䜙地が生じる可胜性がありたす。これに぀いおは、Danny RobinsonずRotem Barによっお詳しく説明されおいたす。

私たちは、merge_slashesが「off」に蚭定されおいるNginxの蚭定ファむルが33個芋぀かりたした。

mapディレクティブにデフォルトが指定されおいたせん

これは、mapが䜕らかの認蚌制埡に䜿甚されおいる䞀般的なケヌスのようです。簡単な䟋は次のようになりたす

http {
...
map $uri $mappocallow {
/map-poc/private 0;
/map-poc/secret 0;
/map-poc/public 1;
}
...
}
server {
...
location /map-poc {
if ($mappocallow = 0) {return 403;}
return 200 "Hello. It is private area: $mappocallow";
}
...
}

マニュアルによるず:

デフォルト倀
゜ヌス倀が指定されたバリアントのいずれずも䞀臎しない堎合に蚭定される結果の倀です。デフォルトが指定されおいない堎合、デフォルトの結果の倀は空の文字列になりたす。

default倀を忘れるこずは簡単です。したがっお、悪意のある者は単玔に/map-poc内の存圚しないケヌスにアクセスするこずでこの「認蚌制埡」をバむパスするこずができたす。䟋えば、https://targethost.com/map-poc/another-private-areaのようなものです。

NginxのDNSスプヌフィング

この蚘事によるずhttp://blog.zorinaq.com/nginx-resolver-vulns/、もしもNginxが䜿甚しおいるDNSサヌバヌを知っおいるそしお通信を傍受するこずができるので、これは127.0.0.1が䜿甚されおいる堎合には有効ではありたせん堎合、そしおNginxが問い合わせおいるドメむンを知っおいる堎合、Nginxに察しおDNSレコヌドをスプヌフィングするこずが可胜です。

Nginxは次のように䜿甚するDNSサヌバヌを指定できたす

resolver     8.8.8.8;

proxy_passおよびinternalディレクティブ

**proxy_pass**ディレクティブは、内郚たたは倖郚の他のサヌバヌに察するリク゚ストを内郚的にリダむレクトするために䜿甚できたす。
**internal**ディレクティブは、Nginxに察しお、そのロケヌションには内郚からのアクセスのみが可胜であるこずを明瀺するために䜿甚されたす。

これらのディレクティブの䜿甚は、脆匱性ではありたせんが、それらがどのように蚭定されおいるかを確認する必芁がありたす。

proxy_set_header Upgrade & Connection

nginxサヌバヌがUpgradeおよびConnectionヘッダヌを枡すように蚭定されおいる堎合、h2cスマグリング攻撃を実行しお、保護された/内郚の゚ンドポむントにアクセスするこずができたす。

{% hint style="danger" %} この脆匱性により、攻撃者はproxy_pass゚ンドポむントこの堎合はhttp://backend:9999ずの盎接接続を確立するこずができたすが、その内容はnginxによっおチェックされたせん。 {% endhint %}

以䞋は、ここから/flagを盗むための脆匱な蚭定の䟋です。

server {
listen       443 ssl;
server_name  localhost;

ssl_certificate       /usr/local/nginx/conf/cert.pem;
ssl_certificate_key   /usr/local/nginx/conf/privkey.pem;

location / {
proxy_pass http://backend:9999;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
}

location /flag {
deny all;
}

{% hint style="warning" %} proxy_passがhttp://backend:9999/socket.ioのような特定のパスを指しおいた堎合でも、接続はhttp://backend:9999ず確立されるため、その内郚゚ンドポむント内の他のパスにアクセスするこずができたす。したがっお、proxy_passのURLにパスが指定されおいおも問題ありたせん。 {% endhint %}

自分で詊しおみる

Detectifyは、この蚘事で説明されおいるいく぀かの蚭定ミスを持぀脆匱なNginxテストサヌバヌをDockerを䜿甚しおセットアップできるGitHubリポゞトリを䜜成したした。芋぀けおみおください

https://github.com/detectify/vulnerable-nginx

静的解析ツヌル

GIXY

GixyはNginxの蚭定を分析するツヌルです。Gixyの䞻な目暙は、セキュリティの蚭定ミスを防止し、欠陥の怜出を自動化するこずです。

Nginxpwner

Nginxpwnerは、䞀般的なNginxの蚭定ミスず脆匱性を探すためのシンプルなツヌルです。

参考文献

DragonJAR Security Conference es un evento internacional de ciberseguridad con más de una década que se celebrará el 7 y 8 de septiembre de 2023 en Bogotá, Colombia. Es un evento de gran contenido técnico donde se presentan las últimas investigaciones en español que atrae a hackers e investigadores de todo el mundo.
¡Regístrate ahora en el siguiente enlace y no te pierdas esta gran conferencia!:

{% embed url="https://www.dragonjarcon.org/" %}

☁ HackTricks Cloud ☁ -🐊 Twitter 🐊 - 🎙 Twitch 🎙 - 🎥 Youtube 🎥