BadUSB nedir? Ne yapar? Tehlikesi nedir?

Uzun zamandır fırsat bulup yazamadığım bloğuma baktığım zaman benden epey geride kaldığını gördüm. Ufak da olsa birşeyler yazmak isteğine bugün artık karşı koyamadım 🙂
Bu yazıda BadUSB ‘den ve alınabilecek önlemlerden bahsedeceğim. Daha çok son kullanıcıdaki farkındalığı artırmak amaçlı bir yazı olacağından çok fazla teknik detaya girmeden herkesin anlayabileceği seviyede tutmaya çalışacağım. Bir sonraki yazımda muhtemelen kendi BadUSB mizi yapacağız. Bu sefer proof of consept (POC) tadında, mümkün olduğunca teknik,  meraklısına özel bir yazı olacak. Takipte kalın 🙂

Giriş

Günlük hayatımızda bize çok zararsız görünen USB bellekleri çıktı almak için, veri paylaşmak için vs  sıkça kullanıyoruz. Bazen bir zararlı yazılımla enfekte olmuş bilgisayar USB belleğimizin içeriğini gizliyor (birçoğumuz sildiğini sanıyoruz). Bu durum can sıkıcı olsa da çoğu zaman önemsemiyoruz. Başkalarından aldığımız, yolda bulduğumuz USB bellekleri bilgisayarımıza takıp dosya kopyalıyor, kopyaladığımız dosyaları açmadığımız sürece içinde zararlı yazılım olsa dahi birşey olmaz güvendeyiz diye düşünüyoruz. USB belleği tarayan anti-malware yazılımları nasıl olsa yakalar diye düşünebiliyoruz.
Bilgisayarınıza bir başkasının hakimiyetinde olan bir klavyeyi bağlar mıydınız?
Peki ya size o taktığınız USB belleğin aslında bir klavye olabileceğini söylesem?
Aklınızda iki soru belirmiş olmalı:
1-Nasıl yani? bildiğimiz flash bellek? Klavye olması mümkün mü? (olsa görürdüm tuşu hani nerede 🙂 )
2- Diyelim mümküm ne olacak ki?
USB arayüzüyle bağladığımız (fan led vs gibi sadece güç için bağlananlar masumlar  hariç) cihazlar  bilgisayarınıza kim olduğunu ne iş yaptığını ve nasıl çalıştığını bilgisayarınıza bildirmek durumundadırlar. USB bellek örneği üzerinden gidersek bilgisayarınıza bellek olduğunu , depolama işi yaptığını ve çalışma şeklini anlatır. Böylece siz de cihazınızı bu bilgiler ışığında bilgisayarınızın size sunduğu imkanlarla (cihaz driverı aracılığıyla) sorunsuz kullanırsınız. Bu işi yapan kısıma firmware (donanım yazılımı,bellenim) denir. Diğer bir ifadeyle firmware, “sayısal veri işleme yeteneği bulunan her tür donanımın kendisinden beklenen işlevleri yerine getirebilmesi için kullandığı yazılımlara verilen addır.” (wikipedia) . Bu yazılım cihaza gömülü olarak (halihazırda yüklü)  gelir. Bu durum USB bellekler ve klavyeler içinde dolayısıyla geçerlidir. İşte tam burada şöyle bir soru aklımıza gelmeli: Peki bu firmware in doğru söylediğini, örneğin bir USB belleğin bilgisayarımıza kendini USB bellek gibi mi yoksa başka bir cihaz (mesela klavye) gibi  mi tanıttığını kim kontrol ediyor? Bildiğim kadarıyla bunu kontrol eden bir mekanizma (en azından standart bir işletim sistemi parçası olarak ) mevcut değil. O zaman donanım yazılımı (firmware) değiştirilmiş bir cihaz bilgisayarımıza yalan söyleyerek kendisini başka bir cihaz olarak tanıtabilir ve hatta hiç beklemediğimiz şeyler yapabilir. USB bellek olarak gördüğünüz bir cihaz klavye olarak hareket edip bilgisayarınızda sanki siz birşeyler  yazıyormuşsunuz gibi davranabilir, kod çalıştırabilir. Normalde gerçekten USB bellek olarak kullanıldığını bildiğiniz (örneğin kingston, toshiba, sandisk vs bellekleri) cihazların bunu yapabilmesi için donanım yazılımının (firmware) özellikle değiştirilmiş ve klavye gibi davranmaya ayarlanmış olması gerekir. Teoride ilk sorumuzun cevabının olumlu olduğuna  gelmeye çalıştığımı anlamışsınızdır. Pratikte ise bunun mümkün olduğu  2014’te Karsten NOHL ve Jakob LELL adındaki iki araştırmacı tarafından Black Hat konferansında dünyaya duyuruldu ve kanıtladı. Bu tarih öncesinde bu durumun istihbarat teşkilatları tarafından bilinip kullanıldığı tartışmaları konumuz olmadığı için girmiyorum.

Peki BadUSB nedir?
BadUSB için görüntüsünün oluşturduğu beklentiden farklı şekilde çalışması için donanım yazılımı (firmware) özellikle değiştirileren veya doğrudan bu şekilde kodlanan USB cihazlardır diyebiliriz.
BadUSB için, görüntüdeki cihaz türünü USB bellekle sınırlamak doğru olmadığı gibi yaptığı işi klavye gibi davranmak olarak belirtmek de doğru olmaz. Bilgisayarınıza bağladığınızda sizden gizli klavye gibi çalışan ama sizi USB bellek görüntüsüyle aldatan bir cihaz, BadUSB’ ye güzel bir örnek olabilir (tanım değil). Piyasada bu işi yapan cihazlar USB Rubber duck olarak satılmakta. Takılan bilgisayarda istediğiniz işlemleri (veri çalmak,zaralı yazılım yüklemek vs vs işleri) yapabilecek scriptleri (kod parçalarını)
yazmanıza imkan tanıyan programlar internette bulunmakta.

USB Rubber Duck

Bu noktada BadUSB nin ne yapabileceğine dair bir örneği de vermiş olduk aslında: kod çalıştırmak.
Aşağıdaki videoda kendi oluşturduğum bir BadUSB’nin içine yerleştirdiğim firmware sayesinde klavye gibi davranarak internetteki bir sunucudan takıldığı bilgisayara zararlı yazılım indirdiğini ve çalıştırdığını görebilirsiniz. İşlem tamamlandığında bilgisayar saldırganın (ki bu örnekte ben oluyorum) kontrolüne geçmekte.

Dipnot: burada cihaz tarafından yapılan işlemin görülmesi, görülmeye ayarlanması ile ilgili. Gerçekte siz hiç birşeyin farkına varmadan da bu işlemler yapılabilirdi.

P_20160303_032041

Yazdığı kodlar (yaklaşık olarak) (Klavye yerleşimini değiştirdiğim için payload bozuk biraz)

Bu tehlikeli ve kötücül cihazlar nereden gelebilir?
Bu tür cihazlar (BadUSB) hedef noktaya yakın yerlere atılmak suretiyle bilinsiz kişilerce hedefe takılması amaçlanabilir. (bakınız önlem 3)
Aslında cevap her yerden olmalı çünkü; elinizdeki normal bir USB cihazı taktığınızda bir bilgisayarın (vs) bu işlemleri otomatik gerçekleştirip siz farketmeden cihazınızı aleyhinize çalışacak bir silah haline getirmesi mümkün(bakınız önlem 2 ve 4 ve 5)

Sonuç

Bu yazıda bir USB cihazın görüntüsünün sizi aldatabileceğini, farketmeden hoşlanmayacağınız şeyler yapabileceğini anlatmaya, farkına vardırmaya çalıştım.

Önlemler

Hitap etmeye çalıştığım kitle açısından yazının en önemli kısmına gelirsek:

1-Gerektiğinde kendinize ait USB cihazları kullanmalısınız.

2-USB cihazlarnızı güvenmediğiniz yerlere takmamalısınız.
3-Yalnızca güvenilen cihazları bilgisayarınıza bağlamalısınız. Yolda sağda solda bulduğunuz cihazları bağlamamalısınız.
4-Her USB cihaza güvenmemeli, güvendikleriniz de dahil olmak üzere takmadan önce önlem almalısınız.
5-Cihazların özellikle donanım yazılımında ve depolama içeriğinde zararlı yazılım taraması yaptırmalısınız.

6-Firmware güncellemelerinde kod imzalaması (code signing) kullanmalısınız.

7-Firmware güncellemelerini engelleyebilirsiniz.

8-Kullandığınız bilgisayarın (vs) kritiklik derecesine, sakladığı bilgilerin önemine göre USB portlarını tamamen kullanılamaz hale getirmeyi değerlendirebilirsiniz.

9-USB cihazı takıldığında doğrudan sanal bir bilgisayara bağlanacak şekilde ayarlayıp oradan kullanmayı düşünebilirsiniz.

Kötücül bir cihazın büyük ihtimalle bir klavye gibi davranacağını düşünürsek yukarıdakilere ek olarak :

  • (şüpheli) USB cihazı kullanmadan önce bilgisayarınızın ekranını kilitleyip cihazı takmak ve bir süre bekledikten sonra (ne kadar uzun o kadar iyi) kilidi açıp kullanmak,
  • (şüpheli) USB cihazı takmadan önce klavye düzeninizi (keyboard layout) normalde kullandığınız dilden ve ingilizceden başka alakasız bir dile değiştirmek
  • İnternetten yazılım indirmesi olasılığına karşı (şüpheli) cihazı kullanmadan önce interneti kesmek ve cihazı çıkarana kadar bağlamamak

önlemlerinin de faydalı olabileceğini düşünüyorum.

Umarım faydalı bir yazı olmuştur. Olumlu – olumsuz eleştirilerinizi yorum olarak yazmaktan çekinmeyin.

 

 

Rainbow Table Nedir , Nerede , Ne İçin Kullanılır?

Rainbow table, bir string ve onun hashi karşılığı eşleşmelerinden oluşan bir tablodur. Hash crack işlemi sırasında, normalde denenecek string hashlenir , hashler karşılaştırılır ve deneme bir sonraki deneme stringi ile aynı şekilde devam eder. Bu yöntem işlem zamanı açısından verimsizdir. Bu yüzden rainbow tables (önceden oluşturularak) crack sırasında kullanılır. Kırılacak hash ile rainbow tabledan alınan hash karşılaştırılır, eşleşen hash bulunduğunda string karşılığı rainbow table da zaten belli olduğu için parola daha hızlı bulunur. Tabiki bu hızın bize maliyeti ise bellek alanıdır.
İngilizce karakter seti için 7 karakter ve daha azı için rainbow table kolayca bulunabilir ve boyutları makul niteliktedir. Bu tablolar 7 karakterlik NTLM hash te ya da 14 karakterlik LM hash lerde kullanılabilir. Bu yüzden bu özelliklerde parolalar kullanmak güvenli değildir.

Google hacking nedir? ne işe yarar? nasıl yapılır?

Google hacking in altındaki ana fikir özel arama operatörleri kullanarak tam olarak istediğimiz şeye ulaşmaktır. Bu operatörler hakkında geniş bilgiye buradan erişilebilir. Ben sadece sık kullanılan operatörlere değinerek bir fikir oluşturmaya çalışacağım. Ardından google ın belki hiç aklınıza gelmemiş bazı kullanım alanlarına değinmeye çalışacağım.

  • “site” operatörü arama sonuçlarını belirtilen alan ismi (domain) ile sınırlar. Örnek vermek gerekirse arama çubuğuna site:aranacaksite.com eklenerek arama sonuçları aranacaksite.com domaini ile sınırlanır.Tek başına yazılırsa bu domainin kaç sayfasının Google tarafından indexlendiği görülebilir.
    site:www.örneksite.com şeklinde kullanarak Google ile indexlenen tüm index sayfalarını görebiliriz.
  •  “filetype” operatörü istediğiniz dosya tipini içeren sayfaları görmenizi sağlar. Aramaya filetype:pdf ekleyerek ile pdf dosyalarına link içeren sonuçlar aranabilir.
  • – + ve ” ın kullanımı
    – operatörü önüne koyduğunuz şeyin sonuçlarda çıkarılmasını sağlarken + ise tersine sonuçlarda bulunması gerektiğini belirtir. ” işareti ise birşeyi aynen yazdığımız gibi aramamızı sağlar. Bir kelime öbeğini tümüyle aramak için kullanılabilir. örneğin “Ankaranın bağları” -filetype:mp3 şeklinde bir aramayla imla hatalı olarak yazdığın tamlamayı içinde mp3 bulunduran sonuçlar için yapabiliriz. + ve – inurl, intitle, site, filetype gibi operatörler ile de kullanılabilir. Bu operatörler ile kullanılar – sonuçlar bu özelliği içermesin anlamına gelir.
  • intitle:Aranacak_başlık şeklinde kullanılarak sonuçların bu başlığı içerip ( normal kullanım) içermeyeceği (önünde – ile kullanım) belirtilebilir.
  • numrange:sayı1-sayı2 şeklinde kullanılarak arama belli bir sayı aralığı içerilecek şekilde yapılabilir.
  • inurl:urlde_bulunacak_kelime şeklinde sonuçlarda olacak sayfaları, url de geçen kelimelere ve başlıklarına göre sınırlayabiliriz. Burada da – tersi anlama gelecektir.
  • | ve OR operatörleri ile sonuçlarda bir kelime veya başka bir kelime içerecek şekilde arama yapılabilir. Şöyle ki ali|veli   veya ali OR veli şeklindeki bir sorguyla içinde ali veya veli kelimelerinde en az biri geçen sonuçlar bulunabilir.
  • * operatörü bir ya da daha fazla kelime  anlamına gelecek şekilde kullanılır. Örneğin: 3 adet * 15 lira gibi bir sorguyla 15 liraya 3 adet ne alabileceğinizi görebilirsiniz (aslında pek de bişey alamazsınız 🙂 )
  • ~ operatörü bir kelimenin eş anlamlılarını belirtir. 3 ~adet bardak 15 tl sorgusu ile adet yerine tane içeren sonuçları da yakalayabilirsiniz.

“Hepsi iyi hoş ama çokta büyük bir marifet değil” diyor olabilirsiniz. Gün geçtikçe artan veri miktarı artık google ı bile ( eskisine göre ) daha alakasız sonuçları karşımıza çıkarmaya iter hale gelmiştir. Bizi google da anlamazsa artık kim anlar bilemiyorum 🙂 Bu yüzden aradığını bulmayı huy edinmiş herkes bir yerde bunlara ihtiyaç duyabilir. Daha ilginç bir nokta ise Google ın artık kişi veya kurum hakkında bilgi toplama, başka yollarla ulaşılması zor noktalara, sonuçlara kolayca ulaşmak için kullanılır hale gelmiş olmasıdır. “Zaten öyle değil miydi?” sorusunu duyar gibiyim. Tam burasının güvenlik araştırmacılarını/hackerları daha çok ilgilendirdiğini söyledikten sonra örneklerle ne demek istediğimi açıklayayım. Diyelim ki bir kurum hakkında araştırma yapıyorsunuz ve oltalama (phishing) yapmak istiyorsunuz. Başarılı bir oltalama için kurbanın dikkatini çekebilecek bir mailden güzel ne olabilir. Kuruma ait asdfg@kurumdomainismi.com gibi bir mail adresine ulaştınız. Hemen “asdfg@kurumdomainismi.com” google sorgusu ile daha fazla bilgi topluyorsunuz. Aa bir de baktınız ki bu kişi bir pul koleksiyonu yapıyor ve ilgili bir siteye koleksiyonunda eksik olan parçayı belirtip elinde olanlardan yardım istiyor, mail adresini de iletişim kanalı olarak vermiş. Eğer biz bunu kullanırsak başarı ihtimali daha yüksek bir saldırı yapacağımız gayet mantığa yatkın öyle değil mi? Hepsi bu mu? Tabiki hayır. Root parola kısmı boş bırakılmış phpmyadmin sayfalarını bulmak başka yollarla kıyaslanmayacak kadar kolay olsa “Welcome to phpmyadmin” +”create new database” sorgusunu yazıp enter tuşuna basmak hızlı olsa yine ikna olmaz mısınız? (dikkat: sonuçlara tıklamayınız ). O halde google ın tahmin ettiğinizden çok daha kolay bir şekilde kullanıcı adı, parola içeren dosyaları, çalışan web teknolojilerini ve versiyonlarını, sistem veya web açıklarını, dizinleri, hassas bilgiler içeren dosyaları, sistemlere yerleştirilmiş arka kapıları(backdoor), istediğiniz tipte bir online cihazı vs vs bulabileceğini söylesek muhtemelen yine heyecanlanmaz ya da şaşırmazdınız. Hal böyle ise belirttiğim tarzda verilerin nasıl bir sorguyla karşımıza çıktığının örneklerini görebileceğiniz bu sayfaya tıklamaya hiç ihtiyacınız yok 🙂  Gördüklerinizden fazlası tamamen sizin üretkenliğinize kalmış.

Dikkat:Bulduğunuz linkleri tıklamak tamamen sizin sorumluluğunuzdadır. Sonuçlarını tahmin edemiyorsanız yapmamanızı tavsiye eder, bir mesuliyet kabul etmeyeceğimi belirtirim.

Yazımı okuduğunuz için teşekkürler, umarım beğendiniz. Kısmetse, hakkında birkaç kelam etmeyi düşündüğüm shodan yazımda buluşmak dileğiyle…

netcat kullanımı ile “cool” hareketler (basit netcat kullanımı örnekleri)

Netcat TCP , UDP portlarını okuyabilen ve yazabilen çok yönlü bir araçtır. Netcat ile port dinleme, port tarama ,port dinleme, bağlantı oluşturma gibi birçok şey yapabilirsiniz. Kendi başına kullanılabileceği gibi başka bir uygulamanın arkaplanında da çalışabilir.

“nc -h” komutuyla yardım görüntülenebileceğini belirttikten sonra birkaç basit uygulama yapalım.

Port tarama
TCP port taramasının ardındaki fikir three way handshake (3’lü el sıkışma)dir. RFC ye göre açık bir TCP portuna bir SYN paketi gönderildiğinde ACK ile cevap verilmelidir. Kapalı portta ise
RST paketi gönderilir. Biz örnek olarak TCP 139 nolu Netbios-ssn servisi portunu tarayacağız.. “nc -v hedef_IP 139” komutunu veriyoruz. Netcat bağlantıyı kurup bize portun açık olduğu bilgisini veriyor ve sonraki komutlarımızı bekliyor.
nc port tarama
Eğer bu komut esnasında Wireshark kullanarak gidip gelen paketleri dinlersek three way handshake ‘i görebiliriz.
Aşağıdaki görüntüde 3 numaralı paket SYN paketi tarafımızdan gönderiliyor. Ardından karşı sistem bu paketi port açık olduğu için 4 te görülen SYN,ACK paketi ile cevaplıyor. Bizde 5 teki gibi ACK paketi ile onu cevaplayıp el sıkışmayı tamamlıyoruz.
three way hanshake
Eğer port kapalı olsaydı biz SYN  paketini gönderdiğimizde karşıdan RST (reset) paketi ile cevaplandırılacaktık ve bağlantı sonlanacaktı.
Bir UDP portu tarayacak olursak burada biraz farklı bir mantığın olduğunu görürüz. Çünkü UDP stateless bir protokoldür ve three way hanshake kullanmaz.
“nc -vvnzu -w 1 192.168.72.133 160-163” ile ( -vv : extra verbosity, n: no name resolution, w: wait 1 second timeout, z: port; u:udp tarama modu) ile 160 163 arasındaki portları tarıyoruz. UDP port taraması yapılırken boş bir UDP paketi yollanır port açıksa cevap gelmez, kapalıysa bağlantı (ICMP unreachable mesajı ile) reddedilir. Ancak cevap gelmemesi hedefin ayakta olmamasından ya da firewall un bu hedefe ICMP mesajlarını engellemesinden kaynaklanıyor olabilir. Dolayısıyla bizde false-positive dediğimiz aslında doğru olmayan bir sonuç alırız. Ayrıca port taramasının yoğunluğu IDS veya IPS ‘in dikkatini çekebilir ve mesajlar düşürülebilir.

  • Banner yakalama (Banner Grabbing)
    “nc -v localhost 80” (-v verbosity) komutunu vererek kendi makinemde çalışan http (port 80) servisine bağlanıyorum. Bağlantı sağlandıktan sonra “HEAD / HTTP/1.1” komutunu veriyorum ve sunucu bana banner bilgisini dönderiyor.
    nc1Böylece apache 2.2.22 versiyonu kullanıldığını vs. görmüş oluyorum. Bu yöntem kullanılırken servis bannerlarının değiştirilmiş veya spoof edilmiş olabileceği unutulmamalıdır.
  • Basit Chat Sistemi
    İki bir Linux ile bir xp makine arasında basit bir chat hizmeti oluşturacağız. Bunun için xp makinanın C:WINDOWS klasörüne nc.exe dosyasını atıyoruz. cd komutunu kullanarak gerekli konuma geçiş yapıp        (yine xp de) netcat ‘i port 4444 ü dinleyecek şekilde “nc -lvp 4444” (-l : listen, v : verbosely, p : port 4444 ) komutuyla ayarlıyoruz. Bu işlem “netstat -an :FIND “4444”  ile ( : nin altgr ve z nin solundaki tuşla yapıldığına dikkat) doğrulanabilir.
    Şimdi linux üzerinden “nc -v xp_nin_IP_adresi 4444”  ile bağlanabiliriz. Artık komut satırına yazdıklarımız xp nin komut satırında görüntülenecektir.
    wake up neo
  •  Dosya Transferi
    “nc -lvp port_numarası” komutunu kullanarak istediğimiz bir portu dinlemeye alabiliriz. Bunu kullanarak netcat aracılığıyla Linux makinemizden Xp makinemize dosya transferi yapalım.
    Xp makinemizde “nc -lvp 4444 > gelenmesaj.txt” (l:listen , v:verbosily p:port ) komutuyla 4444 portu dinlemeye alıyoruz ve gelen veriyi gelenmesaj.txt dosyasına yönlendiriyoruz. Linux makinemizde ise “nc -v xp_nin_ip_adresi 4444 < gidenmesaj.txt”  komutuyla  gidenmesaj.txt dosyasını karşıya aktarıyoruz.

    • Uzak Yönetim (Remote Administration)
      Netcat basit konsol programları için network wrapper olarak görev yapabilir. Standart girdi ve çıktıyı (input ve outputu) ağa yönlendirerek cmd.exe gibi bir konsol programı local bir porta (bind) bağlayabilir. Bu işlem bind shell olarak bilinir. Bu porta bağlanan herkese komut satırı sunulmuş olur. Burada karşımıza iki senaryo çıkar:
      Bind Shell
      Elimizde router arkasında (NAT ‘lanarak internete çıkan, private IP kullanan) Ali ve public IP ile doğrudan internete çıkan Bahri ‘nin olduğu bir senaryo olsun. Bahri, Ali ‘nin yardımını istiyor.
      Bahri “nc -lvp 4444 -e cmd.exe” (e : execute) komutunu vererek 4444 numaralı porta gelen verileri execute ederek cmd.exe nin standart input outputlarını bu porta yönlendiriyor.
      Artık Ali “nc -v bahrinin_IPsi 4444” komutunu kullanarak bağlandıktan sonra komut satırına ulaşabilir. Ali’nin sahip olduğu haklar Bahri’nin sahip olduğu haklara bağlıdır.
      Reverse Shell (Tersine kabuk bağlantısı)
      Elimizde router arkasındaki (NAT ‘lanarak internete çıkan, private IP kullanan) Ali ve public IP ile doğrudan internete çıkan Bahri ‘nin olduğu bir senaryo olsun. Ali, Bahri’den yardım istesin.
      Ali router arkasında olduğu için (private IP kullandığı için) Ali ‘nin reverse shell oluşturması gerekiyor. Bahri “nc -lvp 4444” ile gelen istekleri dinliyor. Ali ise “nc -nv bahrinin_IPsi 4444 -e cmd.exe” (linux için /bin/bash) ile Bahri’ye reverse shell bağlantısı açıyor.