Python 面向监狱编程,就靠它了
网络编程大家都学过吧?
socket -> bind -> listen -> accept-> recv/recvfrom -> send/sendto
一气呵成,什么select、poll、epoll多路复用模型信手拈来。
但这一套东西,只是开发建立在传输层TCP、UDP之上的应用程序。
你有没有想过,如何编程批量发送一批TCP SYN握手包,来进行端口扫描?
如何编程来发送一个伪造了IP地址的ARP数据包和IP数据报文?
甚至,如何编程来发送一个伪造了MAC地址的以太网数据帧?
一旦你掌握了上面几招,玩转数据包不是问题,开发各种神器不在话下。但一定要用在正途上,不要面向监狱编程哦~
那到底如何构造发送各种各样的数据包呢?今天给大家介绍一个强大的玩意:scapy
这是一个强大的数据包构造工具,你可以在Python中使用它,是时候喊一声:Python大法好了!
ARP
我们拿ARP开刀,ARP是地址解析协议,局域网中通信需要使用网卡的MAC地址,而网络层通信使用的是IP地址,在应用程序的数据包被发送出去之前,在IP报文前面添加以太网帧头时,需要填写收件人的MAC地址。
如果是局域网内部通信,这个收件人地址就是目的电脑的网卡MAC地址,而如果是互联网上的公网IP地址,这个收件人地址就是网关的MAC地址。
无论怎样,总得有个MAC地址才行,那怎么来呢?这就是ARP协议要干的事,它能将一个IP地址转换成一个MAC地址。
ARP解析的过程这里就不详述了,简单来说,比如要查询192.168.1.100的MAC地址,主机使用ARP协议在局域网中发出一声广播:192.168.1.100,我叫你一声你敢答应吗?
局域网中所有人都能收到这个广播(因为它的收件人MAC地址是FF-FF-FF-FF-FF-FF),但只有IP地址是192.168.1.100的这个家伙会回一句:爷爷在此!我的MAC地址是xxxxxx。
注意,在我们平时应用程序通信时,以上过程都是操作系统底层协议栈自动完成的,我们的应用程序感知不到这些。
我们可以使用Scapy这个库,来发起一次ARP解析。
from scapy.all import *
def arp_scan(ip):answer, uanswer = srp(Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=ip), inter=0.1, timeout=2, verbose=False)mac_list = []for send, recv in answer:if recv[ARP].op == 2:mac_list.append((recv[ARP].psrc, recv[Ether].hwsrc))return mac_list
上面这段代码,通过scapy库中的srp函数发送了一个以太网帧,收件人是ff:ff:ff:ff:ff:ff,表明这是个广播包,链路层之上是ARP协议,需要解析的IP是传入待解析的IP地址参数。
上面的函数一执行,你就能在wireshark中抓到数据包了:
上面说过,正常情况下,只有目标地址是我查的那个主机才会回复我。
但假如你的局域网中有人不怀好意,抢在真正的主机之前回答我:爷爷在此!我的MAC地址是yyyyyy。
那事情就糟了,后面的的通信报文都发给这个假冒的家伙那里去了,这就是大名鼎鼎的ARP欺骗攻击!
再试想一下,如果查询的IP地址是网关的IP地址,那后果更严重,所有的网络通信都发到这家伙来了。
既然能发送ARP查询报文,你把上面的代码改一下,自然也能发送ARP应答报文···
ARP的故事先说到这里,咱们再来看一下,用scapy做一个端口扫描器。
端口扫描
TCP端口扫描,通过发送三次握手的第一次SYN数据包,根据返回的结果来判断端口的打开情况:
如果返回ACK+SYN,也就是flags字段是18,则说明端口开启:
如果返回ACK+RST,也就是flags字段是20,则说明端口关闭:
下面的函数就能实现:
from scapy.all import *
def port_scan(port):answer, uanswer = sr(IP(dst="192.168.1.1") / fuzz(TCP(dport=int(port), flags="S")))for s, r in ans:if r[TCP].flags == 18:print("port is Open")if r[TCP].flags == 20:print("port is Closed")
抓包来看:
握手包和服务器的返回包都能清楚看到,如果在循环中不断调用该函数,传入不同的端口,则可以实现批量端口扫描。
scapy构造数据包的能力这只是冰山一角,更多强大的功能等着你去研究。
学习计算机网络,不要只停留在看书和看博文的基础上,如果能自己编程收发数据包,去实现ARP、ICMP、DHCP、DNS的功能,或者开发一些简单的网络工具,绝对比别人掌握的更加深刻。
最后,给大家留一个思考题,如何通过构造IP报文实现traceroute的路由跟踪功能呢,想一想,这该如何实现?
推荐阅读
Pandas处理数据太慢,来试试Polars吧!
懒人必备!只需一行代码,就能导入所有的Python库
绝!关于pip的15个使用小技巧
介绍10个常用的Python内置函数,99.99%的人都在用!
可能是全网最完整的 Python 操作 Excel库总结!
Python 面向监狱编程,就靠它了相关推荐
- Python入门到入狱?怎样才能避免面向监狱编程?
嗨害大家好鸭!我是小熊猫❤ 最近,有很多关于程序员被抓甚至被判刑的新闻在朋友圈疯传: "某程序员因为接了个外包,帮别人写了个软件,结果这个软件被用于赌博导致被抓. 某公司利用爬虫抓取用户信息 ...
- 程序员,技术的“背锅侠”,盘点 2020 年面向监狱编程的那些事!
[CSDN 编者按]过去一年,"删库跑路".安全漏洞等事件层出不穷,企业.技术人深受其害,作为一名程序员,在新的一年即将到来之际,我们该如何避免面向监狱编程? 作者 | 马超 ...
- 程序员避免面向监狱编程攻略大盘点
2020年时间过得好快,转眼间白驹过隙般飞奔而去,而在岁末年初的当口,笔者在回顾这一年程序员世界的大事件后,突然发觉如何避免程序员面向监狱编程是个特别值得一谈的话题,这几天一款秒杀茅台酒的Python ...
- Python 面向“牢房”编程,就靠它了
很多文章不能更新至CSDN,可以关注我的同名公众号(程序员启航) 网络编程大家都学过吧? socket -> bind -> listen -> accept-> recv/r ...
- 震惊!编写“爬虫”,怎么“面向监狱编程”了?
2019年9月以来,不少因为非法使用"爬虫"技术,而使公司面临诉讼,程序猿被警察带走的新闻震惊了IT圈的小伙伴们! 我只是个写爬虫的,跟我有什么关系? 许多程序员都有这样的想法,技 ...
- 频频曝出程序员被抓,我们该如何避免面向监狱编程?
过去几年,频频有程序员被抓的消息刷爆技术圈,无论是技术高手.公司合伙人还是普通程序员,甚至整个科技公司,都有因为违法被抓的案例. 案例 比如: 1.著名的Nignx之父Igor Sysoev的前东家R ...
- 第四十六期:最近程序员频繁被抓,如何避免面向监狱编程?!
最近,有很多关于程序员被抓甚至被判刑的新闻在朋友圈疯传:"某程序员因为接了个外包,帮别人写了个软件,结果这个软件被用于赌博导致被抓.某公司利用爬虫抓取用户信息,最后被发现,导致该公司的程序员 ...
- 最近程序员频繁被抓,如何避免面向监狱编程?!
最近,有很多关于程序员被抓甚至被判刑的新闻在朋友圈疯传: "某程序员因为接了个外包,帮别人写了个软件,结果这个软件被用于赌博导致被抓. 某公司利用爬虫抓取用户信息,最后被发现,导致该公司的程 ...
- 从 Nginx 到 Pandownload,程序员如何避免面向监狱编程?
作者 | 马超 来源 | CSDN博客,责编 | 夕颜 封图 | CSDN付费下载视觉中国 出品 | CSDN(ID:CSDNnews) 据扬州网警巡查执法官方消息,百度网盘破解版Pandownloa ...
最新文章
- 6月.CN域名注册量突破1200万个 增速环比加快
- python在中小学教学中的应用-中小学Python教学的几点建议
- python实战系列之写个好玩的猜拳游戏(附源代码)
- java String部分源码解析
- 次梯度法matlab代码,实例:连续化次梯度法解 LASSO 问题
- WinPcap笔记(2):获取设备列表
- 第19章,运维自动化之系统安装
- 【Elasticsearch】es一个奇怪的问题 is_write_index fasle的时候还在写入 索引滚动无效
- 本地离线语音识别芯片厂家盘点,哪一家实力更强
- 多物理场面向对象模拟环境MOOSE学习手册
- 常见端口的作用、漏洞和操作建议(转)
- Android 6.0 运行时权限管理最佳实践
- 获取微信运动 php,微信运动数据抓取(PHP语言)
- Xtrabackup 安装以及 mysql 使用 Xtrabackup 物理备份过程记录
- Linux用账号密码登录redis
- 喜报销无缝接入微信企业号 企业员工可在微信上移动报销
- idea设置自动导包
- infortrend GSe Pro 208 NAS开箱初体验
- 【华为云技术分享】云原生数据库三驾马车之TaurusDB
- Cocos Creator 微信小游戏 填坑记录
热门文章
- idea中git提交代码更改作者名字(亲测)
- PHP的魔术常量魔术方法超全局变量
- PHP的各种参数设置ini_set:内存 错误等级 session
- TP、Yii、Laravel的区别
- uni-app中使用lodash_uniapp适配到微信小程序注意事项
- mysql 存guid类型_从C#在MySQL中存储GUID
- java 索引排序_Java培训MySQL之排序分组优化索引的选择
- SpringBoot是什么?可以做什么?
- Linux命令 查看文件中指定行号的内容
- Linux shell 条件判断if