SRC 信息收集(续集) — 从插件到自动化,武装你的挖洞工具箱
上节课我们聊了信息收集的理论和基本方法,今天我们来点硬核的:浏览器插件、端口扫描、Web 刺探,以及用 Python 把信息收集自动化起来。准备好了吗?
课程概览
1. 信息收集的各种插件(扩展技能) 2. 端口扫描续集(进阶篇) 3. Web 信息刺探续集 4. Python 信息收集实战 5. 作业:用 Python 实现子域名查询 & 端口扫描一、信息收集必备浏览器插件
在网络安全领域,信息收集是至关重要的一环。下面这些浏览器插件,就像给你的浏览器装了雷达一样,让你在浏览网页的同时悄无声息地收集目标信息。
0. 插件安装教程
所有插件的安装方式大同小异,这里以 Chrome 为例:
- 打开 Chrome 应用商店
- 搜索插件名称
- 点击「添加至 Chrome」
- 安装后在浏览器右上角点开插件图标即可使用
1. Shodan 插件
Shodan 被称为「暗黑谷歌」,是互联网设备搜索引擎的老大哥。
它能让你看到什么?
- 当前网站的 IP 地址
- 反解析域名
- 国家 / 城市
- 开放的端口
- 一键跳转到 Shodan 网页查看更多信息
实战场景:访问http://www.chungwah.com.hk/,点开 Shodan 插件,立马看到这个站点的端口对外开放情况。是信息收集的必备插件之一。
2. FOFA Pro View 插件
FOFA 是国内最强大的网络空间测绘平台之一,这个浏览器插件让你在浏览目标网站时直接获取 FOFA 数据。
能拿到什么?
- 所属地区
- 网络类型
- 关联的资产信息
一句话:帮你对目标网站有个全面的第一印象,不用来回切页面,效率拉满。
3. FindSomething 插件
这个插件非常实用——它能从网页的源代码和 JavaScript 文件中找到隐藏的宝藏。
它能找出什么?
- 内嵌的 URL 路径
- JS 变量中的敏感信息
- 可能在源码里藏着的用户名和密码
很多时候开发人员会不小心在前端代码里留下测试账号、API Key 之类的东西。FindSomething 把这些信息整理并展现出来,简直是挖洞利器。
4. Wappalyzer 插件
Wappalyzer 是全球使用最广泛的技术栈识别工具之一。
它的作用是什么?
- 识别后端语言(PHP / Python / Java / Node.js 等)
- 识别服务器中间件(Apache / Nginx / IIS 等)
- 识别前端框架(React / Vue / jQuery 等)
- 识别 CMS 系统(WordPress / Drupal 等)
为什么要知道这些?举个例子:如果你发现目标用的是 WordPress 4.x 旧版本且没打补丁,就可以针对性地去找已知漏洞,而不是盲目扫描。知己知彼,百战不殆。
5. Similar Sites 插件
这个插件的逻辑很简单却非常聪明:找到与当前网站类似的站点。
为什么重要?
- 如果已知当前网站有某漏洞,同类网站很可能也有相同问题
- 扩大信息收集的范围,找到更多潜在的目标资产
6. Bulk URL Opener 插件
功能:一次性打开多个 URL。
最佳拍档:配合 FindSomething 使用。
用 FindSomething 从网页源码中扒出一堆 URL 路径后,用 Bulk URL Opener 批量打开,快速排查哪些是后台登录页、哪些是敏感路径。比如打开一堆
/admin路径,说不定哪个就暴露了后台。
7. Hunter - Email Finder Extension
一句话介绍:社工必备工具。
功能:从网站上查找该域名下所有公开的邮箱地址。
拿到邮箱后可以干什么?可以尝试弱口令撞库、社交工程钓鱼,或者在后续密码破解中提供线索。社工这一环在信息收集中往往被低估,但效果拔群。
8. NexusScan 插件
相对较新的安全扫描插件,功能很全面:
- 利用 VirusTotal API 进行 URL 安全扫描
- 利用 urlscan.io 进行实时分析
- 检测恶意网站和钓鱼页面
- IP 地址分析
- 技术栈检测
装一个插件等于同时用上了 VirusTotal 和 urlscan.io 的能力,省时省力。
9. 更多插件…
插件生态非常丰富,篇幅所限不能一一展开,但上面这 8 个是 SRC 挖洞中最常用的。工具不在多,用精了才是本事。
二、端口扫描进阶
为什么需要端口扫描?
上一节课我们聊了在线端口扫描工具,但真正的渗透测试中,你需要更灵活、更快速的本地工具。masscan + nmap被称为端口扫描的黄金组合。
masscan — 速度之王
masscan 是 Kali 内置的端口扫描工具,它的核心优势就是快,比 nmap 快得多。
最佳实践:先用 masscan 对目标 IP(通常是一个网段)进行全端口扫描,然后再用 nmap 对存活主机的开放端口进行详细的服务识别和漏洞探测。
常用参数速查表
| 类别 | 参数 | 说明 |
|---|---|---|
| 基本扫描 | -p | 指定扫描的端口范围 |
--range | 指定 IP 范围 | |
-iL | 从文件中读取目标 IP | |
| 速度控制 | --rate | 设置扫描速度(数据包/秒) |
--max-rate | 设置最大扫描速度 | |
--min-rate | 设置最小扫描速度 | |
| 输出格式 | -oL | 普通文本格式 |
-oJ | JSON 格式 | |
-oG | Grepable 格式(便于 grep 处理) | |
| 网络探测 | --ping | Ping 扫描,检测存活主机 |
--banners | 获取服务横幅信息 | |
| 网络配置 | --adapter | 选择网络适配器 |
--router-mac | 指定路由器 MAC 地址 |
案例 1:扫描 C 段指定端口
# 扫描 192.168.2.1 到 192.168.2.255 的 80-90 端口sudomasscan-p80-90--range192.168.2.1-192.168.2.255输出示例:
192.168.2.4 → IIS 服务器 192.168.2.1 → 中国电信网关 192.168.2.5 → 本机案例 2:C 段存活主机探测
# 检查指定范围内哪些主机在线sudomasscan--ping--range192.168.2.1-192.168.2.255案例 3:全端口扫描 + 目录扫描实战
# 扫描所有端口,速率设为 1000masscan-p1-65535192.168.2.42--rate1000# 扫描 1-10000 端口masscan-p1-10000192.168.2.42# 扫描 1-100 端口masscan-p1-100192.168.2.42# 只扫 80 端口masscan-p80192.168.2.42目录扫描的作用是什么?
核心目的:自动探测目标网站的隐藏目录和文件,挖掘后台入口、敏感配置、未授权资源等。
举例:
- 扫到
www.xx.com/admin/login.php→ 后台登录页 → 尝试弱口令 - 扫到
www.xx.com/backup/202505_order.sql→ 数据库备份文件 → 数据直接泄露! - 扫到
www.xx.com/phpmyadmin/→ phpMyAdmin 入口 → 可以尝试爆破
每一次目录扫描的发现,都可能是打开后门的钥匙。
补充概念:旁注
旁注:同一台服务器下运行的不同 Web 应用。
查询工具:https://webscan.cc/
场景:假设www.xx.com防御做得很好,但同一台 IP 下还有一个没人维护的旧站点——从那个旧站点入手,最终拿下服务器,www.xx.com自然也就落入囊中。
masscan vs nmap 速度对比
# masscan 方式masscan-p1-100192.168.2.42# nmap 方式nmap192.168.2.42-p1-100# 感觉上还是快一些的masscan 适合大范围快速扫描,nmap 适合精细探测。两者取长补短,才是最佳姿势。
nmap — 瑞士军刀
nmap 是功能最全面的网络扫描工具,支持端口扫描、主机探测、服务识别、系统识别,并且结果可以导出。
端口扫描
nmap192.168.2.42-p1-100# 扫描 1-100 端口nmap192.168.2.42-p1-1000# 扫描 1-1000 端口nmap192.168.2.42-p80,3389,22,21# 扫描指定端口端口参数:
| 写法 | 含义 |
|---|---|
-p 80 | 扫描 80 端口 |
-p 1-80 | 扫描 1~80 端口 |
-p 80,3389,22,21 | 扫描指定端口 |
-p- | 等价于-p 1-65535 |
主机探测
nmap-sP192.168.2.42# 检测主机是否存活服务识别
nmap-sV192.168.2.42-p80# 识别 80 端口的服务及版本nmap-sV192.168.2.42# 识别所有开放端口的服务结果导出
sudonmap-O192.168.2.42-oNResultContent.txt# 导出为文本文件# 查看结果catResultContent.txtvimResultContent.txt三、Web 信息刺探续集
黑暗引擎 — 网络空间测绘四天王
| 引擎 | 地址 | 特点 |
|---|---|---|
| FOFA | https://fofa.info/ | 国内最强,语法丰富 |
| Quake(360) | https://quake.360.cn | 360 出品,数据全面 |
| Shodan | https://www.shodan.io | 老牌引擎,国际顶流 |
| ZoomEye | https://www.zoomeye.org | 知道创宇出品 |
FOFA 搜索语法速查
domain="baidu.com"# 按域名搜索host="webserver1"# 按主机名搜索ip="153.3.238.28"# 按 IP 搜索title="美食推荐"# 按网页标题关键词搜索server="Apache"# 按服务器软件搜索header="Content-Type: application/json"# 按 HTTP 头搜索port="80"# 按端口搜索city="London"# 按城市搜索city="中国"# 按中国城市搜索"FBI"&&country="US"# 组合搜索FOFA 的语法灵活度远超你的想象,熟练掌握后,你可以不到 1 分钟就定位出全国范围内运行了某个特定漏洞版本软件的服务器。
参考文章:
- https://blog.csdn.net/2302_82189125/article/details/135935575
- https://blog.csdn.net/Javachichi/article/details/145199363
社工信息收集(快速回顾)
上一节课讲过的内容,这里列个速查:
| 工具 | 地址 |
|---|---|
| 爱企查 | https://aiqicha.baidu.com/ |
| 企查查 | https://www.qcc.com/ |
| ICP 备案查询 | https://beian.miit.gov.cn/ |
NC 瑞士军刀 — 用 NetCat 做端口收集
NetCat(简称 nc),在网络安全界有瑞士军刀的美誉。它可以通过 TCP/UDP 协议进行读写,既可以做网络调试工具,也可以用来端口扫描。
常用参数
| 参数 | 说明 |
|---|---|
-l | 开启监听模式 |
-p | 指定端口 |
-t | 以 telnet 形式应答 |
-e | 程序重定向 |
-n | 以数字形式标识 IP |
-v | 显示详细信息 |
-z | 不交互,直接显示结果(端口扫描必备) |
-u | 使用 UDP 协议 |
-w | 设置超时时间 |
-d | 后台运行 |
实验 1:扫描远程网站端口
# 先 ping 获取 IPpingwww.chungwah.com.hk# 获得 IP = 103.231.255.94# 用 nc 扫描端口nc-n-v-w1-z103.231.255.94802122232553110443143318632289330656315632500080809090输出看到
3306端口开放,说明该网站使用的是 MySQL 数据库作为后端数据支撑。
实验 2:扫描本机 phpStudy 端口
nc-n-v-w1-z192.168.2.5802122232553110443143318632289330656315632500080809090实验 3:扫描端口范围
nc-n-v-w1-z192.168.2.51-1000# 扫描 1-1000 端口nc-n-v-w1-z192.168.2.51-100# 扫描 1-100 端口实验 4:打印 Banner 信息
# 用 echo 配合 nc 获取端口 Banner 信息echo" "|nc-n-v-w1192.168.2.51-1000echo" "|nc-n-v-w1192.168.2.51-100拿到 Banner 后,在浏览器访问
192.168.2.5:80,就能看到 Web 服务的具体内容了。
四、Python 信息收集实战 — 从零到自动化
为什么要学 Python?因为当你面对成百上千个目标时,手工操作无异于大海捞针。掌握了 Python,你就掌握了批量化和自动化的能力。
Python 学习的三重意义
- 理解安全工具原理— 知其然更知其所以然
- 掌握自定义开发— 没有工具时可以自己造轮子
- 解决实战痛点— 手工操作麻烦、批量化场景没有现成工具
4.1 Python 环境搭建
Python 介绍
Python 是一种解释型、面向对象、动态数据类型的高级编程语言,以简洁易读著称。
Python 2 vs Python 3
| 对比项 | Python 2 | Python 3 |
|---|---|---|
| 官方支持 | 2020 年 1 月 1 日停止 | 当前主流 |
| 不等号 | <> | != |
| 打印语句 | print "hello" | print("hello") |
| 输入函数 | raw_input() | input() |
| 语法兼容 | ❌ 不兼容 Python 3 | ❌ 不兼容 Python 2 |
请务必使用 Python 3!Python 2 已经不再被官方维护。
查看版本:
python--versionPyCharm 介绍
PyCharm 是由 JetBrains 公司开发的 Python IDE,功能包括:调试、语法高亮、项目管理、代码跳转、智能提示、自动补全、单元测试、版本控制等。
安装参考:https://zhuanlan.zhihu.com/p/359897213
4.2 pip — Python 的包管理器
pip list# 列出已安装的所有模块pipinstall模块名# 安装最新版本pipinstall模块名==版本号# 安装指定版本pip uninstall 模块名# 卸载模块国内镜像源(加速安装)
由于网络原因,从 PyPI 官方仓库安装可能很慢,建议使用国内镜像:
# 清华源pipinstallpython-whois-ihttps://pypi.tuna.tsinghua.edu.cn/simple# 阿里云源pipinstallsocket-ihttp://mirrors.aliyun.com/pypi/simple/# 腾讯云源pipinstallsocket-ihttp://mirrors.cloud.tencent.com/pypi/simple| 镜像源 | 地址 |
|---|---|
| 清华 | https://pypi.tuna.tsinghua.edu.cn/simple |
| 阿里云 | http://mirrors.aliyun.com/pypi/simple/ |
| 中科大 | https://pypi.mirrors.ustc.edu.cn/simple/ |
| 华中理工 | http://pypi.hustunique.com/ |
| 山东理工 | http://pypi.sdutlinux.org/ |
| 豆瓣 | http://pypi.douban.com/simple/ |
4.3 Python 基础速览
注释
# 这是单行注释''' 这是多行注释(三个单引号) 可以换行写 '''""" 这也是多行注释(三个双引号) 引号必须成对出现 """变量赋值与输入输出
# 变量赋值a=10# 输出函数print("Hello, Python!")# 输入函数name=input('请输入你的姓名:')六大标准数据类型
| 类型 | 说明 | 是否可变 |
|---|---|---|
| Numbers(数字) | 存储数值 | ❌ 不可变 |
| String(字符串) | 文本数据 | ❌ 不可变 |
| List(列表) | 有序集合[ ] | ✅ 可变 |
| Tuple(元组) | 有序集合( ) | ❌ 不可变 |
| Set(集合) | 无序不重复{ } | ✅ 可变 |
| Dictionary(字典) | 键值对{key: value} | ✅ 可变 |
数字:
var1=1var2=10字符串:
s='abcdef'print(s[1:5])# 切片操作str='Hello World!'print(str)# Hello World!print(str[0])# Hprint(str[2:5])# lloprint(str[2:])# llo World!print(str*2)# Hello World!Hello World!print(str+"TEST")# Hello World!TEST列表:
list=['Beyond',786,2.23,'john',70.2]tinyList=[123,'john']print(list[0])# Beyondprint(list[1:3])# [786, 2.23]print(tinyList*2)# [123, 'john', 123, 'john']print(list+tinyList)# ['Beyond', 786, 2.23, 'john', 70.2, 123, 'john']元组:
tuple=('Beyond',786,2.23,'john',70.2)tinytuple=(123,'john')# 元组不能二次赋值,相当于只读列表字典:
dict={}dict['one']="This is one"dict[2]="This is two"tinydict={'name':'Beyond','code':6734,'dept':'sales'}print(dict['one'])# This is oneprint(tinydict.keys())# dict_keys(['name', 'code', 'dept'])print(tinydict.values())# dict_values(['Beyond', 6734, 'sales'])4.4 流程控制
if-else 条件语句
name='java'ifname=='python':print('welcome boss')else:print(name,'不是python')if-elif-else 语句
num=5ifnum==3:print('boss')elifnum==2:print('user')elifnum==1:print('worker')else:print('error')while 循环
count=0whilecount<10:print('The count is:',count)count=count+1print("Good bye!")# continue 和 break 用法i=1whilei<10:i+=1ifi%2!=0:# 奇数时跳过continueprint(i)# 输出 2、4、6、8、10i=1while1:# 无限循环print(i)i+=1ifi>10:break# 跳出循环for 循环
# 遍历字符串forletterin'Python':print("当前字母: %s"%letter)# 遍历列表fruits=['banana','apple','mango']forfruitinfruits:print('当前水果: %s'%fruit)# range 用法foriinrange(1,10):print('当前数字:',i)4.5 函数
defprintme(name):"""打印传入的字符串"""print('我的名字叫:',name)printme('张三')defsum(arg1,arg2):"""返回两个参数的和"""total=arg1+arg2returntotal total=sum(10,20)print(total)# 304.6 文件操作
# 读取文件withopen('example.txt','r',encoding='utf-8')asfile:content=file.read()print(content)# 写入文件withopen('example.txt','w',encoding='utf-8')asfile:content=file.write('abcdefg')4.7 实战案例
案例 1:Python 实现 IP 查询
原理:socket.gethostbyname()方法可以根据域名返回对应的 IP 地址。
importsocket hostName='www.baidu.com'ip=socket.gethostbyname(hostName)print(ip)案例 2:Python 实现 WHOIS 查询
先装依赖:
pipinstallpython-whois-ihttps://pypi.tuna.tsinghua.edu.cn/simple代码:
importwhoisdefwhoisCheck(info):ifinfo=="":returnprint("你输入的是空的啊???")whoisResultInfo=whois.whois(info)print(whoisResultInfo)print(whoisResultInfo['name'])print(whoisResultInfo['emails'])print(whoisResultInfo['registrar'])if__name__=='__main__':info=input("请您输入目标地址哦...")whoisCheck(info)运行后输入
www.baidu.com,就能看到注册者、联系邮箱、注册商等注册信息。
案例 3:Python 实现子域名查询
原理:通过遍历子域名字典,用socket.gethostbyname()判断子域名是否存在。能解析到 IP 就说明存在,否则域名无效。
子域名字典dict.txt:可以从 https://site.ip138.com/baidu.com/ 这类站点收集,也可以从 GitHub 上找现成的子域名字典。
importsocketimporttimedefzymListCheck(url):url=url.replace("www","")# 去掉 www 前缀forzymListinopen("dict.txt"):zymList=zymList.replace("\n","")# 去掉换行符zymListUrl=zymList+urltry:ip=socket.gethostbyname(zymListUrl)print(zymListUrl+" ----> 该子域名的 IP 为:"+ip)time.sleep(1)exceptExceptionase:print(zymListUrl+" ---> 没有该子域名,错误✗")time.sleep(1)if__name__=='__main__':url=input("请您输入目标地址哦...")zymListCheck(url)案例 4:Python 实现端口扫描
原理:创建 socket 对象,尝试连接目标 IP 和端口,连接成功说明端口开放。
importsocketdefport_test():sk=socket.socket()try:sk.connect(('127.0.0.1',3306))print('连接成功')except:print('连接失败')sk.close()port_test()案例 5:多线程端口扫描(进阶版)
逐个端口扫描太慢了?用多线程 + 队列的方式,把扫描速度提升几十倍。
importsocketimportsysimportthreadingimportqueueimporttimedefget_ip(name):ip=socket.gethostbyname(name)returnipdefport_test(ip):whileTrue:ifq.empty():breaksk=socket.socket(socket.AF_INET,socket.SOCK_STREAM)port=q.get()try:sk.connect((ip,port))print(ip,':',port,'---- 连接成功')except:print(port,'失败')passsk.close()time.sleep(1)if__name__=='__main__':ip=sys.argv[1]th_nums=int(sys.argv[2])q=queue.Queue()foriinrange(1,65535):q.put(i)foriinrange(th_nums):t=threading.Thread(target=port_test,args=(ip,))t.start()使用方法:
python portscan.py127.0.0.11000
1000是线程数,根据自己的机器性能调整。线程越多扫描越快,但太猛了可能被目标防火墙封 IP。
五、课后作业
使用 Python 实现子域名查询和端口扫描。
扩展资料
- 补天平台:https://www.butian.net/Reward/plan/2
- 漏洞银行工具集:https://forum.ywhack.com/bountytips.php?tools
- Python socket 编程:https://www.bilibili.com/video/BV1aK4y1Y71n/
写在最后:信息收集是渗透测试的基石。工具很多,语法很杂,但万变不离其宗——找到别人找不到的入口,就是挖洞的核心竞争力。下一篇我们继续深入漏洞挖掘实战,敬请期待!