1

我想使用 Shodan 获取网络的所有开放端口(我知道我可以使用nmap,但我想用 Shodan 执行此操作)。

问题是网站只显示“顶级服务”,我想获得所有服务。

例如,对于这个网络:195.53.102.0/24 我有以下端口:

TOP SERVICES
HTTP 15
HTTPS 2
DNS 2
FTP 2
IKE-NAT-T 1

但是如果我扫描这个网络:195.53.0.0/16,我会得到这些端口:

TOP SERVICES
HTTP 1,012
HTTPS 794
179 290
IKE 238
IKE-NAT-T 227

所以我缺少像dns和这样的服务ftp

我正在尝试使用来自 python 的 API:

import shodan

SHODAN_API_KEY = "XXXXXXXXXXXXXXXXXXXXXXx"

api = shodan.Shodan(SHODAN_API_KEY)

# Wrap the request in a try/ except block to catch errors
try:

    # Search Shodan


    results = api.search('net:195.53.102.0/24')
    for service in results['matches']:
        print service['ip_str']
        print service['port']

except shodan.APIError, e:
        print 'Error: %s' % e

这是我得到的结果:

195.53.102.193
80
195.53.102.138
80
195.53.102.148
80
195.53.102.136
80
195.53.102.157
80
195.53.102.226
443
195.53.102.66
500
195.53.102.133
80
195.53.102.142
80
195.53.102.66
4500
195.53.102.141
80
195.53.102.131
21
195.53.102.152
53
195.53.102.153
21
195.53.102.209
80
195.53.102.132
53
195.53.102.226
80
195.53.102.147
80
195.53.102.142
443
195.53.102.178
80
195.53.102.135
143
195.53.102.146
80
195.53.102.143
80
195.53.102.144
80

每个 IP 只有 1 个端口,例如,这个 IP:195.53.102.131 开放了 21、80 和 443 端口,我的结果只是:

195.53.102.131
21

代替:

195.53.102.131
21
80
443

因此,我希望从网站获得所有端口/服务,而不仅仅是TOP SERVICES从 API 获得每个 IP 的所有端口,而不仅仅是 1。或者如果有人有更好的解决方案,我也想听。

正如我所说,我想用 Shodan 来执行它,而不是 nmap。先感谢您。

4

2 回答 2

3

当您使用该api.search()方法时,Shodan 搜索服务横幅,并且服务横幅只有 1 个端口。如果要返回主机的所有端口,则应api.host()改为使用。例如:

import shodan

SHODAN_API_KEY = "XXXXXXXXXXXXXXXXXXXXXXx"

api = shodan.Shodan(SHODAN_API_KEY)

# Wrap the request in a try/ except block to catch errors
try:
# Search Shodan
    results = api.search('net:195.53.102.0/24')
    for service in results['matches']:
        hostinfo = api.host(service['ip_str'])

        print service['ip_str']
        #Not sure if it's correct, but you should do something,
        #like this:
        for port in hostinfo['port']:
            print port

except shodan.APIError, e:
    print 'Error: %s' % e
于 2016-07-29T20:50:56.943 回答
1

如果您只想获取网络上开放端口的细分,那么您可以使用count()方法并询问端口方面。如果您将 facet 指定为元组,您可以要求 API 返回超过前 5 个端口:

import shodan

api = shodan.Shodan(YOUR API KEY)
result = api.count('net:195.53.102.0/24', facets=[['port', 20]])

前 20 个端口(如果可用)然后在result['facets']['port']属性中可用。并且使用count()方法不使用任何 API 积分,因此它不会影响您的使用限制。

于 2016-11-14T04:50:16.563 回答