6 Ağustos 2018 Pazartesi

Kod Paylaşım Siteleri Üzerinden Zararlı İletimi


Merhabalar,
Bu sayımızda, zararlı dosyaların kod paylaşım siteleri üzerinden nasıl iletilebileceği konusunu inceleyeceğiz.
Kurumsal ortamlarda genellikle e-posta ile çalıştırılabilir dosyaların iletilmesi engellenir, dosya indirme işlemleri de ayrıntılı olarak denetime tabi tutulur. Bu şartlar altında saldırganlar genellikle şu şekilde bir yol izlerler. Makro içeren ofis dokümanlarının ya da arka planda kod çalıştırmayı deneyen pdf dosyalarının, hedef kullanıcılar tarafından çeşitli yöntemler(sosyal mühendislik vb.) uygulanarak indirip açılması sağlanır. Bu dosyalar, açıldığında arka planda çeşitli komutlar çalıştırırak saldırganın asıl zararlı dosyasını indirip çalıştırılmasını sağlar. Bu aşamadan sonra sistem, zararlının komuta kontrol merkezi ile iletişime geçerek saldırganın sistemi tam anlamıyla ele geçirmesini sağlar.
Biz de, bu senaryoda asıl zararlının iletimi noktasında kod paylaşım sitelerinin nasıl kullanılacağını göreceğiz.
Zararlı olarak meterpreter’ı kullanacağız. Metasploit üzerinden reverse_tcp yoluyla handler’ımız ile iletişime geçecek olan bir zararlı dosya(malware.exe) oluşturuyoruz.
Daha sonra malware.exe isimli zararlı dosyamızı base64 ile encode ediyoruz. Bu işlem, birçok araç ile gerçekleştirilebilir. Ben “browserling.com” adresindeki online aracı kullandım.





Ekran Görüntüsü 1: Zararlı dosyanın encode edilmesi

Encode edilmiş metni kod paylaşım sitelerinden birine kaydediyoruz. Ben “paste.ee” adresini kullandım.



Ekran Görüntüsü 2: Zararlı Base64 encode olarak “paste.ee” adresine kaydedilmesi

Daha sonra bu encode edilmiş metnin indirilip bir dosyaya yazılması, bu dosyanın decode edildikten sonra da çalıştırılması gerekmektedir.
Bu işlemleri yapan bir batch dosyası hazırladım. Bu batch dosyasını, yukarıda bahsettiğim saldırganların kullandığı makro içeren ofis dosyalarının ya da pdf dosyasının yerine düşünebilirsiniz. Batch dosyamız zararlı kodun indirilip çalıştırılmasını sağlayacak.


Ekran Görüntüsü 3: Zararlı kodu indirip, çalıştırılabilir hale getiren batch dosyası

Batch dosyası çalıştırıldığında, encode edilmiş metin, kod paylaşım sitesinden indirilerek bir dosyaya yazılıyor. Daha sonra bu dosya decode edilerek çalıştırılabilir hale getiriliyor. Zararlı (malware.exe) çalıştırıldığında da saldırgan hedef sistem üzerinde komut çalıştırma hakkına erişmiş oluyor.



Ekran Görüntüsü 4:Batch dosyasının zararlı dosyayı oluşturup çalıştırması


Ekran Görüntüsü 5: Hedef sistemin ele geçirilmesi

Günümüzde kullanılan ağ ve sistem güvenlik çözümleri ve uygulanan politikalar bu tarz saldırıları büyük ölçüde engellese de, zararlı dosyaların kod paylaşım siteleri üzerinden de gelebileceğini göstermek istedim.Bu konuyu önümüzdeki sayılarda da ele alıyor olacağım.
  
Alınabilecek önlemler
--Kod paylaşım adreslerine yapılan erişimleri denetime tabi tutarak bu adreslere erişmesine ihtiyacı olmayan kullanıcıların erişiminin tamamen engellenmesi sağlanabilir.
--Sistem üzerinde anti-virüs uygulamasının imza veritabanının güncel olduğundan emin olunmalı ve periyodik taramalar yapılmalıdır.
--Uygulama kontrolü çözümleri ile sistem envanterinde yer almayan çalıştırılabilir dosyaların çalıştırılması engellenebilir.
--Sistem güvenlik çözümlerinde erişim kontrolü kuralları ile çalıştırılan komutlar üzerinde denetim sağlanabilir. Powershell komutu ile indirme işlemi ve Certutil  aracı ile decode işleminin denetime tabi tutulması gibi.
Bu köşede ele alınan konular, kullanıcıların bilgi güvenliği farkındalığını arttırmak amacıyla yazılmıştır. Bu saldırının uygulanmasından doğacak yasal sorumluluk uygulayan kişilere aittir.
Bu yazı, BeyazŞapka dergisinin Ağustos 2018 sayısında yayınlanmıştır.

16 Mayıs 2018 Çarşamba

Halka Açık Kablosuz Ağ Saldırıları 2



Merhabalar,

Bir önceki yazımızda, sahte kablosuz ağ oluşturarak kullanıcıların sistemlerini nasıl ele geçirebileceğimizden bahsetmiştik. Bu yazımızda da benzer isimli kablosuz ağımıza kullanıcıları çekerek eriştikleri web adreslerindeki kullanıcı bilgilerini ele geçirmeye çalışacağız.
Şifresi kullanıcılarla paylaşılan kablosuz ağları nasıl taklit edebileceğimize dair detaylara bir önceki yazımızdan ulaşabilirsiniz. Sahter kablosuz ağımızı oluşturmak için Wifi-Pumpkin aracından yararlanmıştık.
 “Eylul” ismindeki gerçek kablosuz ağını “EyluI” (sondaki küçük L harfi yerine büyük I harfini kullanarak) kendi kablosuz ağımızı oluşturduktan sonra, SET (Social Engineering Toolkit) ile kullanıcının erişim sağladığı web adresini taklit edeceğiz. Kablosuz ağımızın şifresinin, taklit ettiğimiz kablosuz ağın şifresi ile aynı olması, kullanıcının farklı bir ağa bağlandığının farkına varmasını zorlaştıracaktır.


Ekran Görüntüsü 1: Windows ortamında kablosuz ağ isimlerinin görüntülenmesi

Social Engineering Toolkit , içerisinde bir çok sosyal mühendislik saldırısı senaryosu içeren bir araçtır. Kali Linux içerisinde kurulu olarak gelmektedir.
SET aracını başlattığımızda bize nasıl bir senaryo hazırlamak istiyorsak ona göre yönlendirecek bir menü karşılıyor.
Social-Engineering Attacks > Website Attack Vectors > Credential Harvester Attack Method > Site Cloner yolunu izleyerek, web sitesinin bir kopyasını alarak kullanıcı bilgilerinin ele geçirilmesi senaryosunu seçiyoruz.


Ekran Görüntüsü 2: Kopya web sitesinin oluşturulması
Daha sonra kullanıcıların kullanıcı bilgilerini ele geçirdikten sonra hangi adrese yönlendireceğimizi belirliyoruz. Hangi siteyi klonlamak istiyorsak, site adresini giriyoruz ve kopya web adresi yayına başlıyor.
Ben bu senaryoda, popüler bir kariyer ve sosyal paylaşım adresini tercih ettim.
Daha sonra Wifi-pumpkin aracının DNS Spoofer modülü ile kullanıcıların gerçek web sitesine yaptığı DNS isteklerine kopya adresin yayın yaptığı IP adresinin cevap olarak dönülmesini sağlıyoruz.


Ekran Görüntüsü 3: Kullanıcı DNS isteklerinin yönlendirilmesi
Kullanıcı ilgili adrese gitmek isteğinde  SET aracı ile hazırladığımız kopya web sitesine ulaşacak. Bu adreste girmiş olduğu kullanıcı bilgileri bize iletilecek.


Ekran Görüntüsü 4: Kullanıcının www.linkedin.com adresinin DNS isteğine aldığı yanıt


Ekran Görüntüsü 5: Kullanıcı tarafında kopya websitesinin görüntülenmesi


Ekran Görüntüsü 6:Kullanıcı bilgilerinin ele geçirilmesi
Kullanıcı bilgileri ele geçirildikten sonra kullanıcının gerçek siteye erişebilmesi için DNS Spoofer modülü ile yaptığımız DNS yönlendirmesi kaldırılması gerekir.

Alınabilecek önlemler
--Halka açık olarak yayın yapan ve şifresi paylaşılan kablosuz ağları kullanılmamalıdır.
--Bu ağları kullanmak durumunda kalmanız halinde, benzer isimle başka bir kablosuz ağın olup olmadığı kontrol edilmelidir.
--Benzer isimde kablosuz ağ varsa, farklı işletim sistemine sahip bir sistem ile kablosuz isimleri kontrol edilebilir. Android, IOS işletim sistemlerinde kablosuz ağ isimlerindeki küçük farklılıklar daha belirgin olabiliyor.


Ekran Görüntüsü 7: Android ortamında kablosuz ağ isimlerinin görüntülenmesi
--Bağlantılarınız olağan dışı bir şekilde farklı adreslere yönlendiriliyorsa, yönlendirildiğiniz adreslerden dosya indirme işlemini gerçekleştirilmemelidir.
--Erişim sağlayadığınız web adresinin SSL sertifikasının, o adrese ait olup olmadığını kontrol ediniz. Bir şüpheniz olması durumunda bu siteden bir dosya indirilmemeli ve kullanıcı bilgileri paylaşılmamalıdır.
Bu yazı, kullanıcıların bilgi güvenliği farkındalığını arttırmak amacıyla yazılmıştır. Bu saldırının uygulanmasından doğacak yasal sorumluluk uygulayan kişilere aittir.
Bu yazı, BeyazŞapka Dergisi'nin Şubat 2018 sayısında yayınlanmıştır.

Halka Açık Kablosuz Ağ Saldırıları



Merhabalar,

Bu sayıda, şifresi paylaşılan halka açık kablosuz ağları kullanan, kullanıcılara uygulanabilecek bir saldırı senaryosunu ele alacağız.
Kafeler, havaalanları ya da kurumsal şirketlerin misafirleri için kullanılan kablosuz ağlarının şifresi genellikle açık olarak kullanıcılar ile paylaşılmaktadır. Saldırganlar, bu ağlara bağlanarak kullanıcılara saldırmak yerine benzer isimle kendi sahte kablosuz ağlarını kurarak, kullanıcıları bu ağ’a bağlanmasını sağlayarak saldırı gerçekleştirebilmektedirler.
Biz de senaryomuzu bu şekilde uygulayacağız. Halka açık kablosuz ağa benzer isimle bir kablosuz ağ kurup, şifresini de gerçek ağ ile aynı olacak şekilde yapılandıracağız. Böylece bağlantı sağlayan kullanıcıların, sahte kablosuz ağ’a bağlandıklarının farkına varmalarını zorlaştıracağız.
Daha sonrasında kullanıcının DNS isteklerini istediğimiz adrese gidecek şekilde yönlendirip, java güncelleme sayfasına bağlandıklarını görmelerini sağlayacağız. Java güncellemesi olarak indirip çalıştırdıkları dosya da, bizim kullanıcının sistemini ele geçirmemizi sağlayan arka kapıyı içermektedir.
Sahte Kablosuz ağ oluşturmak için Wifi-Pumpkin aracını kullanacağız. Bu araç aynı zamanda, dns isteklerini yönlendirebilmemizi ve sahte java güncelleme sayfası oluşturmamızı da sağlayacak.
Bizim senaryomuzda, Gerçek kablosuz ağın ismi “Eylul”, bizim oluşturduğumuz sahte kablosuz ağın ismi ise “EyluI” olacak. İlk bakışta, ikisi arasındaki fark belli olmuyor. Sahte kablosuz ağın isminin son harfi için küçük “L” harfi yerine büyük “I” harfini kullandık. Aynı isimle ağ oluşturduğumuz takdirde, kullanıcılar gerçek ağa bağlanırken de, sahte ağa bağlanırken de kimlik doğrulama sorunu yaşayacaklardır.


Ekran Görüntüsü 1: Sahte Kablosuz Ağ’ın Oluşturulması

Ekran Görüntüsü 1’de Sahte kablosuz ağımızın yapılandırmasını görebilirsiniz. Burada dikkat edilecek noktalar, daha öncede belirttiğim gibi ismin farklı olması ve şifrenin gerçek ağ şifresi ile aynı olmasıdır.
Daha sonra oluşturduğumuz arka kapı dosyasını, java güncelleme paketi olarak sunacak bir web sunucu için Wifi-Pumpkin aracının “Windows Update Attack Generator” modülünü kullanıyoruz.


Ekran Görüntüsü 2: Sahte Java güncelleme sayfasının oluşturulması
Web sunucu hazır olduktan sonra, DNS isteklerini yönlendirmek için DNS Spoofer modülünü aktif ediyoruz. Ben burada sadece “javaupdater.com” adresini yönlendirdim. Gerçek bir senaryoda, kullanıcının bütün isteklerini sahte java güncelleme sayfasına yönlendirerek, daha agresif bir saldırı gerçekleştirilebilir.


Ekran Görüntüsü 3: DNS isteklerinin yönlendirilmesi
Kullanıcı tarafında sahte java güncelleme sayfası aşağıdaki şekilde görünecektir.


Ekran Görüntüsü 4: Kullanıcı tarafında sahte Java güncelleme sayfası
Kullanıcının sayfayı ziyaret ettiğini aracın monitor kısmından takip edebiliriz.


Ekran Görüntüsü 5: Kullanıcının aktivitelerinin takip edilmesi
Kullanıcı dosyayı indirip çalıştırdığında da, arka kapının geri dönüş yapacağı handler üzerinden kullanıcının sistemi üzerinde oturum elde edilmiş oluyor.


Ekran Görüntüsü 6: Kullanıcı sistemi üzerinde oturum elde edilmesi
Alınabilecek önlemler
--Halka açık olarak yayın yapan ve şifresi paylaşılan kablosuz ağları kullanılmamalıdır.
--Bu ağları kullanmak durumunda kalmanız halinde, benzer isimle başka bir kablosuz ağın olup olmadığı kontrol edilmelidir.
--Benzer isimde kablosuz ağ varsa, farklı işletim sistemine sahip bir sistem ile kablosuz isimleri kontrol edilebilir. Android, IOS işletim sistemlerinde kablosuz ağ isimlerindeki küçük farklılıklar daha belirgin olabiliyor.
--Bağlantılarınız olağan dışı bir şekilde farklı adreslere yönlendiriliyorsa, yönlendirildiğiniz adreslerden dosya indirme işlemini gerçekleştirilmemelidir.
--Mutlaka bir uç nokta güvenlik ürünü kullanılmalıdır. İmza tabanlı olarak yada makine öğrenme yöntemi ile dosyaların güvenli olup olmadığı kontrol edilebilir.

-- İndirilen dosyaların otomatik olarak çalıştırılmasını engelleyen erişim kısıtlama politikaları kullanılabilir.




Not: Bu makale BeyazŞapka dergisinin Kasım 2017 sayısında yayınlanmıştır.
Bu köşede anlatılan yöntemler, bilgi güvenliği farkındalığını arttırmak adına anlatılmaktadır. Doğabilecek yasal sorumluluklar bu yöntemleri uygulayan kişilere aittir.

Oltalama e-Postalarında Punycode Kullanımı


Merhabalar,

Bu sayıda, Punycode’un oltalama e-postalarında kullanımı konusundan bahsedeceğim. Punycode nedir sorusunun cevabı ile başlayalım.

Punycode, Unicode karakterleri ASCII karakterlere çevirmek için kullanılan bir yöntemdir. Kayıt edilecek alan adında ASCII’de yer almayan karakterler kullanılacaksa, bu karakterler punycode ile ASCII karakterlere çevirilmelidir. Örnek olarak, kril alfabesi karakterleri verilebilir.[1]
Geçtiğimiz aylarda, punycode kullanılarak kayıt edilen bazı web adreslerinin gerçeği ile aynı görünüme sahip olabileceğini görmüştük. Saldırganlar, ücretsiz SSL sertifikası kullanarak senaryolarını daha gerçekçi hale getirmekteler.[2] Bu örnekte, saldırganlar kril alfabesindeki “a” harfinin latin alfabesindeki “a” harfine benzerliğinden faydalanmışlar.
Biz de bu yazıda, punycode’u oltalama saldırılarını daha gerçekçi kılmak için nasıl kullanabileceğimizi göreceğiz.

E-postalarda, iki farklı gönderen kısmı bulunmaktadır. Bunlardan birincisi SMTP komutlarından MAIL FROM: komutunun parametresi olarak girilen protokol gönderenidir. İkincisi ise mailin DATA komutundan sonra kullanılan From: alanında girilen zarf gönderenidir.
Kullanıcı tarafından kullanılan e-posta uygulamaları genellikle zarf gönderenini kullanmaktadır. Bu parametre manipülasyona açık olması sebebi ile saldırganlar tarafından oltalama saldırılarında sıklıkla tercih edilmektedir.
Aşağıdaki örnekte, msesli@gmail.com adresinden gelen e-posta kullanıcı tarafında sesli@mehmet.com adresinden gönderilmiş gibi görünmektedir.


Ekran Görüntüsü 1: Data kısmındaki From: parametresi manipüle edilmiş e-posta




Ekran Görüntüsü 2: Gönderilen e-posta’nın SMTP komutları
Bu senaryoda, mehmet.com alan adını kullanan bir e-posta adresine sesli@mehmet.com adresinden e-posta geliyormuş gibi gösteriyoruz. Normal şartlar altında, mehmet.com adresine mehmet.com e-posta sunucuları dışında bir sunucudan, gönderen kısmında mehmet.com olan bir mail gönderilemiyor olması gerekir.
SMTP Gateway ürünleri burada bu iki parametreyi de kontrol edebilir. Protokol göndereni de, zarf göndereninde de mehmet.com geçen maillerin bloklanması sağlanabilmektedir.
İşte bu noktada, punycode devreye giriyor. Zarf göndereninde yer alan adres punycode ile manipüle edildiğinde, SMTP gateway ürünleri bu kontrolleri varsayılan olarak yapmadığı için e-postalar  sunuculara iletilmektedir.
Aşağıdaki örnekte punycode kullanılan e-posta’nın SMTP komutlarını görüyoruz.


Ekran Görüntüsü 3: Punycode kullanılan e-posta’nın SMTP komutları



Ekran Görüntüsü 4:Punycode kullanılan e-posta’nın kullanıcı tarafındaki görünümü
Ekran görüntüsü 3’ten de görülebileceği gibi, Zarf göndereninde sesli@mehmet.com yerinde sesli@--xnmhmet-zwe.com kullanılmıştır. Bu iki adreste kullanıcı tarafında aynı şekilde görünmektedir. Bu yöntem ile SMTP gateway ürünlerinin yaptığı kontroller atlatılıp, kullanıcıya legal görünümlü e-posta ulaştırılabilmektedir.

Alınabilecek Önlemler;
--Öncelikle maillerin gerçek adreslerden kontrolünü sağlamak için SPF, DKIM kontrolü kullanılabilir.
-- Punycode kullanılan alan adlarının (IDN:Internationalized Domain Names) da kontrol edildiği bir siber istihbarat servisi kullanılabilir.
Böylece saldırıda kullanılacak alan adını, Siber İstihbarat servisinin sağladığı liste üzerinden kontrol ederek, oltalama e-postalarının engellenmesini sağlayabilirsiniz.
Nebula Siber İstihbarat servisi ile ilgili bilgi almak için aşağıdaki bağlantıyı kullanabilirsiniz.
--SMTP gateway ürününüzde, zarf göndereni de kontrol edilebilir.
Varsayılan olarak bu kontrol, bazı SMTP gateway ürünlerinde gerçekleştirilmeyebiliyor.
-- Aşağıdaki adresten alan adınızda yer alan karakterlerin diğer alfabelerdeki eşleniklerini belirleyip, kendi sözlüğünüzü hazırlayabilirsiniz. http://www.unicode.org/cldr/utility/confusables.jsp?a=&r=IDNA2008
Gelen postaların gönderen kısmındaki alan adını hazırlamış olduğunuz sözlük ile kontrol ederek oltalama e-postalarını engelleyebilirsiniz.
-- Sözlük yerine regex ile de bu kontrolü sağlayabilirsiniz. Senaryomuz için örnek regex;
^(?:xn--).*(?:m|e|h|t)(?:-)?
Burada alan adımızda yer alan m,e,h,t harflerini alternatifli olarak bir punycode kullanılmış bir alan adında geçip geçmediğini kontrol ediyoruz.
Saldırganlar, alan adlarında her seferinde farklı karakterin punycode alternatifini kullanabilmektedirler. Bu yüzden, alan adında yer alan her harfin latin alfabedeki halini içeren alan adlarını kontrol ediyoruz.
Ayrıca, SMTP gateway ürününde bu kontrolü yaparken, adres “–xn” ile başlıyorsa ve regexte yer alan şablonumuz ile eşleşiyorsa blokla şeklinde yapılandırırsak her mailde regex kontrolü yapılmayacağı için performans açısında da iyileştirme sağlayacaktır.
--Yapmış olduğum araştırmalarda, protokol göndereni ile zarf göndereni birbirinden farklı olan e-postaların engellenmesi için e-posta güvenlik ürünlerinde anti-spam kuralları olabilmektedir. Konu ile ilgili üreticinize danışmanızı öneririm.
Bir sonraki yazıda görüşmek üzere.
Kaynaklar;
[1]https://www.punycoder.com
[2]https://www.xudongz.com/blog/2017/idn-phishing/

Not: Bu makale BeyazŞapka dergisinin Ağustos 2017 sayısında yayınlanmıştır.
Bu köşede anlatılan yöntemler, bilgi güvenliği farkındalığını arttırmak adına anlatılmaktadır. Doğabilecek yasal sorumluluklar bu yöntemleri uygulayan kişilere aittir.

Windows Sistemler üzerinde yetkisiz oturum elde edilmesi


Merhabalar,

Bu sayıda Windows sistemler üzerinde yetkisiz oturum elde edilmesi konusundan bahsedeceğim.
Geçtiğimiz aylarda, yerel yönetici hesabı ile, alan adı hesaplarının oturumlarını şifre bilgisi olmadan elde edebildiğini gösteren makaleler yayınlanmıştı. Bu yazıda, Windows bir sistem üzerinde yerel yönetici olma yöntemini de ekleyerek bu senaryoyu tekrar ele alacağız.
Yerel yönetici olmak için de, domain kullanıcılarının oturumlarını elde etmek içinde ilgili sistemlere fiziksel erişim gerektiğini hatırlatmak isterim.
Bütün Windows sistemlerinde oturum açma ekranında sol alt köşede yer alan ikon Windows\system32 altındaki Utilman.exe dosyasını çalıştırmaktadır. Windows sistemi, Linux işletim sistemi ile boot edildikten sonra cmd.exe dosyasının adı Utilman.exe olarak, Utilman.exe dosyasının ismi de farklı bir isimle değiştirildiğinde, login ekranındaki ikon bize Utilman.exe yerine komut satırını getirecektir. Üstelik bu komut satırında SYSTEM yetkileri ile komut çalıştırabilir durumda olacağız.
SYSTEM yetkileri ile Windows işletim sistemi üzerinde herhangi bir kısıtlama olmadan komut çalıştırılabilmektedir.

Aşağıdaki ekran görüntüsünde standart bir Windows sistemin login ekranını görebilirsiniz.



Ekran Görüntüsü 1: Standart kullanıcı giriş ekranı
Bu ekran görüntüsünde ise manipülasyon sonrası Windows kullanıcı giriş ekranı görebilirsiniz.


Ekran Görüntüsü 2: Manipülasyon sonrası kullanıcı ekranı
Bu aşamada, “net user” komutu ile mevcut kullanıcılar listelenip, “net user <kullanıcı adı> *” komutu ile bu kullanıcının şifresini değiştirilebiliriz.
Windows sistem üzerinde yerel yönetici olduktan sonra, alan adı kullanıcıların oturumlarını şifre bilgisi olmadan elde edilmesine gelebiliriz.
Normal şartlar altında, yerel veya alan adı kullanıcıları, başka bir kullanıcının oturumunu almak istediğinde ilgili kullanıcının şifre bilgisi olmadan bu işlem gerçekleştirilememektedir.


Ekran Görüntüsü 3: Task Manager üzerinden oturum değiştirme ekranı
Benzer şekilde “tscon” komutu ile bu işlem gerçekleştirilmek istendiğinde de yetki hatası alınmaktadır.


Ekran Görüntüsü 4:Tscon komutu ile yetki hatası ekran görüntüsü
Psexec  aracı, Windows sistemler üzerinde uzaktan komut çalıştımamızı sağlayan bir araçtır. Bu araç ile yerel yönetici hesabı  kullanılarak sistem üzerinde “utilman.exe”(cmd.exe) çağırıldığında, sistem üzerinde SYSTEM yetkileri ile komut çalıştırılabilmektedir.


Ekran Görüntüsü 5: System yetkilerinde olduğumuzu gösteren ve mevcut kullanıcı oturumları listeleyen ekran görüntüsü
Bu aşamada, “query user” komutu ile mevcut oturumlar listelenir.
Ardından “tscon” komutu ile alan adı yönetici kullanıcısının RDP oturumunu yerel yönetici kullanıcısının RDP oturumuna yönlendiriyoruz.


Ekran Görüntüsü 6: Alan adı yöneticisinin oturumunun yerel yöneticinin RDP oturumuna yönlendirilmesi


Ekran Görüntüsü 7: Elde edilen alan adı yönetici oturumu
Alan adı yönetici oturumunun alınmasından sonra mevcut kullanıcı oturumları şu şekilde görünecektir.


Ekran Görüntüsü 8: Son durumda mevcut kullanıcı oturumları
Alınabilecek Önlemler;
Her ne kadar birinci senaryoda, fiziksel erişim gerekse de, şu önlemleri almak saldırıyı yüksek ihtimalle geçersiz kılacaktır.
--Disk şifreleme ürünü kullanılması.
--BIOS üzerinden ya da disk şifreleme ürünü ile boot işlemi sırasında kimlik doğrulama mekanizmasının kullanılması.
İkinci senaryoda da,
--Askıda kalan oturumların zaman aşımı süresi kısa tutulmalıdır.
--Hak yönetim yazılımları ile sistem üzerinde çalıştırılacak komutlar sıkılaştırılmalıdır.
Bir sonraki yazıda görüşmek üzere.

Not: Bu makale BeyazŞapka dergisinin Mayıs 2017 sayısında yayınlanmıştır.
Bu köşede anlatılan yöntemler, bilgi güvenliği farkındalığını arttırmak adına anlatılmaktadır. Doğabilecek yasal sorumluluklar bu yöntemleri uygulayan kişilere aittir.

24 Eylül 2015 Perşembe

Python ile Packet Sniffing

Merhaba Arkadaşlar,

Bugün python script dili ile sniffer scripti hazırlamanın aşamalarını anlatacağım. İki farklı yöntemden bahsedeceğim; Birincisi herhangi bir kütüphaneden faydalanmadan bir sniffer nasıl yazılır sorusuna cevap vermeye çalışacağım.İkincisi ise daha önceden bahsetmiş olduğum Scapy kütüphanesini kullanarak bir sniffer hazırlamanın nasıl olduğunu göstereceğim.

Daha önce yayınlamış olduğum Python ile Socket programlama ve Scapy ile Host ve Port Tarama yazılarım konuya aşinalık kazanmak isteyen arkadaşlara faydalı olabilir. Aşağıdaki bağlantılardan bu yazılara ulaşabilirsiniz.

http://msesli.blogspot.com.tr/2015/06/python-ile-socket-programlama.html

http://msesli.blogspot.com.tr/2015/06/scapy-ile-host-ve-port-tarama.html

Teknik detaylara geçmeden önce bir packet sniffer'ın  nasıl çalıştığından bahsedelim. Packet sniffer belirlenen bir veya daha fazla ağ arayüzüne gelen paketleri yakalar. Bir ağ arayüzü sadece kendisini ilgilendiren paketleri dikkate almak için yapılandırılmıştır. Bütün paketlerin yakalanabilmesi için sniffer aracımız, ilgili ağ arayüzünü promiscous mode'a getirir. Promiscous mode, ağ arayüzünün paketleri herhangi bir kritere tabi tutmadan kabul ettiği çalışma modudur. Ağ arayüzünü bu çalışma mode'una almak için  yönetici yetkilerine sahip olunmalıdır.

Bir sniffer aracının çalışma prensibini özetlediğimize göre artık pyhton ile kendi aracımızı yazmaya başlayabiliriz.

import socket
import os
host="192.168.76.132"
if os.name=="nt":
      socket_protocol = socket.IPPROTO_IP
else:
      socket_protocol = socket.IPPROTO_ICMP
sniffer = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket_protocol)
sniffer.bind((host,0))
sniffer.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)
if os.name=="nt":
      sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)
while True:
      print sniffer.recvfrom(65565)
if os.name=="nt":
      sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_OFF)

Satır satır kodumuzu inceleyecek olursak, ilk iki satırda işimize yarayacak modülleri scriptimize dahil ediyoruz. Daha sonra dinleme yapacak sistemin ip adresini "host" değişkenimize atıyoruz. Sonraki aşamada Linux ile Windows sistemlerdeki bir farklılıktan dolayı bir işletim sistemi sorgusu yapıyoruz. Eğer işletim sistemi Windows ise protokolden bağımsız bütün IP paketlerini yakalayabiliyoruz, eğer işletim sistemi Linux ise sadece ICMP paketlerini yakalayabiliyoruz. Sniffer aracımız bir sunucu gibi çalışacağı için önce bir socket oluşturuyoruz ve "host" değişkenimizde tuttuğumuz IP adresimize bu sunucuyu bağlamış oluyoruz. Bir sonraki aşamada yakalayacağımız paketlerin IP başlıklarının paketlere dahil edilmesini aktif ediyoruz. Eğer Windows işletim sisteminde isek ağ arayüzünü promiscous mode'da çalışmasını sağlıyoruz. Yakaladığımız paketleri ekrana yazdırmak için bir sonsuz döngü yarattıktan sonra yine eğer Windows sistemde isek ağ arayüzünü promiscous mode'dan çıkarıyoruz.

Yukarıdaki kodu bir metin editörü ile dosya açıp içine kopyalıyoruz ve "py" formatında kaydediyoruz. Daha sonra bu scripti çalıştırılabilir hale getirip çalıştırıyoruz. Aşağıdaki komutlarla bu işlemleri gerçekleştiriyoruz.

#nano sniffer.py
#chmod +x sniffer.py
#python sniffer.py

Scriptimiz çalıştıktan sonra yakalanacak paketleri bekliyor, farklı bir terminalden www.google.com adresine ping attığımızda bu paketlerin aracımız tarafından yakalandığı görülür. Ekran görüntüsü 1' den de görüceleği gibi bu yakalanan paketlerdeki veriler RAW data denilen ham halde elde edilmektedir. Tcpdump gibi profesyonel bir araçtaki bu paketleri görüntülemek için bu verileri decode işlemine tabi tutmamız gerekir ya da Scapy kütüphanesinin bize sağladığı imkanlardan faydalanmamız gerekir.

Ekran Görüntüsü 1: Yakalanan paketler

from scapy.all import *

def packet_capture(packet):
      print packet.show()
packet=sniff(prn=packet_capture)
wrpcap('sniffedpackets.pcap',packet)

Scapy kütüphanesi bu aşamada işimiz oldukça rahatlatacak. Kodumuzu inceleyecek olursak ilk önce scapy kütüphanesini scriptimize dahil ediyoruz. Daha sonra yakaladığımız paketlere yapacağımız işlemleri tanımlayacağımız methodu oluşturuyoruz. Pakete yapacağımız işlem ise verileri ekrana yazdırmak.Sonraki satırda yakaladığımız paketleri "packet" değişkenimizde tutuyoruz. Ardından bu paketleri "packet_capture" methodumuza yolluyoruz ve ayrıca"sniffedpackets.pcap" dosyasına yazıyoruz. Benzer şekilde bu scripti çalıştırılabilir hale getirip çalıştırıyoruz. www.google.com adresine ping atıp scriptimizin çalıştığı konsola geri döndüğümüzde anlık olarak yakalanan paketleri görebiliriz. Tabiki Wireshark ya da tcpdump gibi profesyonel araçlardaki gibi okunabilirlik söz konusu olmasa da ham veriden daha okunabilir olduğu söylenebilir. "Ctrl+C" kombinasyonuyla scriptin çalışmasını durduğumuzda "sniffedpackets.pcap" dosyası oluşturulur.

Ekran Görüntüsü 2:Yakalanan Paketlerin Konsolda incelenmesi

Yakalanan paketleri hem konsolda hemde "sniffedpacket.pcap" dosyasını Wireshark'ta açarak inceleyebiliriz. Konsoldaki çıktıya baktığımızda daha öncedeki yazılarımda da kullandığım Scapy programının çıktıları ile karşılaşıyoruz. Paketle ilgili parametreleri gayet net bir şekilde görebildiğimizden detaylı incelemeleri gerçekleştirebiliyoruz. Bundan daha iyisi tabiki bu paketleri Wireshark programı ile incelemek. Ekran Görüntüsü 3'te görülebileceği gibi Wireshark ile yakalanmış gibi ayrıntılı paket analizi yapmak mümkün.



Ekran Görüntüsü 3:Yakalanan Paketlerin Wireshark'ta İncelenmesi

Bugün bir sniffer aracı nasıl çalışır ve python ile bir sniffer aracı nasıl yazılır sorularının cevaplarını vermeye çalıştım. Scapy kütüphanesinin python ile program geliştiricilerinin işini ne kolaylaştırdığını bir kez daha görmüş olduk. Her ne kadar programımız Wireshark kadar profesyonel olmasa da, Wiresharkı çalıştırmamızın mümkün olmadığı ya da kaynak sıkıntısı çektiğimiz ortamlarda (Raspberry Pi vs.) işimize yarar bir araç geliştirmiş olduk. Bir sonraki yazıda görüşmek üzere.

Yararlandığım Kaynak:
Justin SERTZ,"BLACK HAT PYTHON"

25 Haziran 2015 Perşembe

Python ile Host ve Port Tarama Scripti

Merhaba Arkadaşlar,

Bu yazıda python script dili ile kendi host ve port tarama scriptimizi nasıl hazırlayacağımızı anlatacağım. Bir önceki yazımda scapy programı ile tarama işlemlerinin nasıl gerçekleştirildiğinden bahsetmiştim. Aşağıdaki bağlantıdan bu yazıma ulaşabilirsiniz.

http://msesli.blogspot.com.tr/2015/06/scapy-ile-host-ve-port-tarama.html


Bu scripti hazırlarken scapy programının python dili için hazırlanmış kütüphanesinden faydalandım.

1 #!/usr/bin/python
2
3 from scapy.all import *
4
5 def hostresult(answer):
6  if answer ==None:
7    print"%s might be down" % target
8  else:
9    print"%s is up" % target
10
11def portresult(answer):
12  if answer ==None:
13    print"%d port is open" % port
14  else:
15    print"%d port is closed" % port
16
17def tcpsynresult(answer):
18  if int(answer[TCP].flags)==18:
19    print"%d port is open" % port
20  else:
21    print"%d port is closed" % port
22
23
24if (len(sys.argv)< 2) & (len(sys.argv) > 5) :
25
26   print"Usage - ./scanner.py [scan type][target ip address] ?[first port]?[last port]"
27
28   print"Example for Host Scan with ARP - ./scanner.py -a 192.168.2.1"
29   print"Example for Host Scan with ICMP - ./scanner.py -p 192.168.2.1"
30   print"Example for UDP port Scan - ./scanner.py -u 192.168.2.1 53"
31   print"Example for UDP port Scan - ./scanner.py -u 192.168.2.1 1 100"
32   print"Example for TCP SYN Scan - ./scanner.py -s 192.168.2.1 80"
33   print"Example for TCP SYN Scan - ./scanner.py -s 192.168.2.1 1 100"
34   print"Example for TCP FIN Scan - ./scanner.py -f 192.168.2.1 80"
35   print"Example for TCP FIN Scan - ./scanner.py -f 192.168.2.1 1 100"  
36   sys.exit()
37
38target=sys.argv[2]
39if len(sys.argv)>3:
40    port=int(sys.argv[3])
41
42if len(sys.argv) ==5:
43  start=int(sys.argv[3])
44  end=int(sys.argv[4])
45
46if sys.argv[1] =="-a":
47  answer=sr1(ARP(pdst=target),timeout=1,verbose=0)
48  hostresult(answer)
49
50if sys.argv[1] =="-p":
51  answer=sr1(IP(dst=target)/ICMP(),timeout=1,verbose=0)
52  hostresult(answer)
53
54if (sys.argv[1] =="-u")&(len(sys.argv)==5):
55   for port in range (start,end):
56     answer=sr1(IP(dst=target)/UDP(dport=port),timeout=5,verbose=0)
57     time.sleep(1)
58     portresult(answer)
59elif (sys.argv[1] =="-u")&(len(sys.argv)!=5):
60  answer=sr1(IP(dst=target)/UDP(dport=port),timeout=5,verbose=0)
61  time.sleep(1)
62  portresult(answer)
63
64
65if (sys.argv[1] =="-s")&(len(sys.argv)==5):
66   for port in range (start,end):
67     answer=sr1(IP(dst=target)/TCP(dport=port),timeout=1,verbose=0)
68     tcpsynresult(answer)
69elif(sys.argv[1] =="-s")&(len(sys.argv)!=5):
70  answer=sr1(IP(dst=target)/TCP(dport=port),timeout=1,verbose=0)
71  tcpsynresult(answer) 
72
73
74if (sys.argv[1] =="-f")&(len(sys.argv)==5):
75   for port in range (start,end):
76     answer=sr1(IP(dst=target)/TCP(dport=port,flags="F"),timeout=5,verbose=0)
77     portresult(answer)
78elif (sys.argv[1] =="-f")&(len(sys.argv)!=5):
79  answer=sr1(IP(dst=target)/TCP(dport=port,flags="F"),timeout=5,verbose=0)
80  portresult(answer)

Yukarıdaki scriptimizi satır satır incelemektense gerçekleştirdiğimiz işlemleri anlatacağım. Genel olarak scriptten bahsedecek olursak, kullanıcıdan tarama tipini, hedef IP adresini, eğer port tarama yapılacaksa port numarası ya da port numaraları alıyoruz. Eğer bu parametreler eksik veya fazla girilirse, konsola örnek kullanımlarla ilgili ipuçlarını yazdırıyoruz.

İlk olarak scriptin Host tarama işlemini ARP protokolünü kullanarak nasıl gerçekleştirdiğine bakalım. Kullanıcı -a parametresini girdiğinde, script 46. satırdaki if sorgusuna giriyor. 47. satırda "sr1" isimli methodla bir ARP istek paketi oluşturuyoruz. "pdst" parametresine "target" değişkeninde tuttuğumuz hedef IP adresini atıyoruz. "timeout" parametresine 1 değerini girerek "sr1" methodunun cevap için ne kadar beklemesi gerektiğini belirliyoruz. "verbose" parametresini 0 yapıyoruz çünkü scapy'nin çıktılarını değil kendi çıktılarımızı ekrana yazdıracağız. Bu işlemi, "answer" değişkeninde tuttuğumuz "sr1" methodunun çıktısını "hostresult" methodumuza göndererek yapıyoruz. 5. satırda yer alan "hostresult" methodumuzu incelediğimizde, eğer answer değişkeninde bir cevap paketi yer almıyor ise taradığımız host'un kapalı olabileceğini ekrana yazdırıyoruz. Net bir ifade kullanmamın sebebi, paketin gelmemesinin birden fazla sebebinin olabileceğinden dolayı yani host aktif olabilir ama bize cevap paketinin ulaşmamış olma olasılığı da var. Eğer "answer" bir cevap paketi içeriyorsa taradığımız host aktif mesajını ekrana yazdırıyoruz.

ICMP'yi kullanarak host tarama işlemini de benzer şekilde yapıyoruz. Kullanıcı tarama tipini "-p" olarak girdiyse script 50. satırdaki if sorgusuna giriyor. Bu sefer "sr1" methodunda bir IP paketini oluşturuyoruz ve bu paketin içine ICMP paketini ekliyoruz. Hedef IP adresini "target" değişkeninden alıyoruz. "sr1" methodunun "timeout" ve "verbose" parametrelerini girdikten sonra "answer" değişkenini "hostresult" methoduna gönderiyoruz. Bu methodun cevap paketini nasıl yorumladığını yukarıda bahsetmiştim.

UDP port taraması ise şu şekilde gerçekleşiyor. Kullanıcı tarama tipini "-u" olarak belirlediyse ve "last port" parametresi de girildiyse belirli bir aralıktaki UDP portları tarayacağımızdan script, 54. satırdaki if sorgusuna düşüyor. Bu sorgunun içinde yer alan for döngüsü ile girilen değerler arasındaki bütün portlar için tarama işlemini gerçekleştirmiş oluyoruz. Burada "sr1" methoduna bir IP paketi ve bu paketin içine de bir UDP paketi oluşturuyoruz. "target" değişkenindeki hedef IP adresini "dst" parametresine atıyoruz. UDP paketinin "dport" parametresine "port" değişkenini atarak taramak istediğimiz portu belirlemiş oluyoruz. UDP port taramasının sağlıklı sonuç vermesi için "timeout" parametresini 5 olarak belirledik ve scripti sleep mod'a aldık. "answer" değişkenini analiz etmesi için 11.satırda yer alan "portresult" methoduna yolladık. Bu method cevap almadığında portu açık olarak belirleyip ekrana ilgili mesajı yazdırıyor. Eğer cevap alıyor ise bu portun kapalı olduğu anlamına geliyor. Kullanıcı eğer "last port" parametresini girmediyse script sadece "first port" parametresine girilen değer için tarama işlemini gerçekleştiriyor.

Scriptimiz TCP port taraması için iki farklı modu destekliyor. Bunlar SYN tarama ve FIN tarama. SYN taramasını 65. satırdaki if sorgusu, FIN taramasını ise 74. satırdaki if sorgusu gerçekleştiriyor. Sonuçları yazdırma işlemini farklı methodlarla(tcpsynresult, portresult) yapıyoruz çünkü SYN tarama açık port için bir cevap paketi bekler, FIN tarama ise kapalı port için bir cevap paketi bekler.

Şimdi scripti deneme vakti. Kali'de çalıştıracağım ve Metasploitable işletim sistemine sahip hostun portlarını tarayacağım. Kali'de konsola "nano scanner.py" komutunu girerek bir dosya açıyoruz ve yukarıdaki kodu dosyaya kopyalıyoruz. Daha sonra " chmod +x scanner.py" komutuyla dosyamıza çalıştırılabilme yetkisini veriyoruz.

Sırasıyla yukarıda bahsettiğim işlemleri gerçekleştirelim.


Ekran Görüntüsü 1: ARP Tarama

Yukarıdaki ekran görüntüsünde aktif bir host ile pasif durumdaki bir hostun tarama işleminin, scriptimizi kullanarak nasıl yapıldığını görebiliriz.

Benzer şekilde, aşağıdaki komut ile ICMP ile host taramasını gerçekleştirebiliriz.

#./scanner.py -p 192.168.200.130


Ekran Görüntüsü 2: ICMP Tarama

UDP port taraması için belli bir portu veya belirli bir port aralığını tarayabiliriz. Bunun için aşağıdaki komutları kullanıyoruz.

#./scanner.py -u 192.168.200.130 53
#./scanner.py -u 192.168.200.130 1 10


Ekran Görüntüsü 3: UDP Port Tarama

Yukarıdaki görüntüden scriptin UDP tarama sonuçlarını görebiliriz.

TCP port taramasını ise tarama tipini SYN tarama için "-s", FIN tarama için "-f" olarak belirleyerek kullanabiliriz.

#./scanner.py -s 192.168.200.130 80
#./scanner.py -s 192.168.200.130 1 10


Ekran Görüntüsü 4:TCP SYN Tarama

#./scanner.py -f 192.168.200.130 80
#./scanner.py -f 192.168.200.130 1 10



Ekran Görüntüsü 5:TCP FIN Tarama

Yukarıdaki ekran görüntülerinden SYN ve FIN tarama sonuçlarını görebiliriz.

Bugün kendi host ve port tarama aracımızı python script dili ile nasıl hazırlayabileceğimizi gördük. NMAP kadar profesyonel bir araç olmasa da en azından bir başlangıç yapmış olduk. Bir sonraki yazıda görüşmek üzere.

Yararlandığım Kaynak:
Justin Hutchens, "Kali Linux Network Scanning Cookbook"