RotaJakiro 双头龙,一个至少潜伏了3年的后门木马( 三 )

/proc/locks可以将进程以及文件锁对应起来,此时再执行对应的RotaJakiro的样本,可以看到并不会有对应的新进程创建 。

RotaJakiro 双头龙,一个至少潜伏了3年的后门木马

文章插图
网络通信RotaJakiro通过以下代码片段和C2建立通信,等待执行后续指令:
RotaJakiro 双头龙,一个至少潜伏了3年的后门木马

文章插图
这个过程可以分成2个阶段
  • Stage 1,初始化阶段:解密出C2列表,和C2建立连接,发送上线信息,接回并解密C2返回的信息 。
  • Stage 2,业务阶段:验证C2的返回信息,若通过验证,执行C2后续下发的指令 。
Stage 1:初始化通过前文所述的解密算法解密出C2列表,目前样本中内置了以下4个C2:
news.thaprior.netblog.eduelects.comcdn.mirror-codes.netstatus.sublineover.netRotaJakiro首先会尝试和它们建立连接,然后通过以下代码片段构造上线信息,
RotaJakiro 双头龙,一个至少潜伏了3年的后门木马

文章插图
接着将上线信息加密并发送给C2
RotaJakiro 双头龙,一个至少潜伏了3年的后门木马

文章插图
最后接收C2的回包,解密并校验其合法性,若通过校验,进入Stage 2 。
RotaJakiro 双头龙,一个至少潜伏了3年的后门木马

文章插图
Stage 2:具体业务通过以下代码片段接收并执行C2下发的指令:
RotaJakiro 双头龙,一个至少潜伏了3年的后门木马

文章插图
目前RotaJakiro一共支持12条指令,指令码与功能的对应关系如下表所示:
CMDIDFUNCTION 0x138E3E6Exit0x208307ATest0x5CCA727Heartbeat0x17B1CC4Set C2 timeout time0x25360EAStreal Senstive Info0x18320e0Upload Device Info0x2E25992Deliver File/Plugin0x2CD9070Query File/Plugin Status0x12B3629Delete File/Plugin Or Dir0x1B25503Run Plugin_0x39C93E0x1532E65Run Plugin_0x75A7A20x25D5082Run Plugin_0x536D01 其中Run Plugin功能复用相同的代码,通过以下逻辑实现函数调用:
RotaJakiro 双头龙,一个至少潜伏了3年的后门木马

文章插图
我们目前被没有捕获到这类payload,因此用Plugin_“参数”的形式来表示不同的任务 。
RotaJakiro的网络通信包如下图所示,由head,key,payload三部分组成,其中header是必须的,长度为82字节,而body&payload部分是可选的 。head&key采用的XOR&Rotate加密,payload采用AES&ZLIB加密压缩 。
RotaJakiro 双头龙,一个至少潜伏了3年的后门木马

文章插图
下面我们将通过BOT与C2的一轮交互,来说明网络流量head&key&payload的组成以及解密过程 。
C2 -> BOT
RotaJakiro 双头龙,一个至少潜伏了3年的后门木马

文章插图
读取前0x52字节,就是head的内容 。head如何解密呢?方法很简单,逐字节左移3位,然后和0x1b异或即可,解密后得下以内容:
0000000016 11 10 b9 03 b1 0c fb 04 20 00 00 00 08 00 e0|...¹.±.û. .....à|0000001020 83 01 c2 20 64 20 01 e2 00 00 00 00 c2 0c 00| .. d .â....Â..|0000002000 00 32 42 36 39 33 33 34 46 38 34 31 44 30 44|..2B69334F841D0D|0000003039 46 41 30 36 35 38 45 43 33 45 32 39 46 41 44|9FA0658EC3E29FAD|0000004034 39 c8 53 e6 9c 48 c4 8b 77 24 2e 02 1c 96 d9|49ÈSæ.HÄ.w$....Ù|0000005081 28------------filed parse------------------offset 0x09, 4 bytes--->payload lengthoffset 0x0d, 2 bytes--->body lengthoffset ox0f, 4 bytes--->cmdid通过字段解析,可知key的长度为0x8字节,payload的长度为0x20字节,要执行的指令码为0x18320e0,即上报设备信息 。
从偏移0x52读取8字节就得到了keyea 9a 1a 18 18 44 26 a0,使用和head一样的解密方法,得到4c cf cb db db 39 2a 1e,它是作为AES的密钥来解密payload 。
从偏移0x5a读取32字节,就得到了下面的payload:
54 c1 c3 69 00 18 31 e4 a2 5b 10 7f 67 ab d1 4b b2 7b 3d 3f b3 bc 66 6a 26 f6 f6 b3 f7 2e 66 6d使用解密后的key做为AES-256的密钥,以CBC模式解密以上数据得下以下内容:
3b c7 f8 9b 73 2b d1 04 78 9c e3 60 60 60 d8 df d9 c1 71 56 f7 6f 00 00 13 80 04 28第8字节起即为ZLIB压缩数据,解压得到如下内容:
08 00 00 00 bf 89 88 08 cd 2d fd 50------------filed parse------------------offset 0, 4 bytes--->length解压后的payload有什么用呢?它是做为新的AES密钥,用来解密部分敏感资源信息 。
例如Bot在收集设备信息时,有一项是当前操作系统发行版本的信息,它是通过


推荐阅读