Gh0st样本分析

Gh0st样本分析


###一.样本信息

  • 文件名称: DD668456CF2F3B72773D1968487BDCD5.exe
  • 文件大小:110KB
  • MD5: DD668456CF2F3B72773D1968487BDCD5
  • SHA-1: 4E6D34B68E219BE56D8A1C0DA5B7FB8ECCD282B9

###二.样本分析
0x01. GetInputState()用于隐藏加载程序过慢出现的加载符号 Gh0st样本分析


0x02. 判断文件末尾有
"AAAAAA""CCCCCCC"两个标志,并解码在"CCCCCCC"截断后的两个字符串,分别为Microsoft Device Manager
监测和监视新硬件设备并自动更新设备驱动Gh0st样本分析


0x03. 解码成功后获取命令行参数,如果不是Gh0st Update则继续运行,否则结束程序。之后创建互斥体判断是否存在**“AAAAAArqaxva61p72uvaenqaevp6ef"进程有则退出。
Gh0st样本分析
Gh0st样本分析


0x04. Add_Perm():用于获得
"C:\WINDOWS\system32""C:\WINDOWS\system32\Drivers"权限。Gh0st样本分析
Add_Acl(): 通过GetFileSecurity和SetFileSecurity设置文件的
SecurityDescriptor**,则是在文件ACL中增加一条ACE来获得权限。先取出文件上的ACL,逐条取出ACE,和现需要增加的ACE比较,如果有冲突,则删除已有的ACE,把新加的ACE添置到非继承的ACE的最后。


0x05. 获得两个文件的权限后,从资源区提取出101.bin拷贝到临时文件目录,文件名通过GetTickCount获取时间+_ex.tmp,并通过LoadLibraryA获取101.bin中的ResetSSDT函数,并进行调用。
ResetSSDT函数:
Gh0st样本分析
Change_Beep函数如下:
Gh0st样本分析

ResetSSDT函数首先调用Change_Beep函数,该函数通过StopService函数向beep服务发送停止信号,并将beep.sys属性设为正常,再将旧的beep.sys的内容读入缓冲区后,将beep.sys的内容改写为从101.bin的资源中获得的102.bin的内容,之后开启覆盖后的新的beep服务,并创建**”\.\RESSDTDOS"驱动。
Gh0st样本分析

若创建成功,之后因为
ntoskrnl.exe总是在SystemModuleInformation第一个,通过ntdll.dll中的NtQuerySystemInformation中的函数获取ntoskrnl.exe的内存加载基质,再获取"ntoskrnl.exe""KeServiceDescriptorTable"的地址。Gh0st样本分析

之后根据重定位表获取的调用KeServiceDescriptorTable的语句进行逐一比较机器码,根据
mov dword ptr [mm32], imm32**,判断机器码找到mov ds:_KeServiceDescriptorTable, offset _KiServiceTable,因为ntoskrnl在装载时回把SSDT放入到KeServiceDescriptorTable中,所以 _KiServiceTable中存放的就是SSDT的VA,减去基址得到SSDT的RVA。Gh0st样本分析

之后通过SSDT表表上的索引和对应的服务函数地址全部发送给RESSDTDOS驱动
Gh0st样本分析


驱动设置了MajorFunction[14]来对传入的消息进行处理
Gh0st样本分析
该函数首先修改了CR0的值,取消了内存写入保护,之后根据传入的参数,将传入的服务函数地址覆盖了当前SSDT表中的函数。因为杀毒软件会对SSDT中的函数地址进行修改,hook到自己的函数,来预防病毒的发生,而传入的各服务函数则是从ntoskrnl装载时的SSDT表中获得,是原始的SSDT表。从而达到隔绝杀毒软件检测的效果.
MajorFunction[14]:
Gh0st样本分析

在全部发送给驱动后,从缓冲区中读取了原先保存的beep.sys,对文件进行了还原,并重新开启服务,ResetSSDT函数结束。


0x06. 在调用完101.binResetSSDT函数后,打开注册表查询netscvs服务组的值,并取第一个服务6to4(用于ipv6转ipv4)。如果在system32文件下加存在6to4_ex.dll,就进行尝试删除,如果删除失败表面文件在被使用,那么就更换为netscvs服务组中的下一个服务如果这些服务都创建了,就会在netscvs服务组中添加新的服务以**"netscvs_0x0"开始尝试创建.Gh0st样本分析

在这之后后,添加该服务到注册表中同时修改里面的参数Description和DisPplayName分别为之前解密后的内容,start=2,将文件设置为
自启动**,同时添加了ServiceDll:6toex.dll,在启动会进行对此进行加载,
Gh0st样本分析

Gh0st样本分析
在设置完参数后,会将101.bin为6toex.dll放在system32目录下并隐藏,之后再添加InstallModule属性:为所在程序目录,应该用于判别下载的版本。在创建完注册表后开启该服务后会对该服务进行开启,之后回收缓冲区,结束程序。
Gh0st样本分析
Gh0st样本分析
Gh0st样本分析


ServiceMain

0x01.服务开启后,首先通过获取服务名来获取服务在注册表中的TYPE值,之后开始创建一个新的线程。
Gh0st样本分析
第二个参数则是创建线程的地址,而main是之后主要运行的的函数。之后该线程不停的循环等待
Gh0st样本分析
main先在dll中寻找是否存在以"AAAAAA"的flag字符串来判断是否为对应的文件,之后还原了SSDT表,同时将注册表中TYPE值设为4并且根据表中的InstallModule记录的样本路径,对样本进行了删除Gh0st样本分析
删除样本文件Gh0st样本分析
之后对**“AAAAAA"标记后的字符串进行解密,获得连接地址,解密结果为"192.168.1.88:8088”**,并进行连接Gh0st样本分析

Gh0st样本分析


0x02.如果连接成功,会开启一个线程持续不断的等待接受信号并根据接受到的信息来使用不同功能,之后将本机系统信息发给主机,并创建新的线程用于键盘监控Gh0st样本分析
Gh0st样本分析
这个HOOK会将输入的字符进行判别,并将内容加密后,记录到syslog.data中。
Gh0st样本分析

Gh0st样本分析
0x03.主要有文件管理,屏幕监控,摄像头,麦克风,执行shell,键盘监控,获取进程信息,运行下载程序,打开网页,清楚日志,更新服务断,卸载等功能。
Gh0st样本分析Gh0st样本分析


三.清除方案

打开服务,找到服务显示名称为Microsoft Device Manager,描述为监测和监视新硬件设备并自动更新设备驱动的服务,停止该服务,并根据该服务名称,在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\下找到该服务,根据parameter中的ServiceDll的值,删除该dll.