剑客
关注科技互联网

Linux平台“盖茨木马”分析

最近对Linux.BackDoor.Gates.6的一个病毒样本进行了分析,通过调查发现Linux盖茨木马是一类有着丰富历史,隐藏手法巧妙,网络攻击行为显著的DDoS木马。这篇文章主要介绍了Linux盖茨木马的分析过程,同时会讲解在Linux环境下恶意软件分析的常用技巧和安全工具的使用方法。

盖茨木马整体情况

此类Linux木马主要恶意特点是具备了后门程序,DDoS攻击的能力,并且会替换常用的系统文件进行伪装。木马得名于其在变量函数的命名中,大量使用Gates这个单词。从网上公开资料可以看出,盖茨木马主要针对中国地区的服务器进行DDoS攻击,有95%的攻击目标都在中国,排名第二的是美国。接下来会对盖茨病毒的一个分支样本,进行更为细致的静态分析和动态分析。

静态分析

3.1.ELF文件信息

在静态分析中,首先会对文件类型进行判断,在Linux环境下,file工具[1]能够对ELF类型进行初步的判断。例如下表中,通过文件信息,能够得出该样本是32位ELF可执行程序,运行于IntelCPU上,静态链接。更重要的一个信息是,该样本没有除去符号表,这就为后续的逆向分析提供了丰富的调试信息。

MD5 6dfc7ea279b50b1f962523d517cd76fb
入口点 8048120
文件信息 ELF32-bitLSBexecutable,Intel80386,version1(SYSV),staticallylinked,forGNU/Linux2.2.5,notstripped

Tips:file命令可以识别文件类型。

3.2.导出符号分析

使用strings工具[2]可以从ELF文件中搜索ASCII字符串,可以发现一些IP信息,加载内核命令,恶意攻击函数名。

Tips:strings命令可以从二进制文件中提取字符串。

IP信息如下:

"abaec 61.132.163.68",
  "abafa 202.102.192.68",
  "abb09 202.102.213.68",
  "abb18 202.102.200.101",
  "abb28 58.242.2.2",
  "abb33 202.38.64.1",
  "abb3f 211.91.88.129",
  "abb4d 211.138.180.2",
  "abb5b 218.104.78.2",
  "abb68 202.102.199.68",
  "abb77 202.175.3.3",
  "abb83 202.175.3.8",
... ...

加载内核模块命令如下:

"aa3f2insmod/usr/lib/xpacket.ko"

函数名中含有恶意网络攻击的名称:

{
    "str": "11CAttackBase",
    "offset": "a98fc"
  },
  {
    "str": "13CPacketAttack",
    "offset": "a990a"
  },
  {
    "str": "10CAttackUdp",
    "offset": "a9928"
  },
  {
    "str": "10CAttackSyn",
    "offset": "a9944"
  },
  {
    "str": "11CAttackIcmp",
    "offset": "a9960"
  },
  {
    "str": "10CAttackDns",
    "offset": "a997c"
  },

这些IP信息和函数中的攻击名称很大程度会帮助杀毒软件识别已知的病毒。

后续的静态分析包括静态反汇编,查找导入导出表等,因为逆向的过程是一个动静结合的过程,反汇编部分计划通过后续的动态分析来展现。

动态分析

因为样本没有去掉符号信息,为反汇编和反编译提供了很好的支持。该样本从main()开始,共有4个主要的执行分支:

Linux平台“盖茨木马”分析

样本根据CSysTool::CheckGatesType()返回的结果分别会调用这4个函数。本文会首先分析CheckGatesType()的逻辑,然后主要对默认情况进行分析。

4.1.CheckGatesType()分析

在调用该函数之前,样本会将变量g_strMonitorFile赋值为”/usr/bin/pythno” 。

首先,调用CUtility::GetModuleFullPath()获得样本的全路径名称。通过readlink(“/proc/{getpid()}/exe”) 得到。这个动作会被strace[3]捕获。

304520:10:41.345483readlink("/proc/3045/exe","/root/workspace/websevrer",1024)=25

Tips:strace命令可以捕获程序使用的系统调用(包括参数、返回值和执行时间等)以及接收到的signal。

其次,调用CSysTool::GetBackDoorFile()拼接出backdoor文件全路径”/usr/bin/bsd-port/knerl”。

最后,CheckGatesType()的逻辑用表格表示为:

返回值 条件strcmp
0 样本路径==”/usr/bin/pythno”
2 样本路径==”/usr/bin/bsd-port/knerl”
3 样本路径==常用的系统工具
1 默认情况

这里可以看出,当样本替换系统命令之后,执行的行为和默认情况是不同的。这里说明样本具有伪装成系统工具的恶意能力。

Linux平台“盖茨木马”分析

从图中可以看到,样本对于常用的系统工具都可以进行替换并伪装,其中包括了进程查询工具ps和网络查询工具 netstat.

4.2.MainBeikong()分析

对于样本处于非特定位置的默认情况,CheckGatesType()会返回1,然后样本会调用MainBeikong()。

首先,MainBeikong()会调用daemon()去创建一个后台进程。父进程会调用exit(0)退出,子进程会调用setsid(),脱离session,然后关闭stdin,stdout,stderr文件fd。此时子进程的父进程会变成1号进程。

daemon()调用成功后,样本会调用CSysTool::SelfInit()进行自检,这个过程还包含解密过程CRSA::Decrypt().密文是自检时传入的字符串。解密后的原文是一个域名:

("bei[.]game918[.]me:21351:1:1::1:698412:697896:697380")

后续将解密内容分别赋值给一些控制变量。

Linux平台“盖茨木马”分析

控制变量列表:

g_strConnTgts bei[.]game918[.]me
g_iGatsPort 21351
g_iGatsIsFx 1
g_iIsService 1
g_strForceNote “”
g_bDoBackdoor True
g_strCryptStart 698412
g_strDStart 697896
g_strNStart 697380

在函数MainBeikong()中,会调用两次CSysTool::KillPid,该函数会判断pid文件中存放的pid和当前运行的pid是否一致,如果不一致就kill掉当前的进程。文件名分别为:idus.log,apsh.conf.

接着会调用CFileOp::RemoveFile(“apsh.conf”)将文件删除掉。

随后会调用CSysTool::KillGatesIfExist(),同样是进行进程检测,文件名是vga.conf,不同点是这次会将当前pid写入文件。

从控制变量命名规则和函数的命名中,可以看出大量使用Gates这个单词,这也正是盖茨木马得名的原因所在。

4.3.自启动设置

CUtility::SetAutoStart()会进行自启动设置。操作/etc/init.d/VsystemsshMdt文件。文件内容:

root@remnux:/etc/init.d#catVsystemsshMdt#!/bin/bash/root/websevrer

然后运行system(),继续进行自启动设置。

ln-s/etc/init.d/VsystemsshMdt/etc/rc1.d/S97VsystemsshMdt
ln-s/etc/init.d/VsystemsshMdt/etc/rc2.d/S97VsystemsshMdt
ln-s/etc/init.d/VsystemsshMdt/etc/rc3.d/S97VsystemsshMdt
ln-s/etc/init.d/VsystemsshMdt/etc/rc4.d/S97VsystemsshMdt
ln-s/etc/init.d/VsystemsshMdt/etc/rc5.d/S97VsystemsshMdt

然后执行释放文件函数CSysTool::ReleaseGates()。内部使用system()进行实现。

mkdir-p/usr/bin/bsd-port
cp-f/root/workspace/websevrer/usr/bin/bsd-port/knerl
/usr/bin/bsd-port/knerl
cp-f/root/workspace/websevrer/usr/bin/pythno
/usr/bin/pythno

进程的这些行为都会被Linux平台中系统监控程序sysdig[4]所捕获。

Linux平台“盖茨木马”分析

Tips:sysdig是由sysdigcloud开发的一个开源工具,集合了strace、tcpdumphtop、iftop、lsof等大量有用的功能为一体。

4.4.MainProcess()分析

首先会读取/etc/resolv.conf,结合Google的公开DNS服务器,8.8.8.8更新dns服务器信息。然后通过CStatBase::Initialize()读取/proc文件系统,了解本机的信息。

Linux平台“盖茨木马”分析

相应的在sysdig中会监测到文件打开和读取等事件。

Linux平台“盖茨木马”分析

然后,样本会使用insmod加载一个内核模块/usr/lib/xpacket.ko,但是因为分析机内没有该模块,会报错。

[
436,
"insmod/usr/lib/xpacket.ko(PID=2170,TID=2170)",
"write:path=/dev/null,size=84",
"insmod:ERROR:couldnotloadmodule/usr/lib/xpacket.ko:Nosuchfileordirect"
],

接着会读取文件/usr/lib/libamplify.so,同样的原因没有能够找到该文件。

4.5.网络行为分析

首先样本向DNS服务器,发送了查询bei[.]game918[.]me(112.224.48.28)的请求。获得IP地址后,尝试对端口21351进行TCP连接。

通过tcpdump[5]和wireshark工具,发现了第二个控制域名360[.]baidu[.]com[.]9kpk[.]com(8.5.1.43)。样本会连接45000端口。

可惜的是,目前这两个IP地址已经失效,所以无法进行后续协议的分析。

Linux平台“盖茨木马”分析

Tips:tcpdump命令可以拦截和展示系统中收发的网络数据包。

总结

Linux.BackDoor.Gates.6样本使用了加密C&Cserver信息,运行时解密的策略,防止控制域名暴露,同时具备自启动,替换系统常用工具,进行DDoS攻击等恶意行为。

本文针对盖茨木马样本进行了细致的分析,同时介绍了多种在Linux环境下的安全工具。

参考资料

1. https://linux.die.net/man/1/file

2. https://linux.die.net/man/1/strings

3. https://linux.die.net/man/1/strace

4. http://man7.org/linux/man-pages/man8/sysdig.8.html

5. https://linux.die.net/man/8/tcpdump

*本文作者:腾讯电脑管家(企业账号),转载请注明来自FreeBuf.COM

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址