Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AsyncSniffer cannot handle interface linktype when change linktype in code #4589

Open
m8k7j opened this issue Nov 14, 2024 · 0 comments
Open

Comments

@m8k7j
Copy link

m8k7j commented Nov 14, 2024

Brief description

AsyncSniffer will call resolve_iface to get linktype, but resolve_iface only take effect at init python program start, so if change link type in code, resolve_iface cannot recognize the linktype realtime, suggest add conf.ifaces.reload() at the beginning of resolve_iface function:

def resolve_iface(dev, retry=True):
    # type: (_GlobInterfaceType, bool) -> NetworkInterface
    """
    Resolve an interface name into the interface
    """
    conf.ifaces.reload()
    if isinstance(dev, NetworkInterface):
        return dev
    try:
        return conf.ifaces.dev_from_name(dev)
    except ValueError:
        try:
            return conf.ifaces.dev_from_networkname(dev)
        except ValueError:
            pass
    if not retry:
        raise ValueError("Interface '%s' not found !" % dev)
    # Nothing found yet. Reload to detect if it was added recently
    conf.ifaces.reload()
    return resolve_iface(dev, retry=False)

Scapy version

2.6.0

Python version

3.11

Operating system

ubuntu 20.04

Additional environment information

No response

How to reproduce

from scapy.sendrecv import AsyncSniffer
import time
import subprocess

def set_link_type(mode_type):
subprocess.Popen(['sudo', 'ifconfig', 'wlan0', 'down'])
print('sudo ifconfig wlan0 down')
time.sleep(1)
if mode_type == 'managed':
subprocess.Popen(['sudo', 'iwconfig', 'wlan0', 'mode', 'managed'])
print('sudo iwconfig wlan0 mode managed')
time.sleep(1)
elif mode_type == 'monitor':
subprocess.Popen(['sudo', 'iwconfig', 'wlan0', 'mode', 'monitor'])
print('sudo iwconfig wlan0 mode monitor')
time.sleep(1)
subprocess.Popen(['sudo', 'ifconfig', 'wlan0', 'up'])
print('sudo ifconfig wlan0 up')
time.sleep(2)

def capture():
sniffer = AsyncSniffer(iface='wlan0', filter='wlan type mgt subtype deauth')
sniffer.start()
time.sleep(1)
sniffer.stop()

set_link_type('monitor')
print('link type match filter')
capture()
set_link_type('managed')
print('link type not match filter')
capture()

execute the script twice will tirgger issue

Actual result

Traceback (most recent call last):
File "/home/dinghuan/.pyenv/pyenv-1.2.19/versions/3.11.1/lib/python3.11/site-packages/scapy/sendrecv.py", line 1400, in stop
self.stop_cb()
^^^^^^^^^^^^
AttributeError: 'AsyncSniffer' object has no attribute 'stop_cb'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/dinghuan/myscript/scapy/debug_stop_cb.py", line 32, in
capture()
File "/home/dinghuan/myscript/scapy/debug_stop_cb.py", line 27, in capture
sniffer.stop()
File "/home/dinghuan/.pyenv/pyenv-1.2.19/versions/3.11.1/lib/python3.11/site-packages/scapy/sendrecv.py", line 1402, in stop
raise Scapy_Exception(
scapy.error.Scapy_Exception: Unsupported (offline or unsupported socket)

Expected result

can get right linktype after code change the linktype

Related resources

No response

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant