漏洞猎人赏金笔记-如何编写Bug Bounty自动化脚本

本文涉及的产品
.cn 域名,1个 12个月
云解析 DNS,旗舰版 1个月
云解析DNS,个人版 1个月
简介: 前言本文原文作者为@pry0cc,本文主要是对原文相关内容的提炼以及笔记,出于易读性考虑,笔者对很多地方做了一定量的注释或者删改(因为原文中的脚本存在一定问题)。本文主要讲解的是经典的自动化信息搜集以及数据处理和漏洞扫描的流程.



前言


本文原文作者为@pry0cc,本文主要是对原文相关内容的提炼以及笔记,出于易读性考虑,笔者对很多地方做了一定量的注释或者删改(因为原文中的脚本存在一定问题)。

本文主要讲解的是经典的自动化信息搜集以及数据处理和漏洞扫描的流程.


正文


主体逻辑


脚本的主要逻辑如下:

  • 设置变量,检查范围目录(scope directory)是否存在,而后读取
  • 创建目录,例如:每次扫描创建扫描目录
  • 扫描主体逻辑(重点)
  • 计算扫描所需的时间
  • 通知用户扫描已经完成

下面来看一下(注意:原文中的脚本有点问题,思路是没毛病的,笔者这里做了些修改):

scan.sh

#!/bin/bash
# 设置变量
id="$1"
ppath="$(pwd)"
scope_path="$ppath/scope/$id"
timestamp="$(date +%s)"
scan_path="$ppath/scans/$id-$timestamp"
# 检查scope_path是否存在
if [ ! -d "$scope_path" ]; then
  echo "Path doesn't exist"
  echo 1
fi
mkdir -p "$scan_path" && 
cd "$scan_path"
# 开始 scan
echo "starting scan:"
mkdir -p "$scope_path"  &&
touch "$scope_path/roots.txt" &&
echo "$1" >> "$scope_path/roots.txt"
cat "$scope_path/roots.txt"
cp -v "$scope_path/roots.txt" "$scan_path/roots.txt"
sleep 3
## 添加扫描逻辑
# 扫描 时间
end_time=$(date +%s)
seconds="$(expr $end_time - $timestamp)"
time=""
if [[ "$seconds" -gt 59 ]];
then
  minutes=$(expr $seconds / 60)
  time="$minutes minutes"
else
  time="$seconds seconds"
fi
echo "Scan $id took $time"

1.png

资产发现

根域名


确定范围内的公司,获取尽可能多的根域名,这里可以用whoxy.com(吐槽一下,这类网站大多需要付费,和撒旦,fofa一样)


Censys/Shodan


利用Censys或Shodan发现现有DNS没有记录的IP地址,对这些IP进行反向DNS查询,看看你是否能确定IP、ASN、根域名或其他未链接的但是是公司拥有的资产


子域名枚举


收集完根域名之后,进行子域枚举


DNS 暴力破解

预备知识:

DNS AAAA记录:将一个域名或子域名映射到IPv6

DNS A记录:将一个域名或子域名映射到IPv4

注意点:使用A记录,可以为同一个域名使用几个DNS AAAA记录来实现冗余。几个名字可以翻译成互联网上的同一个地址。在这种情况下,每个人都需要有自己的AAAA记录,指向同一个IP地址。

这里首选的工具是 puredns 和 shuffledns

这里需要注意的是:安装massdns之后才能使用shuffledns,而要使 massdns 正常运行,必须有两个字典:

  • 用于DNS暴力破解的字典
  • 解析器(resolvers)字典

下面继续扩展扫描脚本:

##执行扫描
echo "starting scan:"
cat "$scope_path/roots.txt"
cp -v "$scope_path/roots.txt" "$scan_path/roots.txt"
cat "$scan_path/roots.txt" | subfinder | anew subs.txt
cat "$scan_path/roots.txt" | shuffledns -w "$ppath/lists/pry-dns.txt" -r "$ppath/lists/resolvers.txt" | anew subs.txt

测试一下:

./scan.sh amazon.com

得到一个subs.txt文件,里面包含了28711个子域名;

这里需要注意泛解析问题(wildcard DNS records)

何为泛解析?

利用通配符 * (星号)来做次级域名以实现所有的次级域名均指向同一IP地址

举个例子:

例如域名是abc.com

做一个*.abc.com的次级域名A记录指向111.111.111.111,那么生效后当访问者无论是输入“123.abc.com”还是“123.123.abc.com”甚至可以是“!@#..12345.ww.a.abc.com”这样的 任意字符均可以指向到111.111.111.111这个IP地址。

泛域名解析的用途:

1.可以让域名支持无限的子域名(这也是泛域名解析最大的用途);2.防止用户错误输入导致的网站不能访问的问题;

3.可以让直接输入网址登陆网站的用户输入简洁的网址即可访问网站;

泛域名在实际使用中作用是非常广泛的,比如实现无限二级域名功能,提供免费的url转发,在IDC部门实现自动分配免费网址,在大型企业中实现网址分类管理等等,都发挥了巨大的作

泛解析问题可能会导致误报或导致我们发现实际上不存在的子域,从而可能浪费我们的时间。为了解决这个问题,我们可以使用Puredns

puredns resolve subs.txt -r path/lists/resolvers.txt -w resolved.txt


发现了一个根域名被泛解析(*.signon.aws.amazon.com),最后将上面发现的28711个子域名减少到12039个!

继续添加一些被动源,扫描脚本变为如下:


##执行扫描
echo "starting scan:"
cat "$scope_path/roots.txt"
cp -v "$scope_path/roots.txt" "$scan_path/roots.txt"
## DNS 枚举-子域名暴力破解
cat "$scan_path/roots.txt" | haktrails subdomains | anew subs.txt | wc -l
cat "$scan_path/roots.txt" | subfinder | anew subs.txt | wc -l
cat "$scan_path/roots.txt" | shuffledns -w "$ppath/lists/pry-dns.txt" -r "$ppath/lists/resolvers.txt" | anew subs.txt | wc -l
## DNS泛解析对抗
puredns resolve "$scan_path/subs.txt" -r "$ppath/lists/resolvers.txt" -w "$scan_path/resolved.txt" | wc -l
dnsx -l "$scan_path/resolved.txt" -json -o "$scan_path/dns.json" | jq -r '.a?[]?' | anew "$scan_path/ips.txt" | wc -l

到目前为止一共生成了以下文件:

  • dns.json
  • ips.txt
  • resolved.txt
  • roots.txt
  • subs.txt


21.png

HTTP服务枚举

下面利用nmap来扫描前面发现的ip(主要是ips.txt)

nmap -T4 -vv -il "$scan_path/ips.txt" --top-ports 3000 -n --open -oX "$scan_path/nmap.xml"

而后利用httpx这个工具来发现HTTP服务器(在此之前用tew这个工具对输出的xml进行文件格式转换)

tew -x nmap.xml
tew -x nmap.xml | httpx

继续:

tew -x nmap.xml -dnsx dns.json —vhost | httpx -json -o http.json

上面这一行命令的意思

对DNSx JSON输出进行关联,将DNSx输出中的主机名解析为Nmap XML输出文件中的IP地址和开放端口

22.png

最后将输出的格式改变一下:

cat http.json | jq -r ‘.url’ | sed -e ‘s/:80$//g’ -e ‘s/:443$//g’ | anew http.txt

使用 sed 删除 80 和 443 端口,因为这可能会影响某些工具

现在来看一看扫描脚本:

##执行扫描
echo "starting scan:"
cat "$scope_path/roots.txt"
cp -v "$scope_path/roots.txt" "$scan_path/roots.txt"
## DNS 枚举-子域名暴力破解
cat "$scan_path/roots.txt" | haktrails subdomains | anew subs.txt | wc -l
cat "$scan_path/roots.txt" | subfinder | anew subs.txt | wc -l
cat "$scan_path/roots.txt" | shuffledns -w "$ppath/lists/pry-dns.txt" -r "$ppath/lists/resolvers.txt" | anew subs.txt | wc -l
## DNS泛解析对抗
puredns resolve "$scan_path/subs.txt" -r "$ppath/lists/resolvers.txt" -w "$scan_path/resolved.txt" | wc -l
dnsx -l "$scan_path/resolved.txt" -json -o "$scan_path/dns.json" | jq -r '.a?[]?' | anew "$scan_path/ips.txt" | wc -l
## 端口扫描与http服务发现
nmap -T4 -vv -il "$scan_path/ips.txt" --top-ports 3000 -n --open -oX "$scan_path/nmap.xml"
tew -x "$scan_path/nmap.xml" -dnsx "$scan_path/dns.json" --vhost -o "$scan_path/hostport.txt" | httpx -json -o "$scan_path/http.json"
cat "$scan_path/http.json" | jq -r '.url' | sed -e 's/:80$//g' -e 's/:443$//g' | sort -u > "$scan_path/http.txt"


捕获HTTP响应

对上面的脚本进行简单修改:

tew -x "$scan_path/nmap.xml" -dnsx "$scan_path/dns.json" --vhost -o "$scan_path/hostport.txt" | httpx -sr -srd responses

responses为新创建的目录

23.png

看一下这些文件的内部,可以看到包括响应头在内的所有内容。

24.png

更新脚本之后:

##执行扫描
echo "starting scan:"
cat "$scope_path/roots.txt"
cp -v "$scope_path/roots.txt" "$scan_path/roots.txt"
## DNS 枚举-子域名暴力破解
cat "$scan_path/roots.txt" | haktrails subdomains | anew subs.txt | wc -l
cat "$scan_path/roots.txt" | subfinder | anew subs.txt | wc -l
cat "$scan_path/roots.txt" | shuffledns -w "$ppath/lists/pry-dns.txt" -r "$ppath/lists/resolvers.txt" | anew subs.txt | wc -l
## DNS泛解析对抗
puredns resolve "$scan_path/subs.txt" -r "$ppath/lists/resolvers.txt" -w "$scan_path/resolved.txt" | wc -l
dnsx -l "$scan_path/resolved.txt" -json -o "$scan_path/dns.json" | jq -r '.a?[]?' | anew "$scan_path/ips.txt" | wc -l
## 端口扫描与http服务发现
nmap -T4 -vv -il "$scan_path/ips.txt" --top-ports 3000 -n --open -oX "$scan_path/nmap.xml"
tew -x "$scan_path/nmap.xml" -dnsx "$scan_path/dns.json" --vhost -o "$scan_path/hostport.txt" | httpx -sr -srd "$scan_path/responses" -json -o "$scan_path/http.json"
cat "$scan_path/http.json" | jq -r '.url' | sed -e 's/:80$//g' -e 's/:443$//g' | sort -u > "$scan_path/http.txt"
## 爬虫
gospider -S "$scan_path/http.txt" --json | grep “{” | jq -r '.output?' | tee "$scan_path/crawl.txt"

提取JS文件

这一部分主要提取js文件:

cat crawl.txt | grep “\.js” | httpx -sr -srd js

25.png

脚本更新如下:

##执行扫描
echo "starting scan:"
cat "$scope_path/roots.txt"
cp -v "$scope_path/roots.txt" "$scan_path/roots.txt"
## DNS 枚举-子域名暴力破解
cat "$scan_path/roots.txt" | haktrails subdomains | anew subs.txt | wc -l
cat "$scan_path/roots.txt" | subfinder | anew subs.txt | wc -l
cat "$scan_path/roots.txt" | shuffledns -w "$ppath/lists/pry-dns.txt" -r "$ppath/lists/resolvers.txt" | anew subs.txt | wc -l
## DNS泛解析对抗
puredns resolve "$scan_path/subs.txt" -r "$ppath/lists/resolvers.txt" -w "$scan_path/resolved.txt" | wc -l
dnsx -l "$scan_path/resolved.txt" -json -o "$scan_path/dns.json" | jq -r '.a?[]?' | anew "$scan_path/ips.txt" | wc -l
## 端口扫描与http服务发现
nmap -T4 -vv -il "$scan_path/ips.txt" --top-ports 3000 -n --open -oX "$scan_path/nmap.xml"
tew -x "$scan_path/nmap.xml" -dnsx "$scan_path/dns.json" --vhost -o "$scan_path/hostport.txt" | httpx -sr -srd "$scan_path/responses" -json -o "$scan_path/http.json"
cat "$scan_path/http.json" | jq -r '.url' | sed -e 's/:80$//g' -e 's/:443$//g' | sort -u > "$scan_path/http.txt"
## 爬虫
gospider -S "$scan_path/http.txt" --json | grep “{” | jq -r '.output?' | tee "$scan_path/crawl.txt"
## JS提取
cat "$scan_path/crawl.txt" | grep “\.js” | httpx -sr -srd js >> js.text

如何处理搜集到的数据


下面很多借鉴了Tomnomnom的方法;

这里使用一个叫vimprev的工具(其实就是一小段脚本),同时使用vim,可以在一个目录中的文件之间快速切换.

~/.vimrc中添加如下:(注意原文中是有问题的,笔者这里进行了修正)

if $VIMENV == 'prev'
  noremap <Space> :n<CR>
  noremap <Backspace> :N<CR>
  noremap <C-D> :call delete(expand('%')) <bar> argdelete % <bar> bdelete<CR>
  set noswapfile
endif

vimprev设置(目录你可以自己设置,笔者这里设置的是$HOME)

$cat ~/vimprev
#!/bin/bash
VIMENV=prev vim $@

vimprev环境变量设置:

export PATH=$PATH:$HOME

一旦设置好,当在响应目录中时,只需输入如下:

#使用vim预览当前目录中的所有文件
vimprev $(find -type f)

上面这个命令可以让你在目录中的每个文件之间移动


gf


在响应中寻找AWS keys

cat responses | gf aws-keys >> aws-keys.txt

tok


从当前给定的文件(存储HTTP响应的文件)中提取关键词并删除特殊字符和空格。

这些关键词可以添加到单词列表中(字典)以进行进一步枚举,或者用于标识上下文(可用于构建定制化字典)。

find . -type f | tok | sort | uniq -c | sort -rn | head -n 40

qsreplace + ffuf


使用qsreplace和ffuf,可以寻找漏洞,如路径遍历或SQL注入漏洞。

cat crawl.txt | grep "?" | qsreplace ../../../../etc/passwd | ffuf -u 'FUZZ' -w - -mr '^root:'

总结

本文主要讲解了自动化信息搜集的经典流程:

  • 设置变量,检查范围目录(scope directory)是否存在,而后读取
  • 创建目录,例如:每次扫描创建扫描目录
  • 执行扫描逻辑:
  • DNS枚举,子域名暴力破解
  • DNS泛解析对抗
  • 端口扫描与http服务发现
  • 爬虫
  • JS文件提取
  • 计算扫描所需的时间
  • 通知用户扫描已经完成

后面对处理数据以及漏洞扫描进行了简单总结,处理数据以及漏洞扫描这部分后面有文章会详细阐述,全文结束.


参考

https://github.com/d3mondev/puredns

https://github.com/blechschmidt/massdns

https://github.com/projectdiscovery/shuffledns

https://powerdmarc.com/zh/what-is-a-dns-aaaa-record/

https://i.pry0.cc/lists/

https://github.com/projectdiscovery/dnsx

https://github.com/pry0cc/tew

https://www.youtube.com/watch?v=l8iXMgk2nnY

https://github.com/tomnomnom/qsreplace

相关实践学习
基于函数计算快速搭建Hexo博客系统
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
4天前
|
运维 监控 应用服务中间件
自动化脚本:提升运维效率的秘诀
**自动化脚本提升服务器管理效率:** - 数据库备份脚本自动执行mysqldump,保证数据安全。 - DoS防护脚本监测Nginx日志,异常IP自动屏蔽。 - 实时网卡流量监控脚本展示网络流量,辅助异常检测。 - 配置邮件发送环境,利用mailx发送告警通知。 - Nginx日志按天切割脚本优化存储,日志分析脚本提供访问洞察。 这些脚本简化运维工作,增强系统安全与响应能力。
17 6
|
5天前
|
机器学习/深度学习 人工智能 运维
自动化运维的崛起:从脚本到智能
【6月更文挑战第20天】在数字化时代,自动化运维不再是一个选择,而是企业追求效率和稳定性的必要条件。本文将探讨自动化运维的发展轨迹,从最初的脚本编写到现今的智能化工具应用,揭示自动化技术如何重塑IT运维领域,提升业务连续性和敏捷性。
|
10天前
|
运维 监控 API
自动化运维实践指南:Python脚本优化服务器管理任务
本文探讨了Python在自动化运维中的应用,介绍了使用Python脚本优化服务器管理的四个关键步骤:1) 安装必备库如paramiko、psutil和requests;2) 使用paramiko进行远程命令执行;3) 利用psutil监控系统资源;4) 结合requests自动化软件部署。这些示例展示了Python如何提升运维效率和系统稳定性。
29 8
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
自动化测试的演进之路:从脚本到智能
【6月更文挑战第18天】自动化测试作为软件质量保证的重要手段,其发展历程映射了技术进步和行业需求的变化。本文旨在探讨自动化测试技术从简单的脚本编写逐步演变为集成化、智能化的测试解决方案的过程。文章将分析自动化测试面临的挑战,介绍当前流行的框架和工具,并展望自动化测试的未来趋势,特别是人工智能如何重塑测试实践,提升测试效率和有效性。
21 2
|
20天前
|
存储 SQL 运维
使用PowerShell进行自动化脚本编写:入门与实战
【6月更文挑战第6天】本文介绍了PowerShell作为Windows系统管理的自动化工具,用于提升效率和减少错误。内容涵盖PowerShell基础,如变量、命令执行、管道、条件和循环语句、函数。实战案例展示了如何用PowerShell脚本进行文件备份。此外,还提及PowerShell的进阶功能,如模块、远程管理和与其他工具集成。学习和应用PowerShell能有效提升IT运维自动化水平。
|
1月前
|
JavaScript 前端开发
Playwright执行 JavaScript 脚本:探索浏览器自动化的新境界
在Web自动化中,Playwright提供`page.evaluate()`和`page.evaluate_handle()`来执行JavaScript脚本。`page.evaluate()`返回脚本执行结果,而`page.evaluate_handle()`返回JSHandle。示例展示了如何使用它们,如打印网页标题、操作元素及获取页面内容。通过这些方法,可以处理常规方法难以操作的网页元素。
37 2
|
1月前
|
IDE 测试技术 开发工具
从零开始:使用 Playwright 脚本录制实现自动化测试
Playwright提供了一种便捷的脚本录制功能,类似于Selenium IDE。通过运行`playwright codegen`命令,你可以启动一个浏览器并记录你的操作,生成Python或异步代码。在示例中,展示了如何录制登录百度的过程,生成的代码可以直接用于自动化测试。Playwright Inspector允许你编辑和转换测试代码,支持生成Pytest格式的测试用例,方便Python开发者使用。这个功能使Playwright成为强大的Web自动化测试工具。
45 3
|
1月前
|
测试技术 API 开发者
使用 Playwright 脚本录制简化自动化测试:完全指南
Playwright提供了一种脚本录制功能,帮助开发者通过交互式操作自动生成测试脚本,提升测试效率。使用Playwright的命令行工具`codegen`,如`playwright codegen python &lt;url&gt;`,可以记录浏览器操作并生成Python测试脚本。生成的脚本使用Playwright API模拟用户交互,如`page.click()`和`page.fill()`。这种方法简化了自动化测试脚本的编写,促进了测试流程的加速。
63 1
|
30天前
|
安全 数据管理 测试技术
网络安全与信息安全:防范漏洞、加强加密与提升安全意识深入探索自动化测试框架的设计原则与实践应用化测试解决方案。文章不仅涵盖了框架选择的标准,还详细阐述了如何根据项目需求定制测试流程,以及如何利用持续集成工具实现测试的自动触发和结果反馈。最后,文中还将讨论测试数据管理、测试用例优化及团队协作等关键问题,为读者提供全面的自动化测试框架设计与实施指南。
【5月更文挑战第27天】 在数字化时代,网络安全与信息安全已成为维护国家安全、企业利益和个人隐私的重要环节。本文旨在分享关于网络安全漏洞的识别与防范、加密技术的应用以及提升安全意识的重要性。通过对这些方面的深入探讨,我们希望能为读者提供一些实用的建议和策略,以应对日益严峻的网络安全挑战。 【5月更文挑战第27天】 在软件开发周期中,自动化测试作为保障软件质量的关键步骤,其重要性日益凸显。本文旨在剖析自动化测试框架设计的核心原则,并结合具体案例探讨其在实际应用中的执行策略。通过对比分析不同测试框架的优缺点,我们提出一套高效、可扩展且易于维护的自动
|
1月前
|
XML 数据格式 Python
Python自动化脚本编写技巧
本文介绍了Python自动化脚本的编写技巧:选择合适的库(如os, requests, BeautifulSoup)以简化编程,利用循环和条件语句实现流程控制,通过函数和模块提高代码的可读性和可维护性,使用异常处理保证脚本稳定性,以及借助日志记录进行问题追踪。通过这些方法,可以编写出高效、稳定的自动化脚本。

热门文章

最新文章