网络安全复习笔记
- 一、课程介绍
- 二、米特尼克的圣诞攻击
- 三、网络命令
- 四、ARP攻击(数据链路层)
- 五、IP协议安全(网络层)
- 六、ICMP协议安全(网络层)
- 七、TCP/UDP协议安全(传输层)
- 七、防火墙(iptables/netfilter)
一、课程介绍
1. ARP缓存中毒(ARP cache poisoning)
ARP 缓存是 ARP 协议的重要组成部分。ARP 协议运行的目标就是建立 MAC 地址和 IP 地址的映射,然后把这一映射关系保存在 ARP 缓存中,使得不必重复运行 ARP 协议。因为 ARP 缓存中的映射表并不是一直不变的,主机会定期发送 ARP 请求来更新它的 ARP 映射表,利用这个机制,攻击者可以伪造 ARP 应答帧使得主机错误的更新自己的 ARP 映射表,这个过程就是 ARP 缓存中毒。
这样的后果即使要么使主机发送 MAC 帧到错误的 MAC 地址,导致数据被窃听;要么由于 MAC 地址不存在,导致数据发送不成功。
关键 netwox 命令:
netwox 80 --eth "00:00:00:00:00:00" --ip "192.168.224.134"
在实验之前需要清除缓存,防止直接从缓存中读取相应的MAC地址。
arp #显示所有的表项。
arp -d address #删除一个arp表项。
arp -s address hw_addr #设置一个arp表项。
2.SYN 泛洪攻击
SYN 攻击是一种 DoS(Denial of Service)攻击,在这种攻击中黑客向被攻击者的 TCP 端口发送很多 SYN 请求,但是黑客并不是想完成三次握手协议,而是使用伪造的 IP 地址或者只进行三次握手协议中的第一次握手。因为 SYN 数据包用来打开一个 TCP 链接,所以受害者的机器会向伪造的地址发送一个 SYN/ACK 数据包作为回应,并等待预期的 ACK 响应。每个处于等待状态,半开的链接队列都将进入空间有限的待处理队列。由于伪造的源地址实际上并不存在,所以将那些等待队列中的记录删除并完成建立 TCP 连接所需的 ACK 响应用于不会到来,相反每个半开的连接一定会超时,这将花费一段比较长的时间。
只要攻击者使用伪造的 SYN 数据包继续泛洪受害者的系统,受害者的待处理队列将一直处于满员,这使得真正的 SYN 数据包几乎不可能到达系统并打开有效的 TCP 连接。
关键 netwox 命令:
netwox 76 -i "192.168.224.134" -p "23" #向主机的23端口发送大量的TCP连接请求
要实现该攻击需要关闭服务器上的一个安全措施:
/proc/sys/net/ipv4# sudo echo 0 > tcp_syncookies
3.对 Telnet 的 TCP RST 攻击
TCP RST 攻击可以终止两个被攻击主机之间的 TCP 连接。
A和服务器B之间建立了 TCP 连接,此时C伪造了一个 TCP 包发给B,使B异常的断开了与A之间的 TCP 连接,就是 RST 攻击了。实际上从RST 标志位的功能已经可以看出这种攻击如何达到效果了。
关键 netwox 命令:
netwox 78 -i "192.168.224.138" #代表向目标主机发送 TCP RST 数据包,使其中断 telnet 连接
二、米特尼克的圣诞攻击
Kevin Mitnick对下村勉的攻击。
入侵者需要解决的几件事:
- 受害者的机器与哪个机器有信任关系?
入侵加州互联网站点,发出命令查看谁登录过受害者的工作站。(了解finger命令) - 有信任关系的机器需要阻塞!
对有信任关系的机器进行DoS攻击,让其无法响应其他信息。否则该机器会对收到的受害者机器发来的信息进行响应,这里会对SYN包回复RST包,这样攻击者就可以发送虚假确认包。 - 如何构造SYN+ACK数据报?
构造SYN数据报的关键在于找到seq值,当时的计算机seq值是线性增加的,只需要收到几个连续的数据报分析规律即可。 - 确保攻击时只有该主机与之通信 !
受害者的机器需要闲置,所以选择在圣诞节进行攻击,否则seq难以预测。 - 冒充信任的机器建立连接之后要做什么?
继续冒充该机器,向受害者机器发送信任所有机器的指令,这样攻击者就不需要构造数据包,直接用自己的机器就可以与受害者机器进行通信。或者攻击者可以添加一个后门,留作日后攻击。 - 如何全身而退
需要删除日志,发送RST释放可信Server中的TCP连接。
IP欺骗:在服务器不存在任何漏洞的情况下,通过利用TCP/IP协议本身存在的一些缺陷进行攻击的方法。
IP欺骗包含几个步骤:
- 首先,选择目标主机。
- 接下来,发现信任模式以及可信主机。
- 然后禁用可信主机,并对目标的TCP序列号进行采样。 模拟可信主机,猜测序列号,并尝试连接仅需要基于地址的身份验证的服务。
- 如果成功,攻击者会执行一个简单的命令来留下后门。
三、网络命令
这里只是简单的罗列一下:
ping
ifconfig
route -n
traceroute url/ip
nslookup ip
whois
netstat #显示网络连接,查看监听的端口
netcat #网络工具中的瑞士军刀,传输文件等等
nmap
四、ARP攻击(数据链路层)
ARP执行的是32位IP地址和48位MAC之间的转换。
查看ARP表:
arp -n
过程:
- 主机 A 希望与主机B通信,但是只知道主机B的IP地址。
- 主机A广播主机B的IP地址的ARP请求。
- 所有本局域网内的主机都能收到这个广播包。
- 只有主机B回复此包,携带上自己的MAC地址。
- 主机A将B的IP地址和MAC地址的对应关系添加到自己的ARP缓存中。
- 主机A构造对B的数据包。
ARP缓存的特点:
- 每个条目是有有效期的;
- ARP缓存是无状态的,收到更新信息即更新。
以太网帧格式:
Frame types: 0800 IP; 0806 ARP; 8035 RARP。
实现:
netwox是一个发包工具,可以构造各种类型和内容的数据包。可以发出多大数百种不同的包。
sudo netwox 80 -e "MAC" -i "ip"
构造ARP数据包可以导致:
- 目的地址不提供转发功能,导致被攻击主机无法上网;
- 目的地址提供转发功能,导致所有数据包都会被攻击主机所截获。
五、IP协议安全(网络层)
IP协议是网络中最繁忙的协议。IP协议是一种best efforts协议,不保证可靠性,数据包可能重复、丢失;无连接协议,同一个连接中的多个报文被独立对待。IP协议主要定义了数据传送的基本单位;执行路由功能;主要规定了主机和路由器应该如何处理数据包;在什么情况下产生错误信息;以及什么情况下应该丢弃数据包。
1. IP数据报头部
TYPE:IP报文中承载的数据的类型:1, ICMP; 2 IGMP; 6 TCP; 17 UDP。
2. IP分片
概念
- 原因:硬件环境的MTU限制,以太网限制帧的大小为1500字节。一个IP报文最多可达65565最大长度。
- IP fragmentation(IP分片):在IP层将报文根据MTU分片;每个片段使用与IP报文同样的报头;每个片段独立地路由;
如何分片:
- IDENT: 也即identifier,用于标识IP报文段的唯一标识符;具有同一IDENT的片段属于同一个IP报文;
- FRAGMENT OFFSET: 简称FO,指明当前片段在原始完整的IP报文中的位置(偏移)。该偏移的单位是8个字节;
- FLAGS: bit 0:保留;bit 1:不分片;bit 2:更多分片。如果此位是1,那么说明不是最后一个分片,如果是0,说明是最后一个分片。
每个分片的Total Length指的是当前的分片长度,并非完整报文长度。在IP层上必须进行重组(需要考虑若干问题),将完整的数据包发到上层。
3. 针对IP分片功能的攻击思路
- DoS
攻击者构造两个分片,第一个分片的偏移为0;第二个分片的偏移是64800(假的分片,中间没有这么多)。
因为IP分片可以乱序到达,所以接收方会等待其他分片;同时会为其他分片分配内存空间。相当于一个数据包会使用64K的内存。而且这段空间会持续保留15~255秒。这样,很快会耗尽主机的内存空间,造成DoS。
Windows 2000, XP, 以及Unix的各版本都有这个漏洞。 - TearDrop
TearDrop攻击的原理,在于构造两个分片。其中,第二个分片完全包含在第一个分片中。这种攻击的成功,依赖于一种当分片发生重叠时,重组的方法。
IP分段可用于伪装TCP数据包以通过路由器和主机中使用的IP过滤器。
如果第一个片段丢失,目标主机将无法完成数据包的重组,因此将丢弃整个数据包。
- 微小碎片攻击
STD 5,RFC 791规定:
每个互联网模块最小能够转发68个八位字节的数据报,不允许进一步分段。这是因为IP头部最多可达60个八位字节,最小片段为8个八位字节。
而重要的传输头信息(例如,TCP头的CODE字段)可能超出了第8个数据八位字节。
预防方法:
- 直接法
-存在一些下限TMIN,它是包含“有趣”字段所需的传输头的最小长度(即,其值对于分组过滤器是重要的字段)。该长度是从原始未分段IP分组中的传输头的开头开始测量的。
除了TCP之外,其他传输协议的“有趣”字段位于传输头的前八个八位字节中,因此不可能将它们推入非零偏移片段
FO = 0且PROTOCOL = TCP,则TRANSPORTLEN <tmin - 间接方法
TCP数据包被分段以便迫使零偏移片段(第一个分片)中不存在“有趣”的头部字段时,必定存在FO等于1的片段。如果看到具有FO == 1的分组,则相反地,它可以指示在片段集中存在具有八个八位字节的传输报头长度的零偏移片段。
- 重叠碎片攻击
预防方法:
使用重叠安全的重组算法
如果FO == 1 并且 PROTOCOL == TCP
DROP PACKET
六、ICMP协议安全(网络层)
ICMP是控制协议,主要是因为IP协议有可能出现报文发送过程中的错误。ICMP使得路由器和主机可以向发送方提供错误或者控制信息。
1. 报文格式
有多种不同的ICMP报文,每种报文都有自己的格式,但是所有的ICMP报文都有三个共同的字段:
- TYPE(8-bit): identifies the message
0:Echo Reply (ICMP Echo即ping)
3:Destination Unreachable
5:Redirect (change route)
8:Echo Request - CODE(8-bit): provides further information about the message type
- CHECKSUM(16-bit)
- *also include the header and the first 64 data bits of the datagram causing the problem.
路由器之间会经常交换信息,以适应网络拓扑的变化,保持最优路由。而主机会假设路由器的信息更权威,路由器总是对的。
2. ICMP协议攻击
- Smurf Attack
Smurf攻击是一种分布式拒绝服务攻击,其中使用IP广播地址将具有预期受害者的欺骗源IP的大量互联网控制消息协议(ICMP)分组广播到计算机网络,使受害主机忙于处理ping回复而无法正常工作。
预防:
1.配置各个主机和路由器不响应ICMP请求或广播;
2. 配置路由器不转发定向到广播地址的数据包。 (1999年)
- Ping of Death
当接收器组装所有IP分段时,它将以一个大于65,535字节的IP数据包结束。这可能会溢出接收器为数据包分配的内存缓冲区,并可能导致各种问题。
这里ICMP仅用作有效载荷,预防的话可以添加重组过程的检测,应由某些防火墙执行。或者使用大于65,535字节的内存缓冲区来重新组装数据包。
七、TCP/UDP协议安全(传输层)
1.概念
端口是一种抽象的软件结构,包括一些数据结构和I/O缓冲。进程通过系统调用与端口建立连接(binding),之后传输层传给该端口的数据都被相应进程所接收,而相应进程发给传输层的数据也通过该端口。端口操作类似于一般的I/O操作,可以用一般的读写系统调用来操作。
TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立。
- 21:FTP
- 22:SSH(远程加密登录)
- 23:Telnet
- 25:SMTP
- 53:DNS
- 80:HTTP
- 110:POP3
- 443:HTTPS
TCP和UDP的包头结构:
2.TCP攻击
- TCP SYN Flooding
sudo netwox 76 -i ${ip} -p ${port} #需要将tcp_syncookies设置为0
原理:TCP端口一直监听SYN报文,一旦接收需为即将建立的TCP连接分配TCB(280~1300字节),并且进入半开连接状态。OS最多可开启的半开连接数一定,过多会消耗内存而不能处理其他请求。
解决:
SYN Cache仅保留一些连接的基本信息。
SYN Cookie的思路是在ACK到达之前不分配任何资源。SYN Cookie保留的是专门构造的SYN+ACK包中的seq的值(不再是随机的)。
- nmap扫描
以上两种扫描方法,也称作tcp connect(-sT)扫描,和TCP SYN(半开-sS)扫描。-sT不建议使用。
sudo nmap ip #查看当前主机打开的端口,发送探测包,根据第二个数据包判断(ACK/RST)而且不留痕迹
如果没有响应可能是被防火墙过滤了。
sudo iptables -A INPUT -p tcp --dport 21 -j DROP #对21端口进行过滤
nmap -sA扫描:
设置ACK位进行扫描的方法。
ACK数据包不会启动会话建立,所以比较隐蔽;同时,因为ACK数据包不会单独出现,所以,对于端口,不管是开放的还是关闭的,如果收到一个不请自来的ACK数据包,都会发一个RST包。
ACK扫描的主要作用就是判断端口有没有被过滤,可以避开防火墙保护(SYN会被拦截,ACK不会)。
sudo nmap -sA ${ip}
其他:
map的FIN Scan (-sF), Xmas Tree Scan (-sX), and Null Scan (-sN)
如果是开放的端口,那么不会产生任何的响应;如果是关闭的端口,会生成一个RST回复。当然,如果端口被过滤,也不会有任何响应。
namp fragment扫描(-f):
碎片扫描:这是和之前介绍IP攻击的时候的碎片攻击一样的思路。
sudo nmap -f ${ip} -p ${port} # -f指示指定的SYN或FIN扫描使用微小的碎片数据包
nmap idle扫描:
特点:
允许进行完全盲目的端口扫描。事实上,攻击者可以不用向目标发送数据包就完成扫描工作,隐蔽性好。
原理:
针对identifier字段进行检测(大部分OS简单的+1),可以判断主机距离上一次发包之后又发了几个数据包。
做法:
借用了idle的主机,也成为zombie主机,这个主机本身开启,但是基本不使用,没有数据流。
- 探测Zombie的IP ID(发送SYN/ACK)并记录下来。
- 伪造Zombie主机发SYN数据包给目标主机。根据端口的状态,目标主机可能会也有可能不会导致Zombie主机IP ID值增加(+1/+0)。
- 再探测Zombie主机的IP ID(发送SYN/ACK)。比较两次得到IP ID值(+2表示开放,+1表示关闭,>2表示发包太多)。
关键在于寻找这样的Zombie主机,并且确保在探测期间,IPID不会因为其他原因而增加。
idle扫描无法区分关闭和过滤的情况,但是可以绕过防火墙。
- version扫描
原理:
针对软件版本的扫描,这种扫描需要发送大量的数据包,并且需要与自己内部的指纹库进行比较,从而判断。
sudo nmap -sV ${ip}
- 操作系统扫描
sudo nmap -O -T4 ${ip} #结果-A表示启动OS、版本以及脚本扫描
网络安全
系统安全
七、防火墙(iptables/netfilter)
分类:1. 包过滤防火墙(packet filter);2. 应用层网关代理(Application level Gateway)3. 状态防火墙(stateful firewall)。
1.包过滤防火墙
又称为无状态防火墙,或静态防火墙。通过ACL(Access Control List)规则控制数据流的,根据包头部的元素(源地址、目标地址、协议、源端口、目标端口dport)进行判断
优点:处理速度快、易于配置;
缺点:1. 难以处理分片(IP碎片攻击);2. 不支持某些复杂的协议;3. 不能防止应用层等恶意攻击,不识别应用层的数据。
2.应用级网关代理防火墙
通过使用代理主机,客户和服务器之间从不会有真正的连接。应用代理网关防火墙彻底隔断内网与外网的直接通信,所有通信都必须经应用层代理软件转发。
优点:对数据的控制直接上升到应用层,对数据包检测非常充分。
缺点:需要编写特定的安全代理程序。
3. 状态检测防火墙
又称动态包过滤防火墙。通信过程中的会话数据包不是一个个完全独立的数据包,而是有前后连接状态的。在接收到连接建立请求是,就可以建立一张表,在表中存储相关的各个连接的信息,建立连接状态规则,基于这个表对进入和出去的数据包进行匹配。
在同一个会话中,五元组不会变化,但是各种状态标识、分片等都是可以变化的。
4. iptables/netfilter
iptables/netfilter是Linux内置的防火墙,用户空间的iptables制定防火墙规则,内核空间的netfilter则真正实现防火墙功能。
iptables:
基本规则管理命令:
-A, --append chain rule-specification:追加新规则于指定链的尾部;
-I, --insert chain [rulenum] rule-specification:插入新规则于指定链的指定位置,默认为首部;
-R, --replace chain rulenum rule-specification:替换指定的规则为新的规则;
-D, --delete chain rulenum:根据规则编号删除规则;
-D, --delete chain rule-specification:根据规则本身删除规则;
基本链管理命令:
-F, --flush [chain]:清空指定的规则链上的规则;
-P, --policy chain target 制定链表的策略(ACCEPT|DROP|REJECT)
-L, --list [chain]:列出规则(包括target、port、opt)
一些基本操作:
sudo iptables -P INPUT DROP #阻止任何发送进来的包
sudo iptables -A INPUT -p icmp -j ACCEPT #接收icmp数据包
sudo iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT #只接收icmp回复类型的数据包
sudo iptables -D INPUT 1 #删除INPUT链中最后一个规则
一些高级的操作:
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 5/min -j ACCEPT #限制每分钟接收的数据包的个数为5
sudo iptables -I OUTPUT -m string --algo bm --string "baidu" -j REJECT #支持String扩展功能,拒绝包含“baidu”的信息,即无法访问baidu网站
iptables的整体结构:默认的是filter表
filter表
主要和主机自身有关,主要负责防火墙功能、过滤本机流入流出的数据包是默认使用的表。
NAT表
负责网络地址转换,即来源于目的IP地址和端口的转换,一般用于共享上网或特殊端口的转换服务。
snat :地址转换
dnat :标地址转换
pnat :标端口转换
mangle表:负责拆解报文,修改并重新封装。
raw表:可以关闭iptables中开启的连接追踪。
5. NAT
“Network Address Translation”,网络地址转换,把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。
描述:
- 先经过 NAT table 的 PREROUTING 链;
- 经由路由判断确定这个封包是要进入本机与否,若不进入本机,则下一步;
- 再经过 Filter table 的 FORWARD 链;
- 通过 NAT table 的 POSTROUTING 链,最后传送出去。
简单的示例:网页中无论输入什么都返回192.168.116.159主页。
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 192.168.116.159:80
修改IP:
SNAT:POSTROUTING在修改来源IP;
DNAT:PREROUTING则在修改目标IP 。
#step 1
iptables –t nat –A PREROUTING –i eth1 –d 61.240.149.149 –p tcp –dport 80 –j DNAT --to-destination 192.168.10.6:80
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE #外网IP地址不稳定的情况即可使用MASQUERADE(动态伪装)
#step 2
iptables –t nat –A POSTROUTING –s 192.168.10.10 –o eth1 –j SNAT --to-source 111.196.221.212