【实验目的】
掌握了Nmap扫描分析与检测能力、口令爆破分析与检测能力
【知识点】
snort3,Nmap扫描分析与检测,口令爆破分析与检测
【实验原理】
在1998年,Martin Roesch用C语言开发了开放源代码(Open Source)的入侵检测系统Snort。Snort已发展成为一个具有多平台(Multi-Platform)、实时(Real-Time)流量分析、网络IP数据包(Pocket)记录等特性的强大的网络入侵检测/防御系统(Network Intrusion Detection/Prevention System),即NIDS/NIPS。Snort符合通用公共许可(GPL------GNU General Public License),在网上可以通过免费下载获得Snort,并且只需要几分钟就可以安装并开始使用。
Snort有三种工作模式:嗅探器、数据包记录器、网络入侵检测系统。嗅探器模式仅仅是从网络上读取数据包并作为连续不断的流显示在终端上。数据包记录器模式把数据包记录到硬盘上。网络入侵检测模式是最复杂的,而且是可配置的。我们可以让snort分析网络数据流以匹配用户定义的一些规则,并根据检测结果采取一定的动作。
Snort能够对网络上的数据包进行抓包分析,但区别于其它嗅探器的是,它能根据所定义的规则进行响应及处理。Snort 通过对获取的数据包,进行各规则的分析后,根据规则链,可采取Activation(报警并启动另外一个动态规则链)、Dynamic(由其它的规则包调用)、Alert(报警),Pass(忽略),Log(不报警但记录网络流量)五种响应的机制。
Snort有数据包嗅探,数据包分析,数据包检测,响应处理等多种功能,每个模块实现不同的功能,各模块都是用插件的方式和Snort相结合,功能扩展方便。例如,预处理插件的功能就是在规则匹配误用检测之前运行,完成TIP碎片重组,http解码,telnet解码等功能,处理插件完成检查协议各字段,关闭连接,攻击响应等功能,输出插件将得理后的各种情况以日志或警告的方式输出。
Snort通过在网络TCP/IP的5层结构的数据链路层进行抓取网络数据包,抓包时需将网卡设置为混杂模式,根据操作系统的不同采用libpcap或winpcap函数从网络中捕获数据包;然后将捕获的数据包送到包解码器进行解码。
nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。它是网络管理员必用的软件之一,以及用以评估网络系统安全。
弱口令(weak password) 没有严格和准确的定义,通常认为容易被别人(他们有可能对你很了解)猜测到或被破解工具破解的口令均为弱口令。弱口令指的是仅包含简单数字和字母的口令,例如"123"、"abc"等,因为这样的口令很容易被别人破解,从而使用户的计算机面临风险,因此不推荐用户使用。
【软件工具】
- FTP 服务器:Windows Server 2008 1台;
- Web 服务器:ubuntu 1台;
- 操作机:ubuntu-desktop-20.04.5 1台;
- 恶意PC : Kali linux 1台;
- 交换机/路由 2台;
- 软件:Snort3、Hydra、nmap;
【实验拓扑】

【实验预期】
- 规则编写并检测出nmap扫描行为。
- 规则编写并检测出弱口令爆破攻击行为。
【实验步骤与结果】
1.检测nmap扫描行为
(1)识别NMAP Ping 扫描
进入至【恶意PC】控制台,单击左上角搜索【wireshark】,并单击打开该工具。在【wireshark】界面中,单击【eth0】网卡接口,使用eth0监听,打开终端使用nmap加上-sP参数进行ping扫描,但不进行端口扫描,nmap -sP 172.168.12.0/24 --disable-arp-ping,如下图所示。

使用了参数--disable-arp-ping禁用了本地网络扫描的ARP请求数据包,如不关闭则snort可能无法捕获 NMAP Ping 扫描。
点击红色按钮直至变为灰色,停止抓包,可以看到在终端中发现主机172.168.12.1、172.168.12.2以及172.168.12.254网关,同时可以看到ICMP请求数据包以及 ICMP回复数据包,如下图所示。


切换【Snort】控制台,编辑/usr/local/etc/rules/local.rules文件中创建规则,在终端中使用vim命令进行local.rules规则编辑,添加规则如下图所示,完成后保存并退出。
alert icmp any any -> 172.168.12.0/24 any (msg: "NMAP ping sweep Scan";sid:10000004;)

规则的动作为alert,规则协议为icmp,源地址与端口设置为any,目的地址为DMZ区的172.168.12.0/24网段地址,msg为警告文字的信息。
现在,在接口上以检测模式运行Snort,并将所有警报打印到日志目录。
snort -c /usr/local/etc/snort/snort.lua -i eth0 -s 65535 -k none -l /var/log/snort

新建终端使用tail -f 打印日志/var/log/snort/alert_fast.txt
切换【恶意PC】控制台,重新再进行nmap ping扫描。
切换【Snort】控制台,可看到snort的日志报警内容,如下图所示。

(2)识别NMAP TCP/UDP扫描
关闭wireshark,并重新打开wireshark,进行监听,并且结束关于Snort一切内容。
分别使用TCP扫描和UDP扫描172.168.12.1的1-100端口。
nmap -sT -p1-100 172.168.12.1
nmap -sU -p1-100 172.168.12.1
完成后停止抓包,如下图所示。

过滤tcp和udp,设置列应用(参考上一章的协议分析与分析工具(一)),可以看到数据包中的tcp和udp协议。


切换【Snort】控制台,编辑/usr/local/etc/rules/local.rules文件中创建规则,在终端中使用vim命令进行local.rules规则编辑,添加规则之前把上一个规则注释,如下图所示,完成后保存并退出。
alert tcp any any -> 172.168.12.1 1:100 (msg: "NMAP TCP Scan"; sid:10000002;)
alert udp any any -> 172.168.12.1 1:100 ( msg:"Nmap UDP Scan"; sid:10000003; )

规则的动作为alert,规则协议为tcp,源地址any,目的地址为DMZ区的172.168.12.1主机地址,目的端口为TCP 1-100,msg为警告文字的信息。
现在,在接口上以检测模式运行Snort,并将所有警报打印到日志目录。
snort -c /usr/local/etc/snort/snort.lua -i eth0 -s 65535 -k none -l /var/log/snort

新建终端使用tail -f 打印日志/var/log/snort/alert_fast.txt。切换【恶意PC】控制台,重新再进行nmap TCP/UDP扫描。
切换【Snort】控制台,可看到snort的日志报警内容为TCP/UDP扫描1-100端口如下图所示。

(3)识别NMAP FIN 扫描
FIN扫描nmap -sF:
- 发送FIN
- LISTEN端口丢弃
- CLOSE端口回复RST
- 扫描效率低,需要等待超时
攻击者可能不使用 SYN、SYN/ACK 和 ACK 标志与目标机器建立 TCP 连接,而是选择FIN扫描仅通过Fin标志发送数据包来连接目标。
关闭wireshark,并重新打开wireshark,进行监听,并且结束关于Snort一切内容。
切换【恶意PC】控制台,使用Fin扫描172.168.12.1主机,如下图所示。

停止抓包,可以在数据包中看到FIN标志

切换【Snort】控制台,编辑/usr/local/etc/rules/local.rules文件中创建规则,在终端中使用vim命令进行local.rules规则编辑,添加规则如下图所示,完成后保存并退出。
alert tcp any any -> 172.168.12.1 any (msg: "NMAP FIN Scan"; flags:F;sid:10000004;)

在snort规则选项检查指定的flags标志位是否设置在 TCP 标头中,flags:[modifier]test_flag...[,mask_flag...];。
可以检查以下标志位:
- F -> FIN (Finish)
- S -> SYN (Synchronize sequence numbers)
- R -> RST (Reset the connection)
- P -> PSH (Push buffered data)
- A -> ACK (Acknowledgement)
- U -> URG (Urgent pointer)
- C -> CWR (Congestion window reduced)
- E -> ECE (ECN-Echo)
- 0 -> No TCP flags set
规则的动作为alert,规则协议为tcp,源地址与端口设置为any,目的地址为DMZ区的172.168.12.1地址,msg为警告文字的信息,flags标志位为FIN。
现在,在接口上以检测模式运行Snort,并将所有警报打印到日志目录。
snort -c /usr/local/etc/snort/snort.lua -i eth0 -s 65535 -k none -l /var/log/snort

新建终端使用tail -f 打印日志/var/log/snort/alert_fast.txt,如下图所示。
切换【恶意PC】控制台,重新再进行nmap FIN扫描。
切换【Snort】控制台,可看到snort的日志报警内容为FIN扫描警告日志,如下图所示

(4)识别NMAP NULL 扫描
TCP NULL扫描(同FIN)nmap -sN:
- 发送NULL
- LISEN端口丢弃
- CLOSE端口回复RST
- 扫描效率低,需要等待超时,不能适用所有系统
攻击者可能不使用 SYN、SYN/ACK 和 ACK 标志与目标机器建立 TCP 连接,而是选择 NULL扫描仅通过 NONE 标志发送数据包来与目标连接。
关闭wireshark,并重新打开wireshark,进行监听,并且结束关于Snort一切内容。
切换【恶意PC】控制台,使用NULL扫描172.168.12.1主机,如下图所示。

停止抓包,可以在数据包中看到NONE标志

切换【Snort】控制台,编辑/usr/local/etc/rules/local.rules文件中创建规则,在终端中使用vim命令进行local.rules规则编辑,添加规则如下图所示,完成后保存并退出。
alert tcp any any -> 172.168.12.1 any (msg: "NMAP NULL Scan"; flags:0;sid:1000005;)

规则的动作为alert,规则协议为tcp,源地址与端口设置为any,目的地址为DMZ区的172.168.12.1地址,msg为警告文字的信息,flags标志位为0。
现在,在接口上以检测模式运行Snort,并将所有警报打印到日志目录。
snort -c /usr/local/etc/snort/snort.lua -i eth0 -s 65535 -k none -l /var/log/snort

新建终端使用tail -f 打印日志/var/log/snort/alert_fast.txt,如下图所示。

切换【恶意PC】控制台,重新再进行nmap Null扫描。
切换【Snort】控制台,可看到snort的日志报警内容为Null扫描警告日志,如下图所示。

2.检测口令爆破攻击行为
(1)SSH口令爆破与检测
关闭wireshark,并重新打开wireshark,进行监听,并且结束关于Snort一切内容。
切换【恶意PC】控制台,新建终端使用cd命令进入桌面,使用hydra爆破Web服务器的SSH,如下图所示。
hydra -L 用户字典 -P 密码字典 -vV -e ns IP地址 ssh

hydra是著名黑客组织thc的一款开源的暴力破解密码工具,功能非常强大,kali下是默认安装的,几乎支持所有协议的在线破解。密码能否破解,在于字典是否强大。
停止抓包,过滤ssh协议,首先客户端告知服务器自己的SSH协议版本,如下图所示。SSH-protoversion(版本号)-softwareversion(自定义) SP(空格一个,可选) comments(注释,可选) CR(回车符) LF(换行符)


第二步服务器将自己的SSH协议发送给客户端,如下图所示。

第三步客户端初始化连接,进行加密算法交换,如下图所示。

交换的算法和其它信息列表,如下图所示。


第四步服务端初始化连接,进行加密算法交换,如下图所示。

第五步客户端发送D-H公钥,服务端与客户端使用D-H算法生成会话密钥key,如下图所示。

第六步服务端回复,服务端与客户端使用D-H算法生成会话密码key
服务端回复的内容:
DH回复包:
- 一个服务端的公钥,即证书,客户端会将该公钥与本地公钥对比,看是否是被信任的服务器,如果是第一次访问则会询问用户是否信任这样的公钥。
- 服务端回复的D-H公钥
- 签名

第七步客户端回复new key包,客户端要回复服务端的new key包以表明双方构建了一个加密通道,可以使用会话密码key加密来传输信息了,如下图所示。

切换【Snort】控制台,编辑/usr/local/etc/rules/local.rules文件中创建规则,在终端中使用vim命令进行local.rules规则编辑,添加规则如下图所示,完成后保存并退出。
alert tcp any any -> 172.168.12.1 any (msg:"SSH Brute Force Attempt"; flow:established,to_server; content:"SSH"; detection_filter:track by_src, count 30, seconds 60;sid:1000006; )

规则的动作为alert,规则协议为tcp,源地址与端口设置为any,目的地址为DMZ区的172.168.12.1地址,flow为|仅匹配已建立的 TCP 连接与匹配服务器响应,msg为警告文字的信息,字段关键字以SSH为例,Detection_filter为速率可以通过源IP地址进行跟踪,计数30次,60秒。
该flow选项用于检查给定数据包的会话属性。使用此选项可以检查四个主要的属性类别:
- 数据包的方向,特别是从客户端到服务器还是从服务器到客户端
- 数据包是否是已建立 TCP 连接的一部分
- 数据包是否为重组数据包
- 数据包是否为重建碎片数据包
| 选项 | 描述 |
|---|---|
| to_client | 匹配服务器响应 |
| to_server | 根据客户要求匹配 |
| from_client | 根据客户要求匹配 |
| from_server | 匹配服务器响应 |
| established | 仅匹配已建立的 TCP 连接 |
| not_established | 仅在未建立 TCP 连接时匹配 |
| stateless | 无论流状态如何都匹配 |
| no_stream | 仅匹配非重组数据包 |
| only_stream | 仅匹配重新组装的数据包 |
| no_frag | 仅匹配碎片数据包 |
| only_frag | 仅匹配经过碎片整理的数据包 |
flow:[{established|not_established|stateless}] \ [,{to_client|to_server|from_client|from_server}] \ [,{no_stream|only_stream}] \ [,{no_frag|only_frag}];
Detection_filter定义了源主机或目标主机在规则生成事件之前必须超过的速率。Detection_filter的格式如下:
| 选项 | 描述 |
|---|---|
| track by_src/by_dst | 速率可以通过源IP地址或目的IP地址进行跟踪。这意味着对每个唯一的源IP地址或每个唯一的目的IP地址进行计数。 |
| count c | 在超过检测过滤器限制之前,s秒内允许的最大规则匹配数。C必须是非零的。 |
| seconds s | 累计计数的时间段。该值不能为零。 |
现在,在接口上以检测模式运行Snort,并将所有警报打印到日志目录。
snort -c /usr/local/etc/snort/snort.lua -i eth0 -s 65535 -k none -l /var/log/snort


新建终端使用tail -f 打印日志/var/log/snort/alert_fast.txt,如下图所示
切换【恶意PC】控制台,重新再进行ssh服务口令爆破。
切换【Snort】控制台,可看到snort的日志报警内容为ssh口令爆破警告日志,如下图所示。
(2)FTP口令爆破
关闭wireshark,并重新打开wireshark,进行监听,并且结束关于Snort一切内容。
切换【恶意PC】控制台,使用hydra爆破ftp服务器的FTP服务,如下图所示。
停止抓包,过滤ftp协议,分析过程参考(上一章的协议分析与分析工具(二))。
切换【Snort】控制台,编辑/usr/local/etc/rules/local.rules文件中创建规则,在终端中使用vim命令进行local.rules规则编辑,添加规则如下图所示,完成后保存并退出。
alert tcp any any -> 172.168.12.2 21 (msg:"FTP Brute Force Attempt"; flow:established,to_server; content:"USER"; detection_filter:track by_src, count 30, seconds 60;sid:1000007; )
规则的动作为alert,规则协议为tcp,源地址与源端口设置为any,目的地址为DMZ区的172.168.12.2地址,目的端口为21,flow为|仅匹配已建立的 TCP 连接与匹配服务器响应,msg为警告文字的信息,字段关键字以USER为例(参考(上一章的协议分析与分析工具(二))),Detection_filter为速率可以通过源IP地址进行跟踪,计数30次,60秒。
现在,在接口上以检测模式运行Snort,并将所有警报打印到日志目录。
snort -c /usr/local/etc/snort/snort.lua -i eth0 -s 65535 -k none -l /var/log/snort
新建终端使用tail -f 打印日志/var/log/snort/alert_fast.txt,如下图所示。
切换【恶意PC】控制台,重新再进行ftp服务口令爆破。
切换【Snort】控制台,可看到snort的日志报警内容为ftp口令爆破警告日志,如下图所示。