THT DUYURU

chat
Golang Google’a ait insan diline en yakın olan dillerdendir, projelerin ve dökümanların paylaşım alanıdır

ugursuz reklam
takipci
Seçenekler

Go ile Port Scanner

Codx - ait Kullanıcı Resmi (Avatar)
Green Team
Üyelik tarihi:
07/2017
Mesajlar:
294
Konular:
32
Ticaret:
(0) %
10
581
3 Hafta önce
#1
Merhabalar, iyi forumlar herkese.

Geçtiğimiz günlerde nmap ile bir IP adresi üzerinde hangi portlar ile haberleşebiliyorum diye kontrol etmek durumunda kaldım. Bunu,

Kod:
nmap -p- <IP_ADDRESS>
şeklinde yaptım ve yaklaşık bir 10 dk kadar bekledim. Bildiğiniz üzere bu tarz tarama tooları bir miktar bekletiyor. Bunun sebebi tabi arkaplanda çok işlem dönmesi.

Bende dedim ki bunu ihtiyacım olduğu zaman hızlandırmam lazım. Bende oturup port scanning tool'u yazdım. Kendim için yaptım. Paylaşma sebebim birilerinin de bundan istifade etmesi.

Concurrency kullanarak 65535 tane portu örnek bir hedef olarak scanme.nmap.org'u tarıyorum. 3 saniyeden daha kısa sürüyor.

Başlayalım...

Öncesinde nasıl bağlandığımızı kontrol ederiz bunu öğrenelim. Bağlanmak için net kütüphanesini kullanacağız. net paketinin dökümanına https://godoc.org/net buradan ulaşabilirsiniz.

Şimdi net.Dial() fonksiyonu ile bağlantı yapmaya çalışacağız. Eğer bağlanamazsa bize error dönecek bu yüzden error yoksa bağlantı sağlanmıştır. Şimdi uygulayalım.



Ben bunu çalıştırdığımda Ekrana Success! diye gayet güzel bir şekilde çıktımızı basıyor, çünkü ben nmap.org'un scanme subdomainine 80 portundan erişebiliyorum.

Şimdi nasıl bağlandığımızı gördük ama sadece hardcoded olarak verdiğimiz port'a bağlandık, fakat sadece 80 portuna bağlandık şimdi düz mantık for döngüsü içine alalım i. değerdeki porta bağlanmaya çalışalım. Connection'ı test edebilmek için ise bir üstteki örnekte olduğu gibi error dönüp dönmemesini kontrol ediyorum. İşimiz bittiğinde ise connection açık kalmasın diye conn.Close() yazarak bağlantıyı kapatacağım.



Şimdi çalıştırıp 1 - 1000 aralığındaki portları tarayalım.



Total time 59 saniye ve ben işlemin tamamlanmasını beklemeden iptal ettim. (Terminalimin böyle gözükmesinin sebebi vimden çıkmadan command mode'da ":!time go run fast-scan.go" yazarak scripti vimden çıkmadan çalıştırdığım içindir.)

Şimdiye kadar basit bir şekilde bağlantı sağladık for ile dönüp tek tek kontrol edebildiğimizi öğrendik asıl işlem bu noktadan sonra başlıyor. Şimdi bunu hızlandırmaya başlayalım.

Go dilinde goroutines işlemi var. Bundan istifade ederek işlemimizi hızlandıracağız. Şu şekilde,



Biz burada şu işlemi yaptık, bir anonim function oluşturduk j adında bir parametre aldırdık bu aldırdığımız parametreye i'nin değerini gönderdik. error dönerse bağlantı olmadığı mantığıyla çalıştığımız için error döndüğünde return edip döngünün o anki dönüşünden sonrakine geçmesini sağladık. Çalıştıralım,



Ekrana hiç bir şey basmadı, çünkü işlem çok hızlı gerçekleşti. Execution time'a bakınca 0,329 yazıyor. Ben istek gönderdim ama dönen istekleri yakalayana kadar connection kapandı bu yüzden bişey yakalayamadı. Bunu snyc paketinden WaitGroup kullanarak düzeltebiliriz.

İlk önce Add(1) yapıp WaitGroup sayacını bir arttıracağız. Sonra Done() ile sayacı bir eksilteceğiz. Wait() ile içerideki sayacın 0'a gelmesini bekletiyor olacağız. Bunları kullanma sebebimiz ise bağlantıların tamamlanmasını beklemesini istiyor olmamız. Aksi halde işlem tamamlanmadan connection kapanıyordu. Şimdi bunları ekleyelim,



Şimdi resimdeki kodu açıklayalım. for her döndüğünde WaitGroup'a 1 ekleyecek, anonim function içerisinde defer ile func'ın tüm işlemi bittiğinde en son WaitGroup'u 1 eksiltecek. for, en son döndüğünde tekrar dönmeyeceği zaman ve işlem bitiminde WaitGroup sayacı 0 olacağından Wait() fonksiyonu WaitGroup sayacını 0 olarak görüp işlemi bitirecek.

Şimdi çalıştırdığım zaman total time 1,721 olarak 1 - 1000 aralığındaki portları kontrol etti.



Bağlantı kurulabilecek 65535 adet port olduğunu düşünecek olursak içeride hardcoded olarak verdiğimiz 1000 yerine 65535 yazmamız gerekecek. Bu sefer sonuç 4 saniyeye çıkıyor. Şimdi işleri biraz daha hızlandıralım.

Şimdi şöyle bir örnek yapalım. chan kullanıcaz her goroutine işleminde chan'dan okuyacak birisi diğerini beklemeden çalışacak. Bu yüzden sırasız bir şekilde çalışacak. Birisinin işleminin bitmesini beklemeden diğeri işlemini yapıyor olacak.



Çıktısı ile birlikte alabilmek için vscode üzerinde ss aldım. Ben burada şunu yaptım. worker adında bir fonksion oluşturdum ports adında bir chan alıyor ve WaitGroup'un pointer'ını alıyor. WaitGroup sayacından bir düşüp işlemini bitiriyor.

main fonksiyonuna gelecek olursam eğer, wg adında WaitGroup tanımlıyorum. ports adında bir chan make ediyorum ve kapasitesini 100 olarak belirtiyorum. Bu şu demek oluyor aynı anda 100 goroutine bu channel'dan okuma yapabilecek ve bunun için diğer routine'ın işleminin bitmesini beklemeyecek. Paralel olarak çalışmasını hedefliyoruz.

Birinci for döngüsünde ports'un kapasitesi kadar dönüp bu döngünün her adımında worker'ı çağırıp ports'un o anki değerinden okuma yapıyorum, ve her seferinde WaitGroup sayacının bir eksilmesine ihtiyaç duyduğum, (goroutine süratini dengelemek amacıyla) wg.Wait() özelliğini kullanmak durumunda kalacağım için bu işlemi de worker içerisinde yapıyorum.

Port sayısı ekleme işlemimi ise ikinci for döngüsünde yapıyorum. Bu döngü içinde de sayacı her eklemede bir arttırıyorum. Bu sayede işlemlerimiz dengelenmiş oluyor. Son olarak close(ports) diyerek channel'ı kapatıyorum.

Buraya kadar tamamız. Devam edip bunları tarama yaptığımız script içerisine de koyarsak, sonuçlar ekrana basılırken yine sırasız olarak gelecektir, çünkü bunun kontrolünü sağlamadık.

Eğer bu sıralamayı yapmak istersek ayrı bir thread kullanmamız gerekecektir. Bunun yerine int tipinde bir array oluşturup sonuçları ona ekleyebilir en son sort edip ekrana bastıra biliriz de. Ben kolaya kaçıp ikinci yolu tercih ediyorum.



Scripti peşpeşe çalıştırıp 3 saniyeyi geçmeyen sonuçlar çıktığını görebiliyoruz.



Not: İçeride hardcoded olarak verdiğimiz "scanme.nmap.org:%d" kısmındaki domaini değiştirerek farklı hedefler için de kullanabilirsiniz.

main.go dosyasını https://github.com/0xCodx/Port-Scanner-Go burada paylaştım.

Anlatacaklarım bu kadardı. Ben yaparken çok keyif aldım. Umarım faydalı olmuştur. Okuduğunuz için teşekkür eder, iyi forumlar dilerim.
---------------------
Başarılarının toplamısın, başarızlıklarından arta kalanlar değil.



Konu Codx tarafından ( 3 Hafta önce Saat 01:30 ) değiştirilmiştir.
SeNZeRo - ait Kullanıcı Resmi (Avatar)
Green Team Lideri
Üyelik tarihi:
09/2016
Mesajlar:
5.105
Konular:
484
Teşekkür (Etti):
111
Teşekkür (Aldı):
1793
Ticaret:
(0) %
3 Hafta önce
#2
Eline, emeğine sağlık.
Codx Teşekkür etti.
tnziel - ait Kullanıcı Resmi (Avatar)
İstihbarat Tim (Stajyer)
Üyelik tarihi:
01/2020
Mesajlar:
556
Konular:
74
Teşekkür (Etti):
348
Teşekkür (Aldı):
468
Ticaret:
(0) %
3 Hafta önce
#3
Ellerine sağlık, çok güzel bir konu
---------------------
RЯЮNИ

tnziel
Ⱨ₳₵₭ĐɆⱤ₮ - ait Kullanıcı Resmi (Avatar)
Uzman Üye
Üyelik tarihi:
04/2019
Nereden:
Samsun
Mesajlar:
1.574
Konular:
50
Teşekkür (Etti):
718
Teşekkür (Aldı):
426
Ticaret:
(0) %
3 Hafta önce
#4
Elinize,emeğinize sağlık hocam :|
"aqua - ait Kullanıcı Resmi (Avatar)
Hunter
Üyelik tarihi:
08/2019
Nereden:
867619
Mesajlar:
666
Konular:
97
Teşekkür (Etti):
1514
Teşekkür (Aldı):
496
Ticaret:
(0) %
3 Hafta önce
#5
Sağlam konu, eline sağlık.
Par4d0x1D - ait Kullanıcı Resmi (Avatar)
Katılımcı Üye
Üyelik tarihi:
02/2012
Nereden:
hasan
Yaş:
19
Mesajlar:
590
Konular:
40
Teşekkür (Etti):
99
Teşekkür (Aldı):
793
Ticaret:
(0) %
3 Hafta önce
#6
nmapʼe uygun argümanları vermemiş, varsayılan ayarlar ile çalışmasına ses etmemiş iseniz hızlı çalışmasını beklemeniz hatalı: https://www.turkhackteam.org/9171197-post12.html concurrency kullanımınızı sakat buldum, hızlı çalışmasının sebebi de bu gördüğüm kadarıyla, zira aldığınız sonucun da doğru olduğunu zannetmiyorum. dokümanlara baksanız iyi olacak gibi. emeğinize sağlık, kolay gelsin.
Profesör - ait Kullanıcı Resmi (Avatar)
Uzman Üye
Üyelik tarihi:
04/2020
Nereden:
-Türkistan-
Mesajlar:
1.716
Konular:
181
Teşekkür (Etti):
555
Teşekkür (Aldı):
582
Ticaret:
(0) %
3 Hafta önce
#7
Eline sağlık abi
---------------------



SELAM SANA
EY YILLARI HEBA OLAN GENÇ!



BH80
Reiɴα
Rey


baysiberbela - ait Kullanıcı Resmi (Avatar)
Junior Green Team
Üyelik tarihi:
05/2018
Mesajlar:
855
Konular:
137
Teşekkür (Etti):
160
Teşekkür (Aldı):
163
Ticaret:
(0) %
3 Hafta önce
#8
Elinize sağlık hocam
SiyahYunus - ait Kullanıcı Resmi (Avatar)
İstihbarat Tim (Stajyer)
Üyelik tarihi:
01/2020
Mesajlar:
580
Konular:
20
Teşekkür (Etti):
171
Teşekkür (Aldı):
222
Ticaret:
(0) %
3 Hafta önce
#9
Elinize sağlık
---------------------
Arkamda gözlerim var gibi
Medusa üstümde parlıyo', yok geri
SiyahYunus / 2020
PourLa - ait Kullanıcı Resmi (Avatar)
Green Team (Kıdemli)
Üyelik tarihi:
03/2016
Nereden:
Mesajlar:
1.617
Konular:
302
Teşekkür (Etti):
587
Teşekkür (Aldı):
630
Ticaret:
(0) %
3 Hafta önce
#10
Ellerin dert görmesin
---------------------
PourLa
Html/Css > Python > C ve C++
( }-----{ TÜRK HACK TEAM }-----{ )
Twitter | Telegram | İnstagram

Bookmarks


« Önceki Konu | Sonraki Konu »
Seçenekler