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.845 ]

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

Datagramas IP (Protocolo Internet)

1º Fórum da Internet no Brasil

Executando sua aplicação Kylix fora do Kylix

Turck MMcache completo e sem mistérios

FwLogWatch - Analisando Registros do IPtables

Leitura recomendada

Como baixar fotos e vídeos do Instagram com Python

rwd - Restart When Down

Esteganografia e Esteganálise: transmissão e detecção de informações ocultas em imagens digitais

Alimentando Desktopcouch com Zeitgeist

Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado

  
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