初段。获取网络的所有开放端口

时间:2016-07-28 09:49:58

标签: python cidr port-scanning shodan

我希望得到Shodan网络的所有开放端口(我知道我可以使用nmap,但我想用Shodan来实现这一点。)

问题是网站只显示" TOP服务",我希望获得所有服务。

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

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

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

2 个答案:

答案 0 :(得分:1)

使用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

答案 1 :(得分:1)

如果您只是希望获得网络上开放端口的细分,那么您可以使用 count()方法并请求端口方面。如果您将构面指定为元组,则可以要求API返回超过前5个端口:

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信用,因此不会影响您的使用限制。