1. 静态检测

查壳

可以使用peid、exeinfo等查壳软件

字符串查找

可以通过string工具,也可以ida加载之后shift + f12 查看程序字符串,通过查找字符串,有时候可以定位到ip、域名、使用的api、输出信息等。

动态链接库分析

可以使用Dependency Walker探索程序的动态链接函数(下载地址:http://www.dependencywalker.com)
下面列举一些常见的dll程序:
Kernel32.dll 包含系统核心功能,比如访问和操作内存、文件和硬件等。
Advapi32.dll 提供对核心windows组件的访问,比如服务管理器和注册表
User32.dll 包含了所有用户界面组件,比如按钮,滚动条以及控制和响应用户操作的组件
Gdi32.dll 包含了图形显示和操作的函数
Ntdll.dll 该dll是windows内核的接口,可执行文件通常不会直接导入这个dll,而是由Kernel32.dll间接导入,如果一个可执行文件导入了这个文件,意味着作者企图使用那些不是正常提供给windows程序使用的函数,比如隐藏操作进程等。
Wsock32.dll & Ws2_32.dll 这两个dll用于联网,使用其中任何一个dll的程序都可能会链接网络或是执行网络相关的任务。
Wininet.dll 包含了更高层次的网络函数,实现了如FTP、http和NTP等协议。

然后是关于函数名的一些命名约定:
比如Ex为后缀的函数名如CreateWindowsEx,这种情况是因为当微软更新一个函数,且亲函数与原本函数不兼容的时候,微软还会继续支持原函数, 这个时候新函数就会在原函数名的基础上加一个Ex,有的函数被更新了两次会加两个Ex
在函数名最后以A结尾表示ASCII字符串
W结尾表示输入参数为宽字符字符串

导出函数

与导入函数类似,dll和exe的导出函数是用来与其他程序和代码进行交互使用的。
通常,一个dll会是实现一个或多个功能函数,然后将它们导出是的别的程序可以导入并使用这些函数。
由于dll本身的实现就是实现一个函数然后被exe调用的,所以一般情况下dll会有大量的导出函数,而exe通常情况下很少会有导出函数。

PE文件格式

.text节:该节包含了CPU执行指令,所有其他节存储数据和支持性的信息,一般来说这个是唯一可以执行的节,也应该是唯一包含代码的节。
.rdata:该节通常包含导入与导出函数信息,与Deoendncy Walker和PEview工具所获取的信息是相同的,这个节还可以存储程序所使用的其他只读数据,有些文件中还会包含.idata和.edata节来存储导入导出信息。
.data:包含了程序的全局数据,可以从程序的任何地方访问到,本地数据不会存储在这个节中,二十PE文件某个其他的位置上。
.rsrc:包含由可执行文件所使用的资源,而这些内容并不是可执行的,比如图标,图片,菜单项和字符串等,其中字符串可以存储在.rsrc节或主程序里,在本节中经常存储的字符串是为了提供多语言支持的。
image.png

2. 动态检测

沙箱检测

沙箱检测算是比较常见的恶意代码检测技术了,这里贴几个免费沙箱:
首页 - 微步在线威胁情报社区
微步在线云沙箱
RedQueen安全智能服务平台
app.any.run/
VirusTotal

ummm 当然沙箱也有一些缺点,比如通常不能执行带命令的程序,只能直接执行exe,不能很好的分析dll等。‘
至于dll文件的动态检测,可以写程序加载调用该dll文件或者直接在cmd通过rundll32.exe 来执行dll文件,也可以修改pe头部,从IMAGE_FILE_HEADER的特征域里擦除IAMGE_FILE_DLL(0x2000)的标记,然后将dll当成正常的exe来执行,这样可能会出现一些问题使得dll无法正常运行,但如果能跑出关键功能也就可以了。

行为检测

我最开始用的行为检测工具是:sys tracer,这个界面比较简单但挺直观的,不过比较难下载且只支持32位,所以现在大多使用PorcessMonitor、火绒剑等行为检测工具了。
PorcessMonitor是Windows系统下高级监视工具,可以监控注册表、文件系统、网络、进程和线程等行为。
由于PorcessMonitor会监视Windows下的所有行为,所以一旦开启PorcessMonitor就会出现大量的行为,我们不能对这些行为进行全部分析,所以可以在启动恶意软件之前清空PorcessMonitor数据,然后开启监控,运行恶意软件,过几分钟之后停止监控,分析出现的行为。但是通常情况下,这样还是会出现大量系统行为,所以还需要对行为进行筛选。

除了PorcessMonitor,还有一个常用的工具ProcessExplore,该工具可以用来查看系统进程。

Reghot来比较注册表快照

3. IDA 分析

我使用IDA分析的时候主要分为两类,一是恶意代码比较简单,结构清晰的我会选择从main函数直接往下看,还有一种是恶意软件比较大,结构复杂我会根据行为检测里面探测的行为以及字符串、导入表里面的函数进行分析,这样可以提升分析效率,介绍一些IDA的基本使用
跳转快捷键G
交叉引用快捷键X
查看字符串shift f12
函数重命名 n

IDA搜索功能

在顶部菜单有一个Search按钮
Next Code 移动光标到包含你所指定的指令的下一个位置
Text 在整个反汇编窗口中搜索一个指定字符串
Sequence of Bytes 在十六进制视图窗口中对一个特定字节序列执行二进制搜索,这个功能通常可以用来搜素指定数据或操作码组合

流程图

随便找了一个exe文件拖入到IDA中,流程图界面如下所示:
image.png

这里红色的箭头表示一个条件跳转没有被采用,绿色表示已经被采用,蓝色表示一个无条件跳转被采用

IDA的自动注释

可以开启自动注释功能帮助分析汇编代码
比如原始的汇编代码如下:
image.png

通过Options -> General 然后选中auto comments
image.png

应用之后的汇编代码如下:
image.png
可以看到已经自动加上了注释,可以方便分析。

关于导航栏代码颜色

image.png
浅蓝色是被FLIRT识别的库代码
红色是编译器生成的代码(这里好像没有)
深蓝色是用户编写的代码(通常情况下也是着重分析的地方)
粉红色为导入的数据
灰色为已定义的数据
棕色为未定义的数据

4. 注册表相关

首先介绍一下注册表的五个根键
HKEY_LOCAL_MACHINE(HKLM) 保存对本地机器全局设置
HKEY_CURRENT_USER(HKCU) 保存当前用户特定的设置
HKEY_CLASSES_ROOT 保存定义的类型信息
HKEY_CURRENT_CONFIG 保存关于当前硬件配置的设置,特别是与当前标准配置之间不同的部分
HKEY_USERS 定义默认用户、新用户何当前用户的配置

其中最常用的根键是HKLM和HKCU

5. 恶意软件常见分类

下载器(下载者)

我实习的时候,接触到的第一个恶意软件就是下载者,下载者的功能比较简单,就是从互联网下载其他恶意代码,然后在本地系统中运行。通常情况来讲,下载者会和漏洞利用打包在一起,最常用的windowsapi是URLDownloadtoFileA和WinExec来下载并运行恶意代码。

后门(backdoor)

后门也是一种恶意代码,后门安装后可以让攻击者远程访问受害者的机器。通常情况下,后门拥有多种功能,并且会以多种形式与大小粗壮乃,后门代码往往实现了全套的功能,所以当使用后门的时候,攻击者通常不需要再下载额外的恶意代码。
一般来说,后门都拥有一套通用的功能如注册表操作、枚举窗口、创建目录、搜索文件等。

反向shell

反向shell是指从被感染机器上发起一个链接,它提供攻击者shell访问被感染机器的权限。反向shell可以作为一个单独的恶意代码存在,也可以作为一个复杂后门的组件而存在,反向shell种植成功后,攻击者可以在受害者机器上执行shell命令
windows系统中常使用cmd.exe来作为反向shell的利用,通常情况下来说有两种实现

  1. 基础方法

涉及的api函数为CreateProcess,程序首先会创建一个套接字并与远程服务器建立连接,然后会绑定这个套接字与cmd.exe的标准流(标准输入标准输出以及标准错误)。调用CreateProcess函数并用隐藏窗口的方式创建cmd,实现对cmd的隐藏。

  1. 多线程方法

多线程实现的话会涉及一个套接字、两个管道以及两个线程的创建(CreateThread、CreatePipe),CreatePipe可以用来绑定一个管道的读写端,如标准输入和标准输出。CreateProcess方法用来绑定一个管道与标准流,而不是直接与套接字绑定。调用CreateProcess方法,恶意代码将会产生两个线程:一个用来从标准输入管道读取数据,并且向套接字写数据,另一个用来从套接字读数据,并且向一个标准输入管道写数据。

远控(RAT)

pass

僵尸网络

僵尸网络是被感染主机的一个集合,僵尸网络由单一实体控制,通常由一个称为僵尸控制器的机器作为服务器。僵尸网络的目标是尽可能的感染更多机器来构建一个更为庞大的僵尸网络,这样庞大的僵尸网络,无论是传播恶意代码,传播蠕虫还是执行ddos攻击都是十分合适的。
这里要区别一下远控和僵尸网络的不同:
通常情况下,僵尸网络感染和控制数以百万的主机,而远控通常比较针对性的控制少数量的主机
僵尸网络中所有主机同时被同一个主机控制,而远控是以每个受害者为单位进行控制,也就是说远控的交互更为频繁
僵尸网络通常是大规模攻击,远控通常是针对性攻击

窃密

窃密常见的是盗号类,恶意代码着重关注的地方变成了用户存储在本地的密码等凭证信息。主要以下几类

  1. 等待用户登录以窃取用户登录凭证
  2. 转存Windows系统中存放的信息如密码hash值,攻击者可以通过程序直接使用这个hash或是对它进行离线的破解以获取密码
  3. 键盘记录工具
  4. 浏览器账号,缓存窃取
  5. 便利文档,加密文档并上传(这类木马大多数在APT中体现)

勒索病毒

勒索类木马应该是从17年开始火起来的,也是目前(2019)最为火爆的一种攻击方式,攻击方通过加密受害者主机上的所有程序而向受害者收取解密费用,通常被攻击的是游戏公司和互联网公司。

6. 恶意代码的常见行为

创建互斥体

创建互斥体可以用来标识木马是否在本地单例运行,减少被查杀的可能。
常见互斥体的函数为CreateMutex
使用方法如下:
image.png
编译运行
image.png

IDA分析:
进入到IDA默认视图如下:
image.png
根据我们之前对IDA的介绍,可以得知该流程图意思如下:
首先是在main函数中call调用了IsAlreadRun函数,然后比较了函数返回值,这里有两个跳转,红色的跳转表示没有被采用,绿色的表示已经被被采用,根据被采用的流程可以得知程序会调用puts输出is ALreadRun,符合我们第一次运行的结果。
然后蓝线无条件跳转会main函数,调用system执行pause暂停程序。

创建进程

创建新进程主要有3个API
分别是WinExec、ShellExecute和CreateProcess
使用Clion编写一个小程序分别调用这三种方法创建exe
image.png
build之后运行:
image.png

IDA静态分析:
image.png

木马持久化之注册表操作

一旦恶意代码获取到系统的控制权,它通常就能在系统中驻留很长一段时间。最常见的持久化方式为修改系统注册表。
恶意代码最常见的一个注册表安装路径为:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
该注册表键是用于安装windows启动项的。
我们可以通过工具Sysinternals帮助我们找到系统中所有自启动的程序,我们再手动对这些程序进行筛选。

还有一种特殊的操作注册表的方式为AppInit_DLL
攻击者可以通过一个名为AppInit_DLL的特殊注册表项来让他写的dll获得加载,AppInit_DLL中的dll程序会在进程记载User32.dll时被加载。插入dll路径到注册表AppInit_DLL会让dll程序获得加载的机会。
AppInit_DLL的值存储在:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost
AppInit_DLL的值类型是REG_SZ,它由空格分隔的字符串组成,有很多进程都会加载User32.dll,所以这些加载了User32的进程也会加载AppInit_DLL,所以攻击者需要在dll中判断,判断自己应该在哪个进程中(也就是攻击者自己的进程)被加载,这种检查判断通常在DLL程序的DLLMain函数中完成。

木马持久化之感染操作

持久化的还有一个常见操作是感染系统文件。当系统程序被感染之后,该程序下次被加载或运行时就会自动运行恶意代码。
感染的一个常见操作是修改文件的函数入口,使其跳转到恶意代码,实现操作后再跳转会原始的程序。
检查文件是否被感染的一个有效方法是存储并检测系统文件的hash值。

dll劫持

dll劫持是一种简单的隐蔽技术。dll劫持的原理是当一个可执行文件运行时,windows加载器会去加载程序所使用到的dll文件。查找的目录顺序如下:
程序所在目录
系统目录
16位子系统的系统目录
windows目录
当前目录
PATH环境变量中的各个目录
系统会按照这个程序依次去寻找程序所需的dll文件,利用该搜索特点,可以先伪造一个与系统同名的dll,提供相同的输出表,并使每个输出函数转向真正的系统dll,程序调用系统dll时会先调用当前程序所在目录下伪造的dll,完成相关功能后再跳转到系统dll同名函数里面执行,这个过程就是dll劫持。

提权

多数的提权攻击都是在利用本地系统漏洞进行的,或是n day 或是 0day,其中大部分的可以在msf中找到,这个遇到的比较少,暂时不分析。