通过去客户现场进行渗透测试发现某OA系统存在0day漏洞,故想通过复现案例进行申请CNVD证书。(本人小白一枚,请各位师傅轻喷。)
正文
我们可以通过fofa去搜索目标。
首先要解决一个问题,获取站点后,我们要怎么获取后台的账号密码,因为该漏洞需要获取OA的登录权限才可利用。(注:以下攻击过程都是围绕着获取后台账号密码展开的)。碰巧在对客户OA进行渗透测试时,我已经收集到了,该OA系统存在远程代码命令执行和任意文件读取漏洞。
一开始我的思路是,通过任意文件读取,去读取该OA的系统配置文件。可以通过去读取后台的配置文件,获取系统配置后台的密码:
获取密文后,通过信息收集我们可以发现后台的加密为DES加密,且密钥都是固定的,这时候我们就可以解开这密文获取后台密码了。这边我们使用github上大佬开发的工具,直接进行解密。
这时候我们可以直接访问后台路径,使用密码进行登录:
http://xx.xx.xx.xx/admin.do
可以看到数据类型为SqlServer,用户名为ekp,但是可以这边的密码进行加密了。不然我们想获取账号密码就可以直接通过连接数据进行获取了。这边测试下这个密码是否正确:
当时想到会不会这个乱码的玩意就是数据库密码啊。所以打算去尝试下,但是通过nmap端口探测发现,数据库的1433端口并没有对外开放,而数据库的IP也是127.0.0.1。
这下就没法进行连接了。本来发现通过nmap发现3389端口,想尝试爆破一波rdp,无果。突然想起来之前有通过一篇博客发现这个系统还存在远程命令执行,通过ldap或者rmi的协议去执行的。不说了,立马尝试。
Payload大概如下:
但是通过尝试了很多命令测试发现,并没有无法执行命令,但是自己的VPS服务器上是有请求记录的,这让我着实捉摸不透。不过后续就知道是为什么了。
就在这山穷水尽疑无路之时,之前发现的一篇文章突然让我柳暗花明又一村。这里面有一个工具,可以直接通过前台的ssrf+任意文件访问去写入木马,至此成功获取服务器权限。
通过去执行命令就能发现,似乎是没有命令执行权限,这也说明了为什么前面我们使用ldap和rmi协议无法执行命令。
而我们的目标一致都没有变,获取后台的账户权限,去复现我们发现的该OA的0day漏洞。而我一开始的想法是通过配置文件去找数据库的账户密码。而现实重重的给了我一巴掌。后面找了几个配置文件和配置目录,都没有发现数据库密码藏在何方。就在又陷入困境之时,偶然打开了tomcat的记录的该OA的日志,竟然发现了里面存在着账号密码。
还记得我们之前使用的DES解密工具吗?使用DES解密,成功获取密码。
使用该账号密码成功登录后台。
成功拿下一个案例。
下面的第二个案例,就没有那么轻松了。一样通过写马到后台,连接服务器,但是通过点击查看数个日志,却没发现里面含有账号密码了。于是,我心想干脆写个脚本去匹配password字段。
使用脚本跑完,我惊讶的发现,居然一个密码都没有,多次检查脚本后发现,并不是我的脚本出了问题,而是真的没有。大概率是管理员设置把登录密码的信息从日志中去除了。这下又出问题了呀。怎么拿到账号呢?又回到了最初的起点,呆呆地站在镜子前。看来只能通过获取数据库密码了。然后我又去翻了翻配置文件,重新把所有配置文件遍历下,使用脚本去匹配是否含有pass、passwd、password等字段的文件,一个一个去查看。无果。突然想起之前的那个配置后台,可以尝试数据库连接,使用弱口令去爆破数据库密码:
但是并没有什么卵用。还是只能去翻代码。在我们登录配置后台成功后,数据库是会返回数据库密码的,如果我们找到了这个类的代码,查看他的加密方式,那不就可以获取数据库密码了吗?说做就做,通过一阵查找,发现了dbConfig.jsp文件,即为admin.do去请求的接口,但是很多都是html代码。
一开始还纳闷,为什么找不到他的后端控制器在哪呢?结果慢慢找才发现,他貌似是前后端一体的,好像没有纯后端这一说。后续发现了他密码的加密方式。
<%
String pass = (String)pageContext.getAttribute("_pass");
if(StringUtil.isNotNull(pass)){
pass = new String(Base64.encodeBase64(pass.getBytes("UTF-8")),"UTF-8");
pageContext.setAttribute("_pass", "\u4649\u5820\u4d45\u4241\u5345\u3634{" + pass +"}");
}
%>
从上面代码可以发现并没有进行加密,只是在前面加入几个偏僻字和{}进行混淆罢了,后面只是使用了base64的编码。获取这些信息,这样我们就能获取数据库的账号和密码了。
但是账号密码在哪张表呢?我们难道一张一张表去找吗?该OA系统有上百张表,一张一张找太费时间了。那我们可以怎么做呢?哈哈哈,当然是去该OA官方问客服啦。成功得知sys_org_person表存储用户账号和密码。
把密文拿去DES解密,成功获取admin账号和密码。并成功登录:
后续也成功使用该方法获取多个站点数据库连接密码,通过哥斯拉的马直接访问数据库,成功获取多个站点OA账号密码。
PS:其实后续只拿了4~5个站点案例,达不到cnvd的证书标准。后续就直接通过代码审计方式去进行提交漏洞,成功获取了证书。
总结
由于该漏洞需要登录权限才能使用,故需获取账号密码。通过以前大佬们挖的nday获取服务器权限,通过日志获取了账号密码,但是由于多数站点都是隐藏账号密码,不在日志上显示的,故只能通过数据库获取账号密码。通过代审发现页面的密码为base64加密,成功获取数据库连接密码。最终成功复现漏洞。
作者:Huck_Lim,原创投稿。
征集原创技术文章中,欢迎投递
投稿邮箱:[email protected]
文章类型:黑客极客技术、信息安全热点安全研究分析等安全相关
通过审核并发布能收获200-800元不等的稿酬。