材料下载
比赛VC容器下载:下载地址-分享密码8v69cb
(容器挂载密码:2022.4th.changancup!)
取证步骤
材料一
1.检材1的SHA256值为?
9E48BB2CAE5C1D93BAF572E3646D2ECD26080B70413DC7DC4131F88289F49E34
直接导入火眼算"检材1.e01"的sha256值.
2. 分析检材1,搭建该服务器的技术员IP地址是多少?用该地址解压检材2
172.16.80.100
火眼查看登录日志即可得出答案,顺手把材料2解压了.
3. 检材1中,操作系统发行版本号为
A、CentOS 7.5.1804
因为检材1是centos系统,用火眼仿真之后,进到虚拟机里使用
(该命令仅Redhat系有效)即可查看系统发行版本(非内核版本)cat /etc/redhat-release
4. 检材1系统中,网卡绑定的静态IP地址为
172.16.80.133
系统里尝试ipconfig
发现没有该命令,于是使用ip a
查看网卡相关信息得出答案(建议查看完后对网卡配置进行修改,改ip到你vm的网段里,方便后续ssh,访问网页等操作)
5. 检材1中,网站jar包所存放的目录是
/web/app/
通过history
或者火眼查看历史命令,发现有频繁在/web/app/
下操作,打开该目录下确认是jar包存放的目录
6. 检材1中,监听7000端口的进程对应文件名为
cloud.jar
(方法1)比赛当时我看历史记录有启动jar包的历史,于是挨个java -jar XXX.jar
运行该目录下的jar包,然后用netstat -napt
查看哪个个包开启了7000端口监听,最后排查到了cloud.jar
(方法2)也可使用jd-gui(Github地址)将这几个包反编译查看声明信息,发现cloud.jar配置中有7000端口
7. 检材1中,网站管理后台页面对应的网络端口为
9090
(方法1)当时我是看历史记录,到/web/app/admin
里用npm run dev
指令运行了管理后台,根据提示访问虚拟机的ip地址:9090
端口,发现确实是管理后台
(方法2)可以查看之前用问题2答案解压的检材2,发现其浏览器历史记录有访问过管理后台,其端口为9090
PS:在查看检材2的时候也可以在其虚拟机的D盘发现在检材1历史命令中删除的网站一键启动脚start_web.sh
,可以恢复到检材1的/web/app/下,并使用该脚本sh start_web.sh
运行整个网站项目
(D盘还有其他文件,但是当时并不知道什么用途,到了检材3才发现有用)
8. 检材1中,网站前台页面里给出的APK的下载地址是
https://pan.forensix.cn/f/c45ca511c7f2469090ad/?dl=1
当时我同样也是到/web/app/web
里用npm run dev
指令运行,根据提示访问ip地址:3000
,页面左上角的二维码扫描即可得出答案
9. 检材1中,网站管理后台页面调用的用户表(admin)里的密码字段加密方式为?
md5
(方法1)登录的时候会出现一个请求到http://172.16.80.133:6010/admin/system/employee/googleAuth/sign/in
,我们可以去反编译那几个包搜一下关键词,最后在admin-api.jar里查看到了相关信息,确定是md5加密.
(方法2)反编译admin-api.jar包,查看application.properties配置信息中有md5的key,再关联其他配置确定是md5加密,同时问题10的答案也能出来了
10. 分析检材1,网站管理后台登录密码加密算法中所使用的盐值是
XehGyeyrVgOV4P8Uf70REVpIw3iVNwNs
可参考问题9的方法2
检材二
11. 检材2中,windows账户Web King的登录密码是
135790
12. 检材2中,除检材1以外,还远程连接过哪个IP地址?并用该地址解压检材3
172.16.80.128
用火眼查看到xshell有两个连接,133是检材1的ip,另一个就是我们要的答案
13. 检材2中,powershell中输入的最后一条命令是
ipconfig
PS:这里需要注意,火眼里的系统ssh历史命令其实是误导项(差点踩坑),因为仔细看其实都是linux命令(因为检材2里面还有wsl)
(方法1)最简单粗暴,直接进虚拟机,打开powershell,按向上方向键,即可查看
(方法2)使用火眼或者进虚拟机的C:\Users\Web King\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine目录下,有一个ConsoleHost_history.txt是记录PowerShell的文件,打开即可看到答案
14. 检材2中,下载的涉案网站源代码文件名为
ZTuoExchange_framework-master.zip
通过火眼查看到几条下载记录,然后去github上比对,最后确认是ZTuoExchange_framework-master.zip
15. 检材2中,网站管理后台root账号的密码为
root
同样查看浏览器保存的密码,发现有关后台的账号密码
16. 检材2中,技术员使用的WSL子系统发行版本是?
20.04
直接在powershell里输入wsl -l -v
,即可得到
17. 检材2中,运行的数据库服务版本号是
8.0.30
到wsl里看历史命令,发现装有mysql,启动后查看版本
18. 上述数据库debian-sys-maint用户的初始密码是
ZdQfi7vaXjHZs75M
根据网上查到的信息,知道该用户初始密码会保存在/etc/mysql/debian.cnf
里(wsl映射到windows目录为C:\Users\Web King\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04LTS_79rhkp1fndgsc\LocalState\rootfs\etc\mysql\debian.cnf
)打开即可看到密码
19. 检材3服务器root账号的密码是
h123456
直接可以从检材2中的系统ssh历史命令发现其密码
材料三
20. 检材3中,监听33050端口的程序名为
docker-proxy
打开虚拟机第一件事就是用history
查看历史命令,发现大量docker命令,于是启动docker看看,发现就是docker占用的33050端口
21. 除MySQL外,该网站还依赖以下哪种数据库
redis,mongo
(方法一)其实根据检材1的admin-api.jar中的BOOT-INF.classes.application.properties配置文件,可以找到问题21/22/24三问的答案,位置如下图
22. 检材3中,MySQL数据库root账号的密码是
shhl7001
(方法1)参考上一问解法
(方法2)用history
发现docker-compose.yml
文件出现频率有点高,根据历史命令发现该文件在/data/mysql/下,打开该文件即可得出密码和23题的答案
23. 检材3中,MySQL数据库在容器内部的数据目录为
/var/lib/mysql
参考21,22题解法
24. 涉案网站调用的MySQL数据库名为
b1
参考21题解法
25. 勒索者在数据库中修改了多少个用户的手机号?
3
查看检材3/data/mysql/db
目录下的8eda4cb0b452.log
文件,搜索关键词update
,匹配不多,挨个数,有只有3个
(这里有个坑,登录也会更新数据库信息,如果直接计数,会把那5次登录ip的更新记录也加上了)
26. 勒索者在数据库中删除的用户数量为
28
同样查看8eda4cb0b452.log
文件,搜索关键词delete
,发现28个匹配
27. 还原被破坏的数据库,分析除技术员以外,还有哪个IP地址登录过管理后台网站?用该地址解压检材4
172.16.80.197
我们在初次进入/data/mysql/db
目录下的时候发现并没有检材1中分析出来的数据库b1
,发现检材2的D盘中不仅有b1
数据库文件夹,还有后端数据库的启动脚本start.sh
,美滋滋.
将b1数据库文件恢复到检材3的/data/mysql/db/
路径下,将start.sh
恢复到检材3.
记得给权限,直接将两者chmod -R 777
.
运行start.sh
脚本启动数据库后,使用Navicat连到该数据库(记得数据库docker外部接口是33050,别填错了
登录进去后,发现有个admin_access_log
表,查看发现有两个ip,分别去解压检材4,发现172.16.80.197是答案
28. 还原全部被删改数据,用户id为500的注册会员的HT币钱包地址为
cee631121c2ec9232f3a2f028ad5c89b
来到member_wallet
这个表即可找到
29. 还原全部被删改数据,共有多少名用户的会员等级为'LV3'
164
根据member
表信息推测member_grade_id为用户等级,进行筛选,有158条符合(同时别忘了,还要加之前被删除的用户有没有符合的)
因为表中最后一位id为972,所以删除是从973开始,于是8eda4cb0b452.log前5672行没用了,删掉后,从30行到最后也没用,删除.根据特征搜索关键词0, 3, 0
计数,加上之前的数,便可得到答案164.
30. 还原全部被删改数据,哪些用户ID没有充值记录
318,989
发现member_wallet
表的balance
列是充值金额,使用SELECT * FROM member_wallet WHERE balance = 0
查询记录为0的用户,得出答案
31. 还原全部被删改数据,2022年10月17日总计产生多少笔交易记录?
1000
使用sql语句SELECT * FROM member_transaction WHERE create_time BETWEEN "2022-10-17 00:00:00" AND "2022-10-17 23:59:59"
查询
32. 还原全部被删改数据,该网站中充值的USDT总额为
408228
使用sql语句SELECT SUM(amount) FROM member_transaction
查询
检材四
33. 嫌疑人使用的安卓模拟器软件名称是
夜神模拟器
检材4原本是.npbk
格式文件,搜了一下发现是夜神模拟器的包名,可以使用解压工具将其解压后放入火眼分析
34. 检材4中,“老板”的阿里云账号是
forensixtech1
使用火眼发现微信聊天中出现了答案
35. 检材4中安装的VPN工具的软件名称是
v2Ray
同样火眼可看,同时36题答案也出来了
36. 上述VPN工具中记录的节点IP是
38.68.135.18
37. 检材4中,录屏软件安装时间为
2022/10/19 10:50:27
在应用列表中按安装时间排序,会发现一个包名com.jiadi.luping
,它的安装时间便是
38. 上述录屏软件中名为“s_20221019105129”的录像,在模拟器存储中对应的原始文件名为
0c2f5dd4a9bc6f34873fb3c0ee9b762b98e8c46626410be7191b11710117a12d
到该应用路径分区4\data\com.jiadi.luping\databases
,发现有几个数据库,其中在record.db
中找到了视频文件的路径信息
39. 上述录屏软件登录的手机号是
18645091802
将record.db
数据库和其缓存文件record.db-wal
使用sqlitestudio打开即可看到
40. 检材4中,发送勒索邮件的邮箱地址为
在材料4的邮箱中可以查到发件人地址
检材五
41. 分析加密程序,编译该加密程序使用的语言是
python
使用ida查询发现很多py关键词,于是推断是使用的python
42. 分析加密程序,它会加密哪些扩展名的文件?
txt.jpg.docx.xls
encrypt_file.exe
先使用pyinstxtractor.py提取.
然后使用uncompyle6反编译encrypt_file_1.pyc
,输出后复制出来,发现其代码会对txt.jpg.docx.xls格式进行加密
43. 分析加密程序,是通过什么算法对文件进行加密的?
异或
根据刚才的代码,我们会发现其代码逻辑是使用密钥进行异或加密
44. 分析加密程序,其使用的非对称加密方式公钥后5位为?
u+w==
45. 被加密文档中,FLAG1的值是(FLAG为8位字符串,如“FLAG9:QWERT123”)
TREFWGFS
同理,反编译decrypt_file.exe
,其代码明晃晃就把密码明文显示出来了(4008003721),再运行decrypt_file.exe
用这密码将数据下载地址.docx_encrypted
进行解密,打开文档就出现flag了
46. 恶意APK程序的包名为
cn.forensix.changancup
apk包可以通过检材1网站页面的二维码下载,放入雷电app分析工具分析即可
47. APK调用的权限包括
READ_EXTERNAL_STORAGE;WRITE_EXTERNAL_STORAGE;
48. 解锁第一关所使用的FLAG2值为(FLAG为8位字符串,如需在apk中输入FLAG,请输入完整内容,如输入"FLAG9:QWERT123")
MATSFRKG
先连模拟器进行一键脱壳
后再用jadx反编译
然后搜索关键词flag2
(记得勾选代码搜索和忽略大小写),找到相关位置
flag2就明文存放在这里FLAG2:MATSFRKG
,复制到模拟器中,顺利通关
49. 解锁第二关所使用的FLAG3值为(FLAG为8位字符串,如需在apk中输入FLAG,请输入完整内容,如输入"FLAG9:QWERT123")
TDQ2UWP9
50. 解锁第三关所需的KEY值由ASCII可显示字符组成,请请分析获取该KEY值
a_asd./1imc2)dd1234]_+=+
这个我其实不会,不过感谢当时复盘直播的时候有个大佬(具体名字给忘了,十分抱歉,大佬若看见可以回复一下,我表明出处)在留言框里发了一个c++的爆破程序,分享给大家
#include <iostream>
#include <string>
#include <thread>
#include <cstdint>
#include <map>
#include <vector>
unsigned int calc(unsigned int i)
{
auto p = reinterpret_cast<unsigned char*>(&i);
unsigned int ret = 0;
ret = (long)(p[0] << 16);
ret = ret | ((long)(p[1] << '\b'));
ret = ret | ((long)(p[2] << 24));
ret = ((long)p[3]) | ret;
return ret;
}
std::pair<int64_t, int64_t> OooO(int64_t j, int64_t j2) {
if (j == 0) {
return { 0, 1 };
}
auto ret = OooO(j2 % j, j);
return { ((j2 / j) * ret.first) + ret.second, ret.first };
}
void run_range(unsigned int start, unsigned int end)
{
static const uint32_t oooooo[] = { 1197727163, 1106668241, 312918615, 1828680913, 1668105995, 1728985987 };
for (unsigned int i = start; i < end; ++i)
{
auto ret = calc(i);
auto ret2 = ((OooO(ret, 4294967296L).first % 4294967296L) + 4294967296L) % 4294967296L;
for (int j = 0; j < 6; ++j)
{
if (oooooo[j] == ret2)
{
std::cout << j << ":" << oooooo[j] << ":" << std::string(reinterpret_cast<const char*>(&i), 4) << std::endl;
break;
}
}
}
}
int main()
{
std::cout << "hello" << std::endl;
std::vector<std::thread> thds;
for (uint32_t i = 0; i < 16; ++i)
{
auto start = 0x10000000 * i - 1;
auto end = 0x10000000 * (i + 1) - 1;
thds.emplace_back([start, end] {run_range(start, end); });
}
for (auto& thd : thds)
{
thd.join();
}
return 0;
}
运行程序后会有好几段输出,根据每行第一个字符的顺序把可见ascii码拼凑起来就是flag3了a_asd./1imc2)dd1234]_+=+
结语
今年的题目个人感觉比往年难不少,特别是最后程序逆向方面.不过依旧玩的很开心,祝长安杯越办越好!?
当然如果有什么问题,欢迎大家在下方评论区友好交流!!
Comments NOTHING