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表项。
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
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对下村勉的攻击。
入侵者需要解决的几件事:
IP欺骗:在服务器不存在任何漏洞的情况下,通过利用TCP/IP协议本身存在的一些缺陷进行攻击的方法。
IP欺骗包含几个步骤:
这里只是简单的罗列一下:
ping
ifconfig
route -n
traceroute url/ip
nslookup ip
whois
netstat #显示网络连接,查看监听的端口
netcat #网络工具中的瑞士军刀,传输文件等等
nmap
ARP执行的是32位IP地址和48位MAC之间的转换。
查看ARP表:
arp -n
过程:
ARP缓存的特点:
以太网帧格式:
Frame types: 0800 IP; 0806 ARP; 8035 RARP。
实现:
netwox是一个发包工具,可以构造各种类型和内容的数据包。可以发出多大数百种不同的包。
sudo netwox 80 -e "MAC" -i "ip"
构造ARP数据包可以导致:
IP协议是网络中最繁忙的协议。IP协议是一种best efforts协议,不保证可靠性,数据包可能重复、丢失;无连接协议,同一个连接中的多个报文被独立对待。IP协议主要定义了数据传送的基本单位;执行路由功能;主要规定了主机和路由器应该如何处理数据包;在什么情况下产生错误信息;以及什么情况下应该丢弃数据包。
TYPE:IP报文中承载的数据的类型:1, ICMP; 2 IGMP; 6 TCP; 17 UDP。
概念
如何分片:
每个分片的Total Length指的是当前的分片长度,并非完整报文长度。在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个八位字节。
预防方法:
预防方法:
使用重叠安全的重组算法
如果FO == 1 并且 PROTOCOL == TCP
DROP PACKET
ICMP是控制协议,主要是因为IP协议有可能出现报文发送过程中的错误。ICMP使得路由器和主机可以向发送方提供错误或者控制信息。
有多种不同的ICMP报文,每种报文都有自己的格式,但是所有的ICMP报文都有三个共同的字段:
路由器之间会经常交换信息,以适应网络拓扑的变化,保持最优路由。而主机会假设路由器的信息更权威,路由器总是对的。
预防:
1.配置各个主机和路由器不响应ICMP请求或广播;
2. 配置路由器不转发定向到广播地址的数据包。 (1999年)
端口是一种抽象的软件结构,包括一些数据结构和I/O缓冲。进程通过系统调用与端口建立连接(binding),之后传输层传给该端口的数据都被相应进程所接收,而相应进程发给传输层的数据也通过该端口。端口操作类似于一般的I/O操作,可以用一般的读写系统调用来操作。
TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立。
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的值(不再是随机的)。
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主机,并且确保在探测期间,IPID不会因为其他原因而增加。
idle扫描无法区分关闭和过滤的情况,但是可以绕过防火墙。
sudo nmap -sV ${ip}
sudo nmap -O -T4 ${ip} #结果-A表示启动OS、版本以及脚本扫描
网络安全
系统安全
分类:1. 包过滤防火墙(packet filter);2. 应用层网关代理(Application level Gateway)3. 状态防火墙(stateful firewall)。
又称为无状态防火墙,或静态防火墙。通过ACL(Access Control List)规则控制数据流的,根据包头部的元素(源地址、目标地址、协议、源端口、目标端口dport)进行判断
优点:处理速度快、易于配置;
缺点:1. 难以处理分片(IP碎片攻击);2. 不支持某些复杂的协议;3. 不能防止应用层等恶意攻击,不识别应用层的数据。
通过使用代理主机,客户和服务器之间从不会有真正的连接。应用代理网关防火墙彻底隔断内网与外网的直接通信,所有通信都必须经应用层代理软件转发。
优点:对数据的控制直接上升到应用层,对数据包检测非常充分。
缺点:需要编写特定的安全代理程序。
又称动态包过滤防火墙。通信过程中的会话数据包不是一个个完全独立的数据包,而是有前后连接状态的。在接收到连接建立请求是,就可以建立一张表,在表中存储相关的各个连接的信息,建立连接状态规则,基于这个表对进入和出去的数据包进行匹配。
在同一个会话中,五元组不会变化,但是各种状态标识、分片等都是可以变化的。
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表:负责拆解报文,修改并重新封装。
“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