某知名OA高版本getshell思路(附部分脚本)
导语:本文以曾经研究过的通达OA11.9版本为例,阐述在高版本通达中如何利用通达自身的特性来getshell。文中涉及的所有漏洞都是笔者自研和首发,大多数已在最新版的通达OA12.0中修复,本文只是分享一下挖掘这些漏洞的思路和过程。很多时候我们想拿到权限,不一定非要通过某个牛逼的漏洞,组合利用一些特性也能带来意想不到的效果。
0x01 前言
通达OA作为国内最主流的三大OA之一,经常参攻防演练的小伙伴一定非常喜欢这套系统的漏洞。历史上通达OA报出过很多高危漏洞,也曾经被人吐槽安全水平不高。但是经过这么多年的沉淀,现在通达OA的安全水平已经有了显著的提高。
本文以曾经研究过的通达OA11.9版本为例,阐述在高版本通达中如何利用通达自身的特性来getshell。文中涉及的所有漏洞都是笔者自研和首发,大多数已在最新版的通达OA12.0中修复,本文只是分享一下挖掘这些漏洞的思路和过程。很多时候我们想拿到权限,不一定非要通过某个牛逼的漏洞,组合利用一些特性也能带来意想不到的效果。
0x02 获取普通用户权限
历史很多通达OA的漏洞都是未授权或者越权,包括高危的SQL注入或者文件上传。目前较新版本的通达对于越权的问题处理的比较好,绝大多数文件都是需要登陆之后才能访问的。所以我们不再局限于寻找未授权访问的文件,而是寻找方便的用户口令爆破方式。
第一个很重要的tips是,通达OA安装之后的默认密码是空,这一点尤其重要。实战环境中能遇到的通达OA的很多弱口令都是空。如果用户要修改口令,则必须满足“8-20位,必须同时包含字母和数字”(低版本的通达OA没有复杂度限制),如图2.1所示。
图2.1 通达OA修改口令的要求
直接从通达OA的登陆口来爆破虽然没有验证码,但是却是有登陆次数错误的限制,而且有前端的RSA加密。但是这两个限制都是可以绕过的。
1)通达OA11.9在登录处默认使用了RSA的加密传输,但是修改参数encode_type=0,就可以明文传输密码了;
2)通达OA11.8默认10分钟只能输出3次密码,但是由于获取的IP是从X-Forwarded-For中获取的,所以可以通过该字段无限制爆破。
另外,为了更好的提高爆破密码的效率,配合另一个找回密码的接口,可以用于探测用户名是否存在。如图2.2所示。
图2.2 通过找回密码的接口判断用户名是否存在
为了更好的利用整个弱口令爆破的过程,编写了一个自动化的爆破脚本,具有下面的功能。文末附脚本下载方式,使用方式如图2.3所示。
▶自动发现系统存在的用户名
▶指定进程数,对用户名进行密码爆破
▶指定用户名,只对指定的用户名进行爆破
▶支持对中文用户名进行爆破
▶支持基于存在用户名的相关密码爆破,比如用户名张三,则密码为zhangsan123
图2.3 通达OA自动爆破脚本
0x03 普通用户提权
通过上面的弱口令爆破的思路,我们大概率已经获取目标相关的一个普通用户权限。普通用户可以登陆系统,但是还是不能拿到服务器权限,我们需要对普通用户进行提权。
未授权的SQL注入漏洞很少,但是登陆之后的SQL注入漏洞就很多了。在通达OA11.9版本中存在很多后台的SQL注入漏洞,但是我们需要首先绕过通达的全局的安全过滤,如图3.1所示。
图3.1 通达OA的全局SQL注入防御
这个SQL注入其实就是原来的80sec,很多其他的CMS也使用过,网上也有关于80sec的绕过方式,基本的思路就是通过特殊的方式引入单引号来进行绕过,如下所示。
id=@`'` union select 1,2,3 from user -- '
但是在11.9版本的通达中已经对响应的绕过方式进行了修复,修复代码如图3.2所示。首先会把所有转移之后的引号替换为空,然后再把反引号中的引号替换为空。这样我们就没办法再用上面的方式来绕过WAF了。
图3.2 通达OA修复80sec的漏洞
那么现在的情况下,还能不能利用通达OA的SQL注入漏洞呢?答案是肯定的。仔细阅读阅读通达OA的全局注入防护函数sql_injection,函数会禁止SQL语句中使用注释,禁止使用联合查询,禁止使用常见的注入关键字。但是不会禁止使用bool盲注,如图3.3所示。
通达OA11.9版本在普通用户权限下,还是有很多SQL注入的漏洞。这里给出一个示例,其他的注入读者可以自己再去找。定位到漏洞文件/module/appbuilder/user_select/query.php,如图3.4所示。
图3.4 因为通达OA全局变量的特性导致SQL注入漏洞
因为这里的注入有诸多限制,所以用SQLMAP跑不出来,我自己写了一个脚本来跑这种注入(文末附脚本下载方式)。运行如图3.5所示。
图3.5 使用注入脚本注出数据
这样我们可以拿到admin对应的hash值,但是并不是所有admin的hash都可以解密。还有哪些用户是可以帮助我们拿到服务器权限的呢?要能拿到服务器权限,用户需要有硬盘管理的权限,具体到数据库中需要满足下面的条件。
select concat(byname,0x23,password) from user where user.user_id in (select byname from user_function where user_func_id_str like 0x252c37372c25 and user_id != 0x61646d696e) and user.not_login=0 order by user_id desc limit 0,1
在上面的自动化脚本中我已经实现了指定注出具有“硬盘管理”权限用户的功能,稍微改一点就可以直接用了。
0x04 获取服务器权限
登录一个刚才获取用户。来到知识管理 - 网络硬盘设置,如图4.1所示。
图4.1 网络硬盘设置
最开始这里面是空的,新建一个共享目录。由于通达OA11.9增加了策略,不允许设置的目录中包含wwwroot所在的目录。定位文件
/general/system/netdisk/new/submit.php,如图4.2所示。
图4.2 网络硬盘设置限制
我们不能添加带wwwroot的目录,但是我们可以添加wwwroot对应的根目录,默认情况下通达OA WEB根目录是安装在D:/myoa/wwwroot/。所以我们可以添加D:/的网络硬盘,我本地是装在C盘,所以添加对应C盘的网络硬盘,如图4.3所示。
图4.3 添加C:///的网络硬盘
配置这个共享目录的权限,主要是自己要能上传文件,查看目录结构 权限设置 - 批量权限设置。在授权人员中加上自己。
图4.4 为新增加的网络硬盘配置权限
现在就可以浏览C:/的根目录了。
图4.5 网络硬盘配置中找到网站根目录
找到网站根目录,对应的wwwroot目录下面。点击单个上传。抓包。
图4.6 通过网络硬盘上传文件
但是上传的时候还是会报错。
图4.7 网络硬盘上传文件报错
这主要是由于inc/utility_file.php文件中,对上传文件的路径做了限制。如果上传路径中包含了wwwroot,然后又没有attachment,就不允许上传,如图4.8所示。
图4.8 上传文件要求上传文件必须在attachment目录
绕过方式就是,我们自己在某个字目录下面创建一个attachment目录。比如在inc下面创建目录attachment。
然后再到这个目录上传文件,如图4.9所示。
图4.9 在自建的attachment目录上传文件
这是后上传抓包,直接上传1.png是可以的了。但是上传php还是不可以。修改上传的后缀为 1.php .(0x88对应的ascii)。直接在hex里面修改就可以了,如图4.10所示。
图4.10 通过在文件名末尾增加0x88对应的ascii可以绕过上传黑名单检测
现在我们的目录文件1.php就在下面的路径了/inc/attachment/1.php
但是通达11.9版本修复了Wscript.Shell执行命令的方式,怎么执行命令是另一个问题了。这是通达11.9版本disable_functions的函数列表disable_functions = exec,shell_exec,system,passthru,proc_open,show_source,phpinfo,popen,dl,eval,proc_terminate,touch,escapeshellcmd,escapeshellarg
这里和以前第一个不同的点是没有禁用assert了,所以,我们可以构造一个一句话木马,但是这个一句话有很大的缺陷,我们并不能通过这个一句话来执行系统命令。如何执行系统命令呢?肯定是有办法的,留给大家思考一下。
0x05 总结
通达OA的代码量很大,很乱,甚至一套系统竟然是用了多个不同的开发框架,虽然最近系统修复了很多的漏洞,但是仔细分析还是有一些利用思路。一键getshell是很难的,但是组合拳getshell还是有一定的可能性。
发表评论