20252812 2025-2026-2 《网络攻防实践》实验三
20252812 2025-2026-2 《网络攻防实践》实验三
1.实验内容
tcpdump是较老但通用的嗅探器程序。在最简单的模式下,tcpdump提供命令行模式,它支持使用BPF语法的过滤条件对网络数据包进行选择性嗅探。tcpdump能进行TCP/IP协议栈的协议分析,能以每行一个数据包的方式呈现嗅探结果。tcpdump是类UNIX平台下捕获数据包的标准程序,是目前维护得最好的开源嗅探器软件。Wireshark支持类UNIX平台、Windows平台、Mac OS平台。Wireshark支持以太网、802.11等多种类型的网络接口。在网络协议分析方面,Wireshark支持超过750种协议类型。Wireshark有捕获过滤功能和显示过滤功能,且支持重组TCP、UDP或SSL的一次交互的所有数据包。
2.实验过程
(1)动手实践tcpdump
此实践环节需要访问外网,我发现我的SEED Ubuntu的IP地址是手动配置的,无法访问外网,一般来说Linux系统需要有自动获得的IP地址才能访问外网,所以我把它的IP地址设为自动获取,见下图。

重启后,用ifconfig命令可以查看到seed_ubuntu的IP地址更新为192.168.173.67。

在root权限下,在终端输入tcpdump -i eth6 -n src 192.168.173.67 and tcp port 80 and "tcp[13] & 18=2"。其中-n表示不进行IP地址到主机名的转换。-i指定网络接口。eth6这个接口就是前面所述IP地址为192.168.173.67的网络接口。“src 192.168.173.67”表示抓取源于seed_ubuntu的数据包,所以就不抓取源于远端主机的数据包。“tcp port 80”表示只抓取源端口或目的端口为80的数据包。“tcp[13] & 18=2”表示TCP首部的十三号字节与18进行与运算得到2,TCP首部的十三号字节是一些标志位,其中第四位和第七位分别表示确认号是否有效(ACK)、是否为连接建立报文(SYN),把18表示为一个字节是00010010,要是一个字节和18进行与运算得到2,说明这个字节第四位为0、第七位为1,放到这里就是说ACK=0、SYN=1,也就是TCP的三次握手的第一次握手的报文。接下来,我让seed_ubuntu访问www.163.com,对方服务器采用不加密的HTTP服务。

接下来我查看终端,发现抓到了四个报文段,目的IP地址分别是128.230.247.70、60.29.234.35、36.110.220.120、119.188.172.239,目的端口号都是80。这说明seed_ubuntu的浏览器访问www.163.com的过程中,浏览器访问了四个Web服务器,它们的IP地址分别是128.230.247.70、60.29.234.35、36.110.220.120、119.188.172.239。

(2)Wireshark实践
让线鲨在IP地址为192.168.173.67的eth6监听,然后在seed_ubuntu终端输入telnet bbs.mysmth.net 23,也就是用Telnet协议访问bbs.mysmth.net服务器,采用默认端口23。在终端输入用户名、口令。

输完口令后回车,然后关闭线鲨监听,观察到线鲨捕获的TELNET报文都是seed_ubuntu与120.92.212.76之间传输的,于是在过滤器栏输入ip.addr == 192.168.173.67 and ip.addr == 120.92.212.76 and tcp.port == 23,并回车,得到下图。

一个一个地看报文比较麻烦,我直接采用跟踪TCP流的方法,把192.168.173.67:50706与120.92.212.76:23之间传输的所有信息汇总起来,得到下面的图。

我输入的用户名、口令都在上图中被标红的区域内,我输入的用户名是guest,我输入的口令是|05V+m>#。在数据流中,用户名的每个字节出现了两次,口令的每个字节之后都跟了一个星号。下面是我对一些问题的回答。
a.你所登录的BBS服务器的IP地址与端口各是什么?
答:我所登录的BBS服务器的IP地址与端口各是120.92.212.76、二十三。
b.TELNET协议是如何向服务器传送你输入的用户名及登录口令的?
答:传送口令时,口令是被一个字节一个字节地传送的。以|05V+m>#这个口令为例,传送“|”这个字符时,seed_ubuntu虚拟机先向服务器的23号端口发送一个不带数据的报文,然后再向服务器的23号端口发送“|”,报文的数据部分只有“|”。接下来服务器的23号端口向虚拟机回复一个不带数据的报文,然后再回复一个数据字段只有“”的报文。接下来传送口令中的“0”,seed_ubuntu虚拟机先向服务器的23号端口发送一个不带数据的报文,然后再向服务器的23号端口发送“0”,报文的数据部分只有“0”。接下来服务器的23号端口向虚拟机回复一个不带数据的报文,然后再回复一个数据字段只有“”的报文。之后传送口令的每个字节都是这个流程:用户先发送一个空消息,再发送口令的一个字节,接下来服务器先回复一个空消息,再回复一个星号。发送用户名时,也是一个一个字节地传送的,首先seed_ubuntu虚拟机向服务器的23号端口发送一个空消息,然后发送数据字段只携带用户名的一个字节的报文,然后服务器的23号端口向虚拟机发送一个空消息,再发送一个数据字段只有一个字节的报文,这个字节是虚拟机刚才发送过去的用户名的一个字节。以发送“s”为例,先是seed_ubuntu虚拟机向服务器的23号端口发送一个空消息,然后发送数据字段只有“s”的报文,然后服务器的23号端口向虚拟机发送一个空消息,再发送一个数据字段只有“s”的报文。
c.如何利用Wireshark分析嗅探的数据包,并从中获取你的用户名及登录口令?
首先,在显示捕获到的报文的主页面,就能提供IP地址、端口号、序列号、确认号等基本信息。

如果要看报文的详细信息,可以把下面的两个窗口拉上来。下面的两个窗口中,上面的那个详细地分析了协议,下面的那个展示了数据包的每个字节。

用户名、口令虽短,但是需要发送大量报文才能发送完,这是因为对于用户名或口令的每个字节的发送,都需要虚拟机发送两个数据包到服务器,然后服务器向虚拟机发回两个数据包,一个一个报文地看太麻烦了。有一个快捷的方法是在上方菜单栏中选择Analyze,再选择Follow TCP Stream,就可以查看虚拟机与服务器交互过程对应的完整数据流。在数据流中,每个字符重复出现两次的字符串对应用户名,每个字符后跟着一个星号的是口令。
(3)取证分析实践
在我的Windows11实体主机上用Wireshark打开listen.pcap。

经过浏览此文件的内容,我发现此文件展示的网络数据包中,大多数情况下是172.31.4.178向172.31.4.188的某个端口发SYN数据包,然后172.31.4.188发回RST+ACK数据包。因此我确定172.31.4.178是攻击主机的IP地址、172.31.4.188是被扫描的主机的IP地址。
问题一:攻击主机的IP地址是什么?
答:攻击主机的IP地址是172.31.4.178。
问题二:网络扫描的目标IP地址是什么?
答:网络扫描的目标IP地址是172.31.4.188。
接下来的实验步骤需要用到我的Kali虚拟机。首先,在这台机器上安装p0f和snort。


通过MobaXterm将listen.pcap传到Kali。

在Kali虚拟机上执行“p0f -r listen.pcap "host 172.31.4.178"”,立即产生大量输出,这些输出是p0f针对listen.pcap中172.31.4.178发送或接收的数据包的解析。命令中,-r用于指定让p0f处理的文件,而"host 172.31.4.178"是过滤器,指定只对源或目的IP地址是172.31.4.178的报文进行分析。对于几乎每个数据包,分析结果都有“NMap SYN scan”,这说明攻击主机是用Nmap发起的扫描。

问题三:本次案例中是使用了哪个扫描工具发起这些端口扫描?你是如何确定的?
答:本次案例中是通过使用Nmap发起这些端口扫描的。我发现p0f对172.31.4.178发送的几乎所有扫描报文都输出了“NMap SYN scan”这一检测结果,这使我确定扫描工具是Nmap。
往下翻执行刚才的命令的输出结果,对于攻击者发出的有的报文,p0f的检测结果含有“os = Linux 2.6.x”,这说明攻击主机的操作系统应该是Linux 2.6.x,其中x是0-9中的一个数字。

问题六:攻击主机的操作系统是什么?
答:攻击主机的操作系统是Linux,版本号是Linux 2.6.x,其中x是0-9中的一个数字。
在Kali的终端执行tshark -r listen.pcap -Y "ip.src==172.31.4.178" -T fields -e tcp.dstport | sort -n | uniq > kBe.txt。

命令中,-r表示指定snort读取的文件,-Y指定过滤器,过滤器的语法要符合Wireshark过滤器的语法,此处过滤器为“ip.src==172.31.4.178”,即过滤出发送自攻击主机的数据包,-T指定输出格式,这里将输出指定为fields格式,-e指定tshark输出的内容,这里输出TCP目的端口号。sort -n中,sort是一个程序的名字,此程序用来排序,-n表示根据数值大小排序。这里的uniq也是一个程序的名字,此程序应该是用于确保输出的内容没有重复的。“> kBe.txt”表明不在终端输出,要输出到kBe.txt。执行此命令后,我打开kBe.txt。发现里面有大量数字,从1开始,到65535结束。由于文件是被排好序的,所以最小的数一定是1,最大的数一定是65535。

为了确认kBe.txt包含从1到65535的所有数字,我编写了一个python代码。

此代码的逻辑是这样的:先从kBe.txt读取数据,然后检查其中是否有1-65536中间的每个数,不存在的数会被输出。运行此代码,输出“Can not find 65536”,说明1-65535都能被找到,不能找到65536。事实上本来就应该找不到65536,因为端口号最大只能是65535。所以说从listen.pcap中可以分析出攻击者扫描的TCP端口号范围是1-65535,也就是TCP的所有可能端口号。

接下来研究靶机上哪些端口是开放的。对应的命令是:tshark -r listen.pcap -Y "ip.src==172.31.4.188 && tcp.flags.syn==1 && tcp.flags.ack==1" -T fields -e tcp.srcport | sort -n | uniq。由于输出的内容不多,就不输出到文件里了,直接输出到终端。和上一个执行的tshark命令相比,过滤器变为了“ip.src==172.31.4.188 && tcp.flags.syn==1 && tcp.flags.ack==1”,要求数据包源自靶机,且SYN和ACK这两个标志位为1,也就是TCP三次握手的第二个报文,然后要输出的字段是tcp.srcport,这是因为对于第二次握手的报文,源端口就是攻击者扫描的端口。

tshark的输出表明靶机上的TCP的21、22、23、25、53、80、139、445、3306、3632、5432、8009、8180号端口是开放的。
为了弄清楚攻击者是否发出了第三次握手的报文,我又执行两个命令:tshark -r listen.pcap -Y "ip.src==172.31.4.178 && tcp.flags.syn==0 && tcp.flags.ack==1 && tcp.flags.reset==0" -T fields -e tcp.dstport | sort -n | uniq、tshark -r listen.pcap -Y "ip.src==172.31.4.178 && tcp.flags.syn==0 && tcp.flags.ack==1 && tcp.flags.reset==1" -T fields -e tcp.dstport | sort -n | uniq。这条命令的过滤器要求报文来自攻击者,且SYN=0、ACK=1。若tcp.flags.reset==0,表明RST=0,说明是第三次握手的报文,存在这个报文说明攻击者所进行的扫描是全开扫描。若tcp.flags.reset==1,表明RST=1,存在这个报文说明攻击者所进行的扫描是半开扫描。

输出结果表明攻击者针对靶机的1、21、22、23、25、53、80、139、445、3306、5432、8009、8180号TCP端口发送了第三次握手报文,这些扫描对应的扫描方式是全开扫描。对于8180号端口,应该是在进行了第三次握手后又回复了一个RST报文。攻击机对于靶机的未开放的33654号端口发送了RST报文,对于靶机上开放的3632号端口没有进行回复。
问题四:你所分析的日志文件中,攻击者使用了哪种扫描方法,扫描的目标端口是什么,并描述其工作原理。
答:我所分析的日志文件中,攻击者使用了TCP SYN扫描中的全开扫描方法,扫描的目标端口是1-65535号TCP端口,也就是所有可能的TCP端口号。这种扫描方法的工作原理:对于每个端口,攻击者先针对靶机的该端口发送一个SYN=1的第一次握手的数据包。若靶机发送SYN=0、ACK=1、RST=1的报文,说明相应端口关闭;若靶机没有回复,说明攻击者的扫描报文可能被防火墙过滤掉了;若靶机回复SYN=1、ACK=1、RST=0的报文,说明相应端口是开放的。若靶机上的相应端口开放,则攻击者会回复一个SYN=0、ACK=1、RST=0的报文以建立完整的三次握手,后续还可能发送一个RST=1的报文以终止连接。
问题五:在蜜罐主机上哪些端口被发现是开放的?
答:问题中的蜜罐主机是指攻击者扫描的IP地址为172.31.4.188的主机。这台主机的21、22、23、25、53、80、139、445、3306、3632、5432、8009、8180号TCP端口被发现是开放的。
3.学习中遇到的问题及解决
- 问题1:p0f和tshark命令不能被正常执行。我先开始在seed_ubuntu上安装了snort和p0f,然后执行其他同学的博客中说的命令,但是会提示格式错误、过滤器有问题之类的,通过调整命令也不能解决问题。
- 问题1解决方案:从官网上下载最新版专用于VMware的Kali虚拟机文件,安装此虚拟机,然后在Kali上安装snort和p0f,再执行其他同学的博客中说的以tshark和p0f开头的命令,就能得到预期结果了。
- 问题2:筛选攻击者扫描的靶机端口时,输出结果过长,如果要人工地看完输出结果的话,可能需要看六万多个数字。
- 问题2解决方案:采用“>”运算符将输出定向到文件,再采用python程序分析此文件,就能得出扫描了1-65535中的全部端口的结论。
4.学习感悟、思考等
我觉得对于要执行很长命令的任务,如果直接不加思考地使用其他同学博客里的命令,能很快得出结果,但是这样就没有意义。对于以tshark开头的很长的命令,必须通过其自带的帮助了解-e、-r等参数的意义,才能真的学会使用这种命令,学会了以后,假如老师提出一个新问题,我可以通过修改命令解答老师的问题。但对于那些照抄照搬的同学,他们只能解答其他同学解答过的问题,要是问题换个花样,他们就不会了。
我一开始用Wireshark打开看listen.pcap时,感觉十分恐慌,因为有十三万多个网络分组,老师提出了六个问题,要从这十三万多个分组中得出结论。但细看了文件后,我发现其内容主要是固定的攻击机用TCP协议扫描固定的靶机,其他内容不多,我的恐慌感就下降了。借助p0f、snort这样的工具,我根本不需要把这十三万多个网络分组都看一遍,因而其实分析这些网络分组没有我所想象的那么费力。不过我感觉p0f还是需要改进的,它针对每个数据包都进行分析,有十三万多个网络分组,它就有十三万多个分析结果。我觉得如果它可以针对pcap文件所涉及的每台主机分别下结论,输出就能清晰明了得多。

浙公网安备 33010602011771号