信息搜集
信息搜集
Google Hacking
Google Hacking(也常被称为Google Dorking)是一种利用搜索引擎(特别是Google)的高级搜索操作符来发现隐藏在公共互联网上的敏感信息、漏洞或配置错误的攻击或信息收集技术。
高级搜索操作符
参考:https://zhuanlan.zhihu.com/p/400365865
site
用于限制搜索范围,只在特定的域名或网站内进行搜索
1 | site:example.com |
filetype和exp
用于指定文件类型,只搜索具有特定扩展名的文件
1 | site:baidu.com filetype:pdf |
intitle和allintitle
用于限制网页标题,只搜索网页标题中带有特定词语的页面
1 | intitle:百度 |
这里需要提一下intile和allintitle的区别:
1 | intitle:百度 登录 |
inurl和allinurl
用于限制URL路径,搜索URL网址中包含特定字符串的页面
1 | inurl:login |
inurl和allinurl的区别与intitle和allintitle的区别一样,allinurl可以指定多个词
1 | inurl:login admin |
intext和allintext
用于限制网页正文,搜索网页正文中包含特定词语的页面
1 | intext:后台登录 |
link
搜索网页中包含指定URL链接的页面,也就是“找外链”或“反向链接”
1 | link:baidu.com |
Google为了防止SEO(搜索引擎优化)作弊,几年前已经逐渐废弃/削弱了这个指令的准确性,现在搜索出来的结果往往不全
related
用于查找相似/关联网站,搜索与指定网站内容相似或有业务关联的其他网站
1 | related:cuit.edu.cn |
cache
用于查看网页历史缓存,不直接访问目标服务器,而是查看Google(爬虫)上一次抓取该网页时存下来的“网页快照”
1 | cache:baidu.com |
info
返回站点的指定信息
1 | info:baidu.com |
Google在2017年正式废弃了这个操作符,现在如果输入info:baidu.com通常只会重定向到普通URL的搜索结果
define
返回某个词语的定义
1 | define:Hacker |
phonebook
电话簿查询美国街道地址和电话号码信息。例如:phonebook:Lisa+CA 将返回名字里面包含Lisa并住在加州的人的所有名字
一些组合示例
1 | filetype:env intext:"DB_PASSWORD" |
1 | #查找网站后台 |
1 | #查看服务器使用的程序 |
1 | #查看上传漏洞 |
index of
index of语法通常写作intitle:index of,它专门用于寻找存在目录遍历漏洞的网站,当我们访问www.example.com/uploads时,服务区通常回去寻找这个目录下的默认主页文件(比如index.html或者index.php),但如果这个目录下没有默认主页文件或者管理员没有关闭”目录浏览“权限,那么访问之后就会列出这个文件夹里的所有文件和子文件夹,可以下载
1 | #寻找数据库备份文件 |
1 | #寻找网站源码压缩包 |
在这些搜索参数中|都表示逻辑或,当搜索条件变复杂时也可以用()包裹
1 | intitle:"index of" (ext:sql | ext:bak | ext: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以及它的一些信息
语法
点击上面的语法可以看到基础的查询语法是什么
| 逻辑连接符 | 具体含义 |
|---|---|
| = | 匹配,=””时,可查询不存在字段或者值为空的情况 |
| == | 完全匹配,==””时,可查询存在且值为空的情况。 |
| && | 与 |
| || | 或 |
| != | 不匹配,!=””时,可查询值不为空的情况。 |
| *= | 模糊匹配,使用*或者?进行搜索。 |
| () | 确认查询优先级,括号内容优先级最高。 |
除此之外还有很多内容,就一一不列举了。
根域名/主域名查询:用于收集某个企业或组织名下的所有子域名资产,扩大攻击或防护的暴露面。
1
domain="example.com"
证书域名查询:当目标网站套了一层CDN(内容分发网络)或WAF隐藏了真实IP时,很多时候其服务器443端口绑定的SSL证书依然会暴露目标域名,通过反查证书,经常能绕过CDN找到真实IP。
1
2cert="example.com"
#搜索证书中带有该域名的资产应用指纹查询:寻找使用了特定组件、CMS、中间件或框架的网站,当某个组件爆发0day漏洞(比如Log4j、ThinkPHP、泛微OA),就可以利用指纹语法去全网测绘受影响的资产范围。
1
2app="ThinkPHP"
app="泛微-协同办公OA"站点Icon图标哈希查询:很多企业在部署内部系统(后台管理、VPN等)时,虽然域名不同甚至没有域名,但他们往往会使用同一个企业Logo(favicon.ico),通过计算这个图标的hash值,可以找出隐蔽的关联资产
1
icon_hash="-247388890"
其他引擎的相关语法:
根域名/主域名查询:
1
2
3Hunter: domain.suffix="example.com"
ZoomEye: site:"example.com"
Quake: domain:"example.com"证书域名查询:
1
2
3Hunter: cert.subject="example.com" 或 cert.is_valid="true"(结合使用查找有效证书)
ZoomEye: ssl.cert.subject.cn:"example.com" 或简单的 ssl:"example.com"
Quake: cert:"example.com"应用指纹查询:
1
2
3Hunter: app.name="ThinkPHP"
ZoomEye: app:"ThinkPHP"
Quake: app:"ThinkPHP"站点Icon图标哈希查询:
1
2
3Hunter: web.icon=="hash值"
ZoomEye: iconhash:"-247388890"
Quake: favicon:"-247388890"
子域名收集
利用oneforall工具:
1 | git clone https://gitee.com/shmilylty/OneForAll.git |
使用:
1 | python3 oneforall.py --target example.com run |
利用fofa进行搜集:
1 | domain="example.com" |
企业查询搜集
可以通过企查查、爱企查、风鸟、天眼查等工具进行公司资产体系的确定,确定之后重点看知识产权里面的主域名,小程序,APP,微信服务号公众号等内容
资产测活
通过企查查等搜集到的子域名通常包含大量无效资产,或许是域名已经废弃,不再解析到任何IP,或者服务器已经关机或下线,或者端口虽然开放,但没有运行任何web服务,或者存在内部防火墙外部无法访问……资产测活就是通过发送特定的网络探测请求,来验证这些资产中哪些是当前在线的、有响应的、并且运行这web服务的。
而资产测活用到的工具通常是httpx、dddd等工具
参考:https://www.cnblogs.com/hackernb/p/19692906
简单介绍一下httpx工具的安装(在安装httpx之前请先确保电脑上安装了go语言环境,1.21版本以上):
1 | git clone https://github.com/projectdiscovery/httpx.git |
常用命令
1 | #探测单个目标 |
其他更详细的命令比如信息搜集,技术指纹,内容特征,过滤匹配可以看上面提到的参考文章
指纹识别
参考: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
常用命令
1 | nuclei -u http://example.com |
漏洞扫描器yaml的poc基本结构
参考:https://www.anquanke.com/post/id/283289
YAML是一种数据序列化语言,通常用于编写配置文件。它的基本语法如下:
大小写敏感、使用缩进表示层级关系、缩进时不允许使用Tab键,只允许使用空格、缩进的空格数目不重要,只要相同层级的元素左侧对齐即可、#表示注释,从这个字符到行尾都会被解析器忽略
YAML支持的数据结构:
对象:键值对的集合,使用冒号结构表示
数组:一组按次序排列的值,又称为序列(sequence)/列表(list),一组连词线开头的行,构成一个数组。如果数据结构的子成员是一个数组,则可以在该项下面缩进一个空格。
纯量(scalars):单个的、不可再分的值,如字符串、整数、布尔值等。
漏洞扫描器YAML的 这种poc主要由基础信息(id)、元数据(info)和请求与逻辑匹配(http/network/dns等)三大核心模块组成
最基础的HTTP漏洞检测(例如读取敏感文件)的完整YAML结构模版
1 | id: poc-basic-structure-example # 1. 唯一标识符 |
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请求,可以在这里自定义请求头和请求体
1 | headers: |
matchers(匹配器):判定漏洞是否存在,只有当发出请求的内容符合matchers中定义的规则时,才会判定漏洞存在。常用的匹配器类型:
word:匹配字符串(如报错信息,特定版本号)
regex:正则表达式匹配(如泄露的身份证号、Token)
status:HTTP状态码(如200/403)
size:响应包的大小匹配(适用于布尔盲注或响应长度固定的场景)
dsl:复杂的逻辑表达式匹配
binary:二进制数据匹配
1 | matchers: |
exrtactors(提取器):提取数据用到extractors,它与matchers平级
1 | extractors: |
regwz:正则提取
kval:键值对,比如提取指定响应头
json:使用jq语法提取json数据
xpath:使用xpath提取html响应数据
dsl:使用表达式提取,不常用
1 | extractors: |
使用正则提取了 id 命令的执行结果
使用find something或者直接查看JS找到网站的接口和路由
路由
路由(Routing)是指在互联网络中,通过预定规则和算法,从源地址到目的地址选择最佳传输路径的过程。它工作在OSI模型的网络层,利用路由器、交换机等设备管理数据流量,避免网络拥塞。主要类型包括直连、静态和动态路由。
路由表:路由器内部维护的一张表,包含网络路径状态、距离和成本参数,用于决定下一跳的地址
路由类型:
- 直连路由:设备接口直接相连的网段,无需配置,自动生成
- 静态路由:管理员手动配置的固定路径,安全但灵活性差
- 动态路由:路由器通过协议(如OSPF、BGP)自动交换信息并更新路径,适用于复杂网络
1 | GET /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就可以下载
