安全矩阵

 找回密码
 立即注册
搜索
查看: 2461|回复: 0

某安全厂商产品0day通用逻辑缺陷漏洞到Getshell全过程

[复制链接]

221

主题

233

帖子

792

积分

高级会员

Rank: 4

积分
792
发表于 2021-8-15 11:58:23 | 显示全部楼层 |阅读模式
某安全厂商产品0day通用逻辑缺陷漏洞到Getshell全过程低调学安全 [url=]衡阳信安[/url] 3天前
写在前面本篇文章是挖掘某安全厂商产品0day通用逻辑缺陷漏洞到Getshell过程。过程挺奇幻的,请各位师傅耐心观看~
过程这里首先先到目标主站进行信息收集,看看他们有哪些产品等等。
然后我就用网络空间搜索引擎再次进一步收集信息,最后把目标定在了一个页面看着相对简陋的网络安全设备Web管理界面上:

然后这里到网上尝试寻找该安全厂商旗下这个产品的通用弱口令,费了一番功夫算是找到了,可是尝试了以后要不就是提示我密码不正确!:

要不就是提示我:用户名不存在!:

看来有可能是之前已经有人发现过该问题并提交了通用弱口令漏洞了,安全厂商可能已经修复了。这里为了验证我的观点,我便到cnvd的漏洞列表里进行高级搜索,把这家安全厂商的相关产品关键字输入进去进行查询,果然找到了该产品的弱口令漏洞信息,看来是我晚了一步啊,可惜了。那么这里我们明显不知道修复后的用户账号和相对应的密码,这里必须得开始进一步信息收集了。
经过了一些时间的信息收集,真是功夫不负有心人,我发现存在http://x.x.x.x/data,发现该路径下存在目录遍历漏洞。

这倒给我的信息收集省下了不少的麻烦。这里直接来找找有没有敏感文件和敏感信息泄露。可是找了半天,并没有什么敏感文件,都是一些Web源代码文件。本想着既然找不到敏感文件,那么就来审计下代码,看看会不会存在有漏洞直接打进去,可是这里并不能看到源代码:

可是这里却暴露了其绝对路径,这里马上便可以推断出其搭建在Windows系统上。再看看文件后缀名均为php,那么这是一个php+windows的情况。
在php+windows的情况下:如果文件名+:DATA会把:DATA之后的数据当成文件流处理,不会检测后缀名,且保持:DATA之前的文件名,然后这里便把文件的源代码给展示了出来:


因为windows中使用的是NTFS文件系统,这是导致漏洞成因的一部分,主要原因是早期版本的IIS服务器对文件扩展名的处理机制。IIS会检查扩展名,但因为多了:DATA,IIS并不会把它当作php文件解析,但文件系统能识别该请求,所以会返回源代码。
那么这里就开始了代码审计。然后便在/data/login.php,即登录的文件中发现了疑点:

这里的部分代码我展示出来:

  1. <?php
  2. /**
  3.         系统登录设置
  4. */
  5. include(' ../ commmon/ connDb. php');
  6. $dbQuery = new DataBaseQuery();
  7. $userName=$_POST['userName'];
  8. $password=$_POST['password'];
  9. $system=$_POST['system'];
  10. $userInfo = $dbQuery->querySing1eRow('select passward,roleld from user_info   where name="' . $userName. '"' , true);
  11. if($password == "dandain12345")
  12. {
  13.     @session_start();
  14.     $_SESSION['userName’]=$userName;
  15.     $_SESSION['system’]=$system;
  16.     $_SESSION['roleId']=$userInfo['roleId'];
  17.     $mainMenuIds = fetchMainMenu($dbQuery,$userInfo['roleId']);
  18.     $_SESSION['mainMenulds']=$mainMenuIds;
  19.     $subMenuIds = fetchSubMenu($dbQuery,$userInfo['roleId']);
  20.     $_SESSION['subMenuIds']=$subMenuIds;
  21.     modifyXML($system) ;
  22.     echo "0";
  23.     $dbQuery->closeDb() ;
  24. }
  25. else
  26. {
  27.     if(count($userInfo)==0){//用户名不存在
  28.         echo "1";
  29.         $dbQuery->closeDb() ;
  30.         return;
  31.     }else{//用户名存在
  32.         if ($userInfo['password' ] !=$password){//密码不正确
  33.             echo "2";
  34.             $dbQuery->closeDb();
  35.             return;
  36.         }else{//正确登录
  37.             @session_start();
  38.             $_SESSION['userName’]=$userName;
  39.             $_SESSION['system’]=$system;
  40.             $_SESSION['roleId']=$userInfo['roleId'];
  41.             $mainMenuIds = fetchMainMenu($dbQuery,$userInfo['roleId']);
  42.             $_SESSION['mainMenulds']=$mainMenuIds;
  43.             $subMenuIds = fetchSubMenu($dbQuery,$userInfo['roleId']);
  44.             $_SESSION['subMenuIds']=$subMenuIds;
  45.             modifyXML($system) ;
  46.             echo "0";
  47.             $dbQuery->closeDb() ;
  48. }

复制代码
​ 这里发现if($password == "dandain12345")语句代码和下面的当用户名存在并正确登录成功的实现的代码完全一样,那么这里理论便有一个逻辑缺陷漏洞了:即不论用户名是否存在,只要随便输入一个用户名,密码输入dandain12345,最后都能够成功登录进去。
这里分析完后,马上进行尝试:
比如:随便输入一个用户名为test,密码先随便输。然后提示我用户名不存在!


那么这里把密码换成输入dandain12345,居然成功了。这也证实了我之前的观点:不论用户名是否存在,只要随便输入一个用户名,密码输入dandain12345,最后都能够成功登录进去。

那么这里在选一个存在的用户名admin,然后密码随便输。提示我密码不正确!


这里再把密码换成输入dandain12345,也成功了,而且还是管理员权限:

最后我在管理员的权限下经过寻找可用上传点和尝试,最后成功传上去了一句话木马,并用蚁剑成功连接了



执行ipconfig

至此完成了这次的0day通用漏洞的挖掘。本章中所有漏洞均已提交至cnvd并获得证书。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 12:51 , Processed in 0.014808 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表