Để xây dựng chương trình sniffer, chúng ta có các lựa chọn chính: Chặn bắt ở mức ứng dụng, mức hệ điều hành và mức network adapter.
3.1 Raw Socket – mức hệ điều hành
Socket là một phương pháp để thiết lập kết nối truyền thông giữa một chương trình yêu cầu dịch vụ ( client) và một chương trình cung cấp dịch vụ (server) trên mạng LAN, WAN hay Internet và đôi lúc là giữa những quá trình ngay bên trong máy tính. Mỗi socket có thể được xem như một điểm cuối trong một kết nối. Một socket trên máy yêu cầu dịch vụ có địa chỉ mạng được cấp sẵn để “gọi” một socket trên máy cung cấp dịch vụ. Một khi socket đã được thiết lập phù hợp, hai máy tính có thể trao đổi dịch vụ và dữ liệu.
Các đặc tính của Socket bao gồm:
• Giao thức (TDP, UDP hay raw IP).
• Số hiệu cổng.
• Địa chỉ IP.
Phân loại: Có vài loại Socket thông dụng như:
• Datagram Socket hay còn gọi là connectionless socket sử dụng UDP.
• Stream Socket hay còn gọi là connection – oriented socket sử dụng TCP.
• Raw Socket (hay là Raw IP Socket). Với socket dạng này tầng giao vận được bỏ qua và ứng dụng có thể truy nhập trực tiếp vào dữ liệu của gói tin IP.
Tóm lại, sử dụng Socket ta có thể chặn bắt và truy nhập các thông tin từ tầng giao vận trở lên (TCP và UDP) và có thể truy nhập tới tầng Internet ( IP) nếu sử dụng raw socket. Tuy nhiên hiện nay trên hệ điều hành window chỉ có thư viện winsock dành cho Visual C++ và Socket trong .Net hỗ trợ raw socket. Thư viện lập trình mạng của Java không cho phép người phát triển được sử dụng tới raw socket.
Raw socket là một socket cho phép truy nhập trực tiếp tới header của một packet. Nói một cách khác, raw socket là một cách bỏ qua toàn bộ network stack và đưa packet tới thẳng tầng ứng dụng. Raw socket có thể thực hiện một trong hai tác vụ:
Packet Sniffing: nhận các packet từ raw socket. Packet Injection: gửi các packet tới raw socket.
Raw socket không nằm ở tầng ngôn ngữ lập trình mà là một phần networking API của hệ điều hành. Sử dụng raw socket chúng ta có thể lấy về header của packet khác với socket thông thường chỉ lấy về payload của packet. Raw socket được sử dụng trong transport layer và network layer.
Khi Window XP được phát hành năm 2001, raw socket được cài đặt trong thư viện Winsock, tuy nhiên Microsoft tuyên bố raw socket chỉ được hacket dùng trong việc thực hiện TCP reset attacks. Do vậy sau 3 năm sau trong bản hotfix, Mircrosoft đã hạn chế hỗ trợ raw socket trong winsock cũng như không hỗ trợ cho ứng dụng nào sử dụng chúng nữa.
3.2 Pcap – mức network adapter
Pcap (packet capture) bao gồm những giao diện lập trình ứng dụng (API) dùng để chặn bắt network traffic. Đối với các hệ thống thuộc họ Unix ta có thư viện libpcap, còn đối với Window ta có thư viện được port từ libpcap là winpcap. Pcap thường có hai thành phần cơ bản:
• Driver: packet capture driver không thể được viết bằng các ngôn ngữ bậc cao mà thường viết bằng C hoặc assembly. Hai driver được sử dụng rộng rãi nhất hiện nay là driver thương mại nằm trong PCAUSA và driver miễn phí nằm trong Windump package.
• Interface: là giao diện thực hiện packet capture.
Libpcap và Winpcap được sử dụng từ link layer trở lên. Chúng cung cấp cơ chế pack- et capture và packet filter, có thể lưu trữ packet thu được vào file hay đọc file đó... Ngoài ra chúng còn cho phép tạo các custom packet và injection chúng trên mạng. Rất nhiều ứng dụng đã sử dụng libpcap hay winpcap vào các mục đích khác nhau như packet sniffer, network monitor, network tester hay network intrusion detection system...
Tuy nhiên nhược điểm của việc sử dụng các thư viện này là chúng chỉ có thể sử dụng để chặn bắt gói tin mà không thể block một địa chỉ hay một cổng hay một tiến trình truy nhập mạng như socket.
API của libpcap và winpcap được viết bằng C hoặc C++ nên để có thể xây dựng ứng dụng bằng các ngôn ngữ khác như .NET, Java ta cần có wrapper.
Danh sách các wrapper để sử dụng libpcap/winpcap với ngôn ngữ khác C/C++:
• Net::Pcap, a Perl wrapper for pcap
• python-libpcap, a Python wrapper for pcap
• pcapy, another Python wrapper for pcap
• PacketFu, a Ruby wrapper for pcap
• tclpcap, a Tcl wrapper for pcap
• jpcap, a Java wrapper for pcap
• jNetPcap, another Java wrapper for pcap
• WinPcapNET, SharpPcap, Pcap.Net, .NET wrappers for WinPcap
• pcap, Haskell bindings for pcap
• mlpcap, Objective Caml bindings for pcap
• pcap, Chicken Scheme wrapper for pcap
3.3 So sánh Raw Socket và Pcap
Raw socket và pcap đều có thể được sử dụng để viết chương trình sniffer. Tuy nhiên socket chỉ có thể làm việc từ tầng thứ 4 trong mô hình OSI trở lên (transport layer trong TCP/IP) và raw socket có thể làm việc được với tầng thứ 3 trong mô hình OSI trở lên (network layer trong TCP/IP) còn pcap có thể làm việc với tầng thứ 2 trở lên trong mô hình OSI (link layer trong TCP/IP) (nguồn). Ngoài ra raw socket trên win- dow đã không còn được Microsoft hỗ trợ cũng như tính năng bị giới hạn như:
• Dữ liệu TCP không thể được gửi qua raw socket.
• UDP datagram với địa chỉ nguồn không hợp lệ sẽ không thể gửi qua raw sock- et.
Do vậy, nếu sử dụng Socket để đo đạc toàn bộ lưu lượng thông tin vào/ra một hệ thống hay một trạm thì sẽ dẫn tới kết quả có thể không chính xác do nó chỉ có thể chặn bắt một số loại packet nhất định (TCP và UDP) (IP nếu như sử dụng raw IP socket). Các giao thức với các gói dữ liệu khác như ARP, RARP, ICMP ta sẽ không thể chặn bắt khi sử dụng socket. Nếu sử dụng thư viện pcap để chặn bắt ở mức net- work adapter thì ta sẽ có thể chặn bắt được toàn bộ thông tin do mức chặn bắt ở đây tầng thứ 2 trong mô hình OSI (link layer trong TCP/IP). Tuy nhiên, độ sai lệch là rất nhỏ do các gói tin ngoài TCP và UDP có rất nhỏ và không thường xuyên.
Sử dụng Raw Socket ta có thể block một ứng dụng, một tiến trình sử dụng mạng bằng cách có thể chặn cổng hay chặn địa chỉ IP của nó. Tuy nhiên, khi sử dụng thư viện pcap, ta không thể làm việc này mà chỉ có thể chặn bắt và trích xuất thông tin. Kết luận: Để xây dựng một ứng dụng sniffer, ta hoàn toàn có thể sử dụng bất kỳ một trong hai phương pháp trên. Tuy nhiên, tùy vào nhiều yếu tố khác nhau mà ta có thể chọn một trong hai phương pháp hay kết hợp cả hai phương pháp.