현대 암호학

[현대 암호학] 04. 실습(1)

Uggjjini 2021. 6. 23. 10:08

[실습] ccrypt CMD 이용한 파일 암호화/복호화(AES)

 

사용 시스템

칼리리눅스(KaliLinux)

 

 

ccrypt 명령어 기본 사용법

 

(암호화)

# ccrypt file1.txt (# ccrypt -e file1.txt)

file1.txt.cpt

 

(확 인)

# ccrypt -c file1.txt.cpt

 

(복호화)

# ccrypt -d file1.txt.cpt

 

 

ccrypt 패키지 설치

# apt-get update (# apt update)

# apt-cache search ccrypt (# apt list ccrypt, # apt search ccrypt)

# apt-get -y install ccrypt (# apt -y install ccrypt)

 

 

ccrypt 사용법 확인

ccrypt 명령어의 옵션을 확인한다.

# ccrypt --help

 

 

실습 준비

# mkdir -p /test

# cd /test

# rm -rf /test/*

 

# cp /etc/hosts file1.txt

# ls

file1.txt

 

# cat file1.txt

127.0.0.1 localhost
127.0.1.1 kali2.example.com kali2


# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

 

# file file1.txt

file1.txt: ASCII text

* file CMD

* binwalk CMD

* strings CMD

* vi 편집기(:%!xxd :%!xxd -r)

 

 

파일 암호화(EX: AES) 및 확인

 

# ccrypt file1.txt

Enter encryption key: (soldesk1.)
Enter encryption key: (repeat) (soldesk1.)

 

# ls

file1.txt.cpt

 

# file file1.txt.cpt

file1.txt.cpt: data

 

# cat file1.txt.cpt

-> 출력 내용 생략

 

 

파일 복호화 및 확인

 

# ccrypt -c file1.txt.cpt

Enter decryption key: (soldesk1.)
127.0.0.1 localhost
127.0.1.1 kali2.example.com kali2


# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

-> 암호: soldesk

 

# ls

file1.txt.cpt

 

# ccrypt -d file1.txt.cpt

Enter decryption key: (soldesk1.)

-> 암호: soldesk

 

# ls

file1.txt

 

# cat file1.txt

-> 출력 내용 생략

 

 


[실습] ccrypt CMD 이용한 일반 사용자 간의 암호화 파일 사용

사용 시스템

칼리리눅스(KaliLinux)

 

 

파일 암호화 명령어

(Unix) crypt CMD -> (Unix/Linux) ccrypt CMD

 

(사전 준비 사항)

user01, user02 사용자가 필요

 

# grep user0 /etc/passwd

# useradd -m -s /bin/bash user01

# passwd user01

# useradd -m -s /bin/bash user02

# passwd user02

 

 

준비 작업

 

# rm -rf /test/*

# chmod 777 /test                   /* 테스트 퍼미션 */

 

# systemctl restart ssh

# systemctl status ssh

-> active (running)

 

user01 사용자가 파일 암호화

 

[TERM1] user01 사용자 터미널

# ssh user01@localhost

$ id

uid=1000(user01) gid=1000(user01) groups=1000(user01)

 

$ pwd

/home/user01

 

$ cd /test

$ cp /etc/hosts file1.txt

$ ls -l

-rw-r--r-- 1 user01 user01 203 25 01:00 file1.txt

 

$ ccrypt file1.txt

Enter encryption key: (soldesk1.)
Enter encryption key: (repeat) (soldesk1.)

 

user02 사용자가 암호화된 파일 테스트

 

[TERM2] user02 사용자 터미널

# ssh user02@localhost

$ id

uid=1002(user02) gid=1002(user02) groups=1002(user02)

 

$ pwd

/home/user02

 

$ cd /test

$ file file1.txt.cpt

file1.txt.cpt: data

 

$ cat file1.txt.cpt

-> 암호화되있음

 

$ ccrypt -c file1.txt.cpt

Enter decryption key: (soldesk1.)
127.0.0.1 localhost
127.0.1.1 kali2.example.com kali2


# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

-> 정상적으로 확인 가능

 

$ ccrypt -d file1.txt.cpt

Enter decryption key: (soldesk1.)
ccrypt: file1.txt.cpt: 허가 거부

-> Permission denied

 

$ ccrypt -c file1.txt.cpt > file2.txt

$ ls

file1.txt.cpt file2.txt

 

$ cat file2.txt

127.0.0.1 localhost
127.0.1.1 kali2.example.com kali2


# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

 

 


[실습] ccrypt CMD 이용한 디렉토리 안에 들어 있는 파일들에 대한 암호화

사용시스템

kali

 

user01 사용자가 실습을 위한 준비

[TERM1] user01 사용자 터미널

$ id

uid=1000(user01) gid=1000(user01) groups=1000(user01)

 

$ pwd

/test

 

$ cd /test

$ mkdir -m 777 dir1

$ mkdir -m 777 dir1/dir2

$ mkdir -m 777 dir1/dir2/dir3

$ cp /etc/hosts dir1

$ cp /etc/hosts dir1/dir2

$ cp /etc/hosts dir1/dir2/dir3

 

$ tree -C (# apt-get -y install tree)

.
├── dir1
   ├── dir2
      ├── dir3
         └── hosts
      └── hosts
   └── hosts
├── file1.txt.cpt
└── file2.txt


3 directories, 5 files

 

user01 사용자가 dir1 디렉토리 안의 모든 파일들을 암호화

$ ccrypt -r dir1

Enter encryption key: (soldesk1.)
Enter encryption key: (repeat) (soldesk1.)

 

$ tree -C -F

.
├── dir1/
   ├── dir2/
      ├── dir3/
         └── hosts.cpt
      └── hosts.cpt
   └── hosts.cpt
├── file1.txt.cpt
└── file2.txt


3 directories, 5 files

 

user02 사용자가 user01 사용자가 만든 dir1 디렉토리 안의 파일들 테스트

[TERM2] user02 사용자 터미널

$ id

uid=1002(user02) gid=1002(user02) groups=1002(user02)

 

$ pwd

/test

 

$ cd dir1/dir2

$ ccrypt -c hosts.cpt

Enter decryption key: (soldesk1.)
127.0.0.1 localhost
127.0.1.1 kali2.example.com kali2


# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

 

$ ccrypt -d hosts.cpt

Enter decryption key: (soldesk1.)
ccrypt: hosts.cpt: 허가 거부

-> permission denied

 

[추가적인 실습] user02 사용자로 수행

$ cp hosts.cpt file1 ($ md5sum hosts.cpt file1) ---> 가능

$ mv hosts.cpt file2 ($ md5sum file1 file2) ----> 가능

$ rm -f file2 --> 가능 

 

user02 사용자 로그 아웃

$ exit

#

 

user01 사용자 로그 아웃

[TERM1] user01 사용자 터미널

$ exit

#

 

(정리) ccrypt 명령어
user01 사용자가 암호화한 파일(EX: file1.cpt)을 user02 사용자 복호화할 때는 다음과 같은 형식을 사용한다.
$ ccrypt -c file1.cpt > file1
ccrypt 명령어의 -r 옵션은 디렉토리안의 파일들을 개별적으로 암호화 한다.
$ ccrypt -r dir1$ ccrypt -d -r dir1
특정 디렉토리 전체(EX: /test/dir1)에 대해서 백업시 암호화 하고 싶다.
# tar cvzf /backup/backup.tar.gz /test/dir1# ccrypt /backup/backup.tar.gz

 


[실습] 사전 파일을 이용한 공격 프로그램

사용시스템

kali

 

사용 언어

쉘스크립트(Shell Script)

파이썬(Python)

 

준비 사항

(주의) user02 사용자로 공격 프로그램을 개발한다.

(주의) /test/file1.txt.cpt 파일이 존재해야 한다.(ccrypt CMD 이용하여 암호화된 파일)

# cd /test

# rm -rf /test/*

# cp /etc/hosts file1.txt

# ccrypt file1.txt -> 암호: soldesk1.

 

 

 준비사항 - 관리자로 사전 파일 생성(EX: /python/dict/dict.txt)

 

# mkdir -p /python/dict

# chmod -R 777 /python

# tree -C /python

 

# cd /python/dict

# cat << EOF > dict.txt

user01

user02

admin

soldesk1.

administration

EOF

 

 

 user02 사용자로 로그인

 

# ssh -X user02@localhost

user02 사용자로 로그인

$ id

uid=1002(user02) gid=1002(user02) groups=1002(user02)

 

$ pwd

/home/user02

 

 공격 프로그램 개발(Bash Shell Script)

 

공격 프로그램 개발 원리

$ cd /test

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

$ echo $?

0

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

$ echo $?

 

$ cd /python

$ vi attack_ccrypt.sh ($ vi /python/attack_ccrpt.sh)

 

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

$ chmod 755 *.sh

$ ./attack_ccrypt.sh

[ FAIL ] Key not found => user01
[ FAIL ] Key not found => user02
[ FAIL ] Key not found => admin
[ OK ] Key found => soldesk

 

 

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

 

 

# chmod 755 attack_ccrypt2.sh

# ./attack_ccrypt2.sh

[ FAIL ] Key not found => user01
[ FAIL ] Key not found => user02
[ FAIL ] Key not found => admin
[  OK  ] Key found => soldesk1.

===== Decrypted File Contents =====
127.0.0.1       localhost
127.0.1.1       kali.example.com        kali

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

 

 

 공격 프로그램 제작(Python Script)

$ vi attack_ccrypt.py ($ vi /python/attack_ccrypt.py)

 

 

attack_ccrypt.py

##!/usr/bin/python3
import os


dictfile = '/python/dict/dict.txt'
encfile = '/test/file1.txt.cpt'

def main():
    with open(dictfile) as fd:
        for word in fd.readlines():
            word = word.rstrip()
            cmd = 'ccrypt -c -K %s %s > /dev/null 2>&1' % (word,encfile)
            ret = os.system(cmd)
            if ret == 0:
                print('[  OK  ] : Key found - ', word)
                break
            else:
                print('[ FAIL ] : key not found - ', word)


if __name__ == '__main__':
    main()

 

$ chmod 755 attack_ccrypt.py

$ ./attack_ccrypt.py

[ FAIL ] : Key not found - user01
[ FAIL ] : Key not found - user02
[ FAIL ] : Key not found - admin
[ OK ] : Key found - soldesk1.

 

 

[참고] 사전 파일 만들기

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

  • 이전에 크랙이 많이 되었던 ID/PASS 사전 파일
  • 장비, 소프트웨어 등에서 사용되는 default ID/PASS 포함된 사전 파일
  • 특정 소프트웨어에서 많이 사용되는 ID/PASS 사전 파일

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

  • cd /usr/share/wordlists

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

  • crunch CMD 생성
  • CeWL CMD 생성 
  • john CMD 생성

 

(예) 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
* @@@@ 자리에 숫자를 가지고 사전 파일을 생성한다.