20199102 2019-2020-2 《网络攻防实践》第九周作业
20199102 2019-2020-2 《网络攻防实践》第九周作业
1. 首先声明,我对汇编的全部理解都来自于玩游戏修改后台数据,所以理解并不全面,这里仅作参考。
1.课堂知识点
1.1 恶意代码基础支持
- 恶意代码的定义与分类
- 计算机病毒:一种能够自我复制的代码,通过嵌入其他程序进行感染,需要人工干预传播
- 蠕虫:与计算机病毒相比,不需要嵌入其他宿主程序中,可以自主运行
- 恶意移动代码:可以自动从远程主机下载并在本地执行的轻量级程序,常在web端实现
- 后门:可以绕开正常的安全控制机制,为攻击者提供访问的代码
- 特洛伊木马:伪装成有用软件,但是内含恶意目标的恶意代码
- 僵尸网络:使用僵尸程序构建的执行一对多命令的攻击网络。
- 内核套件:用以获取并保持最高控制权的一类恶意代码。
- 恶意代码发展史
- 恶意代码发展史:上世纪60年代起源,80年代传入中国。
- 恶意代码发展趋势:1. 恶意代码的复杂度和破坏力逐渐增强;2. 恶意代码技术的创新越来越频繁;3. 关注重点从计算机病毒转移到蠕虫和内核级攻击工具
- 计算机病毒
-
计算机病毒基本特性:1.感染性;2.潜伏性;3. 可触发性;4.破坏性;5.衍生性。
-
计算机病毒的感染和引导机制:1. 感染可执行文件,分为三种感染方式:
前缀感染机制
、后缀感染机制
和中间插入感染机制
。其中,前缀感染机制
是病毒将自身复制到宿主程序的开始;后缀感染机制
是病毒将自身复制到宿主程序的结尾;中间插入感染机制
是将病毒代码放置到宿主程序中间,这样使得病毒更加隐蔽但是编写难度较大。具体情况如下图所示2. 引导扇区感染机制,在系统启动的过程中,BIOS初始化数据,拉取磁盘主引导区的数据,主引导区拉取分区引导纪录,最后从引导分区中获得操作系统的地址,启动操作系统。将病毒植入引导区,就可以在系统启动之前获取系统控制权。3. 支持宏指令的数据文件,现行的一些数据文件允许在读取的时候进行一些数据的修改指令,由此数据文件也具有代码的执行权限,可作为被感染的文件。
图a 计算机病毒感染机制 -
计算机病毒的传播机制:主要分为两种,基于硬件的和基于网络的。基于硬件的包括软盘、U盘、SD卡等物理介质;基于网络的主要包含电子邮件、SMB共享文件等等。
-
- 网络蠕虫
-
网络蠕虫的基本特性:1. 可以通过网络进行自主传播,一般来说不需要用户交互;2. 不需要寄生宿主,自己就是一个可执行的程序;3. 直接通过网络传播,包括内网传播和互联网传播;
-
网络蠕虫的组成结构:1. 弹头主要用于进行渗透攻击,主要包含:缓冲区溢出攻击、共享文件攻击、利用电子邮件传播和其他普遍配置错误等等方式;2. 传播引擎主要是获取到目标系统的访问权限之后,蠕虫自身进行传输到目标系统的工具;3. 目标选择算法和扫描引擎主要用于找寻新的攻击目标,确定是否可以被攻击,主要包括:电子邮件地址、主机列表、被信任的系统、网络邻居主机、域名服务和通过特定规则任意选择目标IP。4. 有效载荷主要是在攻击成功之后,进行一些特殊的操作,例如:植入后门、安装分布式拒绝服务攻击服务器和组建僵尸网络。
-
具体的对比如下:
恶意代码类型 计算机病毒 网络蠕虫 复制性 自我复制,感染性 自我复制,感染性 定义特性 感染宿主文件/扇区 通过网络自主传播 宿主 需要寄生宿主 不需要寄生宿主 传播路径 感染文件扇区,通过文件交换或其共享传播 直接通过网络传播,包括内网和外网 传播是否需要交互 通常需要用户交互,如运行一个程序或打开文档 一般来说不需要交互
-
- 后门和木马
- 后门:后门是用于为攻击者提供多种不同类型的访问通道的工具,主要包含:本地权限提升和本地账号、单个命令的远程执行、远程命令行解释器访问、远程控制GUI和无端口后门等等。
- 木马:主要是用于以下目的的程序:欺骗用户或者管理员安装木马程序;隐藏在计算机的正常程序之中,通过与后门程序结合形成木马后门。
- 僵尸程序和僵尸网络
-
僵尸网络的功能结构:1. 僵尸程序的功能主要分为两类:
主体功能
和辅助功能
。主题功能
包括命令与控制模块、传播模块;辅助功能
包含信息窃取模块、主机控制模块、下载更新模块和防分析检测模块。2.僵尸网络的工作机制主要包含如下七步:渗透攻击、加入控制服务器、动态影射至IRC服务器、加入IRC信道、监听命令、接收命令、执行攻击。
图b 僵尸网络工作机制 -
僵尸网络的命令和控制机构:命令和控制机构主要分为三大类
基于IRC协议的命令和控制机构
、基于HTTP协议的命令和控制机构
、基于P2P协议的命令与控制机构
。
-
- Rookit
-
Rookit分类:Rookit是一种具有替换或修改现有操作系统软件进行隐藏的特性的程序。主要分为:
应用程序级木马后门
、用户模式Rookit
、内核模式Rookit
和虚拟机模式Rookit
。 -
用户模式Rookit:: linux系统下主要包含:
提供后门的二进制程序
、隐藏攻击者的二进制程序
、用于隐藏但不替换的二进制程序
和安装脚本
等。windows下主要包含:程序和代码之间注入恶意代码
、关闭文件保护机制重写文件
和利用DLL注入机制操纵正在进行的进程
。 -
内核模式Rookit: linux系统下利用
LKM
可装载内核模块的内核扩展机制注入新的代码。windows与windows下整体思路相同但是是通过insmod
进行注入。
图c windows下Rootkit
-
1.2 恶意代码分析方法
- 恶意代码分析技术主要问题
- 不能事先知道恶意代码的目的是什么
- 恶意代码具有恶意的攻击目的
- 恶意代码在绝大多数时候不会具有原代码
- 恶意代码会引入大量的对抗分析技术
- 恶意代码静态分析技术
-
反病毒扫描:通过匹配现有的已知的病毒进行判断病毒的种类、家族和变种信息。
-
文件格式识别:获得恶意软件执行的平台等信息
-
字符串提取:
获取恶意代码实例名
、帮助或命令行选项
、用户会话
、后门口令
、相关URL、E-mail信息
和包含库文件和函数调用
。 -
二进制结构分析:获取程序的
头部摘要信息
、目标文件运行架构
、重定位入口
、符号表入口
、不同的代码段
、编译代码时使用的程序
等。 -
反汇编与反编译:将二进制程序,转化成汇编代码和高级语言代码。
-
代码结构与逻辑分析:获取
函数调用关系图
和程序控制流图
。 -
加壳识别与代码脱壳:对代码进行加密、多样性、多态和变形的机制。
分析技术 技术目的 难度 反病毒软件扫描 识别出已知恶意代码类型/家族 低 文件格式识别 确定攻击平台和类型 低 字符串提取 寻找恶意代码分析线索 低 二进制结构分析 进一步了解二进制文件的结构 中 反汇编 将二进制代码解析翻译为汇编代码 中高 反编译 将汇编代码进一步尝试翻译为高级语言 中高 代码结构和逻辑分析 分析二进制代码组成结构,并理解二进制代码逻辑 高 加壳识别和代码脱壳 确定是否加壳,加壳类型;对抗代码混淆,恢复原始代码 高
-
- 恶意代码动态分析技术
- 基于快照对比的方法和工具
- 系统动态行为监控方法
- 网络协议栈监控方法
- 沙箱技术
- 动态调试技术
2.实践过程
2.1 动手实践 恶意代码文件类型识别、脱壳和字符串提取
- 实践任务:对提供的
rada
恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada
恶意代码的编写作者,具体操作如下- 使用文件格式和类型识别工具,给出
rada
恶意代码样本的文件格式、运行平台和加壳工具 - 使用超级巡警脱壳机等脱壳软件,对rada恶意代码进行脱壳处理。
- 使用字符串提取工具,对脱壳后的
rada
代码进行样本分析,从中发现rada
恶意代码的编写作者是谁
- 使用文件格式和类型识别工具,给出
-
对于文件格式和运行平台,我们这里使用linux下缺省程序
file
获取(windows10下的powershell也部分兼容linux命令,甚至可以尝试一下windows10中的WSL2)。命令为file $path$/rada.exe
。通过下述截图我们可以看到Rada.exe
的运行环境为RaDa.exe: PE32 executable (GUI) Intel 80386, for MS Windows
图1 file查看Rada.exe的运行环境 -
对于获取加壳工具,这里使用程序
PEiD.exe
进行扫描。在扩展信息
中可以看到加壳的工具为UPX 0.89.6 - 1.02 / 1.05 - 2.90 -> Markus & Laszlo
图2 使用PEiD查看加壳工具 -
对于脱壳
使用超级巡警脱壳机 V1.4以下的版本
,V1.5脱壳不成功。GUI一键操作,截图如下。
图3 超级巡警脱壳机 GUI一键脱壳 -
对于字符串提取,这里将上面脱壳之后的程序放到linux下,使用linux的缺省程序
strings
进行字符串提取,命令为strings $path/Rada_unpacked.exe$
。对于提取的结果,我们可以看到有很多程序的交互字符串
和程序的函数调用的函数名
,其中还有这么一句话You can learn a lot playing funny security challenges
。截图如下:
图4 脱壳后提取字符串
2.2 动手实践:分析Crackme程序
- 实践挑战:使用IDA pro静态分析或者动态分析
crackme1.exe
和crackme2.exe
,寻找特定的输入,使其能够输出成功信息。
-
首先我们对
crackme1.exe
进行分析,使用IDA 7.0
打开相应程序,截图如下
图5 IDA打开程序之后的截图 -
分析一下
crackme1.exe
的函数调用情况。首先看主函数main
,再完成了参数设置之后调用cmp [ebp+argc], 2
将参数个数与2进行比较;接下来是jz XXXXX
,这句代码是再看ZF
位置的标志位设置,若标志位为1则进行跳转。从这里我们可以分析得到这个函数在正确的情况下,参数个数应该为2(第一个参数是程序名,第二个参数才是常规意义上的"参数")
。 -
接下来将
参数2
(注意这里有一步add eax 4
)与I know the secret
进行比较,调用_strcmp
函数,函数返回值被放置在eax
寄存器中,之后调用test eax eax
判断返回值是不是1;判断之后参看符号位ZF
,如果置为1,则跳入函数loc_401310
。 -
loc_401310
函数的作用就是输出You know how to speak to programs, Mr. "...
也就代表你找到了正确答案。下面我们来实地尝试一下:
图6 crackme1.exe 破解结果 -
其实这里还有一个比较作弊的结果, 从
view
->open subviews
->string
可以看到全部的字符串,发现一共就4个可能的字符串,一个个尝试都可以。误)
-
分析一下
crackme2.exe
的函数调用情况。首先看主函数main
,再完成了参数设置之后调用cmp [ebp+argc], 2
将参数个数与2进行比较;接下来是jz XXXXX
,这句代码是再看ZF
位置的标志位设置,若标志位为1则进行跳转。从这里我们可以分析得到这个函数在正确的情况下,参数个数应该为2(第一个参数是程序名,第二个参数才是常规意义上的"参数")
。 -
接下来将
参数1
(注意这里没有add eax 4
)与crackmeplease.exe
进行比较,调用_strcmp
函数,函数返回值被放置在eax
寄存器中,之后调用test eax eax
判断返回值是不是1;判断之后参看符号位ZF
,如果置为1,则跳入函数loc_401313
。 -
接下来将
参数2
(注意这里有一步add eax 4
)与I know the secret
进行比较,调用_strcmp
函数,函数返回值被放置在eax
寄存器中,之后调用test eax eax
判断返回值是不是1;判断之后参看符号位ZF
,如果置为1,则跳入函数short loc_401351
。
图 注意eax的变化 -
接下来程序进入了一个循环。我们可以看到,这里首先对一个临时变量设置了初始值
mov [ebp+var_4], 0
,接下来[ebp+var_4]
与21h
进行比较,不大于则执行_putchar
输出。循环退出之后输出0Dh
也就是\r
。具体结果如下图。
图7 crackme2.exe 破解结果
2.3 样本分析实践:分析一个自制恶意代码样本rada
并撰写分析报告
- 提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息
- 找出并解释这个二进制文件的目的
- 识别并说明这个二进制文件所具有的不同特性
- 识别并解释这个二进制文件中采用的防止被分析或被逆向工程的技术
- 对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由
- 给出过去已有的具有相似功能的其他工具
- 可能查出这个二进制文件的开发作者吗?如果可以,在什么样的环境下和什么样的限定条件下?
-
首先打开
wireshark
、Process Monitor
和regshot.exe
,并使用regshot建立第一个注册列表的保存点。 -
接下来运行
rada.exe
,这样我们就能在上述三个程序中拦截到相关的信息如下。 -
首先在
regshot.exe
中再次捕获注册列表并于第一次进行对比,可以看到增加了两个注册列表项,用来进行开机自启动的HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
图8 rada.exe添加的注册列表项 -
从上图中我们也能看出,自启动地址是C盘下的文件,也就是说程序在C盘中添加了相关文件。这时我们切换回到
Process Monitor
,可以看到程序监测到了在C盘新建文件的过程,并且建立的结果是success。
图9 C盘下新建的文件
图10 监控写入文件的过程 -
下一步就是进行脱壳,脱壳的过程和上文中使用
超级巡警脱壳机 V1.4以下的版本
脱壳的过程完全相同
图3 超级巡警脱壳机 GUI一键脱壳 -
接下来打开
IDA 7.0
,从view
->open subviews
->string
可以看到全部的字符串,这里需要把字符串的央视从默认的C
改为unicode C
。就可以获得大量的程序运行命令行,重点看红色框圈出来的地方。
图11 扫描到的string -
接下来我们双击红框中的命令就可以看到这些字符串再什么地方被调用过,这里以
--authors
为例子。双击之后可以看到,在两个函数中调用了这个字符串,分别是sub_405E40
和sub_40B010
,点开第二个发现是具体的处理过程,点开第一个函数,发现结构庞大,应该是主程序,截图如下。
图12 author调用位置
图13 sub_40B010函数结构
图14 主程序整体函数结构 -
再次回到上述的
string
列表,我们可以看到,出现了几个IP地址,其中唯一一个完整的就是http://10.10.10.10/RaDa
。这里我们打开wireshark
,使用过滤器ip.src == 10.10.10.10 or ip.dst == 10.10.10.10
。这个时候我们发现,又很多的ICMP报文也进入了过滤器之后,查看详细信息之后会发现,其实是ICMP报文,用来kepp-alive
。从此可以看到与10.10.10.10
建立的连接是长连接,也就是说这很可能是一条信息的传输通道。截图如下。
图15 wireshark抓包10.10.10.10结果 -
在我们得到
10.10.10.10
是指令传输接口之后,我们回到IDA
,查看IDA中对应的指令的处理代码。接下来我们能看到有两个函数回调用这个字符串,分别是sub_4052C0
和sub_404FB0
。这里我们重点看第一个函数,再函数中我们发现它还调用了其他字符串,包括name exe
、get
、put
、screenshot
和sleep
这几个指令函数。
图16 指令处理 -
再次回到
string
列表看看还有没有漏网之鱼。还有两个可以点,一个是不完整的sql字符串,另一个就是不完整的三个mac地址。这里mac地址的前三个字段标识网卡的生产厂家,后三个标识网卡的序列号,但是这里只限制了最初的三个字段,难道是针对特定公司网卡的攻击程序? -
点击对应的字符串进行跳转,发现sql语句并没有被调用,但是mac语句是真正的被执行了。这里代码中对三个mac地址进行了判断,只要符合其中任意一个,程序就将向下执行。我们知道MAC地址是IEEE唯一分配的,通过查询我们知道这些mac地址均属于vm,(幸亏我不是用virtualbox做的实验)。具体截图如下:
图17 MAC地址匹配
-
提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息
:- 再linux下调用程序
md5sum $path$/rada.exe
计算程序的md5码作为同一样本的标识。caaa6985a43225a0b3add54f44a0d4c7
为程序的MD5码 - 此外通过上文我们可以知道这个程序的加壳方式是
UPX 0.89.6 - 1.02 / 1.05 - 2.90 -> Markus & Laszlo
、 - 运行平台:
RaDa.exe: PE32 executable (GUI) Intel 80386, for MS Windows
这三者联合起来可以作为一个这个文件的基本信息身份标识。
- 再linux下调用程序
-
找出并解释这个二进制文件的目的
:通过上边的分析,我们可以知道这个二进制程序通过网络获取指令,并执行,不具备自主传播模块,由此可知,这个应该是后门程序或僵尸网络程序。 -
识别并说明这个二进制文件所具有的不同特性
:-
初次安装的时候会进行初始化的相关操作,添加注册列表、移动文件位置至C盘,建立网络连接接收指令。
-
持续运行阶段:维持与服务器的网络连接,解析网络指令,执行网络指令,等待一段时间继续执行。具体的指令如下表
-
| 指令 | 说明 |
| ---------- | --------------------------- |
| put | 将主机文件下载到宿主机器 |
| get | 将宿主机文件上传到主机 |
| screenshot | 获取宿主机屏幕截图保存到tmp |
| sleep | 停止活动一段时间 | -
除此之外,此二进制程序还具有其他一些命令行参数可供调用,分析过程见上文,参数如下:
-
| 参数 | 具体动作 |
| ------------ | -------------------------------------------------------- |
| --visible | 弹出网页是否可见 |
| --verbose | 显示starting DDOS smurf remote attack
|
| --uninstall | 卸载二进制程序 |
| --tmpdir | 设置缓存文件夹 |
| --server | 设置获取命令的服务器的地址 |
| --period | 两次获取命令的时间间隔 |
| --noinstall | 执行程序但跳过安装 |
| --installdir | 修改安装路径,不再安装到c:\rada
|
| --help | 实际上并不像字面意思一样输出帮助信息,仅仅是程序名等信息 |
| --gui | windows下的一个命令窗口 |
| --cycles | 设置获取命令的次数 |
| --commands | 设置获取命令的文件 |
| --cgiput | 与上文put相对应的cgi脚本 |
| --cgipath | 设置远程cgi脚本的位置 |
| --cgiget | 与上文get相对应的xgi脚本 |
| --authors | 在VM中会产生输出,但是在物理机中不会输出 |
-
-
识别并解释这个二进制文件中采用的防止被分析或被逆向工程的技术
- 首先采用了
UPX 0.89.6 - 1.02 / 1.05 - 2.90 -> Markus & Laszlo
的加壳方式,直接被一键脱壳,未详细理解 - 二进制程序的相关代码片段只在特定的环境下才可以执行,例如
--authors
参数必须在vm的网卡中才会执行。 - 一些干扰的误导选项,如没有用到的sql语句
SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True
,无意义的starting DDOS smurf remote attack
。
- 首先采用了
-
对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由
- 首先此二进制程序不具有自主传播模块,所以它不属于病毒和蠕虫
- 此程序未进行伪装,所以也不是木马
- 若攻击者仅仅用此程序进行远程控制,那么就是后门程序;若再次基础上加入僵尸网络,则就是僵尸程序
-
给出过去已有的具有相似功能的其他工具
- 从服务器下载指令并执行具备组件僵尸网络的能力,可以参考linux下的开源Zeus,
- Setiri及其前辈GatSlag
-
可能查出这个二进制文件的开发作者吗?如果可以,在什么样的环境下和什么样的限定条件下?
- 如上文所述,可以通过
--authors
参数获取相关作者信息Authors: Raul Siles & David Perez, 2004
- 网卡的MAC地址必须属于VM公司(简单来说就是必须在虚拟机中运行,但是MAC地址是可以伪装的啊)
- 如上文所述,可以通过
2.4 取证分析实践:windows2000系统被攻陷并加入僵尸网络
- 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协议),大家连到一台或者多台IRC服务器上进行聊天.它的特点是速度快
- 在一台新的被僵尸程序控制的靶机申请加入的时候首先要发送口令、昵称和用户信息。消息格式如下:
USER <username> <hostname> <servername> <realname>
、PASS <password>
和NICK <nickname>
。 - 对于曾经注册过的靶机,直接通过JOIN指令加入对应的频道,指令如下
JOIN <channel>
- IRC通常使用6660 - 6669端口进行监听,其中
6667
是明文端口,此外额外占用一个端口6697
进行SSL加密传输 - 由于此处的端口号并不唯一,这就导致难以通过端口号进行检测,这里使用协议过滤的相关内容,对
NICK
、JOIN
等IRC指令进行过滤。
-
僵尸网络是什么?僵尸网络通常用于干什么?
- 僵尸网络是可被攻击者远程控制的被攻陷主机所组成的网络。僵尸网络是控制者(称为Botmaster)出于恶意目的,传播僵尸程序控制大量主机,并通过一对多的命令与控制信道所组成的网络。
- 僵尸网络主要用于:
发动DDOS攻击
、发送垃圾邮件
、监听用户敏感信息、记录键盘输入信息
、扩散新的恶意软件
和伪造点击量,骗取奖金或操控网上投票和游戏
-
蜜罐主机(IP地址:172.16.134.191)与那些IRC服务器进行了通信?
-
根据我们上文的介绍,可以知道
irc
使用的端口是6660 - 6669
,所以我们在wireshark中使用如下的过滤器就可以得到如下的IP地址 -
66.33.65.58
-
63.241.174.144
-
217.199.175.10
-
209.196.44.172
-
209.126.161.29
图18 与靶机通信的IRC服务器
-
-
在这段期间,多少不同的主机访问了以
209.196.44.172
为服务器的僵尸网络?-
这里我们分成两部分进行统计首先我们先拉取
209.196.44.172
与172.016.134.191
之间的所有的IRC
数据包。这里使用命令tcpflow -r botnet_pcap_file 'host 209.196.44.172 and port 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地址,通信时间等等。
图18 tcpflow中report.xml的相关信息 -
接下来查看
209.196.044.172.06667-172.016.134.191.01152
。在当前主机进入到IRC的频道之后,频道会将当前频道中所有的主机的信息都发送过来,我们可以从其中的数据包中计算当前频道共有多少主机。这个计算分为两部分。 -
首先我们计算在当前主机加入IRC时刻,IRC中主机的个数,使用的PY代码如下所述,主机的个数是
3457
。这仅仅是第一步的计算。然后我们在计算截至结束嗅探的时候的不断有主机加入和退出IRC频道,我们在补充上这个过程中的主机个数,共计3608
个。具体使用的代码如下:import re pattern = re.compile( r':irc5.aol.com 353 rgdiuggac @(.*?):(.*?)\n', re.S) pattern2 = re.compile(r':(.*?)!~', re.S) dict = {} with open("test.txt", 'r') as fp: thisline = fp.readline() while thisline: if thisline.startswith(":irc5.aol.com 353 rgdiuggac"): items = re.findall(pattern, thisline) string = items[0][1] splitstring = string.split(" ") for item in splitstring: dict[item] = 1 else: items = re.findall(pattern2, thisline) print(items) if len(items) == 1: dict[items[0]] = 1 thisline = fp.readline() print(len(dict) - 1)
-
-
那些IP地址被用于攻击蜜罐主机?
-
这里我们使用
snort
和python
进行处理,一个负责拿到嗅探数据的警报,另一个用来分析警报。 -
首先我们使用snort拿到报警数据, 命令格式为
sudo snort -A console -q -u snort -g snort -c /etc/snort/snort.conf -r botnet_pcap_file.pcap > snort.txt
。(什么参数都不加,然后去/var/log/snort/alert
下去找alert也是可以的)。执行命令之后我们获得了一个2183
行的报警文件,这就是所有的可疑信息了。具体的截图如下:
图19 snort中的报警信息 -
接下来我们将数据使用python进行处理,处理的代码如下所属,然后按照攻击的次数进行排序,就能得到如下的被用于攻击蜜罐主机的IP地址。
import re pattern2 = re.compile( r'} (.*?):[0-9]+ -> (.*?):[0-9]+\n', re.S ) dict = {} with open("snort.txt", 'r') as fp: thisline = fp.readline() while thisline: items = re.findall(pattern2, thisline) dict[items[0][0]] = dict.get(items[0][0], 0) + 1 dict[items[0][1]] = dict.get(items[0][1], 0) + 1 thisline = fp.readline() dict = sorted(dict.items(), key=lambda d: d[1], reverse=True) print(dict)
-
最终得到如下的输出
[('24.197.194.106', 1942), ('210.22.204.101', 30), ('61.150.72.7', 12), ('61.132.88.90', 9), ('61.111.101.78', 8), ('61.134.45.19', 6), ('218.4.99.237', 6), ('61.150.120.72', 6), ('209.196.44.172', 5), ('66.139.10.15', 4), ('209.45.125.69', 4), ('129.116.182.239', 4), ('66.8.163.125', 4), ('68.37.54.69', 3), ('12.252.61.161', 3), ('206.149.148.192', 3), ('218.4.87.137', 3), ('66.81.131.17', 3), ('61.177.56.98', 3), ('24.167.221.106', 3), ('67.201.75.38', 3), ...]
-
整理一下,我们得到主要的五个攻击方IP为:
-
24.197.194.106
-
210.22.204.101
-
61.150.72.7
-
61.132.88.90
-
61.111.101.78
-
这里也可以使用建国的shell命令,可以达到相同的效果,代码如下
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
-
-
攻击者尝试攻击了那些安全漏洞?
-
首先我们接着上文获取的
snort.txt
进行分析。对文件中的警报进行分析进而分析出攻击者使用的攻击漏洞,具体使用的代码如下所述,代码结果如下所述import re pattern = re.compile( r'\[\*\*] \[.*?\] (.*?) \[\*\*]', re.S ) dict = {} with open("snort.txt", 'r') as fp: thisline = fp.readline() while thisline: items = re.findall(pattern, thisline) print(items) dict[items[0]] = dict.get(items[0], 0) + 1 thisline = fp.readline() dict = sorted(dict.items(), key=lambda d: d[1], reverse=True) print(dict)
代码的运行结果如下所示:
[('WEB-MISC http directory traversal', 781), ('WEB-IIS cmd.exe access', 497), ('WEB-IIS Directory transversal attempt', 265), ('MS-SQL Worm propagation attempt', 55), ('MS-SQL Worm propagation attempt OUTBOUND', 55), ('MS-SQL version overflow attempt', 55), ('WEB-FRONTPAGE /_vti_bin/ access', 30), ('WEB-MISC /.... access', 25), ('WEB-FRONTPAGE .... request', 23), ('WEB-IIS .htr access', 22), ('NETBIOS SMB-DS IPC$ unicode share access', 16), ('WEB-IIS SAM Attempt', 15), ('WEB-IIS ISAPI .ida access', 14), ...]
-
接下来我们分析嗅探到的数据使用了那些TCP和UDP端口,这里我们使用的代码如下,分析结果如下。
import re pattern3 = re.compile( r'172.16.134.191:[0-9]+', re.S ) dict = {} with open("snort.txt", 'r') as fp: thisline = fp.readline() while thisline: items = re.findall(pattern3, thisline) dict[items[0]] = dict.get(items[0], 0) + 1 thisline = fp.readline() dict = sorted(dict.items(), key=lambda d: d[1], reverse=True) print(dict)
代码的运行结果如下所示:
[('172.16.134.191:80', 1969), ('172.16.134.191:1434', 165), ('172.16.134.191:445', 34), ('172.16.134.191:1152', 5), ('172.16.134.191:1042', 1), ('172.16.134.191:1041', 1), ('172.16.134.191:1047', 1), ('172.16.134.191:1083', 1), ('172.16.134.191:1088', 1), ('172.16.134.191:1090', 1), ('172.16.134.191:1102', 1), ('172.16.134.191:1100', 1), ('172.16.134.191:1133', 1), ('172.16.134.191:1139', 1)]
-
接下来我们使用wireshark的analayse功能,查看嗅探得到数据包的协议分级,具体情况如下表,结合上述的两项统计分析,我们猜测如下的协议是下一步排查的重点:
tcp:IRC、HTTP、NETBIOS session(SMB)
、UDP:NETBIOS、RPC
图20 wireshaek分析结果 -
综合上述三者的信息,我们开始对所有统计出来的可疑的网络ip、网络端口、网络协议进行一一排查。
-
首先分析最简单的
TCP:80端口
的流量。这里使用wireshark的过滤器ip.dst == 172.16.134.191 and tcp.dstport == 80 and http
,之后就能看出所有关于80端口的相关攻击的信息,包括null.ida
为标识的WEB-IIS ISAPI
、dafault.ida
为标识的code red
。截图如下
图21 wireshark过滤80端口的HTTP协议 -
接下来分析
445端口
,445端口是SMB端口,我们依旧先用wireshark进行过滤,过滤器为ip.dst == 172.16.134.191 and tcp.dstport == 445
。接下来逐条分析所有的路径请求。截图如下,分析结果如下:
图22 wireshark过滤445端口攻击IP 攻击文件名 攻击漏洞 结果 129.116.182.239 IPC$ \samr \c$ 普通查点 未攻破 195.36.247.77 IPC$ \samr \ADMIN$ 普通查点 未攻破 209.45.125.69 IPC$ \samr 普通查点、口令猜测 未攻破 210.22.204.101 IPC$ \samr \svcctl \r_server.exe admdll.dll raddrv.dll 普通查点、口令猜测、MSRPC-SVCCTL服务枚举漏洞等 成功攻破 61.111.101.78 IPC$ \samr \svcctl PSEXESVC.EXE PSEXESVC攻击 成功攻破 66.139.10.15 IPC$ \samr 普通查点、口令猜测 未攻破 66.8.163.125 IPC$ \samr 普通查点 未攻破 80.181.116.202 IPC$ \samr 普通查点 未攻破 -
接下来分析tcp的
NetBIOS
相关协议,端口号为139
,使用wireshark过滤器,ip.dst == 172.16.134.191 and tcp.dstport == 139
,没想到有什么好的分析工具接下来我们还是手动分析吧。从头到尾一行行分析,发现共有若干个个不同的IP访问了这个端口,分别是81.50.177.167
、80.181.116.202
、68.154.11.82
、68.152.53.138
、210.214.49.227
等,但是我们发现其实很多时候他们的攻击指令是相同的,即使攻击机的IP地址不同,这里存疑。但是可以确定的是,他们都没有攻击成功。
图23 tcp139端口攻击 -
接下来分析udp的
NetBIOS
相关协议,端口号为137
,使用wireshark过滤器ip.dst == 172.16.134.191 and udp.port == 137
。可以看到这里的所有IP地址进行访问的负载都是相同的,都是KAAAAA....AA
的形式,这里推测应该是在进行NetBIOS
查点。
图23 udp137端口攻击 -
最后分析的是udp的
1434
端口,这里使用过滤器ip.dst == 172.16.134.191 and udp.dstport == 1434
,可以看到这是一串远程调用协议的相关数据包,仔细查看之后会发现一个376字节的负载,相关百度之后可以发现这是名为SQL Slammer
的蠕虫病毒。
图24 1434端口攻击
-
-
那些攻击成功了?是如何成功的?
-
总结一下上一问的分析,可以得到如下的表格
攻击端口 攻击漏洞 攻击IP地址 攻击结果 UDP 137 NetBios查点 多个IP 失败 UDP 1434 SQL Slammer 多个IP 失败 TCP 80 常见漏洞扫描 24.197.194.106为主 失败 TCP 80 ISAPI ida漏洞 + code red 218.025.147.083 失败 TCP 80 ISAPI ida漏洞 210.22.204.101 失败 TCP 139 存疑 多个IP 失败 TCP 445 普通查点、口令猜测、MSRPC-SVCCTL服务枚举漏洞等 210.22.204.101 成功 TCP 445 PSEXESVC攻击 61.111.101.78 成功
-
3.学习中遇到的问题及解决
-
问题1:对linxu下相关字符串处理的命令不够熟悉
-
问题1解决方案:自己手写的python程序,配合简单的正则表达式,最终达到了相同的效果
-
问题2:自己的基础还是太欠缺了,特别是分析最后一道题的时候,对着大量的数据报文无处下手
-
问题2解决方案:回看之前的内容,使用snort+wireshark+google完成了相关的任务
4.实践总结
这份作业说实话有点难,我做的也不够好,接下来的几天我再修改修改争取课上能把完整的知识点细致的讲解出来。