云计算百科
云计算领域专业知识百科平台

【2024-数证杯】决赛_个人赛(服务器)

2024_数证杯电子取证大赛

背景介绍

“数证杯”采取线上初赛与线下决赛结合的形式进行。线上初赛采用团队赛的方式在互联网内开展,每队最多3人,最少1人。通过线上初赛的选手可晋级线下决赛,线下决赛采用“团队赛+个人赛”的形式开展 为深入贯彻国家关于强化网络安全和信息化发展的战略方针,提升我国在电子数据取证与分析领域的专业技术水平,推动产业界、学术界和研究机构的深度合作,进一步培养和构建电子数据取证技术的专业人才队伍,首届“数证杯”电子数据取证分析大赛。

个人赛检材容器下载链接:https://pan.baidu.com/s/10nDlZ7tR1-TPYLYJxqm-oA?pwd=gzki

赛题:

1. 重建完整的系统后,redis对外暴露的端口号是多少?(答案格式:数字) (3.0分) 答:16379

把服务器仿真起来之后先看端口开放的有哪些,ssh端口号被修改了(我接下来就使用xshell连接了)

netstat -natp

在这里插入图片描述 查看后有docker服务这个16379有点可疑 使用命令查看docker正在运行的镜像:

docker ps

在这里插入图片描述 果然是16379端口!

2. 请找出加密mysql数据库连接密码所用的加密密钥(盐值)?(答案格式:注意大小写) (3.0分)答:F*DZ-kZMs5qt

分析题目这个需要找到源码的配置,从上题得出有docker其中运行着一个jdk环境进入容器中先查看一下历史命令他做了什么操作 使用下面命令:

docker exec -it 79d2dfa52a5e /bin/bash
history

在这里插入图片描述 从历史命令中可以知晓目录为/home/date/s048/,查看目录内容找到jar源码包和网站配置文件application-s048.yml(外置)文件查看文件密码被连接加密了

cd /home/date/s048/
ls
cat application-s048.yml

在这里插入图片描述 在这里插入图片描述 这里就需要解密,先把jar包拖出来到jadx中分析一下先直接搜索setPassword 在这里插入图片描述 找到加密盐值(根据他外置的网站配置yml文件中可以看到很多功能在zwz下实现的) 在这里插入图片描述

3. 请分析得出相亲网站的后台数据库中哪张表存放了会员相关信息,写出表名?(6.0分) 答:a_member_st

这题分析题意会进行一个写入的操作,因此我从网站源码中搜索会员 在这里插入图片描述 表名为:a_member_st

在这里插入图片描述

4. 已知用户在系统中的所有操作都会被记录,请找出用户在“查询角色”时,其请求的后端路径地址为?(格式:/api/query/…) (3.0分)答:/zwz/role/getAllByPage

想要解出这题需要连接mysql数据库但是密码是被加密的故而先要解密下面是关于解密相关知识点: SpringBoot+ENC加密&密钥存储位置 pom中需要配置jasypt依赖

<dependencies>
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
</dependencies>

(1)配置文件中记录密钥

jasypt:
encryptor:
password: hhX4FzbwcT

(2)写在jar包里

importorg.jasypt.encryption.pbe.StandardPBEStringEncryptor;

publicclassJasyptTest {

/**
* 加密盐值,使用完成后进行删除,或者不能提交到`生产环境`,比如:
*/

privatefinalstaticStringPASSWORD="hhX4FzbwcT";

publicstaticvoidmain(String[]args) {

PooledPBEStringEncryptorencryptor=newPooledPBEStringEncryptor();

SimpleStringPBEConfigconfig=newSimpleStringPBEConfig();
// 用于设置加密密钥。密钥是用于加密和解密字符串的关键信息。
config.setPassword(PASSWORD);
// 加密算法的名称,jasypt-3.0.5版本后默认的加密方式
config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
// 用于设置加密时迭代次数的数量,增加迭代次数可以使攻击者更难进行密码破解。
config.setKeyObtentionIterations("1000");
// 加密器池的大小。池是一组加密器实例,可确保加密操作的并发性。
config.setPoolSize("1");
// 用于设置JCE(Java Cryptography Extension)提供程序的名称。
config.setProviderName("SunJCE");
// 用于设置生成盐的类名称。在此配置中,我们使用了org.jasypt.salt.RandomSaltGenerator,表示使用随机生成的盐。
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
// 用于设置Jasypt使用的初始化向量(IV)生成器的类名。初始化向量是在加密过程中使用的一个固定长度的随机数,用于加密数据块,使每个数据块的加密结果都是唯一的。在此配置中,我们使用了org.jasypt.iv.RandomIvGenerator类,该类是一个随机生成器,用于生成实时随机IV的实例。这样可以确保每次加密的IV都是唯一的,从而增加加密强度。
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
// 指定加密输出类型。在此配置中,我们选择了base64输出类型。
config.setStringOutputType("base64");
encryptor.setConfig(config);

// 明文1
Stringname_encrypt="root";
// 明文2
Stringpassword_encrypt="123456";

// 明文加密
Stringencrypt1=encryptor.encrypt(name_encrypt);
Stringencrypt2=encryptor.encrypt(password_encrypt);
System.out.println("明文加密1:"+encrypt1);
System.out.println("明文加密2:"+encrypt2);

// 密文解密
Stringdecrypt1=encryptor.decrypt(encrypt1);
Stringdecrypt2=encryptor.decrypt(encrypt2);
System.out.println("密文解密1:"+decrypt1);
System.out.println("密文解密2:"+decrypt2);
}
}

在spring boot项目配置文件中的ENC加密配置:

sys:
name:ENC(Yt36hceu3xGXEzrz2jCPjvalaXQ5yIHE04SVT6lIkcktrxqtBZrlivkAkA9/9oZ2)
password:ENC(0Ci6irPOko9IG+hBZJAGoguIuE52gF/XiigCV4DwLm6NfkoyvV4Etgc9FzKK3MYl)

以ENC(xxxxxxxxxxxxx)形式存储密文 在controller中对密文调用:

@RestController
publicclassTestController {

@Value("${sys.name}")
privateStringname;

@Value("${sys.password}")
privateStringpassword;

@GetMapping("/test")
publicvoidtest() {
System.out.println("name = "+name);
System.out.println("password = "+password);
}
}

了解完知识点开始解题: 根据上面知识点我们可以直接把加密函数和引用的包直接拖到idea里面

import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.StandardPBEByteEncryptor;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
//加解密需要用到的包

public class Main {
public static void main(String[] args) {
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setAlgorithm(StandardPBEByteEncryptor.DEFAULT_ALGORITHM);
encryptor.setPassword("F*DZ-kZMs5qt");
String pass ="ij+NuXpx6CZwYB1oGHA2M2E2na0G8Tux";//定义一个字符型pass为密文接收变量
String pass2 = encryptor.decrypt(pass);//定义一个字符型pass2为pass解密后的接收变量
System.out.println(pass2);//打印输出pass2
}
}

在这里插入图片描述 把需要用到的依赖导入进idea新项目中 文件—>项目结构—>模块—>依赖

先把网站jar包解压然后找到这个目录 在这里插入图片描述 我这里还没发判断是哪个数据库有查询角色这个字段我就先解密的配置文件中第一个数据库

在这里插入图片描述 在这里插入图片描述 根据配置文件中描述的地址端口号用户名,使用navicat连接 这里有个小知识点如果你仿真的时候配置的是nat的话想要本机去连接虚拟机docker镜像地址mysql的话需要先ssh连接到虚拟机然后在配置sql连接

在这里插入图片描述 在这里插入图片描述 题目中提到是所有操作都会被记录,很显然是log日志库中查看此表得到路径:/zwz/role/getAllByPage

在这里插入图片描述

5. 请分析得出数据库用户表中status为-1状态值的含义为?(格式:学生) (1.0分)答:禁用

分析题意中表status状态值这个是在源码包里才会设置的直接分析jar包搜索status,为禁用 在这里插入图片描述 在这里插入图片描述

6. 请统计平均月均收入第二高的省份(省份包含三大类:省、直辖市、自治区)(答案格式:请写出完整的省份名(或直辖市名、自治区名),如江西省、天津市、西藏自治区) (3.0分)

答:内蒙古自治区 在这里插入图片描述

SELECT LEFT(address,3) AS sheng_address,AVG(income) AS avg_income FROM a_member_st GROUP BY sheng_address ORDER BY avg_income DESC;

选择和处理字段: LEFT(address,3) AS shengfen:从 address 字段中提取最左边的三个字符,并将这个新生成的列命名为 sheng_address。这通常用于获取地址中的省份信息,假设地址是以某种固定格式存储的,例如中国的省市县格式,其中前几位代表省份。 聚合函数: AVG(income) AS avg_income:计算每个分组内的平均收入,并将结果命名为 avg_income。这里假设 income 是一个数值型字段,表示个人或家庭的收入。 分组: GROUP BY shengfen:根据 sheng_address(即从 address 提取出来的前三字符)对记录进行分组。这意味着对于 address 字段中具有相同前三字符的所有记录,它们将被归为一组,然后对每组应用聚合函数(如这里的平均值计算)。 排序: ORDER BY avg_income DESC:按照 avg_income 的降序排列结果集。这意味着拥有最高平均收入的分组会出现在列表的顶部,而平均收入较低的分组则依次往下排列。 表名: FROM a_member_st:指定查询的数据来源于名为 a_member_st 的表。 总结来说,这段 SQL 语句的作用是从 a_member_st 表中提取数据,基于地址的前三位字符(可能代表省份)来分组,并计算每个分组的平均收入,最后按平均收入从高到低排序输出

赞(0)
未经允许不得转载:网硕互联帮助中心 » 【2024-数证杯】决赛_个人赛(服务器)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!