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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 前言本文原文作者为@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

目录
相关文章
|
5天前
|
存储 Python
Python自动化脚本编写指南
【10月更文挑战第38天】本文旨在为初学者提供一条清晰的路径,通过Python实现日常任务的自动化。我们将从基础语法讲起,逐步引导读者理解如何将代码块组合成有效脚本,并探讨常见错误及调试技巧。文章不仅涉及理论知识,还包括实际案例分析,帮助读者快速入门并提升编程能力。
23 2
|
6天前
|
运维 监控 Python
自动化运维:使用Python脚本简化日常任务
【10月更文挑战第36天】在数字化时代,运维工作的效率和准确性成为企业竞争力的关键。本文将介绍如何通过编写Python脚本来自动化日常的运维任务,不仅提高工作效率,还能降低人为错误的风险。从基础的文件操作到进阶的网络管理,我们将一步步展示Python在自动化运维中的应用,并分享实用的代码示例,帮助读者快速掌握自动化运维的核心技能。
18 3
|
12天前
|
运维 监控 应用服务中间件
自动化运维:如何利用Python脚本提升工作效率
【10月更文挑战第30天】在快节奏的IT行业中,自动化运维已成为提升工作效率和减少人为错误的关键技术。本文将介绍如何使用Python编写简单的自动化脚本,以实现日常运维任务的自动化。通过实际案例,我们将展示如何用Python脚本简化服务器管理、批量配置更新以及监控系统性能等任务。文章不仅提供代码示例,还将深入探讨自动化运维背后的理念,帮助读者理解并应用这一技术来优化他们的工作流程。
|
1月前
|
测试技术
自动化测试项目实战笔记(三):测试用户注册(验证码错误,成功,出现弹框时处理)
本文是关于自动化测试项目实战笔记,主要介绍了如何测试用户注册功能,包括验证码错误、注册成功以及弹框处理的测试步骤和代码实现。
84 2
自动化测试项目实战笔记(三):测试用户注册(验证码错误,成功,出现弹框时处理)
|
14天前
|
运维 监控 Linux
自动化运维:如何利用Python脚本优化日常任务##
【10月更文挑战第29天】在现代IT运维中,自动化已成为提升效率、减少人为错误的关键技术。本文将介绍如何通过Python脚本来简化和自动化日常的运维任务,从而让运维人员能够专注于更高层次的工作。从备份管理到系统监控,再到日志分析,我们将一步步展示如何编写实用的Python脚本来处理这些任务。 ##
|
18天前
|
运维 Prometheus 监控
自动化运维之路:从脚本到DevOps
【10月更文挑战第25天】在数字化时代的浪潮中,运维不再是简单的服务器管理,而是成为了企业竞争力的核心。本文将带你走进自动化运维的世界,探索如何通过技术手段提升效率和稳定性,以及实现快速响应市场的能力。我们将一起学习如何从基础的脚本编写进化到全面的DevOps实践,包括工具的选择、流程的优化以及文化的建设。无论你是运维新手还是资深专家,这篇文章都将为你提供有价值的见解和实用的技巧。
17 3
|
19天前
|
JSON 测试技术 持续交付
自动化测试与脚本编写:Python实践指南
自动化测试与脚本编写:Python实践指南
24 1
|
1月前
|
人工智能 运维 监控
自动化运维:从脚本到工具的演变之路
【10月更文挑战第8天】在数字化时代的浪潮中,运维不再是简单的硬件维护,它已经演变成一场关于效率、稳定性和创新的技术革命。本文将带您领略自动化运维的魅力,从最初的脚本编写到现代复杂的自动化工具,我们将一探究竟,看看这些工具如何帮助运维人员简化日常任务,提升工作效率,并最终推动业务发展。
|
1月前
|
测试技术 数据安全/隐私保护 Python
自动化测试项目实战笔记(四):测试用户登录(账号密码错误,成功,出现弹框等情况)
本文介绍了使用Selenium进行自动化测试时如何测试用户登录的不同情况,包括账号密码错误、登录成功以及处理登录时出现的弹框,并提供了相应的Python代码实现。
51 0
自动化测试项目实战笔记(四):测试用户登录(账号密码错误,成功,出现弹框等情况)
|
30天前
|
监控 关系型数据库 MySQL
PowerShell 脚本编写 :自动化Windows 开发工作流程
PowerShell 脚本编写 :自动化Windows 开发工作流程
26 0