22年长安杯电子数据取证复盘
最后更新时间:
写在前面
最终排名 81/681 二等奖
第一次正式参加取证比赛,和队友配合不当,多有遗憾。重新复盘一下整个经过,梳理一下取证思路。
案情背景
某地警方接到受害人报案称其在某虚拟币交易网站遭遇诈骗,该网站号称使用“USTD 币”购买所谓的“HT 币”,受害人充值后不但“HT币”无法提现、交易,而且手机还被恶意软件锁定勒索。警方根据受害人提供的虚拟币交易网站调取了对应的服务器镜像并对案件展开侦查。
检材一部分
检材1:根据报案人提供的网站域名和IP,警方调取了对应的服务器镜像“检材1”,分析掌握的检材回答下列问题
ip地址:172.16.80.133
检材1的SHA256值为
将检材1.e01文件拖入火眼当中并选择计算哈希,算法为SHA256
9E48BB2CAE5C1D93BAF572E3646D2ECD26080B70413DC7DC4131F88289F49E34
PS:这次长安杯两个服务器检材当中历史记录包含了众多有用信息,所以挂载之后第一时间一定要先查看一下历史记录看看都有过什么操作,大致推断一下这个检材是干什么用的
我们将
~/.bash_history
存放历史记录的文件导出,查看可以得到一些关于网站的信息
(1)在
/web/app
目录下曾经启动过jar包,也就是有java应用在后台运行过什么是nohup命令?
nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。
(2)在
/web/app/admin
目录下,另有npm启动命令。还可以看到一系列vue文件,大致可以推断出这里有网站,且以前端VUE后端java某个框架为架构(在比赛时还以为是nodejs搭建的,一直在找后端代码在哪里…)(3)在比赛时没注意这里有一个启动脚本,可以一键启动网站的,便于我们重构网站,但是它给删了。
分析检材1,搭建该服务器的技术员IP地址是多少?用该地址解压检材2
当时的思路是,首先先查看了一下检材一镜像对应的ip
1
ipconfig
得到
172.16.80.133
搭建该服务器的技术员可能是远程连接上来的,我们看看本机开启了哪些服务
1
netstat -anpt
可以看到端口22开启了ssh服务,所以可以直接连上来。通过last验证
于是得到了检材2的解压密码 172.16.80.100
检材1中,操作系统发行版本号为
查看文件
/etc/centos-release
即可得到7.5.1804
检材1系统中,网卡绑定的静态IP地址为
这里我当时是查看网卡里面写的,位于
/etc/sysconfig/network-scripts
查看
ifcfg-ens33
即可得到网卡配置信息172.16.80.133
检材1中,网站jar包所存放的目录是
这个我们在历史记录里已经确定了,位于
/web/app
下jar包分析
检材1中,监听7000端口的进程对应文件名为
方法1:当时一个个查看了一下jar包中的配置文件,最终定位到
cloud.jar
从jar包的启动文件可以看出是springboot框架,配置文件在
application.properties
方法2:最快速的方法其实就是将jar包全启动起来,然后查看哪个监听的端口是7000就好了
检材1中,网站管理后台页面调用的用户表(admin)里的密码字段加密方式为?
分析检材1,网站管理后台登录密码加密算法中所使用的盐值是?
后端定位jar包到admin-api.jar
,查看配置文件。这里能看到数据库的配置(mysql、mongodb、redis)
然后发现了可疑的md5 key,推断加密算法可能是md5
因为还没重构出网站,所以我当时还去看了前端代码。结合前端接口我们可以进一步定位controller验证后台登录加密算法
位于/controller/system/EmployeeController#doLogin()
看下md5Key
是什么,验证猜想正确
前端部分
检材1中,网站前台页面里给出的APK的下载地址是
前台页面的前端在
/web/app/web
下,其实历史记录中给出了如何跑起来,当时对前后端分离架构还不是很理解。去盲翻前端页面,还真在src/App.vue
下找到了一个apk链接,但实际上已经是注释掉了,”二维码链接已修改”于是启动测试一下
1
npm run dev
访问虚拟机3000端口,可以在得到一张二维码图片,扫描即可得到二维码中的apk下载地址
https://pan.forensix.cn/f/c45ca511c7f2469090ad/?dl=1
得到一个apk文件我们先保存下来
检材1中,网站管理后台页面对应的网络端口为
原来是问的前端启动的端口,后端是在6010(admin-api.jar)
对于后台的前端我们同样测试一下
1
npm run dev
访问虚拟机9090端口,可以验证
比赛的时候被坑了,我在config配置里看到的是8090。这里是因为npm启动时是直接启动的web-pack打包文件,而非源码(这中间可能会有修改的地方)
或者在检材2中我们可以在浏览器浏览记录里找到后台登录时对应的访问端口
检材2部分
检材2:根据IP地址落地及后续侦查,抓获了搭建网站的技术员,扣押了其个人电脑并制作镜像“检材2”,分析所有掌握的检材回答下列问题
ip地址:172.16.80.100
检材2中,windows账户Web King的登录密码是
火眼仿真看一下账户信息
135790
检材2中,除检材1以外,还远程连接过哪个IP地址?并用该地址解压检材3
xshell中可以查看连接会话记录,里面存在两条,另一条就是检材3对应的ip地址
172.16.80.133
检材2中,powershell中输入的最后一条命令是
这里存在一个干扰项,就是在火眼分析中的系统SSH 历史输入命令。实际上,仔细看下都是linux命令,对应的是windows下wsl子系统中的命令历史记录,而非powershell中的历史记录,需要特别辨析。
powershell的历史记录位于分区6\Users\Web King\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine
下
查看便可得到 ipconfig
还有一种更直接的方法就是火眼仿真中直接在powershell里按方向键上即可直接得到最后一条历史命令
检材2中,下载的涉案网站源代码文件名为
在Chrome浏览器的下载历史记录当中有对应几个zip包,以及对应的下载来源
我们之前在检材一中/web/app/admin
和/web/app/web
下分别有一个README.md文件,里面对应着github项目下的README.md,通过比对项目https://github.com/sengeiou/ZTuoExchange_framework
,可以定位文件就是ZTuoExchange_framework-master.zip
同时在github上我们也找到了网站的架构图
检材2中,网站管理后台root账号的密码为
在登录之后有保存的密码遗留 密码即root
检材2中,技术员使用的WSL子系统发行版本是
静态分析方法:WSL位置一般在
C:\Users\xxx\AppData\Local\Packages\CanonicalGroupLimited.xxx_79rhkp1fndgsc\LocalState\rootfs
下,实际查看会发现有两个版本,其中20.04版本明显文件数量有多很多并且在20.04版本下的
rootfs
根文件系统中可以找到清晰的linux目录结构,而在22.04中是不存在的,也就是并未实际使用。动态仿真方法:能直观的看到就直观看,打开wsl就能看到
检材2中,运行的数据库服务版本号是
在wsl历史命令当中可以看到有对mysql数据库的操作
在火眼数据库解析当中可以看到8.0.30
上述数据库debian-sys-maint用户的初始密码是
首先什么是
debian-sys-maint
用户?1
正如它的字面意思(Debian System Matainence),Debian系统对MySQL维护用的,你可以理解为通过系统的某个“非常规”程序对Mysql进行备份恢复等行为时,改程序所使用的登录Mysql的账户。 ——你应该可以理解吧?你手工维护的时候同样需要用某账户登入Mysql再操作的——系统的程序也一样需要这么做,只是它通过这个账户免去了你手工操作的“麻烦”,加深了系统复杂度,让你更加难以理解mysql和Linux的工作原理。 原则上Linux系统本身与MySQL无需任何直接或间接的接触,你大可以删除,维护时使用网上大家最常用的方法来维护(这类方法可以适用于安装在任何系统上的Mysql,而此账户所对应的“便捷”方法——正如他的名字一样,仅适用于Debian)
在windows中我们是找不到mysql相关的服务的,因为通过历史记录可以看到它是运行在wsl子系统当中
它的默认密码存放在wsl子系统的
/etc/mysql/debian.cnf
中查看可知初始密码ZdQfi7vaXjHZs75M
检材3服务器root账号的密码是
在wsl历史记录当中可以看到本机有ssh连接检材3的信息,密码就是 h123456
其中我们再浏览一下本机可以在D盘找到一些脚本文件,这里已经可以看到在检材1中被删掉的start_web.sh,有助于我们重构网站,留住备份。(团队比赛时一定要和队友说明!)
检材三部分
检材3:根据网站前端和技术员个人电脑上的线索,发现了网站后端所在的服务器IP并再次调证取得“检材3”,分析所有掌握的检材回答下列问题
ip地址:172.16.80.128
检材仿真之后,首先第一时间还是浏览历史记录
(1)简单看下有zookeeper服务
(2)有docker服务,并且使用了docker-compose插件
(3) 在/web
目录下存在启动脚本start.sh
,这个我们在检材2里也找到了。同检材1一样,这个启动脚本也被删掉了
(4)docker启动了mysql服务
检材3中,监听33050端口的程序名(program name)为
我们先启动docker服务
1
service docker start
然后查看网络服务监听状态
1
netstat -lnpt
可知程序名为docker-proxy
除MySQL外,该网站还依赖以下哪种数据库
在历史记录当中我们是可以看到还有redis和mongo
当然结合检材1的java配置以及我们在github上找到的架构图都是可以判断出的
检材3中,MySQL数据库root账号的密码是
方法1:在检材1的
admin-api.jar
配置文件当中,我们是看到了mysql的连接配置信息,直接得到shhl7001
方法2:查看docker-compose配置文件
通过历史记录看到位于目录
/data/mysql/
下检材3中,MySQL数据库在容器内部的数据目录为
从上一题的docker-compose.yml配置文件当中可以看到外部数据映射到了
/var/lib/mysql
目录下或者可以通过查看docker配置判断
1
2
3docker ps
# 8eda4cb0b452 mysql:5.7.32
docker inspect 8eda4cb0b452涉案网站调用的MySQL数据库名为
同样在检材1的
admin-api.jar
配置文件中jdbcUrl为spring.datasource.url=jdbc:mysql://172.16.80.128:33050/b1?characterEncoding=utf-8
对应数据库名为b1
勒索者在数据库中修改了多少个用户的手机号?
我们直接在容器外部查看相应日志,对应目录
/data/mysql/db
首先我们找到了8eda4cb0b452.log日志文件,其次发现b1数据库被删掉了,我们把从检材2中找到的b1文件夹复原
然后打开日志文件,可以看到大量的sql执行语句。通过关键词
update
可以查看到修改用户的相关信息但是有个坑点在于用户登录时也会出现update数据的操作,需要排除
所以总共有效数据为3条
勒索者在数据库中删除的用户数量为
同理,全局搜索
delete
关键词,总共28条数据
还原被破坏的数据库,分析除技术员以外,还有哪个IP地址登录过管理后台网站?用该地址解压检材4
接下来就是需要网站重构了,我们将检材2中的启动脚本和数据库放到对应的检材目录中
在检材中,更新docker内的数据库
1
docker-compose up -d
在
/web
下,首先赋予启动脚本执行权限1
chmod 777 start.sh
然后启动脚本
1
sh start.sh
然后在检材1中
/web/app
下相同操作访问网站验证,重构成功!
接下来就是连接数据库查看,在admin表中可以看到
172.16.80.197
还原全部被删改数据,用户id为500的注册会员的HT币钱包地址为
在
member_wallet
表中,可以看到地址cee631121c2ec9232f3a2f028ad5c89b还原全部被删改数据,共有多少名用户的会员等级为’LV3’
首先定位会员等级的字段在哪里
可以看到在
member_grade
表中,等级分别对应着同数字的id在
member
表中存在字段member_grade_id
,应该就是与之对应的这块需要注意之前在日志中看到用户数据有28条是被删除了的,所以我们需要将对应的数据恢复
数据表中显示最后一条数据id是972,因此我们从973条数据开始恢复
然后在表中去查询即可
1 |
|
还原全部被删改数据,哪些用户ID没有充值记录
首先定位充值记录信息在
member_transaction
表中可以看到交易记录联合
member
表,我们就可以定位哪些用户ID没有充值记录1
select member.id from member where member.id not in (select distinct (member_transaction.member_id) from member_transaction);
得到318 989
还原全部被删改数据,2022年10月17日总计产生多少笔交易记录?
还是在
member_transaction
表,我们的交易时间对应的字段是create_time
1
select count(*) from member_transaction where create_time like '%2022-10-17%';
共计1000条
还原全部被删改数据,该网站中充值的USDT总额为
还是在
member_transaction
表,我们计算一下总额即可,对应amount
字段1
select SUM(amount) from member_transaction;
也就是408228
检材四部分
检材4.根据前期侦查分析,通过技术手段找到了幕后老板,并对其使用的安卓模拟器“检材4”进行了固定。分析所有掌握的检材,回答下列问题
成功解压后得到了一个.npak格式的文件
经过百度查询可知是V6.0.2.0版本夜神模拟器的备份文件,通过解压可以查看其中的内置备份文件,并存在vmdk后缀文件
嫌疑人使用的安卓模拟器软件名称是
夜神模拟器
检材4中,“老板”的阿里云账号是
在微信聊天记录里可以找到,往后看我们也能了解到前三个检材背后的剧情,这天聊着聊着就不对劲了。。。
检材4中安装的VPN工具的软件名称是
同样在应用列表可以直接看到 v2rayNG
上述VPN工具中记录的节点IP是
38.68.135.18
检材4中,录屏软件安装时间为
在应用列表中出现了两个无名软件,其中一个的包名十分可疑
com.jiadi.luping
为了求证,我们可以在
分区4\data\com.jiadi.luping\databases
下查看其数据库信息,定位record.db
,同时我们看到还存在wal
和shm
后缀的文件,这里要简单提到sqlite预写日志的工作方式原始内容保留在数据库文件中,而更改将附加到单独的WAL文件中。甲COMMIT当指示一个提交一个特殊的记录被追加到WAL发生。因此,即使不写入原始数据库也可以进行COMMIT,这允许读者在更改同时提交到WAL的同时继续从原始未更改的数据库进行操作。可以将多个事务附加到单个WAL文件的末尾。
因此如果我们要浏览完整的数据信息,需要同时将这三个文件在同一个目录当中再去打开数据库文件
可以看到里面确实存放着录屏录像的一些文件
回到本题,安装时间即2022/10/19 10:50:27
上述录屏软件中名为“s_20221019105129”的录像,在模拟器存储中对应的原始文件名为
在上面
record.db
数据库文件的RecordFile
表中可以找到记录信息0c2f5dd4a9bc6f34873fb3c0ee9b762b98e8c46626410be7191b11710117a12d
上述录屏软件登录的手机号是
在
AccountInfo
表中的mobile字段即登录的手机号 18645091802检材4中,发送勒索邮件的邮箱地址为
在比赛时队友写成接收地址了。。一定要细心审题
在QQ邮箱的收件箱中可以看到两封勒索邮件
skterran@163.com
EXE部分
分析所有掌握的检材,找到勒索邮件中被加密的文档和对应的加/解密程序,并回答下列问题
在检材二的D盘存在两个可疑文件,其中一个是加密文档,另一个是解密程序,与第二封邮件内容相对应
分析加密程序,编译该加密程序使用的语言是
使用exeinfope查看exe发现程序是pyinstaller生成的可执行文件,于是得出编译该加密程序使用的语言是python
分析加密程序,它会加密哪些扩展名的文件?
阅读代码即可发现在run_finall函数中会对
.txt
,.jpg
,.xls
,.docx
四种文件进行加密分析加密程序,是通过什么算法对文件进行加密的?
阅读代码即可发现在run_finall函数中最后调用了XORCBC类的encrypt方法进行了加密
而该encrypt方法对数据进行了异或运算
分析加密程序,其使用的非对称加密方式公钥后5位为?
同样可以在代码中发现publickey如下
1
pubkey = '-----BEGIN PUBLIC KEY-----\nMIIBIzANBgkqhkiG9w0BAQEFAAOCARAAMIIBCwKCAQEAx5JF4elVDBaakgGeDSxI\nCO1LyyZ6B2TgR4DNYiQoB1zAyWPDwektaCfnvNeHURBrw++HvbuNMoQNdOJNZZVo\nbHVZh+rCI4MwAh+EBFUeT8Dzja4ZlU9E7jufm69TQS0PSseIiU/4Byd2i9BvIbRn\nHLFZvi/VXphGeW0qVeHkQ3Ll6hJ2fUGhTsuGLc1XXHfiZ4RbJY/AMnjYPy9CaYzi\nSOT4PCf/O12Kuu9ZklsIAihRPl10SmM4IRnVhZYYpXedAyTcYCuUiI4c37F5GAhz\nRDFn9IQ6YQRjlLjuOX8WB6H4NbnKX/kd0GsQP3Zbogazj/z7OM0Y3rv3T8mtF6/I\nkwIEHoau+w==\n-----END PUBLIC KEY-----\n'
被加密文档中,FLAG1的值是
同样对decrypt_file.exe进行解包与反编译后发现解密需要的密码明文写在了程序中
执行decrypt_file.exe并输入密码
得到解密后的文档,FLAG就在文档中
APK部分
分析所有掌握的检材,找到报案人描述的加密勒索apk程序,分析并回答下列问题
加密勒索apk程序我们在检材1的二维码链接中可以下载得到
恶意APK程序的包名为
直接利用雷电APP智能分析就能查看
cn.forensix.changancup
APK调用的权限包括
在静态权限当中可以查看
解锁第一关所使用的FLAG2值为
雷电模拟器安装上apk,打开软件查看。很好,模拟器被锁了。
将其脱壳,反编译。然后查看代码,先全局搜索一下关键词
FLAG
大致看下逻辑,其中OnClick函数这里有个明显的字符串对比,trim2是我们的输入
解锁第二关所使用的FLAG3值为
接上题,注意到
追踪App.OooO0O0.OooO0oo,发现在这里被初始化
尝试用frida进行hook,模拟器先把frida-server开起来(注意不要给ZTuoExchange root权限),跑脚本frida -U -l hook.js "ZTuoExchange"
1 |
|
- 解锁第三关所需的KEY值由ASCII可显示字符组成,请请分析获取该KEY值
关键的验证
查看该函数声明,要求字符串长度为24,4个一组,分成6组操作。其中try块里会触发unused异常,真正的验证逻辑在catch块中。可以把需要用到的操作拿出来,每4个进行爆破。
1 |
|
答案:a_asd./1imc2)dd1234]_+=+