# Lazarus Group使⽤Dacls RAT攻击Linux平台 **blog.netlab.360.com/dacls-the-dual-platform-rat** ## 背景介绍 December 17, 2019 2019年10⽉25号,360Netlab未知威胁检测系统发现⼀个可疑的ELF⽂件 (80c0efb9e129f7f9b05a783df6959812)。⼀开始,我们以为这是在我们发现的Unknown Botnet中 ⽐较平凡的⼀个,并且在那时候VirusTotal上有2款杀毒引擎能够识别。当我们关联分析它的相关样 本特征和IoC时,我们发现这个案例跟Lazarus Group有关,并决定深⼊分析它。 ⽬前,业界也从未公开过关于Lazarus Group针对Linux平台的攻击样本和案例。通过详细的分析, 我们确定这是⼀款功能完善,⾏为隐蔽并适⽤于Windows和Linux平台的RAT程序,并且其幕后攻 击者疑似Lazarus Group。 事实上,这款远程控制软件相关样本早在2019年5⽉份就已经出现,⽬前在VirusTotal上显示被26款 杀毒软件⼚商识别为泛型的恶意软件,但它还是不为⼈所知,我们也没有找到相关分析报告。所 以,我们会详细披露它的⼀些技术特征,并根据它的⽂件名和硬编码字符串特征将它命名为 Dacls。 ## Dacls 概览 Dacls是⼀款新型的远程控制软件,包括Windows和Linux版本并共⽤C2协议,我们将它们分别命名 为Win32.Dacls和Linux.Dacls。它的功能模块化,C2协议使⽤TLS和RC4双层加密,配置⽂件使⽤ AES加密并⽀持C2指令动态更新。其中Win32.Dacls的插件模块是通过远程URL动态加载,⽽ Linux版本的插件是直接编译在Bot程序⾥。我们已经确认在Linux.Dacls中包含6个插件模块:执⾏ 命令,⽂件管理,进程管理,测试⽹络访问,C2连接代理,⽹络扫描。 ### 如何关联上 Lazarus Group ⾸先,我们通过样本 80c0efb9e129f7f9b05a783df6959812 中的硬编码字符串特征 c_2910.cls 和 k_3872.cls ,在VirusTotal上找到了5个样本,我们从这些样本代码和相同的C2 指令码上可以确认它们是同⼀套RAT程序,并且分别适⽤于Windows和Linux平台。 其中⼀个Win32.Dacls样本 6de65fc57a4428ad7e262e980a7f6cc7 ,它的下载地址为 [https://thevagabondsatchel.com/wp-content/uploads/2019/03/wm64.avi ,在VirusTotal](https://thevagabondsatchel.com/wp-content/uploads/2019/03/wm64.avi) 社区⽤户@raeezabdulla留⾔中将它标记为Lazarus Group,并引⽤了⼀篇报告《CES Themed Targeting from Lazarus》。然后,我们通过这个下载地址我们关联到另⼀个NukeSped样本 b578ccf307d55d3267f98349e20ecff1 ,它的下载地址为 [http://thevagabondsatchel.com/wp-content/uploads/2019/09/public.avi 。在2019年](http://thevagabondsatchel.com/wp-content/uploads/2019/09/public.avi) 10⽉份,这个NukeSped样本 b578ccf307d55d3267f98349e20ecff1 曾被推特⽤户 @cyberwar_15标记为Lazarus Group。 另外,我们也在Google上搜到到很多Lazarus Group的分析报告和⼀些开源威胁情报数据,并指 出 [thevagabondsatchel.com 曾被Lazarus Group⽤于存放样本。](http://thevagabondsatchel.com/) 所以,我们推测Dacls RAT的幕后攻击者是Lazarus Group。 ----- ### Downloader服务器 我们在疑似被感染的下载服务器 http://www.areac-agr.com/cms/wp content/uploads/2015/12/ 上找到了⼀系列样本,其中包括Win32.Dacls和Linux.Dacls,开源程 序Socat,以及Confluence CVE-2019-3396 Payload。所以,我们推测Lazarus Group曾经利⽤ CVE-2019-3396 N-day漏洞传播Dacls Bot程序。 MD5 (check.vm) = a99b7ef095f44cf35453465c64f0c70c //Confluence CVE-2019-3396 Payload MD5 (hdata.dat) = 982bf527b9fe16205fea606d1beed7fa //Log Collector MD5 (ldata.dat) = 80c0efb9e129f7f9b05a783df6959812 //Linux Dacls Bot MD5 (mdata.dat) = 80c0efb9e129f7f9b05a783df6959812 //Linux Dacls Bot MD5 (r.vm) = a99b7ef095f44cf35453465c64f0c70c //Confluence CVE-2019-3396 Payload MD5 (rdata.dat) = bea49839390e4f1eb3cb38d0fcaf897e //Windows Dacls Bot MD5 (sdata.dat) = e883bf5fd22eb6237eb84d80bbcf2ac9 //Open-Source Socat ## 逆向分析 ### Log Collector样本分析 MD5: 982bf527b9fe16205fea606d1beed7fa ##### ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, no section header 这个样本的功能很简单,它通过运⾏参数指定⽇志搜集接⼝然后收集⽬标主机信息。它会避开扫描 ⼀些指定的根⽬录和⼆级⽬录,并把检索到的⽂件路径写⼊ /tmp/hdv.log。 ----- Avoid Scanning Root Directory /bin /boot /dev /etc /lib /lib32 /lib64 /lost+found /sbin /sys /tmp /proc /run Avoid Scanning Secondary Directory /usr/bin /usr/etc /usr/games /usr/include /usr/lib /usr/lib32 /usr/lib64 /usr/libexec /usr/sbin /usr/share /usr/src /usr/tmp /var/adm /var/cache /var/crash /var/db /var/empty /var/games /var/gopher /var/kerberos /var/lock /var/nis /var/preserve /var/run /var/yp ⽇志记录格式示例 deep name type size last date 0 / D 0 000000000000 1 bin D 0 201911290628 2 bash F 1037528 201907121226 2 bunzip2 F 31352 201907040536 2 busybox F 1984584 201903070712 2 bzcat F 31352 201907040536 2 bzcmp F 2140 201907040536 .... 最后通过执⾏系统tar命令把⽇志⽂件压缩 tar -cvzf /tmp/hdv.rm /tmp/hdv.log 并上传到指 定⽇志搜集接⼝。 ----- ### Linux.Dacls样本分析 MD5: 80c0efb9e129f7f9b05a783df6959812 ##### ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=e14724498374cb9b80a77b7bfeb1d1bd342ee139, stripped Linux.Dacls Bot主要功能包括:执⾏命令,⽂件管理,进程管理,测试⽹络访问,C2连接代理,⽹ 络扫描模块。 #### 初始化⾏为 Linux.Dacls Bot启动后以daemon⽅式后台运⾏,并通过启动参数 /pro ,Bot PID⽂ 件 /var/run/init.pid 和Bot进程名 /proc//cmdline ,来区分不同运⾏环境,我们猜测 可能是⽤于Bot程序升级。 ----- #### 配置⽂件 .memcahce Linux.Dacls Bot配置⽂件固定存放在 $HOME/.memcache ,⽂件内容固定为0x8E20+4个字节。如 果Bot启动后找不到配置⽂件,就会根据样本中硬编码的信息,使⽤AES加密⽣成默认的配置⽂ 件,当Bot和C2 通信后还会继续更新配置⽂件。 ##### 数据结构 我们把配置⽂件的数据结构信息定义为struct_global_cfg,这⾥存放了Bot运⾏参数,C2信息,和 插件信息等。 struct struct_plugin_cfg_data { int plugin_id; int plugin_type; int unk3; char name[1040]; }; struct struct_c2_content { char content[2048]; }; struct struct_global_cfg { int session_id; int unk_const1; int sus_version_20190417; int connect_retry_sleep_time; char unk_array1[88]; int c2_num; struct_c2_content c2_list[3]; char unknown_filed_186C[14340]; struct_plugin_cfg_data plug_cfg_data_list[15]; }; ##### AES 加密算法 AES,CBC Mode Key:A0 D2 89 29 27 78 75 F6 AA 78 C7 98 39 A0 05 ED IV:39 18 82 62 33 EA 18 BB 18 30 78 97 A9 E1 8A 92 ##### 解密配置⽂件 我们把配置⽂件解密后,可以看到配置⽂件中⼀些明⽂信息,例如:会话ID,版本信息,重新连接 C2时间,C2信息等,当成功连接C2后配置⽂件会根据C2指令更新,⽐如在配置⽂件中增加Bot⽀ 持的插件信息,更新C2信息等。 ----- #### C2 协议 Linux.Dacls Bot和C2通信主要分为3个阶段,并采⽤了TLS和RC4双层加密算法,保障数据通信安 全。第1阶段是建⽴TLS连接,第2阶段是双⽅协议认证过程(Malware Beaconing),第3阶段是 Bot发送RC4加密后的数据。 ##### SSL 连接 协议认证 建⽴SSL连接会发送若⼲次Beacon消息和C2互相确认身份。 ##### Cmd Direction Encrypted Description 0x20000 send no Beacon 0x20100 recv no Beacon 0x20200 send no Beacon RC4 加密和解密流程 ----- RC4 Key⽣成算法,完全由随机函数⽣成,Key⻓度范围:⼤于0且⼩于50 置换表⽣成算法,根据RC4 Key⽣成RC4加密⽤的置换表 加/解密算法,根据置换表⽣成算法完成加/解密,因为RC4是个对称加密算法,所以加/解密 算法是⼀致的 ----- RC4解密示例 在完成协议认证之后,Bot向C2发送RC4 Key⻓度(头4个字节)和 RC4 Key数据。 C2收到加密Key,向Bot发送密⽂,解密后为0x00000700指令,之后Bot就会上传主机名相关信息 给C2。 Key: a3 2f c2 10 f3 92 79 c3 0e f6 e4 e5 2e 69 29 86 0d 3a 92 f5 b7 23 fc 91 d9 46 91 55 a3 86 5a 47 36 1d 58 2a af d1 6d 3d 49 52 23 77 bc 4d fd 49 87 密⽂: fe 3c 2c d7 bf 08 e3 91 d7 00 1f d0 明⽂: 00 07 00 00 00 00 00 00 00 00 00 00 ##### C2指令码表 Linux.Dacls Bot接受的指令实际共12个字节,但实际有效⼤⼩为4个字节,并分成控制两种模式。 第⼀种模式:当第3个字节为0,控制Bot主逻辑。 以下是0x00000700指令对应的⽹络序数据包示例:模式为0x00,指令2为0x07控制Bot上传主机名 信息 ##### 指令1 指令2 模式 未知 ----- ##### 指令1 指令2 模式 未知 00 07 00 00 第⼆种模式:当第3个字节为1,控制加载插件逻辑。 以下是0x00010101指令对应的⽹络序数据包示例:模式为0x01,指令1为0x01控制加载编号为1的 插件 ##### 指令1 指令2 模式 未知 01 01 01 00 Bot收到指令后,执⾏成功返回0x20500,执⾏失败返回0x20600。 C2指令表,Bot主逻辑部分 ##### Module Cmd Encrypt Description Core 0x00000601 Yes 上传C2配置信息 Core 0x00000602 Yes 下载配置信息保存到 $HOME/.memcache Core 0x00000700 Yes 要求Bot上传主机信息 Core 0x00000900 Yes 要求Bot发送⼼跳信息 C2指令表,Bot插件部分 ##### Module Cmd Encrypt Description /bin/bash 0x00010000 Yes 执⾏C2下发的bash命令 /bin/bash 0x00010002 Yes 连接到指定的C2执⾏下发的系统命令 plugin_file 0x00010100 Yes 写⽂件 plugin_file 0x00010101 Yes 读⽂件 plugin_file 0x00010103 Yes 删除⽂件 plugin_file 0x00010104 Yes 扫描⽬录结构 plugin_file 0x00010110 Yes 从指定url下载⽂件 plugin_process 0x00010200 Yes 扫描并上传主机进程相关信息 plugin_process 0x00010201 Yes 杀死指定进程 ----- ##### Module Cmd Encrypt Description plugin_process 0x00010202 Yes 创建daemon进程 plugin_process 0x00010204 Yes 获得并上报进程PID和PPID plugin_test 0x00010300 Yes 测试是否可以访问指定IP plugin_reverse_p2p 0x00010400 Yes C2连接代理 logsend 0x00011100 Yes 测试是否可以访问Log服务器 logsend 0x00011101 Yes 上传公⽹端⼝扫描结果和命令执⾏输出 logsend 0x00011102 Yes ⽆操作 ----- C2通信流程图 ----- ----- #### 插件模块 Linux.Dacls Bot采⽤静态编译的⽅式将插件和Bot本体代码编译在⼀起,通过发送不同的指令调⽤ 不同的插件可以完成多种任务。我们分析的样本中共包含6个插件,由于插件的配置信息是⼀块连 续的结构体数组(0x00~0x0e)。我们猜测Bot可能存在更多的插件。 每个插件都会有相应的配置信息,它们会保存在Bot的配置⽂件 $HOME/.memcache 中,在插件初 始化时,加载这些配置信息。 ##### Bash 插件 Bash插件是编号为0的插件,主要⽀持两个功能:接收C2服务器的下发的系统命令并执⾏;C2通 过指令下发临时C2,Bot然后连接到临时C2并执⾏临时C2下发的系统命令。 ##### File 插件 File插件主要功能是⽂件管理,除了⽀持对⽂件的读,写,删除,查找操作,还可以从指定的下载 服务器下载⽂件。 ----- ##### Process 插件 Process插件的主要功能是进程管理,包括:杀死指定进程,创建daemon进程,获得当前进程的 PID和PPID,以及获取进程列表信息。 如果Linux进程中的PID对应的 /proc//task ⽬录存在,Bot样本会收集如下进程信息: 从 /proc//cmdline 读取命令⾏全名 从 /proc//status 中读取: ----- Name //进程名 Uid //⽤户ID Gid //⽤户组ID PPid //⽗进程ID ##### Test插件 Test插件的主要功能是通过连接C2指定的IP地址和端⼝,测试其⽹络连通性。 ##### Reverse P2P插件 Reverse P2P插件实际上是⼀种C2连接代理(Connection Proxy),它通过下发控制命令可以将指 定的C2数据完整的转发到指定IP端⼝。这在Lazarus Group中是⼀种常⻅的降低被检测⻛险的技术 ⼿段,既可以减少⽬标主机连接数⼜可以隐藏⽬标主机和真实C2的通信数据,在某些场合还可以 利⽤被感染的内⽹主机进⼀步渗透⾄隔离⽹段。 reverse_p2p插件初始化 当Bot收到指令后,先尝试连接指定的C2端⼝并发送0x21000指令,如果C2返回0x21300说明C2连 接成功。此时Bot会连接指令中指定的⽬标主机端⼝,如果连接成功会返回0x21100给C2说明转发 连接已经建⽴可以转发数据。接下来Bot会将C2发送过来的数据完整的转发给⽬标主机,同时将⽬ 标主机的返回数据完整的返回给C2,直⾄任何⼀⽅中断连接。 以下是Reverse P2P插件⼯作流程图: ----- ##### LogSend 插件 LogSend插件主要包括3个功能:测试连接Log服务器,随机扫描全⽹8291端⼝并上报给Log服务 器,执⾏耗时较⻓的系统命令并将控制台输出结果实时上报给Log服务器。 LogSend插件初始化 LogSend相关操作回调函数 ----- 测试连接Log服务器 Bot收到指令后会向Log服务器发送⼀个测试请求。如果Log服务器返回 {"result":"ok"} 说明测 试成功,此时C2就可以下发更多的LogSend指令。 使⽤C2指定的HTTP接⼝地址,内置的User-Agent,发送POST请求 POST /%s HTTP/1.0 Host: %s Content-Length: 9 Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Cache-Control: no-cache Connection: close log=check 随机扫描全⽹8291端⼝并上报给Log服务器。 当Bot收到该指令后会按照3种规则随机⽣成公⽹IP地址并尝试连接8291端⼝,如果连接成功就向 log server回传扫描结果。 IP⽣成规则: ip = ... rule1: part1 != 127 rule2: part1 == 172 and (part2 <= 15 or part2 > 31) rule3: part1 != 192 and part2 != 168 rule4: part1 != 10 随机IP⽣成算法如下 ----- 我们可以看到Bot硬编码TCP/8291端⼝,并调⽤系统connect函数进⾏端⼝扫描,只检测端⼝是否 开放,不发送Payload数据。我们知道MikroTik Router设备的Winbox协议⼯作在TCP/8291端⼝ [上,并暴露在互联⽹上,之前我们也披露了2篇⽂章关于TCP/8291端⼝威胁事件[1][2]。](https://blog.netlab.360.com/7500-mikrotik-routers-are-forwarding-owners-traffic-to-the-attackers-how-is-yours-en/) ----- 执⾏耗时较⻓的bash命令,并将控制台输出实时上报给Log服务器。 ----- 执⾏bash命令并转发输出给Log服务器 所有上报的Log数据都以HTTP POST的⽅式提交。Payload部分的格式如下: log=save&session_id=&value= ----- ### 处置建议 我们建议Confluence⽤户及时更新补丁,并根据Dacls RAT创建的进程,⽂件名以及TCP⽹络连接 特征,判断是否被感染,然后清理它的相关进程和⽂件。 我们建议读者对Dacls RAT相关IP,URL和域名进⾏监控和封锁。 相关安全和执法机构,可以邮件联系netlab[at]360.cn交流更多信息。 ### 联系我们 感兴趣的读者,可以在 **[twitter](https://twitter.com/360Netlab)** 或者在微信公众号 **360Netlab** 上联系我们。 #### IoC list 样本MD5 6de65fc57a4428ad7e262e980a7f6cc7 80c0efb9e129f7f9b05a783df6959812 982bf527b9fe16205fea606d1beed7fa 8910bdaaa6d3d40e9f60523d3a34f914 a99b7ef095f44cf35453465c64f0c70c bea49839390e4f1eb3cb38d0fcaf897e cef99063e85af8b065de0ffa9d26cb03 e883bf5fd22eb6237eb84d80bbcf2ac9 硬编码C2 IP: ----- 23.81.246.179 United States ASN19148 Leaseweb USA, Inc. 23.254.119.12 Canada ASN55286 B2 Net Solutions Inc. 23.227.196.116 United States ASN35017 Swiftway Sp. z o.o. 37.72.175.179 United States ASN29802 HIVELOCITY, Inc. 23.227.199.53 United States ASN35017 Swiftway Sp. z o.o. 107.172.197.175 United States ASN36352 ColoCrossing 172.93.201.219 United States ASN20278 Nexeon Technologies, Inc. 64.188.19.117 United States ASN8100 QuadraNet Enterprises LLC 74.121.190.121 United States ASN23033 [Wowrack.com](http://wowrack.com/) 192.210.213.178 United States ASN36352 ColoCrossing 209.90.234.34 United States ASN23033 [Wowrack.com](http://wowrack.com/) 198.180.198.6 United States ASN26658 HT URL [http://www.areac-agr.com/cms/wp-content/uploads/2015/12/check.vm](http://www.areac-agr.com/cms/wp-content/uploads/2015/12/check.vm) [http://www.areac-agr.com/cms/wp-content/uploads/2015/12/hdata.dat](http://www.areac-agr.com/cms/wp-content/uploads/2015/12/hdata.dat) [http://www.areac-agr.com/cms/wp-content/uploads/2015/12/ldata.dat](http://www.areac-agr.com/cms/wp-content/uploads/2015/12/ldata.dat) [http://www.areac-agr.com/cms/wp-content/uploads/2015/12/mdata.dat](http://www.areac-agr.com/cms/wp-content/uploads/2015/12/mdata.dat) [http://www.areac-agr.com/cms/wp-content/uploads/2015/12/r.vm](http://www.areac-agr.com/cms/wp-content/uploads/2015/12/r.vm) [http://www.areac-agr.com/cms/wp-content/uploads/2015/12/rdata.dat](http://www.areac-agr.com/cms/wp-content/uploads/2015/12/rdata.dat) [http://www.areac-agr.com/cms/wp-content/uploads/2015/12/sdata.dat](http://www.areac-agr.com/cms/wp-content/uploads/2015/12/sdata.dat) -----