2023陇剑杯

数据分析-SS

1.黑客是使用什么漏洞来拿下root权限的

分析使用系统命令id之前的流量包,发现奇怪的传输

img

上网搜索发现是

img

CVE-2022-22965

2.黑客反弹shell的ip和端口是什么

分析后面的流量包,查看返回包明文

img

192.168.43.128:2333

3.黑客的病毒名称是什么?

解压文件系统

img

按照创建时间最晚排序

img

main文件非常可疑

4.黑客的病毒运行后创建了什么用户?请将回答用户名与密码:

丢尽微步云沙箱

发现创建用户

img

这个命令试图创建一个名为 ll 的用户,将其UID设置为0(与root用户相同),并尝试使用 openssl passwd 命令生成的加密密码(123456)作为用户密码,同时将用户的主要组和附加组都设置为 root

查看/etc/passwd

img

最新创建的用户为ll

ll:123456

5.服务器在被入侵时外网ip是多少?

home/guest/.log.txt记录了外网ip

img

172.105.202.239

6.病毒运行后释放了什么文件?

img

7.矿池地址是什么?

打开\home\guests.idea\mine_doge.sh

img

doge.millpools.cc:5567

8.黑客的钱包地址是多少?

img

DOGE:DRXz1q6ys8Ao2KnPbtb7jQhPjDSqtwmNN9

数据分析-IR

可以使用7z将虚拟机镜像中的vmdk磁盘文件,分离出来,用取证大师或者R-Studio来恢复我们拿出需要的文件,这样会更加方便一点,不过就看不了内存中的进程等等信息了,最好仿真和磁盘同时利用

img

使用R-Studio打开文件系统

img

1.你是公司的一名安全运营工程师,今日接到外部监管部门通报,你公司网络出口存在请求挖矿域名的行为。需要立即整改。经过与网络组配合,你们定位到了请求挖矿域名的内网IP是10.221.36.21。查询CMDB后得知该IP运行了公司的工时系统。(虚拟机账号密码为:root/IncidentResponsePasswd) 挖矿程序所在路径是?(答案中如有空格均需去除,如有大写均需变为小写,使用echo -n 'strings'|md5sum|cut -d ' ' -f1获取md5值作为答案)

Ps -ef 查看可以进程

img

发现有进程 redis-server

查看配置文件 /etc/redis/redis/redis.conf

在配置文件中,发现可以的矿池ip

img

所以挖矿程序为/etc/redis/redis-server

img

img

2.挖矿程序连接的矿池域名是?(答案中如有空格均需去除,如有大写均需变为小写,使用echo -n 'strings'|md5sum|cut -d ' ' -f1获取md5值作为答案)

矿池域名:donate.v2.xmrig.com

echo -n 'donate.v2.xmrig.com'|md5sum|cut -d ' ' -f1

img

3.攻击者入侵服务器的利用的方法是?

可以看/home/app下有日志文件

img

利用R-STUDIO工具恢复这两个文件

img

发现使用的网上的人人框架

img

对jar包反编译,发现shiro 版本为 1.2.4

img

存在shiro反序列化漏洞

img

利用英文进行md5

shirodeserialization

echo -n 'shirodeserialization'|md5sum|cut -d ' ' -f1

img

4.攻击者的IP是?

查看ssh日志

cat /var/log/auth.log | less

发现来自81.70.166.3 多次失败登录记录,猜测为攻击者暴力破解ssh

img

81.70.166.3

echo -n '81.70.166.3'|md5sum|cut -d ' ' -f1

img

5.攻击者发起攻击时使用的User-Agent是?(答案中如有空格均需去除,如有大写均需变为小写,使用echo -n 'strings'|md5sum|cut -d ' ' -f1获取md5值作为答案)

查看nginx日志

cat /var/log/nginx/access.log

img

攻击者最后的记录

echo -n 'mozilla/5.0(compatible;baiduspider/2.0;+http://www.baidu.com/search/spider.html)'|md5sum|cut -d ' ' -f1

img

6.攻击者使用了两种权限维持手段,相应的配置文件路径是?(md5加密后以a开头)(答案中如有空格均需去除,如有大写均需变为小写,使用echo -n 'strings'|md5sum|cut -d ' ' -f1获取md5值作为答案)

查看ssh日志,可知攻击者通过ssh公私钥成功登录,所以第一种权限维持方法为ssh公私钥登录

img

ssh公私钥配置文件一般是/root/.ssh/authorized_keys

echo -n '/root/.ssh/authorized_keys'|md5sum|cut -d ' ' -f1

img

7.攻击者使用了两种权限维持手段,相应的配置文件路径是?(md5加密后以b开头)(答案中如有空格均需去除,如有大写均需变为小写,使用echo -n 'strings'|md5sum|cut -d ' ' -f1获取md5值作为答案)

检测常见Linux下的权限维持手段

crontab -l命令检查当前用户的计划任务

img

使用find / -name ".*" 2>/dev/null查找系统中的隐藏文件

查看影子账户

img

查看有无敏感启动任务 systemctl list-unit-files --type=service

img

发现redis.service

查看启动任务的文件地址systemctl cat redis.service

img

echo -n '/lib/systemd/system/redis.service'|md5sum|cut -d ' ' -f1

img

ps:恢复出挖矿程序

img

放入微步云沙箱

img

数据分析-SSW

1.连接蚁剑的正确密码是______________?

Wireshark 过滤器 tcp contains "$_POST"

img

这边通过sql联合注入写了两个webshell进去

连接蚁剑的密码都是6ea280898e404bfabd0ebb702327b18f

但在实际利用时又出现了其他的答案

img

img

经过实验,发现6ea280898e404bfabd0ebb702327b19f成功

2.题目内容:攻击者留存的值是______________?

应该是攻击者向某个文件写入了某个值

过滤POST包,具体分析报文中的脚本代码

img

对value值显示分组字节,使用base64解码

no

img

no

img

yes

img

ad6269b7-3ce2-4ae8-b97f-f259515e7a91

3.题目内容:攻击者下载到的flag是______________?

http导出对象,发现一个可以的php文件,有5M??

img

VScode无法打开

img

改后缀为exe后,与64位无法兼容

img

用010打开,删除前面的三个字节,重新保存为exe文件

img

运行文件后,会在上一级目录下生成一张图片

img

img

感觉宽高比例不太对劲

010打开显示为png,修改后缀后,010重新识别,修改 为605*800,出现flag

img

数据分析-BF

1.题目内容:磁盘中的key是多少?

使用R-STUDIO挂载磁盘,显示加密

img

解法一:使用EFDD解密

使用Arsenal Image Mounter挂载加密盘

img

选择第一个 Decrypt

img

选择第一个

img

上面选择需要解密的盘,下面选择配合解密的内存文件

img

解密成功,得到恢复密钥的hex,点击下一步

img

得到恢复密钥

560604-255013-655633-128854-663223-316063-484946-476498

img

点击加密盘,输入恢复密钥

img

成功解密,打开就能看见key文件

img

使用随波逐流一键解密,发现key值 thekeyis2e80307085fd2b5c49c968c323ee25d5

img

解法二:不解密磁盘直接去内存中取出解密

识别内存镜像信息

暂时无法在飞书文档外展示此内容

img

判断内存镜像中敏感信息数据

python2 vol.py -f baby_forensics.raw --profile=Win7SP1x64 filescan | grep -iE "flag|.zip$|.rar$|.7z$|.txt$|.png$|.jpg$|.gif$|.pdf$|.doc$|.docx$|.pcap$|.pcapng$|.raw$|.kdbx$|Desktop\\\{1}.+"

img

导出key.txt

python2 vol.py -f baby_forensics.raw --profile=Win7SP1x64 dumpfiles -Q 0x000000003df94070 -D ./

img

成功得到密文,解密方法同方法一

2.题目内容:电脑中正在运行的计算器的运行结果是多少?

解法一:利用vol查看windows程序句柄信息

python2 vol.py -f baby_forensics.raw --profile=Win7SP1x64 pslist 
先查看计算器进程信息

img

保存window句柄信息

$ vol.py -f baby_forensics.raw --profile=Win7SP1x64 windows > windows

img

根据calc.exe 检查window文件

grep -i -C 10 "calc" windows

img

成功找到 7598632541

解法二:dump进程内存+gimp画图复原 计算机图像

提取截图,查看有无关键信息
python2 vol.py -f baby_forensics.raw --profile=Win7SP1x64 screenshot --dump-dir=./
Volatility Foundation Volatility Framework 2.6.1
Wrote ./session_0.msswindowstation.mssrestricteddesk.png
Wrote ./session_0.Service-0x0-3e4$.Default.png
Wrote ./session_0.Service-0x0-3e5$.Default.png
Wrote ./session_0.WinSta0.Default.png
Wrote ./session_0.WinSta0.Disconnect.png
Wrote ./session_0.WinSta0.Winlogon.png
Wrote ./session_0.Service-0x0-3e7$.Default.png
Wrote ./session_1.WinSta0.Default.png
Wrote ./session_1.WinSta0.Disconnect.png
Wrote ./session_1.WinSta0.Winlogon.png

没什么有用的信息

img

根据之前查看的calc进程地址信息,dump对应进程内存

python2 vol.py -f baby_forensics.raw --profile=Win7SP1x64 memdump -p 2844 --dump-dir=./

img

重命名2844.dmp为2844.data

img

使用gimp打开,打开方式选择“原始图像”

kail安装gimp
sudo apt update
sudo apt install gimp

img

修改图片位移、宽高,原则是可以调出来的,但我放弃了~

借用一下其他师傅成功图片

img

3.题目内容:该内存文件中存在的flag值是多少?

U2Fsd 是一种特定的加密数据格式的前缀,通常表示经过加密处理的数据。它实际上是“universal 2nd Factor Data format”(通用第二因素数据格式)的 Base64 编码

解法一:010打开内存镜像,查找以U2Fsd的字符串,发现疑似密文

img

发现疑似单独的密钥文件

img

网上找了很多个AES解密才解密成功,不知道为什么???

img

flag{ad9bca48-c7b0-4bd6-b6fb-aef90090bb98}

解法二:查看进程,发现有个便签程序

python2 vol.py -f baby_forensics.raw --profile=Win7SP1x64 pslist
python2 vol.py -f baby_forensics.raw --profile=Win7SP1x64 memdump -p 2968 --dump-dir=./

img

img

用010打开,还是搜索U2fsd,不过需要删除\par

img

利用R-STUDIO打开内存镜像,在music文件夹下发现密钥qwerasdf

img

数据分析-EW

1.服务器自带的后门文件名是什么?(含文件后缀)

通过wireshark过滤出post包,通常利用后门文件post命令,发现有三个php文件

image-20250224131929290

其中的d00r.php为传送系统命令

所以服务器自带的后门文件为ViewMore.php

2.服务器的内网IP是多少?

根据上一道题可以看出ip地址为192.168.162.130,不过测试后不对

image-20250224132232352

发现其中有一个数据包进行了ifconfig命令查询

image-20250224132428428

返回包显示双网卡,所以它的ip地址为192.168.101.132

image-20250224132501704

3.攻击者往服务器中写入的key是什么?

在后门文件传输的最后一个数据包里,发现攻击者写入的脚本

image-20250224132655985

先进行url解密

image-20250224132855220

base64解码出来是一个压缩包

image-20250224133723381

前面有个包含压缩密码 7e03864b0db7e6f9

image-20250224133835522

解压即可 7d9ddff2-2d67-4eba-9e48-b91c26c42337

image-20250224133920944

数据分析-HD

1.admIn用户的密码是什么?

查看加载login脚本的包,发现采用AES加密,包含key和IV

image-20250224175746909

后面的login登录流量包,含有登录的密文形式的账号和密码

image-20250224175914845

可以看到成功解密,不过登录账号为aaa,不是我们要找的

image-20250224180304077

在流57中,发现有admin账号登录成功的信息

image-20250224180658778

所以寻找流56,账号正确

image-20250224180821734

解密密码 flag{WelC0m5_TO_H3re}

image-20250224180903196

2.app.config['SECRET_KEY']值为多少?

使用tcp contain “SECRET_KEY” 过滤,发现两个包

image-20250224181436760

打开其中一个发现,对应的值

image-20250224181301474

使用随波逐流进行html实体解码,方便查看 ssti_flask_hsfvaldb

image-20250224181550327

3.flask网站由哪个用户启动?

在流76中得到cookie

image-20250303104053893

需要使用flask_session_cookie_manager3.py (https://github.com/noraj/flask-session-cookie-manager)进行flask的session解密,

由上一问知道SECRET_KEY = ssti_flask_hsfvaldb

#!/usr/bin/env python3
""" Flask Session Cookie Decoder/Encoder """
__author__ = 'Wilson Sumanang, Alexandre ZANNI'

# standard imports
import sys
import zlib
from itsdangerous import base64_decode
import ast

# Abstract Base Classes (PEP 3119)
if sys.version_info[0] < 3: # < 3.0
    raise Exception('Must be using at least Python 3')
elif sys.version_info[0] == 3 and sys.version_info[1] < 4: # >= 3.0 && < 3.4
    from abc import ABCMeta, abstractmethod
else: # > 3.4
    from abc import ABC, abstractmethod

# Lib for argument parsing
import argparse

# external Imports
from flask.sessions import SecureCookieSessionInterface

class MockApp(object):

    def __init__(self, secret_key):
        self.secret_key = secret_key


if sys.version_info[0] == 3 and sys.version_info[1] < 4: # >= 3.0 && < 3.4
    class FSCM(metaclass=ABCMeta):
        def encode(secret_key, session_cookie_structure):
            """ Encode a Flask session cookie """
            try:
                app = MockApp(secret_key)

                session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))
                si = SecureCookieSessionInterface()
                s = si.get_signing_serializer(app)

                return s.dumps(session_cookie_structure)
            except Exception as e:
                return "[Encoding error] {}".format(e)
                raise e


        def decode(session_cookie_value, secret_key=None):
            """ Decode a Flask cookie  """
            try:
                if(secret_key==None):
                    compressed = False
                    payload = session_cookie_value

                    if payload.startswith('.'):
                        compressed = True
                        payload = payload[1:]

                    data = payload.split(".")[0]

                    data = base64_decode(data)
                    if compressed:
                        data = zlib.decompress(data)

                    return data
                else:
                    app = MockApp(secret_key)

                    si = SecureCookieSessionInterface()
                    s = si.get_signing_serializer(app)

                    return s.loads(session_cookie_value)
            except Exception as e:
                return "[Decoding error] {}".format(e)
                raise e
else: # > 3.4
    class FSCM(ABC):
        def encode(secret_key, session_cookie_structure):
            """ Encode a Flask session cookie """
            try:
                app = MockApp(secret_key)

                session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))
                si = SecureCookieSessionInterface()
                s = si.get_signing_serializer(app)

                return s.dumps(session_cookie_structure)
            except Exception as e:
                return "[Encoding error] {}".format(e)
                raise e


        def decode(session_cookie_value, secret_key=None):
            """ Decode a Flask cookie  """
            try:
                if(secret_key==None):
                    compressed = False
                    payload = session_cookie_value

                    if payload.startswith('.'):
                        compressed = True
                        payload = payload[1:]

                    data = payload.split(".")[0]

                    data = base64_decode(data)
                    if compressed:
                        data = zlib.decompress(data)

                    return data
                else:
                    app = MockApp(secret_key)

                    si = SecureCookieSessionInterface()
                    s = si.get_signing_serializer(app)

                    return s.loads(session_cookie_value)
            except Exception as e:
                return "[Decoding error] {}".format(e)
                raise e


if __name__ == "__main__":
    # Args are only relevant for __main__ usage
    
    ## Description for help
    parser = argparse.ArgumentParser(
                description='Flask Session Cookie Decoder/Encoder',
                epilog="Author : Wilson Sumanang, Alexandre ZANNI")

    ## prepare sub commands
    subparsers = parser.add_subparsers(help='sub-command help', dest='subcommand')

    ## create the parser for the encode command
    parser_encode = subparsers.add_parser('encode', help='encode')
    parser_encode.add_argument('-s', '--secret-key', metavar='<string>',
                                help='Secret key', required=True)
    parser_encode.add_argument('-t', '--cookie-structure', metavar='<string>',
                                help='Session cookie structure', required=True)

    ## create the parser for the decode command
    parser_decode = subparsers.add_parser('decode', help='decode')
    parser_decode.add_argument('-s', '--secret-key', metavar='<string>',
                                help='Secret key', required=False)
    parser_decode.add_argument('-c', '--cookie-value', metavar='<string>',
                                help='Session cookie value', required=True)

    ## get args
    args = parser.parse_args()

    ## find the option chosen
    if(args.subcommand == 'encode'):
        if(args.secret_key is not None and args.cookie_structure is not None):
            print(FSCM.encode(args.secret_key, args.cookie_structure))
    elif(args.subcommand == 'decode'):
        if(args.secret_key is not None and args.cookie_value is not None):
            print(FSCM.decode(args.cookie_value,args.secret_key))
        elif(args.cookie_value is not None):
            print(FSCM.decode(args.cookie_value))


python flask_session_cookie_manager3.py decode -s "SECRET_KEY " -c "session"

python flask_session_cookie_manager3.py decode -s "ssti_flask_hsfvaldb" -c ".eJwdx1EKwyAMANCrDEGiPz1Ar1KGZBi7gBpplH2Idy_d-3vTDKWrYiGzm2k5vZRUWeo2WsRObkLKeMKeuekoB4RwZvlg1hDg_S917lSeOhAFf0CTRvXp7ytYGPx2EUbnl7drWqqRk11m3cGmKw0.YpIQcw.J5vs8t8bAr0xDIxF6EqUAH2kkLE"

image-20250303105852880

发现进行了whoami的命令执行,不过下面的流量包没有回显

但是具有cookie,利用同样的方法进行session解密

python flask_session_cookie_manager3.py decode -s "ssti_flask_hsfvaldb" -c ".eJwdylsKAyEMQNGtFEGiUGYBs5VpkRQz04AvjNIPce-t_TyXO9QZ8FK7quQfSd1VF6oJI_3S0HzehEQ4p60Xj43MgPXDHrhIjwc4d4X8wiDOwfNPatwoLhrIAvaAkgulxc87Y2SwWyX0xk6r59CUPJ96qvkFHeUvmg.YpIQkg.65xf8l2g9fXAImkfyihId46KkY4"

登录账号为red

image-20250303110038560

4.攻击者写入的内存马的路由名叫什么?(答案里不需要加/)

Python 内存马利用Flask框架中SSTI注入来实现, Flask框架中在web应用模板渲染的过程中用到render_template_string进行渲染, 但未对用户传输的代码进行过滤导致用户可以通过注入恶意代码来实现Python内存马的注入

eval:eval(expression[, globals[, locals]])有两个参数非常重要
expression—后接表达式
globals—变量作用域,全局命名空间,如果被提供,则必须是一个字典对象
locals—变量作用域,局部命名空间,如果被提供,可以是任何映射对象
__globals__:以字典的形式返回函数所在的全局命名空间所定义的全局变量
__builtins__:内建模块的引用,在任何地方都是可见的(包括全局),每个 Python 脚本都会自动加载(这个模块包括了很多强大的 built-in 函数,例如eval, exec, open…..)
__class__:返回调用的参数类型
__bases__:返回基类列表(继承父类)
add_url_rule:注册了一个/shell的路由,init相当于构造函数,定义自己的属性,通过init.globals得到他们的命名空间从而得到builtins就可以执行内置函数如eval, exec, open等。

在流81中,对session进行解密

image-20250303110203960

python flask_session_cookie_manager3.py decode -s "ssti_flask_hsfvaldb" -c ".eJx1jUsOgkAQBa-Cs2lJCEbdcQI9A0w6DdMaYjPgfAwJmbsLC1fq7r2kKrWo6NlZGlhValmiE7yNrkS8y9iSeMQaENvYS-jt-kDXwC8S0PtG0TSVZAxulovCezhcreEZigw-Q2hoDWUVXFhk3GXH0xnyRhULoONnZB-wCzP6QN0Dqt_9b1AXsMb_8F10jm3AjdApT0mlNx2uUsY.YpIRHQ.qS_PWmxt4i4cjHYBzDz-rUdTZns"

image-20250303110255595

存马路径就是add_url_rule后面的Index

数据分析-TP

1.攻击者通过暴力破解进入了某Wiki 文档,请给出登录的用户名与密码,以:拼接,比如admin:admin

在http导出对象中找login页面,往流量包较大的找

image-20250304192458023

找返回包200的

image-20250304192218924

几个账号都是一样的

image-20250304192549956

这种就是密码错了,所以errcode300

image-20250304192745584

找errcode:200

image-20250304193413163

最后找到密码

image-20250304193723521

TMjpxFGQwD:123457

2.攻击者发现软件存在越权漏洞,请给出攻击者越权使用的cookie的内容的md5值。(32位小写)、

在登陆成功后,找到两个常见的cookie

image-20250304194211389 image-20250304194627642

echo -n 'accessToken=f412d3a0378d42439ee016b06ef3330c; zyplayertoken=f412d3a0378d42439ee016b06ef3330cQzw=; userid=1'|md5sum|cut -d ' ' -f1
成功

image-20250304195226219

3.攻击使用jdbc漏洞读取了应用配置文件,给出配置中的数据库账号密码,以:拼接,比如root:123456

在登陆成功后的tcp流量包里,发现数据库的账号密码

image-20250304195846661

​ username: zyplayer

​ password: 1234567

4.攻击者又使用了CVE漏洞攻击应用,执行系统命令,请给出此CVE编号以及远程EXP的文件名,使用:拼接,比如CVE-2020-19817:exp.so

还是往后找tcp流量包,发现奇怪的文件,和包含/bin/bash的内容

image-20250304200043508

该文件应该为远程exp custom.dtd.xml

image-20250304201126439

根据脚本分析,与网上给出的exp类似

image-20250304202308874

image-20250304202124700

CVE-2022-21724:custom.dtd.xml

5.给出攻击者获取系统权限后,下载的工具的名称,比如nmap

还是往后找远程连接的流量包,可以发现从github上下了一个工具

image-20250304200439169

根据目录名发现是fscan

数据分析-WS

  1. 被入侵主机的IP是?

    image-20250305080358943

主要就是两个IP,0.1是路由,所以主机IP是192.168.246.28

2.被入侵主机的口令是?

查看第一个流量包,发现password

image-20250305080603779

3.用户目录下第二个文件夹的名称是?

根据ls命令可以知道,返回包包括了当前目录下的文件名,去掉特殊字符

image-20250305081036159

4./etc/passwd中倒数第二个用户的用户名是?

image-20250305081136666

posted @ 2025-03-05 08:15  rong_yan  阅读(256)  评论(0)    收藏  举报