2023陇剑杯
数据分析-SS
1.黑客是使用什么漏洞来拿下root权限的
分析使用系统命令id之前的流量包,发现奇怪的传输
上网搜索发现是
CVE-2022-22965
2.黑客反弹shell的ip和端口是什么
分析后面的流量包,查看返回包明文
192.168.43.128:2333
3.黑客的病毒名称是什么?
解压文件系统
按照创建时间最晚排序
main文件非常可疑
4.黑客的病毒运行后创建了什么用户?请将回答用户名与密码:
丢尽微步云沙箱
发现创建用户
这个命令试图创建一个名为 ll 的用户,将其UID设置为0(与root用户相同),并尝试使用 openssl passwd 命令生成的加密密码(123456)作为用户密码,同时将用户的主要组和附加组都设置为 root。
查看/etc/passwd
最新创建的用户为ll
ll:123456
5.服务器在被入侵时外网ip是多少?
home/guest/.log.txt记录了外网ip
172.105.202.239
6.病毒运行后释放了什么文件?
7.矿池地址是什么?
打开\home\guests.idea\mine_doge.sh
doge.millpools.cc:5567
8.黑客的钱包地址是多少?
DOGE:DRXz1q6ys8Ao2KnPbtb7jQhPjDSqtwmNN9
数据分析-IR
可以使用7z将虚拟机镜像中的vmdk磁盘文件,分离出来,用取证大师或者R-Studio来恢复我们拿出需要的文件,这样会更加方便一点,不过就看不了内存中的进程等等信息了,最好仿真和磁盘同时利用
使用R-Studio打开文件系统
1.你是公司的一名安全运营工程师,今日接到外部监管部门通报,你公司网络出口存在请求挖矿域名的行为。需要立即整改。经过与网络组配合,你们定位到了请求挖矿域名的内网IP是10.221.36.21。查询CMDB后得知该IP运行了公司的工时系统。(虚拟机账号密码为:root/IncidentResponsePasswd) 挖矿程序所在路径是?(答案中如有空格均需去除,如有大写均需变为小写,使用echo -n 'strings'|md5sum|cut -d ' ' -f1获取md5值作为答案)
Ps -ef 查看可以进程
发现有进程 redis-server
查看配置文件 /etc/redis/redis/redis.conf
在配置文件中,发现可以的矿池ip
所以挖矿程序为/etc/redis/redis-server
2.挖矿程序连接的矿池域名是?(答案中如有空格均需去除,如有大写均需变为小写,使用echo -n 'strings'|md5sum|cut -d ' ' -f1获取md5值作为答案)
矿池域名:donate.v2.xmrig.com
echo -n 'donate.v2.xmrig.com'|md5sum|cut -d ' ' -f1
3.攻击者入侵服务器的利用的方法是?
可以看/home/app下有日志文件
利用R-STUDIO工具恢复这两个文件
发现使用的网上的人人框架
对jar包反编译,发现shiro 版本为 1.2.4
存在shiro反序列化漏洞
利用英文进行md5
shirodeserialization
echo -n 'shirodeserialization'|md5sum|cut -d ' ' -f1
4.攻击者的IP是?
查看ssh日志
cat /var/log/auth.log | less
发现来自81.70.166.3 多次失败登录记录,猜测为攻击者暴力破解ssh
81.70.166.3
echo -n '81.70.166.3'|md5sum|cut -d ' ' -f1
5.攻击者发起攻击时使用的User-Agent是?(答案中如有空格均需去除,如有大写均需变为小写,使用echo -n 'strings'|md5sum|cut -d ' ' -f1获取md5值作为答案)
查看nginx日志
cat /var/log/nginx/access.log
攻击者最后的记录
echo -n 'mozilla/5.0(compatible;baiduspider/2.0;+http://www.baidu.com/search/spider.html)'|md5sum|cut -d ' ' -f1
6.攻击者使用了两种权限维持手段,相应的配置文件路径是?(md5加密后以a开头)(答案中如有空格均需去除,如有大写均需变为小写,使用echo -n 'strings'|md5sum|cut -d ' ' -f1获取md5值作为答案)
查看ssh日志,可知攻击者通过ssh公私钥成功登录,所以第一种权限维持方法为ssh公私钥登录
ssh公私钥配置文件一般是/root/.ssh/authorized_keys
echo -n '/root/.ssh/authorized_keys'|md5sum|cut -d ' ' -f1
7.攻击者使用了两种权限维持手段,相应的配置文件路径是?(md5加密后以b开头)(答案中如有空格均需去除,如有大写均需变为小写,使用echo -n 'strings'|md5sum|cut -d ' ' -f1获取md5值作为答案)
检测常见Linux下的权限维持手段
crontab -l命令检查当前用户的计划任务
使用find / -name ".*" 2>/dev/null查找系统中的隐藏文件
查看影子账户
查看有无敏感启动任务 systemctl list-unit-files --type=service
发现redis.service
查看启动任务的文件地址systemctl cat redis.service
echo -n '/lib/systemd/system/redis.service'|md5sum|cut -d ' ' -f1
ps:恢复出挖矿程序
放入微步云沙箱
数据分析-SSW
1.连接蚁剑的正确密码是______________?
Wireshark 过滤器 tcp contains "$_POST"
这边通过sql联合注入写了两个webshell进去
连接蚁剑的密码都是6ea280898e404bfabd0ebb702327b18f
但在实际利用时又出现了其他的答案
经过实验,发现6ea280898e404bfabd0ebb702327b19f成功
2.题目内容:攻击者留存的值是______________?
应该是攻击者向某个文件写入了某个值
过滤POST包,具体分析报文中的脚本代码
对value值显示分组字节,使用base64解码
no
no
yes
ad6269b7-3ce2-4ae8-b97f-f259515e7a91
3.题目内容:攻击者下载到的flag是______________?
http导出对象,发现一个可以的php文件,有5M??
VScode无法打开
改后缀为exe后,与64位无法兼容
用010打开,删除前面的三个字节,重新保存为exe文件
运行文件后,会在上一级目录下生成一张图片
感觉宽高比例不太对劲
010打开显示为png,修改后缀后,010重新识别,修改 为605*800,出现flag
数据分析-BF
1.题目内容:磁盘中的key是多少?
使用R-STUDIO挂载磁盘,显示加密
解法一:使用EFDD解密
使用Arsenal Image Mounter挂载加密盘
选择第一个 Decrypt
选择第一个
上面选择需要解密的盘,下面选择配合解密的内存文件
解密成功,得到恢复密钥的hex,点击下一步
得到恢复密钥
560604-255013-655633-128854-663223-316063-484946-476498
点击加密盘,输入恢复密钥
成功解密,打开就能看见key文件
使用随波逐流一键解密,发现key值 thekeyis2e80307085fd2b5c49c968c323ee25d5
解法二:不解密磁盘直接去内存中取出解密
识别内存镜像信息
暂时无法在飞书文档外展示此内容
判断内存镜像中敏感信息数据
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}.+"
导出key.txt
python2 vol.py -f baby_forensics.raw --profile=Win7SP1x64 dumpfiles -Q 0x000000003df94070 -D ./
成功得到密文,解密方法同方法一
2.题目内容:电脑中正在运行的计算器的运行结果是多少?
解法一:利用vol查看windows程序句柄信息
python2 vol.py -f baby_forensics.raw --profile=Win7SP1x64 pslist
先查看计算器进程信息
保存window句柄信息
$ vol.py -f baby_forensics.raw --profile=Win7SP1x64 windows > windows
根据calc.exe 检查window文件
grep -i -C 10 "calc" windows
成功找到 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
没什么有用的信息
根据之前查看的calc进程地址信息,dump对应进程内存
python2 vol.py -f baby_forensics.raw --profile=Win7SP1x64 memdump -p 2844 --dump-dir=./
重命名2844.dmp为2844.data
使用gimp打开,打开方式选择“原始图像”
kail安装gimp
sudo apt update
sudo apt install gimp
修改图片位移、宽高,原则是可以调出来的,但我放弃了~
借用一下其他师傅成功图片
3.题目内容:该内存文件中存在的flag值是多少?
U2Fsd 是一种特定的加密数据格式的前缀,通常表示经过加密处理的数据。它实际上是“universal 2nd Factor Data format”(通用第二因素数据格式)的 Base64 编码
解法一:010打开内存镜像,查找以U2Fsd的字符串,发现疑似密文
发现疑似单独的密钥文件
网上找了很多个AES解密才解密成功,不知道为什么???
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=./
用010打开,还是搜索U2fsd,不过需要删除\par
利用R-STUDIO打开内存镜像,在music文件夹下发现密钥qwerasdf
数据分析-EW
1.服务器自带的后门文件名是什么?(含文件后缀)
通过wireshark过滤出post包,通常利用后门文件post命令,发现有三个php文件

其中的d00r.php为传送系统命令
所以服务器自带的后门文件为ViewMore.php
2.服务器的内网IP是多少?
根据上一道题可以看出ip地址为192.168.162.130,不过测试后不对

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

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

3.攻击者往服务器中写入的key是什么?
在后门文件传输的最后一个数据包里,发现攻击者写入的脚本

先进行url解密

base64解码出来是一个压缩包

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

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

数据分析-HD
1.admIn用户的密码是什么?
查看加载login脚本的包,发现采用AES加密,包含key和IV

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

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

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

所以寻找流56,账号正确

解密密码 flag{WelC0m5_TO_H3re}

2.app.config['SECRET_KEY']值为多少?
使用tcp contain “SECRET_KEY” 过滤,发现两个包

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

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

3.flask网站由哪个用户启动?
在流76中得到cookie

需要使用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"

发现进行了whoami的命令执行,不过下面的流量包没有回显
但是具有cookie,利用同样的方法进行session解密
python flask_session_cookie_manager3.py decode -s "ssti_flask_hsfvaldb" -c ".eJwdylsKAyEMQNGtFEGiUGYBs5VpkRQz04AvjNIPce-t_TyXO9QZ8FK7quQfSd1VF6oJI_3S0HzehEQ4p60Xj43MgPXDHrhIjwc4d4X8wiDOwfNPatwoLhrIAvaAkgulxc87Y2SwWyX0xk6r59CUPJ96qvkFHeUvmg.YpIQkg.65xf8l2g9fXAImkfyihId46KkY4"
登录账号为red

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进行解密

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

存马路径就是add_url_rule后面的Index
数据分析-TP
1.攻击者通过暴力破解进入了某Wiki 文档,请给出登录的用户名与密码,以:拼接,比如admin:admin
在http导出对象中找login页面,往流量包较大的找

找返回包200的

几个账号都是一样的

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

找errcode:200

最后找到密码

TMjpxFGQwD:123457
2.攻击者发现软件存在越权漏洞,请给出攻击者越权使用的cookie的内容的md5值。(32位小写)、
在登陆成功后,找到两个常见的cookie

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

3.攻击使用jdbc漏洞读取了应用配置文件,给出配置中的数据库账号密码,以:拼接,比如root:123456
在登陆成功后的tcp流量包里,发现数据库的账号密码

username: zyplayer
password: 1234567
4.攻击者又使用了CVE漏洞攻击应用,执行系统命令,请给出此CVE编号以及远程EXP的文件名,使用:拼接,比如CVE-2020-19817:exp.so
还是往后找tcp流量包,发现奇怪的文件,和包含/bin/bash的内容

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

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


CVE-2022-21724:custom.dtd.xml
5.给出攻击者获取系统权限后,下载的工具的名称,比如nmap
还是往后找远程连接的流量包,可以发现从github上下了一个工具

根据目录名发现是fscan
数据分析-WS
-
被入侵主机的IP是?

主要就是两个IP,0.1是路由,所以主机IP是192.168.246.28
2.被入侵主机的口令是?
查看第一个流量包,发现password

3.用户目录下第二个文件夹的名称是?
根据ls命令可以知道,返回包包括了当前目录下的文件名,去掉特殊字符

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


浙公网安备 33010602011771号