* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
Encontre vulnerabilidades que são mais importantes para que você possa corrigi-las mais rapidamente. O Intruder rastreia sua superfície de ataque, executa varreduras proativas de ameaças, encontra problemas em toda a sua pilha de tecnologia, desde APIs até aplicativos da web e sistemas em nuvem. [**Experimente gratuitamente**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoje.
A primeira coisa que você precisa saber é se pode executar código diretamente com alguma biblioteca já importada, ou se pode importar alguma dessas bibliotecas:
Lembre-se de que as funções _**open**_ e _**read**_ podem ser úteis para **ler arquivos** dentro do sandbox do Python e para **escrever algum código** que você possa **executar** para **burlar** o sandbox.
O Python tenta **carregar bibliotecas do diretório atual primeiro** (o seguinte comando irá imprimir de onde o Python está carregando os módulos): `python3 -c 'import sys; print(sys.path)'`
Você pode encontrar uma **lista de pacotes pré-instalados** aqui: [https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html](https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html)\
Observe que a partir de um pickle, você pode fazer com que o ambiente Python **importe bibliotecas arbitrárias** instaladas no sistema.\
Por exemplo, o seguinte pickle, quando carregado, vai importar a biblioteca pip para usá-la:
Para obter mais informações sobre como o pickle funciona, verifique este link: [https://checkoway.net/musings/pickle/](https://checkoway.net/musings/pickle/)
Você pode baixar o pacote para criar o shell reverso aqui. Por favor, observe que antes de usá-lo você deve **descompactá-lo, alterar o `setup.py` e colocar seu IP para o shell reverso**:
Este pacote é chamado de `Reverse`. No entanto, ele foi especialmente criado para que, quando você sair do shell reverso, o restante da instalação falhará, para que você **não deixe nenhum pacote Python extra instalado no servidor** quando sair.
Existem várias bibliotecas além do `exec` embutido do Python que podem ser usadas para avaliar código Python. Essas bibliotecas fornecem recursos adicionais e podem ser úteis em certos cenários. Alguns exemplos dessas bibliotecas são:
-`ast`: A biblioteca `ast` fornece uma interface para analisar e manipular árvores de sintaxe abstrata (AST) do Python. Ela permite que você analise o código Python em uma estrutura de dados hierárquica e execute operações nele.
-`compile`: A função `compile` do Python permite compilar código Python em um objeto de código, que pode ser executado posteriormente. Ela pode ser usada para avaliar código Python de forma segura, fornecendo opções de controle sobre as permissões e recursos disponíveis durante a execução.
-`eval`: A função `eval` do Python permite avaliar expressões Python a partir de uma string. Ela pode ser usada para executar código Python dinamicamente, mas deve ser usada com cuidado, pois pode representar um risco de segurança se usado incorretamente.
Essas bibliotecas podem ser úteis para contornar restrições de segurança ou limitações impostas por ambientes de execução específicos. No entanto, é importante lembrar que a avaliação de código Python arbitrário pode representar um risco de segurança e deve ser feita com cautela.
When bypassing Python sandboxes, it is important to be familiar with certain operators and short tricks that can help you evade restrictions and execute unauthorized code. Here are some commonly used techniques:
### 1. Logical Operators
Logical operators such as `and`, `or`, and `not` can be used to manipulate conditions and control the flow of execution. By strategically using these operators, you can bypass sandbox restrictions and execute forbidden code.
### 2. Bitwise Operators
Bitwise operators like `&`, `|`, `^`, `~`, `<<`, and `>>` can be used to perform operations at the bit level. These operators can be useful in manipulating values and bypassing restrictions imposed by Python sandboxes.
### 3. Short Tricks
There are several short tricks that can be used to bypass Python sandboxes. Some of these include:
- Using `__import__` to import restricted modules.
- Leveraging `eval` and `exec` functions to execute arbitrary code.
- Utilizing `getattr` and `setattr` functions to access and modify restricted attributes.
- Exploiting the `__builtins__` module to access restricted functions and objects.
By understanding and utilizing these operators and short tricks, you can enhance your ability to bypass Python sandboxes and execute unauthorized code. However, it is important to note that these techniques should only be used for legitimate purposes, such as penetration testing and security research.
Neste [**artigo**](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy), o UTF-7 é usado para carregar e executar código Python arbitrário dentro de um suposto sandbox:
Se você estiver dentro de uma prisão Python que **não permite fazer chamadas**, ainda existem algumas maneiras de **executar funções, código** e **comandos** arbitrários.
Se você pode **declarar uma classe** e **criar um objeto** dessa classe, você pode **escrever/sobrescrever diferentes métodos** que podem ser **acionados****sem** a necessidade de chamá-los diretamente.
Você pode modificar alguns **métodos de classe** (_sobrescrevendo métodos de classe existentes ou criando uma nova classe_) para fazer com que eles **executem código arbitrário** quando **acionados** sem chamá-los diretamente.
A coisa chave que as metaclasses nos permitem fazer é **criar uma instância de uma classe, sem chamar o construtor** diretamente, criando uma nova classe com a classe alvo como metaclass.
Quando uma **exceção é disparada**, um objeto da classe **Exception** é **criado** sem que você precise chamar o construtor diretamente (um truque de [**@\_nag0mez**](https://mobile.twitter.com/\_nag0mez)):
Python sandboxes are security mechanisms that restrict the execution of certain operations or limit access to sensitive resources within a Python environment. These sandboxes are commonly used to prevent untrusted code from executing malicious actions or accessing unauthorized data.
As a hacker, bypassing Python sandboxes can be a valuable skill to gain unauthorized access or execute arbitrary code within a restricted environment. In this section, we will explore some techniques and resources to bypass Python sandboxes.
##### 1. Exploiting Vulnerabilities
##### 1. Explorando Vulnerabilidades
One common approach to bypassing Python sandboxes is by exploiting vulnerabilities in the sandbox implementation itself. By identifying and exploiting these vulnerabilities, an attacker can gain elevated privileges or escape the sandbox entirely.
To find vulnerabilities in Python sandboxes, you can start by analyzing the sandbox implementation code or searching for known vulnerabilities in popular sandboxing libraries. Once a vulnerability is identified, you can develop an exploit to bypass the sandbox's restrictions.
##### 2. Dynamic Code Execution
##### 2. Execução de Código Dinâmico
Another technique to bypass Python sandboxes is by using dynamic code execution. Sandboxes often restrict the execution of certain functions or modules, but they may allow the execution of dynamically generated code.
By leveraging the `exec()` or `eval()` functions in Python, an attacker can execute arbitrary code within the sandboxed environment. This can be achieved by crafting the code as a string and passing it to the `exec()` or `eval()` functions for execution.
Module hijacking involves replacing or modifying a legitimate module used within the sandbox with a malicious one. This technique takes advantage of the sandbox's reliance on specific modules and their functionality.
To perform module hijacking, an attacker needs to identify the modules used by the sandbox and find a way to replace them with malicious versions. This can be done by manipulating the Python import system or modifying the module files directly.
In some cases, a sandbox may not be completely secure, allowing for potential escape techniques. These techniques involve exploiting vulnerabilities or misconfigurations in the sandbox environment to break out of its restrictions.
Common sandbox escape techniques include exploiting file system access restrictions, bypassing process isolation, or leveraging insecure sandbox configurations. By successfully escaping the sandbox, an attacker can gain full control over the underlying system.
Understanding the sandboxed environment is crucial for bypassing Python sandboxes. By analyzing the sandbox's configuration, restrictions, and underlying technologies, an attacker can identify potential weaknesses or misconfigurations.
Tools like `sandbox-identifier` can help in analyzing the sandboxed environment and identifying its limitations. Additionally, manual inspection of the sandbox's configuration files and dependencies can provide valuable insights for bypassing its restrictions.
Exploit development resources, such as exploit frameworks and vulnerability databases, can be valuable assets for bypassing Python sandboxes. These resources provide information about known vulnerabilities, exploit techniques, and proof-of-concept code.
Popular exploit development frameworks like Metasploit and ExploitDB can be used to search for Python sandbox-related exploits. By leveraging these resources, an attacker can save time and effort in developing their own exploits.
Bypassing Python sandboxes requires a deep understanding of the sandbox's implementation, vulnerabilities, and underlying technologies. By exploiting vulnerabilities, using dynamic code execution, performing module hijacking, employing sandbox escape techniques, analyzing the sandboxed environment, and leveraging exploit development resources, an attacker can successfully bypass Python sandboxes and gain unauthorized access or execute arbitrary code within a restricted environment.
Para contornar as restrições de segurança impostas por ambientes de execução Python, como sandboxes, você pode usar a função `help()` e a licença `builtins`. Essas técnicas permitem que você leia arquivos mesmo quando o acesso direto a eles é bloqueado.
Ao executar esse código, a função `help()` exibirá a documentação dos módulos e funções internas do Python, permitindo que você acesse o conteúdo do arquivo. Certifique-se de substituir `'arquivo_secreto.txt'` pelo caminho correto do arquivo que você deseja ler.
Lembre-se de que essas técnicas devem ser usadas com responsabilidade e apenas para fins legais e éticos, como testes de penetração autorizados ou para fins educacionais. O uso indevido dessas técnicas pode resultar em consequências legais graves.
Encontre as vulnerabilidades mais importantes para que você possa corrigi-las mais rapidamente. O Intruder rastreia sua superfície de ataque, executa varreduras proativas de ameaças, encontra problemas em toda a sua pilha de tecnologia, desde APIs até aplicativos da web e sistemas em nuvem. [**Experimente gratuitamente**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoje.
Se você pode acessar o objeto **`__builtins__`**, você pode importar bibliotecas (observe que você também pode usar aqui outra representação de string mostrada na última seção):
Quando você não tem `__builtins__`, não será capaz de importar nada, nem mesmo ler ou escrever arquivos, pois **todas as funções globais** (como `open`, `import`, `print`...) **não são carregadas**.\
No entanto, **por padrão, o Python importa muitos módulos na memória**. Esses módulos podem parecer inofensivos, mas alguns deles também estão importando funcionalidades perigosas dentro deles que podem ser acessadas para obter até mesmo **execução de código arbitrário**.
Nos exemplos a seguir, você pode observar como **abusar** de alguns desses módulos "**inofensivos**" carregados para **acessar****funcionalidades perigosas** dentro deles.
O Python3 é uma linguagem de programação de alto nível amplamente utilizada para desenvolvimento de software. É conhecida por sua sintaxe simples e legibilidade, o que a torna uma escolha popular entre os desenvolvedores.
No entanto, quando se trata de segurança, o Python3 pode ser vulnerável a ataques. Uma das técnicas comuns usadas para proteger o ambiente Python é o uso de "sandboxes" (ambientes isolados) para restringir o acesso a recursos sensíveis do sistema.
Uma sandbox Python é um mecanismo de segurança que limita as ações que um programa Python pode realizar. Isso é feito restringindo o acesso a certas bibliotecas, funções e recursos do sistema operacional.
No entanto, as sandboxes Python não são perfeitas e podem ser contornadas por hackers experientes. Existem várias técnicas que podem ser usadas para contornar as sandboxes Python e obter acesso não autorizado a recursos restritos.
Este diretório contém exemplos de técnicas de contorno de sandboxes Python, juntamente com recursos úteis para entender e explorar essas vulnerabilidades. É importante ressaltar que essas técnicas devem ser usadas apenas para fins educacionais e éticos, como parte de um teste de penetração autorizado.
- **Bypassing Module Restrictions**: Esta técnica envolve a importação de módulos restritos pela sandbox Python, permitindo que o hacker acesse recursos não autorizados.
- **Exploiting Weak Sandbox Configurations**: Algumas sandboxes Python podem ter configurações fracas que podem ser exploradas para contornar as restrições e obter acesso não autorizado.
- **Using Native Extensions**: Esta técnica envolve o uso de extensões nativas para contornar as restrições da sandbox Python e executar código não autorizado.
- **Exploiting Sandbox Escape Vulnerabilities**: Algumas sandboxes Python podem ter vulnerabilidades que podem ser exploradas para escapar da sandbox e obter acesso não autorizado.
- **Using Dynamic Code Execution**: Esta técnica envolve a execução de código dinâmico para contornar as restrições da sandbox Python e executar código não autorizado.
É importante entender que a segurança de um ambiente Python depende de várias camadas de proteção, incluindo a configuração adequada da sandbox, a aplicação de patches de segurança e a adoção de boas práticas de programação segura.
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "builtins" in x.__init__.__globals__ ][0]["builtins"]
[**Abaixo há uma função maior**](./#recursive-search-of-builtins-globals) para encontrar dezenas/**centenas** de **locais** onde você pode encontrar os **builtins**.
As cargas úteis de `builtins` são uma técnica comum usada para contornar as restrições de segurança impostas pelas sandboxes Python. Essas sandboxes são projetadas para restringir o acesso a certas funcionalidades perigosas do Python, como a execução de comandos do sistema ou a leitura/gravação de arquivos.
No entanto, as cargas úteis de `builtins` exploram as funcionalidades permitidas pelas sandboxes para executar ações não autorizadas. Isso é possível porque as sandboxes geralmente permitem o acesso a certos módulos e funções internas do Python, como `__import__` e `eval`.
Ao usar cargas úteis de `builtins`, os hackers podem importar módulos maliciosos ou executar código arbitrário dentro da sandbox, contornando assim as restrições de segurança. Essas cargas úteis podem ser usadas para realizar uma variedade de atividades maliciosas, como a execução de comandos do sistema, a leitura de arquivos confidenciais ou a exfiltração de dados.
É importante ressaltar que o uso de cargas úteis de `builtins` para contornar sandboxes Python é uma atividade ilegal e antiética. Essas técnicas devem ser usadas apenas para fins educacionais e de pesquisa, com o consentimento explícito do proprietário do sistema alvo.
[**Abaixo há uma função maior**](./#recursive-search-of-builtins-globals) para encontrar dezenas/**centenas** de **locais** onde você pode encontrar as **globais**.
Uma das partes mais sensíveis dessa técnica é ser capaz de **acessar as subclasses base**. Nos exemplos anteriores, isso foi feito usando `''.__class__.__base__.__subclasses__()` mas existem **outras maneiras possíveis**:
Por exemplo, sabendo que com a biblioteca **`sys`** é possível **importar bibliotecas arbitrárias**, você pode procurar por todos os **módulos carregados que tenham importado sys dentro deles**:
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ][0]["sys"].modules["os"].system("ls")
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "os" in x.__init__.__globals__ ][0]["os"].system("ls")
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "os" == x.__init__.__globals__["__name__"] ][0]["system"]("ls")
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "'os." in str(x) ][0]['system']('ls')
#subprocess
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "subprocess" == x.__init__.__globals__["__name__"] ][0]["Popen"]("ls")
[ x for x in ''.__class__.__base__.__subclasses__() if "'subprocess." in str(x) ][0]['Popen']('ls')
[ x for x in ''.__class__.__base__.__subclasses__() if x.__name__ == 'Popen' ][0]('ls')
#builtins
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "__bultins__" in x.__init__.__globals__ ]
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "builtins" in x.__init__.__globals__ ][0]["builtins"].__import__("os").system("ls")
#sys
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ][0]["sys"].modules["os"].system("ls")
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "'_sitebuiltins." in str(x) and not "_Helper" in str(x) ][0]["sys"].modules["os"].system("ls")
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "commands" in x.__init__.__globals__ ][0]["commands"].getoutput("ls")
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "pty" in x.__init__.__globals__ ][0]["pty"].spawn("ls")
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "importlib" in x.__init__.__globals__ ][0]["importlib"].import_module("os").system("ls")
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "importlib" in x.__init__.__globals__ ][0]["importlib"].__import__("os").system("ls")
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "'imp." in str(x) ][0]["importlib"].import_module("os").system("ls")
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "'imp." in str(x) ][0]["importlib"].__import__("os").system("ls")
#pdb
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "pdb" in x.__init__.__globals__ ][0]["pdb"].os.system("ls")
Além disso, se você acredita que **outras bibliotecas** possam ser capazes de **invocar funções para executar comandos**, também podemos **filtrar por nomes de funções** dentro das bibliotecas possíveis:
vuln_funcs = [ x.__name__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) for k in x.__init__.__globals__ if k == b ]
Isso é simplesmente **incrível**. Se você está **procurando por um objeto como globals, builtins, open ou qualquer outro**, basta usar este script para **encontrar recursivamente os locais onde você pode encontrar esse objeto**.
Encontre vulnerabilidades que são mais importantes para que você possa corrigi-las mais rapidamente. O Intruder rastreia sua superfície de ataque, executa varreduras proativas de ameaças, encontra problemas em toda a sua pilha de tecnologia, desde APIs até aplicativos da web e sistemas em nuvem. [**Experimente gratuitamente**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoje.
Se você **enviar** uma **string** para o python que será **formatada**, você pode usar `{}` para acessar **informações internas do python**. Você pode usar os exemplos anteriores para acessar globais ou builtins, por exemplo.
Observe como você pode **acessar atributos** de forma normal com um **ponto** como `people_obj.__init__` e elementos de um **dicionário** com **parênteses** sem aspas `__globals__[CONFIG]`
Também observe que você pode usar `.__dict__` para enumerar elementos de um objeto `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`
Algumas outras características interessantes das strings de formatação é a possibilidade de **executar** as **funções****`str`**, **`repr`** e **`ascii`** no objeto indicado adicionando **`!s`**, **`!r`**, **`!a`** respectivamente:
Se você quer **aprender** sobre **bytecode do Python** em profundidade, leia este **incrível** artigo sobre o assunto: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d)
Em alguns CTFs, você pode receber o nome de uma **função personalizada onde a flag** está localizada e você precisa ver os **detalhes** da **função** para extraí-la.
A função `dir()` em Python retorna uma lista de nomes de atributos e métodos de um objeto. É uma função interna do Python que pode ser usada para explorar a estrutura de um objeto e descobrir quais atributos e métodos estão disponíveis.
##### Sintaxe
```python
dir(objeto)
```
##### Parâmetros
-`objeto`: o objeto do qual se deseja obter os atributos e métodos.
##### Retorno
A função `dir()` retorna uma lista de strings contendo os nomes dos atributos e métodos do objeto.
Neste exemplo, a função `dir()` é usada para obter os atributos e métodos do objeto `obj`. A saída mostra uma lista de nomes, incluindo os atributos `nome` e os métodos `metodo`.
`__globals__` e `func_globals` (mesmo) obtêm o ambiente global. No exemplo, você pode ver alguns módulos importados, algumas variáveis globais e seu conteúdo declarado:
To bypass Python sandboxes, it is crucial to gather as much information about the code as possible. This includes understanding the programming language, libraries, and frameworks used, as well as any external dependencies. Here are some techniques to obtain code information:
#### 1. Reading the Source Code
Reading the source code is the most direct way to understand how the code works. Analyze the code line by line, paying attention to any security measures or restrictions implemented.
#### 2. Decompiling Bytecode
If the source code is not available, it may be necessary to decompile the bytecode. Python bytecode can be decompiled using tools like `uncompyle6` or `pycdc`. This process allows you to obtain a readable version of the code, which can be analyzed for vulnerabilities.
Identifying the libraries and frameworks used by the code is essential for understanding its functionality. Use tools like `pip` or `pipenv` to list the installed dependencies. Research these dependencies for any known vulnerabilities or weaknesses.
Reverse engineering involves analyzing the compiled code to understand its inner workings. Tools like `IDA Pro` or `Ghidra` can be used to disassemble and decompile the code, providing insights into its functionality and potential vulnerabilities.
Performing dynamic analysis involves running the code in a controlled environment and monitoring its behavior. Use tools like `strace` or `ltrace` to trace system calls and library calls made by the code. This can help identify any attempts to bypass sandboxes or execute malicious actions.
By gathering comprehensive information about the code, you can better understand its vulnerabilities and devise effective strategies to bypass Python sandboxes.
Ao realizar a análise de um programa, pode ser útil desmontar uma função para entender seu funcionamento interno. A desmontagem de uma função envolve a conversão do código de máquina em uma representação legível para humanos.
Existem várias ferramentas disponíveis para desmontar funções em diferentes linguagens de programação. Neste guia, vamos nos concentrar na desmontagem de funções em Python.
#### **Desmontagem de funções em Python**
A biblioteca padrão do Python fornece o módulo `dis`, que pode ser usado para desmontar funções Python. O módulo `dis` permite visualizar o bytecode Python gerado a partir do código fonte.
Aqui está um exemplo de como desmontar uma função em Python usando o módulo `dis`:
```python
import dis
def my_function():
x = 10
y = 20
z = x + y
print(z)
dis.dis(my_function)
```
Ao executar o código acima, você verá a desmontagem da função `my_function`, que mostrará o bytecode Python gerado para cada instrução da função.
A desmontagem de uma função pode ser útil para entender como o código Python é interpretado e executado pelo interpretador Python. Isso pode ser especialmente útil ao analisar código malicioso ou ao realizar testes de penetração.
Observe que **se você não conseguir importar `dis` no sandbox do Python**, você pode obter o **bytecode** da função (`get_flag.func_code.co_code`) e **desmontá-lo** localmente. Você não verá o conteúdo das variáveis sendo carregadas (`LOAD_CONST`), mas pode deduzi-las a partir de (`get_flag.func_code.co_consts`), pois `LOAD_CONST` também indica o deslocamento da variável sendo carregada.
Agora, vamos imaginar que de alguma forma você possa **extrair as informações sobre uma função que você não pode executar**, mas que você **precisa** executar.\
Como no exemplo a seguir, você **pode acessar o objeto de código** dessa função, mas apenas lendo o desmontador você **não sabe como calcular a flag** (_imagine uma função `calc_flag` mais complexa_).
Dependendo da versão do Python, os **parâmetros** de `code_type` podem ter uma **ordem diferente**. A melhor maneira de saber a ordem dos parâmetros na versão do Python que você está executando é executar:
'code(argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize,\n flags, codestring, constants, names, varnames, filename, name,\n firstlineno, lnotab[, freevars[, cellvars]])\n\nCreate a code object. Not for the faint of heart.'
No exemplo a seguir, vamos pegar todos os dados necessários para recriar a função a partir do objeto de código da função diretamente. Em um **exemplo real**, todos os **valores** para executar a função **`code_type`** é o que **você precisará vazar**.
Nos exemplos anteriores no início deste post, você pode ver **como executar qualquer código Python usando a função `compile`**. Isso é interessante porque você pode **executar scripts inteiros** com loops e tudo em uma **linha única** (e poderíamos fazer o mesmo usando **`exec`**).\
De qualquer forma, às vezes pode ser útil **criar** um **objeto compilado** em uma máquina local e executá-lo na máquina do **CTF** (por exemplo, porque não temos a função `compile` no CTF).
Se você não consegue acessar `eval` ou `exec`, você pode criar uma **função adequada**, mas chamá-la diretamente geralmente falhará com: _constructor not accessible in restricted mode_. Portanto, você precisa de uma **função que não esteja no ambiente restrito para chamar essa função**.
O Python executado com otimizações usando o parâmetro `-O` removerá as declarações de assert e qualquer código condicional com base no valor de **debug**. Portanto, verificações como
Encontre vulnerabilidades que são mais importantes para que você possa corrigi-las mais rapidamente. O Intruder rastreia sua superfície de ataque, executa varreduras proativas de ameaças, encontra problemas em toda a sua pilha de tecnologia, desde APIs até aplicativos da web e sistemas em nuvem. [**Experimente gratuitamente**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoje.
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).