欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

一款本地提权木马利用原理分析 可实现3环突破到0环

来源:本站整理 作者:佚名 时间:2018-08-26 TAG: 我要投稿

此时RtlSetActiveTimeBias的返回地址已经被覆盖,值为在CMD进程中的SHELLCODE的地址150000。
执行SHELLCODE后安全返回
先列出调用关系:NtSetSystemTime -> ExpSetSystemTime -> ExpRefreshTimeZoneInformation -> RtlSetActiveTimeBias -> RtlQueryRegistryValues -> RtlpCallQueryRegistryRoutine -> RtlpQueryRegistryDirect
RtlSetActiveTimeBias返回时,就回到病毒的SHELLCODE中,此时的ESP指向上图中最上边的那个位置,EBP = 0,RtlSetActiveTimeBias的返回地址由于已经被覆盖,所以只能通过ESP得到RtlSetActiveTimeBias的上层函数ExpRefreshTimeZoneInformation的返回地址,这个地址在函数ExpSetSystemTime中,取出这个地址,它的前四字节就是调用的相对偏移量,加上本身的地址,又得到函数ExpRefreshTimeZoneInformation的地址,在从这个地址搜索得到RtlSetActiveTimeBias原来的返回时的地址,设置返回值EAX为成功,然后转到这里去执行,如图:

第8行中的add ebp, 0FCh,FC是ExpRefreshTimeZoneInformation局部变量的大小加上在栈中保存的三个寄存器所占的空间,现在EBP指向的是ExpRefreshTimeZoneInformation函数的栈帧。
取出[ebp+4]是ExpRefreshTimeZoneInformation的返回地址,在函数ExpSetSystemTime中,函数find_return_addr如下图:

从ExpSetSystemTime函数中调用ExpRefreshTimeZoneInformation函数的地方,加上相对调用的偏移,也就是图中add ecx, [eax-4],取得函数ExpRefreshTimeZoneInformation的地址,然后在里面暴搜RtlSetActiveTimeBias正常情况下的返回地址。然后由上页图中的push eax; ret转过去,此时这次的调用返回正常的执行流程。
 
PciDisk.sys
PciDisk驱动主要通过向atapi.sys驱动程序发送IRP来感染userinit.exe文件。驱动入口处创建一个设备DevicePciFtDisk和一个符号链接DosDevicesPciFtDisk。从磁盘打开atapi.sys文件,并从INIT节搜索到IRP_MJ_DEVICE_CONTROL和IRP_MJ_SCSI处理例程的地址。从系统目录打开文件userinit.exe并读入数据,由FileHandle得到FileObject,进一步通过FileObject与与之关联的Vpb得到文件系统所创建的卷设备对象,就是userinit.exe文件所在的卷设备对象,然后构造一个主功能号为IRP_MJ_FILE_SYSTEM_CONTROL的IRP,IoControlCode为FSCTL_GET_RETRIEVAL_POINTERS,发往文件系统的卷设备对象,如下图:

等IRP完成后,得到文件userinit.exe的VCN和LCN对应关系表。然后取得atapi驱动类型为FILE_DISK类型的设备,得到DR0设备对象。当驱动收到应用层发过来的DeviceIoControl请求时,会把传入的数据通过写入磁盘,完成对文件的Hook操作,这里主要是自己构造SRB请求包,向Atapi发送IRP_MJ_SCSI类型的IRP实现的。如图:

别处,代码中还有对atapi.sys分发例程的挂钩恢复操作以及反调试代码,若发现在存在ntice.sys和syser.sys驱动,会向当前线程ETHREAD写入一块垃圾数据。
 
LHL3.sys
该驱动主要实现SSDT的恢复,杀掉大部分的安全软件。驱动入口取得内核模块的基址和大小,并暴搜找到函数PspTerminateThreadByPointer的地址。若搜不到,则从寻出表找到PsTerminateSystemThread函数的地址,并从该地址向后搜索取到PspTerminateThreadByPointer的地址,然后恢复该函数的前8个字节,然后通过ZwQuerySystemInformation遍历系统中的进程表,并杀掉病毒中定义的进程,包括:


这里杀进程的主要流程是:通过枚举得到的进程ID,得到进程对象EPROCESS,对进程对象中的链表头ThreadListHead遍历找到的每一个线程调用PspTerminateThreadByPointer。
然后分两种情况对SSDT进行恢复:
若系统中不存在江民软件,取出系统中SSDT表的位置,换算并取到在磁盘文件中的偏移,从磁盘文件中读取原始的SSDT数据后进行重定位并恢复。
若系统中存在江民软件,先读取原始SSDT数据,同上步,然后申请两块内存,先把当前正在使用的SSDT表拷贝过去,把原始SSDT也拷贝到紧后面,参数个数表同理,然后给SSDT结构赋值指向新的函数地址表和个数表,并把函数个数乘以2放入Count。
这样构造的SSDT,原来的函数地址(Hook的或是没Hook的)没有改变,而后半部分新加入的都是被恢复的函数地址。
然后病毒通过wrmsr改变MSR的IA32_SYSENTER_EIP,指向自己的代码,在这段代码中,把系统服务调用号加中原来的SSDT函数数量放入EAX后就调用原来的系统服务入口。这样,系统服务函数的地址就被重定向到了SSDT的后半部分。
最后,病毒开一个系统线程,循环调用杀进程的函数来结束杀软。
 

上一页  [1] [2] 

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载