ICMP数据报格式
https://zhuanlan.zhihu.com/p/58662573
头部type,code,checksum ,4字节,扩展字段,4字节
icmp作为数据部分封装到ip数据报中
IPv4中的常用type,ipv6与之不同
- 0:Echo Reply 回显应答,返回数据 ping
- 3:Destination Unreachable 不可达
- 5:Redirect (change route) 重定向
- 8:Echo Request 回显请求,ping
- 11:time Exceeded for a Datagram,超时
struct icmp
{
u_int8_t icmp_type; /* type of message, see below */
u_int8_t icmp_code; /* type sub code */
u_int16_t icmp_cksum; /* ones complement checksum of struct tcp、icmp是全部的校验和,ip的只有头部*/
union
{
u_char ih_pptr; /* ICMP_PARAMPROB */
struct in_addr ih_gwaddr; /* gateway address */
struct ih_idseq /* echo datagram */
{
u_int16_t icd_id;
u_int16_t icd_seq;
} ih_idseq;
u_int32_t ih_void;
smurf攻击
冒充target ip 广播icmp回显请求,target会收到大量icmp回显回复,从而忙于处理icmp而拒绝服务。
如何防御?
使主机或路由器不响应ICMP请求或广播,或使路由器不转发目的是广播地址的数据包
ICMP重定向攻击
代码:icmpRedirect.c
重定向:若路由器收到一个数据报,并发现该数据报存在一个比自己更好的下一跳路由,就会向主机发送重定向报文,让其更新转发表。
重定向只支持对单个目标主机的重定向,所以不会改变路由表,但可以改变route cache, netstate -rn --cache。
sudo netwox 86 -g new_gateway_ip -i old_gateway_ip
也可以通过raw socket编程,手动实现重定向。
如何防御:使用防火墙过滤icmp或手动关闭icmp redirect
基于libpcap的sniffer
头文件 pcap.h
基于libpcap,编译时加入 -lpcap
编程步骤:
- 查找设备
- 打开设备,获得一个把手(handle是系统提供的一个用于交互的接口)
- 设置、应用filter
- 抓包,pcap_next (只抓一 次) , pcap_loop (循环)
- 分析数据包
- 结束
char errBuf[PCAP_ERRBUF_SIZE], * devStr;
/* 查找设备 */
devStr = pcap_lookupdev(errBuf);
/*捕获数据
* 参数:设备名称,最大捕获量(字节),是否置于混杂模式(混杂即捕获设备收发的所有数据),超时时间(0表示没有超时等待),错误信息
*/
pcap_t * handle = pcap_open_live(devStr, 65535, 1, 0, errBuf);
struct bpf_program filter;
char filterstr[50]={
0};
sprintf(filterstr,"src host %s",Vic_IP); //将ip写入filterstr缓冲区
//编译filter
//参数:filter过滤器指针;filterstr过滤表达式; 1:表达式是否被优化;0:应用此过滤器的掩码
if (pcap_compile(handle, &filter, filterstr, 1, 0) == -1) {
fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle));
return 0;
}
//启用过滤器
if (pcap_setfilter(handle, &filter) == -1) {
fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle));
return 0;
}
//循环抓包
//-1表示循环次数,getPacket是回调函数,用于解析数据包,最后参数一般置为null
pcap_loop(handle,