从本章开始,会见识各种恶意行为

笔记

下载器和启动器

下载器用来将恶意代码下载下来进行执行;启动器用来秘密加载恶意代码

后门(Backdoor)

后门程序往往实现了全套功能,不需要额外下载功能代码,有一套通用功能:注册表操作、文件操作等

反向Shell:从目标机器上发起连接来接受控制,可以作为单独的代码,也可以作为组件的一部分存在

RAT:控制管理主机,通常是为了特定目标进行控制

botnet:大范围控制主机,用来进行大规模攻击

登录凭证窃密器

转储Windows口令Hash,用来进行离线破解,或Pass-The-Hash攻击

  • pwdump:从SAM输出本地账户LM和NTLM口令,通过注入DLL到Lsass进程进行获取,pwdump变种经常会动态获取函数,经常会见到GetProcAddress函数
  • PTH:也是通过DLL注入进行获取

识别转出技术很重要,但确定恶意代码对哈希做了什么操作更重要,是存在硬盘了还是上传网上了,还是PTH攻击用了

按键记录

内核态常用键盘渠道来进行检测

用户态常用API进行Hook来实现,可能会见到这几个函数:SetWindowsHookEx(设置Hook)、GetAsyncKeyState(判断按键状态)、GetForgeroundWindow(判断当前窗口)

通过字符串列表来识别按键记录器很有用(Up、Num Lock、Down、Right、Left、PageDown等。。)

存活机制

注册表有很多地方能实现存活,Run、AppInit_DLL、Winlogon、SvcHost DLL等,一般通过procmon等工具去检测访问的注册表、通过sysinternals等工具找出自启动项

特洛伊木马化系统二进制文件,修改系统二进制文件,使其运行时加载恶意代码

DLL劫持也行

提权

通过访问令牌来提权,据说这种方式在最新的windows上没用了,不知道是不是真的

用户态Rootkit

用来隐藏恶意代码行为的工具称为rootkit,用户态常用的有IAT Hook(过时、容易检测),InlineHook技术

作业

Lab 11-1:

分析目标:Lab11-01.exe

无壳

查导入表发现:设置注册表键值的函数,资源释放的函数,存在资源文件,4D5A开头是个二进制文件

查看字符串:发现了好多Wlx开头没见过的函数,以及其他一些可疑信息:

image-20211017161414376

看下msginal.dll,MSGINA就是系统启动后显示出来的用户名密码窗体,长时间不操作系统桌面进入锁定状态时的窗体,以及2000系统按下CTRL+ALT+DEL后显示出来的窗体。 MSGINA导出了大量的函数,这些是与Winlogon交互必须的。

当然了,一开始应该直接看下全局的东西,不能太陷入细节,先来下反汇编:

 从这个看,关键的东西在2个 sub里面,

其中一个在加载资源,另外一个在修改注册表。注册表看下subkey,

是winlogon,可以看到是在做持久化,登录的时候就运行。

加载资源的,大概率是在将资源当成二进制exe使用。导出下再反编译看看:

 

所有的gina函数都是在调用sub10001000,估计是在劫持hook。

好了有一个大致印象了。我们继续往下:

  1. 这个恶意代码向磁盘释放了什么?

    运行火绒剑监控系统信息:

    image-20211017161859038

    该恶意代码向进程所在目录释放了msgina32.dll文件,还修改了注册表,设置了GinaDLL的值,是个二进制数据,没有观测到网络行为

  2. 这个恶意代码如何进行驻留?

    WindowsXP通过注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\GinaDLL来设置需要WinLogon加载的第三方DLL,恶意代码将释放出来的msgina32.dll设置到了这个注册表里

  3. 这个恶意代码如何窃取用户登录凭证?

    静态分析看见exe文件仅仅是做了资源释放和注册表设置两件事,其他功能应该是在资源文件里实现的,分析资源文件,无壳,字符串里是Wlx那堆函数,导入表没啥特别的,有注册表操作相关API,

    看到一堆Wlx开头函数,以及GinaDLL字符串,这里应该是用了GINA拦截的操作(有点像DLL劫持操作)

    根据查资料:WinLogon会和GINA DLL进行交互,缺省是MSGINA.DLL(在System32目录下)。微软同时也为我们提供了接口,我们可以自己编写GINA DLL来代替MSGINA.DLL。

    参考资料:Windows开机登录认证与Gina DLL - 一心一意 - 博客园 (cnblogs.com)

    查资料得知:GINA DLLs are ignored in Windows Vista,看来这是个XP特有的

    参考资料:GINA - Win32 apps | Microsoft Docs

    静态分析:

    image-20211017170213991

    这里把系统原本的msgina.dll给加载了,然后把句柄存到全局变量里,然后dllmain就结束了,因为是DLL劫持,所以功能不是全部都在dllmain中实现的,观察旁边的函数列表:

    image-20211017170635776

    基本上全部都是调用sub_10001000函数,这应该是个函数转发,查看:

    image-20211017170714361

    确实是这样,这里是从原本的dll中获取函数地址,然后返回函数地址,然后再返回出来之后直接jmp过去

    密码验证相关的函数是:WlxLoggedOutSAS(这个命名也是醉了!),把函数挨个点一遍也会发现,就这个函数里面的内容不一样:

  4. 查了下WlxLoggedOutSAS如下,可以通过他找到用户登录的账户名和密码。
  5. image-20211017171427272

    前面先是正常调用了函数,然后把参数里的关键信息入栈调用了sub_10001570函数:

    image-20211017171652783

    这个函数主要就是打开文件msutil32.sys然后把数据写进去了     ==》我自己反编译看下:

     

  6. 这个恶意代码对窃取的证书做了什么处理?

    把信息记录在了msutil32.sys

  7. 如何在你的测试环境让这个恶意代码获得用户凭证?

    要重启系统才能触发:

    image-20211017172211428

Lab 11-2:

整体功能:利用ws_sock里的send挂钩,做了用户态的rootkit,实现在使用outlook发送电子邮件的时候,可以抄送给恶意的电子邮箱。该邮箱地址还加密放在ini文件里了。

目标文件:Lab11-02.dll,Lab11-02.ini

PE查看:导入表导入了遍历模块列表的函数,注册表操作的函数

字符串查看:有好多exe结尾的名称,还有注册表地址,和spoolvxx32.dll和Lab11-02.ini

image-20211017185034520

  1. 这个恶意DLL导出了什么?

    导出了installer函数   可以使用dependency walker查看:
    导出函数 仅一个

  2. 使用rundll32.exe安装这个恶意代码后,发生了什么?==》使用process monitor监控恶意程序的运行,并设置过滤器:
    监控


    因为本次实验是一个dll程序,dll程序是无法直接监控的,所以监控宿主程序。
    使用命令行运行:
    运行


    其中installer是之前我们利用dw发现的导出函数。回车之后就代表恶意程序安装成功了。
    其安装之后会向系统中拷贝一个文件:拷贝文件名

    image-20211017190633320

    在系统system32目录下创建了文件spoolvxx32.dll,在注册表AppInit_DLLs里添加了这个dll 

  3. 为了使这个恶意代码正确安装,ini文件需要放置在哪里?

    分析DLLmain函数:首先获取当前路径到一个全局变量,然后打开system32目录下的ini文件,如果打开失败,则后面就不执行了

    image-20211017191120452==》上面都是猜想,最正宗的方法就是使用ollydbg运行,设置断点看下,直接将dll文件拖到ollydbg里

  4. 这个安装的恶意代码如何驻留?

  5. AppInit_DLLs is a mechanism that allows an arbitrary list of DLLs to be loaded into each user mode process on the system. Microsoft is modifying the AppInit DLLs facility in Windows 7 and Windows Server 2008 R2 to add a new code-signing requirement. This will help improve the system reliability and performance, as well as improve visibility into the origin of software.

    简单的说就是:AppInit_DLLs用来全局注入dll模块,凡是导入了user32.dll的程序都会 主动加载这个键值下的模块。
     

  6. 驻留是通过AppInit_DLLs注册表进行的,installer函数会把自己复制到system32目录下,以及给注册表AppInit_DLLs添加项:

    image-20211017191321324

  7. 这个恶意代码采用的用户态Rootkit技术是什么?

    采用了InlineHook,dllmain函数后面读取ini信息,然后进行解密操作,解密完成之后保存在全局变量里,接下来调用了函数进行Hook:

    image-20211017193936227

    sub_100014B6函数首先获取当前进程名:

    image-20211017194011558

    紧接着将进程名变大写,进行判断,是不是如下三个进程:==》因为outlook肯定会调用user32.dll!所以就达到了挂钩劫持的目的!如下:

    image-20211017194107075

    如果是的话,就执行接下来的操作:设置Hook,Hook wsock32.dll的send函数

    image-20211017194126430

  8. Hook代码做了什么?

    Hook代码Hook了send函数,将要发送的字符串里如果有RCPT TO:就添加:RCPT TO: <billy@malwareanalysisbook.com>\r\n,然后再调用send函数,应该是邮件劫持

    image-20211017195809703

  9. 哪个进程执行这个恶意攻击,为啥?

    劫持邮件,针对邮件程序进行攻击,针对:THEBAT.exe、OUTLOOK.exe、MSIMN.exe进程进行攻击

  10. ini文件的意义是什么?

    是加密后的邮箱地址,ollydbg设置断点,然后看调用函数返回eax寄存器的值即可知道,解密后如下图所示:

     补充下这个用户态的钩子,是针对send进行挂钩。没有看到windows 挂钩子的api,如下,网上说是SetWindowsHookEx,但是这里面没有啊。。。

    ==》还是需要再看看本质,,,等去公司问问。

Lab 11-3:

整体功能:修改系统的cisvc.exe,将恶意的shellcode键盘记录放进去,使得服务在调用该exe的时候会先执行自己的shellcode。

分析目标:LAb11-03.exe、Lab11-03.dll

  1. 使用基础的静态分析过程,你发现什么有趣线索?

    exe:导入表没啥东西,字符串有奇怪的东西:

    image-20211017201646773

    dll:导入表导入了按键记录三件套:

    image-20211017201936519

    导出了一个函数:zzz69806582,

    字符串特别的有:

    image-20211017201750008

  2. 当运行这个恶意代码,发生了什么?

    看起来是把自己的dll复制到了system32目录下,改名为inet_epar32.dll,修改了cisvc程序,然后通过cmd执行了命令:cmd.exe /c net start cisvc启动了一个服务

    image-20211017202441998

  3. exe如何安装dll使其长期驻留?

    通过修改服务文件cisvc.exe实现驻留,除了去读反汇编分析改了哪些内容,还可以通过对比二进制文件来了解:

    image-20211017205007362

    OEP被修改了,然后下面删掉了大堆0,又添加了一堆数据:

    image-20211017205136814

    这里有两个字符串,分别是dll路径和它的导出函数,大概率这里是加载这个导出函数来运行,拖入OD便运行便配合IDA进行分析,功能和推断一致:

    image-20211017211312844

  4. 这个恶意代码感染Windows系统哪个文件?

    cisvc.exe文件

  5. dll做了什么?

    创建了一个线程:

    image-20211017211415332

    线程函数首先判断互斥量:

    image-20211017211523296

    然后接下来创建了一个文件,进入了一个函数,这个函数的功能就是按键记录器

    image-20211017211601822

  6. 这个恶意代码将收集到的信息存到了哪里?

    都存到了C:\Windows\System32\kernel64x.dll,随便按几下查看该文件,emmm,挺看不懂的:

    image-20211017212002186


 至于如何植入shellcode的,下面这个文章分析得比较细致!使用的是内存映射文件来修改。shellcode就是加载Lab11-03.dll的导出函数zzz69806582,从而实现键盘记录!使用ollydbg动态调试即可发现:

 

Lab 11-3


分析恶意代码Lab11-03.exe和Lab11-03.dll。确保这两个文件在分析时位于同一个目录中。

问题

1. 使用基础的静态分析过程,你可以发现什么有趣的线索?

我们先来看exe的导入表有些啥:
在这里插入图片描述

放到IDA里面再看看,在这里我们能够看到C : \WINDOwS\1System32\ linet_epar32.dll还有Lab11-03.dll这俩dll,cisvc.exe这个exe程序以及net start cisvc这条命令。
在这里插入图片描述

dll接下来再看,我们先了解一下cisvc.exe是个啥东西:
在这里插入图片描述

似乎不是什么不好的东西,而net start cisvc则是启动这个服务的命令,于是我们转移目标,看Lab11-03.dll:
在这里插入图片描述

我们能发现,这里的GetForegroundWindow;GetiindowTextA;GetAsyncKeyState三个导入函数。初步推断是要做键盘记录。再看看导出函数。
在这里插入图片描述

这个导出函数暂时也不知道是干什么的。我们再到IDA里面看看,这里好像创建了个kernel64x.dll的文件,其他还有创建文件,创建互斥体,创建线程什么的,我们就先不管。

在这里插入图片描述

Lab11-03.exe包含字符串inet_epar32.dll和 net start cisvc,这意味着它可能启动CiSvc索引服务。包含字符串C:\WINDOWS\System32\kernel64x.dll的Lab11-03.dl导入了API函数GetAsyncKeyState和 GetForegroundwindow,这让我们怀疑它是一个记录到文件kernel64x.dll的击键记录器。

2. 当运行这个恶意代码时,发生了什么?

我们用procmon来监测一下,过滤一下:
在这里插入图片描述

我们看到以下这些行为
在这里插入图片描述
在这里插入图片描述

可以看到,这里会创建inet_epar32.dll,还有Lab11-03.dll的一堆操作。我们打开创建的inet_epar32.dll看看)。进行MD5比对能够发现,inet_epar32.dll和Lab11-03.dll是相同的文件,所以我们可以知道恶意代码复制了lab11-03.dll到windows系统目录。

在这里插入图片描述

监控到的还有cisvc.exe的创建,不过并没有其他的相关操作。

恶意代码首先复制Lab11-03.dll到Windows系统目录的inet_ epar32.dll中, 并有针对cisvc.exe的操作

3. Lab11-03.exe 如何安装Lab11-03.dll使其长期驻留?

我们用IDA调试一下Lab11-03.exe
在这里插入图片描述

在main函数中一开始是复制lab11-03.dll到system32系统目录中的inet_epar32.dll。之后创建一个字符c:\windows\system32\cisvc.exe,将其作为参数传递给了sub_401070.之后是使用系统运行命令net start cisvc,来启动索引服务。

接下来我们看看他的子函数
在这里插入图片描述

从上图可知调用了createfile(创建文件),createfilemappingA(创建一个文件映射内核对象)和MapViewOfFile(将一个文件映射对象映射到当前应用程序的地址空间),将cisvc.exe映射到内存中。这些函数都有访问这个文件的权限。

MapViewOfFile返回的内存映射视图的基地址(lpBaseAddrress)可以被读写
在这里插入图片描述

我们接着往下看

在这里插入图片描述
在这里插入图片描述

可以看到调用了UnmapViewOfFile(停止当前程序的一个内存映射),这样对这个文件做的任何修改都会被写入到硬盘。

同时我们顺着绿色那条线看下来(上三图的下面那张),查看在调用该函数sub_401070之前的操作。

能够发现其实是进行了写入操作。一开始文件的映射位置移入到EDI,用Var_28调整一些偏移量。rep movsd循环,用ecx(4E)计数来写入该数量的DWORD。之后byte_409030被移入ESI,复制byte_409030的数据到映射文件中。

接下来F5跟进一下

在这里插入图片描述

跟一下dword_409030
在这里插入图片描述

这里一大段不知道是个啥东西,来c一下看看
在这里插入图片描述

可以看到这里出现了一个跳转jmp loc_409134,跟过去看看
在这里插入图片描述

发现这里出现了被感染的dll和这个exe的导出函数。所以我们可以猜测,shellcode加载了这个dll,并调用了它的导出函数。

接下来IDA分析一下感染后的文件
在这里插入图片描述

这里call了sub_1001AD5,我们跟过去看看

在这里插入图片描述

这里call的这些个函数不知道是个啥,所以我们上OD里面调试一下

在01001B0A用这个函数的位置下断点,运行

在这里插入图片描述

提示出用的是loadlibrary函数,在数据窗口看一下这个位置

在这里插入图片描述

可以知道其作用是将inet_epar32.dll载入内存

同理接着看下一个函数,00101B1B处下断点,看到此时是调用GetProcAddress,其作用是获取导出函数的地址(在右下角可以看到导出函数)返回值在eax,接下来将eax赋给ebp-8,之后是call ebp-8,那么也就是说下一个call就是在调用这个导出函数。

接着往下单步
在这里插入图片描述

通过一个jmp后到达原始程序的入口点。

所以,恶意代码通过入口点重定向从而使它永久性地安装Lab11-03.dll。它通过重定向入口点,来运行加载这个DLL的shellcode
接下来使用ida分析本次的dll文件

4. 这个恶意代码感染Windows系统的哪个文件?

为加载inet epar32.dll,恶意代码感染了cisvc.exe,然后调用了inet_epar32.dll的导出函数zzz69806582。

5. Lab11-03.dll做了什么?

来看他的导出函数
在这里插入图片描述

这里有个创建线程,其中有个startaddress参数,跟过去看看
在这里插入图片描述

这里创建了个“MZ”互斥量(因为前面OpenMutexA那个地方没有互斥量,所以跟着绿线运行下来)

接着往下看
在这里插入图片描述

创建了个文件"C:\WINDOWS \System32\kernel64x.dll"
在这里插入图片描述

SetFilePointer:在一个文件中设置新的读取位置,dwMoveMethod值为2(开始点为文件的结尾位置)

然后call了个sub_10001380,看看是什么
在这里插入图片描述

call了个sub_10001030,看看

在这里插入图片描述

这又call了个sub_10001000,过去看看
在这里插入图片描述

这里看到了一开始静态分析的时候看到的GetForegroundWindow,GetiindowTextA,用来判断当前哪个程序正在输入和获取当前的标题。

再看回sub_10001030,能发现下面用到了GetAsyncKeyState判断一个按键是被按下还是弹起。
在这里插入图片描述

Lab11-03.dll 是一个轮询的记录器,这在它的导出函数zzz69806582中得到实现

6. 这个恶意代码将收集的数据存放在何处?

恶意代码存储击键记录和窗体输入记录,其中击键记录被存入到C:\Windows\System32\kernel64x.dll。