1. 加载服务器磁盘,计算磁盘源盘的SHA256哈希值。
  2. 提取“password.txt”文件,并计算文件的SHA256哈希值。
  3. 服务器的操作系统版本,网站数据所在分区的文件系统类型。
  4. 服务器的“root”用户在终端中最后输入运行的命令(除关机命令外)。
  5. “药品直销网”网站域名。
  6. 网站数据库的类型和版本号。
  7. 固定网站“通知”页面内容。
  8. 网站管理员admin的登录口令。
  9. 网站管理员admin最后登录的IP地址。
  10. 网站中“坐标江西”主帖的点击次数。
  11. 网站中类型为“普通用户”的会员数量、投资总积分、投资总金额。
  12. 将网站的全部会员(含管理员)的会员ID、用户名、推荐人用户名、姓名、手机号、证件号、会员类型、注册时间、投资金额列表导出至Excel表格中。
  13. 使用同一证件号注册会员账号数量最多的会员姓名,以及该会员的全部账号的投资总金额。
  14. 按照推荐人关系,以会员admin为第1层计,会员lkj8在网站会员层级中位于第几层,其上级会员和下级会员各占据了多少层;以图形或其它直观的形式展示该会员的上下级组织层级结构。
  15. 统计网站中下级会员账号数量大于30个且下级会员账号多于3层的会员账号数量,统计上述会员账号按照证件号去重后的数量。

加载服务器磁盘,计算磁盘源盘的SHA256哈希值。

方法一

Windows下打开powershell或cmd,输入certutil -hashfile xxx\AFSPT.vmdk SHA256(xxx为文件的路径),等待计算完成即可。

方法二(已安装7Z)

直接右键文件→CRC SHA→SHA256,等待计算完成即可。

提取“password.txt”文件,并计算文件的SHA256哈希值。

使用取证大师挂载vmdk镜像磁盘,搜索password.txt,点击跳转到源文件后,右键导出此文件。计算SHA256值同第一题。

服务器的操作系统版本,网站数据所在分区的文件系统类型。

uname -a查看系统版本

1
Linux localhost.localdomain 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

网站使用宝塔系统,数据保存在www/wwwroot目录下。www目录属于分区1[C],从取证大师看是XFS系统。

服务器的“root”用户在终端中最后输入运行的命令(除关机命令外)。

SSH连接vmdk后,输入cat /root/ .bash_history,查询bash的历史命令。
除去最后一个shutdown外,倒数第二个命令就是答案:systemctl list-units --type=service > services.log

“药品直销网”网站域名。

输入netstat -antp,查看端口状态。

根据80、888、3306端口,初步判断是Nginx+MySQL组建的网站。
接下来查看nginx.conf(Nginx服务器配置文件)。可以在取证软件里面看,也可以导出用自己舒服的软件看(Sublime真香)。

此服务端口是888,挂载的宝塔系统,不是传销网站。
通过include /www/server/panel/vhost/nginx/*.conf,查看所引用的其他文件conf,最终在ypzxw.local.conf文件中发现域名:ypzxw.local

网站数据库的类型和版本号。

通过8888端口登陆宝塔系统(提前用宝塔命令修改密码),查看到数据库用户名ypzxw和密码mK4JUOaycb9tF7nI,回到控制台输入mysql -uypzxw -pmK4JUOaycb9tF7nI回车,显示连接成功。

另一种方法是找到数据库对应的设置文件db_settings.php,查找userpassword等关键信息。

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
db_settings.php
<?php
$db_settings['host'] = 'localhost';
$db_settings['user'] = 'ypzxw';
$db_settings['password'] = 'mK4JUOaycb9tF7nI';
$db_settings['database'] = 'ypzxw';
$db_settings['settings_table'] = 'm_settings';
$db_settings['forum_table'] = 'm_entries';
$db_settings['category_table'] = 'm_categories';
$db_settings['userdata_table'] = 'm_userdata';
$db_settings['userinfo_table'] = 'm_userinfo';
$db_settings['smilies_table'] = 'm_smilies';
$db_settings['pages_table'] = 'm_pages';
$db_settings['banlists_table'] = 'm_banlists';
$db_settings['useronline_table'] = 'm_useronline';
$db_settings['login_control_table'] = 'm_logincontrol';
$db_settings['entry_cache_table'] = 'm_entries_cache';
$db_settings['userdata_cache_table'] = 'm_userdata_cache';
$db_settings['bookmark_table'] = 'm_bookmarks';
$db_settings['read_status_table'] = 'm_read_entries';
$db_settings['temp_infos_table'] = 'm_temp_infos';
$db_settings['tags_table'] = 'm_tags';
$db_settings['bookmark_tags_table'] = 'm_bookmark_tags';
$db_settings['entry_tags_table'] = 'm_entry_tags';
$db_settings['subscriptions_table'] = 'm_subscriptions';
?>

成功连接数据库之后,输入select version();获取版本信息:

1
2
3
4
5
6
7
mysql> select version();
+------------+
| version() |
+------------+
| 5.6.37-log |
+------------+
1 row in set (0.00 sec)

固定网站“通知”页面内容。

改本地的host文件:192.168.65.130 ypzxw.loacl访问网站(第一次进会卡十秒左右)。打开网站,右上角通知页面点进去,保存HTML。

网站管理员admin的登录口令。

这道题有不明白的地方,讲解视频在1:37:39开始讲index.inc.php

注意在做第八题之前先做第九题,避免admin最后登录的IP被覆盖(当然,知道了密码也可以不登录,不过最好还是验证一下以免出错)。

通过查看网站根目录,默认文档是index.php,获取登录口令,就寻找与登录相关的代码段。
寻找与login相关的代码段:

1
2
3
4
5
6
7
8
9
10
11
if ($settings['access_for_users_only'] == 1 && empty($_SESSION[$settings['session_prefix'] . 'user_id'])) {
if (empty($mode) || $mode != 'account_locked' && $mode != 'register' && $mode != 'page' && $mode != 'js_defaults')
$mode = 'login';
}
if ($settings['forum_enabled'] != 1 && (empty($_SESSION[$settings['session_prefix'] . 'user_type']) || $_SESSION[$settings['session_prefix'] . 'user_type'] < 2)) {
if (empty($mode) || $mode != 'disabled' && $mode != 'rss' && $mode != 'login' && $mode != 'js_defaults')
$mode = 'disabled';

case 'login':
include('includes/login.inc.php');
if ($mode != 'login' && (!isset($_SESSION[$settings['session_prefix'] . 'last_visited_uri']) || $_SESSION[$settings['session_prefix'] . 'last_visited_uri'] != $currentURI))

单纯看index.php看不出太多有价值的东西,此时注意到includes/login.inc.php,那就去看看文件里面的东西。
重点在do_login这一部分:

1
2
3
4
5
6
7
if (mysqli_num_rows($result) == 1) {
$feld = mysqli_fetch_array($result);
if (is_pw_correct($request_userpw, $feld['user_pw'])) {
if (trim($feld["activate_code"]) != '') {
header("location: index.php?mode=login&login_message=account_not_activated");
exit;
}

其中,is_pw_correct函数是新定义的,定义的位置在functions.inc.php中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function is_pw_correct($pw,$hash)
{
if(strlen($hash)==50) // salted sha1 hash with salt
{
$salted_hash = substr($hash,0,40);
$salt = substr($hash,40,10);
if(sha1($pw.$salt)==$salted_hash) return true;
else return false;
}
elseif(strlen($hash)==32) // md5 hash generated in an older version
{
if($hash == md5($pw)) return true;
else return false;
}
else return false;
}

接下来分析这段代码:
前半段:140位哈希数赋值给salted_hash,4150位赋值给salt,如果明文密码.salted_hash经过哈希加密后的值=salt,验证通过。
后半段:如果哈希密码长度是32位,那么直接计算明文密码的MD5值与密文匹配,符合则通过。任何字符串的MD5值必定是32位,所以这里是有留了一个后门,进入后台数据库把原密码成某明文密码的MD5值,然后前台输入明文密码,登陆成功。

取证题不是CTF,不是说登录进去就行,而是必须要获取到admin管理员的密码。
回想第二题的password.txt,与其盲目爆破,不如利用这个当做字典进行爆破。

1
2
3
4
5
6
7
import hashlib
with open(`password.txt`, `r`) as f:
pw list = [line.rstrip(`\n`) for line in f]
for pw in pw list:
str = pw + `a9a8e7bc78`
dk = hashlib.sha1(str.encode(`utf-8`))
if dk.hexdigest() == `ea536bb7d8e51acc92f280fdea7798f21819dd13a9a8e7bc78`

最后爆破出来密码是:kkl4Ib

网站管理员admin最后登录的IP地址。

在网探中连接数据库,打开m_userdata表中的数据,第一行可以看到admin用户最后一次登陆的IP是192.168.112.242。或者进入宝塔系统的控制面板查看(前提需要更改宝塔密码)。

讲解视频中关于宝塔系统用户密码的知识点讲错了(1:59:37),bt default命令是获取宝塔系统初始默认用户名和密码的指令,后续即使更改了密码也不会改变指令输出内容。

网站中“坐标江西”主帖的点击次数。

使用admin账户登陆网站,出现所有帖子的内容,往下翻找到题目为坐标江西的帖子,点进去查看右边的阅读次数:

可以看到右边的阅读次数是21次,除去自己点进去的那一次,其原来的点击次数是20次。

网站中类型为“普通用户”的会员数量、投资总积分、投资总金额。

先看第十二题,因为第十二题是第十一题的基础工作。

接着第十二题,拿到Excel表格之后,筛选普通用户的个数,表格下边会有一行显示:在3656条记录中找到3378个。所以说普通用户的会员数量是3378。
对投资金额一栏求和,得到投资总金额:17140000。
对于投资总积分这一项,表中没有这类数据。回到网站数据库中寻找m_userinfo这个表,选择CSV for MS Excel将表中数据导出,用十二题相同方法处理CSV文件。之后筛选出普通用户,计算投资积分栏的和,就是投资总积分:137120000。

将网站的全部会员(含管理员)的会员ID、用户名、推荐人用户名、姓名、手机号、证件号、会员类型、注册时间、投资金额列表导出至Excel表格中。

使用网镜打开网站并登录,点击网站右上角管理区,然后点击会员管理,看到所有用户的相关信息的表格。

点击右上角绿色的拓展应用,选择自由固定,此时右上角的拓展栏中多出一只手的拓展应用。

点击批处理模式→提取CSV→一键检测表格,然后翻到表格下方,在翻页按钮处选择设置为下一页,等待提取出CSV文件即可。
接下来用EXCEL表将CSV导入:新建EXCEL→数据→从文本/CSV→选择文件→分隔符选逗号,导入。

导入之后把含有ID那一栏的数据筛选掉,只留下存有数据的栏。

此时导入Excel表格的任务就完成了。

使用同一证件号注册会员账号数量最多的会员姓名,以及该会员的全部账号的投资总金额。

回到十二题提取出的表,选择插入→数据透视表,选择证件号一栏,在右边把表项拖入行和值。

把生成的数据排序一下,查到次数最多的证件号是:130133196512251495,此证件号对应姓名:焦程翀。之后筛选计算此人投资总金额:118750。

按照推荐人关系,以会员admin为第1层计,会员lkj8在网站会员层级中位于第几层,其上级会员和下级会员各占据了多少层;以图形或其它直观的形式展示该会员的上下级组织层级结构。

统计网站中下级会员账号数量大于30个且下级会员账号多于3层的会员账号数量,统计上述会员账号按照证件号去重后的数量。