免责声明,如涉及侵权马上删除文章。
笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。
本文章涉及分享的网页链接均为开源项目地址,所有涉及工具、教程只可安全测试自用,请勿对任何网站进行入侵攻击,小日子的除外……
Shodan简介
什么是 Shodan?
想象一下,互联网就像一个巨大的城市,里面有无数的“建筑物”(这些建筑物就是我们在网上访问的网站、设备、服务器等)。而 Shodan 不是像谷歌那样只关注这些“建筑物”外面的样子(即网页),而是它能“穿透墙壁”进去,直接看到这些“建筑物”内部的内容。例如,它能知道一个路由器是否有默认密码,或者一个摄像头的控制面板是不是暴露在互联网中。
Shodan 如何工作?
Shodan 像一个“侦察兵”,不停地在全球范围内扫描、检查所有连接到互联网的设备。它通过发送特定的请求(类似访问一个网页的过程),但不同的是,它并不是查看网页内容,而是查看设备的响应。例如,当你访问一个网站时,浏览器会向网站的服务器发送请求,服务器返回网页内容。Shodan 也发送类似的请求,但它是去检查设备的“服务”是否正常,并且收集关于设备的信息(比如设备的类型、软件版本、是否有安全问题等)。
Shodan 搜索的对象是什么?
Shodan 不仅仅能发现常见的服务器和网站,它可以扫描到几乎所有连接到互联网的设备。比如:
- 摄像头:很多家庭、商店、工厂的摄像头都连接到互联网,有些甚至没有密码保护。Shodan 能发现这些摄像头,并且显示它们的IP地址、位置等信息。
- 路由器和交换机:这些是家里或公司内网连接的设备。Shodan 会扫描它们是否有默认密码或其他安全漏洞。
- 工业设备:像电厂、工厂、甚至医院的某些设备(比如自动化控制系统)都可以通过 Shodan 被扫描到。
- 家用设备:很多智能家居设备(比如冰箱、空调、甚至智能灯泡)通过互联网连接,Shodan 可以发现它们并列出相关信息。
Shodan 能找到什么?
通过 Shodan,攻击者或安全研究人员能够看到很多设备的开放端口和服务。例如,一个打印机可能会暴露其管理界面,甚至没有设置密码。通过这些信息,Shodan 能帮助用户快速发现设备的潜在问题。举个简单的例子,如果你用 Shodan 搜索“默认密码”,你可能会发现大量没有修改密码的设备(如“admin”和“1234”这样的组合)。
Shodan 的危险性
为什么说 Shodan 可怕呢?因为它能够揭示互联网上许多设备的脆弱性,尤其是那些没有进行适当安全配置的设备。很多设备默认的用户名和密码没有改动,Shodan 就能轻松找到它们并展示出来。这就像是把家门钥匙丢在街上,任何路过的人都能轻松拿到并进入。对攻击者而言,Shodan 就是一个宝藏库,他们通过它可以发现网络中大量的“低挂的果实”——那些容易被攻击的设备。
如何使用Shodan
网站访问
访问网站,如果你还没有账户,可以注册一个免费账号。注册后,你可以保存搜索结果,创建监控等。
基本搜索方法
-
搜索所有摄像头: 输入
camera
或webcam
,Shodan 会列出互联网上暴露的摄像头。 -
搜索默认密码设备: 输入
default password
或admin
,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 会列出互联网上暴露的摄像头。
页面顶部导航栏
- 探讨:点击进入 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 个设备与关键词相关。
- 组织名称:显示与这些设备关联的公司、组织或互联网服务提供商(ISP)的名称。
- 热门产品(Top Products)
- 产品名称:显示设备所使用的硬件或软件的品牌或型号。
- 比如搜索 “webcam” 时,可能会看到
IP Webcam
或D-Link Camera
。
- 比如搜索 “webcam” 时,可能会看到
- 数量:显示使用该产品的设备数量。
- 产品名称:显示设备所使用的硬件或软件的品牌或型号。
- 热门操作系统(Top Operating Systems)
- 操作系统名称:比如 Linux、Windows Server、Embedded OS 等。
- 数量:显示使用该操作系统的设备数量。
搜索结果列表
搜索结果列表是 Shodan 的核心内容,包含了每个设备的信息。每一行代表一个搜索到的设备,以下是重要内容的解析:
设备条目结构
每个设备条目包括以下信息:
-
IP 地址:
比如第一个结果显示:213.184.245.62这是设备在互联网上的唯一地址,类似于设备的“家”地址。
-
地理位置:
设备的国家或地区,比如:白俄罗斯表示该设备位于俄罗斯境内。
-
设备响应的服务或协议:
比如:HTTP/1.1 401 Unauthorized这表示该设备的服务类型是 HTTP(通常是 Web 管理页面),返回状态是
401 Unauthorized
,即需要认证(例如用户名和密码)才能访问。 -
其他详细信息:
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),但某些设备可能未设置强密码,存在安全风险。
- 你可以进一步分析具体设备的厂商、版本和地理位置等信息。
搜索结果分析
左侧 “常规信息” 区域
这个部分展示了与目标 IP 地址相关的基本信息,包括域名、地理位置、组织等内容。
- IP 地址:这是目标设备的唯一标识,比如
216.137.193.126
是当前查询的 IP 地址。 - 主机名:
126-193-137-216.static.mtaonline.net
,显示设备的主机名,这通常是由网络服务提供商分配的。 - 域(Domain):
MTAONLINE.NET
,指设备所属的网络域名,通常由设备连接的服务提供商或网络域分配。 - 国家和城市:显示设备所在的地理位置,比如这里显示 “美国,帕尔默(Palmer)”。
- 组织(Organization):标明该设备的运营者或关联组织,比如这里的 “马塔努斯卡电信协会”。
- 国际互联网服务提供商(ISP):说明提供互联网服务的具体公司,和组织类似。
- ASN:
AS11090
,这是设备所属的自治系统号(Autonomous System Number),是网络提供商在全球的标识号,用于互联网路由。
中间 “开放端口” 区域
展示了该 IP 地址开放的端口号,这些端口代表了设备对外提供的服务。
- 8080、8083、8086:这些是开放的端口号,分别代表设备的不同服务。常见端口的作用:
- 8080:通常用于 HTTP 协议,是 Web 服务的常用端口。
- 8083、8086:这些端口也可能是 Web 服务,或其他自定义服务。
右侧 “端口详情” 区域
端口 8080
- 标题:网络摄像头 7 httpd
- 表明这是一个摄像头设备,运行的 HTTP 服务为
httpd
。
- 表明这是一个摄像头设备,运行的 HTTP 服务为
- HTTP 响应信息:
- 状态码:
HTTP/1.1 200 OK
,表示服务器正常返回响应。 - Content-Type:
text/html; charset=utf-8
,说明该设备返回的是网页内容,编码为 UTF-8。 - Content-Length:
2204
,表示网页内容的长度为 2204 字节。 - Cache-Control:
no-cache, must revalidate
,设备配置的缓存策略,不允许缓存。 - Server:
webcam 7
,表明设备的服务软件是 “webcam 7”。
- 状态码:
端口 8083
- 标题:网络摄像头 XP httpd 5
- 表明这是另一个摄像头设备,运行的 HTTP 服务为
httpd
,版本是 XP 5。
- 表明这是另一个摄像头设备,运行的 HTTP 服务为
- HTTP 响应信息:
- 状态码:
HTTP/1.1 200 OK
,表示服务器正常返回响应。 - Content-Type:
text/html; charset=utf-8
,说明该设备返回的是网页内容。 - Content-Length:
2207
,表示网页内容长度为 2207 字节。 - Cache-Control:同样配置为
no-cache
。 - Server:
webcamXP 5
,表明设备的服务软件是 “webcamXP 5”。
- 状态码:
用途:
- 通过这些信息,可以了解设备暴露的服务、软件版本等。
- 攻击者可以根据设备返回的服务信息,查找已知的漏洞(比如针对 webcamXP 的漏洞)。
地图背景
图片顶部显示了一个地图区域,用于标注设备的地理位置。
- 显示设备大概的位置(根据 IP 地址推测),这里显示为美国帕尔默附近。
- 地图信息通过 OpenStreetMap 提供。
用途:
- 用于进一步确认设备的物理位置。
- 帮助判断设备的真实所有者,比如是否属于某个公司、机构或个人。
如果网站上有漏洞还会显示漏洞的编号,以及WebTechnologies 的组成
检测蜜罐
什么是蜜罐?
蜜罐(Honeypot)是一种网络安全防护技术,指的是故意设置的伪装目标(比如服务器、设备、服务等),目的是吸引攻击者并监控他们的行为。蜜罐看起来像是一个正常的系统,但实际上它被专门设计为一个诱饵,用来:
- 记录和分析攻击者的行为。
- 收集恶意软件样本。
- 提高网络防御的效果。
蜜罐通常不会真正存储重要的数据,而是通过伪装的漏洞或服务引诱攻击者,让他们以为自己攻陷了一个目标系统。
蜜罐的工作原理
- 伪装为真实目标:蜜罐可以模拟网站、数据库、IoT设备、企业服务器等,模仿它们的工作状态。
- 引诱攻击者:它可能会故意暴露一些看似“存在漏洞”的端口或服务,例如开放一个旧版本的 FTP 服务。
- 记录攻击行为:一旦攻击者开始对蜜罐进行攻击,系统会记录攻击者的行为,包括攻击工具、入侵路径、执行的命令等。
- 无害化的隔离:蜜罐和真实系统隔离,攻击者实际上无法对真实环境造成任何威胁。
蜜罐的类型
-
低交互蜜罐:
- 模拟简单的服务或端口(如伪装为开放的 SSH 或 HTTP)。
- 目标是引诱扫描器或简单的自动化攻击工具。
- 简单且易于部署,但只能收集有限的信息。
-
高交互蜜罐:
- 模拟一个完整的系统(如一台真实的服务器)。
- 攻击者可以执行更复杂的操作,甚至获得“控制权”。
- 能收集详细的攻击过程,但部署和维护复杂。
-
特定应用蜜罐:
- 针对特定的应用程序或设备,比如物联网设备、ATM机、数据库等。
- 用于研究针对特定领域的攻击。
为什么要检查是否为蜜罐?
对于渗透测试人员或网络攻击者而言,蜜罐是一种 反制手段,如果不小心攻击了蜜罐,可能会暴露以下信息:
-
暴露真实身份
- 蜜罐会记录攻击者的 IP 地址、地理位置等信息,可能会被网络管理员追踪或报警。
- 即使使用代理或 VPN,也可能因失误泄露真实信息。
-
暴露攻击手法
- 攻击者使用的工具、脚本、漏洞利用手法可能会被记录,安全研究人员可以利用这些数据加强防御。
-
浪费时间
- 蜜罐不包含真正有价值的数据,对蜜罐进行攻击只会浪费时间和资源。
- 攻击蜜罐后,可能会被标记为高风险来源,进一步攻击目标时会被防火墙拦截。
-
法律后果
- 蜜罐可以作为法律证据,证明有人试图入侵网络。如果攻击者被追踪到,可能面临法律责任。
monitor模块
monitor
模块允许你监控某个目标或一组目标,检测其在互联网上的变化。例如,你可以设置监控某个 IP 地址是否有新的开放端口,或者检测某个特定服务是否突然出现或消失。Shodan 通过扫描互联网来提供这些信息,从而让你及时了解目标设备的动态变化。
查看API的方法
在账户处可以找到自己的API
本地使用
kali安装shodan
(1)kali安装shodan
git clone
(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)
使用时任意位置都可以
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 地址
说明:显示当前网络的出口 IP 地址。
下载结果
说明:下载与特定漏洞相关的设备数据(限制100条),保存到指定路径。
解析文件
说明:解析下载的文件,仅提取设备的 IP 地址。
搜索未授权访问的设备
说明:查询 VNC 服务中未授权访问的设备,仅返回 IP 地址,限制为 10 条结果。
复杂组合搜索示例
查询中国深圳运行 RDP 服务(3389端口)的设备信息,返回 IP 地址并限制为10条结果:
解释:
--color
:高亮显示结果。--limit 10
:限制返回 10 条结果。--fields ip_str
:过滤信息,仅返回 IP 地址。port:3389
:查询开放 RDP 服务的设备。country:CN
:指定中国。city:Shenzhen
:过滤城市为深圳。
高级统计分析示例
按国家统计运行 Apache 的设备数量
说明:统计全球范围内运行 Apache 服务的设备数量,并按国家分类。
按端口统计设备分布
说明:统计中国范围内设备开放的端口分布情况。
查询特定漏洞的影响范围
说明:统计受该漏洞影响的设备分布情况,并按国家分类。
提示
尽量每个查询语句都带上–limit和–fields ip_str,port 之类的便于查询后的观察
没用的
用了的
利用python调用shodan
步骤 1:安装 Shodan 模块
在使用 Python 调用 Shodan 模块之前,首先你需要安装 Shodan 的 Python 客户端库。
安装 Shodan 模块: 在命令行或终端中输入以下命令来安装 Shodan 模块:
步骤 2:获取 Shodan API 密钥
- 首先你需要在 上注册账号。
- 登录后,点击右上角的 Account,进入 API 页面,获取你的 API 密钥(一个由字母和数字组成的字符串)。
步骤 3:
导入必要的库
from concurrent.futures import ThreadPoolExecutor, as_completed
shodan
:这是 Shodan 官方提供的 Python 客户端,用于调用 Shodan API。ThreadPoolExecutor
和as_completed
:用于多线程并行处理扫描任务,提升扫描效率。
配置 Shodan API 密钥
- 在
SHODAN_API_KEY
中替换成你从 Shodan 获取到的 API 密钥。
定义输入文件和输出文件
vulnerable_output_file = “vulnerable_ips.txt” # 保存存在漏洞的 IP 结果
input_file
:是一个包含待扫描 IP 地址的文件,每行一个 IP 地址。你需要创建一个名为ip_list.txt
的文件,并在里面列出你想扫描的 IP 地址。vulnerable_output_file
:是扫描结果的输出文件,保存所有存在漏洞的 IP 地址及漏洞信息。
设置线程池的最大线程数
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 客户端。
步骤 5.2:读取 IP 地址列表
ip_list = [line.strip() for line in file.readlines() if line.strip()]
- 这里读取
ip_list.txt
文件中的所有 IP 地址,并去掉每行末尾的空格或换行符。
步骤 5.3:使用线程池并行扫描 IP 地址
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:处理扫描结果
result = future.result()
if result:
vulnerable_ips.append(result)
as_completed(futures)
:当线程池中的任务完成时,as_completed()
会返回一个迭代器,按完成的顺序获取每个任务的结果。future.result()
获取任务的返回结果。- 如果该 IP 地址存在漏洞,将其添加到
vulnerable_ips
列表中。
步骤 5.5:保存扫描结果到文件
for item in vulnerable_ips:
file.write(f”IP: {item[‘IP’]}\nVulnerabilities: {item[‘Vulnerabilities’]}\n\n”)
- 将扫描结果(包括 IP 地址和漏洞信息)写入到
vulnerable_ips.txt
文件中。
步骤 5.6:错误处理
print(f”发生错误: {e}”)
- 如果在主程序中发生任何异常,捕获并输出错误信息。
步骤 6:运行代码
将上述代码保存为一个 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()
没有回复内容