Mục đích tấn công vào một hệ thống của hacker có thể đến từ nhiều nguyên nhân, có thể là tấn công cho vui chẳng hạn, nhưng bóc lịch thì chắc không vui tí nào -.-. Suy cho cùng mục đích chính vẫn là tiền và hacker có thể kiếm tiền từ thông tin đánh cắp được, có nhiều mã độc sinh ra để thực hiện điều này, chúng có thể vào sâu tận hệ thống nhưng đến bước trích xuất dữ liệu ra ngoài thì bị phát hiện hoặc bị chặn. Có nhiều kỹ thuật để thực hiện điều này một cách “hợp pháp”, có thể kể đến Protocol Tunneling, sử dụng những giao thức “hợp pháp” để đưa dữ liệu thu được về C2 sever. Và một trong số đó mình sẽ trình bày ở đây – ICMP Tunneling.

 

ICMP – Internet Control Message Protocol

Là giao thức hoạt động ở tầng Network, sử dụng cho mục đích chẩn đoán, báo cáo lỗi hoặc là truy vấn tới các máy chủ (như ping và traceroute).

Nó tuân theo các nguyên tắc sau đây (theo vi.wikipedia.org):

  • ICMP không hoạt động độc lập mà được đóng gói trong một gói IPv4
  • ICMP phát hiện và chẩn đoán lỗi, nhưng không làm IP trở thành một giao thức đáng tin cậy.
  • ICMP phân tích sai sót trong mỗi gói IP, trừ các gói tin chứa ICMP Message.
  • ICMP Message không được gửi để trả lời các gói tin gửi tới các địa chỉ multicast hoặc broadcast.
  • ICMP Message chỉ trả lời một địa chỉ IP xác định.

 

Cấu trúc ICMP Packet:

                                                                            Cấu trúc ICMP Packet

                        

Gói tin ICMP trên WireShark:

Các loại ICMP Type:

Ở bài viết này mình chỉ sử dụng Type 0/8 (Echo Reply/Echo Request) để triển khai ICMP Tunneling, các type khác mình không đề cập ở đây. Có rất nhiều blog nói về chủ đề này, mình xin phép không đi sâu vào giao thức này, hãy cùng mình tìm hiểu về nội dung thảo luận chính ngày hôm nay.

 

ICMP Tunneling

Một kỹ thuật không mấy xa lạ được sử dụng để trích xuất dữ liệu bằng cách thiết lập một tunnel thông qua giao thức ICMP (MITRE T1572: Protocol Tunneling[1]). Một số firewall hiện nay không thiết lập rule cho giao thức này, vì thế các hacker hay các nhà phát triển mã độc tận dụng nó như một kênh để có thể giao tiếp với C2 Sever.

 

Có thể kể đến Pingback malware – mã độc sử dụng ICMP Tunneling để thực hiện việc control mục tiêu:

(https://www.virustotal.com/gui/file/e50943d9f361830502dcfdb00971cbee76877aa73665245427d817047523667f)

Mã nguồn được chia sẻ:

https://github.com/SpiderLabs/pingback

Yara Rule được đề xuất từ các nhà phân tích trước đó:

                                                                                      Yara rule cho PingBack Malware

 

Các command vẫn được để dưới dạng plain text nên rule này mới detect được Pingback Malware, một chú ý khác là data size của packet quá lớn có thể bị các rule check size phát hiện:

                                                                                              File PCAP được chia sẻ từ mã nguồn

 

Nếu dữ liệu truyền đi đều được mã hóa và dữ liệu được “chặt” ra theo size cố định của gói ping (32 bytes với Windows, 64 bytes với Linux) thì sẽ thế nào?

Trước tiên hãy điểm qua cơ chế hoạt động của lệnh Ping:

  • Khi người dùng gửi một lệnh ping, một Echo request sẽ được gửi đến máy chủ đích và đợi một phản hồi Echo Reply.

ICMP Tunneling dựa trên cơ chế này, các bot sẽ gửi một gói ICMP với Echo request đến C2 Sever (các gói tin này phần data chứa thông tin thu thập được) và đợi phản hồi. C2 sau khi nhận được gói tin từ bot, kiểm tra và trích xuất các thông tin trong gói tin (như thông tin OS version, MAC, IP, … hoặc thông tin đánh cắp được) và phản hồi lại gói Echo reply chứa thông tin control.

 

Dựa trên các tool có sẵn trên github (nhược điểm của các tool này data size của gói tin vẫn lớn và command vẫn ở dưới dạng plain text), mình có thêm chức năng mã hóa và chia nhỏ dữ liệu gửi đi thành các gói tin có kích thước cố định.

Sơ đồ hoạt động tổng quát:

                                                                                                   Sơ đồ hoạt động tổng quát

 

Phần triển khai mình sử dụng Python và thư viện chính là scapy để sniff các gói tin đến và gửi các gói tin đi.

 

Việc bắt tay là bước quan trọng đầu tiên để phân biệt các gói ICMP gửi đến từ C2 hay chỉ là các gói bình thường.

Gói tin bắt tay còn chứa thông tin của key mã hóa và kích thước gói tin mà mình muốn chia nhỏ dữ liệu.

Sever gửi gói bắt tay:

Máy victim bắt gói tin bắt tay bằng sniffer của thư viện scapy và tách các value quan trọng (Key encrypt, Size Packet, IP):

 

Sau khi bắt tay thành công, thì victim sẽ đợi sever gửi command.

Các lệnh thực thi bao gồm:

  • Download: Download một file từ máy victim.
  • Upload: Upload một file từ máy sever lên máy victim.
  • Shell command: Những lệnh command bình thường.

Tất cả việc truyền dữ liệu đều chỉ thông qua ICMP Tunneling.

 

Với các file lớn, việc trao đổi chúng giữa Sever và Victim thường sẽ dùng những gói ICMP có kích thước lớn (maximum là 65536 bytes), việc này có thể bị detect bởi các rule kiểm tra kích thước gói ICMP (có thể là các rule chặn Ping of Death).

Ta có thể thấy trong pingback size rất lớn 788 byte:

                                                                          Download trong PingBack (từ file PCAP được chia sẻ)

 

Để khắc phục điểm này Ở đây mình chia 1 gói tin lớn thành các gói nhỏ và gửi đi. Các gói tin sau khi gửi đủ toàn bộ sẽ được tổng hợp lại thành file ban đầu. Dữ liệu trong file cũng đi qua hàm mã hóa, ở đây mình dùng hàm xor đơn giản:

Như vậy có thể giới hạn kích thước gói tin ở một mức cố định và dữ liệu cũng được mã hóa. Cách này sẽ bypass được các rule cơ bản.

 

Một cách để “bình thường hóa” các gói tin tránh sự kiểm tra “bằng cơm” và để giúp nhận biết chúng theo từng loại khi đến đích, các gói tin sẽ có một dấu hiệu để phân loại mình sẽ gọi là packet flag với 4 bytes đầu của gói tin (ở PingBack thì dựa vào sequence number với 3 giá trị 1234/1235/1236).

Các packet này chung một cấu trúc được mô tả dưới đây:

           4 bytes đầu là packet flag

          4 bytes tiếp là time stamp

          n bytes cuối là dữ liệu truyền đi – kích thước của dữ liệu sẽ quyết định bởi argument truyền vào từ Sever, với giá trị thích hợp thì ta hoàn toàn có thể giới hạn kích thước gói tin ở mức cố định.

 

Ví dụ chức năng upload file từ Sever lên victim:

  • Đầu tiên Sever sẽ gửi một gói chứa thông tin file upload: gồm file size và file name. Packet flag của gói này là ‘f..f’ (f..f – file upload info).
  • Tiếp theo file sẽ được chia ra thành các packet nhỏ và gửi đi, packet flag từng gói là ‘u..o’ (u..o – upload info).

  • Phía victim sẽ tiến hành kiểm tra gói tin, packet flag của gói tin, lấy file size và file name, lấy từng phần data trong gói tin và tổng hợp lại thành một file.

 

Chức năng download cũng tương tự như upload.

                                                       Tool đã build trên máy đóng vai trò là C2 Sever

 

Ví dụ download file MyLog.bin từ victim với tham số data size là 48 bytes:

Size của file này là 65536 bytes (có thể truyền trong 1 gói nhưng có thể bị detect bởi rule Ping of Death), với kích thước 1 gói tin là 48 bytes sẽ phải truyền đi 1365 gói tin để có thể truyền xong file

 

Đây là một hạn chế của việc chia nhỏ file để truyền đi qua ICMP Tunneling (kích thước gói tỉ lệ nghịch với số lượng gói tin), nhưng với việc hacker chỉ nhắm vào các file chứa mật khẩu, thông tin quan trọng của người dùng như ini, config, xml, db, js, json thì kích thước các file này cũng không quá lớn để có thể truyền thông qua ICMP Tunneling.

                                                                          File MyLog.bin được chia ra thành nhiều gói và gửi đi

 

Ta có thể thấy size gói tin luôn giữ mức 98 bytes, đây cũng là size của gói ping trên Windows. Và dữ liệu hoàn toàn bị mã hóa nên các rule bắt theo string hoàn toàn không detect được.

 

Vậy giải pháp cho vấn đề này là gì ?

  • Đó là xem ip đích của gói tin có phải là một IP bị gắn cờ trên Virustotal hay không? Có drop các file chứa malware xuống hay không ?
  • Một cách khác đó là kiểm tra “tần suất” gói tin gửi đi, một số lượng lớn các gói tin ICMP gửi đi trong một khoảng thời gian ngắn chắc chắn là điều bất thường.
  • Kiểm tra độ “giống nhau” giữa gói Echo Request và Reply, bình thường hai gói tin này sẽ giống nhau về phần icmp data, nếu khác nhau có thể có sự can thiệp sửa đổi từ phía hacker.
  • Kiểm tra “sâu” gói tin, đó là kiểm tra phần data, với những hệ thống chỉ cho phép Ping thì có thể kiểm tra theo data mặc định (trên Windows là abcdef….. và Linux là 01234….)

 

Kết luận

Kỹ thuật này có thể phát triển theo nhiều cách khác nhau, việc chặn hoàn toàn giao thức ICMP là việc bất khả thi trong hệ thống thực vì có thể gây ra rất nhiều sự cố mạng, thay vào đó theo nhu cầu hãy thiết lập các rule để có thể phát hiện kỹ thuật này.

ICMP Tunneling không chỉ dừng lại ở Type 0/8 nó có nhiều con đường khác thông qua các type khác hoặc nó sẽ hỗ trợ cho các giao thức khác hay các Tunnel khác để dễ dàng truyền thông tin hơn, đây là một kỹ thuật khá thú vị, có thể trong tương lai gần mình sẽ quay trở lại với nó với một con mã độc chẳng hạn :> hoặc là một lab với việc kết hợp ICMP với các giao thức truyền tin khác hoặc là Type khác và kỹ thuật mã hóa phức tạp hơn …

 

Tham khảo:

[https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/backdoor-at-the-end-of-the-icmp-tunnel/]

 

by nhat3eo22 – RE Team

408 lượt xem