木马与 C2 进行通信时使用 HTTPS 协议,以下的讨论均考虑 HTTP Data 部分的设计。
设有一个离散群:$G={0,1,2,\dots,p-1}$,其中,$p$ 是一个素数。如果
首先 C2 与木马确定一个共同的
这样一来,C2 将拥有
首先,认证交换所使用的这个
木马在靶机上部署完毕后,向 C2 发送一个明文包,包的内容是 16 个字节,也就是一个 128 位的整数,这个整数就是
密钥交换成功后,立刻向 C2 发送一个正常的通信包,[0x01](# 0x01 通信时:木马 → C2) 格式中的这种通信包,里面的 auth
字段填写木马的 config 中所具有的认证字符串,同时在 mtdt
中填写宿主机的各种信息。C2 接收到这个包后,如果认证字符串通过,则 C2 向木马发送一个新的、随机生成的认证字符串,木马接收到之后,将 config 中的认证字符串修改为这个新的认证字符串,并在后续通信中一直使用它。
当然,从这一步开始,每一步通信都使用第一步中所确定下来的密钥进行 AES 加密。
HTTPS 的 Data 内容为:Base64(AES(明文))
明文内容如下:
{
'mtdt': {
'h_name': '计算机名',
'wver': 'windows 版本',
'arch': '架构(x86/x64)',
'bid': 'windows 构建号',
'p_name': '进程名',
'uid': '计算机用户名',
'pid': '进程ID',
},
'message': '木马发送来的信息',
'file': {
'name': '木马发送来的文件名',
'content': '木马发送的文件内容, 使用Base64进行转码'
}
}
{
"message":"木马发来的信息"
}
{
"file":{
"name": "木马发来的文件名",
"content": "木马发送的文件内容, Base64"
}
}
- 当 C2 接收到的 Json 文本含有
mtdt
时,立即更新 C2 上对木马宿主机信息的记录 message
:C2 立刻将 message 中的字符串显示在控制台上file
:C2 立刻将文件保存到 C2 所在的文件夹
如果认证字符串不匹配,则不执行任何操作。
木马需要定期向 C2 发送只含有
cds
的包来确定存活
HTTPS 的 Data 内容为:Base64(AES(明文))
明文内容如下:
[uint16: 命令号][字符串: 参数]
为了实现我们设计的密钥交换算法,需要手动实现 128 位整数的模
设有
首先,我们发现:
$$
I&p=I\pmod{2^{127}}
$$
其中, & 是按位与符号。这是因为,对
我们借助
$$
I&p=I\pmod {2^{127}}=I-(I>>127)2^{127}
$$
那么:
$$
I\pmod{2^{127}}+(I>>127)=I-(I>>127)(2^{127}-1)
$$
这样实际上也就相当于减了足够多次的