20199301 2019-2020-2 《网络攻防实践》 第九周作业
第九章 恶意代码安全攻防
一、实践内容
恶意代码基础知识
恶意代码定义与分类
-
恶意代码定义
- 恶意代码 (Malware,或 Malicious Code) 指的是使计算机按照攻击者的意图执行以达到恶意目标的指令集。
-
恶意代码类型
- 恶意代码可以根据其执行方式、传播方式和对攻击目标的影响分为计算机病毒、蠕虫、恶意移动代码、特洛伊木马、后门、僵尸程序、内核套件等。
- 恶意代码可以根据其执行方式、传播方式和对攻击目标的影响分为计算机病毒、蠕虫、恶意移动代码、特洛伊木马、后门、僵尸程序、内核套件等。
-
计算机病毒:一种能够自我复制的代码,通过嵌入其他程序进行感染,需要人工干预传播
-
蠕虫:与计算机病毒相比,不需要嵌入其他宿主程序中,可以自主运行
-
恶意移动代码:可以自动从远程主机下载并在本地执行的轻量级程序,常在web端实现
-
后门:可以绕开正常的安全控制机制,为攻击者提供访问的代码
-
特洛伊木马:伪装成有用软件,但是内含恶意目标的恶意代码
-
僵尸网络:使用僵尸程序构建的执行一对多命令的攻击网络。
-
内核套件:用以获取并保持最高控制权的一类恶意代码。
-
恶意代码的命名规则与分类体系
- 反病毒业界普遍采用 “ 三元组命名 ” 规则来对所发现的恶意代码新样本来进行命名,这里的“ 三元组” 是指恶意代码的类型、家族名称和变种号,一般形式为:[恶意代码类型]恶意代码家族名称[变种号]。各种形态的恶意代码在各个关键技术环节上都有帮其明确的定义特性,下图给出了一个基于多维度标签的恶意代码技术形态分类方法的示意,即在恶意代码工作机理中最为核心的传播、控制、隐藏和攻击这些关键技术环节中,有着一些具有特异性的特性,可以通过为恶意代码样本添加技术环节维度上的分类标签, 从而标识出该样本所具有的一种或多种特性。
- 反病毒业界普遍采用 “ 三元组命名 ” 规则来对所发现的恶意代码新样本来进行命名,这里的“ 三元组” 是指恶意代码的类型、家族名称和变种号,一般形式为:[恶意代码类型]恶意代码家族名称[变种号]。各种形态的恶意代码在各个关键技术环节上都有帮其明确的定义特性,下图给出了一个基于多维度标签的恶意代码技术形态分类方法的示意,即在恶意代码工作机理中最为核心的传播、控制、隐藏和攻击这些关键技术环节中,有着一些具有特异性的特性,可以通过为恶意代码样本添加技术环节维度上的分类标签, 从而标识出该样本所具有的一种或多种特性。
恶意代码发展史
- 恶意代码发展趋势
- 恶意代码的复杂度和破坏力逐渐增强;
- 恶意代码技术的创新越来越频繁;
- 关注重点从计算机病毒转移到蠕虫和内核级攻击工具。
计算机病毒
-
计算机病毒基本特性
- 感染性;
- 潜伏性;
- 可触发性;
- 破坏性;
- 衍生性。
-
计算机病毒的感染和引导机制:
- 感染可执行文件,分为三种感染方式:前缀感染机制、后缀感染机制和中间插入感染机制。其中,前缀感染机制是病毒将自身复制到宿主程序的开始;后缀感染机制是病毒将自身复制到宿主程序的结尾;中间插入感染机制是将病毒代码放置到宿主程序中间,这样使得病毒更加隐蔽但是编写难度较大。具体情况如下图所示
- 引导扇区感染机制,在系统启动的过程中,BIOS初始化数据,拉取磁盘主引导区的数据,主引导区拉取分区引导纪录,最后从引导分区中获得操作系统的地址,启动操作系统。将病毒植入引导区,就可以在系统启动之前获取系统控制权。
- 支持宏指令的数据文件,现行的一些数据文件允许在读取的时候进行一些数据的修改指令,由此数据文件也具有代码的执行权限,可作为被感染的文件。
网络蠕虫
-
网络蠕虫的基本特性:
- 可以通过网络进行自主传播,一般来说不需要用户交互;
- 不需要寄生宿主,自己就是一个可执行的程序;
- 直接通过网络传播,包括内网传播和互联网传播。
-
网络蠕虫的组成结构:
- 弹头主要用于进行渗透攻击,主要包含:缓冲区溢出攻击、共享文件攻击、利用电子邮件传播和其他普遍配置错误等等方式;
- 传播引擎主要是获取到目标系统的访问权限之后,蠕虫自身进行传输到目标系统的工具;3
- 目标选择算法和扫描引擎主要用于找寻新的攻击目标,确定是否可以被攻击,主要包括:电子邮件地址、主机列表、被信任的系统、网络邻居主机、域名服务和通过特定规则任意选择目标IP。
- 有效载荷主要是在攻击成功之后,进行一些特殊的操作,例如:植入后门、安装分布式拒绝服务攻击服务器和组建僵尸网络。
后门与木马
-
后门定义:
- 允许攻击者绕过系统常规安全控制机制的程序,按照攻击者自己的意图提供通道。
-
后门类型:
- 本地特权提升、单个命令的远程执行、远程命令行解释访问器(NetCat)、远程控制GUI(VNC、BO、冰河、灰鸽子)、无端口后门(ICMP后门,基于Sniffer非混杂模式或混杂模式的后门)。
-
自启动后门:
- Windows通过修改自启动文件、注册表自启动项,Linux修改inittab、rc.d/init.d文件。
-
木马定义:
- 看起来具有某个有用或善意目的,但实际掩盖着一些隐藏恶意功能的程序。
-
木马的伪装技术:
- 命名伪装、使用软件包装工具、攻击软件发布站点、代码下毒(开发者有意为之,后面的利益就不可知了)。
僵尸程序与僵尸网络
-
定义
- 僵尸网络是在网络蠕虫、特洛伊木马、后门工具等传统恶意代码形态的基础上发展融合而产生的一种新型攻击方式。僵尸程序为了隐藏自身在受害主机上的存在,会采用一些伪装和欺骗机制,此时也具有特洛伊木马特性,但这并非僵尸程序必有的特征,与后门工具相似,僵尸程序也会为攻击者提供对受害主机的远程控制。
-
僵尸网络演化过程
-
僵尸网络功能结构:
- 主体功能分为命令控制模块和传播模块,辅助功能分为信息窃取模块、主机控制模块、下载更新模块、防分析检测模块。
- 主体功能分为命令控制模块和传播模块,辅助功能分为信息窃取模块、主机控制模块、下载更新模块、防分析检测模块。
Rootkit
-
定义:
- 隐藏性恶意代码形态,通过修改现有的操作系统软件,使攻击者获得访问权并隐藏在计算机中。换句话说,就是root权限的kit工具包。
-
Rookit分类:Rookit是一种具有替换或修改现有操作系统软件进行隐藏的特性的程序。主要分为:
- 应用程序级木马后门;
- 用户模式Rookit;
- 内核模式Rookit;
- 虚拟机模式Rookit。
-
用户模式Rootkit:
- 大部分 UNIX 用户模式 Rootkit 中集成的工具可以被分为如下五种不同的类型,包括提供后门访问的二进制替换程序、隐藏攻击者的二进制替换程序、用于隐藏但不替换的二进制程序、一些零散工具如网络嗅探器、安装脚本;在 Windows 平台上, 实现用户模式 Rootkit 主要有如三种不同技术
-
内核模式Rootkit:
- 恶意修改操作系统内核,从而达到更深的隐藏和更强的隐蔽性(对内核组件的恶意修改和木马化)。主要有如下方式:文件和目录隐藏、进程隐藏、网络端口隐藏、混杂模式隐藏、改变执行方向、设备截取和控制。
-
Linux 内核模式 Rootkit
恶意代码分析方法
恶意代码分析技术概述
-
代码分析:
- 是按需求使用一定的规则、方法和工具对计算机程序进行分析,以推导出其程序的结构、数据流程和程序行为的处理过程。程序分析技术在程序理解、程序测试、程序优化和程序重构等方面都有着重要的应用。
-
恶意代码分析技术主要问题:
- 不能事先知道恶意代码的目的是什么;
- 恶意代码具有恶意的攻击目的;
- 恶意代码在绝大多数时候不会具有原代码;
- 恶意代码会引入大量的对抗分析技术。
恶意代码分析环境
-
恶意代码发烧友的分析环境
-
基于虚拟化构建恶意代码分析环境
恶意代码静态分析技术
-
反病毒软件扫描:
- 使用现成的反病毒软件来扫描待分析的样本, 以确定反病毒软件是否能够识别该样本, 以及所识别的类型、家族、变种等信息。
-
文件格式识别:
- 恶意代码通常是以二进制可执行文件格式存在的,其他的存在形式还包括脚本文件、带有宏指令的数据文件、压缩文件等。文件格式识别能够让我们快速地了解待分析样本的文件格式。在Windows 平台上, 二进制可执行文件E XE 和DLL 都是以 PE 文件格式组织的,而在 Linux 平台上,可执行文件格式则是 ELF 。
-
字符串提取分析:
- 主要提取的信息包括可能获得的有用信息、恶意代码实例名、帮助或命令行选项、用户会话、后门口令、相关URL信息和Email地址、库和函数调用。
-
二进制结构分析:
- nm 指令在可执行文件中查找 symbols 重要元素。objdump 主要功能有从可执行文件中限制不同类型的信息、编译器类型、代码段数据段位置、反汇编
-
反汇编(Disassemble)与反编译(Decompile):
- 反汇编与反编译是对二进制程序编译链接的逆过程,反汇编是把二进制程序的目标代码从二进制机器指令码转换为汇编代码的处理过程,而反编译则更进一步,期望将汇编代码再进一步还原成高级编程语言形式的源代码。
-
代码结构与逻辑分析:
- 程序结构主要是了解 Call Graph,即用户函数、系统函数和函数调用关系。分析系统函数调用列表可在高层分析二进制程序的行为逻辑。程序逻辑主要是了解程序控制流图(CFG),CFG完备地反映了一个程序的执行逻辑。
-
加壳识别与代码脱壳:
- 恶意代码通常使用的加壳混淆机制包括加密、多样性、多态和变形等,加密机制(Encryption)一般采用固定的代码加密器来对一进制程序进行处理,以改变代码的存在形态。
恶意代码动态分析技术
-
基于快照比对的方法和工具:
- 针对恶意代码动态分析的快照比对方法是首先对原始的“ 干净" 的系统资源列表做一个快照,然后激活恶意代码并给予充分的运行时间, 如5分钟,之后我们再对恶意代码运行后“ 脏” 的系统资源列表进行快照,并对比两个快照之间的差异,从而获取恶意代码行为对系统所造成的影响,比如新建、删除或修改了哪些文件、哪些注册表项等。
-
系统动态行为监控方法:
- 系统动态行为监控是目前恶意代码动态行为分析中最为核心和常用的技术步骤,针对恶意代码对文件系统、运行进程列表、注册表、本地网络栈等方面的行为动作,进行实时监视、记录和显示。系统动态行为监视通常基于行为通知(Notification)机制或者 API 劫持技术(API Hooking)实现。
-
网络协议栈监控方法:
- 主要监控四个方面,包括恶意代码开放的本地端口、恶意代码发起的网络连接、控制恶意代码网络流和恶意代码流行攻击方式-ARP欺骗。
-
沙箱技术:
- 沙箱技术提供了受限制的执行环境,使得在沙箱中运行的代码不能够修改用户系统,从而提供了 一个用于运行不可信程序的安全环境。
-
动态调试技术:
- 动态调试器能够以单步模式来调试恶意代码,能够一行代码接着一行代码,一个函数调用接着一个函数调用地进行恶意代码行为分析的过程,这样就能够像录像机一样能够逐个镜头的分析犯罪现场录像,并也可以中断或者快进程序运行流程,观察恶意代码中发生的一切。
二、实践过程
实践一: 恶意代码文件类型识别、脱壳和字符串提
实践任务:对提供的 rada 恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得 rada 恶意代码的编写作者,具体操作如下:
-
- 使用文件格式和类型识别工具,给出 rada 恶意代码样本的文件格式、运行平台和加壳工具。
-
- 使用超级巡警脱壳机等脱壳软件,对 rada 恶意代码样本进行脱壳处理。
-
- 使用字符串提取工具,对脱壳后的 rada 恶意代码样本进行分析,从中发现 rada 恶意代码的编写作者是谁?
1、执行file RaDa.exe
可得这是一个32位Windows PE可执行文件,并且有图形化窗口。
2、下面来看看有没有加壳,下面使用PEiD工具(查壳)来查看加壳的类型。我们可以看到这个是一个版本为0.89.6的UPX壳
3、执行strings RaDa.exe
,可见都是乱码~
4、然后我们开始用超级巡警进行脱壳,
5、再次用strings,我们可以看到正常显示了~
6、我们在“strings”窗口可以看到作者的名字:Raul Siles 和 David Perze
实践二:分析Crackme程序
实践任务:在WinXP Attacker虚拟机中使用IDA Pro静态或动态分析crackme1.exe和crackme2.exe,寻找特定的输入,使其能够输出成功信息。
1、首先分析crackme1.exe。对crackme1.exe进行执行,猜测参数执行,可以发现一个参数输入与其他的参数输入得到的输出明显不一样,所以可以猜测这个程序的输入是一个参数。
2、接下来利用 IDA Pro 打开这个程序分析,打开我们打开通过 Strings 窗口可以查看该程序中出现的字符串。通过 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”这两个字符串。有内容我们可以猜测,前者就是我们需要的口令,后者就是输入口令正确时程序的输出信息。
3、接下来看函数调用图(Function Call),发现字符串比较函数strcmp和输出函数fprintf和printf。分析sub_401280函数。
4、sub_401280这个函数里有strcmp printf,那我们就来看看它,你就可以看到push、sub、move等操作,(不太懂)首先push了ebp入栈,然后比较最后一个cmp比较函数参数是不是2
5、字符串匹配函数strcmp,输入的字符串与I know the secret
进行比较,如果不匹配就输出Pardon? What did you say?
。正确的话,就输出You know how to speak to programs, Mr. Reverse-Engineer
。
6、我们来试验一下吧~
7、接下来我们对crackme2.exe做分析~
8、我们打开调用图(Function Call),找一下有关字符串的相关函数,输出函数。
9、我们看到上面这些函数(strcmp、fprintf等),那么我们来看看sub_401280这个函数吧!
10、据说crackmeplease.exe这个是对程序名的判断~
11、我们再来试验一下看看~~首先将程序名改为“crackmeplease.exe”,然后输入“I know the secret”,查看输出
实践三:样本分析实践:分析一个自制恶意代码样本 rada, 并撰写分析报告
实践任务:现在你作为一名安全事件处理者的任务(如果你接受的话)就是深入分析这个二进制文件,并获得尽可能多的信息,包括它是如何工作的,它的目的以及具有的能力,最为重要的,请展示你获取所有信息所采取的恶意代码分析技术。
- 提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息。
- 找出并解释这个二进制文件的目的。
- 识别并说明这个二进制文件所具有的不同特性。
- 识别并解释这个二进制文件中所采用的防止被分析或逆向工程的技术。
- 对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由。
- 给出过去已有的具有相似功能的其他工具。
- 可能调查出这个二进制文件的开发作者吗?如果可以,在什么样的环境和什么样的限定条件下?
1、首先我们查看摘要和文件类型,执行md5sum RaDa.exe
指令得到其md5摘要值为caaa6985a43225a0b3add54f44a0d4c7
利用file RaDa.exe
识别出这是32位PE文件,并且还是个GUI文件
2、接下来使用 IDA 对其进行分析。该程序在第一个实践中已经被脱壳了,脱壳后的文件名称为RaDa_unpacked.exe。(进入 Strings 对话框,在 Type 右键点击 Setup,设置类型为 Unicode。)
3、我们可以看到作者、时间等信息~~
4、找到一个 IP 地址,双击定位:猜测程序被执行后访问了这个地址。
5、根据线索分析,得到RaDa_commands.html。寻找这个字符串对应的函数sub_404FB0,进入这个函数,看黄色部分的汇编代码,得知是被拷贝到dword_40C030这个变量中。
6、找到dword_40C030变量对应的函数sub_4052C0 ,打开其Call Graph查看。这里我们看到判断了三个网段分别为192.168.、172.16.、10.,(三个私有网段,确保服务器在私有网段中,然后到服务器去取命令文件)
问题一:提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息。
答:摘要为caaa6985a43225a0b3add54f44a0d4c7;Win32 PE 加 UPX 壳 GUI 文件。
问题二:找出并解释这个二进制文件的目的。
答:这个二进制文件通过网络获取指令,并执行;攻击者可以利用其完全控制该系统,是一个后门程序。
问题三:识别并说明这个二进制文件所具有的不同特性。
答:会请求 Web 服务器;解析获得的指令并执行。
问题四:识别并解释这个二进制文件中所采用的防止被分析或逆向工程的技术。
答:UPX加壳
问题五:对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由。
答:不具有自主传播模块,不具有传播和感染的性质,所以它不属于病毒和蠕虫;也没有将自己伪装成有用的程序以欺骗用户运行,不是木马。是一个后门程序。
问题六:给出过去已有的具有相似功能的其他工具。
答:setiri~~
问题七:可能调查出这个二进制文件的开发作者吗?如果可以,在什么样的环境和什么样的限定条件下?
答:作者:Raul siles和David Perze,他们在2004年编写完成!
实践四:取证分析,Windows 2000系统被攻破并加入僵尸网络
实践任务:数据源是Snort收集的蜜罐主机5天的网络数据源,并去除了一些不相关的流量,同时IP地址和其他敏感信息被混淆。回答下列问题
- IRC是什么?当IRC客户端申请加入一个IRC网络时将发送哪个消息?IRC一般使用哪些TCP端口?
- 僵尸网络是什么?僵尸网络通常用于干什么?
- 蜜罐主机(IP:172.16.134.191)与哪些IRC服务器进行了通信?
- 在这段观察期间,多少不同的主机访问了以209.196.44.172为服务器的僵尸网络。
- 哪些IP地址被用于攻击蜜罐主机?
- 攻击者尝试了哪些安全漏洞?
- 哪些攻击成功了?是如何成功的?
问题一:IRC是什么?当IRC客户端申请加入一个IRC网络时将发送哪个消息?IRC一般使用哪些TCP端口?
答:IRC是Internet Relay Chat 的英文缩写,中文一般称为互联网中继聊天。IRC的工作原理非常简单,您只要在自己的PC上运行客户端软件,然后通过因特网以IRC协议连接到一台IRC服务器上即可。IRC明文传输使用的端口6667,偶尔也会使用6660—6669SSL加密。使用的端口6697。
问题二:僵尸网络是什么?僵尸网络通常用于干什么?
答:僵尸网络是指攻击者(称为botmaster)出于恶意目的,传播僵尸程序控制大量主机,并通过一对多的命令与控制信道所组成的网络。
僵尸网络主要用于:发动DDOS攻击、发送垃圾邮件、 监听用户敏感信息、记录键盘输入信息、 扩散新的恶意软件 和 伪造点击量,骗取奖金或操控网上投票和游戏,同时黑客控制的这些计算机所保存的信息也都可被黑客随意“取用”。
问题三:蜜罐主机(IP:172.16.134.191)与哪些IRC服务器进行了通信?
答:1、我们打开wireshark,设置过滤条件:ip.src == 172.16.134.191 && tcp.dstport == 6667
我们可以看到与蜜罐主机进行通信的 IRC 服务器:分别为有
209.126.161.29
66.33.65.58
63.241.174.144
217.199.175.10
209.196.44.172
问题四:在这段观察期间,多少不同的主机访问了以209.196.44.172为服务器的僵尸网络?
答:1、我们首先打开kali执行命令
tcpflow -r botnet_pcap_file 'host 209.196.44.172 and port 6667
(读取文件,筛选host和端口6667后进行分流)
2、再执行命令
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 ' ' '
' | tr -d "15" | grep -v "^$" | sort -u | wc -l
我们获得的信息是公3457台。
问题五:哪些IP地址被用于攻击蜜罐主机?
答;我们执行命令
tcpdump -n -nn -r botnet.pcap '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台主机
问题六:攻击者尝试了哪些安全漏洞?
1、
我们发现许多tcp和udp的数据包
2、我们执行命令
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
再用tcpdump -r botnet_pcap_file.dat -nn 'src host 172.16.134.191' and udp | cut -d ' ' -f 3 | cut -d '.' -f 5 | sort | uniq
筛选有响应的UDP端口
3、我们在wireshark中设置条件tcp.port135 or tcp.port25
ip.dst == 172.16.134.191 and tcp.dstport==80
筛选连接蜜罐主机80端口的包,发现24.197.194.106不断地在进行攻击,应该是在用脚本攻击IIS服务器
三、实践中遇到的问题和解决方法
问题一:在实验开始前就一直没法把rada复制到虚拟机中
答;发现原来是要安装VMware Tool
四、总结
这一周的实践发现是在有点困难,对原理的不理解导致了开始实践时无从下手。
无奈只能又打开同学们的博客,一个又一个的博客,看同学们对同一个实践,用了哪些不同的方法~~
对代码部分,对有些执行语句还是不理解,不熟悉,不知道~~
自己的能力太弱了、太弱了......