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.execrackme2.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并撰写分析报告

  • 提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息
  • 找出并解释这个二进制文件的目的
  • 识别并说明这个二进制文件所具有的不同特性
  • 识别并解释这个二进制文件中采用的防止被分析或被逆向工程的技术
  • 对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由
  • 给出过去已有的具有相似功能的其他工具
  • 可能查出这个二进制文件的开发作者吗?如果可以,在什么样的环境下和什么样的限定条件下?

  • 首先打开wiresharkProcess Monitorregshot.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_405E40sub_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_4052C0sub_404FB0。这里我们重点看第一个函数,再函数中我们发现它还调用了其他字符串,包括name exegetputscreenshotsleep这几个指令函数。


    图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这三者联合起来可以作为一个这个文件的基本信息身份标识。
  • 找出并解释这个二进制文件的目的:通过上边的分析,我们可以知道这个二进制程序通过网络获取指令,并执行,不具备自主传播模块,由此可知,这个应该是后门程序僵尸网络程序

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

    • 初次安装的时候会进行初始化的相关操作,添加注册列表、移动文件位置至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加密传输
    • 由于此处的端口号并不唯一,这就导致难以通过端口号进行检测,这里使用协议过滤的相关内容,对NICKJOIN等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.172172.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.06667209.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地址被用于攻击蜜罐主机?

    • 这里我们使用snortpython进行处理,一个负责拿到嗅探数据的警报,另一个用来分析警报。

    • 首先我们使用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 ISAPIdafault.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.16780.181.116.20268.154.11.8268.152.53.138210.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.实践总结

这份作业说实话有点难,我做的也不够好,接下来的几天我再修改修改争取课上能把完整的知识点细致的讲解出来。


参考资料

posted @ 2020-04-27 17:43  孙启龙20199102  阅读(689)  评论(0编辑  收藏  举报