前言
由于工作原因一直都是网络空间搜索引擎重度用户,包括Shodan/ZoomEye/Censys/Fofa等平台都有过使用经验,甚至自己团队也尝试开发过类似平台。自认为还是非常了解的,在前面看过黑哥写的几篇文章后及国外研究者的一些文章后做了一些尝试,顺带也分享下多年使用搜索引擎的一些搜索套路,希望大家能喜欢,当然这个也是为了迎合下ZoomEye官方写文章送会员的活动 🙂
不说废话了,步入正题:
一、Cobalt Strike
这个方法最早是在黑哥在medium上发布两篇文章介绍利用ZoomEye识别在野Cobalt Strike服务器的文章[1][2]介绍的,因为文章是英文写的发布在medium上国内直接访问不到,所以这里再次简单介绍一下。在此之前我们需要提一下Fox-it的工作,是他们最早开始通过网络空间测绘技术去识别追踪在野Cobalt Strike的工作并在他们的blog上发布了对应的研究成果[3],Cobalt Strike提供的Web服务是基于NanoHTTPD开源框架开发的,而当时Fox-it工程师发现NanoHTTPD返回banner里存在一个异常的空格“bug”,然后通过这个异常的空格去识别。随后Cobalt Strike官方在发布的3.13版本了对这个“bug”做了更新处理。
事实上我们不需要这个利用这个所谓的异常的空格“bug”,根据观察Cobalt Strike的WEB服务返回http头存在比较明显的特征,由此来识别追踪Cobalt Strike。
首先我们看看Cobalt Strike版本
➜ curl http://x.x.x.x:8081 -v * Rebuilt URL to: http://x.x.x.x:8081/ * Trying x.x.x.x… * TCP_NODELAY set * Connected to x.x.x.x (x.x.x.x) port 8081 (#0) > GET / HTTP/1.1 > Host: x.x.x.x:8081 > User-Agent: curl/7.54.0 > Accept: */* >通过curl直接请求Cobalt Strike的WEB服务器端口主页内容返回http头非常简单并且特征化,直接提取两个关键字符串"HTTP/1.1 404 Not Found Content-Type: text/plain Date:"及"Content-Length: 0" (注:这里需要说明下ZoomEye在匹配处理是忽视回车换行的,不提取Date的部分是因为这个这个时间是变化的),这里我们通过+进行“且”运算(注:这里顺带说明下ZoomEye支持的逻辑运算:空格 为or运算符 表示逻辑“或”运算,+ 为and运算符 表示逻辑“且”运算,- 为 not运算符 表示逻辑“非”运算)
搜索语法如下:
"HTTP/1.1 404 Not Found Content-Type: text/plain Date:" +"Content-Length: 0" https://www.zoomeye.org/searchResult q=%22HTTP%2F1.1%20404%20Not%20Found%20%20%20Content-Type%3A%20text%2Fplain%20Date%3A%22%20%2B%22Content-Length%3A%200%22&t=all通过采样观察,这个搜索语法得到的结果有不少误报:比如Cobalt Strike的返回头信息里是没有"Server:"头的,也没有"Connection:"等头,这里我们可以通过-运算(not运算)进行排除,通过尝试我们发现"Server"这个关键词在于ssl等信息里直接运算可能导致漏报,所以我们这里直接使用"Connection:"的not运算,最终搜索语法如下:
"HTTP/1.1 404 Not Found Content-Type: text/plain Date:" +"Content-Length: 0" -"Connection:" https://www.zoomeye.org/searchResult q=%22HTTP%2F1.1%20404%20Not%20Found%20%20%20Content-Type%3A%20text%2Fplain%20Date%3A%22%20%2B%22Content-Length%3A%200%22%20-%22Connection%3A%22上面我们提到Cobalt Strike在3.13版本的时候修复了“异常空格bug”的同时也修改了默认返回的http头:(直接复制的黑哥文章里的内容)
➜ 404team curl http://x.x.x.x:8001 -v * Rebuilt URL to: http://x.x.x.x:8001/ * Trying x.x.x.x… * TCP_NODELAY set * Connected to x.x.x.x (x.x.x.x) port 8001 (#0) > GET / HTTP/1.1 > Host: x.x.x.x:8001 > User-Agent: curl/7.54.0 > Accept: */* >可以看到返回的http有内容顺序进行变动:Date:头提前了,所以之前的搜索语法是没办法直接工作了,那么我们按上面提到套路稍微改变下试一下,因为ZoomEye匹配模式不回去考虑回车换行的问题,我们把banner整理为一行:
HTTP/1.1 404 Not Found Date: Fri, 10 Apr 2020 07:16:27 GMT Content-Type: text/plain Content-Length: 0
因为时间是变化的所以分割一下:
1 HTTP/1.1 404 Not Found Date:
2 Fri, 10 Apr 2020 07:16:27
3 GMT Content-Type: text/plain Content-Length: 0我们直接取1 +3搜索,并继续使用 -"Connection:"继续排除,得到最终搜索语法:
"HTTP/1.1 404 Not Found Date:" +"GMT Content-Type: text/plain Content-Length: 0" -"Connection:"
https://www.zoomeye.org/searchResult
q=%22HTTP%2F1.1%20404%20Not%20Found%20Date%3A%22%20%2B%22GMT%20Content-Type%3A%20text%2Fplain%20Content-Length%3A%200%22%20-%22Connection%3A%22大家如果有兴趣可以去推特等上找一些开源情报信息验证一下。
这里需要说明下这个主要是根据NanoHTTPD的返回头进行识别的尤其是针对Cobalt Strike 3.13之前的版本,所以有可能其他的设备也使用NanoHTTPD这个组件也回被识别出来形成误报,另外在黑哥发布方法后有很多的Cobalt Strike使用团队开始修改了配置进行伪装,这个也是我这里需要提醒红队注意在使用Cobalt Strike的时候只是修改了证书啥的配置,那是原远远不够的。
二、Metasploit Meterpreter
Metasploit Meterpreter其实常用的方式有tcp也有http(s)的模式,在ZoomEye上有现成Metasploit相关的规则(提示:在搜索框里输入Metasploit及可关联出所有的Metasploit相关的app):
app:"Metasploit Rex httpd"
app:"Metasploit meterpreter metsvc"
app:"Metasploit meterpreter"
app:"Metasploit browser_autopwn"这几个规则大多是基于tcp的方式的,并不是这次主要目标。也就是http(s)的方式是我们今天的目标,在2019年的一篇文章里有国外的研究员提到了一个方法,这个方法有点类似Cobalt Strike上面的方法[4],都是从http(s)服务返回特征入手,这里我们看一下msf的相关代码 lib/msf/core/handler/reverse_http.rb#L82 [5]
OptString.new('HttpUnknownRequestResponse', 'The returned HTML response body when the handler receives a request that is not from a payload', default: 'It works!
' ),返回特征也很明显,于是尝试搜索:"
It works!
"
https://www.zoomeye.org/searchResult
q=%22%3Chtml%3E%3Cbody%3E%3Ch1%3EIt%20works!%3C/h1%3E%3C/body%3E%3C/html%3E%22很明显这个结果误报太多,我猜MSF开发人员当时就是想模仿Apache的默认返回内容,所以我们还得回到Cobalt Strike套路上,看看Metasploit Meterpreter http(s)上线模式WEB服务的返回头的信息:
* Trying 0.0.0.0:1337... * TCP_NODELAY set * Connected to 0.0.0.0 (127.0.0.1) port 1337 (#0) > GET / HTTP/1.1 > Host: 0.0.0.0:1337 > User-Agent: curl/7.68.0 > Accept: */* > * Mark bundle as not supporting multiuseIt works!
请登录后发表评论
注册