この記事はCTFのWebセキュリティ Advent Calendar 2021の10日目の記事です。
本まとめはWebセキュリティで共通して使えますが、セキュリティコンテスト(CTF)で使うためのまとめです。
悪用しないこと。勝手に普通のサーバで試行すると犯罪です。
インフラ回り
Webセキュリティではインフラ回りも理解している必要がある。
「ブラウザ -> リバースプロキシ -> アプリ」みたいな構造が分かってないと解けない問題も多くある。
apache
- SSI: Server Side Includes
- エラーを使ったLFI+RCE
関連パス
- URL
- /.htaccess
- /.htpasswd
- /server-status
- ホストディレクトリ
- /etc/apache2/conf-available/fqdn.conf
ここに「ServerName ホスト名」でホスト名が記載されている
- /etc/apache2/sites-enabled/000-default.conf
設定が書いてある
- /etc/apache2/conf-available/fqdn.conf
.htaccess
- インデックスファイルがないときのファイル一覧機能は無効化しておくこと
Options -Indexes
- エラー時に出るファイルを指定することも効果的
DirectoryIndex index.html /errmsg.html
- アクセス制限をかけたいとき
<Files XXX>
と書くとファイルXXXに制限がかかる- 正規表現で指定するときは
<Files ~ "[regexp]">
か<FilesMatch ~ "[regexp]">
- このタグ以下に色々を書くと制限がかかる
- アクセス禁止ルールは.htaccess(Apache) の Order Allow,Deny(またはDeny,Allow)について - Qiita
- Rewrite~系でリダイレクトを設定できる
- バーチャルホスト
- writeups/2020/asis_ctf/Less secure secrets at master · Red-Knights-CTF/writeups · GitHub
- リバースプロキシとして使っているっぽく見える
- RequestHeaderをつけると、許可するヘッダーになる
<if "%{REMOTE_ADDR} != '127.0.0.1'">
で内部じゃなかったら…としている。以下で表示を抑制AddOutputFilterByType INFLATE;SUBSTITUTE;DEFLATE text/html
Substitute s|<secret>(.*)</secret>|Protected|i
Range: bytes=785-808
をすると応答する部分が限られることで、Substituteでの置き換えができなくなるようにできる
- writeups/2020/asis_ctf/Less secure secrets at master · Red-Knights-CTF/writeups · GitHub
キャッシュ
- Web Cache Poisoning キャッシュを汚染して被害者に悪意あるコンテンツを踏ませる
- 操作時に重要なこと、キャッシュキーの操作
- Cache Key なにをキーとしてキャッシュを保存するか
protocol|method|host|/path?key=value
でキャッシュキーとするhttps|GET|example.com|/api/help?lang=en
- キャッシュサーバによっては
X-Original-URL: /admin
のようにすることでキャッシュキーをこっちに差し替えることができる
- キャッシュキーで使われない部分を利用して悪さをする
- Cache Key なにをキーとしてキャッシュを保存するか
- Web Cache Deception 相手にキャッシュを保存させて、それを読み込むことで情報を抜き出す
- キャッシュ設定の間違いによって起こる
- レポート
- #492841 Web cache poisoning attack leads to user information and more
- #593712 Web cache deception attack on https://open.vanillaforums.com/messages/all
- 末尾に
/non-existent.css
をつけることでキャッシュを強制するテク
- 末尾に
- ESI: Edge Side Includes
<esi:XXX>
というタグを使ってキャッシュを効率化するものだが、これでXSSが起きたりする
cgi-bin
Shellshock
- cgi-binでRCEできる脆弱性
- opsxcq/exploit-CVE-2014-6271: Shellshock exploit + vulnerable environment
- GNU bash の脆弱性 ~ shellshock 問題~ について
- ユーザーエージェントにペイロードを入れるとRCEできる
curl http://XX/ -A "payload"
() { :; }; echo; echo; /bin/bash -c 'cat /etc/passwd'
- Writeups
Docker
- Dockerfile確認観点
- ライブラリをpip installとか諸々でインストールしている場合は、使っているライブラリに脆弱性が無いか確認
- How to improve your Docker containers security - [cheat sheet]
Kubernetes
- CTFtime.org / HTB Business CTF 2021 / kube / Writeup
- nmapするとkubeletとかが見えてくる場合がある
- Kubernetes API serverを探して、とりあえず情報要求してみる
- デフォルトPortは6443
curl https://10.129.95.171:8443/api/v1/version
curl -k -X GET -H 'Accept: application/json' https://10.129.172.188:8443/api/v1/namespaces/kube-system/pods/
- 今回は悪意のあるポッドを追加することで、攻撃につなげていく
- 資料
IIS
- RECON
- ルートに行ったときにIISのデフォルトページが見えたらIIS
- 青いやつはIIS8、IIS7はデフォルトとしてデカデカとIIS7と出る
- Fingerprinting
- 8.3形式を利用したファイルスキャニング
- GitHub - irsdl/IIS-ShortName-Scanner: latest version of scanners for IIS short filename (8.3) disclosure vulnerability
- IIS6, 5.X
- 存在するshortnameなら404で、存在しないshortnameなら400
- IIS7
- 存在するshortnameならエラーコード0x000000000で、存在しないshortnameならエラーコード0x80070002
sns -u https://sub.redacted.com/
- IIS6, 5.X
- 実際にはスキャンニングしても
DOWNLO~1.ASH
という感じにしか見えてこないから、ここからguessして本物を探し出す必要がある- この場合は
download.ashx
- この場合は
- GitHub - irsdl/IIS-ShortName-Scanner: latest version of scanners for IIS short filename (8.3) disclosure vulnerability
- 設定ファイル
- Machine.Config
- Web.Config
- App.Config
C:\Windows\System32\inetsrv\config\applicationHost.config
IISの設定ファイル
- ルートに行ったときにIISのデフォルトページが見えたらIIS
- GitHub - 0xacb/viewgen: viewgen is a ViewState tool capable of generating both signed and encrypted payloads with leaked validation keys
- ASP.NET ViewStateを作るやつ
c:\inetpub
にIIS関連ファイルがあった問題があった- c:\inetpub\wwwroot にネットファイル?
- WebResource.axdのパラメタdは暗号化されたパスが入っているが復元できるっぽい
nginx
- no1zy_sec - Qiita nginxの設定ミスで起こるシリーズ(翻訳記事)
- Middleware everywhere and lots of misconfigurations to fix | Detectify Labs
- HackTheBoxで出てきたら、SSHScanとかで対応するドメインが無いかを確認して、あればそれでルーティングしている可能性があるので
/etc/hosts
でドメイン追加してアクセスする - Hostのバリデーションチェック
- Hostにスラッシュが含まれるとダメ見たい。
- 以下では、スラッシュをバックスラッシュに変えてバイパスしている。
if ($document_uri = '/a.php') {
https://example.com/a.php
としたいけど、上の条件から外れるようにしたいときhttps://example.com/a.php/..;/a.php?
みたいにすればバイパス可能https://example.com/a.php/.php
でもバイパス可能
$host
と書いてあったらHostヘッダーで偽装できる- ariesの危険性
- NGINX Alias Traversal
- 404 nginx servers
- http://example[.]com/index.php -> File not found
- http://example[.].com/assets../index.php -> source code
- 検査ツール