build your own shodan/censys/zoomeye

如何制作自己的 shodan/censys/fofa/zoomeye.

1. What is shodan/censys/fofa/zoomeye.

shodan 通过扫描全球范围内的 IPv4地址,通过探测端口开放、检测端口的服务,再通过服务提取源数据。最后提供数据供安全研究人员使用。国外类似的还有 censys,国内有 fofa 和 zoomeye。

2. Why we need our shodan?

首先第一个原因是没有钱。上述的各个商业公司提供了企业版的解决方案。企业用户才能获得原始数据,普通付费用户只能通过 API 做有限的查询。
第二个原因是使用别人的数据具有较大的局限性。例如无法获得实时最新的数据、无法自定义扫描范围、无法对某个 IP 段进行高频次扫描。
最后一个原因是想要造轮子。使用服务提供商的API 查询服务时,每一次查询服务都会被服务提供商记录,这对于我来说是不太可接受的。

3. Let's start!

build shodan 总共分三步,分别是端口扫描、banner 获取和banner 入库(供检索)。

3.1 端口扫描和 banner 获取

端口扫描和 banner 获取 censys 的开发者给我们提供了线程的解决方案,他们是 zmap 和zgrab2,通过这两个工具我们可以得到全网的 banner 指纹。
解释一下 banner 的概念:
在主机外部探测开放端口的服务主要是通过发送握手报文(hello string)-得到服务器的返回数据-与指纹库做匹配来获取远程的服务信息。
比如 ssh 服务主动返回信息(不需要hello string.)

☁  ~  nc 119.28.226.225 22
SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.7

通过这个返回内容我们可以知道119.28.226.225 22端口运行的是 ssh 服务。
再比如 http 服务,需要发送 GET / 返回信息(这是一个不完整的 HTTP 报文所以返回了400)。

☁  ~  printf "GET / HTTP/1.1\r\n\r\n" | nc example.com 80
HTTP/1.1 400 Bad Request
Content-Type: text/html
Content-Length: 349
Connection: close
Date: Tue, 12 Feb 2019 06:43:27 GMT
Server: ECSF (oxr/8373)

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <title>400 - Bad Request</title>
    </head>
    <body>
        <h1>400 - Bad Request</h1>
    </body>
</html>

但是通过这个返回的内容我们知道了,example.com 80端口上运行的是 HTTP 服务,服务器的版本是 ECSF (oxr/8373)。
一行命令获取 banner

sudo zmap -p 80 | ./zgrab2 http > 80_port.log

3.2 Index to elasticsearch

使用脚本将文件入库到 ES 中。zgrab2产生的非结构化数据很容易被放到 ES中索引。

3.3 Search

搜索时候可以制定一些搜索规则。
例如 ssh -> banner中含有 ssh 关键词且没有 http 状态码的返回头
例如 phpmyadmin -> title中含有 phpmyadmin。
再例如 Elasticsearch -> body中含有 minimum_wire_compatibility_version
获取指纹的方式有很多,一个比较好的方法是使用 nmap 的官方指纹库。

4. Finally – https://chis-cat.fht.im

Leave a Reply

Your email address will not be published. Required fields are marked *