はじめに
この記事ではInterKosenCTFで出題した問題の解説を書きます。 他の問題のwriteupについては下記リンクから参照してください。
解説
Description: Someone seems to have tried breaking through our authentication. Find out if he or she made it to the end. File: attack_log.tar.gz
やや大きめのパケットキャプチャファイルが貰えます。
中身はHTTP通信で埋め尽くされており、どれもBasic認証に失敗して401 Unauthorizedが返ってきています。
したがって問題文より、Basic認証が破られていないかを調べればよいことが推察できます。
WiresharkのFilterを使い、http.response.code==200
などで認証に成功しているパケットを探すと、1つだけマッチします。
このパケットをFollow TCP Streamで見ると、次のような通信が分かります。
GET / HTTP/1.1 Host: www.kosenlab.org Connection: keep-alive Accept-Encoding: gzip, deflate Accept: */* User-Agent: python-requests/2.13.0 Authorization: Basic a29zZW46YlJ1dDNGMHJjM1cwcmszRA== HTTP/1.1 200 OK Date: Thu, 27 Dec 2018 07:13:24 GMT Server: Apache/2.4.6 (CentOS) PHP/5.4.16 Last-Modified: Thu, 27 Dec 2018 07:10:37 GMT ETag: "a5-57dfba4b551c5" Accept-Ranges: bytes Content-Length: 165 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html; charset=UTF-8 <!DOCTYPE html> <html> <head> .<title>Welcome!</title> </head> <body> .The flag is KOSENCTF{<the password for the basic auth>} </body> </html>
ここでフラグを"KOSENCTF{<the password for the basic auth>}"として送信された方が多かったですが、中身はBasic認証で使われたパスワードに置き換えてほしかったです。 これに時間を取られたチームもあったようなので、問題文で説明すべきだったかなと反省しています。 BasicのパスワードはリクエストヘッダのAuthorizationに(user:passの形式で)base64でエンコードされて書かれており、パスワードはbRut3F0rc3W0rk3Dであることが分かります。
KOSENCTF{bRut3F0rc3W0rk3D}
あとがき
この問題を作った段階でForensicsの200と250は完成しており、それぞれディスクフォレンジックとメモリフォレンジックだったのでパケット解析を入れることにしました。 当初はBlueBorneを使った攻撃のパケットを考えていたのですが、全体的に難化が見られていたので易しめの問題設定にしました。 60チーム以上が解いてくれたので丁度良かったかと思います。