Python: индекс списка вне допустимого диапазона
Пытаюсь провести сканирование сервера, путем отправления на него SYN-пакетов. Но при запуске получаю довольно известную ошибку:
Traceback (most recent call last):
File "Synscaner.py", line 19, in <module>
ip = sys.argv[1]
IndexError: list index out of rang
Появляется она при неизвестных обстоятельствах, так как код я проверил и грубых ошибок не нашел. Пытался заменить эту строчку поставив в нее реальные адреса. Но итог по прежнему тот же. Код самой программы описан ниже со всеми комментариями. Заранее спасибо за решение проблемы.
from scapy.layers.inet import ICMP, IP, TCP, sr1
import sys
def icmp_probe(ip): # Здесь производится проверка на наличие сервера в сети.
icmp_packet = IP(dst=ip) / ICMP()
resp_packet = sr1(icmp_packet, timeout=10) # Отправка и прием одного пакета
return resp_packet != None
def syn_scan(ip, port): # В данном месте проводится сканирование путем отправки пакетов.
syn_packet = IP(dst=ip) / TCP(dport=port, flags="S")
resp_packet = sr1(syn_packet, timeout=10)
if resp_packet.getlayer('TCP').flags == 0x12 and resp_packet !=None: # Проверка на флаги SYN/ACK
print(f"Port open: {ip}:{port}")
if __name__ == "__main__":
ip = sys.argv[1]
port = sys.argv[2]
if icmp_probe(ip):
syn_ack_packet = syn_scan(ip, port)
syn_ack_packet.show()
else:
print("ICMP Probe Failed")
Ответы (1 шт):
Корень этой проблемы заключался в неправильной адресации цели для которой выполнялось сканирования. Чтобы исправить ситуацию следует указать реальный IP адрес в виде переменной типа string и также создать массив, в котором будут храниться порты для сканирования. На деле готовый и рабочий код выглядит следующим образом.
from scapy.layers.inet import ICMP, IP, TCP, sr1
def icmp_probe(ip): # Здесь производится проверка на наличие сервера в сети
icmp_packet = IP(dst=ip) / ICMP()
resp_packet = sr1(icmp_packet, timeout=10) # Отправка и прием одного пакета
return resp_packet is not None
def syn_scan(ip, ports): # В данном месте проводится сканирование путем отправки пакетов
for port in ports: # Проходимся по каждому порту и отправляем TCP пакет
syn_packet = IP(dst=ip) / TCP(dport=port, flags="S")
resp_packet = sr1(syn_packet, timeout=10)
if resp_packet is not None:
if resp_packet.getlayer('TCP').flags == 0x12:
print(f"{ip}:{port} is open")
if __name__ == "__main__":
ip = "127.0.0.1" # Задаем цель сканирования
ports = [20, 21, 22, 23, 25, 43, 53, 80, # Обозначаем порты для сканирования
115, 123, 143, 161, 179, 443, 445,
514, 515, 993, 995, 1080, 1194,
1433, 1723, 3128, 3268, 3306, 3389,
5432, 5060, 5900, 8080, 10000]
try: # Перехватываем исключения в момент, когда заканчивается кортеж (наш список портов)
if icmp_probe(ip):
syn_ack_packet = syn_scan(ip, ports)
syn_ack_packet.show()
else:
print("ICMP Probe Failed")
except AttributeError:
print("Scan completed!")