某知名OA高版本getshell思路(附部分脚本)
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还是有一定的可能性。
公众号回复”tongdaoa”获取文中脚本下载链接。
某知名OA高版本getshell思路(附部分脚本)相关推荐
- 某知名OA命令执行方法探索(续)
在上一篇文章之后,有小伙伴留言问通达OA获取权限后如何才能执行命令.本来是想留下一个小的悬念给大家,既然有人问起,咱们就把这个问题继续探讨一下. 传送门: 某知名OA高版本getshell思路(附部分 ...
- SpringBoot高版本(2.4及以上)集成neo4j并进行增删改查,通俗易懂附源代码
SpringBoot整合Neo4j,最新版本适用,超通俗详细讲解 0.前言 跟着班导师做项目的时候遇到社交网络的部分,而传统的关系数据库不能很好解决数据之间的关系,因此采用图数据的方式进行存储.N ...
- System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本?
System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本? 环境: Win XP SP2+Oracle 10 g+VS 2005 错误:System.D ...
- .Net高并发解决思路(转)
.Net高并发解决思路 2018年10月21日 14:19:14 赵东小生 阅读数:736 高并发 高并发一直是网站上线后会遇到的一个严峻的考验,渡过了一切都好,渡不过就是宕机. 在电商时代如此发达的 ...
- linux cpu不足处理运维,Linux运维知识之Linux服务器CPU占用率较高问题排查思路
本文主要向大家介绍了Linux运维知识之Linux服务器CPU占用率较高问题排查思路,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. 注意:本文相关配置及说明已在 CentOS ...
- Centos7使用Yum安装高版本的LNMP
[摘要] 本文旨在介绍使用yum的方式安装一些高版本的NGINX.MySQL.PHP服务.当然如果觉得红帽给的就够用,就用红帽给的就行. 在红帽系列的Linux操作系统中,nginx/mysql/ph ...
- Sandcastle Help File Builder(.NET帮助文档工具)的版本选择心得——支持VS2010至VS2015,高版本项目文件问题...
作者: zyl910 一.缘由 "Sandcastle Help File Builder"(简称SHFB)是一个很好用.NET 帮助文档生成工具. 但它的每个版本支持的VS版本范 ...
- CAD高版本窗体阵列LISP_[转载]AutoCAD高版本怎么把阵列对话框调出来?
AutoCAD低版本阵列ARRAY命令的参数设置用是对话框形式,到了高版本使用功能区界面后,不再使用对话框,而是会在功能区弹出一个"阵列"选项卡,如下图所示. 新版阵列还有一个不同 ...
- CAD高版本窗体阵列LISP_CAD高版本窗体阵列LISP_AutoCAD高版本怎么把阵列对话框调出来?...
AutoCAD低版本阵列ARRAY命令的参数设置用是对话框形式,到了高版本使用功能区界面后,不再使用对话框,而是会在功能区弹出一个"阵列"选项卡,如下图所示. 新版阵列还有一个不同 ...
最新文章
- php 单词替换,如何在PHP中替换字符串中的单词?
- PL/SQL学习笔记(四)
- 计算机网络最佳路由,优化计算机网络路由的策略
- html自定义属性冒号,vue中标签上的属性加冒号与不加冒号的区别
- Python(5):循环
- iNeuOS工业互联网操作系统部署在华为欧拉(openEuler)国产系统
- Redis缓存,你真的懂了吗
- LeetCode 717. 1-bit and 2-bit Characters
- 计算机技能大赛简报,网络攻防比赛简报
- 整洁代码--写好注释
- c# Winform登陆界面设计,登陆用户不同权限设置
- javascript 纯前端实现汉字转拼音 —— pinyin-pro 库
- Java邮件发送基于springboot实现
- android模拟器如何增加RAM
- 路由与交换 实验一 路由器基本配置
- 对于因果模型的常见评估函数:SHD 和 FDR
- 小程序头像和昵称填写能力用底部弹框界面实现
- shtml 是什么?
- SoClean!磁盘清理软件
- Java 操作excel 插入删除列,插入删除图片