2024精武杯

平航杯不发了,不想折腾hyper-v

计算机和手机取证

1. 请综合分析计算机和手机检材,计算机最近一次登录的账户名是

导出注册表解析

结果为admin

2. 请综合分析计算机和手机检材,计算机最近一次插入的USB存储设备串号是

/Windows/System32/winevt/Logs/Microsoft-Windows-Partition%4Diagnostic.evtx

结果为S3JKNX0JA05097Y

3. 请综合分析计算机和手机检材,谢弘的房间号是()室

找到一个表格文件,另外2k和3k是正常的压缩包,里面也是表格文件

结果为201

4. 请综合分析计算机和手机检材,曹锦芳的手机号后四位是

结果为0683

5. 请综合分析计算机和手机检材,找到全部4份快递相关的公民信息文档,按姓名+电话+地址去重后共有多少条?

第四份在分区3

import pandas as pd

distinct = set()
for idx in range(1,5):
    file = f'顺丰{idx}k.xlsx'
    df = pd.read_excel(file,sheet_name='Sheet1',header=None)
    df.columns = ['ID','姓名','手机号','地址','省','市','G']
    for index,row in df.iterrows():
        distinct.add((row['姓名'],row['手机号'],row['地址']))
print(len(distinct))
# 4997

结果为4997

6. 请综合分析计算机和手机检材,统计检材内共有几份购票平台相关的公民信息文档

有一个加密容器

对波一通,密码在便笺里

得到密码5thGoldenEyesCup,使用这个密码可以解密容器,后面还跟了个123456可以留意一下

第一个

第二个,文件名是12306 裤子2.txt

123456还可以挂载出一个隐藏分区

结果为3

7. 请综合分析计算机和手机检材,樊海锋登记的邮箱账号是

结果为727875584@pp.com

8. 请综合分析计算机和手机检材,统计购票平台相关的文档,去重后共有多少条身份证号为上海的公民信息?

去重是对所有数据去重还是单独对身份证去重?毕竟这里身份证被脱敏了,没法完全作为去重标准,个人认为应该是前者

对所有数据去重

distinct = set()

for i in range(1,4):
    with open(f'12306裤子{i}.txt', 'r', encoding='utf-8') as f:
        for line in f.readlines():
            distinct.add(tuple(line.split('----')))
cnt = 0
for v in distinct:
    if v[3].startswith('310'):
        cnt += 1
print(cnt)
# 110

只对身份证去重

distinct = set()

for i in range(1,4):
    with open(f'12306裤子{i}.txt', 'r', encoding='utf-8') as f:
        for line in f.readlines():
            distinct.add(line.split('----')[3])
cnt = 0
for v in distinct:
    if v.startswith('310'):
        cnt += 1
print(cnt)
# 109

结果为110

9. 请分析手机检材,2022年11月7日,嫌疑人发送了几条短信?

这是root后做了什么操作造成的数据不在data目录下?

结果为3

10. 请分析手机检材,其中保存了多少条公民住房信息?

可以看到在微信中发送了图片

12张图,14个人名,其中关星和常见重复

结果为12

服务器取证

1. 请对所给服务器检材进行分析,请 写 出 管 理 员 安 装“mdadm-4.1-9.el7_9.x86_64”的时间?

server123构成了raid

4个镜像直接拉进仿真

无法ssh登录,ssh配置没问题,防火墙没问题,有ssh.allow和ssh.deny

这两个文件控制哪些ip可以访问服务器,先设置deny再设置allow,所以修改allow中的ip为all即可

在所有镜像都仿真后,fdisk -l就可以看到它们,以及它们组成的raid

使用命令cat /proc/mdstat查看raid重组状态,也可以看到是已经组好的

可以使用mdadm --examine /dev/sdb来查看raid参数

你以为为什么专门问你这个软件包?CST时间也可以是北京时间,有歧义的

结果为2023-02-16 13:13:01

2. 请对所给服务器检材进行分析,请写出宝塔默认建站的目录是什么?(答案格式:/abc/def)

知道是data过后,把raid5挂载过去

结果为/data

3. 请对所给服务器检材进行分析,请写出ip为192.168.157.1的机器登陆失败的时间是什么时候?

结果为2020-10-09 16:4729

4. 请对所给服务器检材进行分析,写出网站的数据库root帐号密码?

需要验证一下,远程暂时不给登录

密码是这个,不过库是空的

在备份路径下面找到备份,不过被压缩加密了

这下知道好的ssh工具的重要性了吧?

显然字典攻击,拿到密码22Ga#ce3ZBHV&Fr59fE#

还是要先看一下源码,base64编码了

结果他连的端口是3307

没有3307

在docker里

结果为hl@7001

5. 请对所给服务器检材进行分析,请分析网站后台管理员帐号的加密方式

访问网站后报错,报的就是database.php里的内容,所以把解码后的直接替换过去

改完还是有报错,数据库可以正常连接,那么肯定还有其他问题

把权限给上

找到后台入口,按理说是admin.php哦,但是文件名被改了

找一下在哪定义

结果为md5($salt.trim($pwd))

6. 请对所给服务器检材进行分析,网站首页友情链接中的“弘连网络“的更新时间是什么时候?

绕过密码还要讲?

结果为2023-02-16 15:02:29

7. 请对所给服务器检材进行分析,网站后台管理页面入口文件名是什么?

见5

结果为4008003721.php

8. 请对所给服务器检材进行分析,网站数据库备份文件的sha256的值是多少?

要不是下题,我还以为要算解压出来的那个

结果为9dede75e455a7c4c5cc4b61e41570adf82af25251c5fd8456a637add864b0af0

9. 请对所给服务器检材进行分析,网站数据库备份文件的解压密码是多少?

见4

结果为22Ga#ce3ZBHV&Fr59fE#

10. 请对所给服务器检材进行分析,商城中“弘连火眼手机分析专用机MT510”商品的原价是多少?

恢复一下备份

结果为1398000.00

流量分析

1. 请分析流量分析.pcapng文件,并回答入侵者的IP地址是?

结果为192.168.85.130

2. 请分析流量分析.pcapng文件,并回答被入侵计算机中的cms软件版本是?

见上图,wordpress,版本5.2.1

结果为5.2.1

3. 请分析流量分析.pcapng文件,并回答被入侵计算机中的MySQL版本号是?

结果为5.5.53

4. 请分析流量分析.pcapng文件,并回答被入侵计算机中的MySQL root账号密码是?

这里爆破成功

结果为admin@12345

5. 请分析流量分析.pcapng文件,并回答入侵者利用数据库管理工具创建了一个文件,该文件名为?

开启了general_log

结果为06b8dcf11e2f7adf7ea2999d235b8d84.php

6. 请分析流量分析.pcapng文件,并回答被入侵计算机中PHP环境禁用了几个函数?

在日志中构造php代码,然后访问执行

结果为10

7. 请分析流量分析.pcapng文件,并回答入侵者提权后,执行的第1条命令是?

1135流成功进入cmd

结果为dir

8. 请分析流量分析.pcapng文件,并回答被入侵计算机开机时间是?

结果为2019-06-13 18:50:33

9. 请分析流量分析.pcapng文件,并回答被入侵计算机桌面上的文件中flag是?(答案格式:abcdef123456789)

1364流

结果为3f76818f507fe7e66422bd0703c64c88

10. 请分析流量分析.pcapng文件,并回答图片文件中的flag是? (答案格式:abcdef123456789)

尾部压缩包,直接给了数据

结果为d31c1d06331a9534bf41ab93afca8d31

APK功能分析

Frida!古希腊掌管hook的神!

1. 请分析1.备忘录.apk反编译出的文件中,正确答案在哪个文件里?

结果为activity_main.xml

2. 请分析1.备忘录.apk并找到程序中的主activity是?(答案格式:com.tencent.mm.activity)

结果为com.hl.memorandum.MainActivity

3. 请分析1.备忘录.apk并找到程序中的flag值(答案格式:HL{66666666-1-1-1-1})

结果为HL{d0b2058a-ac29-11ed-807f-acde48001122}

4. 请分析2.easyapk.apk中SharedPreferences配置文件的名称(包括后缀)是什么?

结果为myprefs.xml

5. 请分析2.easyapk.apk并找到程序中的flag值(答案格式:HL{66666666-1-1-1-1})

hook,然后根据equals格式修改

setImmediate(function () {
    Java.perform(function () {
let sha = Java.use("com.hl.easyapk.sha");
sha["encrypt"].implementation = function (raw) {
    console.log(`sha.encrypt is called: raw=${raw}`);
    let result = this["encrypt"](raw);
    console.log(`sha.encrypt result=${result}`);
    return result;
};
	});
})

结果为HL{55c99ed4-d894-ae59-3a3b-6fe3eed793e7}

6. 请分析3.verify.apk,该程序中所使用的AES加密KEY值为

hook aes密钥

setImmediate(function () {
    Java.perform(function () {
let en2 = Java.use("com.hl.verify.en2");
en2["xxx"].implementation = function (arg6, arg7) {
    console.log(`en2.xxx is called: arg6=${arg6}, arg7=${arg7}`);
    let result = this["xxx"](arg6, arg7);
    console.log(`en2.xxx result=${result}`);
    return result;
};
	});
})

十进制转ascii

结果为thisisyouraeskey

7. 请分析3.verify.apk并找到程序中的flag值(答案格式:HL{66666666-1-1-1-1})

找到压缩包

结果为HL{301b6b90-ac37-11ed-bad4-5811224dd424}

8. 请分析4.easyjni.zip,压缩包中数据库的解密秘钥为

先构造满足条件的账号密码

然后直接hook

setImmediate(function () {
    Java.perform(function () {
let SQLiteOpenHelper = Java.use("net.sqlcipher.database.SQLiteOpenHelper");
SQLiteOpenHelper["getWritableDatabase"].overload('java.lang.String').implementation = function (password) {
    console.log(`SQLiteOpenHelper.getWritableDatabase is called: password=${password}`);
    let result = this["getWritableDatabase"](password);
    console.log(`SQLiteOpenHelper.getWritableDatabase result=${result}`);
    return result;
};
	});
})

sqlcipher4默认参数即可

结果为66d6ad256b0b03143e5571276bcebfc756a8fc0f7322b31ee8a8a2e992cbce37

9. 请分析4.easyjni.zip并找到程序中的flag值(答案格式:HL{66666666-1-1-1-1})

跟so

hook大法慢慢理每个函数的作用

setImmediate(function () {
    Java.perform(function () {
	var baseAdd = Module.findBaseAddress('libeasyjni.so');
	//console.log(baseAdd)
	let MainActivity = Java.use("com.hl.easyjni.MainActivity");
MainActivity["aa"].implementation = function (str, str2) {
    console.log(`MainActivity.aa is called: str=${str}, str2=${str2}`);
    let result = this["aa"](str, str2);
    console.log(`MainActivity.aa result=${result}`);
    return result;
};
	Interceptor.attach(Module.findExportByName('libeasyjni.so','Java_com_hl_easyjni_MainActivity_aa'),{
		onEnter: function(args){
			console.log('jnienv',args[0])
		},
		onLeave: function(retVal){
			console.warn('return',retVal)
		}
	});
	Interceptor.attach(baseAdd.add(0xEBB0),{
		onEnter: function(args){
			console.log('[sub_EBB0]arg0',Memory.readByteArray(args[0],32))
			console.log('[sub_EBB0]arg1',Memory.readUtf8String(args[1]))
		}
	});
	Interceptor.attach(baseAdd.add(0xF460),{
		onEnter: function(args){
			console.log('[sub_F460]arg0',Memory.readByteArray(args[0],32))
			console.log('[sub_F460]arg1',Memory.readUtf8String(args[1]))
		}
	});
	Interceptor.attach(baseAdd.add(0xEFF0),{
		onEnter: function(args){
			console.log('[sub_EFF0]arg0',Memory.readByteArray(args[0],32))
			console.log('[sub_EFF0]arg1',Memory.readUtf8String(args[1]))
			console.log('[sub_EFF0]arg2',Memory.readUtf8String(args[2]))
		},
		onLeave: function(retVal){
			console.error('[sub_EFF0]return',Memory.readUtf8String(retVal))
		}
	});
	Interceptor.attach(baseAdd.add(0xECC0),{
		onEnter: function(args){
			console.log('[sub_ECC0]arg0',Memory.readByteArray(args[0],32))
			console.error('[sub_ECC0]arg1',Memory.readByteArray(args[1],128))
			console.log('[sub_ECC0]arg3',args[2])
		},
		onLeave: function(retVal){
			console.warn('[sub_ECC0]return',Memory.readUtf8String(retVal))
		}
	});
	Interceptor.attach(baseAdd.add(0xF570),{
		onEnter: function(args){
			console.log('[sub_F570]arg0',args[0])
		},
		onLeave: function(retVal){
			console.warn('[sub_F570]return',Memory.readUtf8String(retVal))
		}
	});
	Interceptor.attach(baseAdd.add(0xF540),{
		onEnter: function(args){
			console.log('[sub_F540]arg1',Memory.readByteArray(args[1],32))
		},
		onLeave: function(retVal){
			console.warn('[sub_F540]return',retVal)
		}
	});
	Interceptor.attach(baseAdd.add(0xEC90),{
		onEnter: function(args){
			console.error('[sub_EC90]arg0',Memory.readByteArray(args[0],32))
			console.log('[sub_EC90]arg1',Memory.readByteArray(args[1],32))
		},
		onLeave: function(retVal){
			console.warn('[sub_EC90]return',retVal)
		}
	});
	Interceptor.attach(baseAdd.add(0xF200),{
		onEnter: function(args){
			console.error('[sub_F200]arg0',Memory.readUtf8String(args[0]))
		},
		onLeave: function(retVal){
			console.warn('[sub_F200]return',retVal)
		}
	});
	Interceptor.attach(baseAdd.add(0xEF90),{
		onEnter: function(args){
			console.error('[sub_EF90]arg0',Memory.readByteArray(args[0],64))
			console.error('[sub_EF90]arg1',args[1])
		},
		onLeave: function(retVal){
			console.warn('[sub_EF90]return',Memory.readByteArray(retVal,64))
			console.warn('[sub_EF90]return',Memory.readUtf8String(retVal))
		}
	});
	});
})

然后代码就变成这样

由于在sub_EF90中进行base64编码,所以通过简单的构造输入,就可以出现从第一个字符取数据的情况,这时候读取64位就可以拿到base64的字符表AawGEFDJIHKLMNOPQRSTVUWXYZBbcdnfghijklmeopqrstuvCxyz0123456789+/

这里的长度为36,用户名长度固定11,所以密码长度为25

而s实际上就是做了一个置换,这里用python模拟一下

s2 = 'wxjzcwxjzc1'
s1 = 'adminadmin'
s = [0 for i in range(len(s1)+len(s2))]
length = len(s1)
for i in range(length):
    s[i] = ord(s1[i])-3
for i in range(length,length+11):
    s[i] = ord(s2[i-length])+15
for i in range(length//2):
    t = s[i]
    s[i] = s[length-1-i]
    s[length-1-i] = t
for i in range(0,length-1,2):
    t = s[i]
    s[i] = s[i+1]
    s[i+1] = t
for v in s:
    print(hex(v)[2:],end='')

所以就是需要把置换逆一下就可以了

s = [0x31,0x7a,0x63,0x36,0x34,0x63,0x33,0x35,0x32,0x62,0x5e,0x33,0x2e,0x60,0x30,0x30,0x5f,0x30,0x5e,0x2d,0x61,0x32,0x5f,0x63,0x5e,0x57,0x5b,0x8a,0x71,0x48,0x44,0x3f,0x75,0x44,0x71,0x47]
length = len(s) - 11
for i in range(0,length-1,2):
    t = s[i]
    s[i] = s[i+1]
    s[i+1] = t
for i in range(length//2):
    t = s[i]
    s[i] = s[length-1-i]
    s[length-1-i] = t
for i in range(length):
    s[i] = chr(s[i]+3)
for i in range(length,length+11):
    s[i] = chr(s[i]-15)
ret = ''
for v in s:
    ret += v
print(f'username:{ret[-11:]}')
print(f'password:{ret[:-11]}')

结果为HL{b950f5b8abfd5a0b3331ca65e687ff94}

*10. 请分析5.calc.apk并找到程序中的flag值(答案格式:HL{66666666-1-1-1-1})

涉及到虚拟机了,会不了一点

posted @ 2024-04-27 08:00  WXjzc  阅读(407)  评论(0编辑  收藏  举报