第四届“长安杯”电子数据取证竞赛 WriteUp
2022-11-18 19:54:41 Author: 山警网络空间安全实验室(查看原文) 阅读量:13 收藏

竞赛案情

案件情况

某地警方接到受害人报案称其在某虚拟币交易网站遭遇诈骗,该网站号称使用“USTD 币”购买所谓的“HT 币”,受害人充值后不但“HT 币”无法提现、交易,而且手机还被恶意软件锁定勒索。警方根据受害人提供的虚拟币交易网站调取了对应的服务器镜像并对案件展开侦查。

考试方向

  1. 计算机取证分析;
  2. 服务器/网站取证分析;
  3. 手机取证分析;
  4. 程序功能分析。

赛题镜像

链接: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%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_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中,发送勒索邮件的邮箱地址为

答案:[email protected]

分析加密程序,编译该加密程序使用的语言是

答案: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 = {11977271631106668241312918615182868091316681059951728985987};

    private long[] OooO(long j, long j2) {
        if (j == 0) {
            return new long[]{01};
        }
        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 = {11977270431106668192312918557182868084816681058731728985862};
            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改改虚拟网卡,只要知道检材二中的启动脚本可以一键搭建。


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5Njc1OTYyNA==&mid=2450784409&idx=1&sn=c31556e01b32736546cc3d64b5ccdd15&chksm=b104f1be867378a8fb002e2a8412bedade80ccdf6fc10645ec90973b062363ce94ca60c0ca97#rd
如有侵权请联系:admin#unsafe.sh