Python黑客编程3网络数据监听和过滤
课程的实验环境以下:
• 操作系统:kali Linux 2.0
• 编程工具:Wing IDE
• Python版本:2.7.9
• 触及到的主要python模块:pypcap,dpkt,scapy,scapy-http
触及到的几个python网络抓包和分析的模块,dpkt和scapy在kali linux 2.0 中默许已被安装,如果你的系统中没有需要手动安装1下,下面是软件包安装的简单说明。
在kali下安装pypcap需要两步(如果在其他系统上可能还需要安装python-dev):
apt-get install libpcap-devpip install pypcap
使用pip安装scapy。
root@kali:/home/pycharm# pip install scapy
使用pip安装scapy-http。
root@kali:/home/pycharm# pip install scapy-http
基础环境准备好以后,我还要再唠叨1下你必须要掌握的基础。
1.1 技术没有黑白,网络编程的基础是协议
把编程挂上黑客的名义,多少有些标题党。代码怎样写,程序怎样用,完全是技术问题。不会由于叫网络编程就低人1等,叫黑客编程也不会变得神秘或高大上,代码就在那里,不低微也不高尚。所以学习编程,要有颗平常心。
很多听课的同学和我反应,网络编程格外的费劲,繁琐,要实现某种功能,如果Google不到类似的代码就没法下手。各种语言或框架针对网络编程的实现基本都相同,由于我们接触到网络通讯都基于统1的规范和标准,语言和框架只是在用自己的方式去描写这个规范而已。本质的问题来了,如果你连基本的网络通讯的4层模型都不懂,对TCP/IP协议族毫无概念,那末我奉劝你先不要着急敲代码,找本书,打开WireShark这样的工具好好做做练习。
本次课程中的所有案例,其实都在遵守1个基本的思路(其他网络通讯场景类似):
初始化以太网数据包对象à以太网数据包分离出ip数据包àIP数据包分离传输层数据包à传输层数据包分离利用层数据包。
只要我们具有基础的网络知识,结合程序中各个对象提供的字段就可以得到我们想要的任何基础信息,在此基础上做些信息处理就可以完成大部份网络监听和数据处理的任务。附上几幅图,如果这方面有欠缺的话,请立即去充电吧!
以太网帧格式
ip数据包格式
Tcp数据包格式
1.2 使用pypcap实时抓包
pypcap进行实时的数据包捕获,使用上很简单,我们先看1小段示例代码:
import pcappc=pcap.pcap('wlan0') #注,参数可为网卡名,如eth0pc.setfilter('tcp port 80') #2.设置监听过滤器for ptime,pdata in pc: #ptime为收到时间,pdata为收到数据print ptime,pdata #...
在上面的代码中,我们通过“import pcap”首先引入pypcap包,然后初始化1个pcap类实例,构造函数需要传入1个网卡用来监听,我们可以通过ifconfig获得当前机器上的网卡。
pcap类的setfilter方法用来设置监听过滤条件,这里我们设置过滤的数据包为tcp协议80端口的数据。以后程序就进入监听状态了。
接下来我们循环输出接收到的数据,ptime为时间,pdata的数据,默许数据打印为ascii字符,效果以下:
在抓到数据包以后,下1步就需要对数据进行解析,这里我们引入dpkt组件包。
1.3 使用dpkt 解析数据包
dpkt,简单来讲是1个数据包解析工具,可以解析离线/实时pcap数据包。
1.3.1 实时解析
我们以下面的代码为例,讲授基本利用。
import pcapimport dpktdef captData():pc=pcap.pcap('wlan0') #注,参数可为网卡名,如eth0pc.setfilter('tcp port 80') #设置监听过滤器for ptime,pdata in pc: #ptime为收到时间,pdata为收到数据anlyCap(pdata);def anlyCap(pdata):p=dpkt.ethernet.Ethernet(pdata)if p.data.__class__.__name__=='IP':ip='%d.%d.%d.%d'%tuple(map(ord,list(p.data.dst)))if p.data.data.__class__.__name__=='TCP':if p.data.data.dport==80:print p.data.data.data # http 要求的数据 captData();
在上面代码中,我们首先导入dpkt包。这段代码中新增了1个anlyCap方法,该方法接收由pcap捕获的http数据包,然后先获得ip数据报文,从ip报文中再提取tcp数据包,最后从tcp数据包中提取http要求的数据,将其打印出来。
对数据包的分析,新手可能会感到迷茫,如何选择适合的协议和方法来分析呢?这个问题的答案不在代码,而在于网络通讯协议本身的掌握和理解。
回到上面的代码,我们想要分析http要求的数据,http是利用层协议,通过TCP协议来传输数据,那末TCP数据又被封装在IP数据报文中。使用dpkt的第1步就是选择数据包类型,这里固然是要选择以太网数据包了。
依照网络协议,层层剥离,会解析到所有你想要的数据。
1.3.2 解析离线数据包
下面我们来看1个解析离线数据包的例子。
import dpktimport socket#----------------------------------------------------------------------def printPcap(pcap):""""""for(ts,buf) in pcap:try:eth=dpkt.ethernet.Ethernet(buf);ip=eth.data;src=socket.inet_ntoa(ip.src);dst=socket.inet_ntoa(ip.dst);tcp=ip.data;#tcp.dport tcp.sportprint '[+]Src: '+src+ ' --->Dst: '+ dstexcept:pass;#----------------------------------------------------------------------def main():""""""f=open('/home/pcap/test.pcap');#1.open filepcap=dpkt.pcap.Reader(f);# init pcap objprintPcap(pcap);if __name__ == '__main__':main();
首先我准备了1个测试的抓包文件—test.pcap,该文件是我使用wireshark在windows上抓取的数据包,现在使用代码对齐进行基本的分析。在方法printPcap中,获得ip数据报的内容,然后获得它的源ip和目标ip数据,通过socket.inet_ntoa方法转换成ip字符串,最后打印出来。结果以下图所示:
1.4 使用Scapy进行数据监听
Scapy的是1个强大的交互式数据包处理程序(使用python编写)。它能够捏造或解码大量的网络协议数据包,能够发送、捕捉、匹配要求和回复包等等。它可以很容易地处理1些典型操作,比如端口扫描,tracerouting,探测,单元测试,攻击或网络发现(可替换hping,NMAP,arpspoof,ARP-SK,arping,tcpdump,tethereal,P0F等)。 最重要的他还有很多更优秀的特性——发送无效数据帧、注入修改的802.11数据帧、在WEP上解码加密通道(VOIP)、ARP缓存攻击(VLAN) 等,这也是其他工具没法处理完成的。
Scapy可以单独使用,也能够在python中调用。
1.4.1 Scapy基本使用
了解Scapy的基本使用和支持的方法,首先我们从终端启动scapy,进入交互模式。
ls()显示scapy支持的所有协议。
ls()函数的参数还可以是上面支持的协议中的任意1个的类型属性,也能够是任何1个具体的数据包,如ls(TCP),ls(newpacket)等。
lsc()列出scapy支持的所有的命令。
本篇文章使用的只是scapy众多命令中的1个,sniff。
conf:显示所有的配置信息。conf变量保存了scapy的配置信息。
help()显示某1命令的使用帮助,如help(sniff)。
show()显示指定数据包的详细信息。例如,这里我们先创建1个IP数据包,然后调用show方法。
sprintf()输出某1层某个参数的取值,如果不存在就输出”??”,具体的format格式是:%[[fmt][r],][layer[:nb].]field%,详细的使用参考的146页。
%[[fmt][r],][layer[:nb].]field%
layer:协议层的名字,如Ether、IP、Dot11、TCP等。
filed:需要显示的参数。
nb:当有两个协议层有相同的参数名时,nb用于到达你想要的协议层。
r:是1个标志。当使用r标志时,意味着显示的是参数的原始值。例如,TCP标志中使用人类可浏览的字符串’SA’表示SYN和ACK标志,而其原始值是18.
1.4.2 sniff
Scapy的功能如此强大,足够写个系列了,本文只关注sniff这1个方法。
sniff方法是用来嗅探数据的,我们首先使用help查看1下此方法的使用说明:
sniff(count=0, store=1, offline=None, prn=None, lfilter=None, L2socket=None, timeout=None, opened_socket=None, stop_filter=None, *arg, **karg)Sniff packetssniff([count=0,] [prn=None,] [store=1,] [offline=None,] [lfilter=None,] + L2ListenSocket args) -> list of packetscount: number of packets to capture. 0 means infinitystore: wether to store sniffed packets or discard themprn: function to apply to each packet. If something is returned,it is displayed. Ex:ex: prn = lambda x: x.summary()lfilter: python function applied to each packet to determineif further action may be doneex: lfilter = lambda x: x.haslayer(Padding)offline: pcap file to read packets from, instead of sniffing themtimeout: stop sniffing after a given time (default: None)L2socket: use the provided L2socketopened_socket: provide an object ready to use .recv() onstop_filter: python function applied to each packet to determineif we have to stop the capture after this packetex: stop_filter = lambda x: x.haslayer(TCP)
除上面介绍的几个参数,sniff()函数还有1个重要的参数是filter,用来表示想要捕获数据包类型的过滤器,如只捕获ICMP数据包,则filter=”ICMP”;只捕获80端口的TCP数据包,则filter=”TCP and (port 80)”。其他几个重要的参数有:count表示需要不活的数据包的个数;prn表示每一个数据包处理的函数,可以是lambda表达式,如prn=lambda x:x.summary();timeout表示数据包捕获的超时时间。
sniff(filter="icmp and host 66.35.250.151", count=2)
这段代码过滤icmp协议,host地址为66.35.250.151,捕获数据包个数为2个。
sniff(iface="wifi0", prn=lambda x: x.summary())
这段代码绑定网卡wifi0,对捕获的数据包使用summary进行数据汇总。
sniff(iface="eth1", prn=lambda x: x.show())
这段代码绑定网卡eth1,对数据包调用show方法,显示基本信息。
下面我们看具体的1段代码:
from scapy.all import *ap_list = []def PacketHandler(pkt) :if pkt.haslayer(Dot11) :if pkt.type == 0 and pkt.subtype == 8 :if pkt.addr2 not in ap_list :ap_list.append(pkt.addr2)print "AP MAC: %s with SSID: %s " %(pkt.addr2, pkt.info)sniff(iface="wlan0mon", prn = PacketHandler)
上面这段代码对绑定网卡WLAN0mon,对每一个数据包调用PacketHandler方法进行解析。PacketHandler实际上是通过数据包过滤可访问的无线网络的SSID。
1.4.3 Scapy-http
Scapy-http直接将 数据包格式化成 http数据信息,免去自己构建http数据结构进行解析的麻烦。
import scapy_http.http as HTTPfrom scapy.all import *from scapy.error import Scapy_Exceptioncount=0def pktTCP(pkt):global countcount=count+1print countif HTTP.HTTPRequest or HTTP.HTTPResponse in pkt:src=pkt[IP].srcsrcport=pkt[IP].sportdst=pkt[IP].dstdstport=pkt[IP].dporttest=pkt[TCP].payloadif HTTP.HTTPRequest in pkt:#print "HTTP Request:"#print testprint "======================================================================"if HTTP.HTTPResponse in pkt:print "HTTP Response:"try:headers,body= str(test).split("\r\n\r\n", 1)print headersexcept Exception,e:print eprint "======================================================================"else:#print pkt[IP].src,pkt[IP].sport,'->',pkt[TCP].flagsprint 'other'sniff(filter='tcp and port 80',prn=pktTCP,iface='wlan0')
上面的这段代码,我们引入scapy_http.http,该组件包可以直接将Http要求的TCP数据包格式化成HTTPRequest或HTTPResponse对象,这大大方便了我们对HTTP数据的分析。
• scapy_http在github上的开源地址为:https://github.com/invernizzi/scapy-http。
1.4.4 综合实例--net-creds
net-creds是1个小的开源程序,由python编写,主要是从网络或pcap中嗅探敏感数据。可以嗅探以下类型的数据:
·URLs visited
·POST loads sent
·HTTP form logins/passwords
·HTTP basic auth logins/passwords
·HTTP searches
·FTP logins/passwords
·IRC logins/passwords
·POP logins/passwords
·IMAP logins/passwords
·Telnet logins/passwords
·SMTP logins/passwords
·SNMP community string
·NTLMv1/v2 all supported protocols like HTTP, SMB, LDAP, etc
·Kerberos
基本用法以下:
自动选择网卡进行嗅探:
sudo python net-creds.py
指定嗅探的网卡:
sudo python net-creds.py -i eth0
疏忽指定IP的数据包:
sudo python net-creds.py -f 192.168.0.2
从pcap文件中过滤信息:
python net-creds.py -p pcapfile
建议读者能够静下心来浏览该程序的源码,本身其实不是很复杂,难度不高。下面摘几段代码。
ipr = Popen(['/sbin/ip', 'route'], stdout=PIPE, stderr=DN)for line in ipr.communicate()[0].splitlines():if 'default' in line:l = line.split()iface = l[4]return iface
上面这1段代码是利用Popen组件和PIPE组件来自动查找网卡。
def telnet_logins(src_ip_port, dst_ip_port, load, ack, seq):'''Catch telnet logins and passwords'''global telnet_streammsg = Noneif src_ip_port in telnet_stream:# Do a utf decode in case the client sends telnet options before their username# No one would care to see thattry:telnet_stream[src_ip_port] += load.decode('utf8')except UnicodeDecodeError:pass# \r or \r\n or \n terminate commands in telnet if my pcaps are to be believedif '\r' in telnet_stream[src_ip_port] or '\n' in telnet_stream[src_ip_port]:telnet_split = telnet_stream[src_ip_port].split(' ', 1)cred_type = telnet_split[0]value = telnet_split[1].replace('\r\n', '').replace('\r', '').replace('\n', '')# Create msg, the return variablemsg = 'Telnet %s: %s' % (cred_type, value)printer(src_ip_port, dst_ip_port, msg)del telnet_stream[src_ip_port]# This part relies on the telnet packet ending in# "login:", "password:", or "username:" and being <750 chars
Python黑客编程3网络数据监听和过滤相关推荐
- Python黑客编程基础3网络数据监听和过滤
Python黑客编程3网络数据监听和过滤 课程的实验环境如下: • 操作系统:kali Linux 2.0 • 编程工具:Wing IDE • Python版本:2.7. ...
- 你值得拥有!更省钱地完成数据监听
作者 | 梁唐 来源 | TechFlow(ID:techflow2019) 大家好,今天一起来了解一个新的设计模式--观察者模式. 观察者模式的思路很简单,它被广泛地应用在各种数据监控上. 很多时候 ...
- 安卓APP在运行时对全局进行网络状态监听的实现
转载自:https://blog.51cto.com/wangjinchan/4752142 感谢博主:一粒程序米 分享 一.前言 怎么对APP进行全局的网络监听呢?仿照微信的无网状态下弹出的提示,应 ...
- Android 网络改变监听
Android 实现网络改变监听,在我们用手机的时候,有时候需要切换网络,有时候在无线网络环境中,从流量状态下切换成wifi连接:而有时候在没有无线网络环境的地方,从wifi连接切换到流量连接,这时候 ...
- Object.defineProperty与双向绑定、数据监听
一.对象赋值的两种方式 一是"="赋值,一是Object.defineProperty方法,而当下流行框架中广泛应用的双向绑定和数据监听等,就是利用的第二种方式,关于此方法不多讲, ...
- android 窗口监听按键,Android编程实现Dialog窗体监听的方法
本文实例讲述了Android编程实现Dialog窗体监听的方法.分享给大家供大家参考,具体如下: 今天做了一个Dialong窗体监听包括窗体内的xml监听. 效果图: test.class代码 pac ...
- vue笔记(二)Vue-class与style、事件、计算属性、数据监听、指令+自定义指令、过滤器
vue官网 一 .class.style操作 二.事件 三.计算属性 四.数据监听.观测 五.指令+自定义指令 六.过滤器 一 .class.style操作 官网 1. class使用: (1)v-b ...
- vue,watch监听数据,数据监听
vue,watch监听数据,数据监听 三个值: 1.第一个handler:其值是一个回调函数.即监听到变化时应该执行的函数. 2.第二个是deep:其值是true或false:确认是否深入监听.(一般 ...
- 我的Vu啊(vue 2.0,数据监听,计算属性,组件传参)
提示:个人Vue学习工作总结 (持续更新中如果有不对的地方还请前辈多多指点) 文章目录 vue 计算属性 computed vue 数据监听 wacth 提示:以下是本篇文章正文内容,下面案例可供 ...
最新文章
- 深度丨人工智能和大数据的关系及中国在AI领域如何赶超世界
- springboot-web开发(请求参数)
- Hadoop学习之以伪分布模式部署Hadoop及常见问题
- OpenCV形态学变换函数morphologyEx()开运算的使用
- 如何修改PHP项目Language Library版本号
- as运行时不报错却闪退_字典访问不存在的key 时,如何才能不报错?
- mac ---- 安装nginx
- 床车长时间自驾游,大家晚饭后至睡觉前这段时间都在忙什么?
- C语言中可变参函数介绍与示例
- hibernate 状态间转换及update,saveOrUpdte
- 微信小程序教程、开发资源下载汇总(2.8日更新,持续更新中……)
- DPDK ring简单说明
- 桌面支持--skype登陆不上
- 凡事预则立,不预则废。做事提前5分钟,更多主动权。
- Go实战--golang中使用echo框架中JSONP(labstack/echo)
- hive的分区和分桶
- 《石器时代》《魔力宝贝》图像压缩格式的破解
- 从零开始搭建仿抖音短视频APP-后端消息业务模块开发(2)-基础版完结篇
- delphi----Tstringlist,将有符号的数据变成数组aaa,bbb,ccc----list[0]=aaa,list[1]=bbb
- docker和docker-compose部署
热门文章
- Cell Research | 单细胞测序技术揭示派杰氏病的致病机制
- Astro Panel Pro for Mac - ps天文景观插件 支持ps2021
- linux分区表导出与恢复,Linux下硬盘数据恢复与分区表恢复
- java 上溯_java中Instrument的上溯造型
- 1.8 编程基础之多维数组 09 矩阵乘法 6分 python
- 1982:【19CSPJ普及组】数字游戏 scratch C++
- Java工作笔记-IntelliJ IDEA中的精确搜索
- Linux工作笔记-使用SCP文件协议(SSH协议22端口)使Windows与Linux互传文件
- Qt工作笔记-Qt文档笔记-QPainter::drawText写文本并且居中
- 最小生成树(克鲁斯卡尔算法)