CTFHub学习日记

MISC

一、流量分析

1、数据库类流量

1)MySQL流量

题目:

一份名位mysql.pcap的文件

个人思路:

使用Wireshark打开,发现多种类型的流量如SSH,TCP,ARP,MySQL,联系题目,对MySQL流量进行追踪,发现不能很快出结果。

然后对字符串进行搜索,尝试搜索”flag”,”ctf”等字符串,发现找到flag。

研究学习:

参考网上的一张关于MySQL的图

也就是说Mysql建立连接的过程包括登录查询阶段。对MySQL协议流量进行过滤之后,得到

现在分析可以知道,前半部分是登录阶段,进行了三次登录尝试,前两次失败,最后一次成功;接着进行对关于user的version、database、table进行了查询,最后查询到之后对数据进行了删除。

最后对flag所在位置的思考,从网上了解到,这个flag的设立位置通常是登录IP,在这里也就是攻击者的IP地址。

2)Redis流量

题目:

一个名为redis.pcap的流量包

个人思路:

通解方法,Wireshark打开之后,直接搜索”ctfhub“、”flag“等关键词,发现搜到像是flag的东西,但是不完整,看到flag2之后想到应该是拼接flag。

直接就得到了完整flag

研究学习:

使用NoSQL(非关系型数据库)进行存储,

SQL(关系型数据库):
基于表格(Table)和关系(Relationship)模型,数据存储在行(Row)和列(Column)中。
强调数据的结构化和一致性,通过关系表之间的外键(Foreign Key)来实现数据关联。
示例:MySQL、PostgreSQL、Oracle。

NoSQL(非关系型数据库):
数据模型多样,常见的有键值存储(Key-Value)、文档存储(Document)、列存储(Column)、图存储(Graph)等。
不依赖固定的表格结构,数据存储形式更加灵活。
示例:MongoDB(文档存储)、Redis(键值存储)、Cassandra(列存储)、Neo4j(图存储)。

3)MongoDB流量

题目:

一个名为mongodb.pcap的文件

个人思路:

仍然是用Wireshark打开之后,过滤MongoDB流量,直接搜索“ctfhub”,一个一个审计便能找到flag

研究学习:

使用NoSQL进行文档存储,MongoDB使用类似于JSON的查询语法。

4)Data(ICMP)

题目:

ping 也可以携带数据 ?一个名为icmp_data.pcap的流量包

个人思路:

使用Wireshark打开,过滤ICMP流量,查看字符串,发现结尾有很多WWW……,搜索常见字符串无果,在翻动时发现每条流量的字符串中都有AWWWW……的结构(只有代表的字符改变),从头开始看,发现每条“reply”的字符构成“ctfhub{……}”,一个一个记录下来,得到flag。

研究学习:

  • ICMP(Internet Control Message Protocol,互联网控制消息协议)是一种网络层协议,主要用于在IP网络中传递控制和错误信息。它常用于网络设备之间的通信,帮助进行网络故障排除、错误报告和网络管理。
  • PING 地址时ICMP协议流程

一、发起方发送 ICMP Echo Request

当用户执行 ping 命令时(例如 ping <IP地址>),发起方(通常是本地主机)会执行以下操作:

  1. 构造 ICMP 数据包

    • 类型(Type):设置为 8,表示 ICMP Echo Request。

    • 代码(Code):设置为 0

    • 校验和(Checksum):计算 ICMP 数据包的校验和,用于数据完整性验证。

    • 标识符(Identifier):通常是一个随机值,用于区分不同的 ping 请求。

    • 序列号(Sequence Number):从 0 开始,每次发送递增,用于跟踪请求和响应的对应关系。

    • 数据部分:通常包含一些填充数据,如时间戳或随机字节,用于测量往返时间(RTT)。

  2. 封装到 IP 数据包

    • ICMP 数据包被封装到 IP 数据包中,目标地址是用户指定的 IP 地址。

    • IP 头部包含源 IP 地址(发起方的 IP)和目标 IP 地址(被 ping 的 IP)。

  3. 发送数据包

    • 发起方通过网络接口将封装好的 IP 数据包发送到目标主机。

二、目标主机接收 ICMP Echo Request

目标主机收到 ICMP Echo Request 数据包后,会执行以下操作:

  1. 解析 ICMP 数据包

    • 检查 ICMP 类型是否为 8(Echo Request)。

    • 验证校验和是否正确,以确保数据完整性。

  2. 构造 ICMP Echo Reply

    • 类型(Type):设置为 0,表示 ICMP Echo Reply。

    • 代码(Code):设置为 0

    • 校验和(Checksum):重新计算校验和。

    • 标识符(Identifier):保持与收到的 Echo Request 相同。

    • 序列号(Sequence Number):保持与收到的 Echo Request 相同。

    • 数据部分:保持与收到的 Echo Request 的数据部分一致。

  3. 封装到 IP 数据包

    • 将 ICMP Echo Reply 数据包封装到 IP 数据包中,目标地址是发起方的 IP 地址。
  4. 发送数据包

    • 目标主机将封装好的 IP 数据包发送回发起方

三、发起方接收 ICMP Echo Reply

发起方收到 ICMP Echo Reply 数据包后,会执行以下操作:

  1. 解析 ICMP 数据包

    • 检查 ICMP 类型是否为 0(Echo Reply)。

    • 验证校验和是否正确。

    • 检查标识符和序列号是否与之前发送的 Echo Request 匹配。

  2. 计算往返时间(RTT)

    • 通过比较发送时间和接收时间,计算出数据包的往返时间(RTT),并显示在 ping 命令的输出中。
  3. 输出结果

    • 如果成功收到 Echo Reply,ping 命令会输出类似以下内容:

      Reply from <目标IP>: bytes=32 time=10ms TTL=64

    • 如果在超时时间内未收到响应,会输出:

      Request timed out.

四、异常情况

在某些情况下,ping 命令可能会收到其他类型的 ICMP 消息,例如:

  1. 目标不可达(Destination Unreachable)

    • 如果目标主机不可达,中间路由器可能会发送 ICMP 类型 3(Destination Unreachable)消息,代码可能为:

      • 0:网络不可达。

      • 1:主机不可达。

      • 6:目的网络未知。

      • 7:目的主机未知。

  2. 超时(Time Exceeded)

    • 如果数据包的 TTL(生存时间)耗尽,中间路由器会发送 ICMP 类型 11(Time Exceeded)消息,代码为 0(TTL 超时)。
  • ICMP 数据包结构

ICMP 数据包的结构如下:

1
2
3
4
5
6
7
8
9
10
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 类型 | 代码 | 校验和 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 标识符 | 序列号 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据部分 ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

5) Length (ICMP)

题目:

一个icmp_len.pcap文件

个人思路:

使用Wireshark打开,过滤ICMP流量,搜索常见字符串无果,再逐个审计,发现并没有直接的字符存在。联系题目lenth,发现每个Data的字符串长度都不一样,记录每个字符

1
99 116 102 104 117 98 123 97 99 98 54 53 57 102 48 50 51 125

转换为ASCII字符,得到flag

1
ctfhub{acb659f023}

研究学习:

分析Data部分的长度可变,因而能够隐藏信息

6)LengthBinary (ICMP)

题目:

ping 包的大小有些奇怪

个人思路:

用Wireshark打开,发现Data部分的长度不一,但只有两种长度,结合题目猜测,较长的Data部分代表1,较短的代表0,记录下来:

1
011000110111010001100110011010000111010101100010011110110011000000110100011001010110011001100101011001000011000101100101001100000011010101111101

转成字符串,便得到flag:

1
ctfhub{04efed1e05}

研究学习:

仍然是利用Data部分长度可变隐藏信息


CTFHub学习日记
http://ramoor.github.io/2025/02/17/CTFHub学习日记/
作者
Ramoor
发布于
2025年2月17日
许可协议