



















Preview text:
lOMoAR cPSD| 60752940
PHẦN 1. SƠ LƯỢC VỀ SCAPY VÀ CÁC CHỨC NĂNG CỦA SCAPY
1.1 Giới thiệu sơ lược về Scapy
Scapy là một chương trình Python giúp cho người dùng có thể gửi, nghe lén, phân tích và giả mạo các gói tin mạng.
Các tính năng của Scapy cho phép xây dựng các công cụ với mục đích thăm dò, quét kiểm tra và tấn công mạng. Bên cạnh
đó, Scapy còn là một chương trình thao tác và tương tác với các gói tin mạng một cách mạnh mẽ. Scapy có thể giả mạo hoặc
giải mã các gói tin trên một số lượng lớn các giao thức mạng. Scapy sẽ thực hiện gửi các gói tin, bắt các gói tin, đưa ra tập
các gói tin yêu cầu và các gói tin trả lời tương ứng với các gói tin yêu cầu… Scapy có thể dễ dàng thực hiện các tác vụ như
scanning, tracerouting, probing, unit test, attack hoặc network discovery… Scapy có thể thay thế hping, arpspoof, arpsk,
arping, p0f, Nmap, tcpdump, tshark... Hình bên dưới là những phần mà Scapy có thể thực hiện được.
Các công cụ Packet foring: giả mạo gói tin và gửi các gói tin giả mạo. Các công cụ như là packeth, packit, packetexcalibur,
nemesis, tcpinject, libnet, IP sorcery, pacgen, arp-sk, arpspoof, dnet, dpkt, pixiliate, irpas, sendIP, IP packet generator, sing, aicmpsend, libpal,…
Các công cụ Sniffing tool: bắt, nghe lén và phân tích các gói tin. Các công cụ như là ethereal, tcpdump, net2pcap,
cdpsniffer, aimsniffer, vomit, tcptrace, tcptrack, nstreams, argus, karpski, ipgrab, nast, cdpr, aldebaran, dsniff, irpas, iptraf, …
Các công cụ Testing tool: các công cụ như là ping, hping2, hping3, traceroute, tctrace, tcptraceroute,…
Các công cụ Scanning tool: quét và thăm dò các thông tin trong mạng. Các công cụ như là nmap, amap, vmap, hping3,
unicornscan, ttlscan, ikescan, paketto, firewalk,… lOMoAR cPSD| 60752940
Các công cụ Fingerprinting tool: các công cụ như là nmap, xprobe, p0f, cron-OS, queso, ikescan, amap, synscan,…
Các công cụ Attacking tool: các công cụ tấn công mạng. Các công cụ như là dnsspoof, poisonivy, ikeprobe, ettercap,
dsniffsuite, cain, hunt, airpwn, irpas, nast, yersinia,…
Scapy khá dễ để sử dụng, được xây dựng trên ngôn ngữ Python và tích hợp sẵn trên Kali Linux. Hiện tại scapy chưa
được tích hợp giao diện nên chỉ làm việc trên nền core. Có thể nói Scapy gồm 2 nhiệm vụ chính: gửi các gói tin và nhận lại
các gói tin trả lời. Scapy có thể định nghĩa tập các gói tin, gửi các gói tin, nhận các gói trả lời, đưa ra tập các gói tin tương
tứng giữa yêu cầu và trả lời hay tập các gói tin không tương ứng giữa yêu cầu và trả lời. Scapy có thể thực hiện thêm các tác
vụ đặc biệt mà các công cụ khác không thể thực hiện được như: gửi các gói tin không hợp lệ, thực viện việc xen vào các frame
trong 802.11, kết hợp các kỹ thuật như VLAN hopping và ARP cache poisoning, giải mã gói tin VoIP được mã hóa. Đặc biệt,
Scapy có thể xây dựng được nhiều chức năng cao cấp. Mô hình tổng quan của Scapy được cho trong hình bên dưới. lOMoAR cPSD| 60752940
1.2 Các vấn đề Scapy có thể giải quyết được so với các công cụ khác
Scapy được xây dựng trên Python nhưng không cần phải tìm hiểu quá kỹ Python trước khi sử dụng. Scapy có ưu điểm
vì cú pháp đơn giản, xử lí nhanh và ít lỗi nên scapy có thể thay thế một số công cụ hiện hành kém ưu hơn.
Đầu tiên, các công cụ thường dùng trong phân tích các yêu cầu an toàn mạng thì không thể thay đổi ý muốn của tác
giả làm ra công cụ đó. Các công cụ này được xây dựng cho các mục đích riêng biệt và không thể làm lệnh các mục đích này.
Ví dụ như công cụ ARP cache poisoning không thể đóng gói 802.1q 2 lần hoặc gửi các gói ICMP với phần padding. Do đó, mỗi
lần cần một mục đích nào đó mới thì cần phải xây dụng một công cụ mới.
Thứ hai, thường có sự nhầm lẫn giữa giải mã và thông dịch. Máy tính có khả năng giải mã tốt và có thể giúp con người
với việc giải mã. Thông dịch được dành riêng cho con người. Một số chương trình cố bắt chước thói quen này. Ví dụ, thường
nói là “this port is open” thay cho “I received a SYN-ACK”. Vì thông báo “I received a SYN-ACK” có thể đồng nghĩa với “this
port is open”. Điều này có thể đúng hoặc sai. Đối với những người mới bắt đầu thì 2 ý nghĩa này được xem là như nhau, nhưng lOMoAR cPSD| 60752940
khi cố gắng suy ra những gì thực sự đã xảy ra từ cách thông dịch của chương trình thì lúc này có thể đã mất một lượng lớn
thông tin. Thông thường thì người dung sẽ sử dụng tcpdump -xX để giải mã và thông dịch những gì công cụ đã bỏ qua.
Thứ ba, các chương trình thường chỉ giải mã nhưng không cung cấp tất cả các thông tin sẽ nhận được. Thông thường
thì các công cụ sẽ cung cấp thông tin mà tác giả của của công cụ nghĩ là cần thiết. Ví dụ khó kiếm công cụ có thể đưa ra thông
tin phần padding của Ethernet.
Scapy có thể giải quyết được các vấn đề này. Scapy cho phép xây dựng chính xác các gói mà người dùng mong muốn.
Ngay cả khi việc xếp chồng lớp 802.1q lên trên TCP hoặc gửi các gói tin không đầy đủ thông tin. Scapy có một mô hình linh
hoạt cố gắng tránh những giới hạn như trên. Với Scapy thì có thể đặt bất kỳ giá trị bạn muốn vào trường tương ứng trong các
cấu trúc header của gói tin và xếp chồng theo cách mà người dùng mong muốn. Trong thực tế, Scapy giống như xây dựng
một công cụ mới tùy theo từng nhu cầu nhưng thay vì cả trăm dòng lệnh C thì chỉ viết 2 dòng Scapy.
Sau khi thăm dò mạng (quét, traceroute,…). Scapy luôn luôn cung cấp đầy đủ các gói tin được giải mã từ quá trình
thăm dò, trước quá trình thông dịch. Ví dụ thực hiện traceroute và quan sát thông tin trong phần padding.
Có 2 cụm từ hay được nhắc đến khi nói về một ngôn ngữ lập trình là biên dịch (compiled) và thông dịch (interpreted).
2 cụm từ này biểu đạt cho cách thức mà máy tính có thể hiểu được những gì người dùng viết và thực thi nó.
Ngôn ngữ được coi là thông dịch khi chương trình được viết ra, khi chạy sẽ được trực tiếp thành mã máy (ngôn ngữ mà
máy tính có thể hiểu được) để máy tính thực thi chúng. Khi chương trình chạy đến dòng lệnh nào sẽ chuyển thành mã máy
đến đó để máy tính có thể thực thi. Bộ thông dịch thực hiện quá trình thông dịch gọi là interpreter. Thông dịch có ưu điểm:
Interpreter dễ hiện thực hơn do bỏ qua việc kiểm tra lỗi và tối ưu code thường được thực hiện trong quá trình compiled, hỗ
trợ đa nền tảng. kích thước chương trình thực thi nhỏ hơn. Nhưng thông dịch lại có nhược điểm: chương trình có độ tin cậy
thấp hơn do bỏ qua bước kiểm tra loại bỏ một số lỗi thường thực hiện trong quá trình compiled, Source code dễ dàng bị dịch
ngược, tốc độ thực thi chậm hơn, tiềm tàng nguy cơ có lỗi.
Cách hoạt động của trình biên dịch khác so với thông dịch. Thay vì chạy trực tiếp thành mã máy, trình biên dịch sẽ phải
chuyển đổi ngôn ngữ lập trình thành mã máy rồi chứa kết quả vào ổ đĩa cứng để có thể thực thi ở lần chạy sau. Bộ biên dịch
thực hiện quá trình biên dịch được gọi là compiler. Biên dịch có ưu điểm là: chương trình sau đó được thực thi nhanh hơn, độ lOMoAR cPSD| 60752940
tin cậy cao, khó bị dịch ngược mã nguồn. Biên dịch có nhược điểm: khó xây dựng một compiler có tính chính xác cao để
chuyển toàn bộ chương trình thành mã máy, mã máy của mỗi nền tảng là khác nhau, khó thực hiện đa nền tảng.
1.2.1 Tạo gói tin một cách nhanh chóng
Đa số công cụ đều theo mô hình “program-that-you-run-from-a-shell”. Việc này dẫn đến phải cần cú pháp
phức tạp để mô tả gói tin. Ví dụ, chỉ địa chỉ IP được sử dụng để thực hiện port scanning. Còn cấu trúc của Scapy sử dụng ngôn
ngữ DSL (Domain Specific Language) cho phép mô tả mạnh mẽ và nhanh chóng bất kỳ loại gói tin nào. Sử dụng cú pháp
Python và bộ thông dịch Python có nhiều ưu điểm: không cần viết một trình thông dịch riêng biệt, người dùng không cần phải
học một ngôn ngữ khác. Có thể nói Scapy ngắn gọn và mạnh mẽ.
Scapy cho phép người dùng mô tả một gói hoặc tập hợp các gói như các lớp được xếp chồng lên nhau. Scapy không
bắt buộc người dùng phải sử dụng các phương thức hoặc mẫu được xác định trước. Điều này làm giảm bớt yêu cầu viết một
công cụ mới trong các tình huống khác nhau. Trong C, có thể mất trung bình 60 dòng để mô tả một gói tin. Với Scapy, các
gói được gửi có thể được mô tả chỉ bằng một dòng duy nhất với một dòng khác để in kết quả. 90% công cụ thăm dò mạng
có thể được viết lại bằng 2 dòng Scapy.
1.2.2 Thăm dò 1 lần, thông dịch nhiều lần
Khi thăm dò một mạng, nhiều “kích thích” được gửi đi, trong khi chỉ một số ít được trả lời. Nếu các kích thích thích hợp
được chọn, thông tin mong muốn có thể thu được. Không giống như nhiều công cụ, Scapy cung cấp tất cả thông tin, tức là
tất cả các kích thích đã gửi và tất cả các câu trả lời đã nhận được. Việc kiểm tra dữ liệu này sẽ cung cấp cho người dùng thông
tin mong muốn. Khi tập dữ liệu nhỏ, người dùng chỉ có thể khai thác nó. Trong các trường hợp khác, việc thông dịch dữ liệu
sẽ phụ thuộc vào quan điểm được thực hiện. Hầu hết các công cụ chọn một quan điểm nhất định và loại bỏ tất cả các dữ liệu
không liên quan đến quan điểm đó. Vì Scapy cung cấp dữ liệu thô hoàn chỉnh, dữ liệu đó có thể được sử dụng nhiều lần cho
phép quan điểm phát triển trong quá trình phân tích. lOMoAR cPSD| 60752940
1.2.3 Scapy giải mã, không thông dịch
Một vấn đề thường gặp với các công cụ thăm dò mạng là cố gắng thông dịch các câu trả lời nhận được thay vì chỉ giải
mã và đưa ra các sự kiện. “Received a TCP Reset on port 80” không phải chịu lỗi thông dịch. “Port 80 is closed” là một cách
giải thích chính nhưng sai trong một số ngữ cảnh cụ thể mà tác giả của công cụ không tưởng tượng ra được. Ví dụ, khi thực
hiện quét thì có xu hướng báo cáo một cổng TCP được lọc khi nhận được một ICMP destination unreachable. Điều này có thể
đúng, nhưng trong một số trường hợp nó có nghĩa là gói tin không được lọc bởi tường lửa hay đúng hơn là không có máy chủ
để chuyển tiếp gói tin đến. lOMoAR cPSD| 60752940
PHẦN 2. MÔ HÌNH THỰC NGHIỆM
- Dùng Unetlab kết hợp Vmware để giả lập mô hình.
- Đặt IP như mô hình.
- Cấu hình các thông tin như VLAN, định tuyến. Đảm bảo Kali và 2012 kết nối Internet thành công.
- Các lệnh cấu hình IP trên kali: + File cấu hình IP:
+ Chỉnh sửa nội dung file cấu hình IP: lOMoAR cPSD| 60752940
+ File cấu hình DNS cho Kali:
+ Chỉnh sửa nội dung file cấu hình DNS:
+ Khởi động lại dịch vụ mạng:
- IP của server 2012: lOMoAR cPSD| 60752940
- Kết quả cấu hình:
+ 2012 ping và kết nối internet thành công: lOMoAR cPSD| 60752940
+ Kali ping và kết nối internet thành công:
- Kiểm tra kết nối giữa Kali và 2012: lOMoAR cPSD| 60752940
- Trên server 2012 triển khai các dịch vụ: HTTP, FTP, DNS và DHCP.
+ Kali truy cập web thành công trên server 2012:
+ Kali truy cập FTP thành công trên server 2012: lOMoAR cPSD| 60752940
PHẦN 4. CÁC TÌNH HUỐNG CỦA SCAPY
TÌNH HUỐNG 1: CÁC LỆNH CƠ BẢN TRONG SCAPY
1. Các lệnh cơ bản xem thông tin ban đầu.
- Để mở scapy thì từ terminal của Kali dùng lệnh “scapy”:
- Scapy hoạt động dựa trên các lớp (layers). Lớp ở đây có thể được hiểu là các giao thức và cấu trúc của gói tin như: cấu trúc
gói tin lớp 3 (IP header version 4 và 6), cấu trúc gói tin lớp 4 (TCP, UDP), cấu trúc gói tin lớp 2 (Ethernet) hoặc cấu trúc của
các giao thức như DHCP, DNS, ARP, ESP, Dot1q, SNMP, NTP, AH… Để hiển thị danh sách các lớp dùng lệnh như bên dưới.
- Mỗi lớp có các thuộc tính tương ứng. Thuộc tính ở đây có thể hiểu là các trường trong cấu trúc gói tin, ví dụ như trườngTime
to Live trong IP header. Để thực hiện xem danh sách thuộc tính thì dùng lệnh như các hình bên dưới. Trong () là trên lớp muốn xem thuộc tính. lOMoAR cPSD| 60752940
- Để tương tác với các lớp và các thuộc tính của lớp thì cần dùng đến tập lệnh trong scapy. Ví dụ: để gửi 1 gói tin lớp 3 thìdùng
lệnh “send”. Nếu muốn hiển thị danh sách lệnh có sẵn trong Scapy thì dùng lệnh như hình bên dưới. lOMoAR cPSD| 60752940
- Mỗi lệnh có các thông số. Để hiển thị trợ giúp thông số các lệnh thì dùng cách bên dưới.
2. Ví dụ về việc tạo một gói tin lớp 3 (TCP/IP)
Phần tạo gói tin lớp 2 hoặc lớp 4 cũng được thực hiện tương tự.
Yêu cầu đặt ra: tạo gói tin lớp 3 sẽ được gửi giữa máy kali và server 2012.
Để thực hiện tạo gói tin cơ bản lớp 3 thì dùng 1 trong 2 cách như bên dưới. Cần chú ý là trong phần này chỉ là phương pháp
tạo, chứ không phải là gửi gói tin đã tạo. Phần gửi gói tin sẽ được thực hiện ở các phần bên dưới.
Để tạo gói tin lớp 3 thì có thể dùng 1 trong 2 cách bên dưới. lOMoAR cPSD| 60752940
Cách 1: Thực hiện khai báo từng bước.
+ Khai báo biến a mang thông tin của lớp IP (IP header version 4): lưu ý là key “IP” trong lệnh gán a = IP() phải được nằm
trong danh sách các lớp của scapy (có thể dùng lệnh ls () để xem lại). “IP” được viết hoa hay viết thường cũng tùy thuộc vào
các lớp được show ra trong lệnh ls().
+ Nếu chỉ khai báo biến a mà không cấu hình thuộc tính nào thì biến a sẽ dùng các giá trị thuộc tính mặc định của lớp.
+ Bây giờ bắt đầu thiết lập địa chỉ nguồn và địa chỉ đích của gói tin:
+ Nhập a để xem toàn bộ thông tin đã cấu hình cho biến a. Còn nếu muốn xem thuộc tính nào của lớp thì dùng cấu trúc là:
biến.thuộc tính. Xem ví dụ như bên dưới: lOMoAR cPSD| 60752940
+ Xoá thuộc tính đã thiết lập thì dùng lệnh del theo cấu trúc: del (biến.thuộc tính muốn xóa). Ví dụ bên dưới là xóa địa chỉ IP
bên nhận gói tin. Sau khi xóa thì dùng xem lại thông tin của biến a, thấy địa chỉ bên nhận đã biến mất.
+ Cấu hình lại địa chỉ bên nhận:
+ Thêm giá trị của thuộc tính Tive to Live:
+ Để tổng hợp lại thông tin đã cấu hình dùng lệnh:
+ Để biết thêm thông tin của gói tin dùng lệnh: lOMoAR cPSD| 60752940
Cách 2: Có thể dùng luôn 1 lệnh sau.
>>>a=IP(dst=“192.168.1.10”,src=“192.168.2.10”,ttl=50).
Chú ý là các thuộc tính cách nhau bằng dấu “phẩy”.
- Khi làm đến đây thì cần ghi nhớ các chú ý sau khi tạo gói tin:
+ Các thuộc tính (các trường) trong cấu trúc của lớp như: src, dst, ttl… cần ghi đúng như trong lệnh a.show(). Nghĩa là tên
thuộc tính có phân biệt chữ hoa và chữ thường.
+ Khi dữ liệu được đóng theo mô hình OSI thì mỗi gói tin được xây dựng từ lớp đến lớp. Ví dụ khi tạo 1 gói tin Web đầy đủ
theo mô hình TCP/IP thì lớp application là http, lớp transport là TCP, lớp Internet là IP…
+ Dùng “/” để liên kết các lớp với nhau. Chú ý là “/” không phải hàm toán học.
+ Để gửi các gói tin theo OSI thì mỗi lớp có thể được xếp chồng lên lớp khác.
+ Mỗi lớp hay gói tin có thể được thao tác đến.
+ Mỗi thuộc tính trong lớp hoạt động với giá trị mặc định nếu không được thiết lập. Có thể xem các giá trị mặc định của mỗi
lớp bằng lệnh ls () bên trên.
+ Vài thuộc tính có thể bao gồm một giá trị hoặc thiết lập nhiều giá trị. lOMoAR cPSD| 60752940
+ Nếu thiết lập đúng một gói tin TCP cần đi qua những trường thông tin từ thấp nhất lên cao nhất, từ trái sang phải… (Ethernet IP TCP).
+ Với Scapy có thể xếp chồng những thuộc tính mong muốn tại nơi bất kì.
+ Có thể đặt giá trị mong muốn vào bất kỳ trường nào.
Chú ý: có thể kết hợp cả 2 cách trên. Quan sát ví dụ bên dưới.
3. Các lệnh gửi gói tin cơ bản trong Scapy
Trong () có thể là biến hoặc gói tin cần gửi. Các lệnh gửi gói tin cơ bản được cho trong bảng bên dưới. Lệnh Tác dụng Chú ý
Chú ý là lệnh send() và lệnh sendp() chỉ sendp() Gửi các gói tin lớp 2.
dùng để gửi gói tin. 2 lệnh này nếu dùng
thêm thông số “return_packets=True” thì có
thể nhận thêm gói tin trả về. sr1p()
Gửi các gói tin lớp 2 và chỉ đợi tín hiệu trả lời đầu tiên. srp()
Gửi và nhận các gói tin lớp 2. send()
Gửi các gói tin lớp 3. Nghĩa là lệnh này sẽ hỗ trợ định tuyến và lớp 2. lOMoAR cPSD| 60752940 sr1()
Gửi các gói tin lớp 3 và chỉ đợi tín hiệu trả lời đầu tiên. sr():
Gửi và nhận các gói tin lớp 3.
Chú ý: Theo như trên thì Scapy hoạt động với các lớp. Các lớp được xem như những hàm độc lập. Các hàm này được liên kết
với nhau bằng kí tự “/” để xây dựng gói tin. Sự liên kết này còn được gọi là xếp chồng các lớp (Stacking). 4. Các ví dụ về
việc gửi gói tin cơ bản 4.1 Ví dụ 1: - Biến a là lớp 3 (IP). - Biến b là lớp 4 (TCP).
- Biến c là liên kết a với b.
- Cuối cùng là dùng lệnh send() để gửi biến c. Chú ý là lệnh send() chỉ là gửi gói tin.
Chú ý là ngoài các thông số được khai báo trong a và b thì các thông số còn lại đề được dùng mặc định. Có thể kiểm tra bằng
cách hiển thị lại thông tin của biến c bằng lệnh: lOMoAR cPSD| 60752940
Có thể kiểm tra quá trình gửi gói tin (hay cả quá trình nhận các gói tin trong các ví dụ bên dưới bằng phần mềm wireshark.
Tạm thời trong các ví dụ cơ bản này chưa dùng đến wireshark). Có thể nhận thấy các câu lệnh bên dưới là từ máy kali gửi
đến google. Đến đây có thể nhận xét được là Scapy có thể dùng để tạo gói tin và gửi gói tin. Bình thường muốn gửi gói tin từ
1 máy tính đến google thì cần dùng đến các phần mềm ứng dụng trung gian như trình duyệt web, terminal của Linux, Power
shell của Microsoft… Nói cách khác, nhờ có Scapy mà người học có thể tác động vào việc gửi và nhận gói tin. 4.2 Ví dụ 2
Tạo 1 gói tin lớp 2, lớp 3 và lớp 4 kết hợp. Biết là lớp 2 có địa chỉ MAC là broadcast, lớp 3 có source là máy kali, destination
là google.com và zing.vn, ttl có giá trị từ 1 đến 10 và lớp 4 là UDP. Chú ý là lệnh “srp” dùng cho bên dưới là gửi và nhận các
gói tin lớp 2. Vì chỉ để gửi các gói tin lớp 2 nên TCP, UDP là “Unanswered”.