mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 20:53:37 +00:00
Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
This commit is contained in:
parent
0666ec4eba
commit
b83b69926a
8 changed files with 450 additions and 288 deletions
|
@ -313,13 +313,13 @@
|
|||
* [Webview Attacks](mobile-pentesting/android-app-pentesting/webview-attacks.md)
|
||||
* [iOS Pentesting Checklist](mobile-pentesting/ios-pentesting-checklist.md)
|
||||
* [iOS Pentesting](mobile-pentesting/ios-pentesting/README.md)
|
||||
* [Basic iOS Testing Operations](mobile-pentesting/ios-pentesting/basic-ios-testing-operations.md)
|
||||
* [Burp Suite Configuration for iOS](mobile-pentesting/ios-pentesting/burp-configuration-for-ios.md)
|
||||
* [Extracting Entitlements From Compiled Application](mobile-pentesting/ios-pentesting/extracting-entitlements-from-compiled-application.md)
|
||||
* [Frida Configuration in iOS](mobile-pentesting/ios-pentesting/frida-configuration-in-ios.md)
|
||||
* [iOS App Extensions](mobile-pentesting/ios-pentesting/ios-app-extensions.md)
|
||||
* [iOS Basics](mobile-pentesting/ios-pentesting/ios-basics.md)
|
||||
* [iOS Basic Testing Operations](mobile-pentesting/ios-pentesting/basic-ios-testing-operations.md)
|
||||
* [iOS Burp Suite Configuration](mobile-pentesting/ios-pentesting/burp-configuration-for-ios.md)
|
||||
* [iOS Custom URI Handlers / Deeplinks / Custom Schemes](mobile-pentesting/ios-pentesting/ios-custom-uri-handlers-deeplinks-custom-schemes.md)
|
||||
* [iOS Extracting Entitlements From Compiled Application](mobile-pentesting/ios-pentesting/extracting-entitlements-from-compiled-application.md)
|
||||
* [iOS Frida Configuration](mobile-pentesting/ios-pentesting/frida-configuration-in-ios.md)
|
||||
* [iOS Hooking With Objection](mobile-pentesting/ios-pentesting/ios-hooking-with-objection.md)
|
||||
* [iOS Protocol Handlers](mobile-pentesting/ios-pentesting/ios-protocol-handlers.md)
|
||||
* [iOS Serialisation and Encoding](mobile-pentesting/ios-pentesting/ios-serialisation-and-encoding.md)
|
||||
|
|
|
@ -111,35 +111,33 @@ hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg
|
|||
```bash
|
||||
class-dump Kindle.app
|
||||
```
|
||||
注意,这些名称可能会被混淆,以增加二进制反向工程的难度。
|
||||
|
||||
#### 函数调用
|
||||
|
||||
当在使用Objective-C的二进制文件中调用函数时,编译后的代码不会直接调用该函数,而是调用**`objc_msgSend`**。这将调用最终的函数:
|
||||
当在使用Objective-C的二进制文件中调用函数时,编译后的代码不会直接调用该函数,而是调用**`objc_msgSend`**。这个函数会调用最终的函数:
|
||||
|
||||
![](<../../../.gitbook/assets/image (560).png>)
|
||||
|
||||
该函数期望的参数如下:
|
||||
这个函数期望的参数是:
|
||||
|
||||
* 第一个参数(**self**)是“指向**接收消息的类的实例的指针**”。简单来说,它是方法被调用的对象。如果方法是类方法,则这将是类对象的一个实例(作为一个整体),而对于实例方法,self将指向作为对象的类的一个实例。
|
||||
* 第一个参数(**self**)是“指向**接收消息的类的实例的指针**”。简单来说,它是方法被调用的对象。如果方法是类方法,这将是类对象的一个实例(作为一个整体),而对于实例方法,self将指向作为对象的类的一个实例。
|
||||
* 第二个参数(**op**)是“处理消息的方法的选择器”。简单来说,这只是**方法的名称**。
|
||||
* 剩余的参数是方法所需的任何**值**(op)。
|
||||
* 剩下的参数是方法所需的任何**值**(op)。
|
||||
|
||||
| **参数** | **寄存器** | **(对于)objc_msgSend** |
|
||||
| **参数** | **寄存器** | **(对于)objc_msgSend** |
|
||||
| ----------------- | --------------------------------------------------------------- | ------------------------------------------------------ |
|
||||
| **第一个参数** | **rdi** | **self:方法被调用的对象** |
|
||||
| **第二个参数** | **rsi** | **op:方法的名称** |
|
||||
| **第三个参数** | **rdx** | **方法的第一个参数** |
|
||||
| **第四个参数** | **rcx** | **方法的第二个参数** |
|
||||
| **第五个参数** | **r8** | **方法的第三个参数** |
|
||||
| **第六个参数** | **r9** | **方法的第四个参数** |
|
||||
| **第七个及以上参数** | <p><strong>rsp+</strong><br><strong>(在堆栈上)</strong></p> | **方法的第五个及以上参数** |
|
||||
| **第一个参数** | **rdi** | **self:方法被调用的对象** |
|
||||
| **第二个参数** | **rsi** | **op:方法的名称** |
|
||||
| **第三个参数** | **rdx** | **方法的第一个参数** |
|
||||
| **第四个参数** | **rcx** | **方法的第二个参数** |
|
||||
| **第五个参数** | **r8** | **方法的第三个参数** |
|
||||
| **第六个参数** | **r9** | **方法的第四个参数** |
|
||||
| **第七个及以上参数** | <p><strong>rsp+</strong><br><strong>(在堆栈上)</strong></p> | **方法的第五个及以上参数** |
|
||||
|
||||
### Swift
|
||||
|
||||
对于Swift二进制文件,由于存在Objective-C兼容性,有时可以使用[class-dump](https://github.com/nygard/class-dump/)提取声明,但并非总是有效。
|
||||
对于Swift二进制文件,由于与Objective-C兼容,有时可以使用[class-dump](https://github.com/nygard/class-dump/)提取声明,但并非总是有效。
|
||||
|
||||
使用**`jtool -l`**或**`otool -l`**命令行,可以找到以**`__swift5`**前缀开头的多个部分:
|
||||
使用**`jtool -l`**或**`otool -l`**命令行可以找到以**`__swift5`**前缀开头的多个部分:
|
||||
```bash
|
||||
jtool2 -l /Applications/Stocks.app/Contents/MacOS/Stocks
|
||||
LC 00: LC_SEGMENT_64 Mem: 0x000000000-0x100000000 __PAGEZERO
|
||||
|
@ -151,8 +149,16 @@ Mem: 0x100027064-0x1000274cc __TEXT.__swift5_fieldmd
|
|||
Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture
|
||||
[...]
|
||||
```
|
||||
您可以在[**此博客文章中找到有关这些部分存储的信息的更多信息**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html)。
|
||||
您可以在[此博客文章中找到有关这些部分存储的信息的更多信息](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html)。
|
||||
|
||||
此外,**Swift二进制文件可能具有符号**(例如,库需要存储符号以便可以调用其函数)。这些符号通常以一种难看的方式包含有关函数名称和属性的信息,因此它们非常有用,而且有一些“**解码器”**可以获取原始名称:
|
||||
```bash
|
||||
# Ghidra plugin
|
||||
https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py
|
||||
|
||||
# Swift cli
|
||||
swift demangle
|
||||
```
|
||||
### 打包的二进制文件
|
||||
|
||||
* 检查高熵
|
||||
|
@ -162,28 +168,28 @@ Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture
|
|||
## 动态分析
|
||||
|
||||
{% 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" %}
|
||||
请注意,为了在macOS上**检测系统二进制文件**(例如`cloudconfigurationd`),必须禁用SIP(仅删除签名不起作用)。
|
||||
请注意,在macOS上,为了对系统二进制文件(如`cloudconfigurationd`)进行仪器化,必须禁用SIP(仅删除签名是不起作用的)。
|
||||
{% endhint %}
|
||||
|
||||
### 统一日志
|
||||
|
||||
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
|
||||
|
||||
#### 左侧面板
|
||||
|
||||
在hopper的左侧面板中,可以看到二进制文件的符号(**Labels**),过程和函数的列表(**Proc**)以及字符串(**Str**)。这些不是所有的字符串,而是在Mac-O文件的几个部分中定义的字符串(如_cstring或`objc_methname`)。
|
||||
在hopper的左侧面板中,可以看到二进制文件的符号(**Labels**),过程和函数的列表(**Proc**)以及字符串(**Str**)。这些不是所有的字符串,而是在Mac-O文件的几个部分(如_cstring或`objc_methname`)中定义的字符串。
|
||||
|
||||
#### 中间面板
|
||||
|
||||
在中间面板中,您可以看到**反汇编代码**。您可以通过单击相应的图标,以**原始**、**图形**、**反编译**和**二进制**的方式查看它:
|
||||
在中间面板中,可以看到**反汇编代码**。可以通过单击相应的图标,以**原始**的反汇编、**图形**、**反编译**和**二进制**的形式查看:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (2) (6).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -191,22 +197,22 @@ MacOS会生成大量日志,当运行应用程序时,这些日志可以非常
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
此外,在**中间下方,您可以编写Python命令**。
|
||||
此外,在**中间下方可以编写Python命令**。
|
||||
|
||||
#### 右侧面板
|
||||
|
||||
在右侧面板中,您可以查看有趣的信息,例如**导航历史记录**(以便了解您如何到达当前情况)、**调用图**(您可以查看所有调用此函数的函数以及此函数调用的所有函数)和**局部变量**信息。
|
||||
在右侧面板中,可以看到一些有趣的信息,例如**导航历史记录**(以便了解如何到达当前情况)、**调用图**(可以看到调用此函数的所有函数以及此函数调用的所有函数)和**局部变量**信息。
|
||||
|
||||
### 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的可用探针:
|
||||
|
@ -368,9 +374,9 @@ settings set target.x86-disassembly-flavor intel
|
|||
* 一些恶意软件还可以根据MAC地址(00:50:56)判断机器是否为VMware。
|
||||
* 还可以通过简单的代码判断进程是否正在被调试:
|
||||
* `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //process being debugged }`
|
||||
* 还可以使用**`ptrace`**系统调用和**`PT_DENY_ATTACH`**标志来阻止调试器的附加和跟踪。
|
||||
* 可以检查是否导入了**`sysctl`**或**`ptrace`**函数(但恶意软件可能会动态导入它)。
|
||||
* 如在此文档中所述:“[Defeating Anti-Debug Techniques: macOS ptrace variants](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)”:\
|
||||
* 还可以使用**`ptrace`**系统调用以**`PT_DENY_ATTACH`**标志调用。这可以防止调试器附加和跟踪。
|
||||
* 您可以检查是否导入了**`sysctl`**或**`ptrace`**函数(但恶意软件可能会动态导入它)。
|
||||
* 如本文所述:“[Defeating Anti-Debug Techniques: macOS ptrace variants](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)”:\
|
||||
“_消息“Process # exited with **status = 45 (0x0000002d)**”通常是调试目标正在使用**PT\_DENY\_ATTACH**的明显迹象_”。
|
||||
## Fuzzing
|
||||
|
||||
|
@ -490,9 +496,9 @@ litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash
|
|||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* 你在一家**网络安全公司**工作吗?想要在HackTricks中**宣传你的公司**吗?或者想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 发现我们的独家[NFT收藏品](https://opensea.io/collection/the-peass-family)——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||||
|
||||
</details>
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
* 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[NFT](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||||
|
||||
</details>
|
||||
|
@ -18,11 +18,11 @@ ARM64,也被称为ARMv8-A,是一种64位处理器架构,用于各种设备
|
|||
|
||||
### **寄存器**
|
||||
|
||||
ARM64有**31个通用寄存器**,标记为`x0`到`x30`。每个寄存器可以存储一个**64位**(8字节)的值。对于只需要32位值的操作,可以使用名为w0到w30的32位模式访问相同的寄存器。
|
||||
ARM64有**31个通用寄存器**,标记为`x0`到`x30`。每个寄存器可以存储一个**64位**(8字节)的值。对于只需要32位值的操作,可以使用相同的寄存器以32位模式访问,使用名称w0到w30。
|
||||
|
||||
1. **`x0`**到**`x7`** - 通常用作临时寄存器和传递子程序参数。
|
||||
* **`x0`**还携带函数的返回数据
|
||||
2. **`x8`** - 在Linux内核中,`x8`用作`svc`指令的系统调用号。**在macOS中,使用的是x16!**
|
||||
2. **`x8`** - 在Linux内核中,`x8`用作`svc`指令的系统调用号。**在macOS中,使用x16!**
|
||||
3. **`x9`**到**`x15`** - 更多的临时寄存器,通常用于局部变量。
|
||||
4. **`x16`**和**`x17`** - 临时寄存器,也用于间接函数调用和PLT(Procedure Linkage Table)存根。
|
||||
* **`x16`**用作**`svc`**指令的**系统调用号**。
|
||||
|
@ -35,83 +35,87 @@ ARM64有**31个通用寄存器**,标记为`x0`到`x30`。每个寄存器可以
|
|||
|
||||
### **调用约定**
|
||||
|
||||
ARM64调用约定规定,函数的**前八个参数**通过寄存器**`x0`到`x7`**传递。**额外的**参数通过**堆栈**传递。**返回**值通过寄存器**`x0`**传回,如果是**128位**的话,也可以通过**`x1`**传回。函数调用时,**`x19`**到**`x30`**和**`sp`**寄存器必须被**保留**。
|
||||
ARM64调用约定规定,函数的**前八个参数**通过寄存器**`x0`到`x7`**传递。**额外的**参数通过**堆栈**传递。**返回**值通过寄存器**`x0`**传回,如果是**128位**则也可以通过**`x1`**传回。**`x19`**到**`x30`**和**`sp`**寄存器必须在函数调用之间**保留**。
|
||||
|
||||
在汇编中阅读函数时,要查找**函数的序言和尾声**。**序言**通常涉及**保存帧指针(`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)找到。
|
||||
|
||||
### **常见指令**
|
||||
|
||||
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`中。
|
||||
* **`ldr`**:将一个值从**内存**加载到**寄存器**中。
|
||||
* **`ldr`**:将**内存**中的值加载到**寄存器**中。
|
||||
* 示例:`ldr x0, [x1]` - 这将从由`x1`指向的内存位置加载一个值到`x0`中。
|
||||
* **`str`**:将一个值从寄存器存储到内存中。
|
||||
* **`str`**:将**寄存器**中的值存储到**内存**中。
|
||||
* 示例:`str x0, [x1]` - 这将将`x0`中的值存储到由`x1`指向的内存位置中。
|
||||
* **`ldp`**:**加载一对寄存器**。该指令从**连续的内存**位置加载两个寄存器。内存地址通常是通过将另一个寄存器中的值与偏移量相加形成的。
|
||||
* **`ldp`**:**加载一对寄存器**。该指令从**连续的内存**位置加载两个寄存器。内存地址通常是通过将偏移量添加到另一个寄存器中的值来形成的。
|
||||
* 示例:`ldp x0, x1, [x2]` - 这将从`x2`和`x2 + 8`处的内存位置分别加载`x0`和`x1`。
|
||||
* **`stp`**:**存储一对寄存器**。该指令将两个寄存器存储到**连续的内存**位置。内存地址通常是通过将另一个寄存器中的值与偏移量相加形成的。
|
||||
* **`stp`**:**存储一对寄存器**。该指令将两个寄存器存储到**连续的内存**位置。内存地址通常是通过将偏移量添加到另一个寄存器中的值来形成的。
|
||||
* 示例:`stp x0, x1, [x2]` - 这将`x0`和`x1`存储到`x2`和`x2 + 8`处的内存位置。
|
||||
* **`add`**:将两个寄存器的值相加,并将结果存储在一个寄存器中。
|
||||
* 示例:`add x0, x1, x2` - 这将将`x1`和`x2`中的值相加,并将结果存储在`x0`中。
|
||||
* **`sub`**:将两个寄存器的值相减,并将结果存储在一个寄存器中。
|
||||
* 示例:`sub x0, x1, x2` - 这将从`x1`中减去`x2`的值,并将结果存储在`x0`中。
|
||||
* **`mul`**: **乘法**,将两个寄存器的值相乘,并将结果存储在一个寄存器中。
|
||||
* 示例:`mul x0, x1, x2` — 将`x1`和`x2`的值相乘,并将结果存储在`x0`中。
|
||||
* **`div`**: **除法**,将一个寄存器的值除以另一个寄存器的值,并将结果存储在一个寄存器中。
|
||||
* 示例:`div x0, x1, x2` — 将`x1`的值除以`x2`的值,并将结果存储在`x0`中。
|
||||
* **`bl`**: **带链接分支**,用于调用一个**子程序**。将**返回地址存储在`x30`中**。
|
||||
* 示例:`bl myFunction` — 调用函数`myFunction`,并将返回地址存储在`x30`中。
|
||||
* **`blr`**: **带链接寄存器分支**,用于调用一个**子程序**,其中目标在一个**寄存器**中指定。将**返回地址存储在`x30`中**。
|
||||
* 示例:`blr x1` — 调用地址包含在`x1`中的函数,并将返回地址存储在`x30`中。
|
||||
* **`ret`**: **从子程序返回**,通常使用**`x30`中的地址**。
|
||||
* 示例:`ret` — 使用`x30`中的返回地址从当前子程序返回。
|
||||
* **`cmp`**: **比较**两个寄存器的值,并设置条件标志。
|
||||
* 示例:`cmp x0, x1` — 比较`x0`和`x1`的值,并相应地设置条件标志。
|
||||
* **`b.eq`**: **等于时分支**,基于前面的`cmp`指令。
|
||||
* 示例:`b.eq label` — 如果前面的`cmp`指令发现两个相等的值,则跳转到`label`。
|
||||
* **`b.ne`**: **不等于时分支**。此指令检查条件标志(由前一个比较指令设置),如果比较的值不相等,则跳转到一个标签或地址。
|
||||
* 示例:在`cmp x0, x1`指令之后,`b.ne label` — 如果`x0`和`x1`的值不相等,则跳转到`label`。
|
||||
* **`cbz`**: **零时比较和分支**。此指令将一个寄存器与零进行比较,如果它们相等,则跳转到一个标签或地址。
|
||||
* 示例:`cbz x0, label` — 如果`x0`中的值为零,则跳转到`label`。
|
||||
* **`cbnz`**: **非零时比较和分支**。此指令将一个寄存器与零进行比较,如果它们不相等,则跳转到一个标签或地址。
|
||||
* 示例:`cbnz x0, label` — 如果`x0`中的值非零,则跳转到`label`。
|
||||
* **`adrp`**: 计算一个符号的**页地址**并将其存储在一个寄存器中。
|
||||
* 示例:`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"。当处理器执行此指令时,它会从用户模式切换到内核模式,并跳转到内存中内核系统调用处理代码所在的特定位置。
|
||||
* 示例: 
|
||||
* 示例:`add x0,x1,x2` — 这将`x1`和`x2`中的值相加,并将结果存储在`x0`中。
|
||||
* **`sub`**:**减去**两个寄存器的值,并将结果存储在一个寄存器中。
|
||||
* 示例:`sub x0,x1,x2` — 这将`x2`从`x1`中减去,并将结果存储在`x0`中。
|
||||
* **`mul`**:**乘以**两个寄存器的值,并将结果存储在一个寄存器中。
|
||||
* 示例:`mul x0,x1,x2` — 这将`x1`和`x2`中的值相乘,并将结果存储在`x0`中。
|
||||
* **`div`**:将一个寄存器的值除以另一个寄存器的值,并将结果存储在一个寄存器中。
|
||||
* 示例:`div x0,x1,x2` — 这将`x1`除以`x2`的值,并将结果存储在`x0`中。
|
||||
* **`bl`**:**带链接分支**,用于**调用子程序**。将**返回地址存储在`x30`中**。
|
||||
* 示例:`bl myFunction` — 这将调用函数`myFunction`并将返回地址存储在`x30`中。
|
||||
* **`blr`**:**带链接寄存器分支**,用于**调用子程序**,其中目标在**寄存器**中**指定**。将**返回地址存储在`x30`中**。
|
||||
* 示例:`blr x1` — 这将调用地址包含在`x1`中的函数,并将返回地址存储在`x30`中。
|
||||
* **`ret`**:**从子程序返回**,通常使用**`x30`中的地址**。
|
||||
* 示例:`ret` — 这将使用`x30`中的返回地址从当前子程序返回。
|
||||
* **`cmp`**:**比较**两个寄存器并设置条件标志。
|
||||
* 示例:`cmp x0,x1` — 这将比较`x0`和`x1`中的值,并相应地设置条件标志。
|
||||
* **`b.eq`**:**如果相等则分支**,基于先前的`cmp`指令。
|
||||
* 示例:`b.eq label` — 如果先前的`cmp`指令找到两个相等的值,则跳转到`label`。
|
||||
* **`b.ne`**:**如果不相等则分支**。此指令检查条件标志(由先前的比较指令设置),如果比较的值不相等,则分支到标签或地址。
|
||||
* 示例:在`cmp x0,x1`指令之后,`b.ne label` — 如果`x0`和`x1`中的值不相等,则跳转到`label`。
|
||||
* **`cbz`**:**比较并在零时分支**。此指令将一个寄存器与零进行比较,如果它们相等,则分支到标签或地址。
|
||||
* 示例:`cbz x0,label` — 如果`x0`中的值为零,则跳转到`label`。
|
||||
* **`cbnz`**:**比较并在非零时分支**。此指令将一个寄存器与零进行比较,如果它们不相等,则分支到标签或地址。
|
||||
* 示例:`cbnz x0,label` — 如果`x0`中的值非零,则跳转到`label`。
|
||||
* **`adrp`**:计算**符号的页地址**并将其存储在一个寄存器中。
|
||||
* 示例:`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"。当处理器执行此指令时,它将从用户模式切换到内核模式,并跳转到内存中内核系统调用处理代码的特定位置。
|
||||
* 示例:
|
||||
|
||||
```armasm
|
||||
mov x8, 93 ; 将退出系统调用的系统调用号(93)加载到寄存器x8中。
|
||||
mov x0, 0 ; 将退出状态码(0)加载到寄存器x0中。
|
||||
mov x8,93 ; 将退出的系统调用号(93)加载到寄存器x8中。
|
||||
mov x0,0 ; 将退出状态码(0)加载到寄存器x0中。
|
||||
svc 0 ; 进行系统调用。
|
||||
```
|
||||
|
||||
### **函数序言**
|
||||
|
||||
1. **将链接寄存器和帧指针保存到堆栈中**:
|
||||
1. **将链接寄存器和帧指针保存到堆栈中**:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```armasm
|
||||
stp x29, x30, [sp, #-16]! ; 将x29和x30寄存器对存储到堆栈中,并减小堆栈指针
|
||||
stp x29,x30,[sp,#-16]! ; 将x29和x30对存储到堆栈中,并减小堆栈指针
|
||||
```
|
||||
{% endcode %}
|
||||
2. **设置新的帧指针**:`mov x29, sp`(为当前函数设置新的帧指针)
|
||||
3. **为局部变量在堆栈上分配空间**(如果需要):`sub sp, sp, <size>`(其中`<size>`是所需的字节数)
|
||||
2. **设置新的帧指针**:`mov x29,sp`(为当前函数设置新的帧指针)
|
||||
3. **为局部变量在堆栈上分配空间**(如果需要):`sub sp,sp,<size>`(其中`<size>`是所需的字节数)
|
||||
|
||||
### **函数收尾**
|
||||
|
||||
1. **释放局部变量(如果有分配的变量)**:`add sp, sp, <size>`
|
||||
2. **恢复链接寄存器和帧指针**:
|
||||
1. **释放局部变量(如果有分配的变量)**:`add sp,sp,<size>`
|
||||
2. **恢复链接寄存器和帧指针**:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```armasm
|
||||
ldp x29, x30, [sp], #16 ; 从堆栈中加载x29和x30寄存器对,并增加堆栈指针
|
||||
ldp x29,x30,[sp],#16 ; 从堆栈中加载x29和x30对,并增加堆栈指针
|
||||
```
|
||||
{% endcode %}
|
||||
3. **返回**:`ret`(使用链接寄存器中的地址将控制返回给调用者)
|
||||
|
@ -278,63 +282,41 @@ passwd_path: .asciz "/etc/passwd"
|
|||
```
|
||||
#### 使用fork从sh调用命令,以便主进程不被终止
|
||||
|
||||
Sometimes, when executing a command using the `system()` function in C, the main process may be terminated if the command encounters an error. To avoid this, you can use the `fork()` system call to create a child process and then execute the command using `sh` in the child process. This way, even if the command fails, the main process will not be terminated.
|
||||
To invoke a command with `sh` from a forked process, you can follow these steps:
|
||||
|
||||
1. Import the necessary libraries:
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
int main() {
|
||||
pid_t pid = fork();
|
||||
|
||||
if (pid == -1) {
|
||||
perror("fork");
|
||||
exit(EXIT_FAILURE);
|
||||
} else if (pid == 0) {
|
||||
// Child process
|
||||
execl("/bin/sh", "sh", "-c", "your_command_here", (char *)NULL);
|
||||
exit(EXIT_SUCCESS);
|
||||
} else {
|
||||
// Parent process
|
||||
wait(NULL);
|
||||
printf("Command executed successfully!\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
在C语言中,有时候使用`system()`函数执行命令时,如果命令遇到错误,主进程可能会被终止。为了避免这种情况,可以使用`fork()`系统调用创建一个子进程,然后在子进程中使用`sh`执行命令。这样,即使命令失败,主进程也不会被终止。
|
||||
|
||||
2. Create a forked process using the `fork()` function:
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
pid_t pid = fork();
|
||||
```
|
||||
|
||||
int main() {
|
||||
pid_t pid = fork();
|
||||
|
||||
if (pid == -1) {
|
||||
perror("fork");
|
||||
exit(EXIT_FAILURE);
|
||||
} else if (pid == 0) {
|
||||
// 子进程
|
||||
execl("/bin/sh", "sh", "-c", "your_command_here", (char *)NULL);
|
||||
exit(EXIT_SUCCESS);
|
||||
} else {
|
||||
// 父进程
|
||||
wait(NULL);
|
||||
printf("命令执行成功!\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
3. Check if the process is the child process:
|
||||
```c
|
||||
if (pid == 0) {
|
||||
// Child process
|
||||
// Execute the command using sh
|
||||
execl("/bin/sh", "sh", "-c", "your_command", (char *)NULL);
|
||||
exit(0);
|
||||
}
|
||||
```
|
||||
|
||||
4. Wait for the child process to finish executing the command:
|
||||
```c
|
||||
else {
|
||||
// Parent process
|
||||
wait(NULL);
|
||||
}
|
||||
```
|
||||
|
||||
By using this approach, the main process will not be terminated when invoking the command with `sh` from the forked process.
|
||||
```armasm
|
||||
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
|
||||
.global _main ; Declare a global symbol _main
|
||||
|
|
|
@ -38,14 +38,18 @@ x64的调用约定在操作系统之间有所不同。例如:
|
|||
|
||||
如果函数有超过六个输入,则**其余的参数将被传递到栈上**。**RSP**,即栈指针,在任何调用发生之前必须是**16字节对齐**的,这意味着它指向的地址必须能够被16整除。这意味着通常我们需要确保在进行函数调用之前,我们的shellcode中的RSP被正确对齐。然而,在实践中,即使不满足这个要求,系统调用也经常能够正常工作。
|
||||
|
||||
### Swift中的调用约定
|
||||
|
||||
Swift有自己的**调用约定**,可以在[**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#x86-64**](https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#x86-64)找到。
|
||||
|
||||
### **常见指令**
|
||||
|
||||
x64指令具有丰富的指令集,保持与早期x86指令的兼容性并引入新指令。
|
||||
x64指令具有丰富的指令集,保持与早期x86指令的兼容性并引入新的指令。
|
||||
|
||||
* **`mov`**:将一个值从一个**寄存器**或**内存位置**移动到另一个寄存器或内存位置。
|
||||
* **`mov`**:将一个值从一个**寄存器**或**内存位置**移动到另一个位置。
|
||||
* 示例:`mov rax, rbx` — 将`rbx`中的值移动到`rax`中。
|
||||
* **`push`** 和 **`pop`**:将值推送到/从**栈**中弹出。
|
||||
* 示例:`push rax` — 将`rax`中的值推送到栈中。
|
||||
* 示例:`push rax` — 将`rax`中的值推送到栈上。
|
||||
* 示例:`pop rax` — 将栈顶的值弹出到`rax`中。
|
||||
* **`add`** 和 **`sub`**:**加法**和**减法**操作。
|
||||
* 示例:`add rax, rcx` — 将`rax`和`rcx`中的值相加,并将结果存储在`rax`中。
|
||||
|
|
|
@ -1,32 +1,32 @@
|
|||
# Frida教程
|
||||
# Frida 教程
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云平台 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks 云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||||
* 你在一家 **网络安全公司** 工作吗?你想在 HackTricks 中看到你的 **公司广告**吗?或者你想获得 **PEASS 的最新版本或下载 HackTricks 的 PDF 版本**吗?请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家 [**NFTs**](https://opensea.io/collection/the-peass-family) 集合 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或 **关注** 我的 **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **通过向** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
||||
|
||||
</details>
|
||||
|
||||
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">
|
||||
<figure><img src="../../../.gitbook/assets/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**赏金猎人提示**:**注册**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" %}
|
||||
|
||||
## 安装
|
||||
|
||||
安装**frida工具**:
|
||||
安装 **frida 工具**:
|
||||
```bash
|
||||
pip install frida-tools
|
||||
pip install frida
|
||||
```
|
||||
**下载并安装** Android 上的 **Frida 服务器**([下载最新版本](https://github.com/frida/frida/releases))。\
|
||||
一行命令重启以 root 模式运行的 adb,连接到 adb,上传 frida-server,赋予执行权限并在后台运行:
|
||||
一行命令以 root 模式重新启动 adb,连接到 adb,上传 frida-server,赋予执行权限并在后台运行:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -166,52 +166,60 @@ return false;
|
|||
};
|
||||
});
|
||||
```
|
||||
# 使用 Frida 钩取 Java `exit()` 方法
|
||||
# 使用Frida钩取Java `exit()`方法
|
||||
|
||||
在 Android 应用程序渗透测试中,Frida 是一种常用的工具,用于动态分析和修改应用程序的行为。通过使用 Frida,我们可以钩取应用程序中的方法,并在运行时修改其行为。本教程将指导您如何使用 Frida 钩取 Java `exit()` 方法。
|
||||
在移动应用程序渗透测试中,Frida是一种强大的工具,可以用于钩取和修改应用程序的行为。通过使用Frida,我们可以钩取Java方法并注入自定义代码。
|
||||
|
||||
在本教程中,我们将学习如何使用Frida钩取Java的`exit()`方法。`exit()`方法用于终止应用程序的执行。
|
||||
|
||||
## 步骤
|
||||
|
||||
1. 首先,确保您已经在设备上安装了 Frida。您可以从 Frida 的官方网站(https://frida.re/)下载并安装 Frida。
|
||||
|
||||
2. 打开终端,并使用以下命令启动 Frida Server:
|
||||
1. 首先,我们需要安装Frida。可以通过以下命令在终端中安装Frida:
|
||||
|
||||
```
|
||||
frida-server
|
||||
$ pip install frida-tools
|
||||
```
|
||||
|
||||
3. 在终端中,使用以下命令启动 Frida REPL:
|
||||
|
||||
```
|
||||
frida
|
||||
```
|
||||
|
||||
4. 在 Frida REPL 中,使用以下命令附加到目标应用程序:
|
||||
|
||||
```
|
||||
attach("应用程序包名")
|
||||
```
|
||||
|
||||
请将 "应用程序包名" 替换为您要钩取的应用程序的包名。
|
||||
|
||||
5. 钩取 `exit()` 方法,使用以下命令:
|
||||
2. 然后,我们需要编写一个JavaScript脚本来钩取`exit()`方法。创建一个名为`hook.js`的文件,并将以下代码复制到文件中:
|
||||
|
||||
```javascript
|
||||
Java.perform(function() {
|
||||
var System = Java.use('java.lang.System');
|
||||
System.exit.implementation = function() {
|
||||
console.log('exit() 方法被调用了!');
|
||||
console.log('exit()方法被调用了!');
|
||||
// 在这里添加你的自定义代码
|
||||
// ...
|
||||
// 调用原始的exit()方法
|
||||
this.exit();
|
||||
};
|
||||
});
|
||||
```
|
||||
|
||||
这将钩取 `java.lang.System` 类中的 `exit()` 方法,并在方法被调用时打印一条消息。
|
||||
3. 接下来,我们需要启动Frida服务器。在终端中运行以下命令:
|
||||
|
||||
6. 现在,您可以测试应用程序并观察是否成功钩取了 `exit()` 方法。当 `exit()` 方法被调用时,您将在 Frida REPL 中看到打印的消息。
|
||||
```
|
||||
$ frida-server
|
||||
```
|
||||
|
||||
## 结论
|
||||
4. 然后,我们需要找到目标应用程序的进程ID。可以使用以下命令列出正在运行的应用程序及其进程ID:
|
||||
|
||||
通过使用 Frida,我们可以方便地钩取应用程序中的方法,并在运行时修改其行为。这对于动态分析和调试应用程序非常有用,同时也为我们提供了更多的渗透测试技术。
|
||||
```
|
||||
$ adb shell ps | grep <package_name>
|
||||
```
|
||||
|
||||
将`<package_name>`替换为目标应用程序的包名。
|
||||
|
||||
5. 现在,我们可以使用Frida钩取`exit()`方法了。在终端中运行以下命令:
|
||||
|
||||
```
|
||||
$ frida -U -l hook.js <package_name>
|
||||
```
|
||||
|
||||
将`<package_name>`替换为目标应用程序的包名。
|
||||
|
||||
6. 如果一切顺利,你将看到Frida输出的日志信息,表示`exit()`方法已被成功钩取。你可以在`hook.js`文件中的自定义代码部分添加你想要执行的任何操作。
|
||||
|
||||
这就是使用Frida钩取Java的`exit()`方法的步骤。通过钩取Java方法,我们可以修改应用程序的行为,以满足我们的需求。请记住,在进行任何渗透测试活动时,始终遵守法律和道德规范。
|
||||
```javascript
|
||||
var sysexit = Java.use("java.lang.System");
|
||||
sysexit.exit.overload("int").implementation = function(var_0) {
|
||||
|
@ -280,47 +288,57 @@ var ret = this.onCreate.overload("android.os.Bundle").call(this,var_0);
|
|||
|
||||
在Android应用程序的开发过程中,`.onCreate()`方法是一个非常重要的生命周期方法。它在Activity或Fragment创建时被调用,允许我们执行一些初始化操作。然而,有时我们可能需要修改或监视这个方法的行为。在本教程中,我们将使用Frida工具来钩子(hook)Android应用程序的`.onCreate()`方法。
|
||||
|
||||
## 准备工作
|
||||
## 前提条件
|
||||
|
||||
在开始之前,我们需要确保我们已经完成以下准备工作:
|
||||
在开始之前,确保你已经完成以下准备工作:
|
||||
|
||||
1. 安装Frida:Frida是一个功能强大的动态插桩工具,用于分析和修改应用程序的运行时行为。你可以从Frida的官方网站(https://frida.re/)下载并安装Frida。
|
||||
- 安装Frida:你可以从Frida的官方网站(https://frida.re/)下载并安装Frida。
|
||||
- 配置Android设备:确保你的Android设备已经启用了USB调试模式,并且与你的计算机连接。
|
||||
|
||||
2. 安装Frida-Server:Frida-Server是Frida的一个组件,它允许我们在Android设备上运行Frida。你可以从Frida的官方网站下载适用于你的设备的Frida-Server版本。
|
||||
## 步骤
|
||||
|
||||
3. 连接到Android设备:确保你的Android设备已经连接到你的开发机,并且Frida-Server已经在设备上运行。
|
||||
1. 启动目标应用程序:首先,确保你的目标应用程序已经安装在你的Android设备上,并且已经启动。
|
||||
|
||||
## 钩子`.onCreate()`
|
||||
2. 获取应用程序的进程ID:使用以下命令获取目标应用程序的进程ID:
|
||||
|
||||
现在我们已经完成了准备工作,让我们开始钩子`.onCreate()`方法。
|
||||
```
|
||||
adb shell ps | grep <package_name>
|
||||
```
|
||||
|
||||
1. 首先,我们需要编写一个JavaScript脚本来定义我们的钩子逻辑。创建一个名为`hook_oncreate.js`的文件,并将以下代码复制到文件中:
|
||||
将`<package_name>`替换为你的目标应用程序的包名。
|
||||
|
||||
```javascript
|
||||
Java.perform(function() {
|
||||
var Activity = Java.use('android.app.Activity');
|
||||
var onCreate = Activity.onCreate;
|
||||
3. 创建Frida脚本:创建一个新的文本文件,命名为`hook_oncreate.js`,并将以下代码复制到文件中:
|
||||
|
||||
onCreate.implementation = function() {
|
||||
console.log('onCreate()被调用了!');
|
||||
onCreate.call(this);
|
||||
};
|
||||
});
|
||||
```
|
||||
```javascript
|
||||
Java.perform(function() {
|
||||
var Activity = Java.use('<activity_class_name>');
|
||||
|
||||
Activity.onCreate.implementation = function(savedInstanceState) {
|
||||
console.log('onCreate()被调用了!');
|
||||
|
||||
// 在这里添加你的自定义代码
|
||||
|
||||
// 调用原始的onCreate()方法
|
||||
this.onCreate(savedInstanceState);
|
||||
};
|
||||
});
|
||||
```
|
||||
|
||||
2. 然后,我们可以使用Frida来加载并运行我们的钩子脚本。在终端中执行以下命令:
|
||||
将`<activity_class_name>`替换为你想要钩子的Activity类的完整名称。
|
||||
|
||||
```
|
||||
frida -U -l hook_oncreate.js -f com.example.app
|
||||
```
|
||||
4. 使用Frida钩子应用程序:运行以下命令来使用Frida钩子目标应用程序的`.onCreate()`方法:
|
||||
|
||||
确保将`hook_oncreate.js`替换为你实际保存钩子脚本的路径,`com.example.app`替换为你要钩子的应用程序的包名。
|
||||
```
|
||||
frida -U -l hook_oncreate.js -f <package_name> --no-pause
|
||||
```
|
||||
|
||||
3. 运行命令后,Frida将自动启动目标应用程序,并在`.onCreate()`方法被调用时输出一条消息。
|
||||
将`<package_name>`替换为你的目标应用程序的包名。
|
||||
|
||||
这就是钩子`.onCreate()`方法的基本过程。你可以根据需要修改钩子脚本来执行其他操作,如修改参数、返回值或监视方法的执行。
|
||||
5. 检查输出:当目标应用程序的`.onCreate()`方法被调用时,你将在终端中看到`onCreate()被调用了!`的输出。
|
||||
|
||||
希望本教程能帮助你开始使用Frida钩子Android应用程序的`.onCreate()`方法。通过使用Frida,你可以更深入地了解应用程序的运行时行为,并进行必要的修改和监视。
|
||||
## 结论
|
||||
|
||||
通过使用Frida工具,我们可以轻松地钩子Android应用程序的`.onCreate()`方法,并在其中添加自定义代码。这为我们提供了修改和监视应用程序行为的能力,从而帮助我们进行更深入的移动应用程序渗透测试。
|
||||
```javascript
|
||||
var activity = Java.use("android.app.Activity");
|
||||
activity.onCreate.overload("android.os.Bundle").implementation = function(var_0) {
|
||||
|
@ -383,20 +401,20 @@ console.log("Result of secret func: " + instance.secret());
|
|||
onComplete:function(){}
|
||||
});
|
||||
```
|
||||
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">
|
||||
<figure><img src="../../../.gitbook/assets/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Bug赏金提示**:**注册**Intigriti,一个由黑客创建的高级**Bug赏金平台**!立即加入我们,开始赚取高达**$100,000**的赏金!
|
||||
**Bug赏金提示**:**注册**Intigriti,一个由黑客创建的高级**Bug赏金平台**!立即加入我们:[**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks),开始赚取高达**$100,000**的赏金!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* 你在一家**网络安全公司**工作吗?想要在HackTricks中**宣传你的公司**吗?或者想要**获取PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 你在**网络安全公司**工作吗?想要在HackTricks中**宣传你的公司**吗?或者想要**获取PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品:[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**Telegram群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||||
|
||||
</details>
|
||||
|
|
|
@ -12,9 +12,9 @@
|
|||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 YouTube 🎥</strong></a></summary>
|
||||
|
||||
* 你在**网络安全公司**工作吗?想要在HackTricks中看到你的**公司广告**?或者想要获得**PEASS的最新版本或下载PDF格式的HackTricks**?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 你在**网络安全公司**工作吗?想要在HackTricks中看到你的**公司广告**吗?或者想要获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 获取[**官方PEASS和HackTricks衣物**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||||
|
||||
|
@ -38,7 +38,7 @@
|
|||
|
||||
### 基本iOS测试操作
|
||||
|
||||
在测试过程中,会建议执行**多个操作**(连接设备、读取/写入/上传/下载文件、使用一些工具...)。因此,如果您不知道如何执行这些操作,请**开始阅读页面**:
|
||||
在测试过程中,会建议进行**多个操作**(连接设备、读取/写入/上传/下载文件、使用一些工具...)。因此,如果您不知道如何执行这些操作,请**开始阅读页面**:
|
||||
|
||||
{% content-ref url="basic-ios-testing-operations.md" %}
|
||||
[basic-ios-testing-operations.md](basic-ios-testing-operations.md)
|
||||
|
@ -51,7 +51,7 @@
|
|||
|
||||
### 基本静态分析
|
||||
|
||||
建议使用工具[**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF)对IPA文件执行自动静态分析。
|
||||
建议使用工具[**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF)对IPA文件进行自动静态分析。
|
||||
|
||||
识别二进制文件中存在的**保护措施**:
|
||||
|
||||
|
@ -65,7 +65,7 @@ otool -hv <app-binary> | grep PIE # 应该包含PIE标志
|
|||
```bash
|
||||
otool -I -v <app-binary> | grep stack_chk # 应该包含stack_chk_guard和stack_chk_fail符号
|
||||
```
|
||||
* **ARC(自动引用计数)**:用于防止常见的内存损坏漏洞
|
||||
* **ARC(自动引用计数)**:用于防止常见的内存损坏缺陷
|
||||
|
||||
```bash
|
||||
otool -I -v <app-binary> | grep objc_release # 应该包含_objc_release符号
|
||||
|
@ -225,6 +225,15 @@ CachesDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8E
|
|||
DocumentDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Documents
|
||||
LibraryDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Library
|
||||
```
|
||||
您还可以在 **`/private/var/containers`** 目录下搜索应用程序名称:
|
||||
```bash
|
||||
find /private/var/containers -name "Progname*"
|
||||
```
|
||||
或者使用 **`ps`** 和 **`lsof`** 命令:
|
||||
```bash
|
||||
ps -ef | grep -i <app-name>
|
||||
lsof -p <pid> | grep -i "/containers" | head -n 1
|
||||
```
|
||||
正如您所见,应用程序有两个主要位置:
|
||||
|
||||
* **Bundle** **目录** (`/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/`)。
|
||||
|
@ -244,7 +253,7 @@ LibraryDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8E
|
|||
|
||||
* **Documents/**
|
||||
* 包含所有用户生成的数据。应用程序最终用户启动了此数据的创建。
|
||||
* 用户可以看到此目录,且**用户可以对其进行写入**。
|
||||
* 用户可以看到此目录,并且**用户可以对其进行写入**。
|
||||
* 此目录中的内容**会被备份**。
|
||||
* 应用程序可以通过设置 `NSURLIsExcludedFromBackupKey` 来禁用路径。
|
||||
* **Library/**
|
||||
|
@ -252,26 +261,26 @@ LibraryDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8E
|
|||
* iOS 应用程序通常使用 `Application Support` 和 `Caches` 子目录,但应用程序可以创建自定义子目录。
|
||||
* **Library/Caches/**
|
||||
* 包含**半持久性缓存文件**。
|
||||
* 用户无法看到此目录,且**用户无法对其进行写入**。
|
||||
* 用户看不到此目录,且**用户无法对其进行写入**。
|
||||
* 此目录中的内容**不会被备份**。
|
||||
* 当应用程序未运行且存储空间不足时,操作系统可能会自动删除此目录中的文件。
|
||||
* **Library/Application Support/**
|
||||
* 包含运行应用程序所需的**持久性文件**。
|
||||
* 用户无法看到此目录,且**用户无法对其进行写入**。
|
||||
* 对**用户不可见**,用户无法对其进行写入。
|
||||
* 此目录中的内容**会被备份**。
|
||||
* 应用程序可以通过设置 `NSURLIsExcludedFromBackupKey` 来禁用路径。
|
||||
* **Library/Preferences/**
|
||||
* 用于存储可以**在应用程序重新启动后仍然存在**的属性。
|
||||
* 信息以未加密的方式保存在应用程序沙盒中的一个名为 \[BUNDLE\_ID].plist 的 plist 文件中。
|
||||
* 使用 `NSUserDefaults` 存储的所有键/值对都可以在此文件中找到。
|
||||
* 用于存储可以在应用程序重新启动后**仍然保持的属性**。
|
||||
* 信息以未加密的方式保存在应用程序沙盒中的名为 \[BUNDLE\_ID].plist 的 plist 文件中。
|
||||
* 使用 `NSUserDefaults` 存储的所有键值对都可以在此文件中找到。
|
||||
* **tmp/**
|
||||
* 使用此目录来写入**不需要在应用程序启动之间保留**的临时文件。
|
||||
* 使用此目录来写入**不需要在应用程序启动之间保留的临时文件**。
|
||||
* 包含非持久性缓存文件。
|
||||
* 用户无法看到此目录。
|
||||
* 对用户**不可见**。
|
||||
* 此目录中的内容不会被备份。
|
||||
* 当应用程序未运行且存储空间不足时,操作系统可能会自动删除此目录中的文件。
|
||||
|
||||
让我们仔细查看 Bundle 目录 (`/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app`) 中 iGoat-Swift 的应用程序包(.app)目录:
|
||||
让我们仔细查看 iGoat-Swift 的应用程序包(.app)目录,位于 Bundle 目录内 (`/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app`):
|
||||
```bash
|
||||
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # ls
|
||||
NSFileType Perms NSFileProtection ... Name
|
||||
|
@ -363,12 +372,12 @@ double _field1;
|
|||
double _field2;
|
||||
};
|
||||
```
|
||||
然而,最好的反汇编二进制文件的选项是:[**Hopper**](https://www.hopperapp.com/download.html?)和[**IDA**](https://www.hex-rays.com/products/ida/support/download\_freeware/)。
|
||||
然而,最好的反汇编二进制文件的选项是:[**Hopper**](https://www.hopperapp.com/download.html?) 和 [**IDA**](https://www.hex-rays.com/products/ida/support/download\_freeware/)。
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (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" %}
|
||||
|
@ -382,23 +391,23 @@ double _field2;
|
|||
{% endcontent-ref %}
|
||||
|
||||
{% hint style="warning" %}
|
||||
应该在**安装应用程序**后,**检查所有功能**后,甚至在**注销一个用户并登录为另一个用户**后立即检查以下存储信息的位置。\
|
||||
应该在**安装应用程序**后立即检查以下存储信息的位置,在**检查应用程序的所有功能**之后,甚至在**从一个用户注销并登录到另一个用户**之后进行检查。\
|
||||
目标是找到应用程序(密码、令牌)、当前用户和先前登录用户的**未受保护的敏感信息**。
|
||||
{% endhint %}
|
||||
|
||||
### Plist
|
||||
|
||||
**plist**文件是结构化的XML文件,**包含键值对**。这是一种存储持久数据的方式,因此有时您可能会在这些文件中找到**敏感信息**。建议在安装应用程序后和密集使用后检查这些文件,以查看是否写入了新数据。
|
||||
**plist** 文件是结构化的 XML 文件,**包含键值对**。这是一种存储持久数据的方式,因此有时您可能会在这些文件中找到**敏感信息**。建议在安装应用程序后和密集使用应用程序后检查这些文件,以查看是否写入了新数据。
|
||||
|
||||
在plist文件中持久保存数据的最常见方法是使用**NSUserDefaults**。此plist文件保存在应用程序沙盒中的**`Library/Preferences/<appBundleID>.plist`**中。
|
||||
在 plist 文件中持久保存数据的最常见方法是使用 **NSUserDefaults**。此 plist 文件保存在应用程序沙盒中的 **`Library/Preferences/<appBundleID>.plist`** 中。
|
||||
|
||||
[`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults)类提供了与默认系统交互的编程接口。默认系统允许应用程序根据**用户偏好**自定义其行为。由`NSUserDefaults`保存的数据可以在应用程序包中查看。该类将**数据**存储在**plist**文件中,但它适用于少量数据的使用。
|
||||
[`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults) 类提供了与默认系统交互的编程接口。默认系统允许应用程序根据**用户偏好**自定义其行为。由 `NSUserDefaults` 保存的数据可以在应用程序包中查看。该类将**数据**存储在一个**plist文件**中,但它适用于小量数据的使用。
|
||||
|
||||
这些数据无法直接通过受信任的计算机访问,但可以通过**备份**进行访问。
|
||||
|
||||
您可以使用objection的`ios nsuserdefaults get`命令**转储**使用**`NSUserDefaults`**保存的信息。
|
||||
您可以使用 objection 的 `ios nsuserdefaults get` 命令来**转储**使用 **`NSUserDefaults`** 保存的信息。
|
||||
|
||||
要查找应用程序使用的所有plist文件,可以访问`/private/var/mobile/Containers/Data/Application/{APPID}`并运行:
|
||||
要查找应用程序使用的所有 plist 文件,可以访问 `/private/var/mobile/Containers/Data/Application/{APPID}` 并运行以下命令:
|
||||
```bash
|
||||
find ./ -name "*.plist"
|
||||
```
|
||||
|
@ -510,9 +519,9 @@ fatalError("Error opening realm: \(error)")
|
|||
|
||||
### Cookies
|
||||
|
||||
iOS将应用程序的cookies存储在每个应用程序文件夹中的**`Library/Cookies/cookies.binarycookies`**中。然而,开发人员有时会决定将它们保存在**钥匙串(keychain)**中,因为上述的**cookie文件可以在备份中访问**。
|
||||
iOS将应用程序的cookie存储在每个应用程序文件夹中的**`Library/Cookies/cookies.binarycookies`**中。然而,开发人员有时会决定将它们保存在**钥匙串**中,因为上述的**cookie文件可以在备份中访问**。
|
||||
|
||||
要检查cookies文件,您可以使用[**此Python脚本**](https://github.com/mdegrazia/Safari-Binary-Cookie-Parser)或使用objection的**`ios cookies get`**命令。\
|
||||
要检查cookie文件,您可以使用[**此Python脚本**](https://github.com/mdegrazia/Safari-Binary-Cookie-Parser)或使用objection的**`ios cookies get`**命令。\
|
||||
您还可以使用objection将这些文件转换为JSON格式并检查数据。
|
||||
```bash
|
||||
...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # ios cookies get --json
|
||||
|
@ -549,9 +558,9 @@ iOS将应用程序的cookies存储在每个应用程序文件夹中的**`Library
|
|||
|
||||
### 快照
|
||||
|
||||
每当按下主屏幕按钮时,iOS会**拍摄当前屏幕的快照**,以便能够以更流畅的方式切换到应用程序。然而,如果当前屏幕中存在**敏感数据**,它将被**保存**在**图像**中(该图像**在重启后仍然存在**)。这些快照也可以通过双击主屏幕来访问,以在应用程序之间切换。
|
||||
每当按下主屏幕按钮时,iOS都会**拍摄当前屏幕的快照**,以便能够更平滑地切换到应用程序。然而,如果当前屏幕中存在**敏感数据**,它将被**保存**在**图像**中(该图像**在重启后仍然存在**)。这些快照也可以通过双击主屏幕来访问,以在应用程序之间切换。
|
||||
|
||||
除非iPhone已越狱,否则**攻击者**需要**解锁设备**才能查看这些屏幕截图。默认情况下,最后一个快照存储在应用程序的沙盒中的`Library/Caches/Snapshots/`或`Library/SplashBoard/Snapshots`文件夹中(受信任的计算机无法从iOS 7.0访问文件系统)。
|
||||
除非iPhone已越狱,否则**攻击者**需要**访问****未锁定**的**设备**才能查看这些屏幕截图。默认情况下,最后一个快照存储在应用程序的沙盒中的`Library/Caches/Snapshots/`或`Library/SplashBoard/Snapshots`文件夹中(受信任的计算机无法从iOS 7.0访问文件系统)。
|
||||
|
||||
防止这种不良行为的一种方法是在拍摄快照之前放置一个空白屏幕或删除敏感数据,使用`ApplicationDidEnterBackground()`函数。
|
||||
|
||||
|
@ -604,7 +613,7 @@ NSURLCredential *credential;
|
|||
credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent];
|
||||
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace];
|
||||
```
|
||||
您可以使用**Objection**的`ios nsurlcredentialstorage dump`命令来转储这些秘密信息。
|
||||
您可以使用**Objection**的`ios nsurlcredentialstorage dump`命令来导出这些秘密信息。
|
||||
|
||||
## 自定义键盘/键盘缓存
|
||||
|
||||
|
@ -616,7 +625,7 @@ credential = [NSURLCredential credentialWithUser:username password:password pers
|
|||
此外,**应用程序可以阻止用户在应用程序中使用自定义键盘**(或者至少在应用程序的敏感部分中阻止使用)。
|
||||
|
||||
{% hint style="warning" %}
|
||||
如果您认为用户不需要第三方键盘,则建议不要允许其使用。
|
||||
如果您认为用户不需要第三方键盘,则建议不允许其使用。
|
||||
{% endhint %}
|
||||
|
||||
请注意,由于自动更正和自动建议,如果属性**securetTextEntry**未设置为**true**或**autoCorrectionType**未设置为**UITextAutoCorrectionTypeNo**,默认的iOS键盘将捕获和存储每个非标准单词的缓存文件。
|
||||
|
@ -643,7 +652,7 @@ textObject.secureTextEntry = YES;
|
|||
```
|
||||
* 在Xcode的“Interface Builder”中打开xib和storyboard文件,并在适当的对象的“Attributes Inspector”中验证“Secure Text Entry”和“Correction”的状态。
|
||||
|
||||
应用程序必须防止敏感信息输入到文本字段中进行缓存。您可以通过在所需的UITextFields、UITextViews和UISearchBars中使用`textObject.autocorrectionType = UITextAutocorrectionTypeNo`指令来以编程方式禁用缓存。对于应该被屏蔽的数据,例如PIN码和密码,请将`textObject.secureTextEntry`设置为`YES`。
|
||||
应用程序必须防止敏感信息输入到文本字段中进行缓存。您可以通过在所需的UITextFields、UITextViews和UISearchBars中使用`textObject.autocorrectionType = UITextAutocorrectionTypeNo`指令来以编程方式禁用缓存。对于应该被屏蔽的数据,例如PIN码和密码,将`textObject.secureTextEntry`设置为`YES`。
|
||||
```objectivec
|
||||
UITextField *textField = [ [ UITextField alloc ] initWithFrame: frame ];
|
||||
textField.autocorrectionType = UITextAutocorrectionTypeNo;
|
||||
|
@ -713,14 +722,14 @@ Jun 7 13:42:14 iPhone touch[9708] <Notice>: MS:Notice: Injecting: (null) [touch
|
|||
|
||||
iOS包括自动备份功能,可以创建设备上存储的数据的副本。您可以使用iTunes(直到macOS Catalina)或Finder(从macOS Catalina开始)从主机计算机创建iOS备份,或者通过iCloud备份功能进行备份。在这两种情况下,备份包括存储在iOS设备上的几乎所有数据,但不包括高度敏感的数据,如Apple Pay信息和Touch ID设置。
|
||||
|
||||
由于iOS备份已安装的应用程序及其数据,一个明显的问题是,应用程序存储的敏感用户数据是否可能通过备份无意中泄漏。另一个问题,虽然不太明显,但同样重要的是,恢复修改后的备份后,是否可以篡改用于保护数据或限制应用程序功能的敏感配置设置以更改应用程序行为。这两个问题都是合理的,并且这些漏洞已经在大量应用程序中得到证实。
|
||||
由于iOS备份已安装的应用程序及其数据,一个明显的问题是,应用程序存储的敏感用户数据是否可能通过备份无意中泄漏。另一个问题,虽然不太明显,但同样重要的是,恢复修改后的备份后,是否可以篡改用于保护数据或限制应用程序功能的敏感配置设置以更改应用程序行为。这两个问题都是合理的,并且这些漏洞已被证明存在于大量的应用程序中。
|
||||
|
||||
已安装移动应用程序的设备的备份将包括所有子目录(除了`Library/Caches/`)和[应用程序的私有目录](https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html#//apple\_ref/doc/uid/TP40010672-CH2-SW12)中的文件。因此,请避免在应用程序的私有目录或子目录中的任何文件或文件夹中以明文形式存储敏感数据。
|
||||
|
||||
尽管默认情况下始终备份`Documents/`和`Library/Application Support/`中的所有文件,但您可以通过使用`NSURL setResourceValue:forKey:error:`和`NSURLIsExcludedFromBackupKey`键来[排除备份中的文件](https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html#//apple\_ref/doc/uid/TP40010672-CH2-SW28)。您可以使用[NSURLIsExcludedFromBackupKey](https://developer.apple.com/reference/foundation/nsurl#//apple\_ref/c/data/NSURLIsExcludedFromBackupKey)和[CFURLIsExcludedFromBackupKey](https://developer.apple.com/reference/corefoundation/cfurl-rd7#//apple\_ref/c/data/kCFURLIsExcludedFromBackupKey)文件系统属性来排除文件和目录的备份。
|
||||
|
||||
{% hint style="warning" %}
|
||||
因此,在检查应用程序的备份时,您应该检查是否可以访问**任何敏感信息**,以及是否可以通过修改备份的某些设置并恢复备份来修改应用程序的**任何敏感行为**。
|
||||
因此,在检查应用程序的备份时,您应该检查是否可以访问**任何敏感信息**,以及是否可以通过修改备份的某些设置来修改应用程序的**敏感行为**并恢复备份。
|
||||
{% endhint %}
|
||||
|
||||
**测试方法**
|
||||
|
@ -886,24 +895,18 @@ if status == noErr {
|
|||
```
|
||||
{% tab title="Objective-C" %}
|
||||
|
||||
这个目录包含了关于iOS应用程序渗透测试的技术和工具。
|
||||
这个目录包含了关于iOS应用程序渗透测试的信息和技术。在进行iOS应用程序渗透测试时,了解Objective-C编程语言是非常重要的,因为大多数iOS应用程序都是使用Objective-C编写的。
|
||||
|
||||
## 目录
|
||||
以下是一些常见的iOS应用程序渗透测试技术:
|
||||
|
||||
- [iOS应用程序渗透测试简介](./introduction.md)
|
||||
- [iOS应用程序渗透测试环境设置](./environment-setup.md)
|
||||
- [iOS应用程序渗透测试工具](./tools.md)
|
||||
- [iOS应用程序渗透测试方法](./methodology.md)
|
||||
- [iOS应用程序渗透测试技术](./techniques.md)
|
||||
- [iOS应用程序渗透测试常见问题](./faq.md)
|
||||
- **反编译应用程序**:使用工具如Hopper、IDA Pro或Radare2来反编译iOS应用程序的二进制文件,以获取应用程序的源代码和逻辑。
|
||||
- **分析应用程序**:使用工具如Cycript、Frida或GDB来动态分析运行中的iOS应用程序,以获取应用程序的运行时信息和数据。
|
||||
- **漏洞利用**:利用iOS应用程序中的漏洞,如缓冲区溢出、格式化字符串漏洞或逻辑漏洞,来获取未授权访问或执行恶意代码的权限。
|
||||
- **数据存储**:分析iOS应用程序的数据存储机制,如SQLite数据库、Core Data或UserDefaults,以获取敏感信息或修改应用程序的状态。
|
||||
- **网络通信**:分析iOS应用程序的网络通信机制,如HTTP请求、WebSocket或TLS/SSL连接,以获取敏感信息或修改应用程序的行为。
|
||||
- **逆向工程**:使用工具如class-dump、dumpdecrypted或Hopper来逆向工程iOS应用程序的二进制文件,以获取应用程序的类、方法和属性。
|
||||
|
||||
## 贡献
|
||||
|
||||
我们欢迎任何形式的贡献,包括但不限于问题报告、功能请求和代码贡献。请查看我们的[贡献指南](../CONTRIBUTING.md)了解更多信息。
|
||||
|
||||
## 许可证
|
||||
|
||||
本项目采用[MIT许可证](../LICENSE)。
|
||||
请注意,进行iOS应用程序渗透测试时,应始终遵守法律和道德规范,并获得合法的授权。
|
||||
|
||||
{% endtab %}
|
||||
```objectivec
|
||||
|
@ -936,7 +939,7 @@ if (status == noErr) {
|
|||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
现在我们可以从钥匙串中请求保存的项目。钥匙串服务将向用户呈现身份验证对话框,并根据提供的合适指纹返回数据或nil。
|
||||
现在我们可以从钥匙串中请求保存的项目。钥匙串服务将向用户呈现身份验证对话框,并根据是否提供了合适的指纹返回数据或nil。
|
||||
```swift
|
||||
// 1. define query
|
||||
var query = [String: Any]()
|
||||
|
@ -961,19 +964,29 @@ let password = String(data: queryResult as! Data, encoding: .utf8)!
|
|||
```
|
||||
{% tab title="Objective-C" %}
|
||||
|
||||
这个目录包含了关于iOS应用程序渗透测试的信息和技术。在进行iOS应用程序渗透测试时,了解Objective-C编程语言是非常重要的,因为大多数iOS应用程序都是使用Objective-C编写的。
|
||||
这个目录包含了关于iOS应用程序渗透测试的技术和工具。
|
||||
|
||||
以下是一些常见的Objective-C渗透测试技术:
|
||||
## 简介
|
||||
|
||||
- **反编译应用程序**:使用工具如Hopper、IDA Pro和Radare2来反编译iOS应用程序的二进制文件,以获取应用程序的源代码和逻辑。
|
||||
- **分析应用程序**:使用工具如Cycript和Frida来动态分析运行中的iOS应用程序,以获取应用程序的运行时信息和敏感数据。
|
||||
- **漏洞利用**:利用iOS应用程序中的漏洞,如缓冲区溢出、格式化字符串漏洞和内存管理错误,来获取未授权访问或执行恶意代码的权限。
|
||||
- **逆向工程**:使用工具如class-dump和Hopper来逆向工程iOS应用程序的二进制文件,以获取应用程序的类、方法和属性的信息。
|
||||
- **数据存储分析**:分析iOS应用程序的数据存储机制,如SQLite数据库、Core Data和NSUserDefaults,以获取敏感数据和配置信息。
|
||||
- **网络通信分析**:使用工具如Wireshark和Burp Suite来分析iOS应用程序的网络通信,以获取敏感数据和漏洞信息。
|
||||
- **代码审计**:审查iOS应用程序的源代码,以发现安全漏洞和弱点,如不安全的API使用、不正确的身份验证和授权机制等。
|
||||
iOS应用程序渗透测试是评估iOS应用程序的安全性和漏洞的过程。通过进行渗透测试,可以发现应用程序中的潜在漏洞,并提供修复建议,以增强应用程序的安全性。
|
||||
|
||||
请注意,进行iOS应用程序渗透测试时,必须遵守法律和道德规范,并获得合法的授权。
|
||||
## 目录结构
|
||||
|
||||
- [iOS应用程序渗透测试概述](overview.md)
|
||||
- [iOS应用程序逆向工程](reverse-engineering.md)
|
||||
- [iOS应用程序漏洞分析](vulnerability-analysis.md)
|
||||
- [iOS应用程序安全加固](security-hardening.md)
|
||||
- [iOS应用程序渗透测试工具](tools.md)
|
||||
|
||||
## 贡献
|
||||
|
||||
欢迎贡献您的知识和经验,帮助完善这个目录。请参阅[贡献指南](CONTRIBUTING.md)了解更多信息。
|
||||
|
||||
## 许可证
|
||||
|
||||
本目录使用[MIT许可证](LICENSE)。
|
||||
|
||||
{% endtab %}
|
||||
```objectivec
|
||||
// 1. define query
|
||||
NSDictionary *query = @{(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
|
||||
|
@ -1168,7 +1181,7 @@ frida -U -f com.highaltitudehacks.DVIAswiftv2 --no-pause -l fingerprint-bypass-i
|
|||
第三方SDK的一个问题是对SDK提供的功能**没有细粒度的控制**。您可以使用SDK并拥有所有功能(包括诊断泄漏和不安全的HTTP连接),或者不使用它。此外,通常应用程序开发人员**无法修补SDK上的漏洞**。\
|
||||
此外,一些SDK一旦被社区非常信任,就会开始**包含恶意软件**。
|
||||
|
||||
此外,这些服务提供的功能可能涉及**跟踪服务以监控用户在使用应用程序时的行为**,销售横幅广告或改善用户体验。第三方服务的缺点是开发人员不知道通过第三方库执行的代码的详细信息。因此,只应发送必要的信息给服务,并且不应披露敏感信息。
|
||||
此外,这些服务提供的功能可能涉及**跟踪服务以监视用户在使用应用程序时的行为**,销售横幅广告或改善用户体验。第三方服务的缺点是开发人员不知道通过第三方库执行的代码的详细信息。因此,只应发送必要的信息给服务,并且不应披露敏感信息。
|
||||
|
||||
缺点是**开发人员不知道通过第三方库执行的代码的详细信息**,因此放弃了可见性。因此,应确保向服务发送的信息不超过所需的信息,并且不会泄露敏感信息。
|
||||
|
||||
|
@ -1213,6 +1226,6 @@ frida -U -f com.highaltitudehacks.DVIAswiftv2 --no-pause -l fingerprint-bypass-i
|
|||
* 发现我们的独家[NFT收藏品**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
# 基本的iOS测试操作
|
||||
# iOS基本测试操作
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 发现我们的独家[NFT](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||||
|
@ -18,7 +18,7 @@
|
|||
在执行这些操作之前,**通过USB将设备连接到计算机**并**解锁**设备。
|
||||
{% endhint %}
|
||||
|
||||
UDID是一个40位的唯一字母和数字序列,用于标识iOS设备。您可以在macOS Catalina及更高版本的**Finder应用程序**中找到iOS设备的UDID,因为Catalina中不再提供iTunes。只需在Finder中选择连接的iOS设备,然后**单击iOS设备名称下的信息**以遍历它。除了UDID,您还可以找到序列号、IMEI和其他有用的信息。
|
||||
UDID是一个40位数字和字母的唯一序列,用于标识iOS设备。您可以在macOS Catalina及更高版本的**Finder应用程序**中找到iOS设备的UDID,因为Catalina中不再提供iTunes。只需在Finder中选择连接的iOS设备,然后**单击iOS设备名称下的信息**以遍历它。除了UDID,您还可以找到序列号、IMEI和其他有用的信息。
|
||||
|
||||
![](<../../.gitbook/assets/image (471).png>)
|
||||
|
||||
|
@ -133,7 +133,7 @@ $ scp -P 2222 root@localhost:/tmp/data.tgz .
|
|||
```
|
||||
### 使用iFunbox
|
||||
|
||||
[**iFunbox**](https://www.i-funbox.com/en/page-download.html) 是一个图形用户界面应用程序,可用于多种用途(其中包括上传/下载文件)。\
|
||||
[**iFunbox**](https://www.i-funbox.com/en/page-download.html) 是一个图形用户界面应用程序,可用于多种用途(包括上传/下载文件)。\
|
||||
另一个用于此目的的图形用户界面工具是 [**iExplorer**](https://macroplant.com/iexplorer)。
|
||||
|
||||
{% hint style="info" %}
|
||||
|
@ -192,12 +192,12 @@ $ npm install -g itms-services
|
|||
|
||||
### 解密(手动)
|
||||
|
||||
与Android应用程序不同,iOS应用程序的二进制文件**只能被反汇编**,而不能被反编译。\
|
||||
与Android应用程序不同,iOS应用程序的二进制文件**只能被反汇编**而不能被反编译。\
|
||||
当应用程序提交到应用商店时,苹果首先验证应用程序的行为,然后使用[**FairPlay**](https://developer.apple.com/streaming/fps/)对二进制文件进行加密,然后才将其发布到应用商店。因此,从应用商店下载的二进制文件是加密的,这增加了逆向工程的复杂性。
|
||||
|
||||
但是,请注意,还有其他**第三方软件可以用于混淆**生成的二进制文件。
|
||||
然而,请注意还有其他**第三方软件可以用于混淆**生成的二进制文件。
|
||||
|
||||
为了运行加密的二进制文件,设备需要在内存中对其进行解密。然后,可以从内存中**转储解密后的二进制文件**。
|
||||
为了运行加密的二进制文件,设备需要在内存中对其进行解密。然后,可以**从内存中转储解密后的二进制文件**。
|
||||
|
||||
首先,检查二进制文件是否使用了PIE(位置无关代码)标志:
|
||||
```bash
|
||||
|
@ -231,10 +231,10 @@ cryptoff 16384
|
|||
cryptsize 17416192
|
||||
cryptid 0
|
||||
```
|
||||
**`cryptoff`**的值表示加密内容的起始地址,**`cryptsize`**表示加密内容的大小。
|
||||
**`cryptoff`**的值表示加密内容的起始地址,而**`cryptsize`**表示加密内容的大小。
|
||||
|
||||
因此,要转储的`起始地址`将是`vmaddr + cryptoff`,而`结束地址`将是`起始地址 + cryptsize`\
|
||||
在这种情况下:`起始地址 = 0x4000 + 0x4000 = 0x8000`,`结束地址 = 0x8000 + 0x109c000 = 0x10a4000`
|
||||
在这种情况下:`起始地址 = 0x4000 + 0x4000 = 0x8000`,而`结束地址 = 0x8000 + 0x109c000 = 0x10a4000`
|
||||
|
||||
有了这些信息,只需要在越狱设备上运行应用程序,使用gdb(`gdb -p <pid>`)附加到进程并转储内存即可:
|
||||
```bash
|
||||
|
@ -305,6 +305,12 @@ wget https://gist.githubusercontent.com/defparam/71d67ee738341559c35c684d659d40a
|
|||
flexdump list #List apps
|
||||
flexdump dump Twitter.app #Create .ipa file from app
|
||||
```
|
||||
#### bagbak
|
||||
|
||||
又一个基于Frida的应用程序解密工具。需要越狱的iOS设备和[frida.re](https://www.frida.re/)。
|
||||
```bash
|
||||
bagbak --raw Chrome
|
||||
```
|
||||
#### r2flutch
|
||||
|
||||
[**r2flutch**](https://github.com/as0ler/r2flutch) 是一个使用 **radare** 和 **frida** 来 **解密** 和 **转储 iOS 应用程序** 的工具。
|
||||
|
@ -313,7 +319,7 @@ flexdump dump Twitter.app #Create .ipa file from app
|
|||
|
||||
## 安装应用程序
|
||||
|
||||
当您在不使用苹果的应用商店的情况下安装应用程序时,这被称为 **侧载**。有多种侧载的方式,下面将对其进行描述。在 iOS 设备上,实际的安装过程由 **installd 守护进程** 处理,该进程将 **解压** 并 **安装** 应用程序。为了集成应用程序服务或在 iOS 设备上安装应用程序,所有 **应用程序必须使用由 Apple 颁发的证书进行签名**。这意味着只有在成功进行代码签名验证后,应用程序才能安装。然而,在越狱手机上,您可以通过 [**AppSync**](http://repo.hackyouriphone.org/appsyncunified) 来 **绕过此安全功能**,AppSync 是 Cydia 商店中提供的一个软件包。它包含了许多有用的应用程序,利用越狱提供的 root 权限来执行高级功能。**AppSync 是一个修补 installd 的插件**,允许安装伪签名的 IPA 包。
|
||||
当您在不使用苹果的应用商店的情况下安装应用程序时,这被称为 **侧载**。有多种侧载的方式,下面将对其进行描述。在 iOS 设备上,实际的安装过程由 **installd 守护进程** 处理,该进程将解压并安装应用程序。为了集成应用程序服务或在 iOS 设备上安装应用程序,所有的 **应用程序必须使用由 Apple 颁发的证书进行签名**。这意味着只有在成功进行代码签名验证后,应用程序才能被安装。然而,在越狱手机上,您可以通过 [**AppSync**](http://repo.hackyouriphone.org/appsyncunified) 来 **绕过这个安全功能**,AppSync 是 Cydia 商店中提供的一个软件包,它包含了许多利用越狱提供的 root 权限执行高级功能的有用应用程序。**AppSync 是一个修补 installd 的插件**,允许安装伪签名的 IPA 包。
|
||||
|
||||
有不同的方法可以将 IPA 包安装到 iOS 设备上,下面将详细描述这些方法。
|
||||
|
||||
|
@ -325,14 +331,14 @@ flexdump dump Twitter.app #Create .ipa file from app
|
|||
|
||||
#### libimobiledevice
|
||||
|
||||
在 Linux 和 macOS 上,您还可以使用 [libimobiledevice](https://www.libimobiledevice.org),这是一个跨平台的软件协议库和一组用于与 iOS 设备进行本地通信的工具。这使您可以通过 USB 连接执行 ideviceinstaller 来安装应用程序。连接是通过 USB 多路复用守护进程 [usbmuxd](https://www.theiphonewiki.com/wiki/Usbmux) 实现的,它在 USB 上提供了一个 TCP 隧道。
|
||||
在 Linux 和 macOS 上,您还可以使用 [libimobiledevice](https://www.libimobiledevice.org),这是一个跨平台的软件协议库和一组用于与 iOS 设备进行本地通信的工具。这使您可以通过执行 ideviceinstaller 来通过 USB 连接安装应用程序。连接是通过 USB 多路复用守护进程 [usbmuxd](https://www.theiphonewiki.com/wiki/Usbmux) 实现的,它在 USB 上提供了一个 TCP 隧道。
|
||||
|
||||
libimobiledevice 的软件包将在您的 Linux 软件包管理器中提供。在 macOS 上,您可以通过 brew 安装 libimobiledevice。
|
||||
libimobiledevice 的软件包将在您的 Linux 软件包管理器中提供。在 macOS 上,您可以通过 brew 安装 libimobiledevice:
|
||||
```bash
|
||||
$ brew install libimobiledevice
|
||||
$ brew install ideviceinstaller
|
||||
```
|
||||
安装完成后,您将获得几个新的命令行工具,例如`ideviceinfo`、`ideviceinstaller`或`idevicedebug`。
|
||||
安装完成后,您将获得几个新的命令行工具,例如`ideviceinfo`,`ideviceinstaller`或`idevicedebug`。
|
||||
```bash
|
||||
# The following command will show detailed information about the iOS device connected via USB.
|
||||
$ ideviceinfo
|
||||
|
|
|
@ -1,37 +1,170 @@
|
|||
# iOS中的Frida配置
|
||||
# iOS Frida配置
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[NFT收藏品**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 你在一个**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或者 [**telegram群组**](https://t.me/peass) 或者 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||||
|
||||
</details>
|
||||
|
||||
## 安装Frida
|
||||
|
||||
打开**Cydia**应用,通过进入**Manage -> Sources -> Edit -> Add**并输入[**https://build.frida.re** ](https://build.frida.re)来添加Frida的存储库。它将在源列表中添加一个新的源。进入**frida** **source**,现在你应该**安装** **Frida**软件包。
|
||||
在越狱设备的**Cydia/Sileo**应用中,通过进入**Manage -> Sources -> Edit -> Add**并输入[**https://build.frida.re** ](https://build.frida.re)来添加Frida的存储库。这将在源列表中添加一个新的源。进入F**rida** **源**,现在你应该**安装** **Frida**软件包。
|
||||
|
||||
![](https://miro.medium.com/max/614/0\*qSD26kBtgt\_UIZk1.png)
|
||||
|
||||
安装完成后,你可以在电脑上使用命令`frida-ls-devices`,并检查设备是否出现(你的电脑需要能够访问它)。还可以执行`frida-ps -Uia`来检查手机上正在运行的进程。
|
||||
如果你使用的是**Corellium**,你需要从[https://github.com/frida/frida/releases](https://github.com/frida/frida/releases)下载Frida的发布版本(`frida-gadget-[yourversion]-ios-universal.dylib.gz`),并解压缩并复制到Frida要求的dylib位置,例如:`/Users/[youruser]/.cache/frida/gadget-ios.dylib`
|
||||
|
||||
安装完成后,你可以在你的电脑上使用命令**`frida-ls-devices`**并检查设备是否出现(你的电脑需要能够访问它)。\
|
||||
还可以执行**`frida-ps -Uia`**来检查手机上正在运行的进程。
|
||||
|
||||
## 无需越狱设备和无需修补应用程序的Frida
|
||||
|
||||
查看这篇关于如何在非越狱设备上使用Frida而无需修补应用程序的博客文章:[https://mrbypass.medium.com/unlocking-potential-exploring-frida-objection-on-non-jailbroken-devices-without-application-ed0367a84f07](https://mrbypass.medium.com/unlocking-potential-exploring-frida-objection-on-non-jailbroken-devices-without-application-ed0367a84f07)
|
||||
|
||||
## 安装Frida客户端
|
||||
|
||||
安装**frida工具**:
|
||||
```bash
|
||||
pip install frida-tools
|
||||
pip install frida
|
||||
```
|
||||
安装了Frida服务器并且设备正在运行和连接中,**检查**客户端是否**工作**:
|
||||
```bash
|
||||
frida-ls-devices # List devices
|
||||
frida-ps -Uia # Get running processes
|
||||
```
|
||||
## Frida跟踪
|
||||
|
||||
Frida is a dynamic instrumentation toolkit that allows you to inject JavaScript code into running processes. It is commonly used for reverse engineering, debugging, and dynamic analysis of mobile applications. In this section, we will discuss how to configure Frida for iOS pentesting.
|
||||
|
||||
Frida是一个动态插桩工具包,允许您将JavaScript代码注入到正在运行的进程中。它通常用于移动应用程序的逆向工程、调试和动态分析。在本节中,我们将讨论如何配置Frida用于iOS渗透测试。
|
||||
|
||||
### Setting up Frida Server on iOS
|
||||
|
||||
To use Frida on iOS, you need to set up Frida Server on the target device. Follow the steps below to configure Frida Server:
|
||||
|
||||
1. Jailbreak the iOS device or use a jailbroken device.
|
||||
2. Install the Frida package from the Cydia repository.
|
||||
3. Open a terminal and run the following command to start Frida Server:
|
||||
|
||||
```bash
|
||||
frida-server -l 0.0.0.0
|
||||
```
|
||||
|
||||
This will start Frida Server and listen on all available network interfaces.
|
||||
|
||||
4. Make sure the device and the machine running Frida have network connectivity.
|
||||
|
||||
### Connecting to Frida Server from the Host Machine
|
||||
|
||||
Once Frida Server is running on the iOS device, you can connect to it from your host machine using the Frida command-line tools or the Frida Python bindings. Follow the steps below to connect to Frida Server:
|
||||
|
||||
1. Install the Frida command-line tools or the Frida Python bindings on your host machine.
|
||||
2. Open a terminal and run the following command to connect to Frida Server:
|
||||
|
||||
```bash
|
||||
frida-ps -H <device_ip_address>
|
||||
```
|
||||
|
||||
Replace `<device_ip_address>` with the IP address of the iOS device running Frida Server.
|
||||
|
||||
3. If the connection is successful, you will see a list of running processes on the iOS device.
|
||||
|
||||
### Injecting JavaScript Code into a Process
|
||||
|
||||
Once you are connected to Frida Server, you can inject JavaScript code into a running process on the iOS device. Follow the steps below to inject JavaScript code:
|
||||
|
||||
1. Identify the process ID (PID) of the target process using the `frida-ps` command.
|
||||
2. Open a terminal and run the following command to inject JavaScript code into the target process:
|
||||
|
||||
```bash
|
||||
frida -H <device_ip_address> -p <pid> -l <script.js>
|
||||
```
|
||||
|
||||
Replace `<device_ip_address>` with the IP address of the iOS device running Frida Server, `<pid>` with the process ID of the target process, and `<script.js>` with the path to the JavaScript code file.
|
||||
|
||||
3. If the injection is successful, the JavaScript code will be executed in the target process.
|
||||
|
||||
### Conclusion
|
||||
|
||||
Configuring Frida for iOS pentesting involves setting up Frida Server on the target device and connecting to it from the host machine. Once connected, you can inject JavaScript code into running processes on the iOS device for reverse engineering, debugging, and dynamic analysis. Frida is a powerful tool that can greatly enhance your iOS pentesting capabilities.
|
||||
```bash
|
||||
# Trace all methods of all classes
|
||||
frida-trace -U <program> -m "*[* *]"
|
||||
|
||||
# Trace all methods with the word "authentication" from classes that start with "NE"
|
||||
frida-trace -U <program> -m "*[NE* *authentication*]"
|
||||
```
|
||||
### 获取所有类和方法
|
||||
|
||||
* 获取**所有**可用的**类**(通过字符串进行过滤)
|
||||
|
||||
{% code title="/tmp/script.js" %}
|
||||
```javascript
|
||||
// frida -U <program> -l /tmp/script.js
|
||||
|
||||
var filterClass = "filterstring";
|
||||
|
||||
if (ObjC.available) {
|
||||
for (var className in ObjC.classes) {
|
||||
if (ObjC.classes.hasOwnProperty(className)) {
|
||||
if (!filterClass || className.includes(filterClass)) {
|
||||
console.log(className);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
console.log("Objective-C runtime is not available.");
|
||||
}
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
* 获取一个类的所有方法(通过字符串过滤)
|
||||
|
||||
{% code title="/tmp/script.js" %}
|
||||
```javascript
|
||||
// frida -U <program> -l /tmp/script.js
|
||||
|
||||
var specificClass = "YourClassName";
|
||||
var filterMethod = "filtermethod";
|
||||
|
||||
if (ObjC.available) {
|
||||
if (ObjC.classes.hasOwnProperty(specificClass)) {
|
||||
var methods = ObjC.classes[specificClass].$ownMethods;
|
||||
for (var i = 0; i < methods.length; i++) {
|
||||
if (!filterMethod || methods[i].includes(filterClass)) {
|
||||
console.log(specificClass + ': ' + methods[i]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
console.log("Class not found.");
|
||||
}
|
||||
} else {
|
||||
console.log("Objective-C runtime is not available.");
|
||||
}
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
## Frida Android 教程
|
||||
|
||||
{% content-ref url="../android-app-pentesting/frida-tutorial/" %}
|
||||
[frida-tutorial](../android-app-pentesting/frida-tutorial/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks 云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家[NFT收藏品**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||||
* 你在一家 **网络安全公司** 工作吗?你想在 HackTricks 中 **宣传你的公司** 吗?或者你想获得 **PEASS 的最新版本或下载 HackTricks 的 PDF** 吗?请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 发现我们的独家 [**NFTs**](https://opensea.io/collection/the-peass-family) 集合 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或 **关注** 我的 **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* **通过向** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue