현대 암호학

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

Uggjjini 2021. 6. 23. 12:21

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

gpg 명령어를 이용한 파일 암호화/복호화(AES 256 알고리즘 사용)

 

사용 시스템

kali

 

 

PGP versus GPG(GNU PG)

- https://namu.wiki/w/PGP

PGP

  • Symantec PGP(상용): http://www.symantec.com/encryption
  • 1991년 필 지머먼(Phil Zimmermann)이라는 프로그래머가 개발한 전자우편 암호화 프로그램과 그 파생작들을 말한다. 이메일 내용 자체를 암호화하여 오로지 보내는 사람과 받는 사람만이 그 원문(Plain Text)을 알 수 있도록 하는 암호화 방식을 말한다.

GPG(GNU PG)

  • GnuPG(오픈소스) : https://www.gnupg.org
  • GPG가 처음 개발되었을 때는 무료였지만, 현재는 유료로 시만텍(Symantec)에서 판매하고 있다. 그러나 PGP의 한 갈래인 OpenPGP는 현재 인터넷 표준으로 자리매김 하였으며, 이를 이용한 GnuPG같은 여러 프로그램이 등장했다. 당연하게 윈도우나 맥, 리눅스 버전도 존재한다.

 

gpg CMD 개요

(https://www.gnupg.org)

() OpenPGP 암복호화

() 서명(signing) 명령어

 

 

 

gpg 사용법 확인

 

(암호화)

# gpg -c file1 /* -c : crypt */

(확 인)

# gpg -d file1.gpg /* -d : decrypt */

(복호화)

# gpg file1.gpg

 

 

# apt-get -y install gpg

# which gpg

/usr/bin/gpg

 

 

실습 준비

# cd /test && rm -rf /test/*

# cp /etc/hosts file1.txt

# ls

file1.txt

 

 

gpg CMD 이용한 암호화

 

# gpg -c file1.txt

gpg: keybox '/root/.gnupg/pubring.kbx' created

-> 암호: soldesk1.

 

# ls

file1.txt file1.txt.gpg

별도의 파일 file1.txt.gpg 파일이 생성된다.

 

# file *

file1.txt: ASCII text
file1.txt.gpg: GPG symmetrically encrypted data (AES256 cipher)

 

 

gpg CMD 이용한 복호화

 

# rm -f file1.txt

복원할 파일이므로 file1.txt 파일을 미리 삭제해 놓는다.

 

# gpg -d file1.txt.gpg

gpg: AES256.CFB encrypted data
gpg: encrypted with 1 passphrase
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

decryption 되지만 파일이 만들어 지지는 않는다.

대신 모니터에 복호화된 내용을 출력한다.

복호화된 내용을 stdout 출력한다는 것을 알수 있다.

 

# ls

file1.txt.gpg

 

# gpg file1.txt.gpg

gpg: WARNING: no command supplied. Trying to guess what you mean ...
gpg: AES256 encrypted data
gpg: encrypted with 1 passphrase

 

# ls

file1.txt file1.txt.gpg

 

# cat file1.txt

127.0.0.1 localhost
127.0.1.1 kali


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

 

 

[추가적인 실습]

 

현재 시스템을 재부팅 하지 않은 상태에서 user01 사용자로 file1.txt.gpg 파일 내용 보기

# ssh user01@localhost

$ cd /test

$ gpg -d file1.txt.gpg

$ gpg -d file1.txt.gpg

$ exit

 

reboot 후에 다시 시도하기

# reboot

 

재부팅 이후에 root 사용자로 로그인

# cd /test

# gpg -d file1.txt.gpg

# gpg -d file1.txt.gpg

 


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

사용시스템

kali

 

준비 작업

# rm -f /test/file1.txt

 

user01 사용자 로그인

# ssh -X user01@localhost

 

사전 파일 확인

$ cat /python/dict/dict.txt

user01
user02
admin
administrator
soldesk1.
kkkk
abc

$ crunch 4 4 'abcd' > dict2.txt

$ mv dict.txt dict3.txt

$ cat dict2.txt dict3.txt > dict.txt

$ cat dict.txt

aaaa
aaab
aaac
aaad
aaba
aabb
aabc
aabd

.......(중략)........

user01
user02
admin
administrator
soldesk1.
kkkk
abc

 

공격 프로그램 제작(Bash shell script)

 

$ cd /python

$ vi attack_gpg.sh

 

attack_gpg.sh

#!/bin/bash
  
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 1
done

$ chmod 755 attack_gpg.sh

$ ./attack_gpg.sh

[ FAIL ] Key not found. ==> aaaa
[ FAIL ] Key not found. ==> aaab
[ FAIL ] Key not found. ==> aaac
[ FAIL ] Key not found. ==> aaad

.... (중략) .....

[ FAIL ] Key not found. ==> user01

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

 

attack_gpg2.sh - 기능을 조금 더 확장한 프로그램

#!/bin/bash

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

crack() {
    echo 
    echo "====== Decrypted File Contents ======"
    gpg -d --batch --passphrase $i $EncFile
}

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" 
        crack
        break
    else
        echo "[ FAIL ] Key not found. ==> $i" 
    fi  
    sleep 1
done

 

공격 프로그램 제작(python script)

attack_gpg.sh 기능이 같은 프로그램을 python으로 제작해 보자.

 

attack_gpg.py

###!/usr/bin/python3
import os


def main():
    dictfile = '/python/dict/dict.txt'
    encfile = '/test/file1.txt.gpg'

    fd = open(dictfile)
    for word in fd.readlines():
        word = word.rstrip()
        # CMD => gpg -d --batch --passphrase word encfile > /dev/null 2>&1
        cmd = 'gpg -d --batch --passphrase %s %s > /dev/null 2>&1' % (word,encfile)
        ret = os.system(cmd)
        if ret == 0:
            print('[  OK  ]', word)
            break
        else:
            print('[ FAIL ]', word)



if __name__ == '__main__':
    main()

$ chmod 755 *.py

$ ./attack_gpg.py

[ FAIL ] aaaa
[ FAIL ] aaab
[ FAIL ] aaac
[ FAIL ] aaad
[ FAIL ] aaba

.... 중략 .....

[ FAIL ] dddd
[ FAIL ] user01
[ FAIL ] user02
[ FAIL ] admin
[  OK  ] soldesk1.

Process finished with exit code 0

 

 

 

(정리) ccrypt CMD, gpg CMD

ccrypt CMD
(암호화) # ccrypt file1.txt
(확   인) # ccrypt -c file1.txt.cpt
(복호화) # ccrypt -d file1.txt.cpt

gpg CMD 
(암호화) # gpg -c file1.txt
(확   인) # gpg -d file1.txt.gpg
(복호화) # gpg file1.txt.gpg

ccrypt CMD, gpg CMD 활용
LOG 파일 백업시 암호화
report.txt 결과 파일 암호화
기타