第四届长安杯电子取证竞赛个人总结
P1ANT731
第四届长安杯竞赛检材VC容器SHA256计算
PS E:\2022Changancup> certutil -hashfile E:\2022Changancup\第四届长安杯竞赛检材VC容器 SHA256
SHA256 的 E:\2022Changancup\第四届长安杯竞赛检材VC容器 哈希:
37263f0aace3e33e7f303473e85e69ef804eb16a2500b68a6b90c895784666f5
CertUtil: -hashfile 命令成功完成。
赛题
案情简介
某地警方接到受害人报案称其在某虚拟币交易网站遭遇诈骗,该网站号称使用“USTD 币”购买所谓的“HT 币”,受害人充值后不但“HT 币”无法提现、交易,而且手机还被恶意软件锁定勒索。警方根据受害人提供的虚拟币交易网站调取了对应的服务器镜像并对案件展开侦查。
VC容器密码
2022.4th.changancup!
检材1
根据报案人提供的网站域名和IP,警方调取了对应的服务器镜像“检材1”,分析掌握的检材回答下列问题
1. 检材1的SHA256值为
镜像文件 SHA256
certutil -hashfile <文件路径> SHA256
源磁盘 SHA256
9E48BB2CAE5C1D93BAF572E3646D2ECD26080B70413DC7DC4131F88289F49E34
2. 分析检材1,搭建该服务器的技术员IP地址是多少?用该地址解压检材2
X-Ways过滤登录注销记录utmp、wtmp、btmp、lastlog、utmpx、wtmpx、btmpx、utx.active、utx.lastlogin、utx.log
172.16.80.100
3. 检材1中,操作系统发行版本号为
X-Ways文件名过滤*-release
CentOS 7.5.1804
4. 检材1系统中,网卡绑定的静态IP地址为
网卡只有ens33
一张,X-Ways文件名过滤ifcfg-ens33
172.16.80.133
5. 检材1中,网站jar包所存放的目录是(答案为绝对路径,如“/home/honglian/”)
X-Ways文件名过滤*.jar
jar文件显示其路径全部包含/web/app/
/web/app/
6. 检材1中,监听7000端口的进程对应文件名为
仿真检材1,使用命令 netstat -anp | grep 7000
查看,并未发现监听7000端口的进程
history
查看历史命令,jar包运行后查看过端口,怀疑是jar包运行的服务监听7000端口,依次尝试运行jar包
584 cd /web/app
585 nohup java -jar /web/app/cloud.jar >/dev/null 2>&1 &
586 cd /web/app
587 nohup java -jar /web/app/market.jar >/dev/null 2>&1 &
588 ps -aiux
589 ps -aux
590 cd /web/app
591 nohup java -jar /web/app/exchange.jar >/dev/null 2>&1 &
592 cd /web/app
593 nohup java -jar /web/app/admin-api.jar >/dev/null 2>&1 &
594 cd /web/app
595 nohup java -jar /web/app/ucenter-api.jar >/dev/null 2>&1 &
nohup: 用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行
netstat -anp | grep 7000
出现LISTEN
状态的7000端口,进程ID为4719,查询进程文件名ps -aux | grep 4719
cloud.jar
7. 检材1中,网站管理后台页面对应的网络端口为(答案填写阿拉伯数字,如“100”)
在这里可以选择重构网站;也可以先空着通过后续对检材2的分析得到答案。
由于只做到这里,线索不够多,是否存在数据库,网站链接的数据库是否位于本检材,在历史命令中可以看见存在网站启动的脚本start.sh
start_web.sh
是否位于本检材并不明显,网站端口、路径未知,自然暂时无法重构网站。可以优先做后面的题目,查看其它检材内是否有线索。
思路位于第15题中。
9090
8. 检材1中,网站前台页面里给出的APK的下载地址是(答案格式如下:“https://www.forensix.cn/abc/def”)
最好的方法是重构网站后再进入网站查看,同上题。
思路位于第20题中。
https://pan.forensix.cn/f/c45ca511c7f2469090ad/?dl=1
9. 检材1中,网站管理后台页面调用的用户表(admin)里的密码字段加密方式为?
重构网站对此题帮助不大,优先选择查看jar包是否包含所需内容,由于题目中已给出用户表表名为admin,可以选择优先查看admin-api.jar
。使用jd-gui
查看admin-api.jar
。
因为是选择题,所以
md5
10. 分析检材1,网站管理后台登录密码加密算法中所使用的盐值是
如上题目key=
XehGyeyrVgOV4P8Uf70REVpIw3iVNwNs
检材2
根据IP地址落地及后续侦查,抓获了搭建网站的技术员,扣押了其个人电脑并制作镜像“检材2”,分析所有掌握的检材回答下列问题
11. 检材2中,windows账户Web King的登录密码是
使用火眼证据分析加载检材2镜像
得到NT HASH为7ec356a830f3ff153346b018879cfbf1
,cdm5(md5在线解密破解,md5解密加密 (cmd5.com))解密
135790
12. 检材2中,除检材1以外,还远程连接过哪个IP地址?并用该地址解压检材3
查看XShell应用解析
172.16.80.128
13. 检材2中,powershell中输入的最后一条命令是
由于power shell
有类似CentOS
终端记忆历史命令的功能,仿真检材2打开power shell
按 ↑ 即可。
power shell
历史命令文件名为ConsoleHost_history.txt
。X-Ways文件名过滤。
ipconfig
14. 检材2中,下载的涉案网站源代码文件名为
位于Chrome
下载记录中
ZTuoExchange_framework-master.zip
15. 检材2中,网站管理后台root账号的密码为
Chrome
保存的密码
root
7. 解题
在这里链接的IP地址即检材1的静态地址,该端口即第7题中网站后台管理页面对应的网络端口。
16. 检材2中,技术员使用的WSL子系统发行版本是(答案格式如下:windows 10.1)
有两种方法可以查看
方法一 文件数量
复盘会议中20.04文件夹中存在的文件远多于22.04(但是我这边好像差不多,可能是打开方式不对 ?。? )
方法二 仿真查看
命令wsl -l -v
(题外话,为什么技术员的电脑里会弹出老板的微信登录页面 ?。? )
17. 检材2中,运行的数据库服务版本号是(答案格式如下:10.1)
仿真运行Ubuntuwsl
,查看数据库版本mysql --version
8.0.30
18. 上述数据库debian-sys-maint用户的初始密码是
进入mysql目录cd /etc/mysql
查看配置文件more debian.cnf
这里我出现一个提示cat: debian.cnf: Permission denied
试了一下sudo cat debian.cnf
,提示需要密码,尝试Windows密码135790
错误,尝试空密码错误。
尝试123456
,正确。。。。
ZdQfi7vaXjHZs75M
19. 检材3服务器root账号的密码是
查看Ubuntu的历史命令
h123456
检材3
根据网站前端和技术员个人电脑上的线索,发现了网站后端所在的服务器IP并再次调证取得“检材3”,分析所有掌握的检材回答下列问题
20. 检材3中,监听33050端口的程序名(program name)为
提示在检材一的jar包中,在jar包中可以看到
#datasource
spring.datasource.url=jdbc:mysql://172.16.80.128:33050/b1?characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=shhl7001
重构网站
根据后面的提示可知,在服务器内部还存有一个容器用于运行MySQL
,查看历史命令是否存在线索
得知检材内存在docker容器
751 systemctl start docker
752 cd /data/
753 cd mysql/
754 ls
755 docker-compose up -d
756 cat docker-compose.yml
查看/data/mysql/
目录下的docker-compose.yml
映射卷
volumes:
- /data/mysql/db:/var/lib/mysql
- /data/mysql/conf/my.cnf:/etc/mysql/my.cnf
尝试开启docker容器
无法运行
[root@localhost mysql]# docker exec -it mysql57 /bin/bash
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
查看历史命令
发现进入/data/mysql/db
目录后,将b1
文件夹全部删除(常见的删库跑路操作),过滤文件夹名b1
,在检材2中发现两个相同大小的文件夹
同一个目录下还存在运行网站的脚本start.sh
、start_web.sh
、疑似加解密程序、建站笔记.txt
。
将b1
导入检材3/data/mysql/db
,将脚本依次放入仿真检材中运行。
尝试修复docker
(参考博客https://blog.csdn.net/fengtao0821/article/details/110520318)
[root@localhost mysql]# cd /etc/docker
[root@localhost docker]# vi daemon.json
# 写入
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
# 写入结束
[root@localhost docker]# systemctl restart docker.service
读取b1中的表
show tables;
根据建站笔记.txt
中的描述,需要先启动后端组件
[root@localhost /]# chmod +x start.sh
[root@localhost /]# sh start.sh
Starting Zookeeper
nohup: appending output to ‘nohup.out’
Starting Kafka
nohup: appending output to ‘nohup.out’
Finishkil
后端脚本启动成功,启动前端脚本
[root@localhost app]# chmod +x start_web.sh
[root@localhost app]# sh start_web.sh
Starting App: Cloud
nohup: appending output to ‘nohup.out’
Starting App: market
nohup: appending output to ‘nohup.out’
Starting App:exchange
nohup: appending output to ‘nohup.out’
Starting App:admin
nohup: appending output to ‘nohup.out’
Starting App:ucenter
nohup: appending output to ‘nohup.out’
Starting WEB:WEB
Starting WEB:admin
Finishkil
[root@localhost app]#
重构网站后再查看33050端口占用信息
[root@localhost /]# netstat -anp | grep 33050
tcp 0 0 0.0.0.0:33050 0.0.0.0:* LISTEN 32117/docker-proxy
tcp6 0 0 :::33050 :::* LISTEN 32123/docker-proxy
docker-proxy
8.解题
进入172.16.80.133:3000/
查看,首页有APP下载,扫描Android二维码
二维码在线解码
https://pan.forensix.cn/f/c45ca511c7f2469090ad/?dl=1
21. 除MySQL外,该网站还依赖以下哪种数据库
在admin-api.jar
中可以看到依赖数据库还有
mongodb、redis
22. 检材3中,MySQL数据库root账号的密码是
因为MySQL
环境建立在docker
环境中,查看docker-compose.yml
文件
也可以在检材1的jar包中查看
shhl7001
23. 检材3中,MySQL数据库在容器内部的数据目录为
同上题,volumes
记录了卷映射
/var/lib/mysql
24. 涉案网站调用的MySQL数据库名为
前面的题目中已经提到了数据库文件夹为b1,保险起见,使用navicat连接数据库查看
b1
25. 勒索者在数据库中修改了多少个用户的手机号?(答案填写阿拉伯数字,如“15”)
数据库恢复后,在映射卷路径上级目录出现8eda4cb0b452.log
文件
查看8eda4cb0b452.log
文件
3
26. 勒索者在数据库中删除的用户数量为(答案填写阿拉伯数字,如“15”)
过滤DELECT
28
27. 还原被破坏的数据库,分析除技术员以外,还有哪个IP地址登录过管理后台网站?用该地址解压检材4
查看网站系统日志,除去来自自己172.16.80.1
的操作
172.16.80.197
28. 还原全部被删改数据,用户id为500的注册会员的HT币钱包地址为
会员管理搜索500
cee631121c2ec9232f3a2f028ad5c89b
29. 还原全部被删改数据,共有多少名用户的会员等级为’LV3’(答案填写阿拉伯数字,如“15”)
member
表中存在字段名为member_grade_id
建立查询,查询未删除的member_grade_id=3的记录
SELECT * FROM `member` WHERE member_grade_id=3;
数据库中还存有158条数据
查询日志中被删除的member_grade_id=3的记录
随意查询一个INSERT记录查看数据格式
查看对应的格式,搜索0, 3, 0, 0, NULL
由26题可知,删除的用户id范围为973~1000
共有6条数据
164
30. 还原全部被删改数据,哪些用户ID没有充值记录(答案填写阿拉伯数字,多个ID以逗号分隔,如“15,16,17”)
首先使用sql语句选择出所有拥有充值记录的账户
SELECT member_id FROM member_transaction GROUP BY member_id;
缺少2个用户记录
查看balance=0的用户
SELECT * FROM member_wallet WHERE balance=0;
318;989
31. 还原全部被删改数据,2022年10月17日总计产生多少笔交易记录?(答案填写阿拉伯数字,如“15”)
SQL语句,网站中无法直接看见被删除用户的数据
SELECT * FROM member_transaction WHERE create_time BETWEEN '2022-10-17 00:00:00' AND '2022-10-17 23:59:59';
1000
32. 还原全部被删改数据,该网站中充值的USDT总额为(答案填写阿拉伯数字,如“15”)
SQL语句,同上
SELECT SUM(amount) FROM member_transaction;
408228
检材4
根据前期侦查分析,通过技术手段找到了幕后老板,并对其使用的安卓模拟器“检材4”进行了固定。分析该检材并回答下列问题
33. 嫌疑人使用的安卓模拟器软件名称是
夜神 ( Nox )
34. 检材4中,“老板”的阿里云账号是
查看微信聊天记录
forensixtech1
35. 检材4中安装的VPN工具的软件名称是
v2rayNG
36. 上述VPN工具中记录的节点IP是
38.68.135.18
37. 检材4中,录屏软件安装时间为
使用X-Ways打开检材4,导出vmdk文件使用火眼加载
2022-10-19 10:50:27
38. 上述录屏软件中名为“s_20221019105129”的录像,在模拟器存储中对应的原始文件名为
X-Ways中同步搜索文件名包含luping
的文件中所有包含s_20221019105129
的文件
0c2f5dd4a9bc6f34873fb3c0ee9b762b98e8c46626410be7191b11710117a12d
39. 上述录屏软件登录的手机号是
提交注销申请显示账号
18645091802
40. 检材4中,发送勒索邮件的邮箱地址为
skterran@163.com
exe分析
分析所有掌握的检材,找到勒索邮件中被加密的文档和对应的加/解密程序,并回答下列问题
41. 分析加密程序,编译该加密程序使用的语言是
python
42. 分析加密程序,它会加密哪些扩展名的文件?
pyinstaller逆向
暂时没整明白,整明白了再修改
43. 分析加密程序,是通过什么算法对文件进行加密的?
暂时没整明白,整明白了再修改
44. 分析加密程序,其使用的非对称加密方式公钥后5位为?
暂时没整明白,整明白了再修改
45. 被加密文档中,FLAG1的值是(FLAG为8位字符串,如“FLAG9:QWERT123”)
暂时没整明白,整明白了再修改
apk分析
分析所有掌握的检材,找到报案人描述的加密勒索apk程序,分析并回答下列问题
46.恶意APK程序的包名为
cn.forensix.changancup
47.APK调用的权限包括
READ_EXTERNAL_STORAGE;WRITE_EXTERNAL_STORAGE
48.解锁第一关所使用的FLAG2值为(FLAG为8位字符串,如需在apk中输入FLAG,请输入完整内容,如输入"FLAG9:QWERT123")
脱壳后反编译,搜索文本FLAG
MATSFRKG
49.解锁第二关所使用的FLAG3值为(FLAG为8位字符串,如需在apk中输入FLAG,请输入完整内容,如输入"FLAG9:QWERT123")
上面代码中对FLAG3的判断条件为i2 & 2
private void OooO00o() {
int i2 = App.OooO0OO.getInt("unlocked", 0);
if ((i2 & 4) != 0) {
this.OooO0OO.setText("哎呀,第三关都通过了,恭喜恭喜,现在你的手机已获得自由!");
this.OooO0Oo.setVisibility(8);
this.OooO0o0.setVisibility(8);
} else if ((i2 & 2) != 0) {
this.OooO0OO.setText("你是怎么通过第二关的???不过还有第三关,现在你手机里任何文档,压缩包,图片,视频都已被加密,请再次联系QQ:90001234进行解密");
this.OooO0Oo.setOnClickListener(this);
this.OooO0o0.setHint("输入解密文件的key");
this.OooO0o0.setText("");
} else if ((i2 & 1) != 0) {
this.OooO0OO.setText("居然通过了第一关,不过还有第二关在等着你,现在你的手机在接下来的时间,会每隔一段时间关闭屏幕,请再次联系QQ:90001234进行解除,期间请勿尝试任何手段破解,否则将触发自毁程序");
this.OooO0Oo.setOnClickListener(this);
this.OooO0o0.setHint("FLAG3:XXXXXXXX");
this.OooO0o0.setText("");
} else {
this.OooO0OO.setText("恭喜,你的手机已被锁,请联系QQ:90001234进行解决,期间请勿尝试任何手段破解,否则将触发自毁程序");
this.OooO0Oo.setOnClickListener(this);
this.OooO0o0.setHint("FLAG2:XXXXXXXX");
this.OooO0o0.setText("");
}
}
查看else if
else if (App.OooO0O0.OooO0oo.equals(this.OooO0o0.getText().toString()) && App.OooO0OO.edit().putInt("unlocked", App.OooO0OO.getInt("unlocked", 0) | 2).commit()) {
StringBuilder OooO0OO2 = C0253o0000Oo.OooO0OO(App.OooO0OO.getString("flag16_tkey", ""));
OooO0OO2.append(App.OooO0O0.OooO0oo);
e q u a l s ( t h i s . O o o O 0 o 0. g e t T e x t ( ) . t o S t r i n g ( ) equals(this.OooO0o0.getText().toString() equals(this.OooO0o0.getText().toString()
将输入的值转换成字符串与前面的App.OooO0O0.OooO0oo
进行比对,查找OooO0O0
定义
this.OooO0oo = new String(decrypt(OooO0O0.OooO0O0("ffd4d7459ad24cd035611b014a2cccac")));
try {
Cipher instance = Cipher.getInstance("AES/GCM/NoPadding");
if (TextUtils.isEmpty(OooO0OO.getString("t_key", ""))) {
instance.init(1, OooO0oO());
byte[] bArr = new byte[16];
new SecureRandom().nextBytes(bArr);
init(bArr);
if (OooO0OO.edit().putString("iv", OooO0O0.OooO00o(instance.getIV())).commit() && OooO0OO.edit().putString("t_key", OooO0O0.OooO00o(instance.doFinal(bArr))).commit()) {
System.out.println("init key ok");
}
} else if (Build.VERSION.SDK_INT >= 19) {
instance.init(2, OooO0o(), new GCMParameterSpec(128, OooO0O0.OooO0O0(OooO0OO.getString("iv", ""))));
init(instance.doFinal(OooO0O0.OooO0O0(OooO0OO.getString("t_key", ""))));
} else {
throw new RuntimeException("todo cipher");
}
} catch (Exception unused) {
}
查找decrypt方法
public native byte[] decrypt(byte[] bArr);
做到这里需要Android Studio,安装需要连接Google下载相关服务。
暂时没整明白Android Studio,整明白了再修改
50.解锁第三关所需的KEY值由ASCII可显示字符组成,请请分析获取该KEY值
暂时没整明白,整明白了再修改