主动信息搜集:Scapy完成基于TCP、UDP的主机发现

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 主动信息搜集:Scapy完成基于TCP、UDP的主机发现

主动信息搜集:Scapy完成基于TCP、UDP的主机发现
在内网中,好的信息搜集能力能够帮助开发者更快地拿到权限及达成目标。内网里数据多种多样,需要根据需求寻找任何能对下一步渗透行动有所帮助的信息。现介绍搜集信息的一种方法,基于TCP、UDP的主机发现。这是一个位于传输层的主机发现,可以用来探测远程主机存活、端口开放、服务类型以及系统类型等信息,相比于三层主机发现更为可靠,用途更广。

运 行 环 境:

OS:macOS Monterey Version 12.3.1(英文版)

IDE:PyCharm 2020.1

相关代码如下:

一、TCP(Transfer Control Protocol, 传输控制协议)
TCP连接是一种面向连接的、可靠的传输通信协议,位于IP层之上,应用层之下的中间层。每一次建立连接都基于三次握手通信,终止一个连接也需要经过四次握手,建立完连接之后,才可以传输数据。当主动方发出SYN连接请求后,等待对方回答TCP的三次握手SYN+ACK,并最终对对方的SYN执行ACK确认。这种建立连接的方法可以防止产生错误的连接,所以TCP是一种可靠的传输协议。因此我们可以利用TCP三次握手原理进行主机存活的探测。当向目标主机直接发送ACK数据包是,如果目标主机存活,就会返回一个RST数据包以终止这个不正常的TCP连接。也可以发送正常的SYN数据包,如果目标主机返回SYN/ACK或者RST数据包,也可以证明目标主机为存活状态。其工作原理主要依据目标主机响应数据包中的flags段,如果flags字段有值,则表示主机存活,该字段通常包括SYN、FIN、ACK、PSH、RST、URG六种类型。SYN表示建立连接,ACK表示应答,PSH表示包含DATA数据传输,RST表示连接重置,URG表示紧急指针。现借助Scapy库来完成,在安装好Scary的终端输入Scary运行程序。本例中远程主机IP地址为192.168.68.150,flag标志为A表示给目标主机直接发送ACK应答数据包,通过sr1()函数将构造好的数据包发出。

1. 启 动 命 令

(venv) (base) liuxiaowei@MacBookAir 渗透测试框架 % sudo scapy

启动界面如下图:

image.png

2. 相 关 代 码

>>> ip=IP()
>>> tcp=TCP()
>>> r=(ip/tcp)
>>> r[IP].dst='192.168.68.150' # 目标IP 192.168.68.150
>>> r[TCP].flags='A'    # 直接给目标主机发送ACK应答数据包
>>> a=sr1(r)    # 通过sr1()函数将构造好的数据包发出
Begin emission:
Finished sending 1 packets.
...*
Received 4 packets, got 1 answers, remaining 0 packets
>>> a.display()  # 通过a.display()函数查看目标主机的返回数据包信息

运行结果如下:

###[ IP ]### 
  version   = 4
  ihl       = 5
  tos       = 0x0
  len       = 40
  id        = 50034
  flags     = DF
  frag      = 0
  ttl       = 64
  proto     = tcp
  chksum    = 0x6d19
  src       = 192.168.68.150
  dst       = 192.168.68.242
  \options   \
###[ TCP ]### 
     sport     = http
     dport     = ftp_data
     seq       = 0
     ack       = 0
     dataofs   = 5
     reserved  = 0
     flags     = R             # 表示远程主机给源主机发送了一个REST,由此可以验证远程目标主机为存活状态
     window    = 0
     chksum    = 0xa4a3
     urgptr    = 0
     options   = ''
###[ Padding ]### 
        load      = '\x00\x00\x00\x00\x00\x00'

通过a.display()函数查看目标主机的返回数据包信息, 此时发现flags标志位为R,表示远程主机给源主机发送了一个RST。由此可以验证远程目标主机为存活状态。

## 二、UDP(User Datagram Protocol, 用户数据报协议)

UDP协议是一种利用IP提供面向无连接的网络通信服务。UDP会把应用程序发来的数据,在收到的一刻立即原样发送到网络上。即使在网络传输过程中出现丢包、顺序错乱等情况时,UDP也不会负责重新发送以及纠错。当向目标发送一个UDP数据包以后,目标是不会发回任何UDP数据包的。不过如果目标主机处于活跃状态,但是目标端口是关闭状态时,会返回一个ICMP数据包,这个数据包的含义为unreachable。如果目标主机不处于活跃状态,这时是收不到任何响应数据的。利用UDP原理可以实现探测存活主机。现借助Scapy库来完成,在安装好Scary的终端输入Scary运行程序。本例中远程主机IP地址为192.168.68.150,端口dport可以为任意值,此例设为7345, 通过sr1()函数将构造好的数据包发出。

1. 相 关 代 码

>>> ip=IP()
>>> udp=UDP()
>>> r = (ip/udp)
>>> r[IP].dst='192.168.68.150'  # 目标IP 192.168.68.150
>>> r[UDP].dport=7345  # 目标主机的dport值7345
>>> a=sr1(r)      # 通过sr1()函数将构造好的数据包发出
Begin emission:
Finished sending 1 packets.
......*
Received 7 packets, got 1 answers, remaining 0 packets
>>> a.display()   # 通过a.display()函数查看目标主机的返回数据包信息

运行结果如下:

###[ IP ]### 
  version   = 4
  ihl       = 5
  tos       = 0x0
  len       = 56
  id        = 8025
  flags     = 
  frag      = 0
  ttl       = 128
  proto     = icmp
  chksum    = 0x1093
  src       = 192.168.68.150
  dst       = 192.168.68.242
  \options   \
###[ ICMP ]### 
     type      = dest-unreach    # 目标不可达
     code      = port-unreachable  # 目标端口不可达
     chksum    = 0x7f0
     reserved  = 0
     length    = 0
     nexthopmtu= 0
     unused    = ''
###[ IP in ICMP ]### 
        version   = 4
        ihl       = 5
        tos       = 0x0
        len       = 28
        id        = 1
        flags     = 
        frag      = 0
        ttl       = 64
        proto     = udp
        chksum    = 0x6ff7
        src       = 192.168.68.242
        dst       = 192.168.68.150
        \options   \
###[ UDP in ICMP ]### 
           sport     = domain
           dport     = 7345
           len       = 8
           chksum    = 0xd81e

通过a.display()函数查看目标主机的返回数据包信息, 此时发现返回的信息中存在ICMP的应答信息,“type = dest-unreach”表示目标主机不可达,“code=port-unreachable”表示目标主机端口不可达。由此可以验证远程目标主机为存活状态。若目标主机不为存活状态,则不会收到目标主机的响应数据包。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
存储 网络协议 算法
UDP 协议和 TCP 协议
本文介绍了UDP和TCP协议的基本结构与特性。UDP协议具有简单的报文结构,包括报头和载荷,报头由源端口、目的端口、报文长度和校验和组成。UDP使用CRC校验和来检测传输错误。相比之下,TCP协议提供更可靠的传输服务,其结构复杂,包含序列号、确认序号和标志位等字段。TCP通过确认应答和超时重传来保证数据传输的可靠性,并采用三次握手建立连接,四次挥手断开连接,确保通信的稳定性和完整性。
88 1
UDP 协议和 TCP 协议
|
3月前
|
消息中间件 网络协议 算法
UDP 和 TCP 哪个更好?
【8月更文挑战第23天】
192 0
|
20天前
|
网络协议 算法 网络性能优化
|
8天前
|
网络协议 SEO
TCP连接管理与UDP协议IP协议与ethernet协议
TCP、UDP、IP和Ethernet协议是网络通信的基石,各自负责不同的功能和层次。TCP通过三次握手和四次挥手实现可靠的连接管理,适用于需要数据完整性的场景;UDP提供不可靠的传输服务,适用于低延迟要求的实时通信;IP协议负责数据包的寻址和路由,是网络层的重要协议;Ethernet协议定义了局域网的数据帧传输方式,广泛应用于局域网设备之间的通信。理解这些协议的工作原理和应用场景,有助于设计和维护高效可靠的网络系统。
19 4
|
14天前
|
缓存 负载均衡 网络协议
面试:TCP、UDP如何解决丢包问题
TCP、UDP如何解决丢包问题。TCP:基于数据块传输/数据分片、对失序数据包重新排序以及去重、流量控制(滑动窗口)、拥塞控制、自主重传ARQ;UDP:程序执行后马上开始监听、控制报文大小、每个分割块的长度小于MTU
|
30天前
|
网络协议 前端开发 物联网
TCP和UDP区别?
本文首发于微信公众号“前端徐徐”,详细介绍了TCP和UDP两种传输层协议的核心概念、连接性和握手过程、数据传输和可靠性、延迟和效率、应用场景及头部开销。TCP面向连接、可靠、有序,适用于网页浏览、文件传输等;UDP无连接、低延迟、高效,适用于实时音视频传输、在线游戏等。
42 1
TCP和UDP区别?
|
22天前
|
Web App开发 缓存 网络协议
不为人知的网络编程(十八):UDP比TCP高效?还真不一定!
熟悉网络编程的(尤其搞实时音视频聊天技术的)同学们都有个约定俗成的主观论调,一提起UDP和TCP,马上想到的是UDP没有TCP可靠,但UDP肯定比TCP高效。说到UDP比TCP高效,理由是什么呢?事实真是这样吗?跟着本文咱们一探究竟!
49 10
|
1月前
|
网络协议 网络性能优化 C#
C# 一分钟浅谈:UDP 与 TCP 协议区别
【10月更文挑战第8天】在网络编程中,传输层协议的选择对应用程序的性能和可靠性至关重要。本文介绍了 TCP 和 UDP 两种常用协议的基础概念、区别及应用场景,并通过 C# 代码示例详细说明了如何处理常见的问题和易错点。TCP 适用于需要可靠传输和顺序保证的场景,而 UDP 适用于对延迟敏感且可以容忍一定数据丢失的实时应用。
28 1
|
1月前
|
网络协议 Linux 网络性能优化
Linux C/C++之TCP / UDP通信
这篇文章详细介绍了Linux下C/C++语言实现TCP和UDP通信的方法,包括网络基础、通信模型、编程示例以及TCP和UDP的优缺点比较。
36 0
Linux C/C++之TCP / UDP通信
|
1月前
|
存储 网络协议 Java
【网络】UDP和TCP之间的差别和回显服务器
【网络】UDP和TCP之间的差别和回显服务器
65 1