面向监狱编程,就靠它了!日子是越来越有判头了!
网络编程大家都学过吧?
socket -> bind -> listen -> accept-> recv/recvfrom -> send/sendto
一气呵成,什么select、poll、epoll多路复用模型信手拈来。
但这一套东西,只是开发建立在传输层TCP、UDP之上的应用程序。
你有没有想过,如何编程批量发送一批 TCP SYN 握手包,来进行端口扫描?
如何编程来发送一个伪造了IP地址的ARP数据包和IP数据报文?
甚至,如何编程来发送一个伪造了MAC地址的以太网数据帧?
一旦你掌握了上面几招,玩转数据包不是问题,开发各种神器不在话下。但一定要用在正途上,不要面向监狱编程哦~
那到底如何构造发送各种各样的数据包呢?今天给大家介绍一个强大的玩意:scapy。这是一个强大的数据包构造工具!
——————
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解析。
上面这段代码,通过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,则说明端口关闭:
下面的函数就能实现:
抓包来看:
握手包和服务器的返回包都能清楚看到,如果在循环中不断调用该函数,传入不同的端口,则可以实现批量端口扫描。
scapy构造数据包的能力这只是冰山一角,更多强大的功能等着你去研究。
学习计算机网络,不要只停留在看书和看博文的基础上,如果能自己编程收发数据包,去实现ARP、ICMP、DHCP、DNS的功能,或者开发一些简单的网络工具,绝对比别人掌握得更加深刻。
最后,给大家留一个思考题,如何通过构造IP报文实现 traceroute 的路由跟踪功能呢,想一想,这该如何实现?
-END-
不管你是转行也好,初学也罢,进阶也可,如果你想学编程,进阶程序员~
【值得关注】我的 编程学习交流俱乐部 !【点击进入】
C语言入门资料(网盘链接免费分享):
C语言推荐书籍(PDF免费分享):
原文地址:https://www.cnblogs.com/huya-edu/p/15023329.html
- 关于db link权限分配的苦旅(二)(r7笔记第45天)
- 简单易学的机器学习算法——在线顺序极限学习机OS-ELM
- Java操作数据库Spring(2)
- 解决SSH连接linux中文显示乱码问题
- 设计模式——类图以及类与类之间的关系
- sysdba登录报错insufficient privileges的原因分析(r7笔记第64天)
- JDBC基础入门(1)
- LeetCode——Add Two Numbers
- python 中numpy基本方法总结可以类推tensorflow
- python基础知识——函数
- tensorflow之tf.placeholder 与 tf.Variable区别对比
- 11g备库搭建碰到自己给自己埋的坑(r7笔记第63天)
- JDBC基础入门(2)
- 11g备库无法开启ADG的原因分析 (r7笔记第62天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- go test 测试用例那些事(二) mock
- [数据结构]链式存储: 多项式求和
- [Web] CSS 中 Display(显示) 与 Visibility(可见性)的区别与用法
- [数据结构] 二叉搜索树的CURD(增删改查)操作
- Python 为什么用 # 号作注释符?
- Logging with ElasticSearch, Kibana, ASP.NET Core and Docker
- 【DB笔试面试843】在Oracle中,解释GLOBAL_NAMES设为TRUE的用途。
- SpringBoot 返回 json 数据以及数据封装(万字长文)
- 内核级木马与病毒攻防:Linux可执行文件的ELF格式描述
- 「 思考 」 React Hooks 的设计哲学
- JMeter之Json提取器详解
- nodejs 图片处理工具 gm 的使用!
- Java 进程内存分布
- Web 游戏监听浏览器返回点击事件 !
- 权限维持_Linux操作系统后门