渗透&&探测 (之UDP探测篇)

UDP协议

  撸完了TCP,自然要来撸一下UDP

  UDP 协议,即 用户数据报协议User Datagram Protocol),是一个简单的 面向数据报传输层 协议。

  我们可以将UDP协议看作IP协议 暴露传输层 的一个 接口

  UDP 协议同样以 数据包(datagram)的方式传输,它的传输方式也是Best Effort的,所以UDP协议也是不可靠的(unreliable)。

  那么,我们为什么不直接使用IP协议而要额外增加一个UDP协议呢?

  一个重要的原因是IP协议中并没有 端口(port)的概念。IP协议进行的是IP地址到IP地址的传输,这意味者两台计算机之间的对话。但每台计算机中需要有 多个通信通道,并将 多个通信通道 分配给 不同的进程 使用。一个端口 就代表了这样的一个 通信通道UDP协议实现了 端口,从而让 数据包 可以在送到IP地址的基础上,进一步可以送到 某个端口

UDP依然不是那么“可靠”

  尽管UDP协议非常 简单,但它的产生 晚于 更加 复杂TCP协议。

  早期的网络开发者开发出IP协议和TCP协议分别位于 网络层传输层,所有的通信都要先经过TCP封装,再经过IP封装(应用层->TCP->IP)。

  开发者将TCP/IP视为相互合作的 套装。但很快,网络开发者发现,IP协议的功能和TCP协议的功能是相互 独立 的。

  对于一些简单的通信,我们只需要Best Effort式的IP传输就可以了,而不需要TCP协议复杂的建立连接的方式(特别是在 早期 网络环境中,如果 过多 的建立TCP连接,会造成很大的网络 负担,而UDP协议可以相对快速的处理这些简单通信)。

  UDP 协议随之被开发出来,作为IP协议在 传输层傀儡。这样,网络通信可以通过 应用层->UDP->IP 的封装方式,绕过TCP协议。

UDP报文

udp
   UDP 的数据包同样分为 头部( header)和 数据 ( payload)两部分。

  UDP 是传输层(transport layer)协议,这意味着UDP的数据包需要经过IP协议的封装(encapsulation),然后通过IP协议传输到 目的电脑。随后UDP包在目的电脑拆封,并将信息送到 相应端口 的缓存中。

  • UDP协议的头部
    1. source port
      UDP 包的出发端口

    2. destination port
      目的地端口

    3. Length
      整个 UDP 包的长度。

    4. checksum
      它的算法与IP协议的header checksum算法相类似。
      然而,UDPchecksum所校验的序列包括了 整个UDP数据包,以及封装的IP头部的一些信息(主要为出发地IP和目的地IP)。
      这样,checksum就可以 校验IP:端口 的正确性了。
      IPv4中,checksum可以为 0,意味着 不使用 checksum。IPv6要求必须进行checksum校验。

socket

  端口(port)是伴随着 传输层 诞生的概念。它可以将 网络层IP通信分送到 各个通信通道

  UDP 协议和TCP协议尽管在工作方式上有很大的不同,但它们都建立了 从一个端口到另一个端口的通信

socket

  一个特定的IP和特定的 端口 就构成了一个socket

UDP主要特点

  1. 无连接的
    发送数据之前 不需要建立连接,减少了开销和发送数据之前的时延。

  2. 尽最大努力交付
    不保证可靠的交付,主机 不需要 维持复杂的链接状态表。

  3. 面向报文的
    发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。
    不拆分,也 不合并,而是 保留 这些报文的 边界
    因此,应用程序需要选择 合适 的报文 大小

  4. 没有拥塞控制。

  5. 支持一对一、多对一和多对多的交互通信。

  6. 首部开销小,只有8个字节。

UDP端口探测

  UDP 端口扫描比较麻烦,它同TCP不一样,因为它不需要建立连接。
  我们向 目标主机 的固定端口发送UDP数据包,可以得到 两种结果

  1. 端口开了
    UDP 不会给我们任何回复,没办法,谁叫人家是 无连接的
  2. 端口没开 目标主机端口会给我们回复ICMPport-unreachable 响应

  那么,我们就可以coding,大部分同TCP探测:

  1. 构造一系列目标端口的UDP

  2. 通过第二层的sr发送并且接收返回的包

  3. 遍历接收的包,判断是否目标端口有ICMP回复包,此端口就为没有开放端口

  4. 通过遍历的所有端口集合和不开放端口集合做差集,就能得到所有开放端口的集合

  整个代码就是:

  扫描发现对方主机 88 号端口开放:

  愿意与大家分享交流各种技术,个人公众账号[mindev],以及 知识星球[ 极客世界 ]

geeker
        欢迎订阅公众账号,日更哟~~~

猜你喜欢

转载自juejin.im/post/5baf47785188255c6978132f