CTFするぞ

CTF以外のことも書くよ

【Forensics 50】attack log - InterKosenCTF 作問writeup

はじめに

この記事ではInterKosenCTFで出題した問題の解説を書きます。 他の問題のwriteupについては下記リンクから参照してください。

ptr-yudai.hatenablog.com

解説

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{&lt;the password for the basic auth&gt;}
    </body>
</html>

ここでフラグを"KOSENCTF{<the password for the basic auth>}"として送信された方が多かったですが、中身はBasic認証で使われたパスワードに置き換えてほしかったです。 これに時間を取られたチームもあったようなので、問題文で説明すべきだったかなと反省しています。 BasicのパスワードはリクエストヘッダのAuthorizationに(user:passの形式で)base64エンコードされて書かれており、パスワードはbRut3F0rc3W0rk3Dであることが分かります。

KOSENCTF{bRut3F0rc3W0rk3D}

あとがき

この問題を作った段階でForensicsの200と250は完成しており、それぞれディスクフォレンジックとメモリフォレンジックだったのでパケット解析を入れることにしました。 当初はBlueBorneを使った攻撃のパケットを考えていたのですが、全体的に難化が見られていたので易しめの問題設定にしました。 60チーム以上が解いてくれたので丁度良かったかと思います。