Hướng dẫn sử dụng Scapy linux

Hướng dẫn sử dụng Scapy linux

PHN 1. C V SCAPY CÁC CHC NĂNG CA SCAPY
1.1 Gii thiu c v Scapy
Scapy mt chương trình Python giúp cho ngưi dùng th gi, nghe lén, phân tích gi mo các gói tin mng.
Các tính năng ca Scapy cho phép xây dng các công c vi mc đích thăm dò, quét kim tra tn công mng. Bên cnh
đó, Scapy còn mt chương trình thao tác tương tác vi các gói tin mng mt cách mnh m. Scapy th gi mo
hoc gii các gói tin trên mt s ng ln các giao thc mng. Scapy s thc hin gi các gói tin, bt các gói tin, đưa ra
tp các gói tin yêu cu các gói tin tr li tương ng vi các gói tin yêu cu… Scapy th d dàng thc hin các tác v
như scanning, tracerouting, probing, unit test, attack hoc network discovery… Scapy th thay thế hping, arpspoof, arp-
sk, arping, p0f, Nmap, tcpdump, tshark... Hình bên i nhng phn Scapy th thc hin đưc.
Các công c Packet foring: gi mo gói tin gi các gói tin gi mo. Các công c như 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: bt, nghe lén phân tích các gói tin. Các công c như 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ư ping, hping2, hping3, traceroute, tctrace, tcptraceroute,…
Các công c Scanning tool: quét thăm các thông tin trong mng. Các công c như nmap, amap, vmap,
hping3, unicornscan, ttlscan, ikescan, paketto, firewalk,…
Các công c Fingerprinting tool: các công c như nmap, xprobe, p0f, cron-OS, queso, ikescan, amap, synscan,…
Các công c Attacking tool: các công c tn công mng. Các công c như dnsspoof, poisonivy, ikeprobe, ettercap,
dsniffsuite, cain, hunt, airpwn, irpas, nast, yersinia,…
Scapy khá d để s dng, đưc xây dng trên ngôn ng Python tích hp sn trên Kali Linux. Hin ti scapy chưa
đưc tích hp giao din nên ch làm vic trên nn core. th nói Scapy gm 2 nhim v chính: gi các gói tin nhn li
các gói tin tr li. Scapy th định nghĩa tp các gói tin, gi các gói tin, nhn các gói tr li, đưa ra tp các gói tin tương
tng gia yêu cu tr li hay tp các gói tin không tương ng gia yêu cu tr li. Scapy th thc hin thêm các
tác v đặc bit các công c khác không th thc hin đưc như: gi các gói tin không hp l, thc vin vic xen vào các
frame trong 802.11, kết hp các k thut như VLAN hopping ARP cache poisoning, gii gói tin VoIP đưc hóa. Đặc
bit, Scapy th xây dng đưc nhiu chc năng cao cp. hình tng quan ca Scapy đưc cho trong hình bên i.
ó th đúng hoc sai. Đối vi nhng ngưi mi bt đầ
1.2 Các vn đề Scapy th gii quyết đưc so vi các công c khác
Scapy đưc xây dng trên Python nhưng không cn phi tìm hiu quá k Python trưc khi s dng. Scapy ưu đim
pháp đơn gin, x nhanh ít li nên scapy th thay thế mt s công c hin 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 cu an toàn mng thì không th thay đổi ý mun ca tác
gi làm ra công c đó. Các công c này đưc xây dng cho các mc đích riêng bit không th làm lnh các mc đích này.
d như công c ARP cache poisoning không th đóng gói 802.1q 2 ln hoc gi các gói ICMP vi phn padding. Do đó,
mi ln cn mt mc đích nào đó mi thì cn phi xây dng mt công c mi.
Th hai, thưng s nhm ln gia gii thông dch. Máy tính kh năng gii tt th giúp con
ngưi vi vic gii mã. Thông dch đưc dành riêng cho con người. Mt s chương trình c bt chước thói quen này. d,
thưng nói “this port is open” thay cho “I received a SYN-ACK”. thông báo “I received a SYN-ACK” th đồng nghĩa
vi “this port is open”. Điu này c u thì 2 ý nghĩa này đưc xem như
nhau, nhưng khi c gng suy ra nhng thc s đã xy ra t cách thông dch ca chương trình thì lúc này th đã mt
mt ng ln thông tin. Thông thường thì ngưi dung s s dng tcpdump -xX để gii thông dch nhng công c
đã b qua.
Th ba, các chương trình thưng ch gii nhưng không cung cp tt c các thông tin s nhn đưc. Thông thưng
thì các công c s cung cp thông tin tác gi ca ca công c nghĩ cn thiết. d khó kiếm công c th đưa ra
thông tin phn padding ca Ethernet.
Scapy th gii quyết đưc các vn đề này. Scapy cho phép xây dng chính xác các gói ngưi dùng mong
mun. Ngay c khi vic xếp chng lp 802.1q lên trên TCP hoc gi các gói tin không đầy đủ thông tin. Scapy mt
hình linh hot c gng tránh nhng gii hn như trên. Vi Scapy thì th đặt bt k giá tr bn mun vào trưng tương
ng trong các cu trúc header ca gói tin xếp chng theo cách ngưi dùng mong mun. Trong thc tế, Scapy ging
như xây dng mt công c mi tùy theo tng nhu cu nhưng thay c trăm dòng lnh C thì ch viết 2 dòng Scapy.
Sau khi thăm mng (quét, traceroute,…). Scapy luôn luôn cung cp đầy đủ các gói tin đưc gii t quá trình
thăm dò, trưc quá trình thông dch. d thc hin traceroute quan sát thông tin trong phn padding.
2 cm t hay đưc nhc đến khi nói v mt ngôn ng lp trình biên dch (compiled) thông dch (interpreted).
2 cm t này biu đạt cho cách thc máy tính th hiu đưc nhng ngưi dùng viết thc thi .
Ngôn ng đưc coi thông dch khi chương trình đưc viết ra, khi chy s đưc trc tiếp thành máy (ngôn ng
máy tính th hiu đưc) để máy tính thc thi chúng. Khi chương trình chy đến dòng lnh nào s chuyn thành
máy đến đó để máy tính th thc thi. B thông dch thc hin quá trình thông dch gi interpreter. Thông dch ưu
đim: Interpreter d hin thc hơn do b qua vic kim tra li ti ưu code thường đưc thc hin trong quá trình
compiled, h tr đa nn tng. kích thưc chương trình thc thi nh hơn. Nhưng thông dch li nhưc đim: chương trình
độ tin cy thp hơn do b qua c kim tra loi b mt s li thưng thc hin trong quá trình compiled, Source code
d dàng b dch ngưc, tc độ thc thi chm hơn, tim tàng nguy li.
Cách hot động ca trình biên dch khác so vi thông dch. Thay chy trc tiếp thành máy, trình biên dch s
phi chuyn đổi ngôn ng lp trình thành máy ri cha kết qu vào đĩa cng để th thc thi ln chy sau. B biên
dch thc hin quá trình biên dch đưc gi compiler. Biên dch ưu đim là: chương trình sau đó đưc thc thi nhanh
hơn, độ tin cy cao, khó b dch ngưc ngun. Biên dch nhưc đim: khó xây dng mt compiler tính chính xác
cao để chuyn toàn b chương trình thành máy, máy ca mi nn tng khác nhau, khó thc hin đa nn tng.
1.2.1 To gói tin mt cách nhanh chóng
Đa s công c đều theo hình “program-that-you-run-from-a-shell”. Vic này dn đến phi cn pháp
phc tp để t gói tin. d, ch địa ch IP đưc s dng để thc hin port scanning. Còn cu trúc ca Scapy s dng
ngôn ng DSL (Domain Specific Language) cho phép t mnh m nhanh chóng bt k loi gói tin nào.
S dng
pháp Python b thông dch Python nhiu ưu đim: không cn viết mt trình thông dch riêng bit, người dùng không
cn phi hc mt ngôn ng khác. th nói Scapy ngn gn mnh m.
Scapy cho phép người dùng t mt gói hoc tp hp các gói như các lp đưc xếp chng lên nhau. Scapy không
bt buc ngưi dùng phi s dng các phương thc hoc mu đưc xác định trước. Điu này làm gim bt yêu cu viết mt
công c mi trong các tình hung khác nhau. Trong C, th mt trung bình 60 dòng để t mt gói tin. Vi Scapy, các
gói đưc gi th đưc t ch bng mt dòng duy nht vi mt dòng khác để in kết qu. 90% công c thăm mng
th đưc viết li bng 2 dòng Scapy.
1.2.2 Thăm 1 ln, thông dch nhiu ln
Khi thăm mt mng, nhiu “kích thích” đưc gi đi, trong khi ch mt s ít đưc tr li. Nếu các kích thích thích
hp đưc chn, thông tin mong mun th thu đưc. Không ging như nhiu công c, Scapy cung cp tt c thông tin, tc
tt c các kích thích đã gi tt c các câu tr li đã nhn đưc. Vic kim tra d liu này s cung cp cho ngưi dùng
thông tin mong mun. Khi tp d liu nh, ngưi dùng ch th khai thác nó. Trong các trưng hp khác, vic thông dch
d liu s ph thuc vào quan đim đưc thc hin. Hu hết các công c chn mt quan đim nht đnh loi b tt c
các d liu không liên quan đến quan đim đó. Scapy cung cp d liu thô hoàn chnh, d liu đó th đưc s dng
nhiu ln cho phép quan đim phát trin trong quá trình phân tích.
1.2.3 Scapy gii mã, không thông dch
Mt vn đề thưng gp vi các công c thăm mng c gng thông dch các câu tr li nhn đưc thay ch gii
đưa ra các s kin. “Received a TCP Reset on port 80” không phi chu li thông dch. “Port 80 is closed” mt cách
gii thích chính nhưng sai trong mt s ng cnh c th tác gi ca công c không ng ng ra đưc. d, khi thc
hin quét thì xu ng báo cáo mt cng TCP đưc lc khi nhn đưc mt ICMP destination unreachable. Điu này th
đúng, nhưng trong mt s trưng hp nghĩa i tin không đưc lc bi ng la hay đúng hơn không máy
ch để chuyn tiếp gói tin đến.
PHN 2. HÌNH THC NGHIM
- Dùng Unetlab kết hp Vmware để gi lp hình.
- Đặt IP như nh.
- Cu hình các thông tin như VLAN, định tuyến. Đảm bo Kali 2012 kết ni Internet thành công.
- Các lnh cu hình IP trên kali:
+ File cu hình IP:
+ Chnh sa ni dung file cu hình IP:
+ File cu hình DNS cho Kali:
+ Chnh sa ni dung file cu hình DNS:
+ Khi động li dch v mng:
- IP ca server 2012:
- Kết qu cu nh:
+ 2012 ping kết ni internet thành ng:
+ Kali ping kết ni internet thành công:
- Kim tra kết ni gia Kali 2012:
- Trên server 2012 trin khai các dch v: HTTP, FTP, DNS DHCP.
+ Kali truy cp web thành công trên server 2012:
+ Kali truy cp FTP thành công trên server 2012:
PHN 4. CÁC TÌNH HUNG CA SCAPY
TÌNH HUNG 1: CÁC LNH BN TRONG SCAPY
1. Các lnh bn xem thông tin ban đầu.
- Để m scapy thì t terminal ca Kali dùng lnh “scapy”:
- Scapy hot động da trên các lp (layers). Lp đây th đưc hiu các giao thc cu trúc ca gói tin như: cu
trúc gói tin lp 3 (IP header version 4 6), cu trúc gói tin lp 4 (TCP, UDP), cu trúc gói tin lp 2 (Ethernet) hoc cu trúc
ca các giao thc như DHCP, DNS, ARP, ESP, Dot1q, SNMP, NTP, AH… Để hin th danh sách các lp dùng lnh như bên
i.
- Mi lp các thuc tính tương ng. Thuc tính đây th hiu các trưng trong cu trúc gói tin, d như trưng
Time to Live trong IP header. Để thc hin xem danh sách thuc tính thì dùng lnh như các hình bên i. Trong () trên
lp mun xem thuc tính.
- Để tương tác vi các lp các thuc tính ca lp thì cn dùng đến tp lnh trong scapy. d: để gi 1 gói tin lp 3 thì
dùng lnh “send”. Nếu mun hin th danh sách lnh sn trong Scapy thì dùng lnh như hình bên i.
- Mi lnh các thông s. Để hin th tr giúp thông s các lnh thì dùng cách bên i.
2. d v vic to mt gói tin lp 3 (TCP/IP)
Phn to gói tin lp 2 hoc lp 4 cũng đưc thc hin tương t.
Yêu cu đặt ra: to gói tin lp 3 s đưc gi gia máy kali server 2012.
Để thc hin to gói tin bn lp 3 thì dùng 1 trong 2 cách như bên i. Cn chú ý trong phn này ch phương pháp
to, ch không phi gi gói tin đã to. Phn gi gói tin s đưc thc hin các phn bên i.
Để to gói tin lp 3 thì th dùng 1 trong 2 cách bên i.
Cách 1: Thc hin khai báo tng c.
+ Khai báo biến a mang thông tin ca lp IP (IP header version 4): lưu ý key “IP” trong lnh gán a = IP() phi đưc nm
trong danh sách các lp ca scapy (có th dùng lnh ls () để xem li). “IP” đưc viết hoa hay viết thưng cũng tùy thuc
vào các lp đưc show ra trong lnh ls().
+ Nếu ch khai báo biến a không cu hình thuc tính nào thì biến a s dùng các giá tr thuc tính mc định ca lp.
+ Bây gi bt đầu thiết lp địa ch ngun địa ch đích ca gói tin:
+ Nhp a để xem toàn b thông tin đã cu hình cho biến a. Còn nếu mun xem thuc tính nào ca lp thì dùng cu trúc là:
biến.thuc tính. Xem d như bên i:
+ Xoá thuc tính đã thiết lp thì dùng lnh del theo cu trúc: del (biến.thuc tính mun xóa). d bên i xóa địa ch
IP bên nhn gói tin. Sau khi xóa thì dùng xem li thông tin ca biến a, thy đa ch bên nhn đã biến mt.
+ Cu hình li đa ch bên nhn:
+ Thêm giá tr ca thuc tính Tive to Live:
+ Để tng hp li thông tin đã cu hình dùng lnh:
+ Để biết thêm thông tin ca gói tin dùng lnh:
Cách 2: th dùng luôn 1 lnh sau.
>>>a=IP(dst=“192.168.1.10”,src=“192.168.2.10”,ttl=50).
Chú ý các thuc tính cách nhau bng du “phẩy”.
- Khi làm đến đây thì cn ghi nh các chú ý sau khi to gói tin:
+ Các thuc tính (các trưng) trong cu trúc ca lp như: src, dst, ttl… cn ghi đúng như trong lnh a.show(). Nghĩa tên
thuc tính phân bit ch hoa ch thưng.
+ Khi d liu đưc đóng theo hình OSI thì mi gói tin đưc xây dng t lp đến lp. d khi to 1 i tin Web đầy đủ
theo hình TCP/IP thì lp application http, lp transport TCP, lp Internet IP…
+ Dùng “/” để liên kết các lp vi nhau. Chú ý “/” không phi hàm toán hc.
+ Để gi các gói tin theo OSI thì mi lp th đưc xếp chng lên lp khác.
+ Mi lp hay gói tin th đưc thao tác đến.
+ Mi thuc tính trong lp hot động vi g tr mc định nếu không đưc thiết lp. th xem các giá tr mc định ca mi
lp bng lnh ls () bên trên.
+ Vài thuc tính th bao gm mt giá tr hoc thiết lp nhiu giá tr.
+
Nếu
thiết
lp
đúng
mt
gói
tin
TCP
cn
đi
qua
nhng
trường
thông
tin
t
thp
nht
lên
cao
nht,
t
trái
sang
phi…
(Ethernet
IP
TCP).
+ Vi Scapy th xếp chng nhng thuc tính mong mun ti nơi bt .
+ th đặt giá tr mong mun vào bt k trưng o.
Chú ý: th kết hp c 2 cách trên. Quan sát d bên i.
3. Các lnh gi gói tin bn trong Scapy
Trong () th biến hoc gói tin cn gi. Các lnh gi gói tin bn đưc cho trong bng bên i.
Lnh
Tác dng
Chú ý
sendp()
Gi các gói tin lp 2.
Chú ý lnh send() lnh sendp() ch
dùng để gi gói tin. 2 lnh này nếu dùng
thêm thông s “return_packets=True” thì
th nhn thêm gói tin tr v.
sr1p()
Gi các gói tin lp 2 ch đợi tín hiu tr li đầu tiên.
srp()
Gi nhn các gói tin lp 2.
send()
Gi các gói tin lp 3. Nghĩa lnh này s h tr định
tuyến lp 2.
sr1()
Gi các gói tin lp 3 ch đợi tín hiu tr li đầu tiên.
sr():
Gi nhn các gói tin lp 3.
Chú ý: Theo như trên thì Scapy hot động vi các lp. Các lp đưc xem như nhng hàm độc lp. Các hàm này đưc liên
kết vi nhau bng t “/” để xây dng gói tin. S liên kết này còn đưc gi xếp chng các lp (Stacking).
4. Các d v vic gi gói tin bn
4.1 d 1:
- Biến a lp 3 (IP).
- Biến b lp 4 (TCP).
- Biến c liên kết a vi b.
- Cui cùng dùng lnh send() để gi biến c. Chú ý lnh send() ch gi gói tin.
Chú ý ngoài các thông s đưc khai báo trong a b thì các thông s còn li đề đưc dùng mc định. th kim tra
bng cách hin th li thông tin ca biến c bng lnh:
th kim tra quá trình gi gói tin (hay c quá trình nhn các gói tin trong các d bên i bng phn mm wireshark.
Tm thi trong các d bn này chưa dùng đến wireshark). th nhn thy các câu lnh bên i t máy kali gi
đến google. Đến đây th nhn xét đưc Scapy th dùng để to gói tin gi gói tin. Bình thưng mun gi gói tin
t 1 máy tính đến google thì cn dùng đến các phn mm ng dng trung gian như trình duyt web, terminal ca Linux,
Power shell ca Microsoft… Nói cách khác, nh Scapy ngưi hc th tác động vào vic gi nhn gói tin.
4.2 d 2
To 1 gói tin lp 2, lp 3 lp 4 kết hp. Biết lp 2 địa ch MAC broadcast, lp 3 source máy kali, destination
google.com zing.vn, ttl giá tr t 1 đến 10 lp 4 UDP. Chú ý lnh “srp” dùng cho bên i gi nhn các
gói tin lp 2. ch để gi các gói tin lp 2 nên TCP, UDP “Unanswered”.
Hoc th dùng 1 lnh như bên i. khi đã rành v lnh thì không cn dùng biến cũng đưc.
Chú ý: Trong quá trình cu hình nếu mun in ra các thông tin cn xem trong quá trình to gói tin thì dùng phương thc
sprintf() như hình bên i.
4.3 d 3
Dùng lnh sr() để gi trong trưng hp này. 2012 server web d này mang ý nghĩa kali mun file default.html
ca server web.
4.4 d 4
Gi 1 gói tin ICMP request đến máy địa ch 192.168.2.10. Nếu không dùng Scapy thì thao tác trên máy tính thông
thưng thc hin thao tác “ping”.
4.5 d 5
Gi 1 gói tin lp 2 chn cng để gi gói tin. i chn interface eth0 hin nay máy kali này ch 1 card mng tên
eth0.
4.6 d 6
Gi 1 gói tin lp 2 chn cng để gi gói tin. Cho gói tin này đưc truyn liên tc.
4.7 d 7
Gi gói tin lp 2 yêu cu gói tin tr v.
4.8 d 8
- Trong d này thì gi gói tin t kali sang 2012, vi phn data “anh yeu em”. Dùng Wireshark trên kaki hoc 2012 để
capture gói tin.
- Các thông tin trong d 8: a biến thuc lp IP, b biến thuc lp TCP, packet biến để ghép a b, data “anh yeu
em.
- Thc hin lnh:
- Kết qu wireshark:
5. Lnh str() lnh hexdump() trong phân tích gói tin bn.
Theo d bên i thì 1 gói tin đưc gi t 192.168.1.1 đến máy kali. Dùng thêm lnh str() lnh hexdump() để phân
tích thêm gói tin.
6. Lnh v hình cu trúc ca gói tin
Dùng lnh pdfdump dùng để v cu trúc gói tin phân tích.
7. Đọc 1 file pcap
Nếu sn 1 file wireshark đã lưu t trưc thì th m file này lên bng lnh như hình bên i.
8. To nhiu gói tin
Trong phn trên ch ng dn to 1 gói tin. Trong phn này s ng dn to tp nhiu gói tin.
9. Lnh Fuzzing
đến địa ch ca google, vi port 80.
Chc năng fuzz() cho phép thay đổi bt c giá tr mc đnh nào không đưc tính toán (ví d như Checksum) bng mt
đối ng giá tr random. Trong d bên i, lp IP đưc s dng bình thưng, UDP NTP Fuzzing. Giá tr UDP
checksum s đưc đặt đúng dport UDP s s dng port 123 ca NTP, version ca NTP 4. T c các port khác
random. Nếu mun random IP ca lp IP() thì dùng RandIP().
10. SYN Scans
Tìm mt địa ch IP ca google.
Thc hin 1 kết ni bng gói SYN
Kết qu nhn đưc. Nhn thy google s tr li bng gói SA (SYN-ACK), th nhn biết điu này khi nhìn vào trưng
flags=SA.
th kim tra thêm 2 d:
11. TCP Traceroute
| 1/32

Preview text:


PHẦN 1. LƯỢC VỀ SCAPY CÁC CHỨC NĂNG CỦA SCAPY
1.1 Giới thiệu 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, arp-
sk, 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,…
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.
1.2 Các vấn đề Scapy 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 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, độ 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 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.
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.
PHẦN 2. 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:
+ 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: - Kết quả cấu hình:
+ 2012 ping và kết nối internet thành công:
+ Kali ping và kết nối internet thành công:
- Kiểm tra kết nối giữa Kali và 2012:
- 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:
PHẦN 4. CÁC TÌNH HUỐNG CỦA SCAPY
TÌNH HUỐNG 1: CÁC LỆNH BẢN TRONG SCAPY
1. Các lệnh 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ường
Time 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.
- Để 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.
- 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.
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:
+ 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:
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ị.
+ 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 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ú ý sendp() Gửi các gói tin lớp 2. sr1p()
Gửi các gói tin lớp 2 và chỉ đợi tín hiệu trả lời đầu tiên.
Chú ý là lệnh send() và lệnh sendp() chỉ srp() Gửi dùng
và nhận các gói tin lớp 2.
để gửi gói tin. 2 lệnh này nếu dùng
thêm thông số “return_packets=True” thì có send()
Gửi các gói tin lớp 3. Nghĩa là lệnh này sẽ hỗ trợ định
thể nhận thêm gói tin trả về. tuyến và lớp 2. 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 dụ về việc gửi gói tin 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:
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”.
Hoặc có thể dùng 1 lệnh như bên dưới. khi đã rành về lệnh thì không cần dùng biến cũng được.
Chú ý: Trong quá trình cấu hình nếu muốn in ra các thông tin cần xem trong quá trình tạo gói tin thì dùng phương thức
sprintf() như hình bên dưới.
4.3 Ví dụ 3
Dùng lệnh sr() để gửi trong trường hợp này. 2012 là server web và ví dụ này mang ý nghĩa là kali muốn có file default.html của server web.
4.4 Ví dụ 4
Gửi 1 gói tin ICMP request đến máy có địa chỉ là 192.168.2.10. Nếu không dùng Scapy thì thao tác trên máy tính thông
thường là thực hiện thao tác “ping”.
4.5 Ví dụ 5
Gửi 1 gói tin lớp 2 và chọn cổng để gửi gói tin. Ở dưới chọn interface là eth0 vì hiện nay máy kali này chỉ có 1 card mạng tên là eth0.
4.6 Ví dụ 6
Gửi 1 gói tin lớp 2 và chọn cổng để gửi gói tin. Cho gói tin này được truyền liên tục.
4.7 Ví dụ 7
Gửi gói tin lớp 2 và yêu cầu gói tin trả về.
4.8 Ví dụ 8
- Trong ví dụ này thì gửi gói tin từ kali sang 2012, với phần data là “anh yeu em”. Dùng Wireshark trên kaki hoặc 2012 để capture gói tin.
- Các thông tin trong ví dụ 8: a là biến thuộc lớp IP, b là biến thuộc lớp TCP, packet là biến để ghép a và b, data là “anh yeu em”. - Thực hiện lệnh: - Kết quả wireshark:
5. Lệnh str() lệnh hexdump() trong phân tích gói tin bản.
Theo ví dụ bên dưới thì có 1 gói tin được gửi từ 192.168.1.1 đến máy kali. Dùng thêm lệnh str() và lệnh hexdump() để phân tích thêm gói tin.
6. Lệnh vẽ hình cấu trúc của gói tin
Dùng lệnh pdfdump dùng để vẽ cấu trúc gói tin và phân tích.
7. Đọc 1 file pcap
Nếu có sẵn 1 file wireshark đã lưu từ trước thì có thể mở file này lên bằng lệnh như hình bên dưới.
8. Tạo nhiều gói tin
Trong phần trên chỉ hướng dẫn tạo 1 gói tin. Trong phần này sẽ hướng dẫn tạo tập nhiều gói tin.
9. Lệnh Fuzzing
Chức năng fuzz() cho phép thay đổi bất cứ giá trị mặc định nào mà không được tính toán (ví dụ như Checksum) bằng một
đối tượng có giá trị random. Trong ví dụ bên dưới, lớp IP được sử dụng bình thường, UDP và NTP là Fuzzing. Giá trị UDP
checksum sẽ được đặt đúng và dport UDP sẽ sử dụng port 123 của NTP, version của NTP là 4. Tấ cả các port khác là
random. Nếu muốn random IP của lớp IP() thì dùng RandIP(). 10. SYN Scans
Tìm một địa chỉ IP của google.
Thực hiện 1 kết nối bằng gói SYN đến địa chỉ của google, với port 80.
Kết quả nhận được. Nhận thấy là google sẽ trả lời bằng gói SA (SYN-ACK), có thể nhận biết điều này khi nhìn vào trường flags=SA.
Có thể kiểm tra thêm 2 ví dụ:
11. TCP Traceroute