恶意代码安全攻防
说明:整个分析花费了我很长的时间,每个点基本都详细分析了,篇幅较长。
0.总体结构
本次作业属于哪个课程 | 网络攻防实践 |
---|---|
这个作业要求在哪里 | 恶意代码基础知识和分析方法 |
我在这个课程的目标是 | 学习网络攻防相关技术和原理 |
这个作业在哪个具体方面帮助我实现目标 | 学习恶意代码安全攻防的相关知识 |
1.实践内容
第九章的内容比较复杂,结构性不强,我主要从两个方面介绍,恶意代码基础知识和恶意代码分析技术。其中分很多小点,如恶意代码基础知识分为计算机病毒、蠕虫、RootKit等,而恶意代码分析技术分为分析环境、分析方法、反汇编等知识。
- 恶意代码基础知识
恶意代码简单介绍
计算机病毒
网络蠕虫
后门与木马
僵尸程序与僵尸网络
Rootkit- 恶意代码分析技术
恶意代码分析基础
恶意代码分析环境
恶意代码静态分析
恶意代码动态分析
恶意代码基础知识
恶意代码简单介绍
-
定义: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等。这里就不具体讲各个的定义或者是什么了,下面具体分开具体讲。给出一个恶意代码的分类依据。
类别 实例 不感染的依附性恶意代码 特洛伊木马、逻辑炸弹 不感染的独立性恶意代码 点滴器、繁殖器 可感染的依附性恶意代码 病毒 可感染的独立性恶意代码 蠕虫
计算机病毒
- 定义:计算机病毒是一种能够自我复制的代码,通过将自身嵌入其他程序进行感染,而感染过程通常需要人工干预才能完成。这里必须记住:计算机病毒是借助人类帮助从一台计算机传至另一台计算机,这也是其传播机制。
- 特性:感染性(本质特性)、潜伏性、可触发性、破坏性、衍生性。
- 感染及引导机制:
-
感染可执行文件(最为普遍的方式):前缀感染机制(病毒将自身复制到宿主程序的始端)、后缀感染机制(病毒将自身复制到宿主程序的末端)、插入感染机制(病毒在感染宿主程序时,病毒代码放在宿主程序的中间)。
-
感染引导扇区:通过BIOS定位磁盘的主引导区,运行存储的主引导记录,接着从分区表中找到第一个活动分区,读取并执行这个活动分区的分区引导记录,而分区引导记录负责装载操作系统。
-
感染数据文件(支持宏的数据文件):将自身以宏指令的方式复制到数据文件中,当被感染的数据文件被应用程序打开时,将自动执行宏病毒体,完成病毒的引导。
-
网络蠕虫
-
定义:一种通过网络自主传播、自我复制的独立恶意代码。(从这里就可以看出病毒和蠕虫的区别)
-
传播机制:主动攻击网络服务漏洞、通过网络共享目录、通过邮件传播。
-
组成结构:
- 弹头:利用目标系统安全漏洞入侵目标系统。包括缓冲区溢出攻击、破坏目标系统服务中的内存结构、文件共享攻击、利用电子邮件传播、利用其它普通的错误配置。这里其实就是我们之前说的渗透攻击模块。
- 传播引擎:通过在目标系统上执行传播引擎指令,完成蠕虫样本的传播。方式有FTP/TFTP/HTTP/SMB/直接传送/单包等。
- 目标选择算法和扫描引擎:一旦蠕虫在受害计算机中运行,目标选择算法开始寻找新的攻击目标,利用扫描引擎扫描每一个由目标选择算法确定的地址,确定其是否可以被攻击。包括电子邮件地址、主机列表、被信任的系统、网络邻居主机等。这里就是扫描策略。
- 有效载荷:附加的攻击代码,执行一些特殊目地的操作。包括植入后门、安装分布式拒绝服务攻击代理、组建僵尸网络、执行一个复杂计算等。
后门与木马
- 后门定义:允许攻击者绕过系统常规安全控制机制的程序,按照攻击者自己的意图提供通道。
- 后门类型:本地特权提升、单个命令的远程执行、远程命令行解释访问器(NetCat)、远程控制GUI(VNC、BO、冰河、灰鸽子)、无端口后门(ICMP后门,基于Sniffer非混杂模式或混杂模式的后门)。
- 自启动后门:Windows通过修改自启动文件、注册表自启动项,Linux修改
inittab
、rc.d/init.d
文件。 - 木马定义:看起来具有某个有用或善意目的,但实际掩盖着一些隐藏恶意功能的程序。
- 木马的伪装技术:命名伪装、使用软件包装工具、攻击软件发布站点、代码下毒(开发者有意为之,后面的利益就不可知了)。
僵尸程序与僵尸网络
-
僵尸程序定义:攻击者用于一对多控制目标主机的恶意代码。
-
僵尸网络定义:攻击者传播僵尸程序控制大量主机,并通过一对多的命令与控制信道所组成的网络。(注意仔细品味几种恶意程序的定义的黑体字,体会不同)
-
僵尸网络功能结构:主体功能分为命令控制模块和传播模块,辅助功能分为信息窃取模块、主机控制模块、下载更新模块、防分析检测模块。
-
僵尸网络类型:IRC僵尸网络(基于IRC互联网实时聊天协议构建)、HTTP僵尸网络(Web网站方式构建)、P2P僵尸网络(P2P协议构建)。
-
IRC僵尸网络工作机制图
Rootkit
-
定义:隐藏性恶意代码形态,通过修改现有的操作系统软件,使攻击者获得访问权并隐藏在计算机中。换句话说,就是root权限的kit工具包。
-
用户模式Rootkit:恶意修改操作系统在用户模式下的程序/代码,达到隐藏目的(木马化操作系统用户模式应用程序)。主要分为五种类型:提供后门访问的二进制替换程序、隐藏攻击者的二进制替换程序、用于隐藏但不替换的二进制程序、一些零散工具如网络嗅探器、安装脚本。
-
内核模式Rootkit:恶意修改操作系统内核,从而达到更深的隐藏和更强的隐蔽性(对内核组件的恶意修改和木马化)。主要有如下方式:文件和目录隐藏、进程隐藏、网络端口隐藏、混杂模式隐藏、改变执行方向、设备截取和控制。
-
Linux内核Rootkit:参考Linux Rootkit Learning,这篇博文讲的很好!。下图所示是利用LKM机制实现Linux内核模式Rootkit,LKM就是可装载内核模块。下图主要是通过insmod命令插入恶意内核模块,然后进行系统调用表的修改。
恶意代码分析技术
恶意代码分析基础
- 代码分析:按需求使用一定的规则、方法和工具对计算机程序进行分析,以推导出其程序结构、数据流程和程序行为的处理过程。
- 恶意代码分析的技术方法主要包括静态分析和动态分析两类。
- 分析良性代码与分析恶意代码的区别:(这也是为什么我们后面需要那么麻烦的原因)
- 不能提前知道恶意代码的目的。
- 恶意代码具有恶意的攻击目的,会对所运行环境进行恶意破坏。
- 恶意代码分析在绝大数情况下不会拥有待分析程序的源代码。
- 恶意代码目前都会引入大量各种各样的对抗分析技术。
恶意代码分析环境
-
恶意代码发烧友的分析环境:这个网络拓扑图真的没什么好说的,就是利用一个集线器或者交换机把计算机连接在一起,在于成本低。
-
采用虚拟化技术构建恶意代码分析环境:这是一般情况下我们使用的环境,其实也没什么好说的,之前的博客都已经详细说明了。主要重点是在进行恶意代码分析时,一定要保证主机和虚拟机的隔离,防止主机收到伤害,同时最好让你的整个主机也隔离网络连接,不要玩火,人人有责!!!
-
用于研究的恶意代码自动分析环境:专业人员使用的,分为静态分析机、动态分析机、网络分析机和综合分析机。
恶意代码静态分析
- 定义:通过反病毒引擎扫描识别已知的恶意代码家族和变种名,逆向分析恶意代码模块构成,内部数据结构,关键控制流程等,理解恶意代码的机理,并提取特征码用于检测。
- 恶意代码静态分析方法列表:后面会简单解释。这里同时提供一个博客主要是分析恶意代码分析实战。
分析方法 | 目的 | 使用工具 | 难度 |
---|---|---|---|
反病毒软件扫描 | 标识已知恶意代码 | 反病毒引擎,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完备地反映了一个程序的执行逻辑。
- 加壳识别和代码脱壳:包括四个方面:加密(固定加密/解密器)、多样性(多样化解密器)、多态(多态病毒能够通过随机变换解密器从而使得每次感染所生成的病毒实例都具有唯一性)、变形(直接在病毒体上加入各种代码混淆技术)。
恶意代码动态分析
- 定义:通过在受控环境中执行目标代码,以获取目标代码的行为及运行结果。
- 恶意代码动态分析方法列表
分析方法 | 目的 | 使用工具 | 难度 |
---|---|---|---|
快照比对 | 获取恶意代码行为结果 | 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.实践过程
实践一:恶意代码静态分析
任务:对提供的rada恶意代码样本(U盘或FTP/materials/course9下载),在WinXP_Attacker虚拟机中进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者。
- 使用文件格式和类型识别工具(file, PEid),给出rada恶意 代码样本的文件格式、运行平台和加壳工具。
- 使用超级巡警脱壳机等脱壳软件,对rada恶意代码样本进行 脱壳处理。
- 使用字符串提取工具(strings、IDA Pro),对脱壳后的 rada恶意代码样本进行分析,从中发现rada恶意代码的编写作 者是谁?
Solution
-
重要说明:在进行静态分析的时候,请务必断开与物理机的网络连接,最好也断开物理机与外部网络的连接,即使rada恶意代码并没有恶意行为。
-
实验环境:WinXP Attacker虚拟机(安装有cygwin以及基本的脱壳软件和字符串提取工具)。
-
首先利用
file RaDa.exe
命令查看RaDa.exe
的文件类型,可知这是一个32位Windows PE可执行文件,并且有图形化窗口。 -
下面来看看有没有加壳,下面使用PEiD工具(查壳)来查看加壳的类型。在这里我们可以看到这个是一个版本为0.89.6的UPX壳(压缩壳,更多内容参考UPX壳分析)。还可以看到文件的入口点、EP段、偏移、文件类型等信息。
-
下面用
strings RaDa.exe
查看RaDa.exe中可打印字符串,发现都是乱码,这也验证了这是一个加壳程序,所以下一步是我们要进行脱壳。 -
我们用超级巡警这个软件进行脱壳,这里也识别出了是一个UPX壳,这个压缩壳还是比较容易脱,脱完之后输出为
RaDa_unpacked.exe
。自动脱壳实在是无聊,我简直是工具人,那么找个帖子手动脱壳吧,掌握ESP定律,参考这个帖子新手脱壳必看基础教程,作业写不完了,先不拓展了,继续。 -
脱壳结束,我们就可以进行分析啦!打开
IDA Pro Free
选择脱壳之后的文件,一直next就行,可以看到如下信息。首先是作者的信息DataRescue sa/nv
,甚至是邮箱都一目了然。同时这个程序是由MSVB编写的。继续往下是一些函数调用,甚至汇编代码都一目了然。到这里本次实验结束,结束之后就把内容打包,文件删除吧。
实践二:分析Crackme程序
任务:在WinXP Attacker虚拟机中使用IDA Pro静态或动态分析crackme1.exe和crackme2.exe,寻找特定的输入,使其能够输出成功信息。
-
实验环境:装有IDA Pro的WinXP Attacker虚拟机。下面两个程序都是静态分析(利用IDA进行动态分析我不会啊)。
-
首先分析
crackme1.exe
。对crackme1.exe
进行执行,猜测参数执行,可以发现一个参数输入与其他的参数输入得到的输出明显不一样,所以可以猜测这个程序的输入是一个参数。 -
接下来利用IDA Pro打开这个程序分析,我们打开通过Strings窗口可以查看该程序中出现的字符串,我们发现了前面的两种反馈信息,
I think you are missing something.
和Pardon? What did you say?
,这两个我们之前已经见过了,很容易猜测,第一个是参数不对的返回情况,第二个是给的参数数量对了,但是具体的内容不对。还有两个我们不知道啥意思,所以我们要继续进行分析。同时,在这里我们应该要有一种敏感,就是看到字符串,那么字符串操作函数就要回想在你脑子里。 -
接下来看函数调用图(Function Call),上面说了,要找字符串操作相关的函数,以及输出函数,因为我们测试程序的时候明显是有输出的。如果你能理解,那么你肯定找的是下图部分,可以看到字符串比较函数
strcmp
和输出函数fprintf
和printf
。那么显而易见,sub_401280
这个函数就显得至关重要了。 -
下面我们就看这个函数的汇编代码了,其实汇编我也不大会,不过不打紧,能看懂基本操作就行了。打开这个函数,你就可以看到
push
、sub
、move
等操作,这些都是基本的汇编操作,想补以下就去网上稍微看看,我就不展开了,直入主题,首先push
了ebp入栈,然后比较最后一个cmp
比较函数参数是不是2(这里为什么是2?去学C吧)。 -
下面就是比较了,很容易看到左边就是函数参数不为2的情况(不为2输出的字符串也明显与我们之前猜测的内容一致),右边就是参数为2的情况。
-
进入右边,发现又调用了一个字符串匹配函数
strcmp
,也就是讲我们输入的字符串与I know the secret
进行比较,如果不匹配就输出Pardon? What did you say?
(这个我们之前已经见过啦)。那么正确,就输出You know how to speak to programs, Mr. Reverse-Engineer
。 -
根据上面的分析,我们去实验吧,很明显,我们得到了正确的结果。
-
接下来分析
crackme2.exe
。下面我就主要用IDA Pro进行分析,不猜测了。首先还是看明文字符串,有五个,自己先有个印象就好,下面我们还是要寻找字符串操作函数 -
我们首先还是打开call function,我们可以看到字符串比较函数
strcmp
和输出函数fprintf
以及输入函数等。那么此时应该寻找,sub_401280
这个函数了。 -
和上面一样,找到这个函数的汇编代码,同样的,下面有判断参数是否为2,如果不是,就返回
I think you are missing something
。这个不重要,下面我们着重看如果参数对了是什么样子。 -
下面的就是参数的个数对了的情况,这是啥?难道匹配这个字符串?千万不要这样子以为,注意这里比较的是什么?是
ebp+arg_4
,不是上面的ebp+arg_0
了。那就是说我们这里匹配的不是执行参数了,那应该是什么呢?看arg_4
和arg_0
相差了4(变量定义的时候dword ptr 8
和dword ptr 0C
),那么arg_0
代表的是第一个参数,其实arg_4
代表的就是第0个参数,也就是程序名(这里可能又有人要问为什么是4,32位平台堆栈指针每次4字节变化)。其实下面是可以验证的,因为在下面进行第一个参数匹配的时候先执行了add eax, 4
指令,也就是地址变回去了。 -
下面就是判断失败的输出了。判断成功的输出,我们可以看到对第一个参数进行了匹配,那么这个应该就是我们的第1个参数应该输入的值了。同时下面还给出了输入第一个参数不对的情况。
-
分析了这么多,好像是分析完了,于是我们就去测试,首先呢
copy crackme2.exe crackmeplease.exe
给程序改个名字,然后输入crackmeplease.exe "I know the secret"
发现输出了一个字符串We have a little secret: Chocolate
,可是这个我们没见过这个明文字符串啊。好吧,那我们继续看看是怎么回事吧。 -
我们继续往下看,又是一个判断,而且这还是一个循环,左边这个很明显是跳出循环的条件。看右边的,有个操作是
xor eax 42h
,这个指令是将eax
与0x42
异或,网上看有个指令是add eax,offset unk_403080
。那么就很简单了,后面的操作就是将unk_403080
中的字符逐个与0x42
进行异或运算。可以验证0x15 xor 0x42
对应的ascii码是W
。至此分析恶意代码样本实验结束。
实践三:样本分析,分析一个自制恶意代码样本
任务:现在你作为一名安全事件处理者的任务(如果你接受的话)就是深入分析这个二进制文件,并获得尽可能多的信息,包括它是如何工作的,它的目的以及具有的能力,最为重要的,请展示你获取所有信息所采取的恶意代码分析技术。
- 提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息。
- 找出并解释这个二进制文件的目的。
- 识别并说明这个二进制文件所具有的不同特性。
- 识别并解释这个二进制文件中所采用的防止被分析或逆向工程的技术。
- 对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由。
- 给出过去已有的具有相似功能的其他工具。
- 可能调查出这个二进制文件的开发作者吗?如果可以,在什么样的环境和什么样的限定条件下?
问题分析
-
拿到一个程序第一步我们应该是干嘛,当然是打开他,在打开他之前,那这是一个恶意软件,打开之前我们至少要打开监控工具吧。这也就是我们通常说的动态分析。
-
首先打开Filemon(文件),Regmon(注册表),Wireshark(网络)三个软件进行监测。这个时候可以启动这个恶意软件了。(软件在网上找的,古老)
-
观察Filemon我们可以看到程序文件
RaDa.exe
复制到了C:RaDain
目录下,并且新建了temp
目录。 -
继续观察Regmon,我们可以看到进行了很多注册表的操作,其中其中有一个时在自启动项里面加入了
RaDa: C:RaDainRaDa.exe
。 -
继续看Wireshark给我们的结果,时不时的访问
10.10.10.10
,而且是80端口,估计是访问某个html页面,这个我也没看懂,但是这个恶意软件肯定是和网络有关的无疑了。动态分析给我们的信息是在太少了,只能静态分析了。 -
下面就是静态分析了。首先准备工作一气呵成:
摘要
、file
、strings
,脱壳
。 -
利用
md5sum RaDa.exe
指令得到其md5摘要值为caaa6985a43225a0b3add54f44a0d4c7
。利用file RaDa.exe
识别出这是32位PE文件,并且还是个GUI文件,当时打开怎么没反应,难道是要参数?同时这是一个加壳文件,可以用strings RaDa.exe
输出看是不是全部乱码。 -
下面我们超级巡警进行脱壳,这是一个UPX壳,并且成功脱壳。
-
脱壳之后就是利用IDA Pro进行分析了。那么按照之前静态分析的套路,我们首先就应该看字符串。
-
首先你应该把Type改成
unicode
类型,不出意外你肯定会看到下列这些字符串。看下面几种字符串,首先第一张图明显就是命令行参数了,可以自己逐个试一下,看看都有什么含义。第二张图我们看到是一个版本作者的字符串。第三张图可以看到是一个注册表的字符串,但是这里有两个,还有一个VMware tools
值得我们注意。最后一张图的字符串时RaDa_commands.html
,很明显,这个应该就是我们之前进行访问的那个html网页了。看明文字符串能带给我们很多信息,筛选重要的字符串对于我们分析来说至关重要。 -
字符串看完下一步我们就看汇编代码逻辑了。首先我们还是看命令行参数的代码逻辑。我们可以看到命令行参数都在
sub_405E40
这个函数中,这个函数应该就是处理命令行参数的。最下面给出每个命令行参数的详细解释,我也没有一个一个分析。
参数 | 作用 |
---|---|
--verbose |
显示Starting DDoS Smurf remote attack |
--visible |
决定在获取html文件时,IE窗口是否可见 |
--server |
指定命令文件控制服务器的ip地址、访问协议及目录等,默认是http://.10/RaDa |
--commands |
指定命令文件,默认是RaDa_commands.html |
--cgipath |
指定服务器上cgi文件的根目录,默认是cgi-bin |
--cgiget |
指定负责文件上传的cgi脚本,默认是upload.cgi |
--cgiput |
指定负责文件下载的cgi脚本,默认是download.cgi |
--tmpdir |
指定临时文件夹的位置,默认是C:RaDa mp |
--period |
指定两次向服务器请求命令文件的时间间隔,默认是60秒 |
--cycles |
指定多少次向服务器请求命令文件后退出,默认是0(没有限制) |
--help |
输出版权信息 |
--gui |
使用该参数会使样本出现一个GUI窗口 |
--installdir |
指定样本的安装路径,默认是C:RaDain |
--noinstall |
使用该参数,样本将不会安装、也不会添加注册表 |
--uninstall |
卸载样本 |
--authors |
如果确认不是在VMware的虚拟机中运行,则显示样本的作者;否则显示参数不存在 |
-
继续根据线索分析,我们知道
RaDa_commands.html
这个字符串极其重要,因为我们看到有网络访问,那么我们就去寻找这个字符串对应的函数了。首先我们肯定很简单的能寻找到这个字符串对应的函数是sub_404FB0
,我们进入这个函数,看黄色部分的汇编代码,很容易知道他是被拷贝到dword_40C030
这个变量中了。还能看到很多其他的字符串拷贝(这些字符串就是默认的一些值)。 -
那么我们肯定也非常容易找到这个
dword_40C030
变量对应的函数了(鼠标放在上面就有了),也就是函数sub_4052C0
,找到这个函数,并且打开其Call Graph方便查看。这里我们看到判断了三个网段分别为192.168.
、172.16.
、10.
,很明显,这是三个私有网段,也就是说确保服务器在私有网段中,然后到服务器去取命令文件。 -
有命令文件就一定有命令,那么下面就是一些具体的命令以及其功能。其实sleep应该是我们之前在做动态分析的时候最能感知的。
命令 功能 exe
在宿主主机中执行指定的命令 put
将宿主主机中的指定文件上传到服务器 get
将服务器中的指定文件下载到宿主主机中 screenshot
截取宿主主机的屏幕并保存到tmp文件夹 sleep
停止活动一段时间 -
最后一部分分析,就是关于我们找到的字符串中有
Vmware Tools
,所以我们猜测这个程序是不是对虚拟机有所检测(还是要说一下字符串对我们的分析来说至关重要)。 -
首先我们找到该字符串对应的函数
sub_404FB0
,在这个函数中,这个字符串被拷贝到变量dword_40C070
,继续寻找这个变量对应的函数,找到是sub_40AAA0
。接下来我们主要看看这个函数干嘛了以及哪里调用了这个函数。 -
我们看到这个函数进行了网卡配置信息的查询(Select),然后进行了右边就确认
dword_40C070
对应的字符是否存在,并进行了Mac地址查询,注册表的查看等操作(Wscript.shell)。也就是判断vmware tools
是不是在注册表里面。 -
我们注意观察当
--authors
在我们的虚拟机上输出的是Unknow argument
,可是我们确实也能在明文字符串信息中找到作者的信息。这个时候我们观察到--authors
参数对应的处理函数是sub_40B010
,找到之后,我们打开Call Graph进行观察,结果就显而易见意见了,这里调用了sub_40AAA0
函数,也就是上面虚拟机对应的处理函数,我们发现,这里的处理是如果是虚拟机就输出Unknow argument
,如果不是,就输出正确的作者信息。到此,我们的分析部分也就结束了。
问题解答
分析部分其实已经讲了非常透彻了,下面简要梳理答案。
-
问题一:md5摘要值为
caaa6985a43225a0b3add54f44a0d4c7
。32位PE GUI可执行程序,同时这是一个UPX加壳文件。 -
问题二:通过上面的分析,我们知道用户上网,就得到了攻击者的指令,并且攻击者可以完全控制该系统(指令),所以这应该是一个后门程序或者僵尸程序。
-
问题三:
RaDa.exe
被执行时,它会将自身安装到系统C盘中,并通过修改注册表的方式使得每次系统启动,启动后主要就是以下过程:- 从指定的web服务器请求指定的web页面。
- 解析获得的web页面,获取其中的指令。
- 执行解析出来的指令,主要的指令上面给出。
- 等待一段时间后继续按照这个循环执行。
-
问题四:防分析技术如下:
- UPX加壳,答案提到的手动修改没有仔细研究。
- 通过查看网卡的MAC地址以及查看VMware Tools的注册表项 来判断操作系统是否运行在VMware虚拟机上,如果是,则使用
—-authors
参数时将不会输出作者信息。 - Starting DDoS Smurf remote attack字符串可能让别人联想这是DDos攻击。
-
问题五:首先这个样本不具有传播和感染的性质,所以它不属于病毒和蠕虫。然后它也没有将自己伪装成有用的程序以欺骗用户运行,所以他也 不属于木马。所以我认为他是一个后门程序或者僵尸程序。
-
问题六:Bobax,2004年发现的木马,也是使用HTTP协议从指定的服务器下载命令文件,然后解析并执行其中的指令。还有特洛伊木马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端口?
- 因特网中继聊天(Internet Relay Chat),简称IRC。IRC的工作原理非常简单,您只要在自己的PC上运行客户端软件,然后通过因特网以IRC协议连接到一台IRC服务器上即可。IRC特点是通过服务器中继与其他连接到这一服务器上的用户交流。通过IRC简介了解IRC的相关内容。
- 注册时需要发送的消息有三种,分别是口令,昵称和用户信息。格式如下:
USER <username> <hostname> <servername> <realname>
、PASS <password>
、NICK <nickname>
。注册完成后,客户端就使用JOIN信息来加 入频道,格式如下:JOIN <channel>
。 - IRC服务器明文传输通常在
6667
端口监听,也会使用6660—6669
端口。SSL加密传输在6697
端口。 - 注意:攻击者滥用IRC构建僵尸网络时,可能使用任意的端口构建IRC僵尸网络控制信道,那么基于端口识别服务不再可靠,要进行基于应用协议特征进行识别(如
USER/NICK
)。
问题二:僵尸网络是什么?僵尸网络通常用于干什么?
- 僵尸网络是攻击者出于恶意目的,传播僵尸程序控制大量主机,并通过一对多的命令与控制信道所组成的网络。
- 僵尸网络,是互联网上受到黑客集中控制的一群计算机,往往被黑客用来发起大规模的网络攻击,如分布式拒绝服务攻击(DDoS)、海量垃圾邮件等,同时黑客控制的这些计算机所保存的信息也都可被黑客随意“取用”。
问题三:蜜罐主机(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.58
63.241.174.144
217.199.175.10
209.196.44.172
问题四:在这段观察期间,多少不同的主机访问了以209.196.44.172
为服务器的僵尸网络。
-
说明:这里先不要用kali尝试了,在kali下tcpflow输出的文件用
grep
命令有点问题(grep不到全部的字符串),这里坑了我很久,所以我就直接用在macOS上做了。估计是文件编码的问题,如果有谁知道麻烦告知,谢谢。 -
这里还是主要参考答案方法3的思路。首先我们用tcpflow进行分流,指令为
tcpflow -r botnet_pcap_file "host 209.196.44.172 and port 6667"
,这条指令的含义就是读取文件,筛选host和端口6667
后进行分流。生成了一个report文件和两个分流的文件,当然我们主要看的就是209.
开头的文件。从这个文件中找到有多少个主机访问了209.196.44.172
。 -
下一步,由于macOS字符编码的问题,参考RE error: illegal byte sequence on Mac OS X。所以使用sed命令可能导致illegal byte sequence问题。所以限先执行以下两条指令
export LC_COLLATE='C'
和export LC_CTYPE='C'
。同时下面会用到很多Linux指令,建议大家参考Linux菜鸟教程查看相关的教程。
- 下面我们输入如下指令进行搜索有多少主机连接。下面讲解这个指令:首先这个指令肯定是管道连接的,第一条是
cat
命令,连接209.
输出文件。第二条grep
搜索获取昵称输出行。第三条sed
去除前缀,最后的g
是全局的意思。第三条tr
将空格转换为换行。第四条tr -d
删除grep -v
就是NOT
指令,去除空行。第六条sort -u
排序并去除重复。最后一条wc -l
输出行数。所以看到输出我们就知道总共有3457个主机访问了以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 ' ' '
' | tr -d "15" | grep -v "^$" | sort -u | wc -l
问题五:哪些IP地址被用于攻击蜜罐主机?
- 因为蜜罐的特殊性,只要是进入蜜罐的流量都应该被认为是攻击。所以首先明确被攻击的端口。使用下面的指令查找端口并输出到1.txt中,如图所示,查找到148个被攻击的端口。大部分指令上面讲过了,我们看
cut -d
是指定字段的分隔符,uniq命令用于检查及删除文本文件中重复出现的行列,一般与sort命令结合使用。
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
- 下面我们使用下面的指令找出所有的可能连接的主机的IP地址。这个指令的作用就是将连接IP地址输出到2.txt中,我们看到总共有165个主机可能被用于入侵蜜罐。其中
awk -F
就是指定分隔符,可指定一个或多个,print
后面做字符串的拼接。
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
问题六、七:攻击者尝试了哪些安全漏洞?哪些攻击成功了?是如何成功的?
- 攻击了哪些安全漏洞首先要了解攻击了哪些端口,使用
snort -r botnet_pcap_file -c /etc/snort/snort.conf -K ascii
指令先查一下网络流分布情况。我们发现大部分都是TCP包,有一部分UDP包,所以我们首先应该筛选出响应的TCP端口和UDP端口。
- 利用下面的指令筛选出蜜罐主机相应的TCP端口,指令上面都讲过了,差不多,多了一个筛选条件就是响应
0x12
。输出可以看到TCP响应端口为135(rpc),139(netbios-ssn),25(smtp),445(smb),4899(radmin),80(http)
。同样的,将指令协议部分改成udp就可以查询udp端口响应,我们能查到仅有137(netbios-ns)
号端口响应。
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
- 下面就是就上面几个端口进行逐个分析,先说明
udp 137
号端口,这个是个在局域网中提供计算机的IP地址查询服务,处于自动开放状态,所以访问这个端口肯定就是NetBIOS查点了。 - 接下来我们看
tcp 135
号端口和25
号端口,我们看到只是进行了连接,但是是没有数据的交互的,所以这攻击者可能是对这两个端口进行了connect扫描。
- 然后看
TCP 80
端口,首先利用Wireshark进行筛选tcp.dstport==80 && ip.dst == 172.16.134.191
,首先连接最多的就是24.197.194.106
这个IP,他的行为就是不停的用脚本在攻击IIS服务器的漏洞,从而获取系统权限,正是因为用的脚本,所以才会有这么多记录。
- 接下来是
68.169.174.108
访问的80
端口,好吧,都是正常的HTTP访问,并无异常。同时,最后还有一个192.130.71.66
也是一个正常的访问,就不再叙述了。
- 接下来是
210.22.204.101
访问的80
端口,这么多C
是什么情况,看来攻击者是想通过缓冲区溢出攻击来获得一个命令行了。
- 最后一个访问
80
端口的是218.25.147.83
,看到这么多N
我还以为是缓冲区溢出攻击呢,但是继续往下看,你会看到c: otworm
,稍微百度下你就会发现这是一个红色代码蠕虫攻击。
- 最后就是看
80
端口有没有攻击成功了,我们通过蜜罐主机80端口向外的流量进行分析,发现蜜罐主机做的几次回应均为一个iis服务器的默认页面,所以80
端口的这些攻击均失败。
- 接下来是
TCP 139
号端口。这个也比较简单,虽然有很多连接到这个端口的,但是基本都是一样的,大部分都是连接,然后很多空会话,同样这个也没有成功,这个应该是个SMB查点。
- 下面分析与139端口关系极其密切的
TCP 445
端口。这个端口连接非常多,同时我们也能看到许多samr
,srvsvc
,这些都是基本的查点,这里确实不好找,建议用strings查询相关的字符串进行分析,或者就像我一样硬看,查询字符串后很容易发现一个PSEXESVC.EXE
字符串,同时你在Wireshark中也能找到,是由61.111.101.78
发起的,通过对这种字符串的搜索,发现这是一种Dv1dr32蠕虫,这种蠕虫正是通过IRC进行通信。那么我们怎么判断是不是攻击成功了呢?我们同样找出口流量,发现每个IP地址连入的连接都有响应的回应,并且返回信息中含有PIPE tsvcs
,通过搜索可知,这是一个远程调用,所以攻击者肯定是获得了权限,因此这个攻击成功的。
- 最后还剩一个
TCP 4899
端口。只有一个IP访问过,即210.22.204.101
。可以查得4899端口是一个远程控制软件radmin服务端监听端口,这个软件不是木马,应该是上面攻击成功后上载的这个软件方便控制。到此,我们的分析就结束啦。
3.学习中遇到的问题及解决
- 问题一:对汇编代码的了解不够,导致分析过程可能存在不完整、不完全正确的部分。
- 问题一解决方案:稍微复习了一下汇编的指令。
- 问题二:tcpflow分流的编码,kali下用grep无法识别。
- 问题二解决方案:在自己的macOS上没有问题。
4.学习感悟、思考
- 其实每次做实验,感觉都有很多东西可以扩展,特别是单纯使用工具感觉无聊的时候,但是一扩展就要看很多东西,作业又很多,感觉解放生产力会更好。
- 这次实验真的比较难,很多内容我虽然弄懂了,但是还有一些深层和细节不懂,强烈希望老师能讲解下。
- 很多内容没有按照答案的思路来分析,但是感觉比答案稍微简介点,尤其用Wireshark分析方面。
- 日志分析的重要性在于化繁为简,分门别类,提取有效信息。
- 文本搜索匹配真的能做很多事。