1. 개요

- 독일 아테네국립응용사이버보안연구센터에서 DNS 보안 프로토콜 DNSSEC의 설계 결함을 악용한 KeyTrap (CVE-2023-50387) 발견 [1]
- 단일 DNS 패킷을 전송하여 서비스 거부를 유발할 수 있음
취약한 DNS의 경우 최소 170초에서 최대 16시간 동안 서비스 거부 발생

 

2. 주요내용

2.1 DNSSEC(Domain Name System Security Extension) [2][3]

- DNS는 도메인(hxxps://example[.]com)을 IP 주소(1.1.1.1)로 변환하는 역할
> 초기 설계시 보안성을 충분히 고려하지 못해 DNS 정보 위-변조가 가능하다는 문제 존재 Ex. DNS Cache Poisoning

 

- 기존 DNS 보안성을 강화하기 위해 공개키 암호화 방식의 보안기능을 추가한 DNSSEC(DNS Security Extensions) 도입
> DNS를 대체하는 것이 아님

 

2.2 KeyTrap(CVE-2023-50387) [4]

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

 

DNSSEC 설계 결함으로 인해 DNS 서버에 서비스 거부를 유발할 수 있는 취약점
> DNSKEY 및 RRSIG 레코드가 여러개일 경우 프로토콜 사양에 따라 모든 조합에 대한 유효성 검사를 수행

 

- 취약점과 관련된 세 가지 DNSSEC 설계 문제
① 여러 개의 서로 다른 DNS 키가 동일한 키 태그를 가질 수 있어 서명 유효성 검사 프로세스에 계산 부하 발생 가능
② 서명을 성공적으로 검증하는 키를 찾거나 모든 키가 시도될 때까지 모든 키를 시도해야 하므로(가용성 보장 목적) 계산 부하 발생 가능
③ 동일한 레코드에 여러 서명이 있는 경우 유효한 서명을 찾거나 모든 서명이 시도될 때까지 수신된 모든 서명을 검증해야 하므로, 계산 부하 발생 가능

 

- 영향받는 버전

[사진 2] 취약한 DNS 구성

 

2.2.1 SigJam (하나의 키 X 다수 서명)

DNS Resolve가 하나의 DNS 키를 사용하여 DNS 레코드에 존재하는 다수의 유효하지 않은 서명을 검증하도록 유도
> DNS Resolve가 DNSKEY로 검증할 수 있는 서명을 찾을 때까지 모든 서명을 시도하도록 설계 됨
> 공격자는 단일 DNS 응답에 340개의 서명을 작성할 수 있음
> 340개의 서명에 대한 유효성 검증을 수행한 후 DNS Reolve는 클라이언트에 SERVFAIL를 반환

 

2.2.2 LockCram (다수의 키 X 하나의 서명)

DNS Resolve가 ZSK DNSSEC키를 사용하여 DNS 레코드를 통해 하나의 서명을 검증하도록 유도
> DNS Resolve가 하나의 키가 검증되거나 모두 시도될 때까지 서명에 사용할 수 있는 모든 키를 시도하도록 설계 됨
> DNS Resolve는 서명을 검증하기 위해 모든 DNSSEC 키를 사용
> 해당 서명이 유효하지 않다고 결론을 내릴 때까지 서명이 참조하는 모든 키를 시도

 

2.2.3 KeySigTrap (다수의 키 X 다수의 서명)

SigJam과 LockCram를 결합하여 검증 과정이 2배 증가하는 공격

> 모든 키와 서명 쌍이 검증될 때까지, 가능한 모든 조합에 대해 검증을 시도

Ex. 첫 번째 ZSK를 사용해 N개 서명을 검증한 후, 두 번째 ZSK를 사용해 N개 서명을 검증하여 N번째 ZSK를 사용해 N개 서명을 검증

> 모든 조합 시도 후 레코드를 검증할 수 없다는 결론을 내리고 클라이언트에 SERVFAIL를 반환

 

2.2.4 HashTrap (다수의 키 X 다수의 해시)

- 다수의 DS 해시 레코드에 대해 충동하는 다수의 DNSKEY를 검증하기 위해 많은 해시를 계산하도록 유도

 

 

[사진 3] KeyTrap 공격에 의한 서비스 거부 시간

 

3. 대응방안

- 벤더사 제공 패치 제공
> 현재까지 나온 패치는 임시 조치
> DNSSEC 설계를 처음부터 다시 해야 문제가 해결될 것

 

- DNSSEC 기능 비활성화시 취약점이 근본적으로 사라지나 권장하지 않음
> KeyTrap 취약점을 제외하면 DNSSEC로부터 얻는 안전의 이득이 훨씬 많음

 

4. 참고

[1] https://www.athene-center.de/en/keytrap
[2] https://xn--3e0bx5euxnjje69i70af08bea817g.xn--3e0b707e/jsp/resources/dns/dnssecInfo/dnssecInfo.jsp
[3] https://medium.com/iocscan/how-dnssec-works-9c652257be0
[4] https://nvd.nist.gov/vuln/detail/CVE-2023-50387
[5] https://www.boannews.com/media/view.asp?idx=126791
[6] https://www.boannews.com/media/view.asp?idx=126911

'취약점 > Denial of Service' 카테고리의 다른 글

CONTINUATION Flood  (0) 2024.04.07
Loop DoS (CVE-2024-2169)  (0) 2024.03.23
SLP DRDoS (CVE-2023-29552)  (0) 2023.11.13
HTTP/2 Rapid Reset DDoS (CVE-2023-44487)  (0) 2023.10.13
2009.07.07 DDoS  (0) 2023.07.06

1. HTTP/2 [1]

- 2015년 IETF에 의해 공식적으로 발표된 HTTP/1.1의 후속 버전

구분 설명
HTTP/1.0 - 하나의 Connection하나의 요청을 처리하도록 설계
- 서버에 요청시 매번 연결/해제 과정을 반복해야 했으므로 RTT가 오래 걸리는 단점이 존재 (≒ 속도가 느리다)
> RTT(Round Trip Time): 패킷이 왕복하는데 걸린 시간
HTTP/1.1 - Persistent Connection: 매번 Connection을 생성하지 않고, keep-alive 옵션을 이용해 일정 시간동안 연결 유지
- Pipelining: 클라이언트는 앞 요청의 응답을 기다리지 않고, 순차적으로 요청을 전송하며 서버는 요청이 들어온 순서대로 응답
- HOL Blocking (Head Of Line Blocking): 앞의 요청에 대한 응답이 늦어지면 뒤의 모든 요청들 또한 지연이 발생
- 무거운 Header 구조: 매 요청마다 중복된 헤더 값을 전송하여, 헤더 크기가 증가하는 문제
HTTP/2 - 구글의 비표준 개방형 네트워크 프로토콜 SPDY 기반
- Multiplexed Streams: 하나의 Connection을 통해 여러 데이터 요청을 병렬로 전송할 수 있음, 응답의 경우 순서 상관없이 Stream으로 전송
- Header 압축: 이전 요청에 사용된 헤더 목록을 유지관리하여 헤더 정보를 구성
- Binary protocol: 복잡성 감소, 단순한 명령어 구현 등
- Server Push: 요청되지 않았지만 향후 예상되는 추가 정보를 클라이언트에 전송할 수 있음
- Stream Prioritization: 리소스간 의존관계에 따른 우선순위를 설정하여 리소스 로드 문제 해결
- HOL Blocking (Head Of Line Blocking): 앞의 요청에 대한 응답이 늦어지면 뒤의 모든 요청들 또한 지연이 발생
HTTP/3 - QUIC라는 계층 위에서 동작하며 UDP 기반
- UDP 기반이기 때문에 RTT 감소 및 HOL Blocking 문제를 극복

 

2. 취약점

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

- HTTP/2의 구조적 문제를 악용해 서비스 거부를 유발 시키는 제로데이 취약점

- 해당 취약점을 악용할 경우 DDoS 공격 규모는 약 2억 100만 RPS

> 종전 기록은 7100만 RPS

 

2.1 취약점 상세

- HTTP/2는 HTTP/1.1의 순차처리 방식의 단점을 보완Multiplexed Streams을 지원

> HTTP/1.1에서는 각 요청이 순차적으로 처리되어 비효율적이며, 지연 시간이 늘어나는 단점이 있음

> HTTP/2는 하나의 Connection상에서 동시에 여러 개의 요청을 보내 문제점을 개선

※ HTTP/2에서 Stream ID를 이용해 데이터를 처리하므로 동시에 여러 데이터를 병렬 처리가 가능함

 

[사진 2] HTTP/1.1(위) HTTP/2(아래) 동작 방식 비교 [3]

 

- 또한, 클라이언트나 서버는 RST_STREAM 스트림을 전송함으로써 스트림을 취소할 수 있는 기능이 존재

> RST_STREAM을 이용해 불필요한 작업이 발생하는 것을 방지할 수 있음

> 잘못된 요청 또는 불필요 데이터 요청 등을 취소하고 빠르게 재설정할 수 있도록 하므로 Rapid Reset으로 불림

 

- 서버는 MAX_CONCURRENT_STREAMS 값을 설정하여, 서버에서 처리 가능한 스트림의 양을 명시

> 해당 값을 초과하는 요청이 발생하면, RST_STREAM을 발생시키고 요청을 거절

※ Stream을 지속적으로 보내 서버의 자원을 고갈시키는 단순한 유형의 DDoS 대응책으로 판단됨

 

- 공격자는 스트림을 요청한 후 바로 RST_STREAM을 요청하여 DDoS를 유발

> MAX_CONCURRENT_STREAMS 값을 초과하지 않기 때문에, 우회가 가능함

> 즉, MAX_CONCURRENT_STREAMS 값 이상의 스트림을 보낼 수 있음

[사진 4] HTTP/2 Rapid Reset DDoS 요약 [4]

 

2.2 PoC [5]

① 웹 서버가 HTTP/2 요청을 다운그레이드하지 않고 수락하는지 확인

② 웹 서버가 HTTP/2 요청을 수락하고 다운그레이드하지 않을 경우, 연결 스트림을 열고 재설정 시도

③ 웹 서버가 연결 스트림의 생성 및 재설정을 수락하는 경우 취약점의 영향을 받음

#!/usr/bin/env python3

import ssl
import sys
import csv
import socket
import argparse

from datetime import datetime
from urllib.parse import urlparse
from http.client import HTTPConnection, HTTPSConnection

from h2.connection import H2Connection
from h2.config import H2Configuration

import httpx
import requests

def get_source_ips(proxies):
    """
    Retrieve the internal and external IP addresses of the machine.
    
    Accepts:
        proxies (dict): A dictionary of proxies to use for the requests.
    
    Returns:
        tuple: (internal_ip, external_ip)
    """
    try:
        response = requests.get('http://ifconfig.me', timeout=5, proxies=proxies)
        external_ip = response.text.strip()

        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.settimeout(2)
        try:
            s.connect(('8.8.8.8', 1))
            internal_ip = s.getsockname()[0]
        except socket.timeout:
            internal_ip = '127.0.0.1'
        except Exception as e:
            internal_ip = '127.0.0.1'
        finally:
            s.close()
        
        return internal_ip, external_ip
    except requests.exceptions.Timeout:
        print("External IP request timed out.")
        return None, None
    except Exception as e:
        print(f"Error: {e}")
        return None, None
    
def check_http2_support(url, proxies):
    """
    Check if the given URL supports HTTP/2.
    
    Parameters:
        url (str): The URL to check.
        proxies (dict): A dictionary of proxies to use for the requests.
        
    Returns:
        tuple: (status, error/version)
        status: 1 if HTTP/2 is supported, 0 otherwise, -1 on error.
        error/version: Error message or HTTP version if not HTTP/2.
    """
    try:
        # Update the proxies dictionary locally within this function
        local_proxies = {}
        if proxies:
            local_proxies = {
                'http://': proxies['http'],
                'https://': proxies['https'],
            }
        
        # Use the proxy if set, otherwise don't
        client_options = {'http2': True, 'verify': False}  # Ignore SSL verification
        if local_proxies:
            client_options['proxies'] = local_proxies
        
        with httpx.Client(**client_options) as client:
            response = client.get(url)
        
        if response.http_version == 'HTTP/2':
            return (1, "")
        else:
            return (0, f"{response.http_version}")
    except Exception as e:
        return (-1, f"check_http2_support - {e}")

def send_rst_stream_h2(host, port, stream_id, uri_path='/', timeout=5, proxy=None):
    """
    Send an RST_STREAM frame to the given host and port.
    
    Parameters:
        host (str): The hostname.
        port (int): The port number.
        stream_id (int): The stream ID to reset.
        uri_path (str): The URI path for the GET request.
        timeout (int): The timeout in seconds for the socket connection.
        proxy (str): The proxy URL, if any.
        
    Returns:
        tuple: (status, message)
        status: 1 if successful, 0 if no response, -1 otherwise.
        message: Additional information or error message.
    """
    try:
        # Create an SSL context to ignore SSL certificate verification
        ssl_context = ssl.create_default_context()
        ssl_context.check_hostname = False
        ssl_context.verify_mode = ssl.CERT_NONE

        # Create a connection based on whether a proxy is used
        if proxy and proxy != "":
            proxy_parts = urlparse(proxy)
            if port == 443:
                conn = HTTPSConnection(proxy_parts.hostname, proxy_parts.port, timeout=timeout, context=ssl_context)
                conn.set_tunnel(host, port)
            else:
                conn = HTTPConnection(proxy_parts.hostname, proxy_parts.port, timeout=timeout)
                conn.set_tunnel(host, port)
        else:
            if port == 443:
                conn = HTTPSConnection(host, port, timeout=timeout, context=ssl_context)
            else:
                conn = HTTPConnection(host, port, timeout=timeout)

        conn.connect()

        # Initiate HTTP/2 connection
        config = H2Configuration(client_side=True)
        h2_conn = H2Connection(config=config)
        h2_conn.initiate_connection()
        conn.send(h2_conn.data_to_send())

        # Send GET request headers
        headers = [(':method', 'GET'), (':authority', host), (':scheme', 'https'), (':path', uri_path)]
        h2_conn.send_headers(stream_id, headers)
        conn.send(h2_conn.data_to_send())

        # Listen for frames and send RST_STREAM when appropriate
        while True:
            data = conn.sock.recv(65535)
            if not data:
                break

            events = h2_conn.receive_data(data)
            has_sent = False
            for event in events:
                if hasattr(event, 'stream_id'):
                    if event.stream_id == stream_id:
                        h2_conn.reset_stream(event.stream_id)
                        conn.send(h2_conn.data_to_send())
                        has_sent = True
                        break # if we send the reset once we don't need to send it again because we at least know it worked

            if has_sent: # if we've already sent the reset, we can just break out of the loop
                return (1, "")
            else:
                # if we haven't sent the reset because we never found a stream_id matching the one we're looking for, we can just try to send to stream 1
                
                available_id = h2_conn.get_next_available_stream_id()
                if available_id == 0:
                    # if we can't get a new stream id, we can just send to stream 1
                    h2_conn.reset_stream(1)
                    conn.send(h2_conn.data_to_send())
                    return (0, "Able to send RST_STREAM to stream 1 but could not find any available stream ids")
                else:
                    # if we can get a new stream id, we can just send to that
                    h2_conn.reset_stream(available_id)
                    conn.send(h2_conn.data_to_send())
                    return (1, "")
                    
        conn.close()
        return (0, "No response")
    except Exception as e:
        return (-1, f"send_rst_stream_h2 - {e}")

def extract_hostname_port_uri(url):
    """
    Extract the hostname, port, and URI from a URL.
    
    Parameters:
        url (str): The URL to extract from.
        
    Returns:
        tuple: (hostname, port, uri)
    """
    try:
        parsed_url = urlparse(url)
        hostname = parsed_url.hostname
        port = parsed_url.port
        scheme = parsed_url.scheme
        uri = parsed_url.path  # Extracting the URI
        if uri == "":
            uri = "/"

        if not hostname:
            return -1, -1, ""

        if port:
            return hostname, port, uri

        if scheme == 'http':
            return hostname, 80, uri

        if scheme == 'https':
            return hostname, 443, uri

        return hostname, (80, 443), uri
    except Exception as e:
        return -1, -1, ""

if __name__ == "__main__":

    parser = argparse.ArgumentParser()
    parser.add_argument('-i', '--input', required=True)
    parser.add_argument('-o', '--output', default='/dev/stdout')
    parser.add_argument('--proxy', help='HTTP/HTTPS proxy URL', default=None)
    parser.add_argument('-v', '--verbose', action='store_true')
    args = parser.parse_args()

    proxies = {}
    if args.proxy:
        proxies = {
            'http': args.proxy,
            'https': args.proxy,
        }

    internal_ip, external_ip = get_source_ips(proxies)

    with open(args.input) as infile, open(args.output, 'w', newline='') as outfile:
        csv_writer = csv.writer(outfile)
        csv_writer.writerow(['Timestamp', 'Source Internal IP', 'Source External IP', 'URL', 'Vulnerability Status', 'Error/Downgrade Version'])
        
        for line in infile:
            addr = line.strip()
            if addr != "":
                now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                
                if args.verbose:
                    print(f"Checking {addr}...", file=sys.stderr)
                
                http2support, err = check_http2_support(addr, proxies)
                
                hostname, port, uri = extract_hostname_port_uri(addr)
                
                if http2support == 1:
                    resp, err2 = send_rst_stream_h2(hostname, port, 1, uri, proxy=args.proxy)
                    if resp == 1:
                        csv_writer.writerow([now, internal_ip, external_ip, addr, 'VULNERABLE', ''])
                    elif resp == -1:
                        csv_writer.writerow([now, internal_ip, external_ip, addr, 'POSSIBLE', f'Failed to send RST_STREAM: {err2}'])
                    elif resp == 0:
                        csv_writer.writerow([now, internal_ip, external_ip, addr, 'LIKELY', 'Got empty response to RST_STREAM request'])
                else:
                    if http2support == 0:
                        csv_writer.writerow([now, internal_ip, external_ip, addr, 'SAFE', f"Downgraded to {err}"])
                    else:
                        csv_writer.writerow([now, internal_ip, external_ip, addr, 'ERROR', err])

 

3. 대응방안

- 보안 업데이트 적용 [6]

종류 안전한 버전
NGINX 1.25.3 버전 이상
Apache HTTP Server nghttp2 1.57.0 버전 이상
Apache Tomcat 10.1.14 버전 이상
IIS 2023년 10월 10일 버전 업데이트 [7]
OpenResty 1.21.4.3 버전 이상

 

- 에러 로그 모니터링

> 알려진 연구에 따르면 공격 발생시 499, 502 에러가 발생되므로 관련 에러 로그 모니터링

※ 499: 클라이언트가 요청을 전송한 후 서버에 응답을 받기 전에 연결이 끊어진 경우 (강제 종료, 네트워크 문제 등의 경우)

※ 502: 게이트웨이가 잘못된 프로토콜을 연결하거나, 어느쪽 프로토콜에 문제가 있어 통신이 제대로 되지 않는 경우 (서버 과부하, 사용자 브라우저 이상, 잘못된 네트워크 연결 등의 경우)

 

- GOAWAY 프레임 전송

> HTTP/2에서 GOAWAY 프레임은 서버에서 발생되며, 연결 종료를 알리는 프레임

> RST_STREAM 발생 횟수를 카운트하여 해당 값이 임계 값을 초과하는 경우 GOAWAY 프레임 전송

 

- 관련 설정 값 수정 [6]

> F5 NGINX의 경우 최대 1000개의 연결을 유지하고, MAX_CONCURRENT_STREAMS 값을 128로 설정 하도록 권고

종류 설정 값
NGINX - http2_max_concurrent_streams 120
- keepalive_requests 1,000
Apache HTTP Server  H2MaxSessionStreams 120
Apache Tomcat  maxConcurrentStreams 120

 

- 공격 발생 IP 차단

 

- HTTP/2 미사용 또는 HTTP/3 고려

 

4. 참고

[1] https://github.com/dongkyun-dev/TIL/blob/master/web/HTTP1.1%EA%B3%BC%20HTTP2.0%2C%20%EA%B7%B8%EB%A6%AC%EA%B3%A0%20%EA%B0%84%EB%8B%A8%ED%95%9C%20HTTP3.0.md
[2] https://nvd.nist.gov/vuln/detail/CVE-2023-44487
[3] https://www.wallarm.com/what/what-is-http-2-and-how-is-it-different-from-http-1
[4] https://www.nginx.com/blog/http-2-rapid-reset-attack-impacting-f5-nginx-products/

[5] https://github.com/bcdannyboy/cve-2023-44487

[6] https://www.ncsc.go.kr:4018/main/cop/bbs/selectBoardArticle.do?bbsId=SecurityAdvice_main&nttId=107187#LINK

[7] https://msrc.microsoft.com/update-guide/vulnerability/CVE-2023-44487

[8] https://cloud.google.com/blog/products/identity-security/how-it-works-the-novel-http2-rapid-reset-ddos-attack?hl=en  
[9] https://blog.cloudflare.com/technical-breakdown-http2-rapid-reset-ddos-attack/
[10] https://www.cisa.gov/news-events/alerts/2023/10/10/http2-rapid-reset-vulnerability-cve-2023-44487
[11] https://www.rfc-editor.org/rfc/rfc9113
[12] https://www.securityweek.com/rapid-reset-zero-day-exploited-to-launch-largest-ddos-attacks-in-history/
[13] https://www.securityweek.com/organizations-respond-to-http-2-zero-day-exploited-for-ddos-attacks/
[14] https://www.helpnetsecurity.com/2023/10/10/cve-2023-44487-http-2-rapid-reset/
[15] https://www.boannews.com/media/view.asp?idx=122547&page=1&kind=1 

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. 개요

- 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(아랍 뉴스)를 공격하여 서비스 중단 발생

요약 - 6월 초 MS의 아웃룩과 클라우드 서비스에서 발생한 일시적 마비 현상의 원인은 DDoS
- MS의 조사 발표에 따르면 어나니머스 수단(Anonymous Sudan)에 의해 발생한 것으로 확인
내용 - 최근 MS의 Azure, Outlook, OneDrive 웹 포털에서 DDoS에 의해 서비스 중단이 발생
> 23.06.07 Outlook / 23.06.08 OneDrive / 23.06.09 Azure 순으로 DDoS 발생
> MS는 문제 완화를 위해 로드밸런싱 프로세스를 적용하고 있다고 발표

- MS는 문제의 원인이 정전이라고 최초 발표했으나, 곧 Storm-1359로 추적되는 공격 그룹의 소행으로 발표
> 관련 DDoS 공격: HTTP(S) flood attacks, Cache bypass, Slowloris

- 핵티비스트 그룹 Anonymous Sudan은 텔레그램 채널에 글 게시
> 해당 그룹은 23.01 출범하여 수단에 반대하는 모든 국가에 대해 공격할 것이라고 경고
※ 일부 보안 연구원들은 러시아와 연결을 의심
> 미국 기업을 목표로 공격을 수행할 것이며, Microsoft에 DDoS 공격 수행을 주장
기타 - MS에 따르면 고객 데이터에 엑세스했거나 손상되었다는 증거는 없음
> DDoS 공격을 완화하기 위해 관련 보안을 강화

- Anonymous Sudan은 MS외에도 전 세계 조직 및 정부 기관을 대상으로 DDoS 수행
> DDoS 중지를 위해 금전을 요구하며, 데이터를 유출하기도 함

 

보안뉴스

 

MS, “6월초 있었던 아웃룩/클라우드 기능 장애는 사이버 공격에 의한 것”

보안 외신 시큐리티위크에 의하면 6월 초 MS의 아웃룩과 클라우드 서비스에서 발생한 일시적 마비 현상은 사이버 공격으로 인한 것이었다고 한다. 당시 어나니머스 수단(Anonymous Sudan)이라는 한

www.boannews.com

 

Microsoft confirms Azure, Outlook outages caused by DDoS attacks

Microsoft has confirmed that recent outages to Azure, Outlook, and OneDrive web portals resulted from Layer 7 DDoS attacks against the company's services.

www.bleepingcomputer.com

 

Microsoft: June Outlook and cloud platform outages were caused by DDoS

Microsoft confirmed that the recent outages to the Azure, Outlook, and OneDrive services were caused by cyber attacks. In early June, Microsoft suffered severe outages for some of its services, including Outlook email, OneDrive file-sharing apps, and the c

securityaffairs.com

 

침해 사고 정보
일자 2023/01 ~ 2023/02
침해 정보 - 개인정보: 휴대전화번호, 성명, 주소, 생년월일, 암호화된 주민등록번호, 모델명, 이메일, 암호화된 비밀번호, USIM 고유번호 등
- 서비스 장애
특징 잘못된 설정으로 인한 DDoS 및 개인정보 유출
피해크기 - 29만 7,117명의 고객정보 (399명은 확인 불가)
- DDoS 공격으로 인한 서비스 장애
침해 사고 분석
경위 23.01.01 미상의 해커가 해킹포럼에 LGU+고객정보 판매글을 게시
- 23.01.05 6비트코인에 약 2천만건의 고객정보 판매 글 게시

- 
23.02.03 과기정통부·개인정보위는 LGU+와 함께 약 30만명 고객정보 유출 확인
> LGU+가 해커로부터 확보한 데이터 60만건을 전체회원DB와 비교하여, LGU+ 19만명 고객정보 및 해지고객DB 등에서 11만명 유출 확인
> 확보한 유출데이터 60만건은 DB 형태의 텍스트 파일로 26개의 컬럼으로 구성
> 컬럼은 휴대전화번호, 성명, 주소, 생년월일, 암호화된 주민등록번호, 모델명, 이메일, 암호화된 비밀번호, USIM 고유번호 등
> 이 중, 교환기주소, 서비스명컬럼에서 LGU+의 고객정보로 판단할 수 있는 데이터(lte-lguplus.co.kr, U+인터넷전화 등)를 확인

② 23.01.11 "민관합동조사단" 운영
- 중대한 침해사고로 규정
- 과기정통부, KISA, 디지털 포렌식 전문가 등으로 구성

③ 23.01.29 3회(총 63분), 23.02.04 2회(총 57분) DDoS 공격 피해
- 23.01.29 3회 총 63분 동안 해외 및 국내 타 통신사와 연동구간의 주요 네트워크 장비 14대 대상 DDoS 공격
> 전국 대부분에 서비스 장애가 발생

- 23.02.04 2회 총 57분 동안 내부가입자망에서 일부 지역 엣지 라우터 약 320대 대상 DDoS 공격 
> 해당 지역에 서비스 장애가 발생

- 라우터 장비에 다량의 비정상 패킷이 유입 및 CPU 이용률이 대폭 상승한 것으로 분석
> 자원 소진 공격 유형으로 분석 (Syn Flooding 활용)
> 평균 CPU 이용률: 20% 미만 / 공격 피해 당시: 60~90% (3~4배 이상 증가)


④ 23.02.06 "특별조사점검단"으로 개편하여 조사, 점검 수행
- 개편 사유: 연이은 DDoS 공격으로 인한 서비스 장애의 반복 발생으로 보다 심층적인 점검 필요
원인 미흡한 DB 및 웹 서버 설정, 실시간 모니터링 부재
- 어느 시스템에서 유출된 것인지 파악하기 위해 내부 고객정보 처리 시스템 분석
> 유출된 데이터와 내부 시스템 연계 분석 결과 전체회원 DB, 고객인증 DB, 해지고객 DB 특정
> 유출 데이터의 컬럼명과 3개 DB 각각의 컬럼명 일치 또는 유사성 분석 결과 고객인증 DB
> 14.06~21.08 사용자 계정 통합 작업 오류로 고객인증 DB에 남아있던 삭제된 데이터와 유출 데이터 일부 일치

- 고객정보 변경시간(UPDATE_DTIME) 컬럼 값(요금제나 회원정보가 변경되면 변경시점으로 업데이트)을 근거로 유출 시점 판단
> 시스템의 로그가 남아있지 않아 특정하기 어려우나 유출데이터의 마지막 업데이트는 18.06.15 03시58분으로 해당 시점 직후 유출된 것으로 추정
※ 18년도 당시의 로그정보가 남아있지 않아 로그 분석을 통한 사고조사에는 한계 존재
> 총 16개의 시나리오를 마련해 4가지 위협 판단기준에 따라 시나리오 검증
⒜ 인터넷 연결 여부
⒝ 해킹에 악용되는 취약점 존재 여부
⒞ 접근제어 정책 적용 여부
⒟ 불필요한 파일 등 관리 여부
> 점검 중 18.06 시행한 취약점 분석 결과보고서를 근거로 당시 고객인증 DB 시스템의 취약점을 확인
⒜ 웹 관리자 계정 암호가 시스템 초기암호로 설정 > 해커의 관리자 페이지 접속
⒝ 시스템에 웹 취약점 존재 > 파일업로드 취약점 이용 웹쉘 업로드
⒞ 관리자의 DB접근제어 등 인증체계가 미흡 > 웹쉘을 이용한 DB 접근 및 정보 유출
⒟ 대용량 데이터 이동 등 실시간 탐지체계 부재

- 유출로 인한 2차 피해는 스미싱, 이메일 피싱, 불법로그인, 유심(USIM) 복제 등의 가능성
> 비밀번호가 암호화되어 있고, 실제 USIM의 개인키가 있어야 하므로 불법로그인과 유심 복제 발생 가능성은 낮은 것으로 판단

② 미흡한 네트워크 장비 운영 (외부 노출, 비신뢰 장비와 통신 가능, 접근제어 정책 미흡) 
- 공격 전에 약 68개 이상의 라우터가 외부에 노출
> 포트 스캔을 통해 LGU+ 라우터를 특정하고 노출된 포트를 대상으로 공격을 감행한 것으로 분석

- 주요 라우터는 라우터 간 경로정보 갱신에 필수적인 통신 외에 신뢰할 수 없는 장비와도 통신이 가능한 상태로 운영
> 비정상 패킷 수신이 가능

- 접근제어 정책(ACL, Access Control List)을 통해 라우터 간 통신유형을 제한
> 보안조치가 미흡
조치 ① 각각의 문제점에 대한 시정조치 요구
- 비정상 행위 탐지·차단 대응체계 부재 (고객 개인정보 유출 관련)
> 문제점
⒜ 대용량 데이터가 외부로 유출될 때 비정상 행위의 위험성을 실시간 감시 및 통제 가능한 자동화된 시스템이 없었던 것으로 조사
⒝ 시스템별 로그 저장 기준과 보관기간도 불규칙
> 요구
 메일시스템에만 적용되어 있는 AI기반 모니터링 체계를 고객정보처리시스템까지 대상을 확대
IT 자산 중요도에 따른 로그정책과 중앙로그관리시스템을 수립·구축하고 주기적인 점검을 수행

- 네트워크 및 시스템 자산 보호·관리 미흡 (DDoS 관련)
> 문제점
⒜ 주요 네트워크 정보가 외부에 많이 노출
⒝ 침입 탐지·차단 보안장비 부재
⒞ 전사 IT 자원에 대한 통합 관리시스템도 부재 
> 요구
⒜ 분기별로 1회 이상 모든 IT자산에 대한 보안 취약점을 점검
⒝ IT자산 통합관리시스템을 도입

- 전문 보안인력 및 정보보호 투자 부족
> 문제점
⒜ 핵심 서비스와 내부정보 등을 보호하기 위한 전문인력이 부족
⒝ 정보보호 조직의 권한과 책임도 미흡, IT 및 정보보호 관련 조직이 여러 곳에 분산되어 유기적이고 빠른 대응의 어려움
⒞ 타 통신사 대비 보안투자가 상대적으로 저조
> 요구
⒜ 타 통신사와 대등한 수준으로 보강
⒝ 정보보호책임자(CISOㆍCPO)를 CEO 직속 조직으로 강화
⒞ 정보보호 강화에 필요한 예산 규모를 타 통신사와 대등한 수준 이상으로 확대하되, 장기 계획에 따른 보완 투자 요구

- 실효성 있는 보안인식 제고 방안 및 실천체계 부재
> 문제점
⒜ 단순 모의훈련은 실시하고 있으나, 최근 사이버 위협에 따른 실전형 침투훈련이 부족
⒝ 임직원 대상의 보안교육도 형식적
⒞ 바로 보안업무에 활용할 수 있는 실무형 업무매뉴얼도 부재
> 요구
⒜ 최근 사이버 위협 기반의 공격 시나리오를 개발
⒝ 맞춤형 모의훈련을 연 2회 이상 수행, 외부기관이 진행하는 모의 침투 훈련 참여 등 대응 능력 제고
⒞ 보안에 대한 경각심이 제고될 수 있도록 보안교육을 연 2회 이상 실시
⒟ 실무를 반영한 보안매뉴얼을 개발·관리
기타 ① 28일 ‘피해보상협의체’와 마련한 디도스 장애에 따른 ‘종합 피해보상안’ 발표
- 일반 개인과 사업자 고객으로 구분, 각 고객 관점에서 실질적으로 필요한 내용을 담고자 노력했다고 밝힘
- 아래 "LGU+, 472만 고객에 장애시간 대비 10배 보상…소상인도 요금감면" 뉴스 참

② 과기정통부&KISA: 지능적, 조직적인 사이버위협에 보다 선제적·체계적으로 대응을 위해 노력 중
- 기존 사이버위기 예방·대응 체계를 개편 및 관련 제도 개선을 추진
⒜ 사이버침해대응센터의 침해사고 탐지·분석 대응체계를 고도화해 나갈 계획
⒝ 기존의 탐지시스템을 ‘사이버위협통합탐지시스템’으로 통합구축
⒞ 위협 정보 조회, 연관분석을 수행해 사이버위협 고위험 대상시스템을 조기 탐지 및 식별하는 체계
⒟ 국내 기업 대상으로 활동하는 해커조직을 선별, 추적해 사이버공격 발생 이전에 수사기관 등과 공조해 대응할 수 있도록 하는 ‘능동적 사이버 공격 추적체계’를 도입
⒠ 주요 공격자의 예상되는 공격을 관찰하고 대응(프로파일링)하는 사이버공격 억지체계를 2024년도부터 구축
⒡ 사이버 위협 피해 발생 이전에 대응하는 체계를 갖춰나갈 계획

③ 법·제도 개선도 추진: 사이버위협에 신속히 대응하기 위함
⒜ 기업의 침해사고를 보다 빠르게 파악할 수 있도록 자료 제출요구에 대한 법령상 규정을 보다 명확화
⒝ 신고 내용과 신고 자료의 보호 근거를 마련하고, 침해사고가 발생해도 신고하지 않는 자에게는 최대 2,000만원까지 과태료를 부과할 수 있도록 할 계획
⒞ 사업자가 과기정통부의 침해사고 조치방안을 의무적으로 이행하도록 조치 이행점검 규정을 신설
⒟ 사고 대응, 복구 및 재발 방지 대책을 마련해 침해사고를 당한 사업자에게 필요한 조치를 하도록 권고할 수 있는데, 이 ‘권고’ 규정을 ‘권고 또는 명령’으로 할 수 있도록 개정하고, 과기정통부가 별도로 조치 이행여부를 점검할 수 있도록 체계를 마련
⒠ 피해 확산 방지, 사고대응, 복구 및 재발 방지 대책을 마련하여 침해사고를 당한 사업자에게 필요한 조치를 하도록 권고할 수 있는데 해당 권고 규정을 ‘권고 또는 명령’할 수 있도록 개정

④ 과기정통부: 제로트러스트’ 및 ‘공급망 보안’의 새로운 보안관리 체계가 자리 잡을 수 있도록 지원
⒜ 제로트러스트 보안 모델을 기업 업무환경에 맞게 적용·실증하고, 효과성을 검증하는 시범 사업을 추진
⒝ 국내 환경에 맞는 기본모델을 정립
⒞ SBOM(SW제품 구성 요소 등의 정보 명세서) 생성, 컨설팅 등 SW중소기업 대상 SW 공급망 보안 실증·지원을 확대
⒟ KISA 등 전문조직의 관련 인력확보와 표준화 도입 등을 통해 국가 차원의 공급망 보안체계 기반을 마련

⑤ 이종호 과기정통부 장관
- “기간통신사업자인 LGU+에 대한 조사·점검 결과 여러 가지 취약점이 확인되었으며, 이에 대해서는 LGU+에 책임있는 시정조치를 요구하였다.”
- “기간통신사업자는 침해사고가 국민 일상의 불편을 넘어 막대한 경제적 피해, 사회 전반의 마비 등을 야기할 수 있음을 엄중히 인식하고 사이버위협 예방 및 대응에 충분한 투자와 노력을 다함으로써 국민들의 안전한 디지털 서비스 이용을 보장해야 할 책무가 있다.”
- “정부도 날이 갈수록 다양해지고 확대되고 있는 지능적·조직적 사이버 위협에 대비하여 기존 정보보호 체계를 보다 실효성 높은 체계로 강화하여 국민들과 기업이 신뢰하는 안전한 디지털 서비스 강국을 구축해나가겠다.”

 

참고

 

보도자료 - 과학기술정보통신부

소식 보도자료 TOP

www.msit.go.kr

 

LG유플러스 개인정보 유출사건, 시스템 부족·보안정책 미비·인력 부족 등 총체적 난국이 원인

과학기술정보통신부(장관 이종호, 이하 ‘과기정통부’)가 올해 1월 초 발생한 고객 개인정보 유출 및 1월 20일, 1월 29일, 2월 4일 등 한달여 동안 잇따른 디도스 공격에 대한 최종 조사 결과를 발

www.boannews.com

 

LGU+, 472만 고객에 장애시간 대비 10배 보상…소상인도 요금감면

LG유플러스는 ‘피해보상협의체(이하 ‘협의체’)’와 마련한 디도스 장애에 따른 ‘종합 피해보상안’을 28일 발표했다. 협의체는 ▲김기홍 한국PC인터넷카페협동조합 이사장 ▲박성범 법무법

n.news.naver.com

 

1. 대역폭 공격_DRDoS

DNS Reflection Attack
요약 - 공격자는 다량의 DNS 패킷을 서버로 전송하여 정상적인 서비스가 불가능하도록 하는 공격
설명 - 피해자의 IP로 스푸핑하여 네임서버에 비정상 DNS 질의를 요청하고, 요청을 받은 네임서버는 DNS 응답 값을 위장한 IP로 전송하여 공격 대상의 회선 대역폭을 고갈시키는 공격 (DNS Port: 53_UDP/TCP)

- 공격 트래픽 양을 높이기 위하여 단순 DNS Query가 아닌 Zone의 모든 정보를 요청하는 “ANY” 또는 "TXT" 레코드 등를 요청하는 특징

 

NTP Reflection Attack
요약 - NTP 서버에게 비정상적인 요청패킷을 보내서 되돌아오는 응답 값을 공격 payload로 활용하는 공격 유형
설명 - 시간동기화를 위해 사용되는 NTP(Network Time Protocol) 서버를 반사서버로 악용한 공격 (NTP Port: 123_UDP)

- 피해자의 IP로 스푸핑 한 다음 확보한 서버들을 대상으로 가능한 많은 응답패킷을 만들어 내기 위해 monlist를 요청하는 명령을 전송

- monlist: 구버전의 NTP서버에서 사용하는 명령어로, 최근 접속한 최대 600개의 접속 호스트에 대한 정보를 응답 받을 수 있는 명령어 (v2.4.7 이상에서는 해당 명령어가 삭제됨)

 

CLDAP Reflection Attack
요약 - CLDAP 서버에게 비정상적인 Query를 보낸 후 되돌아오는 응답 값을 공격 패킷으로 활용하는 공격 유형
설명 - CLDAP(Connection-less Lightweight Directory Access Protocol)이란 네트워크상에서 디렉토리를 연결/검색/수정하기 위해 사용되는 프로토콜 (CLDAP Port: 389_UDP)

- CLDAP 서버를 반사서버로 악용한 공격

- CLDAP 서버가 갖고 있는 모든 Entry 및 Attribute 값을 요청하며, 서버가 갖고 있는 Node 정보가 많을수록 응답 패킷의 규모가 커짐 (증폭률 56~70배)

 

SSDP Reflection Attack
요약 - SSDP 기능을 악용하여 가능한 한 많은 데이터를요청하는 Search 명령을 보내 정상적인 서비스가 불가능하도록 하는 공격 
설명 - IoT 기기들에 널리 사용되는 SSDP(Simple Service Discovery Protocol)는 UPnP 장치를 탐색할 때 주로 사용되는 프로토콜로 네트워크상의 다른 장치를 찾거나 알리는 역할을 수행 (SSDP Port: 1900_UDP)

- 더 많은 응답 패킷을 만들어 내기 위해 ssdp:all 혹은 ssdp:rootdevice 값이 포함된 Search 명령을 요청

- IoT 기기들은 요청 받은 Search 패킷의 크기와 비교하여 훨씬 더 많은 크기의 응답 패킷을 피해자의 시스템으로 전달 (증폭률 최대 30배)

 

Memcached Reflection Attack
요약 - Memcached 서버의 기능을 악용하여 저장된 캐싱 데이터를 가능한 한 많이 요청하는 request 명령을 요청하여 정상적인 서비스가 불가능하도록 하는 공격
설명 - Memcached 서비스는 내부에서 DB부하감소 및 응답속도 증가를 위해 분산된 메모리에 데이터를 캐싱하는 서비스로 내부에서만 접근하여 사용하도록 설계되었으며, “Key”값으로 “Data”를 매핑하는 구조 (Memcached Port: 11211_UDP)

- Memcached 서버들에게 사전에 확보한 Key값에 대한 Data를 요청 (증폭률 최대 51,000배)

 

WS-Discovery Reflection Attack
요약 - 윈도우 기반 기기들에게 요청을 할 때 고의적으로 XML오류 응답 메시지를 반복적으로 유발시키는 명령을 요청하여 정상적인 서비스가 불가능하도록 하는 공격
설명 - WS-Discovery 서비스는 윈도우 기반 기계들이 네트워크 프린터 등을 자동으로 찾아서 연결 설정을 완료하는데 사용되는 서비스 (WS-Discovery Port: 3702_UDP)

- 원래는 내부 네트워크망에서만 사용되지만 인터넷망에 노출될 경우에는 디도스 공격으로 악용

- WSD 사용 기기들에게 XML오류 응답 메시지를 반복적으로 유발시키는 명령을 대량 요청 (증폭률 최대 500배)

 

ARMS Reflection Attack
요약 - 취약한 Apple Mac 컴퓨터를 대상으로 원격접속 요청하여 정상적인 서비스가 불가능하도록 하는 공격
설명 - ARMS는 Apple社 기기(mac OS)들의 원격 제어 기능을 활성화 할 때 사용되는 데스크탑 원격 제어 프로토콜로 (ARMS Port: 3283_UDP/TCP)

- 확보된 기기들에게 대량의 request 패킷 요청 (증폭률 최대 35.5배)

 

CoAP Reflection Attack
요약 - 외부 노출된 IoT 기기 및 모바일 장치들을 대상으로 변조된 GET Request를 전송하여 정상적인 서비스가 불가능하도록 하는 공격
설명 - CoAP(Constrained Application Protocol)이란 IoT 기기들을 위해 사용되는 프로토콜의 일종으로서, 주로 저전력 컴퓨터들을 위해 만들어진 간단한 프로토콜 (CoAP Port: 5683_UDP)

- 확보한 기기에 CoAP GET Request를 전달 (증폭률 최대 50배)

.

Jenkins Reflection Attack
요약 - 자동 검색 프로토콜이 활성화된 상태에서 검색 요청 Packet을 받으면 요청 값에 관계없이 Jenkins 메타 데이터의 XML 결과값을 응답하는 취약점을 악용한 공격
설명 - Jenkins란 소프트웨어 개발 시 지속적으로 통합 서비스를 제공해주는 툴

- 다수의 개발자들이 하나의 프로그램을 개발할 때 발생할 수 있는 버전 충돌을 방지하기 위해 각자 작업한 내용을 공유 영역에 업로드 함으로써 지속적 통합을 지원 (Jenkins Port: 33848_UDP)

- Jenkins가 DDoS로 악용 될 수 있는 원인은 취약버전에서 Jenkins 검색을 위해 사용되는 UDP 프로토콜의 요청을 검증없이 응답하기 때문

- 확보한 Jenkins 서버들에게 자동검색 Packet을 요청 (증폭률 최대 100배)

 

SNMP Reflection Attack
요약 - SNMP(Simple Network Management Protocol) 장치들을 반사 기기로 악용한 공격
설명 - SNMP(Simple Network Management Protocol)이란 시스템이나 네트워크 관리자로 하여금 원격으로 네트워크 장비를 모니터링하고 환경설정 등의 운영을 할 수 있도록 하는 네트워크 관리 프로토콜 (SNMP Port: 161,162_UDP)

 

Chargen Reflection Attack
요약 - Chargen 프로토콜을 악용한 공격
설명 - Chargen 프로토콜은 네트워크를 통해 문자열을 생성하고 보내는 프로토콜로서, 반사공격에선 생성된 문자열을 payload로 활용함 (Chargen Port: 19_UDP)

 

SunRPC Reflection Attack
요약 - RPC(Remote Procedure Call) 프로토콜을 악용한 공격
설명 - RPC(Remote Procedure Call) 프로토콜은 원격으로 함수를 호출하여 사용할 수 있게 하는 프로토콜로 RPC mapper라는 서비스를 통해 이뤄짐 (RPC: 111_UDP)

- RPC mapper를 악용하여 RPC mapper response 패킷을 피해시스템에게 보내 대역폭을 고갈 시킴

 

SYN/ACK Reflection Attack
요약 - 대규모의 SYN/ACK 패킷을 피해대상에게 보내서 서버의 리소스를 소모시키는 공격 방식
설명 - 피해자의 IP로 스푸핑 한 후 반사서버를 향해 대규모의 SYN 패킷을 보내면 SYN 패킷에대한 응답으로 SYN/ACK 패킷이 피해서버로 반사되어 전달되는 방식

 

[사진 1] 유형별 반사공격 증폭률

1. 대역폭 공격

UDP Flooding
요약 - 공격자는 다량의 UDP 패킷을 서버로 전송하여 정상적인 서비스가 불가능하도록 하는 공격
설명 - UDP 프로토콜의 비연결형 (connectionless) 특성을 악용

- 대상서버에서 UDP Port를 사용하지 않아도 공격할 수 있으며, 공격을 수행하는 감염된 기기가 많을수록 위험도 증가

 

ICMP Flooding
요약 - 공격자는 다량의 ICMP Request 패킷을 서버로 전송하여 정상적인 서비스가 불가능하도록 하는 공격
설명 - 장치간 연결을 진단하는 ping 명령에 대표적으로 쓰이는 프로토콜로서 주로 ICMP Request와 Reply를 사용

- 증폭이 발생하지 않기 때문에 공격기기의 대역폭에 따라 공격 규모가 결정

 

2. 자원 소진 공격

SYN Flooding
요약 - 공격자는 다량의 SYN 패킷을 서버로 전송하여 서버의 대기큐를 가득채워 새로운 클라이언트의 연결요청을 무시하도록 하여 장애를 유발 시키는 공격 
설명 - TCP Protocol의 3-way-handshake를 악용

- SYN Flag만 지속적으로 전달하고 돌아오는 SYN/ACK 패킷에 대한 응답을 주지 않음

- 피해서버에서 가용할 수 있는 Backlog Queue를 전부 소모하여 정상 사용자 연결을 차단하게 됨

 

DNS Query Flooding
요약 - DNS서버에 대량의 DNS 질의를 보내서 정상 서비스를 할 수 없게 만드는 공격
설명 - DNS 서버는 UDP 프로토콜 53번을 통해 도메인 정보에 대한 IP주소를 요청을 받으면 해당하는 IP값을 응답하는 역할

- 단시간에 대량의 DNS 질의를 보내면 DNS서버는 요청한 DNS 질의에 대한 응답을 보내기 위해 자원을 소모하기 때문에 결과적으로 정상 서비스가 불가해짐

 

VSE Query Flooding
요약 - GRE 프로토콜을 이용해 특정사이즈의 패킷을 지속적으로 발생시켜 서버자원의 고갈을 유도
설명 - UDP (증폭) 공격으로 게임 서버에만 적용됨

- TSource 엔진 쿼리 요청을 게임 서버에 보내 서버가 모든 요청을 처리 할 수 없도록 하여 서비스 거부를 유발

 

GRE Flooding
요약 - 게임 서버를 대상으로 다량의 TSource Engine Query를 전송하여 서비스 거부를 유발 시키는 공격
설명 - GRE (Generic Routing Encapsulation): IP 네트워크에서 가상 점대 점 링크 내에 다양한 네트워크 계층 프로토콜을 캡슐화 할 수있는 터널링 프로토콜 

- GRE 프로토콜은 공격 시 encapsulation을 통해 대량의 payload를 전송 가능하고 , 타겟서버는 IP defragmentation 과정에서 자원 고갈이 발생 가능

 

Tsunami Syn Flooding
요약 - 패킷 당 1000bytes의 트래픽을 유발하여 서비스 거부를 유발 시키는 공격
설명 - 기존 SYN flood Attack은 패킷당 40~60bytes의 트래픽을 유발하는데 반해 Tsunami SYN-Flood Attack은 패킷당 1000bytes의 트래픽을 유발

- 일반적인 SYN 패킷에 25배(최대 1000bytes)의 크기로 패킷 데이터양을 추가하는 방식으로 공격을 수행

 

3. 웹/DB 부하 공격

GET Flooding
요약 - 서버와 세션을 맺은 후, HTTP GET 메소드 요청을 통해 웹서버 자원 소진 및 DB서버 자원을 소진 시키는 공격
설명 - 웹과 DB 부하 공격의 가장 대표적인 공격방식

- 서버와 세션을 맺은 후, HTTP GET 메소드 요청을 통해 웹서버의 자원을 소진함과 동시에 DB서버까지 자원을 소진 시켜서 정상적인 사용자의 웹서비스 이용을 차단

 

Slowloris Attack
요약 - HTTP 패킷의 헤더를 조작하여 오랜 시간 동안 지속적으로 공격으로 서버의 자원을 잠식하는 공격
설명 - 정상적인 HTTP 패킷의 헤더는 Carriage Return & Line Feed(이하 개행 문자)가 두 번 나타남

- 16진수로 0d0a0d0a

- 첫 번째 개행 문자는 헤더의 종료이며 두 번째 개행 문자는 전체 헤더의 종료를 의미

- 헤더의 마지막에 개행 문자를 하나만 전송할 경우 웹서버는 헤더가 모두 도착하지 않은 것으로 간주하고 연결을 유지하며 대기상태를 유지

 

RUDY Attack
요약 - Content-Length 헤더기를 매우 크게 설정한 후 서버로 전달할 데이터를 장시간에 걸쳐 조금씩 분할하여 전달해 서버의 자원을 잠식하는 공격
설명 - POST Method를 이용하는 대표적인 Slow 공격 유형

- POST 요청은 전달할 데이터의 크기를 Content-Length 헤더에 삽입하여 전송

- Content-Length 헤더기를 매우 크게 설정하고 데이터를 조금씩 전송하여 서버가 모든 데이터를 수신하기까지 대기하고, 결과적으로 정상 사용자들의 요청을 서비스 할 수 없게 됨

 

Slow read Attack
요약 - TCP 통신에서 사용되는 windows size를 악용한 공격기법
설명 - Client마다 한번에 처리할 수 있는 패킷의 크기가 다르기 때문에 해당 크기를 windows size 필드를 통해 전달

- windows size를 기준으로 패킷을 주고받음

- windows size를 낮게 설정하여 서버로 전달하고, 해당 size를 기준으로 통신하면서 데이터 전송이 완료될 때 까지 Connection을 유지하게 만들어 서버의 Connection 자원을 고갈시키는 공격

 

+ Recent posts