主要内容:
4.1 主动信息收集的原理
4.2 基于ping 命令的探测
4.3 TCP 三次握手和四次挥手原理及抓包过程
4.4 基于Nmap 的扫描方式
4.5 SYN 洪水攻击和DDOS 攻击防御手段

4.1 主动信息收集的原理

4.1.1 全球网络攻防实时地图

通过以下链接,我们可以发现,现在这个安静的网络环境下,一直存在着攻击和渗透。
全球网络攻防实时地图 链接:https://cybermap.kaspersky.com/cn/ 如图: image.png

4.1.2 主动信息收集的特点

1、直接与目标系统交互通信
2、无法避免留下访问的痕迹
3、使用受控的第三方电脑进行探测,使用代理或已经被控制的机器,做好被封杀的准备
4、扫描发送不同的探测,根据返回结果判断目标状态。

4.1.3 发现目标主机的过程

1、识别存活主机,发现潜在的被攻击目标
2、输出一个IP地址列表 比如 IP地址段 IP地址范围
3、使用二、三、四层进行探测发现

4.1.4 OSI七层模型和TCP/IP五层模型

osi.jpg
这里我们只对OSI各层进行功能上的大概阐述,不详细深究,因为每一层实际都是一个复杂的层。后面我也会根据个人方向展开部分层的深入学习。这里我们就大概了解一下。我们从最顶层——应用层 开始介绍。整个过程以公司A和公司B的一次商业报价单发送为例子进行讲解。
第7层应用层:
OSI中的最高层。为特定类型的网络应用提供了访问OSI环境的手段。应用层确定进程之间通信的性质,以满足用户的需要。应用层不仅要提供应用进程所需要的信息交换和远程操作,而且还要作为应用进程的用户代理,来完成一些为进行信息交换所必需的功能。它包括:文件传送访问和管理FTAM、虚拟终端VT、事务处理TP、远程数据库访问RDA、制造报文规范MMS、目录服务DS等协议;应用层能与应用程序界面沟通,以达到展示给用户的目的。 在此常见的协议有:HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3等。
第6层表示层:
主要用于处理两个通信系统中交换信息的表示方式。为上层用户解决用户信息的语法问题。它包括数据格式交换、数据加密与解密、数据压缩与终端类型的转换。
第5层会话层:
在两个节点之间建立端连接。为端系统的应用程序之间提供了对话控制机制。此服务包括建立连接是以全双工还是以半双工的方式进行设置,尽管可以在层4中处理双工方式 ;会话层管理登入和注销过程。它具体管理两个用户和进程之间的对话。如果在某一时刻只允许一个用户执行一项特定的操作,会话层协议就会管理这些操作,如阻止两个用户同时更新数据库中的同一组数据。
第4层传输层:
传输层建立了主机端口到端口的链接,传输层的作用是为上层协议(上层会会话层)提供端口到端口的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。该层向高层屏蔽了下层数据通信的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路。我们通常说的,TCP UDP就是在这一层。
第3层网络层:
本层通过IP寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。就是通常说的IP层。这一层就是我们经常说的IP协议层。IP协议是Internet的基础。
第2层数据链路层:
将比特组合成字节,再将字节组合成帧,使用链路层地址 (以太网使用MAC地址)来访问介质,并进行差错检测。
第1层物理层:
处于OSI参考模型的最底层。物理层的主要功能是利用物理传输介质为数据链路层提供物理连接,以便透明的传送比特流。常用设备有(各种物理设备)网卡、集线器、中继器、调制解调器、网线、双绞线、同轴电缆。

TCP/IP五层协议和OSI的七层协议对应关系
第四章-主动信息收集-DDOS 攻击防御-SYN 洪水攻击 - 图3
对应的协议关系
第四章-主动信息收集-DDOS 攻击防御-SYN 洪水攻击 - 图4

4.2 基于ping 命令的探测

4.2.1 PING

PING 命令是我们常用的判断主机之间网络是否畅通,同样也是能判断我们的目标主机是否存活。
┌──(root㉿kali)-[~]
└─# ping 192.168.1.1 -c 1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=232 ms

我们从当前主机到目标主机之间肯定要经过很多网络设备,我们怎么才能知道中间经过了哪些网络设备?
Traceroute 命令也可以对路由进行跟踪
┌──(root㉿kali)-[~]
└─# traceroute www.baidu.com
image.png
然而PING 命令也延伸出了很多其他的命令,如ARPING、FPING、HPING 等

4.2.2 ARPING

1、ARP 协议概述:ARP 协议是“Address Resolution Protocol”(地址解析协议)的缩写。
计算机通过ARP 协议将IP 地址转换成MAC 地址。
2、ARP 协议工作原理
在以太网中,数据传输的目标地址是MAC 地址,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC 地址。
计算机使用者通常只知道目标机器的 IP 信息,“地址解析”就是主机在发送帧前将目标 IP 地址转换成目标MAC 地址的过程。
简单地说,ARP 协议主要负责将局域网中的32 位IP 地址转换为对应的48 位物理地址,即网卡的MAC 地址,保障通信顺利进行。
ARP 工作原理如下:
image.png
ARP解析:广播请求,单播回应

windows 下查看MAC 地址:
C:\Users\zhang>ipconfig /all
image.png
3、使用arping 命令查看局域网中的IP 是否有冲突
┌──(root㉿kali)-[~]
└─# arping 192.168.1.1
注:按ctrl+c 结束arping 命令
image.png
例:模拟IP 地址冲突
再开一台centos7.6 虚拟机,把IP 地址改成192.168.1.1。
查看网卡名称
[root@localhost ~]# ifconfig
image.png
修改网卡配置文件,将IP 地址改成192.168.1.1。
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33

IPADDR=”192.168.1.63”
修改为:
IPADDR=”192.168.1.1”
image.png
保存退出,重启网卡
[root@localhost ~]# systemctl restart network

┌──(root㉿kali)-[~]
└─# arping 192.168.1.1 #可以查看到,局域网中存在冒充网关的攻击。
相同IP对应不同MAC
image.png
4、使用netdiscover 进行被动方式探测局域网中存活的机器
netdiscover 是一个主动/被动的ARP 侦查工具。使用netdiscover 工具可以在网络上扫描IP 地址,检查在线主机或搜索为它们发送的ARP 请求。
主动模式:
主动模式顾名思义就是主动的探测发现网络内主机,但是这种方式往往会引起网络管理员的注意
└─# netdiscover -i eth0 -r 192.168.1.0/24
参数:-i device: your network device
-r range: scan a given range instead of auto scan. 192.168.6.0/24,/16,/8
image.png
被动模式:
被动模式的方法更加隐蔽,但是速度会比较慢,网卡被设置为混杂模式来侦听网络内的arp 数据包进行被动式探测,这种方式就需要网络内设备发送arp 包才能被探测到。
└─# netdiscover -p
参数:-p passive mode: do not send anything, only sniff
image.png

4.3.3 使用FPING 查看局域网中运行了哪些机器

Fping 就是ping 命令的加强版他可以对一个IP 段进行ping 扫描,而ping 命令本身是不可以对网段进行扫描的。
┌──(root㉿kali)-[~]
└─# fping -ag 192.168.1.0/24 > fping.txt

┌──(root㉿kali)-[~]
└─# fping -ag 192.168.1.1 192.168.1.254 > fping.txt
-a 表示只显示存活主机
-g 表示对地址段进行扫描,如果不加可以对某个IP 进行扫描
>fping.txt 表示将扫描的结果重定向到fping.txt ,原因是如果扫描一个网段的话输出结果是非常多的,我们输出重定向到文件中只会获得存活的主机信息。
┌──(root㉿kali)-[~]
└─# cat fping.txt
image.png

4.3 TCP 三次握手和四次挥手原理及抓包过程

4.3.1 TCP 三次握手和四次挥手原理

TCP 报文段的首部格式:
image.png
需要了解的信息:
ACK :TCP 协议规定,只有ACK=1 时有效,也规定连接建立后所有发送的报文的ACK 必须为1
SYN(SYNchronization) :在连接建立时用来同步序号。当SYN=1 而ACK=0 时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1 和ACK=1. 因此, SYN 置1 就表示这是一个连接请求或连接接受报文。
synchronization [ˌsɪŋkrənaɪ’zeɪʃn] 同步
FIN (finis)即完,终结的意思,用来释放一个连接。当FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。
finis [‘faɪnɪs] 终结

建立tcp 连接时的tcp 三次握手和断开tcp 连接时的4 次挥手整体过程说明图:
image.png

4.4.2 Tcpdump 抓包查看三次握手过程

tcpdump 常用参数:
-c 指定要抓取的数据包数量
-n 对IP 地址以数字方式显式,否则显式为主机名
port 指定端口
-I 指定tcpdump 需要监听的接口。默认会抓取第一个网络接口
image.png**三次握手的核心是:确认每一次包的序列号。
tcp 三次握手过程:
1、首先由Client 发出连接请求即SYN=1,声明自己的序号是seq=x
2、然后Server 进行回复确认,即SYN=1 ,声明自己的序号是seq=y, 并设置为ack=x+1,
3、最后Client 再进行一次确认,设置ack=y+1.

在kali 上登录localhost,抓取ssh 远程登录localhost 时,产生的tcp 三次握手包:
┌──(root㉿kali)-[~]
└─# tcpdump -n -c 3 port 22 -i eth0
打开另一个终端,开始建立tcp 连接:
┌──(root㉿kali)-[~]
└─# ssh 192.168.1.63
image.png
#到这里就不用执行了,tcp 已经建立连接
查看数据包:
┌──(root㉿kali)-[~]
└─# tcpdump -n -c 3 port 22 -i eth0
image.png
注:Flags [S] 中的S 表示为SYN 标志位为1

client 主机返回ACK,包序号为ack=1 ,这是相对序号,如果需要看绝对序号,可以在tcpdump
命令中加-S

┌──(root㉿kali)-[~]
└─# tcpdump -n -c 3 port 22 -i eth0 -S
12345.png
TCP 三次握手连接状态详解:
image.png**TCP 连接状态详解:
服务器端:LISTEN:侦听来自远方的TCP 端口的连接请求
客户端:SYN-SENT:在发送连接请求后等待匹配的连接请求
服务器端:SYN-RECEIVED:在收到和发送一个连接请求后等待对方对连接请求的确认
客户端/服务器端:ESTABLISHED:代表一个打开的连接

4.4 基于Nmap 的扫描方式

4.4.1 Nmap 的基本扫描方式

Nmap,也就是Network Mapper,最早是Linux 下的网络扫描和嗅探工具包。
注:Nmap 的功能非常强大后面会单独用一节课来进行讲解
例:扫描192.168.1.0 这个网段
┌──(root㉿kali)-[~]
└─# nmap -sn 192.168.1.0/24

┌──(root㉿kali)-[~]
└─# nmap -sn 192.168.1.1-254
-sn 参数说明:表示只ping 扫描,不进行端口扫描

4.4.2 使用nmap 进行半连接扫描

nmap 扫描类型主要有 TCP 的全连接扫描(会在被扫描机器留下记录),半连接扫描(不会留下记录)
image.png**┌──(root㉿kali)-[~]
└─# nmap -sS www.baidu.com -p 80,81,21,25,110-443
-sS 表示使用SYN 进行半连接扫描
image.png
┌──(root㉿kali)-[~]
└─# nmap -sT www.baidu.com -p 80,81,21,25,110,443
-sT 表示使用SYN 进行全连接扫描
image.png

4.4.3 使用nc 扫描端口

nc 是netcat 的简写,有着网络界的瑞士军刀美誉。因为它短小精悍、功能实用,被设计为一个简单、可靠的网络工具
nc 的作用:
1. 实现任意TCP/UDP 端口的侦听,nc 可以作为server 以TCP 或UDP 方式侦听指定端口
2. 端口的扫描,nc 可以作为client 发起TCP 或UDP 连接
3. 机器之间传输文件
4. 机器之间网络测速
nc 参数:
-n 直接使用IP 地址,而不通过域名服务器
-v 显示指令执行过程。
-w 表示超时时间
-z 表示使用0 输入/输出模式,只在扫描通信端口时使用。

┌──(root㉿kali)-[~]
└─# nc -nv -w 1 -z 192.168.1.1 1-100
(UNKNOWN) [192.168.1.1] 80 (http) open
(UNKNOWN) [192.168.1.1] 23 (telnet) : Connection timed out
(UNKNOWN) [192.168.1.1] 21 (ftp) open
image.png

4.5 SYN 洪水攻击和DDOS 攻击防御手段

4.5.1 使用hping3 进行SYN Flood 洪水攻击

SYN 洪水攻击概述:SYN 洪水攻击主要源于:tcp 协议的三次握手机制
SYN 洪水攻击的过程:
在服务端返回一个确认的SYN-ACK 包的时候有个潜在的弊端,如果发起的客户是一个不存在的客户端,那么服务端就不会接到客户端回应的ACK 包。
这时服务端需要耗费一定的数量的系统内存来等待这个未决的连接,直到等待超时关闭,才能释放内存。

如果恶意者通过通过ip 欺骗,发送大量SYN 包给受害者系统,导致服务端存在大量未决的连接并占用大量内存和tcp 连接,从而导致正常客户端无法访问服务端,这就是SYN 洪水攻击的过程。如下图:
image.png
hping3 是一个命令行下使用的TCP/IP 数据包组装/分析工具,通常web 服务会用来做压力测试使用,也可以进行DOS 攻击的实验。同样hping3 每次只能扫描一个目标。
例:使用hping3 进行压力测试
我们先测试网站正常访问
centos7 安装httpd 服务进行测试。
[root@localhost ~]# yum install -y httpd
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# iptables -F
浏览器访问http://192.168.1.55/可以正常访问。
image.png
http://192.168.1.55/进行压力测试
┌──(root㉿kali)-[~]
└─# hping3 -c 100000000 -d 120 -S -p 80 —flood —rand-source 192.168.1.55
-c 100000000 = 发送的数据包的数量。
-d 120 = 发送到目标机器的每个数据包的大小。单位是字节
-S = 只发送SYN 数据包。
-p 80 = 目的地端口(80 是WEB 端口)。你在这里可以使用任何端口。
—flood = 尽可能快地发送数据包,不需要考虑显示入站回复。洪水攻击模式。
—rand-source = 使用随机性的源头IP 地址。上服务器查看,被攻击状态:
[root@localhost ~]# netstat -antup | grep :80
发现了大量伪装的IP 地址,如下
image.png
我们再次刷新网页发现加载速度已经变慢。
image.png
在kali 上,ctrl+c 停止hping3 命令后,即可访问速度正常。
hping3 进行SYN 攻击这种简单的攻击手段我们是可以通过系统优化进行缓解的,如果攻击者IP 地址是固定的我们甚至可以通过封禁IP 来阻断攻击源。

4.5.2 通过优化系统参数缓解DDOS 攻击

优化Linux 内核参数提升SYN:
上传Centos7 内核优化脚本centos.sh 到系统上。centos.sh 脚本优化了Centos 内核参数,由于参数过多这里不做重点介绍。
[root@localhost ~]# bash centos.sh
着重介绍SYN 直接相关的参数。
net.ipv4.tcp_syncookies = 1
#打开SYN cookies 功能,该功能可以尽量把过多的SYN 请求缓存起来。

net.ipv4.tcp_max_syn_backlog = 262144
#定义backlog 队列能容纳的最大半连接数,Centos 系统中该值默认为256,是远远不够的。

net.ipv4.tcp_synack_retries = 1
#表示收到SYN 后发送SYN+ACK 的重传次数,默认为5 表示重试5 次,而且每次重试的间隔会翻倍。1、2、4、8、16 秒,最后一次重试后等待32 秒,若仍然没有收到 ACK,才会关闭连接,故共需要等待63 秒。日常中这个值推荐设置为2 秒,目前网络环境延迟没有以前那么高所以2 秒可以满足日常使用,攻击比较多的时候可适当为1 秒。

net.core.somaxconn = 65535
#上面所提到的backlog 队列实际上受限于系统级的队列上限,通过修改net.core.somaxconn 来提高系统队列上限。

以上是对SYN 的一些优化参数,实际上脚本中有很多针对系统以及TCP 协议的优化,目的都是提高服务器的响应能力。

修改HTTPD 服务的队列长度,每个应用会有自己默认的队列长度,应用的队列长度和系统队列长度取最小值。所以修改服务配置。默认HTTPD 服务队列长度是128。

ss 命令概述:
ss 是Socket Statistics 的缩写。用来获取socket 统计信息。它可以显示和netstat 类似的内容。
ss 的优势在于它能够显示更多更详细的有关TCP 和连接状态的信息,而且比netstat 更快速更高效。
参数:
-n, —numeric 不解析服务的名称,如“22” 端口不会显示成 “ssh”
-l, —listening 只显示处于监听状态的端口
-t, —tcp 显示TCP 协议的sockets
-u, —udp 显示UDP 协议的sockets
[root@localhost ~]# ss -lnt
image.png**修改HTTPD 服务队列长度配置,不要给的太高。系统最大值65535,由somaxconn 参数指定。

将apache 的服务队列改为2048,
[root@localhost ~]# echo “ListenBacklog 2048” >> /etc/httpd/conf.modules.d/00- mpm.conf
重启HTTPD 服务
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# ss -lnt
image.png
注:必须先运行bash centos.sh 内核参数优化脚本,才可以开启apache 的优化。
再次测试SYN Flood 攻击对httpd 服务的影响。
┌──(root㉿kali)-[~]
└─# hping3 -c 1000 -d 120 -S -w 64 -p 80 —flood —rand-source 192.168.1.55

查看SYN 半连接数量。已经可以达到2.6W 了,如果没有进行修改的话只能到256。
[root@localhost ~]# netstat -an | grep SYN | wc -l
26014

浏览器访问:http://192.168.1.55/测试结果为可以缓解,但并不能完全解决问题,偶尔页面还是会打不开。
image.png

4.5.3 通过iptables 封禁攻击者ip 缓解DDOS 攻击

iptables 是centos 自带的防火墙工具,可以通过添加防火墙规则限制同一ip 地址对我们发起过多的请求。
在INPUT 入口方向,将源IP 是192.168.1.33 的数据包,都DROP 丢弃掉。
[root@localhost ~]# iptables -A INPUT -s 192.168.1.33 -j DROP
删除规则:
[root@localhost ~]# iptables -D INPUT -s 192.168.1.33 -j DROP
[root@localhost ~]# ping 192.168.1.33 #可以ping 通了

4.5.4 DDOS 付费维护方案

目前DDOS 攻击的方式越来越多,攻击者成本也越来越低,特别是在游戏行业以及各种行业间的恶意竞争中DDOS 愈发猖獗。
DDOS 攻击的防范方法:
以下是阿里云抵抗DDOS 攻击的推荐方案。
image.png** 攻击者的流量在经过前端高防CDN 时会被各个节点进行过滤清洗流量,经过CDN 之后WAF 防火墙会对应用层流量进行拦截,例如:HTTP flood 攻击在WAF 环节会被拦截,SLB 服务将用户请求转发到服务器集群达到负载均衡的效果。
以上整个防御架构从头到尾都充满了金钱的味道,举个例子阿里云DDOS 高防最低的30Gb 保底防护需要21.216W/年,这还只是最低的30Gb,600Gb 则需要379.746W/年。阿里云游戏盾最低也要96W/年。云原生防护56.16W/年。而发起一次DDOS 攻击的成本也只有几千块钱。双方的投入成本完全不对等,这对于刚创业的公司来说无疑是灾难性的。
image.png
企业受到DDOS 攻击后应当立即到当地网监部门进行报案,采取法律手段正当维护自身权益。