本次实践的目标是向大家展示不同的方法来收集、分类、存储样本。本次练习将会从垃圾邮件中提取恶意样本附件,然后存储到我们配置好的存储器中。
在第一阶段,我们需要先配置用来收集垃圾邮件的Shiva 蜜罐,然后通过提供的脚本来测试垃圾邮件中的陷阱,如果测试没问题,我们会基于Viper项目创建一个测试样本仓库。
然后学习如何根据我们的需求来定制化Viper和Shiva的功能。
到了第二阶段,我们会启动一个脚本来创建垃圾邮件,然后对垃圾邮件进行分析。
通过本次实践,我们将学会:
本次我们将要完成的蜜罐系统架构图如下:
首先我们先来了解一下常规的样本收集方法都有哪些?
下面我将会介绍各种获取样本的方法,包括蜜罐系统、收集垃圾邮件、爬取被感染的网站、还有公共的恶意样本共享仓库,以及样本分享网站。
其实有很多可以获取样本的资源,下面介绍几种最常用的方式。
蜜罐通常专门用来检测和报告本地基础设施和更广泛的网络发生的新攻击事件。蜜罐系统通常安装了许多容易被攻击的服务,并且会自动收集正在遭受攻击行为信息。有些蜜罐甚至可以根据攻击信息来检索与其相关的恶意样本,如Dionea6,在参考资料中我列出了一些关于蜜罐有用的网站
尽管人们已经意识到了打开一封未知来源的邮件有风险,垃圾邮件仍然是传播恶意软件最常见有效的方法之一,黑客通常使用各种社会工程学技术诱导人们打开包含恶意附件的邮件或者包含已经被挂马的网站链接。
近些年来挂马网站逐渐成为最常用传播木马的方式之一,如果你使用过时的浏览器打开一个挂马网站,通常会在你的电脑上后台偷偷自动下载并执行恶意代码。使用爬虫技术以及客户端蜜罐可以追踪受感染情况的网站,然后尝试提取恶意样本。
恶意样本同样也可以从各种恶意样本分享网站以及公共样本库获取。这类网站通常由计算机安全爱好者或专业人士维护。有些网络安全公司也会免费提供一些样本下载,有的则需要收费才能下载。
CERT社区在获取恶意样本的工作中扮演着重要的角色,由于每天可以获取到大量样本,但大多数情况下分类和分析的资源有限,导致很难找到与最新攻击相关的恶意样本。以至于论坛社区变成了分享恶意样本的地方。例如一些分享恶意软件的博客,从读者哪里获取一些有意思的样本,再通过博客分享给其他需要样本的人。
下文中描述了三种经典方法来收集垃圾邮件。
通过这种方法,邮件陷阱充当公开的中转(中继转发)服务器。当某人(通常是垃圾邮件机器人)尝试通过部署了邮件陷阱的中转服务器发送一封邮件后,会收到信息提示它发送的邮件已经成功被发送了。但其实邮件并没有被发送,而是被邮件陷阱系统处理收集并保存起来了,后面内容将详细了解如何实践这种方法。
另外一种方法是将邮件陷阱服务器IP解析成一些指定域名的DNS和邮件交换器MX,然后这些伪造的邮件地址可以被各种网站使用,当垃圾邮件发送者收集虚假的邮件时并向这些邮件地址发送垃圾邮件。
现如今大部分的垃圾邮件都是由僵尸网络或者被感染的电脑发送的。我们可以通过一台机器来专门养一个发垃圾邮件的病毒,然后监控这台机器上所有来往的STMP流量。另一种方式是逆向病毒样本和C2服务器的通信协议和命令,然后直接伪造请求并发送到C2服务器,来获取最新的垃圾邮件内容
下面了解一下垃圾邮件收集经常遇到的问题
垃圾邮件制作者们知道有很安全研究者对捕获他们的垃圾邮件非常感兴趣(通常用来构建基于IP的黑名单,拦截病毒木马)。为了防止这种情况发生,黑客可以利用公开的中继服务器先发送一封测试邮件给自己指定的邮箱,然后查看是否可以正常接收邮件。如果收到邮件,就说明这个中继服务器可以用来发送垃圾邮件。可以利用算法来识别这种测试邮件,并正常转发这些测试邮件。
由于网上垃圾邮件的泛滥,垃圾邮件收集通常会涉及处理大量数据,可能会非常耗费资源。
可以考虑使用分布式垃圾邮件传感器和分析机器来解决这个问题,但分布式网络并不在本文介绍范围内。不过Shiva蜜罐只需要简单配置一下就可以使用分布式环境。另一种解决方法是限制垃圾邮件的存储数量,通过汇总类似的邮件发送垃圾邮件,这是Shiva蜜罐的主要特性之一。
在本部分可以学习到如何安装和配置Shiva这个高效互动的SMTP专为垃圾邮件收集和分析而设计的蜜罐。Shiva由两个主要的模块组成:shivaReceiver 和 shivaAnalyzer。
前者作为典型的SMTP服务器可以用来接收和存储垃圾邮件。
后者用来对垃圾邮件初步分析,检测类似的内容(基于Fuzz Hash)以及提取邮件中的任何附件或URL。
Shiva蜜罐是一个python项目,使用Lamson Python 邮件服务器作为后端。而且依赖Exim4邮件服务器来中转邮件(在本次实践没有使用),还有Mysql数据库用来存储结果。
第一步,停止INetSim服务:
下一步,安装Shiva依赖
然后安装ssdeep 2.10包,对用Shiva来说Ubuntu默认的ssdeep包版本太旧了。
安装Mysql数据库,安装过程中会要求你输入mysql密码,请牢记这个密码,后面Shiva会用到。
配置mysql账户root的密码
安装phpMyAdmin
此时Shiva蜜罐并没有提供一个GUI的视图来操作和分析存储的结果。为了方便我们查看结果,需要安装phpMyAdmin。当提示你自动配置web服务器时,选择apache2.当提示设置phpMyAdmin密码时,设置与上面Mysql一样的密码即可。
上图为选择web服务器,选择Apache2
上图为自动配置数据库,选择yes
上图为设置数据库访问密码,设置和root一样的密码就行。
上图为配置phpMyAdmin访问密码,输入和root一样的密码。
上图为确认phpMyAdmin密码。
然后配置Apache服务器监听的ip地址。通过这种方式设置可以让未授权的用户或其他机器可以访问phpMyAdmin的页面
然后检查phpMyAdmin是否可以正常访问,http://192.168.56.10/phpmyadmin 。使用root账户和你设置的密码来登录。
上图为http://192.168.56.10/phpmyadmin打开后的页面
PhpMyAdmin是Mysql的图形化交互的工具,同样可以用来管理数据库,访问数据。后面可以用它来查看Shiva蜜罐捕获到的样本数据。
在安装完依赖后,可以重新启动inetsim服务了
拷贝并解压Shiva源码到/opt/目录,然后开始安装。你需要使用chmod +x 命令来改变安装文件的权限。
在安装过程中它会提示你是否需要保存分析结果到数据库,选择yes
取决于机器性能,安装过程可能会花费几分钟时间。如果一些顺利,你应该会看到通知消息提示你,安装以及完成,你可以开始使用Shiva蜜罐了。
如果安装过程中出现任何错误,删除新创建的shiva目录(/opt/shiva/shiva),然后解决问题后,重新运行安装脚本。
安装完成后,进入新创建的Shiva目录,然后使用vim或nano打开shiva.conf配置文件。
修改ShivaReceiver模块的host和port,在[receiver]部分。这个地址和端口是SMTP服务器进程用来监听接收垃圾邮件的。在本次实践中,你可以保留它的IP地址为127.0.0.1,但是如果是其他情况下,这里应该配置成公网的IP。
Shiva.conf
禁用垃圾邮件中转。在正常情况下,用户可能会决定转发某些特定垃圾邮件。Shiva默认允许在指定时间内转发特定数量的邮件。但是本次实践的目需要禁用中转服务器,因为我们不想转发任何垃圾邮件给任何人。
Shiva.conf
设置调度时间为5分钟。这个时间是用来指定多久分析一次新收到的邮件,然后把分析结果保存到数据库。在正常情况下,出于性能优化的考虑,你可能会把调度时间设置更长一点。为了防止跟Shiva其他功能调度发送冲突,设置调度时间最好不要少于4分钟。
Shiva.conf
在[databases]部分配置数据库访问。默认Shiva蜜罐使用MySQL数据库,并会创建两个数据库实例。一个用来保存临时结果。另一个用来保存最终结果。
Shiva.conf
禁用通知和hpfeeds共享功能。
Shiva.conf
保存配置文件后,最后一部是设置数据库模型,和配置本地邮件转发代理服务。可以使用dbcreate.py和setup_exim4.sh脚本来完成。
前面提到过,Shiva由shivaReceiver和shivaAnalyzer两个模块组成,前者负责接收垃圾邮件,后者用来分析垃圾邮件并保存结果到数据库。
在正常情况下是可以同时运行两个模块的,除非你使用分布式环境来收集垃圾邮件,一些主机专门用来收集垃圾邮件,另一些主机专门用来分析和存储。
启动shivaReceiver模块:
启动shiavaAnalyzer模块:
上图为检查shiva进程是否正常运行。
为了测试Shiva是否正常工作,我们可以用一个脚本来测试,这个脚本会发送一封测试邮件到Shiva本地端口,然后我们可以看查看日志文件,检查日志是否正常,以及分析结果是否被添加到数据库中。
首先打开两个新的终端窗口,第一个窗口用来查看Shiva Receiver日志文件:
上图为shivaReceiver日志内容
第二个终端窗口检查Shiva Analyzer模块日志文件:
上图为shivaAnalyzer模块日志内容。
打开两个日志文件的实时监控后,回到主终端窗口,运行我们的测试脚本,发送测试邮件。
于此同时,观察Receiver和Analyzer日志文件。应该能看到类似正在处理的消息。
上图为shivaReceiver日志接收到新的垃圾邮件的日志
上图为shivaAnalyzer日志正在接收新任务和分析完成的日志。
等你看到Shiva Analyzer日志窗口中出现调用shivamaindb模块的时候说明已经保存新的记录到数据库中了。(分析周期是前面配置文件设置的5分钟)。
上图为调用Shivamaindb模块保存到数据库中。
下一步,打开http://192.168.56.10/phpmyadmin ,访问phpmyadmin,输入MySQL的root密码。然后查看Shiva数据库中的Spam表。
上图为在phpMyAdmin中查看Shiva发的测试邮件。
在两个终端窗口中实时查看Receiver和Analyzer模块的日志并不是必须的,同样可以在发送完测试邮件后在一个终端窗口中查看。打开两个终端窗口只是为了更好的视图化来了解Shiva蜜罐是如何工作的。
本次任务,我们将构建一个样本存储器,用来存放收到的恶意样本以及恶意URL。
样本存储将基于Viper项目,该项目可以用来简化样本组织和收集。Viper在单独项目中组织样本,可用来找到不同攻击中来源中相关联的样本,用于情报收集工作。
Viper的一个优点就是可定制化。用户可以编写自己的脚本,对样本执行某些特别分析。通过本次实践,我们将学过如何编写一个Viper模块,可以自动上传恶意样本到分析VM。
在任务最后,我们将使用Viper的API功能,实现自动上传从Shiva中提取出来的二进制样本
安装Viper非常简单。只需要copy它的源码到安装目录,并安装所有依赖,不需要配置任何配置文件。
安装依赖:
Viper可以运行在全局工作空间(匿名),或项目工作空间。项目工作区的意思是允许用户创建单独的不同恶意软件样本组。恶意样本只在能添加它的项目工作区中可见。
运行Viper只需要在它的目录下运行,./viper.py 。注意,运行viper时的当前目录,它会尝试读取它的数据库,相对于当前执行命令的目录。
上图为运行Viper后,进入命令交互界面。
启动Viper后,我们可以看到一个交互式命令窗口,可以输入各种命令。输入help可以看到所有可使用的命令。命令被划分成两组:普通命令和模块命令。
下一步,使用open命令在Viper打开新的样本(/home/enisa/enisa/ex2/samples/putty.exe)。
上图为,在Viper中打开putty.exe 测试样本。
打开一个样本后会创建一个新的会话,该样本还没保存在本地仓库中,为了保存到本地仓库中,必须使用store命令。
上图为永久性保存putty.exe样本到数据库中。
可以使用sessions命令查看所有会话,每个会话都与一个打开的样本相关联。
上图为列出所有Viper中的会话。
列出仓库中所有的样本,可以使用find命令。我们可以使用各种搜索条件来缩小搜索结果比如文件名、文件类型、MD5 sum、标签、等等。当前版本中还不支持使用正则表达式或通配符。
上图为使用find命令查看本地仓库中样本的例子。
用户还可以给样本添加备注和标签。备注可以用来添加关于样本有用的信息。或只是说明它的来源。标签可以用来进一步组织各种该类型的样本(比如,家族,来源,等等)。
上图为添加和查看样本的备注。
上图为,添加和查看样本的标签。
现在你应该熟悉基本的仓库管理了。下一步我们来熟悉各种模块命令。
使用help命令可以列出所有有效命令,每个命令都可以用-h选项来查看这些命令的使用详细信息。
在字符串中找到跟域名或IP相关的信息:
上图在样本字符串中找到有用的主机和ip信息。
打印PE文件的区段和大小,RVA以及entropy:
上图为查看PE文件的区段信息。
退出Viper可以使用exit命令。
我们将在这一步学习如何编写一个Viper模块,并直接上传样本到分析虚拟机。我们将使用FTP协议来上传样本。确保已经在分析虚拟机中安装好了FTP服务器。所有样本会上传到ftp://10.0.0.2/sample/目录,假设10.0.0.2是我们分析样本虚拟机的IP地址。
首先进入Viper模块目录创建一个模块文件。
然后编写下面代码:
Lab-send.py
在上面代码中,假设我们的分析虚拟机的IP是10.0.0.2(DEFAULT_HOST).可以替换成你的分析虚拟机IP。或者每次运行脚本的时候使用命令行参数(--host)指定。
把它拷贝到viper modules目录下:
现在如果你使用help命令列出所有命令,你可以看到lab-send脚本在模块命令中。
上图为,使用help命令打印出我们自定义的模块。
为了测试脚本文件,首先需要恢复分析虚拟机的快照,并启动分析虚拟机。
然后在Viper中打开之前打开过的putty.exe样本,尝试发送它到分析虚拟机。
上图为发送putty.exe样本到分析虚拟机。
为了确定是否被成功上传了,可以到分析虚拟机查看c:\analyses\sample目录下是否存在putty.exe文件。
上图为检查样本是否被成功上传到分析虚拟机。
Viper提供了一些工操作样本的HTTP API,比如添加新样本、下载样板、查找样本、查看标签等。
在这一步,我们将实现一个样本补丁来扩展ViperAPI的功能,通过URL添加样本,在指定项目工作区启动API(默认启动API只能在匿名全局工作区)。然后我们将写一个小工具,用来通过Linux命令添加样本到Viper。
Patching Viper API:
在enisa项目上下文中,后台启动API
因为我们现在将编写一个Linux命令行脚本来直接添加样本到Viper,所以Viper API服务必须运行在后台。
lab-viper-upload:
为了测试该脚本是否正常工作,尝试从/home/enisa/enisa/ex2/samples/目录把样本pscp.exe添加到Viper里面。
测试 Viper-upload 脚本:
上图为使用上传脚本添加样本到Viper。
然后你可以从/opt/viper/目录中启动Viper,查看样本是否添加成功。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课