2024_数证杯电子取证大赛
配景介绍
“数证杯”接纳线上初赛与线下决赛结合的情势举行。线上初赛采用团队赛的方式在互联网内开展,每队最多3人,最少1人。通过线上初赛的选手可晋级线下决赛,线下决赛采用“团队赛+个人赛”的情势开展
为深入贯彻国家关于强化网络安全和信息化发展的战略方针,提升我国在电子数据取证与分析领域的专业技术水平,推动产业界、学术界和研究机构的深度合作,进一步作育和构建电子数据取证技术的专业人才队伍,首届“数证杯”电子数据取证分析大赛。
个人赛检材容器下载链接:https://pan.baidu.com/s/10nDlZ7tR1-TPYLYJxqm-oA?pwd=gzki
赛题:
- 1. 重建完整的系统后,redis对外暴露的端口号是多少?(答案格式:数字) (3.0分) 答:16379
复制代码 把服务器仿真起来之后先看端口开放的有哪些,ssh端标语被修改了(我接下来就使用xshell毗连了)
查看后有docker服务这个16379有点可疑
使用下令查看docker正在运行的镜像:
果然是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 表中提取数据,基于地址的前三位字符(可能代表省份)来分组,并计算每个分组的平均收入,最后按平均收入从高到低排序输出
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |