728x90

쿠키

  • HTTP 프로토콜 특징
    • Connectionless : 하나의 요청에 하나의 응답을 한 후 연결을 종료
    • Stateless : 통신이 끝난 후 상태 정보를 저장하지 않음
  • HTTP에서 상태를 유지하기 위해 쿠키(Cookie) 탄생
  • 쿠키 = Key+Value (일종의 단위)
  • 서버가 클라이언트에게 쿠키 발급 -> 클라이언트는 서버에 요청을 보낼 때마다 쿠키 같이 전송 -> 서버는 이를 통해 클라이언트 구분

쿠키의 용도

  • 클라이언트의 정보 기록과 상태 정보를 표현
  • 정보 기록 : "다시 보지 않기", "7일 간 표시하지 않기" 등의 팝업 옵션을 기억
  • 상태 정보 : 클라이언트를 식별할 수 있는 값을 쿠키에 저장

쿠키가 없는 통신 vs 쿠키가 있는 통신

  • 쿠키가 없는 통신 : 서버는 요청을 보낸 클라이언트가 누군지 알 수 없기 때문에 현재 어떤 클라이언트와 통신하는지 알 수 없음
  • 쿠키가 있는 통신 : 클라이언트는 서버에 요청을 보낼 때마다 쿠키를 포함하고, 서버는 해당 쿠키를 통해 클라이언트를 식별

쿠키 변조

쿠키 -> 클라이언트 브라우저에 저장
따라서 악의적인 클라이언트는 쿠키 정보를 변조해 서버에 요청을 보낼 수 있음

이에 대해 서버가 검증을 하지 않는다면 사칭으로 정보를 탈취할 수 있음

세션

: 쿠키에 인증 상태를 저장하지만 클라이언트가 인증 정보를 변조할 수 없게 하기 위해 사용

 

인증 정보를 서버에 저장하고 해당 데이터에 접근할 수 있는 키(Session ID ,유추할 수 없는 랜덤 문자열)를 만들어 클라이언트에 전달하는 방식

브라우저는 해당 키를 쿠키에 저장하고 이후에 HTTP 요청을 보낼 때 사용, 서버는 요청에 포함된 키에 해당하는 데이터를 가져와 인증 상태 확인

 

쿠키 : 데이터 자체를 이용자가 저장
세션 : 서버가 저장

쿠키 적용법

클라이언트가 서버에 요청을 보낼 때 저장된 쿠키를 요청 헤더에 넣어 전송하기 때문에 이용자가 요청을 보낼 때 쿠키 헤더를 변조할 수 있다. 쿠키를 설정할 때에는 만료 시간을 지정할 수 있고, 만료 시간 이후에는 클라이언트에서 쿠키가 삭제된다.

 

서버 : HTTP 응답 중 헤더에 쿠키 설정 헤더(Set-Cookie)를 추가하면 클라이언트의 브라우저가 쿠키 설정

HTTP/1.1 200 OK
Server: Apache/2.4.29 (Ubuntu)
Set-Cookie: name=test;
Set-Cookie: age=30; Expires=Fri, 30 Sep 2022 14:54:50 GMT;
...

 

클라이언트 : 자바스크립트를 사용해 쿠키 설정

document.cookie = "name=test;"
document.cookie = "age=30; Expires=Fri, 30 Sep 2022 14:54:50 GMT;"

consle 창에 document.cookie 입력 (쿠키 옵션(HttpOnly)에 따라 자바스크립트에서 쿠키 확인이 불가능 할 수 있음)
application 탭에 목록 중 Cookies를 펼치면 Origin 목록 확인 가능, 이 Origin을 누르면 쿠키 정보 확인 및 수정 가능

 

* 세션 하이재킹 (Session Hijacking)
: 공격자가 이용자의 쿠키를 훔칠 수 있으면 세션에 해당하는 이용자의 인증 상태를 훔칠 수 있음

Same Origin Policy(SOP)

웹 서비스에 접속할 때, 브라우저가 쿠키를 HTTP 요청에 포함시켜 전달하는 특징은 웹 리소스를 통해 간접적으로 타 사이트에 접근할 때도 적용되기에 악의적인 페이지가 클라이언트의 권한을 이용해 대상 사이트에 HTTP 요청을 보내고, 응답 정보를 획득하는 코드를 실행 가능하다.

따라서, 클라이언트 입장에서 가져온 데이터를 악의적인 페이지에서 읽을 수 없도록 하는 것이 동일 출처 정책(Same Origin Policy, SOP)이다.

Origin 구분 방법

Origin = Protocol(Scheme) + Port + Host
위의 구성요소가 모두 일치해야 동일한 오리진

 

Origin : https://same-origin.com/

Same Origin : https://same-origin.com/frame.html -> Path만 다름

Cross Origin : http://same-origin.com/frame.html -> Scheme 다름

Cross Origin : https://cross.same-origin.com/frame.html -> Host 다름

Cross Origin : https://same-origin.com:1234/ -> Port 다름 

 

window.open : 새로운 창 띄우는 함수
object.location.href : 객체가 가리키는 URL 주소 읽어오는 코드

Cross Origin Resource Sharing (CORS)

브라우저가 SOP에 구애 받지 않고 외부 출처 접근을 허용하는 경우 : 이미지나 자바스크립트, CSS 등의 리소스를 불러오는 <img>, <style>, <script> 등의 태그
이외에도 SOP를 완화해 다른 출처의 데이터를 처리해하는 경우 존재 : 이용자가 수신한 메일의 개수를 메인 페이지에 출력하려면 메인 페이지에서 메일 서비스에 관련된 리소스 요청해야됨

 

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

 

CORS preflight : 수신측에 웹 리소스를 요청해도 되는지 질의하는 과정

JSON with Padding (JSONP)

이미지나 JS, CSS 등의 리소스는 SOP에 구애 받지 않고 외부 출처에 대해 접근을 허용한다는 특징을 이용해 <script>태그로 Cross Origin의 데이터 불러온다. Callback 함수 사용해야한다. 요즘에는 잘 사용하지 않는다.

'Study > Web Hacking' 카테고리의 다른 글

[웹] Dreamhack XSS  (0) 2024.04.03
728x90

ssh public private key

ssh 공개키, 비공개 키를 이용해 로그인

 

기존 : ssh egoing@192.168.0.67을 입력하고 비밀번호를 입력하면 로그인 가능

 

ssh-keygen : /home/egoing/.ssh/id_rsa에 키쌍을 생성
id_ras : 비밀키, id_rsa.pub : 공개키

 

로그인하고자하는 컴퓨터에 공개키를 저장하게 되면 비밀번호 없이 로그인 가능.
: authorized_keys에 pub key를 추가하면 됨 -> ssh-copy-id egoing@192.168.0.67를 이용해 추가 가능 (여기서 egoing@192.168.0.67는 로그인하고자 하는 컴퓨터)

rsync

ssh키를 이용하면 로그인 없이 rsync를 이용할 수 있음
-> crone 기능을 이용하여 자동화를 할 수 있음

RSA

비대칭 암호화 : 암호화와 복호화에 사용되는 키가 다른 암호화
암호화는 비밀키를 통해, 복호화는 공개키를 통해서 진행

 

ssh 인증과정

  1. ssh client가 ssh sever(접속대상)에 접속하면 ssh sever가 랜덤키를 전달한다
  2. ssh client는 랜덤키를 id_rsa(비밀키) 통해 암호화하여 sever에 전달한다
  3. ssh sever는 authorized_keys에 저장된 client의 공개키를 이용하여 복호화하여 전달한 랜덤키의 값과 같은지 확인한다.
728x90

rsync 1 : Basic

r : remote의 약자
sync : 각 컴퓨터의 변경내용을 다른 컴퓨터에도 반영되도록하여 동일한 상태를 유지하는것.

rsync : 인터넷을 통해 sync할 수 있도록하는 프로그램. 파일 카피, 백업 등에 사용.

 

src와 dest 디렉토리를 만들어 두 디렉토리를 동기화해보자
src 폴더에 파일을 만든 후 rsync -a src/ dest를 입력하면 dest라는 디렉토리 안에 src 디렉토리 아래의 파일이 복제됨.
    cf. touch test{1..10} : test1부터 test10까지의 파일을 생성
    cf. src/ -> src 밑의 모든 파일


rsync -av src/ dest를 통해 변동 내용만 복제 가능.

rsync 2 : Remote sync

다른 컴퓨터에 sync를 진행

(1) 동기화하고자 하는 컴퓨터의 IP를 알아낸다
(2) rsync -azP ~/rsync/src/ k8805@192.168.0.65:~/rsync/dest 를 통해 dest 디렉토리에 src의 파일을 복제할 수 있다.   (cf. -z : zip)

728x90

Domain

1. DNS (Domain name system)

서버에 접속할 때 서버의 이름이 google.com이라고 할 때, 실제로는 google.com의 IP Address로 접속을 하게된다.

브라우저를 통해 google.com에 접속을 시도하면, 먼저 DNS의 IP Address로 접속해 google.com의 IP Address를 묻게되고 응답 받은 값으로 서버에 접속하게 된다.

2, hosts 파일

: 도메인 네임과 IP Address를 매핑하는 파일

 

각각의 컴퓨터마다 hosts 파일을 가짐. DNS 이전에는 hosts 파일을 통해 접속.

 

elinks google.com : google 홈페이지에 접속
elinks http://localhost : 로컬 서버에 접속
sudo nano /etc/hosts : hosts 파일 열람
-> 여기에 127.0.0.1 google.com을 추가하면 google.com을 입력하면 로컬서버로 접속하게 변조할 수 있다. 이런 특성 때문에 hosts에 대한 악의적인 변조 공격이 있을 수 있다.

어떤 도메인에 접속 시도를 하면 local의 hosts 파일부터 살피게 된다. 찾는 내용이 없을 때 DNS에 접속한다.

 

network : 각 host의 모임
internet : network의 모임

3. 도메인 구입

cat /etc/resolv.conf : 접속한 인터넷 서비스 회사에서 제공하는 DNS 서버 주소 열람
도메인 구입 : 도메인 네임과 IP Address를 매핑시키기 위해


도메인 이름의 체계에 따라 관리하는 주체가 다르다 (co.kr , co.jp 등등)
도메인 네임을 독점적으로 사용하고자 한다면 구입해야 한다. com, net, ga 등에서 구입가능하다.

도메인 네임을 구입하고 curl 명령어를 통해 나온 IP 주소를 등록하면 사용 가능하다.

 

host egoing.ga : 해당 도메인의 IP 주소를 알 수 있음

4. 서브 도메인

하나의 서버는 하나의 도메인과 매칭
서브 도메인 : 서버가 여러개일때 도메인을 재사용
ex) egoing.ga -> admin.egoing.ga, blog.egoing.ga 등등

5. DNS의 동작 원리

dig +trace egoing.ga : 도메인의 IP 주소를 리턴하기 위해 거쳐가는 서버들을 알려줌

 

egoing.ga. : 마지막의 .을 root라고 함
root DNS server : 여러대의 서버로 전세계에 흩어져 있음. 그 리스트를 우리 컴퓨터는 기본적으로 알고 있음.

 

(1) egoing.ga. 에 접속한다.
(2) root DNS에.ga를 담당하는 DNS 서버 목록을 물어본다.
(3) 반환받은 DNS 서버(ga DNS 서버) 중에 하나에 egoing.ga.를 관리하는 DNS 서버를 물어본다.
(4) 반환받은 DNS 서버(egoing.ga DNS 서버)에 최종적으로 IP 주소를 묻게된다.-> 최종적으로 IP 주소가 나올 때까지 DNS 서버에 묻는 것을 반복한다.

 

직접 DNS 서버를 구축할 수도 있다!

728x90

인터넷

인터넷 통신 : request, response 가 계속해서 왕래하는 컴퓨터 간의 대화
client : request를 하는 컴퓨터
server : request를 받아서 response를 하는 컴퓨터

domain name : google.com과 같이 서버에 접속할 때 사용하는 이름
ip address : 서버에 접속할 수 있는 주소.ping google.com으로 확인해볼 수 있다.

DNS 서버 : domain name의 ip address를 저장해둔 서버
domain name을 입력하면 DNS 서버를 통해 ip address로 변환되어 서버에 접속하여 응답이 온다.

ip addr : 본인의 ip 주소를 알 수 있는 명령어 -> 컴퓨터에 부여된 실제 ip, private address
curl ipinfo.io/ip : 본인 컴퓨터의 ip를 알려주는 명령어 -> 온라인 서비스 입장에서 접속 ip를 확인, public address
두 값이 같다면 컴퓨터에 부여된 실제 ip와 외부에 접속할 때 사용하는 ip가 같은 것이다. (router를 사용하지 않는 경우)

cf) curl google.com : google의 HTML 파일을 받아서 보여준다.

router(공유기)를 사용하여 하나의 회선으로 여러개의 device에 연결해서 사용할 수 있도록 한다.
통신사가 제공한 ip(public address)는 router의 ip가 된다.
router에 연결된 각각의 컴퓨터들은 사설 ip (private address)를 사용하여 ip를 부여받는다.


apache 웹서버

sudo apt-cache search apache : apache라는 이름을 가진 패키지를 검색
sudo apt-get update; : 프로그램 설치하기 전에 해주면 좋음
sudo apt-get install apache2 : apache2 설치
sudo service apache2 start : apache2 실행

웹 서버 접속 (여러 프로그램 중 elinks 사용)
sudo apt-get install elinks : elinks 설치
elinks : elinks 실행

elinks https://[ip address]/ 통해서 설치한 apache 서버에 접속해 볼 수 있다.

localhost : 동일한 컴퓨터 안에 있는 서버를 접속할 때 사용
127.0.0.1 : 자기자신을 가리키는 특수한 ip 주소

apache 설정파일 : 웹서버는 사용자가 요청한 파일을 지정된 디렉토리에서 읽어옴. 해당 설정은 apache 설정 파일에서 변경 가능.
/etc/apache2/apache2.conf : apache의 메인 설정 파일
/etc/apache2/sites-enabled/000-default.conf : 기본 사이트 설정 파일. DocumentRoot 설정을 확인 가능.

DocumentRoot 설정은 기본적으로 /var/www/html로 되어 있음.
var/www/html/index.html : 기본 웹 페이지 파일. sudo nano를 통해서 편집
elinks http://127.0.0.1/index.html : 변경사항을 웹브라우저에서 확인

로그파일 : apache 웹 서버의 동작을 모니터링하고 문제를 해결하기 위해 로그 파일을 확인할 수 있습니다.
/var/log/apache2/access.log : 접속기록 저장
tail -f /var/log/apache2/access.log : 실시간으로 업데이트되는 접속기록을 열람가능한 명령어
/var/log/apache2/error.log : 에러기록 저장


원격제어 ssh

sever 컴퓨터에 ssh server 설치, client 컴퓨터에 ssh client 설치

  1. 로컬 컴퓨터 내 설치된 ssh client를 통해 명령 전달
  2. ssh sever를 통해 전달받은 명령어를 sever 컴퓨터에 전달해 실행
  3. server 컴퓨터는 실행결과를 ssh server에 전달
  4. ssh server는 해당 내용을 client에 보냄
  5. 내용을 전달받은 client는 ssh client 화면에 내용을 보임

sudo apt-get purge openssh-server openssh-client : 서버 삭제
sudo apt-get install openssh-server openssh-client : 서버설치
sudo service ssh start : ssh 실행
sudo ps aux | grep ssh : 실행확인

ssh \[접속하고자 한 아이디\]@\[접속하고자하는 컴퓨터 ip\] : 원격 제어를 통해 타 컴퓨터에 접속


포트 port

포트 : 네트워크 상에서 특정 서비스나 애플리케이션이 통신을 위해 사용하는 논리적 접속 지점

ssh -p \[포트번호\] \[접속하고자 한 아이디\]@\[접속하고자하는 컴퓨터 ip\] : 포트번호를 입력해서 접속 (포트 번호 생략해도 접속 가능)

포트 번호는 0번부터 65535번까지 사용 ex ) web : 80 / ssh : 22
Well-Known Ports (0-1023):주요 네트워크 서비스와 프로토콜에 할당된 포트
1024 바깥쪽은 임의로 할당 가능

포트 포워딩 port forwarding : 라우터나 방화벽이 외부 네트워크에서 특정 포트로 들어오는 데이터를 내부 네트워크의 특정 장치로 전달하는 기술

라우터에 사용자가 접근할 때 9000번 포트 사용
사용자는 웹브라우저 상에서 211.46.24.37:9000를 통해 라우터에 접근
라우터 설정 : 9000번 포트는 192.168.0.4:80으로 가라고 지정
그러면 192.168.0.4:80으로 데이터가 전달됨

default gateway : 공유기(라우터)의 내부에서만 통용되는 ip (내부 네트워크와 외부 네트워크(또는 인터넷) 간의 트래픽을 전달하는 역할)
ip route : default gateway 정보

728x90

GROUP

: 파일과 디렉토리를 여러 사용자들이 공동으로 관리할 수 있는 방법

 

특정한 사람들을 묶어 그룹으로 만들어 권한을 부여하고, 각 그룹은 이름을 가진다.

groupadd

groupadd {options} [group] : 새 그룹 추가
usermod -a -G [group] [user] : 그룹에 사용자를 추가 (-a : append, 사용자 추가 옵션)
chown {-R} [user]{:group} [file|directory] : 디렉토리의 그룹 변경

 

<예시>
groupadd developer는 실행이 안 되기 때문에 관리자 권한으로 실행해야한다. 
sudo !!을 통해 developer 그룹을 추가한다.  (cf. !!: 직전에 입력했던 명령어)

 

nano /etc/group 을 통해서 group에 대한 정보를 확인할 수 있다.

 

sudo usermod -a -G developer egoing을 통해 egoing 사용자를 developer 그룹에 추가한다.

 

sudo chown root:developer .을 통해 현재 소유 그룹을 developer로 변경한다.

728x90

권한 Permission

  • unix 계열 시스템에서는 file&directory에 대해 Read(읽기), Write(쓰기), Excute(실행)의 user권한을 지정한다.

(1) type : 파일(-), 디렉토리(d), 링크 등 타입을 나타낸다.

(2) access mode : 권한을 나타낸다.

(2-1) owner의 권한

(2-2) group의 권한

(2-3) other의 권한

(3-1) owner의 이름

(3-2) group의 이름

  • access mode의 표기 의미
    • r : read (읽기)
    • w : write (쓰기)
    • x : excutr (실행)

권한 변경 chmod

<예시>
chmod o-r [filename] : other의 r(읽기) 권한을 뺀다
chmod o+r [filename] : other의 r(읽기) 권한을 더한다
chmod o+w [filename] : other의 w(쓰기) 권한을 더한다

 

chmod u-r [filename] : owner의 r(읽기) 권한을 뺀다
chmod u+r [filename] : owner의 r(읽기) 권한을 더한다

실행 excute

hi-machine.sh 파일을 실행시키고자 할 때,
/bin/bash hi-machine.sh는 실행이 되지만 ./hi-machine,sh은 실행되지 않는다.
전자는 특정 프로그램(/bin/bash)을 통해서 파일을 실행시키는 것으로 제약이 없다.
후자는 컴퓨터에 설치된 프로그램인 것처럼 실행하는 것으로 파일에게 실행권한(excute)을 부여할 필요가 있다.

 

chmod u+x hi-machine.sh 명령을 실행하고 ./hi-machine.sh를 입력하고 바로 실행되는 것을 확인할 수 있다.

directory의 권한

디렉토리에 대한 r(읽기) 권한 : 디렉토리 안 내용 열람
디렉토리에 대한 w(쓰기) 권한 : 디렉토리 안 파일 생성 및 삭제, 파일 이름 변경
디렉토리에 대한 x(실행) 권한 : 디렉토리에 cd 명령을 통해 접근

 

chmod -R o+w [directoryname] : 모든 하위 파일 및 디렉토리에 대한 권한 변경 (-R을 통해 재귀적으로 적용되도록 명령)

 

chmod 총정리

chmod [options] mode[,mode] file1 [file2 ...]
  • mode
    • Symbolic modes : o+r, o-x 등등
    • Octal modes
      ex. chmod 111 perm.txt : 모든 사용자에 대해 실행만 가능하도록 (--x) 설정

728x90

다중사용자

컴퓨터를 여러명이 사용할 수 있게 되지만 시스템의 복잡도가 높아진다.
모든 사용자에 대한 권한을 체크를 해야하기 때문에 기능이 복잡해진다.

여러명이 운영체제를 같이 사용하는 방법, 그 과정에서의 복잡성, 파생되는 위험성을 살펴본다.

id (identify) : 현재 사용자(me)의 정보를 알 수 있는 명령어
who : 현재 시스템에 접속하고 있는 사용자를 확인하는 명령어

관리자와 일반 사용자 super(root) user VS user

  • sudo(superuser do) : 일시적으로 관리자 권한으로 명령을 실행할 때 사용하는 접두사. 모든 일반 유저가 사용할 수 있는 것은 아니고 슈퍼 유저가 될 수 있는 일반 사용자만 사용할 수 있다.
  • superuser가 되는 방법
    • su : user ID를 바꾸거나 superuser가 되는 명령어
    • su - root 를 명령하고 password를 입력하면 superuser가 될 수 있다.
    • exit를 입력하면 이전 사용자로 돌아갈 수 있다.

    • superuser는 root라는 이름을 가지고, 쉘에 $가 아닌 #이 표시된다.
    • root 사용자는 사용하지 않는 것이 안전하다.

    • 몇몇 운영체제에서는 root 사용자를 막아두었다. -> 락을 풀어 사용한다.
      • sudo passwd -u root : 락을 푸는 명령 (-u : unlock)
      • sudo passwd -l root : 락을 거는 명령 (-l : lock)
    • root 사용자의 홈 디렉토리 : /root
    • 일반 사용자의 홈 디렉토리 : /home 밑에 존재

사용자의 추가

  • sudo userad -m [username] : 새 사용자를 생성하는 명령어
  • sudo passwd [username] : 새 사용자의 패스워드를 설정하는 명령어
  • sudo usermod -a -G sudo [username] : 사용자에게 superuser 권한을 부여하는 명령어
    (man usermod 명령어를 통해 더 자세한 내용을 알 수 있음)

+ Recent posts