靶機:
https://download.vulnhub.com/momentum/Momentum.ova
下載後使用 VirtualBox 開啟
難度:中
目標:取得 root 許可權 + 2 Flag
攻擊方法:
- 主機發現
- 埠掃描
- 資訊收集
- Web 路徑爆破
- XSS 漏洞
- JS 指令碼分析
- AES 解密
- Redis 認證漏洞
主機發現
sudo arp-scan -l
埠掃描和服務發現
nmap -p- 192.168.0.104掃描全埠
nmap -p22,80 -sV -sC 192.168.0.104
發現 SSH 的版本是 OpenSSH 7.9
HTTP 是 Apache httpd 2.4.38
訪問 80 埠的 Web 服務
發現 id 引數,測試SQL隱碼攻擊只是把值原原本本的返回到頁面中
那麼可能存在 XSS 漏洞,嘗試輸入 payload
獲得 cookiecookie=U2FsdGVkX193yTOKOucUbHeDp1Wxd5r7YkoM8daRtj0rjABqGuQ6Mx28N1VbBSZt解碼Base64,發現Salted,意思是加鹽了,應該是使用了某種加密演算法
目錄掃描
dirsearch -u "http://192.168.0.102/"
main.js 裡的檔案,重點關注裡面的註釋,是一段加密解密的程式碼
function viewDetails(str) {
window.location.href = "opus-details.php?id="+str;
}
/*
var CryptoJS = require("crypto-js");
var decrypted = CryptoJS.AES.decrypt(encrypted, "SecretPassphraseMomentum");
console.log(decrypted.toString(CryptoJS.enc.Utf8));
*/
讓我們逐行解釋一下程式碼:
var CryptoJS = require("crypto-js");
- 功能:這行程式碼將 crypto-js 庫引入到當前的 JavaScript 檔案中。
- 解釋:require 是 Node.js 中用於引入模組的函式,crypto-js 是一個常用的加密解密庫,支援多種加密演算法,包括 AES、SHA、MD5 等。
var decrypted = CryptoJS.AES.decrypt(encrypted, "SecretPassphraseMomentum");
- 功能:這行程式碼解密一個加密的訊息。
- 解釋:
- CryptoJS.AES.decrypt 是 crypto-js 庫中用於 AES 解密的函式。
- encrypted 是要解密的加密文字(假設它已定義,並且是一個有效的加密字串)。
- "SecretPassphraseMomentum" 是用於解密的金鑰(passphrase)。這個金鑰必須與加密時使用的金鑰完全相同。
- 解密函式返回的是一個 CryptoJS.lib.CipherParams 物件,它包含解密後的資料,但還未轉換成可讀的字串。
console.log(decrypted.toString(CryptoJS.enc.Utf8));
- 功能:這行程式碼將解密後的資料轉換為 UTF-8 編碼的字串,並輸出到控制檯。
- 解釋:
- .toString(CryptoJS.enc.Utf8) 方法將 CryptoJS.lib.CipherParams 物件轉換為一個 UTF-8 編碼的字串。
- CryptoJS.enc.Utf8 是 crypto-js 庫中用於處理 UTF-8 編碼的編碼器。
總結
這段程式碼的總體功能是:
- 引入 crypto-js 庫。
- 使用 AES 演算法解密一個加密的訊息,使用指定的金鑰。
- 將解密後的資料轉換為 UTF-8 字串,並輸出結果。
那麼我們得到如下資訊:
密文:U2FsdGVkX193yTOKOucUbHeDp1Wxd5r7YkoM8daRtj0rjABqGuQ6Mx28N1VbBSZt
金鑰:SecretPassphraseMomentum
加密演算法:AES
百度搜尋:cryptojs線上解密,獲得一個網址:https://www.sojson.com/encrypt.html#google_vignette
填入密文和金鑰即可解密成功,獲得明文:auxerre-alienum##
前面又看到目標靶機開放了 22 埠,那麼這個明文是不是就是登入的賬號密碼呢?
賬號:auxerre
密碼:auxerre-alienum##
成功登入目標靶機
獲得第一個 flag
資訊收集
uname -a 檢視核心版本
searchsploit 4.19 查詢有沒有已知的核心漏洞的提權程式碼
這些都是失敗的,沒有一個可以成功提權的
lsb_release -a 檢視作業系統
繼續資訊收集,發現了一個 redis 賬號
redis 是一個非關係型資料庫,它的安全性不好,有非授權的漏洞,它會預設監聽 0.0.0.0 的 6379 埠,並且不需要進行認證
Redis 認證漏洞
ss -pantu 檢視開放的所有埠,發現 6379 確實是開啟的,但是靶機的管理員把監聽地址設定成了 127.0.0.1 ,導致我們沒有辦法從外網直接來連線這個埠,但是我們已經透過 SSH 登入進來了,可以直接連 redis 資料庫了
redis-cli 執行命令連進去,info 可以看見很多資訊,說明不需要身份認證
發現 db0 這個庫,然後還有一個 key
redis 這個非關係型的資料庫是透過鍵值對的形式來儲存資料的,不像 Mysql 這種關係型資料庫是透過表來存放結構化的資料
keys * 命令查詢所有鍵。
Get rootpass 獲取鍵 rootpass 的值。
獲得 m0mentum-al1enum##
結合 rootpass 這個鍵名,嘗試登入 root 賬號,我直接 su 成 root 賬號,然後輸入密碼,成功登入!
cat root.txt 獲取第2個 flag
學習筆記
- 利用 redis 這種非授權的身份認證的漏洞,其實我們可以在目標靶機上做很多攻擊的手段
- 比如可以透過讀取關鍵檔案,從而幫助自己去實現提權
- 或者也可以透過 redis 向目標靶機裡面去直接寫入一個 Webshell,從而拿到一個許可權
- 又或者呼叫一些第三方的外部的模組,透過模組的載入,利用 redis 程序許可權比較鬆散的這種配置漏洞,也可以透過載入模組的方式,實現作業系統指令的直接執行