网络编程大家都学过吧?

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 面向监狱编程,就靠它了相关推荐

  1. Python入门到入狱?怎样才能避免面向监狱编程?

    嗨害大家好鸭!我是小熊猫❤ 最近,有很多关于程序员被抓甚至被判刑的新闻在朋友圈疯传: "某程序员因为接了个外包,帮别人写了个软件,结果这个软件被用于赌博导致被抓. 某公司利用爬虫抓取用户信息 ...

  2. 程序员,技术的“背锅侠”,盘点 2020 年面向监狱编程的那些事!

    [CSDN 编者按]过去一年,"删库跑路".安全漏洞等事件层出不穷,企业.技术人深受其害,作为一名程序员,在新的一年即将到来之际,我们该如何避免面向监狱编程? 作者 | 马超    ...

  3. 程序员避免面向监狱编程攻略大盘点

    2020年时间过得好快,转眼间白驹过隙般飞奔而去,而在岁末年初的当口,笔者在回顾这一年程序员世界的大事件后,突然发觉如何避免程序员面向监狱编程是个特别值得一谈的话题,这几天一款秒杀茅台酒的Python ...

  4. Python 面向“牢房”编程,就靠它了

    很多文章不能更新至CSDN,可以关注我的同名公众号(程序员启航) 网络编程大家都学过吧? socket -> bind -> listen -> accept-> recv/r ...

  5. 震惊!编写“爬虫”,怎么“面向监狱编程”了?

    2019年9月以来,不少因为非法使用"爬虫"技术,而使公司面临诉讼,程序猿被警察带走的新闻震惊了IT圈的小伙伴们! 我只是个写爬虫的,跟我有什么关系? 许多程序员都有这样的想法,技 ...

  6. 频频曝出程序员被抓,我们该如何避免面向监狱编程?

    过去几年,频频有程序员被抓的消息刷爆技术圈,无论是技术高手.公司合伙人还是普通程序员,甚至整个科技公司,都有因为违法被抓的案例. 案例 比如: 1.著名的Nignx之父Igor Sysoev的前东家R ...

  7. 第四十六期:最近程序员频繁被抓,如何避免面向监狱编程?!

    最近,有很多关于程序员被抓甚至被判刑的新闻在朋友圈疯传:"某程序员因为接了个外包,帮别人写了个软件,结果这个软件被用于赌博导致被抓.某公司利用爬虫抓取用户信息,最后被发现,导致该公司的程序员 ...

  8. 最近程序员频繁被抓,如何避免面向监狱编程?!

    最近,有很多关于程序员被抓甚至被判刑的新闻在朋友圈疯传: "某程序员因为接了个外包,帮别人写了个软件,结果这个软件被用于赌博导致被抓. 某公司利用爬虫抓取用户信息,最后被发现,导致该公司的程 ...

  9. 从 Nginx 到 Pandownload,程序员如何避免面向监狱编程?

    作者 | 马超 来源 | CSDN博客,责编 | 夕颜 封图 | CSDN付费下载视觉中国 出品 | CSDN(ID:CSDNnews) 据扬州网警巡查执法官方消息,百度网盘破解版Pandownloa ...

最新文章

  1. 6月.CN域名注册量突破1200万个 增速环比加快
  2. python在中小学教学中的应用-中小学Python教学的几点建议
  3. python实战系列之写个好玩的猜拳游戏(附源代码)
  4. java String部分源码解析
  5. 次梯度法matlab代码,实例:连续化次梯度法解 LASSO 问题
  6. WinPcap笔记(2):获取设备列表
  7. 第19章,运维自动化之系统安装
  8. 【Elasticsearch】es一个奇怪的问题 is_write_index fasle的时候还在写入 索引滚动无效
  9. 本地离线语音识别芯片厂家盘点,哪一家实力更强
  10. 多物理场面向对象模拟环境MOOSE学习手册
  11. 常见端口的作用、漏洞和操作建议(转)
  12. Android 6.0 运行时权限管理最佳实践
  13. 获取微信运动 php,微信运动数据抓取(PHP语言)
  14. Xtrabackup 安装以及 mysql 使用 Xtrabackup 物理备份过程记录
  15. Linux用账号密码登录redis
  16. 喜报销无缝接入微信企业号 企业员工可在微信上移动报销
  17. idea设置自动导包
  18. infortrend GSe Pro 208 NAS开箱初体验
  19. 【华为云技术分享】云原生数据库三驾马车之TaurusDB
  20. Cocos Creator 微信小游戏 填坑记录

热门文章

  1. idea中git提交代码更改作者名字(亲测)
  2. PHP的魔术常量魔术方法超全局变量
  3. PHP的各种参数设置ini_set:内存 错误等级 session
  4. TP、Yii、Laravel的区别
  5. uni-app中使用lodash_uniapp适配到微信小程序注意事项
  6. mysql 存guid类型_从C#在MySQL中存储GUID
  7. java 索引排序_Java培训MySQL之排序分组优化索引的选择
  8. SpringBoot是什么?可以做什么?
  9. Linux命令 查看文件中指定行号的内容
  10. Linux shell 条件判断if