OSQUERY INJECTION LÀ GÌ VÀ NÓ HOẠT ĐỘNG NHƯ THẾ NÀO?

OSQUERY INJECTION LÀ GÌ?

OSQUERY INJECTION
osquery là một công cụ thu thập thông tin hệ điều hành như một cơ sở dữ liệu quan hệ hiệu suất cao. Nó cho phép các nhà phát triển viết các truy vấn dựa trên SQL để khám phá dữ liệu hệ điều hành. Với osquery, thì việc trừu tượng hoá thông tin hệ điều hành sẽ giúp cho người dùng thu thập thông tin một cách dễ dàng, các thông tin chẵn hạn như:
  • Tiến Trình Đang Chạy
  • Các module hạt nhân được nạp
  • Các kết nối mạng đang mở
  • Các plugin trên trình duyệt
  • Các sự kiện liên quan đến phần cứng
  • File hashes
Ví dụ, nếu bạn muốn tìm ra IP hostname localhost nào được phân giải, bạn có thể sử dụng một truy vấn SQL như sau:
OSQUERY INJECTION
Bạn có thể truy cập danh sách các bảng được xác định trước tại đây: https://osquery.io/schema/2.11.2.

OSQUERY HOẠT ĐỘNG NHƯ THẾ NÀO?

Dưới đây là một số ví dụ về những gì bạn có thể làm với osquery và tại sao nó là một tiện ích hữu ích như vậy. Bạn không thể truy xuất một số dữ liệu dưới đây mà không cần đến phân tích cú pháp các tệp hệ thống hoặc thậm chí tệ hơn, mà bạn không sử dụng các lệnh hệ thống nguy hiểm:
  • Liệu Kê Danh Sách Người Dùng
Bạn có thể liệt kê hầu hết thông tin trong /etc/passwd bằng cách sử dụng truy vấn đơn giản này:
SELECT * FROM users;
OSQUERY HOẠT ĐỘNG NHƯ THẾ NÀO?

LẤY TÊN, CỔNG VÀ PID CỦA TẤT CẢ CÁC TIẾN TRÌNH

Điều này thường sẽ liên quan đến một lệnh hệ thống, nhưng bây giờ bạn chỉ có thể sử dụng truy vấn dưới đây:
SELECT DISTINCT processes.name, listening_ports.port, processes.pid FROM listening_ports JOIN processes USING (pid);

OSQUERY INJECTION

osquery Injection là một lỗ hổng gây ra bởi việc lạm dụng thư viện, giống như SQL Injection hoặc Memcache Injection. Thư viện Python chính thức được công bố bởi Facebook. Thật không may, nó không sử dụng một cơ chế như Prepared Statement. Do đó, khi đầu vào của người dùng được đặt trong bất kỳ phần nào của truy vấn, các truy vấn độc hại có thể được thực hiện và các lỗ hổng có thể được khai thác bởi kẻ tấn công.

Đây là cách nó có thể được thực hiện:
OSQUERY INJECTION
Mã này chỉ cung cấp một số thông tin về người dùng, bằng cách đưa tên người dùng từ phương thức GET vào truy vấn.

Một cách dễ dàng để kiểm tra ứng dụng dễ bị tấn công của chúng tôi là triển khai docker container bằng cách sử dụng các lệnh sau:
Mã sẽ hoạt động tốt sau tiến trình này. Bây giờ bạn có thể truy cập ứng dụng bạn đã triển khai từ địa chỉ sau:
Hãy cẩn thận với đoạn mã này, vì nó chứa một lỗ hổng khá nghiêm trọng. Trong trường hợp bạn không phát hiện ra ngay, đầu vào mà chúng tôi nhận được từ người dùng đã được bao gồm trong truy vấn, như được minh họa:
Vì vậy, nếu chúng tôi gửi một yêu cầu như sau, truy vấn của chúng tôi sẽ thay đổi và kết quả là chúng tôi sẽ nhận được thông tin chi tiết về người dùng mạng systemd:
Nếu chúng ta muốn khai thác lỗ hổng này, chúng ta phải lấy dữ liệu từ các bảng khác. Điều này tương tự như lỗ hổng SQL Injection mặc định. Tất cả những gì chúng ta cần là:
  • Số cột cho truy vấn
  • Các tên bảng
Chúng tôi cần một số cột cho một cuộc tấn công dựa trên UNION. Trong osquery, chúng ta có thể truy cập dữ liệu từ nhiều bảng bằng cách sử dụng mệnh đề UNION. Điều kiện duy nhất là số cột trong mỗi hai truy vấn mà chúng tôi kết hợp phải bằng nhau.

LẤY THÔNG TIN SỐ CỘT

Như trong các truy vấn SQL chuẩn, mệnh đề ORDER BY cũng có sẵn trong osquery. Thông thường, nó được sử dụng để sắp xếp các kết quả theo một tên cột được chỉ định, chẳng hạn như tên ORDER BY.

Tuy nhiên, vì bạn có thể chỉ định một số thay vì một tên cột, mệnh đề này đặc biệt thú vị cho việc tiêm SQL. Số này tương ứng với vị trí của một cột trong danh sách lựa chọn. Và, giống như trong một SQL Injection, chúng ta có thể sử dụng hành vi này để xác định số lượng các cột sử dụng mệnh đề ORDER BY trong quá trình tiêm osquery của chúng ta.

Nếu bạn lạm dụng hành vi này trong một lần tiêm SQL, bạn thường sẽ nhập một số lớn ngay sau mệnh đề ORDER BY. Ví dụ có thể là ORDER BY 50. Nếu số này quá lớn, bạn sẽ nhận được phản hồi, chẳng hạn như lỗi, trang trống hoặc nội dung bị thiếu. Sau đó, bạn sẽ chia giá trị ban đầu cho hai và thử lại. Trong ví dụ của chúng tôi: ORDER BY 25. Lặp lại quá trình này nhiều lần, mặc dù tẻ nhạt, sẽ giúp bạn khám phá đúng số cột.

Trong osquery, tình hình tốt hơn nhiều so với quan điểm của kẻ tấn công. Thứ hai, chúng tôi gửi một số lớn hơn số cột thực tế, nó ngay lập tức cung cấp cho chúng tôi số cột. Bạn có thể thấy điều này trong ví dụ dưới đây:
http://{docker_ip_adress}:35275/?username=systemd-network’ ORDER BY 999 --
Chúng tôi đã gửi giá trị 999 trong mệnh đề ORDER BY (xem hình ảnh). Nó trả về thông báo sau:
Vì giá trị ORDER BY mà chúng tôi cần gửi chỉ có thể nằm trong khoảng từ 1 đến 2, chúng tôi có thể giả định rằng số cột của chúng tôi là 2.

Dấu gạch ngang kép (–) được bao gồm ở cuối một số truy vấn này chỉ đơn giản là cách để bắt đầu nhận xét. Điều này có hiệu quả loại bỏ bất kỳ phần nào của truy vấn theo sau dấu gạch ngang kép.
http://{docker_ip_adress}:35275/?username=systemd-network’ union select 1,2 from processes --
Trong ảnh chụp màn hình, chúng ta có thể thấy rằng hai cột bổ sung được in dưới dạng đầu ra.

TÌM KIẾM TÊN BẢNG 

Tìm tên bảng là một nhiệm vụ dễ dàng hơn nhiều so với việc tìm số đếm cột. Điều này là do các bảng được xác định trước và chúng đã được công bố sẵng tại địa chỉ sau:
https://osquery.io/schema/2.11.2
Thật không may, không có cách nào để tìm các bảng tùy chỉnh đã được thêm vào sau đó. Trong một tiêm MySQL, bạn có thể truy cập các tên bảng thông qua information_schema. Tuy nhiên, không có cấu trúc như vậy cho tên bảng trong osquery.

TRUY CẬP VÀO CÁC TÊN BẢN KHÁC 

Để phát hiện hệ điều hành và phiên bản hệ điều hành mà osquery đang làm việc, chúng tôi gửi một truy vấn như sau:
http://{docker_ip_adress}:35275/?username=systemd-network’ union select build_platform,version from osquery_info --
Để tìm hiểu tiến trình nào đang chạy trên hệ thống, chúng tôi gửi một truy vấn như sau:
http://{docker_ip_adress}:35275/?username=systemd-network’ union select cmdline,path from processes --
Để tìm các PID của các cổng lắng nghe và các dịch vụ lắng nghe cổng, chúng tôi gửi một truy vấn như sau:
http://{docker_ip_adress}:35275/?username=systemd-network’ union select pid,port from listening_ports --
Để tìm hiểu tất cả người dùng trong hệ thống, chúng tôi có thể gửi truy vấn sau:
Tuy nhiên, vì truy vấn của chúng tôi sử dụng để truy vấn thông tin người dùng sẽ ngắn gọn như sau:
http://{docker_ip_adress}:35275/?username=systemd-network’ or 1=1 --