2013-04-29 38 views
6

Tôi sẽ cố gắng để chứng minh vấn đề của tôi với một ví dụ đơn giản.Scapy không sniff gói khi sử dụng nhiều chủ đề

Sau đây là một rất đơn giản (đơn ren) packet sniffer (ICMP):

from scapy.all import * 

m_iface = "wlan0" 
m_dst = "192.168.0.1" 

def print_summary(pkt): 
    print pkt.summary() 

def plain_sniff(): 
    sniff(iface = m_iface, count = 10, filter = "icmp and src {0}".format(m_dst), prn = print_summary) 

sniffer này chỉ hoạt động tốt và tôi nhận được kết quả:

WARNING: No route found for IPv6 destination :: (no default route?) 
Ether/IP/ICMP 192.168.0.1 > 192.168.0.9 echo-reply 0/Raw 
Ether/IP/ICMP 192.168.0.1 > 192.168.0.9 echo-reply 0/Raw 
Ether/IP/ICMP 192.168.0.1 > 192.168.0.9 echo-reply 0/Raw 
... 

Tiếp theo, tôi tạo ra một riêng biệt thread cho sniffing packet và sử dụng một Queue để truyền đạt các gói đã capture giữa thread sniffer và thread chính:

from threading import Thread 
from Queue import Queue, Empty 
from scapy.all import * 

m_iface = "wlan0" 
m_finished = False 
m_dst = "192.168.0.1" 

def print_summary(pkt): 
    print pkt.summary() 

def threaded_sniff_target(q): 
    global m_finished 
    sniff(iface = m_iface, count = 10, filter = "icmp and src {0}".format(m_dst), prn = lambda x : q.put(x)) 
    m_finished = True 

def threaded_sniff(): 
    q = Queue() 
    sniffer = Thread(target = threaded_sniff_target, args = (q,)) 
    sniffer.daemon = True 
    sniffer.start() 
    while (not m_finished): 
    try: 
     pkt = q.get(timeout = 1) 
     print_summary(pkt) 
    except Empty: 
     pass 

Sniffer này cũng hoạt động tốt và tôi nhận được cùng một đầu ra như trên. Tuy nhiên, khi tôi sửa đổi các chủ đề chính chỉ là một chút để nó sử dụng các chức năng send() giữa đọc từ hàng đợi gói như sau:

def threaded_sniff_with_send(): 
    q = Queue() 
    sniffer = Thread(target = threaded_sniff_target, args = (q,)) 
    sniffer.daemon = True 
    sniffer.start() 
    while (not m_finished): 
    send(IP(dst = m_dst)/ICMP()) # Here 
    try: 
     pkt = q.get(timeout = 1) 
     print_summary(pkt) 
    except Empty: 
     pass 

Sau đó, tôi nhận được những điều sau đây sản lượng kỳ lạ (bộ lọc không dường như công việc):

WARNING: No route found for IPv6 destination :: (no default route?) 
Sent 1 packets. 
Ether/ARP who has 192.168.0.1 says 192.168.0.9 
Sent 1 packets. 
Ether/ARP is at a0:21:b7:1a:7a:db says 192.168.0.1 
Sent 1 packets. 
Ether/IP/ICMP 192.168.0.9 > 192.168.0.1 echo-request 0 
Sent 1 packets. 
Ether/IP/ICMP 192.168.0.1 > 192.168.0.9 echo-reply 0 
... 

Kịch bản cho ba người đánh hơi có thể được tải xuống từ here.

cấu hình hệ thống hiện tại của tôi là như sau:

Python: 2.7.3 
Scapy: 2.2.0 
OS: Fedora 18 

Điều thú vị là tất cả các ba sniffers hoạt động tốt trên máy tính cũ của tôi:

Python: 2.6.4 
Scapy: 2.0.0.10 (beta) 
OS: Fedora 13 

Trước tiên tôi nghĩ rằng nó có thể là phiên bản Scapy/Python . Nhưng ngay cả khi tôi cài đặt chính xác các phiên bản tương tự trên máy tính mới của tôi, hành vi vẫn tồn tại.

Tôi không hoàn toàn chắc chắn nếu đây là câu hỏi phù hợp với SO (có thể là một báo cáo lỗi cho Scapy?). Xin lỗi cho tôi trong trường hợp đó.

+0

Trông giống như một lỗi đã biết: http://trac.secdev.org/scapy/ticket/747 –

+0

@ChathurangaChandrasekara: Vấn đề tôi gặp phải liên quan đến đa luồng. Mã hoạt động tốt mà không cần luồng. –

+0

@AsiriRathnayake Điều này không xảy ra để có một cái gì đó để làm với thực tế là giao diện mạng kết thúc trong "chế độ Premiscious" và rằng chỉ có một nguồn có thể liên kết với giao diện đó? Nếu không, bạn đã thử sử dụng thư viện trăn 'threading' thay vì xếp hàng chưa? Tôi không chắc chắn toàn bộ hệ thống xếp hàng hoạt động thế nào nhưng với 'luồng' bạn sẽ có được quyền kiểm soát nhiều hơn về những gì khi ít nhất, và bạn có thể tinker xung quanh một chút. – Torxed

Trả lời

6

Lý do chính cho điều này rất có thể là do khóa tài nguyên. Chức năng sniff() của Scapy có thể phải khóa nguồn tài nguyên mạng cấp thấp để có thể đọc các gói dữ liệu.

Trì hoãn hai luồng (sau khi bắt đầu chuỗi chủ đề sniffer), bạn sẽ đảm bảo rằng Scapy sẽ nhận được thời gian cần thiết.

Để xem cách chúng tôi đi đến kết luận này, hãy xem phần thảo luận ở trên trong phần nhận xét. Gl Asiri Rathnayake :)

+0

Cảm ơn bạn đã xem xét điều này. Điều này giải quyết vấn đề ban đầu của tôi quá (đó là một kịch bản giao tiếp phức tạp hơn). Có lẽ một vấn đề an toàn thread trong nội bộ của Scapy, hy vọng một người nào đó từ Scapy sẽ đi qua bài đăng này :) –

+1

Yw. Nếu tôi nhận được thời gian cho nó, tôi sẽ gửi một lưu ý đến một danh sách gửi thư và ai đó hy vọng sẽ lưu ý điều này :) – Torxed