用途
Shodan 侦察与渗透测试技能用于在渗透测试过程中,系统化地利用 Shodan 作为侦察工具。其主要目标是发现暴露的服务、存在漏洞的系统和 IoT 设备,覆盖 Shodan 网页界面、命令行界面(CLI)、REST API、搜索过滤器、按需扫描以及网络监控能力。
输入与前置条件
- Shodan 账户:在 shodan.io 注册的免费或付费账户
- API 密钥:从 Shodan 账户面板获取
- 目标信息:需要调查的 IP 地址、域名或网络范围
- Shodan CLI:已安装基于 Python 的命令行工具
- 授权:对目标网络进行侦察的书面许可
输出与交付物
- 资产清单:发现的主机、端口和服务列表
- 漏洞报告:识别出的 CVE 和暴露的易受攻击服务
- Banner 数据:揭示软件版本的服务横幅
- 网络映射:资产的地理和组织分布
- 截图库:对暴露界面的可视化侦察
- 导出数据:用于进一步分析的 JSON/CSV 文件
主要能力与使用方式
安装与配置
使用 pip 安装:pip install shodan;或使用 easy_install:easy_install shodan;在 BlackArch/Arch Linux 上:sudo pacman -S python-shodan。
初始化 API 密钥:shodan init YOUR_API_KEY,随后用 shodan info 验证。
检查账户状态:shodan info(查看积分和计划信息)、shodan myip(查看外部 IP)、shodan version(查看 CLI 版本)。
基础主机侦察
查询单个主机:shodan host 1.1.1.1,可获取主机名、国家、组织、开放端口等信息。
蜜罐检测:shodan honeyscore 192.168.1.100,返回是否为蜜罐的概率分数。
搜索查询
基础搜索(免费,不消耗积分):shodan search apache;可指定输出字段:shodan search --fields ip_str,port,os smb。
过滤搜索(消耗 1 积分):如 shodan search product:mongodb 或组合过滤器 shodan search product:nginx country:US city:"New York"。
计数结果(不消耗积分):shodan count openssh。
下载结果:shodan download results.json.gz "apache country:US";可指定数量 --limit 5000 或全部 --limit -1。
解析下载数据:shodan parse --fields ip_str,port,hostnames results.json.gz;可按条件过滤、导出为 CSV。
搜索过滤器参考
- 网络:ip、net(CIDR)、hostname、port、asn
- 地理:country、city、state、postal、geo
- 组织:org、isp
- 服务/产品:product、version、os、http.title、http.html、http.status、ssl.cert.subject.cn、ssl
- 漏洞:vuln:CVE-xxxx、has_vuln
- 截图:has_screenshot、screenshot.label
按需扫描
提交扫描:shodan scan submit 192.168.1.100(每个 IP 消耗 1 扫描积分),可加 --verbose 或 --filename 保存结果。
监控扫描状态:shodan scan list、shodan scan status SCAN_ID,之后用 shodan download --limit -1 results.json.gz scan:SCAN_ID 下载结果。查看可用扫描协议:shodan scan protocols。
统计与分析
获取搜索统计:shodan stats nginx;自定义 facets:shodan stats --facets domain,port,asn --limit 5 nginx;保存为 CSV:shodan stats --facets country,org -O stats.csv apache。
网络监控
在 Web 界面设置警报:进入 Monitor Dashboard,添加 IP、范围或域名,配置通知服务(邮件、Slack、webhook),选择触发事件(新服务、漏洞等),在仪表板查看暴露的服务。
REST API 与 Python 库
直接 API 调用示例:
curl -s "https://api.shodan.io/api-info?key=YOUR_KEY" | jq
curl -s "https://api.shodan.io/shodan/host/1.1.1.1?key=YOUR_KEY" | jq
curl -s "https://api.shodan.io/shodan/host/search?key=YOUR_KEY&query=apache" | jq
Python 库用法:初始化 shodan.Shodan('YOUR_API_KEY'),调用 api.search('apache') 获取结果,api.host('1.1.1.1') 获取主机详情。
常用查询与命令速查
- 查找网络摄像头:
webcam has_screenshot:true - MongoDB 数据库:
product:mongodb - Redis 服务器:
product:redis - Elasticsearch:
product:elastic port:9200 - 易受攻击的 RDP:
port:3389 vuln:CVE-2019-0708 - 工业系统:
port:502 modbus - 暴露的 Docker API:
port:2375 product:docker - SSL 证书搜索:
ssl.cert.subject.cn:*.target.com - 组织侦察:
org:"Company Name"
CLI 积分消耗:shodan init、shodan info、shodan myip、shodan host、shodan count、shodan honeyscore 消耗 0 积分;基础搜索(无过滤器)消耗 0,过滤搜索每查询消耗 1;下载每 100 条结果消耗 1 积分;shodan stats 消耗 1 积分;shodan scan submit 每个 IP 消耗 1 扫描积分。
适用场景
- 组织资产侦察:使用 org 过滤器发现目标组织的主机并统计基础设施
- 漏洞服务发现:通过 vuln 过滤器定位存在特定 CVE 的主机
- IoT 设备发现:查找暴露的摄像头、工业控制系统、打印机、智能家居设备等
- SSL/TLS 证书分析:查找特定证书、过期证书或自签名证书
- 网络范围评估:对 CIDR 网段进行搜索、统计和导出
- 通过 Python 脚本自动化侦察流程
限制与注意事项
- 速率限制:每秒 1 个请求
- 扫描结果为异步,不会立即返回
- 非企业版 24 小时内不能重复扫描同一 IP
- 免费账户积分有限,部分数据需要付费订阅
- 数据新鲜度:Shodan 持续爬取,但数据可能已有数天或数周;按需扫描提供当前数据但消耗积分;历史数据需付费计划
- 法律要求:仅对授权目标进行侦察;被动侦察通常合法但需确认司法管辖;主动扫描(scan submit)需要授权;记录所有侦察活动
故障排查
- 未配置 API 密钥:运行
shodan init YOUR_API_KEY并用shodan info验证 - 查询积分耗尽:使用无过滤器查询、等待重置或升级账户
- 主机最近已爬取:24 小时内不能重扫,可先用
shodan host IP查看现有数据或等待 - 速率超限:在 API 请求间添加
time.sleep(1) - 搜索结果为空:检查语法,短语使用引号如
org:"Company Name",并放宽条件 - 下载文件无法解析:用
gunzip -t file.gz验证,重新下载并指定--limit