首丹。获取网络的所有开放端口

Shodan. Get all open ports for a net

我想用 Shodan 获取网络的所有开放端口(我知道我可以使用 nmap 但我想用 Shodan 来实现)。

问题是网站只显示"TOP Services",我想得到所有的服务。

例如,对于这个网络: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

所以我缺少像 dnsftp 这样的服务。

我正在尝试 API,来自 python:

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

所以我想从网站上获得所有 ports/services 而不仅仅是 TOP SERVICES,或者从 API 获得所有端口每个IP,不仅仅是1。或者如果有人有更好的解决方案,我也想听听。

正如我所说,我想用 Shodan 来执行它,而不是 nmap。提前谢谢你。

当您使用api.search()方法时,Shodan 会搜索一个服务标语,而一个服务标语只有一个端口。如果你想 return 一个主机的所有端口,你应该使用 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

如果您只想获得网络上开放端口的细分,那么您可以使用 count() 方法并请求 port 切面。如果您将构面指定为元组,则可以要求 API 比前 5 个端口多 return:

import shodan

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

然后 结果 ['facets']['port'] 属性 中将提供前 20 个端口(如果可用)。使用 count() 方法不会使用任何 API 积分,因此它不会占用您的使用限制。