#我的武器库系列#之动态防御核心实现

        动态防御是2011年美国国家技术委员会提出了“移动目标防御”(MTD)的概念,通过动态变换的方式,加强网络坚固程度,有效阻止黑客人员的渗透入侵,以动态变换的形式,削弱或者根本解决黑客对目标渗透经验积累问题,在行为初期便可有效斩断网络攻击链。本文利用APR及ICMP协议实现虚假arp及ping包响应,当黑客网内扫描时,虚假IP回复Reply报文,使其黑客认为存在该节点,以虚假的方式扰乱黑客对网络的认知,以监察检测的方式查看哪些IP对其虚假IP进行访问。

       后期我们可丰富数据包响应,比如说80、1521、3306等等,丰富程度越高,网络动态防御能力越强。

一、源代码

# -*- coding: UTF-8 -*-
import string
import random
from scapy.all import *
shamIp = ["192.168.1.200","192.168.1.201","192.168.1.202","192.168.1.203"];#虚假节点
localMac ="78:4f:43:9f:82:ab"; #本地mac地址
#动态生成mac地址
def makeNewMc():
    newMac = '';
    for i in range(6):
        newMac = newMac+''.join(random.sample('0123456789abcdef',2));
        if(i <= 4):
            newMac = newMac+":";
    return newMac;

#获取网段内真实IP地址
#在 Scapy 中使用 sr 函数、sr1 函数来发送和接收第三层的数据包(IP等),而 srp 函数用于发送和接受第二层的数据包(Ethernet、ARP、802.3等)
def gainHostMac(ip_address):
    responses,unanswered = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip_address),timeout=2,retry=5);
    for s,r in responses:
        return r[Ether].src;
    return None;
#获取数据包,并判断虚假节点,如果访问虚假节点,系统做出响应
def packet_callback(packet):
    #0x806(十六进制) 转十进制为2054   0x800为2048
    if packet[Ether].type == 2048: #IP
        pdst =  packet[IP].dst;
        if  pdst in shamIp:
                print("构造虚假icmp进行响应");
                packet_callback_icmp(packet);
    else:
        pdst = packet[ARP].pdst;  #arp
        #判断是否为虚假节点。如果是则进行回复冒充
        if  pdst in shamIp:
            print("扫描虚假节点啦~~~~~~");
            sham = ARP();
            sham.op = 2;
            sham.psrc = pdst;
            sham.hwsrc = localMac;
            sham.pdst = packet[ARP].psrc;
            sham.hwdst = packet[ARP].hwsrc;
            send(sham); #回复arp数据包

#发送虚假ICMP数据包
def packet_callback_icmp(packet):
    print("发送虚假数据至->%s",packet[IP].src);
    pack_ip = IP(dst = packet[IP].src,src = packet[IP].dst,proto = packet[IP].proto);
    pack_icmp = ICMP(type = 0,code = 0,id=packet[ICMP].id,seq=packet[ICMP].seq);
    pcak_load = Raw("abcdefghijklmnopqrstuvwabcdefghi");
    send(pack_ip/pack_icmp/pcak_load);

#发送虚假TCP数据包  
def packet_callback_tcp(packet):
    print("---");
    
#系统开始
def main():
    sniff( filter="arp or icmp",prn=packet_callback,store=0);

if __name__ == "__main__":
    main();

        当我们启动一台机器(ping包主机)对网络中200等IP虚假网络(见源代码shamip数组)ping包是,系统会自动获取相关ARP及ICMP数据包信息,并构造虚假信息进行回复。

当设备(ping包主机)对外ping包时,下图为wireshark抓包记录,可见系统构造的arp及icmp已经响应。关于ARP与ICMP关系可见第二节。

设备(ping包主机)arp -a指令执行后,可见我们构造的虚假节点192.168.1.201与102的mac(该地址为启动python的地址)地址一致。

当ping包主机ping虚假IP时,构造虚假回复包,下图可见已经ping成功。

系统后台发包输出日志。

二、ARP与ICMP关系

    假设我们的计算机IP地址是192.168.1.102,要执行这个命令:ping192.168.1.201。该命令会通过ICMP协议发送ICMP数据包。该过程需要经过下面的步骤:

1.构造ICMP包,提交网络驱动程序;

2.检查本地APR缓存中是否有对应信息;

3.如果存在,则直接发送ICMP包(以太网层->IP层->ICMP层->payload)。

4.如果不存在,发送广播包,目的mac为FF:FF:FF:FF:FF:FF,APR的类型为1(请求,2为响应)。届时所有IP都可收到,检查自己对应信息是否一致,不一致丢弃,一致单播包告知目标主机。ARP类型为2。

5.目标主机收到信息后,缓存到arp表中。arp接收包以最后一个包为准(这也是利用arp数据包欺骗时为什么要不停发送数据包的原因)。

6.内核把IP转换为MAC,确定好信息后,发送ICMP包。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

登峰造Geek

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值