第四届“长安杯”电子数据取证竞赛 WriteUp
竞赛案情
案件情况
某地警方接到受害人报案称其在某虚拟币交易网站遭遇诈骗,该网站号称使用“USTD 币”购买所谓的“HT 币”,受害人充值后不但“HT 币”无法提现、交易,而且手机还被恶意软件锁定勒索。警方根据受害人提供的虚拟币交易网站调取了对应的服务器镜像并对案件展开侦查。
考试方向
-
计算机取证分析; -
服务器/网站取证分析; -
手机取证分析; -
程序功能分析。
赛题镜像
链接:https://pan.baidu.com/s/1f9xzt0jooZ-RZylwtt3YvQ 提取码:1234 SHA256:37263f0aace3e33e7f303473e85e69ef804eb16a2500b68a 6b90c895784666f5
VC容器密码为:
2022.4th.changancup!
题目
检材1的SHA256值为
答案:9E48BB2CAE5C1D93BAF572E3646D2ECD26080B70413DC7DC4131F88289F49E34
答案是需要e01解压后的哈希值,直接用取证大师等工具右键计算即可。
分析检材1,搭建该服务器的技术员IP地址是多少?用该地址解压检材2
答案:172.16.80.100
仿真
检材1中,操作系统发行版本号为
答案:7.5.1804
检材1系统中,网卡绑定的静态IP地址为
答案:172.16.80.133
vi /etc/sysconfig/network-scripts/ifcfg-ens33
检材1中,网站jar包所存放的目录是
答案:/web/app/
检材1中,监听7000端口的进程对应文件名为
答案:cloud.jar
挨着查看?(还有没有更好的方法)
检材1中,网站管理后台页面对应的网络端口为
答案:9090
admin目录下的nohup.out文件
也可以查看vue的启动文件
检材1中,网站前台页面里给出的APK的下载地址是
答案:https://pan.forensix.cn/f/c45ca511c7f2469090ad/?dl=1
先启动所有jar包
nohup java -jar admin-api.jar > admin-api.file 2>&1 &
nohup java -jar cloud.jar > cloud.file 2>&1 &
nohup java -jar market.jar > market.file 2>&1 &
nohup java -jar ucenter-api.jar > xucenter-api.file 2>&1 &
nohup java -jar exchange.jar > exchange.file 2>&1 &
启动vue项目
npm run dev
(后面才知道检材3中有被删掉的启动脚本)
检材1中,网站管理后台页面调用的用户表(admin)里的密码字段加密方式为?
答案:md5
查看后端的源代码(admin-api.jar),发现是调用的远程数据库
在下面可以看到
分析检材1,网站管理后台登录密码加密算法中所使用的盐值是
答案:XehGyeyrVgOV4P8Uf70REVpIw3iVNwNs
同上
检材2中,windows账户Web King的登录密码是
答案:135790
检材2中,除检材1以外,还远程连接过哪个IP地址?并用该地址解压检材3
答案:172.16.80.128
检材2中,powershell中输入的最后一条命令是
答案:ipconfig
%USERPROFILE%AppDataRoamingMicrosoftWindowsPowerShellPSReadLineConsoleHost_history.txt
检材2中,下载的涉案网站源代码文件名为
答案:ZTuoExchange_framework-master.zip
ps:检材二D盘还有很多好东西!
检材2中,网站管理后台root账号的密码为
答案:root
浏览器保存的密码中得
检材2中,技术员使用的WSL子系统发行版本是
答案:20.04
检材2中,运行的数据库服务版本号是
答案:8.0.30
一般就是wsl中的数据库了
wsl -u root
service mysql start
上述数据库debian-sys-maint用户的初始密码是
答案:ZdQfi7vaXjHZs75M
初始密码保存在/etc/mysql/debian.cnf下了
检材3服务器root账号的密码是
答案:h123456
检材二的WSL的king用户下有登陆记录
检材3中,监听33050端口的程序名(program name)为
答案:docker-proxy
结合检材一知道该端口是mysql的端口
除MySQL外,该网站还依赖以下哪种数据库
答案:redis.mongo
在检材一的后端可知
检材3中,MySQL数据库root账号的密码是
答案:shhl7001
在检材一的后端可知
检材3中,MySQL数据库在容器内部的数据目录为
答案:/var/lib/mysql
注意是容器内部
show global variables like "%datadir%";
或者直接去docker-compose.yml看文件映射关系
涉案网站调用的MySQL数据库名为
答案:b1
在检材一的后端可知
勒索者在数据库中修改了多少个用户的手机号?
答案:3
查看日志目录
SHOW VARIABLES LIKE 'gen%';
勒索者在数据库中删除的用户数量为
答案:28
看日志
还原被破坏的数据库,分析除技术员以外,还有哪个IP地址登录过管理后台网站?用该地址解压检材4
答案:172.16.80.197
把检材二的b1数据库放入检材三中数据文件位置
还原全部被删改数据,用户id为500的注册会员的HT币钱包地址为
答案:cee631121c2ec9232f3a2f028ad5c89b
还原全部被删改数据,共有多少名用户的会员等级为’LV3′
答案:164
然后这里还要还原被删除的28个数据,根据日志的删除数据和插入数据还原即可。
还原全部被删改数据,哪些用户ID没有充值记录
答案:318.989
排序余额为0的
还原全部被删改数据,2022年10月17日总计产生多少笔交易记录?
答案:1000
还原全部被删改数据,该网站中充值的USDT总额为
答案:408228
嫌疑人使用的安卓模拟器软件名称是
答案:夜神.nox
检材4中,“老板”的阿里云账号是
答案:forensixtech1
检材4中安装的VPN工具的软件名称是
答案:v2Ray
上述VPN工具中记录的节点IP是
答案:38.68.135.18
检材4中,录屏软件安装时间为
答案:2022/10/19 10:50:27
上述录屏软件中名为“s_20221019105129”的录像,在模拟器存储中对应的原始文件名为
答案:0c2f5dd4a9bc6f34873fb3c0ee9b762b98e8c46626410be7191b11710117a12d
找到对应的数据库文件
要导出整个databases文件进行查看!
上述录屏软件登录的手机号是
答案:18645091802
检材4中,发送勒索邮件的邮箱地址为
分析加密程序,编译该加密程序使用的语言是
答案:python
分析加密程序,它会加密哪些扩展名的文件?
答案:txt.jpg.docx.xls
python反编译
分析加密程序,是通过什么算法对文件进行加密的?
答案:异或
分析加密程序,其使用的非对称加密方式公钥后5位为?
答案:u+w==
被加密文档中,FLAG1的值是
答案:TREFWGFS
同样反编译解密的exe
获得解密密码
恶意APK程序的包名为
答案:cn.forensix.changancup
上面的题连接下载的apk
APK调用的权限包括
答案:READ_EXTERNAL_STORAGE;WRITE_EXTERNAL_STORAGE;
解锁第一关所使用的FLAG2值为
答案:MATSFRKG
先用frida脱壳,然后直接搜索字符串
解锁第二关所使用的FLAG3值为
答案:TDQ2UWP9
OooO0oo是String
其使用了String的equals进行比较flag
这里直接hook 所有String的equals方法
hook脚本
Java.perform(function () {
var application = Java.use('android.app.Application');
application.attach.overload('android.content.Context').implementation = function(context){
var result = this.attach(context);
var classloader = context.getClassLoader();
Java.classFactory.loader = classloader;
// 加固方法用classloader找到被加固的类
var HookClass = Java.classFactory.use('java.lang.String');
HookClass.equals.implementation = function(obj){
var ret = this.equals(obj)
console.log(this + ' equals ' + obj);
return ret;
}
}
});
解锁第三关所需的KEY值由ASCII可显示字符组成,请请分析获取该KEY值
答案:a_asd./1imc2)dd1234]_+=+
定位到加密方法
直接把加密函数改成单次然后爆破即可
package src.an;
import org.junit.Test;
public class Boom {
private int[] OooO0oO = {1197727163, 1106668241, 312918615, 1828680913, 1668105995, 1728985987};
private long[] OooO(long j, long j2) {
if (j == 0) {
return new long[]{0, 1};
}
long[] OooO = OooO(j2 % j, j);
return new long[]{((j2 / j) * OooO[0]) + OooO[1], OooO[0]};
}
public boolean OooO0O0(String str, int num) {
// 改成单次的!,每次传入四个字符,num从0开始
int j = str.charAt(0) << 16;
j = j | (str.charAt(1) << 'b');
j = j | (str.charAt(2) << 24);
j = str.charAt(3) | j;
try {
int[] iArr = {1197727043, 1106668192, 312918557, 1828680848, 1668105873, 1728985862};
Object[] objArr = {'x', '1', ':', 'A', 'z', '}'};
if (iArr[num] - j != ((Integer) objArr[num]).intValue()) {
return false;
}
return true;
} catch (Exception unused) {
if (((OooO(j, 4294967296L)[0] % 4294967296L) + 4294967296L) % 4294967296L != this.OooO0oO[num]) {
return false;
}
return true;
}
}
@Test
public void tryBoom() {
String allStrings = new String();
int j = 0;
for (int i = 33; i < 127; i++) {
char c = (char) i;
allStrings += String.valueOf(c);
}
for (int ig1 = 0; ig1 < allStrings.length(); ig1++) {
String subStr1 = allStrings.substring(ig1, ig1 + 1);
for (int ig2 = 0; ig2 < allStrings.length(); ig2++) {
String subStr2 = allStrings.substring(ig2, ig2 + 1);
for (int ig3 = 0; ig3 < allStrings.length(); ig3++) {
String subStr3 = allStrings.substring(ig3, ig3 + 1);
for (int ig4 = 0; ig4 < allStrings.length(); ig4++) {
String subStr4 = allStrings.substring(ig4, ig4 + 1);
String subStr = subStr1 + subStr2 + subStr3 + subStr4;
if (OooO0O0(subStr, 5)) {
System.out.println(subStr);
}
}
}
}
}
}
}
……
后记
主要考察的前后端分离的网站重构,说复杂吧,牵扯到的服务组件太多,还是不同服务器上,ip之间有依赖关系,像我上面改了动态ip后面还要挨着改。说简单吧,直接不动ip改改虚拟网卡,只要知道检材二中的启动脚本可以一键搭建。
原文始发于微信公众号(山警网络空间安全实验室):第四届“长安杯”电子数据取证竞赛 WriteUp