python网络安全 网络编程基础

什么是 socket?

socket = 套接字,是应用程序和网络之间的桥梁。

网络通信就像打电话:

服务器(Server) → 等待接电话。

客户端(Client) → 拨打电话。

支持 TCP(可靠传输,常见于 HTTP、SMTP)和 UDP(速度快,常见于 DNS、视频流)

网络安全相关应用

学会 socket 后,你可以做很多安全工具:

  • 端口扫描器(扫描主机哪些端口开放)

  • 反向 shell(远程控制主机)

  • 简单木马通信(客户端 = 攻击机,服务端 = 被控机)

TCP 和 UDP 的区别

特性 TCP UDP
连接方式 面向连接(三次握手) 无连接
可靠性 保证数据可靠传输(丢包会重传) 不保证可靠传输(可能丢包)
速度 较慢(握手、确认开销大) 较快(直接发,不确认)
应用场景 网页 (HTTP/HTTPS)、邮件 (SMTP/IMAP)、远程登录 (SSH) 视频直播、DNS 查询、语音通话、游戏传输

形象比喻:

  • TCP → 打电话(先确认、对话有序)。
  • UDP → 寄明信片(直接发,不保证收到)。

端口扫描器选择 TCP 还是 UDP?

一般情况下:

  • 优先选择 TCP

    • 因为 TCP 服务更常见(Web、SSH、SMTP、FTP)。
    • 建立连接能确认端口确实开放。

UDP 端口扫描也有价值,但:

  • UDP 无连接,可能丢包,容易被防火墙丢弃。
  • 很多 UDP 服务不会主动回应(除非请求符合协议)。

所以:

  • 普通端口扫描 → TCP
  • 专门探测 DNS、SNMP、DHCP 等服务 → UDP

为什么攻击者喜欢用反向 shell?

正向连接(攻击机 → 被控机)

  • 攻击者主动连接目标。
  • 缺点:目标服务器可能有防火墙,阻止外部连接。

反向 shell(被控机 → 攻击机)

  • 被控机主动连接攻击者。
  • 优点:

    1. 绕过防火墙(防火墙一般只拦截外部进入,但允许内部访问外网)。
    2. 攻击者不需要目标暴露端口。
    3. 更隐蔽,容易长期维持访问。

举个例子:

  • 正向 shell → 你打电话给别人(可能被拦截)。
  • 反向 shell → 别人主动打电话给你(大多数公司允许内部访问外网)。

  • TCP:可靠,适合扫描常见服务。
  • UDP:快但不稳定,适合特殊协议。
  • 反向 shell:更隐蔽,更容易突破防火墙。

TCP 三次握手(Three-way Handshake)

TCP 是「面向连接」的协议,在客户端和服务器开始通信之前,必须先建立连接。 这个建立连接的过程,就是 三次握手

步骤详解

第一次握手:SYN

  • 客户端 → 服务器:

    • 发送一个带 SYN 标志位 的报文(表示“我要建立连接”)。
    • 同时发送一个随机的初始序列号(Seq)。

类比:你打电话给别人:“喂,我想和你通话,可以吗?”

第二次握手:SYN + ACK

  • 服务器 → 客户端:

    • 回复一个带 SYN 和 ACK 标志位 的报文。
    • SYN 表示同意建立连接。
    • ACK 确认收到了客户端的请求。

类比:对方接电话,说:“好的,我收到你的请求,我也准备好了。”


第三次握手:ACK

  • 客户端 → 服务器:

    • 回复一个 ACK 报文,确认收到服务器的回应。
  • 连接正式建立,双方进入 ESTABLISHED 状态,可以开始传输数据。

类比:你再回答一句:“收到,那我们开始聊天吧。”

图解

客户端                               服务器
   | ------- SYN ------> |   (我要建立连接)
   | <---- SYN + ACK --- |   (好的,我收到了)
   | ------- ACK ------> |   (确认,可以开始传输数据)

为什么要三次?

  • 保证双方都确认

    • 客户端知道服务器在线。
    • 服务器知道客户端在线。
  • 防止历史报文干扰

    • 如果只有两次握手,可能会把“旧请求”误当成新连接。

安全相关

  • SYN Flood 攻击

    • 黑客不断发送 SYN 请求,但不完成后续握手。
    • 服务器会浪费资源等待 ACK,最终导致拒绝服务(DoS 攻击)。

总结:

  • 三次握手保证了 TCP 连接的可靠性。
  • 在安全测试中,理解三次握手很重要,因为很多攻击(如 SYN Flood、端口扫描)都与此机制相关。