书接上文

菜鸟渗透日记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-端口扫描相关推荐

  1. 菜鸟渗透日记29---python渗透测试编程之信息收集1-主机发现

    目录 简述信息收集 主机状态扫描 基于ARP的活跃主机发现 ARP协议分析 利用ARP实现活跃主机的扫描python程序 基于ICMP的活跃主机发现 ICMP协议分析 利用ICMP实现活跃主机的扫描p ...

  2. 渗透测试技术----被动信息收集(一)--nslookup、dig、DNS字典爆破、whois

    一.渗透测试流程 1.信息收集(包括被动搜集和主动搜集) 2.漏洞扫描 3.漏洞利用 4.提权 5.植入后门,清理痕迹 6.生成渗透测试报告 很多人在信息收集阶段大概会占用30%到50%的时间,由此可 ...

  3. 渗透测试信息收集:目录扫描

    入行这么久,一次完整的渗透也没完成过,最近想从信息收集开始,完整的渗透一次网站,目前在进行信息收集,写篇文章,记录下自己在进行目录扫描中用过的工具. 渗透测试信息收集:目录扫描 目录 渗透测试信息收集 ...

  4. 第一章:渗透测试的本质信息收集

    0x00  域名介绍 域名(Domain Name),是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位. 例如:学院域名:51cto.c ...

  5. 渗透测试如何学习? (*╹▽╹*) 信息收集 ~ 其一

    文章目录 简介 本博客学习基础 收集信息简介 收集那些信息 信息收集一(域名信息收集) 收集目标相关子域名 被动方式收集信息 方法一:Google语法 方法二:使用第三方网站接口查询 方法三:使用网络 ...

  6. 渗透测试用工具(一)端口扫描Nmap

    参考链接https://www.cnblogs.com/weihua2616/p/6599629.html 一.Nmap Nmap作为渗透工具可以用于以下方面: 主机发现 - 识别网络上的主机.例如, ...

  7. Python 开发 黑客内外网信息收集.(帮助 得到信息攻击计算机内外网.)

    目录: Python 开发 内外网信息收集的步骤: (1)域名反查 IP 功能. (2)识别目标是否存在CDN. (3)端口扫描 (4)子域名查询 (5)内网主机信息探针. Python 开发 内外网 ...

  8. 《安全测试指南》——信息收集测试【学习笔记】

    [信息收集测试] 1.搜索引擎信息收集(OTG-INFO-001) 通过搜索引擎收集以下: · 网络拓扑图和配置 · 管理员和其他员工的归档文章和邮件 · 登录过程和用户名的格式 · 用户名和密码 · ...

  9. 渗透测试前的信息收集(玄魂磐石计划课件搬运)

    1.常规信息收集之域名 备案号查询 备案号是网站是否合法注册经营的标志,可随时到国家工业和信息化部网站备案系统上查询该ICP备案的相关详细信息. 网站:www.beianbeian.com 子域名发现 ...

最新文章

  1. powerquery分组_Power Query实现数据分组压缩的思路分享
  2. 交换机调试工具_工业以太网交换机安装流程图解
  3. 知识点讲解七:Python中的异常处理机制
  4. 【渝粤教育】国家开放大学2018年秋季 0266-22T设计构成 参考试题
  5. Transformer太大了,我要把它微调成RNN
  6. 【Python】Error:'int' object is not callable
  7. 携程集团CMO孙波入选“2021亚太营销领袖50强”榜单
  8. 企业中MySQL高可用集群架构三部曲之MM+keepalived
  9. Linux下运行JAVA程序——JRE安装和配置
  10. 软件漏洞-泛微OA-汇总
  11. opencart修改网站顶部电话联系方式
  12. PLC选型经济性的考虑
  13. 平安银行支付接口 PHP ECSHOP
  14. M语言中的操作符说明:数字以及时间相关的操作符
  15. 计算机网络dce是什么意思,DTE与DCE的解释
  16. ADC和DAC的DNL和INL
  17. 对全文检索引擎xapian的学习(一)---索引
  18. BPDU保护与边缘端口、RLDP防环
  19. PostgreSQL 15 preview -:你了解PostgreSQL GUC 参数吗?
  20. 【GA算法】遗传算法原理及其Matlab代码

热门文章

  1. echarts柱状图集合
  2. 实战案例:横向和纵向的三级下拉菜单需要掌握hover
  3. 光源基础(2)——光的强度、波长、颜色合成与互补关系
  4. 求六个成等差数列且小于500的素数
  5. 用jQuery中的ajax分页
  6. 基于ChatGPT完美替代 Grammarly润色和语法纠错的免费插件!
  7. app实现热更新codepush
  8. 区块链在数字经济中的地位和作用都有哪些?
  9. 专家称楼市细分市场出现机会 “以价换量”成趋势
  10. 我,19岁,在校大学生,学编程每月赚2000多外快。。。