Python Shodan API — возврат нескольких значений порта

Глядя на эти документы SHODAN, я не уверен, что понимаю, почему я получаю только первые сведения о порте, когда запускаю скрипт. Когда я смотрю в веб-интерфейсе, я вижу, что для некоторых устройств обнаружено несколько портов/служб...

http://shodan.readthedocs.io/en/latest/tutorial.html#connect-to-the-api

#!/usr/bin/python 
import shodan
SHODAN_API_KEY = "xxxxxxx"
api = shodan.Shodan(SHODAN_API_KEY)

try:
results = api.search('ics country:"US"')
for item in results['matches']:
    print """
Port: %s
Banner: %s
""" % (item['port'], item['data'])

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

person juanald_reagan    schedule 11.05.2016    source источник


Ответы (1)


Ваш скрипт ищет в основной базе данных Shodan служебные баннеры, которые содержат строку «ics» и где устройства расположены в США. Однако результатами поиска являются баннеры; т.е. сервисы - не хосты! И баннер службы может иметь только 1 связанный с ним порт, поэтому это все, что вы видите. Однако хост может запускать несколько служб и иметь много открытых портов. Похоже, это то, что вас действительно интересует. Если вы хотите получить полный список портов/служб, которые есть у хоста, вам нужно использовать метод «api.host()».

host = api.host('8.8.8.8')

Это вернет список всех портов/сервисов, которые данный IP-адрес общедоступен в Интернете.

Также обратите внимание, что поиск «ics» в баннере — это не то же самое, что поиск промышленных систем управления. Вам нужно будет использовать поисковые фильтры, такие как:

category:ics

На Shodan есть раздел, в котором описываются различные сканируемые протоколы ICS и способы их поиска:

https://www.shodan.io/explore/category/industrial-control-systems

person achillean    schedule 12.05.2016
comment
Спасибо за объяснение! Мне совершенно не хватало того, что... с методом api.host() все работает, как и ожидалось. - person juanald_reagan; 12.05.2016