并发打开 Shodan 搜索结果、指定的 IP、IP 范围、域名或文本文件中的 IP 列表,并打印页面的状态和标题(如果适用)。添加 -u 和 -p 选项可尝试登录页面,首先查找表单登录,如果失败则尝试 HTTP 基本认证。
使用 -f SEARCHSTRING 在 HTML 响应中查找特定字符串,以测试认证是否成功。将所有响应的设备记录到以 Shodan 搜索词或目标 IP/域名加 _results.txt 命名的文件中。搜索响应页面 HTML 时有一点需要注意:某些表单登录页面在认证请求后返回的是 JSON 对象响应,而不是登录后页面的 HTML 源码。在这种情况下,通常只需使用 -f "success" 即可判断是否成功。
请求的默认超时时间为 15 秒。默认并发发送 1000 个请求,可通过 -c 选项调整。需要注意的是,如果使用 Shodan 的免费 API 密钥,Shodan 仅允许获取第一页结果(100 台主机)。如果你拥有专业版 API 密钥,则可以使用 -n NUMBER_OF_PAGES 参数指定要测试的搜索结果页数。默认情况下仅检查第 1 页。
Python 2.7
现代 Linux
Shodan API 密钥(仅当指定 -s SEARCHTERM 参数时需要)
最简单的用法:
python device-pharmer.py -s 'dir-300' -a Wutc4c3T78gRIKeuLZesI8Mx2ddOiP4
使用 API 密钥 Wutc4c3T78gRIKeuLZesI8Mx2ddOiP4 在 Shodan 中搜索 "dir-300"。如果响应页面存在,则打印其 IP 和标题。
python device-pharmer.py -s 'dd-wrt' -a Wutc4c3T78gRIKeuLZesI8Mx2ddOiP4 -u admin -p password -n 5 -f ">Advanced Routing<" --proxy 123.12.12.123:8080 --timeout 30
使用给定的 API 密钥在 Shodan 中搜索 "dd-wrt",并尝试使用用户名 "admin" 和密码 "password" 登录结果。仅收集 Shodan 结果的前 5 页(500 台主机),并检查落地页的 HTML 是否包含字符串 ">Advanced Routing<"。如果找到该字符串,则在输出中打印 "* MATCH *" 以及页面的 IP 和标题,并记录日志。最后,为所有请求使用位于 123.12.12.123:8080 的 HTTP 代理,并将超时时间设置为 30 秒。
python device-pharmer.py -t 192.168.0-2.1-100 -c 100
将目标设为 192.168.0-2.1-100 是让脚本并发打开 192.168.0.1-101、192.168.1.1-101 和 192.168.2.1-101,并收集响应页面的状态和标题。-c 100 会将并发数限制为每次 100 个页面,因此该脚本将依次处理 3 组,每组 100 个 IP。由于脚本内的默认超时时间为 15 秒,完成大约需要 ~45 秒。
python device-pharmer.py -t www.reddit.com/login -ssl -u sirsmit418 -p whoopwhoop -f 'tattoos'
专门使用 HTTPS 尝试登录 www.reddit.com/login,用户名为 sirsmit418,密码为 whoopwhoop。在响应 HTML 中查找与已订阅 subreddit 相关的文本 "tattoos",以检查认证是否成功。
python device-pharmer.py --ipfile list_of_ips.txt
测试文本文件中的每个 IP,文件中的 IP 以换行符分隔。
-a APIKEY:使用此 API 密钥搜索 Shodan(仅在配合 -s 使用时才需要)
-c CONCURRENT:并发发送指定数量的请求;默认=1000
-f FINDTERMS:在每个响应的 HTML 中查找参数指定的字符串;匹配时打印并记录它
--ipfile IPTEXTFILE:测试指定文本文件中以换行符分隔的 IP 列表中的每个 IP
-n NUMPAGES:遍历指定数量的 Shodan 搜索结果页以收集 IP;每页 100 条结果
-p PASSWORD:尝试使用此密码登录
--proxy PROXY:使用此代理发起请求;要使用 HTTP Basic 登录代理,请使用类似 user:[email protected]:8080 的格式
-s SEARCHTERMS:在 Shodan 中搜索一个或多个词,打印每个 IP 地址以及页面是否返回响应,如果返回则打印响应页面的标题(跟随重定向)
-ssl:专门向所有目标发送 HTTPS 请求
-t IPADDRESS/DOMAIN/IPRANGE:尝试访问此域名、IP 或 IP 范围,而不是使用 Shodan 填充目标列表,并返回响应信息
--timeout TIMEOUT:设置每个 URI 的超时时间(秒);默认为 15
-u USERNAME:尝试使用此用户名登录
版权所有 (c) 2014, Dan McInerney 保留所有权利。
允许以源代码和二进制形式重新分发和使用,无论是否经过 修改,前提是满足以下条件:
本软件由版权所有者和贡献者"按原样"提供,不提供 任何明示或暗示的保证,包括但不限于对适销性和 特定用途适用性的暗示保证。在任何情况下, 均不对任何直接、间接、偶然、 特殊、惩戒性或后果性损害承担责任(包括但不限于 采购替代商品或服务;使用、数据或利润的损失; 或业务中断),无论其原因如何,也不论是基于 合同、严格责任或侵权行为(包括疏忽或其他方式) 的任何责任理论,即使已被告知发生此类损害的 可能性。