Construindo um portscanner TCP com Python

Implementação de um portscanner básico em Python a fim de compreender um pouco o funcionamento de ferramentas como NMAP e sockets TCP.

[ Hits: 12.412 ]

Por: Perfil removido em 05/11/2018


Código completo



import sys
import socket

def main():
	args = sys.argv
	if len(args) < 2:
		print("[!]Falta argumentos para o programa! Saindo...")
		sys.exit(1)
	ip = args[1]
	portas = args[2] if len(args) >= 3 else "1:65536"
	portas = (x for x in range(int(portas.split(":")[0]), int(portas.split(":")[1])+1))
	scan(ip, portas)

def banner(sckt, ip, porta):
	try:
		sckt.settimeout(1)
		sckt.connect((ip, porta))
		banner = sckt.recv(1024).decode().strip()
		assert banner
		return banner
	except:
		return "Unknown"

def child(ip, port):
	try:
		s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) 
		s.settimeout(0.3)
		if s.connect_ex((ip, port)) == 0:
			print("{}/tcp open".format(port), end="|")
			print(banner(s, ip, port))
	except:
		pass

def scan(ip, portas):
	for c in portas:
		child(ip, c)

if __name__ == '__main__':
	main()

Download: portscan.py

Implementando Threads

Threads podem acabar acelerando o processo de scan, após ter importado o módulo threading, basta alterar a função scan dessa forma:

def scan(ip, portas):
	for c in portas:
		t = Thread(target=child, args=(ip, c))
		t.start()

Simples assim!

Indo Além

Ensinado o básico há muitas formas de expandir as funcionalidades do programa e aprender coisas novas, para aqueles interessados recomendo o estudo dos seguintes tópicos:
  • Módulo argparse para passagem de argumentos.
  • Sockets UDP(SOCK_DGRAM)
  • Módulo scapy

Espero que tenha aprendido com esse artigo, até a próxima.

Página anterior    

Páginas do artigo
   1. Introdução
   2. Código completo
Outros artigos deste autor

Apache 2.2 - Introdução ao módulo mod_rewrite

Segurança para leigos

Recuperando senhas de e-mails esquecidas usadas no Claws-Mail

FreeBSD Release 10.0 - Introdução ao sistema

XFree86 - Um pouco da história deste poderoso ambiente gráfico para UNIX

Leitura recomendada

Programe em Python no jogo Minecraft com seu filho ou sozinho

Clicador automático de Tinder com Python

Como baixar vídeos do Facebook via terminal

Scikit Learn: Projetando o futuro de suas APIs e aplicativos usando machine learning

Introdução ao clib (Command Line Book)

  
Comentários
[1] Comentário enviado por fabiocabrini em 20/03/2020 - 10:35h

Artigo muito bom!

Habilitei o multithreading e ficou bem rápido, foi necessário alterar o timeout da função child para 10ms.
Segue o código:

import sys
import socket
from threading import *

def main():
args = sys.argv
if len(args) < 2:
print("[!]Falta argumentos para o programa! Saindo...")
sys.exit(1)
ip = args[1]
portas = args[2] if len(args) >= 3 else "1:65536"
portas = (x for x in range(int(portas.split(":")[0]), int(portas.split(":")[1])+1))
scan(ip, portas)

def banner(sckt, ip, porta):
try:
sckt.settimeout(1)
sckt.connect((ip, porta))
banner = sckt.recv(1024).decode().strip()
assert banner
return banner
except:
return "Unknown"

def child(ip, port):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
s.settimeout(10)
if s.connect_ex((ip, port)) == 0:
print("{}/tcp open".format(port), end="|")
print(banner(s, ip, port))
except:
pass

def scan(ip, portas):
for c in portas:
t = Thread(target=child, args=(ip, c))
t.start()

if __name__ == '__main__':
main()


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts