본문 바로가기
시스템, 네트워크 보안

시스템 / 네트워크 보안 [두 번째 정리]

by 할 수 있다 ! 2024. 3. 6.

시스템 보안에 대한 이해 

 

 

 

첫 번째 게시글에서 마지막 부분에 명령어 정리했었는데 다시 정리합시다.

 

* 식별, 인증, 인가

- 식별 : 다른 사용자와 구별 -----> 시스템에서 잘못한 사용자 또는 실수한 사용자를 가려내기 위함.

- 인증 : 식별자(ID)에 대한 올바른 사용자임을 증명하는 것 (지식기반, 소유기반, 생체기반, 위치기반 ---> 혼합해서 사용)

- 인가 : 인증된 사용자에게 적절한 권한 부여하는 것

 

* 기본1 리눅스 명령어 정리

1) 리눅스 파일 및 폴더 관리 명령어 : cd,  mv,  cp,  rm,  ls

- cd : 다른 디렉토리로 이동

- mv : 파일을 이동하거나 파일명을 바꿀 때 사용

   이동할 때   $ mv  [파일명]   [경로명]

   파일명을 바꿀 때  $ mv [기존파일명]  [새파일명]                 ex) $ sudo  mv  index.html  index.old

- cp : 파일을 복사할 때 사용

   $ cp  [파일명]  [경로명]

   $ cp  [파일명]  [새파일명]            // 내용은 같은데 이름만 다른 파일을 하나 더 만듦

- rm : 삭제

   파일을 삭제할 때   $ rm  [파일명]

   디렉터리를 삭제할 때    $ rm  -r  [디렉터리]

   옵션을 잘 모를 때는  $ [명령어]  --help          또는  $ [명령어] -h

- ls  :  목록을 볼 때 (list)

   $ ls  -l        

   $ ls  -al                // a는 all, 숨김파일 등등을 보여달라는 뜻.

 

2) 리눅스 파일 및 폴더 권한 구조와 권한 변경 명령 정리

   $ sudo  chmod  777  [파일명]

   $ sudo  chown  [소유할 계정]   [파일명]

    777  --->  -rwxrwxrwx   

    640  --->  -rw-r----- 

 

3) 사용자 생성, 변경, 삭제 :  useradd/adduser,  usermod,  userdel

   adduser는 마법사 (자동생성)

   usermod는 수정할 때  (그룹 포함 여부, 수정이 필요할 때)

   userdel은 삭제할 때

 

4) 파일의 내용을 볼 수 있는 명령 : cat,  vi,  less,  tail,  head

- cat : 파일을 읽어 들임 (짧은 text파일에 적합)

- vi : 편집기

 

$ sudo  vi  [파일명]

     i                  // 편집모드

     ESC              // 명령어 모드

     :wq               // 저장하고 종료

     :q                 // 그냥 종료

     :wq!              // (강제로) 저장하고 종료

     :q!                // (강제로) 저장하지 않고 종료

 

- less : 터미널 라인을 지저분하지 않게 하고 별도로 열어서 확인, 종료할 때는 q를 입력, 긴 문서에 적합 (스크롤)

- head : 문서의 앞부분, 로그의 경우에는 시간이 오래된 내용을 확인할 때

- tail : 문서의 뒷부분, 로그의 최신 부분

   $ sudo  tail  -f  /var/log/auth.log            // 새로운 로그가 생성될 때 바로 보여줌 (명령을 종료하지 않고 실시간 확인)

 

5) 서비스와 프로세스를 볼 수 있는 명령 :  ps -ef ,  netstat -nap

- $ sudo  ps -ef                   //  프로세스 목록 확인

- $ top                               //  실시간으로 프로세스, 메모리, CPU 사용량을 확인하고 싶을 때 (종료는 q)

- $ sudo  netstat  -nap          // 네트워크 상태를 조회할 때 사용   n : number(포트를 숫자로),  a : all,  p : process

   윈도우에서는 관리자모드로  cmd> netstat  -nab        // b가 process

   ----> 내가 의도하지 않았던 포트가 열려있고 프로세스가 실행중이라면 공격을 당하고 있을 가능성이 있다.


시스템 / 보안 두 번째 정리

 

* 약점과 취약점

- 시스템은 완전하지 않기 때문에 약점(Weakness)과 취약점(Vulnerability)이 존재합니다.

- 약점은 비교적 약한 부분, 없어지지 않음 (계속 존재함), 시스템의 공통적인 부분이다.

 

1. 약점(Weakness)

- 공식 웹사이트 :  https://cwe.mitre.org 

- CWE : Common Weakness Enumeration (공통 약점 목록)

- 공식 약점 번호체계 : CWE-nnnnn

 

2. 취약점(Vulnerability, vulns)

- 공식 웹사이트 : https://cve.mitre.org   https://www.cve.org

- CVE : Common Vulnerabilities and Exposures

- 취약점은 특정 버전에만 존재함 ---> 버전만 알면 취약점이 존재하는지 알 수 있음

- 공식 취약점 번호체계 : CVE-YYYY-NNNN  ~  CVE-YYYY-NNNNNNN

 

3. 익스플로이트 (Exploit) : 착취, 침탈

- 공격 코드를 주입해서 해킹을 시도한다.

- 악성 코드를 만들어서 주입하는 방법.

- 취약점을 공격하는 것  ----> 권한 획득 ---> 파일을 가져오거나 시스템을 손망실 시킬 수 있다.

- Zero-day Exploit : 알려지지 않은 취약점(CVE코드 없음)을 이용한 공격한다.   ex) 구글보안팀(유명해커들), NSA 등 연구

- One-day Exploit : 이미 알려진 취약점(CVE코드 있음)을 이용한 공격한다.  ---> 집중, 보완

 

* 패치가 오래 걸리는 이유

- 취약점을 제조사에 바로 알려주지 않고 Dark Web에서 뒷거래를 하기도 함

    ex) Windows 알려지지 않은 취약점은 대략 얼마??     1) 500만원  2) 5000만원 

 

- 취약점을 검증하고 패치를 개발하는데 시간이 많이 걸립니다.   ---> 취약점의 개수가 증가합니다.

- 취약점을 패치했는데 또다른 취약점이 발견되기도 함  ---> 테스트를 많이 해야 함 --> 시간이 소요된다.

 

Quiz) MS직원 중에 테스트를 직원이 몇 %일까요?   (Windows, Office, 가상화, 모바일, 게임 등 수많은 제품군)

  1) 5%   2) 10%   3) 30%    4)  50%

 

* Bug Bounty

- 취약점을 제조사에 알려주면 제조사에서 보상해주는 것

 

Quiz) 칼리 리눅스에서 시간을 맞추는 것이 중요한 이유는??  로그에 정확한 시간을 표시한다.

 

실습) 딕셔너리(사전) 구경
- 딕셔너리 : 취약한 패스워드를 모아놓은 파일
$ cd  /usr/share/블라블라
$ less  password.lst
    ( q를 누르면 종료됨 )
$ sudo  vi  password.lst      (자주 사용하는 단어들을 모아놓은 딕셔너리 파일)
   dd           // 한줄 삭제  ---> 주석을 삭제
#으로 시작하는 주석을 모두 삭제하면, 123456이 맨 위로 오게 되고  :wq (저장하고 종료)

$ sudo  vi  password.lst
   /icecream                      // 해당 단어가 있는지 알 수 있음
   /princess
:q

 

2) 알파벳 4자리로 구성되어 있는 딕셔너리 만들기

 

$ sudo  crunch  4 4  abcdefghijklmnopqrstuvwxyz  -o  test02.txt

위와 같이 해도 되겠지만...

$ less  charset.lst

   ---> 대문자: ualpha,  소문자: lalpha,  대소문자섞어서: mixalpha 

$ sudo  crunch  4 4  -f  charset.lst  lalpha   -o  test02.txt                // -f : file

$ less  test02.txt

 

주의사항!!!  

----> 너무 크게 파일을 만들면 운영체제가 다운될 수도 있음!!!   (500Mb 이하로 만들것)

 

3) admin 이라는 단어 뒤에 숫자 3자리가 오는 딕셔너리 만들기

$ sudo  crunch  8 8  0123456789  -t  'admin@@@'  -o  test03.txt

$ less  test03.txt

 

$ sudo  하하  -h 192.168.5.129  -u  호호  -P  test03.txt  -M  ssh

   ( -h : host,   -u : user,  -P : Password dictionary,   -M : Module )

 

* Dictionary Attack : 가능성이 높은 딕셔너리 파일을 이용해서 패스워드를 대입해보는 공격

- 단점 : 시간이 많이 걸림, 딕셔너리에 없는 단어를 사용하는 경우 공격에 실패 ----> 대/소/숫/특 섞어서 13자리 이상

- 대응 방법 : 횟수제한(5회이상 틀리면 계정잠금), 일정시간 잠금(잠금시간 설정)

 

* Dictionary 공격으로 로그가 얼마나 많이 생성되었는지 확인

$ sudo   tail   -30   /var/log/auth.log

 

* 로그를 놔두면 점점 커지게 됨, 어떻게 해야 할까요?

- 온라인 스토리지 ---> 오프라인 스토리지 (테이프: 단가 낮음)

- Cloud에 백업 (자동으로 단가가 싼 스토리지로 이동하도록 함)

- Ring Backup : 오래된 로그를 덮어쓰는 방식  (6개월로 설정하면 6개월 넘은 스토리지에 덮어쓰기를 함)

   (오래된 데이터를 삭제하도록 설정)

 

* 방화벽

- 네트워크 방화벽 : 네트워크 앞단에 배치 (독립적인 제품 : 팔로알토, 포티넷, 안랩 등)  ----> SW, HW 일체형

- 시스템 방화벽 : 운영체제 자체에 포함되어 있음   ex) 윈도우 방화벽, UFW,

 

iptables 등등   ----> SW

 

* 계정 관리

- 불필요한 계정은 삭제  ex) 퇴사자, 업무 바뀐사람 등등

- 권한의 최소화 (관리자 권한은 몇명으로 제한 등)

- 1인 1계정

 

* 불필요한 서비스

- 예전에 많이 사용했으나 최근에는 사용하지 않는 서비스

- 사용 빈도가 너무 낮은 경우   ex) FTP를 한달에 한번만 사용

 

* 우분투 종료

$ sudo  init 0

 

* 우분투 리눅스 백업하기

 문서 > Virtual Machines > ubuntu 폴더에 오른쪽 마우스 클릭해서 압축하기

 

Quiz) DDoS는 얼마나 자주 발생할까요?

1) 한달에 한번

2) 일주일에 한번

3) 하루에 한번

4) 매시간마다 한번

5) 매초마다 한번

 

* Root 관리

- Ubuntu, Debian 에서는 root 계정을 비활성화  ---> 매우 안전

- Red hat, CentOS 에서는 root 계정을 사용할 수 있음  ---> root 패스워드 노출시 매우 위험

 

실습) 원격에서 Root로 로그인을 하지 못하도록 설정한다.

$ sudo  apt  install  vim

$ sudo  vi  /etc/ssh/sshd_config

:set nu                                            // 라인 번호를 왼쪽에 표시

/Permit                                           // 검색해서 내가 원하는 단어가 찾아지면 엔터

   (또는 33번 라인으로 화살표 아래키를 눌러서 이동)

i                             // 편집모드로 전환

PermitRootLogin  no

ESC                         // 편집모드 종료

:wq      

 

문제가 있는 경우,  :q! 해서 나온다음  sudo를 붙이고 명령어를 사용하세요.

 

* 시스템 설정

$ sudo  sysctl  -w                              // 수정할 때

$ sudo  sysctl  -a                               // 읽기만 할 때

 

* ICMP 관련 설정 내역을 확인

$ sudo sysctl -a  | grep icmp

 

* tcp syn에 관련된 설정 내역을 확인

$ sudo sysctl -a  |  grep tcp_syn

 

* UDP관련 설정 내역 확인

$ sudo sysctl -a  | grep udp_

 

실습) keepalive time을 3600으로 줄이기

$ sudo  sysctl  -a  |  grep  keepalive_time                      // 확인

$ sudo  sysctl  -w  net.ipv4.tcp_keepalive_time=3600  

 

실습) Ping 거절하기

먼저 Kali Linux에서 Ubuntu로 Ping을 보냅니다.

$ ping  192.xxx.x.xxx                                     // IP주소가 다른 경우, IP를 확인하고 입력하면 됩니다.

 

1) Ubuntu에서 Ping을 거절하도록 설정

$ sudo  sysctl  -w  net.ipv4.icmp_echo_ignore_all=1                // ignore : 무시한다(응답안함),  1이면 활성화

 

2) 다시 Ping을 허용하도록 설정

$ sudo  sysctl  -w  net.ipv4.icmp_echo_ignore_all=0                 // ignore 0  ---> 무시하지 않음 --> 응답함!

 

* 굳이 Ping을 받지 않아도 되는  시스템이라면 ignore 활성화함.

 ---> ICMP와 관련된 DDoS 공격을 빈번하게 당하는 경우 사용하면 좋음

 

* Ping이라는 것은 명령어 (3계층에서 동작)

- ICMP Echo Request를 보내면, ICMP Echo Reply로 응답하게 됨     (ignore를 활성화하면 echo reply를 보내지 않음)

- 네트워크 경로가 정상적인지 확인할 때

- 시스템이 정상적으로 동작하는지 확인할 때

 

* SYN의 대기큐 크기를 늘리기 (대기큐가 작으면 SYN를 많이 받기 어려움)

확인  $ sudo  sysctl  -a  |  grep  syn_backlog

             ---> 기본으로 설정되어 있음 (매우 작은 상태)

설정  $ sudo  sysctl  -w  net.ipv4.tcp_max_syn_backlog=1030

-----> SYN Flooding 공격을 완화시킬 수 있음

 

여기서 잠깐 !

 

SYN Flooding은 네트워크 공격의 한 형태로, TCP 통신에서 사용되는 SYN 패킷을 악의적으로 대량으로 생성하여 공격 대상 서버의 자원을 고갈시키는 기법입니다.

TCP 통신에서는 연결을 설정하기 위해 클라이언트가 서버에게 SYN 패킷을 보내고, 서버는 이에 대한 응답으로 SYN-ACK 패킷을 보내고, 클라이언트는 이에 대한 ACK 패킷을 보내어 연결을 설정합니다. SYN Flooding 공격은 이 연결 설정 과정에서 발생합니다.

공격자는 대량의 가짜 SYN 패킷을 보내어 공격 대상 서버의 TCP 연결 테이블을 과부하시키는 것을 목표로 합니다. 이로 인해 공격 대상 서버는 정상적인 요청에 대한 응답을 처리하지 못하게 되어 서비스 거부 상태에 빠지거나 서비스의 성능이 저하될 수 있습니다.

SYN Flooding 공격을 방어하기 위해서는 방화벽이나 인트라넷 기반의 보안 시스템을 통해 SYN 패킷을 필터링하거나, TCP SYN 쿠키를 사용하여 공격을 감지하고 방어할 수 있습니다. 또한, 네트워크 장비나 소프트웨어에서 SYN Flooding에 대한 대응 메커니즘을 구현하여 공격을 탐지하고 차단할 수 있습니다.

 

* 정리

- sysctl 명령은 시스템(system)의 제어(control)를 설정하기 위한 명령어


 

* Kali Linux로 이동해서

 

1. Ping scan

- 네트워크에 ping을 보내서 응답하는 시스템을 조사  ----> 현재 켜져있는 시스템의 IP를 알 수 있음

$ cd  ~                    // 자신의 홈 디렉토리로 이동함

$ sudo  nmap  -sP  192.168.5.1-150

    192.168.5.1 : host 컴퓨터 (Windows10)

    192.168.5.2 : VMware의 Gateway (외부로 통하는 IP주소)

    192.168.5.130 : Metasploitable2  (Victim)

    192.168.5.128 : Kali Linux (Attacker)

$ sudo  nmap  -sP  192.168.5.120/24                  // 192.168.5.120 네트워크 전체를 조사함 (1~254)

 

 

2. TCP scan

- 열려있는 TCP 포트를 찾는 스캐닝 기법

- 3-Way Handshaking을 완성하는 방식을 사용하므로 로그에 기록이 남게 됩니다.

$ sudo  nmap  -sT  192.168.5.130                   // 컴퓨터에서 실행중인 서비스 목록을 확인할 수 있습니다.

  

cf. 로그인과 관련된 서비스를 찾으면, Dictionary Attack을 시도할 수 있습니다. 

 

 

3. Stealth scan (Half-Open scan이라고도 함)

- 3-Way Handshaking에서 마지막 ACK를 보내지 않는 기법, 로그에 기록이 남지 않음

- 앞에 있는 방화벽 등의 보안 솔루션에서 탐지 됨

- 결과는 TCP scan과 동일함, 가장 많이 사용되는 스캔 (영화에 많이 나옴..)

$ sudo  nmap  -sS  192.168.5.130 

 

4. Version scan

- 버전을 확인하는 스캐닝 기법 ----> 취약점이 존재하는 버전이 설치되었는지 확인할 수 있음

$ sudo  nmap  -sV  192.168.5.130 

 

5. OS scan

- 운영체제의 상세한 내용을 조사하는 스캔

$ sudo  nmap  -O  192.168.5.130 

   ---> 결과 2.6.9 ~ 33 사이임

   ---> Metasploitable2에서  $ uname -r 을 해보니,  2.6.24 라고 함.

 

6. 엉터리 스캔 : TCP/IP로직에 맞지 않는 스캐닝을 해보는 것 ----> Stealth scan 이라고도 한다.

- 목적 : 보안 솔루션이 동작하고 있는지를 확인하는 스캐닝

- 포트가 열려 있는 경우 : 응답을 하지 않음  (정의된 응답 방법이 없음)

- 포트가 닫혀 있는 경우 : RST를 보냄

- 그런데, 보안 솔루션이 존재하는 경우, 포트가 닫혀 있더라도 응답을 하지 않게 됨 (보안 솔루션이 응답을 차단하기 때문)

- 결과는 TCP scan, Stealth scan과 유사함

1) FIN scan  (FIN은 finish를 의미하는데 종료를 요청하는 것)

$ sudo  nmap  -sF  192.168.5.130 

2) Null scan  (TCP Flag를 모두 Off해서 보낸다.

$ sudo  nmap  -sN  192.168.5.130 

3) X-mas scan (TCP Flag중에 URG/PSH/FIN 만 켜서 보낸다.) ----> 크리스마스에는 전등을 꺼내서 등을 켭니다.

$ sudo  nmap  -sX  192.168.5.130 

==> 어떤 포트에서도 응답이 없다면 보안 솔루션이 중간에서 Cut 하고 있다. ---> 모니터링 하고 있습니다.


7. All scan

- OS + Version + Traceroute + Script 를 한번에 스캐닝하는 기법 : 시스템에 대한 전반적인 점검

- 시간이 오래 걸릴 수 있습니다. (주의!!)

- 주로 취약점 점검할 때 전체적으로 파악할 필요가 있을 때 사용함

- 시간을 줄이기 위한 옵션이 필요함  ---->  -Tn  :  n은 0부터 6까지, 숫자가 클수록 속도 빨라짐 (너무 빠르면 대충함...)

$ sudo  nmap  -A  -T4  192.168.5.130

 

$ sudo  nmap  --help                     // 다양한 옵션을 확인할 수 있음

 

$ sudo  nmap  -sS  192.168.5.130  -p  3389                 // 특정 포트만 확인할 때  (공격자)

* Script를 활용해서 취약점여부를 확인하기 위한 스캐닝
$ cd  /usr/share/nmap/scripts
$ ls  
  ----> 확장자가 nse (Nmap Script Engine의 줄임말)인 파일들이 많이 있음
$ ls -l  |  wc  -l
  ---->  607개의 취약점 점검 스크립트가 존재함

1. vsFTPd 2.3.4 취약점 스크립트 활용
$ sudo  find  .  -name "*vsftp*"                        //   .은 현재 디렉토리,   *는 와일드 문자
  ----> 있음 : ftp-vsftpd-backdoor.nse
$ less  ftp-vsftpd-backdoor.nse
$ sudo  nmap  --script=ftp-vsftpd-backdoor.nse   192.168.5.130 

결과 정리)
State: VULNERABLE (Exploitable)    ------>  취약점이 존재하고 있음을 확인!!!
Exploit results:
|       Shell command: id
|       Results: uid=0(root) gid=0(root)    -----> Exploit를 하면 root권한을 획득할 수 있음!!!

2. IRC 취약점이 존재할지를 확인  
- IRC (Internet Relay Chat : 인터넷 채팅 중계 서버)
$ sudo  find  .  -name "*irc*"                      // 취약점을 점검할 스크립트가 있는지 확인합니다.
---> All scan 결과에서 Unrealircd 3.2.8.1 버전을 사용하고 있음을 확인합니다.
---> 구글에서 unrealircd 3.2.8.1 exploit 검색을 해보니 취약점이 있습니다.
---> irc-unrealircd-backdoor.nse 를 활용해서 스캐닝을 실행한다.

$ sudo  nmap  --script=irc-unrealircd-backdoor.nse   192.168.5.130  -p  6667
  ----> Looks like trojaned version of unrealircd. (트로이 목마가 탑재된 버전인 것으로 보인다고 함)

cf. 악성코드 (Malware)
- 종류 : Virus, Worm, Trojan horse, Backdoor, Ransomware, Hoax, Joke, spyware, keylogger, addware 

 

끝 !