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})
涉及到虚拟机了,会不了一点