恶意代码分析-第十四章-恶意代码的网络特征

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37809075/article/details/82414347

目录

笔记

实验

Lab14-1

Lab14-2

Lab14-3


笔记

基于IP地址和域名信息

DomainTools(http://www.domaintools.com)-->whois历史记录的查询,能够进行反向IP查询。

RobTex(http://www.robtex.com)-->单个IP地址指向的多个域名信息

BFK DNS logger(http://www.bfk.de/bfk_dnslogger_en.html)-->DNS检测信息

基于内容特征

Snort入侵检测-->规则:

alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS(msg:"TROJAN Malicious User-Agent";content:"|0d 0a|User-Agent\:Wefa7e";classtype:trojan-activity;sid:2000001;rev:1;)

$HOME_NET和$EXTERNAL_NET变量:来指定内部和外部IP地址范围

$HTTP_PORTS:变量定义HTTP流量的端口

->:指明单方向传输的流量

msg:警告或日志记录中打印的消息

content:规则选项

|:管道符号里面的数据是16进制值

0d 0a:表示HTTP头部的换行

Wefa7e:要匹配的值

classtype:规则所属的分类

sid:规则的标识id

网络操作代码:Windows套接字:WSAStartup

                         WinINetAPI:InternetOpen等

                         组件对象(COM)接口:URLDownloadToFile等,CoInitialize,CoCreateInstance,Navigate等

寻找规则经验:查找在客户端和服务器端代码中共同使用的协议元素

                         已知任何协议元素作为密钥的部分

实验

Lab14-1

用于文件下载的函数

查找字符串,发现一个用于base64的常量

跟踪到关于这个常量的调用位置,一般标准的base64对于填充的值是=,但是这里填充的a

回到main函数

URLDownloadToCacheFile获取当前硬件配置文件的信息,GetUserName获取当前用户名

把两个字符串合并后传入刚刚识别出来的base64_encode加密函数

 在base64_encode之后调用sub_4011A3

从一个URL下载。这个url的第一个%s就是上面合成的字符串,第二个%s就是合成字符串的最后一个字符

分析网络特征:针对关键的静态元素作为网络特征,但是这些字符串在发送到网络之前,被base64编码了 

原始 41: 73: 7E: 29: 93: 56- Joh n S mit h..
编码后 NDE6 NzM6 NoU6 Mjk6 OTM6 NTYt Sm9o biBT bWlo aAaa

: 号对应的都是字符6,因为-号,所以对应的是t ,而且URL至少要是24个字符

正则表达式

1. /\/[A-Z0-9a-z+\/]{3}6[A-Z0-9a-z+\/]{3}6[A-Z0-9a-z+\/]{3}6[A-Z0-9a-z+\/]{3}6[A-Z0-9a-z+\/]{3}6[A-Z0-9a-z+\/]{3}t

([A-Z0-9a-z+\/]{4}{1,}\//

2. /\/[A-Z0-9a-z+\/]{24,}\ [A-Z0-9a-z+\/]\)\/\1.png/

Snort特征规则

alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS(msg:"Lab14-1-1";urilen:>32;content:"Get|20|/";depth:5;pcre:"/GET\x20\/[A-Z0-9a-z+\/]{3}6[A-Z0-9a-z+\/]{3}6[A-Z0-9a-z+\/]{3}6[A-Z0-9a-z+\/]{3}6[A-Z0-9a-z+\/]{3}6[A-Z0-9a-z+\/]{3}t([A-Z0-9a-z+\/]{4}{1,}\//";sid:2000011;rev:1;)

对url固定长度大于32

alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS(msg:"Lab14-1-1";urilen:>32;uricontent:".pang";pcre:"/\/[A-Z0-9a-z+\/]{24,}\ [A-Z0-9a-z+\/]\)\/\1.png/";sid:2000011;rev:1;)

增加了对.png的搜索

Lab14-2

调用的是WININET库,缺点是需要自己定义一个User-Agent

这个函数的参数dwFlags代表的含义是从服务器而不是缓存,所以字段中会有no-cache

捕获到的两条信令

函数的main区域调用了两次CreateThread。

两次CreateThread的函数一个是StartAddress,一个是sub4015C0,都调用了网络函数。其中StartAddress线程使用PeekNamedPipe检查命令shell的新输入。如果有,就发送到远程的位置。

sub4015C0使用401800,连到远程位置,一旦有输入就写到shell管道中。

Snort特征规则

alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:"PM14.2.1 Suspicious User-Agent (Internet Surf)"; content:"User-Agent\:|20|Internet|20|Surf"; http_header; sid:20001421; rev:1;)

alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:"PM14.2.2 Suspicious User-Agent (starts (!<)"; content:"User-Agent\:|20|(!<"; http_header; sid:20001422; rev:1;)

alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:"PM14.2.3 Suspicious User-Agent (long B64)"; content:"User-Agent\:|20|"; content:!"|20|"; distance:0; within:100; pcre:"/User-Agent:\x20[^\x0d]{0,5}[A-Za-z0-9+\/]{100,}/"; sid:20001423; rev:1;)----->将shell提示符的长度和字符的限制作为检测的目标

Lab14-3

调用了WININET库中的InternetOpenA,InternetOpenUrlA,InternetCloseHandle,InternetReadFile函数。先看一下InternetOpenUrlA这个函数。

InternetOpenUrlA这个函数上方有一些硬编码的字符串,用于数据包中字段的定义。编写者忘记了InternetOpenA的函数调用会包含头部的标题,这就导致在实际的User-Agent中,会出现重复的字符串。那么我们就可以依据这一点,来构造一个有效的检测特征。需要追溯lpszUrl这个参数。查找这里的调用,看看压入的参数是什么,来自于哪里

可以看到main函数调用了这个URL_open函数,这个参数来自于sub_401457

sub_401457

函数的开始位置判断在C盘下是否有autobat.exe这个文件,如果没有走左边,如果有走右边。

左边

调用create_file_write函数,这个函数的名字是我跟进去简单分析后重命名的名字,因为这个函数的功能是创建一个文件autobat.exe。压入的参数是一个url。是把这个url写入到这个文件中。然后继续调用函数本身sub_401457。

右边

如果存在这个文件,就读取这个文件的内容到buffer,作为下一个函数的url值。autobat.exe是存储URL明文的配置文件。这样就知道了4011F3处的url是从何而来,再回到这个函数看看干了什么

4011F3

InternetReadFile调用后,我们可以发现一个strstr的函数调用,它的作用是搜索一个字符串在另一个字符串中的第一次出现的位置

紧接着后面跟着一个sub_401000,这个函数而且是在一个循环里面,应该是循环验证"<no"之后的字符串,进入sub_401000

sub_401000

程序是在进行逐个字符的比对。攻击者通过将字符串拆分成单个的字符进行比较,来消除明显的比较痕迹,从而尝试隐藏正在查找的字符串的内容。是noscript,/,96‘

回到mian函数,关注sub_401684

sub_401684

strtok将命令的内容分为了两部分,并且被存入了两个变量中:var_10和var_C中。程序将分解的第一个字符串的第一个字符提取出来,并将其作为选择语句的判定标准。

Case0是字符“d”,而其它的case值是10、15和14,其实对应的字符为n、s和r。

如果字符为n,那么它所要实现的功能则是最简单的,它在将var_4赋值后,也就退出了。

如果是s,那么就会调用sub_401613函数,它包含有用于休眠的Sleep函数。 如果是d,那么就会调用sub_401565,其内部最主要的函数是URLDownloadToCacheFileA和CreateProcessA。

如果字符为r,那么就会调用sub_401651,其内部的sub_401372函数引用了CreateFileA、WriteFile以及之前提到过的C:\\autobat.exe这个配置文件。根据这个证据我们可以推断,“r”函数的目的是覆盖配置文件,将恶意程序重定向到不同信令URL。

恶意程序中必须包含有一个noscript标签,之后跟随的是一个URL,这个URL包含的域名与原始网页请求的域名相同,并且需要以“96’”作为结尾。其中包含的命令的第一个字符必须和程序所支持的命令相对应。而恶意程序的编写者限制了可以提供有关恶意代码功能线索的字符串列表。 当搜索noscript标签时,程序首先会搜索<no,接着用独立不规则的字符比较操作来确定noscript标签。在命令匹配时,仅仅考虑第一个字符,所以攻击者只要提供以字母s为开头的单词,就可以下达一个休眠的指令。

Snort特征规则

alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:”PM14.3.1 Specific
User-Agent with duplicate header”; content:”User-Agent|3a20|User-Agent|3a20|
Mozilla/4.0|20|(compatible\;|20|MSIE|20|7.0\;|20|Windows|20|NT|20|5.1\;|20|
.NET|20|CLR|20|3.0.4506.2152\;|20|.NET|20|CLR|20|3.5.30729)”; http_header;
Sid:20001431; rev:1;)

检测目标的明显特征是带有额外的User-Agent头部的某些User-Agent字符串

alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:”PM14.3.2 Noscript
tag with ending”; content:“noscript“; content:”http\://”; distance:0;
within:512; content:”96’”; distance:0; within:512; sid:20001432; rev:1;)

noscript标签、URL中第一个字符集“http://”以及末尾的“96’”。所以可以编写将这些静态元素作为检测目标的Snort特征

alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:”PM14.3.3 Download
or Redirect Command”; content:”/08202016370000”; pcre:”/\/[dr][^\/]*\/”
08202016370000/; sid:20001433; rev:1;)

其中的download和redirect函数使用相同的例程来解码URL,因此我们可以将这两条命令一起作为检测目标。上述特征使用了字符串08202016370000,之前我们已经确定它是“http://”的编码表示形式。PCRE规则选项包括这个字符串和斜线,[dr]表示字符d或r,并且d和r表示download和redirect命令。“\/”是转义的斜线,“[^\/]*”表示与0或者更多个非斜线字符匹配,最后的“\/”表示另一个斜线。

alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:”PM14.3.4 Sleep
Command”; content:”96’”; pcre:”/\/s[^\/]{0,15}\/[0-9]{2,20}96’/”;sid:20001434; 
rev:1;)

匹配sleep+“”的字符串。这里我们使用了命令字符串本身之外的一个元素“96’”来实现一个特征。PCRE识别s和一个斜线,紧接着是0~15不是斜线的字符([^\/]{0,15}),随后又是斜线,然后是数字2和数字20之间的数字,最后以“96’”结束。

猜你喜欢

转载自blog.csdn.net/m0_37809075/article/details/82414347