菜鸟渗透日记30---python渗透测试编程之信息收集2-端口扫描
书接上文
菜鸟渗透日记29---python渗透测试编程之信息收集1-主机发现
目录
端口概念简介
基于TCP全开的端口扫描技术
TCP全开端口扫描原理
设计一个基于TCP全开的完整端口扫描程序
基于TCP半开的端口扫描技术
TCP半开端口扫描的原理
设计一个基于TCP半开的完整端口扫描程序
端口概念简介
上文提到端口扫描,这是在传输层才出现的概念,可以认为端口就是设备和外界进行交流的端口。例如,常见的用来完成FTP服务的21端口,常见的用来完成web服务的80端口等等。
端口扫描在网络安全渗透中是一个十分重要的概念。如果把服务器看作一个房子,那么端口就是通向不同房间(服务)的们。从入侵者角度来分析,我们如果要侵入这个房子,就需要知道这个房子有多少门,门后面有什么东西都是十分重要的内容
因此在信息收集阶段就需要对目标的端口开放情况做扫描,因为一方面这些端口可能成为进出的通道,另一方面利用这些端口有可以进一步获得目标主机上运行的服务,从而找到可以进行渗透的漏洞。
正常来说,端口只有open和closed两种状态,但是有时候会出现网络安全的机制屏蔽了端口的探测,因此该端口会出现无法判断的情况,所以在探测时候要为端口添加一个filtered状态,表示无法获悉目标端口的真正状态。
判断一个端口的状态在Nmap中继承了很多端口扫描的方法,这里只说两种常用的方法:TCP全开扫描和TCP半开扫描
基于TCP全开的端口扫描技术
TCP全开端口扫描原理
这种扫描的思想很简单,如果目标端口是开放的,那么在接到主机端口发出的SYN请求之后,就会返回一个SYN+ACK的包,然后主机端口再回应一个ACK,这样就成功地和目标端口建立了一次TCP链接。
过程如图:
如果目标端口是关闭的,那么再接收到主机端口发出的SYN请求之后,就会返回一个RST回应,表示不接受这次请求,这样就中断了这次TCP链接。
过程如图:
还有一种特殊情况,主机发送出SYN请求之后,没有收到任何回应。多种原因可能造成这种情况,例如,目标主机没有活跃、一些网络安全设备屏蔽掉端口的SYN请求。关于屏蔽这种情况暂时不考虑。
过程如图:
在前文中已经学习了Scapy中IP数据包和TCP数据包的格式,这里仅仅需要将TCP的flags参数设置为“S”,表明这是一个SYN请求的数据包,构造这个数据包的语句如下所示:
packet=IP(dst=dst_ip)/TCP(sport=src_port,flag=”S”)
然后使用sr1函数将这个数据包发送出去,并且设置5秒延迟。
resp = sr1(packet,timeout=5)
然后根据应答包来判断目标端口的状态,这时候的情况根据刚才的图,会有三种情况。
第一种:如果resp值为空,就表示没有收到来自目标的回应。在程序中可以使用str(type(resp))来判断这个resp是不是为空,当type(resp)的值转换为字符串之后为“<type ‘NoneType’>”时,表示resp为空,就是没有收到任何数据包,可以直接判断目标端口关闭,跳到后面的第二种或者第三种情况。
第二种:当收到了回应的数据包之后,判断一下这个数据包时“SYN+ACK”类型还是“RST”类型。在scapy模块中,可以使用haslayer()函数来判断是否具有某一个协议,例如,判断一个数据包是否使用了TCP,就可以使用haslayer(TCP)来判断,也可以使用getlayer(TCP),来读取某一个字段的内容,这里需要判断回应数据包是否为“SYN+ACK”类型,代码如下:
resp.getlayer(TCP).flags == 0x12 //0x12就是“SYN+ACK”
如果这个结果为真,表示目标接受我们的TCP请求,需要继续发送一个ACK数据包过去,完成三次握手。
IP(dst=dst_ip)/TCP(spor=src_port,dport=dst_port,flags=”AR”)
第三种:如果resp.getlayer(TCP).flags的结果不是0X12,而是0x14(表示RST)那么表示端口是关闭的。
使用如下的语句判断数据包是不是RST类型。
resp.getlayer(TCP).flags == 0x14 //0x14就是“RST”
按照上面讲的这些思路
设计一个基于TCP全开的完整端口扫描程序
import sys
from scapy.all import *
if len(sys.argv) != 3:
print('Usage:PortScan <IP>\n eg:PortScan 192.168.65.1 80')
sys.exit(1)
dst_ip = sys.argv[1]
src_port = RandShort()
dst_port=int (sys.argv[2])
packet = IP(dst = dst_ip)/TCP(sport=src_port,dport=dst_port,flags="S")
resp = sr1(packet,timeout = 5)
if(str(type(resp))=="<type 'noneType'>"):
print "The port %s is Closed" %(dst_port)
elif (resp.haslayer(TCP)):
if(resp.getlayer(TCP).flags == 0x12):
send_rst = sr(IP(dst = dst_ip)/TCP(sport=src_port,dport=dst_port,flags="AR"),timeout = 10)
print "The port %s is open" %(dst_port)
elif(resp.getlayer(TCP).flags == 0x14):
print "The port %s is Closed" %(dst_port)
代码执行结果如下。
代码中的RandShort函数功能是一个随机生成端口
基于TCP半开的端口扫描技术
TCP半开端口扫描的原理
全开扫描的话,可能会被主机的日志记录下来,而且最主要的是TCP连接三次握手中的最后一次是没用的,在目标返回了一个SYN+ACK类型的包,已经达到了探测的目标,可以考虑去除这一步。
于是一种基于TCP半开的端口扫描产生了,这种扫描的思想很简单。如果目标端口时开放的,那么在街道主机端口发出的SYN请求之后,就会返回一个SYN+ACK的回应,表示愿意接受这次连接的请求,然后主机端口不再回应一个ACK而是发送一个RST表示中断这个连接。这样实际上并没有建立好完成的TCP连接,称之为半开扫描。过程如图所示:
不过这个端口如果是关闭的话,扫描过程如图:
在这次半开扫描实例中,还要考虑一种不确定的状态,我们发出去的包很容易被过滤掉,过滤开能来自对方的而防火墙设备,路由器规则,防火墙等。这些端口几乎不提示任何信息,偶尔也会响应ICMP的错误信息,过程如图:
这样就将收到没有回应数据包的端口归于“filtered”状态,另外,考虑收到ICMP错误消息的情形,这种情况下,也要讲目标端口归于“filtered”状态,当TCP连接的是数据包被屏蔽时,一般返回如下的几种ICMP的错误信息
类型(type) 代码(code) 意义
3 1 主机不可达
3 2 协议不可达
3 3 端口不可达
3 9 目标网络被强制禁止
3 10 目的之际被强制禁止
3 13 由于过滤,通信被强制禁止
如果收到这几种类型的数据包,也将目标端口的状态归于“filtered”所以在写代码时候,考虑如下两种情况:
if(str(type(stealth_scab_resp)) == “<type ‘NoneType’>”)
这种情况表示没有收到任何回应包。
if(int(resp.getlayer(ICMP).type) == 3 and int(resp.getlayer(ICMP).code) in [1,2,3,9,10,13]):
这种情况表示收到的ICMP类型的数据包。
设计一个基于TCP半开的完整端口扫描程序
完整代码如下:
import sys
from scapy.all import *
if len(sys.argv) != 3:
print('Usage:PortScan <IP>\n eg:PortScan 192.168.65.1 80')
sys.exit(1)
dst_ip = sys.argv[1]
src_port = RandShort()
dst_port=int (sys.argv[2])
packet = IP(dst = dst_ip)/TCP(sport=src_port,dport=dst_port,flags="S")
resp = sr1(packet,timeout = 5)
if(str(type(resp))=="<type 'NoneType'>"):
print "The port %s is Filtered" %(dst_port)
elif (resp.haslayer(TCP)):
if(resp.getlayer(TCP).flags == 0x12):
send_rst = sr(IP(dst = dst_ip)/TCP(sport=src_port,dport=dst_port,flags="R"),timeout = 10)
print "The port %s is open" %(dst_port)
elif(resp.getlayer(TCP).flags == 0x14):
print "The port %s is Closed" %(dst_port)
elif(resp.haslayer(ICMP)):
if(int(resp.getlayer(ICMP).type) == 3 and int(resp.getlayer(ICMP).code) in [1,2,3,9,10,13]):
print "The port %s is Filtered" %(dst_port)
另外也可以用nmap库来进行TCP扫描,Nmap中默认的就是半开扫描,所以连参数都不用加,其代码如下:
import sys
import nmap
if len(sys.argv) != 3:
print('Usage:PortScan <IP>\n eg:PortScan 192.168.65.1 80')
sys.exit(1)
target = sys.argv[1]
port = sys.argv[2]
nm = nmap.PortScanner()
nm.scan(target,port)
for host in nm.all_hosts():
print('-------------------')
print('Host: {0} ({1})'.format(host,nm[host].hostnmae()))
print('State : {0}').format(nm[host].state()))
for proto in nm[host].all_protocols()
print('----------')
print('Protocol : {0}'.format(proto))
lport = list(nm[host][proto].keys())
lport.sort()
for port in lport:
print('port : {0}\tstate : {1}'.format(port,nm[host][proto][port]))
这个程序本身简单,但是nmap的扫描结果格式很复杂,在服务扫描中会介绍。
菜鸟渗透日记30---python渗透测试编程之信息收集2-端口扫描相关推荐
- 菜鸟渗透日记29---python渗透测试编程之信息收集1-主机发现
目录 简述信息收集 主机状态扫描 基于ARP的活跃主机发现 ARP协议分析 利用ARP实现活跃主机的扫描python程序 基于ICMP的活跃主机发现 ICMP协议分析 利用ICMP实现活跃主机的扫描p ...
- 渗透测试技术----被动信息收集(一)--nslookup、dig、DNS字典爆破、whois
一.渗透测试流程 1.信息收集(包括被动搜集和主动搜集) 2.漏洞扫描 3.漏洞利用 4.提权 5.植入后门,清理痕迹 6.生成渗透测试报告 很多人在信息收集阶段大概会占用30%到50%的时间,由此可 ...
- 渗透测试信息收集:目录扫描
入行这么久,一次完整的渗透也没完成过,最近想从信息收集开始,完整的渗透一次网站,目前在进行信息收集,写篇文章,记录下自己在进行目录扫描中用过的工具. 渗透测试信息收集:目录扫描 目录 渗透测试信息收集 ...
- 第一章:渗透测试的本质信息收集
0x00 域名介绍 域名(Domain Name),是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位. 例如:学院域名:51cto.c ...
- 渗透测试如何学习? (*╹▽╹*) 信息收集 ~ 其一
文章目录 简介 本博客学习基础 收集信息简介 收集那些信息 信息收集一(域名信息收集) 收集目标相关子域名 被动方式收集信息 方法一:Google语法 方法二:使用第三方网站接口查询 方法三:使用网络 ...
- 渗透测试用工具(一)端口扫描Nmap
参考链接https://www.cnblogs.com/weihua2616/p/6599629.html 一.Nmap Nmap作为渗透工具可以用于以下方面: 主机发现 - 识别网络上的主机.例如, ...
- Python 开发 黑客内外网信息收集.(帮助 得到信息攻击计算机内外网.)
目录: Python 开发 内外网信息收集的步骤: (1)域名反查 IP 功能. (2)识别目标是否存在CDN. (3)端口扫描 (4)子域名查询 (5)内网主机信息探针. Python 开发 内外网 ...
- 《安全测试指南》——信息收集测试【学习笔记】
[信息收集测试] 1.搜索引擎信息收集(OTG-INFO-001) 通过搜索引擎收集以下: · 网络拓扑图和配置 · 管理员和其他员工的归档文章和邮件 · 登录过程和用户名的格式 · 用户名和密码 · ...
- 渗透测试前的信息收集(玄魂磐石计划课件搬运)
1.常规信息收集之域名 备案号查询 备案号是网站是否合法注册经营的标志,可随时到国家工业和信息化部网站备案系统上查询该ICP备案的相关详细信息. 网站:www.beianbeian.com 子域名发现 ...
最新文章
- powerquery分组_Power Query实现数据分组压缩的思路分享
- 交换机调试工具_工业以太网交换机安装流程图解
- 知识点讲解七:Python中的异常处理机制
- 【渝粤教育】国家开放大学2018年秋季 0266-22T设计构成 参考试题
- Transformer太大了,我要把它微调成RNN
- 【Python】Error:'int' object is not callable
- 携程集团CMO孙波入选“2021亚太营销领袖50强”榜单
- 企业中MySQL高可用集群架构三部曲之MM+keepalived
- Linux下运行JAVA程序——JRE安装和配置
- 软件漏洞-泛微OA-汇总
- opencart修改网站顶部电话联系方式
- PLC选型经济性的考虑
- 平安银行支付接口 PHP ECSHOP
- M语言中的操作符说明:数字以及时间相关的操作符
- 计算机网络dce是什么意思,DTE与DCE的解释
- ADC和DAC的DNL和INL
- 对全文检索引擎xapian的学习(一)---索引
- BPDU保护与边缘端口、RLDP防环
- PostgreSQL 15 preview -:你了解PostgreSQL GUC 参数吗?
- 【GA算法】遗传算法原理及其Matlab代码