Python写TCP端口扫描工具之IP协议的讲解

简介:

1

年前我讲了链路层arp协议的工作原理,并写了一个主机存活扫描和arp欺骗的脚本工具,在渗透测试中我们首先要做的就是信息收集,可以说信息收集占渗透测试的一大部分,当我们知道有哪些存活的主机的情况下,我们下一步要做的就是查看存活的主机开放了哪些端口,从而根据相应的端口得到相应的服务,从而进行爆破,漏洞利用等等,所以这次我打算讲一讲一些端口扫描工具的原理,内容主要为网络层IP协议和传输层TCP协议,本期内容为包括: 

•IP协议的作用; 

•IP报文的组成; 

•子网掩码; 

•IP选路; 

•tcp协议的作用; 

•tcp报文的组成; 

•关于tcp的SYN,FIN,NULL,XAMS端口扫描的原理,并在最后展示一个自己写的简单的包含这几种扫描的工具。

而本节内容主要讲解前四部分内容及IP协议基础并不涉及python。
好了,现在开始我们的讲解吧!

一,IP协议作用:

简单的说arp协议使数据包能够抵达下一站点(请看我上一期讲解);IP协议则是规定数据包的起点和终点,它是TCP/IP协议中最重要的一层,它存在的目的就是为了使数据快速的抵达目标机,当传输途中出现错误时就返回ICMP包,而数据包的可靠性则有上层协议如TCP提供。

二,IP报文格式:


1.通常为4-->ipv4 
2.以32位为一个单位,8位是一个字节,32位就是四个字节,表示这个ip头部有多少个4字节组成,比如说一个20个字节的ip头部的话,那么这个字段的值就是5,这个字段最大值是15,于是ip头部最大字节就是4*15=60个字节 
3.以前是tos,现在被dscp(划分服务类型)和ecn代替,前五位是dscp默认为0,后两位为ecn,最后一位是比为保持为0 
4.以字节为单位,总长度就是头部加数据,因为是16位,所以ip数据包最大为65535个字节,一般不会有这么大的单个数据包,数据包大了,会被分片,在真实数据中不包括链路层的头部的数据 
5.唯一标识主机发出的数据包,主机每发出一个数据包这个值就会加一,这个一般用在ip分片上面 
6.用在ip分片上面 
7.用在ip分片上面 
8.指定数据包最多可以经过的路由,当一个数据包经过一个路由的时候,这个值就会减一,当这个值为0的时候,这个数据包就会丢弃,并且发送一个icmp包到原主机,ttl初始值一般有原主机设定,一一般为32或者64 
9.指上层协议,tcp为6,udp位17 
10.只会校验ip首部,不会校验后面数据,如果校验出错就会丢弃数据包,这个数据包丢弃后是不会发送一个icmp包到原主机,需要由上层去发现,ip协议不管这些,填充数据时一般设置为0。至于校验和的计算我这里就不详诉了,这里给出一个讲解非常详细的文章链接 
11.源ip地址 
12.目的ip地址 
13.可变长度的字段,记录一些可选信息,比如:记录路劲,宽松或者严格的选路。不是所有字段都支持这个字段 
下面是我随便抓的一个UDP包里的IP报文,大家可以对照上面字段进行研究。

三、子网掩码:

世界上有这么多计算机和IP地址,那么一个数据包又是如何准确的抵达它要到的地址呢?其实它的运输与现实生活中的快递运行方式相似,假设你的小区有A,B,C,D座楼,每座楼的每间房都有编号,例如401,402。那么你在A座的402完整编号就是A-402,当一个快递就可以根据A-402,送到A座的402而不是B座的402。而路由转发的原理就类似,一个IP地址根据子网掩码分为“网络号”和“主机号”,例如:192.168.1.101子网掩码为255.255.255.0,那么它就可以看成192.168.1.0座-192.168.1.101,此时数据就能知道送往那个主机了。

四、IP选路:


本机发送一个数据包到目标机的选路过程: 
•首先经过路由器,路由器查看自己的路由表,看是否有能匹配到数据包目标IP的表项,如果找到就直接转发给它,若没有进行下面步骤; 
•路由器查看是否有与数据包目标IP的网络号匹配的表项,若有就根据此表项把包发给下一个地址,若没有; 
•路由器查看是否有默认转发数据包的表项,如果有就转发给它; 
•如果没有默认默认路由或转发出错,那么就返回一个ICMP报文 
下面图片是我研究路由表功能所做的实验,大家可以跟着做一做,有助于理解路由转发,route -n可以查看本机路由表,里面一些标识大家可以百度,这里我简单展示一下

A,局域网下的通信 
发的数据包ip和mac地址都不变,因为局域网下两台计算机直接通信


B,不同网段下通信,数据包的目标ip不变,但mac地址却在不断变化(请看上一期arp讲解)



C,与因特网通信IP与mac地址都会变,使用NAT技术,这理就不讲解了,主要是为了实现私有IP和公有IP的转换
综上可以看出数据包到达目标机是通过走一步看一步的方式到达的。

最后介绍两个好玩的功能:
•Linux有一个开启路由转发命令:
•开启路由转发:echo1>/proc/sys/net/ipv4/ip_forward
•关闭路由转发:echo0>/proc/sys/net/ipv4/ip_forward
•结合此功能和上一节的arp欺骗便可以实现查看局域网其它计算机网络通信的数据,例如结合kali的driftnet就可以查看局域网其它计算机网络通信时的图片
•tctrace查看经过路由的原理就是每一次对ttl加一,可以自己结合python的scapy模块写一个这样的小工具:


PS:可以结合GNS3配饰网络拓扑图来学习路由转发,这样可以加深理解 
好了今天就讲到这里吧!本期下半节内容将讲解TCP协议以及SYN,FIN,NULL,XAMS几种扫描的原理和优缺点,并展示一个自己写的小脚本。


原文发布时间为:2017-02-27
本文作者:exploit
本文来自云栖社区合作伙伴“ Python中文社区”,了解相关信息可以关注“ Python中文社区”微信公众号
相关文章
|
19天前
|
数据可视化 编译器 Python
Manim:数学可视化的强大工具 | python小知识
Manim(Manim Community Edition)是由3Blue1Brown的Grant Sanderson开发的数学动画引擎,专为数学和科学可视化设计。它结合了Python的灵活性与LaTeX的精确性,支持多领域的内容展示,能生成清晰、精确的数学动画,广泛应用于教育视频制作。安装简单,入门容易,适合教育工作者和编程爱好者使用。
80 7
|
1月前
|
JavaScript 前端开发 开发者
探索 DrissionPage: 强大的Python网页自动化工具
DrissionPage 是一个基于 Python 的网页自动化工具,结合了浏览器自动化的便利性和 requests 库的高效率。它提供三种页面对象:ChromiumPage、WebPage 和 SessionPage,分别适用于不同的使用场景,帮助开发者高效完成网页自动化任务。
141 4
|
1月前
|
开发者 Python
探索Python中的列表推导式:简洁而强大的工具
【10月更文挑战第41天】 在编程的世界中,效率与简洁是永恒的追求。本文将深入探讨Python编程语言中一个独特且强大的特性——列表推导式(List Comprehension)。我们将通过实际代码示例,展示如何利用这一工具简化代码、提升性能,并解决常见编程问题。无论你是初学者还是资深开发者,掌握列表推导式都将使你的Python之旅更加顺畅。
|
1月前
|
安全 Linux 网络安全
nmap 是一款强大的开源网络扫描工具,能检测目标的开放端口、服务类型和操作系统等信息
nmap 是一款强大的开源网络扫描工具,能检测目标的开放端口、服务类型和操作系统等信息。本文分三部分介绍 nmap:基本原理、使用方法及技巧、实际应用及案例分析。通过学习 nmap,您可以更好地了解网络拓扑和安全状况,提升网络安全管理和渗透测试能力。
145 5
|
28天前
|
数据采集 API 定位技术
Python技术进阶:动态代理IP的跨境电商解决方案
Python技术进阶:动态代理IP的跨境电商解决方案
|
2月前
|
数据采集 数据可视化 数据挖掘
R语言与Python:比较两种数据分析工具
R语言和Python是目前最流行的两种数据分析工具。本文将对这两种工具进行比较,包括它们的历史、特点、应用场景、社区支持、学习资源、性能等方面,以帮助读者更好地了解和选择适合自己的数据分析工具。
56 2
|
2月前
|
C语言 开发者 Python
探索Python中的列表推导式:简洁而强大的工具
【10月更文挑战第21天】在Python的世界里,代码的优雅与效率同样重要。列表推导式(List Comprehensions)作为一种强大而简洁的工具,允许开发者通过一行代码完成对列表的复杂操作。本文将深入探讨列表推导式的使用方法、性能考量以及它如何提升代码的可读性和效率。
|
2月前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
59 2
|
2月前
|
监控 安全 网络安全
如何使用PortTunnel端口映射工具?
【10月更文挑战第8天】PortTunnel是一种端口映射工具,它允许用户将本地计算机上的端口映射到远程服务器上。要使用PortTunnel,您需要首先下载并安装该软件,然后按照以下步骤进行操作:,1. 打开PortTunnel并配置您的本地和远程端口设置。,2. 在“本地地址”字段中输入您要映射的本地IP地址。,3. 在“远程地址”字段中输入远程服务器的IP地址。,4. 在“本地端口”字段中输入您要映射的本地端口号。,5. 在“远程端口”字段中输入远程服务器上的端口号。,6. 单击“启动”按钮以开始映射过程
371 2
|
1月前
|
C语言 Python
探索Python中的列表推导式:简洁而强大的工具
【10月更文挑战第24天】在Python编程的世界中,追求代码的简洁性和可读性是永恒的主题。列表推导式(List Comprehensions)作为Python语言的一个特色功能,提供了一种优雅且高效的方法来创建和处理列表。本文将深入探讨列表推导式的使用场景、语法结构以及如何通过它简化日常编程任务。