Пишем сканер портов на Python

Spread the love

ВНИМАНИЕ!!!! АВТОР ДАННОЙ СТАТЬИ НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ДЕЙСТВИЯ ОТ ЕЕ ПРОЧТЕНИЯ. ВСЕ МАТЕРИАЛЫ ПРЕДОСТАВЛЕНЫ В ИСКЛЮЧИТЕЛЬНО ОБРАЗОВАТЕЛЬНЫХ ЦЕЛЯХ!

Cканер портов — софт, разработанный для поиска хостов сети, в которых открыты нужные порты. Эти программы обычно используются системными администраторами для проверки безопасности их сетей и злоумышленниками для взлома сети.

Пожалуй, самым популярным сканером портов является nmap. И многие предпочитают пользоваться им.

Но я решил сделать такой пост по программированию, чтобы показать Вам принцип работы сканеров, ведь чтобы в полной мере пользоваться чем-либо, надо понимать как оно утроено внутри. Писать будем на Python, потому что этот язык понятен даже тем, кто только вникает в программирование. Поехали:

#подключаем модули

import optparse

from socket import *

from threading import *

#define для корректной работы потоков

screenLock = Semaphore(value=1)

#функция получает на вход хост и порт

def connScan(tgtHost, tgtPort):

   try:

               #используем сокеты для подключения к порту, который указал юзер

      connSkt = socket(AF_INET, SOCK_STREAM)

      connSkt.connect((tgtHost, tgtPort))

      connSkt.send(‘hello\r\n’)      

               #получаем ответ

      results = connSkt.recv(100)

      screenLock.acquire()

               #если ответ получен значит порт открыт

      print «[+] » + str(tgtPort) + «/tcp open»

   except:

               #иначе, при ошибке, выводим обратное

      screenLock.acquire()

      print «[-] » + str(tgtPort) + «/tcp closed»

   finally:

               #закрываем сокет

      screenLock.release()

      connSkt.close()

def portScan(tgtHost, tgtPorts):

   try:

               #получаем хост по имени

      tgtIP = gethostbyname(tgtHost)

   except:

               #при ошибке выводим что хост не найден

      print «[-] Cannot resolve » + tgtHost + «: Unknown host»

      return

   try:

               #получем хост по адресу и выводим информацию

      tgtName = gethostbyaddr(tgtIP)

      print «\n[+] Scan Results for: » + tgtName[0]

   except:

      print «\n[+] Scan results for: » + tgtIP

       #запускаем потоки для сканирования

   setdefaulttimeout(1)

   for tgtPort in tgtPorts:

      t = Thread(target=connScan, args=(tgtHost, int(tgtPort)))

      t.start()

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[s] seperated by comma’)

   (options, args) = parser.parse_args()

   if (options.tgtHost == None) | (options.tgtPort == None):

      print parser.usage

      exit(0)

   else:

     #получаем порты

      tgtHost = options.tgtHost

      tgtPorts = str(options.tgtPort).split(‘,’)

       #старт сканирования

   portScan(tgtHost, tgtPorts)

#точка входа

if __name__ == ‘__main__’:

   Main()

Теперь попробуем что у нас вышло:

Добавить комментарий

WP2Social Auto Publish Powered By : XYZScripts.com