الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشروع سكربت فحص منافذ السرفر Port Scanner

رائج
بدأه عامر الشابي في 2 مارس 2014 · 61 رد · 2,774 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

 

سنقوم بي برمجة أول مشروع بسيط موجه لمدراء السرفرات وهو سكربت يقوم بفحص منافذ السرفر (Ports),في

 

بداية المشروع سنقوم بعملية تخطيط للمشروع وبالتالي سنركز على مهام السكربت وما الذي سيقوم بفعله.

 

1- السكربت سيقوم بفحص منافذ السرفر وهنا سنعمل على برتوكول TCP وبالتالي نحن بحاجة إلى إتصال بالهدف

 

سوف نعتمد على مكتبة Socket في البايثون

 

2- السكربت سيأخذ مدخلات من المستخدم سنعتمد على مكتبة optparse لفعل هذه المهمة

 

3- سيتعامل السكربت مع عدة أخطاء وكل خطأ سيطبع لنا جملة معينة وينتهي عمل البرنامج أو يعيد تشغيله سوف

 

نعمل على Try and exception لإنجاز ذلك

 

4- وكخاصية جميلة للسكربت سيطبع في بداية زمن بداية الفحص وعند إنتهاء البرنامج سيطبع زمن نهاية الفحص

 

سنعتمد على مكتبة Time

 

المكتبات التي سنحتاجها:Socket;sys;optparse;Time

 

هذا كل ما سنحتاج إليه حاليا لبرمجة هذا السكربت

 

وقبل بداية أرجوا إلقاء نظرة داخل هذه المواضيع Python Basic;optparse;Socket

 

وكبداية مني

#-------------------------------------------------------------------------------
# Name:        PortScan
# Version:     1.0 Beta
# Copyright:   arabteam2000-Python section
#-------------------------------------------------------------------------------
import optparse
import time
import sys
import socket
def scanTg(tgthost, tgtport):
    try:
        connect = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

بالإنتــــــــــظار التفاعـــــلات , , , , , ,

تم تعديل هذه المشاركة بواسطة عامر الشابي في 2 مارس 2014 في 00:22

Untitled-18.jpg

#2

أحب الدروس على شكل مشاريع سأحاول التتبع مع العلم أني لست مبرمج بثون

 

هل سيكون هذا المشروع متطور حيث يمكن تخطي بعض الحمايات

#3

إن شاء الله . . .

Untitled-18.jpg

#4

#-------------------------------------------------------------------------------

# Name: PortScan

# Version: 1.0 Beta

# Copyright: arabteam2000-Python section

#-------------------------------------------------------------------------------

import optparse

import time

import sys

import socket

def scanTg(tgthost, tgtport):

connect = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:

con = connect.connect((tgthost, tgtport))

print("port : open {0} {1}".format(' '*5, tgtport))

except socket.error:

pass

connect.close()

IP = socket.gethostbyname(raw_input("website : "))

ports = 1024

print("")

try:

for port in range(ports):

scanTg(IP, port)

except KeyboardInterrupt:

print("")

exit(0)

#5
the.scorpion كتب:
#-------------------------------------------------------------------------------
# Name:        PortScan
# Version:     1.0 Beta
# Copyright:   arabteam2000-Python section
#-------------------------------------------------------------------------------
import optparse
import time
import sys
import socket
def scanTg(tgthost, tgtport):
	connect = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	try:
		con = connect.connect((tgthost, tgtport))
		print("port : open {0} {1}".format(' '*5, tgtport))
	except socket.error:
		pass
	connect.close()

IP = socket.gethostbyname(raw_input("website : "))
ports = 1024
print("")
try:
	for port in range(ports):
		scanTg(IP, port)
except KeyboardInterrupt:
	print("")
	exit(0)

 

حسنا مقبولة

لكن لكي نمشي خطوة بخطوة دعنا اولا نبرمج دالة الاولة ومن ثم نذهب إلى الدالة الثانية إلى أن نصل إلى آخر

 

خطوة لتشغيل السكر

 

سأعيد صياغة الكود الخاص بك على هذا الشكل لكي يكون نهائي ويمكن أن تضيف اي إضافات إن كنت تريد ذلك مع

 

مشاركتها هنا

 
EkvGQ.png
 
(آسف عندي مشكلة في الجهاز لهذا لم استطيع الكتابة في المحرر)
 

الآن يمكنكم برمجة دالة ثانية وهي الدالة التي ستقوم بي معاينة options المدخلة من المستخدم كمعرفة الهوست نايم

 

او اي بي ادريسس وتعامل مع أخطاء عديدة من بينها إن لم يتم التعرف على الهوست او لم يستطع السكربت الإتصال

 

بالهدف

 

بإنتظار تفاعلاتكم جميعا

تم تعديل هذه المشاركة بواسطة عامر الشابي في 2 مارس 2014 في 15:09

Untitled-18.jpg

#6

بعض التغييرات في الكود

#-------------------------------------------------------------------------------
# Name:        PortScan
# Version:     1.0 Beta
# Copyright:   arabteam2000-Python section
#-------------------------------------------------------------------------------
import socket
import optparse
import sys
import time
def ScanTg(tgthost, tgtport):
    try:
        connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        connection.connect((tgthost, tgtport))
        return "[+]%d/tcp open" %tgtport
        connection.close()
    except:
        return "[-]%d/tcp closed" %tgtport

Untitled-18.jpg

#7

تعديل بسيط من اجل البورتات المفلتره

#-------------------------------------------------------------------------------
# Name:        PortScan
# Version:     1.0 Beta
# Copyright:   arabteam2000-Python section
#-------------------------------------------------------------------------------
import socket
import optparse
import sys
import time
def ScanTg(tgthost, tgtport):
    try:
        connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        connection.settimeout(15)
        connection.connect((tgthost, tgtport))
        return "[+]%d/tcp open" %tgtport
        connection.close()
    except socket.timeout:
	 return "[+]%d/tcp filtered" %tgtport
    except:
        return "[-]%d/tcp closed" %tgtport
#8
اقتباس

 

الآن يمكنكم برمجة دالة ثانية وهي الدالة التي ستقوم بي معاينة options المدخلة من المستخدم كمعرفة الهوست نايم

 

او اي بي ادريسس وتعامل مع أخطاء عديدة من بينها إن لم يتم التعرف على الهوست او لم يستطع السكربت الإتصال

 

بالهدف

 

ما عندي اي فكره ..لم اتعامل معها قبلا

#9

طبق هذه الأوامر على IDE 

socket.gethostbyname("host")

socket.gethostname()

socket.gaierror

socket.error

قم بتجريبها وتعمد فعل الخطأ لكي ترى رسالة الخطأ

 

وستستنج ماذا سيكون في الدالة الثانية

Untitled-18.jpg

#10

انا اقصد معالجة options الممررة في سطر الاوامر

مثال..

example.py -v
#11

الأوامر الممررة في سطر الأوامر تكون في الدالة main() وفي ذلك سنستعمل المكتبة optparse وستحتوي على ثلاث خصائص فقط وهي -H

 

الخاص بالهوست و -p الخاص بالبورت و -help خاص بالإرشاد

 

هذه الدالة هي الدالة الأخيرة دعنا منها الآن

 

أنا أتكلم على الدالة الثانية التي ستستقبل من المستخدم host name وتحوله إلى ip adrasse وتتعامل مع عدة أخطاء

def scanop(tgthost, tgtport):    pass

هل تريد البداية؟

 

أفضل قم بالتفكير وكون الدالة بنفسك

Untitled-18.jpg

#12

كبداية

def scanop(tgthost, tgtport):
	try:
		IP = socket.gethostbyname(tgthost)
	except socket.error :
		print("ERROR hostname")

لكن ما حاجتنا للبورت في هذه الدالة

تم تعديل هذه المشاركة بواسطة the.scorpion في 3 مارس 2014 في 13:05

#13

def scanop(tgthost, tgtport):

try:

IP = socket.gethostbyname(tgthost)

ScanTg(IP , tgtport)

except socket.error :

print("ERROR hostname")

#14

جيد هذا كل ما سنحتاج إليه حاليا في هذه الدالة كبداية فقط للمشروع (في تطوير سنضيف عدة أسطر للقيام بعدة مهام)

 

سأعيد صياغته بهذه الصيغة

def scanop(tgthost, tgtport):
	try:
		IP = socket.gethostbyname(tgthost)
		return ScanTg(IP , tgtport)
	except socket.error :
		return "Couldn't connect to server"

ما حاجتك في البورت في هذه الدالة؟

 

حسنا قم بحذف البورت من الدالة عندك فقط ودعنا نكمل الآن في برمجة الدالة main() التي سنستخدم فيها مكتبة optparse من أجل إستقبال الآوامر من المستخدم

 

يرجى زيارة هذا الموضوع 

Untitled-18.jpg

#15

استفسار خارج الموضوع ما الفرق بين print و return و متى تستعمل كل منهما؟؟؟

 

وساقوم بالاطلاع على الموضوع ومحاولة كتابة الدالة main()

تم تعديل هذه المشاركة بواسطة the.scorpion في 4 مارس 2014 في 00:39

#16

def main():

parser = optparse.OptionParser()

parser.add_option("-H", "--HOST", action="store", dest="host")

parser.add_option("-p", "--port", action="store", dest="port")

option, args = parser.parse_args()

#17

def main():

parser = optparse.OptionParser()

parser.add_option("-H", "--HOST", action="store", dest="host")

parser.add_option("-p", "--port", action="store", dest="port")

option, args = parser.parse_args()

host=option.host

port=int(option.port)

scanop(host, port)

#18

الدالة main() كما قلنا ستستقبل الهوست والبورت من المستخدم انت أعطيت للهوست إسم host في dest والبوت بـport

 

ونحن في دالة الاولة  أعطينا 2 argument هما tgthost و tgtport إذا فإنا في dest يجب وضع نفس argument

 

الدالة الأولة ولا مشكلة في الصيغة الكود التي كتبتها أنت

def main():
    parser = optparse.OptionParser("usage%prog "+\
    "-H <target host> -p <target port>")
    parser.add_option('-H', dest='tgthost', type='string', \
    help='specify target host')
    parser.add_option('-p', dest='tgtport', type='string', \
    help='specify target port')
    (options, args) = parser.parse_args()
    tgthost = options.tgthost
    tgtport = options.tgtport
    if (tgthost == None) | (tgtport == None):
        print '[-] You must specify a target host and port.'
        exit()
    scanop(tgthost, tgtport)

ومع تعديل الكود النهائي للسكربت نحصل على التالي:

#-------------------------------------------------------------------------------
# Name:        PortScan
# Version:     1.0 Beta
# Copyright:   arabteam2000-Python section
#-------------------------------------------------------------------------------
import socket
import optparse
import sys
def ScanTg(tgthost, tgtport):
    try:
        connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        connection.connect((tgthost, tgtport))
        print "[+]%s/tcp open" %tgtport
        connection.close()
    except:
        print "[-]%s/tcp closed" %tgtport
def scanop(tgthost, tgtport):
	try:
		IP = socket.gethostbyname(tgthost)
		ScanTg(IP , tgtport)
	except socket.error:
		print "Couldn't connect to server"
def main():
    parser = optparse.OptionParser("usage%prog "+\
    "-H <target host> -p <target port>")
    parser.add_option('-H', dest='tgthost', type='string', \
    help='specify target host')
    parser.add_option('-p', dest='tgtport', type='string', \
    help='specify target port')
    (options, args) = parser.parse_args()
    tgthost = options.tgthost
    tgtport = options.tgtport
    if (tgthost == None) | (tgtport == None):
        print '[-] You must specify a target host and port.'
        exit()
    scanop(tgthost, tgtport)
if __name__ == '__main__':
    main()

أي إشكال الآن في الكود أو سؤال عن أي شيء يمكنكم طرحه

تم تعديل هذه المشاركة بواسطة عامر الشابي في 6 مارس 2014 في 00:41

Untitled-18.jpg

#19

يجب ان يكون البورتinteger

 

سررت بالعمل معك

#20

مزال السكربت قيد التطوير

 

هل تعلم لماذا تعمدت أن أدع البورت string؟

 

إبحث عن الإجابة إلى ان نصل إليها فما بعد

 

التطوير الآن سيشمل ما يلي:

 

1- سنقوم بتعديل على الدالة الأولة وهي الدالة ScanTg() لتستقبل من الهوست إسم الخدمة البورت الذي تم فحصه

 

2- وفي الدالة main() سنطلب من المستخدم أن يضع عدة بورتات للفحص لن نجبره على أن يفحص بالبورت الواحد ومقابل

 

كل بورت الخدمة التي يعمل عليها

 

السكربت يدخل في الإصدار Version:1.1 :)

تم تعديل هذه المشاركة بواسطة عامر الشابي في 6 مارس 2014 في 14:52

Untitled-18.jpg

#21
اقتباس

 

1- سنقوم بتعديل على الدالة الأولة وهي الدالة ScanTg() لتستقبل من الهوست إسم الخدمة البورت الذي تم فحصه

 

هل تعتمد الفكره على انشاء ملف يحتوي على البورتات واسماء الخدمات

#22
the.scorpion كتب:

هل تعتمد الفكره على انشاء ملف يحتوي على البورتات واسماء الخدمات

 

تخيل لو قمت بذلك ووضعت البورت مثل 21 خاص بخدمة FTP يعمل على برنامج بإصدار معين والهوست الذي قمت بفحصه يعمل على إصدار آخر ؟

 

هنا إذا الفكرة لن تعمل

 

خمن في حل آخر

Untitled-18.jpg

#23

ما رأيك ؟؟؟

def ScanTg(tgthost, tgtport):
	try:
		connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		connection.settimeout(15)
		connection.connect((tgthost, tgtport))
		print "[+]%d/tcp open %s" %(tgtport, socket.getservbyport(tgtport))
		connection.close()
	except socket.timeout: 
		print "[+]%d/tcp filtered" %tgtport
	except:
		print "[-]%d/tcp closed" %tgtport
#24

لماذا أجريت العملية connection.settimeout(15) قبل أن تتصل بالهوست من المفترض أن تجريها بعد أن يتم الإتصال يا صديقي

 

وبالنسبة للإضافة socket.getservbyport التي أضفتها كنت متوقع أنك ستفكر فيها فأنا كنت اريد منك أن تفعل خطوة أخرى ولكن معليش

 

سندع الأمور هكذا إلى بعد حين :)

 

لقد قمت بإضافة تعديل بسيط على الدالة الثانية

def scanop(tgthost, tgtport):
    try:
	    IP = socket.gethostbyname(tgthost)
    except:
        "[-] Cannot resolve"
    try:
        print "Please wait, scanning remote host %s" %IP
        ScanTg(IP , tgtport)
    except socket.gaierror:
        print "Hostname could not be resolved. Exiting"

الخطوة الثانية خلي السكربت يستقبل من المستخدم عدة بورتات وليس سوى بورت واحد

 

جل ما ستفعله فقط هو تغييرات في هذه الاسطر

tgtport = options.tgtport
    if (tgthost == None) | (tgtport == None):

تم تعديل هذه المشاركة بواسطة عامر الشابي في 8 مارس 2014 في 01:23

Untitled-18.jpg

#25

port = [options.tgtport]+args

    if (tgthost != None) and (port != None):

        for tgtport in port:

            scanop(tgthost, tgtport)

    else:

        print '[-] You must specify a target host and port.'

        exit()

تم تعديل هذه المشاركة بواسطة the.scorpion في 8 مارس 2014 في 02:33

مواضيع مشابهة