# 信息搜集
# Google Hacking
Google Hacking(也常被称为Google Dorking)是一种利用搜索引擎(特别是Google)的高级搜索操作符来发现隐藏在公共互联网上的敏感信息、漏洞或配置错误的攻击或信息收集技术。
# 高级搜索操作符
参考:https://zhuanlan.zhihu.com/p/400365865
# site
用于限制搜索范围,只在特定的域名或网站内进行搜索
site:example.com
#只在example.com及其子域名下搜索

# filetype和exp
用于指定文件类型,只搜索具有特定扩展名的文件
site:baidu.com filetype:pdf
site:baidu.com ext:pdf
#表示查找在baidu.com站点上文件类型为pdf的网页

# intitle和allintitle
用于限制网页标题,只搜索网页标题中带有特定词语的页面
intitle:百度
#只返回标题中包含百度的网页

这里需要提一下intile和allintitle的区别:
intitle:百度 登录
#表示搜索标题中包含百度的网页,网页的任意位置必须包含"登录"
allintitle:百度 登录
#表示网页的标题中必须同时包含"百度"和"登录"两个词
allintitle:A B相当于intitle:A intitle:B


# inurl和allinurl
用于限制URL路径,搜索URL网址中包含特定字符串的页面
inurl:login
#表示搜索URL网址中包含login的网页

inurl和allinurl的区别与intitle和allintitle的区别一样,allinurl可以指定多个词
inurl:login admin
#表示网页的网址URL中必须包含login,网页的任意位置必须包含admin,admin作为全局搜索词
allinurl:login admin
#表示网页的网址URL中必须同时包含login和admin
allinurl:A B等价于inurl:A inurl:B


# intext和allintext
用于限制网页正文,搜索网页正文中包含特定词语的页面
intext:后台登录
#表示搜索网页正文中包含后台登录的网页

# link
搜索网页中包含指定URL链接的页面,也就是“找外链”或“反向链接”
link:baidu.com
#返回所有包含指向baidu.com的网页
Google为了防止SEO(搜索引擎优化)作弊,几年前已经逐渐废弃/削弱了这个指令的准确性,现在搜索出来的结果往往不全

# related
用于查找相似/关联网站,搜索与指定网站内容相似或有业务关联的其他网站
related:cuit.edu.cn
#返回与cuit.edu.cn相似的页面,相似指的是网页的布局相似

# cache
用于查看网页历史缓存,不直接访问目标服务器,而是查看Google(爬虫)上一次抓取该网页时存下来的“网页快照”
cache:baidu.com
#让Google不去访问现在的百度服务器,而是直接展示Google数据库里保存的baidu.com首页的历史快照
cache:baidu.com login
#在刚刚打开的快照页面中自动寻找并高亮显示"login"这个词
# info
返回站点的指定信息
info:baidu.com
#将返回百度的一些信息
Google在2017年正式废弃了这个操作符,现在如果输入info:baidu.com通常只会重定向到普通URL的搜索结果
# define
返回某个词语的定义
define:Hacker
#将返回关于Hacker的定义

# phonebook
电话簿查询美国街道地址和电话号码信息。例如:phonebook:Lisa+CA 将返回名字里面包含Lisa并住在加州的人的所有名字
# 一些组合示例
filetype:env intext:"DB_PASSWORD"
#搜索包含了数据库密码的.env环境配置文件
site:target.com inurl:admin | inurl:login | inurl:wp-admin
#在目标网站下寻找后台入口,寻找后台管理登录页面
filetype:log inurl:error.log
#寻找暴露的日志文件
intitle:"index of" "backup"
#寻找目录遍历漏洞,寻找那些没有正确配置权限,导致整个备份文件夹可以被公开浏览的网站
inurl:"view.shtml" | inurl:"/view/index.shtml"
#寻找特定设备的网络摄像头,可以直接搜出很多没有设置密码、暴露在公网上的网络摄像头
#查找网站后台
site:http://xx.com intext:管理
site:http://xx.com inurl:login
site:http://xx.com intitle:后台
#查看服务器使用的程序
site:http://xx.com filetype:asp
site:http://xx.com filetype:php
site:http://xx.com filetype:jsp
site:http://xx.com filetype:aspx
#查看上传漏洞
site:http://xx.com inurl:file
site:http://xx.com inurl:load
# index of
index of语法通常写作intitle:index of,它专门用于寻找存在目录遍历漏洞的网站,当我们访问www.example.com/uploads时,服务区通常回去寻找这个目录下的默认主页文件(比如index.html或者index.php),但如果这个目录下没有默认主页文件或者管理员没有关闭”目录浏览“权限,那么访问之后就会列出这个文件夹里的所有文件和子文件夹,可以下载
#寻找数据库备份文件
intitle:"index of" ext:sql | ext:bak


#寻找网站源码压缩包
intitle:"index of" "backup.zip" | "wwwroot.rar"
#寻找员工内部资料或通讯录
intitle:"index of" "confidential" ext:pdf | ext:xls
#寻找摄像头录像或私人相册
intitle:"index of" "DCIM" | "CCTV"
在这些搜索参数中|都表示逻辑或,当搜索条件变复杂时也可以用()包裹
intitle:"index of" (ext:sql | ext:bak | ext:zip)
#寻找存在目录遍历的服务器,并且目录列表中必须包含sql或者bak或者zip
# 网络空间搜索引擎
网络空间搜索引擎包括FOFA、Shodan、ZoomEye、Hunter
利用网络空间搜索引擎进行搜索的技术也可以叫做网络空间测绘。网络空间搜索引擎的背后,是部署在全球各地的大量扫描节点,这些节点向全球所有的公开IP地址(主要是IVP4,现在也包括IVP6)和常见的端口(80,443,22,3306,3389等)发送探测数据包,当目标IP做出响应的时候,引擎会把返回的信息记录下来,这些信息包括但不仅限于HTTP响应头,网页HTML代码,SSL/TLS证书,服务协议指纹(比如SSH版本信息、MySQL握手协议,RDP远程桌面特征等)
# FOFA

通过搜索zlaryy可以看到返回了https://zlaryy123.github.io以及它的一些信息
# 语法
点击上面的语法可以看到基础的查询语法是什么
| 逻辑连接符 | 具体含义 |
|---|---|
| = | 匹配,=""时,可查询不存在字段或者值为空的情况 |
| == | 完全匹配,==""时,可查询存在且值为空的情况。 |
| && | 与 |
| || | 或 |
| != | 不匹配,!=""时,可查询值不为空的情况。 |
| *= | 模糊匹配,使用*或者?进行搜索。 |
| () | 确认查询优先级,括号内容优先级最高。 |
除此之外还有很多内容,就一一不列举了。
-
根域名/主域名查询:用于收集某个企业或组织名下的所有子域名资产,扩大攻击或防护的暴露面。
domain="example.com" -
证书域名查询:当目标网站套了一层CDN(内容分发网络)或WAF隐藏了真实IP时,很多时候其服务器443端口绑定的SSL证书依然会暴露目标域名,通过反查证书,经常能绕过CDN找到真实IP。
cert="example.com" #搜索证书中带有该域名的资产 -
应用指纹查询:寻找使用了特定组件、CMS、中间件或框架的网站,当某个组件爆发0day漏洞(比如Log4j、ThinkPHP、泛微OA),就可以利用指纹语法去全网测绘受影响的资产范围。
app="ThinkPHP" app="泛微-协同办公OA" -
站点Icon图标哈希查询:很多企业在部署内部系统(后台管理、VPN等)时,虽然域名不同甚至没有域名,但他们往往会使用同一个企业Logo(favicon.ico),通过计算这个图标的hash值,可以找出隐蔽的关联资产
icon_hash="-247388890"
其他引擎的相关语法:
-
根域名/主域名查询:
Hunter: domain.suffix="example.com" ZoomEye: site:"example.com" Quake: domain:"example.com" -
证书域名查询:
Hunter: cert.subject="example.com" 或 cert.is_valid="true"(结合使用查找有效证书) ZoomEye: ssl.cert.subject.cn:"example.com" 或简单的 ssl:"example.com" Quake: cert:"example.com" -
应用指纹查询:
Hunter: app.name="ThinkPHP" ZoomEye: app:"ThinkPHP" Quake: app:"ThinkPHP" -
站点Icon图标哈希查询:
Hunter: web.icon=="hash值" ZoomEye: iconhash:"-247388890" Quake: favicon:"-247388890"
# 子域名收集
利用oneforall工具:
git clone https://gitee.com/shmilylty/OneForAll.git
cd OneForAll
python3 -m pip install -U pip setuptools wheel -i https://pypi.tuna.tsinghua.edu.cn/simple/ --proxy=""
python3 -m pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ --proxy=""
使用:
python3 oneforall.py --target example.com run

利用fofa进行搜集:
domain="example.com"

# 企业查询搜集
可以通过企查查、爱企查、风鸟、天眼查等工具进行公司资产体系的确定,确定之后重点看知识产权里面的主域名,小程序,APP,微信服务号公众号等内容

# 资产测活
通过企查查等搜集到的子域名通常包含大量无效资产,或许是域名已经废弃,不再解析到任何IP,或者服务器已经关机或下线,或者端口虽然开放,但没有运行任何web服务,或者存在内部防火墙外部无法访问......资产测活就是通过发送特定的网络探测请求,来验证这些资产中哪些是当前在线的、有响应的、并且运行这web服务的。
而资产测活用到的工具通常是httpx、dddd等工具
参考:https://www.cnblogs.com/hackernb/p/19692906
简单介绍一下httpx工具的安装(在安装httpx之前请先确保电脑上安装了go语言环境,1.21版本以上):
git clone https://github.com/projectdiscovery/httpx.git
cd httpx
cd cmd/httpx
go env -w GOPROXY=https://goproxy.cn,direct
#配置Go国内镜像元
go build -o pd-httpx.exe
#为避免与python版本的httpx冲突,这里用-o进行重命名为pd-httpx.exe
pd-httpx.exe -h
#测试是否安装成功
# 常用命令
#探测单个目标
httpx -u https://example.com
#探测多个目标
httpx -u https://a.com https://b.com
#从文件读取目标
httpx -l targets.txt
#只输出存活结果
httpx -l targets.txt -silent
#显示状态码和标题
httpx -l targets.txt -sc -title

其他更详细的命令比如信息搜集,技术指纹,内容特征,过滤匹配可以看上面提到的参考文章
# 指纹识别
参考:https://blog.csdn.net/hmysn/article/details/124788105
通过关键特征,识别出目标的CMS系统、服务器、开发语言、操作系统、CDN、WAF的类别版本等等
其中主要识别以下的信息:
1、CMS信息:比如Discuz、织梦、帝国CMS、PHPCMS、ECshop等;
2、前端技术:比如HTML5、jquery、bootstrap 、Vue、ace等;
3、开发语言:比如PHP、Java、Ruby、Python、C#等;
4、Web服务器:比如Apache 、 Nginx、IIS、lighttpd等;
5、应用服务器:比如Tomcat、Jboss、Weblogic、Websphere等;
6、操作系统信息:比如Linux、win2k8、win7、Kali、Centos等;
7、CDN信息:是否使用CDN,如cloudflare、帝联、蓝讯、网宿、七 牛云、阿里云等;
8、WAF信息:是否使用WAF,如D盾、云锁、宝塔、安全狗、360等
其中cms、cdn、waf的指纹识别比较重要。
# 指纹识别的几种手段
# HTTP响应头分析
Server:暴露了Web服务器类型及版本。例如Server: nginx/1.18.0或Server: Microsoft-IIS/10.0X-Powered-By:暴露后端运行的开发语言或框架,例如X-Powered-By: PHP/7.4.3或X-Powered-By: ExpressSet-Cookie:不同的开发语言或框架通常有特定名称的Session ID,PHPSESSID表示php,JSESSIONID表示Java(Tomcat,JBoss等 ),ASP.NET_SessionID表示ASP.NET
# 网页源码与内容特征匹配
- Meta标签:很多CMS(内容管理系统)会自动生成带有标识的标签。例如
<meta name="generator" content="WordPress 5.8>" - 特定的HTML结构或注释,开发者有时候会在代码里留下固定的注释
- 特定的JavaScript变量或静态资源,比如页面加载了
/wp-content/themes/路径下的资源,那就必然是WordPress,或者代码中出现了特定的全局变量名称
# 特定文件与路径探测
有时候主页没有得到什么线索,可能通过发送特定请求去试探
- 默认后台路径:访问
/wp-login,php有响应就是WordPress,访问/seeyon/就是致远OA - 特有文件:探测网站根目录下的
robots.txt、、readme.html、changelog.txt,这些文件经常会泄露建站系统的详细版本号 - 报错页面特征:故意访问一个不存在的页面造成400或者发送畸形数据制造500,Tomcat、Spring Boot、Apache等都有自己非常独特且难以彻底修改的默认报错页面
# 哈希指纹对比
类似于提取数字DNA
- Favicon Hash(网站图标哈希):绝大多数的企业内部系统(如泛微OA、用友、各种路由器后台)都有默认的
favicon.ico图标,可以通过将这个图标文件下载下来计算其特定的哈希值(通常是MurmurHash),然后与数据库进行比对 - 静态文件Hash:对比某些核心JS、CSS文件的MD5值,不仅能识别出框架,还能定位到具体版本
# 网络层与协议层面识别
当Web层的特征被WAF抹除时,可以通过下降到网络层进行探测。
- TCP/IP堆栈指纹:Nmap扫描器通过
-o参数就可以实现。不同的操作系统(Windows,Linux,FreeBSD)在处理TCP/IP协议栈时,其TTL初始值、TCP窗口大小、TCP选项的排列顺序等都有细微差别 - JARM(TLS服务器指纹):这是由Salesforce团队开发的一种主动式指纹识别工具,他通过发送不同配置的TLS/SSL握手请求,根据服务器返回的加密套件支持情况和响应模式,生成一个唯一的JARM哈希值,这对于识别隐藏在CDN后的真是服务器环境非常有效
# 脆弱资产
脆弱资产,指信息系统中存在能被威胁利用的薄弱环节,包括配置缺陷、漏洞、弱口令等。它是构成安全风险的核心要素,一旦被利用会损害资产的机密性、完整性和可用性。通常需要通过自动扫描、合规性检查识别,并根据重要性进行修补管理
# 常见的脆弱资产类型
- 未修复补丁的系统:运行着包含已知公开漏洞软件的服务器。例如:依然运行着存在“永恒之蓝”漏洞的旧版服务器
- 配置错误的暴露面:不应暴露在公网的高危端口(如3389远程桌面、445SMB、6379Redis)
- 权限设置错误的云存储桶(允许匿名读取甚至写入数据)
- 启用了目录遍历或开启了Debug模式的web服务器
- 弱凭证与默认口令:管理后台、数据库或网络设备使用了出厂默认密码(如admin/admin)或者容易被字典爆破出来的弱口令
- 影子IT与遗留系统:这是渗透测试中最常见的突破点。指的是那些被部门遗忘、脱离安全监控、无人维护的旧版系统或临时搭建的测试环境。他们通常缺乏最基本的安全防护
- 泄露的敏感信息:例如开发人员不小心上传到Github公开仓库的数据库密码,API Key或内部网络拓扑图
# 漏洞扫描工具
这里只提一下nuclei
参考:http://blog.csdn.net/qq_43531669/article/details/145693107
# 常用命令
nuclei -u http://example.com
#扫描单个目标
nuclei -l targets.txt
#扫描多个目标
nuclei -u http://example.com -t http/exposures/
#使用特定的模版或模版目录
nuclei -u http://example.com -t cves/ -t exposures/
#使用多个模版目录
nuclei -u http://example.com -t ssl\deprecated-tls.yaml
#指定单个模版进行测试
nuclei -u http://example.com -tags jira,generic
#扫描具有特定标签的模版
nuclei -u http://example.com -s critical,high,medium
#根据严重程度运行模版
nuclei -et http/fuzzing/
#排除特定模版或模版目录
nuclei -l targets.txt -rl 50 -c 10
#限速
-rl, -rate-limit int 每秒最大请求量(默认:150)
-c, -concurrency int 并行执行的最大模板数量(默认:25)
#参数解释
nuclei -u http://example.com -o results.txt
#输出到文件
nuclei -u http://example.com -me res
#输出为md格式
-sresp 将nuclei的所有请求和响应输出到目录
-srd res 将nuclei的所有请求和响应输出到指定目录(默认:output)
#输出日志文件
nuclei -up
#更新Nuclei到最新版本
nuclei -ut
#更新nuclei模版到最新版
nuclei -l 1.txt -s critical,high,medium -me res
#常用命令
# 漏洞扫描器yaml的poc基本结构
参考:https://www.anquanke.com/post/id/283289
YAML是一种数据序列化语言,通常用于编写配置文件。它的基本语法如下:
大小写敏感、使用缩进表示层级关系、缩进时不允许使用Tab键,只允许使用空格、缩进的空格数目不重要,只要相同层级的元素左侧对齐即可、#表示注释,从这个字符到行尾都会被解析器忽略
YAML支持的数据结构:
对象:键值对的集合,使用冒号结构表示
数组:一组按次序排列的值,又称为序列(sequence)/列表(list),一组连词线开头的行,构成一个数组。如果数据结构的子成员是一个数组,则可以在该项下面缩进一个空格。
纯量(scalars):单个的、不可再分的值,如字符串、整数、布尔值等。
漏洞扫描器YAML的 这种poc主要由基础信息(id)、元数据(info)和请求与逻辑匹配(http/network/dns等)三大核心模块组成
最基础的HTTP漏洞检测(例如读取敏感文件)的完整YAML结构模版
id: poc-basic-structure-example # 1. 唯一标识符
info: # 2. 元数据信息块
name: Example Vulnerability Name
author: your_name
severity: high # 严重程度: info, low, medium, high, critical
description: 详细描述这个漏洞的成因、影响范围等。
reference: # 参考链接 (可选)
- https://example.com/cve-202X-XXXX
tags: cve,cve202x,lfi,config # 标签,用于分类和批量过滤扫描
http: # 3. 请求与匹配逻辑块 (以前的版本叫 requests)
- method: GET # 请求方法: GET, POST, PUT, DELETE 等
path:
- "<!--swig19-->/etc/passwd" # 请求路径,<!--swig20--> 是内置变量,代表目标地址
matchers-condition: and # 匹配器条件: and (必须全部满足), or (满足其一即可)
matchers: # 4. 匹配器 (判断是否存在漏洞的核心)
- type: word # 关键字匹配
part: body # 在响应包的哪个部分匹配: body, header, all
words:
- "root:x:0:0:" # 响应体中必须包含此字符串
- type: status # 状态码匹配
status:
- 200 # 响应状态码必须为 200
id:模版的唯一ID,不能包含空格,通常使用小写字母和连字符
info:元数据块
name:漏洞或资产的名称
author:编写该模版的作者
serverity:定义漏洞评级
tags:扫描时经常通过-tags参数来过滤需要执行的模版集
http:定义了发包的行为,nuclei还支持network,dns,file(本地文件)等协议块
method:定义HTTP请求方法
path:定义请求的URL,这里通常会使用nuclei的内置变量,如{{BaseURL}}(目标完整的URL)、{{HostURL}}(目标的域名/IP)
headers/body(可选):如果是POST请求,可以在这里自定义请求头和请求体
headers:
Content-Type: application/json
body: '{"username":"admin", "password":"password"}'
matchers(匹配器):判定漏洞是否存在,只有当发出请求的内容符合matchers中定义的规则时,才会判定漏洞存在。常用的匹配器类型:
word:匹配字符串(如报错信息,特定版本号)
regex:正则表达式匹配(如泄露的身份证号、Token)
status:HTTP状态码(如200/403)
size:响应包的大小匹配(适用于布尔盲注或响应长度固定的场景)
dsl:复杂的逻辑表达式匹配
binary:二进制数据匹配
matchers:
# 对响应 headers 进行字符串匹配
- type: word
part: header
words:
- "ADMINCONSOLESESSION"
# 对响应 body 进行字符串匹配,且要包含所有子串。
- type: word
part: body
words:
- 'uid='
- 'gid='
- 'groups='
condition: and
# 匹配 http 响应状态码
- type: status
status:
- 200
exrtactors(提取器):提取数据用到extractors,它与matchers平级
extractors:
- type: regex # 使用正则提取
part: body
name: extracted-token # 提取内容的命名
group: 1 # 提取正则中的第一个括号内容
regex:
- "Authorization: Bearer ([a-zA-Z0-9-._~+/]+)"
regwz:正则提取
kval:键值对,比如提取指定响应头
json:使用jq语法提取json数据
xpath:使用xpath提取html响应数据
dsl:使用表达式提取,不常用
extractors:
- type: regex
regex:
- "(u|g)id=.*"
使用正则提取了 id 命令的执行结果
# 使用find something或者直接查看JS找到网站的接口和路由
# 路由
路由(Routing)是指在互联网络中,通过预定规则和算法,从源地址到目的地址选择最佳传输路径的过程。它工作在OSI模型的网络层,利用路由器、交换机等设备管理数据流量,避免网络拥塞。主要类型包括直连、静态和动态路由。
路由表:路由器内部维护的一张表,包含网络路径状态、距离和成本参数,用于决定下一跳的地址
路由类型:
- 直连路由:设备接口直接相连的网段,无需配置,自动生成
- 静态路由:管理员手动配置的固定路径,安全但灵活性差
- 动态路由:路由器通过协议(如OSPF、BGP)自动交换信息并更新路径,适用于复杂网络
GET /login 指向展示登录界面的代码
POST /login 指向验证账号密码的代码
# 接口
接口(Interface/API)是连接两个不同系统、硬件或软件组件的桥梁,定义了数据交换和功能调用的规则与协议。在软件中,API(应用程序编程接口)允许应用间相互通信和共享数据;在硬件中,它指物理连接端口(如USB);在编程语言中,它是定义方法规范的抽象类型
接口是后端业务逻辑的具体体现。前端(网页或 App)通过调用接口来获取数据,并将其渲染成用户看到的画面。
# 直接查看JS文件
可以通过F12打开开发者工具,在Network中刷新页面选择过滤器JS

按照文件大小排序,通常体积最大的JS文件包含了核心的业务逻辑和路由表(通常命名为app.js,main.js,vendor.js或一串哈希值)
之后可以采用ctrl+shift+F打开全局搜索,可以搜索:/api/,/v1/,/v2/,/manage/,/admin/等常见接口前缀,也可以按照文件后缀:.php,.action,.do,.jsp,针对Vue/React可以搜索path:,routes,router.push(,按请求方法可以搜索:type: "POST",method: "GET",axios.post(,$.ajax(
# findsomething
和Hackbar一样属于插件,在Chorm插件商店中搜索FindSomething就可以下载

