1、实践内容

1.1恶意代码(Malware,或Malicious Code)指的是使计算机按照攻击者的意图执行以达到恶意目标的指令集。 恶意代码可以根据其执行方式、传播方式利对攻击目标的影响分为计算机病毒、蠕虫、 恶意移动代码、特洛伊本马、后门、僵尸程序、内核套件等。

反病毒业界普遍釆用“三元组命名”规则来对所发现的恶意代码新样本来进行命名,一般形式为:

[恶意代码类型.]恶意代码家族名称[.变种号]

1.2计算机病毒

“计算机病毒是指编制或者在计算机程序中插入的,破坏计算机功能或数据、影响计算机使用,并能自我复制的一组计算机指令或者程序代码”。不论如何定义计算机病毒,他都有这几个特点:感染性、潜伏性、可触发性、破坏性、衍生性。

计算机病毒潜在的感染目标可分为三大类:

(1)可执行文件:前缀感染机制(加到宿主程序的开始)、后缀感染机制(加到宿主程序的结尾,使用跳转指针先运行病毒)和插入感染机制(加到宿主程序的中间,找好位置很关键),三种感染机制,都必须在宿主程序运行前抢先获得控制权。

(2)引导扇区:病毒感染引导区,在系统启动前,先获得控制权

(3)支持宏指令:病毒一宏指令的方式复制到数据文件中,当某个软件执行该数据文件时,会先执行病毒。

病毒的一大特点是传播,病毒的传播一般要借助人的力量,如附着在移动存储、电子邮件及下载、共享目录,当人们互相使用这些软硬件的时候,病毒就得以传播。

1.3网络蠕虫

网络蠕虫(Worm)是一种通过网络自主传播的恶意代码,这是一种可以自我复制的代码,并且通过网络传播,通常无须人为干预就能传播。如果没有外界干扰,蠕虫会一直对脆弱的系统进行感染,传播速度可能是指数形式,对互联网的危害十分巨大。

网络蠕虫的基本特性是通过网络的自主传播,利用目标系统上存在的安全缺陷,进而用一种自动的方法来占据目标主机。这也是和计算机病毒最大的区别之处。

1.4后门与木马

后门和木马是两个概念,但通常结合在一起使用,后门是允许攻击者绕过系统常规安全控制机制的程序,能够按照攻击者自己的意图提供访问通道,木马则是指一类看起来具有某个有用或善意目的,但实际掩盖着一些隐藏恶意功能的程序。

后门能够为攻击者提供多种不同类型的访问通道:本地权限提升和本地账号、单个命令的远程执行、远程命令行解释器访问、无端口后门、远程控制GUI。Windows系统中,后门工具可以利用自启动文件夹、注册表自启动项及预定计划任务来自启动。后门工具进入自启动文件夹后,系统启动后会自动启动自启动文件夹,后门工具也就捎带着启动了。

特洛伊木马通过使自己看起来像是正常的有用的软件,越过防火墙进入到系统。常用的手段是欺骗用户或系统管理员安装特洛伊木马程序,例如攻击者攻击软件发布站点,是软件带有恶意代码,下载软件的人察觉不到,就在安装软件时也安装了恶意代码。

1.5僵尸程序与僵尸网络

僵尸程序具有蠕虫、特洛伊木马、后门三者的特征,担忧与三种有着显著的区别,僵尸程序会使用“弹头”获得主机的控制权并通过网络进行传播,为了隐藏自己会采用一些伪装和欺骗机制,可以为攻击者提供对受害主机的远程控制。僵尸程序的结构图如下,其中命令与控制模块是核心,传播模块将僵尸程序传播到不同的主机上。

python编写恶意代码 恶意代码如何命名_字符串


1.6Rootkit

Rootkit,它能够通过控制目标计算机操作系统的关键组件,来为攻击者提供强有力的手段,用来获取访问并隐藏在系统中。Rootkit具有特洛伊木马和后门的特性。但其定义特点在于通过替换或修改现有操作系统软件进行隐蔵。

根据操作系统的分层,Rootkit可以运行在两个不同的层次上,即用户模式和内核模式。

UNIX用户模式Rootkit中集成的工具类型:提供后门访问的二进制替换程序、隐藏攻击者的二进制替换程序、用于隐藏但不替换的二进制程序、零散工具(嗅探)、安装脚本、

Windows的用户模式Rootkit:将恶意代码通过开发接口插入插入到现有的Windows函数之间、使WFP功能失效再修改获替换系统程序、使用DLL注入和API挂钩 技术把恶意代码直接加入运行进程的内存空间中。

内核模式Rootkit,控制力更强,更难以发现,采样的技术手段:文件和目录隐藏、进程隐藏、网络端口隐藏、混杂模式隐藏、改变执行方向、设备截取和控制。

1.7恶意代码分析环境

基于前面对恶意代码的各种介绍,恶意代码的分析一定要有一个封闭,可控的环境,简单的原因就是若是恶意代码运行起来了,可以控制环境来控制恶意代码,且恶意代码不会影响到环境外的主机。

恶意代码分析爱好者可以用很低的成本搭建一个分析环境,淘几台旧电脑、找一个集线器链接几台电脑,在电脑上安装用于安全保护的软件、代码分析的软件,一个简单的分析环境就有了。

当然在科技发达的今天,我们可以利用虚拟化技术在电脑上安装几台虚拟机,这下连电脑都不用买了,但是安装虚拟机的电脑性能还是要好一点,而且在分析恶意代码时,宿主机最好不要有什么网络业务,也最好将宿主机的网卡与虚拟机网卡隔离开。

2、实践过程

动手实践任务一

对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下:

(1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具;

(2)使用超级巡警脱壳机等脱壳软件,对rada恶意代码样本进行脱壳处理;

(3)使用字符串提取工具,对脱壳后的rada恶意代码样本进行分析,从中发现rada恶意代码的编写作者是谁?

实验环境:WinXP Attacker虚拟机

首先利用file RaDa.exe命令查看RaDa.exe的文件类型,可知这是一个32位Windows PE可执行文件,并且有图形化窗口。

python编写恶意代码 恶意代码如何命名_僵尸网络_02


下面来看看有没有加壳,下面使用PEiD工具(查壳)来查看加壳的类型。在这里我们可以看到这个是一个版本为0.89.6的UPX壳(压缩壳,更多内容参考UPX壳分析)。还可以看到文件的入口点、EP段、偏移、文件类型等信息

python编写恶意代码 恶意代码如何命名_僵尸网络_03


如图用strings RaDa.exe查看RaDa.exe中可打印字符串

python编写恶意代码 恶意代码如何命名_字符串_04


使用实验工具平台提供的超级巡警自动脱壳即可实现程序脱壳,并在恶意程序同目录下生成了一个脱壳以后的程序,然后使用strings RaDa_unpacked.exe查看,发现脱壳成功

python编写恶意代码 恶意代码如何命名_服务器_05


python编写恶意代码 恶意代码如何命名_字符串_06


再次使用PEiD工具来查看脱壳后的程序,可以看到编写该程序所使用的语言和开发工具为VB6.0

python编写恶意代码 恶意代码如何命名_服务器_07


进一步使用IDA分析,打开脱壳文件后如下图所示:

python编写恶意代码 恶意代码如何命名_服务器_08


动手实践任务二:分析Crackme程序

任务:在WinXP Attacker虚拟机中使用IDA Pro静态或动态分析crackme1.exe和crackme2.exe,寻找特定的输入,使其能够输出成功信息。

实验环境:WinXP Attacker虚拟机

分析crackme1.exe

首先使用file命令来分析该恶意程序的大概信息,切换到恶意程序所在目录,分别执行file crackme1.exefile crackme2.exe来查看两个文件信息,两个文件均为windows系统下运行的32位可执行程序,且没有图形界面,仅使用控制台操作

python编写恶意代码 恶意代码如何命名_字符串_09


题目要求寻找特定输入,使其能够输出成功,那么也就是提示了我们这俩程序是有输入值得,但是不知道有几个输入值和输入值的数据类型,我们开始一个一个尝试,分别尝试了输入一个整数,两个整数,一个字符串,多个字符串和数字;观察其输出,只有两种,当输入为一个值时,输入是一样的,当输入多个值时(2个3个...个)输出反馈是一致的,可以断定该程序的输入为一个参数,但是不清楚输入值数据类型为字符还是数字。

python编写恶意代码 恶意代码如何命名_服务器_10


接下来用IDA打开该恶意程序进行分析,分析该恶意程序字符串信息,可以看出来除了上面输出反馈的两句话,还有另外两句,但是当我们输入参数时,一直不显示,此外,可以看到有“GCC”,说明该恶意程序是用C语言编写的。

python编写恶意代码 恶意代码如何命名_服务器_11


【View->Graphs->Function call】查看函数调用图,查找字符串操作相关的函数,发现了strcmp,用来匹配字符串进行密码的匹配。那么调用其的程序段401280就尤其重要。

python编写恶意代码 恶意代码如何命名_服务器_12


打开此程序,【View->Graphs->Flow chart】查看汇编代码

python编写恶意代码 恶意代码如何命名_python编写恶意代码_13


猜测如下:

python编写恶意代码 恶意代码如何命名_字符串_14


在命令行中进行验证。注意在输入密码时要加双引号。I know the secret为密码,You know how to speak programs,Mr.Reverse-Engineer为输入正确的输出。

python编写恶意代码 恶意代码如何命名_僵尸网络_15


分析crackme2.exe

同样的,先对参数进行一下猜测。也是一位,并且初步判定也是一个身份认证功能。

python编写恶意代码 恶意代码如何命名_字符串_16


来利用IDA Pro打开这个程序分析。

查看程序中的明文字符串,前五项中,I think you are missing something和I have a identity problem已经见过。然后对这五项对应的具体功能就行探究。

python编写恶意代码 恶意代码如何命名_字符串_17


【View->Graphs->Function call】查看函数调用图,查找字符串操作、输出的相关的函数,发现了strcmp等函数,用来匹配字符串进行密码的匹配。那么调用其的程序段401280就尤其重要。

python编写恶意代码 恶意代码如何命名_python编写恶意代码_18


猜测如下

python编写恶意代码 恶意代码如何命名_字符串_19


可能是密码输出错误

接下来进行验证。所有验证通过后得到非明文的输出。

python编写恶意代码 恶意代码如何命名_python编写恶意代码_20


分析实践任务一:

分析一个自制恶意代码样本rada,并撰写报告,回答以下问题:

1、提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息;

2、找出并解释这个二进制文件的目的;

3、识别并说明这个二进制文件所具有的不同特性;

4、识别并解释这个二进制文件中所采用的防止被分析或逆向工程的技术;

5、对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由;

6、给出过去已有的具有相似功能的其他工具;

7、可能调查处这个二进制文件的开发作者吗?如果可以,在什么样的环境和什么样的限定条件下?

使用MD5对该恶意程序进行摘要信息分析md5sum Rada.exe。执行file RaDa.exe分析该恶意程序的运行环境。

python编写恶意代码 恶意代码如何命名_服务器_21


打开process explorer 和wireshark,点击运行恶意程序脱壳后的RaDa.exe。

在process explorer 中,查看strings进行分析。

该使用http连接到目标为10.10.10.10的主机下的一个名为RaDa_commands的网页上,然后下载上传文件,并且在靶机上创建一个文件夹“C:/RaDa/tmp”来保存其下载的文件。

该恶意程序中可执行DDos拒绝服务攻击。

python编写恶意代码 恶意代码如何命名_字符串_22


该恶意程序对主机注册表进行了读写和删除操作

python编写恶意代码 恶意代码如何命名_字符串_23


应该是指令的字符

python编写恶意代码 恶意代码如何命名_python编写恶意代码_24


发现了一条和数据库查询语句相关的信息

python编写恶意代码 恶意代码如何命名_僵尸网络_25


接下来看在Wireshark中捕获的包。

在以上分析中发现了IP10.10.10.10,那么使用过滤器ip.src == 10.10.10.10 or ip.dst == 10.10.10.10。追踪数据流没有发现有用信息。

现在可以回答以上问题。

1.这个二进制文件摘要信息:md5摘要值为caaa6985a43225a0b3add54f44a0d4c7,为32位PE GUI可执行程序,同时使用一个UPX加壳。

2.恶意文件的目的:就是一个http后门程序,当连接上互联网时,该程序就会通过http请求连接到指定主机,攻击者可以完全控制该系统。

3.所具有的不同特性:该程序运行后会在C盘下创建了一个RaDa目录,里面包含bin和tmp文件夹,tmp前面分析过是用来临时存储从目标主机下载到受害主机的文件和从受害主机获取的文件信息,在bin文件夹发中有一个RaDa.exe可执行文件,运行时没有任何提醒信息,具有隐蔽性。

4.所采用的防止被分析或逆向工程的技术:使用了UPX加壳。

5.对恶意代码样本进行分类:本恶意程序为后门程序。该程序执行需要通过攻击者远程发送指令且该程序没有自我复制和传播,也没有将伪装成其他程序。

6.给出过去已有的具有相似功能的其他工具:木马Bobax,Setiri,使用HTTP协议从指定的服务器下载命令文件,然后解析并执行其中的指令。

7.可能调查出这个二进制文件的开发作者吗?如果可以,在什么样的环境和什么样的限定条件下?

可以,使用监视工具分析该恶意程序。

分析实践任务二:

Windows 2000系统被攻破并加入僵尸网络

任务:分析的数据源是用Snort工具收集的蜜罐主机5天的网络数据源,并通过编辑去除了一些不相关的流量并将其组合到了单独的一个二进制网络日志文件中,同时IP地址和其他特定敏感信息都已经被混淆以隐藏蜜罐主机的实际身份和位置。回答下列问题:

1、IRC是什么?当IRC客户端申请加入一个IRC网络时将发送那个消息?IRC一般使用那些TCP端口?

因特网中继聊天(Internet Relay Chat),一般称为互联网中继聊天,简称为IRC。IRC的工作原理非常简单,您只要在自己的PC上运行客户端软件,然后通过因特网以IRC协议连接到一台IRC服务器上即可。IRC上的信息交流采用请求与应答的模式. 请求是由服务器或客户端发出的,其目的是请求(另)一个服务器执行某个操作或提供某些信息; 应答是服务器对一个请求的回应信息。注册时需要发送的消息有三种,分别是口令USER ,昵称PASS 和用户信息NICK 。注册完成后,客户端就使用JOIN信息JOIN 来加入频道。IRC服务器明文传输通常在6667端口,SSL加密传输在6697端口。

2、僵尸网络是什么?僵尸网络通常用于什么?

僵尸网络是采用一种或多种传播手段,将大量主机感染bot程序(僵尸程序),从而在控制者和被感染主机之间所形成的一个可一对多控制的网络。僵尸程序可以是一种木马、病毒、蠕虫等等,黑客利用某些用户主机的系统漏洞、发送钓鱼邮件或者社工等手段抓取了一定数量的肉鸡后,就对肉鸡们植入僵尸程序,这样僵尸网络就慢慢组成了。组成的僵尸网络可以用来当做二级服务器进行病毒样本的散播,也可以用来进行一些DDoS攻击、CC攻击等一些需要大量服务器进行的大规模分布式攻击。

3、蜜罐主机(IP地址:172.16.134.191)与那些IRC服务器进行了通信?

使用自己电脑的Wireshark打开数据文件(老师在群里发的),已知IRC通过6667端口,则设置过滤条件ip.src == 172.16.134.191 && tcp.dstport == 6667。

python编写恶意代码 恶意代码如何命名_僵尸网络_26


观察到共五个IRC服务器,如下

209.126.161.29

66.33.65.58

63.241.174.144

217.199.175.10

209.196.44.172

4、在这段观察期间,多少不同的主机访问了以209.196.44.172为服务器的僵尸网络?

输入tcpflow -r /home/kali/Desktop/botnet_pcap_file.dat "host 209.196.44.172 and port 6667"

python编写恶意代码 恶意代码如何命名_服务器_27


分流得到两个分流后的数据文件。172.016.134.191.01152-209.196.044.172和209.196.044.172.06667-172.016.134.191和一份报告report.xml。

python编写恶意代码 恶意代码如何命名_python编写恶意代码_28


输入cat 209.196.044.172.06667-172.016.134.191.01152 | grep -a "^: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

python编写恶意代码 恶意代码如何命名_python编写恶意代码_29


5、那些IP地址被用于攻击蜜罐主机?

输入tcpdump -n -nn -r /home/kali/Desktop/botnet_pcap_file.dat 'dst host 172.016.134.191' | grep -v 'reply' | cut -d '.' -f 10 | cut -d ':' -f 1 | sort | uniq | more >1.txt; wc -l 1.txt共有148个。

python编写恶意代码 恶意代码如何命名_python编写恶意代码_30


python编写恶意代码 恶意代码如何命名_服务器_31


输入 tcpdump -n -nn -r /home/kali/Desktop/botnet_pcap_file.dat 'dst host 172.16.134.191' | awk -F " " '{print $3}' | cut -d '.' -f 1-4 | sort | uniq | more > 2.txt;wc -l 2.txt 共有165个。

python编写恶意代码 恶意代码如何命名_僵尸网络_32


python编写恶意代码 恶意代码如何命名_python编写恶意代码_33


6、攻击者尝试攻击了那些安全漏洞?

使用Tcpdump工具筛选出蜜罐主机有哪些端口是响应的。输入命令tcpdump -r /home/kali/Desktop/botnet_pcap_file.dat -nn 'src host 172.16.134.191' and tcp[tcpflags]== 0x12 | cut -d ' ' -f 3 | cut -d '.' -f 5 | sort | uniq

python编写恶意代码 恶意代码如何命名_服务器_34


可以看到有135、139、25、445、4899、80。使用wireshark筛选出源地址为172.16.134.191,tcp端口为135、139、25、445、4899、80的数据包,一次分析。

端口135、139、25上虽有很多数据包但是没有什么数据传输,多为在建立连接,可能是在查点或者扫描。

python编写恶意代码 恶意代码如何命名_僵尸网络_35


端口80上的数据包比较复杂,其中210.22.204.101发送了三个很大的的数据包,大概是在做缓冲区溢出攻击。

python编写恶意代码 恶意代码如何命名_字符串_36


此外在80端口上,还发现24.197.194.106发送的消息包好像已经进入了主机,使用了cmd.exe,可能正在输入什么命令获得蜜罐的机密消息。

python编写恶意代码 恶意代码如何命名_僵尸网络_37


端口445上的数据包即发现了,61.111.101.78向蜜罐放了PSEXESVC.EXE,这是一种蠕虫病毒的特征码,攻击者对系统注入了蠕虫病毒并成功获取了远程调用。

python编写恶意代码 恶意代码如何命名_python编写恶意代码_38


7、那些攻击成功了?是如何成功的?

详见第六问的分析。

3、学习中遇到的问题及解决

问题1:在kali进行“多少不同的主机访问了以209.196.44.172为服务器的僵尸网络。”这个任务时,kali一直不能显示数据。百度之后找到了解决办法。

解决1:

python编写恶意代码 恶意代码如何命名_字符串_39


4、实践总结