1.1 恶意代码基础知识
这部分包括恶意代码定义与分类、恶意代码发展史、计算机病毒、网络蠕虫、后门与木马、僵尸程序与僵尸网络、Rootkit。
恶意代码(Malware,或Malicious Code)指的是使计算机按照攻击者的意图执行以达到恶意目标的指令集。恶意代码根据执行方式、传播方式和对攻击目标的影响分为计算机病毒(Computer Virus)、蠕虫(Worm)、恶意移动代码(Malicious Mobile Code)、后门(Backdoor)、特洛伊木马(Trojan Horse)、僵尸网络(Botnet)、僵尸程序(Bot)、内核套件(Rootkit)等。反病毒业界通常采用“三元组命名”规则来命名恶意代码。
在1983年计算机病毒定义正式出现之后,恶意代码在近30年发展过程中重要和著名的案例有Brian病毒、Concept病毒等。恶意代码的发展趋势:恶意代码的复杂度和破坏力不断增强、恶意代码技术的创新越来越频繁、关注重点从计算机病毒转到蠕虫和内核级的攻击工具等。
1.1.1 计算机病毒
计算机病毒在1983年由Fred Cohen首次提出。1994年我国的《中华人名共和国计算机安全保护条例》给出了我国对计算机病毒的具有法规效力的定义。计算机病毒的基本特性:感染性、潜伏性、可触发性、破坏性、衍生性等。计算机病毒潜在的感染目标可分为可执行文件、引导扇区和支持宏指令的数据文件三大类。计算机病毒的传播渠道包括移动存储、电子邮件及下载、共享目录等。
1.1.2 网络蠕虫
网络蠕虫是一种通过网络自主传播的恶意代码,可以进行自我复制。蠕虫的内部组成结构有弹头、传播引擎、目标选择算法、扫描引擎和有效载荷。
蠕虫获取目标系统访问权常用的技术有缓冲区溢出攻击、文件共享攻击、利用电子邮件传播、利用其它普遍的错误配置等;
传播引擎通常利用的网络传输机制包括文件传输协议FTP、小文件传输协议TFTP、超文本传输协议HTTP、服务信息块协议SMB以及原始SOCKET套接字等;
蠕虫可选择的目标有电子邮件地址、主机列表、被信任的系统、网络邻居主机、域名服务、通过特定规则任意选择IP目标地址等;
蠕虫的有效载荷有附加的攻击代码、植入后门、安装分布式拒绝服务攻击代理、组件僵尸网络、执行一个复杂的计算等。
1.1.3 后门与木马
后门是允许攻击者绕过系统常规安全控制机制的程序,能够按照攻击者自己的意图提供访问通道;木马(特洛伊木马)是指一类看起来具有某个有用或善意目的,但实际掩盖着一些隐藏恶意功能的程序。
后门工具能够为攻击者提供多种不同类型的访问通道,包括本地权限提升和本地账号、单个命令的远程执行、远程命令行解释器访问、远程控制GUI、无端口后门等。对于UNIX平台,后门工具则也可以利用inittab系统初始化脚本、inetd网络服务配置、与用户登录或程序激活相关的用户启动脚本、Crond后台程序计划任务来配置自启动等。
特洛伊木马程序的目的有欺骗用户或系统管理员安装特洛伊木马程序、隐藏在计算机的正常程序中等。
1.1.4 僵尸网络与僵尸程序
僵尸网络是在网络蠕虫、特洛伊木马、后门工具等传统恶意代码形态的基础上发展融合而产生的一种新型攻击方式。僵尸网络是指攻击者处于恶意目的,传播僵尸程序控制大量主机,并通过一对多的命令与控制信道所组成的网络。僵尸网络具有恶意性和网络传播性。最早出现的IRC僵尸网络由僵尸网络控制器(botnet controller)和僵尸程序两部分组成。
僵尸程序分为主体功能模块和辅助功能模块,主体功能模块包括命令与控制模块和传播模块,辅助功能模块包括信息窃取模块、主机控制模块、下载更新模块和防分析检测模块。当前主流的僵尸网络命令与控制机制有基于IRC协议的命令控制机制、基于HTTP协议的命令与控制机制和基于P2P协议的命令与控制机制三大类。
1.1.5 Rootkit
Rootkit属于特洛伊木马的范畴。根据操作系统的分层,Rootkit可以运行在用户模式和内核模式两个不同的层次上。除了这两种传统模式Rootkit之外,还有虚拟机模式Rootkit。针对类UNIX平台的用户模式Rootkit是Rootkit的最初模式,实现用户模式Rootkit主要有使用现有接口在现有Windows函数之间注入恶意代码、关闭Windows文件保护机制后覆盖硬盘上的文件、利用DLL注入和API挂钩操纵正在内存中运行的进程三种技术。
大多数内核模式Rootkit采用如下技术:文件和目录隐藏、进程隐藏、网络端口隐藏、混杂模式隐藏、改变执行方向、设备截取和控制等。Linux操作系统中利用LKM机制来实现内核模式Rootkit有Adore、Adore-ng、KIS(Kernel Intrusion System)等,目前实现的Windows内核模式Rootkit有NT Rootkit、Fu Rootkit等。
1.2 恶意代码分析方法
这部分包括恶意代码分析技术概述、恶意代码分析环境、恶意代码静态分析技术、恶意代码动态分析技术。
1.2.1 代码分析技术概述
代码分析或称程序分析,是按需求使用一定规则、方法和工具对计算机程序进行分析,以推导出其程序结构、数据流程和程序行为的处理过程。恶意代码分析的关键点在于构造受控的分析环境。恶意代码分析的技术方法主要包括静态分析和动态分析两大类。
1.2.2 恶意代码分析环境
恶意代码分析环境有恶意代码发烧友的分析环境、基于虚拟化构建恶意代码分析环境、用于研究的恶意代码自动分析环境。
1.2.3 恶意代码静态分析技术
恶意代码静态分析主要技术手段有反病毒软件扫描、文件格式识别、字符串取分析、二进制结构分析、反汇编、反编译、代码结构与逻辑分析、加壳识别与代码脱壳等。
1.2.4 恶意代码动态分析技术
恶意代码动态分析主要技术手段有快照对比、系统动态行为监控、网络协议栈监控、沙箱、动态调试等。其中,系统动态行为监控软件包括文件行为监控软件、进程行为监控软件、注册表监控软件、本地网络栈行为监控软件等。目前常用的动态调试器软件包括Windows平台下的开源Ollydbg软件、微软推出的免费软件windbg商业软件IDA Pro和SoftICE等,以及类UNIX平台下的gdb、systrace、ElfShell等。
动手实践任务一
对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下:
运行winX 攻击机 ,打开cmd 运行命令行 file RaDa.exe 。可以看到文件类型,它是PE32位可执行文件。有图形化窗口,用了intel80386处理器的汇编指令集。
2.打开PEiD中文版,导入这个Rada.exe,查看下基本信息。这里可以看到文件的入口点、偏移、文件类型、EP短、汇编程序以及加壳类型。
PE细节
扩展信息,检测一行包含了加壳信息
3.命令行输入strings RaDa.exe命令,对恶意程序进行字符串提取。发现是乱码。
4.使用脱壳工具超级巡警虚拟机脱壳器对恶意程序进行脱壳。得到unpacked.exe
5.这时再用PEiD打开发现当前编译工具使用时VB5.0/6.0:
6.在用上面讲的方法读取文本内容,可以看到文本内容已经没有乱码
7.运行该程序,然后在process explorer上读取进程 IDA VIEW 信息,找到了作者名字
动手实践任务二:分析Crackme程序
任务:在WinXP Attacker虚拟机中使用IDA Pro静态或动态分析crackme1.exe和crackme2.exe,寻找特定的输入,使其能够输出成功信息。
1.在C盘创建crack目录,将exe文件放入其中,首先要猜测需要输入的参数个数,我们从0个参数开始,依次测试不同参数个数的输出
2.打开IDA Pro Free,然后把crackme1.exe导入进去,进行反编译。
3.先查看程序中明文字符串Strings window,可以发现前四个中有两项输出记录下来了,猜测第2条是密码,第四条是破解成功的提示语:
4.查看他的函数结构
5.返回主界面,找到401280这一代码块,在Functions window中定位该函数
6.然后从IDA VIEW-A这一栏可以看到,定位到了对应位置的汇编代码部分
7.依据下图汇编代码推测输出正确输入应该为"I know the secret"
8.输入密码,攻击成功
Crack2
2.由IDA PRO Free打开crackme2.exe。可以看到如下基本信息
3.打开函数表,可以看到它的大致结构。关键代码段,401280
定位401280代码段,然后查看他的数据流表。
5.对比上个程序的判断条件,发现相差了一个add eax 4代码,eax寄存器加4,据此大致判断出需要两个参数,第一个是程序名,第二个是密码。然后我们将原文件重命名为crackmeplease.exe,使用密文:"I know the secret",就可以攻击成功。
分析实践任务一:
分析一个自制恶意代码样本rada,并撰写报告,回答以下问题:
1.打开wireshark和已经脱壳的rada_unpacked.exe,运用上述工具打开属性,可以看到该二进制文件的编码字符串内容,当恶意程序打开后或以http协议与目标地址10.10.10.10的RaDa_commands.html进行连接,在本机目录下会新建tmp和bin两个文件夹,注册表也会有改变
首先把相关答案给出
md5摘要值为caaa6985a43225a0b3add54f44a0d4c7。32位PE GUI可执行程序,同时这是一个UPX加壳文件。
通过上面的分析,我们知道用户上网,就得到了攻击者的指令,并且攻击者可以完全控制该系统(指令),所以这应该是一个后门程序或者僵尸程序
RaDa.exe被执行时,它会将自身安装到系统C盘中,并通过修改注册表的方式使得每次系统启动,启动后主要就是以下过程:
从指定的web服务器请求指定的web页面;
- 解析获得的web页面,获取其中的指令;
- 执行解析出来的指令,主要的指令上面给出;
- 等待一段时间后继续按照这个循环执行。
4、防分析技术如下:
识别并解释这个二进制文件中所采用的防止被分析或逆向工程的技术;
UPX加壳;
- 通过查看网卡的`MAC`地址以及查看`VMware Tools`的注册表项来判断操作系统是否运行在VMware虚拟机上,如果是,则使用`—-authors`参数时将不会输出作者信息;
- `Starting DDoS Smurf remote attack`字符串可能让别人联想这是DDos攻击。
首先这个样本不具有传播和感染的性质,所以它不属于病毒和蠕虫。然后它也没有将自己伪装成有用的程序以欺骗用户运行,所以他也 不属于木马。所以我认为他是一个后门程序或者僵尸程序。
Bobax,2004年发现的木马,也是使用HTTP协议从指定的服务器下载命令文件,然后解析并执行其中的指令。还有特洛伊木马Setiri。
作者在上面的分析中给出了是Raul siles和David Perze于2004年编写的。
动态分析:
首先打开Filemon(文件),Regmon(注册表),Wireshark(网络)三个软件进行监测(Filemon和Regmon可以百度搜索下载),然后在cmd窗口运行RaDa.exe。观察Filemon我们可以看到程序文件RaDa.exe复制到了C:\RaDa\bin目录下,并且新建了temp目录。
依次按照“开始”---“运行”---输入“regedit”---回车打开注册表编辑器,然后依次打开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run查看自启动项,可以看到加入了RaDa: C:\RaDa\bin\RaDa.exe
然后打开wireshark,使用过滤器ip.src == 10.10.10.10 or ip.dst == 10.10.10.10进行过滤。我们可以看到尝试进行http登录,估计是要访问html网页。
静态分析
下面我们使用超级巡警进行脱壳,这是一个UPX壳,并且成功脱壳。脱壳详细描述可参考任务一。
很明显,RaDa_commands.html这个应该就是我们之前进行访问的那个html网页。
(III)查看汇编代码逻辑,首先我们还是看命令行参数的代码逻辑。我们可以看到命令行参数都在sub_405E40这个函数中,这个函数应该就是处理命令行参数的。
IV)继续根据线索分析,我们知道RaDa_commands.html这个字符串极其重要,因为我们看到有网络访问,那么我们就去寻找这个字符串对应的函数了。首先我们肯定很简单的能寻找到这个字符串对应的函数是sub_404FB0,我们进入这个函数,看黄色部分的汇编代码,很容易知道他是被拷贝到dword_40C030这个变量中了。还能看到很多其他的字符串拷贝(这些字符串就是默认的一些值)。
(V)然后我们很快找到这个dword_40C030变量对应的函数sub_4052C0,找到它并且打开Call Graph查看。这里我们看到判断了三个网段分别为192.168.、172.16.、10.,很明显,这是三个私有网段,也就是说确保服务器在私有网段中,然后到服务器去取命令文件。
(VI)有命令文件就一定有命令,那么下面就是一些具体的命令以及其功能。其实sleep应该是我们之前在做动态分析的时候最能感知的。
(VII)最后一部分分析字符串中的Vmware Tools,所以我们猜测这个程序是不是对虚拟机有所检测。首先我们找到该字符串对应的函数sub_404FB0,在这个函数中,这个字符串被拷贝到变量dword_40C070,继续寻找这个变量对应的函数,找到是sub_40AAA0。接下来我们主要看看这个函数干嘛了以及哪里调用了这个函数。
(VIII)我们看到这个函数进行了网卡配置信息的查询(Select),然后进行了右边就确认dword_40C070对应的字符是否存在,并进行了Mac地址查询,注册表的查看等操作(Wscript.shell)。也就是判断vmware tools是不是在注册表里面。
(IX)我们注意观察当--authors在我们的虚拟机上输出的是Unknow argument,可是我们确实也能在明文字符串信息中找到作者的信息。这个时候我们观察到--authors参数对应的处理函数是sub_40B010,找到之后,我们打开Call Graph进行观察,结果就显而易见意见了,这里调用了sub_40AAA0函数,也就是上面虚拟机对应的处理函数,我们发现,这里的处理是如果是虚拟机就输出Unknow argument,如果不是,就输出正确的作者信息。
分析实践任务二:
1、IRC是什么?当IRC客户端申请加入一个IRC网络时将发送那个消息?IRC一般使用那些TCP端口?
2、僵尸网络是什么?僵尸网络通常用于什么?
3、蜜罐主机(IP地址:172.16.134.191)与那些IRC服务器进行了通信?
4、在这段观察期间,多少不同的主机访问了以209.196.44.172为服务器的僵尸网络?
5、那些IP地址被用于攻击蜜罐主机?
6、攻击者尝试攻击了那些安全漏洞?
7、那些攻击成功了?是如何成功的?
针对(1),有
IRC(INTERNET RELAY CHAT,英特网继传聊天)通过特殊的协议(IRC协议),大家连到一台或者多台IRC服务器上进行聊天。IRC的工作原理非常简单,您只要在自己的PC上运行客户端软件,然后通过因特网以IRC协议连接到一台IRC服务器上即可。IRC特点是通过服务器中继与其他连接到这一服务器上的用户交流,通过IRC简介了解IRC的相关内容。
在一台新的被僵尸程序控制的靶机申请加入的时候首先要发送口令、昵称和用户信息。消息格式如下:USER 和 NICK IRC通常使用6660 - 6669端口进行监听,其中6667是明文端口,此外额外占用一个端口6697进行SSL加密传输。由于此处的端口号并不唯一,这就导致难以通过端口号进行检测,这里使用协议过滤的相关内容,对NICK、JOIN等IRC指令进行过滤。 针对(2),有 僵尸网络是可被攻击者远程控制的被攻陷主机所组成的网络。僵尸网络是控制者(称为Botmaster)出于恶意目的,传播僵尸程序控制大量主机,并通过一对多的命令与控制信道所组成的网络。 僵尸网络主要用于:发动DDOS攻击、发送垃圾邮件、监听用户敏感信息、记录键盘输入信息、扩散新的恶意软件和伪造点击量,骗取奖金或操控网上投票和游戏等。 针对(3),有 使用Wireshark打开数据文件,并设置过滤条件ip.src == 172.16.134.191 && tcp.dstport == 6667,因为我们上面的分析知道IRC通过6667端口。筛选之后,我们可以找到五个IRC服务器,分别为: 209.126.161.29 66.33.65.58 63.241.174.144 217.199.175.10 209.196.44.172 针对(4),有 使用命令tcpflow -r botnet_pcap_file 'host 209.196.44.172 and port 6667'(读取文件,筛选host和端口6667后进行分流),执行之后我们将获得三个文件:172.016.134.191.01152-209.196.044.172.06667、209.196.044.172.06667-172.016.134.191.01152和report.xml。我们先看一下report.xml这里提到了这两个文件的相关信息,可以看到如下图的内容,包括上述双方的ip地址,端口,mac地址,通信时间等等。 (II)查看209.196.044.172.06667-172.016.134.191.01152文件,找到访问209.196.44.172的主机数。相关指令有: cat 209.196.044.172.06667-172.016.134.191.01152 | grep "^:irc5.aol.com 353" | sed "s/^:irc5.aol.com 353 rgdiuggac @ #x[^x]*x ://g" | tr ' ' '\n' | tr -d "\15" | grep -v "^$" | sort -u | wc -l # 指令注释 首先这个指令肯定是管道连接的。 第一条是cat命令,连接209.输出文件; 第二条grep搜索获取昵称输出行; 第三条sed去除前缀,最后的g是全局的意思; 第四条tr将空格转换为换行; 第五条tr -d删除\r; 第六条grep -v就是NOT指令,去除空行; 第七条sort -u排序并去除重复; 最后一条wc -l输出行数。 看到输出,只统计出了5次结果,这个就很有问题了。通过与别人博客对比,正确的结果应该是有3457个主机访问了以209.196.44.172为服务器的僵尸网络。此处问题暂未解决,需要再行搜索。 针对(5),有 tcpdump -n -nn -r botnet_pcap_file 'dst host 172.16.134.191' | grep -v 'reply' | cut -d '.' -f 10 | cut -d ':' -f 1 | sort | uniq | more >1.txt; wc -l 1.txt # 指令注释 cut -d是指定字段的分隔符; uniq命令用于检查及删除文本文件中重复出现的行列,一般与sort命令结合使用。 tcpdump -n -nn -r botnet_pcap_file 'dst host 172.16.134.191' | awk -F " " '{print $3}' | cut -d '.' -f 1-4 | sort | uniq | more > 2.txt;wc -l 2.txt # 指令注释 awk -F就是指定分隔符,可指定一个或多个,print后面做字符串的拼接。 针对(6)和(7),有 (I)攻击了哪些安全漏洞首先要了解攻击了哪些端口,使用snort -r botnet_pcap_file -c /etc/snort/snort.conf -K ascii指令先查一下网络流分布情况。我们发现大部分都是TCP包,有一部分UDP包,所以我们首先应该筛选出响应的TCP端口和UDP端口。 (II)利用tcpdump -r botnet_pcap_file -nn 'src host 172.16.134.191' and tcp[tcpflags]== 0x12 | cut -d ' ' -f 3 | cut -d '.' -f 5 | sort | uniq指令筛选出蜜罐主机相应的TCP端口。输出可以看到TCP响应端口为135(rpc),139(netbios-ssn),25(smtp),445(smb),4899(radmin),80(http)。同样的,将指令协议部分改成udp就可以查询udp端口响应,我们能查到仅有137(netbios-ns)号端口响应。 接下来对上述端口进行分析,udp 137号端口是个在局域网中提供计算机的IP地址查询服务,处于自动开放状态,所以访问这个端口肯定就是NetBIOS查点。 (III)使用tcp.port == 25 && tcp.port == 135查看135号端口和25号端口,我们看到只是进行了连接,但是是没有数据的交互的,所以这攻击者可能是对这两个端口进行了 connect扫描。 (IV)接下来查看80端口,首先筛选tcp.dstport==80 && ip.dst == 172.16.134.191。第一个,首先连接最多的就是24.197.194.106,他的行为就是不停的用脚本在攻击IIS服务器的漏洞,从而获取系统权限,正是因为用的脚本,所以才会有这么多记录。 第二个,是68.169.174.108访问的80端口,属于正常的HTTP访问。最后还有一个192.130.71.66也是一个正常的访问。 第三个,是210.22.204.101访问的80端口,大量“C”表明攻击者是想通过缓冲区溢出攻击来获得一个命令行。 第四个,是218.25.147.83访问的80端口,大量“N”的出现,初步怀疑是缓冲区溢出攻击。但是继续往下看,你会看到c:\notworm,百度后发现是红色代码蠕虫攻击。 最后,查看80端口有没有攻击成功了,我们通过蜜罐主机80端口向外的流量进行分析,发现蜜罐主机做的几次回应均为一个iis服务器的默认页面,所以80端口的这些攻击均失败。 (V)接下来是TCP 139号端口,大部分都是连接的,但是很多空会话。同样这个也没有成功,这个应该是个SMB查点 (VI)下面分析与139端口关系极其密切的TCP 445端口。这个端口连接非常多,同时我们也能看到许多\samr, \srvsvc,查询字符串后很容易发现一个PSEXESVC.EXE字符串。同时你在Wireshark中也能找到,是由61.111.101.78发起的,通过对这种字符串的搜索,发现这是一种Dv1dr32蠕虫,这种蠕虫正是通过IRC进行通信。 那么我们怎么判断是不是攻击成功了呢?我们同样找出口流量,发现每个IP地址连入的连接都有响应的回应,并且返回信息中含有\PIPE\ntsvcs,通过搜索可知,这是一个远程调用,所以攻击者肯定是获得了权限,因此这个攻击成功的 (VII)最后还剩一个TCP 4899端口。只有一个IP访问过,即210.22.204.101。可以查得4899端口是一个远程控制软件radmin服务端监听端口,这个软件不是木马,应该是上面攻击成功后上载的这个软件方便控制。 3.学习中遇到的问题及解决 问题:注册表编辑器和自启动项位置未知。 解决方案:通过百度XP系统的注册表编辑器位置和自启动项的打开方式,问题解决。 4.学习感想和体会 这章的内容比较多,对于僵尸网络的攻击行为也比较复杂,需要进一步学习