如何使用脚本识别MongoDB的弱密码用户?

作者:袖梨 2026-07-08
必须显式指定authSource参数,因其决定认证数据库,用户若建在test库却默认用admin认证将失败;同时需区分ConnectionFailure(连接失败)与OperationFailure(认证失败),并设置serverSelectionTimeoutMS控制超时。

直接用 pymongo 连接并试登录是最可靠的方式,但必须配合正确的连接参数和错误处理逻辑,否则会漏掉空口令、认证数据库错配、或因超时误判为失败。

为什么 mongo 命令行连得上,脚本却报错?

MongoDB 的认证机制依赖三个关键参数:用户名、密码、认证数据库(authentication database)。很多脚本只传 usernamepassword,却默认用 admin 作为认证库——而实际用户可能建在 test 或其他库中,导致连接被拒绝,报错 not authorized on admin to execute command

  • 务必显式指定 authSource 参数,例如 authSource="admin"authSource="test"
  • 若不确定认证库,需对常见库(admintestlocal)分别尝试
  • 空口令用户(如 user: "admin", pwd: "")必须显式传空字符串,不能传 None 或省略

pymongo.MongoClient 连接时 timeout 和异常类型要分清

连接失败不等于认证失败。网络不通、服务未响应、bindIp 配置错误都会导致超时,但这些和弱口令无关。盲目重试或归类为“失败”会掩盖真实风险。

  • 设置 serverSelectionTimeoutMS=3000 控制连接建立超时,避免卡死
  • 区分异常:ConnectionFailure(连不上)、OperationFailure(连上了但认证失败)、ConfigurationError(参数错,如 authSource 不存在)
  • OperationFailure 且消息含 "Authentication failed" 才算一次有效认证尝试失败

怎么避免扫描被阻断或触发告警?

MongoDB 本身无内置登录失败锁定,但高频并发试探容易被防火墙限速、WAF 拦截,或填满日志导致运维警觉。生产环境扫描必须克制。

  • 单 IP 对单实例建议 ≤ 5 并发线程,间隔 ≥ 1.5 秒/次
  • 禁用 ssl=True 除非目标明确开启 TLS,否则会直接失败
  • 优先测试已知存在风险的组合:如 user in ["admin", "root"] + pwd in ["", "123456", "admin", "password"],别一上来就跑完整字典
  • 若发现 ping 成功但 db.admin.command("listDatabases") 被拒,说明已通过认证——此时可停手,不必继续试其他密码

真正难的不是写脚本,是判断哪些 IP 值得扫、哪些用户该优先试、以及如何从一堆 OperationFailure 里挑出那个真实的空口令——它往往藏在第一个成功建立连接却没报认证错的 case 里,而不是等你把字典跑完。

相关文章

精彩推荐