17 Ocak 2010 Pazar

Banla 1

Merhabalar yaklaşık bir ay önce python programlama diline başladım, PHP bilen biri için python öğrenmek çok basit zaten temelde programlamanın mantığını bildiğiniz zaman geriye sadece öğreneceğiniz dilin yazım kuralları kalıyor.Bir arkadaşımın isteği üzerine python'da bir script yazdım ve dağıtmaya karar verdim.
Script'in görevi nedir diye soracak olursanız.Sunucuya bağlı olan ip adreslerini ve bu ip adreslerinin kaç bağlantı açtığını gösteriyor ve sizin limitlendirdiğiniz bağlantı sayısını aşan ip adreslerini iptables ile banlıyor.
Script nasıl çalışıyor?
Örneklerle anlatacak olursak komut satırına python banla.py 120 yazarak scripti çalıştırırsak 120 den fazla bağlantı açan ip adreslerini banlayabiliriz.
Eğerki sadece python banla.py yazarsak scriptimiz _limit_=int(100) satırında bulunan 100 değerini kullanacaktır yani 100 den fazla bağlantı açanları banlayacaktır.
Script ip adresini banlarken neler yapıyor?
Öncelikle python banla.py 150 gibi bir istekte bulunduk.
Script 150 den fazla bağlantı açan ip adreslerini buldu daha sonra bunları banlayacak ama öncelikle bir kaç evreden geçmesi gerekecek.
1.Evre : Scriptimiz öncelikle ip.txt dosyasına bakacaktır banlanacak ip adresi ip.txt dosyasında kayıtlımı diye eğer ip.txt dosyasında kayıtlı ise banlamayacaktır fakat kayıtlı değil ise ikinci evreye geçecektir.(banlanmasını istemediğiniz ip adreslerini ip.txt dosyasına alt alta yazabilirsiniz.Çünkü kimse arama motorlarını banlamak istemez herhalde :))
2.Evre : İkinci Evre nedir diye soracak olursanız ikinci evrede yine arama motorları ile ilgili , scriptimiz ip adresinin nereye ait olduğunu sorgulayacak
bunu nasıl yapıyor diye soracak olursanız bu adres size yardımcı olacaktır.Ben size yinede basit bir şekilde anlatayım Linux sunuculardaki host komutu ile örnek bir çıktı.

kral@kral:~/Masaüstü/python$ host 66.249.66.1
1.66.249.66.in-addr.arpa domain name pointer crawl-66-249-66-1.googlebot.com.

en son nerede kalmıştık host komutu ile ip adresinin hostname'mini alıyoruz ve beyazliste'mizde varmı diye bakıyoruz eğerki beyaz listemizde kayıtlı ise scriptimiz ip adresini banlamıyor ve o ip adresini ip.txt dosyasına kaydediyor böylelikle bir dahaki sefere 2. evreye gerek kalmadan ip adresi banlanmayacak eğerki beyazlistedede yoksa 3.evreye geçecek
( Beyaz listeyi beyazliste=["google.com","yahoo.com","bing.com","live.com","msn.com","msn.net"] satırından değiştirebilirsiniz.)
3.Evre :Bu evrede ip adresinin bir zombi olduğuna kanaat getiriyoruz ve ip adresini banlanıyoruz.
Sıra geldi Kodlara:
Kodu Göster & view plainprint?

1. #!/usr/bin/env python
2. # -*- coding: utf-8 -*-
3. import sys
4. import os
5. import urllib
6. import subprocess as sub
7. import cgi
8. import re
9. import random
10.
11. """
12. Kodlama By s4l1h
13. http://pehepe.blogspot.com/
14. Kullanım:
15. python banla.py 100 {Sonuç Olarak 100'den fazla Bağlantı Açanları Banlar }
16. python banla.py { Sonuç Olarak _limit_ Olarak Belirlediğiniz Sayıda Bağlantı Açanları Banlar}
17. _limit_ sayısını aşağıda ayarlar kısmından değiştirebilirsiniz 21 Numaralı Satır.
18. """
19.
20. """ Ayarlar.. Settings.."""
21. _version_="1.0"
22. _limit_=int(100) # Eğer Parametre Belirtilmez ise Buradaki Limit kullanılır.
23. beyazliste=["google.com","yahoo.com","bing.com","live.com","msn.com","msn.net"]
24. #Beyaz Liste sunucuda host 127.1.1.1 Şeklinde Çıkan sonuçta beyaz listedeki isimler varsa banlamaz.. white host name
25. _ip_="ip.txt"# white list iplerin yazılacağı dosya
26. """ Diğer Kodlarla Oynamanıza Gerek yoktur..."""
27.
28. #Botları Denetle
29. def botlar(veri):
30. for i in beyazliste:
31. z=veri.find(i)
32. if z==-1:
33. return False
34. else:
35. return True
36.
37. #Komut Çalıştır.
38. def calistir(komut):
39. str_command = urllib.unquote(komut)
40. p = sub.Popen(['/bin/bash', '-c', str_command],
41. stdout=sub.PIPE, stderr=sub.STDOUT)
42. output = cgi.escape(p.stdout.read())
43. return output
44. #Whois
45. def whoisle(ip):
46. return calistir("host "+ip)
47. #Denetleme
48. def denetle(ip):
49. veri=whoisle(ip)
50. if botlar(veri)==True:
51. return True
52. else:
53. return False
54. def dosyadan(ip):
55. try:
56. dosya=open(_ip_)
57. except:
58. return True # Dosya Oluşmamış Olabilir Ozamanda True Değerini Döndürüyoruz..
59. v=dosya.read()
60. dosya.close()
61. z=v.find(ip)
62. if z!=-1:
63. return True
64. return False
65. #Arama Motoru Botlarını white liste Ekliyoruz..
66. def yaz(ip):
67. try:
68. dosya=open(_ip_,"a")
69. except:
70. print _ip_+' Dosyası Oluşturulamıyor Yada Var Olan Dosya Okunamıyor'
71. sys.exit()
72. v=dosya.read()
73. z=v.find(ip)
74. if z==-1:
75. dosya.write(ip+"\n")
76. dosya.close()
77.
78. #Ve Son Olarak ip Adresini Banlıyoruz..
79. def bankomut(ip):
80. print "Uygulanan Komut: iptables -A INPUT -s "+ip+" -j DROP"
81. return calistir("iptables -A INPUT -s "+ip+" -j DROP")
82.
83.
84. #Banlama İsteği
85. def banla(ip):
86. if dosyadan(ip)==True:
87. print ip+' Adresi Beyaz Listede Olduğu İçin Banlanmadı '
88. elif denetle(ip)==True:
89. print ip+' Adresi Arama Motoru İp adresi Olduğu İçin Banlanmadı'
90. else:
91. print ip+" Adresi Banlandı!"
92. bankomut(ip)
93.
94.
95.
96.
97.
98. #Dosya Yoksa Oluşturuyoruz..
99. if os.path.exists(_ip_):
100. pass
101. else:
102. print _ip_+' Dosyası Oluşturuldu !'
103. f=open(_ip_,"a")
104. f.close()
105.
106. #Ana İşlemler...
107. komut="netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1"
108. veri=calistir(komut)
109. desen="([0-9]{1,6}) ([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})"
110. veriler = re.compile(desen).findall(veri)
111. if veriler == []:
112. print "Hata Oluştu"
113.
114. try:
115. print sys.argv[1]+"'den Fazla Bağlantı Açan İp Adresleri ve Bağlantı Sayıları"
116. mod="filtre"
117. except:
118. print "%s 'den Fazla Bağlantı Açan İp Adresleri Ve Bağlantı Sayıları." %_limit_
119. mod="hepsi"
120.
121. if mod=="hepsi":
122. x=int(0)
123. for i in veriler:
124. sayi=int(i[0])
125. ip=i[1]+'.'+i[2]+'.'+i[3]+'.'+i[4]
126. if sayi>_limit_:
127. print ip+" İp Adresi Toplam:"+i[0]+" Bağlantı Açmış Durumda"
128. banla(ip)
129. x=x+1
130. print "%s 'den Fazla Bağlantı Açan Toplam %d Adet İp Adresi Bulundu." %(_limit_,x)
131. elif mod=="filtre":
132. x=int(0)
133. for i in veriler:
134. ip=i[1]+'.'+i[2]+'.'+i[3]+'.'+i[4]
135. sayi=int(i[0])
136. limit=int(sys.argv[1])
137. if sayi>limit:
138. print "%s İp Adresi Toplam: %d Bağlantı Açmış Durumda" % (ip,sayi)
139. banla(ip)
140. x=x+1
141.
142. if x==0:
143. print "%d'den Fazla Bağlantı Açan İp Adresi Bulunmuyor !" %limit
144. else:
145. print "%d'den Fazla Bağlantı Açan Toplam %d Adet İp Adresi Bulundu." % (limit,x)


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
import urllib
import subprocess as sub
import cgi
import re
import random

"""
Kodlama By s4l1h
http://pehepe.blogspot.com/
Kullanım:
python banla.py 100 {Sonuç Olarak 100'den fazla Bağlantı Açanları Banlar }
python banla.py { Sonuç Olarak _limit_ Olarak Belirlediğiniz Sayıda Bağlantı Açanları Banlar}
_limit_ sayısını aşağıda ayarlar kısmından değiştirebilirsiniz 21 Numaralı Satır.
"""

""" Ayarlar.. Settings.."""
_version_="1.0"
_limit_=int(100) # Eğer Parametre Belirtilmez ise Buradaki Limit kullanılır.
beyazliste=["google.com","yahoo.com","bing.com","live.com","msn.com","msn.net"]
#Beyaz Liste sunucuda host 127.1.1.1 Şeklinde Çıkan sonuçta beyaz listedeki isimler varsa banlamaz.. white host name
_ip_="ip.txt"# white list iplerin yazılacağı dosya
""" Diğer Kodlarla Oynamanıza Gerek yoktur..."""

#Botları Denetle
def botlar(veri):
for i in beyazliste:
z=veri.find(i)
if z==-1:
return False
else:
return True

#Komut Çalıştır.
def calistir(komut):
str_command = urllib.unquote(komut)
p = sub.Popen(['/bin/bash', '-c', str_command],
stdout=sub.PIPE, stderr=sub.STDOUT)
output = cgi.escape(p.stdout.read())
return output
#Whois
def whoisle(ip):
return calistir("host "+ip)
#Denetleme
def denetle(ip):
veri=whoisle(ip)
if botlar(veri)==True:
return True
else:
return False
def dosyadan(ip):
try:
dosya=open(_ip_)
except:
return True # Dosya Oluşmamış Olabilir Ozamanda True Değerini Döndürüyoruz..
v=dosya.read()
dosya.close()
z=v.find(ip)
if z!=-1:
return True
return False
#Arama Motoru Botlarını white liste Ekliyoruz..
def yaz(ip):
try:
dosya=open(_ip_,"a")
except:
print _ip_+' Dosyası Oluşturulamıyor Yada Var Olan Dosya Okunamıyor'
sys.exit()
v=dosya.read()
z=v.find(ip)
if z==-1:
dosya.write(ip+"\n")
dosya.close()

#Ve Son Olarak ip Adresini Banlıyoruz..
def bankomut(ip):
print "Uygulanan Komut: iptables -A INPUT -s "+ip+" -j DROP"
return calistir("iptables -A INPUT -s "+ip+" -j DROP")


#Banlama İsteği
def banla(ip):
if dosyadan(ip)==True:
print ip+' Adresi Beyaz Listede Olduğu İçin Banlanmadı '
elif denetle(ip)==True:
print ip+' Adresi Arama Motoru İp adresi Olduğu İçin Banlanmadı'
else:
print ip+" Adresi Banlandı!"
bankomut(ip)





#Dosya Yoksa Oluşturuyoruz..
if os.path.exists(_ip_):
pass
else:
print _ip_+' Dosyası Oluşturuldu !'
f=open(_ip_,"a")
f.close()

#Ana İşlemler...
komut="netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1"
veri=calistir(komut)
desen="([0-9]{1,6}) ([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})"
veriler = re.compile(desen).findall(veri)
if veriler == []:
print "Hata Oluştu"

try:
print sys.argv[1]+"'den Fazla Bağlantı Açan İp Adresleri ve Bağlantı Sayıları"
mod="filtre"
except:
print "%s 'den Fazla Bağlantı Açan İp Adresleri Ve Bağlantı Sayıları." %_limit_
mod="hepsi"

if mod=="hepsi":
x=int(0)
for i in veriler:
sayi=int(i[0])
ip=i[1]+'.'+i[2]+'.'+i[3]+'.'+i[4]
if sayi>_limit_:
print ip+" İp Adresi Toplam:"+i[0]+" Bağlantı Açmış Durumda"
banla(ip)
x=x+1
print "%s 'den Fazla Bağlantı Açan Toplam %d Adet İp Adresi Bulundu." %(_limit_,x)
elif mod=="filtre":
x=int(0)
for i in veriler:
ip=i[1]+'.'+i[2]+'.'+i[3]+'.'+i[4]
sayi=int(i[0])
limit=int(sys.argv[1])
if sayi>limit:
print "%s İp Adresi Toplam: %d Bağlantı Açmış Durumda" % (ip,sayi)
banla(ip)
x=x+1

if x==0:
print "%d'den Fazla Bağlantı Açan İp Adresi Bulunmuyor !" %limit
else:
print "%d'den Fazla Bağlantı Açan Toplam %d Adet İp Adresi Bulundu." % (limit,x)





Screen Shot:
Komut: python banla.py 1 1 adet bağlantı açanlar listelendi.


Komut: python banla.py 100 adet bağlantı açanlar listelendi.default ayarlarda 100 yazılı olduğu için _limit_=int(100)


Komut: python banla.py 1 1 den fazla bağlantı açanlar listelendi ve banlandı



İlerde eklemeyi düşündüğüm özellik banlanan ip adreslerini mail ile yöneticiye haberdar etme.

Hiç yorum yok:

Yorum Gönder

 

mp3 indirmp3mp3 dinle