一、前置知识 1.1 渗透测试的定义 渗透测试(Penetration Testing)是指在获得系统所有者书面授权后,通过模拟攻击者的技术与方法,对目标系统进行安全性评估的过程。其目的是发现系统中存在的安全漏洞,评估漏洞的危害程度,并提供修复建议。 渗透测试与"黑客攻击"的本质区别在于授权。未经授权的安全测试属于违法行为。所有实验均在本地模拟器环境中进行,不涉及任何外部系统。 渗透测试的标准流程分为五个阶段: 信息收集:获取目标系统的相关信息(域名、IP、开放端口、应用版本等) 漏洞扫描:使用自动化工具或手动方法发现潜在弱点 漏洞利用:验证漏洞是否可被实际利用 权限提升:从低权限获取更高权限 报告编写:将发现整理为结构化文档,包含漏洞描述、复现步骤、危害评估、修复建议 1.2 Android 操作系统概述 Android 是由 Google 开发的基于 Linux 内核的移动操作系统。其架构自底向上分为五层: 层级名称功能1Linux Kernel硬件驱动、进程管理、内存管理、安全权限控制2Hardware Abstraction Layer (HAL)为上层提供统一的硬件访问接口3Android Runtime (ART)运行 DEX 字节码,将字节码编译为机器码执行4Application Framework提供 Activity 管理、包管理、资源管理等 API5Applications系统应用(电话、短信)和用户安装的第三方应用Android 安全模型依赖以下机制: 应用沙箱(Application Sandbox):每个应用在独立的 Linux 用户 ID 下运行,拥有独立的进程和数据目录。默认情况下,应用 A 无法访问应用 B 的文件。 权限系统(Permission System):应用必须在 AndroidManifest.xml 中声明所需权限。Android 6.0(API 23)起引入运行时权限,用户在应用运行时授予或拒绝敏感权限。 应用签名(Application Signing):所有 APK 必须经过数字签名方可安装。签名用于验证应用的来源完整性和开发者身份。 SELinux(Security-Enhanced Linux):强制访问控制系统。在 Enforcing 模式下,即使进程以 root 身份运行,违反策略的操作也会被拒绝。 1.3 APK 文件结构 APK(Android Package)是 Android 应用的安装包格式。其本质是 ZIP 压缩文件,将后缀名从 .apk 改为 .zip 后可使用任何解压工具打开。 APK 内部包含以下核心文件与目录: 文件/目录说明`AndroidManifest.xml`应用清单文件(二进制 XML),声明包名、版本、权限、四大组件等`classes.dex`Dalvik 字节码文件,包含所有 Java/Kotlin 代码编译后的指令`classes2.dex`(可选)分包 DEX 文件,当方法数超过 65536 时产生`resources.arsc`编译后的资源索引表,存储资源 ID 与实际值的映射`res/`资源文件目录,包含布局 XML、图片、字符串、颜色值等`META-INF/`签名文件目录,包含 MANIFEST.MF、CERT.SF、CERT.RSA`lib/`Native 库目录,按 CPU 架构分子目录(arm64-v8a/armeabi-v7a/x86_64/x86)`assets/`原始资源目录,文件原样打包,不会被编译AndroidManifest.xml 是安全审计的核心文件之一,其中包含: package:应用唯一标识(如 com.example.app) uses-permission:声明的权限列表 activity/service/receiver/provider:四大组件声明,android:exported 属性决定组件是否可被外部调用 application:应用全局配置,包含 android:debuggable、android:allowBackup 等安全相关属性 1.4 工具清单 以下工具,安装方法参见《附录-工具安装手册.md》: 工具版本用途MuMu 模拟器12(Android 12)提供 Android 运行环境Android SDK Platform Tools35.0+提供 ADB 命令行工具Reqable2.8.0+HTTP/HTTPS 抓包调试apktool2.9.3APK 反编译与回编译jadx1.5.0DEX 字节码反编译为 Java 代码uber-apk-signer1.3.0APK 签名工具Frida16.5.x动态插桩框架unveilrlatest微信小程序解包工具二、命令行基础操作 2.1 命令行的概念 命令行(Command Line Interface, CLI)是一种通过输入文本命令与操作系统交互的方式。与图形用户界面(Graphical User Interface, GUI)通过鼠标点击操作不同,CLI 要求用户输入特定格式的指令。 Windows 系统提供两种命令行环境: 命令提示符(cmd.exe):传统 Windows 命令行,使用 DOS 风格的命令 PowerShell:更强大的命令行环境,支持脚本和管道操作 使用 cmd.exe 作为默认命令行环境。启动方法:按键盘 Win + R,输入 cmd,按回车键。 2.2 文件系统导航 当前目录与提示符: 打开命令行后,显示如下内容: C:\Users\用户名> 其中 C:\Users\用户名 表示当前工作目录(Current Working Directory)。> 为提示符,表示等待用户输入命令。 基础命令: BASH# 列出当前目录的文件和子目录 dir # dir = directory 的缩写 # 切换目录 cd Desktop # cd = change directory 的缩写 # 执行后当前目录变为 C:\Users\用户名\Desktop # 返回上一级目录 cd .. # .. 表示父目录 # 切换到指定盘符 D: # 将当前盘符从 C 盘切换到 D 盘 # 同时切换盘符和目录 cd /d D:\tools # /d 参数允许跨盘符切换 # 创建目录 mkdir test_dir # mkdir = make directory 的缩写 # 删除空目录 rmdir test_dir # rmdir = remove directory 的缩写 路径的类型: 相对路径:相对于当前目录的路径。例如当前目录为 C:\Users,则 cd 用户名 进入 C:\Users\用户名。 绝对路径:从盘符开始的完整路径。例如 C:\platform-tools\adb.exe。 2.3 命令行的补充说明 Tab 键自动补全: 输入路径的前几个字符,按 Tab 键,系统会自动补全剩余部分。如有多个匹配项,连续按 Tab 键可切换选项。该功能可显著提高输入效率并减少拼写错误。 命令历史: 按键盘 ↑(上箭头)可调出之前输入的命令。按 ↓(下箭头)可向更近的历史移动。该功能避免重复输入相同命令。 命令行的注意事项: 命令和参数之间使用空格分隔 按回车键执行命令 路径中包含空格时,需使用双引号包裹,例如 cd "C:\Program Files" Windows 命令行不区分大小写 三、MuMu 模拟器安装与配置 3.1 模拟器的概念与选择 模拟器是一种在宿主机操作系统上模拟目标硬件和软件环境的程序。Android 模拟器使 Windows 计算机能够运行 Android 操作系统和应用。 选择模拟器而非物理设备进行渗透测试的原因如下: 安全性:测试操作可能对系统造成不可逆的修改。模拟器可通过快照快速恢复初始状态。 Root 权限:模拟器通常提供一键 Root 功能。物理设备获取 Root 权限流程复杂且有变砖风险。 截图与记录:模拟器运行在桌面窗口内,便于截屏和录屏记录测试过程。 选用 MuMu 模拟器的原因: 基于 Android 12,兼容主流应用 提供一键 Root 开关 支持 AMD 和 Intel CPU 内置 ADB 调试支持 3.2 下载与安装 步骤 1:下载安装程序 打开浏览器,访问 https://mumu.163.com/ 点击"下载 MuMu 模拟器"按钮,选择 Windows 版本 等待安装程序下载完成(文件约 500 MB) 步骤 2:运行安装程序 双击下载的 mumu_installer_xxx.exe 在弹出的"用户账户控制"对话框中点击"是" 安装向导首屏 → 点击"自定义安装" 修改安装路径(建议选择非系统盘,如 D 盘,预留至少 10 GB 空间) 点击"立即安装" 等待进度条完成(约 3-8 分钟,取决于磁盘性能) 安装完成后,桌面出现 MuMu 模拟器快捷方式 步骤 3:首次启动 双击桌面快捷方式 模拟器窗口显示 Android 启动画面 等待系统初始化(约 2-3 分钟) 进入 Android 桌面,显示系统界面 3.3 基础配置 开启 Root 权限: 点击模拟器窗口右侧工具栏的齿轮图标(设置) 在设置面板中选择"其他设置" 找到"Root 权限"选项,点击开关使其开启 关闭设置面板 点击模拟器窗口顶部的电源图标 → 选择"重启" 等待模拟器重启完成 其他必要设置: BASH# 待 ADB 配置完成后执行以下命令(第 5 节之后补充操作): # 允许安装来自未知来源的应用 adb shell settings put secure install_non_market_apps 1 # 关闭 Google Play 保护机制 adb shell settings put global package_verifier_enable 0 # 将 SELinux 设为 Permissive 模式 adb shell su -c "setenforce 0" adb shell getenforce # 预期输出:Permissive 3.4 模拟器的基本操作 模拟器使用鼠标模拟手指触控操作: 鼠标操作对应的触控操作鼠标左键单击手指点击按住鼠标左键拖动手指滑动右键 → 返回Android 返回键键盘 ESCAndroid 返回键键盘 F5Android Home 键模拟器窗口右侧工具栏按钮说明(从上到下): 截图 录屏 旋转屏幕 音量调节 设置 最小化/最大化/关闭 四、ADB 安装与连接 教学目标 完成 Android SDK Platform Tools 的下载与配置 使用 ADB 连接 MuMu 模拟器 掌握 10 个基本 ADB 命令 4.1 ADB 概述 ADB(Android Debug Bridge)是 Android SDK 中的命令行工具,用于 PC 与 Android 设备之间的通信。ADB 采用客户端-服务器架构: ADB Client:运行在 PC 端,用户通过命令行发送指令 ADB Server:运行在 PC 端后台,管理 client 与 device 之间的连接。默认监听 TCP 5037 端口 ADB Daemon(adbd):运行在 Android 设备端,执行来自 server 的指令 4.2 安装 Platform Tools 步骤 1:下载 浏览器访问:https://developer.android.com/tools/releases/platform-tools 在"Downloads"区域点击 Windows 版本的下载链接 同意许可协议,开始下载 获得文件:platform-tools-latest-windows.zip(约 10 MB) 步骤 2:解压 找到下载的 ZIP 文件 右键 →"全部解压" 目标路径输入 C:\platform-tools 点击"解压" 确认 C:\platform-tools 目录下包含 adb.exe 文件 步骤 3:配置环境变量 环境变量是操作系统用来查找可执行程序的路径列表。将 C:\platform-tools 加入该列表后,可在任意目录下直接运行 adb 命令。 按 Win + R,输入 sysdm.cpl,回车 在"系统属性"窗口中选择"高级"选项卡 点击"环境变量"按钮 在"系统变量"区域找到变量名为 Path 的行,双击 点击"新建" 输入 C:\platform-tools 点击"确定"关闭所有对话框 步骤 4:验证 打开新的命令行窗口(已打开的需要关闭后重新打开) 输入以下命令: BASHadb version 预期输出(版本号可能不同): Android Debug Bridge version 1.0.41 Version 35.0.1-11580240 Installed as C:\platform-tools\adb.exe 如果提示 'adb' 不是内部或外部命令,说明环境变量配置未生效。检查:是否已关闭旧命令行窗口、Path 变量中路径是否拼写正确。 4.3 连接 MuMu 模拟器 前提条件:MuMu 模拟器已启动并运行。 BASH# 1. 连接模拟器 # MuMu 模拟器的 ADB 端口固定为 7555 # 127.0.0.1 表示本机(localhost) adb connect 127.0.0.1:7555 # 预期输出: # connected to 127.0.0.1:7555 # 2. 验证连接状态 adb devices # 预期输出: # List of devices attached # 127.0.0.1:7555 device device 表示连接正常。其他可能的状态: offline:模拟器正在启动或 ADB 服务未完全初始化,等待后重试 unauthorized:需要在模拟器上确认 USB 调试授权弹窗 no device:ADB 服务异常,尝试 adb kill-server 后重新 adb connect 故障排除: BASH# 如果连接失败,尝试重启 ADB 服务: adb kill-server adb start-server adb connect 127.0.0.1:7555 4.4 基本 ADB 命令 BASH# 1. 进入设备 Shell adb shell # 提示符变为设备名称或 "root@..." 表示已进入模拟器内部 # 输入 exit 返回 PC 命令行 # 2. 安装 APK adb install 应用文件.apk # 将 PC 上的 APK 文件安装到模拟器 # 预期输出:Performing Streamed Install → Success # 3. 卸载应用 adb uninstall com.example.app # com.example.app 为应用的包名,不是应用名称 # 4. 查看已安装应用列表 adb shell pm list packages # 输出所有已安装应用的包名 # 5. 查找特定应用 adb shell pm list packages | findstr "mumu" # findstr 为 Windows 下的文本过滤命令(Linux 下为 grep) # 6. 推送文件到设备 adb push PC上的文件路径 /sdcard/ # 将 PC 文件复制到模拟器的 /sdcard/ 目录 # 7. 从设备拉取文件 adb pull /sdcard/设备上的文件 PC上的目标路径 # 将模拟器文件复制到 PC # 8. 查看设备信息 adb shell getprop ro.build.version.release # 输出 Android 版本号 adb shell getprop ro.product.model # 输出设备型号 # 9. 重启设备 adb reboot # 模拟器重启 # 10. 以 root 身份重启 ADB 守护进程 adb root # 将 adbd 以 root 权限重新启动 五、Reqable 安装与 HTTP 抓包 5.1 HTTP 协议基础 HTTP(HyperText Transfer Protocol,超文本传输协议)是客户端与服务器之间通信的应用层协议。其工作模式为请求-响应模式: 客户端(浏览器或 App)向服务器发送请求(Request) 服务器处理请求后返回响应(Response) HTTP 请求的结构: 方法 路径 协议版本 请求头字段1: 值1 请求头字段2: 值2 (空行) 请求体(可选) 请求方法表示对资源的操作类型: 方法含义常见用途GET获取资源查看页面、查询数据POST创建资源提交表单、登录、上传数据PUT更新资源修改全部字段DELETE删除资源删除记录请求头(Headers)传递附加信息,常见字段: 字段说明示例Host目标服务器域名`api.example.com`Content-Type请求体数据格式`application/json`User-Agent客户端标识`Dalvik/2.1.0`Authorization认证凭据`Bearer eyJhbG...`HTTP 响应的结构: 协议版本 状态码 状态文本 响应头字段1: 值1 (空行) 响应体 状态码表示请求结果: 范围含义示例200-299成功200 OK300-399重定向301 Moved Permanently400-499客户端错误403 Forbidden、404 Not Found500-599服务器错误500 Internal Server Error5.2 代理服务器原理 代理服务器(Proxy Server)位于客户端与服务器之间,转发双方的通信数据。 正常情况下,客户端直接连接服务器: 客户端 ────→ 服务器 配置代理后,客户端连接代理服务器,由代理将请求转发至目标服务器: 客户端 ────→ 代理服务器 ────→ 目标服务器 由于所有数据流经代理,代理可以捕获、查看、修改通信内容。渗透测试利用这一特性分析和篡改网络流量。 5.3 安装 Reqable 浏览器访问 https://reqable.com/ 点击"下载" → 选择 Windows 版本 双击下载的安装程序,按默认选项完成安装 桌面出现 Reqable 图标,双击启动 初始设置: 打开 Reqable 主界面 确认左侧"抓包"选项卡已选中 记录顶部显示的代理端口号(默认 9000) 5.4 配置模拟器代理 步骤 1:获取电脑 IP 地址 BASH# 打开命令行,输入: ipconfig # 在输出中查找 "IPv4 地址",常见格式: # 192.168.x.x 或 10.x.x.x # 注意:选择与模拟器通信的网卡对应的 IP(通常是以太网或 WLAN 适配器) 步骤 2:设置模拟器全局代理 BASH# 将 <IP> 替换为步骤 1 获取的地址 adb shell settings put global http_proxy <IP>:9000 # 示例: adb shell settings put global http_proxy 192.168.1.105:9000 # 验证代理是否生效: adb shell settings get global http_proxy # 预期输出:192.168.1.105:9000 # 如需取消代理: adb shell settings put global http_proxy :0 说明:settings put global http_proxy 设置的是 Android 系统级别的全局 HTTP 代理。该设置影响通过标准 HTTP API 发送的网络请求。部分应用使用非标准网络库,可能绕过该设置。对于此类应用,需要使用 VPN 模式。 5.5 捕获第一个 HTTP 请求 确认 Reqable 已启动,代理端口为 9000 确认模拟器代理已配置并生效 在模拟器中打开系统自带浏览器 在浏览器地址栏输入:http://httpbin.org/get 按回车访问 切换到 Reqable 窗口 预期结果: Reqable 左侧的请求列表中新增一条记录: 左侧显示 GET http://httpbin.org/get 右侧详情面板分为"请求"和"响应"两个标签页 "请求"标签页显示请求方法(GET)、请求头 "响应"标签页显示状态码(200 OK)、响应头、响应体(JSON 格式文本) httpbin.org 是一个用于测试 HTTP 请求的公共服务,其 /get 接口会原样返回请求信息。 六、HTTPS 抓包与证书安装 6.1 HTTPS 与 TLS 加密 HTTPS(HTTP Secure)是 HTTP 协议与 TLS(Transport Layer Security,传输层安全协议)的组合。TLS 提供三项核心安全保证: 加密:通信内容被加密,第三方即使截获数据也无法读取原始内容。 身份验证:通过数字证书验证服务器身份,防止中间人冒充目标服务器。 数据完整性:通过消息认证码(MAC)检测数据是否在传输过程中被篡改。 HTTP 与 HTTPS 的直观区别: HTTP 请求的 URL 以 http:// 开头,默认使用 80 端口 HTTPS 请求的 URL 以 https:// 开头,默认使用 443 端口 浏览器地址栏中,HTTPS 网站通常显示锁形图标 6.2 数字证书 数字证书是用于验证网络实体身份的数字文件,由证书颁发机构(Certificate Authority, CA)签发。X.509 是数字证书的标准格式。 证书信任链: 根证书(Root CA) ↓ 使用根证书私钥签名 中间证书(Intermediate CA) ↓ 使用中间证书私钥签名 服务器证书(End-entity Certificate) 操作系统和浏览器预置了一批受信任的根证书。当访问 HTTPS 网站时,客户端验证服务器证书是否由这些受信任的根证书或其中间证书签发。 中间人代理的证书机制: Reqable 作为中间人代理时,对于每个 HTTPS 请求,它会动态生成一个由 Reqable 根证书签名的伪造服务器证书。如果客户端(模拟器)信任了 Reqable 的根证书,就会信任这些伪造证书——Reqable 从而能够解密 HTTPS 流量。 Android 7.0(API 24)起,系统区分"用户证书"和"系统证书": 用户证书:通过设置界面安装的证书,存储在 /data/misc/user/0/cacerts-added/ 系统证书:预置在系统中,存储在 /system/etc/security/cacerts/ 默认情况下,应用仅信任系统证书。因此,通过常规方式安装的 Reqable 证书(用户证书)无法解密大多数应用(targetSdkVersion ≥ 24)的 HTTPS 流量。必须将证书部署到系统证书目录。 6.3 安装 Reqable 证书到系统目录 步骤 1:导出 Reqable 根证书 Reqable 主界面 → 右上角设置图标(齿轮) SSL 配置 → 导出根证书 → 选择 PEM 格式 保存文件,例如命名为 reqable-ca.pem,放置于桌面 步骤 2:计算证书的 Android 命名哈希值 BASH# 切换到证书文件所在目录 cd %USERPROFILE%\Desktop # 计算哈希值(需要 OpenSSL) openssl x509 -inform PEM -subject_hash_old -in reqable-ca.pem | head -1 # 输出一个 8 位十六进制字符串,例如:2a5b6c7d # 记录此值 如果未安装 OpenSSL: 访问 https://slproweb.com/products/Win32OpenSSL.html 下载 "Win64 OpenSSL Light" 版本 按默认选项安装 将 OpenSSL 安装目录下的 bin 子目录加入系统 Path 环境变量(方法与 ADB 环境变量配置相同) 步骤 3:生成 Android 格式证书文件 BASH# 将 <hash> 替换为步骤 2 输出的哈希值 openssl x509 -inform PEM -text -in reqable-ca.pem > <hash>.0 # 示例(假设哈希值为 2a5b6c7d): openssl x509 -inform PEM -text -in reqable-ca.pem > 2a5b6c7d.0 执行后当前目录生成一个名为 <hash>.0 的文件。 步骤 4:推送证书到模拟器 BASH# 确保 ADB 已连接 adb connect 127.0.0.1:7555 # 以 root 身份重启 ADB 守护进程 adb root # 将系统分区重新挂载为可读写 adb remount # 预期输出:remount succeeded # 推送证书文件 adb push 2a5b6c7d.0 /system/etc/security/cacerts/ # 设置文件权限(644 表示:所有者可读写、组可读、其他可读) adb shell chmod 644 /system/etc/security/cacerts/2a5b6c7d.0 # 重启模拟器使配置生效 adb reboot # 等待模拟器重启(约 1-2 分钟) # 重新连接并确认代理设置 adb connect 127.0.0.1:7555 adb shell settings get global http_proxy # 确认代理配置仍然有效(如果被清除,重新设置) 6.4 验证 HTTPS 抓包 确认 Reqable 正在运行 在模拟器浏览器中输入:https://httpbin.org/get 按回车访问 切换到 Reqable 窗口,查看新出现的请求 判断标准: 证书安装成功:响应体内容为可读的 JSON 文本,而非乱码 证书安装失败:响应体区域无内容,或连接超时/拒绝(TLS 握手失败) 七、综合练习——安装测试 App 并抓包 7.1 环境确认 在开始前,逐项确认以下条件: BASH# 1. ADB 连接 adb devices # 预期:127.0.0.1:7555 device # 2. 代理配置 adb shell settings get global http_proxy # 预期:<电脑IP>:9000 # 3. Root 权限 adb shell su -c "id" # 预期:uid=0(root) gid=0(root) # 4. SELinux 状态 adb shell getenforce # 预期:Permissive(如果不是,执行 adb shell su -c "setenforce 0") 7.2 安装测试 App BASH# 语法:adb install <APK 文件的完整路径> adb install C:\Users\用户名\Desktop\test_app.apk # 预期输出: # Performing Streamed Install # Success 安装完成后,模拟器桌面出现新应用的图标。如果应用未出现在桌面,可以在应用抽屉(从底部向上滑动)中查找。 常见错误: INSTALL_FAILED_ALREADY_EXISTS:应用已安装。先卸载已有版本:adb uninstall <包名> INSTALL_PARSE_FAILED_NO_CERTIFICATES:APK 未签名或签名无效。换用已签名的 APK INSTALL_FAILED_INSUFFICIENT_STORAGE:模拟器存储空间不足。在 MuMu 设置中增大磁盘容量 7.3 抓包操作 在 Reqable 主界面确认抓包功能已开启(左侧"抓包"选项卡高亮) 在模拟器中点击测试 App 图标,启动应用 操作 App 中的各项功能:点击按钮、切换页面、输入文字并提交 观察 Reqable 中的请求列表变化 每看到新的请求,依次点击查看: 对每条请求的分析模板: 请求 URL: 请求方法(GET/POST/其他): 请求头中的重要字段: - Content-Type: - Authorization: 请求体内容(如果有): 响应状态码: 响应体内容(摘录前 200 个字符): 该请求的业务功能(我的操作触发了什么): 关注点: 请求体是否包含敏感信息(密码、手机号、身份证号等明文数据) 响应体是否返回了超出当前用户应有范围的数据 请求头中是否有自定义的签名字段(如 X-Sign、token) 验收标准: App 成功安装并运行 Reqable 中捕获到至少 5 条请求 每条请求的分析模板均完整填写 能区分 HTTP 请求和 HTTPS 请求 八、总结 8.1 知识体系 主题核心知识点渗透测试概念定义、授权原则、五阶段流程Android 系统五层架构、安全模型(沙箱/权限/签名/SELinux)APK 结构ZIP 格式、核心文件(Manifest/DEX/资源/签名/Native 库)命令行cmd 启动、文件导航(dir/cd/mkdir/rmdir)、Tab 补全MuMu 模拟器安装、Root 开关、鼠标操作映射ADB架构(Client-Server-Daemon)、连接命令、10 个基础命令HTTP 协议请求/响应结构、方法类型、状态码分类、请求头Reqable安装、代理原理、模拟器代理配置HTTPS 与证书TLS 加密、证书信任链、系统证书部署8.2 工具链总览 PC 端工具: ├── Reqable(流量捕获) ├── ADB(设备通信) │ ├── adb connect(连接模拟器) │ ├── adb shell(进入设备命令行) │ ├── adb install(安装应用) │ └── adb push/pull(文件传输) └── OpenSSL(证书处理) 模拟器端: ├── MuMu 模拟器(Android 12,已 Root) └── 系统证书目录(已部署 Reqable 证书) 8.3 环境健康检查 请逐项确认并记录结果(通过/未通过): BASH# 检查项 1:ADB 连接 adb devices # 通过条件:显示 127.0.0.1:7555 device # 检查项 2:Root 权限 adb shell su -c "id" # 通过条件:uid=0(root) # 检查项 3:代理配置 adb shell settings get global http_proxy # 通过条件:显示代理地址和端口 # 检查项 4:HTTP 抓包 # 在模拟器浏览器访问 http://httpbin.org/get # 通过条件:Reqable 中显示请求记录 # 检查项 5:HTTPS 抓包 # 在模拟器浏览器访问 https://httpbin.org/get # 通过条件:Reqable 中显示明文 JSON 内容
一、前置知识
1.1 渗透测试的定义
渗透测试(Penetration Testing)是指在获得系统所有者书面授权后,通过模拟攻击者的技术与方法,对目标系统进行安全性评估的过程。其目的是发现系统中存在的安全漏洞,评估漏洞的危害程度,并提供修复建议。
渗透测试与"黑客攻击"的本质区别在于授权。未经授权的安全测试属于违法行为。所有实验均在本地模拟器环境中进行,不涉及任何外部系统。
渗透测试的标准流程分为五个阶段:
1.2 Android 操作系统概述
Android 是由 Google 开发的基于 Linux 内核的移动操作系统。其架构自底向上分为五层:
层级
名称
功能
1
Linux Kernel
硬件驱动、进程管理、内存管理、安全权限控制
2
Hardware Abstraction Layer (HAL)
为上层提供统一的硬件访问接口
3
Android Runtime (ART)
运行 DEX 字节码,将字节码编译为机器码执行
4
Application Framework
提供 Activity 管理、包管理、资源管理等 API
5
Applications
系统应用(电话、短信)和用户安装的第三方应用
Android 安全模型依赖以下机制:
1.3 APK 文件结构
APK(Android Package)是 Android 应用的安装包格式。其本质是 ZIP 压缩文件,将后缀名从 .apk 改为 .zip 后可使用任何解压工具打开。
APK 内部包含以下核心文件与目录:
文件/目录
说明
`AndroidManifest.xml`
应用清单文件(二进制 XML),声明包名、版本、权限、四大组件等
`classes.dex`
Dalvik 字节码文件,包含所有 Java/Kotlin 代码编译后的指令
`classes2.dex`(可选)
分包 DEX 文件,当方法数超过 65536 时产生
`resources.arsc`
编译后的资源索引表,存储资源 ID 与实际值的映射
`res/`
资源文件目录,包含布局 XML、图片、字符串、颜色值等
`META-INF/`
签名文件目录,包含 MANIFEST.MF、CERT.SF、CERT.RSA
`lib/`
Native 库目录,按 CPU 架构分子目录(arm64-v8a/armeabi-v7a/x86_64/x86)
`assets/`
原始资源目录,文件原样打包,不会被编译
AndroidManifest.xml 是安全审计的核心文件之一,其中包含:
1.4 工具清单
以下工具,安装方法参见《附录-工具安装手册.md》:
工具
版本
用途
MuMu 模拟器
12(Android 12)
提供 Android 运行环境
Android SDK Platform Tools
35.0+
提供 ADB 命令行工具
Reqable
2.8.0+
HTTP/HTTPS 抓包调试
apktool
2.9.3
APK 反编译与回编译
jadx
1.5.0
DEX 字节码反编译为 Java 代码
uber-apk-signer
1.3.0
APK 签名工具
Frida
16.5.x
动态插桩框架
unveilr
latest
微信小程序解包工具
二、命令行基础操作
2.1 命令行的概念
命令行(Command Line Interface, CLI)是一种通过输入文本命令与操作系统交互的方式。与图形用户界面(Graphical User Interface, GUI)通过鼠标点击操作不同,CLI 要求用户输入特定格式的指令。
Windows 系统提供两种命令行环境:
使用 cmd.exe 作为默认命令行环境。启动方法:按键盘 Win + R,输入 cmd,按回车键。
2.2 文件系统导航
当前目录与提示符:
打开命令行后,显示如下内容:
其中 C:\Users\用户名 表示当前工作目录(Current Working Directory)。> 为提示符,表示等待用户输入命令。
基础命令:
路径的类型:
2.3 命令行的补充说明
Tab 键自动补全:
输入路径的前几个字符,按 Tab 键,系统会自动补全剩余部分。如有多个匹配项,连续按 Tab 键可切换选项。该功能可显著提高输入效率并减少拼写错误。
命令历史:
按键盘 ↑(上箭头)可调出之前输入的命令。按 ↓(下箭头)可向更近的历史移动。该功能避免重复输入相同命令。
命令行的注意事项:
三、MuMu 模拟器安装与配置
3.1 模拟器的概念与选择
模拟器是一种在宿主机操作系统上模拟目标硬件和软件环境的程序。Android 模拟器使 Windows 计算机能够运行 Android 操作系统和应用。
选择模拟器而非物理设备进行渗透测试的原因如下:
选用 MuMu 模拟器的原因:
3.2 下载与安装
步骤 1:下载安装程序
步骤 2:运行安装程序
步骤 3:首次启动
3.3 基础配置
开启 Root 权限:
其他必要设置:
3.4 模拟器的基本操作
模拟器使用鼠标模拟手指触控操作:
鼠标操作
对应的触控操作
鼠标左键单击
手指点击
按住鼠标左键拖动
手指滑动
右键 → 返回
Android 返回键
键盘 ESC
Android 返回键
键盘 F5
Android Home 键
模拟器窗口右侧工具栏按钮说明(从上到下):
四、ADB 安装与连接
教学目标
4.1 ADB 概述
ADB(Android Debug Bridge)是 Android SDK 中的命令行工具,用于 PC 与 Android 设备之间的通信。ADB 采用客户端-服务器架构:
4.2 安装 Platform Tools
步骤 1:下载
步骤 2:解压
步骤 3:配置环境变量
环境变量是操作系统用来查找可执行程序的路径列表。将 C:\platform-tools 加入该列表后,可在任意目录下直接运行 adb 命令。
步骤 4:验证
预期输出(版本号可能不同):
如果提示 'adb' 不是内部或外部命令,说明环境变量配置未生效。检查:是否已关闭旧命令行窗口、Path 变量中路径是否拼写正确。
4.3 连接 MuMu 模拟器
前提条件:MuMu 模拟器已启动并运行。
device 表示连接正常。其他可能的状态:
故障排除:
4.4 基本 ADB 命令
五、Reqable 安装与 HTTP 抓包
5.1 HTTP 协议基础
HTTP(HyperText Transfer Protocol,超文本传输协议)是客户端与服务器之间通信的应用层协议。其工作模式为请求-响应模式:
HTTP 请求的结构:
请求方法表示对资源的操作类型:
方法
含义
常见用途
GET
获取资源
查看页面、查询数据
POST
创建资源
提交表单、登录、上传数据
PUT
更新资源
修改全部字段
DELETE
删除资源
删除记录
请求头(Headers)传递附加信息,常见字段:
字段
说明
示例
Host
目标服务器域名
`api.example.com`
Content-Type
请求体数据格式
`application/json`
User-Agent
客户端标识
`Dalvik/2.1.0`
Authorization
认证凭据
`Bearer eyJhbG...`
HTTP 响应的结构:
状态码表示请求结果:
范围
含义
示例
200-299
成功
200 OK
300-399
重定向
301 Moved Permanently
400-499
客户端错误
403 Forbidden、404 Not Found
500-599
服务器错误
500 Internal Server Error
5.2 代理服务器原理
代理服务器(Proxy Server)位于客户端与服务器之间,转发双方的通信数据。
正常情况下,客户端直接连接服务器:
配置代理后,客户端连接代理服务器,由代理将请求转发至目标服务器:
由于所有数据流经代理,代理可以捕获、查看、修改通信内容。渗透测试利用这一特性分析和篡改网络流量。
5.3 安装 Reqable
初始设置:
5.4 配置模拟器代理
步骤 1:获取电脑 IP 地址
步骤 2:设置模拟器全局代理
说明:settings put global http_proxy 设置的是 Android 系统级别的全局 HTTP 代理。该设置影响通过标准 HTTP API 发送的网络请求。部分应用使用非标准网络库,可能绕过该设置。对于此类应用,需要使用 VPN 模式。
5.5 捕获第一个 HTTP 请求
预期结果:
Reqable 左侧的请求列表中新增一条记录:
httpbin.org 是一个用于测试 HTTP 请求的公共服务,其 /get 接口会原样返回请求信息。
六、HTTPS 抓包与证书安装
6.1 HTTPS 与 TLS 加密
HTTPS(HTTP Secure)是 HTTP 协议与 TLS(Transport Layer Security,传输层安全协议)的组合。TLS 提供三项核心安全保证:
HTTP 与 HTTPS 的直观区别:
6.2 数字证书
数字证书是用于验证网络实体身份的数字文件,由证书颁发机构(Certificate Authority, CA)签发。X.509 是数字证书的标准格式。
证书信任链:
操作系统和浏览器预置了一批受信任的根证书。当访问 HTTPS 网站时,客户端验证服务器证书是否由这些受信任的根证书或其中间证书签发。
中间人代理的证书机制:
Reqable 作为中间人代理时,对于每个 HTTPS 请求,它会动态生成一个由 Reqable 根证书签名的伪造服务器证书。如果客户端(模拟器)信任了 Reqable 的根证书,就会信任这些伪造证书——Reqable 从而能够解密 HTTPS 流量。
Android 7.0(API 24)起,系统区分"用户证书"和"系统证书":
默认情况下,应用仅信任系统证书。因此,通过常规方式安装的 Reqable 证书(用户证书)无法解密大多数应用(targetSdkVersion ≥ 24)的 HTTPS 流量。必须将证书部署到系统证书目录。
6.3 安装 Reqable 证书到系统目录
步骤 1:导出 Reqable 根证书
步骤 2:计算证书的 Android 命名哈希值
如果未安装 OpenSSL:
步骤 3:生成 Android 格式证书文件
执行后当前目录生成一个名为 <hash>.0 的文件。
步骤 4:推送证书到模拟器
6.4 验证 HTTPS 抓包
判断标准:
七、综合练习——安装测试 App 并抓包
7.1 环境确认
在开始前,逐项确认以下条件:
7.2 安装测试 App
安装完成后,模拟器桌面出现新应用的图标。如果应用未出现在桌面,可以在应用抽屉(从底部向上滑动)中查找。
常见错误:
7.3 抓包操作
对每条请求的分析模板:
关注点:
验收标准:
八、总结
8.1 知识体系
主题
核心知识点
渗透测试概念
定义、授权原则、五阶段流程
Android 系统
五层架构、安全模型(沙箱/权限/签名/SELinux)
APK 结构
ZIP 格式、核心文件(Manifest/DEX/资源/签名/Native 库)
命令行
cmd 启动、文件导航(dir/cd/mkdir/rmdir)、Tab 补全
MuMu 模拟器
安装、Root 开关、鼠标操作映射
ADB
架构(Client-Server-Daemon)、连接命令、10 个基础命令
HTTP 协议
请求/响应结构、方法类型、状态码分类、请求头
Reqable
安装、代理原理、模拟器代理配置
HTTPS 与证书
TLS 加密、证书信任链、系统证书部署
8.2 工具链总览
8.3 环境健康检查
请逐项确认并记录结果(通过/未通过):