scapy: операция не разрешена при отправке пакетов

Я пытаюсь немного научиться генерировать пакеты с помощью scapy. Это выглядит довольно круто. Следуя некоторой документации, я делаю это:

l3=IP(dst="192.168.0.1", src="192.168.0.2", tos=(46 << 2))

Но только для того, чтобы получить сообщение об ошибке:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/scapy/sendrecv.py", line 251, in send
    __gen_send(conf.L3socket(*args, **kargs), x, inter=inter, loop=loop, count=count,verbose=verbose, realtime=realtime)
  File "/usr/lib/python2.7/dist-packages/scapy/arch/linux.py", line 307, in __init__
    self.ins = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(type))
  File "/usr/lib/python2.7/socket.py", line 187, in __init__
    _sock = _realsocket(family, type, proto)
error: [Errno 1] Operation not permitted

Запуск scapy от имени root решил проблему. Но это не то, чего я хотел. Это потому, что обычный пользователь не может создать сокет RAW? Если да, то есть ли решение?


person lang2    schedule 15.03.2014    source источник


Ответы (4)


Scapy нужны привилегии root для создания необработанных сокетов, потому что он использует библиотеку сокетов Python. Необработанные сокеты разрешено использовать только «с эффективным идентификатором пользователя 0 или возможностью CAP_NET_RAW» в соответствии с справочными страницами Linux.

Я не могу найти то, что выглядит надежной документацией по настройке возможности CAP_NET_RAW, но если вы ищете обходной путь для запуска сценариев Scapy, которые используют необработанные сокеты без root, это то, что вам нужно сделать.

person RyPeck    schedule 15.03.2014
comment
Дайте мне знать, если вы успешно сделаете это, используя возможность CAP_NET_RAW. - person RyPeck; 15.03.2014

Чтобы запустить Scapy только с правами cap_net_raw...

Самый безопасный и менее сложный способ, который я знаю, заключается в следующем:

  1. Сделайте личную копию двоичного файла python:

    $ sudo cp /usr/bin/python2.7 ~/python_netraw

  2. Владеть им:

    $ судо чаун your user name ~/python_netraw

  3. Не позволяйте никому запускать его:

    $ chmod -x,u+x ~/python_netraw

  4. Дайте ему возможность cap_net_raw:

    $ sudo setcap cap_net_raw=eip/usr/bin/python_netraw

  5. Запустите с ним scapy:

    $ ~/python_netraw -O /usr/bin/scapy

(Или используйте sudo каждый раз, когда вам нужно запустить Scapy с необработанными привилегиями.)

person gatopeich    schedule 25.06.2014

Чтобы запустить временную среду Python (например, для scapy) с помощью cap_net_raw, я обнаружил, что это работает:

sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_net_raw+eip" --keep=1 --user="$USER" --addamb="cap_net_raw" -- -c /usr/bin/python3

взято из Arch Wiki

person Mark Finn    schedule 13.04.2021

Грязный подход, возможно, небезопасный: напрямую дайте возможность CAP_NET_RAW Python:

sudo setcap cap_net_raw=eip $(readlink -f $(which python))
person tropappar    schedule 21.05.2021
comment
Спасибо за ваш ответ, но другие ответы также предлагают установить CAP_NET_RAW. - person Michael Kotzjan; 21.05.2021
comment
Да, это правда. Но я предлагаю сделать это для глобального исполняемого файла. Однако это дает каждому пользовательскому сценарию возможность создавать необработанные сокеты. - person tropappar; 22.05.2021
comment
Кроме того: общие библиотеки больше нельзя включать напрямую, потому что LD_LIBRARY_PATH отключается. См. stackoverflow.com/questions/9843178/ - person tropappar; 22.05.2021