导语:2020年7月23日,佳明公司(台湾称台湾国际航电,香港称Garmin,于1990年成立,是创办于1989年的Garmin Ltd.最大的子公司,总部座落美国堪萨斯州,Garmin的产品线包括GPS导航和可穿戴技术,适用于汽车,船舶,航空,船舶,健身和户外市场。)发布了一条公开声明,声称公司服务受到了影响,并告知用户服务会尽快恢复正常。后续由知情人士披露,已确认是由WastedLocker勒索软件
样本简介
2020年7月23日,佳明公司(台湾称台湾国际航电,香港称Garmin,于1990年成立,是创办于1989年的Garmin Ltd.最大的子公司,总部座落美国堪萨斯州,Garmin的产品线包括GPS导航和可穿戴技术,适用于汽车,船舶,航空,船舶,健身和户外市场。)发布了一条公开声明,声称公司服务受到了影响,并告知用户服务会尽快恢复正常。后续由知情人士披露,已确认是由WastedLocker勒索软件攻击引起的,该攻击导致Garmin台湾工厂关闭了两天的生产线(7月24日和25日)。
当时的相关服务状态已处于停止状态,如下。
随后于2020年7月27日发布了相关声明,证明确实存在了勒索软件攻击,内容如下:
Garmin Ltd.(纳斯达克股票代码:GRMN)今天宣布,它是网络攻击的受害者,该攻击在2020年7月23日对我们的某些系统进行了加密。结果,我们的许多在线服务都被中断,包括网站功能,客户支持,客户面对应用程序和公司沟通。我们立即开始评估攻击的性质并开始补救。我们没有任何迹象表明任何客户数据(包括来自Garmin Pay™的付款信息)被访问,丢失或被盗。此外,除访问在线服务的功能外,Garmin产品的功能未受影响。
后续据公开的信息发现,已经经过一些尝试获取了解密工具,于几天后逐步恢复了其服务,如下。
已知加密后缀为.garminwasted,而勒索信息后缀为.garminwasted_info。依据这些公开的信息,深信服安全团队捕获了针对特定目标的勒索软件样本。
通过公开情报获取到的规避杀软检测的情况来看,该样本首次被检测后直到近期检测率也一直属于上升阶段。
从后缀.garminwasted与勒索信garminwasted_info的第一行可以看出此次攻击目标针对的是佳明公司。最终文件被加密效果,如下。
针对特定目标的勒索信(本次攻击目标为佳明公司),如下。
发展历程
WastedLocker勒索软件于2020年5月被首次发现,此后一直持续发现该勒索软件的各类变种,其版本变更往往与Evil Corp恶意组织的其他恶意软件版本变更同步进行。在此前,Evil Corp黑客组织被认为与Dridex恶意软件和BitPaymer勒索软件相关,而BitPaymer勒索软件在2017年上半年非常流行。
Evil Corp黑客组织在部署勒索软件时针对的基础架构具有选择性,通常,他们会攻击文件服务器,数据库服务,虚拟机和云环境。往往会对企业的基础业务造成严重影响,因为黑客会禁用或者破坏掉用于备份的相关服务设备,增加了受害者恢复相关服务的时间,或者更严重的情况下,由于相关备份不可用,数据都无法恢复。此次的传播方式也类似,造成了企业业务服务的中断。很奇怪的事情是该组织似乎并未像DoppelPaymer以及许多其他具有针对性的勒索软件家族那样,进行过大规模的信息窃取或威胁发布有关受害者的信息(之前分析过的Netwalker与Avaddon勒索软件家族就早早的已经存在泄露窃取数据来二次勒索的运营方式),猜测不泄露受害者信息的可能原因是为了不让执法人员和公众引起不必要的关注,属于行事低调。
通过本次分析的勒索软件进行情报关联可以发现,此前WastedLocker勒索软件家族就已较为活跃。
执行流程
勒索核心部分执行流程图,如下。
详细分析
获取的母体文件编译时间为7月23日2点43分,后续发现也是同一天被签名。
携带无效的数字签名,签名时间为2020年7月23日。
执行时修改aaaerfacE\{b196b287-bab4-101a-b69c-00aa00341d07},与Avaddon勒索家族流程类似。
通过上述的值查询对应的注册表键值,如下。
如果存在对应的键值,就会不断循环,无法退出,作为反分析的方式。
不存在该键值则直接跳过循环,如下。
总共会从图标资源里加载0xF800大小的数据,如下。
解密如下,同样与Avaddon勒索家族样本有类似的字符串解密流程与隐藏手法。
push-retn技术跳转至上述解密出的shellcode执行,如下。
动态获取所需的API函数地址,如下。
存在以下获取的API函数:GetProcAddress、VirtualAlloc、VirtualFree、UnmapViewOfFile、VirtualProtect、LoadLibraryExA、GetModuleHandleA、GetModuleHandleW、CreateFileA、SetFilePointer、WriteFile、CloseHandle、GetTempPathA、lstrlenA、lstrcatA、FreeLibrary,继续获取相应API函数地址。
分配一段0xE800大小的内存空间,加密的数据复制到新内存空间,对其解密得到PE文件。
提取内存解密出的PE文件,如下。
以上大体流程为先从图标资源里提取数据,之后对其解密,得到一段shellcode代码,采用push-retn方式执行,之后再次内存解密获得PE文件。执行来到完整的PE文件区域,会对母体内存区域进行设置访问权限。
模拟Windows的Loader加载功能完毕后,加载ntdll.dll模块。
获取ZwUnmapViewOfSection函数地址,如下。
模拟导入表导入加载,如下。
设置.text段执行属性,如下。
傀儡进程替换完毕后,跳转入口点执行,这里与Avaddon勒索软件家族是一致的流程,如下。
匹配到.bss区段,后续解密出字符串资源。
解密字符串,如下。
之后搜索注册表"SYSTEM\CurrentControlSet\Control"键值,存入一个链表数据结构中,用于后续的使用。
枚举注册表项acpi、agp、appid、arbiters、backuprestore、class、cmf、codeviceinstallers、com name arbiter、computername、contentindex、crashcontrol、criticaldevicedatabase、cryptography、deviceclasses、deviceoverrides、diagnostics、els、errata、filesystem、filesystemutilities、fontassoc......等。
获取命令行参数,后续会有不同的功能流程执行。
命令行参数作用如下
*-u 会跳过UAC绕过,直接创建一个DAS备用数据流,以-r的模式启动,创建ADS备用数据流失败就执行加密网络驱动器文件的操作;
*-r 把自身复制到system目录;
*使用vssadmin.exe Delete Shadows /All /Quiet的cmd命令删除卷影副本,防止数据被恢复;
*使用takeown.exe /F 获取复制到系统目录的病毒文件的所有权;
*使用icacls.exe %s /reset 重置ACL权限为默认值;
*最后创建一个服务,服务名和复制到system目录的文件名一样,而且都是从名称列表获取的,服务的文件路径是system下的病毒文件,并且以-s的模式启动,然后开启服务,监控服务状态,直到服务结束,就删除服务;
*-s 执行服务条目,该条目的对应函数是加密文件的函数;
*-p 加密命令行参数指向的目录,然后加密其他目录;
判断版本号是否是大于Windows Vista版本系统,如下。
获取当前进程的token信息,如下。
获取当前程序进程权限,如果权限不够,则通过模拟可信目录绕过UAC,进而提升权限。
将当前程序的命令行参数拼接到:bin文件路径的后面,用来后续创建进程,在%temp%目录下创建一个随机命名的目录,再在该目录下创建system32的目录。获取winsat.exe和winmm.dll,winsat.exe原封不动复制到上面创建的system32目录,winmm.dll修改后写入新创建的system32目录,作用是通过劫持dll绕过UAC。
对"C:\Windows\system32"的文件夹下文件进行了搜索.exe | .dll后缀的文件路径并存入链表中,在"%appdata%\"目录下(C:\Users\onion\AppData\Roaming\),通过复制"\\?\C:\Windows\system32\migwiz\replacementmanifests\microsoft-windows-ndis\ndismigplugin.dll"文件至C:\Users\onion\AppData\Roaming\Safe文件,Safe文件名取自之前获取的注册表项。
设置文件属性为隐藏,如下。
拼接路径"C:\Users\onion\AppData\Roaming\Safe:bin",接着创建该文件的:bin文件,为备用数据流(ADS),把病毒文件复制进去。这里的两个文件的设置非常隐秘。
读取本地原文件,准备创建Windows 备用数据流文件:bin。
将原文件内容写入:bin文件中,如下。
设置Safe:bin文件的修改时间,增加隐蔽性。
之后释放之前的链表申请的空间,接着开始获取命令行参数选择不同分支执行,如下。
通过创建子进程来执行命令行"C:\Users\onion\AppData\Roaming\Safe:bin -r",使用的是参数是-r,如下。
在-r参数分支里会比较判断参数是否为-r、-u、-s,便于执行不同的功能分支,如下。
解密得到Service字符串,拼接得到Service.exe,后续判断路径文件是否存在"C:\Windows\system32\Service.exe",如下。
如果文件不存在则尝试C:\Windows\system32\m32\Service.exe,之后执行以下命令行:C:\Windows\system32\vssadmin.exe Delete Shadows /All /Quiet,删除卷影服务,针对64位系统会使用Wow64EnableWow64FsRedirection启动重定向,如下。
会先删除卷影服务,防止存在备份。
读取本地磁盘下的源文件ransom.exe,接着创建Service.exe文件,路径为"C:\Windows\system32\Service.exe",如下。
将ransom.exe文件(属于原始母体文件,文件名已个人命名)内容写入上面的Service.exe文件里,如下。
拼接命令"takeown.exe /F C:\Windows\system32\Service.exe"执行,获取文件所属权。
命令虽然为"C:\Windows\system32\takeown.exe /F C:\Windows\system32\Service.exe",但实际执行是在SysWoW64目录下。接着使用"icacls.exe C:\Windows\system32\Service.exe /reset" 修改权限,为所有匹配文件使用默认继承的ACL替换ACL。
创建服务C:\Windows\system32\Service.exe -s,如下。
目前服务处于停止状态,如下。
创建完成后,会删除本地文件。
对于-s参数分支,分析如下。
会在流程里启动之前创建的服务Service,如下。
之后使用命令行"cmd /c choice /t 10 /d y & attrib -h "C:\Windows\SysWOW64\Service.exe" & del "C:\Windows\SysWOW64\Service.exe"删除本地文件,如下。
在-u参数分支中会对找到的网络资源部分进行加密,-f参数只加密指定的目录。
-p参数分支中同样会对所有可加密的文件进行加密,如下。
文件加密
通过创建线程进行加密,如下。
与之前分析过的勒索软件不同的是会调用MapViewOfFile创建文件映射,提高加密效率与增加规避性,而这与Maze勒索软件的流程又存在相似性。
加密的目标盘包括本地磁盘,移动磁盘,网络驱动器,加密会跳过的文件类型和文件目录有*.garminwasted_info *.garminwasted *\NTLDR *\BOOTMGR *\GRLDR *.386 *.ps1 *.msu *.ani *.wpx *.hlp *.ocx *.c *\NTLDR *\BOOTMGR *\GRLDR *.386 *.ps1 *.msu *.ani *.wpx *.hlp *.ocx *.com *.cpl *.adv *.cmd *.lnk %ProgramData% %windir% %temp% %AppData% C:\Recovery C:\Program Files C:\Program Files (x86) bin Boot boot dev etc lib initdr sbin sys vmlinuz run var \Boot System Volume Information $RECYCLE.B
缺陷分析
会调用CryptGenRandom生成一个72字节的随机数据,记为key,在原文件路径加上.garminwasted_info,创建该文件。之后在原文件路径加上.garminwasted_info,用MoveFile更改文件名,用MapViewOfFile对文件进行映射来操作文件数据。对文件的加密会先计算文件的MD5,然后使用AES-256-CBC模式来加密。AES的密钥生成是使用key的前32个字节数据进行密钥生成,用这32个字节使用AES密钥生成的算法生成1/2+6组的密钥,每组32个字节(256个字节),生成完成后使用key第32个字节开始的16个字节填充最后的半组密钥,这个AES算法的S盒有4个。
按照密钥组数8来算,这个AES会加密7轮,加密文件的数据结束后,会把MD5保存到key的48个字节之后,剩下的8个字节保存两个值,最后一个值为原文件大小。
最后会将72字节的key以及其他一些辅助信息通过RSA加密,再用base64编码保存到.garminwasted_info文件中。采用AES-256-CBC模式加密,如下。
采用MD5计算未加密文件前的hash值,便于后续解密的时候进行比对。
后续采用RSA4096来加密之前产生的AES密钥与IV值与计算得到的哈希值以及一些额外的信息,RSA的公钥已保存在文件中,每个文件都会有一个属于自身的AES的密钥32byte + IV16byte的模式,没有黑客对应的私钥则没办法解密得到AES的密钥来解密文件,同样黑客已采用了微软提供的安全随机数函数来产生后续使用的key,在内置的RSA公钥这块发现如果WastedLocker采用的是大规模分发攻击,当存在大量不同的受害者时,同一个RSA公钥应用所有受害者的这种加密方案可能被认为是一个弱点。在这种情况下,一个受害者的解密器就包含唯一的RSA私钥,而该私钥将允许所有受害者解密其文件。但目前发现,WastedLocker勒索软件针对特定组织定制了勒索软件(加密后缀与勒索信),这使得这种解密方法在现实世界中毫无用处。所以经分析论证这是一种健壮的方案,暂无缺陷可被解密,如下。
ATT&CK
涉及本次攻击的ATT&CK模型,如下。
威胁情报
HASH
2cc4534b0dd0e1c8d5b89644274a10c1
9B5F5E7D14BD7D73B5ADDA12D4015EF4
特殊字符串
erpiyoujoi56yu456hyu456h8uy4j5689uy9h
aaaerfacE\{b196b287-bab4-101a-b69c-00aa00341d07}
如若转载,请注明原文地址