python黑帽编程视频_Python黑帽编程资源收集整理

一、sniffer工作原理详解

原文出处:http://www.360doc.com/content/17/0715/17/40903010_671561330.shtml

先讲讲HUB的工作原理吧。由于以太网等很多网络(常见共享HUB连接的内部网)是基于总线方式,物理上是广播的,就是一个机器发给另一个机器的数据,共享HUB先收到然后把它接收到的数据再发给别的(来的那个口不发了)每一个口,所以在共享HUB下面同一网段的所有机器的网卡都能接收到数据。交换式HUB的内部单片程序能记住每个口的MAC地址,以后就该哪个机器接收就发往哪个口,而不是像共享HUB那样发给所有的口,所以交换HUB下只有该接收数据的机器的网卡能接收到数据,当然广播包还是发往所有口。显然共享HUB的工作模式使得两个机器传输数据的时候别的口也占用了,所以共享HUB决定了同一网段同一时间只能有两个机器进行数据通信,而交换HUB两个机器传输数据的时候别的口没有占用,所以别的口之间也可以同时传输。这就是共享HUB与交换HUB不同的两个地方,共享HUB是同一时间只能一个机器发数据并且所有机器都可以接收,只要不是广播数据交换HUB同一时间可以有对机器进行数据传输并且数据是私有的。

再讲讲网卡的工作原理。网卡收到传输来的数据,网卡内的单片程序先接收数据头的目的MAC地址,根据计算机上的网卡驱动程序设置的接收模式判断该不该接收,认为该接收就接收后产生中断信号通知CPU,认为不该接收就丢掉不管,所以不该接收的数据网卡就截断了,计算机根本就不知道。CPU得到中断信号产生中断,操作系统就根据网卡的驱动程序设置的网卡中断程序地址调用驱动程序接收数据,驱动程序接收数据后放入信号堆栈让操作系统处理。

有了这HUB、网卡的工作原理就可以讲SNIFFER了。首先,要知道要SNIFFER的东西必须是要物理信号你能收到的东西。显然只要通知网卡接收其收到的所有包(一般叫作乱模式),在共享HUB下就能接收到这个网段的所有包,但是交换HUB下就只能是自己的包加上广播包。知道了原理那就好办。要想在交换HUB下接收别人的包,那就要让其发往你的机器所在口。交换HUB记住一个口的MAC是通过接收到来至于那个口的数据后记住其源MAC,就像一个机器的IP与MAC对应的ARP列表,交换HUB维护一个物理口(就是HUB上的网线插口,这而的所有HUB口都是指这)与MAC的表,所以可以欺骗交换HUB的。那样你发一个包设置源MAC是你想接收的机器的MAC,那么交换HUB就把你机器的网线插的物理口与那个MAC对应起来了,以后发给那个MAC的包就发往你的网线插口了,也就是你的网卡可以SNIFFER到了。注意这物理口与MAC的表与机器的ARP表一样是动态刷新的,那机器发包后交换HUB就又记住他的口了,所以实际上是两个在争,这只能应用在只要收听少量包就可以的场合,或者干脆你弄死要冒牌的机器。还有内部网嘛基于IP的通信你可以用ARP欺骗别人机器让其发给你的机器就可以了,如果要想不影响原来两方的通信,可以欺骗两方,让其都发给你的机器你的机器再转发,就是做中间人,这用ARP加上编程很容易实现。还有现在很多设备支持远程管理,有很多交换HUB可以设置一个口监听别的口,不过这就要管理权限了。

拨号用户嘛就是拨号服务器接收到包根据IP分析是哪个拨号用户的包,可能也是通过查找分配拨号用户的IP与拨号电话线的一个列表,然后就发往那个拨号用户的电话线,所以其相当于交换HUB,但这儿是用的IP,交换HUB是用的MAC,所以拨号用户能接收到自己的包。相应的要想接收别的包就得欺骗拨号服务器,当然这不是交换HUB那么好欺骗,因为显然拨号服务器的IP与电话线的列表不是交换HUB那么维护的,可以看能不能破了拨号服务器改其驱动让其所有包都发给你,显然不太可能了。:(

下面是3COM网卡驱动程序,结合此程序讲讲网卡的原理,你可以对照程序理解。可能有的网卡有些不一样,但大致原理一样,所以理解很多东西不能完全照搬。

一般网卡有个网卡地址MAC,这地址网卡厂家得申请,每个厂家得到一段地址,不同厂家不同就像IP地址的分配一样,然后用这段地址分配给其生产的每个网卡一个地址。一般说来网卡厂家保证每个网卡地址不同,实际上网卡地址一般不是放在网卡内部程序里,因为网卡内程序一般都是固化的,相同网卡所有网卡的程序全部一样,还有很多网卡可以配置支持很多方式,所以一般网卡都带一个EEPROM存储器,网卡地址MAC就放这里面。其实网卡接收包有几种方式,接收指定MAC地址的包、广播包、组播包、所有的包等,可以对其编程。通常网卡驱动程序设置的是接收指定MAC地址的包和广播包,如果设置了接收所有的包,就是我们常说的用于SNIFFER的乱模式。网卡内单片接收指定MAC地址的包的MAC也不是内部程序直接通过EEPROM的数据得到,而是驱动程序通过读E2PROM得到MAC,再把这MAC告诉网卡的MAC寄存器,网卡的内部程序通过MAC寄存器得到的,并且以此为标准。所以只要改驱动程序把你想要的MAC告诉MAC寄存器那么就得到你想要的MAC了。

1. 关于MAC:

1.1

for (i = 0; i < 3; i++)

phys_addr[i] = htons(read_eeprom(ioaddr, i));

读EEPROM中的MAC,有差不多的两个地方,可能是ISA、PCI总线网卡的差别,每次读出来的是字(两个字节)。

static ushort read_eeprom(short ioaddr, int index)

{

outw(EEPROM_READ + index, ioaddr + 10);

/* Pause for at least 162 us. for the read to take place. */

udelay (500);

return inw(ioaddr + 12);

}

这是读EEPROM的数据的函数调用,看这很可能有可以写EEPROM数据的可能,就是E2PROM里面的MAC数据可以改写,原来很多网卡有设置程序可以指定其MAC地址的,所以。。。

1.2

memcpy(dev->dev_addr, phys_addr, sizeof(phys_addr));

EEPROM中读出来的MAC地址拷贝到DEV_ADDR中。

1.3

for (i = 0; i < 6; i++)

outb(dev->dev_addr[i], ioaddr + i);

MAC写入MAC寄存器中,网卡是以写入MAC寄存器的内容为标准,实际上与网卡EEPROM数据中的MAC无关。还有发包的时候与源MAC无关,就和现在的IP包发包的时候的源IP可以随便填一样,只是接收包的时候网卡通过MAC寄存器内容和接收模式判断该不该接收。当然别人接收包后回复一般都是把收到的包的源MAC当目的MAC,所以你发包的源MAC是假的话可能也收不到回复包。

还有要改MAC只要这儿的DEV_ADDR为你想要的MAC就可以,这儿可以从一个文件读入MAC地址或者WINDOWS那样从注册表里面读取MAC内容,这就要看驱动程序额外提供的接口了。

2. 关于接收模式:

enum RxFilter {

RxStation = 1, RxMulticast = 2, RxBroadcast = 4, RxProm = 8 };

是定义的接收模式。

outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD);

是设置接收模式,加上RxMulticast还是RxProm应该就是乱模式了。

3COM的网卡驱动程序:

/* 3c509.c: A 3c509 EtherLink3 ethernet driver for linux. */

Written 1993-1997 by Donald Becker.

Copyright 1994-1997 by Donald Becker.

Copyright 1993 United States Government as represented by the

Director, National Security Agency. This software may be used and

distributed according to the terms of the GNU Public License,

incorporated herein by reference.

This driver is for the 3Com EtherLinkIII series.

The author may be reached as becker@cesdis.gsfc.nasa.gov or

C/O Center of Excellence in Space Data and Information Sciences

Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771

Known limitations:

Because of the way 3c509 ISA detection works it's difficult to predict

二、 sniffer(嗅探器)之数据捕获

链接:https://www.cnblogs.com/xuanhun/p/5994126.html

涉及内容:

以太网网卡的工作模式

Linux下设置网卡为混杂模式

无线网卡的监听模式

在Windows和linux下通过Socket编程实现sniffer功能。

三、sniffer(嗅探器)之利用现有网络库实现sniffer

链接:https://www.cnblogs.com/xuanhun/p/5997164.html

涉及内容:

利用Pypcap实现sniffer

pypcap是一个对libpcapC库进行封装和简化的面向对象的抓包工具库,可以非常方便的用于抓包和过滤

利用Scapy编写sniffer

Scapy是一个功能强大的交互式数据包操作程序。它能够伪造或解码大量协议的数据包,通过线路发送,捕获它们,匹配请求和回复等等。Scapy可以轻松处理大多数经典任务,如扫描,跟踪路由,探测,单元测试,攻击或网络发现。它可以取代hping,arpspoof,arp-sk,arping,p0f甚至是Nmap,tcpdump和tshark的某些部分。

使用Pcapy进行数据捕获

在网络数据分析的工具中,tcpdump绝对是大名鼎鼎,tcpdump底层是libpcap库,由C语言编写。 Pcapy模块则是基于libpcap的Python接口。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值