Zabbix SQL Injection.RCE

网友投稿 789 2023-03-14

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

Zabbix SQL Injection.RCE

0x00 背景

该漏洞于2013年9月11号提交,9月23号得到确认,10月2号发布补丁。

新出的0day,可以通过sql注入直接进入后台,并执行系统命令。

该漏洞已有metasploit利用模块,请使用Zabbix的公司注意及时打补丁。

0x01 利用细节

这是由于Zabbix预先设定了一个guest用户,未登录用户都被设定为guest用户的访问权限。

可以在管理员的管理面板中禁用guest用户。

从下图中可以看出来applications参数存在sql注入。

查看源代码:

进入了$application变量中,跟踪add2favorites函数:

#!phpfunction add2favorites($favobj, $favid, $source = null) {      $favorites = get_favorites($favobj);      foreach ($favorites as $favorite) {           if ($favorite['source'] == $source && $favorite['value'] == $favid) {           return true;           }      }      DBstart();      $values = array(           'profileid' => get_dbid('profiles', 'profileid'),           'userid' => CWebUser::$data['userid'],           'idx' => zbx_dbstr($favobj),           'value_id' => $favid,          'type' => PROFILE_TYPE_ID );

#!phpfunction add2favorites($favobj, $favid, $source = null) { $favorites = get_favorites($favobj); foreach ($favorites as $favorite) { if ($favorite['source'] == $source && $favorite['value'] == $favid) { return true; } } DBstart(); $values = array( 'profileid' => get_dbid('profiles', 'profileid'), 'userid' => CWebUser::$data['userid'], 'idx' => zbx_dbstr($favobj), 'value_id' => $favid, 'type' => PROFILE_TYPE_ID );

进入$values数组的value_id中,再往下跟踪就可以发现变量没有经过任何过滤进入到sql语句中:

#!phpreturn DBend(DBexecute('INSERT INTO profiles ('.implode(', ', array_keys($values)).') VALUES ('.implode(', ', $values).')'));

#!phpreturn DBend(DBexecute('INSERT INTO profiles ('.implode(', ', array_keys($values)).') VALUES ('.implode(', ', $values).')'));

最新,Zabbix的补丁:

#!phpIndex: frontends/php/include/profiles.inc.php===================================================================--- frontends/php/include/profiles.inc.php  (revision 38884)+++ frontends/php/include/profiles.inc.php  (working copy)@@ -148,9 +148,9 @@            'profileid' => get_dbid('profiles', 'profileid'),            'userid' => self::$userDetails['userid'],            'idx' => zbx_dbstr($idx),-           $value_type => ($value_type == 'value_str') ? zbx_dbstr($value) : $value,-           'type' => $type,-           'idx2' => $idx2+           $value_type => zbx_dbstr($value),+           'type' => zbx_dbstr($type),+           'idx2' => zbx_dbstr($idx2)        );        return DBexecute('INSERT INTO profiles ('.implode(', ', array_keys($values)).') VALUES ('.implode(', ', $values).')');// string value prepearingif (isset($DB['TYPE']) && $DB['TYPE'] == ZBX_DB_MYSQL) {    function zbx_dbstr($var) {        if (is_array($var)) {            foreach ($var as $vnum => $value) {                $var[$vnum] = "'".mysql_real_escape_string($value)."'";            }            return $var;        }        return "'".mysql_real_escape_string($var)."'";    }

#!phpIndex: frontends/php/include/profiles.inc.php===================================================================--- frontends/php/include/profiles.inc.php (revision 38884)+++ frontends/php/include/profiles.inc.php (working copy)@@ -148,9 +148,9 @@ 'profileid' => get_dbid('profiles', 'profileid'), 'userid' => self::$userDetails['userid'], 'idx' => zbx_dbstr($idx),- $value_type => ($value_type == 'value_str') ? zbx_dbstr($value) : $value,- 'type' => $type,- 'idx2' => $idx2+ $value_type => zbx_dbstr($value),+ 'type' => zbx_dbstr($type),+ 'idx2' => zbx_dbstr($idx2) ); return DBexecute('INSERT INTO profiles ('.implode(', ', array_keys($values)).') VALUES ('.implode(', ', $values).')');// string value prepearingif (isset($DB['TYPE']) && $DB['TYPE'] == ZBX_DB_MYSQL) { function zbx_dbstr($var) { if (is_array($var)) { foreach ($var as $vnum => $value) { $var[$vnum] = "'".mysql_real_escape_string($value)."'"; } return $var; } return "'".mysql_real_escape_string($var)."'"; }

变量处理经过了一层mysql_real_escape_string函数的过滤。

在上面那个漏洞中,下面的语句可以读取管理员的用户名与密码md5的hash值:

成功获取,但是如果管理员的密码过于复杂,md5碰撞不出来明文的怎么办呢?

下图展示了数据库中sessions表保存的内容:

那我们直接注入获取管理员的session值,直接登录吧,无需碰撞md5的hash了。

用获取到的session替换cookie中zbx_sessionid中的值:

然后就登陆成功:

管理员进入后可以命令执行具体方法wooyun上已经有了:

WooYun: sohu的zabbix,可导致内网渗透

也可以直接反弹shell执行命令方便很多,具体姿势可以参考:

反弹shell的十种姿势

上一篇:智能运维包含哪些技术(智能运维包含哪些技术方面)
下一篇:驻波告警如何处理(驻波会有什么影响)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~