漏洞挖掘 | 渗透测试之批量刷洞技巧
漏洞挖掘 | 渗透测试之批量刷洞技巧
soufaker 神农Sec 2025-01-26 01:00
扫码加圈子
获内部资料
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。
不定期分享各种好玩的项目及好用的工具,欢迎关注。
原文链接: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 jsonimport timeimport requestsrequests.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 = "\033[32m[info]\033[0m" self.error_color = "\033[31m[Error]\033[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 \033[34m" + str(self.target_list_len) + "\033[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: returnTrueif __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/17import requestspy_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('无法连接') continueprint(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页面那的环境太难搞了,所以采用这种方式,然后配合天眼查寻该系统提示信息,如果能唯一确认那就可以证明归属啦:
我们是神农安全,
点赞 + 在看
铁铁们点起来,最后祝大家都能心想事成、发大财、行大运。
内部圈子介绍
圈子专注于更新
src/红蓝攻防
相关:
1、维护更新src专项漏洞知识库,包含原理、挖掘技巧、实战案例
2、知识星球专属微信“小圈子交流群”
3、微信小群一起挖洞
4、内部团队专属EDUSRC证书站漏洞报告
5、分享src优质视频课程(企业src/EDUSRC/红蓝队攻防)
6、分享src挖掘技巧tips
7、不定期有众测、渗透测试项目(一起挣钱)
8、不定期有工作招聘内推(工作/护网内推)
9、送全国职业技能大赛环境+WP解析(比赛拿奖)
欢迎加入星球一起交流,券后价仅40元!!! 即将满200人涨价
长期更新,更多的0day/1day漏洞POC/EXP