[TOC]
前端加密绕过
概述:
对渗透测试⼈员来说,当数据包⾥都是密⽂,我们⽆从下⼿;就算是获得了加解密的⼀些关键信息,能解密出来,但是每个数据包我们都需要慢慢解密,请求包需要解密,响应包也需要解密,⽐较麻烦。
加密的⽹站往往会存在⼤量问题!!!但是由于加密⽆法直接使⽤⼯具进⾏攻击,因此就必须要尝试绕过加密!
常见加密类型
可逆编码类:
- Base64
- URL编码
- Hex编码
对称加密:
AES/DES/3DES
典型特征:
- 固定⻓度输出
- 需要密钥和IV
- 常⻅库:CryptoJS
非对称加密:
RSA算法
典型应⽤:
- 加密对称密钥
- 请求签名验证
哈希算法:
MD5/SHA系列
常⻅⽤途:
- 参数签名
- 数据完整性校验
常见加密绕过实操
靶场安装
encrypt-labs靶场列出了常⻅的8种⽅式,包含⾮对称加密、对称加密、加签以及禁⽌重放的测试场景,⽐如AES、DES、RSA,⽤于渗透测试加解密练习。js代码做了混淆,感觉较难分析的可以使⽤easy.php进⾏练习。
下载云盘中的encrypt-labs-main.zip,解压并使⽤phpstudy搭建⽹站,导⼊根⽬录下的sql⽂件。访问域名下的easy.php即可 encrypt.com/easy.php
解密插件安装
Burp插件autoDecoder,根据⾃定义来达到对数据包的处理(适⽤于加解密、爆破等),类似mitmproxy,不同点在于经过了burp中转,在⾃动加解密的基础上,不影响APP、⽹站加解密正常逻辑等。 github.com/f0ng/autoDe…
靶场实操
【第⼀关】AES固定key
抓包发现数据包被加密了:加密参数为 encryptedData
尝试解码,发现密文经过URL编码和Base64编码。
F12打开开发者⼯具,选择“源代码/来源”,拦截所有url请求
前端代码会暂停在发出http请求之前,根据调⽤堆栈,向上查找,发现是⽤ AES 加密。根据上下⽂信息可知:
AES 加密, CBC 模式, PKCS5Padding key:1234567890123456 / iv:1234567890123456 (无编码方式,null) autoDecoder 配置数据包⾃动加解密
输⼊ key / iv ,设置正则表达式,正确设置正则表达式之后才可以实现⾃动解密,点击添加请求包解密方式。
配置需要加解密的域名和关键词,关键词选取明文中或密文中。然后保存配置。
尝试重放,重放成功!
【第二关】AES加签绕过
抓包分析
可以看到有两个参数不清楚是啥,分别是 nonce , signature, 还有个时间戳,分析下js看看,依旧是js中下断点,发包
nonce:由 0-9 a-z ⽣成的10位随机数 dataToSign:username + password + nonce + timestamp signature:由 dataToSign 经 SHA256 加密⽣成, secretKey 为固定值 be56e057f20f883e SHA256 在 autoDecoer 中没有,尝试⾃写发包器,其中 nonce 可以随机⽣成也可以固定
⾸先安装flask框架
pip3 install flask
创建⼀个⽂件 app.py,内容为
from flask import Flask, request
import re
import hashlib
import hmac
app = Flask(__name__)
secret_key = "be56e057f20f883e"
@app.route('/encode',methods=["POST"]) # base64加密
def encrypt():
param = request.form.get('dataBody')
re_name = r'"username":"(.*?)",'
re_pass = r'"password":"(.*?)",'
re_sign = r'"signature":"(.*?)"'
re_nonce = r'"nonce":"(.*?)",'
re_timestamp = r'"timestamp":(.*?),'
username = re.search(re_name, param).group(1)
password = re.search(re_pass, param).group(1)
nonce = re.search(re_nonce, param).group(1)
timestamp = re.search(re_timestamp, param).group(1)
data_to_sign = f"{username}{password}{nonce}{timestamp}"
print(data_to_sign)
new_signature = hmac.new(secret_key.encode('utf-8'), data_to_sign.encode('utf-8'), hashlib.sha256).hexdigest()
new_param = re.sub(re_sign, f'"signature":"{new_signature}"', param)
return new_param
@app.route('/decode',methods=["POST"])
def decrypt():
param = request.form.get('dataBody')
return param
if __name__ == '__main__':
app.run(host="0.0.0.0",port="5000")
然后,运⾏ app.py。
python3 ./app.py
选择接⼝加解密
设置接⼝地址如下:
配置选项为接⼝加解密,测试成功
尝试改账号密码重放,试验成功:
内网渗透基础
内网架构
内⽹(Intranet)是企业或组织内部构建的私有⽹络,与互联⽹逻辑隔离,采⽤RFC 1918定义的私有IP地址空间: 经典内⽹IP段: 10.0.0.0/8 (⼤型企业) 172.16.0.0/12 (中型⽹络) 192.168.0.0/16 (⼩型办公/家庭⽹络)
典型架构模型:
| 架构类型 | 特点 | 攻击面分析 |
|---|---|---|
| 单域环境 | 单⼀Active Directory域控管理所有主机 | 攻破域控即控制全⽹ |
| 多域林 | ⽗⼦域或跨域信任关系 | 利⽤信任关系跨域攻击 |
| ⼯作组模式 | ⽆集中认证,依赖本地账号和SMB共享 | 弱⼝令爆破、共享目录遍历 |
| 云混合架构 | 本地AD与Azure AD同步(Hybrid AD) | 攻击云服务接⼝或同步账号 |
内网核心组件
Active Directory(AD):
- 域控制器(DC):运⾏Kerberos认证服务(KDC)
- 组策略(GPO):集中管理客户端配置
- LDAP服务:存储所有域对象信息(端⼝389/636)
关键服务器⻆⾊:
- ⽂件服务器(SMB/NFS)
- 数据库服务器(MSSQL/MySQL)
- 邮件服务器(Exchange)
- 证书服务器(CA)
内网环境示例
内网应用场景
- 企业的局域⽹,⽤于员⼯之间的通信和资源共享。
- 企业内部系统供员⼯使⽤,保障数据安全。
- 通过VPN技术,实现远程员⼯安全访问内⽹资源。
工作组
⼯作组是⼀种简单的⽹络设备组织⽅法,通常⽤于家庭⽹络或⼩型企业⽹络。它允许⽹络上的计算机和设备共享资源,如⽂件和打印机。⼯作组中的每台计算机都负责其自身的安全性,这与另⼀种组织⽅法——域,有所不同。
(家庭联产承包责任制)
加入或创建工作组
在⼤多数Windows操作系统中,创建⼀个⼯作组是相当简单的。以Windows10为例,你只需将计算机设置为属于这个⼯作组,如果⼯作组尚不存在,系统将⾃动创建它
访问工作组
在Windows环境中,你可以通过这些步骤访问同⼀⽹络内的⼯作组。打开⽂件资源管理器,在左侧的导航⾯板中,找到并点击"⽹络" 如果你不能看到其他计算机,可能是因为⽹络发现或⽂件和打印机共享功能被关闭了,如下图所示
在这种情况下,你需要在"⽹络和共享中⼼"中打开这些功能
退出工作组
只要将⼯作组名称改动即可。不过在⽹上别⼈照样可以访问你的共享资源。你也可以随便加⼊同⼀⽹络上的任何其它⼯作组。“⼯作组”就像⼀个可以⾃由进⼊和退出的“社团”,⽅便同⼀组的计算机互相访问
域
(大锅饭)
域的基本概念
域可以被视为⼯作组的升级版,其安全管理和控制机制要⽐⼯作组严谨许多。在域环境中可以对账户分配资源访问权限,每个⽤户都拥有⼀个唯⼀的账户,⽤户需要以合法身份登录域才能访问域中的资源。域是设定了安全边界的计算机群体,即在两个不同的域中,⼀个域的⽤户⽆法访问另⼀个域的资源。
域中计算机的分类
域控制器
**域控制器中储存有构成该域的⽤户账户、密码、所属计算机等信息的数据库。**当计算机连接到域时,域控制器会⾸先验证这台计算机是否属于该域,以及⽤户使⽤的登录账号是否存在、密码是否正确。
域控制器充当着整个域的通信枢纽,所有权限验证都在域控制器上进行。
成员服务器成员服务器
成员服务器(Member Server)是已经加⼊到某⼀域,但是不承担域控制器⻆⾊的服务器。它们可以提供各种服务,如⽂件共享、打印服务、应⽤服务等,但身份验证和权限管理等任务由域控制器处理。
客户机
客户机(Client)是域中的⼯作站或者个⼈电脑,它们被添加到域中并受到域控制器的管理。客户机上的⽤户需要通过域控制器验证其身份后,才能访问域内的资源。
独立服务器
独⽴服务器(Standalone Server)是不属于任何域的服务器,它在⽹络中完全独⽴,拥有⾃⼰的⽤户账 户数据库,进⾏⾃身的⽤户身份验证和权限管理。独⽴服务器适合⽤在不需要集中管理的⼩型⽹络环 境,或者出于某种安全原因需要将某些服务器与域⽹络隔离的场景。
域的结构
父域和子域
⽗域:在⼀个主域(或⽗域)下可以建⽴⼀个或多个⼦域。
⼦域:⼦域是在⽗域下创建的域。⼦域继承了⽗域的所有策略和设置(尽管某些设置可以在⼦域级别被重写或改变)。
域树
域树(Domain Tree)⽤于表示域之间的层级关系。在域树结构中,你有⼀个根域,它是域树的最顶层。所有其他的域都是该根域的⼦域或者⼦域的⼦域,如下图所示
域森林
域森林(Domain Forest)是由多个域树组成的集合,每个域树都有⾃⼰独⽴的命名空间。这些域树通过建⽴信任关系彼此相连,形成⼀个⼤的⽹络环境
活动目录
活动⽬录(Active Directory,AD) 是由微软开发的⼀种⽬录服务,它⽤于Windows域⽹络。通过活动⽬录,可以执⾏各种⽹络管理和存储任务。在⼀个典型的域环境中,Active Directory提供⼀种⽅法来处理⽤户帐户,计算机帐户,安全证书,以及其他相关信息。
Active Directory利⽤Kerberos协议为⽤户和计算机提供安全的认证服务。
域内权限划分
组分类
在Active Directory环境中,组(Group)被定义为⽤户账号的集合。这个概念的优势在于,管理员可以给整个组分配权限,⽽⽆需单独为每个⽤户设定。
A-G-DL-P策略
A-G-DL-P 策略涉及⽤户账户、全局组、域本地组和权限分配的⼀种⽅法,其中:
- A 代表⽤户账户(Account)
- G 代表全局组(Global Group)
- DL 代表域本地组(Domain Local Group)
- P 代表资源权限(Permission)
这种策略的优势在于,其结构化的⽅法极⼤简化了权限管理。⼀旦设定了 A-G-DL-P 策略,当需要给⽤户添加特定权限时,只需将⽤户添加到相应的域本地组即可
域认证
Kerberos协议
Kerberos也是⼀种⽹络身份验证协议,主要⽤于在⾮安全⽹络环境中(如互联⽹)验证⽤户身份。Kerberos的名字源于希腊神话中的三头狗兽——克尔伯洛斯,这只狗兽是冥界的守⻔者,这也象征了Kerberos协议的安全和防护功能
Kerberos协议的组成部分
kerberos协议中也存在三个⻆⾊,分别是
-
客户端(Client):⻆⾊发起请求的⼀⽅。(游客)
-
服务端(Server):⻆⾊接收和响应请求的⼀⽅。(景点)
-
密钥分发中⼼(Key Distribution Center,KDC):此⻆⾊负责管理和分发密钥,通常被进⼀步划分为两部分:
-
认证服务器(Authentication Server,AS):AS的主要职责是验证客户端的身份,并发放⼀个特殊的票据,即票据授权票据(Ticket-Granting Ticket,TGT),⽤于客户端访问票据授予服务器)。
(售票口,发放入场券)
-
票据授予服务器(Ticket-Granting Server,TGS):TGS负责提供认证过程所需的服务授予票(Service Granting Ticket),以及当客户端需要访问服务端时所需的票据。
(检票口,发放专门景点券)
-
Kerberos协议认证流程
-
客户端与AS进⾏通信
客户端以明⽂⽅式向AS发送请求,请求中包含⽤户名、主机IP和当前时间戳。AS接收请求后,查询Kerberos认证数据库是否存在该⽤户。如果⽤户存在,AS返回响应给客户端,响应包括两部分内容:
第⼀部分:**票据授予票据(TGT),**整个TGT使⽤TGS密钥加密,客户端⽆法解密。
第⼆部分:该部分内容使⽤客户端密钥加密,如果是⼀个假的客户端,由于他不拥有真正客户端的密钥,因此⽆法解密这部分内容。如果是⼀个假的客户端,由于他不拥有真正客户端的密钥,因此⽆法解密这部分内容。
-
客户端与TGS进⾏通信
在收到 AS 的响应并获取两部分内容后,客户端会使⽤⾃⼰的密钥对第⼆部分内容进⾏解密,从⽽得到时间戳、即将访问的TGS 信息和与 TGS 通信的密钥 (CT_SK)。客户端会检查时间戳,若与发出请求时的时间差超过5分钟,会视为AS 为伪造并认证失败;若时间戳合理,则准备向TGS 发起请求。
-
客户端与服务端进⾏通信
此阶段,客户端已收到来⾃TGS 的响应,它将使⽤本地缓存的CT_SK 解密第⼆部分内容(注意,第⼀部分内容的 ST 是由 Server 密码加密的,客户端⽆法解密)。在检查时间戳⽆误后,客户端取出其中的 CS_SK,准备向服务端发起最后的请求。
当服务端收到客户端的请求,它会使⽤⾃⼰的密钥,即Server 密钥,对客户端的第⼆部分内容进⾏解密,核对时间戳后取出CS_SK。然后,服务端使⽤CS_SK 对客户端发来的第⼀部分内容进⾏解密,从⽽获取经过 TGS 认证的客户端信息。接下来,服务端会将这部分信息和客户端第⼆部分内容中的⾃⼰的信息进⾏⽐对,从⽽确认客户端确实是经过KDC 认证且具有真实身份的。经过这⼀系列操作后,服务端确定该客户端是它可以提供服务的对象。
此时,服务端返回⼀条使⽤CS_SK 加密的表示接收请求的响应给客户端。客户端在收到此响应后,使⽤本地缓存的 CS_SK 进⾏解密,同时也确认了服务端的身份。
票据
黄金票据
当⼀个⽤户(或服务)希望进⾏身份验证时,他们⾸先会请求⼀个称为票据授予票据(Ticket GrantingTicket, TGT)的特殊票据,这个TGT是由KDC⽣成的,其特性是被krbtgt账户的密钥所加密
"⻩⾦票据"(Golden Ticket)是指在Kerberos身份验证协议中,攻击者创建的伪造的票据授予票据(TGT)。这种攻击⽅式得名于,⼀旦攻击者拥有了krbtgt(即票据授予服务账户)的密钥,他们就能制造任意TGT,并可以⽤来伪装任何⽤户,包括系统管理员,获得⽹络内任何资源的访问权限。
白银票据
若说⻩⾦票据是伪造的TGT,那么⽩银票据就是伪造的ST,在Kerberos协议中,"⽩银票据"(SilverTicket)是指服务票据(Service Ticket),这是客户端从票据授予服务(Ticket Granting Service,TGS)获得的,⽤于向特定服务(如⽂件服务器、邮件服务器等)验证其身份的凭证
内网渗透思路解析
简化的攻击链示例简化的攻击链示例:
钓⻥邮件-> ⽤户点击-> 释放Loader -> 执⾏C2 Beacon (普通⽤户)
-> 本地信息收集& 提权(利⽤漏洞/配置错误-> Local Admin)
-> 转储凭据(Mimikatz -> 获取域⽤户Hash/明⽂)
-> 横向移动(Pass the Hash -> 到⽂件服务器,获取更多凭据/敏感⽂件)
-> 横向移动(WinRM -> 到应⽤服务器,发现其使⽤⾼权限服务账户)
-> Kerberoasting攻击-> 破解服务账户密码
-> 发现该服务账户在`Server Admins`组-> 该组对某台域控有`WriteDACL`权限
-> 利⽤该权限给⾃⼰账户添加`DCSync`权限
-> 执⾏DCSync -> 获取`krbtgt` Hash
-> 制作⻩⾦票据-> 访问域控,植⼊隐蔽后⻔(WMI事件订阅)
-> 定位并窃取核⼼数据库数据(低速加密外传)
-> (可选) 清理关键⽇志
第一阶段:初始立足点
第二阶段:信息收集与侦察
第三阶段:权限提升
第四阶段:横向移动
第五阶段:目标达成与权限维持
第六阶段:清理痕迹
内网渗透靶场搭建
虚拟机默认密码:hongrisec@2025
Web服务器: Windows7(内配有phpstudy web环境) 外⽹ip: ⾃动分配ip模拟外⽹ip 内⽹ip:192.168.52.143
域内主机: Win2K3 Metasploitable 内⽹ip:192.168.52.141
域控: Windows 2008 内⽹ip:192.168.52.138
配置好之后,可以创建快照!