python 如何筛选Shodan上的特定数据

3bygqnnd  于 2023-01-01  发布在  Python
关注(0)|答案(1)|浏览(155)

我正在尝试用python编写一个脚本,它将搜索数据并返回IP地址和与它们相关的数据,但我希望过滤搜索,以便它只返回IP地址和它们的HTTP状态,只返回第一行,而不是包含完整数据的整个部分。
这是我的代码:

import shodan

SHODAN_API_KEY = 'API Key'
api = shodan.Shodan(SHODAN_API_KEY)

try:

    results = api.search('http', page=1, limit=10)

    print ('Results found: %s' % results['total'])
    for result in results['matches']:
        print ('IP: %s' % result['ip_str'] +  ' - ' + 'HTTP: %s' % result['data'])
        print ('')
except shodan.APIError as e:
    print ('Error: %s' % e)

这是我得到的输出:
结果发现:236280753
IP: 98.129.229.204 - HTTP: HTTP/1.1 200 OK Server: Apache/2.4 Content-Type: text/html; charset=UTF-8 Date: Sun, 11 Dec 2022 19:29:48 GMT Accept-Ranges: bytes Connection: Keep-Alive Set-Cookie: X-Mapping-hjggddoo=22C05A3A99FA43E436FE707A7C0D13DD; path=/ Last-Modified: Tue, 10 Sep 2019 00:23:11 GMT Content-Length: 201
因此,如果可能的话,我试图从result['data']获取的只是IP地址和HTTP状态?

mpbci0fu

mpbci0fu1#

下面是一个示例脚本,它将打印结果的IP和HTTP状态代码。它使用Shodan.search_cursor()方法自动迭代页面。请注意,pagelimit参数是互斥的-如果您使用一个,则不能使用另一个。我们不建议使用该方法的limitoffset参数。

from shodan import Shodan
from shodan.helpers import get_ip

api = Shodan("API KEY")

for banner in api.search_cursor("http"):
    if "http" in banner:
        print(f"{get_ip(banner)} - {banner['http']['status']}")

或者,您最好使用Shodan CLI下载数据,然后解析出您关心的属性:

$ shodan download --limit 1000 http-results.json.gz http
$ shodan parse --fields ip_str,http.status http-results.json.gz

您的搜索查询“http”非常宽泛,因此您无法通过API/ CLI下载所有结果,但大多数情况下,最好先下载数据,然后在单独的脚本中分析/过滤该数据的输出。这可以确保您在使用脚本时不会一次又一次地重新下载相同的数据。

相关问题