美亚杯2020 - 团体赛 Zello&Xeno服务器部分 Write Up

Zello服务器镜像模拟

Zello服务器使用了LVM2硬盘,因此导致了火眼仿真程序生成的虚拟机文件无法直接启动,需要手动在配置中将“EFI引导”更改为“BOIS(Legacy)引导”。

在镜像文件的GPT分区类型也指出该分区为BOIS引导分区。参见GPT 分区详解

image-20201121201412956

此外,还可以将LVM2分区直接挂载在物理机上,再用火眼对LVM2分区进行仿真操作。


01 Zello服务器的哈希值(SHA256)是甚么?

在取证大师中对整个镜像进行SHA256计算即可。


02 卷组是何时创建的?

LVM在每个物理卷头部都维护了一个metadata,其中包含有关于分区的基本信息。参见LVM2---Logical Volume Manager

通过对LVM2分区进行16进制查看即可得到相关信息,其中包含有分区名称、分区创建时间、物理卷的PV UUID、物理卷的VG UUID等信息。同样的信息可以在/etc/lvm/backup/目录下找到。

image-20201121202624067


03 卷组的名称是甚么?

除了在02题中所述的metadata中以外,还可以通过使用火眼证据分析软件自动识别出LVM2分区的名称(该软件也可以直接读取LVM2分区中的文件)。

image-20201121203321975


04 物理卷的PV UUID是多少?

05 卷组的VG UUID是甚么?

除了在02题中所述的metadata中以外,通过火眼仿真后还可以使用lvm命令进行查看:

sudo lvdisplay -a
sudo pvdisplay
sudo vgdisplay

image-20201121204553414


06 Zello服务器的Linux内核版本是甚么?

07 Zello服务器的操作系统版本是甚么?

通过uname -auname -r查看内核版本; 查看/proc/version文件; 查看/etc/lsb-release文件;

image-20201121205654186


08 Zello服务器的主机名是甚么?

通过uname -auname -n查看主机名; 查看/etc/hostname文件。

image-20201121210208273


09 Zello服务器的计算器ID是甚么?

“计算器ID”其实就是“计算机ID”,大概是香港那边独特的表达方式吧。

查看/etc/machine-id文件。


10 Zello服务器中使用的wordpress版本是甚么?

仿真之后访问网站后台即可在右下角看到版本号。而火狐浏览器的历史记录中就包含了网站的后台地址,甚至打开浏览器之后恢复的上一次异常关闭页面中就有后台页面。

image-20201121211444808

或者在/var/www/html/wordpress/wp-include/version.php中查看。

image-20201121211745288


11 Zello服务器与之同步的主机名是甚么?

查看hosts或/etc/ntp.conf文件。

关于ntp.conf文件的作用,详见ntp.conf配置文件详解

image-20201121212400794


12 Zello服务器的时区是甚么?

通过date命令或查看/etc/timezone文件。

image-20201121212853024


13 有多少个本地用户已登录到Zello服务器?

查看/etc/passwd文件。

其中每行各个字段含义如下:

image

普通用户有两个特征:一是UID介于500~65535之间;二是shell的起始位置为/bin/bash

image-20201121214137347


14 植入网络目录(Webdirectory)的网页壳层(Web Shell)的哈希值(MD5)是甚么?

/var/www/html/wordpress/目录下的全部文件,导出,使用杀毒软件查杀(windows defender在导出时就会报毒)。

image-20201121214538928

或者以eval(为关键词检索导出文件中的php文件。(使用的搜索工具为FileLocatorPro)

image-20201121214932752


15 \var\www\html\wordpress\net\2020\Login index.php有甚么作用?

16 钓鱼网站伪装成甚么网站?

查看index.php可以发现这个页面是伪造的Netflix的登录页面,其中第一行包含了crypt.php,结合上一题杀毒软件对crypt.php的报毒,应该是钓鱼网页。


17 下列哪个IP对Zello服务器进行了蛮力攻击?

查看/var/log/apache2/目录下的access.log.x`文件,其中有几个被压缩,需要解包。可以在access.log.3文件中发现203.186.94.68`对服务器进行了1432次请求。

image-20201121221501272


18 Zello Web服务器的URL是甚么?

参见第10、11题。


19 LVM2容器的第一个扇区是什么?

20 Zello服务器中LVM2容器的大小(以字节为单位)是甚么?

在取证大师中查看没有识别出来的LVM2分区(显示为“未分配簇”)的相关信息。辣鸡取证大师终于派上用场了

image-20201121221958633


21 在Zello服务器以及Alice的装置中可以找到甚么共同文件?

可以在Zello镜像的/var/www/html/wordpress/net/2020/login/目录下找到R3ZZ.txt


22 2020年8月29日在Xeno服务器中发现的攻击类型是甚么?

查看日志可以发现当天服务器收到了大量的GET/POST请求,并且请求的为某几个特定页面,攻击方式应为HTTP GET/POST Flood。


23 哪个IP地址在日志中条目数量最多?

先去除日志中所有损坏的行,然后写一个简单的python脚本对出现的IP的次数进行统计即可。 也可以使用搜索工具对每个选项中的IP进行搜索。不懂取证警告

dic = {}
with open("1.txt", "r", encoding='utf-8') as f:
    for i in f:
        ip = i.split(' ')[0]
        if ip in dic:
            dic[ip] += 1
        else:
            dic[ip] = 1
print(dic)

24 这个登录次数最多的IP地址,它访问最多的是哪个页面?

继续写python脚本。 也可以使用搜索工具进行正则匹配,对每个选项中的页面进行搜索。不懂取证警告+1

times = {
    'A': 0,
    'B': 0,
    'C': 0,
    'D': 0,
    'E': 0,
}
with open("1.txt", "r", encoding='utf-8') as f:
    for i in f:
        if "14.102.184.0" in i:
            if "/listen.icepush.xml HTTP/1.1\" 200" in i:
                times['A'] += 1
            elif "/risk.xhtml HTTP/1.1\" 200" in i:
                times['B'] += 1
            elif "/explorer.xhtml HTTP/1.1\" 200" in i:
                times['C'] += 1
            elif "/login.jsp HTTP/1.1\" 200" in i:
                times['D'] += 1
            elif "/listViewRisjs.xhtml HTTP/1.1\" 200 " in i:
                times['E'] += 1
print(times)

25 这个登录次数最多的IP地址来自哪个国家或地区?

使用离线IP查询工具进行查询,得知是香港的IP。

实际上,这个IP地址就是Daniel的家庭IP地址……

image-20201121230407289


26 这个登录次数最多的IP地址,合共有多少次成功登录?

python脚本:

time = 0
with open("1.txt", "r", encoding='utf-8') as f:
    for i in f:
        if "14.102.184.0" in i and "login" in i:
            dd = i.split(' ')
            if '200' in dd:
                time += 1
print(time)

但因为损坏部分中也可能存在登陆成功的日志,所以实际登录成功次数会略高一些。


27 除DDoS之外,还可能涉及其他攻击吗?


28 从该网站下载了多少数据?

python脚本:

data = 0
with open("1.txt", "r", encoding='utf-8') as f:
    for i in f:
        if "14.102.184.0" in i:
            dd = i.split(' ')[-2]
            if dd.isdigit():
                data += int(dd)    
print(data)