【CyberDefenders】EscapeRoom【Writeup】

# 初めに
どうも、クソ雑魚のなんちゃてエンジニアです。
本記事は ___CyberDefenders___ （以下リンク参考）の「___EscapeRoom___」にチャレンジした際のWriteupになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/c39a87b9-5ab3-8ce6-73f5-a635e1c4d792.png)

https://cyberdefenders.org/blueteam-ctf-challenges/18

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

# Question 1 「What service did the attacker use to gain access to the system?」
これはWiresharkを開けますか？といった問題でしょうね。見ればわかりますが、SSHでの通信がたんまりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/9672bb91-5105-570a-3093-d5c58b833ad7.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/1aa6b24e-a3cd-a4ed-6200-c324a2ce805a.png)
以下を見ると53なのでー１して回答となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/7707e438-c8da-a719-6387-dd5380684aca.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」（以下リンク）を用いて解析。

https://github.com/brannondorsey/naive-hashcat/releases

![スクリーンショット_20230210_232241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/943146f0-3725-b5d1-eca1-c2809e2b3493.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/bb975bab-bd2a-a9ea-1101-ac783df215ec.png)

___Ans:  sean:spectre___

# Question 7「What is the tool used to download malicious files on the system?」
マルウェアダウロードしてるToolなにって言われてます。
まぁとりあえずHTTP通信見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/86b26845-8009-e69c-8a7e-51be674e135f.png)
あ、ELFの実行ファイルを落としてるのがある。これかな？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/b7e945f8-aa4c-b523-ce35-2cc1ec41e695.png)
なんか`UPX`のパッキング文字が見えるし、これでしょう。
これを落としてきているツールは`User-Agent`で確認できます。

___Ans: wget___

# Question 8「How many files the attacker download to perform malware installation?」
HTTPのトラフィックを見れば大きく２つのトラフィックがあるのがわかるかなと思う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/96237983-c30e-6135-0195-e5da9e837e2a.png)
`texy/html`のレスポンスと`image/bmp`のレスポンスだ。
「マルウェアをインストールするために攻撃者はいくつのファイルをダウンロードしましたか？」という問いかけなので、前半がマルウェアの ___ダウンローダー___ 、後半が ___マルウェア本体___ と考えられる。
※というより前半はバックドアで後半が追加マルウェアなのでは？？(´∀｀*)

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

___Ans: 3___

# Question 9「What is the main malware MD5 hash?」
とりあえず全部のダウンローダーを抽出してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/1dfe5a01-a8a7-b390-ee04-edcc49b46fde.png)
以下の1，2，3のファイルをそれぞれ抽出する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/a95ba91c-cec8-3f2d-9bf2-3d1befae67b3.png)
抽出したFileに対してそれぞれ`file`コマンドを叩き込む。1と2のファイルに対しては`exiftool`のコマンドも叩き込んでおいた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/b873aa49-9911-2ea8-a2c2-e735b6e3401b.png)
3の中身も確認してみるが、1と2のファイルを操作しているというシェルスクリプトだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/4e1f6b0f-e7f2-9616-5a25-85bda8891705.png)

というわけで１のファイルがメインそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/25955369-99f2-b716-4438-cad74a38fd02.png)

___Ans: 772b620736b760c1d736b1e6ba2f885b___

# Question 10「What file has the script modified so the malware will start upon reboot?」
３のファイルの中身を見ればすぐにわかる。
自動実行する「`/etc/rc.local`」に名前を「`/var/mail/mail`」に変更した１のファイルの起動設定を書き込んでいるのが見える。

___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___

## ２のファイルのReversing
上記Questionの12に関する機能は２のファイルのReversingで見つけることが出来ます。
`readdir`を差し替えてプロセスを隠ぺいするやり方ですね。これで`pidof mail > /proc/dmesg`で飛ばしていたPIDの階層を`ps`や`top`コマンドで読み込めないようにするといった形ですな。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/81491862-27dd-1f66-a352-6fc5f9171de6.png)

# Question 13「What is the main file that used to remove this information from ps.log?」
Question 12で解析した２のファイルは以下のコマンドで名前が変わっているので変更後の名前を記載する。
```
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することで解決できる。
一旦１の静的解析内容を見てみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/1c79d935-bf6c-fb1f-a2e5-61ac313ad804.png)
ご丁寧に`UPX`でパッキングしていることをお知らせしてくれているので１のファイルをアンパッキングする。コマンドは以下である。
```bash
$ upx -d <packed_file> -o <unpacked_file>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/a0247897-9532-5a23-5c73-d8c262283fe0.png)
難なくUnpackできたので此奴をReversingしていく。
Stringから追っていくと、「`wget -O %S%S http`」の文字が見える。
![スクリーンショット_20230212_165952.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/974a7399-0e01-0554-29c3-ace6b35c22bf.png)
これを使っている関数へ飛んでみると答えが記載されている！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/fa00b04a-3560-0a8e-c3f3-6e6c299bec08.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/2f2e31fc-f108-8db7-f5d0-804e70291c76.png)
`%s`の３つ目の`param_1`に注目する。おそらくこれがIPなのだろう。これは関数`requestFile`の引数として持ってこられているので、`requestFile`の関数を呼び出しているものを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/14fa966f-1de2-611c-64f8-7ed1a0d1e339.png)
以下部分に注目する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/ae2dd02a-f7ca-8dbc-1621-c4166fc5b9d1.png)
`addr`のアドレスから８バイト分を抜き出したものが入るようである。この`addr`の場所に飛んでみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/15b469a5-df15-7372-6ed8-bfc264b9c156.png)
リトルエンディアンでGhidraさんが認識してくれているので楽である。８バイトで抜き出したアドレスへ飛んでいく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/999ee295-d5d1-7661-ec84-93c83db25604.png)
IPアドレスが直書きされているのでこれで答えがわかるはずだ。

___Ans: 174.129.57.253___

# Question 16「How many files the malware requested from external servers?」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/050bc463-d19b-0c16-60d1-898906e5b3b9.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」
以下１のファイルのReversingのmainの中身である。
```c: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でやった通りです。
ここらへんでコマンドを扱ってそうな関数は以下の部分ですかね。
```c
pvVar4 = malloc((long)(int)((uint)lVar3 & 0xfffffffc));
decryptMessage(pvVar4);
iVar1 = processMessage(pvVar4);
if (iVar1 != 0) break;
```
前半２行はおそらく暗号解除のためのメモリ領域確保とデコード関数でしょうね。というわけで`processMessage`の関数を詳細に見ていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/f7d7fbea-e87d-e34d-fcf2-45f2c14c0009.png)
暗号解除後の引数`param_1`を何やら`if-elif`でCMPしてます。ここら辺がコマンド文字列判定でしょう。
`0x4e4f5000`と`0x52554e3a`の部分を`chr`で変換します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/2ad5d9c0-181e-d10d-a990-0fda2b4f1d6b.png)
`chr`変換後の`CMP`を確認します。これが答えですね！

___Ans: NOP,RUN___

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

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