[목차]

 

 

1. ccrypt CMD

 

 

2. 사전 파일을 활용한 공격 프로그램 개발

* 사전 파일 만들기

* shell script

* python

 

 

3. gpg CMD

 

 

4. 사전 파일을 활용한 공격 프로그램 개발

* 사전 파일 만들기

* shell script

* python

 

 

5. 블록 암호 모드 (이론)

* CBC 모드

 

 


 

 

[ccrypt CMD]

 

# ccrypt -e 파일이름 : 암호화

# ccrypt -d 파일이름 : 복호화

# ccrypt -c 파일이름 : 내용보기

 

# ccrypt -c -K '비밀번호' 파일이름

 

 

 


 

 

[사전파일을 활용한 공격 프로그램 개발]

 

 

 

1. 사전 파일 만들기

(ㄱ) 인터넷 상에 구할 수 있는 사전 파일

* 이전에 크랙이 많이 되었던 ID/PASS 사전 파일

* 장비, 소프트웨어 등에서 사용되는 default ID/PASS 포함된 사전 파일

* 특정 소프트웨어에서 많이 사용되는 ID/PASS 사전 파일

 

(ㄴ) 칼리리눅스 내에 내장된 사전 파일 사용

* cd /usr/share/wordlists

 

(ㄷ) 직접 생성한 사전 파일(명령어 사용하는 경우)

* crunch CMD 생성

* CeWL CMD 생성

* john CMD 생성

 

(ㄹ) test 용도로 txt 파일 직접 작성

 

 

(예) CeWL 명령어는 특정한 웹사이트에 있는 단어를 크롤링하여 사전 파일 생성

# cewl http://www.soldesk.co.kr -d 1 -m 6 -w soldesk.txt

 

(예) crunch 명령어를 사용하여 제작

# crunch 1 3

# crunch 1 5 user2 > dict.txt

# crunch 4 8 'abcdefghijklmnopqrstuvwxyz0123456789' -o dict.txt

# crunch 8 8 0123456789 -t user@@@@ -o dict.txt

* @@@@ 자리에 숫자를 가지고 사전 파일을 생성한다.

 

 

 

 

 

 

2. bash shell script

 

(ㄱ) 공격 프로그램 개발 원리

$ cd /test

$ ccrypt -c -K 'soldesk1.' file1.txt.cpt

$ echo $?

0

$ ccrypt -c -K 'abc' file1.txt.cpt

$ echo $?

 

 

(ㄴ) 출력내용

[ FAIL ] Key not found => user01

[ FAIL ] Key not found => user02

[ FAIL ] Key not found => admin

[ OK ] Key found => secretgarden

 

 

attack_ccrypt.sh

#!/bin/bash

DictionaryFile='/python/dict/dict.txt'
EncFile='/test/file1.txt.cpt'

for i in $(cat $DictionaryFile)
do
    ccrypt -K $i -c $EncFile > /dev/null 2>&1
    if [ $? -eq 0 ] ; then
    echo "[ OK ] Key found => $i"
    break
    else
    echo "[ FAIL ] Key not found => $i"
    fi
    sleep 1
done

 

 

or

 

 

기능을 확장한 프로그램

attack_ccrypt2.sh

#!/bin/bash

DictionaryFile='/python/dict/dict.txt'
EncFile='/test/file1.txt.cpt'
DecFile=$(basename $EncFile | sed 's/.cpt$//')

crack() {
    ccrypt -c -K $i $EncFile > $DecFile
    echo "===== Decrypted File Contents ====="
    cat $DecFile
}

for i in $(cat $DictionaryFile)
do
    ccrypt -c -K $i $EncFile >/dev/null 2>&1
    if [ $? -eq 0 ] ; then
        echo "[  OK  ] Key found => $i" 
        echo
        crack
        break
    else
        echo "[ FAIL ] Key not found => $i" 
    fi
    sleep 1
done

 

 

 

 

 

 

3. python

 

출력내용

[ FAIL ] Key not found => user01

[ FAIL ] Key not found => user02

[ FAIL ] Key not found => admin

[ OK ] Key found => secretgarden

attack_ccrypt.py

import os
import sys
import time

DictFile = '/python/dict/dict.txt'
EncFile = '/test/file1.txt.cpt'

def main():
    fd = open(DictFile, 'r')
    for list in fd.readlines(): # 그냥 read 나 readline을 사용하는 경우 strip으로 처리
        word = list.rstrip()   # readlines에는 개행문자가 포함되기 때문에 rstrip으로 처리
        CMD ='ccrypt -c -K %s %s >/dev/null 2>&1' % (word, EncFile)
        CMD2 = os.system(CMD)
        if CMD2 == 0:
            print('[ OK ] : Key Found - %s' % word)
            break
        else:
            print('[FAIL] : Key not Found - %s' % word)
        time.sleep(0.5)
    fd.close()

if __name__ == '__main__':
    main()

 

 

 

 


 

 

[gpg CMD]

 

 

 

# gpg -c 파일이름 : 암호화 (c= crypt)

# gpg -d 파일이름 : 내용보기

# gpg 파일이름 : 복호화

# gpg -d --batch : 물어볼때 무조건 yes

 

* passwd 와 passphease 차이 : 짧은 단어 / 장문

 

 

 


 

 

 

[사전 파일을 활용한 공격 프로그램 개발]

 

 

 

1. 사전 파일 만들기

# vi dict.txt

user01

user02

admin

administrator

secretgarden.

kkkk

abc

 

 

 

 

2. bass shell script

 

출력내용

[ FAIL ] Key not found. ==> user01

[ FAIL ] Key not found. ==> user02

[ FAIL ] Key not found. ==> admin

[ FAIL ] Key not found. ==> administrator

[ OK ] Key found. ==> secretgarden.

 

attack_gpg.sh

#!/bin/bash
# attack CMD = gpg -d --batch --passphrase <passphrase> file >/dev/null 2>&1
# 쉘 스크립트는 변수 선언시 공백 없어야 한다
  
DictFile=/python/dict/dict.txt
EncFile=/test/file1.txt.gpg

for i in $(cat $DictFile)
do
    gpg -d --batch --passphrase $i $EncFile >/dev/null 2>&1
    if [ $? -eq 0 ] ; then
        echo "[  OK  ] Key found: $i"
        break
    else
        echo "[ FAIL ] Key not found. ==> $i"
    fi
    sleep 0.5
done

 

 

 

 

 

3. python

 

출력내용

[ FAIL ] Key not found. ==> user01

[ FAIL ] Key not found. ==> user02

[ FAIL ] Key not found. ==> admin

[ FAIL ] Key not found. ==> administrator

[ OK ] Key found. ==> secretgarden.

 

attack_gpg.py

import os
import time

DictFile = '/python/dict/dict.txt'
EncFile = '/test/file1.txt.gpg'

def main():
    fd = open(DictFile, 'r')
    for list in fd.readlines():
        words = list.rstrip()
        CMD = 'gpg -d --batch --passphrase %s %s >/dev/null 2>&1' % (words, EncFile)
        CMD2 = os.system(CMD)
        if CMD2 == 0:
            print('[  OK  ] Key found ==> ', words)
            break
        else:
            print('[ FAIL ] Key not found: %s' % words)
        time.sleep(0.5)

    fd.close()

if __name__ == '__main__':
    main()

 

 

 


 

 

 

[블록 암호 모드]

 

 

 

1. CBC 모드

 

 

■ CBC 모드란?

■ 초기화 벡터 (IV 초기값/랜덤값)

■ CBC 모드의 특징

■ CBC 모드에 대한 공격

■ 패딩 오라클 공격

■ 초기화 벡터 공격

■ CBC 모드 활용의 예 (가장 널리 많이 쓰이는 방식)

 

 

 

 

1. CBC(Cipher Block Chaing) 모드란?

Cipher Block Chaining Mode(암호 블록 연쇄 모드)

암호문 블록을 마치 체인처럼 연결시키기 때문에 붙여진 이름

CBC 모드에서는 1단계 앞에서 수행되어 결과로 출력된 암호문 블록에 평문 블록을 XOR 하고 나서 암호화를 수행

각각의 암호문 블록은 단지 현재 평문블록 뿐만 아니라 그 이전의 평문 블록들의 영향도 받게 된다.

 

 

(조건) 암호화시 (송신측)

* IV 필요하다. Initial Vector (초기값 /랜덤값)

* 패딩(padding) 처리 해주어야 한다. (평문 끝 짜투리 공간을 맞춰준다)

(조건) 복호화시 (수신측)

* 암호화 하는 시스템이 복호화 하는 시스템에게 알려줘야 하는 것

: IV 값

: padding 값

: 암호화 키

 

 

(IV XOR P) => 암호화(E) => 암호문(C1)

(C1 XOR P) => 암호화(E) => 암호문(C2)

 

 

 

2. 초기화 벡터

IV (Initialization Vector)

최초의 평문 블록을 암호화할 때는 "1 단계 앞의 암호문 블록"이 존재하지 않으므로

"1 단계 앞의 암호문 블록"을 대신할 비트열인 한개의 블록을 준비할 필요

(예) IV(초기화 벡터)

DES/DES3 - 평문(8 bytes, 64bits ) + IV(8 bytes) 중간에 감청하기 때문에 유추 가능한 값이면 안된다!

AES - 평문(16 bytes, 128bits) + IV(16 bytes)

 

 

 

3. CBC(Cipher Block Chaing) 모드의 특징

평문 블록은 반드시 "1 단계 앞의 암호문 블록"과 XOR을 취하고 나서 암호화

따라서, 만약 평문 블록1과 2의 값이 같은 경우라도 암호문 블록1과 2의 값이 같아진다고는 할 수 없고, ECB 모드가 갖고 있는 결점이 CBC 모드에는 없다. (ECB는 좋은 방식 아님)

암호문 블록3을 만들고 싶다면 적어도 평문 블록의 1, 2, 3까지가 갖추어져 있어야만 한다.

 

 

■ (복호화 할때)깨진 암호문

CBC 모드에서 암호문 블록이 파손되면 2개의 평문 블록에 영향을 미친다.

■ (복호화 할때)암호문 블록에서 비트 누락

CBC 모드에서 암호문 블록에서 비트 누락이 생기면 그 이후에 평문 블록 전체에 영향을 미친다.

 

 

 

4. (복호화 할때)CBC 모드에 대한 공격(초기화 벡터의 비트 반전)

초기화 벡터의 비트를 반전시켜 평문 블록의 비트를 반전시키는 공격(CBC 모드)

 

 

 

5. 패딩 오라클(Padding Oracle) 공격

 패딩 오라클? (Padding Oracle)

: 패딩은 공간 채우기 위한 가비지 데이터

: 오라클 – 맞는지 틀린지 확인해주는 프로그램

 

 블록 암호의 패딩을 이용한 공격

패딩 내용을 조금씩 변화시켜 암호문을 여러 차례 송신

수신자가 올바로 복호화 하지 못할 경우 오류를 관찰하여 평문 정보를 취득

 

패딩을 사용하는 모든 모드에 적용

공격자가 메시지의 패딩이 옳은지 아닌지의 여부를 판단하는 오라클이 있다면, 이 오라클을 이용하여 암호문에 대응 하는 메시지를 알아낼 수 있다.

 

 

 

6. 초기화 벡터(IV) 공격

 초기화 벡터는 난수(Random Number)로 부여

SSL/TLS의 TLS 버전 1.0

- 초기화 벡터를 이전 CBC 모드로 암호화한 마지막 블록을 사용

- 문제점 발견 후 TLS 버전 1.1 부터는 초기화 벡터를 명시적으로 부여

 

 

 

7. CBC 모드 활용 예

IPsec 통신의 기밀성(비밀성)을 지키기 위해 CBC 모드를 사용함

- (예) 3DES를 CBC 모드로 사용한 3DES-CBC

- (예) AES를 CBC 모드로 사용한 AES-CBC

인증을 수행하는 대칭암호 시스템의 하나인 Kerberos Version 5에서도 사용하고 있음

SSL/TLS:

통신 기밀성 보호

3DES-EDE-CBC

AES-256-CBC (키 길이가 256비트인 경우)

 

[참고] https://rainflys.tistory.com/105

 

 

 

 


 

 

 

 

2. CTR 모드

 

 

■ 카운터 만드는 법

■ OFB 모드와 CTR 모드의 비교

■ CTR 모드의 특징

■ 오류와 기밀성

 

 

* 가장 많이 쓰이는 방식.

다른 방식들의 단점들을 보완해 나온 시스템(속도)

(CBC = 1-2-3의 연관관계를 만들기 위해 처음 연산된 값을 계속 사용하기 때문에 느림) 

 

 

 

1. 카운터(CTR, CounTeR) 만드는 법

 1) CTR(CounTeR) 모드

CTR 모드는 1씩 증가해 가는 카운터를 암호화해서 키 스트림을 만들어 내는 스트림 암호

블록을 암호화할 때마다 1씩 증가해가는 카운터를 암호화해서 키 스트림을 만든다.

  

 

2) 카운터(CounTeR) 만드는 법

 카운터 초기값

암호화 때마다 다른 값(Nonce, 비표)을 기초로 해서 작성

nonce + block number

 

"평문 블록1"의 카운터(초기값)

66 1F 98 CD 37 A3 8B 4B 00 00 00 00 00 00 00 01

 

"평문 블록2"의 카운터

66 1F 98 CD 37 A3 8B 4B 00 00 00 00 00 00 00 02

 

"평문 블록3"의 카운터

66 1F 98 CD 37 A3 8B 4B 00 00 00 00 00 00 00 03

 

"평문 블록4"의 카운터

66 1F 98 CD 37 A3 8B 4B 00 00 00 00 00 00 00 04

 

 

 

2. CTR 모드의 특징

* CTR 모드의 암호화의 복호화는 완전히 같은 구조

* 프로그램으로 구현하는 것이 매우 간단

* OFB 모드와 같은 스트림 암호의 특징

* CTR 모드에서는 블록을 임의의 순서로 암호화/복호화 할 수 있다.

* 병렬 처리가 가능한 시스템에서는 CTR 모드를 이용하여 자료를 고속으로 처리

 

 

 

3. 오류와 기밀성

CTR 모드의 암호문 블록에서 1비트의 반전이 발생한다고 가정

* 복호화를 수행하면, 반전된 비트에 대응하는 평문 블록의 1비트만이 반전 되고, 오류는 확대되지 않는다.

 

OFB 모드에서는 키 스트림의 1블록을 암호화한 결과가, 암호전의 결과와 우연히 같아졌다고 하면, 그 이후 키 스트림은 완전히 같은 값이 반복된다.

* CTR 모드에서는 그런 걱정은 없음

 

 

■ 각 모드의 비교표

모드

이름

장점

단점

 

ECB

Electric CodeBook

Mode

전자 부호표 모드

간단

고속

병렬처리 가능

(암호화/복호화 양쪽)

 

 

 

 

 

 

평문 속의 반복이 암호문에 반영된다.

암호문 블록의 삭제나 교체에 의한 평문의 조작이 가능

비트 단위의 에러가 있는 암호문을 복호화하면 대응하는 블록이 에러가 된다.

재전송 공격이 가능

X

CBC

Cipher Block Chaining

암호 블록 연쇄 모드

IV / 패딩 필요

평문의 반복은 암호문에 반영되지 않는다.

병렬처리 가능

(복호화만)

임의의 암호문 블록을 복호화할 수 있다.

비트 단위의 에러가 있는 암호문을 복호화하면, 1블록 전체와 다음 블록의 대응하는 비트가 에러가 된다.

암호화에서는 병렬 처리를 할 수 없다.

O

CFB

Cipher-FeedBack

암호 피드백 모드

패딩이 필요 없다.

병렬처리 가능

(복호화만)

임의의 암호문 블록을 복호화 할 수 있다.

암호화에서는 병렬처리를 할 수 없다.

비트 단위의 에러가 있는 암호문을 복호화하면, 1블록 전체와 다음 블록의 대응하는 비트가 에러가 된다.

재전송 공격이 가능

X

OFB

Output-FeedBack

출력 피드백 모드

패딩이 필요 없다.

암호화/복호화의 사전 준비를 할 수 있다.

암호화와 복호화가 같은 구조를 하고 있다.

비트 단위의 에러가 있는 암호문을 복호화하면, 평문의 대응하는 비트만 에러가 된다.

병렬 처리를 할 수 없다.

적극적 공격자가 암호문 블록을 비트 반전시키면 대응하는 평문 블록이 비트 반전된다.

 

 

 

 

X

CTR

CounTeR

카운터 모드

IV 필요없다

패딩이 필요 없다.

암호화/복호화의 사전 준비를 할 수 있다.

암호화와 복호화가 같은 구조를 하고 있다.

비트 단위의 에러가 있는 암호문을 복호화하면, 평문의 대응하는 비트만 에러가 된다.

병렬처리 기능

(암호화/복호화 양쪽)

적극적 공격자가 암호문 블록을 비트 반전시키면, 대응하는 평문 블록이 비트 반전된다.

 

 

 

 

 

 

 

O

 

0: 권장, X: 사용안함

 

참고] CFB 모드는 현재는 사용 안함, CTR 모드를 사용하는 편이 좋음

[참고] OFB 모드는 CTR 모드를 사용하는 편이 좋음

 

 

 

 


 

 

 

 

3. 정리

 

 

1. 대칭키 암호

스트림 암호(ex: ARC4, ChaCha20, XChaCha20, Salsa20)

블록 암호(ex: DES/3DES, AES, SEED(국산), ARIA(국산))

 

 

2. 스트림 암호

ChaCah20

XChaCha20

Salsa20

 

 

3. 스트림 암호 + 인증

ChaCha20-Poly1305

XChaCha20-Poly1305

 

 

4. 블록 암호 모드

ECB(Electric Codebook) Mode - 전자 부호표 모드

CBC(Cipher Block Chaning) Mode - 암호 블록 연쇄 모드

=> IV, Padding

=> IPsec, SSL/TLS

CFB(Cipher-FeedBack) Mode - 암호 피드백 모드

OFB(Output-FeedBack) Mode - 출력 피드백 모드

CTR(CounTeR) Mode - 카운터 모드(병렬 처리 가능)

=> IV(x), Padding

=> Big Data

 

 

5. 블록 암호 모드 + 인증(AE/AD)

EAX - NIST

GCM(Galois/Counter Mode)

CCM(Counter with CBC-MAC)

SIV(Synthetic Initialization Vector)

OCB(Offset CodeBook Mode)

OpenPGP

 

728x90

+ Recent posts