Önceki yazımda Tor Tarayıcı ile çalışan ve masaüstü ortamına VNC istemcisi ile bağlanan bir Kali Linux konteynerini göstermeyi başarmıştım. Bir tarama oturumu sırasında Tor Tarayıcının Tor Ağına bağlandığını doğruladım. Bu kurulum, bir web sitesini hedef alan bir saldırgandan gelebilecek trafik türünü simüle etmeme olanak tanıyacak.
Bu deneyde, tarayıcının WebDriver arayüzü aracılığıyla tuş vuruşlarını ve gezinme olaylarını sentezlemek üzere Tor Tarayıcıyı otomatikleştirmek için Selenium'u kullanacağım. Her tarayıcı, tespitten kaçınmak için yerleşik Tor Proxy'si tarafından sağlanan rastgele bir IP adresine sahip olacaktır. Sonuçları yerel dosya sisteminde JSON nesneleri olarak kaydettikten sonra bunları tek bir CSV dosyasına işlemek için Python'u kullanacağım. Son olarak, Bot etkinliğini tespit etmek, sınırlamak ve engellemek için Veri Merkezinde ve İstemci Tarafında hangi karşı önlemlerin uygulanabileceğini tartışacağım.
Tüm dosyalar ve geçerli lisanslar bu açık kaynak deposunda mevcuttur: tor-driver-python
Test otomasyonu konusunda geçmişim var ve testleri tasarlamak için saatler harcadım. Ayrıca Selenium'la çalışmak için de çok zaman harcadım ve test amacıyla web tarayıcılarını otomatikleştirmek için bunu birçok farklı programlama dilinde ve ayarında kullandım. Bir web uygulamasını yalnızca gerçek bir tarayıcıyla test etmenin mümkün olduğu senaryolar vardır ve Selenium bunun için harika bir araçtır.
Bir DevOps Mühendisi olarak işimde, sorumlu olduğum web uygulamalarına saldıran ve bazen doğrudan saldıran web tarayıcılarıyla ne yapacağımı düşünerek çok az zaman harcadım. Bir kez olsun bu konunun diğer tarafını keşfetmenin ilginç bir deney olacağını düşündüm.
Eğitim amaçlı bir botnet saldırısını simüle etmeye ne kadar yaklaşabileceğimi görmek ve modern bir Veri Merkezinde şüpheli Tor ağı trafiği gibi şeylere karşı koyma yöntemlerini tartışmak istiyorum. Bot ağları genellikle Kimlik Bilgisi Doldurma saldırılarını gerçekleştirmek için kullanılır. Sorguları aramak ve web'den bilgi toplamak için benzer bir teknik kullanacağım.
Kimlik bilgisi doldurma, kullanıcı hesaplarına sahtekarlıkla erişim sağlamak amacıyla çalınan kullanıcı adı ve şifre çiftlerinin ("kimlik bilgileri") web sitesi giriş formlarına otomatik olarak eklenmesidir. 1
Etik sorunlardan kaçınmak için bir yandan da göreve sadık kalmaya çalışıyoruz. Senaryoda aşağıdaki değişiklikleri yapıyorum:
robots.txt
dosyalarına sahip siteleri hedef alır ve taramayı dışlamayacak şekilde Şartlar ve Koşullar bu yazının yazıldığı sırada kontrol edildi. Örneğin IMDB'nin Hüküm ve Koşulları, yazılı izin olmadan taramayı açıkça yasaklamaktadır.
Robot Hariç Tutma Protokolü, Web Yöneticilerinin tarayıcılara nerede olduklarını ve nereden bilgi toplamalarına izin verilmediğini söylemelerinin bir yoludur. Daha fazla bilgi ve örnekleri robotstxt.org web sitesinde bulabilirsiniz. Bir makale buldum: Arama sonuçları sayfasında web kazımasına izin veren bir tane bulmaya çalışırken alternatif arama motorlarının listesi . Aşağıda bu araştırmanın bir özetini bulacaksınız.
Arama motoru | robots.txt URL'si | Taramaya izin veriliyor mu? |
---|---|---|
Hayır ama bir API'si var | ||
Hayır ama bir API'si var | ||
HAYIR | ||
Hayır ama bir API'si var | ||
Evet ama tam olarak aradığım şey bu değil | ||
Evet |
Bu konuyu araştırırken faydalı bulduğum diğer bazı kaynaklar:
Bu örnek için Selenyum dışındaki kütüphaneleri kullanmaktan kaçınacağım. Göstermek istediğim bazı temel kalıplar var ve neler olup bittiğini anlamayı zorlaştırabilecek belirli bir Etki Alanına Özel Dil (DSL) ile çıkmaza girmek istemiyorum.
Ancak, test çalıştırma çerçevesi kullanmanın bu tür kodları düzenlemenin harika bir yolu olduğunu düşünüyorum. Bir çerçeve eklemek, genel kod yapısı, yeniden deneme mantığı ve hatta raporlamayla ilgili birçok sorunu çözebilir.
WebDriver oturumunda bir sayfayı nasıl değiştireceğime dair temel bir model var. Ayrıca gerçekleştirilen her eylemden sonra bir duraklama ekliyorum. Tarayıcı otomasyonu kesintili olabilir. Zaman aşımları, taramaya büyük oranda istikrar katar ve hızın sınırlandırılması ve engellenmesi olasılığını büyük ölçüde sınırlar. Gerektiğinde, diğer Arama Motorlarına veya bilgi kaynaklarına yapılan API çağrılarıyla da taramayı artırıyorum.
Seçicilere gerçekten basit bir yaklaşım sergiledim. Tarayıcıda bulunan xpath ve css seçicilerini kullanıyorum. Tarama sırasında sayfalar arasında gezinmek için esas olarak bağlantı etiketlerine ve URL parçalarına odaklanmak.
Öğelere tıklamayı denemeden önce öğelerin mevcut olmasını beklemek için beklenen koşulları kullanıyorum. Selenium projesinin çok sayıda dokümantasyonu var, ancak Stack Overflow'taki örnek kullanımlarla bekleme koşulları hakkındaki tartışmanın da paha biçilmez bir kaynak olduğunu gördüm.
Benzer bir işleve sahip tbselenium adında mevcut bir PyPi projesi var. Bu deneme için Firefox profil kurulumuna başvurdum ancak tbselenium'un içerdiği diğer özelliklerin hiçbirine ihtiyacım yoktu. Kök erişimine sahip olmayan kapsayıcıların ek karmaşıklığı, hata ayıklamanın daha da zorlaşmasına katkıda bulunuyordu. Bu, bağımlılıkları sınırlama ve önceden var olan basit çözümleri deneme motivasyonunu artırdı. Örneğin, saf python çözümlerini doğrudan uygulamak yerine linux araçlarını ve alt kabukları kullandığım birçok yer var.
Biten sınıf yaklaşık 150 satırlık Python'dur. Daha az incelemeyle olup biteni derinlemesine analiz etmenin daha kolay olacağını düşünüyorum. Tor Tarayıcı Başlatıcısının nasıl çalıştığı ve Firefox profillerinin nasıl yapılandırılacağı hakkında çok şey öğrendim. Bu profil çevrimiçi olarak birden fazla kaynaktan toplanmıştır ve kaynak kodunda ve bu belgede bunlardan bahsedilmektedir.
Başlatma, sökme ve çok yaygın bir gezinme mantığı parçasını TorDriver
adlı bir sınıfa soyutladım. Tor Tarayıcı Başlatıcısı ile Firefox profili kuran oldukça basit bir sınıftır. Sayfada bir öğenin görünür olup olmadığını kontrol etmek için bir yöntemi ve proxy soketinin çalışır durumda olduğunu doğrulayan başka bir yöntemi vardır. Firefox profil kurulumu ve hata ayıklama büyük ölçüde Stack Overflow tartışmasıyla sağlandı: Tor Tarayıcıyı Selenium ile açın .
Tamamlanan dosyayı burada bulabilirsiniz: tor-driver-python/torDriver.py
Kurulum ve WebDriver bileşenleri için selenyum, pprint, alt işlem ve soketin içe aktarılması.
Aşağıdaki yöntem, bir öğenin kontrolünü soyutlar ve bir zaman aşımı içinde görünürse True
veya False
döndürür.
Proxy bağlantı noktasının kendisine sinyal göndermeden önce etkin olması gerekir. Yığın Taşması'ndaki Python'da Soket Bağlantılarını Test Etmeye ilişkin bazı örnekleri takip ederek şunu buldum:
Modülün büyük bir kısmı, Firefox profilini kontrol eden, gekodriver'ı indiren ve torbrowser-launcher'ı başlatan bir sınıftır.
Burada temel bir konfigürasyona ve bazı şeyleri geçersiz kılmanın bazı yollarına sahibim, ancak bunu çoğunlukla mümkün olduğunca basit tutuyorum:
Proxy bağlantı noktasına bağlanmak için Firefox profilinin en azından yapılandırılması gerekiyor, onunla birlikte javascript'i de devre dışı bırakmıştım.
Bu, bir sürücüyü başlatmak için TorDriver'ın profilini ve ikili dosyasını kullanır
Bir alt süreçte gekodriver'ı indirmek ve çıkarmak için bir yöntem ekleme. Bir şekilde kapsayıcıda çalıştırıldığında tar.gz
dosyasının artık sıkıştırılmadığını ve yalnızca arşivden çıkarılması gerektiğini belirtmekte fayda var. Hata hakkında daha fazla bilgiyi burada bulabilirsiniz: stdin: gzip biçiminde değil hatası
Soket yanıt verene kadar proxy bağlantı noktasına bağlanmayı yeniden deneyin:
Bu örnekte aşağıdaki yaklaşımı iki aşamalı yaklaşımı aldım. İlk aşama bilgi toplama, sonraki aşama ise bilginin işlenmesidir. Bu şekilde tüm süreç boyunca ağ bağlantısına bağlı kalmıyorum ve kaynak malzemeye geri dönmeden sonuçları gerektiği kadar ayrıştırmayı yeniden deneyebiliyorum.
Dosyanın tamamını burada bulabilirsiniz: tor-driver-python/crawler.py
Tarayıcı bir metin dosyasını okur ve bu bilgiyi WebDriver oturumunda sorguları doldurmak için kullanır. Taramanın durumu, sorgu başına bir tane olmak üzere json dosyalarından oluşan bir klasörde tutulur. Bilgileri bir kez dışa aktarmak için kesinlikle gerekli olan minimum işlemi yapmaya çalışıyorum ve daha sonraki işlemler, sitelere geri dönmek yerine mevcut verilerde gerçekleşebilir.
Aramaları depolamak için bir metin dosyası kullanıyorum. Yeniden yapılandırılması çok kolay olduğu için bir metin dosyası seçtim. Metni düzenlemek, yeni bilgilerle tarama başlatmak veya kısmen başarısız olan bir taramayı sürdürmek için düşük bir engeldir. Bu tarayıcının daha karmaşık veri gereksinimleri olsaydı bunun yerine Veritabanı kullanmayı düşünürdüm. Bu, raporlama amacıyla taramaları özel bir kullanıcı arayüzüyle kontrol etmek için bir API uygulanmasına olanak tanıyacak.
Örnek dosyalar depodaki sonuçlar klasöründe zaten bulunmaktadır: tor-driver-python/results
Daha sağlam bir tarayıcıda gerçek bir veritabanı teknolojisinin kullanılmasını öneririm. Bu, veri toplamanın nerede durduğunu kolayca anlamak ve yeniden başlatmayı kolaylaştırmak için yeterlidir.
Tarayıcı, aşağıdaki komutlarla kapsayıcıdan çalıştırılabilir. Rapor oluşturucu, JSON dosyalarının mevcut olmasını gerektirir; örnek dışa aktarma CSV dosyasını burada bulabilirsiniz:
Konteyneri başlatın:
docker run -it --rm -p 5901:5901 -v "${HOME}/src":/src excitingtheory/kalilinux-xvfb:torbrowser
Kapta bir VNC Sunucusu başlatın, oturum şifrelerini isteyecektir:
/opt/start-vnc-server-once.sh
Taramayı VNC oturumunun içinden başlatın:
python3 crawler.py
Tarayıcı Tor Tarayıcının başlatılmasını bekleyecektir ve ne yazık ki bu manuel bir adımdır. Onay kutusunu tıklamanız ve bağlan'ı tıklamanız yeterlidir. Örnek için video demosuna bakın.
Rapor komut dosyası, Virgülle Ayrılmış Değer (CSV) dosyası oluşturacaktır.
Tarayıcının tarama boyunca kaydettiği JavaScript Nesne Gösterimi (JSON) sonuç dosyaları. CSV formatını seçtim çünkü bu, iş arkadaşlarıyla paylaşmak için daha yaygın bir format olmasına rağmen daha fazla analiz için diğer araçlara aktarılması yine de kolaydır.
Dosyanın tamamı burada bulunabilir: tor-driver-python/report.py
Bu, JSON'u okumak, CSV yazmak ve biçimlendirme ve veri sunumu için URL'leri ayrıştırmak için yerleşik Python kitaplıklarını kullanır. Daha sonra sonuçlar arasında geçiş yapar ve veri işlemeye başlamak için bunları yükler.
Bu, rapor oluşturucunun temel işlevidir. Bu, sonuç nesnelerinde yakalanan verilerin son sunumunu ve sıralamasını yapar. Tipik olarak URL'ler, tarayıcıların bir sitedeki işlevsel hareketleri için faydalıdır ve son veri yakalama olarak kullanılmaz, ancak daha fazla veri çıkarımını özelleştirmek için iyi bir başlangıçtır.
Taramanın sonuçları ./results
dizinine JSON dosyaları olarak kaydedilir. Verilerden bir rapor oluşturmak için aşağıdaki betiği kullanacağım.
python3 report.py
Örnek bir CSV çıktı dosyasını burada bulabilirsiniz: tor-driver-python/output.csv
Bot etkinliğini tespit etmenin ve azaltmanın birkaç farklı yolu vardır. Öncelikle işin Veri Merkezi tarafına odaklanacağım, ancak aynı zamanda bazı müşteri tarafı tespit yöntemlerini de tartışacağım. İstemci tarafı sinyalleri her an değişebileceğinden ve yanıltılabileceğinden, istemciye hiçbir zaman gerçekten güvenilemez. Bir tespit sistemi tasarlarken bunu akılda tutmanın önemli olduğunu düşünüyorum. Veri Merkezinde tartışacağım iki koruma biçimi vardır: hız sınırlama ve itibar engelleme.
İstemci tarafında aktif bir WebDriver oturumunu yalnızca javascript ile tespit etmenin birkaç yolu vardır: Github'daki ilgili bir sorun daha ayrıntılı olarak ele alınacaktır . Temel olarak, WebDriver protokolü belgeyi ve pencere nesnelerini değiştirdiğinden, istemci tarafı kodunda tespit edilebilir.
En çok deneyime sahip olduğum çözümlere, Fastly, AWS WAF ve Nginx'e odaklanacağım. CloudFlare tam bir sürprizdi, bu yüzden onların tekliflerinden de bahsedeceğim.
AWS Web Uygulaması Güvenlik Duvarı (WAF) Hızına Dayalı Kurallar, Hizmet Reddi etkinlik düzeylerini engellemek için de kullanılabilir ve Tor ağ trafiğini tespit etmek için de kullanılabilecek varsayılan kurallar vardır; daha fazla bilgi için IP İtibar Kuralı Belgelerine bakın. Diğer bir yaygın yaklaşım ise diğer veri merkezlerinden gelen tüm trafiği engellemektir; hedef kitle Tüketiciler ise bu güvenlidir. Ancak İşletmeler, bunu meşru trafiğe zararlı hale getirebilecek bulut VPN ve diğer teknolojileri kullanıyor olabilir.
Çok popüler bir çözüm olan Fastly'nin Signal Science'ı, özellikle Tor trafiğini tespit etmek için kullanılabilir. Öncelikle DDOS saldırılarına karşı koruma sağlayabilirler; daha fazla bilgi için DDOS Azaltma sayfalarına bakın. İkincisi, Tor trafiğini tespit edip engelleyebilirler. İşte bunu kapsayan Sistem Sinyallerini Kullanma belgeleri.
Nginx için de bunu yapmaya ilişkin bazı makaleler vardır: Nginx ile veya web uygulamanızın içinde anonim trafik nasıl engellenir ? Temel olarak, Tor çıkış düğümleri hakkında bilgi almak için API'lere çağrı yapılarak, IP engelleme kuralları belirli bir programa göre oluşturulabilir ve Nginx'e uygulanabilir.
Yukarıdaki bulut sağlayıcılarının aksine şaşırtıcı bir şekilde CloudFlare, Tor istemcileri için destek sunuyor. Tor Destek Belgelerine rastladım!? burada ağdan Tor kullanıcılarına içerik sunma yeteneğini tartışıyorlar. Bunun gerçekten ilginç bir yaklaşım olduğunu düşünüyorum ve gelecekte bunu daha fazla keşfetmeye can atıyorum.
WebDriver test için güçlü bir araçtır ve aynı zamanda bir API'ye erişimin mümkün olmadığı yerlerde bilgi toplamak için de kullanılabilir. Örneğin: erişim başka şekilde kısıtlanmıştır, sansürlenmiştir, çok pahalıdır veya genel olarak rekabete aykırı uygulamaların arkasında kilitlenmiştir. Daha da iyisi, web taramasından toplanan verileri API'lerden toplanan bilgilerle birleştirmektir.
Bu önemli bir uygulamadır çünkü Botlardan gelen kötü amaçlı trafiği önlemek giderek daha zor hale gelmektedir ve bunun nasıl azaltılacağını düşünmek için bir saldırının gerçekleşmesini beklemek iyi bir güvenlik uygulaması değildir. Bilginin çevrimiçi ortama aktarılmasından sorumlu olan herkesin, ihlal edilen bilgilerin sorumlu oldukları sistemlere karşı nasıl kullanılacağını bilmesi gerektiğine inanıyorum. Basitleştirilmiş bir senaryoda, etik kısıtlamalarla bunu aşağıdakileri yaparak gösterdim: