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

ВНИМАНИЕ!!!! АВТОР ДАННОЙ СТАТЬИ НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ДЕЙСТВИЯ ОТ ЕЕ ПРОЧТЕНИЯ. ВСЕ МАТЕРИАЛЫ ПРЕДОСТАВЛЕНЫ В ИСКЛЮЧИТЕЛЬНО ОБРАЗОВАТЕЛЬНЫХ ЦЕЛЯХ!
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()
Теперь попробуем что у нас вышло:
