Erişim günlüklerinde bulunan saldırı örnekleri
(nishtahir.com)- 10 yılı aşkın süredir self-hosting yapılan herkese açık bir IP’nin erişim günlükleri, kimlik bilgisi aramalarından IoT cihazlarını hedefleyen komut enjeksiyonlarına kadar internete açık hizmetlerin rutin olarak maruz kaldığı saldırı girişimlerini gösteriyor
- En yaygın desen,
.env,.aws/credentials,.git/config,backup/,test/gibi yolları yoklayan yapılandırma dosyası ve dizin keşfi idi; bazı isteklerMozlila/5.0gibi yazım hatalı User-Agent’lar kullanıyordu - Shellshock denemeleri, User-Agent içine Bash fonksiyonu biçiminde payload yerleştirerek
/etc/passwddosyasını okumaya çalıştı ve çeşitli CGI yollarını tekrar tekrar tahmin etti - LuCI ve Zyxel hedefli saldırılar, yönlendirici ve gömülü cihazların web arayüzlerine komut ekleyerek uzaktaki script’leri ve farklı mimarilere uygun ikili dosyaları indirip çalıştırmayı amaçladı
- İnternete açık bırakılan hedeflerin sayısı azaltılmalı, gerekli araç ve dizinlere kimlik doğrulama ile IP kısıtlamaları uygulanmalı, IoT cihazları güncel tutulmalı ve mümkünse genel ağdan ayrılmalı
Herkese açık internete maruz kalan hizmetlerin aldığı trafik
- 10 yılı aşkın süredir self-hosting yaparak verilerini doğrudan sahiplenme ve bulut barındırma dışındaki platformlara bağımlılığı azaltma deneyimi sürdürülüyor
- Bir IP herkese açık internete çıkarıldığında hemen çok miktarda kötü amaçlı trafik geliyor ve erişim günlükleri incelenerek yakın dönemde hangi saldırıların denendiği takip edilebiliyor
- Bu analiz, bir güvenlik uzmanının adli incelemesinden çok meraklı bir geliştiricinin gözlemlerine yakın
- Saldırgan IP adresleri ve bazı saldırganların kullandığı aşağılayıcı ifadeler ihtiyat amacıyla gizlenmiş
Kimlik bilgileri ve yapılandırma dosyası keşfi
- En yaygın saldırı, dizin dolaşımıyla kimlik bilgileri bulma girişimiydi; özellikle
.envdosyası istekleri çok sık görülüyordu- İstek yolu örnekleri:
/laravel/.env,/backend/.env,/api/.env,/.env,//.env .env, genellikle uygulama secret’larını içeren bir dosya olarak kullanılır
- İstek yolu örnekleri:
- AWS ile ilgili dosyalar ve Git depo yapılandırmaları da keşif hedefleri arasındaydı
- Örnekler:
/aws.yml,/.env.bak,/info.php,/.aws/credentials,/config/aws.yml,/.git/config
- Örnekler:
- Yanlışlıkla bırakılmış olabilecek yaygın dizinler de tekrar tekrar istendi
- Örnekler:
/old/,/new/,/test/,/backup/,/temp/
- Örnekler:
- Bazı User-Agent’larda
Mozilla/5.0yazım hatası gibi görünenMozlila/5.0bulunuyordu- GitHub arama sonuçları, bu hatanın yaygın bir araçtan üretilip kopyala-yapıştır ile yayılmış olabileceğine işaret ediyor
- Uzaktan erişim araçları veya yapılandırma araçlarını arayan istekler de görüldü
- Örnekler:
/actuator/gateway/routes,/hudson,/ui/login.action,/?XDEBUG_SESSION_START=phpstorm
- Örnekler:
- Herkese açık internete yalnızca kesinlikle gerekli en az sayıda unsur açılmalı; araçlar veya dizinler açılacaksa kimlik doğrulama katmanı ve mümkünse belirli IP kısıtlamaları uygulanmalı
Shellshock denemeleri
- Birden fazla istek, Shellshock zafiyetini hedefliyor gibi görünüyordu
- Bu saldırı, CGI script’lerini savunmasız Bash sürümleriyle çalıştıran web sunucularında rastgele komut çalıştırmayı hedefler
- CGI programı başlarken istek içeriğinden ortam değişkenleri ayarlanır ve
HTTP_USER_AGENTbunlardan biridir () { :; };gibi karakterler varsa Bash bunu çalıştırılması gereken bir fonksiyon olarak yorumlar
- CGI programı başlarken istek içeriğinden ortam değişkenleri ayarlanır ve
- Gerçek günlüklerdeki User-Agent içinde şu payload’lar vardı
() { ignored; }; echo Content-Type: text/html; echo ; /bin/cat /etc/passwd() { ignored; };, Bash fonksiyon tanımı biçimindedirecho Content-Type: text/html; echo ;, HTTP yanıtının Content-Type değerini ve boş bir satırı yazdırır/bin/cat /etc/passwd, kullanıcı hesap bilgilerini içeren/etc/passwddosyasının içeriğini göstermeye çalışan komuttur
- Saldırı başarılı olsaydı kullanıcı kimlik bilgilerine erişim ve sunucuda rastgele kod çalıştırma ile sonuçlanabilirdi
- Saldırgan, dizin dolaşımına benzer biçimde
/cgi-bin/status,/cgi-bin/stats,/cgi-bin/test,/cgi-bin/status/status.cgi,/test.cgi,/debug.cgi,/cgi-bin/test-cgigibi yaygın yolları tahmin ediyordu
LuCI hedefli komut enjeksiyonu
- Bir istek, OpenWRT yönlendiricileri için web arayüzü olan LuCI’yi hedefliyor gibi görünüyordu
- Saldırı URL’si,
countryalanına komut ekleyerek uzaktakitenda.shkabuk script’ini indirip çalıştırmayı amaçlayan bir yapıdaydı- URL decode edildikten sonra komut,
/tmpdizinine geçiyor, dosyaları siliyor,wgetile script’i alıyor, çalıştırma izni veriyor ve sonra çalıştırıyordu
- URL decode edildikten sonra komut,
- İndirilen script, ek ikili dosyaları indirip çalıştırmaya yönelik içerik taşıyordu
- Hedef mimari adları gibi görünen
mips,mpsl,x86_64,arm,arm5,arm6,arm7,i586,i686,powerpc,sh4,m68k,sparcyer alıyordu - Birden fazla mimari için ikili dosya denemek, saldırganın hedef cihazın mimarisini bilmediği durumlarda kapsamı genişletme amacı taşıyor gibi görünüyor
- Hedef mimari adları gibi görünen
- Ek inceleme için ortamla uyumsuz bir ikili indirildi ve Ghidra ile incelendi
- Başta yalnızca 3 fonksiyon vardı ve çok fazla string verisi görünmüyordu
- Büyük veri alanında
$Info: This file is packed with the UPX executable packerveUPX 3.94string’leri doğrulandı
- Bu, UPX ile sıkıştırılmış bir ELF ikilisiydi ve UPX header’ı ya da packed binary değiştirilmemişse
upx -dile açılabiliyor- Gerçekten de
upx -d mipsçalıştırıldıktan sonra dosya boyutu34932bayttan93732bayta çıktı ve daha fazla string görülebildi
- Gerçekten de
- Açılmış ikilideki string’ler arasında
M-SEARCH * HTTP/1.1,ST: urn:dial-multiscreen-org:service:dial:1ve Huawei cihaz yükseltmeleri için XML payload vardı- Bu, ağda DIAL protokolünü destekleyen cihazları bulmaya yönelik bir UPnP komutu gibi görünüyor
- XML payload, komut enjeksiyonuna açık Huawei cihazlarını tarayacak şekilde yapılandırılmış görünüyordu
- Bu davranışın Mirai botnet’inin bir parçası olduğu belirlendi
- Başvurulan
yeye.mipsdosyası indirilmeye çalışıldığında artık erişilebilir değildi- Sunucuda
nmapçalıştırıldığında yalnızca22/tcp sshve646/tcp filtered ldpaçık portları görüldü
- Sunucuda
Zyxel hedefli komut enjeksiyonu
- Başka bir istek, GET URL’si içinde kabuk komutları barındırıyordu ve
${IFS}kabuk yer değiştirmeleri kaldırıldığında daha okunur hale geliyordu- Düzenlenmiş komut,
/tmpdizinine gidiyor,*mips*dosyalarını siliyor,huhu.mipsdosyasını indiriyor, çalıştırma izni veriyor ve ardındanzyxel.selfrepargümanıyla çalıştırıyordu
- Düzenlenmiş komut,
- Bu saldırı, Zyxel cihazlarındaki
zhttpdexploit’ini hedefliyor gibi görünüyordu - Bu kez ikili dosya packed değildi, bu yüzden Ghidra’da string’ler doğrudan görülebildi
- String’ler arasında
M-SEARCH * HTTP/1.1, DIAL ile ilgiliSTheader’ı,skyljne.arm,skyljne.arm5,skyljne.arm6,skyljne.arm7,skyljne.mips,skyljne.mpsl,skyljne.x86_64,skyljne.sh4bulunuyordu - Ayrıca Huawei cihazlarını hedefleyip
huhu.mipsdosyasını indirerekselfrep.huaweiolarak çalıştıran bir XML payload da vardı
- String’ler arasında
- Bir başka string,
/goform/set_LimitClient_cfgadresine POST gönderen bir komut içeriyorduCookie: user=adminheader’ı ile birliktemacparametresine komut eklenerekhuhu.mpslindirilip çalıştırılmak isteniyordu- Akamai yazısına göre bu zafiyet yönlendiricileri hedefliyor ve özel bir kimlik doğrulama veya yetkilendirme kontrolü olmadığı için ön kimlik doğrulama olmadan istismar edilebiliyor
- Bu ikilinin büyük olasılıkla Mirai botnet’inin ajanı olduğu değerlendirildi
- Bazı kaynaklar Linux Medusa ile olası bağlantılardan da söz ediyor
Operasyonel açıdan alınabilecek önlemler
- İncelenen günlükler bütünün yalnızca bir kısmı; her gün denenen başka exploit’ler de çok sayıda
- Cihazları, özellikle IoT cihazlarını, güncel tutmak önemli
- Mümkünse IoT cihazları doğrudan herkese açık internete maruz bırakılmamalı
- Mutlaka açılmaları gerekiyorsa mümkün olduğunca ayrı bir VLAN içinde izole edilmeliler
1 yorum
Hacker News yorumları
İlginç biçimde bazı saldırganlar yeni verilmiş sertifikaları bulmak için Certificate Transparency günlüklerini izliyor gibi görünüyor
Yeni bir sunucuyu yeni bir IP’de bir haftadan uzun süre açık bırakırsanız erişim günlüklerinde yalnızca birkaç rastgele tarama görünürken, Let’s Encrypt sertifikası aldıktan yaklaşık bir saat sonra makaledekilere benzer yüzlerce isteğin akın ettiği birkaç kez oldu
Sonuç şu: Yeni hizmetler mümkün olduğunca erken, ideal olarak internete açılmadan önce güvenli hale getirilmeli
Ya da kendi sertifika otoritenizi kullanıp geçişe kadar self-signed sertifika ve mTLS kullanmak da bir yol
Örneğin bir yazılım, yönetici hesabı oluşturma veya DB bağlantısı gibi ilk kurulum ekranını olduğu gibi açığa çıkarıyorsa; bunları en baştan ortam değişkeni, yapılandırma dosyası veya özel bir sır yönetim aracıyla belirtme yöntemine göre daha riskli hale gelir
Örneğin belirli bir dönem içindeki alan adlarını aramak gibi
Cloudflare’in Merkle Town’ı[0] genel görünüm için yararlı, ancak CT günlüklerini kolayca sorgulamanın bir yolunu hâlâ bulamadım; ct-woodpecker[1] da umut verici görünüyor
[0] https://ct.cloudflare.com/
[1] https://github.com/letsencrypt/ct-woodpecker
Günümüzde VPN’ler o kadar iyi ki içim rahat ediyor; özellikle fotoğraf barındırma ya da yedekleme gibi şeyleri herkese açık hale getirmek istemiyorum
Kendi barındırdığım bir siteyi yönetmeye başladığımda erişim günlüklerine de bakıyordum; bir süre boyunca gelen saldırı girişimlerini gösteren verileri toplayan bir saldırı tespit sistemi de kullandım
Sonunda günlükleri proaktif olarak incelemeyi de, saldırı tespit sistemine para ödemeyi de bıraktım; zaman kaybı ve dikkat dağıtıcı bir işti
Yaygın zafiyetleri ve saldırıları iyi özetleyen kaynaklar kolayca bulunabiliyor; bunu sunucu yönetimi için ölçüt almak yeterli. Yaygın web sunucusu teknolojilerinin her biri için çok sayıda en iyi uygulama rehberi var ve bunları %100 uygulamak bile sizi neredeyse tüm saldırganların çok önüne geçirir
Sonrasında zamanı ve kaynakları iyi kullanmanın yolu, mümkün olan en hızlı yama döngüsünü önceliklendirmektir. Saldırıların çoğu kamuya açıklanmış zafiyetleri hedefler
Günlüklerin özellikle işe yaradığı zaman, bir sorun yaşandıktan sonra tanılama yaparken oluyor. Günlük analiz yazılımıyla saklayıp arayarak başarılı saldırıların kök nedenini bulmakta 2-3 kez yardımcı oldu; her seferinde neden, çok geç yamalanmış bilinen bir zafiyetti
Çözüm katmanlı savunmadır; kişisel servisleri kendiniz barındırırken çoğu durumda bunu uygulamak oldukça kolaydır
Öne bir güvenlik duvarı koyun veya VPN/Tailscale arkasına saklayın; otomatik saldırıların hedeflediği
/phpmyadmin/yerine/mawer/phpmyadmin/gibi bir alt klasöre gizlerseniz %99,9’u bulamaz. Buna güvenlik yoluyla gizleme denir ve yalnızca buna güvenilmemelidir, ancak ek bir katman olarak çok yararlıdırUygulamayı sandbox’a alın ve sunucuyu izole edin; içeri girilse bile başka yerlere geçmeyi zorlaştırın. Ayrıca saldırı olup olmadığını ve başarılı olup olmadığını kontrol edebilmek için günlük tutmalısınız
Asıl nokta, yama ya da güvenlik duvarı olsun, tek bir savunma aracına güvenmemektir. Sonunda bunlardan biri başarısız olur
Şu anda paketleri üç ayda bir güncellemeyi deniyorum[0], ancak bilinen zafiyetleri bildirip hemen tepki vermemi sağlayacak bir araç olsa iyi olurdu
[0] Burada “deniyorum” derken, en yeni sürüme geçmeyi zorlaştıran uyumluluk kırılmaları varsa veya henüz güvenmediğim bir X.0.0 sürümüyse hemen yükseltemediğimi kastediyorum
Yazar güvenlik uzmanı olmadığını söylediğine göre küçük bir düzeltme yapayım: Baştaki örnek kimlik bilgisi/yapılandırma keşfi, dizin geçişi değil
Bildiğim kadarıyla dizin geçişi, saldırganın web root’tan “kaçması” ya da sunucuyu normal dizinlerin dışındaki dosyaları sunmaya kandırması tekniği için kullanılan bir ifade
"/../../passwd/etc"gibiEn azından benim deneyimime göre bu saldırıların önemli bir kısmının düşmanca devlet aktörlerinden gelmesi kilit nokta
Tartışmalı olabilir ama iş yapmayacağınız sorunlu ülkelerin tüm IP aralıklarını engellemek faydalı olabilir. Bu şekilde yeni bir hizmete gelen keşif girişimlerini %100 engellediğim oldu
Sunucuma gelen keşiflerin çoğu ABD’den geliyor; oldukça geriden ikinci sırada Hollanda var. Muhtemelen çoğu AWS ve diğer veri merkezlerinden geliyor
Uygulama/ürün güvenliği alanında çalışıyorum ve milyarlarca dolarlık şirketlerin WAF’larını yıllarca yönettim.
DNS’i Cloudflare’a taşıyıp siteye birkaç WAF kuralı koymak yeterli. Örneğin bot puanı 2’nin altındaysa managed challenge uygulamak ya da saldırı puanı belirli bir değere geldiğinde işlem yapmak gibi. Maliyeti de büyük olasılıkla neredeyse yoktur ve birçok sorunu çözer.
Ancak prodüksiyona almadan önce mutlaka test etmek gerekir. Bir test domain’i bulundurmak da iyi olur. WAF her şeyi çözen sihirli bir çözüm değil, daha çok geçici bir önlem sayılır; uygulamanın kendisi saldırılara dayanacak şekilde güçlendirilmemişse, ne kadar gelişmiş WAF ya da bot koruması kullanırsanız kullanın onu kurtaramazsınız.
Free Managed Ruleset varsayılan olarak dağıtılıyor gibi görünüyor; Cloudflare değişiklik günlüğünü burada tutuyor: https://developers.cloudflare.com/waf/change-log
Çok iyi çalışıyor. Erişenler sadece ailem olduğu için ayarlaması da kolaydı; herkes kendi benzersiz sertifikasını alıyor ve gerekirse iptal edilebiliyor.
Bu alanı iyi biliyor gibi görünüyorsun; merak ettiğim şey, Azure altyapısı ile Cloudflare’ı birlikte kullanan çözümler de yönetip yönetmediğin ve yönettiysen, OWASP gibi genel konular dışında insanların sıkça gözden kaçırdığı noktalar olup olmadığı.
Bir şirketin herhangi bir nedenle güncel olmayan bir şeyi mutlaka çalıştırması gerekiyorsa gerekli olabilir, ama sonuçta bu sadece geçici bir önlemdir.
Kendi tasarladığım 400 satırlık bir HTTP/S sunucusunu yaklaşık bir yıldır kendim barındırıyorum; açık 3 porta (22, 80, 443) gelen saldırı trafiği şaşırtıcı derecede fazla.
Ancak saldırganın gerçekten ne yapmaya çalıştığını analiz etmeye zaman ayırmadım; bu yazı birçok boşluğu doldurdu.
/var/log/auth.logiçinde görünen tuhaf şeyleri de aynı şekilde analiz etmek iyi olurdu.Kodun tamamı açık kaynak ve sunucu tarafında durum da yok; saldırganın özellikle beni hedeflemesi garip. Saldırganın elde edebileceği en iyi şey, aylık 5 dolarlık bir VPS’te root erişimi ve kimsenin uğramadığı bir domain’in geçici olarak tahrif edilmesi olur.
En bilinen 3 portu açarsan bağlantılar gelir; ne çalıştırdığını bilmezler ve umursamazlar.
Zararlı yazılım barındırmak ya da kripto para madencisi çalıştırmak da mümkün.
Benim ISP’m IP’yi gerçekten çok nadiren değiştiriyor; değişirse barındırma web yönetici paneline giriş yapıp kuralı güncelleyebiliyorum.
Her sunucuda mutlaka fail2ban çalıştırıyorum ve açığa sunduğum site işlevlerinin türüne uygun saldırıları yakalamak için özel jail’ler de ekliyorum.
Ancak fail2ban’in diğer varsayılanlarının hâlâ yaygın saldırıları engellemek için yeterli olup olmadığını kontrol etmeyeli uzun zaman oldu. Daha sonra bakabilmek için bu bağlantıyı yer imlerine eklemeliyim.
Kendi barındırdığım servisin erişim günlüklerini ben de inceliyorum; bu analizde göze çarpan şekilde eksik kalan bir ayrıntı var.
Kötü niyetli isteklerin önemli bir kısmı, sıradan kişilerin GitHub gibi yerlerden kolayca bulabildiği güvenlik tarayıcılarını çalıştırmasından ibaret. Genelde sofistike olmayan saldırılar; bu tür proje örnekleri, yanıtı bile görmeden ve rate limit’e takılıp takılmadığını umursamadan sunucuyu yoklayıp duruyor.
Bazı saldırılar doğrudan IP’yi hedeflemez; domain ve alt domain’leri izler, aynı IP aralığından periyodik olarak aynı taramayı tekrarlar.
Önceki iş yerimde Türkiye’deki tek bir sabit IP’den sürekli tekrarlanan taramalar geliyordu; ekip ona “Türk” demeye başlamıştı ve garip istek kalıpları gördüğümüzde önce o kişinin servisimize dokunup dokunmadığını kontrol etmek olay müdahale sürecinin bir adımı hâline gelmişti.
AWS’de bu günlükleri görüyorsanız, lütfen VPC’nin önüne AWS WAF koymanız iyi olur.
Pahalı değil ve böyle durumlarda birçok baş ağrısını azaltmaya epey yardımcı oluyor. Servise ulaşan her şeyi engellemese bile büyük fayda sağlayabilir.
Aşırı çalışan birkaç kural, uygulamanın bazı bölümlerini fark ettirmeden bozdu.
İstek gövdesinde
"localhost"varsa engelleyen bir istek gövdesi kuralı vardı; User-Agent başlığı olmayan istekleri engelleyen bir kural da vardı. Daha önce API isteklerinde User-Agent istemiyorduk, bu yüzden nedeni bulana kadar bazı kullanıcıların API’sinin tamamını bozduk.Neyin engellendiğini bilmek ve önce doğrulamak gerekir; aksi hâlde bazı durumlarda müşteri kaybedersiniz.
Kolayca aşılabildiği hâlde güvenlik sağladığı yanılsaması yaratır, performans maliyeti de büyüktür ve meşru trafiği engelleme olasılığı da hayli yüksektir: https://www.macchaffee.com/blog/2023/wafs/
Örneğin üniversitemizdeki araştırmacılar Twitter verilerini inceliyor; tweet’lerden alınan küçük, rastgele bir örneklemdeki bağlantıları takip ettikleri için üniversite IP’si çoğu WAF tarafından engelleniyor.
Bazen, bu saldırılardan birine düzgün yanıt veren bir Express sunucusu yapıp birilerinin zamanını boşa harcatmanın eğlenceli olabileceğini düşünüyorum
Ama bunu yaparsam kendi zamanımı da boşa harcamış olurum
[1] https://infosec.exchange/@gnyman/109318464878274206
[2] https://nyman.re/super-simple-ssh-tarpit/