自动化恶意软件分析系统建立及入侵检测规则生成

本实验在Windows下完成,在linux下同理。

沙箱又可称为沙盒、沙盘(英文名为 Sandbox),是一种按照既定的安全策略,通过限制程序行为来测试可疑软件(通常用来测试恶意软件)的特定受限安全环境。因在沙箱环境内运行的程序不会对硬盘产生永久性的影响,并可以通过快照恢复技术来使得虚拟环境回复到执行恶意软件之前的安全状态下,因此可以安全的用来建立自动化获取恶意软件网络流量特征所需的虚拟环境。
虚拟机( irtual Machine)是一种在隔离状态下的安全的通过软件模拟出来的计算机系统,且其和正常的系统一样拥有对应的完整的硬件系统功能。
虚拟系统具有与真实 windows系统完全一样的功能,它的工作原理是生成一个现有操作系统的全新虚拟镜像。它进入虚拟系统后,所有操作都在这个完全独立的虚拟系统里面进行,可以独立安装和运行软件,保存数据,并且具有虚拟系统独立的桌面,不会对原系统造成实质性的影响。同时,原系统与镜像之间可以完成灵活操作。虚拟系统和传统的虚拟机不同在于以下几点:虚拟系统对电脑的性能没有影响,启动虚拟系统并不像传统系统启动需要耗费大量时间,系统的运行更加方便;虚拟系统依托于现操作系统模拟出与之相同的环境,而虚拟机则可以模拟出完全不同的操作系统;其次虚拟机在工作时需要模拟底层的硬件指令,所以在程序运行速度上与虚拟系统的运行速度相距甚远。

Fakenet-NG是一款专门为了恶意软件分析人员设计的下一代动态网络分析工具,其是一款开源软件,并且支持多平台运行( windows和inux)。该软件可以监听特定的网络流量,模拟正常网络服务,并在网络服务中拦截或重定向所有或者特定的网络流量,并在结束程序以后自动生成pcap文件,以供恶意软件分析人员对恶意软件的网络流量特征进行进一步的分析和提取。--下载
安全分析人员可以在 FakeNet-NG允许范围内,可以在单个 Windows主机上使用其标准或自定乂安全协议来观察网络应用程序并与其进行交互,这项功能给恶意软件分析以及逆向工程带来特别大的用处。自从在2016年 FLARE将 FakeNet-NG的功能推出以来, FLARE又对其某些功能进行了一系列的升级,侧如对其增加了对附加协议的支持。FakeNet-NG现在具有DNS,HTTP(包括BTs),TFTP, FTP,SMTP,IRC,POP,UDP和TCP以及SSL的即用支持。

当你分析网络流量包的时候发现有 239.255.255.250,不必惊慌,这是正常的。是SSDP(简单服务发现协议),这是路由器的UPNP服务使用的协议。

 简单服务发现协议(SSDP,Simple Service Discovery Protocol)是一种应用层协议,是构成通用即插即用(UPnP)技术的核心协议之一。

 简单服务发现协议提供了在局部网络里面发现设备的机制。控制点(也就是接受服务的客户端)可以通过使用简单服务发现协议,根据自己的需要查询在自己所在的局部网络里面提供特定服务的设备。设备(也就是提供服务的服务器端)也可以通过使用简单服务发现协议,向自己所在的局部网络里面的控制点宣告它的存在

 

1.首先在主控端开启FTP服务

目的是为了将沙箱的网络流量报告用python自动发送到主控端电脑上。如何安装FTP可以参考https://www.cnblogs.com/ethtool/p/12391004.html

2. 主控端的发送报告程序

流程:

 主控端功能实现

 对于控制端而言,为了完成自动化恶意软件网络流量征获取,其需要实现的主要功能有以下3点

1.通过 socket模块绑定本地 IP,监听指定端口,等待被控端(虚拟机)连接

2.向被控端(虚拟机)发送需要执行的恶意软件名称

3接受被控端(虚拟机)发送来的流量特征报告

4.重启被控端(虚拟机)并恢复快照(恢复到未执行任何恶意软件的安全,干净的环境状态下)

 

socket模块是典型的通讯模块

 主程序是serverDemo.py文件,作用就是开一个监听端口让被控端来连接,以控制其进行命令执行和开关机操作,还会自动开启并打开虚拟机,以能够周而复始运行程序。来看一下代码:

import os #导入OS模块
import socket #导入socket模块
import time

for i in range(77):
    HOST = '192.168.18.6'
    PORT = 10888
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #socket.AF_INET服务器之间网络通信,socket.SOCK_STREAM,TCP协议
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept() #conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
    while True:
        j=str(i)
        data = conn.recv(1024)
        data=data.decode('utf-8')
        if data=='发送病毒编号':
            conn.sendall(j.encode('utf-8'))
            break
    conn.close()
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    while True:
        data = conn.recv(1024)
        data=data.decode('utf-8')
        if data=='病毒分析完毕':
            print('病毒分析完毕,即将重启虚拟机并恢复快照')
            time.sleep(25)
            os.system('C:\\Users\\Administrator\\Desktop\\powerup.bat')
            break
    conn.close()
    
    
serverDemo.py

 

自动开机虚拟机并恢复快照:

我们此时分析完一个病毒后,会让虚拟机自动关机,然后再自动开机分析下一个病毒。那么如何让虚机在关机的状态下自动开机并打开最近的快照呢。一条命令就可解决:

start d:\vm\vmware.exe -x "D:\Windows 7 x64\Windows 7 x64.vmx"

#D盘的vmware.exe
#虚机所在的位置;都是不唯一的,需要自己定位到安装目录里。
#-x 的意思就是不仅打开VMware还要打开对于的虚机

有一个小的注意点:如果你的虚机设置了开机登陆密码验证,为不影响实验(其实不影响,因为后面是快照恢复),这里可以学习一下关闭开机登陆密码验证关闭方法:

直接CMD下输入 control userpasswords2

 

 还有一点:因为从论坛下载的恶意软件样本名称往往比较混乱并且并非其真实名称以及真实后缀,并且为了方便实验的进行,由控制端发起的被执行恶意软件名称简单化会简化实验代码,故按数字排序0至N的方式对恶意软件样本重命名,并将后缀名改成可执行文件变得很有必要。

如何将文件夹内的所有文件重命名并改变文件类型

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os  #导入文件操作模块
i = 0
files = os.listdir('.')   #读取文件夹中所有文件
for filename in files:  #遍历文件
    portion = os.path.splitext(filename)  #以后缀名作为分割,获得文件后缀
    if portion[1] != '.py':  #判断是否为本程序文件
        j = str(i)
        newname = j + ".exe" 重命名文件
        i+=1
        os.rename(filename,newname)

当然,如果样本名不重新命名,写成列表的形式也是可以 的。

对了!假如以后遇到你只想重命名而并不想改变文件后缀名的可以这样:

i = 0
files=os.listdir(".")
for filename in files:
    portion = os.path.splitext(filename)
    if portion[1]==".pcap":
        j = str(i)
        newname = j + ".pcap"
        os.rename(filename,newname)
        i=i+1
伪-changename

 

权限设置,cmd管理员运行

 我们首先在虚拟机里安装了fakenet.exe(直接解压就可使用),尝试手动运行,并导出网络分析报告.pcap文件。这时我们发现需要。这个软件执行时需要管理员权限,所以如果在自动化过程中,我们需要加入一条cmd命令让其以管理员的身份运行:

reg add"HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\AppCompatFlags\Layers" /v"c:\windows\system32\cmd.exe" /d "RUNASADMIN" /f

通过上述脚本,建立.bat文件后,手动以管理员权限运行脚本,以后所有通过cmd命令行模式运行的可执行程序,都会以管理员的权限去运行,从而很好的解决这个问题。

3.被控端功能实现&快照设置

 

对于被控端而言,为了实现自动化恶意软件网络流量特征获取,其需要实现的主要功能有以下点:
1.通过 socket主动连接主控端P以及绑定端口,从而形成通讯。
2.告知主控端已准备就绪,等待主控端告知需要执行的接收恶意软件名称

3以管理员模式运行 Fakenet-NG
4.执行主控端告知的恶意软件5关闭运行中的 Fakenet-NG
6将 Fakenet-NG自动产生的流量报告(.pcap格式文件)重命名为对应的恶意软件名称,如恶意软件名为1.exe 则对应的流量报告文件名1.pcap

import os #导入文件操作模块
i=0
files=os.listdir(".") #读取文件夹中所有文件
for filename in files: #遍历文件
    portion = os.path.splitext(filename) #以后缀名作为分割,获得文件后缀
    if portion[1]==".exe": #判断是否为pcap文件
        data=str(i)
        newname = data + ".exe" #重命名文件
        os.rename(filename,newname)
        i=i+1
RenameDemo.py

7通过方式连接外部主控端的fp服务器,将已重命名的pcap流量报告文件传送至指定文件夹并以已重命名的文件名保存。
8.告知主控端,恶意软件已分析完毕,淮备关闭虚拟机。
9关闭虚拟机,等待主控端命令重启虚拟机并还原快照。

 

之后,将展示并分析相关 Python代码以及程序需要调用的BAT脚本语言

 什么时候拍摄快照及如何开机直接进快照

 快照的作用简单来说,无论虚拟机进行过什么样的操作(删除快照除外),虚拟机都可以通过恢复快照的方式恢复到拍摄快照时的状态。

关机时选择恢复到快照,这样就可以实现每次在分析完一个恶意软件之后通过关闭虚拟机的方式将其恢复到拍摄快照处的状态,从而保证了每次虚拟机运行环境都是安全的干净的未被污染的。

为保证每次启动时自动运行被控制端编写的代码,因此可以通过首次手动运行被控端程序,运行后随即拍摄快照,保存状态。

如何开机直接进快照:

【虚拟机】-【设置】-【选项】关机时:恢复到快照

 

 

 

 放在fakenet1.3文件夹下放进一个customerDemo.py文件,作为主程序,来看一下:

import os #导入OS模块
import socket
import time
from ftplib import FTP
time.sleep(5)  #重启后给人处理的反应时间
HOST = '192.168.18.6'   #主控端的IP
PORT = 10888
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  #TCP
s.connect((HOST, PORT))
data = "发送病毒编号"
while data:
    s.sendall(data.encode('utf-8'))
    data = s.recv(512)
    data=data.decode('utf-8')
    break
s.close()  #关闭连接
bingdu='start C:\\Users\\tom\\Desktop\\bingdu\\'+data+'.exe'
f=open('C:\\Users\\tom\\Desktop\\NO.bat','w')
f.write(bingdu)
f.close()
os.system('C:\\Users\\tom\\Desktop\\运行.bat')

time.sleep(10)
os.system('C:\\Users\\tom\\Desktop\\NO.bat')
time.sleep(60)
os.system('C:\\Users\\tom\\Desktop\\kill.bat')
time.sleep(2)
files=os.listdir(".")
for filename in files:
    portion = os.path.splitext(filename)
    if portion[1]==".pcap":
        newname = data + ".pcap"
        os.rename(filename,newname)
        ftp=FTP() #实例化一个FTP程序
        ftp.set_debuglevel(0)   #打开调试级别;0为关闭调试信息 
        ftp.connect('192.168.18.6',21)  #连接FTP服务器 
        ftp.login('anonymous','')   #登录,如果匿名登录则用空串代替即可
        bufsize = 1024  #设置缓冲块大小 
        file_handler = open('C:\\Users\\tom\\Desktop\\fakenet1.3\\'+newname,'rb')  #以读模式在本地打开文件 
        ftp.storbinary('STOR %s' % os.path.basename(newname),file_handler,bufsize) #上传文件 
        ftp.set_debuglevel(0) 
        file_handler.close() 
        ftp.quit() 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
data = '病毒分析完毕'
while data:
    s.sendall(data.encode('utf-8'))
    break
s.close()
os.system('C:\\Users\\tom\\Desktop\\poweroff.bat')
customerDemo.py

在程序中我们可以看到有很多的bat文件的调用,其实这些命令可以合成进一个文件中执行,为了来便于理解才展开来用,一起看下:

f=open('C:\\Users\\tom\\Desktop\\NO.bat','w')
f.write(bingdu)
f.close()
os.system('C:\\Users\\tom\\Desktop\\运行.bat')

os.system('C:\\Users\\tom\\Desktop\\kill.bat')

这个NO.bat是重启后修改待分析病毒号用的:

start C:\Users\tom\Desktop\bingdu\0.exe

这个 运行.bat是开启fakenet.exe的:

cd C:\Users\tom\Desktop\fakenet1.3
start fakenet.exe

这个kill.bat文件是用来结束程序fakenet进程的:

start taskkill /im fakenet.exe

这个poweroff.bat文件是关机用的:

start shutdown -s -t 00

值得注意的是cmd命令中的这个start 一定不能缺少,不然程序会等待等待一直等待你这个cmd命令运行结束才会进行下一步。所以必须开头加一个start

 

这样程序就可以一直重复检测重命名完的病毒文件并自动将报告发送到你的ftp里了。


分析

nslookup www.baidu.com 可以转化为对应ip; 还可以反向解析)

我们获得了pcap格式的网络流量特征报告,为了使得恶意软件样本对应的网络流量行为特征更便于 python代码读取处理,因此将其转换成可方便读取的txt文档就变得很有必要。
对于该需求,可以通过 Tshark命令行去实现,其本身是软件 Wireshark的组件。是一种网络协议分析软件,其可以实现读取分析由 Wireshark生成的标准网络流量分析文件pcap. Tshark能通过命令行模式检测、读写由 Wireshark生成的pcap标准网络流量分析文件。并且该网络协议分析软件还支持将·pcap中的网络流量特征按需要(部分:正则表达式等语句与在 Wireshark中筛选流量特征相同)或全部以文本格式保存在指定的txt文档中。
其命令如下:
tshark. exe-V-rC:\ Users\瞿纯超\ Desktop report\ XXX. pcap>C:Users\瞿纯超\
Desktop\ txtreport l XXX. txt

使用 tshark相关命令将恶意软件对应生成的pcap格式的网络流量行为特征转换对应的txt文本文档并保存在指定的目录中,其中xxx既为恶意软件的名称,在 Python中由变量指定。

流量聚类

import os #导入文件操作模块
import re #导入re模块
import shutil
files=os.listdir(".") #读取文件夹中所有文件
for filename in files: #遍历访问所有文件
    portion = os.path.splitext(filename) #按后缀名分割文件名
    if portion[1]==".txt": #排除本python系统
        for line in open(filename): #逐行读取文本内容
            d=line.split(':') #Http协议聚类
            if(d[0]=='    Host'):
                temp1=line.split('    Host: ')
                temp2=temp1[1].split('\\r\\n')
                f=open('c:\\Users\\Administrator\\Desktop\\readhttp\\'+portion[0]+'.txt','a')
                f.write(temp2[0])
                f.close()
            g=line.split(',') #tcp流量聚类
            if g[0]=='Transmission Control Protocol':
                shutil.copyfile(filename, 'C:\\Users\\Administrator\\Desktop\\TCPONE\\'+filename)
            elif g[0]=='User Datagram Protocol': #UPD协议聚类
                shutil.copyfile(filename, 'C:\\Users\\Administrator\\Desktop\\UDPONE\\'+ filename)
trafficClusterDemo.py
import os #导入文件操作模块

files=os.listdir(".") #读取文件夹中所有文件
for filename in files: #遍历访问所有文件
    portion = os.path.splitext(filename) #按后缀名分割文件名
    if portion[1]==".txt": #排除本python系统
        for line in open(filename): #逐行读取文本内容
            d=line.split('/')
            if(d[0]=='    POST 'or d[0]=='    GET '):
                temp1=line.split(' HTTP')
                temp2=temp1[0].strip()
                t=temp2.split('/')
                if t[0]=='GET ':
                    e=temp2.split('GET /')
                    f=open('c:\\Users\\Administrator\\Desktop\\readhttps\\'+portion[0]+'.txt','a')
                    f.write(e[1])
                    f.close()
        
                if t[0]=='POST ':
                    e=temp2.split('POST /')
                    f=open('c:\\Users\\Administrator\\Desktop\\readhttps\\'+portion[0]+'.txt','a')
                    f.write(e[1])
                    f.close()
httpRead.py

 

 

 特定的网络流量入侵检测规则所针对的是通讯协议、目标地址目标端口这三个主要参数

流量清洗

 

 

import os #导入os模块
import re #导入re模块
import shutil #导入shutil模块
files=os.listdir(".") #读取文件夹中所有文件名
seconds=os.listdir("C:\\Users\\Administrator\\Desktop\\readhttp")
t=1
f=[]
for filename in files:
    portion = os.path.splitext(filename)
    if portion[1]==".txt":
        for second in seconds:
            if filename==second:
                t=0
        for line in open(filename):
            if line== '80'and t==0:
                f.append(filename)
    t=1
g=1    
for filename in files:
    portion = os.path.splitext(filename)
    if portion[1]==".txt":
        for name in f:
            if name==filename:
                g=0
        if g:
            shutil.copyfile(filename, 'C:\\Users\\Administrator\\Desktop\\TCP\\'+filename)

        g=1

特定规则生成

 

 

import os #导入文件操作模块
import re #导入re模块
import shutil
temp2='114.114.114.114'
files=os.listdir(".") #读取文件夹中所有文件
for filename in files: #遍历访问所有文件
    portion = os.path.splitext(filename) #按后缀名分割文件名
    if portion[1]==".txt": #排除本python系统
        for line in open(filename): #逐行读取文本内容
            d=line.split(':') 
            if(d[0]=='Address'):
                temp1=d[1].strip()
                temp2=temp1.strip('\n')
        if temp2!='114.114.114.114':
            f=open('c:\\Users\\Administrator\\Desktop\\HTTPTWO\\'+filename,'a')
            f.write(temp2)
            f.close()
http Demo Two.py
import os #导入os模块
import re #导入re模块
files=os.listdir(".") #获得文件夹下所有文件名
for filename in files: #循环遍历读取文件
    portion = os.path.splitext(filename) #按后缀名分割文件
    if portion[1]==".txt": #排除本python程序
        g=open(filename,'r')
        line = g.readline()
        t=line[:-1]
        line = g.readline()
        e=line
        g.close()
        f=open('c:\\Users\\Administrator\\Desktop\\ruleone\\'+portion[0]+'.txt','a')
        f.write('alert udp any any -> '+t+'/32'+' '+e+' (msg : "This is the NO.'+portion[0]+'")')
        f.close()

机器学习监督学习:常见的模型有逻辑斯蒂算法、决策树算法。

 附:代码及流量报告百度云:提取密码:ms0k

欢迎关注微信公号:ethtool

posted @ 2020-03-03 16:41  香农Shannon  阅读(1065)  评论(0编辑  收藏  举报