SIGNAL/NOISE English

Kapanan döngü

yazı · signal / noise

Güvenlik eğitimi, işin kendisinde olmayan bir yerden ikiye bölünmüş durumda. Saldırdığınız oyunlar var, alarm ayıkladığınız platformlar var, ikisi farklı insanlara farklı fiyatlarla satılıyor. Hafta sonunu makine kökleyerek geçiren kişi, kendi taramasının birinin konsoluna yazdığı satırı hiç görmüyor. Kuyruk eleyen kişi de önündeki elli satırın hangisinin bir insan, hangisinin her gece üçte çalışan bir yedekleme betiği olduğunu öğrenmiyor. İki yarı da iyi öğretiliyor. Öğretilmeyen şey ikisinin birleştiği yer, ve iş tam olarak orası.

Signal / Noise o birleşme yerini tek bir noktada kuruyor. Bir sözleşmeyi bitirdiğinizde oyun sizi müşterinin dışarıdan hizmet aldığı SOC'a oturtuyor, son bir saatin alarmlarını önünüze koyuyor ve tek bir şey soruyor: "bu kuyrukta hangisi sensin?"

Bir sözleşme, iki uçtan

İlk sözleşme SN-0028: geçen yıl bir sunucu bloğu devralmış, envanter listesini kaybetmiş bir nakliye şirketi. Kapsam 10.13.37.0/24. Hiçbir sisteme girilmiyor. Kendi makinenizdeki sözleşme dosyasını okuyor, bloğu tarıyor, sürümleri çıkarıyor, üç makineden birinin listede olmadığını görüyor ve o makinenin 8080'de sunduğu durum sayfasının HTML yorumundan varlık etiketini alıyorsunuz. Görev dosyasındaki tahmine göre on iki dakika.

Sonra vardiya başlıyor. Aynı akşam, gece masası, konsolda beş satır:

13:04:11  5501    3   10.0.0.4        PAM: oturum acildi (cron)
13:11:39  31101   5   10.0.0.211      Web server 400 error code
13:20:00  100010  5   10.13.37.5      Cok sayida kapali porta baglanti
13:20:05  100012  6   10.13.37.5      Servis banner sorgulama deseni
13:52:02  5402    3   10.0.0.4        Successful sudo to ROOT executed

Üç satır ofisin sıradan gecesi. Cron oturumu ile 13:52'deki sudo aynı yedekleme hesabı, her gece yaptığı şeyi yapıyor, ve her ikisi de neden olay sayılmadığının yazılı açıklamasını taşıyor. 400 ise ofisten bir çalışanın tarayıcısı. Tek bir 400 desen değildir.

İki satır size ait. 10.13.37.5, dört paragraf önce görev dosyasının kendi makinenize verdiği adres; 100010 kuralı ise tek bir kaynağın bir sürü kapalı porta dokunduğunu fark eden bir güvenlik duvarından geliyor. Vardiyanın tek sorusu şu: bloğu haritalayan kaynak hangisi. Cevap kendi IP'niz, ve tanımanız bir saniye sürüyor.

Asıl ders bunun altında, ve bu iş onun için yapıldı: işe yarayan istek kuyrukta yok. Envanterde olmayan makineye attığınız curl normal bir 200 döndürdü, hazır ruleset onu 31100 altında grupladı, seviye 0 olduğu için hiçbir alarm üretmedi. O konsolda aradığınızı bulduğunuz anı kaydeden hiçbir şey yok. Sizi ele veren şey kapıları saymanız oldu.

Aynı defter kırmızı tarafta da tutuluyor. Blok taraması 5 iz, sürüm tespiti 6 iz, bu sözleşmenin eşiği 30. Yani iki mavi satırı üreten keşif, otuz iz hakkınızın on birini harcadı. Eşiği geçmek görevi başarısız kılmıyor; ücretin dörtte birini götürüyor, ve oyun bunu tam geçtiğiniz anda söylüyor.

Dürüst not vermenin bedeli

Bu projede döngünün kendisinden daha uzun süren, daha sessiz bir iş var.

Oyun eskiden hedefleri çoğu eğitici oyunun yaptığı gibi kontrol ediyordu: yazdığınız komuta bakan bir düzenli ifade. cat rol-tanimlari biçiminde bir şey yazıyorsunuz ve "rol tanımlarını oku" hedefi kapanıyor. Kendi makinenizde, öyle bir dosya yokken, hiçbir şeye karşı. Yanlış dosyayı okumaya da hiçbir şey okumamaya da aynı puanı veriyordu. Üstelik desenlerin bir kısmı head ve tail kabul etmiyordu, yani oyun sessizce okuyucu tercihinizi puanlıyordu.

Doğru mekanizma motorda zaten vardı ve onu kullanan tek bir görev vardı. on_read olarak tanımlanan bir keşif cat, head, tail ve grep ile aynı şekilde tetikleniyor, mutlak dosya yolunu taşıyor ve dosyanın hangi makinede açıldığının da tutmasını şart koşuyor. Dönüşüm perde perde yürüdü: Perde IV'te yirmi bir hedef, Perde III'te yirmi yedi, Perde II'de on üç, Perde I'de dokuz. Perde III için başta otuz denmişti, yirmi yedi çıktı: ilk sayım desenin herhangi bir yerindeki cat dizisini yakalıyordu ve (>|rm|truncate) içinde bir tane var. O üçü bir dosyayı okumuyor, siliyor.

Bugün dört perde klasöründe 95 hedef bir dizeye değil bir bulguya bakıyor ve 66 keşif bir dosyanın açılmasıyla tetikleniyor. (Sayım kuralı: iki hedef "ya şunu oku ya da şunu çalıştır" diyor, ve o dallar da sayılıyor. Yalnızca üst düzey kontrollere bakarsanız 93 çıkar. İkisi de doğru, kural yazılmadıkça değil.) Sekiz tanesi yazılana değil dönen çıktıya bakıyor, ve bu bilinçli bir ayrım. Perde II'deki bir hedef "haziran kaydında saldırganın adresini ara" diyor; bunu bir okuma sayarsanız bütün kaydı cat'lemeye para ödemiş olursunuz, ki bu satırı ekrana getirir ama hiçbir şey bulmaz. Eşleşen bir grep hedefi kapatıyor. cat kapatmıyor.

Geriye 119 komut deseni kaldı (aynı kuralla; üst düzeyde 118), ve kalması gerekiyor. Onlar bir dizeyi değil bir eylemi ölçüyor: adı verilmiş bir bloğa karşı nmap, ssh-keygen, tar -c, aircrack-ng, bir cron dosyasının üzerine rm. Anahtar ürettiğinizi kanıtlayan bir dosya açılışı yoktur. Hayatta kalanların tam üçü bir okuma komutuna bakıyor ve üçü de tek bir şablonun üç varyantındaki aynı hedef: başarısız girişleri gözle saymak yerine grep -c ile saymak. Orada dersin kendisi -c tercihidir.

Bu dönüşümün kazandırdığı şey küçük ve gerçek. Eskiden yalnızca cat kabul eden bir hedefi artık head -40 de kapatıyor, hata veren bir komuta puan ödenmiyor, doğru biçimi yanlış makinede yazmak hiçbir işe yaramıyor. Bedeli ise şu: 95 mutlak dosya yolu kritik hâle geldi ve tek bir yanlış karakter, dosya hâlâ düzgün ayrıştığı hâlde bir hedefi kalıcı olarak ulaşılmaz yapıyor. Bu yüzden dönüşümle birlikte bir denetim geldi: her on_read'in makinede gerçekten var olan bir dosyayı adlandırdığını ve bir loot hedefinin beklediği her bulgunun bir yerden verildiğini doğruluyor.

Perde II, döngünün ücret almaya başladığı yer

Perde I boyunca mavi taraf bir ders. Saldırıyorsunuz, kendi izinizi okuyorsunuz, sonraki işe geçiyorsunuz ve yazdığınız hiçbir şey kalmıyor. Perde II bunu değiştiriyor. İkinci gece vardiyasında merkez sizden kendi kuralınızı istiyor: depo sunucusunda gece yarısı ile sabah altı arasında açılan oturumları yakala, yedeklemeye dokunma, çünkü o da o saatlerde çalışıyor. İki satırın yakalanması, dört satırın da görmezden gelinmesi gerekiyor, ve o dördün içinde 03:00:04'teki bir cron oturumu ile gündüz yapılmış meşru bir giriş var. Saat tek başına cevap değil.

Değerlendirme, ekrandaki satırları ikiye ayırmaktan ibaret değil. Her kural aynı olayların başka bir gecedeki hâline karşı yeniden çalıştırılıyor: süreç numaraları, kaynak portlar, ayın günü, dakika ve saniye değiştirilerek. Saate bilerek dokunulmuyor, çünkü birkaç sözleşme sabaha karşı üçte çalışan biri üzerine kurulu ve orada saat gürültü değil, sinyaldir. Bu testin sebebi şu: dört test oyuncusu birbirinden bağımsız olarak, on üç kural görevinin on birinin tek bir anlamsız sütuna düştüğünü buldu. Çıplak bir süreç numarası, birebir bir zaman damgası, Jun 14.

Sonra kural kaydediliyor, ve o andan itibaren sonraki her sözleşmede sizin kendi işinizin ürettiği satırlara karşı çalışıyor. Size seviyesinin bir buçuk katı kadar ize mal oluyor, ve seviyeyi siz belirliyorsunuz. Görev başına en fazla bir kez tetikleniyor, çünkü bir kaba kuvvet denemesi elli eşleşen satır yazar ve ellisi için de ücret almak, görevi ilk hydrada bitirirdi. Yalnızca eşleşmek ücretli; tetiklenemeyen bir kural size hiçbir şeye mal olmuyor.

Bir sonraki sözleşme bunun karşı ağırlığı. Aynı sunucu, aynı saat, ama yeniden kurulumda ssh anahtar zorunlu hâle getirilmiş; yani kuralınızın beklediği kapı tam olarak kapanmış olan kapı. Envanter dökümü http üzerinden, robots.txt'nin nezaketen adını verdiği bir yedek dizininden dışarı yürüyor ve sizin doğru, sınanmış, iyi ayarlanmış tespitiniz hiçbir şey görmüyor. Bu oyuncuya yapılmış bir numara değil. Gerçek tespitin başına gelen en sıradan şey: geçen sefer kullanılan tekniğe göre yazılmış olması. Görevin mavi yarısı, az önce içinden geçtiğiniz boşluğu kapatmanızı istiyor.

Açıkça söylenecek sınır

103 sözleşmenin 100'ü tarayıcı sekmesinde, simüle bir kabuğun içinde koşuyor. O sekmeden tek bir paket çıkmıyor. İlk web sunucusundaki OpenSSH 7.2p2 Ubuntu 4ubuntu2.8, bir şeyin döndürdüğü banner değil, bir YAML dosyasındaki dize; sizi kayda geçen güvenlik duvarı da görevin içindeki bir eşleme tablosu: scan.sweep seviye 5'te 100010 kuralına dönüşüyor. Komutlar sözdizimi anlamında gerçek ve kabul edilen her bayrak bir şey yapıyor. Ağa dokunmak anlamında gerçek değil.

Bunun kazandırdığı şey erişim: kurulum yok, hesap yok, sanal makine yok, ve bir betiğin baştan sona oynayabildiği içerik. Kaybettirdiği şey de yalnızca gerçek bir makinenin öğretebileceği şey: araçlar takılır, hata verir, hiçbir şey döndürmez, ve işin yarısı o sessizliğin hedeften mi yoksa kendi sözdiziminizden mi geldiğine karar vermektir. Üç sözleşme (m14, m15, m16) gerçek Docker konteynerlerini ve gerçek log satırlarını ortak bir çözücü dosyasından geçiriyor, ve o üçü için makinenizde Docker çalışıyor olmalı. Yüz üçte üç. Bu bir başlangıç rampası, poligon değil; laboratuvarın yerini aldığını söyleyen bir simülatör size bir şey satıyordur.

Simülasyonun kendisi de seçilmiş bir alt küme, ve oyun bunu önemli olduğu yerde söylüyor. Port taraması, SQL enjeksiyonu ve log kırpma için hazır gelen bir çözücü yok. O satırlar dosyada beliriyor ve hiçbir kural onlara ad vermiyor. Bu eksiklik Perde II'nin konusu: size verilen ruleset, sizin yaptığınız şeyi kapsamıyor.

Ölçüler

Dört perdede 103 sözleşme, Türkçe ve İngilizce, ikisi de çeviri değil ayrı ayrı yazılmış. Projenin kendini ölçtüğü müfredat modelinin %100'ü kapsanıyor (npm run coverage). Docker istemeyen on üç test paketinde 620 doğrulama. Tarayıcıda ve masaüstü sürümü olarak çalışıyor.

Tanıtımı tek cümle, ve bir tür adı değil: kendi saldırınız, sonra sizin ayıklayacağınız alarm kuyruğuna dönüşüyor, ve bıraktığınız satır yedekleme betiğinin yanında duruyor.

https://samerule.com

Oyna →