shodan使用教程 - ☕ 经验茶谈极核论坛 - 知识星球 - 极核GetShell

shodan使用教程

免责声明,如涉及侵权马上删除文章。

笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。

本文章涉及分享的网页链接均为开源项目地址,所有涉及工具、教程只可安全测试自用,请勿对任何网站进行入侵攻击,小日子的除外……

Shodan简介

什么是 Shodan?

想象一下,互联网就像一个巨大的城市,里面有无数的“建筑物”(这些建筑物就是我们在网上访问的网站、设备、服务器等)。而 Shodan 不是像谷歌那样只关注这些“建筑物”外面的样子(即网页),而是它能“穿透墙壁”进去,直接看到这些“建筑物”内部的内容。例如,它能知道一个路由器是否有默认密码,或者一个摄像头的控制面板是不是暴露在互联网中。

Shodan 如何工作?

Shodan 像一个“侦察兵”,不停地在全球范围内扫描、检查所有连接到互联网的设备。它通过发送特定的请求(类似访问一个网页的过程),但不同的是,它并不是查看网页内容,而是查看设备的响应。例如,当你访问一个网站时,浏览器会向网站的服务器发送请求,服务器返回网页内容。Shodan 也发送类似的请求,但它是去检查设备的“服务”是否正常,并且收集关于设备的信息(比如设备的类型、软件版本、是否有安全问题等)。

Shodan 搜索的对象是什么?

Shodan 不仅仅能发现常见的服务器和网站,它可以扫描到几乎所有连接到互联网的设备。比如:

  • 摄像头:很多家庭、商店、工厂的摄像头都连接到互联网,有些甚至没有密码保护。Shodan 能发现这些摄像头,并且显示它们的IP地址、位置等信息。
  • 路由器和交换机:这些是家里或公司内网连接的设备。Shodan 会扫描它们是否有默认密码或其他安全漏洞。
  • 工业设备:像电厂、工厂、甚至医院的某些设备(比如自动化控制系统)都可以通过 Shodan 被扫描到。
  • 家用设备:很多智能家居设备(比如冰箱、空调、甚至智能灯泡)通过互联网连接,Shodan 可以发现它们并列出相关信息。

Shodan 能找到什么?

通过 Shodan,攻击者或安全研究人员能够看到很多设备的开放端口和服务。例如,一个打印机可能会暴露其管理界面,甚至没有设置密码。通过这些信息,Shodan 能帮助用户快速发现设备的潜在问题。举个简单的例子,如果你用 Shodan 搜索“默认密码”,你可能会发现大量没有修改密码的设备(如“admin”和“1234”这样的组合)。

Shodan 的危险性

为什么说 Shodan 可怕呢?因为它能够揭示互联网上许多设备的脆弱性,尤其是那些没有进行适当安全配置的设备。很多设备默认的用户名和密码没有改动,Shodan 就能轻松找到它们并展示出来。这就像是把家门钥匙丢在街上,任何路过的人都能轻松拿到并进入。对攻击者而言,Shodan 就是一个宝藏库,他们通过它可以发现网络中大量的“低挂的果实”——那些容易被攻击的设备。

如何使用Shodan

在线使用

网站访问

访问网站,如果你还没有账户,可以注册一个免费账号。注册后,你可以保存搜索结果,创建监控等。

基本搜索方法

  • 搜索所有摄像头: 输入 camerawebcam,Shodan 会列出互联网上暴露的摄像头。

  • 搜索默认密码设备: 输入 default passwordadmin,Shodan 会列出使用默认密码的设备。

  • 搜索某个特定国家的设备: 你可以使用 country: 参数,来限定搜索结果只来自某个特定国家。例如:country:US webcam 会显示来自美国的摄像头。

  • 搜索特定端口的设备: Shodan 允许你根据端口号搜索设备。例如,port:80 会返回所有开放 HTTP 服务的设备。

高级搜索方法

  • port::指定搜索端口。例如:port:22 可以查找所有开放 SSH 端口的设备。
  • os::指定搜索操作系统。例如:os:"Linux" 可以查找运行 Linux 系统的设备。
  • hostname::指定搜索主机名。例如:hostname:"example.com" 可以查找与 example.com 相关的设备。
  • city::指定搜索城市。例如:city:"Shanghai" 可以查找位于上海的设备。
  • org::指定搜索特定组织的设备。例如:org:"Google" 可以查找属于 Google 的设备。
  • country::指定国家。例如:country:"US" 查找位于美国的设备。
  •  

示例分析

在搜索框中输出webcan,Shodan 会列出互联网上暴露的摄像头。

image

 

image

 

 

 

页面顶部导航栏

  • 探讨:点击进入 Shodan 的主要功能页面,比如搜索设备。
  • 下载:可以下载一些报告或数据(需要高级账号)。
  • 定价:查看 Shodan 的服务价格和升级选项。
  • 账户按钮:显示你当前的登录状态,可以点击进入账户设置。

搜索框

图片中显示了一个搜索框,输入的关键字是 “webcam”。这意味着 Shodan 正在搜索与 “webcam” 相关的设备。你也可以在这里输入其他关键词,比如特定设备的类型或厂商。

搜索结果总览

在搜索结果页面的左上方,有以下几个重要信息:

  • 总结果:3934
    这是 Shodan 搜索到的与 “webcam” 相关的设备总数。在本次搜索中,Shodan 找到了 3934 个设备。

  • 热门国家(地图与列表):
    地图和表格显示了这些设备的分布情况。根据图片,搜索结果分布在多个国家,其中:

    地图颜色越深的区域,表示该地区相关设备的数量越多。

    • 美国有 1121 个相关设备。
    • 中国有 748 个。
    • 印度有 437 个。
    • 俄罗斯和德国的设备数量分别为 237 和 222
  • 热门端口(Top Ports):
    Shodan 列出了这些设备常见的开放端口,比如:

    • 8080:通常用于 Web 服务或摄像头管理页面。
    • 8081、443:HTTPS 或其他服务的端口。
    • 80:标准 HTTP 服务端口,通常用于访问设备的管理界面。
    • 8888:常用于调试或开发服务。
  • 组织(Top Organizations)
    • 组织名称:显示与这些设备关联的公司、组织或互联网服务提供商(ISP)的名称。
      • 比如截图中可能会看到类似 “亚太网络信息中心有限公司”。
    • 设备数量:显示该组织的相关设备数量,比如 “738” 表示该公司有 738 个设备与关键词相关。
  • 热门产品(Top Products)
    • 产品名称:显示设备所使用的硬件或软件的品牌或型号。
      • 比如搜索 “webcam” 时,可能会看到 IP WebcamD-Link Camera
    • 数量:显示使用该产品的设备数量。
  • 热门操作系统(Top Operating Systems)
    • 操作系统名称:比如 Linux、Windows Server、Embedded OS 等。
    • 数量:显示使用该操作系统的设备数量。

搜索结果列表

搜索结果列表是 Shodan 的核心内容,包含了每个设备的信息。每一行代表一个搜索到的设备,以下是重要内容的解析:

设备条目结构

每个设备条目包括以下信息:

  1. IP 地址
    比如第一个结果显示:

    213.184.245.62

     

    这是设备在互联网上的唯一地址,类似于设备的“家”地址。

  2. 地理位置
    设备的国家或地区,比如:

    白俄罗斯

     

    表示该设备位于俄罗斯境内。

  3. 设备响应的服务或协议
    比如:

    HTTP/1.1 401 Unauthorized

     

    这表示该设备的服务类型是 HTTP(通常是 Web 管理页面),返回状态是 401 Unauthorized,即需要认证(例如用户名和密码)才能访问。

  4. 其他详细信息
    Shodan 会解析设备的响应数据,展示相关的元信息,比如设备的服务版本、服务器类型等:

    Content-Length: 0
    WWW-Authenticate: Digest realm=”IP Webcam”
    • WWW-Authenticate 是设备要求验证的提示,表明这个设备是一个 IP 摄像头。
    • Content-Length: 0 表示服务器没有返回页面内容。

统计与分布图

左侧的地图和统计数据是 Shodan 提供的全局视图,帮助你了解搜索结果的分布情况:

  • 地图:通过颜色深浅标记结果数量最多的地区。
  • 设备分布表:按国家/地区显示搜索结果设备的数量。

这部分非常适合用来分析某个国家或地区暴露设备的规模。

小图标与功能按钮

每个结果右侧还有一些功能按钮,比如:

  • 查看报告:你可以点击生成设备的详细报告。
  • 下载结果:可以将当前搜索结果保存为文件(需要付费账号)。
  • 历史记录:查看设备的历史变化,例如设备暴露的时间点或是否更改了配置。
  • 浏览图片:如果设备返回了图片(如摄像头的画面截图),Shodan 会在这里提供链接。
  • 在地图上查看:通过地理定位显示设备的具体位置。

小总结:本次搜索结果的重点

根据这张图片,这次搜索关键词为 “webcam”,结果中:

  • Shodan 找到了许多网络摄像头,分布在全球多个国家(以美国和中国为主)。
  • 搜索结果中暴露的端口主要是 Web 管理端口(如 8080、80、443)。
  • 很多设备的 HTTP 服务提示需要认证(如 401 Unauthorized),但某些设备可能未设置强密码,存在安全风险。
  • 你可以进一步分析具体设备的厂商、版本和地理位置等信息。

搜索结果分析

image

左侧 “常规信息” 区域

这个部分展示了与目标 IP 地址相关的基本信息,包括域名、地理位置、组织等内容。

  • IP 地址:这是目标设备的唯一标识,比如 216.137.193.126 是当前查询的 IP 地址。
  • 主机名126-193-137-216.static.mtaonline.net,显示设备的主机名,这通常是由网络服务提供商分配的。
  • 域(Domain)MTAONLINE.NET,指设备所属的网络域名,通常由设备连接的服务提供商或网络域分配。
  • 国家和城市:显示设备所在的地理位置,比如这里显示 “美国,帕尔默(Palmer)”。
  • 组织(Organization):标明该设备的运营者或关联组织,比如这里的 “马塔努斯卡电信协会”。
  • 国际互联网服务提供商(ISP):说明提供互联网服务的具体公司,和组织类似。
  • ASNAS11090,这是设备所属的自治系统号(Autonomous System Number),是网络提供商在全球的标识号,用于互联网路由。

中间 “开放端口” 区域

展示了该 IP 地址开放的端口号,这些端口代表了设备对外提供的服务。

  • 8080、8083、8086:这些是开放的端口号,分别代表设备的不同服务。常见端口的作用:
    • 8080:通常用于 HTTP 协议,是 Web 服务的常用端口。
    • 8083、8086:这些端口也可能是 Web 服务,或其他自定义服务。

右侧 “端口详情” 区域

端口 8080
  • 标题:网络摄像头 7 httpd
    • 表明这是一个摄像头设备,运行的 HTTP 服务为 httpd
  • HTTP 响应信息
    • 状态码HTTP/1.1 200 OK,表示服务器正常返回响应。
    • Content-Typetext/html; charset=utf-8,说明该设备返回的是网页内容,编码为 UTF-8。
    • Content-Length2204,表示网页内容的长度为 2204 字节。
    • Cache-Controlno-cache, must revalidate,设备配置的缓存策略,不允许缓存。
    • Serverwebcam 7,表明设备的服务软件是 “webcam 7”。
端口 8083
  • 标题:网络摄像头 XP httpd 5
    • 表明这是另一个摄像头设备,运行的 HTTP 服务为 httpd,版本是 XP 5。
  • HTTP 响应信息
    • 状态码HTTP/1.1 200 OK,表示服务器正常返回响应。
    • Content-Typetext/html; charset=utf-8,说明该设备返回的是网页内容。
    • Content-Length2207,表示网页内容长度为 2207 字节。
    • Cache-Control:同样配置为 no-cache
    • ServerwebcamXP 5,表明设备的服务软件是 “webcamXP 5”。

用途

  • 通过这些信息,可以了解设备暴露的服务、软件版本等。
  • 攻击者可以根据设备返回的服务信息,查找已知的漏洞(比如针对 webcamXP 的漏洞)。

地图背景

图片顶部显示了一个地图区域,用于标注设备的地理位置。

  • 显示设备大概的位置(根据 IP 地址推测),这里显示为美国帕尔默附近。
  • 地图信息通过 OpenStreetMap 提供。

用途

  • 用于进一步确认设备的物理位置。
  • 帮助判断设备的真实所有者,比如是否属于某个公司、机构或个人。

image

如果网站上有漏洞还会显示漏洞的编号,以及WebTechnologies 的组成

检测蜜罐

检测蜜罐的网址

什么是蜜罐?

蜜罐(Honeypot)是一种网络安全防护技术,指的是故意设置的伪装目标(比如服务器、设备、服务等),目的是吸引攻击者并监控他们的行为。蜜罐看起来像是一个正常的系统,但实际上它被专门设计为一个诱饵,用来:

  • 记录和分析攻击者的行为。
  • 收集恶意软件样本。
  • 提高网络防御的效果。

蜜罐通常不会真正存储重要的数据,而是通过伪装的漏洞或服务引诱攻击者,让他们以为自己攻陷了一个目标系统。

蜜罐的工作原理

  1. 伪装为真实目标:蜜罐可以模拟网站、数据库、IoT设备、企业服务器等,模仿它们的工作状态。
  2. 引诱攻击者:它可能会故意暴露一些看似“存在漏洞”的端口或服务,例如开放一个旧版本的 FTP 服务。
  3. 记录攻击行为:一旦攻击者开始对蜜罐进行攻击,系统会记录攻击者的行为,包括攻击工具、入侵路径、执行的命令等。
  4. 无害化的隔离:蜜罐和真实系统隔离,攻击者实际上无法对真实环境造成任何威胁。

蜜罐的类型

  1. 低交互蜜罐

    • 模拟简单的服务或端口(如伪装为开放的 SSH 或 HTTP)。
    • 目标是引诱扫描器或简单的自动化攻击工具。
    • 简单且易于部署,但只能收集有限的信息。
  2. 高交互蜜罐

    • 模拟一个完整的系统(如一台真实的服务器)。
    • 攻击者可以执行更复杂的操作,甚至获得“控制权”。
    • 能收集详细的攻击过程,但部署和维护复杂。
  3. 特定应用蜜罐

    • 针对特定的应用程序或设备,比如物联网设备、ATM机、数据库等。
    • 用于研究针对特定领域的攻击。

为什么要检查是否为蜜罐?

对于渗透测试人员或网络攻击者而言,蜜罐是一种 反制手段,如果不小心攻击了蜜罐,可能会暴露以下信息:

  1. 暴露真实身份

    • 蜜罐会记录攻击者的 IP 地址、地理位置等信息,可能会被网络管理员追踪或报警。
    • 即使使用代理或 VPN,也可能因失误泄露真实信息。
  2. 暴露攻击手法

    • 攻击者使用的工具、脚本、漏洞利用手法可能会被记录,安全研究人员可以利用这些数据加强防御。
  3. 浪费时间

    • 蜜罐不包含真正有价值的数据,对蜜罐进行攻击只会浪费时间和资源。
    • 攻击蜜罐后,可能会被标记为高风险来源,进一步攻击目标时会被防火墙拦截。
  4. 法律后果

    • 蜜罐可以作为法律证据,证明有人试图入侵网络。如果攻击者被追踪到,可能面临法律责任。

monitor模块

monitor 模块允许你监控某个目标或一组目标,检测其在互联网上的变化。例如,你可以设置监控某个 IP 地址是否有新的开放端口,或者检测某个特定服务是否突然出现或消失。Shodan 通过扫描互联网来提供这些信息,从而让你及时了解目标设备的动态变化。

image

 

查看API的方法

在账户处可以找到自己的API

image

 

本地使用

kali安装shodan

(1)kali安装shodan

git clone https://github.com/achillelean/shodan-python.git

(2)切换到shodan-python文件夹

cd shodan-python

(3)安装

python setup.py install

(4)初始化shodan

shodan init api_key

windows安装shodan

(1)移动到目录下

cd python/scripts

(2)安装shodan

pip install shodan

(3)初始化shodan

shodan init api(自己的api)

image

使用时任意位置都可以

Shodan 参数使用详解

基本参数

参数 含义 示例
--color 高亮显示结果,便于更直观地阅读和分析。 shodan search --color "webcam"
--limit 限制返回的结果数量。例如限制为10条信息。 shodan search --limit 10 "port:22"
--fields 过滤信息,只输出指定的字段内容(如 IP 地址、端口等)。 shodan search --fields ip_str port "country:CN"
offset 用于分页搜索,指定从哪一条记录开始返回结果。 shodan search --limit 10 --offset 10 "port:3389"
page 用于显示第几页的结果。 shodan search --page 2 "city:Shenzhen"
facets 对搜索结果进行分组或汇总,比如按国家、端口等字段分类统计。 shodan search --facets country "Apache"
sort 对搜索结果进行排序,比如按 IP 地址、端口等排序。 shodan search --sort ip "port:443"
filter 用于过滤指定数据字段的值。 shodan search --filter org:"Google"

高级搜索参数

参数 作用 示例
--authentication 查询启用了未授权访问的设备。 shodan search --limit 10 --authentication "authentication disabled"
--history 查看目标 IP 地址的历史数据,分析历史变化。 shodan host --history 8.8.8.8
hostname 搜索指定的主机名或域名。 shodan search hostname:"google"
port 搜索特定端口上的服务。 shodan search port:"22"
country 按国家过滤结果。 shodan search country:"CN"
city 按城市过滤结果。 shodan search city:"Shenzhen"
org 搜索某个组织或公司的设备。 shodan search org:"China Telecom"
isp 搜索特定 ISP 提供商的设备。 shodan search isp:"China Telecom"
product 搜索运行特定软件/平台的设备。 shodan search product:"Apache httpd"
version 搜索特定软件版本的设备。 shodan search version:"2.4.49"
vendor 搜索特定厂商的设备。 shodan search vendor:"Cisco"
vuln 查询具有特定漏洞的设备(例如 CVE 漏洞编号)。 shodan search vuln:"CVE-2020-0601"
has_vuln 搜索具有任何已知漏洞的设备。 shodan search has_vuln:true
service 搜索运行特定服务的设备。 shodan search service:"ftp"
geo 按地理位置(经纬度)搜索设备。 shodan search geo:"31.8639, 117.2808"
before/after 搜索指定日期之前或之后收录的数据,格式为 dd-mm-yy shodan search before:"11-11-15"
net 搜索某个 IP 范围或子网中的设备。 shodan search net:"210.45.240.0/24"
os 搜索运行指定操作系统的设备。 shodan search os:"windows7"
device 搜索特定设备类型。 shodan search device:"router"
count 统计结果数量,而不返回具体设备信息。 shodan count "port:80"

实用命令示例

查询某 IP 地址的详细信息

shodan host 8.8.8.8

 

说明:返回指定 IP 的所有公开信息,包括端口、服务、漏洞历史等。


查询自己的出口 IP 地址
shodan myip

 

说明:显示当前网络的出口 IP 地址。


下载结果
shodan download 文件路径 –limit 100 “vuln:CVE-2020-0601”

 

说明:下载与特定漏洞相关的设备数据(限制100条),保存到指定路径。


解析文件
shodan parse –fields ip_str 文件路径

 

说明:解析下载的文件,仅提取设备的 IP 地址。


搜索未授权访问的设备
shodan search –limit 10 –fields ip_str “authentication disabled” port:5900

 

说明:查询 VNC 服务中未授权访问的设备,仅返回 IP 地址,限制为 10 条结果。


复杂组合搜索示例

查询中国深圳运行 RDP 服务(3389端口)的设备信息,返回 IP 地址并限制为10条结果:

shodan search –color –limit 10 –fields ip_str port:3389 country:CN city:Shenzhen

 

解释:

  • --color:高亮显示结果。
  • --limit 10:限制返回 10 条结果。
  • --fields ip_str:过滤信息,仅返回 IP 地址。
  • port:3389:查询开放 RDP 服务的设备。
  • country:CN:指定中国。
  • city:Shenzhen:过滤城市为深圳。

高级统计分析示例

按国家统计运行 Apache 的设备数量
shodan search –facets country “Apache”

 

说明:统计全球范围内运行 Apache 服务的设备数量,并按国家分类。


按端口统计设备分布
shodan search –facets port “China”

 

说明:统计中国范围内设备开放的端口分布情况。


查询特定漏洞的影响范围
shodan search vuln:”CVE-2020-0601″ –facets country

 

说明:统计受该漏洞影响的设备分布情况,并按国家分类。

提示

尽量每个查询语句都带上–limit和–fields ip_str,port 之类的便于查询后的观察

没用的

image

 

用了的

image

利用python调用shodan

步骤 1:安装 Shodan 模块

在使用 Python 调用 Shodan 模块之前,首先你需要安装 Shodan 的 Python 客户端库。

安装 Shodan 模块: 在命令行或终端中输入以下命令来安装 Shodan 模块:

pip install shodan

 

步骤 2:获取 Shodan API 密钥

  • 首先你需要在 Shodan 官网 上注册账号。
  • 登录后,点击右上角的 Account,进入 API 页面,获取你的 API 密钥(一个由字母和数字组成的字符串)。

步骤 3:

导入必要的库

import shodan
from concurrent.futures import ThreadPoolExecutor, as_completed

 

  • shodan:这是 Shodan 官方提供的 Python 客户端,用于调用 Shodan API。
  • ThreadPoolExecutoras_completed:用于多线程并行处理扫描任务,提升扫描效率。

配置 Shodan API 密钥

SHODAN_API_KEY = “your_shodan_api_key”

 

  • SHODAN_API_KEY 中替换成你从 Shodan 获取到的 API 密钥。

定义输入文件和输出文件

input_file = “ip_list.txt” # 包含要扫描的 IP 地址列表,每行一个 IP
vulnerable_output_file = “vulnerable_ips.txt” # 保存存在漏洞的 IP 结果

 

  • input_file:是一个包含待扫描 IP 地址的文件,每行一个 IP 地址。你需要创建一个名为 ip_list.txt 的文件,并在里面列出你想扫描的 IP 地址。
  • vulnerable_output_file:是扫描结果的输出文件,保存所有存在漏洞的 IP 地址及漏洞信息。

设置线程池的最大线程数

max_threads = 20 # 最大线程数

 

  • max_threads:指定最多同时执行多少个线程,这样可以并行扫描多个 IP,提高效率。

步骤 4:定义扫描函数

def scan_ip(api, ip):
"""扫描单个 IP 地址并返回结果"""
try:
print(f"正在扫描 IP: {ip}")
host = api.host(ip)

vulnerabilities = host.get("vulns", []) # 获取漏洞信息
if vulnerabilities:
print(f"发现漏洞 IP: {ip},漏洞: {vulnerabilities}")
return {
"IP": host["ip_str"],
"Vulnerabilities": vulnerabilities
}
except shodan.exception.APIError as e:
print(f"无法扫描 {ip}: {e}")
return None
  • scan_ip(api, ip):这个函数是用来扫描单个 IP 地址的。
    • api.host(ip):通过 Shodan 客户端扫描指定 IP 地址,并返回该 IP 地址的详细信息。
    • host.get("vulns", []):获取该 IP 地址的漏洞信息。如果存在漏洞,返回这些漏洞;否则返回空列表 []
    • 如果扫描到漏洞,函数会返回一个包含漏洞信息的字典。
    • 如果扫描失败,返回 None

步骤 5:执行主逻辑

def main():
    try:
        # 初始化 Shodan 客户端
        api = shodan.Shodan(SHODAN_API_KEY)
        
        # 读取 IP 地址列表
        with open(input_file, "r") as file:
            ip_list = [line.strip() for line in file.readlines() if line.strip()]
        
        vulnerable_ips = []
        
        # 使用线程池并行扫描 IP
        with ThreadPoolExecutor(max_threads) as executor:
            futures = {executor.submit(scan_ip, api, ip): ip for ip in ip_list}
            
            for future in as_completed(futures):
                result = future.result()
                if result:
                    vulnerable_ips.append(result)
        
        # 保存存在漏洞的 IP 到文件
        with open(vulnerable_output_file, "w") as file:
            for item in vulnerable_ips:
                file.write(f"IP: {item['IP']}\nVulnerabilities: {item['Vulnerabilities']}\n\n")
        
        print(f"扫描完成,存在漏洞的 IP 已保存到 {vulnerable_output_file}")
    except Exception as e:
        print(f"发生错误: {e}")

步骤 5.1:初始化 Shodan 客户端

api = shodan.Shodan(SHODAN_API_KEY)
  • 使用你的 API 密钥初始化 Shodan 客户端。

步骤 5.2:读取 IP 地址列表

with open(input_file, “r”) as file:
ip_list = [line.strip() for line in file.readlines() if line.strip()]
  • 这里读取 ip_list.txt 文件中的所有 IP 地址,并去掉每行末尾的空格或换行符。

步骤 5.3:使用线程池并行扫描 IP 地址

with ThreadPoolExecutor(max_threads) as executor:
futures = {executor.submit(scan_ip, api, ip): ip for ip in ip_list}
  • ThreadPoolExecutor(max_threads):使用线程池来并行执行扫描任务,最多使用 max_threads 个线程。
  • executor.submit(scan_ip, api, ip):提交任务到线程池,任务是调用 scan_ip 函数并传入 Shodan 客户端和 IP 地址。
  • futures 是一个字典,记录了每个任务的未来对象(Future object)和对应的 IP 地址。

步骤 5.4:处理扫描结果

for future in as_completed(futures):
result = future.result()
if result:
vulnerable_ips.append(result)
  • as_completed(futures):当线程池中的任务完成时,as_completed() 会返回一个迭代器,按完成的顺序获取每个任务的结果。
  • future.result() 获取任务的返回结果。
  • 如果该 IP 地址存在漏洞,将其添加到 vulnerable_ips 列表中。

步骤 5.5:保存扫描结果到文件

with open(vulnerable_output_file, “w”) as file:
for item in vulnerable_ips:
file.write(f”IP: {item[‘IP’]}\nVulnerabilities: {item[‘Vulnerabilities’]}\n\n”)
  • 将扫描结果(包括 IP 地址和漏洞信息)写入到 vulnerable_ips.txt 文件中。

步骤 5.6:错误处理

except Exception as e:
print(f”发生错误: {e}”)
  • 如果在主程序中发生任何异常,捕获并输出错误信息。

步骤 6:运行代码

将上述代码保存为一个 Python 文件,例如 shodan_scan.py,然后运行:

python shodan_scan.py

步骤 7:查看输出

  • 如果扫描成功,存在漏洞的 IP 地址及漏洞信息会被保存到 vulnerable_ips.txt 文件中。
  • 你可以打开 vulnerable_ips.txt 文件查看扫描结果。

最后附上最终代码

代码功能如下

  • 读取一个包含 IP 地址的文件。
  • 对每个 IP 地址使用 Shodan 执行扫描,查看是否存在漏洞。
  • 使用并发(多线程)加速扫描过程。
  • 最后将扫描结果保存到文件。
import shodan
from concurrent.futures import ThreadPoolExecutor, as_completed
 
# 配置 Shodan API 密钥
SHODAN_API_KEY = "yIzCOHUZOh2HmwBXJjYRNuMFWG8kYbe5"
 
# 定义输入的 IP 列表文件和输出文件
input_file = "ip_list.txt"  # 包含要扫描的 IP 地址列表,每行一个 IP
vulnerable_output_file = "vulnerable_ips.txt"  # 保存存在漏洞的 IP 结果
max_threads = 20  # 最大线程数
 
def scan_ip(api, ip):
    """扫描单个 IP 地址并返回结果"""
    try:
        print(f"正在扫描 IP: {ip}")
        host = api.host(ip)
        
        vulnerabilities = host.get("vulns", [])
        if vulnerabilities:
            print(f"发现漏洞 IP: {ip},漏洞: {vulnerabilities}")
            return {
                "IP": host["ip_str"],
                "Vulnerabilities": vulnerabilities
            }
    except shodan.exception.APIError as e:
        print(f"无法扫描 {ip}: {e}")
    return None
 
def main():
    try:
        # 初始化 Shodan 客户端
        api = shodan.Shodan(SHODAN_API_KEY)
        
        # 读取 IP 地址列表
        with open(input_file, "r") as file:
            ip_list = [line.strip() for line in file.readlines() if line.strip()]
        
        vulnerable_ips = []
        
        # 使用线程池并行扫描 IP
        with ThreadPoolExecutor(max_threads) as executor:
            futures = {executor.submit(scan_ip, api, ip): ip for ip in ip_list}
            
            for future in as_completed(futures):
                result = future.result()
                if result:
                    vulnerable_ips.append(result)
        
        # 保存存在漏洞的 IP 到文件
        with open(vulnerable_output_file, "w") as file:
            for item in vulnerable_ips:
                file.write(f"IP: {item['IP']}\nVulnerabilities: {item['Vulnerabilities']}\n\n")
        
        print(f"扫描完成,存在漏洞的 IP 已保存到 {vulnerable_output_file}")
    except Exception as e:
        print(f"发生错误: {e}")
 
if __name__ == "__main__":
    main()

 

请登录后发表评论

    没有回复内容