案情背景

接群众举报,网站“www.kkzjc.com”可能涉嫌非法交易,警方调取了该网站的云服务器镜像(检材1.DD),请对检材1进行分析,获取证据,并根据线索解锁更多检材,深入挖掘出更多与案件有关的信息。

Part1

1. 检材 1 的操作系统版本

仿真

image-20221014143425100.png

2. 检材 1 中,操作系统的内核版本

仿真后 uname 查看,或者直接看版本存储文件

uname -a
uname -r
cat /proc/version

image-20221014163801530.png

3. 检材 1 中 LVM 逻辑卷开始的逻辑区块地址(LBA)

fdisk -l

image-20221014164500905.png

4. 检材 1 中网站 "www.kkzjc.com" 对应 Web 服务对外开放的端口

全局搜索关键字

find / -name "*www.kkzjc.com"

image-20221014174332435.png

输出文件内容,一开头就写着监听的端口

cat /etc/nginx/conf.d/www.kkzjc.com

image-20221014174450957.png

5. 检材 1 所在的服务器共绑定了几个对外开放的域名

3个,和上一道题的域名都在一个目录下

image-20221014174631070.png

6. 检材 1 所在服务器的原始IP地址

没思路,看 history,发现服务器有 docker,开启 docker 服务

systemctl start docker
systemctl status docker

image-20221014181155793.png

查看镜像和容器

docker images
docker ps

image-20221014181417783.png

发现有一个正在运行的容器,可以看到这个容器是个 nginx 服务器,而且它的端口映射是把它自己的 80 端口映射到了虚拟机的 8091 端口上,和 第4题 图里 nginx 的代理配置是相同的,可以判断这个网站会经过 nginx 的代理进行转发

进入交互式终端

docker exec -it 08f64376a2e3 /bin/bash

查看历史记录

image-20221014215604486.png

可以看到在 nginx 的配置文件目录下编辑了 hl.conf 这个文件,里面就有 nginx 服务器的代理转发信息

image-20221014221208241.png

不过这个是 第8题 的答案,本题的答案见 第9题

7. 远程登录检材 1 使用的 IP 地址

last 命令,从下往上时间顺序

image-20221014180535991.png

正确的地址能解压检材2,试一下就行了(192.168.99.222

8. 反向代理 "www.kkzjc.com" 转发的后台 IP 地址

第6题 的分析,实际上在服务器中 nginx 配置文件目录下的三个网站转发的后台网站的 IP 地址都是同一个(192.168.1.176

9. 题目 7 中的 IP 地址在检材 1 中出现的次数

题干里提到嫌疑人曾用 WEB 方式 远程访问过网站,我们通过上面几道题的分析可以知道,如果访问该网站,那么会经过 nginx 反向代理到另一个 IP 的后台,那么想到可以通过 nginx 服务的日志来判断访问次数

nginx 官方的 docker 把日志输出到 /dev/stdout 和 /dev/stderr 中,可见 github

# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
    && ln -sf /dev/stderr /var/log/nginx/error.log

在默认目录 /var/log/nginx 下也可以看到

image-20221014225129657.png

这种情况下无法直接查看这两个文件中的日志记录,需要通过查看这个 docker 容器的日志,参考文章一文章二

docker logs 08f64376a2e3

利用 grep 命令来统计次数

docker logs 08f64376a2e3 | grep -o "192.168.99.222" | grep -c "192.168.99.222"

-o 显示所有匹配位置
-c 统计匹配行数

image-20221014233310236.png

一共 18 个

当我们在翻日志看有关 192.168.99.222 字段的时候,也可以看到其中 nginx 记录的日志信息

image-20221015000701339.png

例如

192.168.99.222 - - [19/Sep/2020:17:47:14 +0000] "GET /res/img/dr/login/l4.gif HTTP/1.1" 200 417 "http://192.168.99.3:8091/dl" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0" "-"

而 nginx 预定义了名为 combined 日志格式,如果没有明确指定日志格式默认使用该格式:

log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';

可以看到对应了 "$http_referer" 的字段恰好是 "http://192.168.99.3:8091/dl",也就是说这个请求是从 192.168.99.3:8091 这个 IP 转发过来的,而 8091 恰好又是 nginx 映射到宿主机,也就是这个服务器虚拟机上的端口,由此就可以判断出 第6题 的答案是(192.168.99.3

Part1 小结

第一部分的题目都围绕服务器镜像展开,负载均衡、反向代理这种考点在长安杯中也比较常见,20年的题涉及到了 nginx 反向代理,21年的题涉及到了负载均衡服务器,这部分问到了几个 IP 地址,我们需要搞清楚 钓鱼网站后台 IP 地址远程登陆地址服务器原始地址 这几个地址之间的关系与联系:

  • nginx 作为 docker 容器,与宿主机服务器之间存在着端口映射的关系 80/tcp -> 8091
  • 嫌疑人远程登录该服务器,在服务器中留下登录日志记录(192.168.99.222,检材 2 解压密码
  • 受害人访问钓鱼网站,访问请求会通过宿主机服务器(原始地址,8091端口)转发到 nginx 服务器(docker,80端口),并在 nginx 日志中留下记录
  • 三个钓鱼网站都通过 nginx 反向代理把请求转发到相同的后台 IP 地址(192.168.1.176,检材 3 解压密码

Part2

10. 检材 2 的原始磁盘 SHA256 值

image-20221015151031619.png

11. 检材 2 所在计算机的 OS 内部版本号

仿真之后可以看到

image-20221015152350884.png

12. 检材 2 计算机最后一次正常关机时间

取证大师

image-20221015170607201.png

13. 检材 2 中 VMware 的安装时间

答案里给的是安装包的最后运行时间(2020-09-18 17:54

image-20221015172256243.png

用取证大师看到的应该是安装好的时间,所以可能有个时差?

image-20221015171904601.png

14. 检材 2 中,VMware.exe 共计启动过几次

取证大师,应用程序运行痕迹

image-20221015173423381.png

一共六次运行痕迹

image-20221015173447873.png

15. 嫌疑人通过 Web 方式,从检材 2 访问检材 1 的网站,连接的目标端口

Part1 中已经分析过了,在 第9题 的日志分析中,有 "http://192.168.99.3:8091/dl",很显然就是 8091 端口

在检材 2 中看浏览器的记录也能找到 通过 Web 方式 访问的目标网址和端口

image-20221015175222779.png

16. 接 15 题,该端口上运行的进程的程序名称

netstat -anp | grep 8091

-p 获取进程名、进程号以及用户 ID

image-20221015175813550.png

17. 嫌疑人从检材 2 上访问该网站,所使用的域名

搜一搜关键词

image-20221015180158918.png

或者查看 hosts 文件

C:\Windows\System32\drivers\etc

image-20221015181135203.png

18. 检材 2 中嫌疑人使用的微信 ID

电脑里没有微信,但是有苹果手机的备份

image-20221015181644566.png

这是个文件夹,打开之后里面有个 .tar 备份文件,导出后对其进行分析,手机备份用火眼分析效果比较好

image-20221015201208989.png

19. 分析检材 2,嫌疑人为推广其网站,与广告位供应商沟通时使用的通联工具的名称为

几个聊天软件翻一翻聊天记录就能看到

image-20221015201526726.png

20. 分析检材 2,嫌疑人与供应商交易使用的虚拟货币名称

与上一题在相同的聊天记录

image-20221015202508229.png

21. 上述交易的首款地址

上题图里

22. 上述交易的交易时间

见下题

23. 上述交易中支付货币的数量

22、23 题放在一起说,这两个题需要我们上网去找能够查狗狗币交易记录的网站,有个 Dogecoin 浏览器,通过聊天记录里的收款地址就能够查到这笔交易

image-20221015230701016.png

交易时间 2020-09-20 12:12:46,交易数量 4000

24. 检材 2 中嫌疑人使用的虚拟机的加密密码

关于这道题,实际上在手机备份取证的微信聊天记录中有提示

image-20221016142831977.png

在检材 2 的 Chrome 浏览器历史记录中也有提示

image-20221017001437305.png

有关 VMWare 构建虚拟机的文件信息可参考该文章

VMware 对虚拟机进行加密的功能,实际上就是对虚拟机的配置文件 vmx 进行加密,在未加密的时候 vmx 文件中存储的是有关该虚拟机的配置明文信息

image-20221016144257674.png

但检材 2 中的虚拟机 Windows 10 x64 的配置文件 vmx 是经过加密的乱码

\检材2.E01\分区2_本地磁盘[D]:\Users\HL\Documents\Virtual Machines\Windows 10 x64\Windows 10 x64.vmx

把 vmx 文件单独导出来,用 GitHub 上的工具 pyvmx-cracker 爆破即可,字典就用工具自带的字典

image-20221016150032394.png

25. 检材 2 中嫌疑人发送给广告商的邮件附件中图片的 SHA256

检材 2 中并没有邮箱的使用记录,所以想到去上一题中涉及的虚拟机中寻找,方便操作可以把整个虚拟机文件夹导出来,在本机上再导入虚拟机

image-20221016160405975.png

打开虚拟机发现有密码,移除 VMware 对虚拟机的加密后,将 vmdk 文件用仿真工具打开,就可以识别到密码

image-20221016160704368.png

image-20221016160923026.png

实际上这个密码和检材 2 的开机密码是相同的

image-20221017141912701.png

打开虚拟机里有个 Foxmail 应用,在草稿箱里可以找到这个图片附件

image-20221016161823473.png

26. 检材 2 中,嫌疑人给广告商发送广告图片邮件的时间

同样在草稿箱里,可以看到许多邮件主题为【广告】的邮件,都是在 2020-09-20 12:53 这个时间保存的

image-20221016162512514.png

27. 检材 2 中,嫌疑人的邮箱密码

对虚拟机镜像进行取证

image-20221016162750556.png

28. 检材 2 中,嫌疑人登录检材 1 使用的远程管理工具

同样在对虚拟机的取证分析结果中,192.168.99.3 是我们在 Part1 分析出的检材 1 的原始地址

image-20221016162858697.png

29. 检材 2 中,嫌疑人使用上述工具连接服务器的登录密码

见上题图

Part2 小结

这部分围绕检材 2 展开,检材 2 中包含了嫌疑人手机备份和嫌疑人用来远程连接检材 1 服务器的虚拟机镜像,嫌疑人主要的通信行为和远程管理都在手机和虚拟机中完成,宿主机中并未存在太多信息。其中一个比较新颖的考点是对 VMware 加密虚拟机的破解,而且也涉及到一些对虚拟货币的基础了解,虚拟货币这一块也是前几年的热门话题,也经常出现在各种网络犯罪行为中。

截止目前,检材之间的关联主要如下:

  • 检材 2 主机中主要包含嫌疑人通过 Web 方式访问检材 1 中网站的历史记录
  • 检材 2 中包含嫌疑人使用的手机备份

    • 手机备份中含有嫌疑人与外界交流的各种通信应用
  • 检材 2 中包含一台 Windows 7 虚拟机

    • 嫌疑人通过虚拟机与广告供应商联系
    • 嫌疑人通过虚拟机中 xshell 远程管理检材 1 的服务器

Part3

30. 检材 3 的原始磁盘 SHA256 值

image-20221016174942582.png

31. 检材 3 所在计算机的操作系统版本

image-20221016175030134.png

32. 检材 3 中,部署的网站名称

仿真检材 3,开机后可以看到服务器里面有个 IIS,展开后可以看到搭建的网站名

image-20221016185016795.png

33. 检材 3 中,部署的网站的根目录

image-20221016185345918.png

上图中物理路径就是根目录

34. 检材 3 中,部署的网站绑定的端口

见上题图

35. 检材 3 中,具备登录功能的代码页对应的文件名

在浏览器历史记录中可以看到嫌疑人曾访问过一个叫【代理登录】标题的网站,对应的网址是

http://localhost/dl

我们在把检材 3 仿真起来后也可以直接访问到这个 url,确实是登录的入口

image-20221016190702409.png

在网站根目录下的配置文件 Web.config 中可以看到对应寻找 /dl 请求的转发

image-20221016190722752.png

36. 检材 3 网站登录过程中,代码中对输入的明文密码作了追加什么字符串的处理

对应上一题目录下的 dllogin.aspx 文件

image-20221016191437750.png

或者在虚拟机里访问对应的登陆页面,然后 f12,也能看到源码

image-20221016191538794.png

37. 检材 3 网站代码中,网站登录过程中调用的动态扩展库名称

还是在 dllogin.aspx 中

image-20221016202657720.png

在 bin 目录下可以找到该文件

image-20221016203345312.png

38. 检材 3 网站登录时后台对接收到的明文密码采用的加密算法

这题和上一道题有关联,上一题中调用的动态链接库在 inherits 字段中,是被继承下来的代码隐藏类编译成了 dll 文件

参考:

在 bin 目录下导出这个 dll 文件,用 dnspy 可以对其进行分析

image-20221016205355302.png

39. 检材 3 中,分析该网站连接的数据库地址

上题的 dll 中,可以看到 dl_login_dllogin 类调用的外部动态链接库中有一个 DBManager,看名字就是和数据库相关的库

image-20221016224334653.png

这个 dll 也在 bin 目录下,导出后用 dnspy 分析

DBcon 类中最下面可以看到连接 sql 数据库的默认配置

image-20221016232848940.png

其中有数据库地址(192.168.1.174,检材 4 解压密码)和端口(1433

40. 检材 3 中,网站连接数据库使用的密码

同样在 DBcon 中,最上面

image-20221016225708452.png

可以看到这里的逻辑,如果 this.Conn 为空,则使用默认的连接信息(红色框),但实际上 this.Conn 已经被赋值了(黄色框),也就是说我们需要利用 AESDecrypt 方法来解密这串信息,查看该方法,可以看到这是个 Encryption 类下的静态方法,可以直接通过 PowerShell 调用,但是需要注意调用静态方法必须使用方括号加上双冒号 :: 的形式,而且要先在当前的 PowerShell 环境下引入这个动态链接库

image-20221016231511841.png

41. 检材 3 中,网站连接数据库服务器的端口

39

Part3 小结

这部分题目围绕检材 3 展开,该检材是一个 Windows Server 服务器,上面部署了一个 IIS 网站,主要考察点还是在网站架构(根目录下文件存放路径)、配置信息以及对动态链接库的分析,aspx 与 dll 之间的继承关系,各个 dll 之间的调用关系,找到对应的文件,搞清楚这些关系对解题很有帮助:

  • 检材 3 中搭建了名为 card 的网站,登录页面是 /dl
  • 登录页面的源码文件是 dllogin.aspx,在目录 /dr/login
  • 源码中继承自 App_Web_dllogin.aspx.7d7c2f33.dll,在目录 /bin
  • 上面的 dll 中调用了 DBManager.dll 中的 Encryption.AESEncrypt 方法,也在 /bin
  • DBManager.dll 中存储了连接数据库的默认配置信息和嫌疑人实际使用的配置信息,调用解密方法即可得到明文

    • 数据库名:v7sq3
    • 用户名 / 密码:sa / c4f2737e88
    • 数据库 IP 地址:192.168.1.174(检材 4 的解压密码)
    • 数据库端口号:1433

Part4

42. 检材 4 的原始磁盘 SHA256 值

image-20221017143958068.png

网站重构

可以看到从 42 题开始,后面的每一道题都涉及到了【重构该网站】,网站重构也是长安杯最喜欢的考点,每一年都会出,所以对于长安杯来说,网站重构的方法是必须要掌握的知识点。

39 题的答案解压检材 4 并仿真,可以看到是一台 CentOS 的机器,仿真后查看 history,能发现里面涉及到很多数据库相关的操作,再结合检材 3,可以发现很明显是一个站库分离的架构,站是检材 3,库是检材 4

这里比较有趣的一点是,通过 history 可以看到出题人大概一开始是想直接在主机上搭建 mssql 服务器来着,但是因为某种原因失败了,就换成 docker 了

我们在实际操作的时候也能发现,通过 systemctl start mssql-server 命令确实无法正常启动 mssql 服务

image-20221017150726766.png

主机上 mssql 服务无法正常启动,而且 history 中 docker cp 命令对 LDF 文件(日志数据库文件)的操作,数据库的名字与在检材 3 中分析到的完全相同,都是v7sq3(可见 39 题)

image-20221017152202025.png

据此我们可以明确判断,真正的数据库在 docker 中

systemctl start docker # 启动docker服务
systemctl status docker # 查看服务状态
docker ps -a # 查看所有容器
docker start 3f17 # 开启容器

通过检材 3 我们得知连接数据库的地址是 192.168.1.174,所以我们要先修改检材 4 的静态 IP

关闭 DHCP

image-20221017161329701.png

修改网卡配置文件

ip a # 查看配置文件名称 ens-33
vi /etc/sysconfig/network-scripts/ifcfg-ens33 # 修改配置文件

image-20221017161554933.png

修改(红框)/添加(黄框)以下内容

# 修改
BOOTPROTO="static" # dhcp改为static 
ONBOOT="yes" # 开机启用本配置

# 添加
IPADDR=192.168.1.174 # 静态IP
GATEWAY=192.168.1.1 # 默认网关
NETMASK=255.255.255.0 # 子网掩码

image-20221017162958279.png

重启网络配置,查看是否修改成功

systemctl restart network
ip a

image-20221017163134522.png

配置好检材 4 后,再配置检材 3,开启 DHCP,查看网络配置,检测是否能 ping 通检材 4

image-20221017163347421.png

连接数据库

image-20221017172702108.png

Part3 中提到有关网站登录时调用的 dll,其中 dr_login_dllogin 类的 oCmd 方法中将用户登录信息与数据库比对使用了 wduser.DUserLogin 函数

image-20221017180537772.png

跟进查看这个函数,在 WBus.dll 的 WDUser 类中(WBus.dll 也在 App_Web_dllogin.aspx.7d7c2f33.dll 开头引用)

image-20221017180840514.png

DUserLogin 函数中调用了数据库中 PD_UserLogin 函数

image-20221017181141167.png

PD_UserLogin 函数内容如下图

image-20221017181102464.png

有几个关键点:

  • TD_Webs 表中根据 DW_Web 的值取了 DW_TypeDW_DU_IdDW_Web 是域名/IP

image-20221017181944403.png

  • 根据 DW_Type 的取值(0/1)进入下面两个条件分支,在 TD_User 表中取用户数据

image-20221017181954838.png

  • TD_User 表中存放的密码是经过拼接、加密、MD5处理后的结果

image-20221017182024716.png

根据以上的取值和判断逻辑,我们再修改数据库中的数据,让 DW_DU_IdDU_Id 保持一致就行,根据检材 2 我们能够知道 liwente1314520 是嫌疑人的用户(见 25 题),对应 1001,根据生成密码的逻辑修改 DU_Pwd 字段,例如修改密码为 123

MD5(AESEncrypt('123'+'OvO'))

image-20221017182756414.png

image-20221017183226540.png

image-20221017212944883.png

修改后保存,重启容器

docker restart 3f17

在检材 3 中开启 ASP.NET State Service 服务

image-20221017200933251.png

此时在自己电脑的浏览器上就可以通过 192.168.1.176/dl 来登录网站,用户名 liwente1314520,密码 123

image-20221017201103561.png

至此,网站重构成功。

43. 重构该网站,分析嫌疑用户的推广链接中参数里包含的 ID

image-20221017201645444.png

44. 重构该网站,该网站后台的代理用户数量

用户列表,一共 3 页,前两页 9 个,最后一页 8 个,一共 26 个

45. 重构该网站,该网站注册用户中代理个数

用与对登录页面相同的分析方法,先找到【用户列表】页面对应的 aspx 文件

image-20221017202634386.png

然后找到它继承自哪个动态链接库

image-20221017202807810.png

导出后用 dnspy 分析,找到里面和数据库交互的函数

image-20221017202908835.png

寻找引用,在 WBus.dll 的 WUUser 类中,找到对应的表

image-20221017203001364.png

统计行数

image-20221017203210891.png

46. 重构该网站,统计 2019 年 10 月 1 日后补发成功的金额总值

和上一题同样的分析方法(App_Web_tybfjl.aspx.df411ca0.dll -> WYouxi2.BFTestListGet2),找到对应的数据库表,这里对应的是一个视图(view)

image-20221017205142193.png

Page_Load 方法中对于是否补发成功的判断如下

image-20221017205348410.png

可以看到当 YY1T_CState 字段为 100 时,补发成功

sql 语句过滤查询一下,再加上时间范围

SELECT SUM(YY1T_Money) FROM [dbo].[VY_TestLog] WHERE [YY1T_CState] = N'100' AND [YY1T_CDate] BETWEEN N'2019-10-01 00:00:00' AND N'2020-12-31 00:00:00'

image-20221017205509524.png

47. 检材 4 中,对 "TX_IpLog" 表进行分析,所有在“武汉市”登录的次数

image-20221017210439370.png

48. 重构该网站,该嫌疑人下属代理 "liyun10" 账户下的余额

image-20221017211106417.png

无法直接跳转,需要在地址栏开头添加服务器的 IP

192.168.1.176/res/aspx/uin.aspx?user=liyun10&pwd=F58249F4A628AE7B35753EA8416BA943&t=fqgl

image-20221017211243842.png

49. 接上一题,该用户的推广 ID

image-20221017211406954.png

50. 接上一题,该代理商户的最后一次登陆时间

image-20221017212010079.png

Part4 小结

这一部分围绕【网站重构】展开,作为每年的保留项目,考察点也不尽相同,21年主要考察对数据库服务器的【raid 重组】,而20年则主要考察对数据库的【改查】操作,当然前提是要弄清楚登录判断和密码校验的逻辑,找到对应的表和对应的数据,才能正确修改。重构网站后剩下的步骤就比较简单了,对 sql 语句有个简单的了解,或者导出到 excel 用表格来统计都可以。

案例概述

最后再整体看一遍所有的检材,梳理它们之间的关系:

  • 检材 1 是作为 反向代理服务器,对外开放的三个域名最终都会转发到由 检材 3 和 4 共同搭建的 网站后台(192.168.1.176:80)

    • 根据后台网站的内容和功能可以判断,这三个域名是嫌疑人给下线代理访问管理平台的地址,账号需要嫌疑人审核通过后才能登录
  • 检材 2 是嫌疑人的个人 PC,嫌疑人通过在检材 2 的 Windows 7 虚拟机 中使用 XShell 远程管理 检材 1
  • 嫌疑人使用手机上的 Telegram 与广告供应商联系,并通过 虚拟货币 Dogecoin 与广告供应商进行交易,手机备份 存储在 检材 2
  • 检材 3 和检材 4 共同搭建了后台管理网站,检材 3 上通过 IIS 服务搭建了 网站检材 4 部署了网站的 数据库

    • 检材 3 的 IP 地址为 192.168.1.176,恰好符合 检材 1nginx 代理转发规则,80 端口对应后台首页
    • 检材 4 的 IP 地址为 192.168.1.174,所有关于 数据库的连接信息 都是通过对 检材 3网站登录代码 分析得到的

参考文章