在今天的Web应用测试中,我发现可以向SNMP配置文件中注入任意内容,并让服务使用更新后的文件重启。由于我可以通过Web界面更改团体字符串并允许任意IP地址访问,起初我认为这是一个有趣但低级别的发现。幸运的是,我向Sandro Gauci提到了这个问题,他说他听说在某些情况下可以让SNMP服务器运行Shell命令。这听起来比仅仅在配置文件中添加几行要有趣得多,所以我开始深入研究。
我知道服务器运行的是Debian(是的,那些低级别的信息泄露确实派上用场了!),这意味着它可能运行标准的Net-SNMP包。经过一番搜索,我找到了这篇非常有用的博客文章:使用Shell脚本扩展snmpd。
我最初要处理的配置文件相当基础:
|
|
我能够向其中添加新条目,为不同的IP地址或范围提供自己的团体字符串:
|
|
根据我读到的博客文章,我想要添加的行基于以下内容:
|
|
这告诉snmp服务,当被请求扩展信息时,运行echo命令,然后使用扩展参数名称test返回其输出。基于此,我提交了以下新条目:
|
|
中间的%0a%0d被解码为换行和回车,在配置文件中给了我这样的内容:
|
|
完美,现在连接到服务器看看是否有效:
|
|
没有成功,我得到了这个错误:
|
|
经过大量搜索,我找到了这篇文章:在Ubuntu和Debian上安装net-snmp MIBs,解释了由于许可问题,Ubuntu只附带了一部分可用的MIB,要使用完整集合,必须安装额外的包并更新客户端配置文件。完成这些后,我再次尝试:
|
|
成功了,MIB更新有效,echo命令也运行了,我得到了输出。如果除了这个输出外,你还得到一堆以这行开头的错误:
|
|
不用担心,它似乎不影响我们在这里的操作。如果你想修复它,这篇文章告诉你怎么做:如何修复net-snmp / snmpwalk错误。
现在剩下的就是获取一个Shell。幸运的是,Debian附带的Netcat包是具有-e参数的版本(再次说明,信息泄露很棒,一些发行版附带的版本没有-e,所以你需要使用不同的技术)。使用这个,我向配置中注入了一个简单的反向Shell命令,设置了我的监听器,并重新运行了snmpwalk命令。这是最终的snmp.conf文件:
|
|
Netcat监听器:
|
|
触发它的snmpwalk命令:
|
|
这里的超时是预期的,处理请求的snmp线程启动Shell并不返回,所以客户端放弃等待并超时。
最后一个注意事项,snmp服务没有设置PATH,所以所有命令和文件必须使用绝对路径,例如/bin/nc,而不仅仅是nc。
在家玩
在你自己的实验室中设置这个相当简单。为了测试这篇文章的内容,我启动了一个Debian虚拟机,通过apt安装了snmpd包,然后将默认配置文件削减到我在客户机器上开始时的样子。假设你从攻击者机器有连接性,这就是你所需要的。只需记住在开始更改之前用snmpwalk测试基本设置,以确保一切正常。
防御
似乎没有关于团体字符串中可以使用哪些字符的正式定义,但各种公司已经定义了自己的标准。大多数允许标准的字母数字字符集加上一些符号选择,虽然我通常不赞成限制字符集,但在这里这样做似乎是合理的,只要你不要太严格。一旦你定义了字符集,编写正则表达式检查输入就是一项简单的工作。
另一种方法是剥离或编码已知的不良字符,例如换行符。这样做的问题是你必须考虑所有可能的不良字符,如果你漏掉一个,攻击者就可以利用它来对付你。话虽如此,添加一个剥离换行符的调用不会增加显著的开销,并且在这种情况下可以保护客户。
就是这样,从一个简单的文件注入到Shell,希望你喜欢。