当前,Linux恶意软件正在逐渐流行起来了。近几年,已经有好几起重大安全事件中所涉及的Linux后门都是从Windows系统移植过来的。在研究Odinaff报告中的Windows KLRD键盘记录软件的过程中,我们发现了几个新的键盘记录软件。在本文中,我们讨论的焦点是MiKey,这是一个鲜为人知的、之前未曾检测到的键盘记录软件。
在撰写本文时,Virustotal上的引擎仍然检测不出该恶意软件。
软件分析
这款恶意软件是一个64位的Linux可执行文件:
9c07ed03f5bf56495e1d365552f5c9e74bb586ec45dffced2a8368490da4c829: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=550c58e6a9bc88b8724fd8ab7fd79a6c58c12d28, not stripped
同时,它还依赖于以下程序库:
linux-vdso.so.1 (0x00007ffd25123000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f7f56420000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7f5621c000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7f55e7e000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f7f55c56000)
/lib64/ld-linux-x86-64.so.2 (0x00005597839c6000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f7f55a52000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f7f5584a000)
在分析这个二进制代码的符号表之后,我们找到了一些非常让人感兴趣的函数名。(为了方便阅读,这里就不给出完整的输出了):
63: 00000000004014b2 79 FUNC GLOBAL DEFAULT 14 createProccess
64: 0000000000400ed6 128 FUNC GLOBAL DEFAULT 14 initPlugins
67: 0000000000400f56 105 FUNC GLOBAL DEFAULT 14 moduleFeed
68: 000000000040102d 1157 FUNC GLOBAL DEFAULT 14 keylogger
75: 0000000000400dc6 159 FUNC GLOBAL DEFAULT 14 handleArgs
83: 0000000000400e65 113 FUNC GLOBAL DEFAULT 14 moduleHandleArgs
85: 00000000004015fc 209 FUNC GLOBAL DEFAULT 14 addData
87: 0000000000400cd0 42 FUNC GLOBAL DEFAULT 14 _start
88: 0000000000400fbf 110 FUNC GLOBAL DEFAULT 14 addParentheses
92: 0000000000401501 126 FUNC GLOBAL DEFAULT 14 main
103: 0000000000400b00 0 FUNC GLOBAL DEFAULT 11 _init
编译器留下的注释表明,它是在Ubuntu 16.04.2系统上编译的:
9c07ed03f5bf56495e1d365552f5c9e74bb586ec45dffced2a8368490da4c829: file format elf64-x86-64
下面是.comment节中的内容:
0000 4743433a 20285562 756e7475 20352e34 GCC: (Ubuntu 5.4
0010 2e302d36 7562756e 7475317e 31362e30 .0-6ubuntu1~16.0
0020 342e3229 20352e34 2e302032 30313630 4.2) 5.4.0 20160
0030 36303900 609.
该二进制文件中的构建路径给出了进一步的证据︰
/home/ubuntu/MiKey-64-ubuntu
strace工具可以迅速确定函数的高级工作流程并识别潜在的重点对象。其中,一个失败的文件打开,即“mikey-text.so”引起了我们的注意,所以我们不妨从这里开始下手。
open("./tls/x86_64/mikey-text.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("./tls/mikey-text.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("./x86_64/mikey-text.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("./mikey-text.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
该恶意软件没有在这些目录中显式搜索mikey-text.so。这是dlopen的副作用,根据其手册页的介绍:
“在程序启动时,如果环境变量LD_LIBRARY_PATH中包含由冒号分隔的目录列表的话,则搜索这些目录。
在搜索片刻后,我们又找到了一个包含字符串“mikey-text.c”的二进制文件(SHA-256 bc6d25dff00dfb68b19b362c409d2cf497e5dd97d9d6e5ce2bde2ba706f2bdb3)。由此,我们可以判断mickey-text.so是这个二进制文件的编译版本。
根据这个判断,我们将第二个二进制文件重命名为mikey-text.so,并将其放在通过strace找到的加载路径中。这样一来,该恶意软件竟然能够成功执行了。其中,输出文件(out.log)用来保存键击动作及相应的时间戳。
通过静态分析,我们能够知道,当键盘记录软件启动时,它首先会加载插件,然后处理相应的参数,最后生成相应的进程。