PaloAlto远程命令执行漏洞关键技术分析终篇
这篇文章是对Palo Alto防火墙产品未授权远程代码执行漏洞(CVE-2017-15944 )中SESSION设置、任意目录创建、命令执行漏洞的技术分析。之前对该漏洞认证绕过部分进行了介绍,这篇文章是该漏洞的后续部分。
(一)SESSION设置
在认证绕过漏洞中,需要通过访问https://ip/esp/cms_changeDeviceContext.esp来设置SESSION中的user变量。在cms_changeDeviceContext.esp中,调用了panUserSetDeviceLocation($_SESSION['user'], $_GET['device'], 0, new php_string_argout()),这个函数的实现在/usr/lib/php/modules/panmodule.so中。下面通过调试该函数,来分析SESSION变量的设置。访问https://ip/esp/cms_changeDeviceContext.esp?device=4096:aaaaaaaa:bbbbbbbb,进入panUserSetDeviceLocation函数:
1、deviceStr指针指向的字符串就是传入的URL参数device的值:”4096:aaaaaaaa:bbbbbbbb”
2、调用panPhpConvertStringToLoc(char* deviceStr, pan_swal_config_loc_t* pLoc)函数,将deviceStr进行处理后存储在pLoc中,处理的主要逻辑如下:
1) 寻找第一个’:'字符,将第一个’:'之前的字符串按照十进制转化为整数dNumber;
2)寻找第二个’:'字符,将第一个’:'与第二个’:'之间的字符串deviceName(多余20h个,自动截断)复制在4-24h字节处;
3)寻找第三个’:'字符,将第二个’:'与第三个’:'之间的字符串str2(多余20h个,自动截断)复制在24h-44h字节处;
4)如果有,继续寻找后面’:'字符,将第n个’:'与第n+1个’:'之间的字符串strn(多余20h个,自动截断)复制在24h-44h字节处,覆盖原来的数据最后pLoc的结构如下:
3、调用panPhpSetDeviceForSession(pan_char_t *cookie, pan_char_t *devName, pan_char_t *errMsgBuf, pan_uint32_t bufSize)函数,参数devName字符串就是pLoc结构中的devName字符串,在该输入中,为”aaaaaaaa”。panPhpSetDeviceForSession调用panPhpSetDeviceAndVsysForSession(pan_char_t *cookie, pan_char_t *devName, pan_char_t *vsysName, pan_char_t *errMsgBuf, pan_uint32_t bufSize),参数devName字符串就是pLoc结构中的devName字符串,在该输入中为”aaaaaaaa”;参数vsysName字符串为“vsys1”。
panPhpSetDeviceAndVsysForSession的关键处理逻辑如下:
1)调用panPhpConvertLocToString,返回“8:aaaaaaaa”
2)通过panPhpSetSessionVar函数,将session变量dloc设置为“8:aaaaaaaa”
3)通过panPhpSetSessionVar函数,将session变量loc设置为“16:aaaaaaaa:vsys1”
4、根据上述分析,如果像上篇文章(http://www.freebuf.com/articles/es/159119.html)一样,输入https://ip/esp/cms_changeDeviceContext.esp ?device=aaaa:bbbb’”;user|s: ,则dloc的数值为 8:bbbb’”;user|s,loc的数值为16:bbbb’”;user|s:vsys1,读取的session的数值为 dloc|s:15:8:bbbb’”;user|s”;loc|s:22:”16:bbbb’”;user|s:vsys1″;
(二)任意目录创建
向https://ip/php/utils/router.php/Administrator.get利用POST方式提交如下数据:
{"action":"PanDirect","method":"execute","data":["07c5807d0d927dcd0980f86024e5208b","Administrator.get",{"changeMyPassword":true,"template":"asd","id":"admin']\" async-mode='yes' refresh='yes' cookie='../../../../../../tmp/hacked'/>\u0000"}],"type":"rpc","tid":713}
会创建/tmp/hacked文件,下面对原理进行分析:
1、router.php文件中定义了ExtDirect_Router类,该类继承自RouterAbstract
2、router.php新建ExtDirect_Router对象,并依次调用getResponse()=>>dispatch(),在dispatch中对POST提交的数据进行JSON处理,收到的POST数据为:
{"action":"PanDirect","method":"execute","data":["07c5807d0d927dcd0980f86024e5208b","Administrator.get",{"changeMyPassword":true,"template":"asd","id":"admin']\" async-mode='yes' refresh='yes' cookie='../../../../../../tmp/hacked'/>\u0000"}],"type":"rpc","tid":713}
处理之后赋值给request变量,requet变量的数值如下:
3、将request变量提交给rpc($request)函数,在rpc函数中通过call_user_func_array(array($instance,$method), $params)调用PanDirect->execute($params)
这篇文章是对Palo Alto防火墙产品未授权远程代码执行漏洞(CVE-2017-15944 )中SESSION设置、任意目录创建、命令执行漏洞的技术分析。之前对该漏洞认证绕过部分进行了介绍,这篇文章是该漏洞的后续部分。
(一)SESSION设置
在认证绕过漏洞中,需要通过访问https://ip/esp/cms_changeDeviceContext.esp来设置SESSION中的user变量。在cms_changeDeviceContext.esp中,调用了panUserSetDeviceLocation($_SESSION['user'], $_GET['device'], 0, new php_string_argout()),这个函数的实现在/usr/lib/php/modules/panmodule.so中。下面通过调试该函数,来分析SESSION变量的设置。访问https://ip/esp/cms_changeDeviceContext.esp?device=4096:aaaaaaaa:bbbbbbbb,进入panUserSetDeviceLocation函数:
1、deviceStr指针指向的字符串就是传入的URL参数device的值:”4096:aaaaaaaa:bbbbbbbb”
2、调用panPhpConvertStringToLoc(char* deviceStr, pan_swal_config_loc_t* pLoc)函数,将deviceStr进行处理后存储在pLoc中,处理的主要逻辑如下:
1) 寻找第一个’:'字符,将第一个’:'之前的字符串按照十进制转化为整数dNumber;
2)寻找第二个’:'字符,将第一个’:'与第二个’:'之间的字符串deviceName(多余20h个,自动截断)复制在4-24h字节处;
3)寻找第三个’:'字符,将第二个’:'与第三个’:'之间的字符串str2(多余20h个,自动截断)复制在24h-44h字节处;
4)如果有,继续寻找后面’:'字符,将第n个’:'与第n+1个’:'之间的字符串strn(多余20h个,自动截断)复制在24h-44h字节处,覆盖原来的数据最后pLoc的结构如下:
3、调用panPhpSetDeviceForSession(pan_char_t *cookie, pan_char_t *devName, pan_char_t *errMsgBuf, pan_uint32_t bufSize)函数,参数devName字符串就是pLoc结构中的devName字符串,在该输入中,为”aaaaaaaa”。panPhpSetDeviceForSession调用panPhpSetDeviceAndVsysForSession(pan_char_t *cookie, pan_char_t *devName, pan_char_t *vsysName, pan_char_t *errMsgBuf, pan_uint32_t bufSize),参数devName字符串就是pLoc结构中的devName字符串,在该输入中为”aaaaaaaa”;参数vsysName字符串为“vsys1”。 www.wnhack.com
panPhpSetDeviceAndVsysForSession的关键处理逻辑如下:
1)调用panPhpConvertLocToString,返回“8:aaaaaaaa”
2)通过panPhpSetSessionVar函数,将session变量dloc设置为“8:aaaaaaaa”
3)通过panPhpSetSessionVar函数,将session变量loc设置为“16:aaaaaaaa:vsys1”
4、根据上述分析,如果像上篇文章(http://www.freebuf.com/articles/es/159119.html)一样,输入https://ip/esp/cms_changeDeviceContext.esp ?device=aaaa:bbbb’”;user|s: ,则dloc的数值为 8:bbbb’”;user|s,loc的数值为16:bbbb’”;user|s:vsys1,读取的session的数值为 dloc|s:15:8:bbbb’”;user|s”;loc|s:22:”16:bbbb’”;user|s:vsys1″;
(二)任意目录创建
向https://ip/php/utils/router.php/Administrator.get利用POST方式提交如下数据:
{"action":"PanDirect","method":"execute","data":["07c5807d0d927dcd0980f86024e5208b","Administrator.get",{"changeMyPassword":true,"template":"asd","id":"admin']\" async-mode='yes' refresh='yes' cookie='../../../../../../tmp/hacked'/>\u0000"}],"type":"rpc","tid":713}
会创建/tmp/hacked文件,下面对原理进行分析:
1、router.php文件中定义了ExtDirect_Router类,该类继承自RouterAbstract
2、router.php新建ExtDirect_Router对象,并依次调用getResponse()=>>dispatch(),在dispatch中对POST提交的数据进行JSON处理,收到的POST数据为:
{"action":"PanDirect","method":"execute","data":["07c5807d0d927dcd0980f86024e5208b","Administrator.get",{"changeMyPassword":true,"template":"asd","id":"admin']\" async-mode='yes' refresh='yes' cookie='../../../../../../tmp/hacked'/>\u0000"}],"type":"rpc","tid":713}
处理之后赋值给request变量,requet变量的数值如下:
3、将request变量提交给rpc($request)函数,在rpc函数中通过call_user_func_array(array($instance,$method), $params)调用PanDirect->execute($params)
内容来自无奈安全网
本文来自无奈人生安全网