An ninh mạng Tấn công mạng
Tấn công mạng
Các cuộc tấn công vào các giao thức và ứng dụng được lưu trữ trên Mạng rất phong phú. Ứng dụng Web được đề cập trong phần riêng của nó trong khóa học này.
Các dịch vụ có thể có những lỗi cố hữu khiến chúng bị kẻ tấn công khai thác. Các cuộc tấn công này thường liên quan đến việc sử dụng các hướng dẫn đặc biệt cho Hệ điều hành, thông qua dịch vụ dễ bị tấn công, để chiếm quyền kiểm soát quá trình vận hành dịch vụ mạng. Tràn bộ đệm là một loại tấn công như vậy.
Một mạng thường chứa nhiều ứng dụng, một số chứa thông tin đăng nhập đơn giản và một số khác có chức năng phức tạp. Một cách để có cái nhìn tổng quan về bề mặt tấn công và cũng vạch ra các lỗ hổng dễ khai thác là quét cổng tất cả nội dung trong môi trường đích, sau đó chụp ảnh màn hình chúng.
Các công cụ như EyeWitness (https://github.com/FortyNorthSecurity/EyeWitness) thực hiện việc này. Công cụ này cho phép chúng tôi nhanh chóng có được cái nhìn tổng quan về những nội dung nào được thể hiện trên mạng, sau đó cung cấp ảnh chụp màn hình của từng dịch vụ. Bằng cách có ảnh chụp màn hình, chúng tôi có thể dễ dàng xem xét và đánh giá nhanh chóng hệ thống nào chúng tôi nên xem xét kỹ hơn.
Khai thác một dịch vụ có nghĩa là lạm dụng dịch vụ theo những cách không mong muốn. Thông thường, hoạt động khai thác này có nghĩa là những kẻ tấn công có khả năng chạy mã của riêng chúng, mã này được gọi là RCE ("Thực thi mã từ xa").
Tràn bộ nhớ
Việc khai thác các dịch vụ mạng đôi khi liên quan đến việc lạm dụng chức năng quản lý bộ nhớ của ứng dụng. Quản lý bộ nhớ? Có, các ứng dụng cần di chuyển dữ liệu trong bộ nhớ máy tính để ứng dụng có thể hoạt động. Khi các ngôn ngữ lập trình cung cấp cho nhà phát triển quyền kiểm soát bộ nhớ, các vấn đề như Tràn bộ đệm có thể tồn tại. Tồn tại nhiều lỗ hổng tương tự và trong phần này chúng tôi xem xét Tràn bộ đệm.
Ngôn ngữ lập trình C và C++ cho phép các nhà phát triển kiểm soát rất nhiều cách quản lý bộ nhớ. Điều này lý tưởng cho các ứng dụng yêu cầu nhà phát triển lập trình rất chặt chẽ với phần cứng nhưng lại tạo ra các lỗ hổng. Các ngôn ngữ lập trình như Java, JavaScript, C#, Ruby, Python và các ngôn ngữ khác không dễ dàng cho phép các nhà phát triển mắc những lỗi này, khiến cho việc tràn bộ đệm ít xảy ra hơn trong các ứng dụng được viết bằng các ngôn ngữ này.
Tràn bộ đệm xảy ra khi đầu vào không được dọn dẹp được đặt vào các biến. Các biến này được biểu diễn trên Hệ điều hành thông qua cấu trúc bộ nhớ được gọi là Ngăn xếp. Kẻ tấn công sau đó có thể ghi đè lên một phần của ngăn xếp được gọi là Con trỏ trả về.
Con trỏ trả về quyết định vị trí CPU ("Bộ xử lý trung tâm") sẽ thực thi mã tiếp theo. CPU chỉ đơn giản kiểm soát những hướng dẫn mà hệ thống sẽ thực hiện tại bất kỳ thời điểm nào. Con trỏ trả về chỉ đơn giản là một địa chỉ trong bộ nhớ nơi việc thực thi sẽ diễn ra. CPU phải luôn được cho biết nơi thực thi mã và đây là điều mà con trỏ trả về cho phép nó thực hiện.
Khi kẻ tấn công có thể điều khiển Con trỏ trả về, điều đó có nghĩa là kẻ tấn công có thể kiểm soát những lệnh mà CPU sẽ thực thi!
Ví dụ, hãy xem xét ví dụ về mã C sau đây (đừng lo lắng, bạn không cần phải là nhà phát triển C nhưng hãy cố gắng hết sức để hiểu ứng dụng đơn giản này làm gì):
#include <string.h>
void storeName (char *input) {
char name[12];
strcpy(name, input);
}
int main (int argc, char **argv) {
storeName(argv[1]);
return 0;
}
Trong nhiều ngôn ngữ lập trình, bao gồm cả C, ứng dụng khởi động bằng một hàm gọi là main. Điều này được chỉ ra trong đoạn mã trên với nội dung int main (int argc, char **argv) {
. Bên trong dấu ngoặc nhọn { và }, chương trình chỉ cần chạy một hàm có tên storeName(argv[1]);
. Điều này sẽ đơn giản chấp nhận bất cứ điều gì người dùng đã nhập vào chương trình và cung cấp nó cho hàm storeName.
Ứng dụng này có 11 dòng mã, nhưng hãy tập trung sự chú ý của bạn vào dòng có nội dung strcpy(name, input);
. Đây là hàm cố gắng sao chép văn bản từ đầu vào vào biến có tên là name. Tên có thể chứa tối đa 12 ký tự như được biểu thị bằng dòng char name[12];
. Có vị trí nào trong mã ngăn chặn tên được cung cấp dài hơn 12 ký tự không? Biến tên được cung cấp bởi người dùng đang sử dụng ứng dụng và được truyền trực tiếp vào hàm storeName.
Trong ứng dụng này không có quá trình làm sạch hoặc khử trùng, đảm bảo độ dài của đầu vào đúng như ứng dụng mong đợi. Bất kỳ ai đang chạy chương trình đều có thể dễ dàng nhập một giá trị lớn hơn giá trị tối đa mà biến tên có thể chứa. Biến tên chứa 12 ký tự, nhưng điều gì xảy ra khi CPU được yêu cầu ghi nhiều hơn 12 ký tự? Nó chỉ đơn giản là thực hiện những gì đã được yêu cầu, ghi đè lên bộ nhớ nhiều nhất có thể!
Khi cố gắng ghi một giá trị lớn hơn mong đợi, CPU vẫn sẽ cố gắng ghi giá trị này vào bộ nhớ. Điều này thực sự khiến CPU ghi đè lên những thứ khác trong bộ nhớ, ví dụ như Con trỏ trả về cho phép kẻ tấn công kiểm soát CPU. Một lần nữa, nếu kẻ tấn công có thể ghi đè và kiểm soát Con trỏ trả về, kẻ tấn công sẽ kiểm soát mã nào CPU sẽ thực thi.
Một ví dụ đồ họa cho thấy Alice viết tên của cô ấy vào ứng dụng mà chúng tôi đã sử dụng trong ví dụ trên:
Alice cư xử tử tế và cung cấp một cái tên khiến ứng dụng hoạt động như bình thường. Cô ấy cung cấp tên của mình là Alice và nó chỉ được ghi vào bộ nhớ ứng dụng.
Tuy nhiên, Eve gửi quá nhiều ký tự vào ứng dụng. Chuyện gì xảy ra sau đó? CPU lấy đầu vào của cô ấy một cách hiệu quả và ghi đầu vào vào bộ nhớ, đồng thời ghi đè các giá trị khác tồn tại!
Đầu vào của Eve khiến CPU ghi nhiều dữ liệu hơn những gì ứng dụng mong đợi và khiến con trỏ trả về bị ghi đè. Khi CPU cố gắng thực hiện lệnh tiếp theo, nó sẽ được yêu cầu thực thi mã tại vị trí AAAAAAA ...
Nếu Eve nắm quyền kiểm soát máy chủ này, thay vì viết chữ A, cô ấy sẽ phải cung cấp mã mà CPU có thể hiểu được vào bộ nhớ. Tiếp theo, cô ấy sẽ làm cho con trỏ trả về có một giá trị báo cho CPU thực thi mã CPU của Eve.
Máy quét lỗ hổng
Trình quét lỗ hổng sẽ tự động tìm kiếm các lỗ hổng phổ biến trong phần mềm và cấu hình trên mạng. Nó không được thiết kế để tìm các lớp lỗ hổng mới mà thay vào đó sử dụng danh sách các plugin (hoặc mô-đun) được xác định trước để quét các dịch vụ để tìm sự cố và lỗ hổng. Nó không nhất thiết phải tìm kiếm các lỗ hổng zero-day! Lỗ hổng zero-day là một lỗ hổng hoàn toàn mới mà trước đây nhà cung cấp phần mềm và người bảo vệ chưa biết đến; đối với lỗ hổng zero-day hiện tại chưa có bản vá nào được biết đến cho vấn đề này.
Máy quét có các tính năng quét cổng và lập bản đồ mạng, bao gồm các cách khám phá và tìm ra lỗ hổng trong các ứng dụng khác nhau mà nó gặp phải.
Trình quét lỗ hổng thường hỗ trợ cấu hình bằng thông tin xác thực, cho phép nó đăng nhập vào hệ thống và đánh giá các lỗ hổng thay vì tìm kiếm chúng từ góc độ chưa được xác thực.
Thực thi mã
Khi những kẻ tấn công tìm thấy một lỗ hổng mà chúng có khả năng khai thác, chúng cần quyết định tải trọng nào chúng muốn chạy. Tải trọng là mã mà kẻ tấn công muốn phân phối thông qua việc khai thác.
Có nhiều tải trọng khác nhau mà kẻ tấn công có thể quyết định sử dụng, đây là một số ví dụ:
- Làm cho nạn nhân đăng ký với máy chủ C2 ("Lệnh và Kiểm soát") chấp nhận lệnh từ kẻ tấn công
- Tạo tài khoản người dùng backdoor mới trên hệ thống để kẻ tấn công có thể sử dụng sau này
- Mở GUI ("Giao diện người dùng đồ họa") với nạn nhân để kẻ tấn công có thể điều khiển nó từ xa
- Nhận thiết bị đầu cuối dòng lệnh, shell, kẻ tấn công có thể gửi lệnh thông qua
Tải trọng phổ biến của những kẻ tấn công là bind-shell. Nó khiến nạn nhân lắng nghe trên một cổng và khi kẻ tấn công kết nối, họ sẽ nhận được một shell.
Tường lửa rất hữu ích trong việc ngăn chặn kẻ tấn công kết nối với nạn nhân. Tường lửa sẽ từ chối các kết nối đến nạn nhân một cách hiệu quả miễn là cổng không được phép. Chỉ một ứng dụng có thể nghe trên một cổng, vì vậy kẻ tấn công không thể nghe trên các cổng đã được sử dụng trừ khi chúng vô hiệu hóa dịch vụ đó.
Để phá vỡ biện pháp phòng thủ này, thay vào đó, những kẻ tấn công sẽ cố gắng làm cho nạn nhân kết nối với kẻ tấn công, khiến nạn nhân phải cung cấp quyền truy cập vào tải trọng. Rất tiếc, nhiều tường lửa không được cấu hình để từ chối lưu lượng truy cập đi ra, khiến cuộc tấn công này rất khả thi đối với những kẻ tấn công.
Trong ví dụ này, chúng ta thấy kẻ tấn công sử dụng shell đảo ngược để khiến nạn nhân kết nối với kẻ tấn công.
Giám sát mạng
Những kẻ tấn công trong hầu hết các trường hợp đều yêu cầu mạng phải điều khiển mục tiêu từ xa. Khi kẻ tấn công có khả năng điều khiển mục tiêu từ xa, việc này được thực hiện thông qua kênh Lệnh và Điều khiển, thường được gọi là C&C hoặc C2.
Tồn tại sự xâm phạm thông qua phần mềm độc hại được lập trình sẵn với tải trọng không cần C2. Loại phần mềm độc hại này có khả năng xâm phạm ngay cả các mạng không có mạng.
Việc phát hiện các thỏa hiệp thường có thể được thực hiện thông qua việc tìm kênh C2. C2 có thể có bất kỳ dạng nào, ví dụ:
- Sử dụng HTTPS để liên lạc với máy chủ của kẻ tấn công. Điều này làm cho C2 trông giống như đang duyệt mạng
- Sử dụng Mạng xã hội để đăng và đọc tin nhắn tự động
- Các hệ thống như Google Docs để thêm và chỉnh sửa lệnh cho nạn nhân
Chỉ có sự khéo léo của kẻ tấn công mới đặt ra giới hạn cho C2. Khi xem xét cách ngăn chặn những kẻ tấn công bằng các kênh C2 thông minh, chúng ta thường phải dựa vào việc phát hiện các điểm bất thường và khác biệt về mặt thống kê trên mạng. Ví dụ: các công cụ giám sát mạng có thể phát hiện:
- các kết nối dài được sử dụng bởi C2, nhưng điều này không tự nhiên đối với giao thức được đề cập. HTTP là một trong những giao thức không phổ biến để có kết nối dài, nhưng kẻ tấn công sử dụng nó để điều khiển từ xa có thể.
- Đèn hiệu được C2 sử dụng để cho biết nạn nhân còn sống và sẵn sàng nhận lệnh. Nhiều loại phần mềm sử dụng đèn hiệu, không chỉ những kẻ tấn công, mà việc biết đèn hiệu nào tồn tại và đèn hiệu nào bạn mong đợi là một cách làm tốt.
- Dữ liệu đột ngột bùng phát từ mạng. Điều này có thể cho thấy một lượt tải lên lớn từ một ứng dụng hoặc kẻ tấn công đang đánh cắp dữ liệu. Hãy thử hiểu ứng dụng và người dùng nào đang gây ra hiện tượng dữ liệu nhấp nháy và áp dụng ngữ cảnh cho nó. Nó có bình thường hay không?
Có nhiều cách mà người phòng thủ có thể cố gắng tìm ra điểm bất thường. Những điểm bất thường này phải có mối tương quan sâu hơn với dữ liệu từ hệ thống nguồn gửi dữ liệu.
Để giám sát mạng, nên áp dụng bối cảnh để giúp xác định nhiễu từ tín hiệu. Điều đó có nghĩa là SOC ("Trung tâm điều hành bảo mật") nên cố gắng làm phong phú dữ liệu, chẳng hạn như Địa chỉ IP nguồn và đích với ngữ cảnh để giúp làm cho dữ liệu có giá trị hơn.
Việc áp dụng ngữ cảnh có thể được mô tả bằng kịch bản sau: Một cuộc tấn công đến từ Internet nhưng nó cố gắng khai thác lỗ hổng Linux đối với dịch vụ Windows. Điều này thường được coi là tiếng ồn và có thể được bỏ qua một cách an toàn; trừ khi, điều gì sẽ xảy ra nếu địa chỉ IP thực hiện cuộc tấn công là địa chỉ IP từ mạng của chính bạn hoặc nhà cung cấp mà bạn tin cậy? Sau đó, bối cảnh mà chúng tôi có thể áp dụng có thể cung cấp cái nhìn sâu sắc có giá trị để chúng tôi khám phá thêm về cuộc tấn công. Suy cho cùng, chúng tôi không muốn các hệ thống mà chúng tôi tin tưởng phát động bất kỳ cuộc tấn công nào!
Lưu lượng truy cập ngang hàng
Hầu hết các mạng được cấu hình theo kiểu máy khách đến máy chủ. Khách hàng truy cập vào máy chủ để lấy thông tin và khi khách hàng cần tương tác với nhau, họ thường thực hiện việc đó thông qua máy chủ.
Tuy nhiên, kẻ tấn công có thể sẽ muốn sử dụng phương thức liên lạc ngang hàng, tức là giữa các khách hàng, để tận dụng các thành quả dễ xảy ra như sử dụng lại thông tin xác thực hoặc khai thác các khách hàng yếu hoặc dễ bị tấn công.
Ví dụ: cổng 445, được SMB sử dụng, là một chỉ báo tốt để phát hiện sự xâm phạm. Khách hàng không nên nói chuyện với nhau qua SMB trong hầu hết các môi trường, tuy nhiên, trong quá trình xâm phạm, có khả năng kẻ tấn công sẽ cố gắng sử dụng SMB để xâm phạm thêm các hệ thống.
Chuyển động bên và xoay vòng
Khi hệ thống bị xâm phạm, kẻ tấn công có thể tận dụng hệ thống đó để khám phá các mạng bổ sung mà hệ thống bị xâm nhập có quyền truy cập. Điều này có thể xảy ra trong môi trường mà hệ thống bị xâm nhập có nhiều đặc quyền hơn thông qua tường lửa hoặc hệ thống có quyền truy cập vào các mạng khác thông qua một card mạng bổ sung.
Xoay vòng có nghĩa là kẻ tấn công sử dụng máy chủ bị xâm nhập để truy cập vào các mạng khác. Một minh họa về điều này được hiển thị ở đây khi Eve đã xâm phạm một hệ thống và đang sử dụng nó để quét và khám phá các hệ thống khác:
Chuyển động bên là hành động lợi dụng trục và khai thác hệ thống khác sử dụng trục. Hệ thống mới này hiện có thể được sử dụng nhiều hơn để thực hiện chuyển động xoay và chuyển động ngang hơn. Eve trong ví dụ này sử dụng Máy chủ X để khám phá thêm về Hệ thống B.