Шодан. Получить все открытые порты для сети

Я хочу получить все открытые порты для сети с помощью 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.

Я пытаюсь использовать 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

Всего 1 порт на IP, и, например, этот 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. Заранее спасибо.


person aDoN    schedule 28.07.2016    source источник


Ответы (2)


Когда вы используете метод 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
person davidlebr1    schedule 29.07.2016

Если вы просто хотите получить разбивку открытых портов в сети, вы можете использовать метод count() и запросить фасет port. И вы можете попросить 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, поэтому он не будет превышать ваши ограничения на использование.

person achillean    schedule 14.11.2016