Selamlar, bugün gerçekten ilginç ama CTF ortamlarında karşımıza gelebilecek bir yetki yükseltme konusu olan Python Library Hijacking konusuna değineceğiz. Eğer bir makinede sudo yetkisiyle çalışan bir Python Scripti bulduysanız ve o scriptin bulunduğu dizine yazma izniniz varsa O makinenin gerçekten yeni sahibi olabiliriz. Evet böyle söyleyince nasıl olucak diyo olabilirsin ama şimdi adım adım bütün mantığıyla anlatıcaz. Bu işin temel mantığında şu yatıyor; Python'da bir kütüphaneyi örneğin,
import requests
import os
Bu şekilde çağırdığınızda Python bu dosyaları bulmak için belli bir sıraya göre arama yapıyor, bu sıraya sys.path deniyor. Sıralama genelde şöyledir:
- Mevcut Çalışma Dizini: Scriptin olduğu yer.
- PYTHONPATH: Varsa ortam değişkenleri.
- Standart Kütüphaneler: Python'ın kurulu olduğu
/usr/lib/python3.x/gibi sistem klasörleri.
İşte zaafiyet burada tam olarak ilk maddede yatıyor. Python, 'random' kütüphanesini ararken önce scriptin olduğu klasöre bakar. Eğer orada random.py adında bir dosya bulursa, evet buldum diyerek sistemin orijinal kütüphanesine gitmek yerine oradaki random.py dosyasını çalıştırıyor.
Diyelim ki bir Linux makinesine sızdınız (root değilde user kullanıcısı olarak) ve sudo -l çektiniz karşınıza şöyle bir çıktı geldi;
User user may run the following commands on target:
(root) NOPASSWD: /usr/bin/python3 /opt/scripts/backup_tool.py
```
Bu çıktı gerçekten çok güzel, Root yetkisiyle çalışan bir Python scriptimiz var. Scriptin içeriğine baktığımızda şöyle bir şey görüyoruz:
```bash
# /opt/scripts/backup_tool.py
import zipfile
import datetime
print("Yedekleme başlatılıyor...")
# ...yedekleme kodları...
Burada zipfile kütüphanesi import ediliyor. Şimdi kritik soru şu; çıktıda gördüğümüz /opt/scripts klasörüne yazma iznimiz var mı? Eğer cevabımız evetse oyun bitti demektir.
Şimdi yazma iznimizin olduğunu varsayarak devam ediyoruz. Scriptimizin olduğu dizine gidiyoruz ve zipfile.py adında sahte yetki yükseltme dosyamızı yazacağız. Çünkü adam dizinde zipfile arayacak sonra görecekki zipfile.py adında dosya var o zaman bunu çekip çalıştırıyorum diyecek bizde zaafiyeti çalıştırmış olacağız. zipfile dosyamızı şu şekilde oluşturuyoruz.
import os
os.system("/bin/bash")
Bu komutla amacımız shell açmak. Dosyayı kaydediyoruz ve şu şekilde çalıştırıyoruz.
sudo /usr/bin/python3 /opt/scripts/backup_tool.py
Komutu çalıştırdığımızda Python, gerçek zipfile kütüphanesi yerine bizim dizinimize yazdığımız kendi scriptimizi çalıştıracak ve root yetkisiyle çalıştığı için otomatik root shell almış olacağız, ve sonuç;
root@target:~#
Şeklinde olucaktır ve yetki yükseltmeyi başarılı şekilde yapmış olacağız.