2016-03-25 10 views
3

Мне интересно, есть ли возможность запустить «sniff (...)» Scapy без корневых привилегий.Python Scapy sniff без корня

Используется в приложении, где фиксируются определенные пакеты. Но я не хочу запускать все приложение с правами root или изменять что-либо на scapy себя.

Заранее благодарен!

EDIT:

Для тестирования я использую следующий код:

from scapy.all import * 

def arp_monitor_callback(pkt): 
    if ARP in pkt and pkt[ARP].op in (1,2): #who-has or is-at 
     return pkt.sprintf("%ARP.hwsrc% %ARP.psrc%") 

sniff(prn=arp_monitor_callback, filter="arp", store=0) 

Я только смог запустить его с помощью Sudo.

Я попытался установить возможности с помощью sudo setcap 'cap_net_admin=+eip' test.py. Но это не показывает никаких эффектов. Даже способность all не помогает.

+0

sniff() необходимо установить беспорядочный режим, поэтому для запуска вашей программы должно быть достаточно CAP_NET_ADMIN (см. Возможности человека (7)) –

+0

sorry , но я не очень хорошо разбираюсь в возможностях: должен ли я установить их на свой скрипт, на scapy lib или даже где-нибудь еще? – maascht

+0

Вы можете установить возможности сценария с помощью setcap (8) как root, если вы хотите, чтобы обычные пользователи использовали программу без повышения привилегий (пример [здесь] (https://wiki.archlinux.org/index.php/Capabilities)). –

ответ

4

Вам необходимо установить возможности для бинарных файлов запуска вашего сценария, а именно: питон и ТСРйитр, если вы хотите, чтобы иметь возможность просто выполнить сценарий как ./test.py:

setcap cap_net_raw=eip /usr/bin/pythonX.X 
setcap cap_net_raw=eip /usr/bin/tcpdump 

Где XX является версия питона, используемой для запуска сценарий.

(обратите внимание, что путь может отличаться от вашей системы)

Пожалуйста, обратите внимание, что это позволит любому открыть сырые сокеты в системе.

0

Хотя решение, предоставляемое @Jeff, технически корректно, поскольку для возможности файла напрямую использовать двоичные файлы в/usr/bin, у него есть недостаток, позволяющий любому в системе открывать сырые сокеты.

Другой способ достижения желаемого результата - скрипт, выполняющийся только с CAP_NET_RAW, - использовать внешние возможности. Это можно сделать, используя небольшой вспомогательный двоичный файл, который устанавливает внешние возможности и exec() в интерпретатор python. Для справки см. this gist.

Использование эталонной реализации, при условии, что, что соответствующие возможности файлов присваиваются ./ambient:

$ sudo setcap 'cap_net_raw=p' ambient 

ваш скрипт будет запущен, как:

$ ./ambient -c '13' /usr/bin/python ./test.py 

Пожалуйста, обратите внимание, что:

  • 13 - целочисленное значение CAP_NET_RAW согласно capability.h
  • возможности окружающей среды доступны, начиная с ядра 4.3
  • вы можете использовать pscap, чтобы проверить, если процесс был запущен с требуемыми возможностями в эффективном наборе

Почему этот метод работает?

Окружающие возможности сохраняются через вызовы exec(), которые передаются во все последующие созданные подпроцессы, и поднимаются в их эффективном наборе, например. интерпретатор python, вызываемый двоичным или tcpdump, вызванным скриптом python. Это, конечно, упрощение, для полного описания переходов между наборами возможностей см. capabilities(7)