Python Forum

Full Version: error in scapy attribute 'haslayer'
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
hello all ...
im trying to write a port scanner using scapy module
my code :
from scapy.all import * 

target = "192.168.1.81"


print("Scanning .... " + target + " For Open Ports!\n")

for x in range(20 , 100):
    packet = IP(dst=target)/TCP(dport=x,flags='S')
    res = sr1(packet ,timeout=0.5)
    if res.haslayer(TCP) and res.getlayer(TCP).flags==0x12:
        print("port" + str(x) + "is open!")
    sr(IP(dst=target)/TCP(dport=res.sport,flags='R'),timeout=0.5)
print("scan is complete")
Output:
Scanning .... 192.168.1.81 For Open Ports! Begin emission: Finished sending 1 packets. ..... Received 5 packets, got 0 answers, remaining 1 packets Traceback (most recent call last): File "/home/evilcode1/Downloads/Course/ping.py", line 11, in <module> if res.haslayer(TCP) and res.getlayer(TCP).flags==0x12: AttributeError: 'NoneType' object has no attribute 'haslayer'
any help please
res doesn't have a .haslayer method, because res is None. So check to make sure it has a value before trying to use it:

    res = sr1(packet ,timeout=0.5)
    if res and res.haslayer(TCP) and res.getlayer(TCP).flags==0x12:
(Jan-27-2021, 05:19 PM)nilamo Wrote: [ -> ]res doesn't have a .haslayer method, because res is None. So check to make sure it has a value before trying to use it:

    res = sr1(packet ,timeout=0.5)
    if res and res.haslayer(TCP) and res.getlayer(TCP).flags==0x12:

thank u its work bro :D
but how i can hide this lines from scapy outputs ?

Output:
Received 1 packets, got 1 answers, remaining 0 packets Port : 21 is open! Begin emission: Finished sending 1 packets. ...... Received 6 packets, got 0 answers, remaining 1 packets Begin emission: Finished sending 1 packets. * Received 1 packets, got 1 answers, remaining 0 packets Port : 22 is open! Begin emission: Finished sending 1 packets.
i need it just to show :
Output:
Port : 22 is open! Port : 21 is open!
https://scapy.readthedocs.io/en/latest/a...ndrecv.sr1

Use the verbose option.
res = sr1(packet ,timeout=0.5, verbose=False)
our generic except masks any errors that your code might encounter. Change pass to raise and remove any specific errors. E.g. the first I encountered with your code was:

socket.error: [Errno 1] Operation not permitted
and after running as root I got:

A
ttributeError: 'list' object has no attribute 'haslayer'
and that made me change the code to something that worked (running as root):

from scapy.all import *

while 1:

    pktl = sniff ( iface="eth0" , count = 1 )
    pktl.summary()

    for pkt in pktl:
        try:
            if pkt.haslayer(IP):
                ipsrc =pkt.getlayer(IP).src
                print ipsrc
        except:
            raise
So you probably better of removing the try - except altogether
(Jan-27-2021, 05:54 PM)nilamo Wrote: [ -> ]https://scapy.readthedocs.io/en/latest/a...ndrecv.sr1

Use the verbose option.
res = sr1(packet ,timeout=0.5, verbose=False)

thank u solved my problem <3