实践八 恶意代码分析实践

1 实践内容

1.1 恶意代码基础知识

1.1.1 恶意代码简单介绍

定义:Malware is a set of instructions that run on your computer and make your system do something that an attacker wants it to do.

指令集合:二进制执行文件、脚本语言代码、宏代码、寄生在文件或者启动扇区的指令流。

目的:炫耀、远程控制被攻击主机、满足施跳板攻击或进一步传播恶意代码、窃取私人信息或机密信息、窃取计算存储带宽资源、拒绝服务等。

类型:分为计算机病毒、蠕虫、恶意移动代码、后门、特洛伊木马、僵尸程序、Rootkit等。这里就不具体讲各个的定义或者是什么了,下面具体分开具体讲。给出一个恶意代码的分类依据。

类别

实例

不感染的依附性恶意代码

特洛伊木马、逻辑炸弹

不感染的独立性恶意代码

点滴器、繁殖器

可感染的依附性恶意代码

病毒

可感染的独立性恶意代码

蠕虫

1.1.2 计算机病毒

定义:计算机病毒是一种能够自我复制的代码,通过将自身嵌入其他程序进行感染,而感染过程通常需要人工干预才能完成。这里必须记住:计算机病毒是借助人类帮助从一台计算机传至另一台计算机,这也是其传播机制。

特性:感染性(本质特性)、潜伏性、可触发性、破坏性、衍生性。

感染及引导机制:

  • 感染可执行文件(最为普遍的方式):前缀感染机制(病毒将自身复制到宿主程序的始端)、后缀感染机制(病毒将自身复制到宿主程序的末端)、插入感染机制(病毒在感染宿主程序时,病毒代码放在宿主程序的中间)
  • 感染引导扇区:通过BIOS定位磁盘的主引导区,运行存储的主引导记录,接着从分区表中找到第一个活动分区,读取并执行这个活动分区的分区引导记录,而分区引导记录负责装载操作系统。

 

  • 感染数据文件(支持宏的数据文件):将自身以宏指令的方式复制到数据文件中,当被感染的数据文件被应用程序打开时,将自动执行宏病毒体,完成病毒的引导。

1.1.3 网络蠕虫

定义:一种通过网络自主传播、自我复制的独立恶意代码。(从这里就可以看出病毒和蠕虫的区别)

传播机制:主动攻击网络服务漏洞、通过网络共享目录、通过邮件传播。

组成结构:

  • 弹头:利用目标系统安全漏洞入侵目标系统。包括缓冲区溢出攻击、破坏目标系统服务中的内存结构、文件共享攻击、利用电子邮件传播、利用其它普通的错误配置。这里其实就是我们之前说的渗透攻击模块。
  • 传播引擎:通过在目标系统上执行传播引擎指令,完成蠕虫样本的传播。方式有FTP/TFTP/HTTP/SMB/直接传送/单包等。
  • 目标选择算法和扫描引擎:一旦蠕虫在受害计算机中运行,目标选择算法开始寻找新的攻击目标,利用扫描引擎扫描每一个由目标选择算法确定的地址,确定其是否可以被攻击。包括电子邮件地址、主机列表、被信任的系统、网络邻居主机等。这里就是扫描策略。
  • 有效载荷:附加的攻击代码,执行一些特殊目地的操作。包括植入后门、安装分布式拒绝服务攻击代理、组建僵尸网络、执行一个复杂计算等。

1.1.4 后门与木马

后门定义:允许攻击者绕过系统常规安全控制机制的程序,按照攻击者自己的意图提供通道。

后门类型:本地特权提升、单个命令的远程执行、远程命令行解释访问器(NetCat)、远程控制GUI(VNCBO、冰河、灰鸽子)、无端口后门(ICMP后门,基于Sniffer非混杂模式或混杂模式的后门)

自启动后门:Windows通过修改自启动文件、注册表自启动项,Linux修改inittabrc.d/init.d文件。

木马定义:看起来具有某个有用或善意目的,但实际掩盖着一些隐藏恶意功能的程序。

木马的伪装技术:命名伪装、使用软件包装工具、攻击软件发布站点、代码下毒(开发者有意为之,后面的利益就不可知了)

1.1.5 僵尸程序与僵尸网络

僵尸程序定义:攻击者用于一对多控制目标主机的恶意代码。

僵尸网络定义:攻击者传播僵尸程序控制大量主机,并通过一对多的命令与控制信道所组成的网络。(注意仔细品味几种恶意程序的定义的黑体字,体会不同)

僵尸网络功能结构:主体功能分为命令控制模块和传播模块,辅助功能分为信息窃取模块、主机控制模块、下载更新模块、防分析检测模块。

僵尸网络类型:IRC僵尸网络(基于IRC互联网实时聊天协议构建)HTTP僵尸网络(Web网站方式构建)P2P僵尸网络(P2P协议构建)

IRC僵尸网络工作机制图:

1.1.6 Rootkit

定义:隐藏性恶意代码形态,通过修改现有的操作系统软件,使攻击者获得访问权并隐藏在计算机中。换句话说,就是root权限的kit工具包。

用户模式Rootkit:恶意修改操作系统在用户模式下的程序/代码,达到隐藏目的(木马化操作系统用户模式应用程序)。主要分为五种类型:提供后门访问的二进制替换程序、隐藏攻击者的二进制替换程序、用于隐藏但不替换的二进制程序、一些零散工具如网络嗅探器、安装脚本。

内核模式Rootkit:恶意修改操作系统内核,从而达到更深的隐藏和更强的隐蔽性(对内核组件的恶意修改和木马化)。主要有如下方式:文件和目录隐藏、进程隐藏、网络端口隐藏、混杂模式隐藏、改变执行方向、设备截取和控制。

Linux内核Rootkit:参考Linux Rootkit Learning,这篇博文讲的很好!。下图所示是利用LKM机制实现Linux内核模式RootkitLKM就是可装载内核模块。下图主要是通过insmod命令插入恶意内核模块,然后进行系统调用表的修改。

1.2 恶意代码分析技术

1.2.1 恶意代码分析基础

代码分析:按需求使用一定的规则、方法和工具对计算机程序进行分析,以推导出其程序结构、数据流程和程序行为的处理过程。

恶意代码分析的技术方法主要包括静态分析和动态分析两类。

分析良性代码与分析恶意代码的区别:

  • 不能提前知道恶意代码的目的。
  • 恶意代码具有恶意的攻击目的,会对所运行环境进行恶意破坏。
  • 恶意代码分析在绝大数情况下不会拥有待分析程序的源代码。
  • 恶意代码目前都会引入大量各种各样的对抗分析技术。

1.2.2 恶意代码分析环境

恶意代码发烧友的分析环境:

采用虚拟化技术构建恶意代码分析环境:这是一般情况下我们使用的环境。主要重点是在进行恶意代码分析时,一定要保证主机和虚拟机的隔离,防止主机收到伤害,同时最好让你的整个主机也隔离网络连接。

用于研究的恶意代码自动分析环境:专业人员使用的,分为静态分析机、动态分析机、网络分析机和综合分析机。

1.2.3 恶意代码静态分析

定义:通过反病毒引擎扫描识别已知的恶意代码家族和变种名,逆向分析恶意代码模块构成,内部数据结构,关键控制流程等,理解恶意代码的机理,并提取特征码用于检测。

恶意代码静态分析方法列表:后面会简单解释。这里同时提供一个博客主要是分析恶意代码分析实战。

分析方法

目的

使用工具

难度

反病毒软件扫描

标识已知恶意代码

反病毒引擎,VirusTotal

文件格式识别

确定攻击平台和类型

file,peid,FileAnalyzer

字符串提取

寻找恶意代码分析线索

strings

二进制结构分析

初步了解二进制文件结构

binutils (nm, objdump)

反汇编

二进制代码->汇编代码

IDA Pro,GDB,VC

中高

反编译

汇编代码->高级语言

REC,DCC,JAD

中高

代码结构与逻辑分析

分析二进制代码组,理解二进制代码逻辑结构

IDA Pro,Ollydbg

加壳识别和代码脱壳

识别是否加壳及类型、对抗代码混淆恢复原始代码

UPX,VMUnpacker,手工

反病毒软件扫描:使用反病毒软件对待分析样本进行扫描。主要有卡巴斯基、赛门铁克、瑞星、金山等。

文件格式识别:依靠专业工具如file(确定恶意代码目标平台和文件类型)peid(文件类型、编译链接器、是否加壳),FileAnalyzer(分析Win32平台窗口程序中包含的特殊文件)等进行识别分析。

字符串提取:主要提取的信息包括可能获得的有用信息、恶意代码实例名、帮助或命令行选项、用户会话、后门口令、相关URL信息和Email地址、库和函数调用。

二进制结构分析:nm指令在可执行文件中查找symbols重要元素。objdump主要功能有从可执行文件中限制不同类型的信息、编译器类型、代码段数据段位置、反汇编。

代码结构与逻辑分析:程序结构主要是了解Call Graph,即用户函数、系统函数和函数调用关系。分析系统函数调用列表可在高层分析二进制程序的行为逻辑。程序逻辑主要是了解程序控制流图(CFG)CFG完备地反映了一个程序的执行逻辑。

加壳识别和代码脱壳:包括四个方面:加密(固定加密/解密器)、多样性(多样化解密器)、多态(多态病毒能够通过随机变换解密器从而使得每次感染所生成的病毒实例都具有唯一性)、变形(直接在病毒体上加入各种代码混淆技术)

1.2.4 恶意代码动态分析

定义:通过在受控环境中执行目标代码,以获取目标代码的行为及运行结果。

恶意代码动态分析方法列表

分析方法

目的

使用工具

难度

快照比对

获取恶意代码行为结果

FileSnap,RegSnap,完美卸载

动态行为监控

实时监控恶意代码动态行为轨迹

Filemon,Regmon,Process Explorer,lsof

网络监控

分析恶意代码网络监听端口及发起网络会话

Fport, lsof,TDImon,ifconfig,tcpdump

沙盒

在受控环境下进行完整的恶意代码动态行为监控与分析

Norman Sandbox,CWSandbox,FVM Sandbox

中高

动态跟踪调试

单步调试恶意代码程序,理解程序结构和逻辑

Ollydbg,IDAPro,gdb,SoftICE,systrace

动态分析中的监视与控制:行为监视即一系列监控软件来控制和观察恶意代码的运行情况。网络控制即与业务网络和互联网保持物理隔离。

快照比对:分为四步:对"干净"资源列表做快照、运行恶意代码、对恶意代码运行后的"脏"资源列表做快照、对比"干净"和"脏"快照,获取恶意代码行为结果。

动态行为监控:包括Notification机制(Win32/Linux系统本身提供的行为通知机制)API Hooking技术(对系统调用或API调用进行劫持,监控行为)

网络监控:主要监控四个方面,包括恶意代码开放的本地端口、恶意代码发起的网络连接、控制恶意代码网络流和恶意代码流行攻击方式-ARP欺骗。

沙盒:沙盒技术用于安全运行程序的安全环境,经常被用于执行和分析非可信的代码。

动态跟踪调试:在程序的执行过程中进行二进制调试(Debugging)

2 实践过程

2.1 文件类型识别,脱壳与字符串提取

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

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

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

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

对于文件格式和运行平台,输入指令"file /home/kali/Desktop/RaDa.exe"。可以看到 RaDa.exe的运行环境为RaDa.exe: PE32 executable (GUI) Intel 80386, for MS Windows

对于获取加壳工具,使用程序PEiD.exe进行扫描。在扩展信息中可以看到加壳的工具为UPX 0.89.6 - 1.02 / 1.05 - 2.90 -> Markus & Laszlo

对于脱壳使用超级巡警脱壳机,GUI一键操作。

对于字符串提取,将上面脱壳之后的程序放到linux下,使用linux的缺省程序strings进行字符串提取,输入指令"strings /home/kali/Desktop/RaDa_1.exe"。可以看到有很多程序的交互字符串和程序的函数调用的函数名,其中还有这么一句话You can learn a lot playing funny security challenges

2.2 分析Crackme程序

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

首先输入指令"cd C:\Documents and Settings\Administrator\桌面"进入对应的路径。

crackme1.exe进行分析,可以发现,在接受一个参数6时,程序的输出"Pardon? What did you say?",其他的都是"I think you are missing something.",所以我们猜测该程序的输入为一个数。

接下来使用IDA Pro进行程序分析,通过Strings窗口可以查看该程序中出现的字符串。查看到该程序中出现的明文字符串,可以看到前面的两种输出信息,"I think you are missing something." "Pardon? What did you say?",还发现了"I know the secret"和"You know how to speak to programs, Mr. Reverse-Engineer"这两个字符串。有内容我们可以猜测,前者就是我们需要的口令,后者就是输入口令正确时程序的输出信息。

接下来看函数调用图(Function Call)可以发现:关键的部分在sub_401280这里,程序是使用strcmp函数来输入的,然后利用printfprint函数输出。

下面来看sub_401280cmp [ebp+arg_0],2为判断程序是否有两个参数。在C语言中,主函数通常为int main(int argc,const char **argv),即第一个参数argc对应argv的大小,第二个参数对应命令行的格式。如在命令行输入crackme1.exe 1,那么参数对应的值为argc=2,argv={"crackme1.exe","1"}

再往下看,可以看到其他几条口令。

猜测正确的口令应该是"I know the secret",输入命令运行改口令,可以得到这样一条回复"您知道如何与项目对话,逆向工程师先生",成功。

对程序crackme2.exe的分析过程与之类似,先打开Function call(函数调用图),发现关键的部分在sub_401280

下面来看sub_401280,内容与上一个文件基本一致,大致可以判断出关键口令为"I know the secret",只是从下图可以看到,代码逻辑中的程序名称改变了,因此需要对程序名称进行修改。

修改完后运行文件,输入指令"crackmeplease.exe "I know the secret"",发现回复为:"我有一个小小的秘密:巧克力",成功。

2.3 分析自制恶意代码样本rada

查看摘要和文件类型:md5sum RaDa.exe指令得到其md5摘要。利用file RaDa.exe识别出这是32GUI文件。

接下来使用IDARaDa_unpacked.exe进行分析(该程序在第一个实践中已经被脱壳了),进入Strings对话框,在菜单栏中的Edit中点击Setup,设置类型为Unicode

查看命令行参数,可以看到作者。

找到一个IP地址"10.10.10.10",得到RaDa_commands.html,可以从上图中画红色圈圈的地方看到其对应的函数为sub_404FB0

进入这个函数,看黄色部分的汇编代码,可以看到其被参数40C030替换,找到该位置,看到该参数对应的函数是sub_4052C0

搜索4052C0,打开其Call Graph查看。这里我们看到三个私有网段分别为192.168.172.16.10.先确保服务器在私有网段中,然后到服务器去取命令文件。

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

文件的摘要是caaa6985a43225a0b3add54f44a0d4c7,这是一个PE可执行文件,同时也是一个UPX加壳文件。

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

这个二进制文件是一个后门程序,攻击者可以利用其完全控制该系统。

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

它会自动安装到C盘中,并修改注册表跟随系统开机启动:访问http://10.10.10.10/Rada/Rada_command.html,还可以解析指令并执行指令。

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

UPX加壳技术。

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

不具有传播和感染的性质,故不属于病毒和蠕虫,同时也未将自己伪装成良性程序以,不是特洛伊木马,排除各种可能后这应该是一个后门程序。

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

木马Bobax、海阳顶端、木马Setiri等。

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

2004年,由Raul silesDavid Perze二人编写。

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

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

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

因特网中继聊天(Internet Relay Chat),简称IRCIRC的工作原理非常简单,只需要在自己的PC上运行客户端软件,然后通过因特网以IRC协议连接到一台IRC服务器上即可。IRC特点是通过服务器中继与其他连接到这一服务器上的用户交流。

注册时需要发送的消息有三种,分别是口令,昵称和用户信息

IRC服务器明文传输通常在 6667 端口监听,也会使用 66606669 端口。SSL加密传输在 6697 端口。

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

僵尸网络是指攻击者(称为botmaster)出于恶意目的,传播僵尸程序控制大量主机,并通过一对多的命令与控制信道所组成的网络。

僵尸网络主要用于:发动DDOS攻击、发送垃圾邮件、监听用户敏感信息、记录键盘输入信息、扩散新的恶意软件和伪造点击量,骗取奖金或操控网上投票和游戏,同时黑客控制的这些计算机所保存的信息也都可被黑客随意"取用"。

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

通过Wireshark打开数据文件,并设置过滤条件为"ip.src == 172.16.134.191 && tcp.dstport == 6667",因为我们知道 IRC 服务通过6667端口,可以找到所有与蜜罐主机进行通信的IRC服务器:分别为209.126.161.29,66.33.65.5863.241.174.144217.199.175.10209.196.44.172

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

首先安装,输入指令"sudo apt-get install tcpflow",然后输入指令"tcpflow -r botnet_pcap_file.dat 'host 209.196.44.172 and port 6667'"获取209.196.44.172172.016.134.191之间的所有的IRC数据包,得三个文件,172.016.134.191.01152-209.196.044.172.06667209.196.044.172.06667-172.016.134.191.01152report.xmlreport.xml

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

输入指令"tcpdump -n -nn -r botnet_pcap_file.dat '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"查找总共148个端口并输出到1.txt

其中:

tcpdump -nn 指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示;

grep -v:排除指定字符串;

cut -d '.' -f 10:截取以'.'为分隔符的第 10 列;

uniq命令用于检查及删除文本文件中重复出现的行列;

wc -l 用于统计文件的行数

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

输入指令"snort -r botnet_pcap_file.dat -c /etc/snort/snort.conf -K ascii"查看网络流分布情况。大部分都是TCP包,所以我们首先应该筛选出响应的TCP端口。

输入指令"tcpdump -r 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",筛选出蜜罐主机相应的TCP端口。

wireshark打开文件botnet_pcap_file.dat,分析端口,设置过滤条件为"tcp.dstport==80 && ip.dst == 172.16.134.191"进行筛选,这些是目标地址为172.16.134.191、目标端口为80的数据包。

80端口下一个ip地址218.25.147.83,在tcp流中看到c:\notworm(蠕虫攻击)

设置过滤条件为"tcp.dstport==445 && ip.dst == 172.16.134.191"查看TCP 445号端口,发现一个PSEXESVC.EXE字符串,是由61.111.101.78发起的,搜索这个字符串,这是一个类似于telnet的远程控制程序,某些反病毒扫描程序会报告其中的一个或多个工具感染了"远程管理"病毒。这些 PsTools 都不带病毒,但是如果病毒使用了这些工具,则它们可能触发病毒通知。

通过字符串信息可以知道主机210.22.204.101对蜜罐使用了LAN Manager口令猜测,并且成功攻击。

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

通过上面的分析可知,成功的攻击发起者是218.25.147.83(蠕虫攻击) 61.111.101.78( LAN Manager 口令猜测)

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

tcpflow分流的编码,kali下用grep无法识别。

进入某个路径的指令是"cd C:\....."进入对应的路径。

4 学习感想和体会

通过本次实验,我学习到了的基本原理和方法。本章作业知识点涉及面广,前两个实践内容难度是适中,后两个实践的分析较难。需要花费很长时间完成。让我更熟悉使用了各种恶意代码分析工具,对各种报文的过滤方法进一步掌握。提高了从繁杂的信息中获取有用信息的能力。也提高的自我学习的能力,让我受益匪浅。

posted @ 2022-05-06 22:50  戈壁胡杨  阅读(810)  评论(0编辑  收藏  举报