半年ぶりの TryHackMe で Advent of Cyber 2023 に挑む 9日目【Advent of Cyber: Day 9】

9日目。

[Day 9] She sells C# shells by the C2shore

What HTTP User-Agent was used by the malware for its connection requests to the C2 server?

Main コードのはじめの方に PostIt メソッドが呼ばれているのでその中を見てみると、User-Agent が書いてある。

What is the HTTP method used to submit the command execution output?

Main コードの全体を見ると GetIt メソッドと PostIt メソッドが呼ばれているが、GetIt メソッド(内部で GET リクエストを C2 サーバに送っている)は命令を受け取るために、PostIt メソッドは命令の結果(command execution output)を C2 サーバに送っており、この PostIt メソッドの内部では HTTP メソッドとして POST を使っている。

What key is used by the malware to encrypt or decrypt the C2 data?

Encryptor メソッド内を見てみると、bytes 変数に何やらそれらしき文字列を入れているのがわかるのでそれを答える(正直よくわかんなかった)。

What is the first HTTP URL used by the malware?

Main 関数のはじめの方で変数 str と変数 url を使って URL が作られているのがわかる。

How many seconds is the hardcoded value used by the sleep function?

Thread.Sleep メソッド内で sleep 関数が呼ばれているので、引数の変数を見ればよい。数値の単位がミリ秒な点に注意。

What is the C2 command the attacker uses to execute commands via cmd.exe?

Main 関数内の ExecuteCommand メソッドを使ってコマンドが呼ばれている。if 文の条件を見てみると、変数 a が "shell" という文字列になっている時にコマンド実行がなされているのがわかる。

What is the domain used by the malware to download another binary?

Implant メソッドによって引数として渡された URL からバイナリをダウンロードするようになっているので、その引数の URL を見ればよい。

解説

で、これ何が起きてんの?

まず、変数宣言が複数行われている箇所で mcgreedysecretc2.thm/reg に向かって被害者 PC のホストネームが POST リクエストで送られる。その後にプログラム中の for 文に入っていく。

for 文の中ではまず GET リクエストで mcgreedysecretc2.thm/tasks から文字列を受け取っている。この文字列をパースして被害者 PC でコマンドを実行したり外部から悪意のある別のファイルをダウンロードしたりしている。

mcgreedysecretc2.thm/tasks から受け取る文字列は例えば以下のようになっている。

sleep 20000
shell <コマンド>
implant
quit

これらをパースし、最初の単語によって場合分けを行っている。

  • sleep: 次の数字のミリ秒分だけ sleep する
  • shell: のちに続くコマンドを被害者 PC 上で実行する
  • implant: 外部(stash.mcgreedy.thm)から spykit.exe をダウンロードし、被害者 PC の AppData フォルダ上に配置する。
  • quit: ループを抜ける(マルウェアプログラムを終了する)

なお、コマンド実行の結果は POST リクエストで被害者 PC から mcgreedysecretc2.thm/results へと送られる。例えば implant 実行の様子は以下のようになる。

FAQ

実行ファイルを dnSpy で読み込むだけこんなにキレイめなコードが出てくるの?

出てくるらしい。dnSpy すごい。

なんでところどころで sleep してんの?

マルウェア検知を避けるためらしい。検知のタイムアウト狙いだとか。

qiita.com

spykit.exe を格納する AppData フォルダって何?

特殊フォルダと呼ばれている場所の一つで、アプリケーションの保存データを保管する場所。フォルダのアドレスに %appdata% と打ってエンターキーを押すと移動できる(自分の Windows11 環境では C:\Users\(ユーザ名)\AppData\Roaming だった)。

じゃあなんで AppData フォルダに置くの?

どの Windows PC にもある、手ごろな隠しフォルダだからだと思っている。しかもプログラム上からはハードコーディングせずに Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) でフォルダの場所を取得できる。

正直わかんなかった、有識者頼む

感想

問題自体は割とすぐ解けるが、解説等をブログに書くとなると大変な時間がかかるんだなぁこれが。しかし、ブログに書くことでより理解が深まっている感じがするからこれでいいと思っている。