20252812 2025-2026-2 《网络攻防实践》实践八报告
20252812 2025-2026-2 《网络攻防实践》实践八报告
1.实践内容
1.1 本周学习内容
1.1.1 恶意代码
在1983年11月的国际计算机安全学术研讨会上,美国计算机安全专家首次发表了计算机病毒研究报告,第一次向人们证实了计算机病毒的存在。此后,恶意代码不断发展、演化,产生出后门、特洛伊木马、僵尸程序等多种恶意代码形态。计算机病毒是编制或在计算机程序中插入的,破坏计算机功能或数据、影响计算机使用,并可以自我复制的一组计算机指令或程序代码。计算机病毒具有感染性、潜伏性、可触发性、破坏性、衍生性。其中衍生性指计算机病毒的编写者或其他了解此病毒的人可以根据个人意图对某个已知的病毒程序进行修改,从而衍生出一种或多种病毒变种。特洛伊木马是一种偷偷越过计算机安全防线,是自己看起来像正常的有用软件的程序。木马程序的编写者会欺骗用户或系统管理员安装木马程序,导致木马程序通过毫无戒备的用户进入到系统中,然后木马程序会隐藏在计算机的正常程序中,将自己伪装起来,使自己看似无害。
1.1.2 恶意代码分析技术
恶意代码分析有动态分析和静态分析两类分析方法。通过静态分析方法,能够对恶意代码的特性和目的有一个大体的了解,甚至能识别出恶意代码的各组成部分。采用动态分析时,实际上激活了一个受控分析实验环境中的代码。有些恶意代码携带了“时间炸弹”或“逻辑炸弹”,只有环境满足特定约束条件才会导致其恶意行为启动。恶意代码静态分析技术包括反病毒软件扫描、文件格式识别、字符串提取分析、二进制结构分析、反汇编、反编译、代码结构与逻辑分析、加壳识别与代码脱壳等。进行恶意代码动态分析时,要搭建一个与外界网络和互联网完全断开的恶意代码分析实验环境,且在分析完成后尽快恢复恶意代码运行平台。需要通过文件监视器、进程监视器、注册表监视器等观察恶意代码在计算机中的活动。动态分析的技术手段包括快照比对、系统动态行为监控、网络协议栈监控、沙箱、动态调试等。
1.2 实践内容
1.2.1 动手实践任务一
对一个rada恶意代码样本进行类型识别、脱壳、字符串提取等操作,从而发现恶意代码的文件格式、运行平台、编写作者等。
1.2.2 动手实践任务二
在WinXP Attacker虚拟机中使用IDA Pro静态或动态分析恶意程序,寻找使其能产生成功输出的特定输入。
1.2.3 分析实践任务一
分析一个自制的恶意代码样本rada,探究此恶意代码的目的、防止被分析的技术、类型等。
1.2.4 分析实践任务二
分析一个用Snort搜集的蜜罐主机的五天的网络数据源,研究蜜罐主机与哪些IRC服务器进行了通信、攻击者尝试攻击了哪些漏洞等。
2.实践过程
2.1 动手实践任务一
在本任务中,要对RaDa.exe进行类型识别、脱壳、字符串提取等操作,从而发现恶意代码的文件格式、运行平台、作者等。我在学习通的资料区里下载了压缩包,解密后获得了RaDa.exe,通过拖拽将其放至WinXP Attacker虚拟机,接下来在WinXP Attacker虚拟机上分析此文件。在命令提示符中进入RaDa.exe所在的名为下载的文件夹,然后执行“file RaDa.exe”查看文件信息,此时file命令可被看作一个文件类型分析工具。分析结果显示,此恶意代码文件是个PE32文件,即Windows操作系统下的32位可执行文件。分析结果还显示它的运行平台是MS Windows

打开PEiD这个文件分析工具扫描RaDa.exe,发现加壳工具是UPX 0.89.6。UPX是一款文件压缩软件,可以被用于加壳。

在开始菜单找到超级巡警之虚拟机自动脱壳器,对RaDa.exe进行脱壳,成功了,脱壳后的文件为同一目录下的RaDa_unpacked.exe。

WinXP虚拟机上有一个叫IDA Pro Free的反汇编工具,它具有提取字符串的功能。用它打开RaDa_unpacked.exe,进入Strings界面,就可以看到分析出的字符串了,其中一行信息中字符串是“(c)Raul Siles && David Perez”,说明RaDa.exe这个恶意代码的作者是Raul Siles和David Perez。

仔细看其他字符串,会发现它们中的大多数都以双下划线开头,如_vbaVarCopy,这些可能是变量名,还有一些Command_usage之类的英文词组。
2.2 动手实践任务二
分析教师提供的crackme1.exe、crackme2.exe,探究怎样向这两个程序进行输入,才能使其反馈成功信息。
把crackme1.exe、crackme2.exe从学习通下载下来,拖动到WinXP Attacker中,用刚才提到的IDA Pro Free打开crackme1.exe,再在菜单栏选择View-Graphs-Function calls,查看用图形化形式表达的函数调用结构。既然希望函数输出成功信息,就要找到涉及输出的函数,于是我找到了sub_401280这个函数,它调用了fprintf、printf,可以输出字符串。

通过View-Graphs-Flow chart查看基于汇编语言的流程图,找到根节点为sub-401280的树,其内容见下面。

程序先是把[ebp_arg_0]与2作比较。若相等(即相减得到0,符合jz的条件)则执行loc_4012D2,若不相等则进入004012B0分支,输出“I think you are missing something.\n”,这个输出显然表明失败。我据此猜测[ebp_arg_0]所存储的是运行程序时的参数个数,参数个数必须为二。在loc_4012D2中,把“I know the secret”压栈,且执行了strcmp函数,然后又跟据ZF标志位跳转,ZF不为1则输出“Pardon?What did you say?\n”,表明失败。而ZF为1则输出“You know how to speak to programs, Mr. Reverse-Engineer\n”,这是一条表明成功的信息。据此推断要输入的其中一个参数应为字符串“I know the secret”。由此可见,为了让crackme1.exe输出成功信息,在命令行中需要输入的应为:crackme1.exe "I know the secret",既符合有两个参数,又符合参数之一是固定字符串,进行尝试,发现成功。

用IDA Pro打开crackme2.exe,采用分析crackme1.exe的方法进行分析,先看Function calls,发现只有sub_401280函数涉及fprintf、putchar这些输出字符串的函数,然后就在Flow chart中查看sub_401280,我发现[ebp+arg_0]被和2进行了比较,然后采用了jz指令根据ZF的值决定是否跳转,若不跳转,则输出“I think you are missing something.\n”,表示失败;若跳转,则进入loc_4012D5分支,暂时不输出。由此可见,[ebp+arg_0]应该是代表运行程序时的参数个数,crackme2.exe需要两个参数。

在loc_4012D5分支,先让“crackmeplease.exe”这个字符串入栈,然后执行strcmp函数进行字符串比较。若ZF=0,则进入左边分支,输出“I have an identity problem.\n”,表明失败,若ZF=1,则进入右侧loc_401313分支。而identity是身份的意思,文件的身份是文件名,这个失败提示信息暗示文件名有误,所以运行crackme2.exe前,应该将其更名为crackmeplease.exe再运行,使得第一个参数为crackmeplease.exe。在代表暂时成功的loc_401313分支,程序先让字符串“I know the secret”进栈,然后用strcmp进行字符串比较。接下来又是jz指令:若ZF=0,则进入代表暂时成功的true分支;若ZF=1,则进入40132F分支,且程序输出“Pardon?What did you say?\n”,代表失败。说明运行程序时的第二个参数应为字符串“I know the secret”。

在暂时成功的loc_401351分支,程序又用ja指令进行了一次条件转移,表示若通过比较发现大于,则跳转,但观察false和true分支的内容会发现此次条件转移与用户输入无关,不需要据此条件转移分析用户该怎样输入。根据汇编语言流程图,若输入正确,程序不会输出任何字符串,我在IDA Pro分析出的字符串集合中也没找到输入正确时程序会输出的字符串。

按照上述分析,运行crackme2.exe前,我应将其更名为crackmeplease.exe,然后输入:crackmeplease.exe “I know the secret”运行程序。我发现成功了,程序输出“We have a little secret: Chocolate\n”。这和我预想的不一样,我原本预想没有输出。这说明crackme2.exe其实把成功时的输出藏起来了。看了其他同学的实验报告后,我得知“We have a little secret: Chocolate\n”在代码中是被加密了的。

2.3 分析实践任务一
在这一小节中,我将分析恶意代码样本rada,并针对防止被逆向工程的技术、文件摘要、具有相似功能的其它工具等进行报告。
2.3.1 提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息。
在命令提示符中用md5sum命令可求出RaDa.exe的MD5摘要值为CAAA6985A43225A0B3ADD54F44A0D4C7,此摘要值可被用于识别两个样本是否为同样的样本。
2.3.2 找出并解释这个二进制文件的目的。
打开Process Explorer,然后运行RaDa_unpacked.exe,在Process Explorer中查看RaDa_unpacked.exe的属性中的字符串信息。我发现了[http://10.10.10.10/RaDa]和“RaDa_commands.html”,相关内容已被在下图中用红线圈出。这说明RaDa_unpacked.exe使得我的WinXP虚拟机主动尝试连接到10.10.10.10并获取RaDa_commands.html。其中,10.10.10.10可能是僵尸网络的中心,对于僵尸程序具有控制作用。而RaDa_unpacked.exe尝试下载的RaDa_commands.html应该是黑客用于发送命令的文件。若能正确接收RaDa_commands.html,RaDa_unpacked.exe就会据此操控当前主机完成一些任务。

RaDa_unpacked.exe还主动通过查询注册表中与VMware相关的内容以探究当前环境是否为VMware虚拟环境。

RaDa_unpacked.exe借助Wscript.Shell,采用RegWrite、RegRead、RegDelete等操作修改了注册表,将自身设置为开机自启动。

RaDa_unpacked.exe扫描了IP地址以192.168、172.16、10为前缀的主机,它想感染位于这些内网网段的主机,让这些主机上都被安装上RaDa.exe,且成为10.10.10.10所操纵的僵尸网络的一员。

与RaDa_unpacked.exe相关的字符串有C:\RaDa\tmp、C:\RaDa\bin,这应该是它访问了的路径。

我打开WinXP的C盘,发现果然被新建了C:\RaDa这个文件夹,且C:\RaDa里面被新建了tmp、bin两个文件夹,而在bin中被放入了RaDa.exe。

RaDa_unpacked.exe与原版RaDa.exe相比,只是脱壳了,它们的目的是相同的。因此RaDa.exe的目的有:1.连接到[http://10.10.10.10/RaDa],接收黑客下达的命令,并执行这些命令。2.扫描内网网段内主机,试图感染这些主机,让这些主机也成为僵尸网络的客户端。3.操控当前主机,具体操作包括创建文件夹、修改注册表等。
2.3.3 识别并说明这个二进制文件所具有的不同特性。
1.持久性。通过修改注册表,将自身设置为开机自启动,从而使自身能在被感染主机上持久运行。2.感染性。试图将自身传播到同一内网网段下的其他主机上。3.非隐匿性。RaDa.exe并没有将自身藏匿到其他合法软件中,它所创建的文件夹也不是隐蔽的。
2.3.4 识别并解释这个二进制文件中所采用的防止被分析或逆向工程的技术。
用PEiD扫描RaDa.exe,发现加壳工具是UPX 0.89.6。UPX是一款文件压缩软件,可以被用于加壳。这说明此二进制文件用到了加壳技术,从而防止被分析或逆向工程。

2.3.5 对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由。
我认为这个恶意代码样本是僵尸程序。理由如下:
僵尸程序是一种能自我复制并通过网络传播的恶意软件,一旦僵尸程序植入到一台受感染设备后,它就会接收、执行来自命令与控制服务器的远程指令。受僵尸程序感染的计算机和位于僵尸网络中心的一个或多个命令与控制服务器构成了僵尸网络。RaDa.exe这个恶意代码样本能感染同一内网中的其他计算机,会操控它已感染的计算机完成创建文件夹、修改注册表等操作,符合僵尸程序特征。且RaDa.exe尝试连接的10.10.10.10应该就是位于僵尸网络中心的命令与控制服务器,而RaDa.exe尝试获取的RaDa_commands.html用于存放命令与控制服务器希望RaDa.exe执行的指令。
2.3.6 给出过去已有的具有相似功能的其他工具。
过去已有的具有相似功能的一个其他工具是Mirai僵尸程序,它基于Linux系统,通过网络下载、漏洞利用、Telnet/SSH暴力破解传播,可以操控物联网设备发起分布式拒绝服务攻击。
2.3.7 可能调查出这个二进制文件的开发作者吗?如果可以,在什么样的环境和什么样的限定条件下?
有可能调查出此二进制文件的开发作者。获取作者的环境是RaDa.exe的运行环境即MS Windows

2.4 分析实践任务二
在此任务中,要分析一台蜜罐主机用Snort搜集了五天的网络数据,这些数据是经过编辑的。通过分析这些网络数据,得出有多少主机访问了僵尸网络、哪些IP地址被用于攻击蜜罐主机等结论。
2.4.1 IRC是什么?当IRC客户端申请加入一个IRC网络时将发送哪个消息?IRC一般使用哪些TCP端口?
IRC是互联网中继聊天,它是一种网络聊天协议。当一个IRC客户端申请加入一个IRC网络时,将按顺序发送以下消息,其中有的消息必须被发送,有的消息是可选的。
PASS <password> //可选,用于向服务器传递连接口令。
NICK <nickname> //必选,用于设置客户端在IRC网络中的唯一昵称。
USER <username> <hostname> <servername> <realname> //必选,这些信息用于完成注册。
JOIN <channelname> //可选,用于加入指定IRC频道。
IRC一般使用的TCP端口号有6660-6669、6697、7000、7001,具体来说,6667是IRC通信常用的默认端口,是标准明文通信端口。6697端口是IRC协议基于TLS实现加密通信的端口。此外,IRC服务还可使用6660-6666、6668、6669、7000、7001号TCP端口。
2.4.2 僵尸网络是什么?僵尸网络通常用于什么?
僵尸网络是采用一种或多种传播手段,使大量主机感染僵尸程序,从而形成的可以进行一对多控制的网络。僵尸网络通常被用于发起DDoS攻击、批量发送垃圾邮件、开展广告投放。
2.4.3 蜜罐主机(IP地址:172.16.134.191)与哪些IRC服务器进行了通信?
在物理机上,从学习通上下载日志文件,进行重命名,然后用Wireshark打开。经浏览整个日志文件,发现涉及IRC协议的数据包所用的端口几乎都是6667。于是为了研究蜜罐主机与哪些IRC服务器进行了通信,采用((ip.src == 172.16.134.191) && (tcp.dstport == 6667))进行过滤。会发现五个IRC服务器的IP地址:209.126.161.29、66.33.65.58、63.241.174.144、217.199.175.10、209.196.44.172。蜜罐主机在最开始和209.126.161.29、66.33.65.58、63.241.174.144、217.199.175.10这四台服务器进行了少量的通信,后面的通信几乎都是与209.196.44.172进行的。
2.4.4 在这段观察期间,多少不同的主机访问了以209.196.44.172为服务器的僵尸网络?
将日志文件重命名为AuT.pcap并上传到Kali虚拟机的/root/文件夹下。

在Kali虚拟机上,用apt-get install tcpflow安装接下来要用的tcpflow这个软件。

执行tcpflow -r AuT.pcap "host 209.196.44.172 and port 6667" > report.xml、cat 209.196.044.172.06667-172.016.134.191.01152 | grep -a "^:irc5.aol.com 353" | sed "s/^:irc5.aol.com 353 rgdiuggac @ #x[^x]*x ://g" | tr ' ' '\n' | tr -d "\15" | grep -v "^$" | sort -u | wc -l这两条命令,得到了下图中的结果,输出的数字是3461,说明在观察期间,有3461台不同主机访问了以209.196.44.172为服务器的僵尸网络。

上面第一条命令中,-r指定从文件读取数据包,而host 209.196.44.172 and port 6667指定了通信的其中一方的IP地址是209.196.44.172,且通信其中一方的端口号是6667。执行第一条命令导致输出了report.xml以及两份以TCP套接字命名的文件。上述第二条命令中,209.196.044.172.06667-172.016.134.191.01152是第一条命令输出的一个文件的名称。sort -u中-u要求筛选出的数据不能重复,在这里的用途是让访问209.196.44.172的主机信息不重复。wc -l中的-l表明统计数据行数。
通过在Kali上执行tcpdump -n -nn -r AuT.pcap 'dst host 172.16.134.191' | awk -F " " '{print $3}' | cut -d '.' -f 1-4 | sort | uniq | more > result.txt;wc -l result.txt,可以筛选出被用于攻击蜜罐主机的IP地址,且将输出定向到result.txt。命令中dst host 172.16.134.191指定了目的主机是那台受害的蜜罐主机。-r AuT.pcap指定被分析的文件是AuT.pcap。awk -F中awk是个文本分析工具,-F指定分隔列的符号,这里指定用空格进行分隔。分号之后的wc -l result.txt是另一条指令,用于统计输出的result.txt的行数。

执行指令后,相关IP地址被成功输出到了result.txt。与此同时,命令行中还输出了AuT.pcap的link-type、snapshot length信息。末尾那行的“165 result.txt”是命令中分号之后的子命令wc -l result.txt的输出,表明一共有165个IP地址被用于攻击蜜罐主机。
打开result.txt,发现确实有165行数据,每行只有一个字段,即IP地址,被用于攻击蜜罐主机的IP地址有61.177.154.228、66.81.131.17、68.154.11.82等。

2.4.6 攻击者尝试攻击了哪些安全漏洞?
在物理机的Wireshark上打开日志文件,将过滤器设置为((ip.dst == 172.16.134.191) && (tcp.dstport == 80)),获得涉及蜜罐主机的80号TCP端口的报文。然后我找到了一个GET请求,请求的内容是/NULL.IDA?CCCCC……,字符串非常长,这是针对IIS ISAPI扩展的缓冲区溢出漏洞发起攻击,攻击者希望靶机发生栈溢出。

再往下翻涉及80端口的报文,我发现有个报文提出的请求是GET /default.ida?NNNN……,相关报文已被在下图中用蓝线标出。发出针对/default.ida的GET请求表明攻击者攻击了Windows IIS 5.0的红色代码蠕虫漏洞。

将过滤器设置为((ip.dst == 172.16.134.191) && (tcp.dstport == 445)),分析涉及靶机的445号端口的报文,往下翻报文后,我发现攻击者61.111.101.78用NT Create Andx请求创建了PSEXESVC.EXE,然后又提出了Write Andx请求,这些迹象说明攻击者尝试攻击靶机的SMB协议的PsExec远程执行漏洞。

综上,攻击者尝试攻击了针对IIS ISAPI扩展的缓冲区溢出漏洞、Windows IIS 5.0的红色代码蠕虫漏洞、SMB协议的PsExec远程执行漏洞。
2.4.7 哪些攻击成功了?是如何成功的?
只有61.111.101.78对应的攻击机针对靶机的SMB协议的PsExec远程执行漏洞的攻击取得了成功。为完成这次成功攻击,攻击者执行了五步操作。在Wireshark中用((ip.addr == 172.16.134.191) && (ip.addr == 61.111.101.78) && (tcp.port == 445) && (tcp.port == 1697))进行过滤,得到了攻击者成功利用SMB漏洞攻陷靶机并执行大量后续操作的全部交互过程。第一步是初始化,过程包括和蜜罐主机的445号端口建立TCP连接、通过SMB协议完成协商、完成NTLM身份认证等。下图展示了初始化步骤,首先是完成了三次握手,然后用Negotiate Protocol进行了协商,随后用NTLMSSP建立会话。

第二步是连接到管理员系统共享。攻击者发送NTLMSSP_AUTH认证请求时,把用户设置为了Administrator。接着攻击者针对\172.16.134.191\ADMIN$这个系统共享目录发送了AndX请求,靶机回复后,攻击者就获得了对共享目录的读写权限。

第三步是上传恶意代码。攻击者通过发送NT Create Andx请求在目标主机的System32目录下创建了PSEXESVC.EXE,随后用Write AndX请求把蠕虫程序完整地写入了蜜罐主机。下图中,攻击者先是请求创建\System32\PSEXESVC.EXE这个文件,然后用Write AndX 请求申请写入文件内容。接下来出现了一些浅紫色报文,其中很多长达1514字节,这些报文用于传输恶意代码内容。

再往下翻,浅紫色数据传输部分结束了,接下来是Write AndX的请求、Write AndX响应和关闭请求、关闭响应这四个报文,查看这四个报文的数据字段,发现都提到了\System32\PSEXESVC.EXE,说明这四个报文用于终结针对PSEXESVC.EXE内容的传输过程。

第四步是启动PSEXESVC服务。攻击者通过DCERPC、SVCCTL协议,让靶机启动了PSEXESVC服务。下图中,CreateServiceA request的数据部分就出现了“PSEXESVC: %SystemRoot%\System32\PSEXESVC.EXE”,表明攻击机让靶机启动PSEXESVC.EXE。经过了第四步,攻击者就已经利用PsExec远程执行漏洞攻破了靶机,获得了蜜罐主机的交互式访问权限。

第五步是靶机被攻陷后,攻击者继续与靶机的445号端口交互,完成上传恶意工具、将蜜罐主机加入僵尸网络等事情。经查看数据流,攻击者并未执行shell指令,而是继续使用SMB及附属协议操纵靶机。下图展示了第五步中的部分内容,攻击者发送了QueryServiceStatus、CloseServiceHandle等请求,还有一个针对\psexecsvc的NT Create AndX请求,这里\psexecsvc是文件名而不是目录名。在这个请求后,攻击者又发送了很多长达1514字节的报文,用于传输文件数据。

3.学习中遇到的问题及解决
- 问题1:无法通过nc在物理机与WinXP Attacker之间传文件,导致无法将RaDa.exe传过去。
- 问题1解决方案:先尝试通过MobaXterm用SSH协议连接WinXP Attacker,但是连接请求被拒绝,考虑到在Windows XP上配置SSH可能比较复杂,所以我决定试一试叶姜祺在实验报告里说的拖拽方法。在VMware中开启WinXP的屏幕,然后打开包含RaDa.exe的文件夹,并缩小文件资源管理器页面,然后把RaDa.exe拖动进WinXP,就让RaDa.exe被传到WinXP Attacker了,尝试取得了成功。
- 问题2:找不到该在哪里查看下图这种代码流程图。
![image]()
- 问题2解决方案:首先自己在IDA Pro中根据菜单中文字的意思猜测调出流程图的方法,但是失败了,因为菜单中项目太多了。然后我又去翻看同学们的实验报告,很多同学都没有说清楚在哪里查看这种流程图,但是我认为总会有同学在报告里写清楚。最后,我找到了程宇的实验报告,他说清楚了要在View-Graphs-Flow chart里查看这种流程图。我按他说的进行了尝试,终于找到了这种流程图。
4.实践总结
本次实验对我而言略有困难,因为我从前没有开展过分析大型恶意代码的事情,我只分析过通过缓冲区溢出注入shellcode的小型恶意代码。RaDa_unpacked.exe本身较大(有70KB左右),一行一行地看反汇编出的代码显然不可能,本实验分析这个恶意代码时删繁就简,不去逐一分析其中的汇编语言函数,而是在静态分析中提取内部的关键字符串,在动态分析中提取运行时出现的字符串,从而完成对恶意代码目的、特点等的分析。
RaDa.exe运行时,可以在任务管理器中看到它,可以用监视软件观察它产生的字符串,也可以用Wireshark抓到它产生的网络报文,但是实际上的恶意软件肯定隐蔽得多,实际恶意软件的目标是“免杀”,也就是让杀毒软件都检测不出来,此时在任务管理器查看进程、用Process Explorer查看字符串肯定就不太有效了,这时就需要更高级的恶意代码分析技术,才能使我们的计算机免受黑客侵害。

浙公网安备 33010602011771号