Nội dung bài viết
#

Shellcode là gì? Cách tạo Shellcode đơn giản

Trong lĩnh vực an toàn máy tính, Shellcode là một khái niệm quan trọng mà nhiều người chưa biết đến. Nó được sử dụng trong các tấn công mã độc máy tính và là một trong những yếu tố quan trọng để gây nên thiệt hại cho hệ thống. Trong bài viết này, chúng ta sẽ tìm hiểu về Shellcode và tính năng của nó.

Shellcode là gì?

Shellcode la gi
Shellcode là gì?

Shellcode là mã máy tính được viết bằng ngôn ngữ Assembly và được sử dụng trong các tấn công mã độc máy tính. Nó được chèn vào một chương trình hoặc tập tin để thực hiện một hành động xấu nhất định trên máy tính của người dùng.

Khi một chương trình hoặc tập tin chứa Shellcode được chạy, nó sẽ thực hiện mã Assembly để tấn công máy tính. Mã Assembly này có thể làm bất cứ điều gì như gây thiệt hại cho hệ thống, tấn công dữ liệu, chiếm quyền quản trị hay cấp quyền truy cập vào máy tính của người dùng.

Để tạo một shell process mới chỉ mất vài dòng code chính bởi lẽ đó mà popping shell được xem là cách thức tấn công mục tiêu đơn giản, nhẹ nhàng và hiệu quả.

shellcode

Một sell sẽ được bật ra từ Standard C code trên và có thể được biên dịch và chạy trong một trình chỉnh sửa chẳng hạn như Geany. Những chương trình nhỏ như trên có thể được biến thành các chuỗi đầu vào để cung cấp cho các chương trình dễ bị tấn công. Một tin vui dành cho những tên hacker đó là nếu chương trình mục tiêu sở hữu những đặc quyền nâng cao thì tất nhiên sell tạo ra cũng được thừa hưởng tất cả những thứ đó.

Muốn tạo ra các chuỗi shellcode từ các code thông thường bắt buộc phải dùng trình dịch ngược để hiển thị cụm “bên dưới” C đã biên dịch. Với bất kì trình dịch ngược nào cũng có thể thực hiện được điều đó từ IDA đến Ghidra hay OllyDbg, Radare2. Dưới đây là một ví dụ minh họa chương trình trong trình dịch ngược.

shellcode2

Phần tô màu đỏ là những mã opcode được dùng để tạo ra shellcode. Ở bên phải của opcode là hướng dẫn cụ thể viết bằng ngôn ngữ hợp ngữ để dễ nhận diện, dễ đọc, dễ hiểu.

Opcode mà bạn có được cần đặt ở định dạng có thể được dùng làm chuỗi đầu vào cho một chương trình khác. Điều quan trọng phải thực hiện đó là nối các opcode thành một chuỗi và trước mỗi byte hex viết \x để có định dạng sau:

\x55\x48\x89\xe5\x48\x83\xec\x30\x31\xc0\x89\xc2\x48\x8d\x75\xe0\x48\x8b\x3b\x0d\xe9\x...

Cách tạo Shellcode

Một điều bạn cần lưu tâm đó là số 0 không được phép có mặt trong bất cứ lệnh shellcode nào. Trường hợp trong chuỗi đầu vào xuất hiện ký tự 0 thì mặc định chương trình đích sẽ hiểu đó là null-terminator và lúc đó tự động loại bỏ phần còn lại của shellcode. Quan sát chương trình minh họa trên ta thấy rất nhiều byte rỗng tồn tại.

Để tạo shellcode đúng định dạng và đảm bảo chuỗi đầu vào hoạt động tốt bạn cần thay thế các lệnh chưa byte rỗng bằng lệnh khác. Đây là cách đơn giản, dễ dàng nhất mà chúng ta có thể làm để khắc phục vướng mắc nói trên. Ví dụ dưới đây sẽ “mách nhỏ” bạn cách để tránh vấn đề byte rỗng bằng cách sử dụng execve().

Cach tao Shellcode-1

Lưu ý tại dòng 8, số thập lục phân 48 31 f6 được dùng để chỉ cho tổ hợp:

xor %ris, %rsi, %

sử dụng XOR với mục đích hạn chế không dùng kí tự 0, với chương trình trên số nguyên 0 sẽ được đẩy lên stack bằng cách tải 0 vào CPU’s %rsi register:
move $0x0, %rsi

Tuy nhiên nếu dữ liệu đó được nhập vào disassembler trực tuyến sẽ raw hex được tạo ra với nhiều ký tự 0 ở toán hạng lệnh:
4889342500000000

Để giải quyết vấn đề trên chúng ta hãy lấy giá trị của %rsi và so sánh với chính nó. Trường hợp đầu vào của XOR có giá trị như nhau thì kết quả nhận được là 0 và trong raw hex không bắt buộc có kí tự 0. Dưới đây là chuỗi shellcode được định dạng chuẩn và hoàn chỉnh:
x48x31xf6x56x48xbfx2fx62x69x6ex2fx2fx73x68x57x54x5fx6ax3bx58x99x0fx05

Cach tao Shellcode-2

Tìm các chương trình dễ bị tổn thương

Trên đây chúng ta phần nào hiểu rõ shellcode là gì. Thế nhưng để tìm chương trình dễ xảy ra lỗ hổng để chèn shellcode vào là vấn đề khá nan giải.

Thông qua thiết kế ngược một chương trình, làm mờ và thử nghiệm là cách khả thi nhất mà chúng ta nên dùng với hy vọng tìm ra một target program xử lý sai một vài chi tiết đầu vào nào đó. Và lỗi tràn bộ đệm (buffer overflow) là một trong những lỗi lập trình phổ biến.

Lỗi tràn bộ đệm là gì? Đúng như tên gọi, lỗi tràn bộ đệm tức là khi một chương trình ghi data vào bộ nhớ lớn hơn kích thước của bộ đệm đã được cấp phát. Lúc đó một số data chương trình không liên quan sẽ được ghi đè lên. Thông thường chương trình sẽ gặp sự cố khi lỗi tràn bộ đệm xảy ra. Tuy nhiên với những đầu vào như shellcode nếu được chèn vào đó thì sẽ tạo cơ hội để hacker tiếp tục thực thi code của chúng.

Tim cac chuong trinh de bi ton thuong-1

Ví dụ trên cho thấy 16 byte được chương trình dự trữ cho bộ nhớ đầu vào nhưng chúng không được kiểm tra kích thước. Lỗi tràn bộ đệm sẽ xảy ra nếu người dùng nhập chuỗi dài hơn 16 byte. Hình ảnh dưới đây minh chứng rõ ràng khi ai đó cố tình thực thi chương trình trên với kích thước đầu vào vượt quá 16 byte.

Tim cac chuong trinh de bi ton thuong-2

Hacker không khai thác nhiều lỗi tràn bộ đệm trừ trường hợp chúng muốn ứng dụng bị treo. Phần lớn các trường hợp xảy ra ngoài việc làm tràn bộ đệm thì lỗi này còn được xem như một phương tiện để kiểm soát việc thực thi. Để hiểu rõ hơn về lỗi tràn bộ nhớ cũng như giải pháp ngăn chặn, bạn hãy nghiên cứu ở bài chia sẻ của BKHOST về buffer overflow.

Cách phòng chống Shellcode

Lỗi tràn bộ đệm đã được biết đến từ lâu và con số này tăng lên đáng kể theo thời gian. Năm 2017, 2018 theo thống kê từ cơ sở dữ liệu CVE tại NIST khiến nhiều người choáng ngợp vì so với từ 2010 đến 2016 chênh lệch quá nhiều.

Như vậy có thể thấy có nhiều code không an toàn và để bảo vệ hệ thống của mình khỏi các khai thác liên quan đến shellcode bạn cần bảo mật nhiều lớp. Bên cạnh lớp tường lửa mạnh mẽ, bền bỉ thì bạn cần kiểm soát thiết bị để tránh những kết nối nguy hiểm.

Đặc biệt để nắm bắt những hành động độc hại trước và sau thực thi bạn nên ứng dụng Al tĩnh. Machine Learning sẽ giúp bạn phát hiện hành vi nguy hiểm và ngăn chặn mọi âm mưu để không gây ra thiệt hại nào.

Tổng kết về Shellcode

Tóm lại, Shellcode là một phần quan trọng của các tấn công mã độc máy tính và cần được coi trọng và phòng tránh. Để bảo vệ hệ thống máy tính của mình, người dùng cần sử dụng các phần mềm bảo mật và cập nhật thường xuyên hệ thống để tránh bị tấn công bởi Shellcode hoặc các mã độc khác. Việc tìm hiểu về cách chống lại và phòng tránh Shellcode cũng rất quan trọng để bảo vệ tài sản và thông tin cá nhân của mình trong môi trường mạng.

Nếu còn gặp bất cứ vướng mắc gì, hãy để lại ở bên bình luận bên dưới, BKHOST sẽ trả lời bạn trong thời gian sớm nhất.

Mua tên miền .VN tại BKHOST

Giá chỉ từ 750k/năm. Kiểm tra tên miền .VN đẹp và đăng ký ngay hôm nay!

đăng ký tên miền .vn giá rẻ

Tôi là Trịnh Duy Thanh, CEO & Founder Công ty Cổ Phần Giải Pháp Mạng Trực Tuyến Việt Nam - BKHOST. Với sứ mệnh mang tới các dịch vụ trên Internet tốt nhất cho các cá nhân và doanh nghiệp trong nước và quốc tế, tôi luôn nỗ lực hết mình nâng cấp đầu tư hệ thống phần cứng, nâng cao chất lượng dịch vụ chăm sóc khách hàng để đem đến những sản phẩm hoàn hảo nhất cho người tiêu dùng. Vì vậy, tôi tin tưởng sẽ đem đến các giải pháp CNTT mới nhất, tối ưu nhất, hiệu quả nhất và chi phí hợp lý nhất cho tất cả các doanh nghiệp.
Bình luận

Thanh toán linh hoạt

Chúng tôi chấp nhận thanh toán như ATM, Visa, Internet Banking, Paypal, Baokim, Ngân lượng

Gọi ĐT tư vấn ngay
Chat ngay qua Zalo
Chat ngay qua Messenger
Góp ý
Bạn đã hài lòng với trải nghiệm trên Bkhost.vn?
Cảm ơn lượt bình chọn của bạn, Chúc bạn 1 ngày tốt lành !