這篇 Write-up 大概會是我在北上工作以前的最後一篇文章,原本想說能在北上以前將比較常被大家練習的 VulnHub 靶機解一解,結果時常北上,每當回到家就是當個懶人,距離上一篇 Matrix 1,已經差距了八天左右,練習的密集度遠遠不及 11 月,目前就想著,希望能在 12 月結束以前將 Matrix 系列結束,接著看要跳槽 Hack-The-Box 或是針對 OWASP TOP 10 進行細部學習。
環境設定
靶機下載: https://www.vulnhub.com/entry/matrix-2,279/
解壓縮之後是一個 ova 檔案,同樣直接餵給 VMWare 吃,就可以完成佈署了,並且網路環境採用 NAT。
尋找靶機
透過 nmap 192.168.147.1/24
把靶機找出來,抓到位置為 192.168.147.136
,並且服務上面有 80 Ports。
服務探勘
在 80 Port 的頁面上看不出什麼端倪,上頭的文字就大概是電影「駭客任務」的台詞,接著在 F12 底下發現 js/index.js
這個檔案,部分程式碼如下。
var app = {
chars: ['PureHackers', 'Unleashed', '127.0.0.1', '1337', '0x523344', 'Localhost', 'Cr4sH CoD3', 'HACKED!', 'Security', 'Breached!', 'System'],
init: function() {
app.container = document.createElement('div');
app.container.className = 'animation-container';
document.body.appendChild(app.container);
window.setInterval(app.add, 100);
},
add: function() {
var element = document.createElement('span');
app.container.appendChild(element);
app.animate(element);
},
animate: function(element) {
var character = app.chars[Math.floor(Math.random() * app.chars.length)];
var duration = Math.floor(Math.random() * 15) + 1;
var offset = Math.floor(Math.random() * (50 - duration * 2)) + 3;
var size = 10 + (15 - duration);
element.style.cssText = 'right:' + offset + 'vw; font-size:' + size + 'px;animation-duration:' + duration + 's';
element.innerHTML = character;
window.setTimeout(app.remove, duration * 1000, element);
},
remove: function(element) {
element.parentNode.removeChild(element);
},
};
document.addEventListener('DOMContentLoaded', app.init);
其中最令人關注的是 '127.0.0.1', '1337'
。
1337
嘗試丟給瀏覽器跑跑看,得到以下登入窗口,不過這邊有點好奇,namp 怎麼沒有掃到 1337 Port…?
這邊就要自我反省反省了,原先使用工具都是會跑、有結果就心滿意足了,卻沒有好好了解預設的功能、各參數的實際作用是如何,經過 Google 之後,可以使用 -p-
針對所有的 Port
進行掃描。
掃描完成之後發現,除了提示給的 1337
以外,還包含了 12320
、12321
、12322
Ports。
12320
似乎是個 Web 版本的 SSH 服務,但是不知道帳號、密碼。
12321
不知道什麼作用,無法使用瀏覽器瀏覽。
12322
該頁面跟 80 Port 的頁面長的完全一樣,但在 robots.txt
,發現。
User-agent: *
Disallow: file_view.php
透過瀏覽器檢視 file_view.php
頁面時僅有以下訊息。
<!-- Error file parameter missing..!!! -->
嘗試使用 GET 遞送 file 參數沒有結果,改用 POST 則發現一個 LFI。
既然已經發現一個 LFI ,就盡量蒐集情資,以下是針對特定路徑的檔案所獲得的訊息。
/proc/version
Linux version 4.9.0-8-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.130-2 (2018-10-27)
/etc/issue
Debian GNU/Linux 9 \n \l
/etc/nginx/nginx.conf
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
/etc/nginx/sites-enabled/default
server {
listen 0.0.0.0:80;
root /var/www/4cc3ss/;
index index.html index.php;
include /etc/nginx/include/php;
}
server {
listen 1337 ssl;
root /var/www/;
index index.html index.php;
auth_basic "Welcome to Matrix 2";
auth_basic_user_file /var/www/p4ss/.htpasswd;
fastcgi_param HTTPS on;
include /etc/nginx/include/ssl;
include /etc/nginx/include/php;
}
/var/www/p4ss/.htpasswd
Tr1n17y:$apr1$7tu4e5pd$hwluCxFYqn/IHVFcQ2wER0
稍微了解了一下 auth_basic_user_file
的配置作用
參考:nginx配置指令auth_basic、auth_basic_user_file及相关知识
得到結果:
name:password:comment
但密碼的部分是經過加密的,至於如何解密,透過 Google 找到工具 John the Ripper (JTR),參考自 John the Ripper (JTR) 密碼破解簡單使用教學,並且文中有一部分令我覺得眼熟。
什麼是MD5
ab136602036:$1$PTR$b.Cnkm1MAIailRACGO0Kh/
它是另外一種加密方式,比DES更加複雜。AB網站就是使用的這種加密方式。從幫助檔案看JTR應該支援MD5解碼,網上還出現一個JTR的補丁,據說也可以讓JTR支援MD5解碼。不過,你看看下面的MD5碼,它是非常難以解開的。我是沒有成功過,想要解開MD5可能需要更多的技巧和時間。網上也有其它一些用來解MD5的程序,效果都差不多。
ab139004832:$1$HSI$JU7Eztw.al2wQ0dtXp/hi.
ab137746765:$1$SMI$M7q7wJilGYYsGiicFnjFC0
雖然不確定 $apr1$7tu4e5pd$hwluCxFYqn/IHVFcQ2wER0
看不出是 MD5 雜奏,但好像是用 JTR 可以解解看,指令順序如下。
cat - > pwd.txt
$apr1$7tu4e5pd$hwluCxFYqn/IHVFcQ2wER0
john --wordlist=/usr/share/john/password.lst pwd.txt
由於第一次解出來時,沒截到圖片,現在發現同樣的指令都顯示以下訊息。
Warning: detected hash type "md5crypt", but the string is also recognized as "md5crypt-long"
Use the "--format=md5crypt-long" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 1 password hash (md5crypt, crypt(3) $1$ (and variants) [MD5 128/128 AVX 4x3])
No password hashes left to crack (see FAQ)
經由 Google 得到答案,藉由指令 john pwd.txt --show
可以查看解出來的密文。
回過頭來看 1337 的登入頁面,並且嘗試登入看看 Tr1n17y/admin
,並且得到一個與 80、12322 Port 雷同的頁面,查看 F12 發現線索 <!--img src="h1dd3n.jpg"-->
,檢視該圖片。
根據 Matrix 1 的經驗,大概知道題型都是往 CTF 的方向出題,所以這張圖片就直接猜想是 Forensic 圖片鑑識,直接 binwalk
、strings
都沒結果,隨後丟到 Stegsolve
也是一樣的結果。
最後回頭看看 1337 頁面上的文字,n30
的意思感覺上是某種提示,圖片經過了什麼處理了30次,或是 n30
是密鑰之類的。
隨後發現 Stegall 工具,在查看他 github 頁面上的 Demo 時,發現 -sh
參數有提供一個輸入密碼的功能。
但發現一直有以下錯誤訊息:
Traceback (most recent call last):
File "./stegall.py", line 222, in <module>
sh.sh(arg2)
File "tools/steghide.py", line 94, in sh
prog_install(prog)
NameError: global name 'prog_install' is not defined
最後的解決方法是查看 tootls/steghide.py
的程式碼,看看他實際上做了什麼,主要功能應該是判斷有沒有套件,沒有的話自行安裝,所以查看變數 prog
為 steghide
,所以下安裝指令 apt install steghide
後即可使用。
kali 安裝 steghide 參考 How To Install steghide on kali
接著就用 Stegall
來嘗試解解看,但是一直有錯誤訊息,經歷一段時間的嘗試,原本檔案並沒有與 Stegall 在同個路徑底下,所以一直引發錯誤(照理說應該不影響阿!),總之就是調整好路徑再次嘗試就可以了,解出密文 P4$$w0rd
。
接著回到 Port 12320 上嘗試登入 neo/P4$$w0rd
,試了一兩次發現 neo
跟 n30
…,好像了解了什麼,然後登入成功。
取得 Root Shell
既然都取得 Shell 了,接著就是拿 Root,嘗試 sudo su
發現沒有 sudo
指令可以用,改查看 history
,發現有一些奇怪的指令使用紀錄。
36 morpheus
37 morpheus 'BEGIN {system("/bin/sh")}'
38 exit
39 ls
40 cat /root/flag.txt
41 morpheus 'BEGIN {system("/bin/sh")}'
42 exit
指令複製貼上就拿到 root 了。
結論
Matrix 系列真的都還蠻偏向 CTF 的類型的,該題的收穫如下。
- n m a p 的熟練度提高
- 認識工具 John the Ripper、S t e g a l l
- 認識 m d 5 c r y p t
然後該題唯一沒用到的就是 P o r t 1 2 3 2 1,不知道是設計來做什麼的,W e b 連不上,N m a p 上的訊息是 W A R E H O U S E – S S S,也不是很清楚意思。