4 个版本

0.1.1 2024年4月7日
0.1.0 2024年4月7日
0.0.2 2023年1月28日
0.0.1 2023年1月25日

#612 in 网页编程

Download history 109/week @ 2024-03-09 5/week @ 2024-03-16 4/week @ 2024-03-30 201/week @ 2024-04-06 13/week @ 2024-04-13 1/week @ 2024-05-25

每月 161 次下载

MIT/Apache

39KB
968

Shodan-rs

使用 Rust 编写的 Shodan 客户端(如果还不清楚的话)。这个库变化很大,缺少许多组件。我建议等到 API 更稳定,并且达到 1.0.0 版本后再使用。这个库基于 tokio 提供任务运行时。

API 支持

官方 Shodan API 文档可以在 这里 找到。此客户端不支持整个 API,因为我只有一个具有 dev 计划的账户。您可以查看下方的支持表格。

使用方法

首先,您需要创建一个 ShodanClient。这需要一个从 shodan.io 获取的 API 密钥。一旦您获得了密钥,就可以像这样启动一个客户端

use shodan_client::*;

let client = ShodanClient::new(String::from("API-KEY-GOES-HERE"));

然后,您可以调用 Shodan API。例如,我们可以获取我们的 Shodan 账户详细信息

use shodan_client::*; // Include the trait the adds the account functionality

let account_details = client.get_account_profile().await.unwrap();
println!("Account Details: {:?}", account_details);

注意:这里的 unwrap() 忽略了可能发生的任何错误(例如:SSL 证书错误、连接问题等),或来自 Shodan API 的错误响应(例如:速率限制、计划限制或调用所需信用不足)。如果您不希望程序崩溃,应正确处理这些错误。这里省略了这些内容以简化说明。

API 支持

✔️ 表示对端点的完全支持。➗ 表示对端点的部分支持。空表示尚不支持该端点。

客户端目前仅支持 REST API,但我确实想最终添加对流式 API 的支持。

领域 API 动词 端点 支持
REST 搜索 GET /shodan/host/{ip}
REST 搜索 GET /shodan/host/count ✔️
REST 搜索 GET /shodan/host/search
REST 搜索 GET /shodan/host/search/facets ✔️
REST 搜索 GET /shodan/host/search/filters ✔️
REST 搜索 GET /shodan/host/search/tokens
REST 扫描 GET /shodan/ports ✔️
REST 扫描 GET /shodan/protocols ✔️
REST 扫描 POST /shodan/scan
REST 扫描 POST /shodan/scan/internet
REST 扫描 GET /shodan/scans
REST 扫描 GET /shodan/scan/{id}
REST 警报 POST /shodan/alert
REST 警报 GET /shodan/alert/{id}/info
REST 警报 GET /shodan/alert/{id}/info
REST 警报 DELETE /shodan/alert/{id}
REST 警报 POST /shodan/alert/{id}
REST 警报 GET /shodan/alert/info
REST 警报 GET /shodan/alert/triggers
REST 警报 PUT /shodan/alert/{id}/trigger/{trigger}
REST 警报 DELETE /shodan/alert/{id}/trigger/{trigger}
REST 警报 PUT /shodan/alert/{id}/trigger/{trigger}/ignore/{service}
REST 警报 DELETE /shodan/alert/{id}/trigger/{trigger}/ignore/{service}
REST 警报 PUT /shodan/alert/{id}/notifier/{notifier_id}
REST 警报 DELETE /shodan/alert/{id}/notifier/{notifier_id}
REST 通知器 GET /notifier
REST 通知器 GET /notifier/provider
REST 通知器 POST /notifier
REST 通知器 DELETE /notifier/{id}
REST 通知器 GET /notifier/{id}
REST 通知器 PUT /notifier/{id}
REST 目录 GET /shodan/query ✔️
REST 目录 GET /shodan/query/search ✔️
REST 目录 GET /shodan/query/tags ✔️
REST 批量 GET /shodan/data
REST 批量 GET /shodan/data/{dataset}
REST 组织 GET /org
REST 组织 PUT /org/member/{user}
REST 组织 DELETE /org/member/{user}
REST 账户 GET /account/profile ✔️
REST DNS GET /dns/domain/{domain} ✔️
REST DNS GET /dns/resolve ✔️
REST DNS GET /dns/reverse ✔️
REST 工具 GET /tools/httpheaders ✔️
REST 工具 GET /tools/myip ✔️
REST API 状态 GET /api-info ✔️

测试

客户端包含一组测试,这些测试调用实际的 Shodan API(目前是这样的)。一旦所有功能都经过验证并正常工作,模拟响应会更有意义,这样测试就会变得不那么不可靠。在此之前,运行测试需要 Shodan API 密钥。您可以通过设置 SHODAN_TEST_KEY 环境变量来向测试套件提供该密钥。测试套件中的某些端点确实使用了 API 信用额度。在这种情况下,运行测试并非免费。另一个需要注意的是,测试没有超时限制,因此您很可能会遇到来自 Shodan API 的速率限制错误。

示例调用

$ SHODAN_TEST_KEY=<API-KEY-GOES-HERE> cargo test

依赖

约 6-18MB
约 273K SLoC