信息搜集

Google Hacking

Google Hacking(也常被称为Google Dorking)是一种利用搜索引擎(特别是Google)的高级搜索操作符来发现隐藏在公共互联网上的敏感信息、漏洞或配置错误的攻击或信息收集技术。

高级搜索操作符

参考:https://zhuanlan.zhihu.com/p/400365865

site

用于限制搜索范围,只在特定的域名或网站内进行搜索

1
2
site:example.com
#只在example.com及其子域名下搜索

filetype和exp

用于指定文件类型,只搜索具有特定扩展名的文件

1
2
3
site:baidu.com filetype:pdf
site:baidu.com ext:pdf
#表示查找在baidu.com站点上文件类型为pdf的网页

intitle和allintitle

用于限制网页标题,只搜索网页标题中带有特定词语的页面

1
2
intitle:百度
#只返回标题中包含百度的网页

这里需要提一下intile和allintitle的区别:

1
2
3
4
5
6
intitle:百度 登录
#表示搜索标题中包含百度的网页,网页的任意位置必须包含"登录"
allintitle:百度 登录
#表示网页的标题中必须同时包含"百度"和"登录"两个词

allintitle:A B相当于intitle:A intitle:B

inurl和allinurl

用于限制URL路径,搜索URL网址中包含特定字符串的页面

1
2
inurl:login
#表示搜索URL网址中包含login的网页

inurlallinurl的区别与intitleallintitle的区别一样,allinurl可以指定多个词

1
2
3
4
5
6
inurl:login admin
#表示网页的网址URL中必须包含login,网页的任意位置必须包含admin,admin作为全局搜索词
allinurl:login admin
#表示网页的网址URL中必须同时包含login和admin

allinurl:A B等价于inurl:A inurl:B

intext和allintext

用于限制网页正文,搜索网页正文中包含特定词语的页面

1
2
intext:后台登录
#表示搜索网页正文中包含后台登录的网页

搜索网页中包含指定URL链接的页面,也就是“找外链”或“反向链接”

1
2
link:baidu.com
#返回所有包含指向baidu.com的网页

Google为了防止SEO(搜索引擎优化)作弊,几年前已经逐渐废弃/削弱了这个指令的准确性,现在搜索出来的结果往往不全

用于查找相似/关联网站,搜索与指定网站内容相似或有业务关联的其他网站

1
2
related:cuit.edu.cn
#返回与cuit.edu.cn相似的页面,相似指的是网页的布局相似

cache

用于查看网页历史缓存,不直接访问目标服务器,而是查看Google(爬虫)上一次抓取该网页时存下来的“网页快照”

1
2
3
4
cache:baidu.com
#让Google不去访问现在的百度服务器,而是直接展示Google数据库里保存的baidu.com首页的历史快照
cache:baidu.com login
#在刚刚打开的快照页面中自动寻找并高亮显示"login"这个词

info

返回站点的指定信息

1
2
info:baidu.com
#将返回百度的一些信息

Google在2017年正式废弃了这个操作符,现在如果输入info:baidu.com通常只会重定向到普通URL的搜索结果

define

返回某个词语的定义

1
2
define:Hacker
#将返回关于Hacker的定义

phonebook

电话簿查询美国街道地址和电话号码信息。例如:phonebook:Lisa+CA 将返回名字里面包含Lisa并住在加州的人的所有名字

一些组合示例

1
2
3
4
5
6
7
8
9
10
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"
#寻找特定设备的网络摄像头,可以直接搜出很多没有设置密码、暴露在公网上的网络摄像头
1
2
3
4
#查找网站后台
site:http://xx.com intext:管理
site:http://xx.com inurl:login
site:http://xx.com intitle:后台
1
2
3
4
5
#查看服务器使用的程序
site:http://xx.com filetype:asp
site:http://xx.com filetype:php
site:http://xx.com filetype:jsp
site:http://xx.com filetype:aspx
1
2
3
#查看上传漏洞
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),但如果这个目录下没有默认主页文件或者管理员没有关闭”目录浏览“权限,那么访问之后就会列出这个文件夹里的所有文件和子文件夹,可以下载

1
2
#寻找数据库备份文件
intitle:"index of" ext:sql | ext:bak
1
2
3
4
5
6
#寻找网站源码压缩包
intitle:"index of" "backup.zip" | "wwwroot.rar"
#寻找员工内部资料或通讯录
intitle:"index of" "confidential" ext:pdf | ext:xls
#寻找摄像头录像或私人相册
intitle:"index of" "DCIM" | "CCTV"

在这些搜索参数中|都表示逻辑或,当搜索条件变复杂时也可以用()包裹

1
2
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

https://fofa.info/

通过搜索zlaryy可以看到返回了https://zlaryy123.github.io以及它的一些信息

语法

点击上面的语法可以看到基础的查询语法是什么

逻辑连接符 具体含义
= 匹配,=””时,可查询不存在字段或者值为空的情况
== 完全匹配,==””时,可查询存在且值为空的情况。
&&
||
!= 不匹配,!=””时,可查询值不为空的情况。
*= 模糊匹配,使用*或者?进行搜索。
() 确认查询优先级,括号内容优先级最高。

除此之外还有很多内容,就一一不列举了。

  • 根域名/主域名查询:用于收集某个企业或组织名下的所有子域名资产,扩大攻击或防护的暴露面。

    1
    domain="example.com"
  • 证书域名查询:当目标网站套了一层CDN(内容分发网络)或WAF隐藏了真实IP时,很多时候其服务器443端口绑定的SSL证书依然会暴露目标域名,通过反查证书,经常能绕过CDN找到真实IP。

    1
    2
    cert="example.com"
    #搜索证书中带有该域名的资产
  • 应用指纹查询:寻找使用了特定组件、CMS、中间件或框架的网站,当某个组件爆发0day漏洞(比如Log4j、ThinkPHP、泛微OA),就可以利用指纹语法去全网测绘受影响的资产范围。

    1
    2
    app="ThinkPHP"
    app="泛微-协同办公OA"
  • 站点Icon图标哈希查询:很多企业在部署内部系统(后台管理、VPN等)时,虽然域名不同甚至没有域名,但他们往往会使用同一个企业Logo(favicon.ico),通过计算这个图标的hash值,可以找出隐蔽的关联资产

    1
    icon_hash="-247388890"

其他引擎的相关语法:

  • 根域名/主域名查询:

    1
    2
    3
    Hunter: domain.suffix="example.com"
    ZoomEye: site:"example.com"
    Quake: domain:"example.com"
  • 证书域名查询:

    1
    2
    3
    Hunter: cert.subject="example.com" 或 cert.is_valid="true"(结合使用查找有效证书)
    ZoomEye: ssl.cert.subject.cn:"example.com" 或简单的 ssl:"example.com"
    Quake: cert:"example.com"
  • 应用指纹查询:

    1
    2
    3
    Hunter: app.name="ThinkPHP"
    ZoomEye: app:"ThinkPHP"
    Quake: app:"ThinkPHP"
  • 站点Icon图标哈希查询:

    1
    2
    3
    Hunter: web.icon=="hash值"
    ZoomEye: iconhash:"-247388890"
    Quake: favicon:"-247388890"

子域名收集

利用oneforall工具:

1
2
3
4
5
6
7
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=""

使用:

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
2
3
4
5
6
7
8
9
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
#测试是否安装成功

常用命令

1
2
3
4
5
6
7
8
9
10
#探测单个目标
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.0Server: Microsoft-IIS/10.0
  • X-Powered-By:暴露后端运行的开发语言或框架,例如X-Powered-By: PHP/7.4.3X-Powered-By: Express
  • Set-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.htmlchangelog.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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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结构模版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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:
- "{{BaseURL}}/etc/passwd" # 请求路径,{{BaseURL}} 是内置变量,代表目标地址

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还支持networkdnsfile(本地文件)等协议块

method:定义HTTP请求方法

path:定义请求的URL,这里通常会使用nuclei的内置变量,如{{BaseURL}}(目标完整的URL){{HostURL}}(目标的域名/IP)

headers/body(可选):如果是POST请求,可以在这里自定义请求头和请求体

1
2
3
headers:
Content-Type: application/json
body: '{"username":"admin", "password":"password"}'

matchers(匹配器):判定漏洞是否存在,只有当发出请求的内容符合matchers中定义的规则时,才会判定漏洞存在。常用的匹配器类型:

word:匹配字符串(如报错信息,特定版本号)

regex:正则表达式匹配(如泄露的身份证号、Token)

status:HTTP状态码(如200/403)

size:响应包的大小匹配(适用于布尔盲注或响应长度固定的场景)

dsl:复杂的逻辑表达式匹配

binary:二进制数据匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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平级

1
2
3
4
5
6
7
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:使用表达式提取,不常用

1
2
3
4
extractors:
- type: regex
regex:
- "(u|g)id=.*"

使用正则提取了 id 命令的执行结果

使用find something或者直接查看JS找到网站的接口和路由

路由

路由(Routing)是指在互联网络中,通过预定规则和算法,从源地址到目的地址选择最佳传输路径的过程。它工作在OSI模型的网络层,利用路由器、交换机等设备管理数据流量,避免网络拥塞。主要类型包括直连、静态和动态路由。

路由表:路由器内部维护的一张表,包含网络路径状态、距离和成本参数,用于决定下一跳的地址

路由类型:

  • 直连路由:设备接口直接相连的网段,无需配置,自动生成
  • 静态路由:管理员手动配置的固定路径,安全但灵活性差
  • 动态路由:路由器通过协议(如OSPF、BGP)自动交换信息并更新路径,适用于复杂网络
1
2
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就可以下载