在写《一个通过ZoomEye获取IOC的案例》我发现搜索Docker的关键词:Server: Docker会匹配到大量的蜜罐,而这些蜜罐符合Anglerfish类蜜罐的特征,目前这里蜜罐非常常见部署也非常多,显然它并不是今天的主角,我们先通过排除掉这些Anglerfish类的数据,搜索语法:
"Server: Docker" -"<title>"
[解释下:因为我们要搜索的Docker是个API服务基本上是不可能出现"<title>"这个词的,所以直接排除] 如下:

一共得到3.6w+的结果,随机做一些访问确认发现一个比较有意思显现,Docker api默认端口为2375,但是在侧栏的端口分布栏来看可以看出很多其他端口,我们使用排除语法搜索:
"Server: Docker" -"<title>" -port:2375

尝试访问基本都访问不到,端口服务处于关闭状态,这是一个非常异常的情况。然后我们看看banner信息,从ZoomEye里显示的banner信息很多请求应该是直接获取dorker版本信息的请求记录,注意观察你会发现这些请求都是版本信息Server: Docker/18.06.1-ce (linux)及Content-Length: 626都非常统一,继续搜索:
"Server: Docker" +"Content-Length: 626"
可以得到1.2w+的结果,而且这些很多基本访问不到,或者开始能访问,访问几次后就没有响应了,非常奇怪现象。随即我选了几个IP查看IP档案页面看看其他端口情况:
从这个Server:头的很典型的“蜜罐”风格,初步推测这些是设备为“蜜罐”并且带有IP阻断功能。当然可能有人会问你这个Content-Length: 626很可能默认的配置就是这个长度,那么我们那在banner里选一个其他的关键词进行,完整的banner如下:
HTTP/1.1 200 OKDate: Thu, 11 Mar 2021 07:04:33 GMTServer: Docker/18.06.1-ce (linux)Api-Version: 1.38Docker-Experimental: falseOstype: linuxContent-Type: application/jsonContent-Length: 626{"Platform": {"Name": ""}, "Components": [{"Name": "Engine", "Version": "18.06.1-ce", "Details": {"ApiVersion": "1.38", "Arch": "amd64", "BuildTime": "2018-10-26T23:39:57.000000000+00:00", "Experimental": "false", "GitCommit": "e68fc7a/18.06.1-ce", "GoVersion": "go1.10.3", "KernelVersion": "4.14.47-64.38.amzn2.x86_64", "MinAPIVersion": "1.12", "Os": "linux"}}], "Version": "18.06.1-ce", "ApiVersion": "1.38", "MinAPIVersion": "1.12", "GitCommit": "e68fc7a/18.06.1-ce", "GoVersion": "go1.10.3", "Os": "linux", "Arch": "amd64", "KernelVersion": "4.14.47-64.38.amzn2.x86_64", "BuildTime": "2018-10-26T23:39:57.000000000+00:00"}
我们选GitCommit这个值e68fc7a/18.06.1-ce搜索语法:Server: Docker+e68fc7a/18.06.1-ce得到1.4w+的结果,继续我们看看还有没有其他Content-Length的目标 搜索语法:Server: Docker+e68fc7a/18.06.1-ce-Content-Length: 626找到2,465 条而且都是2019年的数据,具体banner如下:
HTTP/1.1 200 OKContent-Length: 583Server: Docker/18.06.1-ce (linux)Ostype: linuxApi-Version: 1.38Docker-Experimental: falseDate: Sat, 20 Apr 2019 23:57:57 GMTContent-Type: application/json{"Platform":{"Name":""},"Components":[{"Name":"Engine","Version":"18.06.1-ce","Details":{"ApiVersion":"1.38","Arch":"amd64","BuildTime":"2018-10-26T23:39:57.000000000+00:00","Experimental":"false","GitCommit":"e68fc7a/18.06.1-ce","GoVersion":"go1.10.3","KernelVersion":"4.14.47-64.38.amzn2.x86_64","MinAPIVersion":"1.12","Os":"linux"}}],"Version":"18.06.1-ce","ApiVersion":"1.38","MinAPIVersion":"1.12","GitCommit":"e68fc7a/18.06.1-ce","GoVersion":"go1.10.3","Os":"linux","Arch":"amd64","KernelVersion":"4.14.47-64.38.amzn2.x86_64","BuildTime":"2018-10-26T23:39:57.000000000+00:00"}
从http头及下面返回的内容参数除里http头里的Date内容好像没啥不一样,但是这个Content-Length是不一样的,一个是626 一个是583,然后仔细核对你会发现,在http body里的json里626的是多了很多空格,如:
{"Platform": {"Name": ""}{"Platform":{"Name":""}
这个空格的问题让我想起《利用 ZoomEye 追踪多种 Redteam C&C 后渗透攻击框架》 https://paper.seebug.org/1301/ 这篇文章里提到的,到这里基本上可以实锤,搜索语法搜索出来的Server: Docker+Content-Length: 626就是“蜜罐”,而且从选用的模版信息可以确定,这个蜜罐模版选用18.06.1-ce版本最为模版,而这个版本主要出现在2019年!
最后一个问题一直困扰着我:既然是“蜜罐”不应该是吸引火力吗?为什么直接拦jie访问IP呢?
编者注:ZoomEye一直提供蜜罐识别业务,打标结果目前只对VIP用户开放。目前ZoomEye已经支持这类蜜罐识别并打标!

江西省南昌市 1F
这种排查思路挺有意思的,之前没想过从Content-Length这种细节入手。
天津市 B1
@ 社恐旁观者 老哥分析得挺细的,从端口异常到版本特征,一步步推理,逻辑清晰。
湖北省荆门市 2F
为啥蜜罐要阻断IP呢?正常不是应该放进来记录行为吗?
浙江省宁波市 3F
手头正好有个项目涉及到Docker安全,回头按这个方法去扫一遍看看。
重庆市 4F
感觉有点绕,直接看banner异常不就行了吗,整这么复杂。
印度 B1
@ Etherealwisp 直接看banner不够准,很多蜜罐会模仿正常服务,这种细节过滤能提高精度。
上海市 5F
GitCommit那个值居然能搜出那么多,确实有点东西。
内蒙古 6F
所以这些蜜罐是2019年那批部署的,现在还在跑?
辽宁省沈阳市 7F
之前用ZoomEye搜Shodan的语法比较多,这种排除法确实能滤掉不少干扰。
中国 8F
问个细节,排除“”是因为Docker API不会返回网页标题对吧?
广东省广州市 B1
@ GiggleSprout 是的,Docker API返回的是JSON数据,不会有HTML的title标签,这个排除条件很关键。
湖北省天门市 9F
有点没看懂,所以最后结论是这些全是蜜罐?
台湾省 10F
从端口分布异常到锁定特定版本,这个分析过程挺扎实的。
印度 11F
用Content-Length差异来识别蜜罐的思路很巧妙,我之前只关注banner。
湖北省武汉市 12F
这种排查方法对做资产梳理和威胁狩猎挺有帮助的。
安徽省滁州市 13F
问下,如果蜜罐更新了模板,用新的GitCommit值,这个方法还能用吗?
河南省安阳市 14F
之前也遇到过类似情况,扫出来一堆端口开着的服务,但实际连接不上,当时没深究。
澳大利亚 15F
所以这些蜜罐的目的是啥?只是单纯记录扫描行为,还是有别的意图?
北京市 16F
从2019年部署到现在还在活跃,说明这套东西一直有效,或者维护者懒得更新?
山西省吕梁市 17F
看起来像是某种研究项目或者安全公司部署的,用来收集攻击者手法。
上海市 18F
对于刚接触ZoomEye的新手来说,这种案例跟着操作一遍应该能学到不少。
福建省三明市 19F
那如果是用其他搜索引擎,比如Shodan或者Fofa,同样的语法思路通用吗?
台湾省 20F
这些蜜罐的阻断策略有点意思,可能是在识别到特定扫描模式后才触发。
辽宁省沈阳市 21F
嗯,方法可行,但实际用的时候还得考虑误报,比如一些配置特殊的正常服务。
北京市 22F
这排查思路挺巧啊
印度尼西亚 23F
原来蜜罐还会主动阻断IP,这招够狠的
江苏省苏州市 24F
内容长度583和626的区别居然在空格上,有点意思。
江苏省常州市 25F
这排查手法挺细的。
宁夏银川市 B1
@ 狮王者 排查过程确实绕了不少弯,发现规律后还挺有意思的。
韩国 26F
用Content-Length来筛,这思路可以。