容器化的 Android 是一个基于容器的框架,允许在 Docker 内执行 Android 模拟器并通过浏览器进行控制。该项目旨在为将移动安全组件集成到网络靶场提供起点,但它可以用于任何目的。不过,对于开发和测试目的,推荐使用 docker-android 项目。
正如上述简要描述所述,该项目的创建是为了给网络靶场中移动安全组件的引入提供一个起点。因此,已经开发的功能以及未来将添加的功能将帮助用户更轻松地设置真实的模拟场景(例如用于安全培训)。这份 README 相当长,也许您只想跳到*“如何运行”*部分。
目前可用的特性如下:
| 初始设置 | 实例管理器设置 | 手动设置 |
|---|---|---|
| initial-setup | instance-manager-setup | manual-setup |
| 工具箱功能 | 实例切换 |
|---|---|
| toolbox | instance-switch |
该项目由三个主要部分组成:
核心组件是执行在 Docker 容器内运行 Android 组件(模拟或真实)所需的所有进程的组件,同时还向外部暴露一些功能。它无疑是最复杂的部分,因为它必须管理不同的进程以提供一组功能。上图清晰区分了长生命周期进程、启动进程和实用脚本。此外,该图显示有 6 个长生命周期进程,这是一个小不准确之处,旨在提供核心组件的总体概览;实际上,核心组件有两种不同的风格:
主要架构差异在于长生命周期进程:用于模拟器的核心运行长生命周期的 emulator 进程,而用于真实设备的核心运行长生命周期的 scrcpy 进程以显示和控制物理设备。其他部分非常相似,只是根据核心组件的类型遵循不同行为的一些逻辑。
UI 组件提供了一种简单的方式来使用后端暴露的所有功能,并且还增加了显示和控制设备的能力。用户需要手动输入核心组件的地址和对应的端口(后端暴露的端口和 websockify 暴露的端口);通过这种手动设置,可以更改默认端口(后端默认为 4242,websockify 默认为 6080)。
实例管理器组件的工作是通过单个 REST API 提供所有运行中核心的信息(即地址和端口)。这是通过编写一个简单的 JSON 配置文件来完成的,该文件包含所有存在于 docker-compose 中的核心信息,以避免手动逐个添加的痛苦工作。JSON 配置文件的结构如下:
{
"instances": [
{
"name": [标识设备的通用字符串],
"address": [组件的地址],
"core_port": [后端的端口],
"vnc_port": [VNC 的端口]
}
]
}
secsi/dockerized-android-core-bare 不会下载任何系统镜像,您可以将主机上包含所有 SDK 文件夹的目录挂载到容器中。
要查看如何运行该平台的完整示例,您可以查看 examples 目录中提供的 docker-compose 文件。该目录包含三种不同的配置:
一旦您理解了它的工作原理,您可以根据任何需求修改它。
您的机器上必须安装 Docker 和 Docker Compose。
该平台根据主机操作系统的不同而表现不同,下表总结了当前的兼容性:
| Linux | Windows | OS X | |
|---|---|---|---|
| 用于模拟器的核心 | 完全兼容 | 尚不支持 | 不支持 |
| 用于真实设备的核心 | 完全兼容 | 完全兼容 | 变通方法 |
对于 Windows 和 OS X,您需要使用支持嵌套虚拟化的 Linux 虚拟机。
要检查您的 Linux 机器是否支持嵌套虚拟化,您可以运行以下命令:
sudo apt install cpu-checker
kvm-ok
要在 OS X 上使用用于真实设备的核心,您可以:
对于无线连接,Google 提供了一个简单的 教程。要从容器内连接到主机的 adb,您需要手动进入容器并运行:
adb -H host.docker.internal devices
开始使用该框架的命令如下:
cp ./examples/docker-compose-core.yml docker-compose.yml
docker-compose up
更简单地,您也可以使用命令:
docker-compose -f ./examples/docker-compose-core.yml up
最后,在浏览器中导航到地址 http://127.0.0.1:8080 并设置当前配置:
如果没有使用实例管理器,请点击手动设置并输入以下信息:
如果使用了实例管理器,请点击“实例管理器”,只需输入其 IP 地址和端口号(例如 193.21.1.100:7373)。
就这样!您可以在浏览器中使用该框架了。
您也可以通过 utils 文件夹中的脚本来自行构建镜像。
您可以通过环境变量配置一些功能以自定义设置,下表列出了所有环境变量:
REAL_DEVICE_SERIAL 变量在连接多个物理设备时至关重要,因为如果缺少该变量,一切将无法正常工作。 最后,每个组件暴露的端口列表如下:
容器化的 Android 是开源且免费的软件,根据 MIT 许可协议 发布。
如果您觉得此代码在您的研究中有用,请引用我们的论文:
@inproceedings{Capone2022,
doi = {10.1109/icecet55527.2022.9872834},
url = {https://doi.org/10.1109/icecet55527.2022.9872834},
year = {2022},
month = jul,
publisher = {{IEEE}},
author = {Daniele Capone and Francesco Caturano and Angelo Delicato and Gaetano Perrone and Simon Pietro Romano},
title = {Dockerized Android: a container-based platform to build mobile Android scenarios for Cyber Ranges},
booktitle = {2022 International Conference on Electrical, Computer and Energy Technologies ({ICECET})}
}
该项目代表我们在那不勒斯腓特烈二世大学计算机工程专业的硕士论文。 特别感谢 Simon Pietro Romano 教授和工程师 Francesco Caturano,他们是我们这项工作的灵感来源。
| Android 版本 | API | 镜像 |
|---|
| 5.0.1 | 21 | secsi/dockerized-android-core-emulator-5.0.1 |
| 5.1.1 | 22 | secsi/dockerized-android-core-emulator-5.1.1 |
| 6.0 | 23 | secsi/dockerized-android-core-emulator-6.0 |
| 7.0 | 24 | secsi/dockerized-android-core-emulator-7.0 |
| 7.1.1 | 25 | secsi/dockerized-android-core-emulator-7.1.1 |
| 8.0 | 26 | secsi/dockerized-android-core-emulator-8.0 |
| 8.1 | 27 | secsi/dockerized-android-core-emulator-8.1 |
| 9.0 | 28 | secsi/dockerized-android-core-emulator-9.0 |
| 10.0 | 29 | secsi/dockerized-android-core-emulator-10.0 |
| 11.0 | 30 | secsi/dockerized-android-core-emulator-11.0 |
| - | - | secsi/dockerized-android-core-bare |
| - | - | secsi/docker-android-core-real-device |
| 组件 | ENV 变量名 | 默认值 | 描述 |
|---|
| Core | TARGET_PORT | 6080 | Websockify 端口 |
| Core | CUSTOM_APP_DEFAULT_PORT | 4242 | Node.js 后端端口 |
| Core | DEVICEINFO | 未设置,但行为等同于 true | 启用/禁用设备信息功能 |
| Core | TERMINAL | 未设置,但行为等同于 true | 启用/禁用终端功能 |
| Core | APK | 未设置,但行为等同于 true | 启用/禁用安装 APK 功能 |
| Core | FORWARD | 未设置,但行为等同于 true | 启用/禁用端口转发功能 |
| Core | SMS | 未设置,但行为等同于 true | 启用/禁用短信模拟功能 |
| Core | REBOOT | 未设置,但行为等同于 true | 启用/禁用重启功能 |
| Core | INSTALL_ON_STARTUP | false | 启用/禁用在启动时安装所有位于 /root/dockerized-android/apk 文件夹中的 apk 的功能 |
| Core | ENABLE_UNKNOWN_SOURCES | false | 启用从未知来源安装 |
| Core | REAL_DEVICE_SERIAL | 未设置 | 如果连接了多个物理设备,此值必须设置为要控制的设备的序列号,否则所有其他功能将无法正常工作 |
| Instance Manager | DEFAULT_PORT | 7373 | REST API 的端口 |
| 组件 | 端口号 | 描述 |
|---|
| Core | 5555 | ADB 端口 |
| Core | 4242 | Node.js 后端 |
| Core | 6080 | Websockify(用于 noVNC) |
| UI | 80 | 前端 |
| Instance Manager | 7373 | REST API |